commit bd9ac0409acb2a203c233d12d2db6adb00df7a5f Author: Sebastian Kujas Date: Fri Jun 21 17:24:06 2024 +0200 working lcd small quer diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a9820ae --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ +# Arduino project for SquareLine Studio with TFT_eSPI + +## Get started + +1. Open the `.ino` file in Arduino +2. Go to File/Preferences and set Sketchbook location to the path of your UI project (where this README is located) +3. Go to `libraries/TFT_eSPI` and open `User_Setup.h` or `User_Setup_Select.h` with a text editor to configure pins for your display. +4. Select your board (install if needed) +5. Build the project + +Note that this project doesn't contain touch pad driver. You can use an other Arudino library for your touchpad controller. + +This is a comparison-table between main driver libraries according to what devices they support (wath in monospace-fontset): +(This list is about half a year old, created first for Raspberry Pi Pico board-template, supported devices might have changed meanwhile.) + +LCD: +==== + +| Model |lvgl_esp32_drivers| TFT_eSPI | lv_drivers | Arduino-GFX | +|------ |----------------- | ----------- | --------------- | ------------------- | +| (drm | | | *) | | +| (fbdev | | | *) | | +| (RGB-Display | | | | *) | +| FT81x | * | | | | +| GC9106 | | | | * | +| GC9107 | | | | * | +| GC9A01 | * | * | * | * | +| HX8347(C,D) | | | | * | +| HX8352(C) | | | | * | +| hx8357 | * | | | *(A) | +| hx8357b/c/d | ? | * | | *(B) | +| HX8369A | | | | * | +| il3820 | * | | | | +| ili9163c | * | *(-c?) | | | +| ili9225 | | * | | * | +| ILI9331 | | | | * | +| ili9341 | * | * | * | * | +| ILI9342 | | | | * | +| ili9481 | * | * | | *(18bit) | +| ili9486 | * | * | | *(normal,18bit) | +| ili9488 | * | * | | *(normal,18bit) | +| ILI9806 | | | | * | +| JBT6K71 | | | | * | +| jd79653a | * | | | | +| NT35310 | | | | * | +| NT35510 | | | | * | +| NT39125 | | | | * | +| NV3041A | | | | * | +| OTM8009A | | | | * | +| pcd8544 | * | | | | +| R61529 | | | | * | +| R61581 | | * | * | | +| ra8875 | * | | | | +| RM67162 | | | | * | +| RM68120 | | * | | | +| RM68140 | | * | | | +| S6D02A1 | | * | | | +| SEPS525 | | | | * | +| sh1107 | * | | | | +| SHARP_MIP | | | * | | +| SSD1283A | | | | * | +| ssd1306 | * | | | | +| SSD1331 | | | | * | +| SSD1351 | | * | | * | +| SSD1963 | | * | * | | +| ST7565 | | | * | | +| st7735s | * | *(-s?) | | *(-s?) | +| st7789 | * | *(_2?) | | * | +| st7796s | * | *(-s?) | | * | +| UC1610 | | | * | | +| uc8151d | * | | | | + +TOUCH: +====== + +| Model |lvgl_esp32_drivers| TFT_eSPI | lv_drivers | +| ----- |------------------| ----------- | -------------- | +| adcraw/AD_touch | * | | * | +| ft6x6 | * | | | +| FT6x36? | | | | +| FT5406EE8 | | | * | +| FT81x | * | | | +| gt911 | * | | | +| ra8875 | * | | | +| stmpe610 | * | | | +| xpt2046 | * | * | * | +| (evdev | | | *) | +| (libinput | | | *) | +| (xkb | | | *) | + diff --git a/libraries/TFT_eSPI/CMakeLists.txt b/libraries/TFT_eSPI/CMakeLists.txt new file mode 100644 index 0000000..b849c3c --- /dev/null +++ b/libraries/TFT_eSPI/CMakeLists.txt @@ -0,0 +1,4 @@ + +idf_component_register(SRCS "TFT_eSPI.cpp" + INCLUDE_DIRS "." + PRIV_REQUIRES arduino) \ No newline at end of file diff --git a/libraries/TFT_eSPI/Extensions/Button.cpp b/libraries/TFT_eSPI/Extensions/Button.cpp new file mode 100644 index 0000000..9c93098 --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Button.cpp @@ -0,0 +1,107 @@ +/*************************************************************************************** +** Code for the GFX button UI element +** Grabbed from Adafruit_GFX library and enhanced to handle any label font +***************************************************************************************/ +TFT_eSPI_Button::TFT_eSPI_Button(void) { + _gfx = nullptr; + _xd = 0; + _yd = 0; + _textdatum = MC_DATUM; + _label[9] = '\0'; + currstate = false; + laststate = false; +} + +// Classic initButton() function: pass center & size +void TFT_eSPI_Button::initButton( + TFT_eSPI *gfx, int16_t x, int16_t y, uint16_t w, uint16_t h, + uint16_t outline, uint16_t fill, uint16_t textcolor, + char *label, uint8_t textsize) +{ + // Tweak arguments and pass to the newer initButtonUL() function... + initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill, + textcolor, label, textsize); +} + +// Newer function instead accepts upper-left corner & size +void TFT_eSPI_Button::initButtonUL( + TFT_eSPI *gfx, int16_t x1, int16_t y1, uint16_t w, uint16_t h, + uint16_t outline, uint16_t fill, uint16_t textcolor, + char *label, uint8_t textsize) +{ + _x1 = x1; + _y1 = y1; + _w = w; + _h = h; + _outlinecolor = outline; + _fillcolor = fill; + _textcolor = textcolor; + _textsize = textsize; + _gfx = gfx; + strncpy(_label, label, 9); +} + +// Adjust text datum and x, y deltas +void TFT_eSPI_Button::setLabelDatum(int16_t x_delta, int16_t y_delta, uint8_t datum) +{ + _xd = x_delta; + _yd = y_delta; + _textdatum = datum; +} + +void TFT_eSPI_Button::drawButton(bool inverted, String long_name) { + uint16_t fill, outline, text; + + if(!inverted) { + fill = _fillcolor; + outline = _outlinecolor; + text = _textcolor; + } else { + fill = _textcolor; + outline = _outlinecolor; + text = _fillcolor; + } + + uint8_t r = min(_w, _h) / 4; // Corner radius + _gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill); + _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline); + + if (_gfx->textfont == 255) { + _gfx->setCursor(_x1 + (_w / 8), + _y1 + (_h / 4)); + _gfx->setTextColor(text); + _gfx->setTextSize(_textsize); + _gfx->print(_label); + } + else { + _gfx->setTextColor(text, fill); + _gfx->setTextSize(_textsize); + + uint8_t tempdatum = _gfx->getTextDatum(); + _gfx->setTextDatum(_textdatum); + uint16_t tempPadding = _gfx->getTextPadding(); + _gfx->setTextPadding(0); + + if (long_name == "") + _gfx->drawString(_label, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd); + else + _gfx->drawString(long_name, _x1 + (_w/2) + _xd, _y1 + (_h/2) - 4 + _yd); + + _gfx->setTextDatum(tempdatum); + _gfx->setTextPadding(tempPadding); + } +} + +bool TFT_eSPI_Button::contains(int16_t x, int16_t y) { + return ((x >= _x1) && (x < (_x1 + _w)) && + (y >= _y1) && (y < (_y1 + _h))); +} + +void TFT_eSPI_Button::press(bool p) { + laststate = currstate; + currstate = p; +} + +bool TFT_eSPI_Button::isPressed() { return currstate; } +bool TFT_eSPI_Button::justPressed() { return (currstate && !laststate); } +bool TFT_eSPI_Button::justReleased() { return (!currstate && laststate); } diff --git a/libraries/TFT_eSPI/Extensions/Button.h b/libraries/TFT_eSPI/Extensions/Button.h new file mode 100644 index 0000000..3a0e2d5 --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Button.h @@ -0,0 +1,44 @@ +/*************************************************************************************** +// The following button class has been ported over from the Adafruit_GFX library so +// should be compatible. +// A slightly different implementation in this TFT_eSPI library allows the button +// legends to be in any font, allow longer labels and to adjust text positioning +// within button +***************************************************************************************/ + +class TFT_eSPI_Button +{ + public: + TFT_eSPI_Button(void); + // "Classic" initButton() uses centre & size + void initButton(TFT_eSPI *gfx, int16_t x, int16_t y, + uint16_t w, uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize); + + // New/alt initButton() uses upper-left corner & size + void initButtonUL(TFT_eSPI *gfx, int16_t x1, int16_t y1, + uint16_t w, uint16_t h, uint16_t outline, uint16_t fill, + uint16_t textcolor, char *label, uint8_t textsize); + + // Adjust text datum and x, y deltas + void setLabelDatum(int16_t x_delta, int16_t y_delta, uint8_t datum = MC_DATUM); + + void drawButton(bool inverted = false, String long_name = ""); + bool contains(int16_t x, int16_t y); + + void press(bool p); + bool isPressed(); + bool justPressed(); + bool justReleased(); + + private: + TFT_eSPI *_gfx; + int16_t _x1, _y1; // Coordinates of top-left corner of button + int16_t _xd, _yd; // Button text datum offsets (wrt centre of button) + uint16_t _w, _h; // Width and height of button + uint8_t _textsize, _textdatum; // Text size multiplier and text datum for button + uint16_t _outlinecolor, _fillcolor, _textcolor; + char _label[10]; // Button text is 9 chars maximum unless long_name used + + bool currstate, laststate; // Button states +}; diff --git a/libraries/TFT_eSPI/Extensions/Smooth_font.cpp b/libraries/TFT_eSPI/Extensions/Smooth_font.cpp new file mode 100644 index 0000000..c67204a --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Smooth_font.cpp @@ -0,0 +1,582 @@ + // Coded by Bodmer 10/2/18, see license in root directory. + // This is part of the TFT_eSPI class and is associated with anti-aliased font functions + + +//////////////////////////////////////////////////////////////////////////////////////// +// New anti-aliased (smoothed) font functions added below +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: loadFont +** Description: loads parameters from a font vlw array in memory +*************************************************************************************x*/ +void TFT_eSPI::loadFont(const uint8_t array[]) +{ + if (array == nullptr) return; + fontPtr = (uint8_t*) array; + loadFont("", false); +} + +#ifdef FONT_FS_AVAILABLE +/*************************************************************************************** +** Function name: loadFont +** Description: loads parameters from a font vlw file +*************************************************************************************x*/ +void TFT_eSPI::loadFont(String fontName, fs::FS &ffs) +{ + fontFS = ffs; + loadFont(fontName, false); +} +#endif + +/*************************************************************************************** +** Function name: loadFont +** Description: loads parameters from a font vlw file +*************************************************************************************x*/ +void TFT_eSPI::loadFont(String fontName, bool flash) +{ + /* + The vlw font format does not appear to be documented anywhere, so some reverse + engineering has been applied! + + Header of vlw file comprises 6 uint32_t parameters (24 bytes total): + 1. The gCount (number of character glyphs) + 2. A version number (0xB = 11 for the one I am using) + 3. The font size (in points, not pixels) + 4. Deprecated mboxY parameter (typically set to 0) + 5. Ascent in pixels from baseline to top of "d" + 6. Descent in pixels from baseline to bottom of "p" + + Next are gCount sets of values for each glyph, each set comprises 7 int32t parameters (28 bytes): + 1. Glyph Unicode stored as a 32-bit value + 2. Height of bitmap bounding box + 3. Width of bitmap bounding box + 4. gxAdvance for cursor (setWidth in Processing) + 5. dY = distance from cursor baseline to top of glyph bitmap (signed value +ve = up) + 6. dX = distance from cursor to left side of glyph bitmap (signed value -ve = left) + 7. padding value, typically 0 + + The bitmaps start next at 24 + (28 * gCount) bytes from the start of the file. + Each pixel is 1 byte, an 8-bit Alpha value which represents the transparency from + 0xFF foreground colour, 0x00 background. The library uses a linear interpolation + between the foreground and background RGB component colours. e.g. + pixelRed = ((fgRed * alpha) + (bgRed * (255 - alpha))/255 + To gain a performance advantage fixed point arithmetic is used with rounding and + division by 256 (shift right 8 bits is faster). + + After the bitmaps is: + 1 byte for font name string length (excludes null) + a zero terminated character string giving the font name + 1 byte for Postscript name string length + a zero/one terminated character string giving the font name + last byte is 0 for non-anti-aliased and 1 for anti-aliased (smoothed) + + + Glyph bitmap example is: + // Cursor coordinate positions for this and next character are marked by 'C' + // C<------- gxAdvance ------->C gxAdvance is how far to move cursor for next glyph cursor position + // | | + // | | ascent is top of "d", descent is bottom of "p" + // +-- gdX --+ ascent + // | +-- gWidth--+ | gdX is offset to left edge of glyph bitmap + // | + x@.........@x + | gdX may be negative e.g. italic "y" tail extending to left of + // | | @@.........@@ | | cursor position, plot top left corner of bitmap at (cursorX + gdX) + // | | @@.........@@ gdY | gWidth and gHeight are glyph bitmap dimensions + // | | .@@@.....@@@@ | | + // | gHeight ....@@@@@..@@ + + <-- baseline + // | | ...........@@ | + // | | ...........@@ | gdY is the offset to the top edge of the bitmap + // | | .@@.......@@. descent plot top edge of bitmap at (cursorY + ascent - gdY) + // | + x..@@@@@@@..x | x marks the corner pixels of the bitmap + // | | + // +---------------------------+ yAdvance is y delta for the next line, font size or (ascent + descent) + // some fonts can overlay in y direction so may need a user adjust value + + */ + + if (fontLoaded) unloadFont(); + +#ifdef FONT_FS_AVAILABLE + if (fontName == "") fs_font = false; + else { fontPtr = nullptr; fs_font = true; } + + if (fs_font) { + spiffs = flash; // true if font is in SPIFFS + + if(spiffs) fontFS = SPIFFS; + + // Avoid a crash on the ESP32 if the file does not exist + if (fontFS.exists("/" + fontName + ".vlw") == false) { + Serial.println("Font file " + fontName + " not found!"); + return; + } + + fontFile = fontFS.open( "/" + fontName + ".vlw", "r"); + + if(!fontFile) return; + + fontFile.seek(0, fs::SeekSet); + } +#else + // Avoid unused varaible warning + fontName = fontName; + flash = flash; +#endif + + gFont.gArray = (const uint8_t*)fontPtr; + + gFont.gCount = (uint16_t)readInt32(); // glyph count in file + readInt32(); // vlw encoder version - discard + gFont.yAdvance = (uint16_t)readInt32(); // Font size in points, not pixels + readInt32(); // discard + gFont.ascent = (uint16_t)readInt32(); // top of "d" + gFont.descent = (uint16_t)readInt32(); // bottom of "p" + + // These next gFont values might be updated when the Metrics are fetched + gFont.maxAscent = gFont.ascent; // Determined from metrics + gFont.maxDescent = gFont.descent; // Determined from metrics + gFont.yAdvance = gFont.ascent + gFont.descent; + gFont.spaceWidth = gFont.yAdvance / 4; // Guess at space width + + fontLoaded = true; + + // Fetch the metrics for each glyph + loadMetrics(); +} + + +/*************************************************************************************** +** Function name: loadMetrics +** Description: Get the metrics for each glyph and store in RAM +*************************************************************************************x*/ +//#define SHOW_ASCENT_DESCENT +void TFT_eSPI::loadMetrics(void) +{ + uint32_t headerPtr = 24; + uint32_t bitmapPtr = headerPtr + gFont.gCount * 28; + +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if ( psramFound() ) + { + gUnicode = (uint16_t*)ps_malloc( gFont.gCount * 2); // Unicode 16-bit Basic Multilingual Plane (0-FFFF) + gHeight = (uint8_t*)ps_malloc( gFont.gCount ); // Height of glyph + gWidth = (uint8_t*)ps_malloc( gFont.gCount ); // Width of glyph + gxAdvance = (uint8_t*)ps_malloc( gFont.gCount ); // xAdvance - to move x cursor + gdY = (int16_t*)ps_malloc( gFont.gCount * 2); // offset from bitmap top edge from lowest point in any character + gdX = (int8_t*)ps_malloc( gFont.gCount ); // offset for bitmap left edge relative to cursor X + gBitmap = (uint32_t*)ps_malloc( gFont.gCount * 4); // seek pointer to glyph bitmap in the file + } + else +#endif + { + gUnicode = (uint16_t*)malloc( gFont.gCount * 2); // Unicode 16-bit Basic Multilingual Plane (0-FFFF) + gHeight = (uint8_t*)malloc( gFont.gCount ); // Height of glyph + gWidth = (uint8_t*)malloc( gFont.gCount ); // Width of glyph + gxAdvance = (uint8_t*)malloc( gFont.gCount ); // xAdvance - to move x cursor + gdY = (int16_t*)malloc( gFont.gCount * 2); // offset from bitmap top edge from lowest point in any character + gdX = (int8_t*)malloc( gFont.gCount ); // offset for bitmap left edge relative to cursor X + gBitmap = (uint32_t*)malloc( gFont.gCount * 4); // seek pointer to glyph bitmap in the file + } + +#ifdef SHOW_ASCENT_DESCENT + Serial.print("ascent = "); Serial.println(gFont.ascent); + Serial.print("descent = "); Serial.println(gFont.descent); +#endif + +#ifdef FONT_FS_AVAILABLE + if (fs_font) fontFile.seek(headerPtr, fs::SeekSet); +#endif + + uint16_t gNum = 0; + + while (gNum < gFont.gCount) + { + gUnicode[gNum] = (uint16_t)readInt32(); // Unicode code point value + gHeight[gNum] = (uint8_t)readInt32(); // Height of glyph + gWidth[gNum] = (uint8_t)readInt32(); // Width of glyph + gxAdvance[gNum] = (uint8_t)readInt32(); // xAdvance - to move x cursor + gdY[gNum] = (int16_t)readInt32(); // y delta from baseline + gdX[gNum] = (int8_t)readInt32(); // x delta from cursor + readInt32(); // ignored + + //Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gHeight = "); Serial.println(gHeight[gNum]); + //Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gWidth = "); Serial.println(gWidth[gNum]); + //Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gxAdvance = "); Serial.println(gxAdvance[gNum]); + //Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gdY = "); Serial.println(gdY[gNum]); + + // Different glyph sets have different ascent values not always based on "d", so we could get + // the maximum glyph ascent by checking all characters. BUT this method can generate bad values + // for non-existent glyphs, so we will reply on processing for the value and disable this code for now... + /* + if (gdY[gNum] > gFont.maxAscent) + { + // Try to avoid UTF coding values and characters that tend to give duff values + if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0x7F)) || (gUnicode[gNum] > 0xA0)) + { + gFont.maxAscent = gdY[gNum]; +#ifdef SHOW_ASCENT_DESCENT + Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxAscent = "); Serial.println(gFont.maxAscent); +#endif + } + } + */ + + // Different glyph sets have different descent values not always based on "p", so get maximum glyph descent + if (((int16_t)gHeight[gNum] - (int16_t)gdY[gNum]) > gFont.maxDescent) + { + // Avoid UTF coding values and characters that tend to give duff values + if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0xA0) && (gUnicode[gNum] != 0x7F)) || (gUnicode[gNum] > 0xFF)) + { + gFont.maxDescent = gHeight[gNum] - gdY[gNum]; +#ifdef SHOW_ASCENT_DESCENT + Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxDescent = "); Serial.println(gHeight[gNum] - gdY[gNum]); +#endif + } + } + + gBitmap[gNum] = bitmapPtr; + + bitmapPtr += gWidth[gNum] * gHeight[gNum]; + + gNum++; + yield(); + } + + gFont.yAdvance = gFont.maxAscent + gFont.maxDescent; + + gFont.spaceWidth = (gFont.ascent + gFont.descent) * 2/7; // Guess at space width +} + + +/*************************************************************************************** +** Function name: deleteMetrics +** Description: Delete the old glyph metrics and free up the memory +*************************************************************************************x*/ +void TFT_eSPI::unloadFont( void ) +{ + if (gUnicode) + { + free(gUnicode); + gUnicode = NULL; + } + + if (gHeight) + { + free(gHeight); + gHeight = NULL; + } + + if (gWidth) + { + free(gWidth); + gWidth = NULL; + } + + if (gxAdvance) + { + free(gxAdvance); + gxAdvance = NULL; + } + + if (gdY) + { + free(gdY); + gdY = NULL; + } + + if (gdX) + { + free(gdX); + gdX = NULL; + } + + if (gBitmap) + { + free(gBitmap); + gBitmap = NULL; + } + + gFont.gArray = nullptr; + +#ifdef FONT_FS_AVAILABLE + if (fs_font && fontFile) fontFile.close(); +#endif + + fontLoaded = false; +} + + +/*************************************************************************************** +** Function name: readInt32 +** Description: Get a 32-bit integer from the font file +*************************************************************************************x*/ +uint32_t TFT_eSPI::readInt32(void) +{ + uint32_t val = 0; + +#ifdef FONT_FS_AVAILABLE + if (fs_font) { + val = (uint32_t)fontFile.read() << 24; + val |= (uint32_t)fontFile.read() << 16; + val |= (uint32_t)fontFile.read() << 8; + val |= (uint32_t)fontFile.read(); + } + else +#endif + { + val = (uint32_t)pgm_read_byte(fontPtr++) << 24; + val |= (uint32_t)pgm_read_byte(fontPtr++) << 16; + val |= (uint32_t)pgm_read_byte(fontPtr++) << 8; + val |= (uint32_t)pgm_read_byte(fontPtr++); + } + + return val; +} + + +/*************************************************************************************** +** Function name: getUnicodeIndex +** Description: Get the font file index of a Unicode character +*************************************************************************************x*/ +bool TFT_eSPI::getUnicodeIndex(uint16_t unicode, uint16_t *index) +{ + for (uint16_t i = 0; i < gFont.gCount; i++) + { + if (gUnicode[i] == unicode) + { + *index = i; + return true; + } + } + return false; +} + + +/*************************************************************************************** +** Function name: drawGlyph +** Description: Write a character to the TFT cursor position +*************************************************************************************x*/ +// Expects file to be open +void TFT_eSPI::drawGlyph(uint16_t code) +{ + uint16_t fg = textcolor; + uint16_t bg = textbgcolor; + + // Check if cursor has moved + if (last_cursor_x != cursor_x) + { + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; + } + + if (code < 0x21) + { + if (code == 0x20) { + if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFont.spaceWidth) - bg_cursor_x, gFont.yAdvance, bg); + cursor_x += gFont.spaceWidth; + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; + return; + } + + if (code == '\n') { + cursor_x = 0; + bg_cursor_x = 0; + last_cursor_x = 0; + cursor_y += gFont.yAdvance; + if (textwrapY && (cursor_y >= height())) cursor_y = 0; + return; + } + } + + uint16_t gNum = 0; + bool found = getUnicodeIndex(code, &gNum); + + if (found) + { + + if (textwrapX && (cursor_x + gWidth[gNum] + gdX[gNum] > width())) + { + cursor_y += gFont.yAdvance; + cursor_x = 0; + bg_cursor_x = 0; + } + if (textwrapY && ((cursor_y + gFont.yAdvance) >= height())) cursor_y = 0; + if (cursor_x == 0) cursor_x -= gdX[gNum]; + + uint8_t* pbuffer = nullptr; + const uint8_t* gPtr = (const uint8_t*) gFont.gArray; + +#ifdef FONT_FS_AVAILABLE + if (fs_font) + { + fontFile.seek(gBitmap[gNum], fs::SeekSet); + pbuffer = (uint8_t*)malloc(gWidth[gNum]); + } +#endif + + int16_t cy = cursor_y + gFont.maxAscent - gdY[gNum]; + int16_t cx = cursor_x + gdX[gNum]; + + // if (cx > width() && bg_cursor_x > width()) return; + // if (cursor_y > height()) return; + + int16_t fxs = cx; + uint32_t fl = 0; + int16_t bxs = cx; + uint32_t bl = 0; + int16_t bx = 0; + uint8_t pixel; + + startWrite(); // Avoid slow ESP32 transaction overhead for every pixel + + int16_t fillwidth = 0; + int16_t fillheight = 0; + + // Fill area above glyph + if (_fillbg) { + fillwidth = (cursor_x + gxAdvance[gNum]) - bg_cursor_x; + if (fillwidth > 0) { + fillheight = gFont.maxAscent - gdY[gNum]; + // Could be negative + if (fillheight > 0) { + fillRect(bg_cursor_x, cursor_y, fillwidth, fillheight, textbgcolor); + } + } + else { + // Could be negative + fillwidth = 0; + } + + // Fill any area to left of glyph + if (bg_cursor_x < cx) fillRect(bg_cursor_x, cy, cx - bg_cursor_x, gHeight[gNum], textbgcolor); + // Set x position in glyph area where background starts + if (bg_cursor_x > cx) bx = bg_cursor_x - cx; + // Fill any area to right of glyph + if (cx + gWidth[gNum] < cursor_x + gxAdvance[gNum]) { + fillRect(cx + gWidth[gNum], cy, (cursor_x + gxAdvance[gNum]) - (cx + gWidth[gNum]), gHeight[gNum], textbgcolor); + } + } + + for (int32_t y = 0; y < gHeight[gNum]; y++) + { +#ifdef FONT_FS_AVAILABLE + if (fs_font) { + if (spiffs) + { + fontFile.read(pbuffer, gWidth[gNum]); + //Serial.println("SPIFFS"); + } + else + { + endWrite(); // Release SPI for SD card transaction + fontFile.read(pbuffer, gWidth[gNum]); + startWrite(); // Re-start SPI for TFT transaction + //Serial.println("Not SPIFFS"); + } + } +#endif + + for (int32_t x = 0; x < gWidth[gNum]; x++) + { +#ifdef FONT_FS_AVAILABLE + if (fs_font) pixel = pbuffer[x]; + else +#endif + pixel = pgm_read_byte(gPtr + gBitmap[gNum] + x + gWidth[gNum] * y); + + if (pixel) + { + if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } + if (pixel != 0xFF) + { + if (fl) { + if (fl==1) drawPixel(fxs, y + cy, fg); + else drawFastHLine( fxs, y + cy, fl, fg); + fl = 0; + } + if (getColor) bg = getColor(x + cx, y + cy); + drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg)); + } + else + { + if (fl==0) fxs = x + cx; + fl++; + } + } + else + { + if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } + if (_fillbg) { + if (x >= bx) { + if (bl==0) bxs = x + cx; + bl++; + } + } + } + } + if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } + if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } + } + + // Fill area below glyph + if (fillwidth > 0) { + fillheight = (cursor_y + gFont.yAdvance) - (cy + gHeight[gNum]); + if (fillheight > 0) { + fillRect(bg_cursor_x, cy + gHeight[gNum], fillwidth, fillheight, textbgcolor); + } + } + + if (pbuffer) free(pbuffer); + cursor_x += gxAdvance[gNum]; + endWrite(); + } + else + { + // Point code not in font so draw a rectangle and move on cursor + drawRect(cursor_x, cursor_y + gFont.maxAscent - gFont.ascent, gFont.spaceWidth, gFont.ascent, fg); + cursor_x += gFont.spaceWidth + 1; + } + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; +} + +/*************************************************************************************** +** Function name: showFont +** Description: Page through all characters in font, td ms between screens +*************************************************************************************x*/ +void TFT_eSPI::showFont(uint32_t td) +{ + if(!fontLoaded) return; + + int16_t cursorX = width(); // Force start of new page to initialise cursor + int16_t cursorY = height();// for the first character + uint32_t timeDelay = 0; // No delay before first page + + fillScreen(textbgcolor); + + for (uint16_t i = 0; i < gFont.gCount; i++) + { + // Check if this will need a new screen + if (cursorX + gdX[i] + gWidth[i] >= width()) { + cursorX = -gdX[i]; + + cursorY += gFont.yAdvance; + if (cursorY + gFont.maxAscent + gFont.descent >= height()) { + cursorX = -gdX[i]; + cursorY = 0; + delay(timeDelay); + timeDelay = td; + fillScreen(textbgcolor); + } + } + + setCursor(cursorX, cursorY); + drawGlyph(gUnicode[i]); + cursorX += gxAdvance[i]; + yield(); + } + + delay(timeDelay); + fillScreen(textbgcolor); +} diff --git a/libraries/TFT_eSPI/Extensions/Smooth_font.h b/libraries/TFT_eSPI/Extensions/Smooth_font.h new file mode 100644 index 0000000..c31dcad --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Smooth_font.h @@ -0,0 +1,61 @@ + // Coded by Bodmer 10/2/18, see license in root directory. + // This is part of the TFT_eSPI class and is associated with anti-aliased font functions + + public: + + // These are for the new anti-aliased fonts + void loadFont(const uint8_t array[]); +#ifdef FONT_FS_AVAILABLE + void loadFont(String fontName, fs::FS &ffs); +#endif + void loadFont(String fontName, bool flash = true); + void unloadFont( void ); + bool getUnicodeIndex(uint16_t unicode, uint16_t *index); + + virtual void drawGlyph(uint16_t code); + + void showFont(uint32_t td); + + // This is for the whole font + typedef struct + { + const uint8_t* gArray; //array start pointer + uint16_t gCount; // Total number of characters + uint16_t yAdvance; // Line advance + uint16_t spaceWidth; // Width of a space character + int16_t ascent; // Height of top of 'd' above baseline, other characters may be taller + int16_t descent; // Offset to bottom of 'p', other characters may have a larger descent + uint16_t maxAscent; // Maximum ascent found in font + uint16_t maxDescent; // Maximum descent found in font + } fontMetrics; + +fontMetrics gFont = { nullptr, 0, 0, 0, 0, 0, 0, 0 }; + + // These are for the metrics for each individual glyph (so we don't need to seek this in file and waste time) + uint16_t* gUnicode = NULL; //UTF-16 code, the codes are searched so do not need to be sequential + uint8_t* gHeight = NULL; //cheight + uint8_t* gWidth = NULL; //cwidth + uint8_t* gxAdvance = NULL; //setWidth + int16_t* gdY = NULL; //topExtent + int8_t* gdX = NULL; //leftExtent + uint32_t* gBitmap = NULL; //file pointer to greyscale bitmap + + bool fontLoaded = false; // Flags when a anti-aliased font is loaded + +#ifdef FONT_FS_AVAILABLE + fs::File fontFile; + fs::FS &fontFS = SPIFFS; + bool spiffs = true; + bool fs_font = false; // For ESP32/8266 use smooth font file or FLASH (PROGMEM) array + +#else + bool fontFile = true; +#endif + + private: + + void loadMetrics(void); + uint32_t readInt32(void); + + uint8_t* fontPtr = nullptr; + diff --git a/libraries/TFT_eSPI/Extensions/Sprite.cpp b/libraries/TFT_eSPI/Extensions/Sprite.cpp new file mode 100644 index 0000000..af841cc --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Sprite.cpp @@ -0,0 +1,2698 @@ +/************************************************************************************** +// The following class creates Sprites in RAM, graphics can then be drawn in the Sprite +// and rendered quickly onto the TFT screen. The class inherits the graphics functions +// from the TFT_eSPI class. Some functions are overridden by this class so that the +// graphics are written to the Sprite rather than the TFT. +// Coded by Bodmer, see license file in root folder +***************************************************************************************/ +/*************************************************************************************** +// Color bytes are swapped when writing to RAM, this introduces a small overhead but +// there is a nett performance gain by using swapped bytes. +***************************************************************************************/ + +/*************************************************************************************** +** Function name: TFT_eSprite +** Description: Class constructor +***************************************************************************************/ +TFT_eSprite::TFT_eSprite(TFT_eSPI *tft) +{ + _tft = tft; // Pointer to tft class so we can call member functions + + _iwidth = 0; // Initialise width and height to 0 (it does not exist yet) + _iheight = 0; + _bpp = 16; + _swapBytes = false; // Do not swap pushImage colour bytes by default + + _created = false; + _vpOoB = true; + + _xs = 0; // window bounds for pushColor + _ys = 0; + _xe = 0; + _ye = 0; + + _xptr = 0; // pushColor coordinate + _yptr = 0; + + _colorMap = nullptr; + + _psram_enable = true; + + // Ensure end_tft_write() does nothing in inherited functions. + lockTransaction = true; +} + + +/*************************************************************************************** +** Function name: createSprite +** Description: Create a sprite (bitmap) of defined width and height +***************************************************************************************/ +// cast returned value to (uint8_t*) for 8-bit or (uint16_t*) for 16-bit colours +void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) +{ + + if ( _created ) return _img8_1; + + if ( w < 1 || h < 1 ) return nullptr; + + _iwidth = _dwidth = _bitwidth = w; + _iheight = _dheight = h; + + cursor_x = 0; + cursor_y = 0; + + // Default scroll rectangle and gap fill colour + _sx = 0; + _sy = 0; + _sw = w; + _sh = h; + _scolor = TFT_BLACK; + + _img8 = (uint8_t*) callocSprite(w, h, frames); + _img8_1 = _img8; + _img8_2 = _img8; + _img = (uint16_t*) _img8; + _img4 = _img8; + + if ( (_bpp == 16) && (frames > 1) ) { + _img8_2 = _img8 + (w * h * 2 + 1); + } + + // ESP32 only 16bpp check + //if (esp_ptr_dma_capable(_img8_1)) Serial.println("DMA capable Sprite pointer _img8_1"); + //else Serial.println("Not a DMA capable Sprite pointer _img8_1"); + //if (esp_ptr_dma_capable(_img8_2)) Serial.println("DMA capable Sprite pointer _img8_2"); + //else Serial.println("Not a DMA capable Sprite pointer _img8_2"); + + if ( (_bpp == 8) && (frames > 1) ) { + _img8_2 = _img8 + (w * h + 1); + } + + // This is to make it clear what pointer size is expected to be used + // but casting in the user sketch is needed due to the use of void* + if ( (_bpp == 1) && (frames > 1) ) + { + w = (w+7) & 0xFFF8; + _img8_2 = _img8 + ( (w>>3) * h + 1 ); + } + + if (_img8) + { + _created = true; + if ( (_bpp == 4) && (_colorMap == nullptr)) createPalette(default_4bit_palette); + + rotation = 0; + setViewport(0, 0, _dwidth, _dheight); + setPivot(_iwidth/2, _iheight/2); + return _img8_1; + } + + return nullptr; +} + + +/*************************************************************************************** +** Function name: getPointer +** Description: Returns pointer to start of sprite memory area +***************************************************************************************/ +void* TFT_eSprite::getPointer(void) +{ + if (!_created) return nullptr; + return _img8_1; +} + + +/*************************************************************************************** +** Function name: created +** Description: Returns true if sprite has been created +***************************************************************************************/ +bool TFT_eSprite::created(void) +{ + return _created; +} + + +/*************************************************************************************** +** Function name: ~TFT_eSprite +** Description: Class destructor +***************************************************************************************/ +TFT_eSprite::~TFT_eSprite(void) +{ + deleteSprite(); + +#ifdef SMOOTH_FONT + if(fontLoaded) unloadFont(); +#endif +} + + +/*************************************************************************************** +** Function name: callocSprite +** Description: Allocate a memory area for the Sprite and return pointer +***************************************************************************************/ +void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) +{ + // Add one extra "off screen" pixel to point out-of-bounds setWindow() coordinates + // this means push/writeColor functions do not need additional bounds checks and + // hence will run faster in normal circumstances. + uint8_t* ptr8 = nullptr; + + if (frames > 2) frames = 2; // Currently restricted to 2 frame buffers + if (frames < 1) frames = 1; + + if (_bpp == 16) + { +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if ( psramFound() && _psram_enable && !_tft->DMA_Enabled) + { + ptr8 = ( uint8_t*) ps_calloc(frames * w * h + frames, sizeof(uint16_t)); + //Serial.println("PSRAM"); + } + else +#endif + { + ptr8 = ( uint8_t*) calloc(frames * w * h + frames, sizeof(uint16_t)); + //Serial.println("Normal RAM"); + } + } + + else if (_bpp == 8) + { +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if ( psramFound() && _psram_enable ) ptr8 = ( uint8_t*) ps_calloc(frames * w * h + frames, sizeof(uint8_t)); + else +#endif + ptr8 = ( uint8_t*) calloc(frames * w * h + frames, sizeof(uint8_t)); + } + + else if (_bpp == 4) + { + w = (w+1) & 0xFFFE; // width needs to be multiple of 2, with an extra "off screen" pixel + _iwidth = w; +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if ( psramFound() && _psram_enable ) ptr8 = ( uint8_t*) ps_calloc(((frames * w * h) >> 1) + frames, sizeof(uint8_t)); + else +#endif + ptr8 = ( uint8_t*) calloc(((frames * w * h) >> 1) + frames, sizeof(uint8_t)); + } + + else // Must be 1 bpp + { + //_dwidth Display width+height in pixels always in rotation 0 orientation + //_dheight Not swapped for sprite rotations + // Note: for 1bpp _iwidth and _iheight are swapped during Sprite rotations + + w = (w+7) & 0xFFF8; // width should be the multiple of 8 bits to be compatible with epdpaint + _iwidth = w; // _iwidth is rounded up to be multiple of 8, so might not be = _dwidth + _bitwidth = w; // _bitwidth will not be rotated whereas _iwidth may be + +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if ( psramFound() && _psram_enable ) ptr8 = ( uint8_t*) ps_calloc(frames * (w>>3) * h + frames, sizeof(uint8_t)); + else +#endif + ptr8 = ( uint8_t*) calloc(frames * (w>>3) * h + frames, sizeof(uint8_t)); + } + + return ptr8; +} + + +/*************************************************************************************** +** Function name: createPalette (from RAM array) +** Description: Set a palette for a 4-bit per pixel sprite +***************************************************************************************/ +void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) +{ + if (!_created) return; + + if (colorMap == nullptr) + { + // Create a color map using the default FLASH map + createPalette(default_4bit_palette); + return; + } + + // Allocate and clear memory for 16 color map + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + + if (colors > 16) colors = 16; + + // Copy map colors + for (uint8_t i = 0; i < colors; i++) + { + _colorMap[i] = colorMap[i]; + } +} + + +/*************************************************************************************** +** Function name: createPalette (from FLASH array) +** Description: Set a palette for a 4-bit per pixel sprite +***************************************************************************************/ +void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) +{ + if (!_created) return; + + if (colorMap == nullptr) + { + // Create a color map using the default FLASH map + colorMap = default_4bit_palette; + } + + // Allocate and clear memory for 16 color map + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + + if (colors > 16) colors = 16; + + // Copy map colors + for (uint8_t i = 0; i < colors; i++) + { + _colorMap[i] = pgm_read_word(colorMap++); + } +} + + +/*************************************************************************************** +** Function name: frameBuffer +** Description: For 1 bpp Sprites, select the frame used for graphics +***************************************************************************************/ +// Frames are numbered 1 and 2 +void* TFT_eSprite::frameBuffer(int8_t f) +{ + if (!_created) return nullptr; + + if ( f == 2 ) _img8 = _img8_2; + else _img8 = _img8_1; + + if (_bpp == 16) _img = (uint16_t*)_img8; + + //if (_bpp == 8) _img8 = _img8; + + if (_bpp == 4) _img4 = _img8; + + return _img8; +} + + +/*************************************************************************************** +** Function name: setColorDepth +** Description: Set bits per pixel for colour (1, 8 or 16) +***************************************************************************************/ +void* TFT_eSprite::setColorDepth(int8_t b) +{ + // Do not re-create the sprite if the colour depth does not change + if (_bpp == b) return _img8_1; + + // Validate the new colour depth + if ( b > 8 ) _bpp = 16; // Bytes per pixel + else if ( b > 4 ) _bpp = 8; + else if ( b > 1 ) _bpp = 4; + else _bpp = 1; + + // Can't change an existing sprite's colour depth so delete and create a new one + if (_created) { + deleteSprite(); + return createSprite(_dwidth, _dheight); + } + + return nullptr; +} + + +/*************************************************************************************** +** Function name: getColorDepth +** Description: Get bits per pixel for colour (1, 8 or 16) +***************************************************************************************/ +int8_t TFT_eSprite::getColorDepth(void) +{ + if (_created) return _bpp; + else return 0; +} + + +/*************************************************************************************** +** Function name: setBitmapColor +** Description: Set the 1bpp foreground foreground and background colour +***************************************************************************************/ +void TFT_eSprite::setBitmapColor(uint16_t c, uint16_t b) +{ + if (c == b) b = ~c; + _tft->bitmap_fg = c; + _tft->bitmap_bg = b; +} + + +/*************************************************************************************** +** Function name: setPaletteColor +** Description: Set the 4bpp palette color at the given index +***************************************************************************************/ +void TFT_eSprite::setPaletteColor(uint8_t index, uint16_t color) +{ + if (_colorMap == nullptr || index > 15) return; // out of bounds + + _colorMap[index] = color; +} + + +/*************************************************************************************** +** Function name: getPaletteColor +** Description: Return the palette color at 4bpp index, or 0 on error. +***************************************************************************************/ +uint16_t TFT_eSprite::getPaletteColor(uint8_t index) +{ + if (_colorMap == nullptr || index > 15) return 0; // out of bounds + + return _colorMap[index]; +} + + +/*************************************************************************************** +** Function name: deleteSprite +** Description: Delete the sprite to free up memory (RAM) +***************************************************************************************/ +void TFT_eSprite::deleteSprite(void) +{ + if (_colorMap != nullptr) + { + free(_colorMap); + _colorMap = nullptr; + } + + if (_created) + { + free(_img8_1); + _img8 = nullptr; + _created = false; + _vpOoB = true; // TFT_eSPI class write() uses this to check for valid sprite + } +} + + +/*************************************************************************************** +** Function name: pushRotated - Fast fixed point integer maths version +** Description: Push rotated Sprite to TFT screen +***************************************************************************************/ +#define FP_SCALE 10 +bool TFT_eSprite::pushRotated(int16_t angle, uint32_t transp) +{ + if ( !_created || _tft->_vpOoB) return false; + + // Bounding box parameters + int16_t min_x; + int16_t min_y; + int16_t max_x; + int16_t max_y; + + // Get the bounding box of this rotated source Sprite relative to Sprite pivot + if ( !getRotatedBounds(angle, &min_x, &min_y, &max_x, &max_y) ) return false; + + uint16_t sline_buffer[max_x - min_x + 1]; + + int32_t xt = min_x - _tft->_xPivot; + int32_t yt = min_y - _tft->_yPivot; + uint32_t xe = _dwidth << FP_SCALE; + uint32_t ye = _dheight << FP_SCALE; + uint16_t tpcolor = (uint16_t)transp; + + if (transp != 0x00FFFFFF) { + if (_bpp == 4) tpcolor = _colorMap[transp & 0x0F]; + tpcolor = tpcolor>>8 | tpcolor<<8; // Working with swapped color bytes + } + _tft->startWrite(); // Avoid transaction overhead for every tft pixel + + // Scan destination bounding box and fetch transformed pixels from source Sprite + for (int32_t y = min_y; y <= max_y; y++, yt++) { + int32_t x = min_x; + uint32_t xs = (_cosra * xt - (_sinra * yt - (_xPivot << FP_SCALE)) + (1 << (FP_SCALE - 1))); + uint32_t ys = (_sinra * xt + (_cosra * yt + (_yPivot << FP_SCALE)) + (1 << (FP_SCALE - 1))); + + while ((xs >= xe || ys >= ye) && x < max_x) { x++; xs += _cosra; ys += _sinra; } + if (x == max_x) continue; + + uint32_t pixel_count = 0; + do { + uint32_t rp; + int32_t xp = xs >> FP_SCALE; + int32_t yp = ys >> FP_SCALE; + if (_bpp == 16) {rp = _img[xp + yp * _iwidth]; } + else { rp = readPixel(xp, yp); rp = (uint16_t)(rp>>8 | rp<<8); } + if (transp != 0x00FFFFFF && tpcolor == rp) { + if (pixel_count) { + // TFT window is already clipped, so this is faster than pushImage() + _tft->setWindow(x - pixel_count, y, x - 1, y); + _tft->pushPixels(sline_buffer, pixel_count); + pixel_count = 0; + } + } + else { + sline_buffer[pixel_count++] = rp; + } + } while (++x < max_x && (xs += _cosra) < xe && (ys += _sinra) < ye); + if (pixel_count) { + // TFT window is already clipped, so this is faster than pushImage() + _tft->setWindow(x - pixel_count, y, x - 1, y); + _tft->pushPixels(sline_buffer, pixel_count); + } + } + + _tft->endWrite(); // End transaction + + return true; +} + + +/*************************************************************************************** +** Function name: pushRotated - Fast fixed point integer maths version +** Description: Push a rotated copy of the Sprite to another Sprite +***************************************************************************************/ +// Not compatible with 4bpp +bool TFT_eSprite::pushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp) +{ + if ( !_created || _bpp == 4) return false; // Check this Sprite is created + if ( !spr->_created || spr->_bpp == 4) return false; // Ckeck destination Sprite is created + + // Bounding box parameters + int16_t min_x; + int16_t min_y; + int16_t max_x; + int16_t max_y; + + // Get the bounding box of this rotated source Sprite + if ( !getRotatedBounds(spr, angle, &min_x, &min_y, &max_x, &max_y) ) return false; + + uint16_t sline_buffer[max_x - min_x + 1]; + + int32_t xt = min_x - spr->_xPivot; + int32_t yt = min_y - spr->_yPivot; + uint32_t xe = _dwidth << FP_SCALE; + uint32_t ye = _dheight << FP_SCALE; + uint16_t tpcolor = (uint16_t)transp; + + if (transp != 0x00FFFFFF) { + if (_bpp == 4) tpcolor = _colorMap[transp & 0x0F]; + tpcolor = tpcolor>>8 | tpcolor<<8; // Working with swapped color bytes + } + + bool oldSwapBytes = spr->getSwapBytes(); + spr->setSwapBytes(false); + + // Scan destination bounding box and fetch transformed pixels from source Sprite + for (int32_t y = min_y; y <= max_y; y++, yt++) { + int32_t x = min_x; + uint32_t xs = (_cosra * xt - (_sinra * yt - (_xPivot << FP_SCALE)) + (1 << (FP_SCALE - 1))); + uint32_t ys = (_sinra * xt + (_cosra * yt + (_yPivot << FP_SCALE)) + (1 << (FP_SCALE - 1))); + + while ((xs >= xe || ys >= ye) && x < max_x) { x++; xs += _cosra; ys += _sinra; } + if (x == max_x) continue; + + uint32_t pixel_count = 0; + do { + uint32_t rp; + int32_t xp = xs >> FP_SCALE; + int32_t yp = ys >> FP_SCALE; + if (_bpp == 16) rp = _img[xp + yp * _iwidth]; + else { rp = readPixel(xp, yp); rp = (uint16_t)(rp>>8 | rp<<8); } + if (transp != 0x00FFFFFF && tpcolor == rp) { + if (pixel_count) { + spr->pushImage(x - pixel_count, y, pixel_count, 1, sline_buffer); + pixel_count = 0; + } + } + else { + sline_buffer[pixel_count++] = rp; + } + } while (++x < max_x && (xs += _cosra) < xe && (ys += _sinra) < ye); + if (pixel_count) spr->pushImage(x - pixel_count, y, pixel_count, 1, sline_buffer); + } + spr->setSwapBytes(oldSwapBytes); + return true; +} + + +/*************************************************************************************** +** Function name: getRotatedBounds +** Description: Get TFT bounding box of a rotated Sprite wrt pivot +***************************************************************************************/ +bool TFT_eSprite::getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, + int16_t *max_x, int16_t *max_y) +{ + // Get the bounding box of this rotated source Sprite relative to Sprite pivot + getRotatedBounds(angle, width(), height(), _xPivot, _yPivot, min_x, min_y, max_x, max_y); + + // Move bounding box so source Sprite pivot coincides with TFT pivot + *min_x += _tft->_xPivot; + *max_x += _tft->_xPivot; + *min_y += _tft->_yPivot; + *max_y += _tft->_yPivot; + + // Return if bounding box is outside of TFT viewport + if (*min_x > _tft->_vpW) return false; + if (*min_y > _tft->_vpH) return false; + if (*max_x < _tft->_vpX) return false; + if (*max_y < _tft->_vpY) return false; + + // Clip bounding box to be within TFT viewport + if (*min_x < _tft->_vpX) *min_x = _tft->_vpX; + if (*min_y < _tft->_vpY) *min_y = _tft->_vpY; + if (*max_x > _tft->_vpW) *max_x = _tft->_vpW; + if (*max_y > _tft->_vpH) *max_y = _tft->_vpH; + + return true; +} + + +/*************************************************************************************** +** Function name: getRotatedBounds +** Description: Get destination Sprite bounding box of a rotated Sprite wrt pivot +***************************************************************************************/ +bool TFT_eSprite::getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y, + int16_t *max_x, int16_t *max_y) +{ + // Get the bounding box of this rotated source Sprite relative to Sprite pivot + getRotatedBounds(angle, width(), height(), _xPivot, _yPivot, min_x, min_y, max_x, max_y); + + // Move bounding box so source Sprite pivot coincides with destination Sprite pivot + *min_x += spr->_xPivot; + *max_x += spr->_xPivot; + *min_y += spr->_yPivot; + *max_y += spr->_yPivot; + + // Test only to show bounding box + // spr->fillSprite(TFT_BLACK); + // spr->drawRect(min_x, min_y, max_x - min_x + 1, max_y - min_y + 1, TFT_GREEN); + + // Return if bounding box is completely outside of destination Sprite + if (*min_x > spr->width()) return true; + if (*min_y > spr->height()) return true; + if (*max_x < 0) return true; + if (*max_y < 0) return true; + + // Clip bounding box to Sprite boundaries + // Clipping to a viewport will be done by destination Sprite pushImage function + if (*min_x < 0) min_x = 0; + if (*min_y < 0) min_y = 0; + if (*max_x > spr->width()) *max_x = spr->width(); + if (*max_y > spr->height()) *max_y = spr->height(); + + return true; +} + + +/*************************************************************************************** +** Function name: rotatedBounds +** Description: Get bounding box of a rotated Sprite wrt pivot +***************************************************************************************/ +void TFT_eSprite::getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp, + int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y) +{ + // Trig values for the rotation + float radAngle = -angle * 0.0174532925; // Convert degrees to radians + float sina = sin(radAngle); + float cosa = cos(radAngle); + + w -= xp; // w is now right edge coordinate relative to xp + h -= yp; // h is now bottom edge coordinate relative to yp + + // Calculate new corner coordinates + int16_t x0 = -xp * cosa - yp * sina; + int16_t y0 = xp * sina - yp * cosa; + + int16_t x1 = w * cosa - yp * sina; + int16_t y1 = -w * sina - yp * cosa; + + int16_t x2 = h * sina + w * cosa; + int16_t y2 = h * cosa - w * sina; + + int16_t x3 = h * sina - xp * cosa; + int16_t y3 = h * cosa + xp * sina; + + // Find bounding box extremes, enlarge box to accomodate rounding errors + *min_x = x0-2; + if (x1 < *min_x) *min_x = x1-2; + if (x2 < *min_x) *min_x = x2-2; + if (x3 < *min_x) *min_x = x3-2; + + *max_x = x0+2; + if (x1 > *max_x) *max_x = x1+2; + if (x2 > *max_x) *max_x = x2+2; + if (x3 > *max_x) *max_x = x3+2; + + *min_y = y0-2; + if (y1 < *min_y) *min_y = y1-2; + if (y2 < *min_y) *min_y = y2-2; + if (y3 < *min_y) *min_y = y3-2; + + *max_y = y0+2; + if (y1 > *max_y) *max_y = y1+2; + if (y2 > *max_y) *max_y = y2+2; + if (y3 > *max_y) *max_y = y3+2; + + _sinra = round(sina * (1<getSwapBytes(); + _tft->setSwapBytes(false); + _tft->pushImage(x, y, _dwidth, _dheight, _img ); + _tft->setSwapBytes(oldSwapBytes); + } + else if (_bpp == 4) + { + _tft->pushImage(x, y, _dwidth, _dheight, _img4, false, _colorMap); + } + else _tft->pushImage(x, y, _dwidth, _dheight, _img8, (bool)(_bpp == 8)); +} + + +/*************************************************************************************** +** Function name: pushSprite +** Description: Push the sprite to the TFT at x, y with transparent colour +***************************************************************************************/ +void TFT_eSprite::pushSprite(int32_t x, int32_t y, uint16_t transp) +{ + if (!_created) return; + + if (_bpp == 16) + { + bool oldSwapBytes = _tft->getSwapBytes(); + _tft->setSwapBytes(false); + _tft->pushImage(x, y, _dwidth, _dheight, _img, transp ); + _tft->setSwapBytes(oldSwapBytes); + } + else if (_bpp == 8) + { + transp = (uint8_t)((transp & 0xE000)>>8 | (transp & 0x0700)>>6 | (transp & 0x0018)>>3); + _tft->pushImage(x, y, _dwidth, _dheight, _img8, (uint8_t)transp, (bool)true); + } + else if (_bpp == 4) + { + _tft->pushImage(x, y, _dwidth, _dheight, _img4, (uint8_t)(transp & 0x0F), false, _colorMap); + } + else _tft->pushImage(x, y, _dwidth, _dheight, _img8, 0, (bool)false); +} + + +/*************************************************************************************** +** Function name: pushToSprite +** Description: Push the sprite to another sprite at x, y +***************************************************************************************/ +// Note: The following sprite to sprite colour depths are currently supported: +// Source Destination +// 16bpp -> 16bpp +// 16bpp -> 8bpp +// 8bpp -> 8bpp +// 4bpp -> 4bpp (note: color translation depends on the 2 sprites palette colors) +// 1bpp -> 1bpp (note: color translation depends on the 2 sprites bitmap colors) + +bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y) +{ + if (!_created) return false; + if (!dspr->created()) return false; + + // Check destination sprite compatibility + int8_t ds_bpp = dspr->getColorDepth(); + if (_bpp == 16 && ds_bpp != 16 && ds_bpp != 8) return false; + if (_bpp == 8 && ds_bpp != 8) return false; + if (_bpp == 4 && ds_bpp != 4) return false; + if (_bpp == 1 && ds_bpp != 1) return false; + + bool oldSwapBytes = dspr->getSwapBytes(); + dspr->setSwapBytes(false); + dspr->pushImage(x, y, _dwidth, _dheight, _img, _bpp); + dspr->setSwapBytes(oldSwapBytes); + + return true; +} + + +/*************************************************************************************** +** Function name: pushToSprite +** Description: Push the sprite to another sprite at x, y with transparent colour +***************************************************************************************/ +// Note: The following sprite to sprite colour depths are currently supported: +// Source Destination +// 16bpp -> 16bpp +// 16bpp -> 8bpp +// 8bpp -> 8bpp +// 1bpp -> 1bpp + +bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transp) +{ + if ( !_created || !dspr->_created) return false; // Check Sprites exist + + // Check destination sprite compatibility + int8_t ds_bpp = dspr->getColorDepth(); + if (_bpp == 16 && ds_bpp != 16 && ds_bpp != 8) return false; + if (_bpp == 8 && ds_bpp != 8) return false; + if (_bpp == 4 || ds_bpp == 4) return false; + if (_bpp == 1 && ds_bpp != 1) return false; + + bool oldSwapBytes = dspr->getSwapBytes(); + uint16_t sline_buffer[width()]; + + transp = transp>>8 | transp<<8; + + // Scan destination bounding box and fetch transformed pixels from source Sprite + for (int32_t ys = 0; ys < height(); ys++) { + int32_t ox = x; + uint32_t pixel_count = 0; + + for (int32_t xs = 0; xs < width(); xs++) { + uint16_t rp = 0; + if (_bpp == 16) rp = _img[xs + ys * width()]; + else { rp = readPixel(xs, ys); rp = rp>>8 | rp<<8; } + //dspr->drawPixel(xs, ys, rp); + + if (transp == rp) { + if (pixel_count) { + dspr->pushImage(ox, y, pixel_count, 1, sline_buffer); + ox += pixel_count; + pixel_count = 0; + } + ox++; + } + else { + sline_buffer[pixel_count++] = rp; + } + } + if (pixel_count) dspr->pushImage(ox, y, pixel_count, 1, sline_buffer); + y++; + } + dspr->setSwapBytes(oldSwapBytes); + return true; +} + + +/*************************************************************************************** +** Function name: pushSprite +** Description: Push a cropped sprite to the TFT at tx, ty +***************************************************************************************/ +bool TFT_eSprite::pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh) +{ + if (!_created) return false; + + // Perform window boundary checks and crop if needed + setWindow(sx, sy, sx + sw - 1, sy + sh - 1); + + /* These global variables are now populated for the sprite + _xs = x start coordinate + _ys = y start coordinate + _xe = x end coordinate (inclusive) + _ye = y end coordinate (inclusive) + */ + + // Calculate new sprite window bounding box width and height + sw = _xe - _xs + 1; + sh = _ye - _ys + 1; + + if (_ys >= _iheight) return false; + + if (_bpp == 16) + { + bool oldSwapBytes = _tft->getSwapBytes(); + _tft->setSwapBytes(false); + + // Check if a faster block copy to screen is possible + if ( sx == 0 && sw == _dwidth) + _tft->pushImage(tx, ty, sw, sh, _img + _iwidth * _ys ); + else // Render line by line + while (sh--) + _tft->pushImage(tx, ty++, sw, 1, _img + _xs + _iwidth * _ys++ ); + + _tft->setSwapBytes(oldSwapBytes); + } + else if (_bpp == 8) + { + // Check if a faster block copy to screen is possible + if ( sx == 0 && sw == _dwidth) + _tft->pushImage(tx, ty, sw, sh, _img8 + _iwidth * _ys, (bool)true ); + else // Render line by line + while (sh--) + _tft->pushImage(tx, ty++, sw, 1, _img8 + _xs + _iwidth * _ys++, (bool)true ); + } + else if (_bpp == 4) + { + // Check if a faster block copy to screen is possible + if ( sx == 0 && sw == _dwidth) + _tft->pushImage(tx, ty, sw, sh, _img4 + (_iwidth>>1) * _ys, false, _colorMap ); + else // Render line by line + { + int32_t ds = _xs&1; // Odd x start pixel + + int32_t de = 0; // Odd x end pixel + if ((sw > ds) && (_xe&1)) de = 1; + + uint32_t dm = 0; // Midsection pixel count + if (sw > (ds+de)) dm = sw - ds - de; + sw--; + + uint32_t yp = (_xs + ds + _iwidth * _ys)>>1; + _tft->startWrite(); + while (sh--) + { + if (ds) _tft->drawPixel(tx, ty, readPixel(_xs, _ys) ); + if (dm) _tft->pushImage(tx + ds, ty, dm, 1, _img4 + yp, false, _colorMap ); + if (de) _tft->drawPixel(tx + sw, ty, readPixel(_xe, _ys) ); + _ys++; + ty++; + yp += (_iwidth>>1); + } + _tft->endWrite(); + } + } + else // 1bpp + { + // Check if a faster block copy to screen is possible + if ( sx == 0 && sw == _dwidth) + _tft->pushImage(tx, ty, sw, sh, _img8 + (_bitwidth>>3) * _ys, (bool)false ); + else // Render line by line + { + _tft->startWrite(); + while (sh--) + { + _tft->pushImage(tx, ty++, sw, 1, _img8 + (_bitwidth>>3) * _ys++, (bool)false ); + } + _tft->endWrite(); + } + } + + return true; +} + + +/*************************************************************************************** +** Function name: readPixelValue +** Description: Read the color map index of a pixel at defined coordinates +***************************************************************************************/ +uint16_t TFT_eSprite::readPixelValue(int32_t x, int32_t y) +{ + if (_vpOoB || !_created) return 0xFF; + + x+= _xDatum; + y+= _yDatum; + + // Range checking + if ((x < _vpX) || (y < _vpY) ||(x >= _vpW) || (y >= _vpH)) return 0xFF; + + if (_bpp == 16) + { + // Return the pixel colour + return readPixel(x - _xDatum, y - _yDatum); + } + + if (_bpp == 8) + { + // Return the pixel byte value + return _img8[x + y * _iwidth]; + } + + if (_bpp == 4) + { + if (x >= _dwidth) return 0xFF; + if ((x & 0x01) == 0) + return _img4[((x+y*_iwidth)>>1)] >> 4; // even index = bits 7 .. 4 + else + return _img4[((x+y*_iwidth)>>1)] & 0x0F; // odd index = bits 3 .. 0. + } + + if (_bpp == 1) + { + // Note: _dwidth and _dheight bounds not checked (rounded up -iwidth and _iheight used) + if (rotation == 1) + { + uint16_t tx = x; + x = _dheight - y - 1; + y = tx; + } + else if (rotation == 2) + { + x = _dwidth - x - 1; + y = _dheight - y - 1; + } + else if (rotation == 3) + { + uint16_t tx = x; + x = y; + y = _dwidth - tx - 1; + } + // Return 1 or 0 + return (_img8[(x + y * _bitwidth)>>3] >> (7-(x & 0x7))) & 0x01; + } + + return 0; +} + +/*************************************************************************************** +** Function name: readPixel +** Description: Read 565 colour of a pixel at defined coordinates +***************************************************************************************/ +uint16_t TFT_eSprite::readPixel(int32_t x, int32_t y) +{ + if (_vpOoB || !_created) return 0xFFFF; + + x+= _xDatum; + y+= _yDatum; + + // Range checking + if ((x < _vpX) || (y < _vpY) ||(x >= _vpW) || (y >= _vpH)) return 0xFFFF; + + if (_bpp == 16) + { + uint16_t color = _img[x + y * _iwidth]; + return (color >> 8) | (color << 8); + } + + if (_bpp == 8) + { + uint16_t color = _img8[x + y * _iwidth]; + if (color != 0) + { + uint8_t blue[] = {0, 11, 21, 31}; + color = (color & 0xE0)<<8 | (color & 0xC0)<<5 + | (color & 0x1C)<<6 | (color & 0x1C)<<3 + | blue[color & 0x03]; + } + return color; + } + + if (_bpp == 4) + { + if (x >= _dwidth) return 0xFFFF; + uint16_t color; + if ((x & 0x01) == 0) + color = _colorMap[_img4[((x+y*_iwidth)>>1)] >> 4]; // even index = bits 7 .. 4 + else + color = _colorMap[_img4[((x+y*_iwidth)>>1)] & 0x0F]; // odd index = bits 3 .. 0. + return color; + } + + // Note: Must be 1bpp + // _dwidth and _dheight bounds not checked (rounded up -iwidth and _iheight used) + if (rotation == 1) + { + uint16_t tx = x; + x = _dheight - y - 1; + y = tx; + } + else if (rotation == 2) + { + x = _dwidth - x - 1; + y = _dheight - y - 1; + } + else if (rotation == 3) + { + uint16_t tx = x; + x = y; + y = _dwidth - tx - 1; + } + + uint16_t color = (_img8[(x + y * _bitwidth)>>3] << (x & 0x7)) & 0x80; + + if (color) return _tft->bitmap_fg; + else return _tft->bitmap_bg; +} + + +/*************************************************************************************** +** Function name: pushImage +** Description: push image into a defined area of a sprite +***************************************************************************************/ +void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp) +{ + if (data == nullptr || !_created) return; + + PI_CLIP; + + if (_bpp == 16) // Plot a 16 bpp image into a 16 bpp Sprite + { + // Pointer within original image + uint8_t *ptro = (uint8_t *)data + ((dx + dy * w) << 1); + // Pointer within sprite image + uint8_t *ptrs = (uint8_t *)_img + ((x + y * _iwidth) << 1); + + if(_swapBytes) + { + while (dh--) + { + // Fast copy with a 1 byte shift + memcpy(ptrs+1, ptro, (dw<<1) - 1); + // Now correct just the even numbered bytes + for (int32_t xp = 0; xp < (dw<<1); xp+=2) + { + ptrs[xp] = ptro[xp+1];; + } + ptro += w<<1; + ptrs += _iwidth<<1; + } + } + else + { + while (dh--) + { + memcpy(ptrs, ptro, dw<<1); + ptro += w << 1; + ptrs += _iwidth << 1; + } + } + } + else if (_bpp == 8 && sbpp == 8) // Plot a 8 bpp image into a 8 bpp Sprite + { + // Pointer within original image + uint8_t *ptro = (uint8_t *)data + (dx + dy * w); + // Pointer within sprite image + uint8_t *ptrs = (uint8_t *)_img + (x + y * _iwidth); + + while (dh--) + { + memcpy(ptrs, ptro, dw); + ptro += w; + ptrs += _iwidth; + } + } + else if (_bpp == 8) // Plot a 16 bpp image into a 8 bpp Sprite + { + uint16_t lastColor = 0; + uint8_t color8 = 0; + for (int32_t yp = dy; yp < dy + dh; yp++) + { + int32_t xyw = x + y * _iwidth; + int32_t dxypw = dx + yp * w; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t color = data[dxypw++]; + if (color != lastColor) { + // When data source is a sprite, the bytes are already swapped + if(!_swapBytes) color8 = (uint8_t)((color & 0xE0) | (color & 0x07)<<2 | (color & 0x1800)>>11); + else color8 = (uint8_t)((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); + } + lastColor = color; + _img8[xyw++] = color8; + } + y++; + } + } + else if (_bpp == 4) + { + // The image is assumed to be 4-bit, where each byte corresponds to two pixels. + // much faster when aligned to a byte boundary, because the alternative is slower, requiring + // tedious bit operations. + + int sWidth = (_iwidth >> 1); + uint8_t *ptr = (uint8_t *)data; + + if ((x & 0x01) == 0 && (dx & 0x01) == 0 && (dw & 0x01) == 0) + { + x = (x >> 1) + y * sWidth; + dw = (dw >> 1); + dx = (dx >> 1) + dy * (w>>1); + while (dh--) + { + memcpy(_img4 + x, ptr + dx, dw); + dx += (w >> 1); + x += sWidth; + } + } + else // not optimized + { + for (int32_t yp = dy; yp < dy + dh; yp++) + { + int32_t ox = x; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint32_t color; + if ((xp & 0x01) == 0) + color = (ptr[((xp+yp*w)>>1)] & 0xF0) >> 4; // even index = bits 7 .. 4 + else + color = ptr[((xp-1+yp*w)>>1)] & 0x0F; // odd index = bits 3 .. 0. + drawPixel(ox, y, color); + ox++; + } + y++; + } + } + } + + else // 1bpp + { + // Plot a 1bpp image into a 1bpp Sprite + uint32_t ww = (w+7)>>3; // Width of source image line in bytes + uint8_t *ptr = (uint8_t *)data; + for (int32_t yp = dy; yp < dy + dh; yp++) + { + uint32_t yw = yp * ww; // Byte starting the line containing source pixel + int32_t ox = x; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t readPixel = (ptr[(xp>>3) + yw] & (0x80 >> (xp & 0x7)) ); + drawPixel(ox++, y, readPixel); + } + y++; + } + } +} + + +/*************************************************************************************** +** Function name: pushImage +** Description: push 565 colour FLASH (PROGMEM) image into a defined area +***************************************************************************************/ +void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data) +{ +#ifdef ESP32 + pushImage(x, y, w, h, (uint16_t*) data); +#else + // Partitioned memory FLASH processor + if (data == nullptr || !_created) return; + + PI_CLIP; + + if (_bpp == 16) // Plot a 16 bpp image into a 16 bpp Sprite + { + for (int32_t yp = dy; yp < dy + dh; yp++) + { + int32_t ox = x; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t color = pgm_read_word(data + xp + yp * w); + if(_swapBytes) color = color<<8 | color>>8; + _img[ox + y * _iwidth] = color; + ox++; + } + y++; + } + } + + else if (_bpp == 8) // Plot a 16 bpp image into a 8 bpp Sprite + { + for (int32_t yp = dy; yp < dy + dh; yp++) + { + int32_t ox = x; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t color = pgm_read_word(data + xp + yp * w); + if(_swapBytes) color = color<<8 | color>>8; + _img8[ox + y * _iwidth] = (uint8_t)((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); + ox++; + } + y++; + } + } + + else if (_bpp == 4) + { + #ifdef TFT_eSPI_DEBUG + Serial.println("TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data) not implemented"); + #endif + return; + } + + else // Plot a 1bpp image into a 1bpp Sprite + { + x-= _xDatum; // Remove offsets, drawPixel will add + y-= _yDatum; + uint16_t bsw = (w+7) >> 3; // Width in bytes of source image line + uint8_t *ptr = ((uint8_t*)data) + dy * bsw; + + while (dh--) { + int32_t odx = dx; + int32_t ox = x; + while (odx < dx + dw) { + uint8_t pbyte = pgm_read_byte(ptr + (odx>>3)); + uint8_t mask = 0x80 >> (odx & 7); + while (mask) { + uint8_t p = pbyte & mask; + mask = mask >> 1; + drawPixel(ox++, y, p); + odx++; + } + } + ptr += bsw; + y++; + } + } +#endif // if ESP32 check +} + + +/*************************************************************************************** +** Function name: setWindow +** Description: Set the bounds of a window in the sprite +***************************************************************************************/ +// Intentionally not constrained to viewport area, does not manage 1bpp rotations +void TFT_eSprite::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) +{ + if (x0 > x1) transpose(x0, x1); + if (y0 > y1) transpose(y0, y1); + + int32_t w = width(); + int32_t h = height(); + + if ((x0 >= w) || (x1 < 0) || (y0 >= h) || (y1 < 0)) + { // Point to that extra "off screen" pixel + _xs = 0; + _ys = _dheight; + _xe = 0; + _ye = _dheight; + } + else + { + if (x0 < 0) x0 = 0; + if (x1 >= w) x1 = w - 1; + if (y0 < 0) y0 = 0; + if (y1 >= h) y1 = h - 1; + + _xs = x0; + _ys = y0; + _xe = x1; + _ye = y1; + } + + _xptr = _xs; + _yptr = _ys; +} + + +/*************************************************************************************** +** Function name: pushColor +** Description: Send a new pixel to the set window +***************************************************************************************/ +void TFT_eSprite::pushColor(uint16_t color) +{ + if (!_created ) return; + + // Write the colour to RAM in set window + if (_bpp == 16) + _img [_xptr + _yptr * _iwidth] = (uint16_t) (color >> 8) | (color << 8); + + else if (_bpp == 8) + _img8[_xptr + _yptr * _iwidth] = (uint8_t )((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); + + else if (_bpp == 4) + { + uint8_t c = (uint8_t)color & 0x0F; + if ((_xptr & 0x01) == 0) { + _img4[(_xptr + _yptr * _iwidth)>>1] = (c << 4) | (_img4[(_xptr + _yptr * _iwidth)>>1] & 0x0F); // new color is in bits 7 .. 4 + } + else { + _img4[(_xptr + _yptr * _iwidth)>>1] = (_img4[(_xptr + _yptr * _iwidth)>>1] & 0xF0) | c; // new color is the low bits + } + } + + else drawPixel(_xptr, _yptr, color); + + // Increment x + _xptr++; + + // Wrap on x and y to start, increment y if needed + if (_xptr > _xe) + { + _xptr = _xs; + _yptr++; + if (_yptr > _ye) _yptr = _ys; + } + +} + + +/*************************************************************************************** +** Function name: pushColor +** Description: Send a "len" new pixels to the set window +***************************************************************************************/ +void TFT_eSprite::pushColor(uint16_t color, uint32_t len) +{ + if (!_created ) return; + + uint16_t pixelColor; + + if (_bpp == 16) + pixelColor = (uint16_t) (color >> 8) | (color << 8); + + else if (_bpp == 8) + pixelColor = (color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3; + + else pixelColor = (uint16_t) color; // for 1bpp or 4bpp + + while(len--) writeColor(pixelColor); +} + + +/*************************************************************************************** +** Function name: writeColor +** Description: Write a pixel with pre-formatted colour to the set window +***************************************************************************************/ +void TFT_eSprite::writeColor(uint16_t color) +{ + if (!_created ) return; + + // Write 16-bit RGB 565 encoded colour to RAM + if (_bpp == 16) _img [_xptr + _yptr * _iwidth] = color; + + // Write 8-bit RGB 332 encoded colour to RAM + else if (_bpp == 8) _img8[_xptr + _yptr * _iwidth] = (uint8_t) color; + + else if (_bpp == 4) + { + uint8_t c = (uint8_t)color & 0x0F; + if ((_xptr & 0x01) == 0) + _img4[(_xptr + _yptr * _iwidth)>>1] = (c << 4) | (_img4[(_xptr + _yptr * _iwidth)>>1] & 0x0F); // new color is in bits 7 .. 4 + else + _img4[(_xptr + _yptr * _iwidth)>>1] = (_img4[(_xptr + _yptr * _iwidth)>>1] & 0xF0) | c; // new color is the low bits (x is odd) + } + + else drawPixel(_xptr, _yptr, color); + + // Increment x + _xptr++; + + // Wrap on x and y to start, increment y if needed + if (_xptr > _xe) + { + _xptr = _xs; + _yptr++; + if (_yptr > _ye) _yptr = _ys; + } +} + + +/*************************************************************************************** +** Function name: setScrollRect +** Description: Set scroll area within the sprite and the gap fill colour +***************************************************************************************/ +// Intentionally not constrained to viewport area +void TFT_eSprite::setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color) +{ + if ((x >= _iwidth) || (y >= _iheight) || !_created ) return; + + if (x < 0) { w += x; x = 0; } + if (y < 0) { h += y; y = 0; } + + if ((x + w) > _iwidth ) w = _iwidth - x; + if ((y + h) > _iheight) h = _iheight - y; + + if ( w < 1 || h < 1) return; + + _sx = x; + _sy = y; + _sw = w; + _sh = h; + + _scolor = color; +} + + +/*************************************************************************************** +** Function name: scroll +** Description: Scroll dx,dy pixels, positive right,down, negative left,up +***************************************************************************************/ +void TFT_eSprite::scroll(int16_t dx, int16_t dy) +{ + if (abs(dx) >= _sw || abs(dy) >= _sh) + { + fillRect (_sx, _sy, _sw, _sh, _scolor); + return; + } + + // Fetch the scroll area width and height set by setScrollRect() + uint32_t w = _sw - abs(dx); // line width to copy + uint32_t h = _sh - abs(dy); // lines to copy + int32_t iw = _iwidth; // rounded up width of sprite + + // Fetch the x,y origin set by setScrollRect() + uint32_t tx = _sx; // to x + uint32_t fx = _sx; // from x + uint32_t ty = _sy; // to y + uint32_t fy = _sy; // from y + + // Adjust for x delta + if (dx <= 0) fx -= dx; + else tx += dx; + + // Adjust for y delta + if (dy <= 0) fy -= dy; + else + { // Scrolling down so start copy from bottom + ty = ty + _sh - 1; // "To" pointer + iw = -iw; // Pointer moves backwards + fy = ty - dy; // "From" pointer + } + + // Calculate "from y" and "to y" pointers in RAM + uint32_t fyp = fx + fy * _iwidth; + uint32_t typ = tx + ty * _iwidth; + + // Now move the pixels in RAM + if (_bpp == 16) + { + while (h--) + { // move pixel lines (to, from, byte count) + memmove( _img + typ, _img + fyp, w<<1); + typ += iw; + fyp += iw; + } + } + else if (_bpp == 8) + { + while (h--) + { // move pixel lines (to, from, byte count) + memmove( _img8 + typ, _img8 + fyp, w); + typ += iw; + fyp += iw; + } + } + else if (_bpp == 4) + { + // could optimize for scrolling by even # pixels using memove (later) + if (dx > 0) { tx += w; fx += w; } // Start from right edge + while (h--) + { // move pixels one by one + for (uint16_t xp = 0; xp < w; xp++) + { + if (dx <= 0) drawPixel(tx + xp, ty, readPixelValue(fx + xp, fy)); + if (dx > 0) drawPixel(tx - xp, ty, readPixelValue(fx - xp, fy)); + } + if (dy <= 0) { ty++; fy++; } + else { ty--; fy--; } + } + } + else if (_bpp == 1 ) + { + if (dx > 0) { tx += w; fx += w; } // Start from right edge + while (h--) + { // move pixels one by one + for (uint16_t xp = 0; xp < w; xp++) + { + if (dx <= 0) drawPixel(tx + xp, ty, readPixelValue(fx + xp, fy)); + if (dx > 0) drawPixel(tx - xp, ty, readPixelValue(fx - xp, fy)); + } + if (dy <= 0) { ty++; fy++; } + else { ty--; fy--; } + } + } + else return; // Not 1, 4, 8 or 16 bpp + + // Fill the gap left by the scrolling + if (dx > 0) fillRect(_sx, _sy, dx, _sh, _scolor); + if (dx < 0) fillRect(_sx + _sw + dx, _sy, -dx, _sh, _scolor); + if (dy > 0) fillRect(_sx, _sy, _sw, dy, _scolor); + if (dy < 0) fillRect(_sx, _sy + _sh + dy, _sw, -dy, _scolor); +} + + +/*************************************************************************************** +** Function name: fillSprite +** Description: Fill the whole sprite with defined colour +***************************************************************************************/ +void TFT_eSprite::fillSprite(uint32_t color) +{ + if (!_created || _vpOoB) return; + + // Use memset if possible as it is super fast + if(_xDatum == 0 && _yDatum == 0 && _xWidth == width()) + { + if(_bpp == 16) { + if ( (uint8_t)color == (uint8_t)(color>>8) ) { + memset(_img, (uint8_t)color, _iwidth * _yHeight * 2); + } + else fillRect(_vpX, _vpY, _xWidth, _yHeight, color); + } + else if (_bpp == 8) + { + color = (color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3; + memset(_img8, (uint8_t)color, _iwidth * _yHeight); + } + else if (_bpp == 4) + { + uint8_t c = ((color & 0x0F) | (((color & 0x0F) << 4) & 0xF0)); + memset(_img4, c, (_iwidth * _yHeight) >> 1); + } + else if (_bpp == 1) + { + if(color) memset(_img8, 0xFF, (_bitwidth>>3) * _dheight + 1); + else memset(_img8, 0x00, (_bitwidth>>3) * _dheight + 1); + } + } + else fillRect(_vpX - _xDatum, _vpY - _yDatum, _xWidth, _yHeight, color); +} + + +/*************************************************************************************** +** Function name: width +** Description: Return the width of sprite +***************************************************************************************/ +// Return the size of the sprite +int16_t TFT_eSprite::width(void) +{ + if (!_created ) return 0; + + if (_bpp > 1) { + if (_vpDatum) return _xWidth; + return _dwidth; + } + + if (rotation & 1) { + if (_vpDatum) return _xWidth; + return _dheight; + } + + if (_vpDatum) return _xWidth; + return _dwidth; +} + + +/*************************************************************************************** +** Function name: height +** Description: Return the height of sprite +***************************************************************************************/ +int16_t TFT_eSprite::height(void) +{ + if (!_created ) return 0; + + if (_bpp > 1) { + if (_vpDatum) return _yHeight; + return _dheight; + } + + if (rotation & 1) { + if (_vpDatum) return _yHeight; + return _dwidth; + } + + if (_vpDatum) return _yHeight; + return _dheight; +} + + +/*************************************************************************************** +** Function name: setRotation +** Description: Rotate coordinate frame for 1bpp sprite +***************************************************************************************/ +// Does nothing for 4, 8 and 16 bpp sprites. +void TFT_eSprite::setRotation(uint8_t r) +{ + if (_bpp != 1) return; + + rotation = r; + + if (rotation&1) { + resetViewport(); + } + else { + resetViewport(); + } +} + + +/*************************************************************************************** +** Function name: getRotation +** Description: Get rotation for 1bpp sprite +***************************************************************************************/ +uint8_t TFT_eSprite::getRotation(void) +{ + return rotation; +} + + +/*************************************************************************************** +** Function name: drawPixel +** Description: push a single pixel at an arbitrary position +***************************************************************************************/ +void TFT_eSprite::drawPixel(int32_t x, int32_t y, uint32_t color) +{ + if (!_created || _vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Range checking + if ((x < _vpX) || (y < _vpY) ||(x >= _vpW) || (y >= _vpH)) return; + + if (_bpp == 16) + { + color = (color >> 8) | (color << 8); + _img[x+y*_iwidth] = (uint16_t) color; + } + else if (_bpp == 8) + { + _img8[x+y*_iwidth] = (uint8_t)((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); + } + else if (_bpp == 4) + { + uint8_t c = color & 0x0F; + int index = (x+y*_iwidth)>>1;; + if ((x & 0x01) == 0) { + _img4[index] = (uint8_t)((c << 4) | (_img4[index] & 0x0F)); + } + else { + _img4[index] = (uint8_t)(c | (_img4[index] & 0xF0)); + } + } + else // 1 bpp + { + if (rotation == 1) + { + uint16_t tx = x; + x = _dwidth - y - 1; + y = tx; + } + else if (rotation == 2) + { + x = _dwidth - x - 1; + y = _dheight - y - 1; + } + else if (rotation == 3) + { + uint16_t tx = x; + x = y; + y = _dheight - tx - 1; + } + + if (color) _img8[(x + y * _bitwidth)>>3] |= (0x80 >> (x & 0x7)); + else _img8[(x + y * _bitwidth)>>3] &= ~(0x80 >> (x & 0x7)); + } +} + + +/*************************************************************************************** +** Function name: drawLine +** Description: draw a line between 2 arbitrary points +***************************************************************************************/ +void TFT_eSprite::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) +{ + if (!_created || _vpOoB) return; + + //_xDatum and _yDatum Not added here, it is added by drawPixel & drawFastxLine + + bool steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + transpose(x0, y0); + transpose(x1, y1); + } + + if (x0 > x1) { + transpose(x0, x1); + transpose(y0, y1); + } + + int32_t dx = x1 - x0, dy = abs(y1 - y0);; + + int32_t err = dx >> 1, ystep = -1, xs = x0, dlen = 0; + + if (y0 < y1) ystep = 1; + + // Split into steep and not steep for FastH/V separation + if (steep) { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + err += dx; + if (dlen == 1) drawPixel(y0, xs, color); + else drawFastVLine(y0, xs, dlen, color); + dlen = 0; y0 += ystep; xs = x0 + 1; + } + } + if (dlen) drawFastVLine(y0, xs, dlen, color); + } + else + { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + err += dx; + if (dlen == 1) drawPixel(xs, y0, color); + else drawFastHLine(xs, y0, dlen, color); + dlen = 0; y0 += ystep; xs = x0 + 1; + } + } + if (dlen) drawFastHLine(xs, y0, dlen, color); + } +} + + +/*************************************************************************************** +** Function name: drawFastVLine +** Description: draw a vertical line +***************************************************************************************/ +void TFT_eSprite::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) +{ + if (!_created || _vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x < _vpX) || (x >= _vpW) || (y >= _vpH)) return; + + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((y + h) > _vpH) h = _vpH - y; + + if (h < 1) return; + + if (_bpp == 16) + { + color = (color >> 8) | (color << 8); + int32_t yp = x + _iwidth * y; + while (h--) {_img[yp] = (uint16_t) color; yp += _iwidth;} + } + else if (_bpp == 8) + { + color = (color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3; + while (h--) _img8[x + _iwidth * y++] = (uint8_t) color; + } + else if (_bpp == 4) + { + if ((x & 0x01) == 0) + { + uint8_t c = (uint8_t) (color & 0xF) << 4; + while (h--) { + _img4[(x + _iwidth * y)>>1] = (uint8_t) (c | (_img4[(x + _iwidth * y)>>1] & 0x0F)); + y++; + } + } + else { + uint8_t c = (uint8_t)color & 0xF; + while (h--) { + _img4[(x + _iwidth * y)>>1] = (uint8_t) (c | (_img4[(x + _iwidth * y)>>1] & 0xF0)); // x is odd; new color goes into the low bits. + y++; + } + } + } + else + { + x -= _xDatum; // Remove any offset as it will be added by drawPixel + y -= _yDatum; + while (h--) + { + drawPixel(x, y++, color); + } + } +} + + +/*************************************************************************************** +** Function name: drawFastHLine +** Description: draw a horizontal line +***************************************************************************************/ +void TFT_eSprite::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) +{ + if (!_created || _vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((y < _vpY) || (x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + + if ((x + w) > _vpW) w = _vpW - x; + + if (w < 1) return; + + if (_bpp == 16) + { + color = (color >> 8) | (color << 8); + while (w--) _img[_iwidth * y + x++] = (uint16_t) color; + } + else if (_bpp == 8) + { + color = (color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3; + memset(_img8+_iwidth * y + x, (uint8_t)color, w); + } + else if (_bpp == 4) + { + uint8_t c = (uint8_t)color & 0x0F; + uint8_t c2 = (c | ((c << 4) & 0xF0)); + if ((x & 0x01) == 1) + { + drawPixel(x - _xDatum, y - _yDatum, color); + x++; w--; + if (w < 1) + return; + } + + if (((w + x) & 0x01) == 1) + { + // handle the extra one at the other end + drawPixel(x - _xDatum + w - 1, y - _yDatum, color); + w--; + if (w < 1) return; + } + memset(_img4 + ((_iwidth * y + x) >> 1), c2, (w >> 1)); + } + else { + x -= _xDatum; // Remove any offset as it will be added by drawPixel + y -= _yDatum; + + while (w--) + { + drawPixel(x++, y, color); + } + } +} + + +/*************************************************************************************** +** Function name: fillRect +** Description: draw a filled rectangle +***************************************************************************************/ +void TFT_eSprite::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) +{ + if (!_created || _vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((x + w) > _vpW) w = _vpW - x; + if ((y + h) > _vpH) h = _vpH - y; + + if ((w < 1) || (h < 1)) return; + + int32_t yp = _iwidth * y + x; + + if (_bpp == 16) + { + color = (color >> 8) | (color << 8); + uint32_t iw = w; + int32_t ys = yp; + if(h--) {while (iw--) _img[yp++] = (uint16_t) color;} + yp = ys; + while (h--) + { + yp += _iwidth; + memcpy( _img+yp, _img+ys, w<<1); + } + } + else if (_bpp == 8) + { + color = (color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3; + while (h--) + { + memset(_img8 + yp, (uint8_t)color, w); + yp += _iwidth; + } + } + else if (_bpp == 4) + { + uint8_t c1 = (uint8_t)color & 0x0F; + uint8_t c2 = c1 | ((c1 << 4) & 0xF0); + if ((x & 0x01) == 0 && (w & 0x01) == 0) + { + yp = (yp >> 1); + while (h--) + { + memset(_img4 + yp, c2, (w>>1)); + yp += (_iwidth >> 1); + } + } + else if ((x & 0x01) == 0) + { + + // same as above but you have a hangover on the right. + yp = (yp >> 1); + while (h--) + { + if (w > 1) + memset(_img4 + yp, c2, (w-1)>>1); + // handle the rightmost pixel by calling drawPixel + drawPixel(x+w-1-_xDatum, y+h-_yDatum, c1); + yp += (_iwidth >> 1); + } + } + else if ((w & 0x01) == 1) + { + yp = (yp + 1) >> 1; + while (h--) { + drawPixel(x-_xDatum, y+h-_yDatum, color & 0x0F); + if (w > 1) + memset(_img4 + yp, c2, (w-1)>>1); + // same as above but you have a hangover on the left instead + yp += (_iwidth >> 1); + } + } + else + { + yp = (yp + 1) >> 1; + while (h--) { + drawPixel(x-_xDatum, y+h-_yDatum, color & 0x0F); + if (w > 1) drawPixel(x+w-1-_xDatum, y+h-_yDatum, color & 0x0F); + if (w > 2) + memset(_img4 + yp, c2, (w-2)>>1); + // maximal hacking, single pixels on left and right. + yp += (_iwidth >> 1); + } + } + } + else + { + x -= _xDatum; + y -= _yDatum; + while (h--) + { + int32_t ww = w; + int32_t xx = x; + while (ww--) drawPixel(xx++, y, color); + y++; + } + } +} + + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a single character in the Adafruit GLCD or freefont +***************************************************************************************/ +void TFT_eSprite::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size) +{ + if ( _vpOoB || !_created ) return; + + if (c < 32) return; +#ifdef LOAD_GLCD +//>>>>>>>>>>>>>>>>>> +#ifdef LOAD_GFXFF + if(!gfxFont) { // 'Classic' built-in font +#endif +//>>>>>>>>>>>>>>>>>> + + if ((x >= _vpW - _xDatum) || // Clip right + (y >= _vpH - _yDatum)) // Clip bottom + return; + + if (((x + 6 * size - 1) < (_vpX - _xDatum)) || // Clip left + ((y + 8 * size - 1) < (_vpY - _yDatum))) // Clip top + return; + + if (c > 255) return; + if (!_cp437 && c > 175) c++; + + bool fillbg = (bg != color); + + if ((size==1) && fillbg) + { + uint8_t column[6]; + uint8_t mask = 0x1; + + for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(font + (c * 5) + i); + column[5] = 0; + + int8_t j, k; + for (j = 0; j < 8; j++) { + for (k = 0; k < 5; k++ ) { + if (column[k] & mask) { + drawPixel(x + k, y + j, color); + } + else { + drawPixel(x + k, y + j, bg); + } + } + + mask <<= 1; + + drawPixel(x + k, y + j, bg); + } + } + else + { + for (int8_t i = 0; i < 6; i++ ) { + uint8_t line; + if (i == 5) + line = 0x0; + else + line = pgm_read_byte(font + (c * 5) + i); + + if (size == 1) // default size + { + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) drawPixel(x + i, y + j, color); + line >>= 1; + } + } + else { // big size + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) fillRect(x + (i * size), y + (j * size), size, size, color); + else if (fillbg) fillRect(x + i * size, y + j * size, size, size, bg); + line >>= 1; + } + } + } + } + +//>>>>>>>>>>>>>>>>>>>>>>>>>>> +#ifdef LOAD_GFXFF + } else { // Custom font +#endif +//>>>>>>>>>>>>>>>>>>>>>>>>>>> +#endif // LOAD_GLCD + +#ifdef LOAD_GFXFF + // Filter out bad characters not present in font + if ((c >= pgm_read_word(&gfxFont->first)) && (c <= pgm_read_word(&gfxFont->last ))) + { +//>>>>>>>>>>>>>>>>>>>>>>>>>>> + + c -= pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c]); + + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + + if (((x + xo + w * size - 1) < (_vpX - _xDatum)) || // Clip left + ((y + yo + h * size - 1) < (_vpY - _yDatum))) // Clip top + return; + + uint8_t *bitmap = (uint8_t *)pgm_read_dword(&gfxFont->bitmap); + uint32_t bo = pgm_read_word(&glyph->bitmapOffset); + + uint8_t xx, yy, bits=0, bit=0; + //uint8_t xa = pgm_read_byte(&glyph->xAdvance); + int16_t xo16 = 0, yo16 = 0; + + if(size > 1) { + xo16 = xo; + yo16 = yo; + } + + uint16_t hpc = 0; // Horizontal foreground pixel count + for(yy=0; yy>= 1; + } + // Draw pixels for this line as we are about to increment yy + if (hpc) { + if(size == 1) drawFastHLine(x+xo+xx-hpc, y+yo+yy, hpc, color); + else fillRect(x+(xo16+xx-hpc)*size, y+(yo16+yy)*size, size*hpc, size, color); + hpc=0; + } + } + } +#endif + + +#ifdef LOAD_GLCD + #ifdef LOAD_GFXFF + } // End classic vs custom font + #endif +#else + #ifndef LOAD_GFXFF + color = color; + bg = bg; + size = size; + #endif +#endif + +} + + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a Unicode glyph into the sprite +***************************************************************************************/ + // TODO: Rationalise with TFT_eSPI + // Any UTF-8 decoding must be done before calling drawChar() +int16_t TFT_eSprite::drawChar(uint16_t uniCode, int32_t x, int32_t y) +{ + return drawChar(uniCode, x, y, textfont); +} + + // Any UTF-8 decoding must be done before calling drawChar() +int16_t TFT_eSprite::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) +{ + if (_vpOoB || !uniCode) return 0; + + if (font==1) { +#ifdef LOAD_GLCD + #ifndef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + return 6 * textsize; + #endif +#else + #ifndef LOAD_GFXFF + return 0; + #endif +#endif + +#ifdef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + if(!gfxFont) { // 'Classic' built-in font + #ifdef LOAD_GLCD + return 6 * textsize; + #else + return 0; + #endif + } + else { + if((uniCode >= pgm_read_word(&gfxFont->first)) && (uniCode <= pgm_read_word(&gfxFont->last) )) { + uint16_t c2 = uniCode - pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + return pgm_read_byte(&glyph->xAdvance) * textsize; + } + else { + return 0; + } + } +#endif + } + + if ((font>1) && (font<9) && ((uniCode < 32) || (uniCode > 127))) return 0; + + int32_t width = 0; + int32_t height = 0; + uint32_t flash_address = 0; + uniCode -= 32; + +#ifdef LOAD_FONT2 + if (font == 2) { + flash_address = pgm_read_dword(&chrtbl_f16[uniCode]); + width = pgm_read_byte(widtbl_f16 + uniCode); + height = chr_hgt_f16; + } + #ifdef LOAD_RLE + else + #endif +#endif + +#ifdef LOAD_RLE + { + if ((font>2) && (font<9)) { + flash_address = pgm_read_dword( (const void*)(pgm_read_dword( &(fontdata[font].chartbl ) ) + uniCode*sizeof(void *)) ); + width = pgm_read_byte( (uint8_t *)pgm_read_dword( &(fontdata[font].widthtbl ) ) + uniCode ); + height= pgm_read_byte( &fontdata[font].height ); + } + } +#endif + + int32_t xd = x + _xDatum; + int32_t yd = y + _yDatum; + + if ((xd + width * textsize < _vpX || xd >= _vpW) && (yd + height * textsize < _vpY || yd >= _vpH)) return width * textsize ; + + int32_t w = width; + int32_t pX = 0; + int32_t pY = y; + uint8_t line = 0; + bool clip = xd < _vpX || xd + width * textsize >= _vpW || yd < _vpY || yd + height * textsize >= _vpH; + +#ifdef LOAD_FONT2 // chop out code if we do not need it + if (font == 2) { + w = w + 6; // Should be + 7 but we need to compensate for width increment + w = w / 8; + + for (int32_t i = 0; i < height; i++) + { + if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize, textbgcolor); + + for (int32_t k = 0; k < w; k++) + { + line = pgm_read_byte((uint8_t *)flash_address + w * i + k); + if (line) { + if (textsize == 1) { + pX = x + k * 8; + if (line & 0x80) drawPixel(pX, pY, textcolor); + if (line & 0x40) drawPixel(pX + 1, pY, textcolor); + if (line & 0x20) drawPixel(pX + 2, pY, textcolor); + if (line & 0x10) drawPixel(pX + 3, pY, textcolor); + if (line & 0x08) drawPixel(pX + 4, pY, textcolor); + if (line & 0x04) drawPixel(pX + 5, pY, textcolor); + if (line & 0x02) drawPixel(pX + 6, pY, textcolor); + if (line & 0x01) drawPixel(pX + 7, pY, textcolor); + } + else { + pX = x + k * 8 * textsize; + if (line & 0x80) fillRect(pX, pY, textsize, textsize, textcolor); + if (line & 0x40) fillRect(pX + textsize, pY, textsize, textsize, textcolor); + if (line & 0x20) fillRect(pX + 2 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x10) fillRect(pX + 3 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x08) fillRect(pX + 4 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x04) fillRect(pX + 5 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x02) fillRect(pX + 6 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x01) fillRect(pX + 7 * textsize, pY, textsize, textsize, textcolor); + } + } + } + pY += textsize; + } + } + + #ifdef LOAD_RLE + else + #endif +#endif //FONT2 + +#ifdef LOAD_RLE //674 bytes of code + // Font is not 2 and hence is RLE encoded + { + w *= height; // Now w is total number of pixels in the character + int16_t color = textcolor; + if (_bpp == 16) color = (textcolor >> 8) | (textcolor << 8); + else if (_bpp == 8) color = ((textcolor & 0xE000)>>8 | (textcolor & 0x0700)>>6 | (textcolor & 0x0018)>>3); + + int16_t bgcolor = textbgcolor; + if (_bpp == 16) bgcolor = (textbgcolor >> 8) | (textbgcolor << 8); + else if (_bpp == 8) bgcolor = ((textbgcolor & 0xE000)>>8 | (textbgcolor & 0x0700)>>6 | (textbgcolor & 0x0018)>>3); + + if (textcolor == textbgcolor && !clip && _bpp != 1) { + int32_t px = 0, py = pY; // To hold character block start and end column and row values + int32_t pc = 0; // Pixel count + uint8_t np = textsize * textsize; // Number of pixels in a drawn pixel + + uint8_t tnp = 0; // Temporary copy of np for while loop + uint8_t ts = textsize - 1; // Temporary copy of textsize + // 16-bit pixel count so maximum font size is equivalent to 180x180 pixels in area + // w is total number of pixels to plot to fill character block + while (pc < w) { + line = pgm_read_byte((uint8_t *)flash_address); + flash_address++; + if (line & 0x80) { + line &= 0x7F; + line++; + if (ts) { + px = xd + textsize * (pc % width); // Keep these px and py calculations outside the loop as they are slow + py = yd + textsize * (pc / width); + } + else { + px = xd + pc % width; // Keep these px and py calculations outside the loop as they are slow + py = yd + pc / width; + } + while (line--) { // In this case the while(line--) is faster + pc++; // This is faster than putting pc+=line before while()? + setWindow(px, py, px + ts, py + ts); + + if (ts) { + tnp = np; + while (tnp--) writeColor(color); + } + else writeColor(color); + + px += textsize; + + if (px >= (xd + width * textsize)) { + px = xd; + py += textsize; + } + } + } + else { + line++; + pc += line; + } + } + } + else { + // Text colour != background and textsize = 1 and character is within viewport area + // so use faster drawing of characters and background using block write + if (textcolor != textbgcolor && textsize == 1 && !clip && _bpp != 1) + { + setWindow(xd, yd, xd + width - 1, yd + height - 1); + + // Maximum font size is equivalent to 180x180 pixels in area + while (w > 0) { + line = pgm_read_byte((uint8_t *)flash_address++); // 8 bytes smaller when incrementing here + if (line & 0x80) { + line &= 0x7F; + line++; w -= line; + while (line--) writeColor(color); + } + else { + line++; w -= line; + while (line--) writeColor(bgcolor); + } + } + } + else + { + int32_t px = 0, py = 0; // To hold character pixel coords + int32_t tx = 0, ty = 0; // To hold character TFT pixel coords + int32_t pc = 0; // Pixel count + int32_t pl = 0; // Pixel line length + uint16_t pcol = 0; // Pixel color + bool pf = true; // Flag for plotting + while (pc < w) { + line = pgm_read_byte((uint8_t *)flash_address); + flash_address++; + if (line & 0x80) { pcol = textcolor; line &= 0x7F; pf = true;} + else { pcol = textbgcolor; if (textcolor == textbgcolor) pf = false;} + line++; + px = pc % width; + tx = x + textsize * px; + py = pc / width; + ty = y + textsize * py; + + pl = 0; + pc += line; + while (line--) { + pl++; + if ((px+pl) >= width) { + if (pf) fillRect(tx, ty, pl * textsize, textsize, pcol); + pl = 0; + px = 0; + tx = x; + py ++; + ty += textsize; + } + } + if (pl && pf) fillRect(tx, ty, pl * textsize, textsize, pcol); + } + } + } + } + // End of RLE font rendering +#endif + +#if !defined (LOAD_FONT2) && !defined (LOAD_RLE) + // Stop warnings + flash_address = flash_address; + w = w; + pX = pX; + pY = pY; + line = line; + clip = clip; +#endif + + return width * textsize; // x + +} + + +#ifdef SMOOTH_FONT +/*************************************************************************************** +** Function name: drawGlyph +** Description: Write a character to the sprite cursor position +***************************************************************************************/ +// +void TFT_eSprite::drawGlyph(uint16_t code) +{ + uint16_t fg = textcolor; + uint16_t bg = textbgcolor; + bool getBG = false; + if (fg == bg) getBG = true; + + // Check if cursor has moved + if (last_cursor_x != cursor_x) + { + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; + } + + if (code < 0x21) + { + if (code == 0x20) { + if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFont.spaceWidth) - bg_cursor_x, gFont.yAdvance, bg); + cursor_x += gFont.spaceWidth; + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; + return; + } + + if (code == '\n') { + cursor_x = 0; + bg_cursor_x = 0; + last_cursor_x = 0; + cursor_y += gFont.yAdvance; + if (textwrapY && (cursor_y >= height())) cursor_y = 0; + return; + } + } + + uint16_t gNum = 0; + bool found = getUnicodeIndex(code, &gNum); + + if (found) + { + + bool newSprite = !_created; + + if (newSprite) + { + createSprite(gWidth[gNum], gFont.yAdvance); + if(fg != bg) fillSprite(bg); + cursor_x = -gdX[gNum]; + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; + cursor_y = 0; + } + else + { + if( textwrapX && ((cursor_x + gWidth[gNum] + gdX[gNum]) > width())) { + cursor_y += gFont.yAdvance; + cursor_x = 0; + bg_cursor_x = 0; + last_cursor_x = 0; + } + + if( textwrapY && ((cursor_y + gFont.yAdvance) > height())) cursor_y = 0; + if ( cursor_x == 0) cursor_x -= gdX[gNum]; + } + + uint8_t* pbuffer = nullptr; + const uint8_t* gPtr = (const uint8_t*) gFont.gArray; + +#ifdef FONT_FS_AVAILABLE + if (fs_font) { + fontFile.seek(gBitmap[gNum], fs::SeekSet); // This is slow for a significant position shift! + pbuffer = (uint8_t*)malloc(gWidth[gNum]); + } +#endif + + int16_t cy = cursor_y + gFont.maxAscent - gdY[gNum]; + int16_t cx = cursor_x + gdX[gNum]; + + // if (cx > width() && bg_cursor_x > width()) return; + // if (cursor_y > height()) return; + + int16_t fxs = cx; + uint32_t fl = 0; + int16_t bxs = cx; + uint32_t bl = 0; + int16_t bx = 0; + uint8_t pixel = 0; + + int16_t fillwidth = 0; + int16_t fillheight = 0; + + // Fill area above glyph + if (_fillbg) { + fillwidth = (cursor_x + gxAdvance[gNum]) - bg_cursor_x; + if (fillwidth > 0) { + fillheight = gFont.maxAscent - gdY[gNum]; + if (fillheight > 0) { + fillRect(bg_cursor_x, cursor_y, fillwidth, fillheight, textbgcolor); + } + } + else { + // Could be negative + fillwidth = 0; + } + + // Fill any area to left of glyph + if (bg_cursor_x < cx) fillRect(bg_cursor_x, cy, cx - bg_cursor_x, gHeight[gNum], textbgcolor); + // Set x position in glyph area where background starts + if (bg_cursor_x > cx) bx = bg_cursor_x - cx; + // Fill any area to right of glyph + if (cx + gWidth[gNum] < cursor_x + gxAdvance[gNum]) { + fillRect(cx + gWidth[gNum], cy, (cursor_x + gxAdvance[gNum]) - (cx + gWidth[gNum]), gHeight[gNum], textbgcolor); + } + } + + for (int32_t y = 0; y < gHeight[gNum]; y++) + { +#ifdef FONT_FS_AVAILABLE + if (fs_font) { + fontFile.read(pbuffer, gWidth[gNum]); + } +#endif + + for (int32_t x = 0; x < gWidth[gNum]; x++) + { +#ifdef FONT_FS_AVAILABLE + if (fs_font) pixel = pbuffer[x]; + else +#endif + pixel = pgm_read_byte(gPtr + gBitmap[gNum] + x + gWidth[gNum] * y); + + if (pixel) + { + if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } + if (pixel != 0xFF) + { + if (fl) { + if (fl==1) drawPixel(fxs, y + cy, fg); + else drawFastHLine( fxs, y + cy, fl, fg); + fl = 0; + } + if (getBG) bg = readPixel(x + cx, y + cy); + drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg)); + } + else + { + if (fl==0) fxs = x + cx; + fl++; + } + } + else + { + if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } + if (_fillbg) { + if (x >= bx) { + if (bl==0) bxs = x + cx; + bl++; + } + } + } + } + if (fl) { drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } + if (bl) { drawFastHLine( bxs, y + cy, bl, bg); bl = 0; } + } + + // Fill area below glyph + if (fillwidth > 0) { + fillheight = (cursor_y + gFont.yAdvance) - (cy + gHeight[gNum]); + if (fillheight > 0) { + fillRect(bg_cursor_x, cy + gHeight[gNum], fillwidth, fillheight, textbgcolor); + } + } + + if (pbuffer) free(pbuffer); + cursor_x += gxAdvance[gNum]; + + if (newSprite) + { + pushSprite(cx, cursor_y); + deleteSprite(); + } + } + else + { + // Not a Unicode in font so draw a rectangle and move on cursor + drawRect(cursor_x, cursor_y + gFont.maxAscent - gFont.ascent, gFont.spaceWidth, gFont.ascent, fg); + cursor_x += gFont.spaceWidth + 1; + } + bg_cursor_x = cursor_x; + last_cursor_x = cursor_x; +} + + +/*************************************************************************************** +** Function name: printToSprite +** Description: Write a string to the sprite cursor position +***************************************************************************************/ +void TFT_eSprite::printToSprite(String string) +{ + if(!fontLoaded) return; + printToSprite((char*)string.c_str(), string.length()); +} + + +/*************************************************************************************** +** Function name: printToSprite +** Description: Write a string to the sprite cursor position +***************************************************************************************/ +void TFT_eSprite::printToSprite(char *cbuffer, uint16_t len) //String string) +{ + if(!fontLoaded) return; + + uint16_t n = 0; + bool newSprite = !_created; + int16_t cursorX = _tft->cursor_x; + + if (newSprite) + { + int16_t sWidth = 0; + uint16_t index = 0; + bool first = true; + while (n < len) + { + uint16_t unicode = decodeUTF8((uint8_t*)cbuffer, &n, len - n); + if (getUnicodeIndex(unicode, &index)) + { + if (first) { + first = false; + sWidth -= gdX[index]; + cursorX += gdX[index]; + } + if (n == len) sWidth += ( gWidth[index] + gdX[index]); + else sWidth += gxAdvance[index]; + } + else sWidth += gFont.spaceWidth + 1; + } + + createSprite(sWidth, gFont.yAdvance); + + if (textcolor != textbgcolor) fillSprite(textbgcolor); + } + + n = 0; + + while (n < len) + { + uint16_t unicode = decodeUTF8((uint8_t*)cbuffer, &n, len - n); + //Serial.print("Decoded Unicode = 0x");Serial.println(unicode,HEX); + //Serial.print("n = ");Serial.println(n); + drawGlyph(unicode); + } + + if (newSprite) + { // The sprite had to be created so place at TFT cursor + pushSprite(cursorX, _tft->cursor_y); + deleteSprite(); + } +} + + +/*************************************************************************************** +** Function name: printToSprite +** Description: Print character in a Sprite, create sprite if needed +***************************************************************************************/ +int16_t TFT_eSprite::printToSprite(int16_t x, int16_t y, uint16_t index) +{ + bool newSprite = !_created; + int16_t sWidth = gWidth[index]; + + if (newSprite) + { + createSprite(sWidth, gFont.yAdvance); + + if (textcolor != textbgcolor) fillSprite(textbgcolor); + + drawGlyph(gUnicode[index]); + + pushSprite(x + gdX[index], y, textbgcolor); + deleteSprite(); + } + + else drawGlyph(gUnicode[index]); + + return gxAdvance[index]; +} +#endif diff --git a/libraries/TFT_eSPI/Extensions/Sprite.h b/libraries/TFT_eSPI/Extensions/Sprite.h new file mode 100644 index 0000000..67e29de --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Sprite.h @@ -0,0 +1,188 @@ +/*************************************************************************************** +// The following class creates Sprites in RAM, graphics can then be drawn in the Sprite +// and rendered quickly onto the TFT screen. The class inherits the graphics functions +// from the TFT_eSPI class. Some functions are overridden by this class so that the +// graphics are written to the Sprite rather than the TFT. +***************************************************************************************/ + +class TFT_eSprite : public TFT_eSPI { + + public: + + explicit TFT_eSprite(TFT_eSPI *tft); + ~TFT_eSprite(void); + + // Create a sprite of width x height pixels, return a pointer to the RAM area + // Sketch can cast returned value to (uint16_t*) for 16-bit depth if needed + // RAM required is: + // - 1 bit per pixel for 1 bit colour depth + // - 1 nibble per pixel for 4-bit colour (with palette table) + // - 1 byte per pixel for 8-bit colour (332 RGB format) + // - 2 bytes per pixel for 16-bit color depth (565 RGB format) + void* createSprite(int16_t width, int16_t height, uint8_t frames = 1); + + // Returns a pointer to the sprite or nullptr if not created, user must cast to pointer type + void* getPointer(void); + + // Returns true if sprite has been created + bool created(void); + + // Delete the sprite to free up the RAM + void deleteSprite(void); + + // Select the frame buffer for graphics write (for 2 colour ePaper and DMA toggle buffer) + // Returns a pointer to the Sprite frame buffer + void* frameBuffer(int8_t f); + + // Set or get the colour depth to 1, 4, 8 or 16 bits. Can be used to change depth an existing + // sprite, but clears it to black, returns a new pointer if sprite is re-created. + void* setColorDepth(int8_t b); + int8_t getColorDepth(void); + + // Set the palette for a 4-bit depth sprite. Only the first 16 colours in the map are used. + void createPalette(uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in RAM + void createPalette(const uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in FLASH + + // Set a single palette index to the given color + void setPaletteColor(uint8_t index, uint16_t color); + + // Get the color at the given palette index + uint16_t getPaletteColor(uint8_t index); + + // Set foreground and background colours for 1 bit per pixel Sprite + void setBitmapColor(uint16_t fg, uint16_t bg); + + // Draw a single pixel at x,y + void drawPixel(int32_t x, int32_t y, uint32_t color); + + // Draw a single character in the GLCD or GFXFF font + void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size), + + // Fill Sprite with a colour + fillSprite(uint32_t color), + + // Define a window to push 16-bit colour pixels into in a raster order + // Colours are converted to the set Sprite colour bit depth + setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1), + // Push a color (aka singe pixel) to the sprite's set window area + pushColor(uint16_t color), + // Push len colors (pixels) to the sprite's set window area + pushColor(uint16_t color, uint32_t len), + // Push a pixel pre-formatted as a 1, 4, 8 or 16-bit colour (avoids conversion overhead) + writeColor(uint16_t color), + + // Set the scroll zone, top left corner at x,y with defined width and height + // The colour (optional, black is default) is used to fill the gap after the scroll + setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK), + // Scroll the defined zone dx,dy pixels. Negative values left,up, positive right,down + // dy is optional (default is 0, so no up/down scroll). + // The sprite coordinate frame does not move because pixels are moved + scroll(int16_t dx, int16_t dy = 0), + + // Draw lines + drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color), + drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color), + drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color), + + // Fill a rectangular area with a color (aka draw a filled rectangle) + fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); + + // Set the coordinate rotation of the Sprite (for 1bpp Sprites only) + // Note: this uses coordinate rotation and is primarily for ePaper which does not support + // CGRAM rotation (like TFT drivers do) within the displays internal hardware + void setRotation(uint8_t rotation); + uint8_t getRotation(void); + + // Push a rotated copy of Sprite to TFT with optional transparent colour + bool pushRotated(int16_t angle, uint32_t transp = 0x00FFFFFF); + // Push a rotated copy of Sprite to another different Sprite with optional transparent colour + bool pushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp = 0x00FFFFFF); + + // Get the TFT bounding box for a rotated copy of this Sprite + bool getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y); + // Get the destination Sprite bounding box for a rotated copy of this Sprite + bool getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y, + int16_t *max_x, int16_t *max_y); + // Bounding box support function + void getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp, + int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y); + + // Read the colour of a pixel at x,y and return value in 565 format + uint16_t readPixel(int32_t x0, int32_t y0); + + // return the numerical value of the pixel at x,y (used when scrolling) + // 16bpp = colour, 8bpp = byte, 4bpp = colour index, 1bpp = 1 or 0 + uint16_t readPixelValue(int32_t x, int32_t y); + + // Write an image (colour bitmap) to the sprite. + void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp = 0); + void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data); + + // Push the sprite to the TFT screen, this fn calls pushImage() in the TFT class. + // Optionally a "transparent" colour can be defined, pixels of that colour will not be rendered + void pushSprite(int32_t x, int32_t y); + void pushSprite(int32_t x, int32_t y, uint16_t transparent); + + // Push a windowed area of the sprite to the TFT at tx, ty + bool pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh); + + // Push the sprite to another sprite at x,y. This fn calls pushImage() in the destination sprite (dspr) class. + bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y); + bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transparent); + + // Draw a single character in the selected font + int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font), + drawChar(uint16_t uniCode, int32_t x, int32_t y); + + // Return the width and height of the sprite + int16_t width(void), + height(void); + + // Functions associated with anti-aliased fonts + // Draw a single Unicode character using the loaded font + void drawGlyph(uint16_t code); + // Print string to sprite using loaded font at cursor position + void printToSprite(String string); + // Print char array to sprite using loaded font at cursor position + void printToSprite(char *cbuffer, uint16_t len); + // Print indexed glyph to sprite using loaded font at x,y + int16_t printToSprite(int16_t x, int16_t y, uint16_t index); + + private: + + TFT_eSPI *_tft; + + // Reserve memory for the Sprite and return a pointer + void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1); + + // Override the non-inlined TFT_eSPI functions + void begin_nin_write(void) { ; } + void end_nin_write(void) { ; } + + protected: + + uint8_t _bpp; // bits per pixel (1, 4, 8 or 16) + uint16_t *_img; // pointer to 16-bit sprite + uint8_t *_img8; // pointer to 1 and 8-bit sprite frame 1 or frame 2 + uint8_t *_img4; // pointer to 4-bit sprite (uses color map) + uint8_t *_img8_1; // pointer to frame 1 + uint8_t *_img8_2; // pointer to frame 2 + + uint16_t *_colorMap; // color map pointer: 16 entries, used with 4-bit color map. + + int32_t _sinra; // Sine of rotation angle in fixed point + int32_t _cosra; // Cosine of rotation angle in fixed point + + bool _created; // A Sprite has been created and memory reserved + bool _gFont = false; + + int32_t _xs, _ys, _xe, _ye, _xptr, _yptr; // for setWindow + int32_t _sx, _sy; // x,y for scroll zone + uint32_t _sw, _sh; // w,h for scroll zone + uint32_t _scolor; // gap fill colour for scroll zone + + int32_t _iwidth, _iheight; // Sprite memory image bit width and height (swapped during rotations) + int32_t _dwidth, _dheight; // Real sprite width and height (for <8bpp Sprites) + int32_t _bitwidth; // Sprite image bit width for drawPixel (for <8bpp Sprites, not swapped) + +}; diff --git a/libraries/TFT_eSPI/Extensions/Touch.cpp b/libraries/TFT_eSPI/Extensions/Touch.cpp new file mode 100644 index 0000000..3d3ed82 --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Touch.cpp @@ -0,0 +1,349 @@ +// The following touch screen support code by maxpautsch was merged 1/10/17 +// https://github.com/maxpautsch + +// Define TOUCH_CS is the user setup file to enable this code + +// A demo is provided in examples Generic folder + +// Additions by Bodmer to double sample, use Z value to improve detection reliability +// and to correct rotation handling + +// See license in root directory. + +// Define a default pressure threshold +#ifndef Z_THRESHOLD + #define Z_THRESHOLD 350 // Touch pressure threshold for validating touches +#endif + +/*************************************************************************************** +** Function name: begin_touch_read_write - was spi_begin_touch +** Description: Start transaction and select touch controller +***************************************************************************************/ +// The touch controller has a low SPI clock rate +inline void TFT_eSPI::begin_touch_read_write(void){ + DMA_BUSY_CHECK; + CS_H; // Just in case it has been left low + #if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) + if (locked) {locked = false; spi.beginTransaction(SPISettings(SPI_TOUCH_FREQUENCY, MSBFIRST, SPI_MODE0));} + #else + spi.setFrequency(SPI_TOUCH_FREQUENCY); + #endif + SET_BUS_READ_MODE; + T_CS_L; +} + +/*************************************************************************************** +** Function name: end_touch_read_write - was spi_end_touch +** Description: End transaction and deselect touch controller +***************************************************************************************/ +inline void TFT_eSPI::end_touch_read_write(void){ + T_CS_H; + #if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) + if(!inTransaction) {if (!locked) {locked = true; spi.endTransaction();}} + #else + spi.setFrequency(SPI_FREQUENCY); + #endif + //SET_BUS_WRITE_MODE; +} + +/*************************************************************************************** +** Function name: Legacy - deprecated +** Description: Start/end transaction +***************************************************************************************/ +void TFT_eSPI::spi_begin_touch() {begin_touch_read_write();} +void TFT_eSPI::spi_end_touch() { end_touch_read_write();} + +/*************************************************************************************** +** Function name: getTouchRaw +** Description: read raw touch position. Always returns true. +***************************************************************************************/ +uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){ + uint16_t tmp; + + begin_touch_read_write(); + + // Start YP sample request for x position, read 4 times and keep last sample + spi.transfer(0xd0); // Start new YP conversion + spi.transfer(0); // Read first 8 bits + spi.transfer(0xd0); // Read last 8 bits and start new YP conversion + spi.transfer(0); // Read first 8 bits + spi.transfer(0xd0); // Read last 8 bits and start new YP conversion + spi.transfer(0); // Read first 8 bits + spi.transfer(0xd0); // Read last 8 bits and start new YP conversion + + tmp = spi.transfer(0); // Read first 8 bits + tmp = tmp <<5; + tmp |= 0x1f & (spi.transfer(0x90)>>3); // Read last 8 bits and start new XP conversion + + *x = tmp; + + // Start XP sample request for y position, read 4 times and keep last sample + spi.transfer(0); // Read first 8 bits + spi.transfer(0x90); // Read last 8 bits and start new XP conversion + spi.transfer(0); // Read first 8 bits + spi.transfer(0x90); // Read last 8 bits and start new XP conversion + spi.transfer(0); // Read first 8 bits + spi.transfer(0x90); // Read last 8 bits and start new XP conversion + + tmp = spi.transfer(0); // Read first 8 bits + tmp = tmp <<5; + tmp |= 0x1f & (spi.transfer(0)>>3); // Read last 8 bits + + *y = tmp; + + end_touch_read_write(); + + return true; +} + +/*************************************************************************************** +** Function name: getTouchRawZ +** Description: read raw pressure on touchpad and return Z value. +***************************************************************************************/ +uint16_t TFT_eSPI::getTouchRawZ(void){ + + begin_touch_read_write(); + + // Z sample request + int16_t tz = 0xFFF; + spi.transfer(0xb0); // Start new Z1 conversion + tz += spi.transfer16(0xc0) >> 3; // Read Z1 and start Z2 conversion + tz -= spi.transfer16(0x00) >> 3; // Read Z2 + + end_touch_read_write(); + + if (tz == 4095) tz = 0; + + return (uint16_t)tz; +} + +/*************************************************************************************** +** Function name: validTouch +** Description: read validated position. Return false if not pressed. +***************************************************************************************/ +#define _RAWERR 20 // Deadband error allowed in successive position samples +uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ + uint16_t x_tmp, y_tmp, x_tmp2, y_tmp2; + + // Wait until pressure stops increasing to debounce pressure + uint16_t z1 = 1; + uint16_t z2 = 0; + while (z1 > z2) + { + z2 = z1; + z1 = getTouchRawZ(); + delay(1); + } + + // Serial.print("Z = ");Serial.println(z1); + + if (z1 <= threshold) return false; + + getTouchRaw(&x_tmp,&y_tmp); + + // Serial.print("Sample 1 x,y = "); Serial.print(x_tmp);Serial.print(",");Serial.print(y_tmp); + // Serial.print(", Z = ");Serial.println(z1); + + delay(1); // Small delay to the next sample + if (getTouchRawZ() <= threshold) return false; + + delay(2); // Small delay to the next sample + getTouchRaw(&x_tmp2,&y_tmp2); + + // Serial.print("Sample 2 x,y = "); Serial.print(x_tmp2);Serial.print(",");Serial.println(y_tmp2); + // Serial.print("Sample difference = ");Serial.print(abs(x_tmp - x_tmp2));Serial.print(",");Serial.println(abs(y_tmp - y_tmp2)); + + if (abs(x_tmp - x_tmp2) > _RAWERR) return false; + if (abs(y_tmp - y_tmp2) > _RAWERR) return false; + + *x = x_tmp; + *y = y_tmp; + + return true; +} + +/*************************************************************************************** +** Function name: getTouch +** Description: read callibrated position. Return false if not pressed. +***************************************************************************************/ +uint8_t TFT_eSPI::getTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ + uint16_t x_tmp, y_tmp; + + if (threshold<20) threshold = 20; + if (_pressTime > millis()) threshold=20; + + uint8_t n = 5; + uint8_t valid = 0; + while (n--) + { + if (validTouch(&x_tmp, &y_tmp, threshold)) valid++;; + } + + if (valid<1) { _pressTime = 0; return false; } + + _pressTime = millis() + 50; + + convertRawXY(&x_tmp, &y_tmp); + + if (x_tmp >= _width || y_tmp >= _height) return false; + + _pressX = x_tmp; + _pressY = y_tmp; + *x = _pressX; + *y = _pressY; + return valid; +} + +/*************************************************************************************** +** Function name: convertRawXY +** Description: convert raw touch x,y values to screen coordinates +***************************************************************************************/ +void TFT_eSPI::convertRawXY(uint16_t *x, uint16_t *y) +{ + uint16_t x_tmp = *x, y_tmp = *y, xx, yy; + + if(!touchCalibration_rotate){ + xx=(x_tmp-touchCalibration_x0)*_width/touchCalibration_x1; + yy=(y_tmp-touchCalibration_y0)*_height/touchCalibration_y1; + if(touchCalibration_invert_x) + xx = _width - xx; + if(touchCalibration_invert_y) + yy = _height - yy; + } else { + xx=(y_tmp-touchCalibration_x0)*_width/touchCalibration_x1; + yy=(x_tmp-touchCalibration_y0)*_height/touchCalibration_y1; + if(touchCalibration_invert_x) + xx = _width - xx; + if(touchCalibration_invert_y) + yy = _height - yy; + } + *x = xx; + *y = yy; +} + +/*************************************************************************************** +** Function name: calibrateTouch +** Description: generates calibration parameters for touchscreen. +***************************************************************************************/ +void TFT_eSPI::calibrateTouch(uint16_t *parameters, uint32_t color_fg, uint32_t color_bg, uint8_t size){ + int16_t values[] = {0,0,0,0,0,0,0,0}; + uint16_t x_tmp, y_tmp; + + + + for(uint8_t i = 0; i<4; i++){ + fillRect(0, 0, size+1, size+1, color_bg); + fillRect(0, _height-size-1, size+1, size+1, color_bg); + fillRect(_width-size-1, 0, size+1, size+1, color_bg); + fillRect(_width-size-1, _height-size-1, size+1, size+1, color_bg); + + if (i == 5) break; // used to clear the arrows + + switch (i) { + case 0: // up left + drawLine(0, 0, 0, size, color_fg); + drawLine(0, 0, size, 0, color_fg); + drawLine(0, 0, size , size, color_fg); + break; + case 1: // bot left + drawLine(0, _height-size-1, 0, _height-1, color_fg); + drawLine(0, _height-1, size, _height-1, color_fg); + drawLine(size, _height-size-1, 0, _height-1 , color_fg); + break; + case 2: // up right + drawLine(_width-size-1, 0, _width-1, 0, color_fg); + drawLine(_width-size-1, size, _width-1, 0, color_fg); + drawLine(_width-1, size, _width-1, 0, color_fg); + break; + case 3: // bot right + drawLine(_width-size-1, _height-size-1, _width-1, _height-1, color_fg); + drawLine(_width-1, _height-1-size, _width-1, _height-1, color_fg); + drawLine(_width-1-size, _height-1, _width-1, _height-1, color_fg); + break; + } + + // user has to get the chance to release + if(i>0) delay(1000); + + for(uint8_t j= 0; j<8; j++){ + // Use a lower detect threshold as corners tend to be less sensitive + while(!validTouch(&x_tmp, &y_tmp, Z_THRESHOLD/2)); + values[i*2 ] += x_tmp; + values[i*2+1] += y_tmp; + } + values[i*2 ] /= 8; + values[i*2+1] /= 8; + } + + + // from case 0 to case 1, the y value changed. + // If the measured delta of the touch x axis is bigger than the delta of the y axis, the touch and TFT axes are switched. + touchCalibration_rotate = false; + if(abs(values[0]-values[2]) > abs(values[1]-values[3])){ + touchCalibration_rotate = true; + touchCalibration_x0 = (values[1] + values[3])/2; // calc min x + touchCalibration_x1 = (values[5] + values[7])/2; // calc max x + touchCalibration_y0 = (values[0] + values[4])/2; // calc min y + touchCalibration_y1 = (values[2] + values[6])/2; // calc max y + } else { + touchCalibration_x0 = (values[0] + values[2])/2; // calc min x + touchCalibration_x1 = (values[4] + values[6])/2; // calc max x + touchCalibration_y0 = (values[1] + values[5])/2; // calc min y + touchCalibration_y1 = (values[3] + values[7])/2; // calc max y + } + + // in addition, the touch screen axis could be in the opposite direction of the TFT axis + touchCalibration_invert_x = false; + if(touchCalibration_x0 > touchCalibration_x1){ + values[0]=touchCalibration_x0; + touchCalibration_x0 = touchCalibration_x1; + touchCalibration_x1 = values[0]; + touchCalibration_invert_x = true; + } + touchCalibration_invert_y = false; + if(touchCalibration_y0 > touchCalibration_y1){ + values[0]=touchCalibration_y0; + touchCalibration_y0 = touchCalibration_y1; + touchCalibration_y1 = values[0]; + touchCalibration_invert_y = true; + } + + // pre calculate + touchCalibration_x1 -= touchCalibration_x0; + touchCalibration_y1 -= touchCalibration_y0; + + if(touchCalibration_x0 == 0) touchCalibration_x0 = 1; + if(touchCalibration_x1 == 0) touchCalibration_x1 = 1; + if(touchCalibration_y0 == 0) touchCalibration_y0 = 1; + if(touchCalibration_y1 == 0) touchCalibration_y1 = 1; + + // export parameters, if pointer valid + if(parameters != NULL){ + parameters[0] = touchCalibration_x0; + parameters[1] = touchCalibration_x1; + parameters[2] = touchCalibration_y0; + parameters[3] = touchCalibration_y1; + parameters[4] = touchCalibration_rotate | (touchCalibration_invert_x <<1) | (touchCalibration_invert_y <<2); + } +} + + +/*************************************************************************************** +** Function name: setTouch +** Description: imports calibration parameters for touchscreen. +***************************************************************************************/ +void TFT_eSPI::setTouch(uint16_t *parameters){ + touchCalibration_x0 = parameters[0]; + touchCalibration_x1 = parameters[1]; + touchCalibration_y0 = parameters[2]; + touchCalibration_y1 = parameters[3]; + + if(touchCalibration_x0 == 0) touchCalibration_x0 = 1; + if(touchCalibration_x1 == 0) touchCalibration_x1 = 1; + if(touchCalibration_y0 == 0) touchCalibration_y0 = 1; + if(touchCalibration_y1 == 0) touchCalibration_y1 = 1; + + touchCalibration_rotate = parameters[4] & 0x01; + touchCalibration_invert_x = parameters[4] & 0x02; + touchCalibration_invert_y = parameters[4] & 0x04; +} diff --git a/libraries/TFT_eSPI/Extensions/Touch.h b/libraries/TFT_eSPI/Extensions/Touch.h new file mode 100644 index 0000000..9bb81fc --- /dev/null +++ b/libraries/TFT_eSPI/Extensions/Touch.h @@ -0,0 +1,42 @@ + // Coded by Bodmer 10/2/18, see license in root directory. + // This is part of the TFT_eSPI class and is associated with the Touch Screen handlers + + public: + // Get raw x,y ADC values from touch controller + uint8_t getTouchRaw(uint16_t *x, uint16_t *y); + // Get raw z (i.e. pressure) ADC value from touch controller + uint16_t getTouchRawZ(void); + // Convert raw x,y values to calibrated and correctly rotated screen coordinates + void convertRawXY(uint16_t *x, uint16_t *y); + // Get the screen touch coordinates, returns true if screen has been touched + // if the touch coordinates are off screen then x and y are not updated + // The returned value can be treated as a bool type, false or 0 means touch not detected + // In future the function may return an 8-bit "quality" (jitter) value. + // The threshold value is optional, this must be higher than the bias level for z (pressure) + // reported by Test_Touch_Controller when the screen is NOT touched. When touched the z value + // must be higher than the threshold for a touch to be detected. + uint8_t getTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600); + + // Run screen calibration and test, report calibration values to the serial port + void calibrateTouch(uint16_t *data, uint32_t color_fg, uint32_t color_bg, uint8_t size); + // Set the screen calibration values + void setTouch(uint16_t *data); + + private: + // Legacy support only - deprecated TODO: delete + void spi_begin_touch(); + void spi_end_touch(); + + // Handlers for the touch controller bus settings + inline void begin_touch_read_write() __attribute__((always_inline)); + inline void end_touch_read_write() __attribute__((always_inline)); + + // Private function to validate a touch, allow settle time and reduce spurious coordinates + uint8_t validTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600); + + // Initialise with example calibration values so processor does not crash if setTouch() not called in setup() + uint16_t touchCalibration_x0 = 300, touchCalibration_x1 = 3600, touchCalibration_y0 = 300, touchCalibration_y1 = 3600; + uint8_t touchCalibration_rotate = 1, touchCalibration_invert_x = 2, touchCalibration_invert_y = 0; + + uint32_t _pressTime; // Press and hold time-out + uint16_t _pressX, _pressY; // For future use (last sampled calibrated coordinates) diff --git a/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_24.h b/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_24.h new file mode 100644 index 0000000..0add58a --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_24.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Orbitron_Light_24Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0xFF,0xFF,0xFF,0x03,0xC0, // '!' + 0xCF,0x3C,0xC0, // '"' + 0x01,0x81,0x80,0xC0,0xC0,0x30,0x30,0x0C,0x0C,0x7F,0xFF,0xDF,0xFF,0xF0,0x60,0x60,0x30,0x30,0x0C,0x0C,0x03,0x03,0x01,0x81,0x83,0xFF,0xFE,0xFF,0xFF,0x8C,0x04,0x03,0x03,0x00,0xC0,0xC0,0x20,0x30,0x00, // '#' + 0x00,0xC0,0x00,0x30,0x00,0x0C,0x01,0xFF,0xFE,0xFF,0xFF,0xF0,0x30,0x3C,0x0C,0x03,0x03,0x00,0xC0,0xC0,0x30,0x30,0x0F,0xFF,0xF9,0xFF,0xFF,0x00,0xC0,0xC0,0x30,0x30,0x0C,0x0C,0x03,0x03,0xC0,0xC0,0xF0,0x30,0x3F,0xFF,0xFD,0xFF,0xFE,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00, // '$' + 0x00,0x00,0x03,0xF0,0x00,0xBF,0xC0,0x0D,0x86,0x00,0xEC,0x30,0x1E,0x61,0x81,0xE3,0x0C,0x1C,0x1F,0xE1,0xC0,0x7E,0x3C,0x00,0x03,0xC0,0x00,0x3C,0xFC,0x03,0x8F,0xF0,0x38,0x60,0x87,0x83,0x04,0x78,0x18,0x23,0x80,0xC1,0x10,0x07,0xF8,0x00,0x1F,0x80, // '%' + 0x3F,0xFF,0x03,0xFF,0xFC,0x18,0x00,0x60,0xC0,0x03,0x06,0x00,0x00,0x30,0x00,0x01,0xC0,0x00,0x07,0x80,0x00,0xCE,0x00,0x06,0x1C,0x0C,0x30,0x38,0x61,0x80,0x73,0x0C,0x00,0xF8,0x60,0x01,0xE3,0x00,0x07,0xDF,0xFF,0xF7,0x7F,0xFF,0x08, // '&' + 0xFC, // ''' + 0x7F,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCF,0x70, // '(' + 0xEF,0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0xE0, // ')' + 0x06,0x00,0x60,0x06,0x07,0x6E,0x7F,0xE0,0xF0,0x0F,0x01,0x98,0x39,0xC1,0x08, // '*' + 0x0C,0x06,0x03,0x1F,0xFF,0xF8,0x60,0x30,0x18,0x0C,0x00, // '+' + 0xFF,0x80, // ',' + 0xFF,0xFF,0xC0, // '-' + 0xF0, // '.' + 0x00,0x00,0x01,0x00,0x30,0x03,0x00,0x60,0x0C,0x01,0x80,0x38,0x03,0x00,0x60,0x0C,0x01,0x80,0x30,0x03,0x00,0x60,0x0C,0x00,0x80,0x00,0x00, // '/' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0xF8,0x00,0xFC,0x00,0xFE,0x00,0xEF,0x01,0xC7,0x81,0xC3,0xC1,0xC1,0xE1,0xC0,0xF1,0xC0,0x7B,0x80,0x3F,0x80,0x1F,0x80,0x0F,0x80,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '0' + 0x07,0x0F,0x1F,0x3B,0x73,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, // '1' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x7F,0xFF,0xFF,0xFF,0xB0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // '2' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x3F,0xFF,0x1F,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '3' + 0x00,0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1F,0x80,0x1C,0xC0,0x1C,0x60,0x1C,0x30,0x1C,0x18,0x3C,0x0C,0x38,0x06,0x38,0x03,0x1F,0xFF,0xFF,0xFF,0xF8,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00, // '4' + 0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0xFF,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '5' + 0x7F,0xFC,0x7F,0xFE,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '6' + 0xFF,0xFD,0xFF,0xFC,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06, // '7' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '8' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xFF,0xFF,0xBF,0xFF,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // '9' + 0xF0,0x00,0x00,0xF0, // ':' + 0xF0,0x00,0x00,0xFF,0x80, // ';' + 0x00,0x40,0x70,0x78,0x3C,0x3C,0x3C,0x0E,0x03,0x80,0x78,0x07,0x00,0xF0,0x0F,0x00,0xC0,0x10, // '<' + 0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0, // '=' + 0x80,0x30,0x0F,0x00,0xF0,0x1E,0x01,0xE0,0x1C,0x07,0x07,0x87,0x87,0x83,0xC0,0xC0,0x00,0x00, // '>' + 0xFF,0xFD,0xFF,0xFC,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x0F,0xFE,0x3F,0xF8,0x60,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x18,0x00, // '?' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x3E,0x1E,0x3F,0x8F,0x30,0x67,0x98,0x33,0xCC,0x19,0xE6,0x0C,0xF3,0x06,0x79,0xFF,0xFC,0x7F,0xFE,0x00,0x03,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0x80, // '@' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0x80, // 'A' + 0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x00, // 'B' + 0x7F,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0x80, // 'C' + 0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x00, // 'D' + 0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xF8,0xFF,0xF8,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xFF,0xFF,0xFF, // 'E' + 0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xFF,0xF8,0xFF,0xF8,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00, // 'F' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x1F,0xE0,0x0F,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'G' + 0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xC0, // 'H' + 0xFF,0xFF,0xFF,0xFF,0xC0, // 'I' + 0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'J' + 0xC0,0x03,0x60,0x03,0x30,0x03,0x18,0x03,0x0C,0x03,0x06,0x03,0x83,0x03,0x81,0xFF,0x80,0xFF,0xC0,0x60,0x60,0x30,0x18,0x18,0x06,0x0C,0x03,0x86,0x00,0xE3,0x00,0x31,0x80,0x0C,0xC0,0x03,0x00, // 'K' + 0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xC0, // 'L' + 0xE0,0x00,0x7F,0x00,0x0F,0xF8,0x01,0xFD,0xC0,0x3B,0xCE,0x07,0x3C,0x60,0xE3,0xC3,0x0C,0x3C,0x19,0x83,0xC1,0xF8,0x3C,0x0F,0x03,0xC0,0x60,0x3C,0x00,0x03,0xC0,0x00,0x3C,0x00,0x03,0xC0,0x00,0x3C,0x00,0x03,0xC0,0x00,0x30, // 'M' + 0xE0,0x01,0xF8,0x00,0xFE,0x00,0x7B,0x80,0x3C,0xC0,0x1E,0x30,0x0F,0x0C,0x07,0x87,0x03,0xC1,0xC1,0xE0,0x70,0xF0,0x18,0x78,0x06,0x3C,0x01,0x9E,0x00,0xEF,0x00,0x3F,0x80,0x0F,0xC0,0x03,0x80, // 'N' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'O' + 0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xD8,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x00, // 'P' + 0x7F,0xFF,0x0F,0xFF,0xF8,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8C,0x00,0x18,0xC0,0x01,0x8F,0xFF,0xFF,0x7F,0xFF,0xF0, // 'Q' + 0xFF,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xD8,0x06,0x0C,0x03,0x86,0x00,0xE3,0x00,0x39,0x80,0x0E,0xC0,0x03,0x00, // 'R' + 0x7F,0xFF,0x7F,0xFF,0xF0,0x00,0x78,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0xFF,0xFE,0x7F,0xFF,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'S' + 0xFF,0xFF,0xFF,0xFF,0xC0,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x00,0xC0,0x00, // 'T' + 0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0x00, // 'U' + 0x60,0x00,0x0E,0x30,0x00,0x0C,0x38,0x00,0x1C,0x18,0x00,0x18,0x1C,0x00,0x30,0x0C,0x00,0x30,0x06,0x00,0x60,0x07,0x00,0xE0,0x03,0x00,0xC0,0x03,0x81,0xC0,0x01,0x81,0x80,0x00,0xC3,0x00,0x00,0xC7,0x00,0x00,0x66,0x00,0x00,0x7E,0x00,0x00,0x3C,0x00,0x00,0x18,0x00, // 'V' + 0x60,0x07,0x00,0x66,0x00,0xF0,0x06,0x30,0x0F,0x00,0xE3,0x00,0xD8,0x0C,0x18,0x19,0x80,0xC1,0x81,0x98,0x1C,0x18,0x18,0xC1,0x80,0xC3,0x0C,0x18,0x0C,0x30,0xE3,0x00,0xC7,0x06,0x30,0x06,0x60,0x63,0x00,0x66,0x03,0x60,0x07,0xE0,0x36,0x00,0x3C,0x03,0xE0,0x03,0xC0,0x1C,0x00,0x18,0x01,0xC0,0x01,0x80,0x18,0x00, // 'W' + 0x60,0x03,0x9C,0x01,0xC3,0x80,0xE0,0x70,0x30,0x0C,0x18,0x01,0x8C,0x00,0x37,0x00,0x07,0x80,0x01,0xC0,0x00,0xF8,0x00,0x37,0x00,0x18,0xC0,0x0C,0x18,0x07,0x03,0x03,0x80,0xE1,0xC0,0x1C,0x60,0x03,0x80, // 'X' + 0xE0,0x01,0xD8,0x00,0xE3,0x00,0x30,0x60,0x18,0x1C,0x0E,0x03,0x87,0x00,0x73,0x80,0x0C,0xC0,0x03,0xF0,0x00,0x78,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00, // 'Y' + 0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // 'Z' + 0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCF,0xF0, // '[' + 0x00,0x08,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x10,0x00, // '\' + 0xFF,0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0xF0, // ']' + 0x00, // '^' + 0xFF,0xFF,0xFF,0xFF,0xC0, // '_' + 0x66,0x60, // '`' + 0xFF,0xFB,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0, // 'a' + 0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0xFF,0xEF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0xFF,0xFF,0xFF,0x80, // 'b' + 0x7F,0xFF,0xFF,0xFC,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xFF,0xFD,0xFF,0xF0, // 'c' + 0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0D,0xFF,0xFF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0xFF,0xF7,0xFF,0xC0, // 'd' + 0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xFF,0xFD,0xFF,0xF0, // 'e' + 0x7F,0xFF,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0, // 'f' + 0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x31,0xFF,0xC7,0xFE, // 'g' + 0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0xFF,0xEF,0xFF,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xC0, // 'h' + 0xF0,0x3F,0xFF,0xFF,0xFC, // 'i' + 0x01,0x80,0xC0,0x00,0x00,0x00,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x0C,0x07,0xFF,0xFF,0x00, // 'j' + 0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x6C,0x03,0xB0,0x1C,0xC0,0xE3,0x07,0x0C,0x38,0x3F,0xC0,0xFF,0x03,0x0E,0x0C,0x1C,0x30,0x38,0xC0,0x73,0x00,0xEC,0x01,0x80, // 'k' + 0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0xF7,0xC0, // 'l' + 0xFF,0xFF,0xFB,0xFF,0xFF,0xFC,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x3C,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x3C,0x03,0x00,0xF0,0x0C,0x03,0xC0,0x30,0x0F,0x00,0xC0,0x30, // 'm' + 0xFF,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x30, // 'n' + 0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 'o' + 0xFF,0xFB,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFF,0xFF,0xEC,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00, // 'p' + 0x7F,0xFF,0xFF,0xFC,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03, // 'q' + 0x7F,0xFF,0xFF,0x00,0x60,0x0C,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x00, // 'r' + 0x7F,0xFB,0xFF,0xFC,0x00,0xF0,0x00,0xC0,0x03,0x00,0x0F,0xFF,0x9F,0xFF,0x00,0x0C,0x00,0x30,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 's' + 0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0x7F, // 't' + 0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xE0, // 'u' + 0x60,0x00,0xCE,0x00,0x30,0xC0,0x0E,0x1C,0x01,0x81,0x80,0x70,0x18,0x0C,0x03,0x03,0x80,0x30,0x60,0x06,0x1C,0x00,0x63,0x00,0x0C,0xC0,0x00,0xD8,0x00,0x1E,0x00,0x01,0xC0,0x00, // 'v' + 0x60,0x1C,0x01,0x9C,0x07,0x80,0xE3,0x01,0xE0,0x30,0xC0,0xFC,0x0C,0x18,0x33,0x06,0x06,0x1C,0xE1,0x81,0xC6,0x18,0xE0,0x33,0x87,0x30,0x0C,0xC0,0xCC,0x01,0xB0,0x3F,0x00,0x7C,0x07,0x80,0x1E,0x01,0xE0,0x03,0x80,0x70,0x00,0xC0,0x0C,0x00, // 'w' + 0x60,0x1C,0xE0,0x70,0xE0,0xC0,0xE3,0x00,0xEE,0x00,0xF8,0x00,0xE0,0x03,0xC0,0x07,0xC0,0x19,0xC0,0x71,0x81,0xC1,0x87,0x01,0x8C,0x03,0x80, // 'x' + 0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xC0,0x0F,0x00,0x3C,0x00,0xF0,0x03,0xFF,0xFD,0xFF,0xF0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x31,0xFF,0xC7,0xFE, // 'y' + 0xFF,0xFF,0xFF,0xF0,0x01,0xC0,0x0E,0x00,0x70,0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0xE0,0x07,0x00,0x38,0x00,0xFF,0xFF,0xFF,0xF0, // 'z' + 0x3B,0xD8,0xC6,0x31,0x98,0x86,0x18,0xC6,0x31,0x8F,0x38, // '{' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC, // '|' + 0xE7,0x8C,0x63,0x18,0xC3,0x08,0xCC,0x63,0x18,0xDE,0xE0 // '}' +}; +const GFXglyph Orbitron_Light_24Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 8, 0, 0 }, // ' ' + { 1, 2, 17, 6, 1, -17 }, // '!' + { 6, 6, 3, 10, 1, -17 }, // '"' + { 9, 18, 17, 21, 1, -17 }, // '#' + { 48, 18, 23, 21, 1, -20 }, // '$' + { 100, 21, 18, 24, 1, -18 }, // '%' + { 148, 21, 17, 23, 1, -17 }, // '&' + { 193, 2, 3, 6, 1, -17 }, // ''' + { 194, 4, 17, 7, 1, -17 }, // '(' + { 203, 4, 17, 8, 1, -17 }, // ')' + { 212, 12, 10, 13, 0, -17 }, // '*' + { 227, 9, 9, 12, 1, -11 }, // '+' + { 238, 2, 6, 5, 1, -2 }, // ',' + { 240, 9, 2, 13, 1, -8 }, // '-' + { 243, 2, 2, 6, 1, -2 }, // '.' + { 244, 12, 18, 15, 1, -18 }, // '/' + { 271, 17, 17, 20, 1, -17 }, // '0' + { 308, 8, 17, 10, -1, -17 }, // '1' + { 325, 17, 17, 20, 1, -17 }, // '2' + { 362, 17, 17, 20, 1, -17 }, // '3' + { 399, 17, 17, 20, 1, -17 }, // '4' + { 436, 17, 17, 20, 1, -17 }, // '5' + { 473, 17, 17, 20, 1, -17 }, // '6' + { 510, 15, 17, 17, 0, -17 }, // '7' + { 542, 17, 17, 20, 1, -17 }, // '8' + { 579, 17, 17, 20, 1, -17 }, // '9' + { 616, 2, 14, 6, 1, -14 }, // ':' + { 620, 2, 18, 5, 1, -14 }, // ';' + { 625, 10, 14, 13, 1, -14 }, // '<' + { 643, 12, 7, 15, 1, -11 }, // '=' + { 654, 10, 14, 12, 1, -14 }, // '>' + { 672, 15, 17, 18, 1, -17 }, // '?' + { 704, 17, 17, 20, 1, -17 }, // '@' + { 741, 17, 17, 20, 1, -17 }, // 'A' + { 778, 17, 17, 20, 1, -17 }, // 'B' + { 815, 17, 17, 20, 1, -17 }, // 'C' + { 852, 17, 17, 20, 1, -17 }, // 'D' + { 889, 16, 17, 19, 1, -17 }, // 'E' + { 923, 16, 17, 19, 1, -17 }, // 'F' + { 957, 17, 17, 20, 1, -17 }, // 'G' + { 994, 18, 17, 21, 1, -17 }, // 'H' + { 1033, 2, 17, 6, 1, -17 }, // 'I' + { 1038, 17, 17, 20, 1, -17 }, // 'J' + { 1075, 17, 17, 20, 1, -17 }, // 'K' + { 1112, 18, 17, 20, 1, -17 }, // 'L' + { 1151, 20, 17, 23, 1, -17 }, // 'M' + { 1194, 17, 17, 20, 1, -17 }, // 'N' + { 1231, 17, 17, 20, 1, -17 }, // 'O' + { 1268, 17, 17, 20, 1, -17 }, // 'P' + { 1305, 20, 17, 22, 1, -17 }, // 'Q' + { 1348, 17, 17, 20, 1, -17 }, // 'R' + { 1385, 17, 17, 20, 1, -17 }, // 'S' + { 1422, 17, 17, 20, 1, -17 }, // 'T' + { 1459, 17, 17, 20, 1, -17 }, // 'U' + { 1496, 24, 17, 25, 0, -17 }, // 'V' + { 1547, 28, 17, 29, 0, -17 }, // 'W' + { 1607, 18, 17, 20, 1, -17 }, // 'X' + { 1646, 18, 17, 20, 0, -17 }, // 'Y' + { 1685, 17, 17, 20, 1, -17 }, // 'Z' + { 1722, 4, 17, 7, 1, -17 }, // '[' + { 1731, 12, 18, 15, 1, -18 }, // '\' + { 1758, 4, 17, 8, 1, -17 }, // ']' + { 1767, 1, 1, 1, 0, 0 }, // '^' + { 1768, 17, 2, 20, 1, 0 }, // '_' + { 1773, 4, 3, 6, 0, -24 }, // '`' + { 1775, 14, 14, 17, 1, -14 }, // 'a' + { 1800, 14, 19, 17, 1, -19 }, // 'b' + { 1834, 14, 14, 17, 1, -14 }, // 'c' + { 1859, 14, 19, 17, 1, -19 }, // 'd' + { 1893, 14, 14, 17, 1, -14 }, // 'e' + { 1918, 8, 19, 11, 1, -19 }, // 'f' + { 1937, 14, 20, 17, 1, -14 }, // 'g' + { 1972, 14, 19, 17, 1, -19 }, // 'h' + { 2006, 2, 19, 6, 1, -19 }, // 'i' + { 2011, 9, 25, 7, -4, -19 }, // 'j' + { 2040, 14, 19, 16, 1, -19 }, // 'k' + { 2074, 6, 19, 8, 1, -19 }, // 'l' + { 2089, 22, 14, 25, 1, -14 }, // 'm' + { 2128, 14, 14, 17, 1, -14 }, // 'n' + { 2153, 14, 14, 17, 1, -14 }, // 'o' + { 2178, 14, 20, 17, 1, -14 }, // 'p' + { 2213, 14, 20, 17, 1, -14 }, // 'q' + { 2248, 11, 14, 13, 1, -14 }, // 'r' + { 2268, 14, 14, 17, 1, -14 }, // 's' + { 2293, 8, 19, 11, 1, -19 }, // 't' + { 2312, 14, 14, 17, 1, -14 }, // 'u' + { 2337, 19, 14, 20, 0, -14 }, // 'v' + { 2371, 26, 14, 27, 0, -14 }, // 'w' + { 2417, 15, 14, 18, 1, -14 }, // 'x' + { 2444, 14, 20, 17, 1, -14 }, // 'y' + { 2479, 14, 14, 17, 1, -14 }, // 'z' + { 2504, 5, 17, 8, 1, -17 }, // '{' + { 2515, 2, 23, 6, 1, -20 }, // '|' + { 2521, 5, 17, 8, 1, -17 } // '}' +}; +const GFXfont Orbitron_Light_24 PROGMEM = { +(uint8_t *)Orbitron_Light_24Bitmaps,(GFXglyph *)Orbitron_Light_24Glyphs,0x20, 0x7D, 24}; diff --git a/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_32.h b/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_32.h new file mode 100644 index 0000000..5cf3c6b --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Custom/Orbitron_Light_32.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Orbitron_Light_32Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x3F, // '!' + 0xE7,0xE7,0xE7,0xE7, // '"' + 0x00,0x70,0x0E,0x00,0x60,0x0C,0x00,0xE0,0x1C,0x00,0xE0,0x1C,0x00,0xC0,0x18,0x01,0xC0,0x38,0x7F,0xFF,0xFF,0x7F,0xFF,0xFF,0x03,0x80,0x70,0x03,0x80,0x70,0x03,0x00,0x60,0x07,0x00,0xE0,0x07,0x00,0xE0,0x06,0x00,0xE0,0x06,0x00,0xC0,0x0E,0x01,0xC0,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0x1C,0x03,0x80,0x18,0x03,0x80,0x38,0x03,0x00,0x38,0x07,0x00,0x38,0x07,0x00,0x30,0x06,0x00, // '#' + 0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x01,0xFF,0xFF,0xC7,0xFF,0xFF,0xDC,0x07,0x01,0xF8,0x0E,0x03,0xF0,0x1C,0x07,0xE0,0x38,0x01,0xC0,0x70,0x03,0x80,0xE0,0x07,0x01,0xC0,0x0E,0x03,0x80,0x1C,0x07,0x00,0x1F,0xFF,0xFE,0x1F,0xFF,0xFE,0x00,0x38,0x0E,0x00,0x70,0x1C,0x00,0xE0,0x38,0x01,0xC0,0x70,0x03,0x80,0xE0,0x07,0x01,0xF8,0x0E,0x03,0xF0,0x1C,0x07,0xE0,0x38,0x0E,0xFF,0xFF,0xF8,0xFF,0xFF,0xE0,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00, // '$' + 0x00,0x00,0x00,0x03,0xF8,0x00,0x04,0x7F,0xC0,0x00,0xCC,0x06,0x00,0x1C,0xC0,0x60,0x03,0xCC,0x06,0x00,0x78,0xC0,0x60,0x0F,0x0C,0x06,0x03,0xC0,0xC0,0x60,0x78,0x0C,0x06,0x0F,0x00,0x7F,0xC1,0xE0,0x03,0xF8,0x3C,0x00,0x00,0x07,0x80,0x00,0x00,0xF0,0x00,0x00,0x1E,0x1F,0xC0,0x07,0xC3,0xFE,0x00,0xF0,0x60,0x30,0x1E,0x06,0x03,0x03,0xC0,0x60,0x30,0x78,0x06,0x03,0x0F,0x00,0x60,0x31,0xE0,0x06,0x03,0x1C,0x00,0x60,0x31,0x80,0x03,0xFE,0x00,0x00,0x1F,0xC0, // '%' + 0x1F,0xFF,0xF0,0x03,0xFF,0xFF,0x80,0x70,0x00,0x1C,0x07,0x00,0x01,0xC0,0x70,0x00,0x1C,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x07,0x78,0x00,0x00,0xE3,0xE0,0x00,0x0E,0x0F,0x80,0xE0,0xE0,0x3C,0x0E,0x0E,0x00,0xF0,0xE0,0xE0,0x07,0xCE,0x0E,0x00,0x1E,0xE0,0xE0,0x00,0x7E,0x0E,0x00,0x01,0xF0,0xE0,0x00,0x0F,0x8E,0x00,0x00,0xFE,0x7F,0xFF,0xFC,0x73,0xFF,0xFF,0x81, // '&' + 0xFF,0xF0, // ''' + 0x3B,0xF9,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x71,0xE7, // '(' + 0xE7,0x8E,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9F,0xDC, // ')' + 0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x27,0x39,0xCF,0xFF,0x8F,0xFE,0x03,0xE0,0x0F,0xE0,0x1D,0xC0,0x79,0xC1,0xE3,0xC1,0x83,0x00,0x00,0x00, // '*' + 0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0xFF,0xFF,0xFF,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00, // '+' + 0xFF,0xFF,0xA0, // ',' + 0xFF,0xFF,0xFF, // '-' + 0xFC, // '.' + 0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x03,0x00,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x70,0x00,0xE0,0x00,0xC0,0x00,0x80,0x00,0x00,0x00, // '/' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x7F,0x00,0x01,0xFE,0x00,0x07,0xFC,0x00,0x1F,0xF8,0x00,0x7B,0xF0,0x01,0xE7,0xE0,0x07,0x8F,0xC0,0x1E,0x1F,0x80,0x78,0x3F,0x01,0xE0,0x7E,0x07,0x80,0xFC,0x1E,0x01,0xF8,0x78,0x03,0xF1,0xE0,0x07,0xE7,0x80,0x0F,0xDE,0x00,0x1F,0xF8,0x00,0x3F,0xE0,0x00,0x7F,0x80,0x00,0xFE,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '0' + 0x03,0xC1,0xF0,0xFC,0x7F,0x3D,0xCE,0x77,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07,0x01,0xC0,0x70,0x1C,0x07, // '1' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x73,0xFF,0xFF,0xCF,0xFF,0xFF,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // '2' + 0x3F,0xFF,0xF0,0xFF,0xFF,0xF3,0x80,0x00,0x77,0x00,0x00,0xEE,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x3F,0xFF,0xE0,0x7F,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '3' + 0x00,0x01,0xE0,0x00,0x0F,0x80,0x00,0x7E,0x00,0x03,0xF8,0x00,0x1F,0xE0,0x00,0xFB,0x80,0x07,0xCE,0x00,0x3E,0x38,0x01,0xF0,0xE0,0x0F,0x83,0x80,0x78,0x0E,0x03,0xC0,0x38,0x1E,0x00,0xE0,0xF0,0x03,0x87,0x80,0x0E,0x3C,0x00,0x38,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x38, // '4' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0xFF,0xFF,0xCF,0xFF,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '5' + 0x3F,0xFF,0xE0,0xFF,0xFF,0xC3,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0xFF,0xFF,0xCF,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '6' + 0xFF,0xFF,0xCF,0xFF,0xFE,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x70,0x00,0x07, // '7' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3B,0xFF,0xFF,0xE7,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '8' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x77,0xFF,0xFF,0xE7,0xFF,0xFF,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // '9' + 0xFC,0x00,0x00,0x00,0x00,0x00,0x1F,0x80, // ':' + 0xFC,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xA0, // ';' + 0x00,0x08,0x00,0xC0,0x1E,0x03,0xF0,0x7E,0x07,0xC0,0xF8,0x1F,0x80,0xF0,0x07,0x00,0x3E,0x00,0xF8,0x01,0xF0,0x07,0xE0,0x0F,0xC0,0x1F,0x00,0x38,0x00,0xC0,0x00, // '<' + 0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80, // '=' + 0x80,0x06,0x00,0x3C,0x01,0xF8,0x03,0xE0,0x07,0xC0,0x1F,0x80,0x3F,0x00,0x78,0x01,0xC0,0x3E,0x03,0xE0,0x7C,0x0F,0xC0,0xF8,0x1F,0x00,0xF0,0x06,0x00,0x00,0x00, // '>' + 0xFF,0xFF,0xE7,0xFF,0xFF,0x80,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x3F,0xFF,0x03,0xFF,0xF0,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x01,0xC0,0x00, // '?' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x7F,0x07,0xE1,0xFF,0x0F,0xC6,0x03,0x1F,0x8C,0x06,0x3F,0x18,0x0C,0x7E,0x30,0x18,0xFC,0x60,0x31,0xF8,0xC0,0x63,0xF1,0x80,0xC7,0xE1,0xFF,0xFF,0xC1,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1F,0xFF,0xFF,0x9F,0xFF,0xFF, // '@' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07, // 'A' + 0xFF,0xFF,0xF1,0xFF,0xFF,0xF3,0x80,0x00,0x77,0x00,0x00,0xEE,0x00,0x01,0xDC,0x00,0x03,0xB8,0x00,0x07,0x70,0x00,0x0E,0xE0,0x00,0x1D,0xC0,0x00,0x3B,0x80,0x00,0x77,0xFF,0xFF,0xEF,0xFF,0xFF,0xDC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xFF,0xFF,0xFF,0x7F,0xFF,0xFC, // 'B' + 0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x1F,0xFF,0xFF,0x9F,0xFF,0xFF, // 'C' + 0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xFF,0xFF,0xFF,0x7F,0xFF,0xFC, // 'D' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xFF,0xFF,0x8F,0xFF,0xFC,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF, // 'E' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xFF,0xFF,0x8F,0xFF,0xFC,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x38,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x00, // 'F' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x1F,0xFC,0x00,0x3F,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'G' + 0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07,0xE0,0x00,0x07, // 'H' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // 'I' + 0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'J' + 0xE0,0x00,0x1D,0xC0,0x00,0x73,0x80,0x01,0xC7,0x00,0x07,0x8E,0x00,0x1E,0x1C,0x00,0x38,0x38,0x00,0xE0,0x70,0x03,0x80,0xE0,0x0F,0x01,0xC0,0x1C,0x03,0x80,0x70,0x07,0xFF,0xC0,0x0F,0xFF,0x80,0x1C,0x03,0x80,0x38,0x03,0x80,0x70,0x07,0x00,0xE0,0x07,0x01,0xC0,0x07,0x03,0x80,0x07,0x07,0x00,0x0F,0x0E,0x00,0x0F,0x1C,0x00,0x0E,0x38,0x00,0x0E,0x70,0x00,0x0E, // 'K' + 0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // 'L' + 0xF0,0x00,0x03,0xFE,0x00,0x01,0xFF,0xC0,0x00,0xFF,0xF8,0x00,0x7F,0xEE,0x00,0x1D,0xF9,0xC0,0x0E,0x7E,0x38,0x07,0x1F,0x8F,0x03,0xC7,0xE1,0xC0,0xE1,0xF8,0x38,0x70,0x7E,0x07,0x38,0x1F,0x81,0xFE,0x07,0xE0,0x3F,0x01,0xF8,0x07,0x80,0x7E,0x00,0xC0,0x1F,0x80,0x20,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00,0x1F,0x80,0x00,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x7E,0x00,0x00,0x1F,0x80,0x00,0x07, // 'M' + 0xF0,0x00,0x0F,0xF0,0x00,0x1F,0xF0,0x00,0x3F,0xF0,0x00,0x7E,0xE0,0x00,0xFC,0xE0,0x01,0xF8,0xE0,0x03,0xF1,0xE0,0x07,0xE1,0xC0,0x0F,0xC1,0xC0,0x1F,0x81,0xC0,0x3F,0x03,0xC0,0x7E,0x03,0xC0,0xFC,0x03,0x81,0xF8,0x03,0x83,0xF0,0x03,0x87,0xE0,0x07,0x8F,0xC0,0x07,0x1F,0x80,0x07,0x3F,0x00,0x07,0x7E,0x00,0x0F,0xFC,0x00,0x0F,0xF8,0x00,0x0F,0xF0,0x00,0x0F, // 'N' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'O' + 0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00, // 'P' + 0x3F,0xFF,0xF8,0x1F,0xFF,0xFF,0x0E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x8E,0x00,0x00,0xE3,0x80,0x00,0x38,0xE0,0x00,0x0E,0x38,0x00,0x03,0x87,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF, // 'Q' + 0xFF,0xFF,0xF9,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0x70,0x03,0x80,0xE0,0x07,0x81,0xC0,0x07,0x83,0x80,0x07,0x07,0x00,0x07,0x0E,0x00,0x0F,0x1C,0x00,0x0F,0x38,0x00,0x0F,0x70,0x00,0x0E, // 'R' + 0x3F,0xFF,0xF8,0xFF,0xFF,0xFB,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,0xFF,0xFF,0xC3,0xFF,0xFF,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'S' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00, // 'T' + 0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xF8,0x00,0x03,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0x7E,0x00,0x00,0xFC,0x00,0x01,0xDF,0xFF,0xFF,0x1F,0xFF,0xFC, // 'U' + 0xE0,0x00,0x00,0x3D,0xC0,0x00,0x00,0xE3,0x80,0x00,0x07,0x0E,0x00,0x00,0x1C,0x1C,0x00,0x00,0xE0,0x70,0x00,0x03,0x80,0xE0,0x00,0x1C,0x03,0x80,0x00,0x70,0x07,0x00,0x03,0x80,0x1C,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x70,0x03,0x80,0x01,0xC0,0x0E,0x00,0x03,0x80,0x70,0x00,0x0E,0x01,0xC0,0x00,0x1C,0x0E,0x00,0x00,0x70,0x38,0x00,0x00,0xE1,0xC0,0x00,0x03,0x87,0x00,0x00,0x07,0x38,0x00,0x00,0x0D,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xE0,0x00, // 'V' + 0xE0,0x00,0xF0,0x00,0x76,0x00,0x0F,0x00,0x0E,0x70,0x01,0xF0,0x00,0xE7,0x00,0x1F,0x80,0x0E,0x30,0x01,0xF8,0x01,0xC3,0x80,0x39,0x80,0x1C,0x38,0x03,0x9C,0x01,0x81,0x80,0x39,0xC0,0x38,0x1C,0x07,0x0C,0x03,0x81,0xC0,0x70,0xE0,0x30,0x0E,0x06,0x0E,0x07,0x00,0xE0,0xE0,0x70,0x70,0x0E,0x0E,0x07,0x06,0x00,0x70,0xC0,0x70,0xE0,0x07,0x1C,0x03,0x8E,0x00,0x31,0xC0,0x38,0xC0,0x03,0x98,0x03,0x9C,0x00,0x3B,0x80,0x1D,0xC0,0x01,0xB8,0x01,0xF8,0x00,0x1F,0x00,0x0F,0x80,0x01,0xF0,0x00,0xF8,0x00,0x0F,0x00,0x0F,0x00,0x00,0xE0,0x00,0x70,0x00,0x0E,0x00,0x07,0x00, // 'W' + 0x70,0x00,0x1E,0x38,0x00,0x1C,0x3C,0x00,0x38,0x1E,0x00,0x70,0x0E,0x00,0xF0,0x07,0x01,0xE0,0x03,0x81,0xC0,0x01,0xC3,0x80,0x01,0xE7,0x00,0x00,0xEF,0x00,0x00,0x7E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7E,0x00,0x00,0xFF,0x00,0x01,0xE7,0x00,0x01,0xC3,0x80,0x03,0x81,0xC0,0x07,0x01,0xE0,0x0E,0x00,0xF0,0x1E,0x00,0x70,0x3C,0x00,0x38,0x38,0x00,0x1C,0x70,0x00,0x1E, // 'X' + 0x70,0x00,0x07,0x3C,0x00,0x07,0x8E,0x00,0x03,0x83,0x80,0x03,0x80,0xE0,0x03,0x80,0x78,0x03,0xC0,0x1C,0x01,0xC0,0x07,0x01,0xC0,0x03,0xC1,0xE0,0x00,0xF1,0xE0,0x00,0x3D,0xE0,0x00,0x0E,0xE0,0x00,0x07,0xF0,0x00,0x01,0xF0,0x00,0x00,0x70,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0x80,0x00,0x01,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0x38,0x00, // 'Y' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x38,0x00,0x01,0xF0,0x00,0x07,0xC0,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x78,0x00,0x03,0xE0,0x00,0x0F,0x80,0x00,0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, // 'Z' + 0xFF,0xF9,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0xFF, // '[' + 0x00,0x00,0x80,0x00,0xC0,0x00,0xE0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x07,0x00,0x03,0x00,0x01,0x00,0x00, // '\' + 0xFF,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9C,0xE7,0x39,0xCE,0x73,0x9F,0xFF, // ']' + 0x00, // '^' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC, // '_' + 0xEE,0x67, // '`' + 0xFF,0xFF,0x9F,0xFF,0xF8,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80, // 'a' + 0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0xFF,0xE7,0xFF,0xFE,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0xFF,0xFE,0xFF,0xFF,0x80, // 'b' + 0x3F,0xFF,0xEF,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xFC,0xFF,0xFF,0x80, // 'c' + 0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xCF,0xFF,0xFB,0xFF,0xFF,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3B,0xFF,0xFF,0x3F,0xFF,0xE0, // 'd' + 0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x0F,0xFF,0xFC,0xFF,0xFF,0x80, // 'e' + 0x3F,0xEF,0xFF,0x80,0x70,0x0E,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x00, // 'f' + 0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE1,0xFF,0xF8,0x3F,0xFE,0x00, // 'g' + 0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0xFF,0xE7,0xFF,0xFE,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xE0, // 'h' + 0xFC,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0, // 'i' + 0x00,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x70,0x07,0x00,0x7F,0xFE,0xFF,0xC0, // 'j' + 0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x77,0x00,0x1C,0xE0,0x07,0x9C,0x01,0xE3,0x80,0x78,0x70,0x1E,0x0E,0x07,0x81,0xC0,0xE0,0x3F,0xF8,0x07,0xFF,0x00,0xE0,0x70,0x1C,0x0F,0x03,0x80,0xE0,0x70,0x0E,0x0E,0x00,0xE1,0xC0,0x0E,0x38,0x01,0xE7,0x00,0x1E,0xE0,0x01,0xC0, // 'k' + 0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x3F,0x3E, // 'l' + 0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xB8,0x01,0xC0,0x0F,0xC0,0x0E,0x00,0x7E,0x00,0x70,0x03,0xF0,0x03,0x80,0x1F,0x80,0x1C,0x00,0xFC,0x00,0xE0,0x07,0xE0,0x07,0x00,0x3F,0x00,0x38,0x01,0xF8,0x01,0xC0,0x0F,0xC0,0x0E,0x00,0x7E,0x00,0x70,0x03,0xF0,0x03,0x80,0x1F,0x80,0x1C,0x00,0xFC,0x00,0xE0,0x07,0xE0,0x07,0x00,0x3F,0x00,0x38,0x01,0xF8,0x01,0xC0,0x0E, // 'm' + 0xFF,0xFF,0x9F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0x80, // 'n' + 0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 'o' + 0xFF,0xFF,0x9F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFF,0xFF,0xFB,0xFF,0xFE,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x00, // 'p' + 0x3F,0xFF,0xEF,0xFF,0xFF,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80, // 'q' + 0x3F,0xFE,0xFF,0xFF,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0x80,0x00, // 'r' + 0x3F,0xFF,0x8F,0xFF,0xFB,0x80,0x03,0xF0,0x00,0x7E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0x7F,0xFF,0x87,0xFF,0xF8,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 's' + 0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x07,0x00,0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xC0,0x38,0x03,0xFF,0x3F,0xE0, // 't' + 0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xF8,0xFF,0xFE,0x00, // 'u' + 0x70,0x00,0x07,0x3C,0x00,0x07,0x0E,0x00,0x03,0x83,0x80,0x03,0x81,0xC0,0x01,0xC0,0x70,0x01,0xC0,0x38,0x00,0xE0,0x0E,0x00,0xE0,0x07,0x00,0x70,0x01,0xC0,0x70,0x00,0xE0,0x38,0x00,0x38,0x38,0x00,0x1C,0x38,0x00,0x07,0x1C,0x00,0x03,0x9C,0x00,0x00,0xEE,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x07,0x00,0x00, // 'v' + 0xE0,0x03,0xC0,0x07,0x38,0x01,0xF0,0x03,0x9C,0x01,0xF8,0x01,0xCE,0x00,0xFE,0x01,0xC3,0x80,0x77,0x00,0xE1,0xC0,0x73,0x80,0x60,0x70,0x38,0xE0,0x70,0x38,0x3C,0x70,0x38,0x1C,0x1C,0x1C,0x38,0x07,0x0E,0x0E,0x1C,0x03,0x8E,0x07,0x8E,0x00,0xE7,0x01,0xCE,0x00,0x77,0x00,0xF7,0x00,0x3B,0x80,0x3B,0x80,0x0F,0xC0,0x1F,0x80,0x07,0xC0,0x07,0xC0,0x03,0xE0,0x03,0xC0,0x00,0xE0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00, // 'w' + 0x70,0x00,0xE3,0x80,0x1C,0x1C,0x03,0x81,0xE0,0x78,0x0F,0x0F,0x00,0x79,0xE0,0x03,0x9C,0x00,0x1F,0x80,0x00,0xF0,0x00,0x0F,0x00,0x01,0xF8,0x00,0x3F,0x80,0x03,0x9C,0x00,0x70,0xE0,0x0F,0x0F,0x01,0xE0,0x78,0x3C,0x03,0x83,0x80,0x1C,0x70,0x00,0xE0, // 'x' + 0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00,0x7E,0x00,0x0F,0xC0,0x01,0xF8,0x00,0x3F,0x00,0x07,0xE0,0x00,0xEF,0xFF,0xFC,0xFF,0xFF,0x80,0x00,0x70,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE1,0xFF,0xF8,0x3F,0xFE,0x00, // 'y' + 0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x03,0x80,0x01,0xF0,0x00,0x78,0x00,0x1E,0x00,0x07,0x80,0x01,0xE0,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x07,0xC0,0x00,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x80, // 'z' + 0x0E,0x3C,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0x73,0xC7,0x0E,0x1E,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x07,0x87, // '{' + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8, // '|' + 0xE3,0xC3,0x8E,0x38,0xE3,0x8E,0x38,0xE1,0xC3,0x0C,0x73,0x8E,0x38,0xE3,0x8E,0x38,0xEF,0x38 // '}' +}; +const GFXglyph Orbitron_Light_32Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 10, 0, 0 }, // ' ' + { 1, 3, 24, 9, 2, -24 }, // '!' + { 10, 8, 4, 13, 2, -24 }, // '"' + { 14, 24, 24, 27, 1, -24 }, // '#' + { 86, 23, 31, 26, 1, -27 }, // '$' + { 176, 28, 25, 32, 2, -25 }, // '%' + { 264, 28, 24, 31, 2, -24 }, // '&' + { 348, 3, 4, 9, 2, -24 }, // ''' + { 350, 5, 24, 10, 2, -24 }, // '(' + { 365, 5, 24, 10, 2, -24 }, // ')' + { 380, 15, 14, 17, 0, -24 }, // '*' + { 407, 12, 13, 15, 1, -16 }, // '+' + { 427, 3, 7, 8, 2, -3 }, // ',' + { 430, 12, 2, 17, 2, -10 }, // '-' + { 433, 3, 2, 8, 2, -2 }, // '.' + { 434, 16, 24, 19, 1, -24 }, // '/' + { 482, 23, 24, 28, 2, -24 }, // '0' + { 551, 10, 24, 14, 0, -24 }, // '1' + { 581, 23, 24, 27, 2, -24 }, // '2' + { 650, 23, 24, 27, 2, -24 }, // '3' + { 719, 22, 24, 25, 1, -24 }, // '4' + { 785, 23, 24, 27, 2, -24 }, // '5' + { 854, 23, 24, 27, 2, -24 }, // '6' + { 923, 20, 24, 23, 0, -24 }, // '7' + { 983, 23, 24, 28, 2, -24 }, // '8' + { 1052, 23, 24, 28, 2, -24 }, // '9' + { 1121, 3, 19, 8, 2, -19 }, // ':' + { 1129, 3, 23, 8, 2, -19 }, // ';' + { 1138, 13, 19, 17, 1, -19 }, // '<' + { 1169, 17, 9, 22, 2, -14 }, // '=' + { 1189, 13, 19, 17, 2, -19 }, // '>' + { 1220, 21, 24, 24, 1, -24 }, // '?' + { 1283, 23, 24, 28, 2, -24 }, // '@' + { 1352, 23, 24, 28, 2, -24 }, // 'A' + { 1421, 23, 24, 28, 2, -24 }, // 'B' + { 1490, 23, 24, 28, 2, -24 }, // 'C' + { 1559, 23, 24, 28, 2, -24 }, // 'D' + { 1628, 21, 24, 26, 2, -24 }, // 'E' + { 1691, 21, 24, 25, 2, -24 }, // 'F' + { 1754, 23, 24, 28, 2, -24 }, // 'G' + { 1823, 24, 24, 29, 2, -24 }, // 'H' + { 1895, 3, 24, 9, 2, -24 }, // 'I' + { 1904, 23, 24, 27, 1, -24 }, // 'J' + { 1973, 23, 24, 27, 2, -24 }, // 'K' + { 2042, 23, 24, 27, 2, -24 }, // 'L' + { 2111, 26, 24, 31, 2, -24 }, // 'M' + { 2189, 23, 24, 28, 2, -24 }, // 'N' + { 2258, 23, 24, 28, 2, -24 }, // 'O' + { 2327, 23, 24, 27, 2, -24 }, // 'P' + { 2396, 26, 24, 30, 2, -24 }, // 'Q' + { 2474, 23, 24, 28, 2, -24 }, // 'R' + { 2543, 23, 24, 28, 2, -24 }, // 'S' + { 2612, 23, 24, 26, 1, -24 }, // 'T' + { 2681, 23, 24, 28, 2, -24 }, // 'U' + { 2750, 30, 24, 33, 1, -24 }, // 'V' + { 2840, 36, 24, 39, 1, -24 }, // 'W' + { 2948, 24, 24, 27, 1, -24 }, // 'X' + { 3020, 25, 24, 27, 0, -24 }, // 'Y' + { 3095, 23, 24, 28, 2, -24 }, // 'Z' + { 3164, 5, 24, 10, 2, -24 }, // '[' + { 3179, 16, 24, 19, 1, -24 }, // '\' + { 3227, 5, 24, 10, 2, -24 }, // ']' + { 3242, 1, 1, 1, 0, 0 }, // '^' + { 3243, 23, 2, 27, 2, 1 }, // '_' + { 3249, 4, 4, 8, 1, -33 }, // '`' + { 3251, 19, 19, 24, 2, -19 }, // 'a' + { 3297, 19, 25, 23, 2, -25 }, // 'b' + { 3357, 19, 19, 24, 2, -19 }, // 'c' + { 3403, 19, 25, 23, 1, -25 }, // 'd' + { 3463, 19, 19, 24, 2, -19 }, // 'e' + { 3509, 11, 25, 14, 2, -25 }, // 'f' + { 3544, 19, 27, 23, 1, -19 }, // 'g' + { 3609, 19, 25, 23, 2, -25 }, // 'h' + { 3669, 3, 25, 8, 2, -25 }, // 'i' + { 3679, 12, 33, 9, -6, -25 }, // 'j' + { 3729, 19, 25, 22, 2, -25 }, // 'k' + { 3789, 7, 25, 11, 2, -25 }, // 'l' + { 3811, 29, 19, 33, 2, -19 }, // 'm' + { 3880, 19, 19, 24, 2, -19 }, // 'n' + { 3926, 19, 19, 24, 2, -19 }, // 'o' + { 3972, 19, 27, 23, 2, -19 }, // 'p' + { 4037, 19, 27, 23, 1, -19 }, // 'q' + { 4102, 15, 19, 18, 2, -19 }, // 'r' + { 4138, 19, 19, 24, 2, -19 }, // 's' + { 4184, 11, 25, 14, 2, -25 }, // 't' + { 4219, 19, 19, 24, 2, -19 }, // 'u' + { 4265, 25, 19, 26, 0, -19 }, // 'v' + { 4325, 33, 19, 35, 1, -19 }, // 'w' + { 4404, 20, 19, 23, 1, -19 }, // 'x' + { 4452, 19, 27, 23, 1, -19 }, // 'y' + { 4517, 19, 19, 24, 2, -19 }, // 'z' + { 4563, 7, 24, 10, 0, -24 }, // '{' + { 4584, 3, 31, 8, 2, -27 }, // '|' + { 4596, 6, 24, 10, 2, -24 } // '}' +}; +const GFXfont Orbitron_Light_32 PROGMEM = { +(uint8_t *)Orbitron_Light_32Bitmaps,(GFXglyph *)Orbitron_Light_32Glyphs,0x20, 0x7D, 32}; diff --git a/libraries/TFT_eSPI/Fonts/Custom/Roboto_Thin_24.h b/libraries/TFT_eSPI/Fonts/Custom/Roboto_Thin_24.h new file mode 100644 index 0000000..aea72e8 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Custom/Roboto_Thin_24.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Roboto_Thin_24Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x49,0x24,0x92,0x49,0x20,0x00,0x40, // '!' + 0xB6,0xDA, // '"' + 0x02,0x10,0x10,0x80,0x42,0x01,0x08,0x04,0x21,0xFF,0xF0,0x44,0x02,0x10,0x08,0x40,0x21,0x00,0x84,0x1F,0xFE,0x10,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80, // '#' + 0x04,0x01,0x00,0x40,0xFC,0x61,0xB0,0x38,0x06,0x01,0x80,0x10,0x02,0x00,0x60,0x07,0x00,0x20,0x06,0x01,0x80,0x70,0x36,0x18,0x7C,0x04,0x01,0x00,0x40, // '$' + 0x38,0x01,0x8C,0x02,0x08,0x44,0x11,0x08,0x22,0x18,0xC8,0x0F,0x10,0x00,0x40,0x01,0x00,0x02,0x78,0x09,0x90,0x22,0x10,0x44,0x21,0x08,0x42,0x10,0x80,0x32,0x00,0x3C, // '%' + 0x1E,0x01,0x08,0x10,0x20,0x81,0x04,0x08,0x20,0x80,0x88,0x03,0x80,0x18,0x01,0x20,0x10,0x85,0x02,0x28,0x0A,0x40,0x33,0x01,0x8C,0x14,0x3F,0x10, // '&' + 0xF8, // ''' + 0x00,0x21,0x04,0x21,0x04,0x10,0x42,0x08,0x20,0x82,0x08,0x20,0x82,0x04,0x10,0x40,0x82,0x04,0x08,0x00, // '(' + 0x01,0x02,0x08,0x10,0x40,0x82,0x08,0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x82,0x08,0x41,0x08,0x40,0x00, // ')' + 0x04,0x00,0x80,0x10,0x22,0x23,0xF8,0x08,0x02,0x80,0x88,0x20,0x80,0x00, // '*' + 0x02,0x00,0x10,0x00,0x80,0x04,0x00,0x20,0x3F,0xFC,0x08,0x00,0x40,0x02,0x00,0x10,0x00,0x80,0x04,0x00, // '+' + 0x55,0x80, // ',' + 0x7C, // '-' + 0x40, // '.' + 0x01,0x00,0x80,0x80,0x40,0x20,0x20,0x10,0x10,0x08,0x04,0x04,0x02,0x01,0x01,0x00,0x80,0x80,0x40,0x20,0x20,0x00, // '/' + 0x1E,0x08,0x44,0x0B,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x70,0x34,0x08,0x84,0x1E,0x00, // '0' + 0x0D,0xD8,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04, // '1' + 0x1F,0x0C,0x31,0x03,0x40,0x28,0x04,0x00,0x80,0x20,0x04,0x01,0x00,0x40,0x10,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x7F,0xE0, // '2' + 0x1F,0x0C,0x31,0x03,0x40,0x28,0x04,0x00,0x80,0x20,0x0C,0x1E,0x00,0x30,0x01,0x00,0x18,0x03,0x00,0x50,0x1B,0x06,0x1F,0x00, // '3' + 0x00,0xC0,0x0A,0x00,0x50,0x04,0x80,0x44,0x02,0x20,0x21,0x02,0x08,0x20,0x41,0x02,0x10,0x11,0xFF,0xF0,0x04,0x00,0x20,0x01,0x00,0x08,0x00,0x40, // '4' + 0x3F,0xE4,0x00,0x80,0x20,0x04,0x00,0x80,0x13,0xC3,0x86,0x00,0x40,0x04,0x00,0x80,0x10,0x02,0x80,0x50,0x11,0x06,0x1F,0x00, // '5' + 0x07,0x83,0x00,0x80,0x20,0x04,0x01,0x1E,0x2C,0x36,0x02,0x80,0x30,0x06,0x00,0xC0,0x18,0x03,0x80,0xD0,0x11,0x84,0x1F,0x00, // '6' + 0xFF,0xE0,0x04,0x01,0x00,0x20,0x08,0x01,0x00,0x40,0x08,0x02,0x00,0x40,0x08,0x02,0x00,0x40,0x10,0x02,0x00,0x80,0x10,0x00, // '7' + 0x1F,0x0C,0x1B,0x01,0xC0,0x18,0x03,0x00,0xD8,0x30,0xF8,0x31,0x88,0x0A,0x00,0xC0,0x18,0x03,0x00,0x50,0x13,0x06,0x1F,0x00, // '8' + 0x1F,0x04,0x11,0x01,0x60,0x18,0x03,0x00,0x60,0x0C,0x01,0x40,0x6C,0x14,0x7C,0x80,0x10,0x04,0x00,0x80,0x20,0x18,0x1C,0x00, // '9' + 0xC0,0x00,0x00,0xC0, // ':' + 0xC0,0x00,0x05,0x58, // ';' + 0x00,0x00,0x70,0x60,0x60,0x60,0x30,0x03,0x00,0x30,0x03,0x80,0x10, // '<' + 0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0, // '=' + 0x00,0x38,0x01,0x80,0x18,0x01,0x80,0x30,0x30,0x30,0x30,0x30,0x00, // '>' + 0x3C,0x42,0x81,0x81,0x81,0x01,0x01,0x02,0x04,0x08,0x10,0x10,0x10,0x00,0x00,0x00,0x18, // '?' + 0x01,0xF8,0x00,0xC0,0xC0,0x60,0x04,0x18,0x00,0x42,0x00,0x04,0x81,0xE0,0x90,0x42,0x0C,0x10,0x41,0x84,0x08,0x30,0x81,0x06,0x10,0x20,0xC2,0x04,0x18,0x41,0x03,0x08,0x20,0x61,0x04,0x12,0x11,0x46,0x43,0xC7,0x0C,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0xC0,0x80,0x07,0xE0,0x00, // '@' + 0x01,0x00,0x0C,0x00,0x30,0x01,0x20,0x04,0x80,0x21,0x00,0x84,0x02,0x10,0x10,0x20,0x40,0x82,0x02,0x0F,0xFC,0x20,0x11,0x00,0x24,0x00,0x90,0x02,0x80,0x04, // 'A' + 0xFE,0x10,0x32,0x03,0x40,0x28,0x05,0x00,0xA0,0x34,0x0C,0xFF,0x10,0x1A,0x01,0x40,0x18,0x03,0x00,0x60,0x1C,0x06,0xFF,0x00, // 'B' + 0x0F,0x81,0x83,0x18,0x04,0x80,0x28,0x01,0x40,0x02,0x00,0x10,0x00,0x80,0x04,0x00,0x20,0x01,0x00,0x08,0x01,0x20,0x09,0x80,0x46,0x0C,0x0F,0x80, // 'C' + 0xFF,0x08,0x18,0x80,0x48,0x02,0x80,0x28,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x28,0x02,0x80,0x48,0x18,0xFF,0x00, // 'D' + 0xFF,0xF0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xD0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xE0, // 'E' + 0xFF,0xF0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0xFF,0xD0,0x02,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0x80,0x00, // 'F' + 0x0F,0xC1,0x83,0x18,0x04,0x80,0x18,0x00,0xC0,0x02,0x00,0x10,0x00,0x80,0x04,0x0F,0xE0,0x03,0x00,0x1C,0x00,0xA0,0x05,0x80,0x26,0x06,0x0F,0xC0, // 'G' + 0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0xFF,0xF8,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x10, // 'H' + 0xFF,0xFF,0x80, // 'I' + 0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x00,0x40,0x10,0x04,0x01,0x80,0x60,0x1C,0x09,0x86,0x3E,0x00, // 'J' + 0x80,0x24,0x02,0x20,0x21,0x02,0x08,0x20,0x42,0x02,0x20,0x12,0x00,0xA8,0x06,0x20,0x20,0x81,0x02,0x08,0x10,0x40,0x42,0x01,0x10,0x04,0x80,0x10, // 'K' + 0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0xFF,0xC0, // 'L' + 0x80,0x03,0xC0,0x03,0xC0,0x05,0xA0,0x05,0xA0,0x05,0x90,0x09,0x90,0x09,0x90,0x11,0x88,0x11,0x88,0x21,0x84,0x21,0x84,0x21,0x84,0x41,0x82,0x41,0x82,0x81,0x81,0x81,0x81,0x01, // 'M' + 0x80,0x1C,0x01,0xA0,0x1A,0x01,0x90,0x19,0x01,0x88,0x18,0x41,0x84,0x18,0x21,0x81,0x18,0x11,0x80,0x98,0x09,0x80,0x58,0x03,0x80,0x10, // 'N' + 0x0F,0x81,0x83,0x18,0x0C,0x80,0x28,0x00,0xC0,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x00,0xA0,0x09,0x80,0xC6,0x0C,0x0F,0x80, // 'O' + 0xFF,0x10,0x1A,0x01,0x40,0x18,0x03,0x00,0x60,0x0C,0x03,0x80,0xDF,0xE2,0x00,0x40,0x08,0x01,0x00,0x20,0x04,0x00,0x80,0x00, // 'P' + 0x0F,0x81,0x83,0x18,0x0C,0x80,0x28,0x00,0xC0,0x06,0x00,0x30,0x01,0x80,0x0C,0x00,0x60,0x03,0x00,0x18,0x01,0x20,0x09,0x80,0x86,0x08,0x0F,0xC0,0x01,0x00,0x08,0x00,0x20, // 'Q' + 0xFF,0x08,0x0C,0x80,0x48,0x02,0x80,0x28,0x02,0x80,0x28,0x04,0x80,0xCF,0xF0,0x81,0x08,0x10,0x80,0x88,0x04,0x80,0x48,0x02,0x80,0x10, // 'R' + 0x1F,0x86,0x0C,0xC0,0x28,0x01,0x80,0x18,0x00,0x40,0x03,0x00,0x0E,0x00,0x1C,0x00,0x20,0x01,0x80,0x18,0x01,0x40,0x36,0x06,0x1F,0x80, // 'S' + 0x7F,0xFC,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00, // 'T' + 0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x01,0x80,0x18,0x03,0x40,0x23,0x0C,0x1F,0x80, // 'U' + 0x80,0x05,0x00,0x24,0x00,0x90,0x02,0x20,0x10,0x80,0x41,0x01,0x04,0x08,0x10,0x20,0x21,0x00,0x84,0x02,0x10,0x04,0x80,0x12,0x00,0x28,0x00,0xC0,0x01,0x00, // 'V' + 0x40,0x20,0x09,0x00,0xC0,0x24,0x05,0x01,0x10,0x14,0x04,0x20,0x48,0x10,0x81,0x20,0x42,0x08,0x82,0x08,0x21,0x08,0x10,0x84,0x20,0x44,0x11,0x01,0x10,0x44,0x02,0x40,0x90,0x0A,0x02,0x40,0x28,0x0A,0x00,0xA0,0x18,0x01,0x80,0x60,0x04,0x00,0x80, // 'W' + 0x40,0x08,0x80,0x42,0x01,0x04,0x08,0x08,0x40,0x11,0x00,0x48,0x00,0xC0,0x01,0x00,0x0C,0x00,0x48,0x02,0x10,0x08,0x40,0x40,0x82,0x01,0x10,0x02,0x40,0x08, // 'X' + 0x40,0x04,0x80,0x08,0x80,0x20,0x80,0x81,0x01,0x01,0x04,0x02,0x10,0x02,0x20,0x02,0x80,0x05,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00, // 'Y' + 0xFF,0xF0,0x01,0x00,0x08,0x00,0x80,0x08,0x00,0x40,0x04,0x00,0x40,0x04,0x00,0x20,0x02,0x00,0x20,0x02,0x00,0x10,0x01,0x00,0x10,0x00,0xFF,0xF0, // 'Z' + 0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF0, // '[' + 0x40,0x20,0x10,0x04,0x02,0x01,0x00,0x40,0x20,0x08,0x04,0x02,0x00,0x80,0x40,0x10,0x08,0x04,0x01,0x00,0x80,0x00, // '\' + 0xF1,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xF0, // ']' + 0x10,0x18,0x28,0x24,0x44,0x44,0x42,0x82,0x81, // '^' + 0x7F,0xE0, // '_' + 0x42,0x20, // '`' + 0x3F,0x0C,0x12,0x01,0x00,0x20,0x04,0x3F,0x98,0x16,0x02,0x80,0x50,0x0A,0x03,0x20,0xA3,0xE4, // 'a' + 0x80,0x20,0x08,0x02,0x00,0x80,0x27,0x8A,0x1B,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x07,0x02,0xA1,0xA7,0x80, // 'b' + 0x1F,0x08,0x64,0x0F,0x01,0x80,0x60,0x08,0x02,0x00,0x80,0x20,0x14,0x04,0x86,0x1F,0x00, // 'c' + 0x00,0x40,0x10,0x04,0x01,0x00,0x47,0x96,0x15,0x03,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x18,0x05,0x03,0x61,0x47,0x90, // 'd' + 0x1E,0x08,0x64,0x0A,0x01,0x80,0x7F,0xF8,0x02,0x00,0x80,0x30,0x04,0x00,0xC2,0x1F,0x00, // 'e' + 0x07,0x04,0x04,0x02,0x01,0x00,0x81,0xF8,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x00, // 'f' + 0x1E,0x58,0x54,0x0E,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x14,0x0D,0x85,0x1E,0x40,0x10,0x05,0x02,0x21,0x87,0x80, // 'g' + 0x80,0x40,0x20,0x10,0x08,0x04,0xF2,0x85,0x81,0xC0,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x40, // 'h' + 0x40,0x04,0x92,0x49,0x24,0x92,0x40, // 'i' + 0x08,0x00,0x00,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x13,0x80, // 'j' + 0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x28,0x12,0x08,0x8C,0x24,0x0A,0x03,0x40,0x88,0x21,0x08,0x22,0x08,0x81,0x20,0x20, // 'k' + 0xFF,0xFF,0xC0, // 'l' + 0x9E,0x1E,0x50,0x90,0xB0,0x30,0x38,0x10,0x18,0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x01,0x80,0x80,0xC0,0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x08, // 'm' + 0x9E,0x50,0xB0,0x38,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x18,0x08, // 'n' + 0x1F,0x06,0x31,0x01,0x60,0x38,0x03,0x00,0x60,0x0C,0x01,0x80,0x38,0x0D,0x01,0x10,0x41,0xF0, // 'o' + 0x9E,0x28,0x6C,0x0A,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x3C,0x0A,0x86,0x9E,0x20,0x08,0x02,0x00,0x80,0x20,0x00, // 'p' + 0x1E,0x58,0x54,0x0E,0x01,0x80,0x60,0x18,0x06,0x01,0x80,0x60,0x14,0x0D,0x85,0x1E,0x40,0x10,0x04,0x01,0x00,0x40,0x10, // 'q' + 0x9D,0x43,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x04,0x08,0x00, // 'r' + 0x3E,0x21,0xA0,0x30,0x18,0x02,0x00,0xF0,0x06,0x00,0xC0,0x60,0x28,0x23,0xE0, // 's' + 0x10,0x10,0x10,0x10,0x7E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x0E, // 't' + 0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x68,0x53,0xC8, // 'u' + 0x80,0x28,0x09,0x01,0x10,0x22,0x08,0x41,0x04,0x20,0x88,0x11,0x01,0x40,0x28,0x03,0x00,0x40, // 'v' + 0x40,0x40,0x90,0x30,0x24,0x0C,0x10,0x85,0x04,0x21,0x21,0x08,0x48,0x41,0x22,0x20,0x48,0x48,0x12,0x12,0x05,0x05,0x00,0xC0,0xC0,0x30,0x30,0x08,0x04,0x00, // 'w' + 0x40,0x44,0x08,0x82,0x08,0x80,0xA0,0x0C,0x01,0x00,0x50,0x09,0x02,0x20,0x82,0x10,0x24,0x04, // 'x' + 0x80,0x24,0x02,0x40,0x42,0x04,0x20,0x82,0x08,0x10,0x81,0x10,0x09,0x00,0xA0,0x0A,0x00,0x60,0x04,0x00,0x40,0x04,0x00,0x80,0x08,0x07,0x00, // 'y' + 0xFF,0x80,0x20,0x10,0x08,0x04,0x01,0x00,0x80,0x40,0x20,0x08,0x04,0x02,0x00,0xFF,0xC0, // 'z' + 0x00,0x06,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0xC0,0x60,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x02, // '{' + 0xFF,0xFF,0xF0, // '|' + 0x00,0x60,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40 // '}' +}; +const GFXglyph Roboto_Thin_24Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 7, 0, 0 }, // ' ' + { 1, 3, 17, 6, 1, -17 }, // '!' + { 8, 3, 5, 7, 2, -18 }, // '"' + { 10, 14, 17, 14, 0, -17 }, // '#' + { 40, 10, 23, 14, 1, -20 }, // '$' + { 69, 15, 17, 18, 1, -17 }, // '%' + { 101, 13, 17, 15, 1, -17 }, // '&' + { 129, 1, 5, 6, 2, -18 }, // ''' + { 130, 6, 26, 9, 2, -20 }, // '(' + { 150, 6, 26, 9, 0, -20 }, // ')' + { 170, 11, 10, 12, 0, -17 }, // '*' + { 184, 13, 12, 15, 0, -14 }, // '+' + { 204, 2, 5, 6, 1, -2 }, // ',' + { 206, 7, 1, 8, 0, -8 }, // '-' + { 207, 3, 1, 6, 1, -1 }, // '.' + { 208, 9, 19, 10, 0, -17 }, // '/' + { 230, 10, 17, 13, 1, -17 }, // '0' + { 252, 6, 17, 14, 2, -17 }, // '1' + { 265, 11, 17, 14, 1, -17 }, // '2' + { 289, 11, 17, 14, 1, -17 }, // '3' + { 313, 13, 17, 14, 0, -17 }, // '4' + { 341, 11, 17, 14, 1, -17 }, // '5' + { 365, 11, 17, 15, 2, -17 }, // '6' + { 389, 11, 17, 14, 1, -17 }, // '7' + { 413, 11, 17, 14, 1, -17 }, // '8' + { 437, 11, 17, 15, 1, -17 }, // '9' + { 461, 2, 13, 5, 1, -13 }, // ':' + { 465, 2, 16, 6, 1, -13 }, // ';' + { 469, 10, 10, 14, 1, -13 }, // '<' + { 482, 11, 6, 14, 1, -11 }, // '=' + { 491, 10, 10, 13, 1, -13 }, // '>' + { 504, 8, 17, 11, 1, -17 }, // '?' + { 521, 19, 22, 23, 2, -17 }, // '@' + { 574, 14, 17, 15, 0, -17 }, // 'A' + { 604, 11, 17, 15, 2, -17 }, // 'B' + { 628, 13, 17, 17, 2, -17 }, // 'C' + { 656, 12, 17, 17, 2, -17 }, // 'D' + { 682, 11, 17, 15, 2, -17 }, // 'E' + { 706, 11, 17, 15, 2, -17 }, // 'F' + { 730, 13, 17, 18, 2, -17 }, // 'G' + { 758, 12, 17, 17, 2, -17 }, // 'H' + { 784, 1, 17, 8, 3, -17 }, // 'I' + { 787, 10, 17, 14, 1, -17 }, // 'J' + { 809, 13, 17, 16, 2, -17 }, // 'K' + { 837, 10, 17, 13, 2, -17 }, // 'L' + { 859, 16, 17, 21, 2, -17 }, // 'M' + { 893, 12, 17, 17, 2, -17 }, // 'N' + { 919, 13, 17, 18, 2, -17 }, // 'O' + { 947, 11, 17, 15, 2, -17 }, // 'P' + { 971, 13, 20, 18, 2, -17 }, // 'Q' + { 1004, 12, 17, 17, 2, -17 }, // 'R' + { 1030, 12, 17, 15, 1, -17 }, // 'S' + { 1056, 15, 17, 16, 0, -17 }, // 'T' + { 1088, 12, 17, 17, 2, -17 }, // 'U' + { 1114, 14, 17, 15, 0, -17 }, // 'V' + { 1144, 22, 17, 23, 0, -17 }, // 'W' + { 1191, 14, 17, 15, 0, -17 }, // 'X' + { 1221, 15, 17, 16, 0, -17 }, // 'Y' + { 1253, 13, 17, 15, 1, -17 }, // 'Z' + { 1281, 4, 23, 6, 2, -19 }, // '[' + { 1293, 9, 19, 10, 0, -17 }, // '\' + { 1315, 4, 23, 7, 0, -19 }, // ']' + { 1327, 8, 9, 11, 1, -17 }, // '^' + { 1336, 11, 1, 11, -1, 0 }, // '_' + { 1338, 4, 3, 7, 1, -18 }, // '`' + { 1340, 11, 13, 14, 1, -13 }, // 'a' + { 1358, 10, 18, 14, 2, -18 }, // 'b' + { 1381, 10, 13, 13, 1, -13 }, // 'c' + { 1398, 10, 18, 14, 1, -18 }, // 'd' + { 1421, 10, 13, 13, 1, -13 }, // 'e' + { 1438, 9, 19, 9, 0, -19 }, // 'f' + { 1460, 10, 18, 14, 1, -13 }, // 'g' + { 1483, 9, 18, 14, 2, -18 }, // 'h' + { 1504, 3, 17, 6, 1, -17 }, // 'i' + { 1511, 6, 22, 6, -2, -17 }, // 'j' + { 1528, 10, 18, 13, 2, -18 }, // 'k' + { 1551, 1, 18, 6, 2, -18 }, // 'l' + { 1554, 17, 13, 22, 2, -13 }, // 'm' + { 1582, 9, 13, 14, 2, -13 }, // 'n' + { 1597, 11, 13, 14, 1, -13 }, // 'o' + { 1615, 10, 18, 14, 2, -13 }, // 'p' + { 1638, 10, 18, 14, 1, -13 }, // 'q' + { 1661, 7, 13, 9, 2, -13 }, // 'r' + { 1673, 9, 13, 12, 1, -13 }, // 's' + { 1688, 8, 17, 9, 0, -17 }, // 't' + { 1705, 9, 13, 14, 2, -13 }, // 'u' + { 1720, 11, 13, 12, 0, -13 }, // 'v' + { 1738, 18, 13, 19, 0, -13 }, // 'w' + { 1768, 11, 13, 12, 0, -13 }, // 'x' + { 1786, 12, 18, 12, 0, -13 }, // 'y' + { 1813, 10, 13, 12, 1, -13 }, // 'z' + { 1830, 8, 25, 9, 1, -19 }, // '{' + { 1855, 1, 20, 6, 2, -17 }, // '|' + { 1858, 8, 25, 9, -1, -19 } // '}' +}; +const GFXfont Roboto_Thin_24 PROGMEM = { +(uint8_t *)Roboto_Thin_24Bitmaps,(GFXglyph *)Roboto_Thin_24Glyphs,0x20, 0x7D, 29}; diff --git a/libraries/TFT_eSPI/Fonts/Custom/Satisfy_24.h b/libraries/TFT_eSPI/Fonts/Custom/Satisfy_24.h new file mode 100644 index 0000000..f7ed960 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Custom/Satisfy_24.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Satisfy_24Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x06,0x06,0x0E,0x0E,0x0C,0x0C,0x0C,0x1C,0x18,0x18,0x18,0x18,0x30,0x30,0x30,0x00,0x00,0x70,0x60, // '!' + 0x00,0x33,0x36,0x36,0x26,0x66,0x6C,0x6C,0x00, // '"' + 0x00,0x00,0x66,0x06,0x40,0x4C,0x3F,0xF0,0x88,0x09,0x81,0x90,0x7F,0xE1,0x30,0x33,0x03,0x60,0x00,0x00, // '#' + 0x02,0x01,0x03,0xC3,0x31,0x19,0x8C,0xC4,0x30,0x18,0x04,0x03,0x00,0x8C,0x66,0x31,0x30,0xF0,0x30,0x10,0x00, // '$' + 0x00,0x00,0x0E,0x06,0x1A,0x0C,0x3B,0x18,0x33,0x10,0x33,0x30,0x32,0x60,0x36,0x40,0x1C,0xC0,0x01,0x80,0x01,0x00,0x03,0x78,0x06,0xCC,0x0C,0xCC,0x0D,0x8C,0x19,0x8C,0x31,0x98,0x31,0x98,0x60,0xE0, // '%' + 0x00,0x70,0x04,0x80,0x44,0x06,0x60,0x36,0x01,0xE0,0x0F,0x00,0x70,0x07,0x00,0x78,0x07,0xC0,0x36,0x03,0x30,0x39,0xC1,0x8E,0x0C,0x32,0x61,0xE3,0x8E,0x0F,0xF0,0x00,0x40, // '&' + 0x01,0x8C,0x62,0x31,0x8C,0x00, // ''' + 0x00,0x02,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x20,0x60,0x60,0x60,0x60,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0x40,0x40,0x40,0x00, // '(' + 0x00,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x02,0x06,0x06,0x06,0x04,0x0C,0x0C,0x08,0x18,0x10,0x30,0x60,0x40,0x80, // ')' + 0x00,0x0C,0x4C,0x6B,0x3F,0x18,0x7C,0x66,0x24, // '*' + 0x06,0x01,0x80,0x60,0x10,0x7F,0x83,0x00,0xC0,0x20,0x00,0x00, // '+' + 0x6E,0x64,0xC0, // ',' + 0x7F,0x80,0x00, // '-' + 0x0E,0xE0, // '.' + 0x00,0x00,0x01,0x80,0x18,0x00,0xC0,0x0C,0x00,0x60,0x06,0x00,0x20,0x03,0x00,0x10,0x01,0x80,0x18,0x00,0xC0,0x0C,0x00,0x60,0x06,0x00,0x30,0x03,0x00,0x18,0x00, // '/' + 0x07,0x01,0xB0,0x62,0x08,0x63,0x0C,0x41,0x98,0x33,0x06,0x60,0xD8,0x1B,0x07,0x60,0xCC,0x19,0x83,0x30,0xC6,0x18,0x46,0x0D,0x80,0xE0,0x00, // '0' + 0x0C,0x38,0x70,0x60,0xC3,0x06,0x0C,0x18,0x20,0xC1,0x83,0x04,0x18,0x30,0x60,0xC0,0x00, // '1' + 0x03,0xC0,0x8C,0x31,0x8C,0x31,0x86,0x30,0xC0,0x30,0x06,0x01,0x80,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x8F,0xF1,0x02,0x00, // '2' + 0x07,0x83,0x98,0x61,0x98,0x33,0x06,0x71,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x7C,0x00,0xC0,0x18,0x03,0x00,0x66,0x18,0xC3,0x1C,0xC0,0xF0,0x00, // '3' + 0x00,0x00,0x38,0x0F,0x01,0x40,0x68,0x1B,0x06,0x61,0x8C,0x31,0x0C,0x21,0xFE,0x3F,0xC0,0x30,0x04,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x00, // '4' + 0x00,0x00,0xFF,0x0F,0xF0,0x80,0x08,0x01,0x80,0x10,0x01,0x38,0x3F,0xC3,0x8C,0x38,0xC0,0x0C,0x00,0x80,0x08,0x21,0x86,0x10,0x73,0x07,0xE0,0x38,0x00, // '5' + 0x03,0x83,0x60,0x98,0x66,0x31,0x8C,0x06,0x01,0xBC,0x79,0x3C,0x6F,0x1B,0x06,0xC1,0xB0,0xEC,0x33,0x0C,0x46,0x19,0x03,0x80, // '6' + 0x3F,0xDC,0x34,0x0C,0x06,0x03,0x80,0xC0,0x60,0x38,0x0C,0x07,0x01,0x80,0xE0,0x30,0x1C,0x06,0x01,0x80,0x60,0x18,0x00,0x00, // '7' + 0x03,0xC0,0x8C,0x21,0x8C,0x31,0x8E,0x31,0x87,0x70,0xFC,0x0F,0x03,0xE0,0xDC,0x39,0xC6,0x19,0x83,0x30,0x66,0x0C,0xC3,0x08,0xC0,0xF0,0x00, // '8' + 0x07,0x03,0x61,0x8C,0xC3,0x30,0xD8,0x36,0x1D,0x87,0x61,0xD8,0xE6,0x29,0xD6,0x39,0x80,0xC0,0x32,0x18,0xCE,0x3F,0x07,0x00, // '9' + 0x01,0xCC,0x00,0x03,0x9C, // ':' + 0x01,0x9C,0x00,0x03,0x9C,0x62,0x00, // ';' + 0x03,0x07,0x07,0x07,0x07,0x03,0x00,0xC0,0x60,0x18,0x0C,0x00, // '<' + 0x3F,0xC8,0x00,0x01,0xFE,0x00,0x00, // '=' + 0x18,0x0C,0x0C,0x06,0x07,0x07,0x0E,0x18,0x30,0x60, // '>' + 0x07,0xC0,0xE3,0x06,0x0C,0x70,0x61,0x83,0x00,0x38,0x01,0x80,0x1C,0x01,0xC0,0x7C,0x07,0x80,0x30,0x01,0x80,0x1C,0x00,0xC0,0x04,0x00,0x00,0x03,0x80,0x1C,0x00, // '?' + 0x00,0xF8,0x03,0x87,0x03,0x00,0xC3,0x0F,0x61,0x1B,0x99,0x99,0xCD,0x98,0xE6,0xCC,0x23,0x6C,0x11,0xB6,0x18,0xDB,0x08,0xCD,0x8C,0x66,0x7E,0x61,0x83,0x70,0x61,0xE0,0x1E,0x00,0x00,0x00,0x00, // '@' + 0x00,0x1C,0x00,0x4C,0x01,0x18,0x06,0x30,0x18,0x60,0x31,0x80,0xC3,0x01,0x86,0x03,0x0C,0x0C,0x38,0x18,0x60,0x30,0xC0,0xFF,0xA7,0xFF,0x9F,0x06,0x0C,0x18,0x18,0x30,0x70,0x60,0xE0,0xC1,0x81,0x87,0x03,0x0C,0x07,0x00,0x0E,0x00,0x00, // 'A' + 0x00,0x00,0x03,0xF0,0x0F,0x0C,0x1F,0x0E,0x1F,0x0E,0x06,0x0E,0x06,0x0E,0x06,0x0C,0x0C,0x1C,0x0C,0x18,0x0C,0x30,0x0F,0xE0,0x1F,0xB0,0x18,0x18,0x18,0x18,0x38,0x18,0x30,0x1C,0x30,0x18,0x30,0x38,0x70,0x30,0x70,0x70,0x61,0xC0,0x3F,0x00, // 'B' + 0x00,0xF0,0x0C,0x60,0x61,0x83,0x06,0x18,0x1C,0x40,0xE3,0x03,0x8C,0x1C,0x60,0x01,0x80,0x06,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0xC0,0x03,0x01,0x06,0x08,0x18,0x60,0x7F,0x00,0x70,0x00, // 'C' + 0x07,0xC0,0x3F,0xE0,0x60,0xE0,0x80,0xC0,0x60,0xC1,0xC1,0x83,0x03,0x06,0x06,0x0C,0x0C,0x18,0x1C,0x70,0x30,0xC0,0x61,0x80,0xC3,0x03,0x8E,0x06,0x18,0x1C,0x30,0x30,0x60,0xC1,0x83,0x83,0x0E,0x0E,0x30,0x0F,0x80,0x00, // 'D' + 0x00,0xF8,0x0E,0x30,0x60,0xC3,0x03,0x1C,0x1C,0x60,0x61,0x83,0x86,0x00,0x1C,0x00,0x30,0x00,0x7C,0x07,0xE0,0x38,0x01,0xC0,0x06,0x00,0x38,0x04,0xE0,0x13,0x80,0x8E,0x06,0x1C,0x30,0x3F,0x80,0x7C,0x00, // 'E' + 0x07,0xF0,0xE0,0x66,0x01,0xD8,0x06,0x7C,0x19,0xE0,0x40,0x03,0x00,0x0C,0x00,0x60,0x01,0x83,0xFF,0x88,0x30,0x01,0x80,0x06,0x00,0x30,0x00,0xC0,0x07,0x00,0x18,0x00,0x60,0x03,0x80,0x0E,0x00,0x38,0x00,0x00,0x00, // 'F' + 0x00,0xF0,0x0C,0x40,0x61,0x83,0x06,0x18,0x18,0x60,0xE3,0x07,0x0C,0x1C,0x70,0x01,0x80,0x06,0x00,0x38,0xFE,0xC7,0xFB,0x00,0xCC,0x03,0x30,0x18,0xC0,0x63,0x03,0x04,0x0C,0x18,0x60,0x23,0x00,0x78,0x00, // 'G' + 0x00,0x00,0x03,0x00,0x01,0x80,0xC1,0xC0,0xE0,0xC0,0x60,0x60,0x30,0x30,0x38,0x18,0x18,0x18,0x0C,0x0C,0x0E,0x06,0x06,0x03,0xFF,0xC7,0xF1,0xC1,0x9D,0x80,0xC6,0xC0,0x61,0xE0,0x70,0x70,0x38,0x30,0x18,0x18,0x0C,0x0C,0x06,0x06,0x07,0x03,0x03,0x83,0x80, // 'H' + 0x00,0x1C,0x00,0xF8,0x03,0xB0,0x06,0x60,0x1C,0xC0,0x33,0x80,0x67,0x00,0xCC,0x01,0x98,0x03,0x70,0x02,0xE0,0x05,0x80,0x03,0x01,0xFF,0xCF,0x98,0x38,0x30,0xC0,0x61,0x81,0x83,0x03,0x03,0x0C,0x07,0x30,0x03,0xC0,0x00, // 'I' + 0x01,0xFF,0x00,0x8C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x18,0x03,0x8C,0x03,0xC6,0x03,0x87,0x01,0x83,0x01,0xC1,0x80,0xC1,0xC0,0x60,0xC0,0x30,0x60,0x18,0x60,0x06,0x60,0x01,0xE0,0x00, // 'J' + 0x00,0x00,0x06,0x08,0x0C,0x38,0x38,0x60,0x60,0xC0,0xC3,0x83,0x86,0x06,0x1C,0x0C,0x30,0x18,0xC0,0x63,0x00,0xCC,0x01,0xF0,0x07,0xF8,0x0E,0x38,0x18,0x30,0x30,0x60,0x60,0xC0,0xC3,0x03,0x86,0x07,0x18,0x0E,0x30,0x18,0x60,0x00,0x60,0x00,0x78, // 'K' + 0x00,0x0F,0x00,0x1F,0x00,0x3B,0x00,0x33,0x00,0x76,0x00,0x6E,0x00,0x7C,0x00,0x70,0x0F,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x3E,0x00,0x6F,0x04,0x7F,0x8C,0x79,0xFC,0x00,0x78, // 'L' + 0x00,0x30,0x30,0x07,0x83,0x80,0x3C,0x3C,0x01,0xE1,0xE0,0x1B,0x0B,0x00,0xD8,0xD0,0x06,0xC5,0x80,0x76,0x6C,0x03,0x72,0x60,0x1B,0x33,0x00,0xD9,0x30,0x0E,0xD9,0x83,0x66,0xCC,0x13,0x34,0x61,0x99,0xE7,0x09,0xCE,0x30,0xCC,0x71,0x86,0x63,0x8C,0x33,0x0C,0x61,0xB8,0x07,0x07,0x80,0x1C,0x1C,0x00,0xF0, // 'M' + 0x00,0x00,0x0C,0x06,0x0C,0x0D,0x0E,0x19,0x1E,0x1B,0x16,0x1B,0x16,0x36,0x16,0x7C,0x16,0x30,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x60,0x66,0x60,0x46,0x60,0x46,0x40,0x46,0x40,0xC7,0xC0,0xC7,0xC0,0xC3,0x80,0xC3,0x80,0xC3,0x80,0xC1,0x00, // 'N' + 0x01,0xE0,0x1F,0x81,0xCC,0x1C,0x30,0xC1,0x8C,0x0C,0x60,0x67,0x03,0x30,0x19,0x80,0xDC,0x06,0xC0,0x36,0x03,0x30,0x19,0x80,0xCC,0x06,0x60,0x63,0x03,0x18,0x30,0x43,0x03,0x30,0x0F,0x00, // 'O' + 0x01,0xF8,0x07,0x0C,0x1F,0x06,0x1B,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x04,0x0C,0x0C,0x1C,0x0C,0x38,0x0C,0x70,0x0F,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x70,0x00,0x60,0x00, // 'P' + 0x01,0xE0,0x31,0x83,0x0C,0x38,0x31,0x81,0x9C,0x0C,0xC0,0x6E,0x03,0x70,0x1B,0x00,0xD8,0x0E,0xC0,0x66,0x03,0x30,0x39,0x81,0x8E,0x0C,0x38,0xC0,0x06,0x0F,0xE0,0xE7,0x06,0x7C,0x3E,0x38, // 'Q' + 0x01,0xF8,0x07,0x0C,0x1F,0x06,0x1B,0x06,0x02,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x06,0x0C,0x0C,0x1C,0x0C,0x38,0x1F,0x70,0x1D,0xC0,0x1F,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x38,0xC0,0x38,0xE0,0x30,0xE0,0x70,0x60,0x60,0x60,0x00,0x78,0x00,0x30, // 'R' + 0x00,0x00,0x07,0xC0,0x71,0x81,0x82,0x0C,0x18,0x30,0x61,0xC1,0x83,0x0E,0x0C,0x00,0x38,0x00,0x70,0x00,0xE0,0x01,0x80,0x07,0x00,0x0C,0x00,0x30,0x00,0xC1,0x83,0x06,0x0C,0x18,0x30,0x61,0x81,0xCE,0x03,0xF0,0x02,0x00, // 'S' + 0x00,0x03,0xFF,0xDC,0xC0,0x06,0x00,0x70,0x03,0x00,0x18,0x00,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x00,0xC0,0x0C,0x00,0x60,0x03,0x00,0x18,0x01,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x01,0xC0,0x00, // 'T' + 0x00,0x00,0x18,0x18,0x70,0x70,0xE0,0xE1,0x81,0x87,0x07,0x0E,0x0E,0x18,0x18,0x30,0x30,0xE0,0xE1,0x81,0x83,0x03,0x06,0x06,0x1C,0x0C,0x30,0x30,0x60,0x60,0xC0,0xC1,0x83,0x83,0x07,0x06,0x1E,0x06,0x6C,0x0F,0x18,0x00, // 'U' + 0x00,0x01,0x81,0x9C,0x0C,0xC0,0xE6,0x06,0x30,0x71,0x83,0x18,0x18,0xC1,0xC6,0x0C,0x30,0x61,0x87,0x0C,0x30,0x61,0x83,0x0C,0x18,0xC0,0xC6,0x06,0x20,0x33,0x00,0x98,0x07,0x80,0x3C,0x00,0xC0,0x00, // 'V' + 0x06,0x00,0x60,0xC1,0x06,0x0C,0x30,0x61,0x83,0x06,0x18,0x70,0x63,0x87,0x06,0x30,0x70,0x63,0x07,0x06,0x30,0x60,0x66,0x06,0x0C,0x60,0x60,0xC6,0x0E,0x0C,0x60,0xE0,0xC6,0x0E,0x18,0x61,0xE1,0x86,0x1E,0x18,0x61,0x61,0x06,0x36,0x30,0x62,0x62,0x06,0x67,0x40,0x3C,0x3C,0x01,0x83,0x80, // 'W' + 0x06,0x00,0xC1,0x60,0x78,0x66,0x0C,0x08,0xC3,0x01,0x98,0xE0,0x3F,0x18,0x03,0xA6,0x00,0x05,0xC0,0x00,0xF0,0x00,0x1C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x07,0x80,0x00,0xF0,0x00,0x36,0x00,0x06,0x40,0x01,0x8C,0x00,0x71,0x80,0x0C,0x30,0x83,0x83,0x20,0xE0,0x78,0x00,0x00,0x00, // 'X' + 0x00,0x0C,0x70,0x71,0xC1,0x86,0x06,0x18,0x18,0xE0,0xE3,0x03,0x0C,0x0C,0x30,0x31,0xC1,0xC6,0x06,0x18,0x38,0x60,0xE1,0x87,0x87,0x34,0x0F,0x30,0x00,0xC0,0x03,0x00,0x18,0x10,0x60,0x63,0x03,0xF8,0x07,0xC0,0x00, // 'Y' + 0x07,0xFC,0x3F,0xF0,0xC0,0xC0,0x07,0x00,0x18,0x00,0xE0,0x03,0x00,0x18,0x00,0xC0,0x07,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x0E,0x00,0x30,0x01,0x80,0x06,0x00,0x37,0xF8,0xFF,0xE1,0x01,0x00, // 'Z' + 0x03,0x80,0x80,0x60,0x18,0x04,0x01,0x00,0xC0,0x30,0x08,0x02,0x01,0x80,0x60,0x10,0x04,0x03,0x00,0xC0,0x30,0x08,0x02,0x01,0x80,0x60,0x18,0x07,0x00, // '[' + 0x01,0x86,0x18,0x60,0x82,0x08,0x30,0xC3,0x0C,0x10,0x41,0x86,0x18,0x61,0xC0, // '\' + 0x03,0x80,0xC0,0x60,0x30,0x10,0x18,0x0C,0x06,0x02,0x01,0x01,0x80,0xC0,0x60,0x20,0x30,0x18,0x0C,0x04,0x06,0x03,0x01,0x01,0x81,0xC0, // ']' + 0x06,0x07,0x83,0xC3,0x61,0x31,0x99,0x8C,0xC6,0xC3,0x00,0x00, // '^' + 0x7F,0xF7,0xFF,0x80,0x00, // '_' + 0x47,0x0C,0x00, // '`' + 0x00,0x00,0x3C,0x01,0xB0,0x0C,0x40,0x31,0x01,0x8C,0x26,0x31,0x38,0xCC,0xEE,0x61,0xEF,0x07,0x18,0x00, // 'a' + 0x00,0x00,0xC0,0x06,0x00,0x70,0x03,0x80,0x1C,0x01,0xE0,0x0E,0x00,0x70,0x03,0x30,0x39,0x8D,0xCF,0x8C,0x20,0x63,0x03,0x18,0x19,0x80,0xC8,0x03,0x80,0x00, // 'b' + 0x1C,0x03,0x20,0x66,0x06,0x60,0xC0,0x0C,0x02,0xC0,0x4C,0x0C,0xC1,0x86,0x30,0x3C,0x00, // 'c' + 0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0xE0,0x03,0x80,0x0E,0x03,0x30,0x33,0xC1,0x8F,0x06,0x38,0x38,0x60,0xC3,0x07,0x0C,0x2C,0x31,0xB1,0xCC,0xCB,0x61,0xCE,0x00, // 'd' + 0x07,0x01,0xB0,0x13,0x03,0x20,0x66,0x06,0xC1,0x70,0x26,0x06,0x60,0xC3,0x10,0x1E,0x00, // 'e' + 0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0x60,0x03,0x00,0x18,0x00,0x80,0x0C,0x00,0x60,0x03,0x3C,0x1E,0x01,0x80,0x1C,0x00,0x60,0x03,0x80,0x36,0x01,0xB0,0x08,0xC0,0x46,0x06,0x30,0x31,0x81,0x9C,0x08,0xC0,0xCE,0x06,0xE0,0x3E,0x01,0xE0,0x06,0x00,0x00, // 'f' + 0x1C,0x00,0xCE,0x06,0x38,0x18,0xE0,0xC3,0x03,0x04,0x0C,0x30,0xB0,0xC4,0xC7,0x23,0x1F,0x07,0xB8,0x01,0x80,0x0E,0x00,0x58,0x03,0x40,0x1B,0x00,0xCC,0x03,0x30,0x0C,0xC0,0x32,0x00,0xD8,0x01,0xE0,0x03,0x00,0x00, // 'g' + 0x0C,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x60,0x01,0x80,0x06,0xE0,0x17,0x80,0xF7,0x03,0x98,0x0C,0x60,0x31,0x8C,0x8C,0x66,0x33,0x18,0xD8,0x63,0xC1,0x86,0x00, // 'h' + 0x00,0x18,0x10,0x00,0x00,0x00,0x00,0x10,0x60,0x60,0xE0,0xC1,0xC3,0xC6,0xCC,0xD8,0x70, // 'i' + 0x00,0x40,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x01,0x80,0x0E,0x00,0x30,0x40,0xC2,0x03,0x18,0x1C,0xC0,0x66,0x01,0xA0,0x07,0x00,0x38,0x01,0xE0,0x0D,0x00,0x7C,0x01,0xB0,0x0C,0xC0,0x32,0x00,0xD8,0x03,0x40,0x07,0x00,0x00, // 'j' + 0x00,0x00,0x30,0x00,0xC0,0x03,0x00,0x0C,0x00,0x20,0x01,0x80,0x06,0x00,0x19,0x80,0x5E,0x03,0xD8,0x0E,0x60,0x31,0x00,0xB8,0x02,0xF0,0x98,0xC4,0x63,0x31,0x0D,0x84,0x38,0x00, // 'k' + 0x0C,0x18,0x30,0x61,0xC3,0x06,0x0C,0x18,0x60,0xC1,0x83,0x0C,0x18,0x30,0x60,0xC0, // 'l' + 0x03,0x9C,0x03,0x7B,0xC0,0x39,0xEC,0x07,0x1C,0xC0,0x71,0x8C,0x26,0x11,0xC2,0x63,0x18,0x46,0x31,0x88,0xC3,0x19,0x0C,0x61,0xE0,0x00,0x00,0x00, // 'm' + 0x33,0x00,0xDE,0x03,0x98,0x0C,0x60,0x61,0x89,0x8C,0x26,0x31,0x18,0xCC,0xC3,0x63,0x0E,0x00, // 'n' + 0x1C,0x01,0xF0,0x18,0x80,0xC4,0x2E,0x36,0x79,0xE3,0x7C,0x18,0xC0,0xC6,0x06,0x60,0x1E,0x00, // 'o' + 0x00,0x00,0x06,0x60,0x07,0xF0,0x07,0x30,0x0E,0x30,0x0C,0x31,0x0C,0x72,0x08,0x66,0x1E,0xC4,0x1F,0xD8,0x1F,0xF0,0x18,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00, // 'p' + 0x1C,0xC1,0x9C,0x18,0xE0,0xC7,0x0C,0x18,0x61,0x83,0x0C,0x18,0x62,0xC7,0x26,0x33,0x1E,0xB0,0x0F,0x00,0x70,0x03,0x00,0x30,0x01,0x80,0x1C,0x00,0xE0,0x07,0x00,0x38,0x00,0xC0,0x00, // 'q' + 0x06,0x00,0x1C,0x00,0x38,0x00,0x7C,0x00,0xCC,0x03,0x18,0x04,0x71,0x18,0xC2,0x23,0x08,0xC6,0x21,0x0C,0x80,0x0E,0x00, // 'r' + 0x00,0x38,0xE1,0xC3,0x8F,0x13,0x46,0x06,0xC9,0x91,0xC0, // 's' + 0x00,0x00,0x18,0x00,0xC0,0x0E,0x07,0xFF,0x03,0x00,0x38,0x01,0xC0,0x0C,0x00,0x60,0x03,0x00,0x30,0x01,0x82,0x0C,0x10,0x41,0x02,0x10,0x19,0x00,0x70,0x00, // 't' + 0x00,0x80,0x63,0x01,0xC6,0x03,0x1C,0x06,0x38,0x4C,0x60,0x90,0xC2,0x21,0x88,0x67,0x20,0x73,0x80, // 'u' + 0x01,0x83,0x1C,0x30,0xC1,0x86,0x2C,0x33,0x63,0xE3,0x10,0x19,0x80,0xD8,0x03,0x80,0x18,0x00, // 'v' + 0x03,0x08,0x00,0xC6,0x06,0x31,0x81,0x88,0xE0,0xE2,0x11,0xB9,0x8F,0x8C,0x43,0x03,0x18,0x80,0xC6,0x60,0x32,0x90,0x07,0x18,0x00, // 'w' + 0x18,0x40,0xC6,0x02,0x70,0x1F,0x00,0xF0,0x07,0x00,0x30,0x03,0xC2,0x36,0x23,0x1E,0x18,0xE0,0x00,0x00, // 'x' + 0x00,0x1C,0x66,0x19,0x86,0x63,0x30,0xCC,0x73,0x18,0xCE,0x3F,0x82,0x60,0x18,0x04,0x03,0x00,0xC0,0x30,0x0C,0x06,0x01,0x80,0x60,0x00,0x00, // 'y' + 0x0F,0xC0,0xFE,0x00,0x20,0x03,0x00,0x18,0x01,0x84,0x18,0x61,0xF6,0x0C,0xE0,0x4C,0x01,0xE0,0x1B,0x01,0x90,0x19,0x81,0x8C,0x08,0xC0,0xC6,0x06,0x60,0x33,0x01,0xF0,0x07,0x00,0x00, // 'z' + 0x00,0x00,0xE0,0x78,0x38,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x01,0x80,0xC0,0x30,0x06,0x01,0x80,0x60,0x30,0x1C,0x06,0x01,0x00,0xE0,0x1C,0x07,0x00,0xC0, // '{' + 0x00,0x06,0x06,0x04,0x0C,0x0C,0x08,0x08,0x18,0x18,0x18,0x10,0x30,0x30,0x30,0x30,0x60,0x60,0x60, // '|' + 0x03,0x00,0xC0,0x38,0x06,0x01,0x80,0x60,0x30,0x0C,0x06,0x01,0x80,0x60,0x0C,0x03,0x01,0x80,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x1C,0x1E,0x07,0x00,0x00 // '}' +}; +const GFXglyph Satisfy_24Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 8, 0, 0 }, // ' ' + { 1, 8, 19, 7, -1, -18 }, // '!' + { 20, 8, 9, 7, 0, -19 }, // '"' + { 29, 12, 13, 11, -1, -16 }, // '#' + { 49, 9, 18, 8, -1, -17 }, // '$' + { 70, 16, 19, 15, -1, -18 }, // '%' + { 108, 13, 20, 12, -2, -18 }, // '&' + { 141, 5, 9, 4, 0, -19 }, // ''' + { 147, 8, 24, 7, 0, -21 }, // '(' + { 171, 8, 24, 6, -3, -21 }, // ')' + { 195, 8, 9, 9, 1, -18 }, // '*' + { 204, 10, 9, 9, -1, -14 }, // '+' + { 216, 4, 5, 6, -1, -2 }, // ',' + { 219, 10, 2, 9, -1, -8 }, // '-' + { 222, 4, 3, 6, -1, -2 }, // '.' + { 224, 13, 19, 7, -3, -18 }, // '/' + { 255, 11, 19, 13, 1, -18 }, // '0' + { 282, 7, 19, 8, 0, -17 }, // '1' + { 299, 11, 19, 12, -1, -18 }, // '2' + { 326, 11, 19, 13, 0, -18 }, // '3' + { 353, 11, 19, 12, 0, -18 }, // '4' + { 380, 12, 19, 12, -1, -18 }, // '5' + { 409, 10, 19, 13, 1, -18 }, // '6' + { 433, 10, 19, 11, 1, -17 }, // '7' + { 457, 11, 19, 13, 0, -18 }, // '8' + { 484, 10, 19, 13, 1, -18 }, // '9' + { 508, 5, 8, 6, -1, -7 }, // ':' + { 513, 5, 11, 6, -1, -7 }, // ';' + { 520, 9, 10, 8, -1, -13 }, // '<' + { 532, 10, 5, 10, -1, -11 }, // '=' + { 539, 8, 10, 7, -2, -13 }, // '>' + { 549, 13, 19, 11, -1, -18 }, // '?' + { 580, 17, 17, 18, -1, -16 }, // '@' + { 617, 15, 24, 14, -3, -18 }, // 'A' + { 662, 16, 23, 16, -1, -19 }, // 'B' + { 708, 14, 22, 15, 0, -18 }, // 'C' + { 747, 15, 22, 16, 0, -18 }, // 'D' + { 789, 14, 22, 14, -1, -18 }, // 'E' + { 828, 14, 23, 15, 0, -18 }, // 'F' + { 869, 14, 22, 16, 1, -18 }, // 'G' + { 908, 17, 23, 17, 0, -19 }, // 'H' + { 957, 15, 22, 14, -2, -18 }, // 'I' + { 999, 17, 22, 13, -2, -18 }, // 'J' + { 1046, 15, 25, 13, -2, -19 }, // 'K' + { 1093, 16, 22, 13, -3, -18 }, // 'L' + { 1137, 21, 22, 18, -3, -18 }, // 'M' + { 1195, 16, 23, 14, -1, -19 }, // 'N' + { 1241, 13, 22, 15, 0, -18 }, // 'O' + { 1277, 16, 22, 14, -2, -18 }, // 'P' + { 1321, 13, 22, 15, 0, -18 }, // 'Q' + { 1357, 16, 24, 14, -2, -18 }, // 'R' + { 1405, 14, 24, 12, -2, -19 }, // 'S' + { 1447, 13, 23, 11, 0, -19 }, // 'T' + { 1485, 15, 22, 15, 1, -18 }, // 'U' + { 1527, 13, 23, 13, 1, -19 }, // 'V' + { 1565, 20, 22, 21, 0, -18 }, // 'W' + { 1620, 19, 23, 15, -2, -18 }, // 'X' + { 1675, 14, 23, 14, 0, -19 }, // 'Y' + { 1716, 14, 22, 12, -2, -17 }, // 'Z' + { 1755, 10, 23, 6, -2, -21 }, // '[' + { 1784, 6, 19, 8, 0, -18 }, // '\' + { 1799, 9, 23, 6, -3, -21 }, // ']' + { 1825, 9, 10, 8, -1, -18 }, // '^' + { 1837, 13, 3, 12, -3, -2 }, // '_' + { 1842, 5, 4, 15, 6, -17 }, // '`' + { 1845, 14, 11, 11, -1, -10 }, // 'a' + { 1865, 13, 18, 12, 1, -17 }, // 'b' + { 1895, 12, 11, 10, 0, -10 }, // 'c' + { 1912, 14, 18, 13, 0, -17 }, // 'd' + { 1944, 12, 11, 10, -1, -10 }, // 'e' + { 1961, 13, 29, 9, -2, -17 }, // 'f' + { 2009, 14, 23, 12, 0, -10 }, // 'g' + { 2050, 14, 18, 12, -1, -17 }, // 'h' + { 2082, 8, 17, 8, 1, -16 }, // 'i' + { 2099, 14, 27, 7, -5, -16 }, // 'j' + { 2147, 14, 19, 12, -1, -18 }, // 'k' + { 2181, 7, 18, 6, -1, -17 }, // 'l' + { 2197, 20, 11, 18, 0, -9 }, // 'm' + { 2225, 14, 10, 12, -1, -9 }, // 'n' + { 2243, 13, 11, 11, 0, -10 }, // 'o' + { 2261, 16, 21, 12, -3, -10 }, // 'p' + { 2303, 13, 21, 12, 0, -10 }, // 'q' + { 2338, 15, 12, 11, -3, -11 }, // 'r' + { 2361, 7, 12, 9, 0, -11 }, // 's' + { 2372, 13, 18, 8, -2, -17 }, // 't' + { 2402, 15, 10, 13, 0, -9 }, // 'u' + { 2421, 13, 11, 12, 1, -10 }, // 'v' + { 2439, 18, 11, 17, 1, -10 }, // 'w' + { 2464, 13, 12, 11, -2, -10 }, // 'x' + { 2484, 10, 21, 11, 0, -10 }, // 'y' + { 2511, 13, 21, 11, -1, -10 }, // 'z' + { 2546, 10, 24, 7, -1, -21 }, // '{' + { 2576, 8, 19, 7, -1, -18 }, // '|' + { 2595, 10, 24, 7, -3, -21 } // '}' +}; +const GFXfont Satisfy_24 PROGMEM = { +(uint8_t *)Satisfy_24Bitmaps,(GFXglyph *)Satisfy_24Glyphs,0x20, 0x7D, 36}; diff --git a/libraries/TFT_eSPI/Fonts/Custom/Yellowtail_32.h b/libraries/TFT_eSPI/Fonts/Custom/Yellowtail_32.h new file mode 100644 index 0000000..0aeb1e5 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Custom/Yellowtail_32.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t Yellowtail_32Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00,0x01,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x03,0xC0,0x00,0xE0,0x00,0x70,0x00,0x1C,0x00,0x0E,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0F,0x00,0x03,0x80,0x00, // '!' + 0x19,0x8E,0x63,0x39,0xCC,0x67,0x19,0x8C,0xE2,0x30, // '"' + 0x00,0x20,0x00,0x08,0xC0,0x06,0x30,0x01,0x9C,0x00,0xCE,0x03,0xFF,0xE1,0xFF,0xF8,0x0C,0xE0,0x07,0x30,0x01,0x9C,0x00,0xE7,0xC1,0xFF,0xF8,0xFF,0xC0,0x0E,0x70,0x03,0x18,0x01,0xC6,0x00,0x60,0x80,0x08,0x00,0x00, // '#' + 0x00,0x18,0x00,0xE0,0x03,0x00,0x1C,0x00,0x60,0x03,0xE0,0x3F,0xC3,0xFE,0x1F,0xB0,0xEE,0x06,0x70,0x1D,0x80,0x7F,0x80,0xFF,0x01,0xFE,0x06,0x38,0x79,0xE3,0xFF,0x0F,0xF8,0x1F,0x00,0x70,0x01,0x80,0x0E,0x00,0x30,0x00, // '$' + 0x03,0x80,0x41,0xF0,0x20,0xEC,0x18,0x73,0x0C,0x39,0x86,0x1C,0x63,0x86,0x39,0xC3,0x8C,0xE0,0xC6,0x73,0xB3,0xB9,0xFF,0xDC,0xED,0xCE,0x73,0x07,0x39,0xC3,0x9C,0x60,0xE6,0x38,0x73,0x8C,0x38,0xC7,0x1C,0x33,0x86,0x0F,0xC1,0x81,0xC0, // '%' + 0x00,0x0C,0x00,0x38,0x00,0x60,0x01,0xC0,0x03,0x00,0x7F,0x83,0xFF,0x0F,0xFC,0x3D,0xF0,0x63,0x80,0xFF,0x00,0xFE,0x03,0xF0,0x0E,0xC3,0x3B,0x9E,0x76,0xF8,0xFF,0xE1,0xFF,0x01,0xF8,0x01,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x00, // '&' + 0x0C,0x73,0x8E,0x71,0xCE,0x30, // ''' + 0x00,0x00,0xE0,0x00,0x7C,0x00,0x1F,0x00,0x0F,0x80,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x1C,0x00,0x07,0x00,0x01,0xE0,0x00,0x38,0x00,0x0F,0x00,0x01,0xC0,0x00,0x38,0x00,0x0E,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x01,0xC0,0x00,0x38,0x00,0x07,0x00,0x00,0xE0,0x00,0x1C,0x00,0x03,0x80,0x00,0x70,0x00,0x0E,0x00,0x00,0xC0,0x00,0x0C,0x00,0x01,0x80,0x00, // '(' + 0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x01,0x80,0x00,0xE0,0x00,0x38,0x00,0x0C,0x00,0x07,0x00,0x01,0x80,0x00,0xE0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x1F,0x80,0x0F,0xC0,0x01,0xC0,0x00, // ')' + 0x03,0x0C,0xC3,0xE4,0x7F,0x3F,0xBF,0x8D,0xF0,0xCC,0x33,0x00, // '*' + 0x01,0x80,0x18,0x03,0x80,0x30,0x06,0x07,0xFF,0xFF,0xE0,0xC0,0x0C,0x01,0x80,0x08,0x00,0x00, // '+' + 0x00,0xF3,0xCF,0x79,0x80, // ',' + 0x7F,0x7F,0xBF,0x00,0x00, // '-' + 0x7F,0xE0, // '.' + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1C,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x01,0xC0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0E,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xC0,0x00,0x00,0x80,0x00,0x00, // '/' + 0x00,0x0E,0x00,0x3F,0x00,0x73,0x00,0xE3,0x01,0xC7,0x03,0x86,0x07,0x0E,0x0E,0x1E,0x0E,0x7C,0x1C,0x7C,0x38,0x18,0x38,0x38,0x70,0x30,0x70,0x60,0xE0,0xE0,0xE1,0xC0,0xE7,0x80,0xFF,0x00,0xFC,0x00,0x78,0x00, // '0' + 0x00,0x10,0x03,0xC0,0x3C,0x03,0xE0,0x3E,0x00,0xF0,0x07,0x00,0x30,0x03,0x80,0x38,0x01,0x80,0x1C,0x01,0xC0,0x0E,0x00,0xE0,0x07,0x00,0x70,0x03,0x00,0x38,0x00,0x80,0x00, // '1' + 0x00,0x1E,0x00,0x7F,0x00,0xF3,0x01,0xE7,0x03,0x86,0x07,0x0E,0x07,0x1C,0x0E,0x38,0x00,0x70,0x00,0xE0,0x01,0xC0,0x03,0xC0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x79,0xC0,0xFF,0xE0,0xFF,0xE0,0xFE,0x00, // '2' + 0x00,0x3C,0x01,0xFC,0x07,0x98,0x3C,0x70,0xF1,0xC1,0x87,0x07,0x1C,0x04,0xF0,0x03,0x80,0x0F,0xC0,0x1F,0xC0,0x03,0x80,0x03,0x00,0x0E,0x00,0x38,0x63,0xE0,0xFF,0x81,0xFE,0x01,0xE0,0x00, // '3' + 0x00,0x06,0x00,0x1F,0x00,0x3E,0x00,0xFC,0x01,0xDC,0x03,0xB8,0x07,0x30,0x0E,0x70,0x3C,0xE0,0x78,0xE0,0x71,0xFC,0xFF,0xF8,0xFF,0xF0,0x7F,0x00,0x07,0x00,0x0E,0x00,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x38,0x00,0x30,0x00, // '4' + 0x00,0x00,0x00,0x3F,0xC0,0x3F,0xE0,0x1F,0xC0,0x18,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x07,0xE0,0x07,0xF8,0x03,0xFC,0x00,0x06,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x81,0x80,0xC3,0xC0,0x7F,0x80,0x3F,0x80,0x0F,0x00,0x00, // '5' + 0x00,0x00,0x00,0x03,0xC0,0x07,0xE0,0x0F,0xC0,0x0F,0x80,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x07,0x70,0x07,0xFC,0x07,0xC6,0x03,0x83,0x03,0x83,0x01,0x81,0x80,0xC1,0x80,0xC1,0xC0,0x61,0xC0,0x33,0xC0,0x1F,0xC0,0x07,0x80,0x00, // '6' + 0x03,0xFE,0x0F,0xFC,0x3F,0xF8,0x00,0xE0,0x03,0x80,0x07,0x00,0x1C,0x00,0x70,0x01,0xC0,0x07,0x00,0x0E,0x00,0x38,0x00,0xE0,0x01,0xC0,0x07,0x00,0x1C,0x00,0x38,0x00,0xE0,0x01,0x80,0x03,0x00,0x00, // '7' + 0x00,0x3C,0x00,0x07,0xE7,0x00,0xFE,0xE0,0x1C,0x7C,0x03,0x87,0x80,0x30,0xE0,0x03,0x1C,0x00,0x37,0x80,0x03,0xF0,0x00,0x3C,0x00,0x07,0xE0,0x00,0xEF,0x00,0x1C,0x70,0x03,0x03,0x00,0x70,0x30,0x06,0x06,0x00,0x61,0xE0,0x07,0xFC,0x00,0x7F,0x80,0x03,0xE0,0x00, // '8' + 0x00,0x0F,0x00,0x1F,0xC0,0x1C,0x60,0x1C,0x30,0x18,0x18,0x18,0x18,0x18,0x1C,0x0C,0x0C,0x0C,0x1E,0x06,0x3E,0x03,0xFE,0x01,0xFF,0x00,0x77,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x0F,0x00,0x1F,0x00,0x1F,0x00,0x06,0x00,0x00, // '9' + 0x07,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF0,0xE0, // ':' + 0x00,0xE0,0x3C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x07,0x80,0xF0,0x1C,0x07,0x00,0x00,0x00, // ';' + 0x00,0x00,0xC0,0xE1,0xE1,0xE3,0xC3,0x81,0x80,0x40,0x30,0x18,0x0C,0x06,0x01,0x00,0x80, // '<' + 0x0F,0xFC,0x3F,0xF8,0x70,0x00,0x00,0x01,0xFE,0x0F,0xFE,0x1F,0xE0,0x00, // '=' + 0x00,0x01,0x01,0x80,0xC0,0x70,0x18,0x0C,0x07,0x03,0x87,0xC7,0x8F,0x0F,0x06,0x02,0x00, // '>' + 0x00,0xFE,0x00,0xFF,0xC0,0xFF,0xF8,0x7E,0x0F,0x1E,0x01,0xCF,0x00,0x73,0x80,0x1C,0xF0,0x0E,0x00,0x07,0x80,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x01,0xF0,0x01,0xF0,0x00,0xF0,0x00,0x38,0x00,0x1C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x07,0x00,0x01,0x80,0x00, // '?' + 0x00,0x00,0xF8,0x00,0x07,0xFC,0x00,0x1F,0xFE,0x00,0x7E,0x0F,0x00,0xF8,0x07,0x03,0xE0,0x07,0x07,0xC0,0x07,0x0F,0x8E,0xC7,0x1F,0x3F,0xCE,0x1E,0x7B,0x8E,0x3C,0xF3,0x8E,0x39,0xE7,0x1C,0x79,0xCF,0x3C,0x73,0x9E,0x38,0xF3,0x1E,0x70,0xE3,0x3E,0xF0,0xE3,0xF7,0xE0,0xE1,0xC3,0x80,0xE0,0x00,0x00,0xE0,0x02,0x00,0x70,0x06,0x00,0x78,0x3E,0x00,0x3F,0xF8,0x00,0x0F,0xE0,0x00, // '@' + 0x00,0x00,0x1E,0x00,0x00,0x3F,0x00,0x00,0x7E,0x00,0x01,0xEE,0x00,0x03,0xDC,0x00,0x07,0x9C,0x00,0x0F,0x38,0x00,0x1E,0x38,0x00,0x1C,0x78,0x00,0x38,0x70,0x00,0x70,0x70,0x00,0xE0,0xE0,0x01,0xE0,0xE0,0x03,0xC1,0xC0,0x7F,0xFF,0xC0,0x7F,0xFF,0x80,0x0E,0x03,0x80,0x1C,0x07,0x00,0x38,0x07,0x00,0x78,0x0F,0x00,0x70,0x0E,0x00,0xE0,0x1E,0x00,0xE0,0x1C,0x00,0xC0,0x38,0x00, // 'A' + 0x00,0x1F,0xE0,0x01,0xFF,0xF0,0x0F,0xFF,0xF0,0x3F,0x80,0xF0,0xF9,0xC0,0xE3,0xC7,0x01,0xC7,0x1E,0x07,0x8E,0x38,0x1E,0x00,0xE0,0xF8,0x03,0xC3,0xE0,0x07,0x3F,0x00,0x1F,0xF8,0x00,0x3F,0xF8,0x00,0xFF,0xFC,0x03,0xC0,0x7C,0x07,0x00,0x38,0x1C,0x00,0x70,0x78,0x01,0xE0,0xFC,0x07,0x83,0xF8,0x3E,0x07,0xFF,0xF8,0x0E,0xFF,0xC0,0x18,0xFE,0x00,0x00, // 'B' + 0x00,0x01,0xF0,0x00,0x7F,0xC0,0x0F,0x8E,0x00,0xF0,0x70,0x0F,0x07,0x00,0xE0,0x78,0x0E,0x07,0x80,0xE0,0x78,0x0E,0x0F,0x80,0xE0,0x70,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x30,0x00,0x01,0x80,0x04,0x1C,0x00,0x60,0xC0,0x06,0x06,0x00,0xF0,0x30,0x0F,0x01,0x81,0xF0,0x06,0x3F,0x00,0x3F,0xE0,0x00,0x7C,0x00,0x00, // 'C' + 0x00,0x7F,0xC0,0x03,0xFF,0xF0,0x0F,0xC0,0x7C,0x1E,0x1C,0x1E,0x3C,0x38,0x0E,0x3C,0x78,0x07,0x30,0x70,0x07,0x00,0xE0,0x07,0x01,0xE0,0x07,0x01,0xC0,0x07,0x03,0x80,0x0E,0x07,0x80,0x1E,0x07,0x00,0x1E,0x0E,0x00,0x3C,0x1E,0x00,0x78,0x1C,0x00,0xF0,0x3C,0x03,0xE0,0x38,0x07,0xC0,0x70,0x1F,0x80,0x70,0xFF,0x00,0x7F,0xFC,0x00,0x7F,0xF0,0x00,0x7F,0x00,0x00, // 'D' + 0x00,0x0F,0xE0,0x07,0xFE,0x01,0xFF,0xE0,0x7E,0x3C,0x0F,0x80,0x00,0xE0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x1F,0xFE,0x00,0xFF,0xE0,0x07,0xFE,0x00,0x7C,0x00,0x0F,0x80,0x01,0xE0,0x0C,0x3C,0x00,0xC7,0x80,0x1C,0x70,0x03,0x8F,0x00,0x70,0xE0,0x1E,0x0E,0x03,0xC0,0xE1,0xF8,0x07,0xFE,0x00,0x1F,0x00,0x00, // 'E' + 0x30,0x00,0x1E,0xC0,0x00,0xFD,0xFF,0xFF,0xF0,0xFF,0xFE,0x00,0x00,0x78,0x00,0x01,0xE0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0x70,0x00,0x01,0xC0,0x01,0xFF,0xF0,0x07,0xFF,0xE0,0x0F,0xFF,0x80,0x00,0xE0,0x00,0x03,0xC0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x78,0x00,0x00,0xE0,0x00,0x03,0x80,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x00, // 'F' + 0x00,0x00,0x3F,0x00,0x00,0xFF,0xC0,0x01,0xF8,0x60,0x03,0xE0,0x30,0x03,0xC0,0x30,0x07,0xC0,0x70,0x07,0x84,0xF0,0x07,0x87,0xF0,0x07,0x81,0xF0,0x07,0x80,0x1C,0x07,0x80,0x3C,0x03,0x80,0x3C,0x03,0x80,0x3C,0x03,0x80,0x3C,0x01,0x80,0x7E,0x00,0xC0,0x7E,0x00,0xC0,0x7E,0x00,0x60,0xF6,0xC0,0x31,0xF6,0xC0,0x1F,0xE7,0xC0,0x07,0xE7,0xC0,0x01,0x87,0xC0,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x03,0x80,0x00,0x00, // 'G' + 0x00,0x03,0x00,0x70,0x00,0x78,0x03,0x81,0x0F,0xC0,0x38,0x1F,0xFC,0x03,0xC0,0xFF,0xC0,0x1C,0x03,0xCE,0x01,0xE0,0x00,0xE0,0x0E,0x00,0x0E,0x00,0xE0,0x00,0xF0,0x0F,0x00,0x07,0x00,0x70,0x00,0x70,0x07,0x80,0x7F,0xFF,0xF8,0x03,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0x00,0x1C,0x01,0xC0,0x01,0xC0,0x1E,0x00,0x1E,0x00,0xE0,0x00,0xE0,0x0E,0x00,0x0E,0x00,0xF0,0x00,0xF0,0x07,0x00,0x07,0x00,0x78,0x00,0x78,0x03,0x80,0x03,0x80,0x38,0x00,0x00,0x00,0x00,0x00, // 'H' + 0x00,0x03,0x80,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1E,0x00,0x0F,0x00,0x03,0x80,0x01,0xE0,0x00,0xF0,0x00,0x38,0x00,0x1E,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x03,0xC0,0x01,0xE0,0x00,0x78,0x00,0x3C,0x00,0x0E,0x00,0x00, // 'I' + 0x00,0x00,0x03,0xF0,0x00,0x03,0xFF,0x00,0x01,0xFF,0xF0,0x00,0x7F,0x8E,0x00,0x0F,0xC1,0xC0,0x03,0xE0,0x38,0x00,0x7C,0x03,0x80,0x1F,0x00,0x70,0x03,0xE0,0x0E,0x00,0x78,0x01,0xC0,0x07,0x00,0x1C,0x00,0xE0,0x03,0x80,0x1E,0x00,0x70,0x01,0xC0,0x06,0x00,0x1C,0x00,0xE0,0x01,0xE2,0x1C,0x00,0x0F,0xE1,0x80,0x00,0x7C,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0x7C,0x00,0x00,0x1F,0x80,0x00,0x07,0xE0,0x00,0x01,0xF8,0x00,0x00,0x3B,0x80,0x00,0x0F,0x70,0x00,0x01,0xCE,0x00,0x00,0x39,0xE0,0x00,0x07,0x3C,0x00,0x00,0xE7,0x80,0x00,0x0C,0xF0,0x00,0x00,0xFE,0x00,0x00,0x0F,0xC0,0x00,0x00,0x78,0x00,0x00,0x00, // 'J' + 0x00,0x03,0x00,0x30,0x00,0x7C,0x07,0xC0,0x27,0xC0,0x7C,0x03,0xFE,0x0F,0xC0,0x1F,0xE0,0xF8,0x00,0xEE,0x1F,0x80,0x00,0x71,0xF0,0x00,0x07,0x3F,0x00,0x00,0x77,0xE0,0x00,0x07,0xFC,0x00,0x00,0x3F,0x80,0x00,0x0F,0xF0,0x00,0x00,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00,0x1D,0xF0,0x00,0x01,0xE3,0xE0,0x00,0x0E,0x0F,0x80,0x00,0xF0,0x3F,0x00,0x0F,0x00,0x7C,0x00,0x70,0x01,0xF8,0x07,0x80,0x07,0xF0,0x78,0x00,0x0F,0x83,0x80,0x00,0x38,0x00, // 'K' + 0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x01,0xE7,0x00,0x00,0x0F,0x38,0x00,0x00,0x79,0xE0,0x00,0x03,0xCF,0x00,0x00,0x1E,0xF8,0x00,0x00,0x73,0x80,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x00,0x03,0xC0,0x00,0x00,0x1E,0x00,0x00,0x00,0x70,0x00,0x03,0xFF,0x80,0x00,0x1F,0xFF,0x80,0x00,0xE1,0xFF,0xF0,0x03,0xFF,0xFF,0xFF,0x8F,0xFC,0x3F,0xFC,0x1F,0x80,0x0F,0xE0, // 'L' + 0x00,0x00,0x1E,0x03,0xE0,0x00,0x0F,0xC0,0xF8,0x00,0x03,0xF0,0x3F,0x00,0x00,0x7E,0x0F,0xC0,0x00,0x1F,0x83,0xF0,0x00,0x07,0xF0,0xFC,0x00,0x01,0xFC,0x3B,0x80,0x00,0x7F,0x0F,0xE0,0x00,0x1E,0xE3,0xF8,0x00,0x03,0xB8,0xF7,0x00,0x00,0xE7,0x3D,0xC0,0x00,0x3D,0xCF,0x70,0x00,0x0F,0x3B,0xCE,0x00,0x01,0xCE,0xF3,0x80,0x00,0x71,0xDC,0xE0,0x00,0x1E,0x77,0x1C,0x00,0x03,0x8F,0xC7,0x10,0x00,0xE3,0xF1,0xC6,0x00,0x3C,0x7C,0x39,0xC0,0x0F,0x1F,0x0E,0x70,0x01,0xC3,0xC1,0xFC,0x00,0x78,0x70,0x3F,0x00,0x0E,0x0C,0x07,0xC0,0x03,0xC0,0x00,0xE0,0x00,0xF0,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00, // 'M' + 0x00,0x00,0x00,0x00,0x00,0x1E,0x03,0xC0,0x01,0xF0,0x1E,0x00,0x0F,0x81,0xE0,0x00,0xF8,0x0F,0x00,0x0F,0xC0,0xF0,0x00,0xFE,0x07,0x00,0x07,0x70,0x78,0x00,0x73,0x87,0x80,0x07,0xB8,0x38,0x00,0x39,0xC3,0xC0,0x03,0x8E,0x3C,0x00,0x3C,0x73,0xC0,0x01,0xC3,0x9E,0x00,0x1E,0x39,0xE0,0x00,0xE1,0xDE,0x00,0x0E,0x0F,0xE0,0x00,0xF0,0x7F,0x00,0x07,0x03,0xF0,0x00,0x78,0x3F,0x00,0x03,0x81,0xF0,0x00,0x38,0x0F,0x80,0x01,0xC0,0x78,0x00,0x1E,0x03,0x80,0x00,0xE0,0x00,0x00,0x00, // 'N' + 0x00,0x01,0xF0,0x00,0x1F,0xE0,0x00,0x7F,0xA0,0x03,0xF3,0xF0,0x0F,0x9F,0xE0,0x3E,0x7F,0xC0,0xF1,0xE7,0x83,0xC3,0x8E,0x0F,0x06,0x3C,0x3C,0x04,0x70,0x70,0x01,0xE1,0xE0,0x07,0x87,0x80,0x0F,0x0E,0x00,0x3C,0x1C,0x00,0xF0,0x70,0x03,0xC0,0xE0,0x0F,0x01,0xC0,0x7C,0x03,0x81,0xF0,0x07,0x8F,0xC0,0x07,0xFF,0x00,0x0F,0xF8,0x00,0x07,0xC0,0x00,0x00, // 'O' + 0x00,0x1F,0xE0,0x01,0xFF,0xFC,0x07,0xF6,0x3E,0x1F,0x8C,0x1F,0x3E,0x1C,0x0F,0x7C,0x38,0x0F,0x78,0x78,0x0F,0x7C,0x70,0x1E,0x38,0xE0,0x3E,0x01,0xE0,0x7C,0x01,0xC0,0xF8,0x03,0xC3,0xF0,0x03,0xFF,0xE0,0x07,0xFF,0x80,0x0F,0xBE,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3E,0x00,0x00,0x3C,0x00,0x00,0x7C,0x00,0x00,0x78,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, // 'P' + 0x00,0x00,0x7E,0x00,0x01,0xFF,0x80,0x03,0xE0,0xE0,0x03,0xC0,0x70,0x07,0x80,0x38,0x07,0x80,0x3C,0x07,0x80,0x1E,0x07,0x80,0x0E,0x07,0x80,0x0F,0x07,0x80,0x0F,0x83,0x80,0x07,0x83,0x80,0x07,0xC3,0x80,0x07,0xC1,0xC0,0x03,0xC1,0xC0,0x03,0xE0,0xE0,0x03,0xE0,0xE0,0x63,0xE0,0x70,0x73,0xE0,0x38,0x7B,0xE0,0x1C,0xFB,0xE0,0x0F,0xFF,0xC0,0x03,0xFF,0xC0,0x00,0xFF,0x80,0x00,0x03,0xE0,0x00,0x00,0xF8,0x00,0x00,0x3F,0x00,0x00,0x0F,0xE0,0x00,0x01,0xC0,0x00, // 'Q' + 0x00,0x3F,0xE0,0x03,0xFF,0xF0,0x3F,0xB0,0xF1,0xF8,0xE0,0x77,0xC1,0xC0,0xEE,0x07,0x03,0xFE,0x1E,0x0F,0xB8,0x38,0x3E,0x00,0xE0,0xF8,0x03,0x87,0xE0,0x0F,0x7F,0x00,0x1F,0xF8,0x00,0x7F,0x80,0x01,0xFC,0x00,0x03,0xBC,0x00,0x0F,0x3C,0x00,0x3C,0x3C,0x00,0x70,0x3C,0x01,0xE0,0x78,0x03,0x80,0x78,0x0F,0x00,0x78,0x1C,0x00,0x7E,0x00,0x00,0x78,0x00,0x00,0x00, // 'R' + 0x00,0x00,0xFE,0x00,0x03,0xFF,0x80,0x0F,0xFF,0xC0,0x0F,0xE7,0xE0,0x1F,0x80,0x00,0x1F,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x0E,0x00,0x00,0x07,0x00,0x00,0x03,0xE0,0x00,0x00,0xFF,0x00,0x00,0x3F,0xE0,0x00,0x07,0xFC,0x00,0x00,0x3F,0x00,0x00,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x70,0x00,0x00,0xF8,0x08,0x00,0xF8,0x06,0x03,0xF8,0x03,0xFF,0xF0,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00, // 'S' + 0x00,0x00,0x3C,0x00,0x00,0xF8,0xC0,0x0F,0xF1,0xFF,0xFF,0x83,0xFF,0xF8,0x03,0xFC,0xE0,0x00,0x03,0x80,0x00,0x0F,0x00,0x00,0x1C,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x0E,0x00,0x00,0x3C,0x00,0x00,0x70,0x00,0x01,0xC0,0x00,0x07,0x80,0x00,0x0E,0x00,0x00,0xB8,0x00,0x03,0xF0,0x00,0x07,0xC0,0x00,0x1F,0x00,0x00,0x3C,0x00,0x00,0x70,0x00,0x00, // 'T' + 0x00,0x0C,0x00,0x00,0x07,0xC0,0x78,0x01,0xF0,0x1F,0x02,0xFC,0x07,0xC0,0xFF,0x00,0xF0,0x1F,0xC0,0x3E,0x01,0xF8,0x0F,0x80,0x0E,0x03,0xE0,0x03,0x80,0xFC,0x00,0xF0,0x3F,0x00,0x1C,0x0F,0xC0,0x07,0x03,0xF0,0x01,0xC0,0xEE,0x00,0x38,0x3F,0x80,0x0E,0x0F,0xE1,0x01,0xC3,0xDC,0x60,0x70,0xF7,0x1C,0x0E,0x3D,0xE7,0x83,0x8F,0x39,0xE0,0x77,0xCF,0xF8,0x0F,0xF1,0xFC,0x01,0xF8,0x3F,0x00,0x1C,0x07,0x80,0x00, // 'U' + 0x00,0x0E,0x07,0xC0,0x07,0x80,0xF0,0x07,0xE0,0x3C,0x03,0xF0,0x1E,0x09,0xF8,0x0F,0x83,0xFC,0x03,0xC0,0xFF,0x01,0xE0,0x3B,0x80,0xF8,0x01,0xC0,0x7C,0x00,0xF0,0x1E,0x00,0x78,0x0F,0x00,0x3C,0x07,0x80,0x0F,0x03,0xE0,0x07,0x81,0xF0,0x03,0xC0,0xF8,0x00,0xF0,0x7C,0x00,0x78,0x3C,0x00,0x1E,0x1E,0x00,0x0F,0x1F,0x00,0x03,0xCF,0x80,0x00,0xFF,0x80,0x00,0x3F,0xC0,0x00,0x07,0x80,0x00,0x00, // 'V' + 0x00,0x0E,0x00,0x07,0x80,0x0F,0x80,0x00,0xF0,0x0F,0xE0,0xF0,0x3C,0x0F,0xF0,0x78,0x1E,0x03,0xB8,0x1E,0x07,0x80,0xDE,0x0F,0x03,0xC0,0x0F,0x07,0x81,0xF0,0x07,0x83,0xC0,0x78,0x03,0xC1,0xF0,0x3C,0x01,0xF0,0xF8,0x1F,0x00,0x78,0x7E,0x0F,0x80,0x3C,0x3F,0x07,0xC0,0x1F,0x1F,0xC3,0xE0,0x07,0x8F,0xE0,0xF0,0x03,0xC7,0xF8,0x78,0x00,0xF3,0xDC,0x3C,0x00,0x79,0xEF,0x1E,0x00,0x1E,0xF3,0x8F,0x00,0x0F,0x79,0xEF,0x80,0x03,0xFC,0x7F,0xC0,0x00,0xFE,0x1F,0xC0,0x00,0x3F,0x07,0xE0,0x00,0x07,0x00,0xE0,0x00,0x00, // 'W' + 0x00,0x01,0x80,0x00,0x00,0x1F,0x00,0xF0,0x01,0xFC,0x0F,0x80,0x0F,0xF0,0x78,0x00,0x79,0xC7,0xC0,0x01,0xC6,0x3E,0x00,0x06,0x39,0xE0,0x00,0x10,0xFF,0x00,0x00,0x03,0xF8,0x00,0x00,0x1F,0x80,0x00,0x00,0x7C,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x00,0x00,0x00,0xF8,0x00,0x00,0x0F,0xE0,0x00,0x00,0x7B,0x82,0x00,0x03,0xDC,0x38,0x00,0x3E,0x71,0xE0,0x01,0xF1,0xCF,0x00,0x0F,0x87,0x7C,0x00,0x7C,0x1F,0xC0,0x01,0xC0,0x7E,0x00,0x06,0x00,0xE0,0x00,0x00, // 'X' + 0x00,0x00,0x00,0x00,0x07,0x00,0x40,0x07,0xC0,0x78,0x03,0xE0,0x3C,0x0B,0xF8,0x1F,0x03,0xFC,0x07,0x80,0xEE,0x03,0xE0,0x07,0x81,0xF0,0x03,0xC0,0xF8,0x00,0xF0,0x7E,0x00,0x78,0x3F,0x00,0x3C,0x1F,0xC0,0x0F,0x0E,0xE0,0x07,0x87,0x70,0x03,0xC3,0xBC,0x00,0xF1,0xCE,0x00,0x78,0xE7,0x80,0x1E,0x73,0xC0,0x0F,0x38,0xE0,0x03,0xFC,0x78,0x00,0xFE,0x1C,0x00,0x3E,0x0F,0x00,0x07,0x07,0x80,0x00,0x01,0xC0,0x00,0x00,0xF0,0x00,0x00,0x38,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x03,0xA0,0x00,0x01,0xF0,0x00,0x00,0x78,0x00,0x00,0x1E,0x00,0x00,0x03,0x00,0x00,0x00, // 'Y' + 0x00,0xC0,0x01,0xC0,0x70,0x00,0xF0,0x1F,0xFF,0xF8,0x07,0xFF,0xFC,0x00,0xFF,0x3E,0x00,0x00,0x1E,0x00,0x00,0x0F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x7C,0x00,0x00,0x3E,0x00,0x00,0x1F,0x00,0x00,0x0F,0x80,0x00,0x07,0xC0,0x00,0x03,0xE0,0x00,0x01,0xF0,0x00,0x00,0xF8,0x00,0x00,0x3C,0x7F,0xE0,0x1F,0xFF,0xFC,0x07,0xFF,0xFF,0x00,0xFE,0x00,0x40, // 'Z' + 0x00,0x07,0xF0,0x00,0x3F,0x80,0x03,0xFC,0x00,0x1C,0x00,0x00,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x3C,0x00,0x01,0xC0,0x00,0x1E,0x00,0x00,0xE0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x80,0x00,0x38,0x00,0x03,0xC0,0x00,0x1C,0x00,0x01,0xE0,0x00,0x0E,0x00,0x00,0x7F,0x80,0x03,0xF8,0x00,0x0F,0x00,0x00, // '[' + 0x03,0x18,0xE7,0x18,0xC7,0x39,0xCE,0x71,0x8C,0x63,0x18,0xC6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x08, // '\' + 0x00,0x07,0xF0,0x00,0x7F,0x80,0x01,0xFC,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x3C,0x00,0x01,0xC0,0x00,0x1E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x38,0x00,0x3F,0xC0,0x03,0xFC,0x00,0x1F,0xE0,0x00, // ']' + 0x00,0x40,0x1C,0x0F,0x83,0xF0,0xF6,0x3C,0xDF,0x3F,0x87,0xE0,0xE8,0x1C, // '^' + 0x3F,0xFC,0xFF,0xF9,0x80,0x00, // '_' + 0x07,0x38,0xE3,0x18,0x60, // '`' + 0x01,0xFC,0x07,0xFC,0x0F,0x38,0x1C,0x78,0x38,0xF0,0x70,0xF0,0x61,0xE0,0xE3,0xE0,0xC7,0xC2,0xDF,0xC6,0xFE,0xCE,0xFC,0xFC,0x70,0x70, // 'a' + 0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0xE0,0x03,0x00,0x1C,0x00,0x7F,0x03,0xFE,0x1F,0x38,0x60,0xE3,0x83,0x8C,0x1C,0x70,0x71,0x83,0x86,0x1C,0x30,0xF0,0xC7,0x83,0x3C,0x0F,0xC0,0x1C,0x00, // 'b' + 0x01,0xE0,0x3F,0x83,0xCC,0x38,0xE3,0x86,0x38,0x01,0x80,0x1C,0x00,0xC0,0x06,0x00,0xF0,0x0D,0xC3,0xE7,0xFC,0x1F,0x00, // 'c' + 0x00,0x00,0x18,0x00,0x01,0xC0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x78,0x00,0x3B,0x80,0x07,0xFC,0x00,0x7F,0xC0,0x07,0x1E,0x00,0x71,0xE0,0x07,0x1E,0x00,0x71,0xF0,0x03,0x1F,0x00,0x39,0xF8,0x81,0x9F,0xCC,0x0D,0xEC,0x60,0x7E,0x6E,0x01,0xC3,0xE0,0x00,0x0E,0x00, // 'd' + 0x01,0xE0,0x7E,0x0E,0xC1,0xC0,0x30,0x03,0xF0,0x3E,0x03,0xC0,0x70,0x2E,0x06,0xC0,0xEC,0x3C,0xFF,0x83,0xE0, // 'e' + 0x00,0x00,0x30,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x1C,0x00,0x00,0xC0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x06,0x00,0x00,0x70,0x00,0x03,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x0C,0xE0,0x03,0xFF,0x80,0x3F,0xC0,0x01,0xE7,0x00,0x07,0x18,0x00,0x70,0xC0,0x03,0x86,0x00,0x38,0x60,0x01,0x86,0x00,0x1C,0x30,0x00,0xC3,0x00,0x0E,0x30,0x00,0x63,0x00,0x07,0x38,0x00,0x33,0x80,0x01,0xF0,0x00,0x0F,0x00,0x00,0x70,0x00,0x00, // 'f' + 0x00,0x76,0x01,0xFE,0x07,0xDC,0x0F,0x3C,0x1C,0x78,0x38,0xF0,0x70,0xF0,0x61,0xE0,0xE7,0xC2,0xCF,0xCF,0xDF,0x9E,0xF9,0xFC,0x73,0xF0,0x07,0xE0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x7C,0x00,0xF8,0x00,0xF0,0x00,0xE0,0x00,0xE0,0x00, // 'g' + 0x00,0x06,0x00,0x07,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x01,0x80,0x01,0xC0,0x01,0xC0,0x00,0xC0,0x00,0xE0,0x00,0x63,0x80,0x77,0xC0,0x37,0xE0,0x37,0x60,0x3F,0x70,0x1B,0x70,0x1F,0x38,0x0F,0x38,0x0F,0x9C,0x07,0x9E,0x27,0x8E,0x33,0x87,0x39,0x83,0xF8,0xC0,0xF0, // 'h' + 0x00,0x60,0x1C,0x03,0x00,0x00,0x00,0x0C,0x03,0x80,0xF0,0x1E,0x03,0x80,0x70,0x1C,0x03,0x80,0xE0,0x1C,0x47,0x18,0xE7,0x1F,0xC1,0xE0,0x00, // 'i' + 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xE0,0x00,0x0C,0x00,0x00,0x00,0x00,0x30,0x00,0x0F,0x00,0x01,0xF0,0x00,0x1E,0x00,0x00,0xC0,0x00,0x1C,0x00,0x03,0x80,0x00,0x38,0x00,0x07,0x18,0x00,0x63,0x80,0x0E,0xF0,0x00,0xDC,0x00,0x1F,0x80,0x01,0xE0,0x00,0x3C,0x00,0x07,0x80,0x00,0xF0,0x00,0x1E,0x00,0x03,0xC0,0x00,0x7C,0x00,0x0F,0x80,0x00,0xF0,0x00,0x0E,0x00,0x00, // 'j' + 0x00,0x0C,0x00,0x38,0x00,0x60,0x01,0xC0,0x07,0x00,0x0E,0x00,0x38,0x00,0x70,0x01,0xC0,0x03,0x80,0x0E,0x30,0x1C,0x60,0x71,0xC0,0xE7,0x03,0x9C,0x06,0x78,0x1F,0xC0,0x3F,0x00,0xFC,0x01,0xF8,0x17,0x38,0x6E,0x71,0xB8,0x7E,0x30,0x78, // 'k' + 0x00,0x18,0x01,0xF0,0x0E,0xC0,0x73,0x01,0x98,0x0E,0xE0,0x73,0x01,0x98,0x0C,0xE0,0x77,0x01,0x98,0x0C,0xC0,0x37,0x00,0xF8,0x06,0xC0,0x1E,0x00,0x70,0x03,0xC0,0x0E,0x00,0x30,0x20,0xC1,0x83,0x1E,0x0F,0xF0,0x1F,0x00, // 'l' + 0x01,0x8C,0x1C,0x07,0x7C,0xF8,0x0D,0xFB,0xF0,0x3F,0x6E,0xC0,0xF9,0xFB,0x81,0xE3,0xE6,0x07,0x8F,0x98,0x0F,0x1E,0x60,0x3C,0x78,0xC2,0x70,0xE3,0x0D,0xC3,0x86,0x7B,0x8E,0x0F,0xE6,0x1C,0x1F,0x80,0x00,0x1E,0x00, // 'm' + 0x00,0xC7,0x00,0xEF,0x80,0xEF,0xC0,0x7F,0xC0,0x7E,0xE0,0x3C,0xE0,0x3C,0x60,0x3E,0x70,0x1E,0x30,0x1E,0x38,0xCE,0x18,0xEE,0x0C,0xE6,0x07,0xE0,0x01,0xC0, // 'n' + 0x01,0xC0,0x3F,0x83,0xDE,0x3C,0x63,0x83,0x38,0x39,0xC3,0x8C,0x18,0xC1,0x86,0x1C,0x33,0xC1,0xF8,0x07,0x80,0x00, // 'o' + 0x00,0x01,0x80,0x00,0x38,0x00,0x07,0x00,0x00,0x60,0x00,0x0E,0x00,0x00,0xDF,0x00,0x1B,0xF0,0x03,0xF7,0x00,0x3E,0x60,0x07,0xC6,0x00,0xF8,0xC0,0x0F,0x1C,0x01,0xE3,0x80,0x3C,0x70,0x03,0x8E,0x00,0x7F,0xC0,0x06,0xF0,0x00,0xE0,0x00,0x1C,0x00,0x01,0x80,0x00,0x38,0x00,0x07,0x00,0x00,0x70,0x00,0x0E,0x00,0x00,0xC0,0x00,0x0C,0x00,0x00, // 'p' + 0x00,0x76,0x01,0xFE,0x03,0xCE,0x0F,0x1C,0x1E,0x3C,0x3C,0x38,0x38,0x78,0x70,0xF0,0x71,0xE0,0xE3,0xE0,0xEF,0xC0,0xFF,0xC0,0xFD,0x80,0x73,0x80,0x03,0x00,0x07,0x00,0x06,0x80,0x0F,0xC0,0x0F,0x80,0x1F,0x00,0x1E,0x00,0x1C,0x00,0x18,0x00, // 'q' + 0x00,0xCE,0x01,0xDE,0x03,0xFE,0x03,0xEE,0x07,0xCC,0x0F,0x88,0x0F,0x00,0x1E,0x00,0x1C,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0x60,0x00, // 'r' + 0x00,0xF0,0x3F,0xC3,0xFC,0x7C,0xE3,0x80,0x30,0x01,0xC0,0x0F,0xE0,0x3F,0xC0,0x1E,0x00,0x71,0x8F,0x0F,0xF0,0x3E,0x00, // 's' + 0x00,0x30,0x01,0xC0,0x0E,0x00,0x3C,0x3F,0xFD,0xFF,0xE0,0x70,0x01,0xC0,0x0E,0x00,0x30,0x01,0xC0,0x0E,0x00,0x38,0x01,0xC0,0x06,0x00,0x18,0x00,0xC1,0x03,0x0C,0x0C,0xF0,0x3F,0x00,0x78,0x00, // 't' + 0x02,0x0E,0x07,0x0C,0x0E,0x1C,0x0E,0x18,0x1C,0x38,0x1C,0x70,0x38,0xF0,0x39,0xE0,0x73,0xE0,0x77,0xC2,0x6E,0xC6,0x7C,0xCE,0x78,0xFC,0x70,0x70, // 'u' + 0x00,0x00,0x61,0xC7,0x0E,0x78,0x77,0x87,0x3C,0x38,0xE3,0x86,0x1C,0x71,0xC3,0x1C,0x39,0xC1,0x9C,0x0D,0xC0,0x7C,0x01,0x80,0x00, // 'v' + 0x00,0x00,0x00,0xE0,0x0C,0x3C,0x61,0x8F,0x1C,0x73,0xE7,0x0C,0x38,0xE3,0x87,0x3C,0x61,0xCF,0x1C,0x3B,0xE7,0x06,0xF9,0xC1,0xFB,0x70,0x3E,0x7C,0x07,0xCF,0x00,0xF1,0xC0,0x18,0x00,0x00, // 'w' + 0x00,0x06,0x03,0x1E,0x07,0x3C,0x0F,0x78,0x0F,0xF0,0x03,0xE0,0x03,0xC0,0x03,0x80,0x0F,0x00,0x1F,0x00,0x3F,0x08,0x7B,0x18,0x73,0x38,0xE3,0xF0,0xC1,0xC0, // 'x' + 0x06,0x0C,0x0C,0x38,0x38,0x60,0x61,0xC1,0xC7,0x07,0x1E,0x0E,0x78,0x39,0xF1,0x77,0xC7,0xDF,0x1F,0xF6,0x77,0xD9,0x87,0x76,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x01,0xE0,0x07,0xC0,0x0F,0x00,0x0C,0x00,0x00, // 'y' + 0x1F,0xF8,0xFF,0xE0,0x0F,0x00,0x78,0x07,0x80,0x3C,0x01,0xE0,0x0F,0x00,0x38,0x19,0xC7,0xEF,0xFF,0xBF,0xF0,0xF8,0x00, // 'z' + 0x00,0x03,0xE0,0x00,0x7F,0x80,0x07,0xFC,0x00,0x38,0x20,0x01,0xC0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x18,0x00,0x01,0xC0,0x00,0x1E,0x00,0x01,0xE0,0x00,0x1E,0x00,0x1F,0xE0,0x00,0xFC,0x00,0x01,0xF0,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xE0,0x00,0x0E,0x00,0x00,0xE0,0x00,0x07,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x38,0x00,0x03,0x80,0x00,0x1C,0x00,0x01,0xC0,0x00,0x0E,0x00,0x00,0x7F,0x80,0x03,0xF8,0x00,0x0F,0x00,0x00, // '{' + 0x00,0x00,0xC0,0x00,0x70,0x00,0x18,0x00,0x0E,0x00,0x07,0x00,0x01,0x80,0x00,0xE0,0x00,0x30,0x00,0x1C,0x00,0x06,0x00,0x03,0x80,0x00,0xC0,0x00,0x70,0x00,0x38,0x00,0x0E,0x00,0x07,0x00,0x01,0xC0,0x00,0xE0,0x00,0x38,0x00,0x1C,0x00,0x07,0x00,0x03,0x80,0x00,0xC0,0x00,0x70,0x00,0x18,0x00,0x0E,0x00,0x03,0x00,0x01,0xC0,0x00,0x60,0x00,0x38,0x00,0x0C,0x00,0x00, // '|' + 0x00,0x01,0xF0,0x00,0x3F,0xC0,0x01,0xFE,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x38,0x00,0x01,0xC0,0x00,0x1C,0x00,0x01,0xC0,0x00,0x1C,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0xC0,0x00,0x0F,0x80,0x00,0xFE,0x00,0x0F,0xE0,0x00,0xF0,0x00,0x0F,0x00,0x00,0x70,0x00,0x07,0x00,0x00,0x30,0x00,0x03,0x80,0x00,0x1C,0x00,0x00,0xE0,0x00,0x0E,0x00,0x00,0x70,0x00,0x03,0x80,0x00,0x1C,0x00,0x31,0xC0,0x01,0xFE,0x00,0x0F,0xC0,0x00 // '}' +}; +const GFXglyph Yellowtail_32Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 8, 0, 0 }, // ' ' + { 1, 18, 24, 12, 2, -23 }, // '!' + { 55, 10, 8, 12, 7, -22 }, // '"' + { 65, 18, 18, 18, 2, -19 }, // '#' + { 106, 14, 24, 14, 2, -22 }, // '$' + { 148, 18, 20, 23, 4, -20 }, // '%' + { 193, 15, 23, 15, 3, -23 }, // '&' + { 237, 6, 8, 7, 7, -22 }, // ''' + { 243, 19, 32, 13, 3, -26 }, // '(' + { 319, 18, 32, 12, -3, -26 }, // ')' + { 391, 10, 9, 13, 7, -22 }, // '*' + { 403, 12, 12, 14, 3, -16 }, // '+' + { 421, 6, 6, 9, 0, -3 }, // ',' + { 426, 9, 4, 11, 2, -9 }, // '-' + { 431, 4, 3, 9, 2, -2 }, // '.' + { 433, 24, 30, 14, -2, -26 }, // '/' + { 523, 16, 20, 14, 1, -20 }, // '0' + { 563, 13, 20, 9, 0, -20 }, // '1' + { 596, 16, 20, 14, 1, -20 }, // '2' + { 636, 15, 19, 14, 1, -19 }, // '3' + { 672, 16, 21, 15, 2, -20 }, // '4' + { 714, 17, 20, 14, 1, -19 }, // '5' + { 757, 17, 21, 14, 1, -20 }, // '6' + { 802, 15, 20, 12, 2, -19 }, // '7' + { 840, 20, 20, 14, 0, -19 }, // '8' + { 890, 17, 21, 15, 1, -20 }, // '9' + { 935, 8, 12, 12, 3, -11 }, // ':' + { 947, 11, 14, 13, 1, -11 }, // ';' + { 967, 9, 15, 12, 5, -17 }, // '<' + { 984, 15, 7, 15, 2, -13 }, // '=' + { 998, 9, 15, 13, 2, -18 }, // '>' + { 1015, 18, 24, 18, 4, -23 }, // '?' + { 1069, 24, 24, 24, 3, -23 }, // '@' + { 1141, 24, 24, 20, 1, -23 }, // 'A' + { 1213, 23, 23, 23, 3, -23 }, // 'B' + { 1280, 21, 23, 20, 3, -23 }, // 'C' + { 1341, 24, 23, 26, 4, -23 }, // 'D' + { 1410, 20, 23, 20, 3, -23 }, // 'E' + { 1468, 23, 23, 20, 5, -23 }, // 'F' + { 1535, 25, 31, 22, 2, -23 }, // 'G' + { 1632, 29, 24, 25, 3, -23 }, // 'H' + { 1719, 18, 23, 10, 0, -23 }, // 'I' + { 1771, 28, 33, 22, 0, -23 }, // 'J' + { 1887, 29, 23, 25, 1, -23 }, // 'K' + { 1971, 30, 24, 24, -2, -23 }, // 'L' + { 2061, 35, 27, 26, -3, -23 }, // 'M' + { 2180, 29, 25, 23, 0, -24 }, // 'N' + { 2271, 23, 23, 22, 3, -23 }, // 'O' + { 2338, 24, 24, 24, 5, -23 }, // 'P' + { 2410, 25, 28, 24, 2, -23 }, // 'Q' + { 2498, 23, 24, 25, 5, -23 }, // 'R' + { 2567, 25, 24, 23, 2, -23 }, // 'S' + { 2642, 23, 24, 19, 5, -23 }, // 'T' + { 2711, 27, 23, 25, 3, -23 }, // 'U' + { 2789, 26, 23, 22, 3, -23 }, // 'V' + { 2864, 34, 23, 30, 2, -23 }, // 'W' + { 2962, 30, 23, 21, -1, -23 }, // 'X' + { 3049, 26, 33, 23, 3, -23 }, // 'Y' + { 3157, 26, 24, 20, 0, -23 }, // 'Z' + { 3235, 21, 32, 13, 0, -27 }, // '[' + { 3319, 5, 30, 13, 6, -26 }, // '\' + { 3338, 21, 32, 14, -2, -27 }, // ']' + { 3422, 11, 10, 17, 7, -23 }, // '^' + { 3436, 15, 3, 13, -3, 2 }, // '_' + { 3442, 5, 7, 14, 8, -21 }, // '`' + { 3447, 16, 13, 15, 1, -12 }, // 'a' + { 3473, 14, 24, 14, 1, -23 }, // 'b' + { 3515, 13, 14, 13, 1, -13 }, // 'c' + { 3538, 21, 24, 15, 1, -23 }, // 'd' + { 3601, 12, 14, 12, 1, -13 }, // 'e' + { 3622, 21, 33, 12, -5, -23 }, // 'f' + { 3709, 16, 23, 14, 0, -13 }, // 'g' + { 3755, 17, 24, 14, -1, -23 }, // 'h' + { 3806, 11, 19, 8, 1, -18 }, // 'i' + { 3833, 20, 28, 8, -8, -18 }, // 'j' + { 3903, 15, 24, 13, -1, -23 }, // 'k' + { 3948, 14, 24, 10, 2, -23 }, // 'l' + { 3990, 23, 14, 21, -1, -13 }, // 'm' + { 4031, 17, 14, 14, -2, -13 }, // 'n' + { 4061, 13, 13, 13, 1, -13 }, // 'o' + { 4083, 20, 26, 14, -6, -16 }, // 'p' + { 4148, 16, 23, 14, 0, -13 }, // 'q' + { 4194, 16, 13, 12, -2, -13 }, // 'r' + { 4220, 13, 14, 13, 1, -13 }, // 's' + { 4243, 14, 21, 8, 1, -20 }, // 't' + { 4280, 16, 14, 15, 0, -13 }, // 'u' + { 4308, 13, 15, 13, 1, -14 }, // 'v' + { 4333, 19, 15, 18, 0, -14 }, // 'w' + { 4369, 16, 15, 13, -1, -14 }, // 'x' + { 4399, 15, 22, 14, 0, -12 }, // 'y' + { 4441, 14, 13, 13, 0, -13 }, // 'z' + { 4464, 21, 32, 15, 3, -27 }, // '{' + { 4548, 18, 31, 13, 1, -27 }, // '|' + { 4618, 21, 32, 16, -3, -27 } // '}' +}; +const GFXfont Yellowtail_32 PROGMEM = { +(uint8_t *)Yellowtail_32Bitmaps,(GFXglyph *)Yellowtail_32Glyphs,0x20, 0x7D, 45}; diff --git a/libraries/TFT_eSPI/Fonts/Font16.c b/libraries/TFT_eSPI/Fonts/Font16.c new file mode 100644 index 0000000..9a24959 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font16.c @@ -0,0 +1,632 @@ +// Font 2 + +// Comment out for £ sign for character 24 +#define TFT_ESPI_FONT2_DOLLAR + +// The grave ( ` ) diacritical mark will show as a degree ( ° ) symbol +// Comment out next line to return character 0x60 to the grave accent: +#define TFT_ESPI_GRAVE_IS_DEGREE + +// Width has been increased by 1 pixel so pixel lengths are calculated correctly +// for the displayed string + +PROGMEM const unsigned char widtbl_f16[96] = // character width table +{ + 6, 3, 4, 9, 8, 9, 9, 3, // char 32 - 39 + 7, 7, 8, 6, 3, 6, 5, 7, // char 40 - 47 + 8, 8, 8, 8, 8, 8, 8, 8, // char 48 - 55 + 8, 8, 3, 3, 6, 6, 6, 8, // char 56 - 63 + 9, 8, 8, 8, 8, 8, 8, 8, // char 64 - 71 + 8, 4, 8, 8, 7, 10, 8, 8, // char 72 - 79 + 8, 8, 8, 8, 8, 8, 8, 10, // char 80 - 87 + 8, 8, 8, 4, 7, 4, 7, 9, // char 88 - 95 +#ifdef TFT_ESPI_GRAVE_IS_DEGREE + 5, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 0x60 is degree symbol +#else + 4, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 0x60 is grave +#endif + 7, 4, 5, 6, 4, 8, 7, 8, // char 104 - 111 + 7, 8, 6, 6, 5, 7, 8, 8, // char 112 - 119 + 6, 7, 7, 5, 3, 5, 8, 6 // char 120 - 127 +}; + +// Row format, MSB left + +PROGMEM const unsigned char chr_f16_20[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_21[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x00, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_22[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_23[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0xFF, 0x24, 0x24, 0xFF, 0x24, // row 1 - 11 + 0x24, 0x24, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_24[16] = // 1 unsigned char per row +{ +#ifdef TFT_ESPI_FONT2_DOLLAR + 0x00, 0x00, 0x28, 0x38, 0x6C, 0xAA, 0xA8, 0x68, 0x3C, 0x2A, 0xAA, // row 1 - 11 + 0x6C, 0x38, 0x28, 0x00, 0x00 // row 12 - 16 +#else // GBP sign + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x40, 0x40, 0x70, 0x40, 0x70, 0x40, // row 1 - 11 + 0x40, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 +#endif +}; + +PROGMEM const unsigned char chr_f16_25[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x61, 0x91, 0x92, 0x64, 0x08, 0x10, 0x26, 0x49, // row 1 - 11 + 0x89, 0x86, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_26[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x20, 0x50, 0x88, 0x88, 0x50, 0x20, 0x52, 0x8C, // row 1 - 11 + 0x8C, 0x73, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_27[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_28[16] = // 1 unsigned char per row +{ + 0x00, 0x0C, 0x10, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 + 0x40, 0x40, 0x20, 0x10, 0x0C // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_29[16] = // 1 unsigned char per row +{ + 0x00, 0xC0, 0x20, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, // row 1 - 11 + 0x08, 0x08, 0x10, 0x20, 0xC0 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2B[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0xC0, 0xC0, 0x40, 0x80, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2D[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2E[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0xC0, 0xC0, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_2F[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, // row 1 - 11 + 0x40, 0x80, 0x80, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_30[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_31[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 + 0x10, 0x7C, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_32[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x18, 0x20, 0x40, // row 1 - 11 + 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_33[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x78, 0x84, 0x02, 0x04, 0x38, 0x04, 0x02, 0x02, // row 1 - 11 + 0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_34[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x44, 0x84, 0xFE, 0x04, // row 1 - 11 + 0x04, 0x04, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_35[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xFC, 0x80, 0x80, 0x80, 0xF8, 0x04, 0x02, 0x02, // row 1 - 11 + 0x84, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_36[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x3C, 0x40, 0x80, 0x80, 0xB8, 0xC4, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_37[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, // row 1 - 11 + 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_38[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x44, 0x38, 0x44, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_39[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x46, 0x3A, 0x02, 0x02, // row 1 - 11 + 0x04, 0x78, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3B[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, // row 1 - 11 + 0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, // row 1 - 11 + 0x10, 0x08, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3D[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3E[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, // row 1 - 11 + 0x40, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_3F[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x02, 0x04, 0x08, 0x10, 0x10, // row 1 - 11 + 0x00, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_40[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x99, 0xA5, 0xA5, 0xA5, 0xA5, 0x9E, // row 1 - 11 + 0x40, 0x3E, 0x00, 0x00, 0x00 // row 12 - 16 +}; +PROGMEM const unsigned char chr_f16_41[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x7C, 0x82, // row 1 - 11 + 0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_42[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x84, 0xF8, 0x84, 0x82, 0x82, // row 1 - 11 + 0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_43[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 + 0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16 +}; +PROGMEM const unsigned char chr_f16_44[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 + 0x84, 0xF8, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_45[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, // row 1 - 11 + 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_46[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xFE, 0x80, 0x80, 0x80, 0xF8, 0x80, 0x80, 0x80, // row 1 - 11 + 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 +}; +PROGMEM const unsigned char chr_f16_47[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x3C, 0x42, 0x80, 0x80, 0x80, 0x9C, 0x82, 0x82, // row 1 - 11 + 0x42, 0x3C, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_48[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, // row 1 - 11 + 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_49[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x40, 0xE0, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_4A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_4B[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x84, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, // row 1 - 11 + 0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_4C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 + 0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_4D[32] = // 2 unsigned chars per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0xC1, 0x80, 0xA2, 0x80, // row 1 - 6 + 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, // row 7 - 12 + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 +}; + +PROGMEM const unsigned char chr_f16_4E[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xC2, 0xC2, 0xA2, 0xA2, 0x92, 0x92, 0x8A, 0x8A, // row 1 - 11 + 0x86, 0x86, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_4F[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_50[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x82, 0x84, 0xF8, 0x80, // row 1 - 11 + 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 +}; +PROGMEM const unsigned char chr_f16_51[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x08, 0x06, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_52[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xF8, 0x84, 0x82, 0x82, 0x84, 0xF8, 0x90, 0x88, // row 1 - 11 + 0x84, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_53[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x80, 0x60, 0x1C, 0x02, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_54[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 + 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_55[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_56[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, // row 1 - 11 + 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_57[32] = // 2 unsigned chars per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 6 + 0x88, 0x80, 0x88, 0x80, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, // row 7 - 12 + 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // row 13 - 16 +}; + +PROGMEM const unsigned char chr_f16_58[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, // row 1 - 11 + 0x82, 0x82, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_59[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, // row 1 - 11 + 0x10, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, // row 1 - 11 + 0x80, 0xFE, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5B[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // row 1 - 11 + 0x80, 0x80, 0xE0, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, // row 1 - 11 + 0x08, 0x04, 0x04, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5D[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // row 1 - 11 + 0x20, 0x20, 0xE0, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5E[32] = // 1 unsigned chars per row +{ + 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_5F[32] = // 1 unsigned chars per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0xFF, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_60[16] = // 1 unsigned char per row +{ +#ifdef TFT_ESPI_GRAVE_IS_DEGREE + 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 Degree symbol + 0x00, 0x00, 0x00, 0x00, 0x00 +#else + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 Grave accent + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +#endif +}; + +PROGMEM const unsigned char chr_f16_61[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x04, 0x74, 0x8C, // row 1 - 11 + 0x8C, 0x74, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_62[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 + 0xC8, 0xB0, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_63[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x80, 0x80, 0x80, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_64[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 + 0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_65[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x84, 0xF8, 0x80, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_66[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x30, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x40, 0x40, // row 1 - 11 + 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 +}; +PROGMEM const unsigned char chr_f16_67[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 + 0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_68[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 + 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_69[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, // row 1 - 11 + 0x10, 0x10, 0x10, 0x90, 0x60 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6B[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x90, 0xA0, 0xC0, 0xA0, // row 1 - 11 + 0x90, 0x88, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x40, 0x40, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6D[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD2, 0x92, 0x92, 0x92, // row 1 - 11 + 0x92, 0x92, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6E[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 + 0x84, 0x84, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_6F[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, // row 1 - 11 + 0x44, 0x38, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_70[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x84, 0x84, 0x84, // row 1 - 11 + 0xC8, 0xB0, 0x80, 0x80, 0x80 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_71[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x4C, 0x84, 0x84, 0x84, // row 1 - 11 + 0x4C, 0x34, 0x04, 0x04, 0x06 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_72[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80, // row 1 - 11 + 0x80, 0x80, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_73[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, // row 1 - 11 + 0x88, 0x70, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_74[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x40, 0x30, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_75[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11 + 0x4C, 0x34, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_76[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, // row 1 - 11 + 0x28, 0x10, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_77[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, // row 1 - 11 + 0xAA, 0x44, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_78[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x50, // row 1 - 11 + 0x88, 0x88, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_79[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, // row 1 - 11 + 0x4C, 0x34, 0x04, 0x08, 0x70 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7A[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x04, 0x08, 0x30, 0x40, // row 1 - 11 + 0x80, 0xFC, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7B[16] = // 1 unsigned char per row +{ + 0x00, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x20, // row 1 - 11 + 0x20, 0x20, 0x20, 0x20, 0x10 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7C[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // row 1 - 11 + 0x40, 0x40, 0x40, 0x40, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7D[16] = // 1 unsigned char per row +{ + 0x00, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, // row 1 - 11 + 0x20, 0x20, 0x20, 0x20, 0x40 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7E[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char chr_f16_7F[16] = // 1 unsigned char per row +{ + 0x00, 0x00, 0x30, 0x48, 0x48, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 + 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16 +}; + +PROGMEM const unsigned char* const chrtbl_f16[96] = // character pointer table +{ + chr_f16_20, chr_f16_21, chr_f16_22, chr_f16_23, chr_f16_24, chr_f16_25, chr_f16_26, chr_f16_27, + chr_f16_28, chr_f16_29, chr_f16_2A, chr_f16_2B, chr_f16_2C, chr_f16_2D, chr_f16_2E, chr_f16_2F, + chr_f16_30, chr_f16_31, chr_f16_32, chr_f16_33, chr_f16_34, chr_f16_35, chr_f16_36, chr_f16_37, + chr_f16_38, chr_f16_39, chr_f16_3A, chr_f16_3B, chr_f16_3C, chr_f16_3D, chr_f16_3E, chr_f16_3F, + chr_f16_40, chr_f16_41, chr_f16_42, chr_f16_43, chr_f16_44, chr_f16_45, chr_f16_46, chr_f16_47, + chr_f16_48, chr_f16_49, chr_f16_4A, chr_f16_4B, chr_f16_4C, chr_f16_4D, chr_f16_4E, chr_f16_4F, + chr_f16_50, chr_f16_51, chr_f16_52, chr_f16_53, chr_f16_54, chr_f16_55, chr_f16_56, chr_f16_57, + chr_f16_58, chr_f16_59, chr_f16_5A, chr_f16_5B, chr_f16_5C, chr_f16_5D, chr_f16_5E, chr_f16_5F, + chr_f16_60, chr_f16_61, chr_f16_62, chr_f16_63, chr_f16_64, chr_f16_65, chr_f16_66, chr_f16_67, + chr_f16_68, chr_f16_69, chr_f16_6A, chr_f16_6B, chr_f16_6C, chr_f16_6D, chr_f16_6E, chr_f16_6F, + chr_f16_70, chr_f16_71, chr_f16_72, chr_f16_73, chr_f16_74, chr_f16_75, chr_f16_76, chr_f16_77, + chr_f16_78, chr_f16_79, chr_f16_7A, chr_f16_7B, chr_f16_7C, chr_f16_7D, chr_f16_7E, chr_f16_7F +}; diff --git a/libraries/TFT_eSPI/Fonts/Font16.h b/libraries/TFT_eSPI/Fonts/Font16.h new file mode 100644 index 0000000..0aa54a0 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font16.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f16 96 +#define chr_hgt_f16 16 +#define baseline_f16 13 +#define data_size_f16 8 +#define firstchr_f16 32 + +extern const unsigned char widtbl_f16[96]; +extern const unsigned char* const chrtbl_f16[96]; diff --git a/libraries/TFT_eSPI/Fonts/Font32rle.c b/libraries/TFT_eSPI/Fonts/Font32rle.c new file mode 100644 index 0000000..7a8119b --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font32rle.c @@ -0,0 +1,1065 @@ +// Font 4 +// +// This font has been 8-bit Run Length Encoded to save FLASH space +// +// This font contains 96 ASCII characters + +// Use the #define below to select a GBP sign instead of a dollar sign +//#define FONT_4_GBP + +PROGMEM const unsigned char widtbl_f32[96] = // character width table +{ + 5, 8, 8, 19, 14, 21, 17, 6, // char 32 - 39 + 8, 8, 12, 10, 7, 8, 7, 8, // char 40 - 47 + 14, 14, 14, 14, 14, 14, 14, 14, // char 48 - 55 + 14, 14, 7, 7, 14, 9, 14, 13, // char 56 - 63 + 25, 16, 17, 18, 18, 16, 15, 19, // char 64 - 71 + 18, 6, 13, 17, 13, 21, 18, 19, // char 72 - 79 + 16, 19, 17, 16, 14, 18, 15, 23, // char 80 - 87 + 15, 16, 16, 9, 13, 9, 12, 13, // char 88 - 95 + 9, 14, 15, 13, 15, 14, 8, 15, // char 96 - 103 + 15, 6, 6, 12, 6, 22, 15, 15, // char 104 - 111 + 15, 15, 8, 12, 7, 14, 12, 18, // char 112 - 119 + 13, 13, 12, 13, 13, 13, 15, 1 // char 120 - 127 +}; + +// Row format, MSB left + +PROGMEM const unsigned char chr_f32_20[] = +{ +0x7F, 0x1 +}; + +PROGMEM const unsigned char chr_f32_21[] = +{ +0x0A, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x15, 0x81, 0x05, 0x81, 0x05, 0x81, +0x3A +}; + +PROGMEM const unsigned char chr_f32_22[] = +{ +0x09, 0x80, 0x01, 0x80, 0x03, 0x80, 0x01, 0x80, +0x03, 0x80, 0x01, 0x80, 0x03, 0x80, 0x01, 0x80, +0x03, 0x80, 0x01, 0x80, 0x03, 0x80, 0x01, 0x80, +0x03, 0x80, 0x01, 0x80, 0x7F, 0x11 +}; + +PROGMEM const unsigned char chr_f32_23[] = +{ +0x2E, 0x81, 0x01, 0x81, 0x0C, 0x80, 0x02, 0x80, +0x0D, 0x80, 0x02, 0x80, 0x0C, 0x81, 0x01, 0x81, +0x0C, 0x80, 0x02, 0x80, 0x0D, 0x80, 0x02, 0x80, +0x08, 0x8D, 0x08, 0x80, 0x02, 0x80, 0x0D, 0x80, +0x02, 0x80, 0x0D, 0x80, 0x02, 0x80, 0x08, 0x8D, +0x08, 0x80, 0x02, 0x80, 0x0D, 0x80, 0x02, 0x80, +0x0C, 0x81, 0x01, 0x81, 0x0C, 0x80, 0x02, 0x80, +0x0D, 0x80, 0x02, 0x80, 0x0C, 0x81, 0x01, 0x81, +0x7F, 0xD +}; + +#ifdef FONT_4_GBP +// GBP symbol +PROGMEM const unsigned char chr_f32_24[] = +{ +0x1F, 0x85, 0x05, 0x89, 0x03, 0x82, 0x03, 0x82, +0x02, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x0B, 0x82, 0x0B, 0x81, 0x0A, 0x87, +0x07, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0A, 0x81, 0x0B, 0x86, 0x02, 0x80, 0x01, 0x8B, +0x01, 0x81, 0x04, 0x83, 0x63 +}; +#else +// Dollar symbol +PROGMEM const unsigned char chr_f32_24[] = +{ +0x14, 0x80, 0x0A, 0x83, 0x07, 0x87, 0x04, 0x82, +0x01, 0x80, 0x00, 0x82, 0x03, 0x81, 0x02, 0x80, +0x01, 0x81, 0x03, 0x81, 0x02, 0x80, 0x01, 0x82, +0x02, 0x82, 0x01, 0x80, 0x08, 0x84, 0x09, 0x84, +0x0B, 0x83, 0x09, 0x84, 0x08, 0x80, 0x01, 0x82, +0x01, 0x82, 0x02, 0x80, 0x02, 0x81, 0x02, 0x81, +0x02, 0x80, 0x02, 0x81, 0x02, 0x83, 0x00, 0x80, +0x01, 0x82, 0x03, 0x88, 0x06, 0x84, 0x0A, 0x80, +0x67 +}; +#endif + +PROGMEM const unsigned char chr_f32_25[] = +{ +0x2D, 0x82, 0x07, 0x81, 0x05, 0x86, 0x05, 0x80, +0x06, 0x81, 0x02, 0x81, 0x04, 0x81, 0x05, 0x81, +0x04, 0x81, 0x02, 0x81, 0x06, 0x81, 0x04, 0x81, +0x02, 0x80, 0x07, 0x81, 0x04, 0x81, 0x01, 0x81, +0x08, 0x81, 0x02, 0x81, 0x02, 0x80, 0x09, 0x86, +0x01, 0x80, 0x0C, 0x82, 0x02, 0x81, 0x02, 0x82, +0x0C, 0x80, 0x01, 0x86, 0x09, 0x80, 0x02, 0x81, +0x02, 0x81, 0x08, 0x81, 0x01, 0x81, 0x04, 0x81, +0x07, 0x80, 0x02, 0x81, 0x04, 0x81, 0x06, 0x81, +0x02, 0x81, 0x04, 0x81, 0x05, 0x81, 0x04, 0x81, +0x02, 0x81, 0x06, 0x80, 0x05, 0x86, 0x05, 0x81, +0x07, 0x82, 0x07, 0x80, 0x7F, 0xC +}; + +PROGMEM const unsigned char chr_f32_26[] = +{ +0x15, 0x84, 0x0A, 0x86, 0x08, 0x82, 0x02, 0x82, +0x07, 0x81, 0x04, 0x81, 0x07, 0x81, 0x04, 0x81, +0x07, 0x81, 0x03, 0x82, 0x08, 0x81, 0x01, 0x82, +0x0A, 0x84, 0x0A, 0x83, 0x0B, 0x85, 0x03, 0x81, +0x03, 0x82, 0x01, 0x82, 0x02, 0x81, 0x02, 0x82, +0x03, 0x82, 0x01, 0x81, 0x02, 0x81, 0x05, 0x84, +0x03, 0x81, 0x06, 0x83, 0x03, 0x81, 0x07, 0x81, +0x04, 0x82, 0x04, 0x85, 0x03, 0x88, 0x01, 0x82, +0x03, 0x85, 0x04, 0x82, 0x76 +}; + +PROGMEM const unsigned char chr_f32_27[] = +{ +0x06, 0x82, 0x02, 0x82, 0x02, 0x82, 0x04, 0x80, +0x03, 0x81, 0x02, 0x81, 0x74 +}; + +PROGMEM const unsigned char chr_f32_28[] = +{ +0x0D, 0x81, 0x05, 0x80, 0x05, 0x81, 0x05, 0x80, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x04, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x06, 0x81, 0x05, 0x81, 0x05, 0x81, +0x06, 0x80, 0x06, 0x81, 0x06, 0x80, 0x06, 0x81, +0x7 +}; + +PROGMEM const unsigned char chr_f32_29[] = +{ +0x07, 0x81, 0x06, 0x80, 0x06, 0x81, 0x06, 0x80, +0x06, 0x81, 0x05, 0x81, 0x05, 0x81, 0x06, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x04, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x80, 0x05, 0x81, 0x05, 0x80, 0x05, 0x81, +0xD +}; + +PROGMEM const unsigned char chr_f32_2A[] = +{ +0x10, 0x81, 0x09, 0x81, 0x09, 0x81, 0x06, 0x80, +0x01, 0x81, 0x01, 0x80, 0x02, 0x89, 0x03, 0x85, +0x06, 0x83, 0x06, 0x81, 0x01, 0x81, 0x04, 0x82, +0x01, 0x82, 0x04, 0x80, 0x03, 0x80, 0x7F, 0x36 +}; + +PROGMEM const unsigned char chr_f32_2B[] = +{ +0x53, 0x81, 0x07, 0x81, 0x07, 0x81, 0x04, 0x87, +0x01, 0x87, 0x04, 0x81, 0x07, 0x81, 0x07, 0x81, +0x67 +}; + +PROGMEM const unsigned char chr_f32_2C[] = +{ +0x71, 0x82, 0x03, 0x82, 0x03, 0x82, 0x05, 0x80, +0x04, 0x81, 0x04, 0x80, 0x04, 0x81, 0x17 +}; + +PROGMEM const unsigned char chr_f32_2D[] = +{ +0x58, 0x85, 0x01, 0x85, 0x68 +}; + +PROGMEM const unsigned char chr_f32_2E[] = +{ +0x71, 0x82, 0x03, 0x82, 0x03, 0x82, 0x32 +}; + +PROGMEM const unsigned char chr_f32_2F[] = +{ +0x0D, 0x81, 0x05, 0x81, 0x05, 0x80, 0x05, 0x81, +0x05, 0x81, 0x05, 0x80, 0x05, 0x81, 0x05, 0x81, +0x05, 0x80, 0x05, 0x81, 0x05, 0x81, 0x05, 0x80, +0x05, 0x81, 0x05, 0x81, 0x05, 0x80, 0x05, 0x81, +0x05, 0x81, 0x05, 0x80, 0x05, 0x81, 0x05, 0x81, +0x2D +}; + +PROGMEM const unsigned char chr_f32_30[] = +{ +0x20, 0x83, 0x07, 0x87, 0x04, 0x83, 0x01, 0x83, +0x03, 0x81, 0x05, 0x81, 0x02, 0x82, 0x05, 0x82, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x82, 0x05, 0x82, +0x02, 0x81, 0x05, 0x81, 0x03, 0x83, 0x01, 0x83, +0x04, 0x87, 0x07, 0x83, 0x66 +}; + +PROGMEM const unsigned char chr_f32_31[] = +{ +0x22, 0x81, 0x0B, 0x81, 0x0A, 0x82, 0x07, 0x85, +0x07, 0x85, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x66 +}; + +PROGMEM const unsigned char chr_f32_32[] = +{ +0x1F, 0x85, 0x05, 0x89, 0x03, 0x82, 0x03, 0x82, +0x02, 0x82, 0x06, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x0B, 0x81, 0x0A, 0x82, +0x08, 0x83, 0x07, 0x84, 0x06, 0x84, 0x07, 0x83, +0x08, 0x82, 0x09, 0x82, 0x0A, 0x81, 0x0B, 0x8B, +0x01, 0x8B, 0x62 +}; + +PROGMEM const unsigned char chr_f32_33[] = +{ +0x1F, 0x85, 0x06, 0x87, 0x04, 0x82, 0x03, 0x82, +0x03, 0x81, 0x05, 0x81, 0x02, 0x82, 0x05, 0x81, +0x0B, 0x81, 0x0A, 0x82, 0x07, 0x84, 0x08, 0x85, +0x0B, 0x82, 0x0B, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x82, 0x05, 0x82, +0x02, 0x82, 0x03, 0x82, 0x03, 0x89, 0x05, 0x85, +0x65 +}; + +PROGMEM const unsigned char chr_f32_34[] = +{ +0x24, 0x81, 0x0A, 0x82, 0x09, 0x83, 0x09, 0x83, +0x08, 0x81, 0x00, 0x81, 0x07, 0x81, 0x01, 0x81, +0x06, 0x81, 0x02, 0x81, 0x06, 0x81, 0x02, 0x81, +0x05, 0x81, 0x03, 0x81, 0x04, 0x81, 0x04, 0x81, +0x03, 0x81, 0x05, 0x81, 0x03, 0x8B, 0x01, 0x8B, +0x09, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x64 +}; + +PROGMEM const unsigned char chr_f32_35[] = +{ +0x1D, 0x89, 0x03, 0x89, 0x03, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x00, 0x84, 0x05, 0x89, +0x02, 0x83, 0x03, 0x82, 0x02, 0x81, 0x06, 0x82, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x01, 0x81, +0x07, 0x81, 0x01, 0x82, 0x05, 0x82, 0x02, 0x82, +0x03, 0x82, 0x03, 0x89, 0x05, 0x85, 0x65 +}; + +PROGMEM const unsigned char chr_f32_36[] = +{ +0x20, 0x84, 0x06, 0x88, 0x03, 0x82, 0x04, 0x81, +0x03, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x01, 0x81, 0x0B, 0x81, 0x01, 0x84, 0x04, 0x8A, +0x02, 0x83, 0x03, 0x82, 0x02, 0x82, 0x05, 0x82, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x02, 0x81, 0x05, 0x82, +0x02, 0x82, 0x03, 0x82, 0x04, 0x88, 0x05, 0x85, +0x65 +}; + +PROGMEM const unsigned char chr_f32_37[] = +{ +0x1C, 0x8B, 0x01, 0x8B, 0x0A, 0x81, 0x0A, 0x82, +0x09, 0x82, 0x0A, 0x81, 0x0A, 0x82, 0x0A, 0x81, +0x0A, 0x81, 0x0B, 0x81, 0x0A, 0x82, 0x0A, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0A, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x69 +}; + +PROGMEM const unsigned char chr_f32_38[] = +{ +0x20, 0x83, 0x07, 0x87, 0x05, 0x81, 0x03, 0x81, +0x04, 0x81, 0x05, 0x81, 0x03, 0x81, 0x05, 0x81, +0x03, 0x81, 0x05, 0x81, 0x04, 0x81, 0x03, 0x81, +0x06, 0x85, 0x06, 0x87, 0x04, 0x82, 0x03, 0x82, +0x02, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x02, 0x82, 0x03, 0x82, 0x03, 0x89, 0x05, 0x85, +0x65 +}; + +PROGMEM const unsigned char chr_f32_39[] = +{ +0x1F, 0x85, 0x05, 0x88, 0x04, 0x82, 0x03, 0x82, +0x02, 0x82, 0x05, 0x81, 0x02, 0x81, 0x07, 0x81, +0x01, 0x81, 0x07, 0x81, 0x01, 0x81, 0x07, 0x81, +0x01, 0x82, 0x05, 0x82, 0x02, 0x82, 0x03, 0x83, +0x02, 0x8A, 0x04, 0x84, 0x01, 0x81, 0x0B, 0x81, +0x01, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x03, 0x81, 0x04, 0x82, 0x03, 0x88, 0x05, 0x86, +0x65 +}; + +PROGMEM const unsigned char chr_f32_3A[] = +{ +0x2B, 0x82, 0x03, 0x82, 0x03, 0x82, 0x34, 0x82, +0x03, 0x82, 0x03, 0x82, 0x32 +}; + +PROGMEM const unsigned char chr_f32_3B[] = +{ +0x2B, 0x82, 0x03, 0x82, 0x03, 0x82, 0x34, 0x82, +0x03, 0x82, 0x03, 0x82, 0x05, 0x80, 0x04, 0x81, +0x04, 0x80, 0x04, 0x81, 0x17 +}; + +PROGMEM const unsigned char chr_f32_3C[] = +{ +0x6B, 0x82, 0x08, 0x82, 0x07, 0x83, 0x07, 0x82, +0x08, 0x81, 0x0D, 0x82, 0x0D, 0x82, 0x0C, 0x82, +0x0C, 0x82, 0x7F, 0xC +}; + +PROGMEM const unsigned char chr_f32_3D[] = +{ +0x51, 0x86, 0x01, 0x86, 0x13, 0x86, 0x01, 0x86, +0x63 +}; + +PROGMEM const unsigned char chr_f32_3E[] = +{ +0x62, 0x82, 0x0C, 0x82, 0x0C, 0x83, 0x0C, 0x82, +0x0D, 0x81, 0x08, 0x82, 0x07, 0x83, 0x07, 0x82, +0x08, 0x82, 0x7F, 0x15 +}; + +PROGMEM const unsigned char chr_f32_3F[] = +{ +0x10, 0x85, 0x04, 0x88, 0x03, 0x82, 0x03, 0x82, +0x01, 0x82, 0x05, 0x81, 0x01, 0x81, 0x06, 0x81, +0x01, 0x81, 0x06, 0x81, 0x09, 0x82, 0x08, 0x82, +0x08, 0x82, 0x08, 0x82, 0x09, 0x81, 0x09, 0x82, +0x09, 0x82, 0x23, 0x82, 0x09, 0x82, 0x09, 0x82, +0x5F +}; + +PROGMEM const unsigned char chr_f32_40[] = +{ +0x21, 0x88, 0x0D, 0x82, 0x06, 0x82, 0x09, 0x82, +0x0A, 0x81, 0x07, 0x81, 0x0D, 0x81, 0x05, 0x81, +0x0F, 0x81, 0x04, 0x80, 0x06, 0x83, 0x01, 0x80, +0x03, 0x81, 0x02, 0x81, 0x04, 0x81, 0x02, 0x83, +0x03, 0x81, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, +0x04, 0x81, 0x01, 0x81, 0x04, 0x81, 0x04, 0x81, +0x04, 0x81, 0x01, 0x81, 0x03, 0x81, 0x05, 0x81, +0x04, 0x81, 0x01, 0x81, 0x03, 0x81, 0x05, 0x81, +0x04, 0x81, 0x01, 0x81, 0x03, 0x81, 0x04, 0x81, +0x04, 0x81, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, +0x04, 0x81, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, +0x03, 0x81, 0x04, 0x81, 0x03, 0x81, 0x02, 0x82, +0x02, 0x81, 0x05, 0x81, 0x04, 0x83, 0x01, 0x84, +0x07, 0x81, 0x17, 0x81, 0x17, 0x81, 0x0B, 0x81, +0x09, 0x82, 0x05, 0x83, 0x0D, 0x87, 0x6C +}; + +PROGMEM const unsigned char chr_f32_41[] = +{ +0x15, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x0A, 0x81, +0x01, 0x81, 0x09, 0x81, 0x01, 0x81, 0x09, 0x81, +0x01, 0x81, 0x08, 0x81, 0x03, 0x81, 0x07, 0x81, +0x03, 0x81, 0x07, 0x81, 0x03, 0x81, 0x06, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x89, +0x04, 0x8B, 0x03, 0x81, 0x07, 0x81, 0x03, 0x81, +0x07, 0x81, 0x02, 0x81, 0x09, 0x81, 0x01, 0x81, +0x09, 0x81, 0x00, 0x82, 0x09, 0x82, 0x6F +}; + +PROGMEM const unsigned char chr_f32_42[] = +{ +0x12, 0x8A, 0x05, 0x8C, 0x03, 0x81, 0x07, 0x82, +0x03, 0x81, 0x08, 0x81, 0x03, 0x81, 0x08, 0x81, +0x03, 0x81, 0x08, 0x81, 0x03, 0x81, 0x08, 0x81, +0x03, 0x81, 0x07, 0x82, 0x03, 0x8A, 0x05, 0x8C, +0x03, 0x81, 0x07, 0x82, 0x03, 0x81, 0x09, 0x81, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x09, 0x81, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x07, 0x82, +0x03, 0x8C, 0x03, 0x8A, 0x7A +}; + +PROGMEM const unsigned char chr_f32_43[] = +{ +0x17, 0x86, 0x08, 0x8A, 0x05, 0x83, 0x04, 0x83, +0x03, 0x82, 0x08, 0x81, 0x03, 0x81, 0x0A, 0x81, +0x01, 0x82, 0x0A, 0x81, 0x01, 0x81, 0x0F, 0x81, +0x0F, 0x81, 0x0F, 0x81, 0x0F, 0x81, 0x0F, 0x81, +0x0B, 0x81, 0x01, 0x82, 0x0A, 0x81, 0x02, 0x81, +0x09, 0x82, 0x02, 0x82, 0x08, 0x81, 0x04, 0x83, +0x04, 0x83, 0x05, 0x8A, 0x08, 0x86, 0x7F, 0x2 +}; + +PROGMEM const unsigned char chr_f32_44[] = +{ +0x13, 0x89, 0x07, 0x8B, 0x05, 0x81, 0x06, 0x83, +0x04, 0x81, 0x08, 0x82, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x82, 0x02, 0x81, 0x0A, 0x81, +0x02, 0x81, 0x0A, 0x81, 0x02, 0x81, 0x0A, 0x81, +0x02, 0x81, 0x0A, 0x81, 0x02, 0x81, 0x0A, 0x81, +0x02, 0x81, 0x0A, 0x81, 0x02, 0x81, 0x09, 0x82, +0x02, 0x81, 0x09, 0x81, 0x03, 0x81, 0x08, 0x82, +0x03, 0x81, 0x06, 0x83, 0x04, 0x8B, 0x05, 0x89, +0x7F, 0x3 +}; + +PROGMEM const unsigned char chr_f32_45[] = +{ +0x11, 0x8C, 0x02, 0x8C, 0x02, 0x81, 0x0D, 0x81, +0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, +0x0D, 0x8B, 0x03, 0x8B, 0x03, 0x81, 0x0D, 0x81, +0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, +0x0D, 0x8C, 0x02, 0x8C, 0x70 +}; + +PROGMEM const unsigned char chr_f32_46[] = +{ +0x10, 0x8B, 0x02, 0x8B, 0x02, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x8A, 0x03, 0x8A, 0x03, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x73 +}; + +PROGMEM const unsigned char chr_f32_47[] = +{ +0x18, 0x86, 0x09, 0x8A, 0x06, 0x82, 0x05, 0x83, +0x04, 0x82, 0x08, 0x81, 0x04, 0x81, 0x09, 0x82, +0x02, 0x82, 0x0F, 0x81, 0x10, 0x81, 0x10, 0x81, +0x05, 0x87, 0x02, 0x81, 0x05, 0x87, 0x02, 0x81, +0x0B, 0x81, 0x02, 0x81, 0x0B, 0x81, 0x02, 0x82, +0x0A, 0x81, 0x03, 0x81, 0x09, 0x82, 0x03, 0x82, +0x07, 0x83, 0x04, 0x83, 0x04, 0x84, 0x05, 0x89, +0x00, 0x81, 0x07, 0x85, 0x03, 0x80, 0x7F, 0x6 +}; + +PROGMEM const unsigned char chr_f32_48[] = +{ +0x13, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x8D, 0x03, 0x8D, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x7F +}; + +PROGMEM const unsigned char chr_f32_49[] = +{ +0x07, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x2B +}; + +PROGMEM const unsigned char chr_f32_4A[] = +{ +0x15, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x01, 0x81, 0x06, 0x81, 0x01, 0x81, 0x06, 0x81, +0x01, 0x81, 0x06, 0x81, 0x01, 0x82, 0x04, 0x82, +0x02, 0x88, 0x04, 0x86, 0x5E +}; + +PROGMEM const unsigned char chr_f32_4B[] = +{ +0x12, 0x81, 0x08, 0x82, 0x02, 0x81, 0x07, 0x82, +0x03, 0x81, 0x06, 0x82, 0x04, 0x81, 0x05, 0x82, +0x05, 0x81, 0x04, 0x82, 0x06, 0x81, 0x03, 0x82, +0x07, 0x81, 0x02, 0x82, 0x08, 0x81, 0x01, 0x82, +0x09, 0x81, 0x00, 0x83, 0x09, 0x87, 0x08, 0x83, +0x01, 0x82, 0x07, 0x82, 0x03, 0x82, 0x06, 0x81, +0x05, 0x81, 0x06, 0x81, 0x05, 0x82, 0x05, 0x81, +0x06, 0x82, 0x04, 0x81, 0x07, 0x82, 0x03, 0x81, +0x08, 0x82, 0x02, 0x81, 0x09, 0x82, 0x76 +}; + +PROGMEM const unsigned char chr_f32_4C[] = +{ +0x0E, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x8A, 0x01, 0x8A, 0x5A +}; + +PROGMEM const unsigned char chr_f32_4D[] = +{ +0x16, 0x82, 0x0A, 0x82, 0x03, 0x83, 0x08, 0x83, +0x03, 0x83, 0x08, 0x83, 0x03, 0x83, 0x08, 0x83, +0x03, 0x81, 0x00, 0x81, 0x06, 0x81, 0x00, 0x81, +0x03, 0x81, 0x00, 0x81, 0x06, 0x81, 0x00, 0x81, +0x03, 0x81, 0x00, 0x81, 0x06, 0x81, 0x00, 0x81, +0x03, 0x81, 0x01, 0x81, 0x04, 0x81, 0x01, 0x81, +0x03, 0x81, 0x01, 0x81, 0x04, 0x81, 0x01, 0x81, +0x03, 0x81, 0x01, 0x81, 0x04, 0x81, 0x01, 0x81, +0x03, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x81, +0x03, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x81, +0x03, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x81, +0x03, 0x81, 0x03, 0x81, 0x00, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x00, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x84, 0x03, 0x81, 0x03, 0x81, +0x04, 0x82, 0x04, 0x81, 0x03, 0x81, 0x04, 0x82, +0x04, 0x81, 0x7F, 0x14 +}; + +PROGMEM const unsigned char chr_f32_4E[] = +{ +0x13, 0x82, 0x08, 0x81, 0x03, 0x82, 0x08, 0x81, +0x03, 0x83, 0x07, 0x81, 0x03, 0x84, 0x06, 0x81, +0x03, 0x81, 0x00, 0x81, 0x06, 0x81, 0x03, 0x81, +0x00, 0x82, 0x05, 0x81, 0x03, 0x81, 0x01, 0x82, +0x04, 0x81, 0x03, 0x81, 0x02, 0x81, 0x04, 0x81, +0x03, 0x81, 0x02, 0x82, 0x03, 0x81, 0x03, 0x81, +0x03, 0x82, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, +0x02, 0x81, 0x03, 0x81, 0x04, 0x82, 0x01, 0x81, +0x03, 0x81, 0x05, 0x82, 0x00, 0x81, 0x03, 0x81, +0x06, 0x81, 0x00, 0x81, 0x03, 0x81, 0x06, 0x84, +0x03, 0x81, 0x07, 0x83, 0x03, 0x81, 0x08, 0x82, +0x03, 0x81, 0x08, 0x82, 0x7F +}; + +PROGMEM const unsigned char chr_f32_4F[] = +{ +0x18, 0x86, 0x09, 0x8A, 0x06, 0x83, 0x04, 0x83, +0x04, 0x82, 0x08, 0x82, 0x03, 0x81, 0x0A, 0x81, +0x02, 0x82, 0x0A, 0x82, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x82, 0x0A, 0x82, +0x02, 0x81, 0x0A, 0x81, 0x03, 0x82, 0x08, 0x82, +0x04, 0x83, 0x04, 0x83, 0x06, 0x8A, 0x09, 0x86, +0x7F, 0xA +}; + +PROGMEM const unsigned char chr_f32_50[] = +{ +0x11, 0x8A, 0x04, 0x8B, 0x03, 0x81, 0x07, 0x82, +0x02, 0x81, 0x08, 0x81, 0x02, 0x81, 0x08, 0x81, +0x02, 0x81, 0x08, 0x81, 0x02, 0x81, 0x08, 0x81, +0x02, 0x81, 0x07, 0x82, 0x02, 0x8B, 0x03, 0x8A, +0x04, 0x81, 0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, +0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, +0x7B +}; + +PROGMEM const unsigned char chr_f32_51[] = +{ +0x18, 0x86, 0x09, 0x8A, 0x06, 0x83, 0x04, 0x83, +0x04, 0x82, 0x08, 0x82, 0x03, 0x81, 0x0A, 0x81, +0x02, 0x82, 0x0A, 0x82, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x81, 0x0C, 0x81, +0x01, 0x81, 0x0C, 0x81, 0x01, 0x82, 0x06, 0x80, +0x02, 0x82, 0x02, 0x81, 0x05, 0x82, 0x01, 0x81, +0x03, 0x82, 0x05, 0x85, 0x04, 0x83, 0x04, 0x83, +0x06, 0x8C, 0x07, 0x86, 0x01, 0x82, 0x10, 0x80, +0x73 +}; + +PROGMEM const unsigned char chr_f32_52[] = +{ +0x12, 0x8B, 0x04, 0x8C, 0x03, 0x81, 0x08, 0x82, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x09, 0x81, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x09, 0x81, +0x02, 0x81, 0x08, 0x81, 0x03, 0x8C, 0x03, 0x8B, +0x04, 0x81, 0x07, 0x82, 0x03, 0x81, 0x08, 0x81, +0x03, 0x81, 0x08, 0x82, 0x02, 0x81, 0x09, 0x81, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x09, 0x81, +0x02, 0x81, 0x09, 0x81, 0x02, 0x81, 0x09, 0x81, +0x77 +}; + +PROGMEM const unsigned char chr_f32_53[] = +{ +0x14, 0x85, 0x07, 0x89, 0x04, 0x82, 0x05, 0x82, +0x03, 0x81, 0x07, 0x81, 0x03, 0x81, 0x07, 0x81, +0x03, 0x81, 0x07, 0x82, 0x02, 0x82, 0x0D, 0x84, +0x0B, 0x86, 0x0B, 0x85, 0x0C, 0x83, 0x0D, 0x82, +0x01, 0x82, 0x08, 0x81, 0x02, 0x81, 0x08, 0x81, +0x02, 0x81, 0x08, 0x81, 0x02, 0x83, 0x05, 0x82, +0x03, 0x8A, 0x06, 0x86, 0x73 +}; + +PROGMEM const unsigned char chr_f32_54[] = +{ +0x0D, 0x9B, 0x05, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, 0x0B, 0x81, +0x0B, 0x81, 0x67 +}; + +PROGMEM const unsigned char chr_f32_55[] = +{ +0x13, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x81, 0x09, 0x81, 0x03, 0x81, 0x09, 0x81, +0x03, 0x82, 0x07, 0x82, 0x04, 0x82, 0x05, 0x82, +0x06, 0x89, 0x08, 0x87, 0x7F, 0x2 +}; + +PROGMEM const unsigned char chr_f32_56[] = +{ +0x0E, 0x82, 0x08, 0x82, 0x00, 0x81, 0x08, 0x81, +0x01, 0x81, 0x08, 0x81, 0x01, 0x81, 0x08, 0x81, +0x02, 0x81, 0x06, 0x81, 0x03, 0x81, 0x06, 0x81, +0x03, 0x81, 0x06, 0x81, 0x04, 0x81, 0x04, 0x81, +0x05, 0x81, 0x04, 0x81, 0x05, 0x81, 0x04, 0x81, +0x06, 0x81, 0x02, 0x81, 0x07, 0x81, 0x02, 0x81, +0x07, 0x81, 0x02, 0x81, 0x08, 0x81, 0x00, 0x81, +0x09, 0x81, 0x00, 0x81, 0x09, 0x84, 0x0A, 0x82, +0x0B, 0x82, 0x6E +}; + +PROGMEM const unsigned char chr_f32_57[] = +{ +0x16, 0x82, 0x06, 0x82, 0x06, 0x82, 0x00, 0x81, +0x06, 0x82, 0x06, 0x81, 0x01, 0x81, 0x06, 0x82, +0x06, 0x81, 0x01, 0x82, 0x04, 0x81, 0x00, 0x81, +0x04, 0x82, 0x02, 0x81, 0x04, 0x81, 0x00, 0x81, +0x04, 0x81, 0x03, 0x81, 0x04, 0x81, 0x00, 0x81, +0x04, 0x81, 0x03, 0x81, 0x04, 0x81, 0x00, 0x81, +0x04, 0x81, 0x03, 0x82, 0x02, 0x81, 0x02, 0x81, +0x02, 0x82, 0x04, 0x81, 0x02, 0x81, 0x02, 0x81, +0x02, 0x81, 0x05, 0x81, 0x02, 0x81, 0x02, 0x81, +0x02, 0x81, 0x05, 0x81, 0x02, 0x81, 0x02, 0x81, +0x02, 0x81, 0x05, 0x82, 0x00, 0x81, 0x04, 0x81, +0x00, 0x82, 0x06, 0x81, 0x00, 0x81, 0x04, 0x81, +0x00, 0x81, 0x07, 0x81, 0x00, 0x81, 0x04, 0x81, +0x00, 0x81, 0x07, 0x81, 0x00, 0x81, 0x04, 0x81, +0x00, 0x81, 0x07, 0x83, 0x06, 0x83, 0x08, 0x82, +0x06, 0x82, 0x09, 0x82, 0x06, 0x82, 0x7F, 0x25 +}; + +PROGMEM const unsigned char chr_f32_58[] = +{ +0x0F, 0x81, 0x08, 0x81, 0x01, 0x82, 0x06, 0x82, +0x02, 0x81, 0x06, 0x81, 0x04, 0x81, 0x04, 0x81, +0x05, 0x82, 0x02, 0x82, 0x06, 0x81, 0x02, 0x81, +0x08, 0x81, 0x00, 0x81, 0x09, 0x84, 0x0A, 0x82, +0x0B, 0x82, 0x0A, 0x81, 0x00, 0x81, 0x08, 0x82, +0x00, 0x82, 0x07, 0x81, 0x02, 0x81, 0x06, 0x81, +0x04, 0x81, 0x04, 0x82, 0x04, 0x82, 0x03, 0x81, +0x06, 0x81, 0x02, 0x82, 0x06, 0x82, 0x00, 0x82, +0x08, 0x82, 0x68 +}; + +PROGMEM const unsigned char chr_f32_59[] = +{ +0x0F, 0x82, 0x09, 0x82, 0x00, 0x82, 0x07, 0x82, +0x02, 0x81, 0x07, 0x81, 0x03, 0x82, 0x05, 0x82, +0x04, 0x81, 0x05, 0x81, 0x06, 0x81, 0x03, 0x81, +0x07, 0x82, 0x01, 0x82, 0x08, 0x81, 0x01, 0x81, +0x0A, 0x83, 0x0B, 0x83, 0x0C, 0x81, 0x0D, 0x81, +0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, 0x0D, 0x81, +0x0D, 0x81, 0x0D, 0x81, 0x76 +}; + +PROGMEM const unsigned char chr_f32_5A[] = +{ +0x11, 0x8C, 0x02, 0x8C, 0x0C, 0x82, 0x0B, 0x82, +0x0B, 0x82, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x82, +0x0B, 0x82, 0x0B, 0x82, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x82, 0x0B, 0x82, 0x0B, 0x82, 0x0B, 0x82, +0x0C, 0x8D, 0x01, 0x8D, 0x70 +}; + +PROGMEM const unsigned char chr_f32_5B[] = +{ +0x0B, 0x84, 0x03, 0x84, 0x03, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x84, 0x03, 0x84, 0x12 +}; + +PROGMEM const unsigned char chr_f32_5C[] = +{ +0x01, 0x80, 0x0B, 0x80, 0x0B, 0x81, 0x0B, 0x80, +0x0B, 0x80, 0x0B, 0x81, 0x0B, 0x80, 0x0B, 0x80, +0x0B, 0x81, 0x0B, 0x80, 0x0B, 0x80, 0x0B, 0x81, +0x0B, 0x80, 0x0B, 0x80, 0x0B, 0x81, 0x0B, 0x80, +0x0B, 0x80, 0x0B, 0x81, 0x0B, 0x80, 0x0B, 0x80, +0x0B, 0x81, 0x0B, 0x80, 0x0B, 0x80, 0x0B, 0x81, +0x0B, 0x80, 0xE +}; + +PROGMEM const unsigned char chr_f32_5D[] = +{ +0x09, 0x84, 0x03, 0x84, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x06, 0x81, 0x06, 0x81, 0x06, 0x81, +0x06, 0x81, 0x03, 0x84, 0x03, 0x84, 0x14 +}; + +PROGMEM const unsigned char chr_f32_5E[] = +{ +0x10, 0x82, 0x07, 0x81, 0x00, 0x81, 0x05, 0x81, +0x02, 0x81, 0x03, 0x81, 0x04, 0x81, 0x01, 0x81, +0x06, 0x81, 0x7F, 0x6F +}; + +PROGMEM const unsigned char chr_f32_5F[] = +{ +0x7F, 0x7F, 0x1D, 0x8C, 0x26 +}; + +PROGMEM const unsigned char chr_f32_60[] = +{ +0x0B, 0x83, 0x03, 0x85, 0x01, 0x82, 0x01, 0x82, +0x00, 0x81, 0x03, 0x81, 0x00, 0x81, 0x03, 0x81, +0x00, 0x82, 0x01, 0x82, 0x01, 0x85, 0x03, 0x83, +0x7F, 0x1A +}; + +PROGMEM const unsigned char chr_f32_61[] = +{ +0x57, 0x85, 0x05, 0x88, 0x04, 0x81, 0x04, 0x82, +0x03, 0x81, 0x05, 0x81, 0x0B, 0x81, 0x05, 0x87, +0x03, 0x89, 0x02, 0x82, 0x05, 0x81, 0x02, 0x81, +0x06, 0x81, 0x02, 0x81, 0x06, 0x81, 0x02, 0x82, +0x03, 0x83, 0x03, 0x86, 0x00, 0x83, 0x02, 0x84, +0x02, 0x82, 0x61 +}; + +PROGMEM const unsigned char chr_f32_62[] = +{ +0x10, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x01, 0x83, 0x06, 0x81, +0x00, 0x86, 0x04, 0x84, 0x01, 0x83, 0x03, 0x82, +0x05, 0x81, 0x03, 0x81, 0x06, 0x82, 0x02, 0x81, +0x07, 0x81, 0x02, 0x81, 0x07, 0x81, 0x02, 0x81, +0x07, 0x81, 0x02, 0x81, 0x06, 0x82, 0x02, 0x82, +0x05, 0x81, 0x03, 0x84, 0x01, 0x83, 0x03, 0x81, +0x00, 0x86, 0x04, 0x81, 0x01, 0x83, 0x6D +}; + +PROGMEM const unsigned char chr_f32_63[] = +{ +0x52, 0x83, 0x06, 0x87, 0x03, 0x83, 0x01, 0x82, +0x03, 0x81, 0x05, 0x81, 0x01, 0x82, 0x09, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x82, 0x05, 0x81, +0x02, 0x81, 0x05, 0x81, 0x02, 0x83, 0x01, 0x82, +0x04, 0x87, 0x06, 0x83, 0x5E +}; + +PROGMEM const unsigned char chr_f32_64[] = +{ +0x19, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x06, 0x83, 0x01, 0x81, 0x04, 0x86, +0x00, 0x81, 0x03, 0x83, 0x01, 0x84, 0x03, 0x81, +0x05, 0x82, 0x02, 0x82, 0x06, 0x81, 0x02, 0x81, +0x07, 0x81, 0x02, 0x81, 0x07, 0x81, 0x02, 0x81, +0x07, 0x81, 0x02, 0x82, 0x06, 0x81, 0x03, 0x81, +0x05, 0x82, 0x03, 0x83, 0x01, 0x84, 0x04, 0x86, +0x00, 0x81, 0x06, 0x83, 0x01, 0x81, 0x6A +}; + +PROGMEM const unsigned char chr_f32_65[] = +{ +0x58, 0x83, 0x07, 0x87, 0x04, 0x83, 0x01, 0x83, +0x03, 0x81, 0x05, 0x81, 0x02, 0x82, 0x06, 0x81, +0x01, 0x8B, 0x01, 0x8B, 0x01, 0x81, 0x0B, 0x82, +0x0B, 0x81, 0x05, 0x82, 0x02, 0x83, 0x01, 0x83, +0x04, 0x87, 0x07, 0x83, 0x66 +}; + +PROGMEM const unsigned char chr_f32_66[] = +{ +0x0A, 0x83, 0x02, 0x84, 0x02, 0x81, 0x05, 0x81, +0x05, 0x81, 0x03, 0x86, 0x00, 0x86, 0x02, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x3B +}; + +PROGMEM const unsigned char chr_f32_67[] = +{ +0x5E, 0x83, 0x01, 0x81, 0x04, 0x86, 0x00, 0x81, +0x03, 0x83, 0x01, 0x84, 0x03, 0x81, 0x05, 0x82, +0x02, 0x81, 0x07, 0x81, 0x02, 0x81, 0x07, 0x81, +0x02, 0x81, 0x07, 0x81, 0x02, 0x81, 0x07, 0x81, +0x02, 0x82, 0x06, 0x81, 0x03, 0x81, 0x05, 0x82, +0x03, 0x83, 0x01, 0x84, 0x04, 0x86, 0x00, 0x81, +0x06, 0x83, 0x01, 0x81, 0x0C, 0x81, 0x02, 0x81, +0x07, 0x81, 0x02, 0x81, 0x06, 0x82, 0x03, 0x82, +0x03, 0x82, 0x04, 0x89, 0x06, 0x85, 0x13 +}; + +PROGMEM const unsigned char chr_f32_68[] = +{ +0x10, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x01, 0x84, 0x05, 0x81, +0x00, 0x86, 0x04, 0x83, 0x03, 0x82, 0x03, 0x82, +0x05, 0x81, 0x03, 0x81, 0x06, 0x81, 0x03, 0x81, +0x06, 0x81, 0x03, 0x81, 0x06, 0x81, 0x03, 0x81, +0x06, 0x81, 0x03, 0x81, 0x06, 0x81, 0x03, 0x81, +0x06, 0x81, 0x03, 0x81, 0x06, 0x81, 0x03, 0x81, +0x06, 0x81, 0x03, 0x81, 0x06, 0x81, 0x6A +}; + +PROGMEM const unsigned char chr_f32_69[] = +{ +0x07, 0x81, 0x03, 0x81, 0x03, 0x81, 0x0F, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x2B +}; + +PROGMEM const unsigned char chr_f32_6A[] = +{ +0x07, 0x81, 0x03, 0x81, 0x03, 0x81, 0x0F, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x01, 0x83, 0x01, 0x82, 0x8 +}; + +PROGMEM const unsigned char chr_f32_6B[] = +{ +0x19, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, +0x09, 0x81, 0x04, 0x82, 0x01, 0x81, 0x03, 0x82, +0x02, 0x81, 0x02, 0x82, 0x03, 0x81, 0x01, 0x82, +0x04, 0x81, 0x00, 0x82, 0x05, 0x85, 0x05, 0x86, +0x04, 0x82, 0x01, 0x81, 0x04, 0x81, 0x02, 0x82, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x82, +0x02, 0x81, 0x04, 0x81, 0x02, 0x81, 0x04, 0x82, +0x53 +}; + +PROGMEM const unsigned char chr_f32_6C[] = +{ +0x07, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x03, 0x81, 0x03, 0x81, +0x03, 0x81, 0x03, 0x81, 0x2B +}; + +PROGMEM const unsigned char chr_f32_6D[] = +{ +0x7F, 0x05, 0x81, 0x01, 0x83, 0x03, 0x83, 0x05, +0x81, 0x00, 0x85, 0x00, 0x86, 0x04, 0x83, 0x02, +0x84, 0x02, 0x82, 0x03, 0x82, 0x04, 0x82, 0x04, +0x81, 0x03, 0x81, 0x05, 0x81, 0x05, 0x81, 0x03, +0x81, 0x05, 0x81, 0x05, 0x81, 0x03, 0x81, 0x05, +0x81, 0x05, 0x81, 0x03, 0x81, 0x05, 0x81, 0x05, +0x81, 0x03, 0x81, 0x05, 0x81, 0x05, 0x81, 0x03, +0x81, 0x05, 0x81, 0x05, 0x81, 0x03, 0x81, 0x05, +0x81, 0x05, 0x81, 0x03, 0x81, 0x05, 0x81, 0x05, +0x81, 0x03, 0x81, 0x05, 0x81, 0x05, 0x81, 0x7F, +0x1B +}; + +PROGMEM const unsigned char chr_f32_6E[] = +{ +0x5B, 0x81, 0x01, 0x84, 0x05, 0x81, 0x00, 0x86, +0x04, 0x83, 0x03, 0x82, 0x03, 0x82, 0x05, 0x81, +0x03, 0x81, 0x06, 0x81, 0x03, 0x81, 0x06, 0x81, +0x03, 0x81, 0x06, 0x81, 0x03, 0x81, 0x06, 0x81, +0x03, 0x81, 0x06, 0x81, 0x03, 0x81, 0x06, 0x81, +0x03, 0x81, 0x06, 0x81, 0x03, 0x81, 0x06, 0x81, +0x03, 0x81, 0x06, 0x81, 0x6A +}; + +PROGMEM const unsigned char chr_f32_6F[] = +{ +0x5E, 0x84, 0x07, 0x88, 0x04, 0x83, 0x02, 0x83, +0x03, 0x81, 0x06, 0x81, 0x02, 0x82, 0x06, 0x82, +0x01, 0x81, 0x08, 0x81, 0x01, 0x81, 0x08, 0x81, +0x01, 0x81, 0x08, 0x81, 0x01, 0x82, 0x06, 0x82, +0x02, 0x81, 0x06, 0x81, 0x03, 0x83, 0x02, 0x83, +0x04, 0x88, 0x07, 0x84, 0x6D +}; + +PROGMEM const unsigned char chr_f32_70[] = +{ +0x5B, 0x81, 0x01, 0x83, 0x06, 0x81, 0x00, 0x86, +0x04, 0x84, 0x01, 0x83, 0x03, 0x82, 0x05, 0x81, +0x03, 0x81, 0x06, 0x82, 0x02, 0x81, 0x07, 0x81, +0x02, 0x81, 0x07, 0x81, 0x02, 0x81, 0x07, 0x81, +0x02, 0x81, 0x06, 0x82, 0x02, 0x82, 0x05, 0x81, +0x03, 0x84, 0x01, 0x83, 0x03, 0x81, 0x00, 0x86, +0x04, 0x81, 0x01, 0x83, 0x06, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x28 +}; + +PROGMEM const unsigned char chr_f32_71[] = +{ +0x5E, 0x83, 0x01, 0x81, 0x04, 0x86, 0x00, 0x81, +0x03, 0x83, 0x01, 0x84, 0x03, 0x81, 0x05, 0x82, +0x02, 0x82, 0x06, 0x81, 0x02, 0x81, 0x07, 0x81, +0x02, 0x81, 0x07, 0x81, 0x02, 0x81, 0x07, 0x81, +0x02, 0x82, 0x06, 0x81, 0x03, 0x81, 0x05, 0x82, +0x03, 0x83, 0x01, 0x84, 0x04, 0x86, 0x00, 0x81, +0x06, 0x83, 0x01, 0x81, 0x0C, 0x81, 0x0C, 0x81, +0x0C, 0x81, 0x0C, 0x81, 0x0C, 0x81, 0x1F +}; + +PROGMEM const unsigned char chr_f32_72[] = +{ +0x31, 0x81, 0x00, 0x82, 0x01, 0x85, 0x01, 0x82, +0x04, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x05, 0x81, 0x05, 0x81, +0x05, 0x81, 0x05, 0x81, 0x3B +}; + +PROGMEM const unsigned char chr_f32_73[] = +{ +0x4A, 0x84, 0x05, 0x87, 0x02, 0x82, 0x03, 0x81, +0x02, 0x81, 0x05, 0x81, 0x01, 0x81, 0x0A, 0x84, +0x07, 0x86, 0x07, 0x84, 0x09, 0x81, 0x01, 0x81, +0x05, 0x81, 0x01, 0x82, 0x03, 0x82, 0x02, 0x87, +0x04, 0x85, 0x56 +}; + +PROGMEM const unsigned char chr_f32_74[] = +{ +0x0F, 0x81, 0x04, 0x81, 0x04, 0x81, 0x04, 0x81, +0x02, 0x85, 0x00, 0x85, 0x02, 0x81, 0x04, 0x81, +0x04, 0x81, 0x04, 0x81, 0x04, 0x81, 0x04, 0x81, +0x04, 0x81, 0x04, 0x81, 0x04, 0x81, 0x04, 0x83, +0x03, 0x82, 0x31 +}; + +PROGMEM const unsigned char chr_f32_75[] = +{ +0x55, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x02, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x02, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x02, 0x81, 0x06, 0x81, 0x02, 0x81, 0x06, 0x81, +0x02, 0x81, 0x06, 0x81, 0x02, 0x81, 0x05, 0x82, +0x02, 0x82, 0x03, 0x83, 0x03, 0x86, 0x00, 0x81, +0x04, 0x84, 0x01, 0x81, 0x62 +}; + +PROGMEM const unsigned char chr_f32_76[] = +{ +0x47, 0x81, 0x06, 0x81, 0x00, 0x81, 0x06, 0x81, +0x01, 0x81, 0x04, 0x81, 0x02, 0x81, 0x04, 0x81, +0x02, 0x81, 0x04, 0x81, 0x03, 0x81, 0x02, 0x81, +0x04, 0x81, 0x02, 0x81, 0x04, 0x81, 0x02, 0x81, +0x05, 0x81, 0x00, 0x81, 0x06, 0x81, 0x00, 0x81, +0x06, 0x84, 0x07, 0x82, 0x08, 0x82, 0x58 +}; + +PROGMEM const unsigned char chr_f32_77[] = +{ +0x6B, 0x81, 0x04, 0x82, 0x04, 0x81, 0x00, 0x81, +0x04, 0x82, 0x04, 0x81, 0x00, 0x81, 0x04, 0x80, +0x00, 0x80, 0x04, 0x81, 0x01, 0x81, 0x02, 0x81, +0x00, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x81, +0x00, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x81, +0x00, 0x81, 0x02, 0x81, 0x02, 0x81, 0x02, 0x80, +0x02, 0x80, 0x02, 0x81, 0x03, 0x81, 0x00, 0x81, +0x02, 0x81, 0x00, 0x81, 0x04, 0x81, 0x00, 0x81, +0x02, 0x81, 0x00, 0x81, 0x04, 0x81, 0x00, 0x81, +0x02, 0x81, 0x00, 0x81, 0x05, 0x82, 0x04, 0x82, +0x06, 0x82, 0x04, 0x82, 0x06, 0x82, 0x04, 0x82, +0x7F, 0x1 +}; + +PROGMEM const unsigned char chr_f32_78[] = +{ +0x4E, 0x81, 0x06, 0x81, 0x01, 0x82, 0x04, 0x82, +0x02, 0x81, 0x04, 0x81, 0x04, 0x81, 0x02, 0x81, +0x05, 0x82, 0x00, 0x82, 0x06, 0x84, 0x08, 0x82, +0x08, 0x84, 0x06, 0x82, 0x00, 0x82, 0x05, 0x81, +0x02, 0x81, 0x04, 0x81, 0x04, 0x81, 0x02, 0x82, +0x04, 0x82, 0x01, 0x81, 0x06, 0x81, 0x5B +}; + +PROGMEM const unsigned char chr_f32_79[] = +{ +0x4D, 0x82, 0x06, 0x82, 0x00, 0x81, 0x06, 0x81, +0x01, 0x81, 0x06, 0x81, 0x02, 0x81, 0x04, 0x81, +0x03, 0x81, 0x04, 0x81, 0x03, 0x81, 0x04, 0x81, +0x04, 0x81, 0x02, 0x81, 0x05, 0x81, 0x02, 0x81, +0x05, 0x81, 0x02, 0x81, 0x06, 0x81, 0x00, 0x81, +0x07, 0x81, 0x00, 0x81, 0x07, 0x81, 0x00, 0x81, +0x08, 0x82, 0x09, 0x82, 0x09, 0x82, 0x09, 0x81, +0x09, 0x82, 0x06, 0x84, 0x07, 0x83, 0x14 +}; + +PROGMEM const unsigned char chr_f32_7A[] = +{ +0x48, 0x89, 0x01, 0x89, 0x08, 0x82, 0x07, 0x82, +0x07, 0x82, 0x07, 0x82, 0x08, 0x81, 0x08, 0x82, +0x07, 0x82, 0x07, 0x82, 0x07, 0x82, 0x08, 0x89, +0x01, 0x89, 0x54 +}; + +PROGMEM const unsigned char chr_f32_7B[] = +{ +0x06, 0x83, 0x07, 0x82, 0x09, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x09, 0x81, +0x08, 0x82, 0x0B, 0x81, 0x0B, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x82, +0x0A, 0x83, 0xE +}; + +PROGMEM const unsigned char chr_f32_7C[] = +{ +0x04, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x12 +}; + +PROGMEM const unsigned char chr_f32_7D[] = +{ +0x01, 0x83, 0x0A, 0x82, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0B, 0x81, +0x0B, 0x82, 0x08, 0x81, 0x09, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, +0x0A, 0x81, 0x0A, 0x81, 0x0A, 0x81, 0x09, 0x82, +0x07, 0x83, 0x13 +}; + +PROGMEM const unsigned char chr_f32_7E[] = +{ +0x11, 0x83, 0x09, 0x81, 0x01, 0x81, 0x07, 0x81, +0x03, 0x82, 0x03, 0x80, 0x00, 0x80, 0x06, 0x81, +0x01, 0x81, 0x00, 0x80, 0x07, 0x83, 0x7F, 0x7F, +0x2C +}; + +PROGMEM const unsigned char chr_f32_7F[] = +{ +0x19 +}; +PROGMEM const unsigned char* const chrtbl_f32[96] = // character pointer table +{ + chr_f32_20, chr_f32_21, chr_f32_22, chr_f32_23, chr_f32_24, chr_f32_25, chr_f32_26, chr_f32_27, + chr_f32_28, chr_f32_29, chr_f32_2A, chr_f32_2B, chr_f32_2C, chr_f32_2D, chr_f32_2E, chr_f32_2F, + chr_f32_30, chr_f32_31, chr_f32_32, chr_f32_33, chr_f32_34, chr_f32_35, chr_f32_36, chr_f32_37, + chr_f32_38, chr_f32_39, chr_f32_3A, chr_f32_3B, chr_f32_3C, chr_f32_3D, chr_f32_3E, chr_f32_3F, + chr_f32_40, chr_f32_41, chr_f32_42, chr_f32_43, chr_f32_44, chr_f32_45, chr_f32_46, chr_f32_47, + chr_f32_48, chr_f32_49, chr_f32_4A, chr_f32_4B, chr_f32_4C, chr_f32_4D, chr_f32_4E, chr_f32_4F, + chr_f32_50, chr_f32_51, chr_f32_52, chr_f32_53, chr_f32_54, chr_f32_55, chr_f32_56, chr_f32_57, + chr_f32_58, chr_f32_59, chr_f32_5A, chr_f32_5B, chr_f32_5C, chr_f32_5D, chr_f32_5E, chr_f32_5F, + chr_f32_60, chr_f32_61, chr_f32_62, chr_f32_63, chr_f32_64, chr_f32_65, chr_f32_66, chr_f32_67, + chr_f32_68, chr_f32_69, chr_f32_6A, chr_f32_6B, chr_f32_6C, chr_f32_6D, chr_f32_6E, chr_f32_6F, + chr_f32_70, chr_f32_71, chr_f32_72, chr_f32_73, chr_f32_74, chr_f32_75, chr_f32_76, chr_f32_77, + chr_f32_78, chr_f32_79, chr_f32_7A, chr_f32_7B, chr_f32_7C, chr_f32_7D, chr_f32_7E, chr_f32_7F +}; diff --git a/libraries/TFT_eSPI/Fonts/Font32rle.h b/libraries/TFT_eSPI/Fonts/Font32rle.h new file mode 100644 index 0000000..1dbdc69 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font32rle.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f32 96 +#define chr_hgt_f32 26 +#define baseline_f32 19 +#define data_size_f32 8 +#define firstchr_f32 32 + +extern const unsigned char widtbl_f32[96]; +extern const unsigned char* const chrtbl_f32[96]; diff --git a/libraries/TFT_eSPI/Fonts/Font64rle.c b/libraries/TFT_eSPI/Fonts/Font64rle.c new file mode 100644 index 0000000..a80e6ea --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font64rle.c @@ -0,0 +1,299 @@ +// Font 6 is intended to display numbers and time +// +// This font has been 8-bit Run Length Encoded to save FLASH space +// +// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : - . a p m +// The Pipe character | is a narrow space to aid formatting +// All other characters print as a space + + +PROGMEM const unsigned char widtbl_f64[96] = // character width table +{ + 12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39 + 12, 12, 12, 12, 12, 17, 15, 12, // char 40 - 47 + 27, 27, 27, 27, 27, 27, 27, 27, // char 48 - 55 + 27, 27, 15, 12, 12, 12, 12, 12, // char 56 - 63 + 12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71 + 12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79 + 12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87 + 12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95 + 12, 27, 12, 12, 12, 12, 12, 12, // char 96 - 103 + 12, 12, 12, 12, 12, 42, 12, 12, // char 104 - 111 + 29, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119 + 12, 12, 12, 12, 7, 12, 12, 12 // char 120 - 127 +}; + +PROGMEM const unsigned char chr_f64_20[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x3F +}; + +PROGMEM const unsigned char chr_f64_2D[] = +{ +0x7F, 0x7F, 0x45, 0x8A, 0x05, 0x8A, 0x05, 0x8A, +0x05, 0x8A, 0x7F, 0x7F, 0x7F, 0x2B +}; + +PROGMEM const unsigned char chr_f64_2E[] = +{ +0x7F, 0x7F, 0x7F, 0x55, 0x84, 0x09, 0x84, 0x09, +0x84, 0x09, 0x84, 0x09, 0x84, 0x7F, 0x38 +}; + +PROGMEM const unsigned char chr_f64_30[] = +{ +0x23, 0x87, 0x0F, 0x8D, 0x0B, 0x8F, 0x09, 0x91, +0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84, +0x06, 0x83, 0x0B, 0x83, 0x05, 0x84, 0x0B, 0x84, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x04, 0x83, 0x0D, 0x83, 0x03, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x03, 0x83, 0x0D, 0x83, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x04, 0x84, 0x0B, 0x84, 0x05, 0x83, 0x0B, 0x83, +0x06, 0x84, 0x09, 0x84, 0x06, 0x86, 0x05, 0x86, +0x07, 0x91, 0x09, 0x8F, 0x0B, 0x8D, 0x0F, 0x87, +0x7F, 0x7F, 0x32 +}; + +PROGMEM const unsigned char chr_f64_31[] = +{ +0x29, 0x82, 0x17, 0x82, 0x16, 0x83, 0x16, 0x83, +0x15, 0x84, 0x14, 0x85, 0x12, 0x87, 0x0D, 0x8C, +0x0D, 0x8C, 0x0D, 0x87, 0x00, 0x83, 0x0D, 0x84, +0x03, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x7F, 0x7F, 0x4C +}; + +PROGMEM const unsigned char chr_f64_32[] = +{ +0x24, 0x87, 0x10, 0x8C, 0x0B, 0x8F, 0x09, 0x91, +0x08, 0x85, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84, +0x06, 0x84, 0x0A, 0x83, 0x06, 0x83, 0x0B, 0x84, +0x04, 0x84, 0x0C, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x16, 0x83, 0x15, 0x84, 0x15, 0x84, 0x14, 0x84, +0x14, 0x85, 0x13, 0x85, 0x12, 0x86, 0x11, 0x87, +0x10, 0x88, 0x10, 0x88, 0x0F, 0x88, 0x10, 0x87, +0x11, 0x86, 0x12, 0x85, 0x13, 0x85, 0x14, 0x84, +0x14, 0x84, 0x15, 0x83, 0x16, 0x83, 0x15, 0x96, +0x03, 0x96, 0x03, 0x96, 0x03, 0x96, 0x7F, 0x7F, +0x45 +}; + +PROGMEM const unsigned char chr_f64_33[] = +{ +0x23, 0x87, 0x0F, 0x8D, 0x0B, 0x90, 0x08, 0x91, +0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84, +0x05, 0x84, 0x0B, 0x84, 0x04, 0x84, 0x0B, 0x84, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x04, 0x83, 0x0D, 0x83, 0x15, 0x84, 0x15, 0x84, +0x14, 0x84, 0x14, 0x85, 0x0D, 0x8B, 0x0E, 0x89, +0x10, 0x8B, 0x0E, 0x8C, 0x14, 0x86, 0x15, 0x84, +0x16, 0x84, 0x15, 0x84, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x84, 0x0D, 0x84, 0x02, 0x84, 0x0C, 0x85, +0x03, 0x84, 0x0B, 0x84, 0x04, 0x85, 0x09, 0x85, +0x05, 0x86, 0x05, 0x86, 0x07, 0x91, 0x09, 0x8F, +0x0B, 0x8D, 0x0F, 0x87, 0x7F, 0x7F, 0x4D +}; + +PROGMEM const unsigned char chr_f64_34[] = +{ +0x45, 0x83, 0x15, 0x84, 0x14, 0x85, 0x13, 0x86, +0x13, 0x86, 0x12, 0x87, 0x11, 0x83, 0x00, 0x83, +0x11, 0x83, 0x00, 0x83, 0x10, 0x83, 0x01, 0x83, +0x0F, 0x83, 0x02, 0x83, 0x0E, 0x84, 0x02, 0x83, +0x0E, 0x83, 0x03, 0x83, 0x0D, 0x83, 0x04, 0x83, +0x0C, 0x83, 0x05, 0x83, 0x0B, 0x84, 0x05, 0x83, +0x0B, 0x83, 0x06, 0x83, 0x0A, 0x83, 0x07, 0x83, +0x09, 0x84, 0x07, 0x83, 0x09, 0x83, 0x08, 0x83, +0x08, 0x83, 0x09, 0x83, 0x07, 0x83, 0x0A, 0x83, +0x07, 0x97, 0x02, 0x97, 0x02, 0x97, 0x02, 0x97, +0x11, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x7F, 0x7F, 0x4A +}; + +PROGMEM const unsigned char chr_f64_35[] = +{ +0x3A, 0x91, 0x08, 0x91, 0x08, 0x91, 0x08, 0x91, +0x08, 0x82, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x82, 0x17, 0x82, 0x17, 0x82, 0x16, 0x83, +0x02, 0x87, 0x0B, 0x83, 0x00, 0x8B, 0x09, 0x91, +0x08, 0x92, 0x07, 0x86, 0x05, 0x86, 0x06, 0x84, +0x09, 0x85, 0x05, 0x83, 0x0B, 0x84, 0x16, 0x83, +0x16, 0x84, 0x16, 0x83, 0x16, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x03, 0x83, 0x0E, 0x83, +0x03, 0x83, 0x0D, 0x84, 0x03, 0x83, 0x0D, 0x83, +0x04, 0x84, 0x0B, 0x84, 0x05, 0x84, 0x09, 0x85, +0x05, 0x86, 0x05, 0x86, 0x07, 0x91, 0x09, 0x8F, +0x0B, 0x8D, 0x0F, 0x87, 0x7F, 0x7F, 0x32 +}; + +PROGMEM const unsigned char chr_f64_36[] = +{ +0x24, 0x86, 0x11, 0x8B, 0x0C, 0x8E, 0x0A, 0x90, +0x08, 0x86, 0x05, 0x85, 0x06, 0x85, 0x09, 0x84, +0x05, 0x84, 0x0B, 0x83, 0x05, 0x83, 0x0C, 0x84, +0x03, 0x84, 0x0D, 0x83, 0x03, 0x83, 0x0E, 0x83, +0x03, 0x83, 0x16, 0x83, 0x15, 0x83, 0x16, 0x83, +0x04, 0x86, 0x0A, 0x83, 0x02, 0x8B, 0x07, 0x83, +0x00, 0x8E, 0x06, 0x94, 0x05, 0x88, 0x05, 0x86, +0x04, 0x86, 0x09, 0x84, 0x04, 0x85, 0x0B, 0x84, +0x03, 0x84, 0x0D, 0x83, 0x03, 0x84, 0x0D, 0x84, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x03, 0x83, 0x0D, 0x84, +0x03, 0x83, 0x0D, 0x83, 0x04, 0x84, 0x0B, 0x84, +0x05, 0x84, 0x09, 0x85, 0x05, 0x86, 0x05, 0x86, +0x07, 0x91, 0x09, 0x8F, 0x0C, 0x8C, 0x0F, 0x88, +0x7F, 0x7F, 0x31 +}; + +PROGMEM const unsigned char chr_f64_37[] = +{ +0x37, 0x96, 0x03, 0x96, 0x03, 0x96, 0x03, 0x96, +0x16, 0x83, 0x15, 0x83, 0x15, 0x83, 0x15, 0x83, +0x15, 0x84, 0x14, 0x84, 0x14, 0x84, 0x15, 0x83, +0x15, 0x84, 0x14, 0x84, 0x15, 0x84, 0x14, 0x84, +0x15, 0x83, 0x15, 0x84, 0x15, 0x83, 0x15, 0x84, +0x15, 0x84, 0x15, 0x83, 0x15, 0x84, 0x15, 0x83, +0x16, 0x83, 0x15, 0x84, 0x15, 0x83, 0x16, 0x83, +0x16, 0x83, 0x16, 0x83, 0x15, 0x84, 0x15, 0x83, +0x16, 0x83, 0x16, 0x83, 0x7F, 0x7F, 0x53 +}; + +PROGMEM const unsigned char chr_f64_38[] = +{ +0x24, 0x85, 0x11, 0x8B, 0x0C, 0x8F, 0x09, 0x91, +0x07, 0x86, 0x05, 0x86, 0x06, 0x84, 0x09, 0x84, +0x05, 0x84, 0x0B, 0x84, 0x04, 0x84, 0x0B, 0x84, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, +0x04, 0x83, 0x0D, 0x83, 0x04, 0x84, 0x0B, 0x84, +0x05, 0x83, 0x0B, 0x83, 0x06, 0x84, 0x09, 0x84, +0x07, 0x85, 0x05, 0x85, 0x09, 0x8F, 0x0B, 0x8D, +0x0B, 0x8F, 0x09, 0x91, 0x07, 0x85, 0x07, 0x85, +0x05, 0x84, 0x0B, 0x84, 0x04, 0x83, 0x0D, 0x83, +0x03, 0x84, 0x0D, 0x84, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x84, 0x0D, 0x84, 0x02, 0x84, 0x0D, 0x84, +0x03, 0x84, 0x0B, 0x84, 0x04, 0x86, 0x07, 0x86, +0x05, 0x93, 0x07, 0x91, 0x09, 0x8F, 0x0D, 0x89, +0x7F, 0x7F, 0x31 +}; + +PROGMEM const unsigned char chr_f64_39[] = +{ +0x22, 0x88, 0x0F, 0x8C, 0x0C, 0x8F, 0x09, 0x91, +0x07, 0x86, 0x05, 0x86, 0x05, 0x85, 0x09, 0x84, +0x05, 0x84, 0x0B, 0x84, 0x04, 0x83, 0x0D, 0x83, +0x03, 0x84, 0x0D, 0x83, 0x03, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x83, 0x0F, 0x83, 0x02, 0x83, 0x0F, 0x83, +0x02, 0x84, 0x0D, 0x84, 0x03, 0x83, 0x0D, 0x84, +0x03, 0x84, 0x0B, 0x85, 0x04, 0x84, 0x09, 0x86, +0x04, 0x86, 0x05, 0x88, 0x05, 0x94, 0x06, 0x8E, +0x00, 0x83, 0x07, 0x8B, 0x02, 0x83, 0x0A, 0x86, +0x04, 0x83, 0x16, 0x83, 0x15, 0x83, 0x16, 0x83, +0x03, 0x83, 0x0E, 0x83, 0x03, 0x83, 0x0D, 0x84, +0x03, 0x84, 0x0C, 0x83, 0x05, 0x83, 0x0B, 0x84, +0x05, 0x84, 0x09, 0x85, 0x06, 0x85, 0x05, 0x86, +0x08, 0x90, 0x0A, 0x8E, 0x0C, 0x8B, 0x11, 0x86, +0x7F, 0x7F, 0x33 +}; + +PROGMEM const unsigned char chr_f64_3A[] = +{ +0x7F, 0x1A, 0x84, 0x09, 0x84, 0x09, 0x84, 0x09, +0x84, 0x09, 0x84, 0x7F, 0x3D, 0x84, 0x09, 0x84, +0x09, 0x84, 0x09, 0x84, 0x09, 0x84, 0x7F, 0x74 +}; + +PROGMEM const unsigned char chr_f64_61[] = +{ +0x7F, 0x7B, 0x88, 0x0F, 0x8D, 0x0A, 0x90, 0x09, +0x91, 0x07, 0x85, 0x06, 0x85, 0x06, 0x84, 0x0A, +0x84, 0x05, 0x83, 0x0C, 0x83, 0x05, 0x83, 0x0C, +0x83, 0x05, 0x83, 0x0C, 0x83, 0x16, 0x83, 0x15, +0x84, 0x0E, 0x8B, 0x09, 0x90, 0x07, 0x92, 0x06, +0x8D, 0x01, 0x83, 0x05, 0x88, 0x07, 0x83, 0x05, +0x84, 0x0B, 0x83, 0x04, 0x84, 0x0C, 0x83, 0x04, +0x83, 0x0D, 0x83, 0x04, 0x83, 0x0D, 0x83, 0x04, +0x83, 0x0C, 0x84, 0x04, 0x83, 0x0B, 0x85, 0x04, +0x84, 0x09, 0x86, 0x05, 0x84, 0x06, 0x8A, 0x03, +0x8F, 0x01, 0x84, 0x04, 0x8D, 0x02, 0x84, 0x05, +0x8A, 0x05, 0x83, 0x07, 0x86, 0x7F, 0x7F, 0x35 +}; + +PROGMEM const unsigned char chr_f64_6D[] = +{ +0x7F, 0x7F, 0x7F, 0x05, 0x86, 0x07, 0x86, 0x0A, +0x83, 0x02, 0x89, 0x04, 0x8A, 0x08, 0x83, 0x00, +0x8C, 0x02, 0x8C, 0x07, 0x83, 0x00, 0x8D, 0x00, +0x8E, 0x06, 0x87, 0x05, 0x89, 0x05, 0x84, 0x06, +0x85, 0x08, 0x86, 0x08, 0x84, 0x05, 0x84, 0x0A, +0x84, 0x0A, 0x83, 0x05, 0x84, 0x0A, 0x84, 0x0A, +0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, +0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, +0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, +0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, +0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, +0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, +0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, +0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, +0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, +0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, +0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, +0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, +0x83, 0x05, 0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, +0x83, 0x0B, 0x83, 0x0B, 0x83, 0x05, 0x83, 0x0B, +0x83, 0x0B, 0x83, 0x7F, 0x7F, 0x7F, 0x7A +}; + +PROGMEM const unsigned char chr_f64_70[] = +{ +0x7F, 0x7F, 0x10, 0x86, 0x0C, 0x83, 0x02, 0x8B, +0x09, 0x83, 0x01, 0x8D, 0x08, 0x83, 0x00, 0x8F, +0x07, 0x88, 0x05, 0x86, 0x06, 0x86, 0x09, 0x84, +0x06, 0x85, 0x0B, 0x84, 0x05, 0x84, 0x0D, 0x83, +0x05, 0x84, 0x0D, 0x83, 0x05, 0x84, 0x0D, 0x84, +0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83, +0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83, +0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83, +0x04, 0x83, 0x0F, 0x83, 0x04, 0x83, 0x0F, 0x83, +0x04, 0x83, 0x0E, 0x84, 0x04, 0x84, 0x0D, 0x83, +0x05, 0x84, 0x0C, 0x84, 0x05, 0x85, 0x0B, 0x84, +0x05, 0x86, 0x09, 0x84, 0x06, 0x88, 0x05, 0x86, +0x06, 0x83, 0x00, 0x8F, 0x07, 0x83, 0x01, 0x8D, +0x08, 0x83, 0x02, 0x8B, 0x09, 0x83, 0x04, 0x86, +0x0C, 0x83, 0x18, 0x83, 0x18, 0x83, 0x18, 0x83, +0x18, 0x83, 0x18, 0x83, 0x18, 0x83, 0x18, 0x83, +0x18, 0x83, 0x18, 0x83, 0x32 +}; +PROGMEM const unsigned char* const chrtbl_f64[96] = // character pointer table +{ + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_2D, chr_f64_2E, chr_f64_20, + chr_f64_30, chr_f64_31, chr_f64_32, chr_f64_33, chr_f64_34, chr_f64_35, chr_f64_36, chr_f64_37, + chr_f64_38, chr_f64_39, chr_f64_3A, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_61, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_6D, chr_f64_20, chr_f64_20, + chr_f64_70, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, + chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20, chr_f64_20 +}; diff --git a/libraries/TFT_eSPI/Fonts/Font64rle.h b/libraries/TFT_eSPI/Fonts/Font64rle.h new file mode 100644 index 0000000..7f811f2 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font64rle.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f64 96 +#define chr_hgt_f64 48 +#define baseline_f64 36 +#define data_size_f64 8 +#define firstchr_f64 32 + +extern const unsigned char widtbl_f64[96]; +extern const unsigned char* const chrtbl_f64[96]; diff --git a/libraries/TFT_eSPI/Fonts/Font72rle.c b/libraries/TFT_eSPI/Fonts/Font72rle.c new file mode 100644 index 0000000..478411a --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font72rle.c @@ -0,0 +1,369 @@ +// Font 8 +// +// This font has been 8-bit Run Length Encoded to save FLASH space +// +// It is a Arial 75 pixel height font intended to display large numbers +// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - . +// All other characters print as a space + + +PROGMEM const unsigned char widtbl_f72[96] = // character width table +{ + 29, 29, 29, 29, 29, 29, 29, 29, // char 32 - 39 + 29, 29, 29, 29, 29, 29, 29, 29, // char 40 - 47 + 55, 55, 55, 55, 55, 55, 55, 55, // char 48 - 55 + 55, 55, 29, 29, 29, 29, 29, 29, // char 56 - 63 + 29, 29, 29, 29, 29, 29, 29, 29, // char 64 - 71 + 29, 29, 29, 29, 29, 29, 29, 29, // char 72 - 79 + 29, 29, 29, 29, 29, 29, 29, 29, // char 80 - 87 + 29, 29, 29, 29, 29, 29, 29, 29, // char 88 - 95 + 29, 29, 29, 29, 29, 29, 29, 29, // char 96 - 103 + 29, 29, 29, 29, 29, 29, 29, 29, // char 104 - 111 + 29, 29, 29, 29, 29, 29, 29, 29, // char 112 - 119 + 29, 29, 29, 29, 29, 29, 29, 29 // char 120 - 127 +}; + +// Row format, MSB left + +PROGMEM const unsigned char chr_f72_20[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7E +}; + +PROGMEM const unsigned char chr_f72_2D[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x36, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, +0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x07 +}; + +PROGMEM const unsigned char chr_f72_2E[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x48, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x44 +}; + +PROGMEM const unsigned char chr_f72_30[] = +{ +0x7F, 0x70, 0x8A, 0x28, 0x90, 0x23, 0x94, 0x1F, +0x98, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, +0xA0, 0x15, 0x8C, 0x06, 0x8C, 0x14, 0x8B, 0x0A, +0x8B, 0x12, 0x8A, 0x0E, 0x89, 0x12, 0x89, 0x10, +0x89, 0x11, 0x88, 0x12, 0x88, 0x10, 0x89, 0x12, +0x89, 0x0F, 0x88, 0x14, 0x88, 0x0E, 0x89, 0x14, +0x88, 0x0E, 0x88, 0x16, 0x88, 0x0D, 0x88, 0x16, +0x88, 0x0D, 0x88, 0x16, 0x88, 0x0C, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0A, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x0A, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0C, 0x88, 0x16, +0x88, 0x0D, 0x88, 0x16, 0x88, 0x0D, 0x88, 0x16, +0x88, 0x0D, 0x89, 0x14, 0x89, 0x0E, 0x88, 0x14, +0x88, 0x0F, 0x89, 0x12, 0x89, 0x10, 0x88, 0x12, +0x88, 0x11, 0x89, 0x10, 0x89, 0x11, 0x8A, 0x0E, +0x8A, 0x12, 0x8B, 0x0A, 0x8B, 0x14, 0x8C, 0x06, +0x8C, 0x15, 0xA0, 0x16, 0x9E, 0x18, 0x9C, 0x1A, +0x9A, 0x1C, 0x98, 0x1F, 0x94, 0x23, 0x90, 0x28, +0x8A, 0x4D +}; + +PROGMEM const unsigned char chr_f72_31[] = +{ +0x7F, 0x78, 0x85, 0x2F, 0x86, 0x2F, 0x86, 0x2E, +0x87, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2B, +0x8A, 0x2A, 0x8B, 0x29, 0x8C, 0x27, 0x8E, 0x26, +0x8F, 0x25, 0x90, 0x24, 0x91, 0x22, 0x93, 0x20, +0x95, 0x1E, 0x8D, 0x00, 0x88, 0x1D, 0x8C, 0x02, +0x88, 0x1D, 0x8B, 0x03, 0x88, 0x1D, 0x8A, 0x04, +0x88, 0x1D, 0x88, 0x06, 0x88, 0x1D, 0x87, 0x07, +0x88, 0x1D, 0x85, 0x09, 0x88, 0x1D, 0x83, 0x0B, +0x88, 0x1D, 0x81, 0x0D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x7F, 0x1 +}; + +PROGMEM const unsigned char chr_f72_32[] = +{ +0x7F, 0x6F, 0x8A, 0x27, 0x92, 0x21, 0x96, 0x1D, +0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, 0xA0, 0x14, +0xA2, 0x12, 0x8E, 0x07, 0x8D, 0x11, 0x8B, 0x0C, +0x8C, 0x0F, 0x8A, 0x10, 0x8A, 0x0F, 0x89, 0x12, +0x8A, 0x0D, 0x89, 0x14, 0x89, 0x0D, 0x89, 0x14, +0x89, 0x0D, 0x88, 0x16, 0x89, 0x0C, 0x88, 0x16, +0x89, 0x0B, 0x88, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x88, 0x18, 0x88, 0x0F, 0x84, 0x18, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, +0x89, 0x2C, 0x88, 0x2C, 0x89, 0x2C, 0x89, 0x2B, +0x89, 0x2C, 0x89, 0x2B, 0x89, 0x2B, 0x8A, 0x2A, +0x8A, 0x2A, 0x8B, 0x29, 0x8B, 0x29, 0x8B, 0x29, +0x8B, 0x29, 0x8B, 0x29, 0x8C, 0x28, 0x8C, 0x28, +0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x27, 0x8C, 0x28, +0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x28, 0x8C, 0x27, +0x8D, 0x27, 0x8D, 0x27, 0x8C, 0x28, 0x8C, 0x28, +0x8C, 0x29, 0x8B, 0x29, 0x8B, 0x29, 0x8A, 0x2A, +0x8A, 0x2B, 0x89, 0x2B, 0x8A, 0x2B, 0x89, 0x2B, +0x89, 0x2C, 0xAA, 0x0A, 0xAB, 0x0A, 0xAB, 0x0A, +0xAB, 0x09, 0xAC, 0x09, 0xAC, 0x09, 0xAC, 0x09, +0xAC, 0x09, 0xAC, 0x74 +}; + +PROGMEM const unsigned char chr_f72_33[] = +{ +0x7F, 0x6F, 0x89, 0x29, 0x90, 0x23, 0x94, 0x1F, +0x97, 0x1D, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, +0xA0, 0x15, 0x8C, 0x06, 0x8C, 0x14, 0x8B, 0x0A, +0x8B, 0x12, 0x8A, 0x0E, 0x89, 0x12, 0x89, 0x10, +0x89, 0x11, 0x88, 0x12, 0x88, 0x10, 0x89, 0x12, +0x89, 0x0F, 0x88, 0x14, 0x88, 0x0F, 0x88, 0x14, +0x88, 0x0E, 0x89, 0x14, 0x88, 0x0E, 0x88, 0x15, +0x88, 0x12, 0x84, 0x15, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2B, +0x89, 0x2B, 0x89, 0x2A, 0x8B, 0x28, 0x8C, 0x23, +0x91, 0x24, 0x8F, 0x26, 0x8D, 0x28, 0x8F, 0x25, +0x92, 0x23, 0x94, 0x21, 0x95, 0x20, 0x81, 0x07, +0x8C, 0x2B, 0x8B, 0x2C, 0x8A, 0x2C, 0x89, 0x2D, +0x89, 0x2D, 0x89, 0x2C, 0x89, 0x2D, 0x88, 0x2D, +0x89, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x0D, 0x84, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x89, 0x18, +0x89, 0x09, 0x89, 0x18, 0x88, 0x0B, 0x88, 0x18, +0x88, 0x0B, 0x89, 0x16, 0x89, 0x0B, 0x89, 0x15, +0x89, 0x0D, 0x89, 0x14, 0x89, 0x0D, 0x8A, 0x12, +0x89, 0x0F, 0x8A, 0x10, 0x8A, 0x0F, 0x8B, 0x0D, +0x8B, 0x11, 0x8D, 0x07, 0x8D, 0x13, 0xA2, 0x14, +0xA0, 0x16, 0x9D, 0x19, 0x9B, 0x1B, 0x99, 0x1E, +0x95, 0x22, 0x91, 0x28, 0x89, 0x4E +}; + +PROGMEM const unsigned char chr_f72_34[] = +{ +0x7F, 0x7F, 0x34, 0x86, 0x2E, 0x87, 0x2D, 0x88, +0x2C, 0x89, 0x2C, 0x89, 0x2B, 0x8A, 0x2A, 0x8B, +0x29, 0x8C, 0x28, 0x8D, 0x28, 0x8D, 0x27, 0x8E, +0x26, 0x8F, 0x25, 0x90, 0x25, 0x90, 0x24, 0x91, +0x23, 0x92, 0x22, 0x93, 0x22, 0x93, 0x21, 0x8A, +0x00, 0x88, 0x20, 0x8A, 0x01, 0x88, 0x1F, 0x8A, +0x02, 0x88, 0x1E, 0x8B, 0x02, 0x88, 0x1E, 0x8A, +0x03, 0x88, 0x1D, 0x8A, 0x04, 0x88, 0x1C, 0x8A, +0x05, 0x88, 0x1B, 0x8A, 0x06, 0x88, 0x1B, 0x8A, +0x06, 0x88, 0x1A, 0x8A, 0x07, 0x88, 0x19, 0x8A, +0x08, 0x88, 0x18, 0x8A, 0x09, 0x88, 0x18, 0x8A, +0x09, 0x88, 0x17, 0x8A, 0x0A, 0x88, 0x16, 0x8A, +0x0B, 0x88, 0x15, 0x8A, 0x0C, 0x88, 0x15, 0x8A, +0x0C, 0x88, 0x14, 0x8A, 0x0D, 0x88, 0x13, 0x8A, +0x0E, 0x88, 0x12, 0x8A, 0x0F, 0x88, 0x11, 0x8B, +0x0F, 0x88, 0x11, 0x8A, 0x10, 0x88, 0x10, 0x8A, +0x11, 0x88, 0x0F, 0x8A, 0x12, 0x88, 0x0E, 0x8A, +0x13, 0x88, 0x0E, 0xAF, 0x06, 0xAF, 0x06, 0xAF, +0x06, 0xAF, 0x06, 0xAF, 0x06, 0xAF, 0x06, 0xAF, +0x06, 0xAF, 0x06, 0xAF, 0x25, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x7B +}; + +PROGMEM const unsigned char chr_f72_35[] = +{ +0x7F, 0x7F, 0x1E, 0xA0, 0x15, 0xA0, 0x14, 0xA1, +0x14, 0xA1, 0x14, 0xA1, 0x14, 0xA1, 0x14, 0xA1, +0x13, 0xA2, 0x13, 0xA2, 0x13, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2C, 0x89, 0x2C, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, 0x2C, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, +0x06, 0x88, 0x1C, 0x89, 0x03, 0x8E, 0x19, 0x88, +0x02, 0x92, 0x17, 0x88, 0x00, 0x96, 0x15, 0xA1, +0x13, 0xA3, 0x12, 0xA4, 0x11, 0xA5, 0x10, 0x8F, +0x07, 0x8E, 0x0F, 0x8C, 0x0D, 0x8C, 0x0D, 0x8B, +0x11, 0x8A, 0x0D, 0x8A, 0x13, 0x8A, 0x0C, 0x89, +0x15, 0x89, 0x10, 0x84, 0x17, 0x89, 0x2C, 0x89, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x89, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x0D, 0x84, 0x1A, 0x88, 0x09, 0x88, 0x19, 0x88, +0x0A, 0x89, 0x18, 0x88, 0x0A, 0x89, 0x18, 0x88, +0x0B, 0x88, 0x17, 0x89, 0x0B, 0x89, 0x16, 0x88, +0x0C, 0x89, 0x15, 0x89, 0x0D, 0x89, 0x13, 0x89, +0x0E, 0x8A, 0x11, 0x8A, 0x0E, 0x8B, 0x0F, 0x8A, +0x10, 0x8B, 0x0D, 0x8A, 0x12, 0x8D, 0x07, 0x8D, +0x12, 0xA2, 0x14, 0xA0, 0x16, 0x9E, 0x19, 0x9B, +0x1B, 0x98, 0x1F, 0x95, 0x22, 0x90, 0x28, 0x8A, +0x4E +}; + +PROGMEM const unsigned char chr_f72_36[] = +{ +0x7F, 0x72, 0x89, 0x28, 0x90, 0x23, 0x95, 0x1E, +0x98, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, +0xA0, 0x14, 0x8D, 0x06, 0x8D, 0x12, 0x8B, 0x0B, +0x8B, 0x12, 0x8A, 0x0E, 0x8A, 0x10, 0x89, 0x11, +0x89, 0x0F, 0x8A, 0x12, 0x89, 0x0E, 0x89, 0x13, +0x89, 0x0E, 0x88, 0x15, 0x88, 0x0D, 0x89, 0x15, +0x89, 0x0C, 0x88, 0x16, 0x89, 0x0B, 0x89, 0x17, +0x88, 0x0B, 0x88, 0x18, 0x84, 0x0F, 0x88, 0x2D, +0x87, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x88, 0x0A, 0x88, 0x19, 0x87, 0x08, 0x8E, 0x16, +0x87, 0x06, 0x92, 0x13, 0x88, 0x04, 0x96, 0x11, +0x88, 0x03, 0x98, 0x10, 0x88, 0x02, 0x9A, 0x0F, +0x88, 0x01, 0x9C, 0x0E, 0x88, 0x00, 0x9E, 0x0D, +0x92, 0x07, 0x8E, 0x0C, 0x90, 0x0C, 0x8C, 0x0B, +0x8E, 0x10, 0x8A, 0x0B, 0x8D, 0x12, 0x8A, 0x0A, +0x8C, 0x14, 0x89, 0x0A, 0x8B, 0x16, 0x89, 0x09, +0x8A, 0x17, 0x89, 0x09, 0x89, 0x19, 0x88, 0x09, +0x89, 0x19, 0x88, 0x09, 0x89, 0x19, 0x89, 0x08, +0x88, 0x1B, 0x88, 0x08, 0x88, 0x1B, 0x88, 0x08, +0x88, 0x1B, 0x88, 0x08, 0x88, 0x1B, 0x88, 0x09, +0x87, 0x1B, 0x88, 0x09, 0x87, 0x1B, 0x88, 0x09, +0x87, 0x1B, 0x88, 0x09, 0x87, 0x1B, 0x88, 0x09, +0x88, 0x1A, 0x88, 0x0A, 0x87, 0x19, 0x89, 0x0A, +0x87, 0x19, 0x88, 0x0B, 0x88, 0x18, 0x88, 0x0B, +0x88, 0x17, 0x89, 0x0C, 0x88, 0x16, 0x88, 0x0D, +0x88, 0x15, 0x89, 0x0E, 0x88, 0x14, 0x89, 0x0E, +0x89, 0x12, 0x89, 0x10, 0x89, 0x10, 0x8A, 0x10, +0x8B, 0x0C, 0x8B, 0x12, 0x8C, 0x07, 0x8D, 0x14, +0xA1, 0x15, 0x9F, 0x17, 0x9D, 0x19, 0x9B, 0x1C, +0x97, 0x1F, 0x95, 0x23, 0x8F, 0x29, 0x89, 0x4D +}; + +PROGMEM const unsigned char chr_f72_37[] = +{ +0x7F, 0x7F, 0x17, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB, +0x0A, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB, 0x0A, 0xAB, +0x0A, 0xAB, 0x0A, 0xAA, 0x2E, 0x86, 0x2E, 0x86, +0x2E, 0x87, 0x2D, 0x87, 0x2D, 0x87, 0x2D, 0x87, +0x2E, 0x87, 0x2D, 0x87, 0x2D, 0x87, 0x2E, 0x87, +0x2D, 0x87, 0x2D, 0x88, 0x2D, 0x87, 0x2D, 0x87, +0x2D, 0x88, 0x2D, 0x87, 0x2D, 0x88, 0x2D, 0x87, +0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x88, +0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2C, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, +0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2C, 0x89, +0x2C, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, +0x2D, 0x88, 0x7F, 0xC +}; + +PROGMEM const unsigned char chr_f72_38[] = +{ +0x7F, 0x70, 0x89, 0x28, 0x91, 0x22, 0x95, 0x1E, +0x99, 0x1B, 0x9B, 0x19, 0x9D, 0x17, 0x9F, 0x15, +0xA1, 0x13, 0x8D, 0x07, 0x8C, 0x13, 0x8B, 0x0B, +0x8B, 0x11, 0x8A, 0x0F, 0x8A, 0x10, 0x89, 0x11, +0x89, 0x10, 0x88, 0x13, 0x88, 0x0F, 0x89, 0x13, +0x89, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15, +0x88, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15, +0x88, 0x0E, 0x88, 0x15, 0x88, 0x0E, 0x88, 0x15, +0x88, 0x0E, 0x88, 0x15, 0x88, 0x0F, 0x88, 0x13, +0x88, 0x10, 0x88, 0x13, 0x88, 0x10, 0x89, 0x11, +0x89, 0x11, 0x89, 0x0F, 0x89, 0x13, 0x89, 0x0D, +0x89, 0x15, 0x8B, 0x07, 0x8C, 0x16, 0x9D, 0x19, +0x9B, 0x1C, 0x97, 0x20, 0x93, 0x20, 0x96, 0x1D, +0x9A, 0x1A, 0x9D, 0x17, 0x9F, 0x15, 0x8C, 0x07, +0x8C, 0x13, 0x8A, 0x0C, 0x8B, 0x11, 0x8A, 0x0F, +0x8A, 0x0F, 0x8A, 0x11, 0x89, 0x0F, 0x89, 0x13, +0x89, 0x0D, 0x89, 0x15, 0x88, 0x0D, 0x89, 0x15, +0x89, 0x0C, 0x88, 0x17, 0x88, 0x0C, 0x88, 0x17, +0x88, 0x0B, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19, +0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19, +0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19, +0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x88, 0x19, +0x88, 0x0A, 0x88, 0x19, 0x88, 0x0A, 0x89, 0x17, +0x89, 0x0B, 0x88, 0x17, 0x88, 0x0C, 0x89, 0x15, +0x89, 0x0C, 0x89, 0x15, 0x89, 0x0D, 0x89, 0x13, +0x89, 0x0E, 0x8A, 0x11, 0x8A, 0x0F, 0x8A, 0x0F, +0x8A, 0x10, 0x8C, 0x0C, 0x8B, 0x11, 0x8D, 0x07, +0x8D, 0x13, 0xA1, 0x15, 0x9F, 0x17, 0x9D, 0x19, +0x9B, 0x1B, 0x99, 0x1E, 0x95, 0x22, 0x91, 0x28, +0x89, 0x4E +}; + +PROGMEM const unsigned char chr_f72_39[] = +{ +0x7F, 0x70, 0x88, 0x29, 0x90, 0x23, 0x94, 0x20, +0x97, 0x1C, 0x9A, 0x1A, 0x9C, 0x18, 0x9E, 0x16, +0xA0, 0x14, 0x8E, 0x07, 0x8B, 0x13, 0x8C, 0x0B, +0x8A, 0x11, 0x8B, 0x0F, 0x88, 0x11, 0x8A, 0x11, +0x88, 0x0F, 0x8A, 0x13, 0x88, 0x0E, 0x89, 0x14, +0x88, 0x0D, 0x89, 0x16, 0x87, 0x0D, 0x89, 0x17, +0x87, 0x0C, 0x88, 0x18, 0x87, 0x0C, 0x88, 0x18, +0x87, 0x0B, 0x89, 0x19, 0x87, 0x0A, 0x88, 0x1A, +0x87, 0x0A, 0x88, 0x1A, 0x87, 0x0A, 0x88, 0x1A, +0x87, 0x0A, 0x88, 0x1A, 0x87, 0x0A, 0x88, 0x1A, +0x87, 0x0A, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x88, 0x1A, 0x88, 0x09, 0x88, 0x1A, +0x88, 0x09, 0x89, 0x18, 0x89, 0x0A, 0x88, 0x18, +0x89, 0x0A, 0x88, 0x18, 0x89, 0x0A, 0x89, 0x16, +0x8A, 0x0A, 0x89, 0x16, 0x8A, 0x0B, 0x89, 0x14, +0x8B, 0x0B, 0x8A, 0x12, 0x8C, 0x0C, 0x8A, 0x10, +0x8D, 0x0C, 0x8C, 0x0C, 0x8F, 0x0D, 0x8E, 0x07, +0x91, 0x0E, 0x9D, 0x00, 0x88, 0x0F, 0x9B, 0x01, +0x88, 0x10, 0x99, 0x02, 0x88, 0x11, 0x97, 0x03, +0x88, 0x12, 0x95, 0x04, 0x88, 0x13, 0x92, 0x06, +0x87, 0x16, 0x8E, 0x08, 0x87, 0x19, 0x88, 0x0A, +0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, 0x88, 0x2D, +0x87, 0x2D, 0x88, 0x10, 0x84, 0x17, 0x88, 0x0C, +0x88, 0x17, 0x88, 0x0C, 0x89, 0x15, 0x88, 0x0D, +0x89, 0x15, 0x88, 0x0E, 0x88, 0x14, 0x89, 0x0E, +0x89, 0x13, 0x88, 0x0F, 0x89, 0x12, 0x89, 0x10, +0x89, 0x10, 0x89, 0x11, 0x8A, 0x0E, 0x8A, 0x11, +0x8B, 0x0B, 0x8B, 0x13, 0x8C, 0x07, 0x8C, 0x15, +0x9F, 0x16, 0x9E, 0x18, 0x9C, 0x1A, 0x9A, 0x1D, +0x97, 0x1F, 0x94, 0x23, 0x90, 0x28, 0x89, 0x50 +}; + +PROGMEM const unsigned char chr_f72_3A[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x23, 0x88, 0x13, +0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, +0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x33, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x44 +}; +PROGMEM const unsigned char * const chrtbl_f72[96] = // character pointer table +{ + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_2D, chr_f72_2E, chr_f72_20, + chr_f72_30, chr_f72_31, chr_f72_32, chr_f72_33, chr_f72_34, chr_f72_35, chr_f72_36, chr_f72_37, + chr_f72_38, chr_f72_39, chr_f72_3A, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20 +}; diff --git a/libraries/TFT_eSPI/Fonts/Font72rle.h b/libraries/TFT_eSPI/Fonts/Font72rle.h new file mode 100644 index 0000000..6e9d88f --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font72rle.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f72 96 +#define chr_hgt_f72 75 +#define baseline_f72 73 +#define data_size_f72 8 +#define firstchr_f72 32 + +extern const unsigned char widtbl_f72[96]; +extern const unsigned char* const chrtbl_f72[96]; diff --git a/libraries/TFT_eSPI/Fonts/Font72x53rle.c b/libraries/TFT_eSPI/Fonts/Font72x53rle.c new file mode 100644 index 0000000..ae8d00c --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font72x53rle.c @@ -0,0 +1,245 @@ +// Font 8 +// +// This font has been 8-bit Run Length Encoded to save FLASH space +// +// It is a Arial 75 pixel height font intended to display large numbers +// Width for numerals reduced from 55 to 53 (to fit in 160 pixel screens) +// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - . +// All other characters print as a space + + +PROGMEM const unsigned char widtbl_f72[96] = // character width table +{ + 29, 29, 29, 29, 29, 29, 29, 29, // char 32 - 39 + 29, 29, 29, 29, 29, 29, 29, 29, // char 40 - 47 + 53, 53, 53, 53, 53, 53, 53, 53, // char 48 - 55 + 53, 53, 29, 29, 29, 29, 29, 29, // char 56 - 63 + 29, 29, 29, 29, 29, 29, 29, 29, // char 64 - 71 + 29, 29, 29, 29, 29, 29, 29, 29, // char 72 - 79 + 29, 29, 29, 29, 29, 29, 29, 29, // char 80 - 87 + 29, 29, 29, 29, 29, 29, 29, 29, // char 88 - 95 + 29, 29, 29, 29, 29, 29, 29, 29, // char 96 - 103 + 29, 29, 29, 29, 29, 29, 29, 29, // char 104 - 111 + 29, 29, 29, 29, 29, 29, 29, 29, // char 112 - 119 + 29, 29, 29, 29, 29, 29, 29, 29 // char 120 - 127 +}; + +// Row format, MSB left + +PROGMEM const unsigned char chr_f72_20[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7E +}; + +PROGMEM const unsigned char chr_f72_2D[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x36, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, +0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x07 +}; + +PROGMEM const unsigned char chr_f72_2E[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x48, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x44 +}; + +PROGMEM const unsigned char chr_f72_30[] = +{ +0x7F, 0x68, 0x8A, 0x26, 0x90, 0x21, 0x94, 0x1D, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, +0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10, +0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0C, 0x89, 0x14, +0x88, 0x0C, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0A, 0x88, 0x18, +0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, +0x88, 0x09, 0x88, 0x18, 0x88, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x08, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, +0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0A, 0x88, 0x16, +0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x89, 0x14, 0x89, 0x0C, 0x88, 0x14, +0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E, 0x88, 0x12, 0x88, 0x0F, 0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E, +0x8A, 0x10, 0x8B, 0x0A, 0x8B, 0x12, 0x8C, 0x06, 0x8C, 0x13, 0xA0, 0x14, 0x9E, 0x16, 0x9C, 0x18, +0x9A, 0x1A, 0x98, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x8A, 0x49 +}; + +PROGMEM const unsigned char chr_f72_31[] = +{ +0x7F, 0x70, 0x85, 0x2D, 0x86, 0x2D, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29, +0x8A, 0x28, 0x8B, 0x27, 0x8C, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x22, 0x91, 0x20, 0x93, 0x1E, +0x95, 0x1C, 0x8D, 0x00, 0x88, 0x1B, 0x8C, 0x02, 0x88, 0x1B, 0x8B, 0x03, 0x88, 0x1B, 0x8A, 0x04, +0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x87, 0x07, 0x88, 0x1B, 0x85, 0x09, 0x88, 0x1B, 0x83, 0x0B, +0x88, 0x1B, 0x81, 0x0D, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7B +}; + +PROGMEM const unsigned char chr_f72_32[] = +{ +0x7F, 0x67, 0x8A, 0x25, 0x92, 0x1F, 0x96, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, 0xA0, 0x12, +0xA2, 0x10, 0x8E, 0x07, 0x8D, 0x0F, 0x8B, 0x0C, 0x8C, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x89, 0x12, +0x8A, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x88, 0x16, 0x89, 0x0A, 0x88, 0x16, +0x89, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0D, 0x84, 0x18, +0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29, +0x89, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x8A, 0x28, 0x8A, 0x28, 0x8B, 0x27, 0x8B, 0x27, 0x8B, 0x27, +0x8B, 0x27, 0x8B, 0x27, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8C, 0x26, +0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8D, 0x25, 0x8D, 0x25, 0x8C, 0x26, 0x8C, 0x26, +0x8C, 0x27, 0x8B, 0x27, 0x8B, 0x27, 0x8A, 0x28, 0x8A, 0x29, 0x89, 0x29, 0x8A, 0x29, 0x89, 0x29, +0x89, 0x2A, 0xAA, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x07, 0xAC, 0x07, 0xAC, 0x07, 0xAC, 0x07, +0xAC, 0x07, 0xAC, 0x6E +}; + +PROGMEM const unsigned char chr_f72_33[] = +{ +0x7F, 0x67, 0x89, 0x27, 0x90, 0x21, 0x94, 0x1D, 0x97, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, +0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10, +0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0D, 0x88, 0x14, +0x88, 0x0C, 0x89, 0x14, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x10, 0x84, 0x15, 0x88, 0x2B, 0x88, 0x2B, +0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x89, 0x28, 0x8B, 0x26, 0x8C, 0x21, +0x91, 0x22, 0x8F, 0x24, 0x8D, 0x26, 0x8F, 0x23, 0x92, 0x21, 0x94, 0x1F, 0x95, 0x1E, 0x81, 0x07, +0x8C, 0x29, 0x8B, 0x2A, 0x8A, 0x2A, 0x89, 0x2B, 0x89, 0x2B, 0x89, 0x2A, 0x89, 0x2B, 0x88, 0x2B, +0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A, +0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x89, 0x18, 0x89, 0x07, 0x89, 0x18, 0x88, 0x09, 0x88, 0x18, +0x88, 0x09, 0x89, 0x16, 0x89, 0x09, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x8A, 0x12, +0x89, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x8B, 0x0D, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA2, 0x12, +0xA0, 0x14, 0x9D, 0x17, 0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A +}; + +PROGMEM const unsigned char chr_f72_34[] = +{ +0x7F, 0x7F, 0x2A, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29, 0x8A, 0x28, 0x8B, +0x27, 0x8C, 0x26, 0x8D, 0x26, 0x8D, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x23, 0x90, 0x22, 0x91, +0x21, 0x92, 0x20, 0x93, 0x20, 0x93, 0x1F, 0x8A, 0x00, 0x88, 0x1E, 0x8A, 0x01, 0x88, 0x1D, 0x8A, +0x02, 0x88, 0x1C, 0x8B, 0x02, 0x88, 0x1C, 0x8A, 0x03, 0x88, 0x1B, 0x8A, 0x04, 0x88, 0x1A, 0x8A, +0x05, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x18, 0x8A, 0x07, 0x88, 0x17, 0x8A, +0x08, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x15, 0x8A, 0x0A, 0x88, 0x14, 0x8A, +0x0B, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x12, 0x8A, 0x0D, 0x88, 0x11, 0x8A, +0x0E, 0x88, 0x10, 0x8A, 0x0F, 0x88, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x10, 0x88, 0x0E, 0x8A, +0x11, 0x88, 0x0D, 0x8A, 0x12, 0x88, 0x0C, 0x8A, 0x13, 0x88, 0x0C, 0xAF, 0x04, 0xAF, 0x04, 0xAF, +0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x23, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x75 +}; + +PROGMEM const unsigned char chr_f72_35[] = +{ +0x7F, 0x7F, 0x14, 0xA0, 0x13, 0xA0, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, +0x11, 0xA2, 0x11, 0xA2, 0x11, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, +0x06, 0x88, 0x1A, 0x89, 0x03, 0x8E, 0x17, 0x88, 0x02, 0x92, 0x15, 0x88, 0x00, 0x96, 0x13, 0xA1, +0x11, 0xA3, 0x10, 0xA4, 0x0F, 0xA5, 0x0E, 0x8F, 0x07, 0x8E, 0x0D, 0x8C, 0x0D, 0x8C, 0x0B, 0x8B, +0x11, 0x8A, 0x0B, 0x8A, 0x13, 0x8A, 0x0A, 0x89, 0x15, 0x89, 0x0E, 0x84, 0x17, 0x89, 0x2A, 0x89, +0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A, 0x88, 0x07, 0x88, 0x19, 0x88, +0x08, 0x89, 0x18, 0x88, 0x08, 0x89, 0x18, 0x88, 0x09, 0x88, 0x17, 0x89, 0x09, 0x89, 0x16, 0x88, +0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A, +0x0E, 0x8B, 0x0D, 0x8A, 0x10, 0x8D, 0x07, 0x8D, 0x10, 0xA2, 0x12, 0xA0, 0x14, 0x9E, 0x17, 0x9B, +0x19, 0x98, 0x1D, 0x95, 0x20, 0x90, 0x26, 0x8A, 0x4A +}; + +PROGMEM const unsigned char chr_f72_36[] = +{ +0x7F, 0x6A, 0x89, 0x26, 0x90, 0x21, 0x95, 0x1C, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, +0xA0, 0x12, 0x8D, 0x06, 0x8D, 0x10, 0x8B, 0x0B, 0x8B, 0x10, 0x8A, 0x0E, 0x8A, 0x0E, 0x89, 0x11, +0x89, 0x0D, 0x8A, 0x12, 0x89, 0x0C, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0B, 0x89, 0x15, +0x89, 0x0A, 0x88, 0x16, 0x89, 0x09, 0x89, 0x17, 0x88, 0x09, 0x88, 0x18, 0x84, 0x0D, 0x88, 0x2B, +0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0A, 0x88, 0x17, 0x87, 0x08, 0x8E, 0x14, +0x87, 0x06, 0x92, 0x11, 0x88, 0x04, 0x96, 0x0F, 0x88, 0x03, 0x98, 0x0E, 0x88, 0x02, 0x9A, 0x0D, +0x88, 0x01, 0x9C, 0x0C, 0x88, 0x00, 0x9E, 0x0B, 0x92, 0x07, 0x8E, 0x0A, 0x90, 0x0C, 0x8C, 0x09, +0x8E, 0x10, 0x8A, 0x09, 0x8D, 0x12, 0x8A, 0x08, 0x8C, 0x14, 0x89, 0x08, 0x8B, 0x16, 0x89, 0x07, +0x8A, 0x17, 0x89, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x89, 0x06, +0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x07, +0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, +0x88, 0x1A, 0x88, 0x08, 0x87, 0x19, 0x89, 0x08, 0x87, 0x19, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, +0x88, 0x17, 0x89, 0x0A, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x15, 0x89, 0x0C, 0x88, 0x14, 0x89, 0x0C, +0x89, 0x12, 0x89, 0x0E, 0x89, 0x10, 0x8A, 0x0E, 0x8B, 0x0C, 0x8B, 0x10, 0x8C, 0x07, 0x8D, 0x12, +0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17, 0x9B, 0x1A, 0x97, 0x1D, 0x95, 0x21, 0x8F, 0x27, 0x89, 0x49 + +}; + +PROGMEM const unsigned char chr_f72_37[] = +{ +0x7F, 0x7F, 0x0D, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, +0x08, 0xAB, 0x08, 0xAA, 0x2C, 0x86, 0x2C, 0x86, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2B, 0x87, +0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x87, +0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88, +0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, +0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, +0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, +0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7F, 0x06 +}; + +PROGMEM const unsigned char chr_f72_38[] = +{ +0x7F, 0x68, 0x89, 0x26, 0x91, 0x20, 0x95, 0x1C, 0x99, 0x19, 0x9B, 0x17, 0x9D, 0x15, 0x9F, 0x13, +0xA1, 0x11, 0x8D, 0x07, 0x8C, 0x11, 0x8B, 0x0B, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0E, 0x89, 0x11, +0x89, 0x0E, 0x88, 0x13, 0x88, 0x0D, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, +0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, +0x88, 0x0C, 0x88, 0x15, 0x88, 0x0D, 0x88, 0x13, 0x88, 0x0E, 0x88, 0x13, 0x88, 0x0E, 0x89, 0x11, +0x89, 0x0F, 0x89, 0x0F, 0x89, 0x11, 0x89, 0x0D, 0x89, 0x13, 0x8B, 0x07, 0x8C, 0x14, 0x9D, 0x17, +0x9B, 0x1A, 0x97, 0x1E, 0x93, 0x1E, 0x96, 0x1B, 0x9A, 0x18, 0x9D, 0x15, 0x9F, 0x13, 0x8C, 0x07, +0x8C, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0D, 0x8A, 0x11, 0x89, 0x0D, 0x89, 0x13, +0x89, 0x0B, 0x89, 0x15, 0x88, 0x0B, 0x89, 0x15, 0x89, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x88, 0x17, +0x88, 0x09, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, +0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, +0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x89, 0x17, 0x89, 0x09, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15, +0x89, 0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0D, 0x8A, 0x0F, +0x8A, 0x0E, 0x8C, 0x0C, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17, +0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A +}; + +PROGMEM const unsigned char chr_f72_39[] = +{ +0x7F, 0x68, 0x88, 0x27, 0x90, 0x21, 0x94, 0x1E, 0x97, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, +0xA0, 0x12, 0x8E, 0x07, 0x8B, 0x11, 0x8C, 0x0B, 0x8A, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x11, +0x88, 0x0D, 0x8A, 0x13, 0x88, 0x0C, 0x89, 0x14, 0x88, 0x0B, 0x89, 0x16, 0x87, 0x0B, 0x89, 0x17, +0x87, 0x0A, 0x88, 0x18, 0x87, 0x0A, 0x88, 0x18, 0x87, 0x09, 0x89, 0x19, 0x87, 0x08, 0x88, 0x1A, +0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, +0x87, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, +0x88, 0x07, 0x89, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x89, 0x16, +0x8A, 0x08, 0x89, 0x16, 0x8A, 0x09, 0x89, 0x14, 0x8B, 0x09, 0x8A, 0x12, 0x8C, 0x0A, 0x8A, 0x10, +0x8D, 0x0A, 0x8C, 0x0C, 0x8F, 0x0B, 0x8E, 0x07, 0x91, 0x0C, 0x9D, 0x00, 0x88, 0x0D, 0x9B, 0x01, +0x88, 0x0E, 0x99, 0x02, 0x88, 0x0F, 0x97, 0x03, 0x88, 0x10, 0x95, 0x04, 0x88, 0x11, 0x92, 0x06, +0x87, 0x14, 0x8E, 0x08, 0x87, 0x17, 0x88, 0x0A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, +0x87, 0x2B, 0x88, 0x0E, 0x84, 0x17, 0x88, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15, 0x88, 0x0B, +0x89, 0x15, 0x88, 0x0C, 0x88, 0x14, 0x89, 0x0C, 0x89, 0x13, 0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E, +0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E, 0x8A, 0x0F, 0x8B, 0x0B, 0x8B, 0x11, 0x8C, 0x07, 0x8C, 0x13, +0x9F, 0x14, 0x9E, 0x16, 0x9C, 0x18, 0x9A, 0x1B, 0x97, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x89, 0x4C +}; + +PROGMEM const unsigned char chr_f72_3A[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x23, 0x88, 0x13, +0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, +0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x33, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, +0x44 +}; +PROGMEM const unsigned char * const chrtbl_f72[96] = // character pointer table +{ + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_2D, chr_f72_2E, chr_f72_20, + chr_f72_30, chr_f72_31, chr_f72_32, chr_f72_33, chr_f72_34, chr_f72_35, chr_f72_36, chr_f72_37, + chr_f72_38, chr_f72_39, chr_f72_3A, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, + chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20 +}; diff --git a/libraries/TFT_eSPI/Fonts/Font72x53rle.h b/libraries/TFT_eSPI/Fonts/Font72x53rle.h new file mode 100644 index 0000000..b7ce1c9 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font72x53rle.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f72 96 +#define chr_hgt_f72 75 +#define baseline_f72 73 +#define data_size_f72 8 +#define firstchr_f72 32 + +extern const unsigned char widtbl_f72[96]; +extern const unsigned char* const chrtbl_f72[96]; diff --git a/libraries/TFT_eSPI/Fonts/Font7srle.c b/libraries/TFT_eSPI/Fonts/Font7srle.c new file mode 100644 index 0000000..7d54a6f --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font7srle.c @@ -0,0 +1,266 @@ +// Font 7 +// +// This font has been 8-bit Run Length Encoded to save FLASH space +// +// This is a 7 segment font intended to display numbers and time +// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . - +// All other characters print as a space + + +PROGMEM const unsigned char widtbl_f7s[96] = // character width table +{ + 12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39 + 12, 12, 12, 12, 12, 32, 12, 12, // char 40 - 47 + 32, 32, 32, 32, 32, 32, 32, 32, // char 48 - 55 + 32, 32, 12, 12, 12, 12, 12, 12, // char 56 - 63 + 12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71 + 12, 12, 12, 12, 12, 12, 12, 12, // char 72 - 79 + 12, 12, 12, 12, 12, 12, 12, 12, // char 80 - 87 + 12, 12, 12, 12, 12, 12, 12, 12, // char 88 - 95 + 12, 12, 12, 12, 12, 12, 12, 12, // char 96 - 103 + 12, 12, 12, 12, 12, 12, 12, 12, // char 104 - 111 + 12, 12, 12, 12, 12, 12, 12, 12, // char 112 - 119 + 12, 12, 12, 12, 12, 12, 12, 12 // char 120 - 127 +}; + +// Row format, MSB left + +PROGMEM const unsigned char chr_f7s_20[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x3F +}; + +// Make - sign look like a segment +PROGMEM const unsigned char chr_f7s_2D[] = +{ +0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x27, 0x8E, 0x0E, +0x92, 0x0A, 0x96, 0x09, 0x94, 0x0C, 0x90, 0x7F, +0x7F, 0x7F, 0x7F, 0x7F, 0x47 +}; + +PROGMEM const unsigned char chr_f7s_2E[] = +{ +0x7F, 0x7F, 0x7F, 0x7B, 0x82, 0x07, 0x84, 0x06, +0x84, 0x06, 0x84, 0x07, 0x82, 0x10 +}; + +PROGMEM const unsigned char chr_f7s_30[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82, +0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x14, 0x82, +0x04, 0x80, 0x18, 0x80, 0x24, 0x80, 0x1E, 0x82, +0x15, 0x81, 0x04, 0x84, 0x11, 0x83, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x05, 0x83, +0x10, 0x83, 0x07, 0x81, 0x01, 0x8E, 0x01, 0x81, +0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E, +0x28 +}; + +PROGMEM const unsigned char chr_f7s_31[] = +{ +0x7F, 0x19, 0x80, 0x1D, 0x82, 0x1B, 0x84, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x1A, 0x84, 0x1C, 0x82, 0x1E, 0x80, 0x5D, +0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x1A, +0x83, 0x1C, 0x81, 0x7F, 0x24 +}; + +PROGMEM const unsigned char chr_f7s_32[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x1A, 0x84, 0x0A, 0x8E, 0x02, 0x82, +0x08, 0x92, 0x02, 0x80, 0x06, 0x96, 0x06, 0x80, +0x01, 0x94, 0x07, 0x82, 0x01, 0x90, 0x09, 0x84, +0x1A, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x1A, 0x83, 0x1C, 0x81, +0x01, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x0F, 0x8E, 0x28 +}; + +PROGMEM const unsigned char chr_f7s_33[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x1A, 0x84, 0x0A, 0x8E, 0x02, 0x82, +0x08, 0x92, 0x02, 0x80, 0x06, 0x96, 0x09, 0x94, +0x0C, 0x90, 0x02, 0x81, 0x1B, 0x83, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x1A, 0x83, 0x0B, 0x8E, 0x01, 0x81, +0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E, +0x28 +}; + +PROGMEM const unsigned char chr_f7s_34[] = +{ +0x7F, 0x19, 0x80, 0x08, 0x81, 0x12, 0x82, 0x06, +0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, +0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E, 0x02, +0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80, 0x06, +0x96, 0x09, 0x94, 0x0C, 0x90, 0x02, 0x81, 0x1B, +0x83, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, +0x85, 0x19, 0x85, 0x19, 0x85, 0x1A, 0x83, 0x1C, +0x81, 0x7F, 0x24 +}; + +PROGMEM const unsigned char chr_f7s_35[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x0B, 0x81, 0x01, 0x8E, 0x0B, 0x83, 0x1A, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x84, 0x1A, 0x82, 0x02, 0x8E, 0x0A, 0x80, +0x02, 0x92, 0x0A, 0x96, 0x09, 0x94, 0x0C, 0x90, +0x02, 0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x1A, 0x83, 0x0B, 0x8E, 0x01, 0x81, 0x0B, 0x90, +0x0D, 0x92, 0x0D, 0x90, 0x0F, 0x8E, 0x28 +}; + +PROGMEM const unsigned char chr_f7s_36[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x0B, 0x81, 0x01, 0x8E, 0x0B, 0x83, 0x1A, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x84, 0x1A, 0x82, 0x02, 0x8E, 0x0A, 0x80, +0x02, 0x92, 0x0A, 0x96, 0x06, 0x80, 0x01, 0x94, +0x07, 0x82, 0x01, 0x90, 0x02, 0x81, 0x04, 0x84, +0x11, 0x83, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, +0x0E, 0x85, 0x05, 0x83, 0x10, 0x83, 0x07, 0x81, +0x01, 0x8E, 0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92, +0x0D, 0x90, 0x0F, 0x8E, 0x28 +}; + +PROGMEM const unsigned char chr_f7s_37[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x0C, 0x8E, 0x01, 0x82, 0x1B, 0x84, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x1A, 0x84, 0x1C, 0x82, 0x1E, 0x80, +0x5D, 0x81, 0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x1A, 0x83, 0x1C, 0x81, 0x7F, 0x24 +}; + +PROGMEM const unsigned char chr_f7s_38[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82, +0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E, +0x02, 0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80, +0x06, 0x96, 0x06, 0x80, 0x01, 0x94, 0x07, 0x82, +0x01, 0x90, 0x02, 0x81, 0x04, 0x84, 0x11, 0x83, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x05, 0x83, 0x10, 0x83, 0x07, 0x81, 0x01, 0x8E, +0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x0F, 0x8E, 0x28 +}; + +PROGMEM const unsigned char chr_f7s_39[] = +{ +0x27, 0x8E, 0x0F, 0x90, 0x0D, 0x92, 0x0D, 0x90, +0x01, 0x80, 0x08, 0x81, 0x01, 0x8E, 0x01, 0x82, +0x06, 0x83, 0x10, 0x84, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x85, 0x0E, 0x85, 0x04, 0x85, 0x0E, 0x85, +0x04, 0x84, 0x10, 0x84, 0x04, 0x82, 0x02, 0x8E, +0x02, 0x82, 0x04, 0x80, 0x02, 0x92, 0x02, 0x80, +0x06, 0x96, 0x09, 0x94, 0x0C, 0x90, 0x02, 0x81, +0x1B, 0x83, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x19, 0x85, +0x19, 0x85, 0x19, 0x85, 0x19, 0x85, 0x1A, 0x83, +0x0B, 0x8E, 0x01, 0x81, 0x0B, 0x90, 0x0D, 0x92, +0x0D, 0x90, 0x0F, 0x8E, 0x28 +}; + +PROGMEM const unsigned char chr_f7s_3A[] = +{ +0x7F, 0x1F, 0x82, 0x07, 0x84, 0x06, 0x84, 0x06, +0x84, 0x07, 0x82, 0x7F, 0x18, 0x82, 0x07, 0x84, +0x06, 0x84, 0x06, 0x84, 0x07, 0x82, 0x7F, 0x20 +}; +PROGMEM const unsigned char* const chrtbl_f7s[96] = // character pointer table +{ + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_2D, chr_f7s_2E, chr_f7s_20, + chr_f7s_30, chr_f7s_31, chr_f7s_32, chr_f7s_33, chr_f7s_34, chr_f7s_35, chr_f7s_36, chr_f7s_37, + chr_f7s_38, chr_f7s_39, chr_f7s_3A, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, + chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20, chr_f7s_20 +}; diff --git a/libraries/TFT_eSPI/Fonts/Font7srle.h b/libraries/TFT_eSPI/Fonts/Font7srle.h new file mode 100644 index 0000000..c02c663 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/Font7srle.h @@ -0,0 +1,10 @@ +#include + +#define nr_chrs_f7s 96 +#define chr_hgt_f7s 48 +#define baseline_f7s 47 +#define data_size_f7s 8 +#define firstchr_f7s 32 + +extern const unsigned char widtbl_f7s[96]; +extern const unsigned char* const chrtbl_f7s[96]; diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono12pt7b.h new file mode 100644 index 0000000..94ecb88 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono12pt7b.h @@ -0,0 +1,227 @@ +const uint8_t FreeMono12pt7bBitmaps[] PROGMEM = { + 0x49, 0x24, 0x92, 0x48, 0x01, 0xF8, 0xE7, 0xE7, 0x67, 0x42, 0x42, 0x42, + 0x42, 0x09, 0x02, 0x41, 0x10, 0x44, 0x11, 0x1F, 0xF1, 0x10, 0x4C, 0x12, + 0x3F, 0xE1, 0x20, 0x48, 0x12, 0x04, 0x81, 0x20, 0x48, 0x04, 0x07, 0xA2, + 0x19, 0x02, 0x40, 0x10, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x10, 0x06, 0x01, + 0xE0, 0xA7, 0xC0, 0x40, 0x10, 0x04, 0x00, 0x3C, 0x19, 0x84, 0x21, 0x08, + 0x66, 0x0F, 0x00, 0x0C, 0x1C, 0x78, 0x01, 0xE0, 0xCC, 0x21, 0x08, 0x43, + 0x30, 0x78, 0x3E, 0x30, 0x10, 0x08, 0x02, 0x03, 0x03, 0x47, 0x14, 0x8A, + 0x43, 0x11, 0x8F, 0x60, 0xFD, 0xA4, 0x90, 0x05, 0x25, 0x24, 0x92, 0x48, + 0x92, 0x24, 0x11, 0x24, 0x89, 0x24, 0x92, 0x92, 0x90, 0x00, 0x04, 0x02, + 0x11, 0x07, 0xF0, 0xC0, 0x50, 0x48, 0x42, 0x00, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x87, 0xFC, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x3B, 0x9C, 0xCE, + 0x62, 0x00, 0xFF, 0xE0, 0xFF, 0x80, 0x00, 0x80, 0xC0, 0x40, 0x20, 0x20, + 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80, + 0x80, 0x40, 0x00, 0x1C, 0x31, 0x90, 0x58, 0x38, 0x0C, 0x06, 0x03, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x34, 0x13, 0x18, 0x70, 0x30, 0xE1, 0x44, 0x81, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F, 0xC0, 0x1E, 0x10, 0x90, + 0x68, 0x10, 0x08, 0x0C, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x0E, + 0x07, 0xFE, 0x3E, 0x10, 0x40, 0x08, 0x02, 0x00, 0x80, 0x40, 0xE0, 0x04, + 0x00, 0x80, 0x10, 0x04, 0x01, 0x00, 0xD8, 0x63, 0xE0, 0x06, 0x0A, 0x0A, + 0x12, 0x22, 0x22, 0x42, 0x42, 0x82, 0x82, 0xFF, 0x02, 0x02, 0x02, 0x0F, + 0x7F, 0x20, 0x10, 0x08, 0x04, 0x02, 0xF1, 0x8C, 0x03, 0x00, 0x80, 0x40, + 0x20, 0x18, 0x16, 0x18, 0xF0, 0x0F, 0x8C, 0x08, 0x08, 0x04, 0x04, 0x02, + 0x79, 0x46, 0xC1, 0xE0, 0x60, 0x28, 0x14, 0x19, 0x08, 0x78, 0xFF, 0x81, + 0x81, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x3E, 0x31, 0xB0, 0x70, 0x18, 0x0C, 0x05, 0x8C, 0x38, 0x63, 0x40, + 0x60, 0x30, 0x18, 0x1B, 0x18, 0xF8, 0x3C, 0x31, 0x30, 0x50, 0x28, 0x0C, + 0x0F, 0x06, 0x85, 0x3C, 0x80, 0x40, 0x40, 0x20, 0x20, 0x63, 0xE0, 0xFF, + 0x80, 0x07, 0xFC, 0x39, 0xCE, 0x00, 0x00, 0x06, 0x33, 0x98, 0xC4, 0x00, + 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, + 0x00, 0x30, 0x01, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x80, 0x18, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x02, + 0x00, 0x00, 0x3E, 0x60, 0xA0, 0x20, 0x10, 0x08, 0x08, 0x18, 0x10, 0x08, + 0x00, 0x00, 0x00, 0x01, 0xC0, 0xE0, 0x1C, 0x31, 0x10, 0x50, 0x28, 0x14, + 0x3A, 0x25, 0x22, 0x91, 0x4C, 0xA3, 0xF0, 0x08, 0x02, 0x01, 0x80, 0x7C, + 0x3F, 0x00, 0x0C, 0x00, 0x48, 0x01, 0x20, 0x04, 0x40, 0x21, 0x00, 0x84, + 0x04, 0x08, 0x1F, 0xE0, 0x40, 0x82, 0x01, 0x08, 0x04, 0x20, 0x13, 0xE1, + 0xF0, 0xFF, 0x08, 0x11, 0x01, 0x20, 0x24, 0x04, 0x81, 0x1F, 0xC2, 0x06, + 0x40, 0x68, 0x05, 0x00, 0xA0, 0x14, 0x05, 0xFF, 0x00, 0x1E, 0x48, 0x74, + 0x05, 0x01, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x04, 0x01, 0x01, + 0x30, 0x87, 0xC0, 0xFE, 0x10, 0x44, 0x09, 0x02, 0x40, 0x50, 0x14, 0x05, + 0x01, 0x40, 0x50, 0x14, 0x0D, 0x02, 0x41, 0x3F, 0x80, 0xFF, 0xC8, 0x09, + 0x01, 0x20, 0x04, 0x00, 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, + 0xA0, 0x14, 0x03, 0xFF, 0xC0, 0xFF, 0xE8, 0x05, 0x00, 0xA0, 0x04, 0x00, + 0x88, 0x1F, 0x02, 0x20, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0xF0, + 0x00, 0x1F, 0x46, 0x19, 0x01, 0x60, 0x28, 0x01, 0x00, 0x20, 0x04, 0x00, + 0x83, 0xF0, 0x0B, 0x01, 0x20, 0x23, 0x0C, 0x3E, 0x00, 0xE1, 0xD0, 0x24, + 0x09, 0x02, 0x40, 0x90, 0x27, 0xF9, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, + 0x40, 0xB8, 0x70, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x81, 0x1F, 0xC0, 0x0F, 0xE0, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, + 0x00, 0x20, 0x04, 0x80, 0x90, 0x12, 0x02, 0x40, 0xC6, 0x30, 0x7C, 0x00, + 0xF1, 0xE4, 0x0C, 0x41, 0x04, 0x20, 0x44, 0x04, 0x80, 0x5C, 0x06, 0x60, + 0x43, 0x04, 0x10, 0x40, 0x84, 0x08, 0x40, 0xCF, 0x07, 0xF8, 0x04, 0x00, + 0x80, 0x10, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x04, 0x80, + 0x90, 0x12, 0x03, 0xFF, 0xC0, 0xE0, 0x3B, 0x01, 0x94, 0x14, 0xA0, 0xA4, + 0x89, 0x24, 0x49, 0x14, 0x48, 0xA2, 0x45, 0x12, 0x10, 0x90, 0x04, 0x80, + 0x24, 0x01, 0x78, 0x3C, 0xE0, 0xF6, 0x02, 0x50, 0x25, 0x02, 0x48, 0x24, + 0xC2, 0x44, 0x24, 0x22, 0x43, 0x24, 0x12, 0x40, 0xA4, 0x0A, 0x40, 0x6F, + 0x06, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC0, 0xF0, 0xFF, 0x10, + 0x64, 0x05, 0x01, 0x40, 0x50, 0x34, 0x19, 0xFC, 0x40, 0x10, 0x04, 0x01, + 0x00, 0x40, 0x3E, 0x00, 0x0F, 0x03, 0x0C, 0x60, 0x64, 0x02, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x40, 0x26, 0x06, 0x30, 0xC1, + 0xF0, 0x0C, 0x01, 0xF1, 0x30, 0xE0, 0xFF, 0x04, 0x18, 0x40, 0xC4, 0x04, + 0x40, 0x44, 0x0C, 0x41, 0x87, 0xE0, 0x43, 0x04, 0x10, 0x40, 0x84, 0x04, + 0x40, 0x4F, 0x03, 0x1F, 0x48, 0x34, 0x05, 0x01, 0x40, 0x08, 0x01, 0xC0, + 0x0E, 0x00, 0x40, 0x18, 0x06, 0x01, 0xE1, 0xA7, 0xC0, 0xFF, 0xF0, 0x86, + 0x10, 0x82, 0x00, 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, + 0x02, 0x00, 0x40, 0x7F, 0x00, 0xF0, 0xF4, 0x02, 0x40, 0x24, 0x02, 0x40, + 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x24, 0x02, 0x40, 0x22, 0x04, 0x30, + 0xC0, 0xF0, 0xF8, 0x7C, 0x80, 0x22, 0x01, 0x04, 0x04, 0x10, 0x20, 0x40, + 0x80, 0x82, 0x02, 0x10, 0x08, 0x40, 0x11, 0x00, 0x48, 0x01, 0xA0, 0x03, + 0x00, 0x0C, 0x00, 0xF8, 0x7C, 0x80, 0x22, 0x00, 0x88, 0xC2, 0x23, 0x10, + 0x8E, 0x42, 0x29, 0x09, 0x24, 0x24, 0x90, 0x91, 0x41, 0x85, 0x06, 0x14, + 0x18, 0x70, 0x60, 0x80, 0xF0, 0xF2, 0x06, 0x30, 0x41, 0x08, 0x09, 0x80, + 0x50, 0x06, 0x00, 0x60, 0x0D, 0x00, 0x88, 0x10, 0xC2, 0x04, 0x60, 0x2F, + 0x0F, 0xF0, 0xF2, 0x02, 0x10, 0x41, 0x04, 0x08, 0x80, 0x50, 0x05, 0x00, + 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x01, 0xFC, 0xFF, 0x40, + 0xA0, 0x90, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x50, 0x30, 0x18, + 0x0F, 0xFC, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x24, 0x9C, 0x80, 0x60, 0x10, + 0x08, 0x02, 0x01, 0x00, 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0x80, 0x20, + 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x3C, 0x08, 0x0C, 0x09, 0x0C, 0x4C, 0x14, 0x04, 0xFF, 0xFC, 0x84, 0x21, + 0x3E, 0x00, 0x60, 0x08, 0x02, 0x3F, 0x98, 0x28, 0x0A, 0x02, 0xC3, 0x9F, + 0x30, 0xE0, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x13, 0xE0, 0xA0, + 0x86, 0x02, 0x20, 0x09, 0x00, 0x48, 0x02, 0x40, 0x13, 0x01, 0x14, 0x1B, + 0x9F, 0x00, 0x1F, 0x4C, 0x19, 0x01, 0x40, 0x28, 0x01, 0x00, 0x20, 0x02, + 0x00, 0x60, 0x43, 0xF0, 0x00, 0xC0, 0x08, 0x01, 0x00, 0x20, 0x04, 0x3C, + 0x98, 0x52, 0x06, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x24, 0x0C, 0xC2, 0x87, + 0x98, 0x3F, 0x18, 0x68, 0x06, 0x01, 0xFF, 0xE0, 0x08, 0x03, 0x00, 0x60, + 0xC7, 0xC0, 0x0F, 0x98, 0x08, 0x04, 0x02, 0x07, 0xF8, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x03, 0xF8, 0x1E, 0x6C, 0x39, 0x03, 0x40, + 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20, + 0x08, 0x3E, 0x00, 0xC0, 0x10, 0x04, 0x01, 0x00, 0x40, 0x13, 0x87, 0x11, + 0x82, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x2E, 0x1C, 0x08, 0x04, + 0x02, 0x00, 0x00, 0x03, 0xC0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x43, 0xFE, 0x04, 0x08, 0x10, 0x00, 0x1F, 0xC0, 0x81, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x0B, 0xE0, 0xE0, 0x02, 0x00, 0x20, + 0x02, 0x00, 0x20, 0x02, 0x3C, 0x21, 0x02, 0x60, 0x2C, 0x03, 0x80, 0x24, + 0x02, 0x20, 0x21, 0x02, 0x08, 0xE1, 0xF0, 0x78, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x43, 0xFE, + 0xDC, 0xE3, 0x19, 0x90, 0x84, 0x84, 0x24, 0x21, 0x21, 0x09, 0x08, 0x48, + 0x42, 0x42, 0x17, 0x18, 0xC0, 0x67, 0x83, 0x84, 0x20, 0x22, 0x02, 0x20, + 0x22, 0x02, 0x20, 0x22, 0x02, 0x20, 0x2F, 0x07, 0x1F, 0x04, 0x11, 0x01, + 0x40, 0x18, 0x03, 0x00, 0x60, 0x0A, 0x02, 0x20, 0x83, 0xE0, 0xCF, 0x85, + 0x06, 0x60, 0x24, 0x01, 0x40, 0x14, 0x01, 0x40, 0x16, 0x02, 0x50, 0x44, + 0xF8, 0x40, 0x04, 0x00, 0x40, 0x0F, 0x00, 0x1E, 0x6C, 0x3B, 0x03, 0x40, + 0x28, 0x05, 0x00, 0xA0, 0x12, 0x06, 0x61, 0x43, 0xC8, 0x01, 0x00, 0x20, + 0x04, 0x03, 0xC0, 0xE3, 0x8B, 0x13, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00, + 0x80, 0x20, 0x3F, 0x80, 0x1F, 0x58, 0x34, 0x05, 0x80, 0x1E, 0x00, 0x60, + 0x06, 0x01, 0xC0, 0xAF, 0xC0, 0x20, 0x04, 0x00, 0x80, 0x10, 0x0F, 0xF0, + 0x40, 0x08, 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x03, 0x04, 0x3F, + 0x00, 0xC1, 0xC8, 0x09, 0x01, 0x20, 0x24, 0x04, 0x80, 0x90, 0x12, 0x02, + 0x61, 0xC7, 0xCC, 0xF8, 0xF9, 0x01, 0x08, 0x10, 0x60, 0x81, 0x08, 0x08, + 0x40, 0x22, 0x01, 0x20, 0x05, 0x00, 0x30, 0x00, 0xF0, 0x7A, 0x01, 0x10, + 0x08, 0x8C, 0x42, 0x62, 0x12, 0x90, 0xA5, 0x05, 0x18, 0x28, 0xC0, 0x86, + 0x00, 0x78, 0xF3, 0x04, 0x18, 0x80, 0xD0, 0x06, 0x00, 0x70, 0x09, 0x81, + 0x0C, 0x20, 0x6F, 0x8F, 0xF0, 0xF2, 0x02, 0x20, 0x41, 0x04, 0x10, 0x80, + 0x88, 0x09, 0x00, 0x50, 0x06, 0x00, 0x20, 0x04, 0x00, 0x40, 0x08, 0x0F, + 0xE0, 0xFF, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0xBF, + 0xC0, 0x19, 0x08, 0x42, 0x10, 0x84, 0x64, 0x18, 0x42, 0x10, 0x84, 0x20, + 0xC0, 0xFF, 0xFF, 0xC0, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x10, 0x4C, 0x42, + 0x10, 0x84, 0x26, 0x00, 0x38, 0x13, 0x38, 0x38 }; + +const GFXglyph FreeMono12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' + { 0, 3, 15, 14, 6, -14 }, // 0x21 '!' + { 6, 8, 7, 14, 3, -14 }, // 0x22 '"' + { 13, 10, 16, 14, 2, -14 }, // 0x23 '#' + { 33, 10, 17, 14, 2, -14 }, // 0x24 '$' + { 55, 10, 15, 14, 2, -14 }, // 0x25 '%' + { 74, 9, 12, 14, 3, -11 }, // 0x26 '&' + { 88, 3, 7, 14, 5, -14 }, // 0x27 ''' + { 91, 3, 18, 14, 7, -14 }, // 0x28 '(' + { 98, 3, 18, 14, 4, -14 }, // 0x29 ')' + { 105, 9, 9, 14, 3, -14 }, // 0x2A '*' + { 116, 9, 11, 14, 3, -11 }, // 0x2B '+' + { 129, 5, 7, 14, 3, -3 }, // 0x2C ',' + { 134, 11, 1, 14, 2, -6 }, // 0x2D '-' + { 136, 3, 3, 14, 5, -2 }, // 0x2E '.' + { 138, 9, 18, 14, 3, -15 }, // 0x2F '/' + { 159, 9, 15, 14, 3, -14 }, // 0x30 '0' + { 176, 7, 14, 14, 4, -13 }, // 0x31 '1' + { 189, 9, 15, 14, 2, -14 }, // 0x32 '2' + { 206, 10, 15, 14, 2, -14 }, // 0x33 '3' + { 225, 8, 15, 14, 3, -14 }, // 0x34 '4' + { 240, 9, 15, 14, 3, -14 }, // 0x35 '5' + { 257, 9, 15, 14, 3, -14 }, // 0x36 '6' + { 274, 8, 15, 14, 3, -14 }, // 0x37 '7' + { 289, 9, 15, 14, 3, -14 }, // 0x38 '8' + { 306, 9, 15, 14, 3, -14 }, // 0x39 '9' + { 323, 3, 10, 14, 5, -9 }, // 0x3A ':' + { 327, 5, 13, 14, 3, -9 }, // 0x3B ';' + { 336, 11, 11, 14, 2, -11 }, // 0x3C '<' + { 352, 12, 4, 14, 1, -8 }, // 0x3D '=' + { 358, 11, 11, 14, 2, -11 }, // 0x3E '>' + { 374, 9, 14, 14, 3, -13 }, // 0x3F '?' + { 390, 9, 16, 14, 3, -14 }, // 0x40 '@' + { 408, 14, 14, 14, 0, -13 }, // 0x41 'A' + { 433, 11, 14, 14, 2, -13 }, // 0x42 'B' + { 453, 10, 14, 14, 2, -13 }, // 0x43 'C' + { 471, 10, 14, 14, 2, -13 }, // 0x44 'D' + { 489, 11, 14, 14, 2, -13 }, // 0x45 'E' + { 509, 11, 14, 14, 2, -13 }, // 0x46 'F' + { 529, 11, 14, 14, 2, -13 }, // 0x47 'G' + { 549, 10, 14, 14, 2, -13 }, // 0x48 'H' + { 567, 7, 14, 14, 4, -13 }, // 0x49 'I' + { 580, 11, 14, 14, 2, -13 }, // 0x4A 'J' + { 600, 12, 14, 14, 2, -13 }, // 0x4B 'K' + { 621, 11, 14, 14, 2, -13 }, // 0x4C 'L' + { 641, 13, 14, 14, 1, -13 }, // 0x4D 'M' + { 664, 12, 14, 14, 1, -13 }, // 0x4E 'N' + { 685, 12, 14, 14, 1, -13 }, // 0x4F 'O' + { 706, 10, 14, 14, 2, -13 }, // 0x50 'P' + { 724, 12, 17, 14, 1, -13 }, // 0x51 'Q' + { 750, 12, 14, 14, 2, -13 }, // 0x52 'R' + { 771, 10, 14, 14, 2, -13 }, // 0x53 'S' + { 789, 11, 14, 14, 2, -13 }, // 0x54 'T' + { 809, 12, 14, 14, 1, -13 }, // 0x55 'U' + { 830, 14, 14, 14, 0, -13 }, // 0x56 'V' + { 855, 14, 14, 14, 0, -13 }, // 0x57 'W' + { 880, 12, 14, 14, 1, -13 }, // 0x58 'X' + { 901, 12, 14, 14, 1, -13 }, // 0x59 'Y' + { 922, 9, 14, 14, 3, -13 }, // 0x5A 'Z' + { 938, 3, 18, 14, 7, -14 }, // 0x5B '[' + { 945, 9, 18, 14, 3, -15 }, // 0x5C '\' + { 966, 3, 18, 14, 5, -14 }, // 0x5D ']' + { 973, 9, 6, 14, 3, -14 }, // 0x5E '^' + { 980, 14, 1, 14, 0, 3 }, // 0x5F '_' + { 982, 4, 4, 14, 4, -15 }, // 0x60 '`' + { 984, 10, 10, 14, 2, -9 }, // 0x61 'a' + { 997, 13, 15, 14, 0, -14 }, // 0x62 'b' + { 1022, 11, 10, 14, 2, -9 }, // 0x63 'c' + { 1036, 11, 15, 14, 2, -14 }, // 0x64 'd' + { 1057, 10, 10, 14, 2, -9 }, // 0x65 'e' + { 1070, 9, 15, 14, 4, -14 }, // 0x66 'f' + { 1087, 11, 14, 14, 2, -9 }, // 0x67 'g' + { 1107, 10, 15, 14, 2, -14 }, // 0x68 'h' + { 1126, 9, 15, 14, 3, -14 }, // 0x69 'i' + { 1143, 7, 19, 14, 3, -14 }, // 0x6A 'j' + { 1160, 12, 15, 14, 1, -14 }, // 0x6B 'k' + { 1183, 9, 15, 14, 3, -14 }, // 0x6C 'l' + { 1200, 13, 10, 14, 1, -9 }, // 0x6D 'm' + { 1217, 12, 10, 14, 1, -9 }, // 0x6E 'n' + { 1232, 11, 10, 14, 2, -9 }, // 0x6F 'o' + { 1246, 12, 14, 14, 1, -9 }, // 0x70 'p' + { 1267, 11, 14, 14, 2, -9 }, // 0x71 'q' + { 1287, 10, 10, 14, 3, -9 }, // 0x72 'r' + { 1300, 10, 10, 14, 2, -9 }, // 0x73 's' + { 1313, 11, 14, 14, 1, -13 }, // 0x74 't' + { 1333, 11, 10, 14, 2, -9 }, // 0x75 'u' + { 1347, 13, 10, 14, 1, -9 }, // 0x76 'v' + { 1364, 13, 10, 14, 1, -9 }, // 0x77 'w' + { 1381, 12, 10, 14, 1, -9 }, // 0x78 'x' + { 1396, 12, 14, 14, 1, -9 }, // 0x79 'y' + { 1417, 9, 10, 14, 3, -9 }, // 0x7A 'z' + { 1429, 5, 18, 14, 5, -14 }, // 0x7B '{' + { 1441, 1, 18, 14, 7, -14 }, // 0x7C '|' + { 1444, 5, 18, 14, 5, -14 }, // 0x7D '}' + { 1456, 10, 3, 14, 2, -7 } }; // 0x7E '~' + +const GFXfont FreeMono12pt7b PROGMEM = { + (uint8_t *)FreeMono12pt7bBitmaps, + (GFXglyph *)FreeMono12pt7bGlyphs, + 0x20, 0x7E, 24 }; + +// Approx. 2132 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono18pt7b.h new file mode 100644 index 0000000..c605d29 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono18pt7b.h @@ -0,0 +1,363 @@ +const uint8_t FreeMono18pt7bBitmaps[] PROGMEM = { + 0x27, 0x77, 0x77, 0x77, 0x77, 0x22, 0x22, 0x20, 0x00, 0x6F, 0xF6, 0xF1, + 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC3, 0x98, 0x33, 0x06, 0x60, 0xCC, + 0x18, 0x04, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x04, 0x20, 0x10, 0x80, + 0x42, 0x01, 0x10, 0x04, 0x41, 0xFF, 0xF0, 0x44, 0x02, 0x10, 0x08, 0x40, + 0x21, 0x0F, 0xFF, 0xC2, 0x10, 0x08, 0x40, 0x21, 0x00, 0x84, 0x02, 0x10, + 0x08, 0x40, 0x23, 0x00, 0x88, 0x02, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80, + 0x1F, 0xA3, 0x07, 0x10, 0x09, 0x00, 0x48, 0x00, 0x40, 0x03, 0x00, 0x0C, + 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x20, 0x01, 0x80, 0x0C, 0x00, + 0x70, 0x05, 0xE0, 0xC9, 0xF8, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, + 0x10, 0x00, 0x1E, 0x00, 0x42, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x08, 0x40, 0x0F, 0x00, 0x00, 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xE0, + 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x86, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x30, 0x10, 0xC0, 0x1E, 0x00, 0x0F, 0xC1, 0x00, 0x20, 0x02, 0x00, + 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x03, 0xC0, 0x6C, 0x3C, 0x62, + 0x82, 0x68, 0x34, 0x81, 0xCC, 0x08, 0x61, 0xC3, 0xE7, 0xFF, 0xFF, 0xF6, + 0x66, 0x66, 0x08, 0xC4, 0x62, 0x31, 0x8C, 0xC6, 0x31, 0x8C, 0x63, 0x18, + 0xC3, 0x18, 0xC2, 0x18, 0xC3, 0x18, 0x86, 0x10, 0xC2, 0x18, 0xC6, 0x10, + 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x8C, 0x62, 0x31, 0x98, 0x80, 0x02, 0x00, + 0x10, 0x00, 0x80, 0x04, 0x0C, 0x21, 0x9D, 0x70, 0x1C, 0x00, 0xA0, 0x0D, + 0x80, 0xC6, 0x04, 0x10, 0x40, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, 0x02, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, + 0x01, 0x00, 0x3E, 0x78, 0xF3, 0xC7, 0x8E, 0x18, 0x70, 0xC1, 0x80, 0xFF, + 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x04, 0x00, 0x60, + 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, 0x02, + 0x00, 0x20, 0x01, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x40, 0x04, 0x00, + 0x20, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x0F, 0x81, 0x82, 0x08, 0x08, 0x80, 0x24, 0x01, 0x60, 0x0E, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, + 0x30, 0x03, 0x40, 0x12, 0x00, 0x88, 0x08, 0x60, 0xC0, 0xF8, 0x00, 0x06, + 0x00, 0x70, 0x06, 0x80, 0x64, 0x06, 0x20, 0x31, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, + 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x0F, 0x80, + 0xC3, 0x08, 0x04, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, + 0x10, 0x01, 0x00, 0x10, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x18, 0x01, 0x80, 0x58, 0x03, 0x80, 0x1F, 0xFF, 0x80, 0x0F, 0xC0, 0xC0, + 0x86, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x04, 0x00, + 0x20, 0x0F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x40, + 0x01, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x9C, 0x0C, 0x0F, 0xC0, 0x01, 0xC0, + 0x14, 0x02, 0x40, 0x64, 0x04, 0x40, 0xC4, 0x08, 0x41, 0x84, 0x10, 0x42, + 0x04, 0x20, 0x44, 0x04, 0x40, 0x48, 0x04, 0xFF, 0xF0, 0x04, 0x00, 0x40, + 0x04, 0x00, 0x40, 0x04, 0x07, 0xF0, 0x3F, 0xF0, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x0B, 0xF0, 0x30, 0x30, 0x00, 0x60, + 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0E, + 0x00, 0x2C, 0x01, 0x0C, 0x18, 0x0F, 0xC0, 0x01, 0xF0, 0x60, 0x18, 0x03, + 0x00, 0x20, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0xF8, 0x98, 0x4A, + 0x02, 0xE0, 0x3C, 0x01, 0x80, 0x14, 0x01, 0x40, 0x14, 0x03, 0x20, 0x21, + 0x0C, 0x0F, 0x80, 0xFF, 0xF8, 0x01, 0x80, 0x18, 0x03, 0x00, 0x20, 0x02, + 0x00, 0x20, 0x04, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x08, 0x00, 0x80, 0x18, + 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x0F, + 0x81, 0x83, 0x10, 0x05, 0x80, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03, + 0x40, 0x11, 0x83, 0x07, 0xF0, 0x60, 0xC4, 0x01, 0x60, 0x0E, 0x00, 0x30, + 0x01, 0x80, 0x0E, 0x00, 0xD0, 0x04, 0x60, 0xC1, 0xFC, 0x00, 0x1F, 0x03, + 0x08, 0x40, 0x4C, 0x02, 0x80, 0x28, 0x02, 0x80, 0x18, 0x03, 0xC0, 0x74, + 0x05, 0x21, 0x91, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x20, 0x02, 0x00, 0x40, + 0x0C, 0x01, 0x80, 0x60, 0xF8, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, + 0x1D, 0xFF, 0xFD, 0xC0, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0xF1, 0xE3, 0x8F, 0x1C, 0x38, 0xE1, 0xC3, 0x06, 0x00, 0x00, 0x06, + 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x38, + 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x70, + 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x3F, + 0x8E, 0x0C, 0x80, 0x28, 0x01, 0x80, 0x10, 0x01, 0x00, 0x10, 0x02, 0x00, + 0xC0, 0x38, 0x06, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, + 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x0F, 0x01, 0x86, 0x08, 0x08, 0x80, 0x24, + 0x01, 0x40, 0x0A, 0x00, 0x50, 0x1E, 0x83, 0x14, 0x20, 0xA2, 0x05, 0x10, + 0x28, 0x81, 0x46, 0x0A, 0x18, 0x50, 0x3F, 0x80, 0x04, 0x00, 0x10, 0x00, + 0x80, 0x02, 0x00, 0x18, 0x18, 0x3F, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x80, + 0x00, 0x34, 0x00, 0x01, 0x30, 0x00, 0x18, 0x80, 0x00, 0x86, 0x00, 0x04, + 0x30, 0x00, 0x60, 0x80, 0x02, 0x06, 0x00, 0x10, 0x10, 0x01, 0x80, 0x80, + 0x08, 0x06, 0x00, 0x7F, 0xF0, 0x06, 0x00, 0x80, 0x20, 0x06, 0x01, 0x00, + 0x10, 0x18, 0x00, 0xC0, 0x80, 0x06, 0x04, 0x00, 0x11, 0xFC, 0x0F, 0xF0, + 0xFF, 0xF8, 0x04, 0x01, 0x01, 0x00, 0x20, 0x40, 0x04, 0x10, 0x01, 0x04, + 0x00, 0x41, 0x00, 0x10, 0x40, 0x08, 0x10, 0x0C, 0x07, 0xFF, 0x01, 0x00, + 0x70, 0x40, 0x06, 0x10, 0x00, 0x84, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, + 0x10, 0x00, 0x44, 0x00, 0x21, 0x00, 0x33, 0xFF, 0xF8, 0x03, 0xF1, 0x06, + 0x0E, 0x8C, 0x01, 0xC4, 0x00, 0x64, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x01, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x01, 0x88, 0x01, 0x83, + 0x03, 0x80, 0x7E, 0x00, 0xFF, 0xE0, 0x20, 0x18, 0x20, 0x0C, 0x20, 0x04, + 0x20, 0x02, 0x20, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x02, 0x20, 0x02, + 0x20, 0x04, 0x20, 0x0C, 0x20, 0x18, 0xFF, 0xE0, 0xFF, 0xFF, 0x08, 0x00, + 0x84, 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x40, 0x10, 0x20, 0x0F, 0xF0, 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x40, 0x02, 0x20, 0x01, 0x10, 0x00, 0x88, 0x00, 0x44, 0x00, + 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, + 0x00, 0x08, 0x80, 0x00, 0x40, 0x00, 0x20, 0x40, 0x10, 0x20, 0x0F, 0xF0, + 0x04, 0x08, 0x02, 0x04, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, + 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF9, + 0x06, 0x07, 0x84, 0x00, 0xC4, 0x00, 0x24, 0x00, 0x12, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x0F, 0xF8, + 0x00, 0x14, 0x00, 0x09, 0x00, 0x04, 0x80, 0x02, 0x20, 0x01, 0x18, 0x00, + 0x83, 0x01, 0xC0, 0x7F, 0x00, 0xFC, 0x3F, 0x20, 0x04, 0x20, 0x04, 0x20, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x3F, + 0xFC, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0xFC, 0x3F, 0xFF, 0xF8, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, + 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, + 0x00, 0x10, 0x00, 0x81, 0xFF, 0xF0, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, + 0x00, 0x21, 0x00, 0x10, 0x80, 0x10, 0x20, 0x18, 0x0C, 0x18, 0x01, 0xF0, + 0x00, 0xFF, 0x1F, 0x84, 0x01, 0x81, 0x00, 0xC0, 0x40, 0x60, 0x10, 0x30, + 0x04, 0x18, 0x01, 0x0C, 0x00, 0x46, 0x00, 0x13, 0x00, 0x05, 0xF0, 0x01, + 0xC6, 0x00, 0x60, 0xC0, 0x10, 0x18, 0x04, 0x06, 0x01, 0x00, 0xC0, 0x40, + 0x30, 0x10, 0x04, 0x04, 0x01, 0x81, 0x00, 0x23, 0xFC, 0x0F, 0xFF, 0x80, + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, + 0x42, 0x00, 0x84, 0x01, 0x08, 0x02, 0x10, 0x04, 0x20, 0x0F, 0xFF, 0xF0, + 0xF0, 0x01, 0xE7, 0x00, 0x70, 0xA0, 0x0A, 0x16, 0x03, 0x42, 0x40, 0x48, + 0x4C, 0x19, 0x08, 0x82, 0x21, 0x10, 0x44, 0x23, 0x18, 0x84, 0x22, 0x10, + 0x86, 0xC2, 0x10, 0x50, 0x42, 0x0E, 0x08, 0x41, 0xC1, 0x08, 0x00, 0x21, + 0x00, 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x02, 0x7F, 0x03, 0xF0, + 0xF8, 0x1F, 0xC6, 0x00, 0x41, 0xC0, 0x10, 0x50, 0x04, 0x12, 0x01, 0x04, + 0xC0, 0x41, 0x10, 0x10, 0x46, 0x04, 0x10, 0x81, 0x04, 0x10, 0x41, 0x04, + 0x10, 0x40, 0x84, 0x10, 0x31, 0x04, 0x04, 0x41, 0x01, 0x90, 0x40, 0x24, + 0x10, 0x05, 0x04, 0x01, 0xC1, 0x00, 0x31, 0xFC, 0x0C, 0x03, 0xE0, 0x06, + 0x0C, 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x05, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0E, 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, + 0x06, 0x00, 0x7C, 0x00, 0xFF, 0xF0, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x03, + 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x06, 0x10, 0x0C, + 0x1F, 0xF0, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0xC0, 0x03, 0xE0, 0x06, 0x0C, + 0x04, 0x01, 0x04, 0x00, 0x46, 0x00, 0x32, 0x00, 0x0B, 0x00, 0x07, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0E, + 0x00, 0x0D, 0x00, 0x04, 0xC0, 0x06, 0x20, 0x02, 0x08, 0x02, 0x03, 0x06, + 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x7F, 0xC6, 0x38, 0x1E, 0xFF, + 0xF0, 0x02, 0x01, 0x80, 0x40, 0x08, 0x08, 0x01, 0x81, 0x00, 0x10, 0x20, + 0x02, 0x04, 0x00, 0x40, 0x80, 0x18, 0x10, 0x06, 0x02, 0x03, 0x80, 0x7F, + 0xC0, 0x08, 0x18, 0x01, 0x01, 0x80, 0x20, 0x18, 0x04, 0x01, 0x80, 0x80, + 0x10, 0x10, 0x03, 0x02, 0x00, 0x20, 0x40, 0x06, 0x7F, 0x80, 0x70, 0x0F, + 0xC8, 0x61, 0xE2, 0x01, 0x90, 0x02, 0x40, 0x09, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, + 0x00, 0x60, 0x01, 0x80, 0x0F, 0x00, 0x2B, 0x03, 0x23, 0xF0, 0xFF, 0xFF, + 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x20, 0x20, 0x00, 0x40, 0x00, + 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x01, 0xFF, 0xC0, + 0xFC, 0x1F, 0x90, 0x01, 0x08, 0x00, 0x84, 0x00, 0x42, 0x00, 0x21, 0x00, + 0x10, 0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01, 0x08, 0x00, 0x84, + 0x00, 0x42, 0x00, 0x21, 0x00, 0x10, 0x80, 0x08, 0x40, 0x04, 0x10, 0x04, + 0x0C, 0x06, 0x03, 0x06, 0x00, 0x7C, 0x00, 0xFE, 0x03, 0xF8, 0x80, 0x02, + 0x04, 0x00, 0x10, 0x30, 0x01, 0x80, 0x80, 0x08, 0x06, 0x00, 0xC0, 0x30, + 0x06, 0x00, 0x80, 0x20, 0x06, 0x03, 0x00, 0x30, 0x10, 0x00, 0x80, 0x80, + 0x06, 0x0C, 0x00, 0x10, 0x40, 0x00, 0x86, 0x00, 0x06, 0x20, 0x00, 0x11, + 0x00, 0x00, 0xD8, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, + 0xFC, 0x0F, 0xE8, 0x00, 0x19, 0x00, 0x03, 0x10, 0x00, 0x62, 0x00, 0x08, + 0x41, 0x81, 0x08, 0x28, 0x21, 0x05, 0x04, 0x21, 0xA0, 0x84, 0x36, 0x30, + 0x84, 0x46, 0x08, 0x88, 0xC1, 0x31, 0x18, 0x24, 0x12, 0x04, 0x82, 0x40, + 0xB0, 0x48, 0x14, 0x09, 0x02, 0x80, 0xA0, 0x30, 0x1C, 0x06, 0x03, 0x80, + 0x7E, 0x0F, 0xC2, 0x00, 0x60, 0x60, 0x0C, 0x06, 0x03, 0x00, 0x60, 0xC0, + 0x0C, 0x10, 0x00, 0xC6, 0x00, 0x0D, 0x80, 0x00, 0xA0, 0x00, 0x1C, 0x00, + 0x03, 0x80, 0x00, 0xD8, 0x00, 0x11, 0x00, 0x06, 0x30, 0x01, 0x83, 0x00, + 0x60, 0x30, 0x08, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x06, 0x7F, 0x07, 0xF0, + 0xFC, 0x1F, 0x98, 0x03, 0x04, 0x01, 0x03, 0x01, 0x80, 0xC1, 0x80, 0x20, + 0x80, 0x18, 0xC0, 0x04, 0x40, 0x03, 0x60, 0x00, 0xE0, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x03, 0xFF, 0x80, 0xFF, 0xF4, 0x00, 0xA0, 0x09, + 0x00, 0x48, 0x04, 0x40, 0x40, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x01, + 0x00, 0x10, 0x00, 0x80, 0x08, 0x04, 0x80, 0x24, 0x01, 0x40, 0x0C, 0x00, + 0x60, 0x03, 0xFF, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, + 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0xF8, 0x80, 0x02, 0x00, 0x10, + 0x00, 0xC0, 0x02, 0x00, 0x18, 0x00, 0x40, 0x03, 0x00, 0x08, 0x00, 0x40, + 0x01, 0x00, 0x08, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x20, 0x00, 0x80, + 0x04, 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, + 0x08, 0x00, 0x40, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, + 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF8, 0x02, 0x00, 0x38, 0x03, 0x60, + 0x11, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x08, 0xFF, 0xFF, + 0xF8, 0xC1, 0x83, 0x06, 0x0C, 0x0F, 0xC0, 0x70, 0x30, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x0F, 0xF8, 0x30, 0x08, 0x40, 0x08, 0x80, + 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x38, 0x60, 0xE8, 0x3F, 0x8F, 0xF0, + 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, + 0x01, 0x0F, 0x80, 0x4C, 0x18, 0x14, 0x01, 0x06, 0x00, 0x21, 0x80, 0x08, + 0x40, 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x01, 0x18, + 0x00, 0x86, 0x00, 0x21, 0xC0, 0x10, 0x5C, 0x18, 0xF1, 0xF8, 0x00, 0x07, + 0xE4, 0x30, 0x78, 0x80, 0x32, 0x00, 0x24, 0x00, 0x50, 0x00, 0x20, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x00, 0xC3, + 0x07, 0x01, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, + 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x7C, 0x20, 0x60, 0xC8, 0x20, 0x0A, + 0x10, 0x01, 0x84, 0x00, 0x62, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, + 0x00, 0x22, 0x00, 0x08, 0xC0, 0x06, 0x10, 0x01, 0x82, 0x00, 0xE0, 0x60, + 0xE8, 0x0F, 0xE3, 0xC0, 0x07, 0xE0, 0x1C, 0x18, 0x30, 0x0C, 0x60, 0x06, + 0x40, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0xC0, 0x00, + 0x40, 0x00, 0x60, 0x00, 0x30, 0x03, 0x0C, 0x0E, 0x03, 0xF0, 0x03, 0xFC, + 0x18, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x0F, 0xFF, 0x82, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0xFF, 0xF0, 0x0F, + 0xC7, 0x9C, 0x3A, 0x18, 0x07, 0x08, 0x01, 0x8C, 0x00, 0xC4, 0x00, 0x22, + 0x00, 0x11, 0x00, 0x08, 0x80, 0x04, 0x40, 0x02, 0x10, 0x03, 0x08, 0x01, + 0x82, 0x01, 0x40, 0xC3, 0x20, 0x3F, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0xF0, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x47, + 0xC0, 0x2C, 0x18, 0x1C, 0x04, 0x0C, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, + 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, + 0x04, 0x00, 0x82, 0x00, 0x47, 0xC0, 0xF8, 0x06, 0x00, 0x18, 0x00, 0x60, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, + 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x03, 0xFF, 0xF0, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, + 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x08, 0x06, 0xFE, 0x00, 0xF0, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xFE, 0x10, 0x30, 0x10, 0xE0, 0x11, 0xC0, 0x13, 0x00, 0x16, 0x00, 0x1E, + 0x00, 0x1B, 0x00, 0x11, 0x80, 0x10, 0xC0, 0x10, 0x60, 0x10, 0x30, 0x10, + 0x18, 0x10, 0x1C, 0xF0, 0x3F, 0x7E, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x80, 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x02, 0x00, 0x08, + 0x00, 0x20, 0x00, 0x80, 0xFF, 0xFC, 0xEF, 0x9E, 0x07, 0x1E, 0x20, 0xC1, + 0x82, 0x10, 0x20, 0x42, 0x04, 0x08, 0x40, 0x81, 0x08, 0x10, 0x21, 0x02, + 0x04, 0x20, 0x40, 0x84, 0x08, 0x10, 0x81, 0x02, 0x10, 0x20, 0x42, 0x04, + 0x08, 0x40, 0x81, 0x3E, 0x1C, 0x38, 0x71, 0xF0, 0x0B, 0x06, 0x07, 0x01, + 0x03, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, 0x20, 0x04, 0x10, + 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x13, + 0xF0, 0x3E, 0x07, 0xC0, 0x30, 0x60, 0x80, 0x22, 0x00, 0x24, 0x00, 0x50, + 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x05, 0x00, 0x12, 0x00, + 0x22, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0xF1, 0xFC, 0x05, 0xC1, 0x81, + 0xC0, 0x10, 0x60, 0x02, 0x18, 0x00, 0xC4, 0x00, 0x11, 0x00, 0x04, 0x40, + 0x01, 0x10, 0x00, 0x44, 0x00, 0x11, 0x80, 0x08, 0x60, 0x02, 0x14, 0x01, + 0x04, 0xC1, 0x81, 0x0F, 0x80, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, + 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xE3, 0xC6, + 0x0E, 0x86, 0x00, 0xE1, 0x00, 0x18, 0xC0, 0x06, 0x20, 0x00, 0x88, 0x00, + 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x84, 0x00, 0x61, 0x00, 0x18, + 0x20, 0x0A, 0x06, 0x0C, 0x80, 0x7C, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, + 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0F, 0xF0, 0xF8, + 0x7C, 0x11, 0x8C, 0x2C, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, + 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xD1, 0x83, 0x98, 0x04, 0x80, 0x24, 0x00, + 0x30, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x00, 0x1C, + 0x01, 0xF0, 0x1A, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0xFF, 0xFC, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x08, 0x01, 0x06, 0x0F, 0x03, 0xF8, 0xF0, 0x3E, 0x08, + 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, 0x20, 0x80, 0x10, 0x40, 0x08, + 0x20, 0x04, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, 0x00, 0x41, 0x00, + 0xE0, 0x41, 0xD0, 0x1F, 0x8E, 0xFE, 0x0F, 0xE2, 0x00, 0x20, 0x60, 0x0C, + 0x0C, 0x01, 0x80, 0x80, 0x20, 0x18, 0x0C, 0x01, 0x01, 0x00, 0x30, 0x60, + 0x02, 0x08, 0x00, 0x41, 0x00, 0x0C, 0x60, 0x00, 0x88, 0x00, 0x19, 0x00, + 0x01, 0x40, 0x00, 0x38, 0x00, 0xFC, 0x07, 0xE4, 0x00, 0x10, 0x80, 0x02, + 0x18, 0x20, 0xC3, 0x0E, 0x18, 0x21, 0x42, 0x04, 0x28, 0x40, 0x8D, 0x88, + 0x19, 0x93, 0x03, 0x22, 0x60, 0x2C, 0x68, 0x05, 0x85, 0x00, 0xA0, 0xA0, + 0x1C, 0x1C, 0x01, 0x81, 0x80, 0x7C, 0x1F, 0x18, 0x03, 0x06, 0x03, 0x01, + 0x83, 0x00, 0x63, 0x00, 0x1B, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x60, + 0x03, 0x18, 0x03, 0x06, 0x03, 0x01, 0x83, 0x00, 0x61, 0x00, 0x33, 0xF0, + 0x7E, 0xFC, 0x1F, 0x90, 0x01, 0x8C, 0x00, 0x86, 0x00, 0xC1, 0x80, 0x40, + 0xC0, 0x60, 0x20, 0x20, 0x18, 0x30, 0x04, 0x10, 0x03, 0x08, 0x00, 0x8C, + 0x00, 0x64, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, + 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x07, 0xFE, 0x00, + 0xFF, 0xF4, 0x01, 0x20, 0x09, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, + 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x14, 0x00, 0xA0, 0x07, 0xFF, + 0xE0, 0x07, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x30, 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x0C, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x0C, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0xE0, 0x1C, 0x00, 0x44, 0x0D, 0x84, + 0x36, 0x04, 0x40, 0x07, 0x00 }; + +const GFXglyph FreeMono18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 21, 0, 1 }, // 0x20 ' ' + { 0, 4, 22, 21, 8, -21 }, // 0x21 '!' + { 11, 11, 10, 21, 5, -20 }, // 0x22 '"' + { 25, 14, 24, 21, 3, -21 }, // 0x23 '#' + { 67, 13, 26, 21, 4, -22 }, // 0x24 '$' + { 110, 15, 21, 21, 3, -20 }, // 0x25 '%' + { 150, 12, 18, 21, 4, -17 }, // 0x26 '&' + { 177, 4, 10, 21, 8, -20 }, // 0x27 ''' + { 182, 5, 25, 21, 10, -20 }, // 0x28 '(' + { 198, 5, 25, 21, 6, -20 }, // 0x29 ')' + { 214, 13, 12, 21, 4, -20 }, // 0x2A '*' + { 234, 15, 17, 21, 3, -17 }, // 0x2B '+' + { 266, 7, 10, 21, 5, -4 }, // 0x2C ',' + { 275, 15, 1, 21, 3, -9 }, // 0x2D '-' + { 277, 5, 5, 21, 8, -4 }, // 0x2E '.' + { 281, 13, 26, 21, 4, -22 }, // 0x2F '/' + { 324, 13, 21, 21, 4, -20 }, // 0x30 '0' + { 359, 13, 21, 21, 4, -20 }, // 0x31 '1' + { 394, 13, 21, 21, 3, -20 }, // 0x32 '2' + { 429, 14, 21, 21, 3, -20 }, // 0x33 '3' + { 466, 12, 21, 21, 4, -20 }, // 0x34 '4' + { 498, 14, 21, 21, 3, -20 }, // 0x35 '5' + { 535, 12, 21, 21, 5, -20 }, // 0x36 '6' + { 567, 12, 21, 21, 4, -20 }, // 0x37 '7' + { 599, 13, 21, 21, 4, -20 }, // 0x38 '8' + { 634, 12, 21, 21, 5, -20 }, // 0x39 '9' + { 666, 5, 15, 21, 8, -14 }, // 0x3A ':' + { 676, 7, 20, 21, 5, -14 }, // 0x3B ';' + { 694, 15, 16, 21, 3, -17 }, // 0x3C '<' + { 724, 17, 6, 21, 2, -12 }, // 0x3D '=' + { 737, 15, 16, 21, 3, -17 }, // 0x3E '>' + { 767, 12, 20, 21, 5, -19 }, // 0x3F '?' + { 797, 13, 23, 21, 4, -20 }, // 0x40 '@' + { 835, 21, 20, 21, 0, -19 }, // 0x41 'A' + { 888, 18, 20, 21, 1, -19 }, // 0x42 'B' + { 933, 17, 20, 21, 2, -19 }, // 0x43 'C' + { 976, 16, 20, 21, 2, -19 }, // 0x44 'D' + { 1016, 17, 20, 21, 1, -19 }, // 0x45 'E' + { 1059, 17, 20, 21, 1, -19 }, // 0x46 'F' + { 1102, 17, 20, 21, 2, -19 }, // 0x47 'G' + { 1145, 16, 20, 21, 2, -19 }, // 0x48 'H' + { 1185, 13, 20, 21, 4, -19 }, // 0x49 'I' + { 1218, 17, 20, 21, 3, -19 }, // 0x4A 'J' + { 1261, 18, 20, 21, 1, -19 }, // 0x4B 'K' + { 1306, 15, 20, 21, 3, -19 }, // 0x4C 'L' + { 1344, 19, 20, 21, 1, -19 }, // 0x4D 'M' + { 1392, 18, 20, 21, 1, -19 }, // 0x4E 'N' + { 1437, 17, 20, 21, 2, -19 }, // 0x4F 'O' + { 1480, 16, 20, 21, 1, -19 }, // 0x50 'P' + { 1520, 17, 24, 21, 2, -19 }, // 0x51 'Q' + { 1571, 19, 20, 21, 1, -19 }, // 0x52 'R' + { 1619, 14, 20, 21, 3, -19 }, // 0x53 'S' + { 1654, 15, 20, 21, 3, -19 }, // 0x54 'T' + { 1692, 17, 20, 21, 2, -19 }, // 0x55 'U' + { 1735, 21, 20, 21, 0, -19 }, // 0x56 'V' + { 1788, 19, 20, 21, 1, -19 }, // 0x57 'W' + { 1836, 19, 20, 21, 1, -19 }, // 0x58 'X' + { 1884, 17, 20, 21, 2, -19 }, // 0x59 'Y' + { 1927, 13, 20, 21, 4, -19 }, // 0x5A 'Z' + { 1960, 5, 25, 21, 10, -20 }, // 0x5B '[' + { 1976, 13, 26, 21, 4, -22 }, // 0x5C '\' + { 2019, 5, 25, 21, 6, -20 }, // 0x5D ']' + { 2035, 13, 9, 21, 4, -20 }, // 0x5E '^' + { 2050, 21, 1, 21, 0, 4 }, // 0x5F '_' + { 2053, 6, 5, 21, 5, -21 }, // 0x60 '`' + { 2057, 16, 15, 21, 3, -14 }, // 0x61 'a' + { 2087, 18, 21, 21, 1, -20 }, // 0x62 'b' + { 2135, 15, 15, 21, 3, -14 }, // 0x63 'c' + { 2164, 18, 21, 21, 2, -20 }, // 0x64 'd' + { 2212, 16, 15, 21, 2, -14 }, // 0x65 'e' + { 2242, 14, 21, 21, 4, -20 }, // 0x66 'f' + { 2279, 17, 22, 21, 2, -14 }, // 0x67 'g' + { 2326, 17, 21, 21, 1, -20 }, // 0x68 'h' + { 2371, 14, 22, 21, 4, -21 }, // 0x69 'i' + { 2410, 10, 29, 21, 5, -21 }, // 0x6A 'j' + { 2447, 16, 21, 21, 2, -20 }, // 0x6B 'k' + { 2489, 14, 21, 21, 4, -20 }, // 0x6C 'l' + { 2526, 19, 15, 21, 1, -14 }, // 0x6D 'm' + { 2562, 17, 15, 21, 1, -14 }, // 0x6E 'n' + { 2594, 15, 15, 21, 3, -14 }, // 0x6F 'o' + { 2623, 18, 22, 21, 1, -14 }, // 0x70 'p' + { 2673, 18, 22, 21, 2, -14 }, // 0x71 'q' + { 2723, 15, 15, 21, 3, -14 }, // 0x72 'r' + { 2752, 13, 15, 21, 4, -14 }, // 0x73 's' + { 2777, 16, 20, 21, 1, -19 }, // 0x74 't' + { 2817, 17, 15, 21, 1, -14 }, // 0x75 'u' + { 2849, 19, 15, 21, 1, -14 }, // 0x76 'v' + { 2885, 19, 15, 21, 1, -14 }, // 0x77 'w' + { 2921, 17, 15, 21, 2, -14 }, // 0x78 'x' + { 2953, 17, 22, 21, 2, -14 }, // 0x79 'y' + { 3000, 13, 15, 21, 4, -14 }, // 0x7A 'z' + { 3025, 8, 25, 21, 6, -20 }, // 0x7B '{' + { 3050, 1, 25, 21, 10, -20 }, // 0x7C '|' + { 3054, 8, 25, 21, 7, -20 }, // 0x7D '}' + { 3079, 15, 5, 21, 3, -11 } }; // 0x7E '~' + +const GFXfont FreeMono18pt7b PROGMEM = { + (uint8_t *)FreeMono18pt7bBitmaps, + (GFXglyph *)FreeMono18pt7bGlyphs, + 0x20, 0x7E, 35 }; + +// Approx. 3761 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono24pt7b.h new file mode 100644 index 0000000..4c8bd15 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono24pt7b.h @@ -0,0 +1,577 @@ +const uint8_t FreeMono24pt7bBitmaps[] PROGMEM = { + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x10, 0x84, 0x21, 0x08, + 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0xFE, 0x7F, 0x7C, 0x3E, 0x7C, + 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, 0x3C, + 0x3E, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x01, + 0x86, 0x00, 0x30, 0xC0, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, 0x60, 0x03, + 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x70, 0x01, 0x8C, 0x00, 0x61, 0x80, 0x0C, + 0x30, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0x06, 0x18, 0x00, 0xC3, 0x00, 0x18, + 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x7F, 0xFF, 0xEF, 0xFF, + 0xFC, 0x06, 0x18, 0x00, 0xC7, 0x00, 0x38, 0xC0, 0x06, 0x18, 0x00, 0xC3, + 0x00, 0x18, 0x60, 0x03, 0x0C, 0x00, 0x61, 0x80, 0x0C, 0x30, 0x01, 0x86, + 0x00, 0x30, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0F, 0xC0, + 0x0F, 0xFD, 0x87, 0x03, 0xE3, 0x80, 0x39, 0xC0, 0x06, 0x60, 0x01, 0x98, + 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, + 0x80, 0x03, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, + 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x80, 0x0E, 0xFC, 0x0F, 0x37, + 0xFF, 0x80, 0x7F, 0x80, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x80, 0x01, 0xFE, 0x00, 0x38, + 0x70, 0x03, 0x03, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, + 0x01, 0x80, 0x30, 0x30, 0x03, 0x87, 0x00, 0x1F, 0xE0, 0x30, 0x78, 0x1F, + 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00, + 0x0C, 0x01, 0xE0, 0x00, 0x7F, 0x80, 0x0E, 0x1C, 0x00, 0xC0, 0xC0, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x0C, 0x0E, 0x00, + 0xE1, 0xC0, 0x07, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xEC, 0x01, 0xFF, 0x00, + 0xE1, 0x00, 0x70, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x3B, 0x83, + 0xD8, 0x60, 0xFE, 0x0C, 0x33, 0x03, 0x98, 0xC0, 0x66, 0x30, 0x0D, 0x8C, + 0x03, 0xC3, 0x00, 0x70, 0x60, 0x1C, 0x1C, 0x0F, 0x03, 0x87, 0x7C, 0x7F, + 0x9F, 0x07, 0x80, 0x00, 0xFE, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x3C, + 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x06, 0x1C, 0x30, 0xE1, 0x87, 0x0E, 0x18, + 0x70, 0xE1, 0xC3, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x0C, + 0x1C, 0x38, 0x70, 0x60, 0xE1, 0xC1, 0x83, 0x83, 0x06, 0x06, 0x04, 0xC1, + 0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE0, 0xE1, 0xC3, + 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x87, 0x0E, 0x1C, 0x30, 0x61, 0xC3, + 0x0E, 0x18, 0x70, 0xC1, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x03, 0x00, 0x00, 0xC0, 0x10, 0x30, 0x3F, 0x8C, 0x7C, 0xFF, 0xFC, 0x07, + 0xF8, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0C, 0xC0, 0x06, 0x18, 0x03, 0x87, + 0x00, 0xC0, 0xC0, 0x60, 0x18, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, + 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, + 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, + 0x1F, 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, + 0x1C, 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF0, 0x7D, 0xFF, + 0xFF, 0xFF, 0xEF, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, + 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x0E, 0x00, + 0x03, 0x00, 0x01, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x0C, 0x00, 0x07, + 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x03, + 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xE0, 0x18, 0x30, 0x03, 0x1C, 0x00, + 0xE6, 0x00, 0x19, 0x80, 0x06, 0xE0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, + 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, + 0x76, 0x00, 0x19, 0x80, 0x06, 0x70, 0x03, 0x8C, 0x00, 0xC3, 0x80, 0x60, + 0x78, 0x78, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x07, 0x80, 0x0F, + 0x80, 0x1D, 0x80, 0x39, 0x80, 0x71, 0x80, 0xE1, 0x80, 0xC1, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xC0, 0xE0, + 0xC0, 0x1C, 0x60, 0x03, 0xB8, 0x00, 0x6C, 0x00, 0x0F, 0x00, 0x03, 0x00, + 0x00, 0xC0, 0x00, 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0xD0, 0x00, 0x38, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, + 0xF8, 0x01, 0xFF, 0xC0, 0x70, 0x3C, 0x18, 0x01, 0xC6, 0x00, 0x18, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xD8, 0x00, + 0x3B, 0x80, 0x0E, 0x3E, 0x07, 0x81, 0xFF, 0xE0, 0x07, 0xE0, 0x00, 0x00, + 0x3C, 0x00, 0x7C, 0x00, 0x6C, 0x00, 0xCC, 0x00, 0x8C, 0x01, 0x8C, 0x03, + 0x0C, 0x03, 0x0C, 0x06, 0x0C, 0x04, 0x0C, 0x0C, 0x0C, 0x08, 0x0C, 0x10, + 0x0C, 0x30, 0x0C, 0x20, 0x0C, 0x60, 0x0C, 0x40, 0x0C, 0x80, 0x0C, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, + 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x3F, 0xFF, 0x07, 0xFF, 0xE0, + 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, + 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC7, 0xE0, 0x1F, 0xFF, 0x03, + 0x80, 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60, + 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x06, 0xC0, 0x01, 0xDC, 0x00, 0x71, 0xF0, 0x3C, 0x0F, + 0xFF, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xF0, 0x3E, 0x00, 0x1E, + 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, + 0x18, 0x00, 0x06, 0x00, 0x03, 0x80, 0x00, 0xC1, 0xF8, 0x31, 0xFF, 0x0C, + 0xF0, 0xF3, 0x70, 0x0C, 0xD8, 0x01, 0xBC, 0x00, 0x6E, 0x00, 0x0F, 0x80, + 0x03, 0xC0, 0x00, 0xD8, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0x30, 0x01, + 0x8E, 0x00, 0x61, 0xC0, 0x30, 0x38, 0x38, 0x07, 0xFC, 0x00, 0x7C, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xC0, + 0x00, 0x60, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC0, 0xF1, 0xC0, 0x0E, + 0x60, 0x01, 0xB8, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x36, 0x00, 0x18, 0xC0, 0x0C, 0x1C, 0x0E, 0x03, 0xFF, 0x00, 0xFF, + 0xC0, 0x70, 0x38, 0x30, 0x03, 0x18, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0x60, 0x01, 0x98, + 0x00, 0xE3, 0x00, 0x70, 0x70, 0x38, 0x0F, 0xFC, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x03, 0xFE, 0x01, 0xC1, 0xC0, 0xC0, 0x38, 0x60, 0x07, 0x18, 0x00, + 0xCC, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x01, 0xB0, 0x00, 0x3C, 0x00, 0x1F, + 0x00, 0x07, 0x60, 0x03, 0xD8, 0x01, 0xB3, 0x00, 0xCC, 0xF0, 0xF3, 0x0F, + 0xF8, 0xC1, 0xF8, 0x30, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, + 0xE0, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80, + 0x07, 0xC0, 0xFF, 0xC0, 0x1F, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, + 0xF7, 0xC0, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF1, 0xF8, 0x7C, 0x3F, 0x0F, + 0x83, 0xE0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x38, 0x04, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, + 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x20, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x07, 0xF0, 0x1F, 0xFE, 0x3E, 0x07, 0x98, 0x00, 0xEC, 0x00, + 0x36, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0xC0, + 0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, + 0x78, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE0, 0xE0, 0xE0, 0x1C, 0x30, + 0x03, 0x1C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x06, 0xC0, 0x01, 0xB0, 0x07, + 0xEC, 0x07, 0xFB, 0x03, 0xC6, 0xC1, 0xC1, 0xB0, 0xE0, 0x6C, 0x30, 0x1B, + 0x0C, 0x06, 0xC3, 0x01, 0xB0, 0xC0, 0x6C, 0x18, 0x1B, 0x07, 0x86, 0xC0, + 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, + 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x80, 0xC0, 0xFF, 0xF0, + 0x0F, 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1B, 0x00, + 0x00, 0x01, 0x98, 0x00, 0x00, 0x11, 0x80, 0x00, 0x03, 0x0C, 0x00, 0x00, + 0x30, 0xC0, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, + 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00, + 0x18, 0x01, 0x80, 0x01, 0x80, 0x18, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, + 0xFC, 0x00, 0x20, 0x00, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, + 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x01, 0x80, + 0x00, 0x18, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x03, + 0xFF, 0xFF, 0x01, 0x80, 0x0E, 0x06, 0x00, 0x1C, 0x18, 0x00, 0x38, 0x60, + 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x38, 0x60, 0x01, + 0xC1, 0x80, 0x1E, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x60, 0x03, 0xC1, + 0x80, 0x03, 0x86, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x31, 0x80, + 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x61, 0x80, 0x03, + 0x86, 0x00, 0x1C, 0xFF, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0xFE, 0x60, 0xF0, 0x3D, 0x87, 0x00, 0x3E, 0x38, 0x00, 0x38, 0xC0, + 0x00, 0xE7, 0x00, 0x01, 0x98, 0x00, 0x06, 0x60, 0x00, 0x03, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, + 0xC7, 0x00, 0x06, 0x0E, 0x00, 0x70, 0x1E, 0x07, 0x80, 0x3F, 0xFC, 0x00, + 0x1F, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0x00, 0x3C, 0x0C, 0x00, + 0x38, 0x30, 0x00, 0x70, 0xC0, 0x00, 0xC3, 0x00, 0x03, 0x8C, 0x00, 0x06, + 0x30, 0x00, 0x1C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, + 0x00, 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x30, 0x00, + 0x0C, 0xC0, 0x00, 0x33, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x30, + 0xC0, 0x01, 0xC3, 0x00, 0x0E, 0x0C, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0xFF, + 0xF8, 0x00, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE1, 0x80, 0x01, 0x86, 0x00, + 0x06, 0x18, 0x00, 0x18, 0x60, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, + 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x80, 0x00, 0xC6, 0x00, + 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0xC6, 0x00, 0x00, + 0x18, 0x0C, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x60, 0x30, 0x01, 0x80, 0xC0, 0x06, 0x03, 0x00, 0x18, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xF0, 0x03, 0xFF, + 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x98, 0x1E, 0x03, 0xF0, 0x70, + 0x01, 0xE1, 0x80, 0x01, 0xC6, 0x00, 0x01, 0x9C, 0x00, 0x03, 0x30, 0x00, + 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x37, 0x00, 0x00, 0x66, + 0x00, 0x00, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x1E, + 0x00, 0x0C, 0x0F, 0x00, 0xF8, 0x0F, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x7F, + 0x01, 0xFC, 0xFE, 0x03, 0xF8, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, + 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, + 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, + 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFE, + 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, + 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x30, 0x60, 0x00, 0x60, 0xC0, 0x00, 0xC1, 0x80, 0x01, 0x83, 0x00, 0x03, + 0x06, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x38, 0x00, 0x60, + 0x38, 0x01, 0x80, 0x3C, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0xFF, 0x81, 0xFE, 0xFF, 0x81, 0xFE, 0x18, 0x00, 0x30, 0x18, 0x00, 0xE0, + 0x18, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x18, 0x07, 0x00, 0x18, 0x0E, 0x00, + 0x18, 0x18, 0x00, 0x18, 0x70, 0x00, 0x18, 0xE0, 0x00, 0x19, 0xE0, 0x00, + 0x1B, 0xF8, 0x00, 0x1F, 0x1C, 0x00, 0x1C, 0x06, 0x00, 0x18, 0x03, 0x00, + 0x18, 0x03, 0x80, 0x18, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x18, 0x00, 0xC0, + 0x18, 0x00, 0x60, 0x18, 0x00, 0x60, 0x18, 0x00, 0x70, 0x18, 0x00, 0x30, + 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x01, + 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, + 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, + 0x06, 0x00, 0x18, 0x30, 0x00, 0xC1, 0x80, 0x06, 0x0C, 0x00, 0x30, 0x60, + 0x01, 0x83, 0x00, 0x0C, 0x18, 0x00, 0x60, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xF3, 0x60, 0x01, + 0xB0, 0xD8, 0x00, 0x6C, 0x33, 0x00, 0x33, 0x0C, 0xC0, 0x0C, 0xC3, 0x38, + 0x07, 0x30, 0xC6, 0x01, 0x8C, 0x31, 0xC0, 0xE3, 0x0C, 0x30, 0x30, 0xC3, + 0x0C, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x0C, 0xC0, + 0xC3, 0x03, 0x30, 0x30, 0xC0, 0x78, 0x0C, 0x30, 0x1E, 0x03, 0x0C, 0x03, + 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x03, 0x0C, + 0x00, 0x00, 0xC3, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x0C, 0xFF, 0x00, 0x3F, + 0xFF, 0xC0, 0x0F, 0xF0, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0x1E, 0x00, + 0x0C, 0x1F, 0x00, 0x0C, 0x1B, 0x00, 0x0C, 0x19, 0x80, 0x0C, 0x19, 0xC0, + 0x0C, 0x18, 0xC0, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x60, 0x0C, 0x18, 0x30, + 0x0C, 0x18, 0x38, 0x0C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x0C, 0x18, 0x0E, + 0x0C, 0x18, 0x06, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x03, 0x0C, 0x18, 0x01, + 0x8C, 0x18, 0x01, 0xCC, 0x18, 0x00, 0xCC, 0x18, 0x00, 0x6C, 0x18, 0x00, + 0x7C, 0x18, 0x00, 0x3C, 0x7F, 0x80, 0x1C, 0x7F, 0x80, 0x1C, 0x00, 0x7E, + 0x00, 0x01, 0xFF, 0xC0, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, + 0x38, 0x38, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, + 0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, + 0x0E, 0x30, 0x00, 0x0C, 0x38, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00, + 0x70, 0x07, 0x81, 0xE0, 0x03, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0xFF, 0xFF, + 0x07, 0xFF, 0xFE, 0x06, 0x00, 0x78, 0x30, 0x00, 0xE1, 0x80, 0x03, 0x0C, + 0x00, 0x0C, 0x60, 0x00, 0x63, 0x00, 0x03, 0x18, 0x00, 0x18, 0xC0, 0x01, + 0xC6, 0x00, 0x0C, 0x30, 0x00, 0xC1, 0x80, 0x1E, 0x0F, 0xFF, 0xC0, 0x7F, + 0xF8, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, + 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, + 0x00, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFF, + 0x80, 0x07, 0x81, 0xE0, 0x0E, 0x00, 0x70, 0x1C, 0x00, 0x38, 0x38, 0x00, + 0x1C, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x60, 0x00, 0x06, 0x60, 0x00, + 0x06, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x70, 0x00, 0x0E, 0x30, 0x00, + 0x0C, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x81, + 0xE0, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xFF, + 0x87, 0x07, 0xFF, 0xFE, 0x07, 0x00, 0xF8, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, + 0x80, 0x18, 0x03, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00, + 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, + 0x70, 0x18, 0x00, 0x60, 0x18, 0x01, 0xC0, 0x18, 0x07, 0x80, 0x1F, 0xFF, + 0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x18, 0x03, + 0x80, 0x18, 0x01, 0xC0, 0x18, 0x00, 0xE0, 0x18, 0x00, 0x60, 0x18, 0x00, + 0x30, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1F, 0xFF, 0x80, + 0x0F, 0x03, 0xF8, 0x00, 0xFF, 0xE6, 0x1E, 0x07, 0xE3, 0x80, 0x1E, 0x30, + 0x00, 0xE6, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x60, 0x00, 0x07, + 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x30, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, + 0x06, 0xF8, 0x01, 0xED, 0xE0, 0x7C, 0xCF, 0xFF, 0x00, 0x3F, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xF0, 0x0C, 0x03, 0xC0, 0x30, + 0x0F, 0x00, 0xC0, 0x3C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, + 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, + 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, + 0x03, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF, + 0x01, 0xFF, 0xFE, 0x03, 0xFC, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, + 0x01, 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, + 0x18, 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x00, 0x01, + 0x86, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x18, + 0x60, 0x00, 0x30, 0xC0, 0x00, 0x61, 0x80, 0x00, 0xC3, 0x80, 0x03, 0x83, + 0x00, 0x06, 0x07, 0x00, 0x1C, 0x07, 0x00, 0x70, 0x07, 0x83, 0xC0, 0x07, + 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xC0, 0x3F, 0xF7, 0xFC, 0x03, 0xFF, + 0x18, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x0C, 0x00, 0x03, 0x00, 0x60, + 0x00, 0x30, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0xC0, 0x03, 0x80, 0x0C, 0x00, 0x18, 0x01, 0x80, 0x01, + 0x80, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x0E, 0x03, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x06, 0x06, 0x00, 0x00, 0x30, 0xC0, 0x00, + 0x03, 0x0C, 0x00, 0x00, 0x30, 0x80, 0x00, 0x01, 0x98, 0x00, 0x00, 0x19, + 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0xFF, 0x80, 0x7F, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, 0x30, 0xC0, 0x00, + 0x0C, 0x30, 0x00, 0x03, 0x0C, 0x03, 0x80, 0xC3, 0x01, 0xE0, 0x30, 0x60, + 0x78, 0x0C, 0x18, 0x1F, 0x02, 0x06, 0x04, 0xC0, 0x81, 0x83, 0x30, 0x60, + 0x60, 0xCC, 0x18, 0x18, 0x31, 0x86, 0x06, 0x18, 0x61, 0x81, 0x86, 0x18, + 0x60, 0x71, 0x87, 0x18, 0x0C, 0x40, 0xC6, 0x03, 0x30, 0x31, 0x00, 0xCC, + 0x0C, 0xC0, 0x33, 0x01, 0xB0, 0x0D, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, + 0xD8, 0x06, 0xC0, 0x34, 0x00, 0xF0, 0x07, 0x00, 0x3C, 0x01, 0xC0, 0x0E, + 0x00, 0x7F, 0x00, 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, + 0x38, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x60, 0x03, 0x00, 0xC0, 0x01, 0x81, + 0x80, 0x01, 0xC3, 0x80, 0x00, 0xE7, 0x00, 0x00, 0x76, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x66, + 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x03, 0x81, 0xC0, 0x07, 0x00, + 0xE0, 0x06, 0x00, 0x60, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x18, 0x38, 0x00, + 0x1C, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x70, 0x06, 0x00, + 0x60, 0x03, 0x00, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC3, + 0x00, 0x00, 0xE7, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xFF, 0xE0, 0x07, 0xFF, + 0xE0, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, 0x19, 0x80, 0x0C, 0x60, 0x07, + 0x18, 0x03, 0x86, 0x00, 0xC1, 0x80, 0x70, 0x00, 0x38, 0x00, 0x0C, 0x00, + 0x07, 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C, + 0x00, 0x06, 0x00, 0x03, 0x80, 0x31, 0xC0, 0x0C, 0x60, 0x03, 0x30, 0x00, + 0xDC, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xFF, 0xFC, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, + 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60, + 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x00, 0x07, 0x00, + 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, + 0x0C, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, + 0x18, 0x30, 0x60, 0xC1, 0x83, 0xFF, 0xFC, 0x00, 0x40, 0x00, 0x30, 0x00, + 0x1E, 0x00, 0x0E, 0xC0, 0x07, 0x38, 0x01, 0x87, 0x00, 0xC0, 0xC0, 0x60, + 0x18, 0x38, 0x03, 0x1C, 0x00, 0xE6, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x3C, 0x0E, 0x07, 0x03, + 0x01, 0xFC, 0x00, 0x7F, 0xFC, 0x01, 0xC0, 0x3C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x60, 0x0F, 0xF9, 0x81, 0xFF, 0xFE, 0x0F, 0x80, 0x38, 0x70, 0x00, 0x63, + 0x80, 0x01, 0x8C, 0x00, 0x06, 0x30, 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00, + 0x07, 0x86, 0x00, 0x76, 0x1E, 0x07, 0x9F, 0x3F, 0xF8, 0x7C, 0x3F, 0x80, + 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, + 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x1F, 0x80, + 0x18, 0xFF, 0xC0, 0x33, 0x81, 0xC0, 0x6E, 0x01, 0xC0, 0xF0, 0x00, 0xC1, + 0xE0, 0x01, 0xC3, 0x80, 0x01, 0x87, 0x00, 0x03, 0x8C, 0x00, 0x03, 0x18, + 0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, + 0x00, 0x63, 0x80, 0x01, 0x87, 0x00, 0x03, 0x0F, 0x00, 0x0E, 0x1F, 0x00, + 0x38, 0x37, 0x00, 0xE3, 0xE7, 0x03, 0x87, 0xC7, 0xFE, 0x00, 0x03, 0xF0, + 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF9, 0x83, 0xC0, 0xFC, 0x38, 0x01, 0xE3, + 0x00, 0x07, 0x38, 0x00, 0x19, 0x80, 0x00, 0xDC, 0x00, 0x06, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, + 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, + 0xC7, 0x00, 0x1E, 0x1E, 0x03, 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x01, 0xF8, 0x18, 0x07, + 0xFE, 0x18, 0x0F, 0x07, 0x98, 0x1C, 0x01, 0xD8, 0x38, 0x00, 0xF8, 0x70, + 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0x60, 0x00, 0x38, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x38, + 0x00, 0xD8, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x9F, 0x07, 0xFE, 0x1F, 0x01, + 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xF8, 0x07, 0x80, 0xF0, 0x70, 0x01, + 0xC3, 0x00, 0x07, 0x30, 0x00, 0x19, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0x60, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, + 0x00, 0xC7, 0x00, 0x0E, 0x1E, 0x03, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0xC0, 0x3F, 0xFC, 0x0E, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, + 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x9F, 0xFF, 0xF0, + 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, + 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x03, 0xFF, 0xFC, 0x7F, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xFC, + 0x7C, 0x38, 0x1C, 0xF8, 0xE0, 0x0D, 0x83, 0x00, 0x0F, 0x0E, 0x00, 0x1E, + 0x18, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, + 0x00, 0x00, 0xC6, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18, + 0x00, 0x1C, 0x30, 0x00, 0x38, 0x30, 0x00, 0xF0, 0x70, 0x03, 0x60, 0x78, + 0x1C, 0xC0, 0x3F, 0xF1, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, + 0x80, 0x00, 0x0E, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xC0, 0x00, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x18, 0xFF, 0x80, + 0x37, 0x03, 0x80, 0x7C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, + 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, + 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, + 0x63, 0xFC, 0x07, 0xFF, 0xF8, 0x0F, 0xF0, 0x01, 0xC0, 0x00, 0x70, 0x00, + 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, + 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, + 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x1F, 0xE0, 0x60, 0x7F, 0x81, + 0x80, 0x60, 0x06, 0x07, 0x00, 0x18, 0x38, 0x00, 0x61, 0xC0, 0x01, 0x8E, + 0x00, 0x06, 0x70, 0x00, 0x1B, 0x80, 0x00, 0x7F, 0x00, 0x01, 0xCE, 0x00, + 0x06, 0x1C, 0x00, 0x18, 0x38, 0x00, 0x60, 0x70, 0x01, 0x80, 0xE0, 0x06, + 0x01, 0xC0, 0x18, 0x03, 0x80, 0x60, 0x07, 0x0F, 0x80, 0x7F, 0xFE, 0x01, + 0xFF, 0x3F, 0xC0, 0x0F, 0xF0, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, + 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x3C, 0x0F, 0x9F, 0x87, 0xE0, 0xFB, + 0x1C, 0xC7, 0x01, 0xE0, 0xD8, 0x38, 0x1C, 0x07, 0x01, 0x81, 0x80, 0x60, + 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, + 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, + 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, + 0x18, 0x06, 0x01, 0x81, 0x80, 0x60, 0x18, 0x18, 0x06, 0x01, 0x8F, 0xE0, + 0x7C, 0x1F, 0xFE, 0x07, 0xC1, 0xF0, 0x00, 0x1F, 0x00, 0xF8, 0xFF, 0x81, + 0xF3, 0x83, 0x80, 0x6C, 0x03, 0x80, 0xF0, 0x03, 0x81, 0xC0, 0x03, 0x03, + 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, + 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, 0x03, 0x00, + 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x30, 0x30, 0x00, + 0x67, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFE, + 0x00, 0xF0, 0x3C, 0x07, 0x00, 0x38, 0x38, 0x00, 0x71, 0xC0, 0x00, 0xE6, + 0x00, 0x01, 0x98, 0x00, 0x06, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x36, 0x00, 0x01, + 0x98, 0x00, 0x06, 0x70, 0x00, 0x38, 0xE0, 0x01, 0xC1, 0xC0, 0x0E, 0x03, + 0xC0, 0xF0, 0x07, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x01, 0xF1, + 0xFF, 0x83, 0xE7, 0x03, 0x80, 0xD8, 0x01, 0x81, 0xE0, 0x01, 0x83, 0xC0, + 0x03, 0x87, 0x00, 0x03, 0x0E, 0x00, 0x07, 0x18, 0x00, 0x06, 0x30, 0x00, + 0x0C, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x63, 0x00, 0x00, + 0xC7, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x36, 0x00, 0x70, + 0x67, 0x03, 0xC0, 0xC7, 0xFE, 0x01, 0x83, 0xF0, 0x03, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x01, + 0xF8, 0x00, 0x07, 0xFF, 0x1F, 0x0F, 0x07, 0x9F, 0x1C, 0x01, 0xD8, 0x38, + 0x00, 0x78, 0x70, 0x00, 0x78, 0x60, 0x00, 0x38, 0xE0, 0x00, 0x38, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, 0x00, 0x18, 0xC0, + 0x00, 0x18, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x38, 0x70, 0x00, 0x78, 0x30, + 0x00, 0x78, 0x1C, 0x01, 0xD8, 0x0F, 0x07, 0x98, 0x07, 0xFF, 0x18, 0x01, + 0xFC, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, + 0x03, 0xFF, 0x00, 0x03, 0xFF, 0x7E, 0x03, 0xC3, 0xF0, 0x7F, 0x81, 0x8F, + 0x0E, 0x0C, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, + 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, + 0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x00, 0x07, 0xF0, + 0x07, 0xFF, 0x63, 0xC0, 0xF9, 0xC0, 0x0E, 0x60, 0x01, 0x98, 0x00, 0x66, + 0x00, 0x19, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0xC0, 0x00, + 0x7C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, + 0xF8, 0x00, 0x7F, 0x00, 0x3B, 0xF0, 0x3C, 0xDF, 0xFE, 0x00, 0xFE, 0x00, + 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, + 0x00, 0x06, 0x00, 0x03, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x0C, 0x00, 0x00, + 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, + 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, + 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x07, 0x07, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x3F, 0x80, 0xF8, + 0x03, 0xF1, 0xF0, 0x07, 0xE0, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, + 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x18, 0x00, + 0x30, 0x30, 0x00, 0x60, 0x60, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, + 0x03, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x18, 0x00, 0xF0, + 0x18, 0x03, 0x60, 0x38, 0x3C, 0xF8, 0x3F, 0xF1, 0xF0, 0x1F, 0x00, 0x00, + 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF0, 0xC0, 0x00, 0xC0, 0x30, 0x00, + 0x30, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0xC0, 0x03, 0x80, 0x30, 0x00, 0x60, 0x18, 0x00, 0x18, 0x06, 0x00, + 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x06, 0x18, + 0x00, 0x00, 0xC6, 0x00, 0x00, 0x33, 0x00, 0x00, 0x0E, 0xC0, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x00, 0x3F, 0xDF, 0xC0, 0x0F, 0xF1, + 0x80, 0x00, 0x20, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x03, 0x01, + 0x80, 0x81, 0xE0, 0x60, 0x30, 0x78, 0x10, 0x0C, 0x1E, 0x0C, 0x03, 0x0C, + 0xC3, 0x00, 0xC3, 0x30, 0xC0, 0x10, 0xCC, 0x30, 0x06, 0x61, 0x98, 0x01, + 0x98, 0x66, 0x00, 0x66, 0x19, 0x80, 0x0B, 0x03, 0x60, 0x03, 0xC0, 0xD0, + 0x00, 0xF0, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x0E, 0x01, 0xC0, 0x3F, 0x81, + 0xFE, 0x3F, 0x81, 0xFE, 0x0C, 0x00, 0x38, 0x06, 0x00, 0x70, 0x03, 0x00, + 0xE0, 0x01, 0x81, 0xC0, 0x00, 0xC3, 0x80, 0x00, 0x67, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x00, 0xC3, + 0x80, 0x01, 0x81, 0xC0, 0x03, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x0C, 0x00, + 0x38, 0x18, 0x00, 0x1C, 0x7F, 0x81, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00, + 0xFF, 0x7F, 0x00, 0xFF, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, + 0x18, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x60, 0x03, 0x00, + 0x60, 0x03, 0x00, 0xC0, 0x01, 0x80, 0xC0, 0x01, 0x81, 0x80, 0x00, 0xC1, + 0x80, 0x00, 0xC3, 0x00, 0x00, 0x63, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, + 0x00, 0x00, 0x34, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFC, + 0x00, 0xFF, 0xFF, 0x7F, 0xFF, 0xB0, 0x01, 0x98, 0x01, 0xCC, 0x01, 0xC0, + 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE0, + 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0x70, + 0x01, 0xB0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xE0, 0x7C, 0x0C, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, + 0x00, 0x60, 0x0C, 0x03, 0x00, 0xE0, 0xF0, 0x1E, 0x00, 0x70, 0x06, 0x00, + 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0x0C, 0x01, 0x80, 0x18, 0x03, 0xE0, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x1F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x01, + 0x80, 0x38, 0x01, 0xE0, 0x3C, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, + 0xF8, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xFC, 0x03, 0x70, 0xE0, 0x76, 0x07, + 0x8E, 0xC0, 0x1F, 0xC0, 0x00, 0xF0 }; + +const GFXglyph FreeMono24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 28, 0, 1 }, // 0x20 ' ' + { 0, 5, 30, 28, 11, -28 }, // 0x21 '!' + { 19, 16, 14, 28, 6, -28 }, // 0x22 '"' + { 47, 19, 32, 28, 4, -29 }, // 0x23 '#' + { 123, 18, 33, 28, 5, -29 }, // 0x24 '$' + { 198, 20, 29, 28, 4, -27 }, // 0x25 '%' + { 271, 18, 25, 28, 5, -23 }, // 0x26 '&' + { 328, 7, 14, 28, 11, -28 }, // 0x27 ''' + { 341, 7, 34, 28, 14, -27 }, // 0x28 '(' + { 371, 7, 34, 28, 8, -27 }, // 0x29 ')' + { 401, 18, 16, 28, 5, -27 }, // 0x2A '*' + { 437, 20, 22, 28, 4, -23 }, // 0x2B '+' + { 492, 9, 14, 28, 6, -6 }, // 0x2C ',' + { 508, 22, 2, 28, 3, -13 }, // 0x2D '-' + { 514, 7, 6, 28, 11, -4 }, // 0x2E '.' + { 520, 18, 35, 28, 5, -30 }, // 0x2F '/' + { 599, 18, 30, 28, 5, -28 }, // 0x30 '0' + { 667, 16, 29, 28, 6, -28 }, // 0x31 '1' + { 725, 18, 29, 28, 5, -28 }, // 0x32 '2' + { 791, 19, 30, 28, 5, -28 }, // 0x33 '3' + { 863, 16, 28, 28, 6, -27 }, // 0x34 '4' + { 919, 19, 29, 28, 5, -27 }, // 0x35 '5' + { 988, 18, 30, 28, 6, -28 }, // 0x36 '6' + { 1056, 18, 28, 28, 5, -27 }, // 0x37 '7' + { 1119, 18, 30, 28, 5, -28 }, // 0x38 '8' + { 1187, 18, 30, 28, 6, -28 }, // 0x39 '9' + { 1255, 7, 21, 28, 11, -19 }, // 0x3A ':' + { 1274, 10, 27, 28, 7, -19 }, // 0x3B ';' + { 1308, 22, 22, 28, 3, -23 }, // 0x3C '<' + { 1369, 24, 9, 28, 2, -17 }, // 0x3D '=' + { 1396, 21, 22, 28, 4, -23 }, // 0x3E '>' + { 1454, 17, 28, 28, 6, -26 }, // 0x3F '?' + { 1514, 18, 32, 28, 5, -28 }, // 0x40 '@' + { 1586, 28, 26, 28, 0, -25 }, // 0x41 'A' + { 1677, 22, 26, 28, 3, -25 }, // 0x42 'B' + { 1749, 22, 28, 28, 3, -26 }, // 0x43 'C' + { 1826, 22, 26, 28, 3, -25 }, // 0x44 'D' + { 1898, 22, 26, 28, 3, -25 }, // 0x45 'E' + { 1970, 22, 26, 28, 3, -25 }, // 0x46 'F' + { 2042, 23, 28, 28, 3, -26 }, // 0x47 'G' + { 2123, 23, 26, 28, 3, -25 }, // 0x48 'H' + { 2198, 16, 26, 28, 6, -25 }, // 0x49 'I' + { 2250, 23, 27, 28, 4, -25 }, // 0x4A 'J' + { 2328, 24, 26, 28, 3, -25 }, // 0x4B 'K' + { 2406, 21, 26, 28, 4, -25 }, // 0x4C 'L' + { 2475, 26, 26, 28, 1, -25 }, // 0x4D 'M' + { 2560, 24, 26, 28, 2, -25 }, // 0x4E 'N' + { 2638, 24, 28, 28, 2, -26 }, // 0x4F 'O' + { 2722, 21, 26, 28, 3, -25 }, // 0x50 'P' + { 2791, 24, 32, 28, 2, -26 }, // 0x51 'Q' + { 2887, 24, 26, 28, 3, -25 }, // 0x52 'R' + { 2965, 20, 28, 28, 4, -26 }, // 0x53 'S' + { 3035, 22, 26, 28, 3, -25 }, // 0x54 'T' + { 3107, 23, 27, 28, 3, -25 }, // 0x55 'U' + { 3185, 28, 26, 28, 0, -25 }, // 0x56 'V' + { 3276, 26, 26, 28, 1, -25 }, // 0x57 'W' + { 3361, 24, 26, 28, 2, -25 }, // 0x58 'X' + { 3439, 24, 26, 28, 2, -25 }, // 0x59 'Y' + { 3517, 18, 26, 28, 5, -25 }, // 0x5A 'Z' + { 3576, 7, 34, 28, 13, -27 }, // 0x5B '[' + { 3606, 18, 35, 28, 5, -30 }, // 0x5C '\' + { 3685, 7, 34, 28, 8, -27 }, // 0x5D ']' + { 3715, 18, 12, 28, 5, -28 }, // 0x5E '^' + { 3742, 28, 2, 28, 0, 5 }, // 0x5F '_' + { 3749, 8, 7, 28, 7, -29 }, // 0x60 '`' + { 3756, 22, 22, 28, 3, -20 }, // 0x61 'a' + { 3817, 23, 29, 28, 2, -27 }, // 0x62 'b' + { 3901, 21, 22, 28, 4, -20 }, // 0x63 'c' + { 3959, 24, 29, 28, 3, -27 }, // 0x64 'd' + { 4046, 21, 22, 28, 3, -20 }, // 0x65 'e' + { 4104, 19, 28, 28, 6, -27 }, // 0x66 'f' + { 4171, 23, 30, 28, 3, -20 }, // 0x67 'g' + { 4258, 23, 28, 28, 3, -27 }, // 0x68 'h' + { 4339, 18, 29, 28, 5, -28 }, // 0x69 'i' + { 4405, 14, 38, 28, 6, -28 }, // 0x6A 'j' + { 4472, 22, 28, 28, 4, -27 }, // 0x6B 'k' + { 4549, 18, 28, 28, 5, -27 }, // 0x6C 'l' + { 4612, 28, 21, 28, 0, -20 }, // 0x6D 'm' + { 4686, 23, 21, 28, 2, -20 }, // 0x6E 'n' + { 4747, 22, 22, 28, 3, -20 }, // 0x6F 'o' + { 4808, 23, 30, 28, 2, -20 }, // 0x70 'p' + { 4895, 24, 30, 28, 3, -20 }, // 0x71 'q' + { 4985, 21, 20, 28, 5, -19 }, // 0x72 'r' + { 5038, 18, 22, 28, 5, -20 }, // 0x73 's' + { 5088, 21, 27, 28, 3, -25 }, // 0x74 't' + { 5159, 23, 21, 28, 3, -19 }, // 0x75 'u' + { 5220, 26, 20, 28, 1, -19 }, // 0x76 'v' + { 5285, 26, 20, 28, 1, -19 }, // 0x77 'w' + { 5350, 24, 20, 28, 2, -19 }, // 0x78 'x' + { 5410, 24, 29, 28, 2, -19 }, // 0x79 'y' + { 5497, 17, 20, 28, 6, -19 }, // 0x7A 'z' + { 5540, 11, 34, 28, 8, -27 }, // 0x7B '{' + { 5587, 2, 34, 28, 13, -27 }, // 0x7C '|' + { 5596, 11, 34, 28, 9, -27 }, // 0x7D '}' + { 5643, 20, 6, 28, 4, -15 } }; // 0x7E '~' + +const GFXfont FreeMono24pt7b PROGMEM = { + (uint8_t *)FreeMono24pt7bBitmaps, + (GFXglyph *)FreeMono24pt7bGlyphs, + 0x20, 0x7E, 47 }; + +// Approx. 6330 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono9pt7b.h new file mode 100644 index 0000000..c82d786 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMono9pt7b.h @@ -0,0 +1,176 @@ +const uint8_t FreeMono9pt7bBitmaps[] PROGMEM = { + 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4, + 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E, + 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8, + 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8, + 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10, + 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, + 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04, + 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60, + 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38, + 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02, + 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A, + 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81, + 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88, + 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38, + 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C, + 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2, + 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80, + 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80, + 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82, + 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40, + 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE, + 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E, + 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE, + 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF, + 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF, + 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E, + 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0, + 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0, + 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21, + 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, + 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91, + 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49, + 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, + 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40, + 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82, + 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23, + 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80, + 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82, + 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04, + 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8, + 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80, + 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81, + 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04, + 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02, + 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0, + 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80, + 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12, + 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10, + 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81, + 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D, + 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50, + 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10, + 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01, + 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21, + 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48, + 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23, + 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31, + 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18, + 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84, + 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09, + 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10, + 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3, + 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01, + 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0, + 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10, + 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49, + 0x2C, 0x61, 0x24, 0x30 }; + +const GFXglyph FreeMono9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' + { 0, 2, 11, 11, 4, -10 }, // 0x21 '!' + { 3, 6, 5, 11, 2, -10 }, // 0x22 '"' + { 7, 7, 12, 11, 2, -10 }, // 0x23 '#' + { 18, 8, 12, 11, 1, -10 }, // 0x24 '$' + { 30, 7, 11, 11, 2, -10 }, // 0x25 '%' + { 40, 7, 10, 11, 2, -9 }, // 0x26 '&' + { 49, 3, 5, 11, 4, -10 }, // 0x27 ''' + { 51, 2, 13, 11, 5, -10 }, // 0x28 '(' + { 55, 2, 13, 11, 4, -10 }, // 0x29 ')' + { 59, 7, 7, 11, 2, -10 }, // 0x2A '*' + { 66, 7, 7, 11, 2, -8 }, // 0x2B '+' + { 73, 3, 5, 11, 2, -1 }, // 0x2C ',' + { 75, 9, 1, 11, 1, -5 }, // 0x2D '-' + { 77, 2, 2, 11, 4, -1 }, // 0x2E '.' + { 78, 7, 13, 11, 2, -11 }, // 0x2F '/' + { 90, 7, 11, 11, 2, -10 }, // 0x30 '0' + { 100, 5, 11, 11, 3, -10 }, // 0x31 '1' + { 107, 7, 11, 11, 2, -10 }, // 0x32 '2' + { 117, 8, 11, 11, 1, -10 }, // 0x33 '3' + { 128, 6, 11, 11, 3, -10 }, // 0x34 '4' + { 137, 7, 11, 11, 2, -10 }, // 0x35 '5' + { 147, 7, 11, 11, 2, -10 }, // 0x36 '6' + { 157, 7, 11, 11, 2, -10 }, // 0x37 '7' + { 167, 7, 11, 11, 2, -10 }, // 0x38 '8' + { 177, 7, 11, 11, 2, -10 }, // 0x39 '9' + { 187, 2, 8, 11, 4, -7 }, // 0x3A ':' + { 189, 3, 11, 11, 3, -7 }, // 0x3B ';' + { 194, 8, 8, 11, 1, -8 }, // 0x3C '<' + { 202, 9, 4, 11, 1, -6 }, // 0x3D '=' + { 207, 9, 8, 11, 1, -8 }, // 0x3E '>' + { 216, 7, 10, 11, 2, -9 }, // 0x3F '?' + { 225, 8, 12, 11, 2, -10 }, // 0x40 '@' + { 237, 11, 10, 11, 0, -9 }, // 0x41 'A' + { 251, 9, 10, 11, 1, -9 }, // 0x42 'B' + { 263, 9, 10, 11, 1, -9 }, // 0x43 'C' + { 275, 9, 10, 11, 1, -9 }, // 0x44 'D' + { 287, 9, 10, 11, 1, -9 }, // 0x45 'E' + { 299, 9, 10, 11, 1, -9 }, // 0x46 'F' + { 311, 10, 10, 11, 1, -9 }, // 0x47 'G' + { 324, 9, 10, 11, 1, -9 }, // 0x48 'H' + { 336, 5, 10, 11, 3, -9 }, // 0x49 'I' + { 343, 8, 10, 11, 2, -9 }, // 0x4A 'J' + { 353, 9, 10, 11, 1, -9 }, // 0x4B 'K' + { 365, 8, 10, 11, 2, -9 }, // 0x4C 'L' + { 375, 11, 10, 11, 0, -9 }, // 0x4D 'M' + { 389, 9, 10, 11, 1, -9 }, // 0x4E 'N' + { 401, 9, 10, 11, 1, -9 }, // 0x4F 'O' + { 413, 8, 10, 11, 1, -9 }, // 0x50 'P' + { 423, 9, 13, 11, 1, -9 }, // 0x51 'Q' + { 438, 9, 10, 11, 1, -9 }, // 0x52 'R' + { 450, 7, 10, 11, 2, -9 }, // 0x53 'S' + { 459, 9, 10, 11, 1, -9 }, // 0x54 'T' + { 471, 9, 10, 11, 1, -9 }, // 0x55 'U' + { 483, 11, 10, 11, 0, -9 }, // 0x56 'V' + { 497, 11, 10, 11, 0, -9 }, // 0x57 'W' + { 511, 9, 10, 11, 1, -9 }, // 0x58 'X' + { 523, 9, 10, 11, 1, -9 }, // 0x59 'Y' + { 535, 7, 10, 11, 2, -9 }, // 0x5A 'Z' + { 544, 2, 13, 11, 5, -10 }, // 0x5B '[' + { 548, 7, 13, 11, 2, -11 }, // 0x5C '\' + { 560, 2, 13, 11, 4, -10 }, // 0x5D ']' + { 564, 7, 5, 11, 2, -10 }, // 0x5E '^' + { 569, 11, 1, 11, 0, 2 }, // 0x5F '_' + { 571, 3, 3, 11, 3, -11 }, // 0x60 '`' + { 573, 9, 8, 11, 1, -7 }, // 0x61 'a' + { 582, 9, 11, 11, 1, -10 }, // 0x62 'b' + { 595, 7, 8, 11, 2, -7 }, // 0x63 'c' + { 602, 9, 11, 11, 1, -10 }, // 0x64 'd' + { 615, 8, 8, 11, 1, -7 }, // 0x65 'e' + { 623, 6, 11, 11, 3, -10 }, // 0x66 'f' + { 632, 9, 11, 11, 1, -7 }, // 0x67 'g' + { 645, 9, 11, 11, 1, -10 }, // 0x68 'h' + { 658, 7, 10, 11, 2, -9 }, // 0x69 'i' + { 667, 5, 13, 11, 3, -9 }, // 0x6A 'j' + { 676, 8, 11, 11, 2, -10 }, // 0x6B 'k' + { 687, 7, 11, 11, 2, -10 }, // 0x6C 'l' + { 697, 9, 8, 11, 1, -7 }, // 0x6D 'm' + { 706, 9, 8, 11, 1, -7 }, // 0x6E 'n' + { 715, 9, 8, 11, 1, -7 }, // 0x6F 'o' + { 724, 9, 11, 11, 1, -7 }, // 0x70 'p' + { 737, 9, 11, 11, 1, -7 }, // 0x71 'q' + { 750, 7, 8, 11, 3, -7 }, // 0x72 'r' + { 757, 7, 8, 11, 2, -7 }, // 0x73 's' + { 764, 8, 10, 11, 2, -9 }, // 0x74 't' + { 774, 8, 8, 11, 1, -7 }, // 0x75 'u' + { 782, 9, 8, 11, 1, -7 }, // 0x76 'v' + { 791, 9, 8, 11, 1, -7 }, // 0x77 'w' + { 800, 9, 8, 11, 1, -7 }, // 0x78 'x' + { 809, 9, 11, 11, 1, -7 }, // 0x79 'y' + { 822, 7, 8, 11, 2, -7 }, // 0x7A 'z' + { 829, 3, 13, 11, 4, -10 }, // 0x7B '{' + { 834, 1, 13, 11, 5, -10 }, // 0x7C '|' + { 836, 3, 13, 11, 4, -10 }, // 0x7D '}' + { 841, 7, 3, 11, 2, -6 } }; // 0x7E '~' + +const GFXfont FreeMono9pt7b PROGMEM = { + (uint8_t *)FreeMono9pt7bBitmaps, + (GFXglyph *)FreeMono9pt7bGlyphs, + 0x20, 0x7E, 18 }; + +// Approx. 1516 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold12pt7b.h new file mode 100644 index 0000000..4ad9d1a --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold12pt7b.h @@ -0,0 +1,250 @@ +const uint8_t FreeMonoBold12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x60, 0x6F, 0x60, 0xE7, 0xE7, 0x62, 0x42, + 0x42, 0x42, 0x42, 0x11, 0x87, 0x30, 0xC6, 0x18, 0xC3, 0x31, 0xFF, 0xFF, + 0xF9, 0x98, 0x33, 0x06, 0x60, 0xCC, 0x7F, 0xEF, 0xFC, 0x66, 0x0C, 0xC3, + 0x98, 0x63, 0x04, 0x40, 0x0C, 0x03, 0x00, 0xC0, 0xFE, 0x7F, 0x9C, 0x66, + 0x09, 0x80, 0x78, 0x0F, 0xE0, 0x7F, 0x03, 0xE0, 0xF8, 0x7F, 0xFB, 0xFC, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x38, 0x1F, 0x0C, 0x42, 0x10, 0xC4, 0x1F, + 0x03, 0x9C, 0x3C, 0x7F, 0x33, 0xE0, 0x8C, 0x21, 0x08, 0xC3, 0xE0, 0x70, + 0x3E, 0x1F, 0xC6, 0x61, 0x80, 0x70, 0x0C, 0x07, 0x83, 0xEE, 0xDF, 0xB3, + 0xCC, 0x73, 0xFE, 0x7F, 0x80, 0xFD, 0x24, 0x90, 0x39, 0xDC, 0xE6, 0x73, + 0x18, 0xC6, 0x31, 0x8C, 0x31, 0x8E, 0x31, 0xC4, 0xE7, 0x1C, 0xE3, 0x1C, + 0x63, 0x18, 0xC6, 0x31, 0x98, 0xCE, 0x67, 0x10, 0x0C, 0x03, 0x00, 0xC3, + 0xB7, 0xFF, 0xDF, 0xE1, 0xE0, 0xFC, 0x33, 0x0C, 0xC0, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x3B, 0x9C, 0xCE, 0x62, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x40, 0x30, 0x1C, 0x07, 0x03, 0x80, 0xE0, 0x30, + 0x1C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0x60, + 0x38, 0x0E, 0x01, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x87, 0x61, 0x8F, 0xC1, 0xE0, 0x1C, + 0x0F, 0x0F, 0xC3, 0xB0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x1F, 0x1F, 0xEE, 0x1F, 0x83, 0xC0, + 0xC0, 0x70, 0x38, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE3, 0xF0, 0xFF, 0xFF, + 0xFC, 0x3F, 0x0F, 0xF1, 0x87, 0x00, 0x60, 0x0C, 0x03, 0x83, 0xE0, 0x7C, + 0x01, 0xC0, 0x0C, 0x01, 0x80, 0x3C, 0x0F, 0xFF, 0x9F, 0xC0, 0x07, 0x07, + 0x83, 0xC3, 0xE1, 0xB1, 0xD8, 0xCC, 0xC6, 0xE3, 0x7F, 0xFF, 0xE0, 0x61, + 0xF8, 0xFC, 0x7F, 0x9F, 0xE6, 0x01, 0x80, 0x60, 0x1F, 0x87, 0xF9, 0x86, + 0x00, 0xC0, 0x30, 0x0C, 0x03, 0xC1, 0xBF, 0xE7, 0xE0, 0x07, 0xC7, 0xF3, + 0xC1, 0xC0, 0x60, 0x38, 0x0E, 0xF3, 0xFE, 0xF1, 0xF8, 0x3E, 0x0F, 0x83, + 0x71, 0xCF, 0xE1, 0xF0, 0xFF, 0xFF, 0xFC, 0x1F, 0x07, 0x01, 0x80, 0x60, + 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x1E, + 0x1F, 0xEE, 0x1F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE, 0x7F, 0xB8, 0x7C, + 0x0F, 0x03, 0xE1, 0xDF, 0xE3, 0xF0, 0x3E, 0x1F, 0xCE, 0x3B, 0x07, 0xC1, + 0xF0, 0x7E, 0x3D, 0xFF, 0x3D, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x3F, 0x8F, + 0x80, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x77, 0x70, 0x00, 0x00, 0x76, 0x6C, + 0xC8, 0x80, 0x00, 0x30, 0x0F, 0x03, 0xE0, 0xF8, 0x3E, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x0F, 0x80, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x0F, 0x00, 0x40, 0x00, 0x7C, + 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x3C, 0x3C, 0x18, 0x08, 0x00, 0x07, + 0x03, 0x81, 0xC0, 0x1E, 0x07, 0xF1, 0xC7, 0x30, 0x6C, 0x0D, 0x87, 0xB3, + 0xF6, 0xE6, 0xD8, 0xDB, 0x1B, 0x73, 0x67, 0xFC, 0x7F, 0x80, 0x30, 0x03, + 0x00, 0x71, 0xC7, 0xF8, 0x7C, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0x00, + 0x76, 0x00, 0xEE, 0x01, 0x8C, 0x07, 0x18, 0x0E, 0x38, 0x1F, 0xF0, 0x7F, + 0xF0, 0xC0, 0x61, 0x80, 0xCF, 0xC7, 0xFF, 0x8F, 0xC0, 0xFF, 0xC7, 0xFF, + 0x0C, 0x1C, 0x60, 0x63, 0x03, 0x18, 0x38, 0xFF, 0x87, 0xFE, 0x30, 0x39, + 0x80, 0xCC, 0x06, 0x60, 0x7F, 0xFF, 0x7F, 0xF0, 0x0F, 0xF3, 0xFF, 0x70, + 0x76, 0x03, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x60, + 0x37, 0x07, 0x3F, 0xF0, 0xFC, 0xFF, 0x0F, 0xFC, 0x60, 0xE6, 0x06, 0x60, + 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x03, 0x60, 0x76, 0x0E, 0xFF, + 0xCF, 0xF8, 0xFF, 0xF7, 0xFF, 0x8C, 0x0C, 0x60, 0x63, 0x1B, 0x18, 0xC0, + 0xFE, 0x07, 0xF0, 0x31, 0x81, 0x8C, 0xCC, 0x06, 0x60, 0x3F, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFF, 0xCC, 0x06, 0x60, 0x33, 0x19, 0x98, 0xC0, 0xFE, + 0x07, 0xF0, 0x31, 0x81, 0x8C, 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, + 0x0F, 0xF1, 0xFF, 0x9C, 0x1C, 0xC0, 0x6C, 0x03, 0x60, 0x03, 0x00, 0x18, + 0x7F, 0xC3, 0xFE, 0x01, 0xB8, 0x0C, 0xE0, 0xE3, 0xFF, 0x07, 0xE0, 0x7C, + 0xF9, 0xF3, 0xE3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0xFF, 0x0F, + 0xFC, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0xFC, 0xFF, 0xF3, 0xF0, + 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, + 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8, 0x7F, 0xC0, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, 0x31, + 0xC3, 0x0F, 0xF8, 0x1F, 0x00, 0xFC, 0xFB, 0xF3, 0xE3, 0x0E, 0x0C, 0x70, + 0x33, 0x80, 0xFC, 0x03, 0xF0, 0x0F, 0xE0, 0x39, 0xC0, 0xC3, 0x03, 0x0E, + 0x0C, 0x18, 0xFC, 0x7F, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0x18, 0x01, 0x80, + 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x31, 0x83, 0x18, 0x31, 0x83, + 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9E, 0x1E, 0x7C, 0xF9, + 0xB3, 0xE6, 0xFD, 0x99, 0xF6, 0x67, 0x99, 0x8E, 0x66, 0x31, 0x98, 0x06, + 0xFC, 0xFF, 0xF3, 0xF0, 0xF1, 0xFF, 0xCF, 0xCF, 0x0C, 0x78, 0x63, 0xE3, + 0x1B, 0x18, 0xDC, 0xC6, 0x76, 0x31, 0xB1, 0x8F, 0x8C, 0x3C, 0x61, 0xE7, + 0xE7, 0x3F, 0x18, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, + 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, 0x60, 0x67, 0x0E, 0x3F, 0xC0, 0xF0, + 0xFF, 0x8F, 0xFE, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, 0x30, 0x73, 0xFE, + 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0x03, 0xFC, + 0x70, 0xE6, 0x06, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x07, + 0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF0, 0x18, 0x33, 0xFF, 0x3F, 0xE0, 0xFF, + 0x83, 0xFF, 0x83, 0x07, 0x0C, 0x0C, 0x30, 0x30, 0xC1, 0xC3, 0xFE, 0x0F, + 0xF0, 0x31, 0xE0, 0xC3, 0x83, 0x07, 0x0C, 0x0C, 0xFE, 0x3F, 0xF8, 0x70, + 0x3F, 0xDF, 0xFE, 0x1F, 0x03, 0xC0, 0xF8, 0x07, 0xE0, 0x7E, 0x01, 0xF0, + 0x3C, 0x0F, 0x87, 0xFF, 0xBF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0x63, + 0xC6, 0x3C, 0x63, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x3F, 0xC3, 0xFC, 0xFF, 0xFF, 0xFF, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, + 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x63, 0x9C, 0x1F, 0xC0, 0xF0, + 0xFC, 0x3F, 0xFC, 0x3F, 0x30, 0x0C, 0x38, 0x1C, 0x18, 0x18, 0x1C, 0x38, + 0x1C, 0x38, 0x0E, 0x70, 0x0E, 0x70, 0x0F, 0x60, 0x07, 0xE0, 0x07, 0xE0, + 0x03, 0xC0, 0x03, 0xC0, 0xFC, 0xFF, 0xF3, 0xF6, 0x01, 0xDC, 0xC6, 0x77, + 0x99, 0xDE, 0x67, 0x79, 0x8D, 0xFE, 0x3F, 0xF8, 0xF3, 0xE3, 0xCF, 0x8F, + 0x3C, 0x38, 0x70, 0xE1, 0xC0, 0xF8, 0xFB, 0xE3, 0xE3, 0x86, 0x0F, 0x38, + 0x1F, 0xC0, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x77, 0x03, 0x8E, + 0x1E, 0x1C, 0xFC, 0xFF, 0xF3, 0xF0, 0xF9, 0xFF, 0x9F, 0x30, 0xC3, 0x9C, + 0x19, 0x81, 0xF8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x3F, 0xC3, 0xFC, 0xFF, 0xBF, 0xEC, 0x3B, 0x0C, 0xC6, 0x33, 0x80, 0xC0, + 0x60, 0x38, 0xCC, 0x36, 0x0F, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, + 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xFE, 0x40, 0x30, 0x0E, + 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x00, 0xE0, 0x18, + 0x07, 0x00, 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0C, 0x01, 0xFF, 0xC6, + 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1F, 0xFE, 0x04, 0x03, + 0x01, 0xE0, 0xFC, 0x7B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, + 0xCE, 0x73, 0x3F, 0x07, 0xF8, 0x00, 0xC0, 0x0C, 0x1F, 0xC7, 0xFC, 0x60, + 0xCC, 0x0C, 0xC1, 0xCF, 0xFF, 0x3F, 0xF0, 0xF0, 0x07, 0x80, 0x0C, 0x00, + 0x60, 0x03, 0x7C, 0x1F, 0xF8, 0xF1, 0xC7, 0x07, 0x30, 0x19, 0x80, 0xCC, + 0x06, 0x60, 0x73, 0xC7, 0x7F, 0xFB, 0xDF, 0x00, 0x1F, 0xB3, 0xFF, 0x70, + 0xFE, 0x07, 0xC0, 0x3C, 0x00, 0xC0, 0x0C, 0x00, 0x70, 0x77, 0xFF, 0x1F, + 0xC0, 0x01, 0xE0, 0x0F, 0x00, 0x18, 0x00, 0xC1, 0xF6, 0x3F, 0xF1, 0xC7, + 0x9C, 0x1C, 0xC0, 0x66, 0x03, 0x30, 0x19, 0x81, 0xC7, 0x1E, 0x3F, 0xFC, + 0x7D, 0xE0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xFF, 0xFF, 0xFF, 0xE0, + 0x0E, 0x00, 0x70, 0x73, 0xFF, 0x1F, 0xC0, 0x07, 0xC3, 0xFC, 0x60, 0x0C, + 0x0F, 0xFD, 0xFF, 0x86, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, + 0x81, 0xFF, 0xBF, 0xF0, 0x1F, 0x79, 0xFF, 0xDC, 0x79, 0x81, 0xCC, 0x06, + 0x60, 0x33, 0x01, 0x9C, 0x1C, 0x71, 0xE1, 0xFF, 0x07, 0xD8, 0x00, 0xC0, + 0x06, 0x00, 0x70, 0x7F, 0x03, 0xF0, 0xF0, 0x03, 0xC0, 0x03, 0x00, 0x0C, + 0x00, 0x37, 0xC0, 0xFF, 0x83, 0xC7, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, + 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF3, 0xFF, 0xCF, 0xC0, 0x06, 0x00, 0xC0, + 0x00, 0x3F, 0x07, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x06, 0x06, 0x00, 0xFF, 0xFF, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0xFE, 0xFC, + 0xF0, 0x07, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3F, 0x19, 0xF8, 0xDE, 0x07, + 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x6F, 0x03, 0x1C, 0x78, 0xFF, 0xC7, + 0xE0, 0x7E, 0x0F, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF8, 0xFE, 0xF1, + 0xFF, 0xF1, 0xCE, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x19, 0xF7, 0xBF, 0xEF, 0x78, 0x77, 0xC1, 0xFF, 0x83, 0xC7, + 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x33, 0xF1, + 0xFF, 0xC7, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xEE, 0x07, 0xC0, 0x3C, 0x03, + 0xC0, 0x3E, 0x07, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xF7, 0xE3, 0xFF, 0xC3, + 0xC3, 0x8E, 0x07, 0x30, 0x0C, 0xC0, 0x33, 0x00, 0xCE, 0x07, 0x3C, 0x38, + 0xFF, 0xC3, 0x7E, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x0F, 0xE0, 0x3F, 0x80, + 0x1F, 0xBC, 0xFF, 0xF7, 0x0F, 0x38, 0x1C, 0xC0, 0x33, 0x00, 0xCC, 0x03, + 0x38, 0x1C, 0x70, 0xF0, 0xFF, 0xC1, 0xFB, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0xC0, 0x1F, 0xC0, 0x7F, 0x79, 0xE7, 0xFF, 0x1F, 0x31, 0xC0, 0x18, 0x01, + 0x80, 0x18, 0x01, 0x80, 0x18, 0x0F, 0xFC, 0xFF, 0xC0, 0x3F, 0x9F, 0xFE, + 0x1F, 0x82, 0xFE, 0x1F, 0xE0, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0xF0, 0x30, + 0x06, 0x00, 0xC0, 0x7F, 0xEF, 0xFC, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, + 0x00, 0xC0, 0x18, 0x71, 0xFE, 0x1F, 0x00, 0xF1, 0xF7, 0x8F, 0x8C, 0x0C, + 0x60, 0x63, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x38, 0xF0, 0xFF, 0xC3, + 0xEE, 0xFC, 0xFF, 0xF3, 0xF3, 0x87, 0x0E, 0x1C, 0x1C, 0x60, 0x73, 0x80, + 0xEC, 0x03, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xF8, 0x7F, 0xE1, + 0xF7, 0x39, 0x8C, 0xE6, 0x37, 0xB0, 0xFF, 0xC3, 0xFF, 0x07, 0xBC, 0x1C, + 0xF0, 0x73, 0x81, 0x86, 0x00, 0x7C, 0xF9, 0xF3, 0xE3, 0xCF, 0x07, 0xF8, + 0x0F, 0xC0, 0x1E, 0x00, 0xFC, 0x07, 0x38, 0x38, 0x73, 0xF3, 0xFF, 0xCF, + 0xC0, 0xF9, 0xFF, 0x9F, 0x70, 0xE3, 0x0C, 0x39, 0xC1, 0x98, 0x19, 0x81, + 0xF8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0xFF, 0x0F, + 0xF0, 0x7F, 0xCF, 0xF9, 0x8E, 0x33, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC6, + 0x70, 0xFF, 0xFF, 0xFF, 0x80, 0x0E, 0x3C, 0x60, 0xC1, 0x83, 0x06, 0x0C, + 0x39, 0xE3, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x3C, 0x38, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0xE1, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x3C, + 0x79, 0x83, 0x06, 0x0C, 0x18, 0x31, 0xE3, 0x80, 0x3C, 0x37, 0xE7, 0x67, + 0xE6, 0x1C }; + +const GFXglyph FreeMonoBold12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' + { 0, 4, 15, 14, 5, -14 }, // 0x21 '!' + { 8, 8, 7, 14, 3, -13 }, // 0x22 '"' + { 15, 11, 18, 14, 2, -15 }, // 0x23 '#' + { 40, 10, 20, 14, 2, -16 }, // 0x24 '$' + { 65, 10, 15, 14, 2, -14 }, // 0x25 '%' + { 84, 10, 13, 14, 2, -12 }, // 0x26 '&' + { 101, 3, 7, 14, 5, -13 }, // 0x27 ''' + { 104, 5, 19, 14, 6, -14 }, // 0x28 '(' + { 116, 5, 19, 14, 3, -14 }, // 0x29 ')' + { 128, 10, 10, 14, 2, -14 }, // 0x2A '*' + { 141, 12, 13, 14, 1, -12 }, // 0x2B '+' + { 161, 5, 7, 14, 4, -2 }, // 0x2C ',' + { 166, 12, 2, 14, 1, -7 }, // 0x2D '-' + { 169, 3, 3, 14, 5, -2 }, // 0x2E '.' + { 171, 10, 20, 14, 2, -16 }, // 0x2F '/' + { 196, 10, 15, 14, 2, -14 }, // 0x30 '0' + { 215, 10, 15, 14, 2, -14 }, // 0x31 '1' + { 234, 10, 15, 14, 2, -14 }, // 0x32 '2' + { 253, 11, 15, 14, 1, -14 }, // 0x33 '3' + { 274, 9, 14, 14, 2, -13 }, // 0x34 '4' + { 290, 10, 15, 14, 2, -14 }, // 0x35 '5' + { 309, 10, 15, 14, 2, -14 }, // 0x36 '6' + { 328, 10, 15, 14, 2, -14 }, // 0x37 '7' + { 347, 10, 15, 14, 2, -14 }, // 0x38 '8' + { 366, 10, 15, 14, 3, -14 }, // 0x39 '9' + { 385, 3, 11, 14, 5, -10 }, // 0x3A ':' + { 390, 4, 15, 14, 4, -10 }, // 0x3B ';' + { 398, 12, 11, 14, 1, -11 }, // 0x3C '<' + { 415, 12, 7, 14, 1, -9 }, // 0x3D '=' + { 426, 12, 11, 14, 1, -11 }, // 0x3E '>' + { 443, 9, 14, 14, 3, -13 }, // 0x3F '?' + { 459, 11, 19, 14, 2, -14 }, // 0x40 '@' + { 486, 15, 14, 14, -1, -13 }, // 0x41 'A' + { 513, 13, 14, 14, 0, -13 }, // 0x42 'B' + { 536, 12, 14, 14, 1, -13 }, // 0x43 'C' + { 557, 12, 14, 14, 1, -13 }, // 0x44 'D' + { 578, 13, 14, 14, 0, -13 }, // 0x45 'E' + { 601, 13, 14, 14, 0, -13 }, // 0x46 'F' + { 624, 13, 14, 14, 1, -13 }, // 0x47 'G' + { 647, 14, 14, 14, 0, -13 }, // 0x48 'H' + { 672, 10, 14, 14, 2, -13 }, // 0x49 'I' + { 690, 13, 14, 14, 1, -13 }, // 0x4A 'J' + { 713, 14, 14, 14, 0, -13 }, // 0x4B 'K' + { 738, 12, 14, 14, 1, -13 }, // 0x4C 'L' + { 759, 14, 14, 14, 0, -13 }, // 0x4D 'M' + { 784, 13, 14, 14, 0, -13 }, // 0x4E 'N' + { 807, 12, 14, 14, 1, -13 }, // 0x4F 'O' + { 828, 12, 14, 14, 0, -13 }, // 0x50 'P' + { 849, 12, 17, 14, 1, -13 }, // 0x51 'Q' + { 875, 14, 14, 14, 0, -13 }, // 0x52 'R' + { 900, 10, 14, 14, 2, -13 }, // 0x53 'S' + { 918, 12, 14, 14, 1, -13 }, // 0x54 'T' + { 939, 12, 14, 14, 1, -13 }, // 0x55 'U' + { 960, 16, 14, 14, -1, -13 }, // 0x56 'V' + { 988, 14, 14, 14, 0, -13 }, // 0x57 'W' + { 1013, 14, 14, 14, 0, -13 }, // 0x58 'X' + { 1038, 12, 14, 14, 1, -13 }, // 0x59 'Y' + { 1059, 10, 14, 14, 2, -13 }, // 0x5A 'Z' + { 1077, 5, 19, 14, 6, -14 }, // 0x5B '[' + { 1089, 10, 20, 14, 2, -16 }, // 0x5C '\' + { 1114, 5, 19, 14, 3, -14 }, // 0x5D ']' + { 1126, 10, 8, 14, 2, -15 }, // 0x5E '^' + { 1136, 14, 2, 14, 0, 4 }, // 0x5F '_' + { 1140, 4, 4, 14, 4, -15 }, // 0x60 '`' + { 1142, 12, 11, 14, 1, -10 }, // 0x61 'a' + { 1159, 13, 15, 14, 0, -14 }, // 0x62 'b' + { 1184, 12, 11, 14, 1, -10 }, // 0x63 'c' + { 1201, 13, 15, 14, 1, -14 }, // 0x64 'd' + { 1226, 12, 11, 14, 1, -10 }, // 0x65 'e' + { 1243, 11, 15, 14, 2, -14 }, // 0x66 'f' + { 1264, 13, 16, 14, 1, -10 }, // 0x67 'g' + { 1290, 14, 15, 14, 0, -14 }, // 0x68 'h' + { 1317, 11, 14, 14, 1, -13 }, // 0x69 'i' + { 1337, 8, 19, 15, 3, -13 }, // 0x6A 'j' + { 1356, 13, 15, 14, 1, -14 }, // 0x6B 'k' + { 1381, 11, 15, 14, 1, -14 }, // 0x6C 'l' + { 1402, 15, 11, 14, 0, -10 }, // 0x6D 'm' + { 1423, 14, 11, 14, 0, -10 }, // 0x6E 'n' + { 1443, 12, 11, 14, 1, -10 }, // 0x6F 'o' + { 1460, 14, 16, 14, 0, -10 }, // 0x70 'p' + { 1488, 14, 16, 14, 0, -10 }, // 0x71 'q' + { 1516, 12, 11, 14, 1, -10 }, // 0x72 'r' + { 1533, 10, 11, 14, 2, -10 }, // 0x73 's' + { 1547, 11, 14, 14, 1, -13 }, // 0x74 't' + { 1567, 13, 11, 14, 0, -10 }, // 0x75 'u' + { 1585, 14, 11, 14, 0, -10 }, // 0x76 'v' + { 1605, 14, 11, 14, 0, -10 }, // 0x77 'w' + { 1625, 14, 11, 14, 0, -10 }, // 0x78 'x' + { 1645, 12, 16, 14, 1, -10 }, // 0x79 'y' + { 1669, 11, 11, 14, 1, -10 }, // 0x7A 'z' + { 1685, 7, 19, 14, 3, -14 }, // 0x7B '{' + { 1702, 2, 19, 14, 6, -14 }, // 0x7C '|' + { 1707, 7, 19, 14, 4, -14 }, // 0x7D '}' + { 1724, 12, 4, 14, 1, -7 } }; // 0x7E '~' + +const GFXfont FreeMonoBold12pt7b PROGMEM = { + (uint8_t *)FreeMonoBold12pt7bBitmaps, + (GFXglyph *)FreeMonoBold12pt7bGlyphs, + 0x20, 0x7E, 24 }; + +// Approx. 2402 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold18pt7b.h new file mode 100644 index 0000000..36e0be0 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold18pt7b.h @@ -0,0 +1,423 @@ +const uint8_t FreeMonoBold18pt7bBitmaps[] PROGMEM = { + 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xC4, 0x03, 0xBF, + 0xFF, 0xB8, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1E, 0xC1, 0x98, 0x33, + 0x06, 0x60, 0xCC, 0x18, 0x0E, 0x1C, 0x0F, 0x3C, 0x1F, 0x3C, 0x1E, 0x3C, + 0x1E, 0x3C, 0x1E, 0x78, 0x1E, 0x78, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1E, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x7F, 0xFE, 0x7F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0, + 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x01, + 0xE0, 0x1F, 0xF1, 0xFF, 0xE7, 0xFF, 0xBE, 0x1E, 0xF0, 0x3B, 0xC0, 0xCF, + 0xE0, 0x3F, 0xF8, 0x7F, 0xF0, 0x7F, 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x3F, + 0x80, 0xFF, 0x87, 0xFF, 0xFE, 0xFF, 0xF3, 0x7F, 0x80, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xC0, 0x1E, 0x00, 0xFF, 0x03, 0x86, + 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x70, 0x3F, 0xC2, 0x1E, 0x3E, + 0x03, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0x8F, 0x18, 0x7F, 0x01, 0xC7, 0x03, + 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x1C, 0x70, 0x1F, 0xC0, 0x0F, 0x00, 0x03, + 0xD0, 0x1F, 0xF0, 0x7F, 0xE1, 0xFF, 0xC3, 0xE6, 0x07, 0x80, 0x0F, 0x00, + 0x0F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0xFE, 0x03, 0xFE, 0xFF, 0xBD, 0xFE, + 0x3F, 0xFC, 0x3F, 0x7C, 0x7C, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, 0x7E, + 0xF0, 0xFF, 0xFF, 0xF6, 0x66, 0x66, 0x07, 0x0F, 0x1F, 0x1E, 0x3E, 0x3C, + 0x78, 0x78, 0x78, 0x70, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0x78, 0x78, 0x78, 0x3C, 0x3C, 0x1E, 0x1F, 0x0F, 0x07, 0xE0, 0xF0, 0xF8, + 0x78, 0x7C, 0x3C, 0x3E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x3C, 0x3C, 0x78, 0xF8, 0xF0, 0xE0, + 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xFE, 0x1F, 0xF8, 0x07, 0xE0, 0x0F, 0xF0, 0x1F, 0xF8, + 0x1E, 0x78, 0x1C, 0x38, 0x18, 0x18, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x3E, 0x78, 0xF3, 0xC7, + 0x8E, 0x1C, 0x70, 0xE1, 0x80, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, + 0x3F, 0xFF, 0xE0, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0x00, + 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, + 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, + 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, + 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x03, 0x00, 0x00, + 0x07, 0xE0, 0x1F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1E, + 0xF8, 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x1F, 0x78, 0x1E, + 0x7C, 0x3E, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x07, 0xC0, + 0x1F, 0x80, 0xFF, 0x03, 0xFE, 0x0F, 0xBC, 0x0C, 0x78, 0x00, 0xF0, 0x01, + 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x81, 0xFF, 0xFB, 0xFF, 0xF7, + 0xFF, 0xE7, 0xFF, 0x80, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xFF, 0xEF, + 0x87, 0xDE, 0x07, 0xF8, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x78, 0x03, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x0F, 0xC0, 0x7F, 0xF0, 0xFF, 0xF8, 0xFF, 0xFC, 0x70, 0x3E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x03, 0xFC, 0x03, 0xF0, 0x03, 0xF0, + 0x03, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0xE0, 0x3F, 0xFF, 0xFE, 0xFF, 0xFC, 0x7F, 0xF8, 0x1F, 0xE0, 0x00, 0xF8, + 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0xC0, 0x77, 0x80, 0xEF, 0x03, 0x9E, 0x0F, + 0x3C, 0x1C, 0x78, 0x70, 0xF1, 0xE1, 0xE3, 0x83, 0xCF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xF0, + 0x1F, 0xC0, 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0x83, 0xC0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x7B, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, 0x0F, + 0xFF, 0xC3, 0x83, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x0F, 0xB8, 0x0F, 0xBF, 0xFF, 0xCF, 0xFF, 0xC3, 0xFF, 0xC0, 0x7F, + 0x80, 0x00, 0xFC, 0x07, 0xFC, 0x3F, 0xF8, 0xFF, 0xF1, 0xF8, 0x07, 0xC0, + 0x1F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE7, 0xC3, 0xDF, 0xC7, 0x7F, 0xCF, + 0xFF, 0xDF, 0x8F, 0xFC, 0x07, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3D, 0xE0, + 0xFB, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x01, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0x70, 0x00, 0x07, 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0x83, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1E, 0xF0, 0x78, 0xFF, 0xE0, + 0xFF, 0x81, 0xFF, 0x0F, 0xFF, 0x9E, 0x0F, 0x78, 0x0F, 0xF0, 0x1F, 0xE0, + 0x3F, 0xE0, 0xFB, 0xFF, 0xE7, 0xFF, 0xC7, 0xFF, 0x03, 0xF8, 0x00, 0x0F, + 0xC0, 0x3F, 0xE0, 0xFF, 0xE3, 0xFF, 0xEF, 0xC3, 0xDF, 0x03, 0xBC, 0x07, + 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3D, 0xF1, 0xFB, 0xFF, 0xF3, 0xFE, 0xE3, + 0xFB, 0xC3, 0xE7, 0x80, 0x1E, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xE7, 0xFF, + 0x8F, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, 0x00, 0x77, 0xFF, 0xF7, 0x00, 0x00, + 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF3, 0xC7, 0x8E, 0x3C, 0x70, 0xE1, 0x87, 0x0C, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, + 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7C, 0x00, + 0x07, 0x7F, 0xFF, 0xDF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF, + 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, + 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80, + 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0x80, + 0x00, 0x1F, 0xC0, 0xFF, 0xE3, 0xFF, 0xF7, 0xFF, 0xEF, 0x07, 0xFE, 0x03, + 0xDC, 0x07, 0x80, 0x0F, 0x00, 0x7C, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00, + 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0x70, 0x00, 0x07, 0xE0, 0x1F, 0xE0, 0x7F, 0xE1, 0xE1, + 0xC7, 0x83, 0xCE, 0x03, 0xBC, 0x07, 0x70, 0x0E, 0xE0, 0x7D, 0xC3, 0xFB, + 0x8F, 0xF7, 0x3C, 0xEE, 0x71, 0xDC, 0xE3, 0xB9, 0xC7, 0x73, 0xCE, 0xE3, + 0xFF, 0xC3, 0xFF, 0x83, 0xFF, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x02, + 0x1E, 0x1E, 0x3F, 0xFC, 0x1F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, 0x00, 0x7F, + 0xF0, 0x01, 0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xF8, + 0x00, 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00, + 0x78, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x01, 0xFF, + 0xFE, 0x07, 0xFF, 0xF8, 0x3C, 0x00, 0xF3, 0xFC, 0x1F, 0xEF, 0xF8, 0x7F, + 0xFF, 0xE1, 0xFF, 0x7F, 0x03, 0xF8, 0x7F, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF, + 0xFF, 0x8F, 0xFF, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x3C, 0x3C, 0x03, 0xC3, + 0xC0, 0x7C, 0x3F, 0xFF, 0x83, 0xFF, 0xF0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, + 0x3C, 0x03, 0xE3, 0xC0, 0x1F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x01, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, 0x7F, 0xFF, 0x00, 0x01, + 0xF8, 0xC1, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0xFF, 0xF7, 0xE0, 0x7E, 0xF8, + 0x07, 0xFE, 0x00, 0x7F, 0x80, 0x0E, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x07, 0x7F, 0x03, 0xE7, 0xFF, 0xFC, 0x7F, 0xFF, 0x03, 0xFF, 0xC0, 0x1F, + 0xE0, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xFF, 0xFC, 0x78, 0x1F, + 0x9E, 0x03, 0xE7, 0x80, 0x79, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, + 0x80, 0x3D, 0xE0, 0x0F, 0x78, 0x03, 0xDE, 0x00, 0xF7, 0x80, 0x7D, 0xE0, + 0x1E, 0x78, 0x1F, 0xBF, 0xFF, 0xCF, 0xFF, 0xF3, 0xFF, 0xF0, 0x7F, 0xF0, + 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xE3, 0xC0, + 0x3C, 0x78, 0x07, 0x8F, 0x1C, 0xF1, 0xE3, 0xCC, 0x3F, 0xF8, 0x07, 0xFF, + 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xF1, 0x8F, 0x0C, + 0x79, 0xE0, 0x0F, 0x3C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF3, 0xC0, 0x1E, 0x78, 0x63, 0xCF, 0x1E, 0x79, 0xE3, 0xC6, 0x3F, 0xF8, + 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xFC, 0x03, 0xC7, 0x80, 0x78, 0xE0, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0x80, + 0x7F, 0xF0, 0x07, 0xFC, 0x00, 0x01, 0xFC, 0xE0, 0x7F, 0xFE, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFE, 0x7F, 0x03, 0xE7, 0xC0, 0x1E, 0xF8, 0x00, 0xEF, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x03, 0xFE, 0xF0, + 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F, 0xF7, 0x80, 0x1E, 0x7E, 0x01, 0xE3, + 0xFF, 0xFE, 0x1F, 0xFF, 0xE0, 0xFF, 0xF8, 0x01, 0xFE, 0x00, 0x7F, 0x0F, + 0xE3, 0xFC, 0x7F, 0x9F, 0xE3, 0xFC, 0x7F, 0x1F, 0xC1, 0xE0, 0x3C, 0x0F, + 0x01, 0xE0, 0x78, 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xFF, 0xFE, + 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x78, + 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC3, 0xFC, 0x7F, 0xBF, 0xE3, 0xFF, + 0xFF, 0x1F, 0xF7, 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x83, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, + 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x38, 0x07, 0x8F, + 0x00, 0xF1, 0xE0, 0x1E, 0x3C, 0x03, 0xC7, 0x80, 0xF8, 0xF8, 0x3F, 0x1F, + 0xFF, 0xC3, 0xFF, 0xF0, 0x1F, 0xFC, 0x00, 0x7E, 0x00, 0xFF, 0x0F, 0xCF, + 0xF9, 0xFE, 0xFF, 0x9F, 0xEF, 0xF8, 0xFC, 0x3C, 0x1F, 0x03, 0xC3, 0xE0, + 0x3C, 0x7C, 0x03, 0xCF, 0x80, 0x3D, 0xF0, 0x03, 0xFE, 0x00, 0x3F, 0xF8, + 0x03, 0xFF, 0x80, 0x3E, 0x7C, 0x03, 0xC3, 0xE0, 0x3C, 0x1E, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x0F, 0xF8, 0x7E, 0xFF, 0x87, 0xFF, 0xF8, 0x7F, 0x7F, + 0x03, 0xE0, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, + 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x01, 0x87, 0x80, 0xF1, 0xE0, 0x3C, + 0x78, 0x0F, 0x1E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xC0, 0x3E, 0x00, 0xF8, 0xFC, 0x01, 0xF9, 0xFC, 0x07, 0xF3, 0xF8, + 0x0F, 0xE3, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x0F, 0xF1, 0xFE, 0x1F, 0xE3, + 0xFC, 0x3D, 0xE7, 0x78, 0x7B, 0xDE, 0xF0, 0xF7, 0xBD, 0xE1, 0xE7, 0xF3, + 0xC3, 0xCF, 0xE7, 0x87, 0x8F, 0x8F, 0x0F, 0x1F, 0x1E, 0x1E, 0x1E, 0x3C, + 0x3C, 0x00, 0x79, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xF7, + 0xF0, 0x1F, 0xC0, 0xFC, 0x1F, 0xEF, 0xE1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, + 0xFF, 0x3F, 0x83, 0xC3, 0xF8, 0x3C, 0x3F, 0xC3, 0xC3, 0xFC, 0x3C, 0x3D, + 0xE3, 0xC3, 0xDE, 0x3C, 0x3C, 0xF3, 0xC3, 0xC7, 0xBC, 0x3C, 0x7B, 0xC3, + 0xC3, 0xFC, 0x3C, 0x3F, 0xC3, 0xC1, 0xFC, 0x3C, 0x1F, 0xCF, 0xF8, 0xFC, + 0xFF, 0x87, 0xCF, 0xF8, 0x7C, 0x7F, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0x7F, + 0xE0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0x0F, 0xC7, 0xC0, 0x3E, 0x78, + 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, 0x78, 0x01, 0xE7, 0xC0, 0x3E, + 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x1F, 0xFF, 0x00, 0x7F, 0xE0, 0x01, 0xF8, + 0x00, 0x7F, 0xF8, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3C, 0x0F, + 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, 0x03, 0xF3, + 0xFF, 0xF8, 0xFF, 0xFC, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x80, 0x7F, 0xC0, + 0x00, 0x01, 0xF8, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x3F, + 0x0F, 0xC7, 0xC0, 0x3E, 0x78, 0x01, 0xEF, 0x80, 0x1F, 0xF0, 0x00, 0xFF, + 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x1F, + 0x78, 0x01, 0xE7, 0xC0, 0x3E, 0x3F, 0x0F, 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, + 0x00, 0x7F, 0xE0, 0x03, 0xF8, 0x00, 0x3F, 0x8E, 0x07, 0xFF, 0xF0, 0xFF, + 0xFF, 0x0F, 0xFF, 0xE0, 0x60, 0x78, 0x7F, 0xF8, 0x07, 0xFF, 0xF0, 0x3F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x01, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x78, 0x0F, + 0x03, 0xC0, 0x78, 0x1E, 0x0F, 0xC0, 0xFF, 0xFC, 0x07, 0xFF, 0xC0, 0x3F, + 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0x0F, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0, + 0x1E, 0x07, 0xC3, 0xFE, 0x1F, 0xBF, 0xF0, 0x7F, 0xFF, 0x83, 0xF7, 0xF8, + 0x0F, 0x00, 0x07, 0xE7, 0x07, 0xFF, 0x8F, 0xFF, 0xC7, 0xFF, 0xE7, 0xC1, + 0xF3, 0xC0, 0x79, 0xE0, 0x3C, 0xF8, 0x00, 0x7F, 0x80, 0x1F, 0xFC, 0x07, + 0xFF, 0x81, 0xFF, 0xE0, 0x0F, 0xFB, 0x00, 0x7F, 0xC0, 0x1F, 0xE0, 0x0F, + 0xFC, 0x1F, 0xFF, 0xFF, 0xBF, 0xFF, 0x8D, 0xFF, 0x80, 0x3F, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0xE1, + 0xE3, 0xFC, 0x3C, 0x7F, 0x87, 0x8F, 0x60, 0xF0, 0xC0, 0x1E, 0x00, 0x03, + 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, + 0x80, 0x00, 0xF0, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0x7F, + 0xE0, 0xFF, 0x0F, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFE, 0xFF, 0x1F, 0xF3, + 0xC0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, + 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, + 0x00, 0xF0, 0xF0, 0x07, 0x87, 0xC0, 0x7C, 0x1F, 0x07, 0xC0, 0xFF, 0xFE, + 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x03, 0xFD, + 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFB, 0xF8, 0x1F, 0xE1, 0xC0, 0x07, 0x03, + 0xC0, 0x1E, 0x07, 0x80, 0x3C, 0x07, 0x80, 0xF0, 0x0F, 0x01, 0xE0, 0x0F, + 0x03, 0x80, 0x1E, 0x0F, 0x00, 0x3E, 0x1E, 0x00, 0x3C, 0x78, 0x00, 0x78, + 0xF0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, 0xFF, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0x0F, + 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFE, 0x0F, 0xF7, 0x80, 0x0F, 0x3C, + 0x38, 0x78, 0xE3, 0xE3, 0x87, 0x1F, 0x1C, 0x38, 0xF8, 0xE1, 0xEF, 0xE7, + 0x0F, 0x7F, 0x78, 0x7B, 0xBB, 0xC3, 0xFD, 0xFE, 0x0F, 0xEF, 0xF0, 0x7E, + 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x07, 0xC1, 0xF0, + 0x3E, 0x0F, 0x81, 0xF0, 0x7C, 0x00, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, + 0x7F, 0xBF, 0x07, 0xE1, 0xE0, 0xF8, 0x3E, 0x3E, 0x03, 0xEF, 0x80, 0x3D, + 0xE0, 0x03, 0xF8, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x3F, + 0x80, 0x0F, 0x78, 0x03, 0xC7, 0x80, 0xF8, 0x78, 0x3E, 0x0F, 0x8F, 0xE3, + 0xFF, 0xFC, 0x7F, 0xFF, 0x8F, 0xF7, 0xE0, 0xFC, 0x7E, 0x07, 0xEF, 0xF0, + 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x1E, 0x07, 0x81, 0xF0, 0xF8, 0x0F, + 0x0F, 0x00, 0x79, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xF8, 0x00, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, 0xFE, + 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3C, 0xF0, + 0x78, 0xF0, 0xF0, 0x70, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x0F, 0x00, 0x1E, 0x0E, 0x1C, 0x0F, 0x38, 0x0F, 0x78, 0x0F, 0x7F, + 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFE, 0xFF, 0xFF, 0xFE, 0xE0, 0x01, + 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0x00, + 0x38, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00, + 0x7F, 0x00, 0xFE, 0x03, 0xDE, 0x0F, 0x1E, 0x3E, 0x3E, 0xF8, 0x3F, 0xE0, + 0x3F, 0x80, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xC3, 0x87, 0x0E, 0x1C, 0x30, 0x01, 0xFC, 0x01, 0xFF, 0xC0, + 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x00, 0x78, 0x0F, 0xFF, 0x07, 0xFF, 0xE1, + 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, 0x80, 0xF3, 0xC0, 0x1E, 0x78, 0x0F, 0xCF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xFF, 0xF8, 0x7F, 0x3E, 0x7C, 0x00, 0x1F, + 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, + 0x3F, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0xFC, 0x1F, 0x1F, + 0x01, 0xF3, 0xC0, 0x1E, 0x78, 0x03, 0xCF, 0x00, 0x79, 0xE0, 0x0F, 0x3E, + 0x03, 0xE7, 0xE0, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, 0xFF, 0xF0, 0xF9, + 0xF8, 0x00, 0x03, 0xF3, 0x87, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xF7, 0xE0, + 0xFF, 0xC0, 0x3F, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E, + 0x00, 0x4F, 0x80, 0xF7, 0xFF, 0xF9, 0xFF, 0xF8, 0x7F, 0xF8, 0x0F, 0xF0, + 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x03, 0xF3, 0xC0, 0xFF, 0xBC, 0x1F, 0xFF, 0xC3, 0xFF, + 0xFC, 0x7E, 0x0F, 0xC7, 0x80, 0x7C, 0xF0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, + 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x07, 0xC7, 0xE0, 0xFC, 0x7F, 0xFF, 0xF3, + 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, 0x3F, 0x3E, 0x03, 0xF0, 0x03, 0xFF, 0x01, + 0xFF, 0xE0, 0xFF, 0xFC, 0x7E, 0x0F, 0x9E, 0x01, 0xEF, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, 0x7F, 0xFF, + 0xCF, 0xFF, 0xF1, 0xFF, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x07, 0xFF, 0x0F, + 0xFF, 0x1F, 0xFF, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, + 0xFC, 0xFF, 0xF8, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0xFF, + 0xF8, 0xFF, 0xF8, 0x07, 0xE7, 0xC3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0xFF, + 0xF7, 0xC1, 0xF9, 0xF0, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xF0, 0x07, + 0x9E, 0x00, 0xF3, 0xE0, 0x3E, 0x3E, 0x0F, 0xC7, 0xFF, 0xF8, 0x7F, 0xFF, + 0x07, 0xFD, 0xE0, 0x3F, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, + 0x03, 0xFF, 0x80, 0x7F, 0xF0, 0x0F, 0xFC, 0x00, 0xFE, 0x00, 0x3E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x78, 0xF8, 0x03, 0xDF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, + 0x07, 0xE1, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, + 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x1F, 0xC1, 0xFD, + 0xFE, 0x0F, 0xFF, 0xF0, 0x7F, 0xBF, 0x01, 0xF8, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x3F, 0xC0, + 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xFE, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xFF, 0xFE, 0xFF, 0xEF, 0xFC, 0x7F, 0x00, + 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x0F, + 0x00, 0x03, 0xC7, 0xF0, 0xF3, 0xFC, 0x3C, 0xFF, 0x0F, 0x3F, 0x83, 0xDF, + 0x00, 0xFF, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0xF7, 0x80, + 0x3C, 0xF0, 0x0F, 0x1F, 0x0F, 0xC3, 0xFB, 0xF1, 0xFF, 0xFC, 0x7F, 0xDF, + 0x0F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x3F, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFE, 0x3D, 0xE3, + 0xC1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, 0x3E, 0x3C, 0x78, + 0xF0, 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0x3C, 0x3C, 0x78, 0xF0, + 0xF1, 0xE3, 0xC3, 0xC7, 0x8F, 0x0F, 0x1E, 0xFE, 0x3E, 0x7F, 0xF8, 0xF9, + 0xFF, 0xE3, 0xE7, 0xDF, 0x0F, 0x1E, 0x1E, 0x7C, 0x03, 0xEF, 0xF0, 0x3F, + 0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0x87, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, + 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, + 0x7F, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0xF7, 0xE0, 0x7E, 0x03, 0xF8, + 0x01, 0xFF, 0xC0, 0x7F, 0xFC, 0x1F, 0xFF, 0xC7, 0xE0, 0xFD, 0xF0, 0x07, + 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xE0, 0x0F, + 0xBF, 0x07, 0xE3, 0xFF, 0xF8, 0x3F, 0xFE, 0x03, 0xFF, 0x80, 0x1F, 0xC0, + 0x3E, 0x7E, 0x03, 0xF7, 0xFC, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC1, 0xF8, + 0x3F, 0x0F, 0x80, 0x7C, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, + 0xF0, 0x03, 0xC7, 0xC0, 0x3E, 0x3F, 0x07, 0xE1, 0xFF, 0xFE, 0x0F, 0xFF, + 0xE0, 0x7B, 0xFE, 0x03, 0xCF, 0xC0, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFE, 0x00, + 0x00, 0x03, 0xF3, 0xE0, 0x7F, 0xDF, 0x87, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, + 0xE0, 0xFC, 0x7C, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x78, 0xF0, 0x03, + 0xC7, 0x80, 0x1E, 0x3E, 0x01, 0xF0, 0xFC, 0x1F, 0x83, 0xFF, 0xFC, 0x1F, + 0xFF, 0xE0, 0x3F, 0xEF, 0x00, 0x7E, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, + 0x3F, 0xC0, 0x7E, 0x1E, 0x7F, 0x3F, 0xFF, 0xBF, 0xFF, 0xFF, 0xF1, 0xFE, + 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, 0xE0, + 0x07, 0xE6, 0x1F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x78, 0x1E, 0x78, 0x0E, + 0x7F, 0xE0, 0x3F, 0xFC, 0x03, 0xFE, 0x60, 0x1F, 0xE0, 0x0F, 0xF8, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFC, 0x07, 0xE0, 0x0C, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF, + 0xFC, 0xFF, 0xFC, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x07, 0x8F, 0xFF, 0xC3, 0xFF, + 0xC1, 0xFF, 0xC0, 0x3F, 0x80, 0xFC, 0x1F, 0xBF, 0x0F, 0xEF, 0xC3, 0xFB, + 0xF0, 0xFE, 0x3C, 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF0, 0x1E, 0x3C, + 0x07, 0x8F, 0x01, 0xE3, 0xC0, 0x78, 0xF8, 0x7E, 0x3F, 0xFF, 0xC7, 0xFF, + 0xF0, 0xFF, 0x7C, 0x0F, 0x9E, 0x7F, 0x07, 0xF7, 0xFC, 0x7F, 0xFF, 0xE3, + 0xFE, 0xFE, 0x0F, 0xE1, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x1E, 0x01, + 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x3E, 0x78, 0x00, 0xF7, 0x80, 0x07, 0xFC, + 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7E, + 0x03, 0xF7, 0xF8, 0x3F, 0xFF, 0xC1, 0xFE, 0xFC, 0x07, 0xF3, 0xC7, 0x0F, + 0x1E, 0x7C, 0xF0, 0x73, 0xE7, 0x83, 0x9F, 0x7C, 0x1F, 0xFF, 0xC0, 0xFF, + 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFC, 0xF8, 0x07, 0xC7, 0xC0, + 0x1E, 0x3E, 0x00, 0xE0, 0xE0, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, 0xFC, 0x7F, + 0xBF, 0x07, 0xE1, 0xF1, 0xF0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x1F, 0xC0, + 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x7E, 0xFC, 0x1F, 0x8F, 0xC7, 0xE0, 0xFD, + 0xFE, 0x3F, 0xFF, 0xC7, 0xFF, 0xF0, 0x7F, 0x7E, 0x0F, 0xDF, 0xE3, 0xFF, + 0xFC, 0x7F, 0xBF, 0x07, 0xE3, 0xC0, 0x78, 0x3C, 0x0E, 0x07, 0x83, 0xC0, + 0x78, 0x70, 0x0F, 0x1E, 0x00, 0xE3, 0x80, 0x1E, 0xF0, 0x01, 0xDC, 0x00, + 0x3F, 0x80, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, + 0x38, 0x00, 0x0F, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x1F, + 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF9, 0xC7, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x81, 0xF0, 0xFC, 0x7E, 0x1F, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xF8, 0xFC, 0x3E, 0x0F, + 0x83, 0xF0, 0x3E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xF0, 0x7E, + 0x0F, 0xC3, 0xF0, 0x38, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x3E, 0x0F, 0xC1, 0xF8, 0x3E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x7C, 0x0F, 0xC1, 0xF0, + 0x7C, 0x3F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x83, 0xE1, 0xF8, + 0xFC, 0x3F, 0x07, 0x00, 0x1E, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xDF, 0xFC, + 0xFF, 0x3F, 0xFB, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0x78 }; + +const GFXglyph FreeMonoBold18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 21, 0, 1 }, // 0x20 ' ' + { 0, 5, 22, 21, 8, -21 }, // 0x21 '!' + { 14, 11, 10, 21, 5, -20 }, // 0x22 '"' + { 28, 16, 25, 21, 3, -22 }, // 0x23 '#' + { 78, 14, 28, 21, 4, -23 }, // 0x24 '$' + { 127, 15, 21, 21, 3, -20 }, // 0x25 '%' + { 167, 15, 20, 21, 3, -19 }, // 0x26 '&' + { 205, 4, 10, 21, 8, -20 }, // 0x27 ''' + { 210, 8, 27, 21, 9, -21 }, // 0x28 '(' + { 237, 8, 27, 21, 4, -21 }, // 0x29 ')' + { 264, 16, 15, 21, 3, -21 }, // 0x2A '*' + { 294, 16, 19, 21, 3, -18 }, // 0x2B '+' + { 332, 7, 10, 21, 5, -3 }, // 0x2C ',' + { 341, 19, 4, 21, 1, -11 }, // 0x2D '-' + { 351, 5, 5, 21, 8, -4 }, // 0x2E '.' + { 355, 15, 28, 21, 3, -23 }, // 0x2F '/' + { 408, 16, 23, 21, 3, -22 }, // 0x30 '0' + { 454, 15, 22, 21, 3, -21 }, // 0x31 '1' + { 496, 15, 23, 21, 3, -22 }, // 0x32 '2' + { 540, 16, 23, 21, 3, -22 }, // 0x33 '3' + { 586, 15, 21, 21, 3, -20 }, // 0x34 '4' + { 626, 17, 22, 21, 2, -21 }, // 0x35 '5' + { 673, 15, 23, 21, 4, -22 }, // 0x36 '6' + { 717, 15, 22, 21, 3, -21 }, // 0x37 '7' + { 759, 15, 23, 21, 3, -22 }, // 0x38 '8' + { 803, 15, 23, 21, 4, -22 }, // 0x39 '9' + { 847, 5, 16, 21, 8, -15 }, // 0x3A ':' + { 857, 7, 22, 21, 5, -15 }, // 0x3B ';' + { 877, 18, 16, 21, 1, -17 }, // 0x3C '<' + { 913, 19, 10, 21, 1, -14 }, // 0x3D '=' + { 937, 18, 16, 21, 2, -17 }, // 0x3E '>' + { 973, 15, 21, 21, 4, -20 }, // 0x3F '?' + { 1013, 15, 27, 21, 3, -21 }, // 0x40 '@' + { 1064, 22, 21, 21, -1, -20 }, // 0x41 'A' + { 1122, 20, 21, 21, 1, -20 }, // 0x42 'B' + { 1175, 19, 21, 21, 1, -20 }, // 0x43 'C' + { 1225, 18, 21, 21, 2, -20 }, // 0x44 'D' + { 1273, 19, 21, 21, 1, -20 }, // 0x45 'E' + { 1323, 19, 21, 21, 1, -20 }, // 0x46 'F' + { 1373, 20, 21, 21, 1, -20 }, // 0x47 'G' + { 1426, 21, 21, 21, 0, -20 }, // 0x48 'H' + { 1482, 14, 21, 21, 4, -20 }, // 0x49 'I' + { 1519, 19, 21, 21, 2, -20 }, // 0x4A 'J' + { 1569, 20, 21, 21, 1, -20 }, // 0x4B 'K' + { 1622, 18, 21, 21, 2, -20 }, // 0x4C 'L' + { 1670, 23, 21, 21, -1, -20 }, // 0x4D 'M' + { 1731, 20, 21, 21, 1, -20 }, // 0x4E 'N' + { 1784, 20, 21, 21, 1, -20 }, // 0x4F 'O' + { 1837, 18, 21, 21, 1, -20 }, // 0x50 'P' + { 1885, 20, 26, 21, 1, -20 }, // 0x51 'Q' + { 1950, 21, 21, 21, 0, -20 }, // 0x52 'R' + { 2006, 17, 21, 21, 2, -20 }, // 0x53 'S' + { 2051, 19, 21, 21, 1, -20 }, // 0x54 'T' + { 2101, 21, 21, 21, 0, -20 }, // 0x55 'U' + { 2157, 23, 21, 21, -1, -20 }, // 0x56 'V' + { 2218, 21, 21, 21, 0, -20 }, // 0x57 'W' + { 2274, 19, 21, 21, 1, -20 }, // 0x58 'X' + { 2324, 20, 21, 21, 1, -20 }, // 0x59 'Y' + { 2377, 16, 21, 21, 3, -20 }, // 0x5A 'Z' + { 2419, 8, 27, 21, 9, -21 }, // 0x5B '[' + { 2446, 15, 28, 21, 3, -23 }, // 0x5C '\' + { 2499, 8, 27, 21, 4, -21 }, // 0x5D ']' + { 2526, 15, 11, 21, 3, -21 }, // 0x5E '^' + { 2547, 21, 4, 21, 0, 4 }, // 0x5F '_' + { 2558, 6, 6, 21, 6, -22 }, // 0x60 '`' + { 2563, 19, 16, 21, 1, -15 }, // 0x61 'a' + { 2601, 19, 22, 21, 1, -21 }, // 0x62 'b' + { 2654, 17, 16, 21, 2, -15 }, // 0x63 'c' + { 2688, 20, 22, 21, 1, -21 }, // 0x64 'd' + { 2743, 18, 16, 21, 1, -15 }, // 0x65 'e' + { 2779, 16, 22, 21, 4, -21 }, // 0x66 'f' + { 2823, 19, 23, 21, 1, -15 }, // 0x67 'g' + { 2878, 21, 22, 21, 0, -21 }, // 0x68 'h' + { 2936, 16, 22, 21, 3, -21 }, // 0x69 'i' + { 2980, 12, 29, 21, 5, -21 }, // 0x6A 'j' + { 3024, 18, 22, 21, 2, -21 }, // 0x6B 'k' + { 3074, 16, 22, 21, 3, -21 }, // 0x6C 'l' + { 3118, 22, 16, 21, -1, -15 }, // 0x6D 'm' + { 3162, 20, 16, 21, 0, -15 }, // 0x6E 'n' + { 3202, 19, 16, 21, 1, -15 }, // 0x6F 'o' + { 3240, 21, 23, 21, 0, -15 }, // 0x70 'p' + { 3301, 21, 23, 22, 1, -15 }, // 0x71 'q' + { 3362, 17, 16, 21, 3, -15 }, // 0x72 'r' + { 3396, 16, 16, 21, 3, -15 }, // 0x73 's' + { 3428, 17, 21, 21, 1, -20 }, // 0x74 't' + { 3473, 18, 16, 21, 1, -15 }, // 0x75 'u' + { 3509, 21, 16, 21, 0, -15 }, // 0x76 'v' + { 3551, 21, 16, 21, 0, -15 }, // 0x77 'w' + { 3593, 19, 16, 21, 1, -15 }, // 0x78 'x' + { 3631, 19, 23, 21, 1, -15 }, // 0x79 'y' + { 3686, 14, 16, 21, 3, -15 }, // 0x7A 'z' + { 3714, 10, 27, 21, 6, -21 }, // 0x7B '{' + { 3748, 4, 27, 21, 9, -21 }, // 0x7C '|' + { 3762, 10, 27, 21, 6, -21 }, // 0x7D '}' + { 3796, 17, 8, 21, 2, -13 } }; // 0x7E '~' + +const GFXfont FreeMonoBold18pt7b PROGMEM = { + (uint8_t *)FreeMonoBold18pt7bBitmaps, + (GFXglyph *)FreeMonoBold18pt7bGlyphs, + 0x20, 0x7E, 35 }; + +// Approx. 4485 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold24pt7b.h new file mode 100644 index 0000000..aa0dcd0 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold24pt7b.h @@ -0,0 +1,672 @@ +const uint8_t FreeMonoBold24pt7bBitmaps[] PROGMEM = { + 0x38, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF3, 0xE7, 0xCF, + 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE3, 0x82, 0x00, 0x00, 0x00, 0x71, 0xF7, + 0xFF, 0xEF, 0x9E, 0x00, 0xFC, 0x7E, 0xF8, 0x7D, 0xF0, 0xFB, 0xE1, 0xF7, + 0xC3, 0xEF, 0x87, 0xDF, 0x0F, 0xBE, 0x1F, 0x38, 0x1C, 0x70, 0x38, 0xE0, + 0x71, 0xC0, 0xE3, 0x81, 0xC7, 0x03, 0x80, 0x01, 0xC1, 0xC0, 0x0F, 0x8F, + 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, 0x8F, 0x80, + 0x7E, 0x3E, 0x01, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x03, 0xFF, + 0xFF, 0x9F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFD, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, + 0x81, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0x1F, 0x00, 0x7C, 0x7C, 0x1F, + 0xFF, 0xFC, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x9F, 0xFF, + 0xFC, 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, + 0x0F, 0x8F, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xE0, 0x0F, + 0x8F, 0x80, 0x3C, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x1F, 0xFF, 0x07, 0xFF, 0xF1, 0xFF, 0xFE, + 0x7F, 0xFF, 0xDF, 0xC1, 0xFB, 0xF0, 0x1F, 0x7C, 0x01, 0xEF, 0x80, 0x39, + 0xF8, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x03, 0xFF, 0xF0, + 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, + 0x80, 0x1F, 0xF8, 0x07, 0xFF, 0x81, 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xCF, + 0xFF, 0xF1, 0xDF, 0xFC, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x01, 0xC0, 0x00, + 0x0F, 0x80, 0x00, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0xF0, 0xE0, 0x0F, 0x07, + 0x80, 0x70, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xF0, 0x78, 0x03, + 0xC3, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC1, 0xF0, 0xF8, 0x7F, 0x00, 0x3F, + 0xF0, 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x07, 0xE0, 0xF8, 0x38, + 0x1F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0x1E, 0x00, 0xF0, 0x78, 0x07, 0x01, + 0xC0, 0x38, 0x0E, 0x01, 0xC0, 0x70, 0x0F, 0x07, 0x80, 0x38, 0x78, 0x01, + 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0xFC, + 0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xC7, 0x00, 0x7C, + 0x10, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xC7, 0xCF, 0xFF, + 0x3F, 0x7E, 0xFF, 0xFF, 0xE7, 0xFF, 0xBE, 0x1F, 0xF9, 0xF0, 0x7F, 0x8F, + 0x83, 0xFC, 0x7C, 0x0F, 0xE3, 0xF0, 0x7F, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF, + 0xF9, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xE0, 0x00, 0xFD, 0xF7, 0xDF, + 0x7D, 0xF7, 0xDF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x01, 0x80, 0xF0, 0x7C, + 0x3F, 0x0F, 0xC7, 0xE1, 0xF8, 0xFC, 0x3E, 0x0F, 0x87, 0xC1, 0xF0, 0x7C, + 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, + 0x81, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0xF8, 0x3E, 0x0F, 0xC1, 0xF0, 0x7E, + 0x0F, 0x83, 0xF0, 0x7C, 0x1F, 0x03, 0xC0, 0x60, 0x3C, 0x0F, 0x83, 0xF0, + 0xFC, 0x1F, 0x83, 0xE0, 0xFC, 0x1F, 0x07, 0xC1, 0xF8, 0x3E, 0x0F, 0x83, + 0xE0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x1E, 0x0F, 0x83, 0xE0, 0xF8, 0x7C, 0x1F, 0x0F, 0xC3, 0xE1, 0xF8, 0x7C, + 0x3F, 0x0F, 0x83, 0xE0, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x10, 0x7C, 0x11, 0xF3, 0xE7, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0x87, 0xFF, 0xF0, 0x07, + 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0x80, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, + 0x1F, 0x8F, 0xC0, 0xF8, 0x3E, 0x03, 0x80, 0xE0, 0x00, 0x38, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x01, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x70, 0x00, 0x1F, + 0x8F, 0x87, 0xC7, 0xC3, 0xE1, 0xE1, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C, + 0x0E, 0x06, 0x00, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xEF, 0x80, + 0x00, 0x00, 0x60, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xF8, 0x00, + 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, + 0x1F, 0x83, 0xF1, 0xF8, 0x0F, 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF7, 0xC0, + 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, + 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00, + 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7D, 0xF0, 0x07, 0xCF, + 0x80, 0x3E, 0x7E, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, 0xFF, 0xF8, 0x3F, 0xFF, + 0x80, 0xFF, 0xF8, 0x03, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, + 0x3F, 0x80, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x7F, 0xF8, 0x0F, 0xEF, 0x80, + 0xFC, 0xF8, 0x07, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3F, 0xFF, 0xE7, + 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x01, 0xFC, + 0x00, 0x3F, 0xF8, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F, + 0x03, 0xFB, 0xF0, 0x07, 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFB, 0x80, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, + 0x0E, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, + 0xE0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x7E, 0x03, 0xF1, 0xC0, 0x0F, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x0F, + 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, + 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xFF, 0xC0, + 0x3F, 0xBF, 0xFF, 0xFD, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, + 0x1F, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07, + 0xF8, 0x00, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xEF, 0x80, 0x3E, 0xF8, 0x03, + 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x80, 0xF0, 0xF8, 0x1F, 0x0F, 0x81, + 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xC0, 0xF8, 0x78, 0x0F, 0x8F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, + 0x80, 0x07, 0xFE, 0x00, 0xFF, 0xF0, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, 0x07, + 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3, + 0xFF, 0xFC, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, + 0x01, 0xF0, 0x00, 0x0F, 0xBF, 0x00, 0x7F, 0xFF, 0x03, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF0, 0xFF, 0xFF, 0x83, 0xC0, 0xFE, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x03, 0xE0, 0x00, 0x3F, 0xF0, 0x03, 0xF7, 0xE0, 0x3F, 0xBF, 0xFF, 0xF9, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0x1F, 0xF0, 0x00, 0x00, + 0x1F, 0xC0, 0x0F, 0xFF, 0x01, 0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE1, + 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, + 0x7C, 0x00, 0x0F, 0x8F, 0xC0, 0xF9, 0xFF, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, + 0xCF, 0xFF, 0xFC, 0xFF, 0x0F, 0xEF, 0xE0, 0x3E, 0xFC, 0x03, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, 0xC0, 0x3F, 0x7E, + 0x03, 0xF3, 0xF0, 0x7E, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80, + 0x7F, 0xF0, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xF0, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x00, 0x01, 0xF8, 0x00, 0xFF, + 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xE0, 0x7E, 0xFC, + 0x03, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xF7, + 0xC0, 0x3E, 0x7E, 0x07, 0xE3, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0xFF, 0xF0, + 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xC0, 0x3E, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xF7, 0xE0, + 0x7E, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x80, 0xFF, 0xF0, 0x03, + 0xFC, 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xE0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8, + 0x7F, 0xFF, 0xC7, 0xE0, 0xFE, 0xFC, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x07, 0xF7, 0xE0, + 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0x9F, 0x03, + 0xF1, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, + 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xF0, 0x7F, 0xFE, 0x0F, 0xFF, 0xC0, + 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, + 0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, + 0xFF, 0xFF, 0xEF, 0x80, 0x0F, 0x87, 0xF1, 0xFC, 0x7F, 0x1F, 0xC3, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0x1F, 0x87, 0xE1, 0xF0, 0xFC, 0x3E, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x1C, + 0x07, 0x01, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x7F, + 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, + 0x01, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, + 0xFF, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0x80, + 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1E, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, + 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF0, 0x01, + 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0, + 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x01, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xC0, 0x7E, 0xF8, 0x03, 0xFF, 0x80, 0x1F, + 0x70, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x3F, + 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0x80, 0x3F, 0xF8, + 0x0F, 0xFF, 0x83, 0xE0, 0xF8, 0x78, 0x07, 0x1E, 0x00, 0xF3, 0x80, 0x0E, + 0x70, 0x01, 0xDE, 0x00, 0x3B, 0x80, 0x3F, 0x70, 0x1F, 0xEE, 0x07, 0xFD, + 0xC1, 0xFF, 0xB8, 0x7E, 0x77, 0x0F, 0x0E, 0xE3, 0xC1, 0xDC, 0x70, 0x3B, + 0x8E, 0x07, 0x71, 0xC0, 0xEE, 0x3C, 0x1D, 0xC3, 0xC3, 0xB8, 0x7F, 0xF7, + 0x07, 0xFF, 0xE0, 0x7F, 0xFC, 0x03, 0xFB, 0xC0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x61, 0xF0, 0x3E, 0x1F, 0xFF, 0xC3, + 0xFF, 0xF0, 0x1F, 0xFC, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F, + 0xFE, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0xFE, + 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x0F, 0xBE, 0x00, + 0x00, 0x7D, 0xF8, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x03, + 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF0, 0x3F, 0x00, 0x0F, 0x80, + 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xF8, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0xF8, 0x00, 0xF8, 0x0F, + 0x80, 0x03, 0xE1, 0xFF, 0x80, 0xFF, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, + 0x7F, 0xFF, 0xFF, 0x83, 0xFF, 0xDF, 0xF8, 0x0F, 0xFC, 0x7F, 0xFF, 0xC0, + 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, + 0xFE, 0x07, 0xC0, 0x1F, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, + 0x00, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFC, 0x1F, 0x00, 0x3F, 0x87, 0xC0, 0x03, 0xF1, 0xF0, 0x00, 0x7C, 0x7C, + 0x00, 0x1F, 0x1F, 0x00, 0x07, 0xC7, 0xC0, 0x03, 0xF7, 0xFF, 0xFF, 0xFB, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xE7, 0x01, 0xFF, 0xFF, 0xC1, 0xFF, + 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFE, 0x07, 0xF8, 0xFC, 0x01, 0xFC, 0xFC, + 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x00, 0x03, 0x9F, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x39, 0xFC, 0x00, + 0x7C, 0x7F, 0x80, 0xFF, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF, + 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, + 0xF0, 0x0F, 0xF0, 0xF8, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, + 0x1F, 0x00, 0x0F, 0xCF, 0x80, 0x03, 0xE7, 0xC0, 0x01, 0xF3, 0xE0, 0x00, + 0xF9, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x3E, 0x00, + 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0x80, 0x07, 0xE7, 0xC0, 0x03, 0xE3, 0xE0, + 0x03, 0xF1, 0xF0, 0x07, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, + 0x7F, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, + 0xF0, 0xF8, 0x00, 0xF8, 0x7C, 0x00, 0x7C, 0x3E, 0x0E, 0x3E, 0x1F, 0x0F, + 0x9F, 0x0F, 0x87, 0xC7, 0x07, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x1F, + 0x0F, 0x80, 0x0F, 0x87, 0xC3, 0x87, 0xC1, 0xC3, 0xE3, 0xE0, 0x01, 0xF1, + 0xF0, 0x00, 0xF8, 0xF8, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xF8, 0xF8, 0x00, 0x7C, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, 0x1F, + 0x07, 0x0F, 0x8F, 0x87, 0xC3, 0x87, 0xC3, 0xE0, 0x03, 0xFF, 0xF0, 0x01, + 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, + 0x1F, 0x0F, 0x80, 0x0F, 0x87, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, 0xE0, + 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, + 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, + 0x7F, 0x8E, 0x00, 0xFF, 0xF7, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE1, + 0xFF, 0xFF, 0xF1, 0xFE, 0x03, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x3E, + 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x07, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x0F, + 0xFE, 0xF8, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0x00, + 0xFF, 0xFF, 0xC0, 0x01, 0xF3, 0xF0, 0x00, 0xF9, 0xFC, 0x00, 0x7C, 0x7F, + 0x80, 0xFE, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xE1, 0xFF, 0x1F, 0xFC, 0xFF, + 0xE7, 0xFF, 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x3F, 0xE1, 0xFF, 0x07, 0xC0, + 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, + 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, + 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xF8, 0x1F, 0x00, + 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, + 0x00, 0x3E, 0x07, 0xC0, 0x0F, 0x87, 0xFE, 0x1F, 0xFB, 0xFF, 0xCF, 0xFF, + 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xF7, 0xFE, 0x1F, 0xF8, 0x7F, 0xFF, + 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFC, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, + 0xE0, 0x3F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, + 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x1F, 0x83, + 0xF8, 0x3F, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, + 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xE0, 0xFF, 0x9F, 0xFE, + 0x3F, 0xFB, 0xFF, 0xC7, 0xFF, 0x7F, 0xF8, 0xFF, 0xE7, 0xFE, 0x0F, 0xF8, + 0x3E, 0x01, 0xF8, 0x07, 0xC0, 0xFE, 0x00, 0xF8, 0x3F, 0x80, 0x1F, 0x0F, + 0xE0, 0x03, 0xE3, 0xF8, 0x00, 0x7D, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01, + 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0xFE, 0x7F, + 0x00, 0x1F, 0x87, 0xF0, 0x03, 0xE0, 0x7E, 0x00, 0x7C, 0x07, 0xE0, 0x0F, + 0x80, 0x7E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x00, 0xF8, 0x1F, 0xF8, 0x1F, + 0xF7, 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x07, 0xFD, 0xFF, + 0x80, 0x7F, 0x00, 0x7F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0x80, + 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x0F, 0x80, 0x0E, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, 0xC1, + 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, 0x7D, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0xFF, 0xFF, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0xFF, 0x80, 0x0F, 0xF9, + 0xFF, 0x00, 0x1F, 0xF3, 0xFF, 0x00, 0x7F, 0xE3, 0xFE, 0x00, 0xFF, 0x83, + 0xFE, 0x03, 0xFE, 0x07, 0xFC, 0x07, 0xFC, 0x0F, 0xFC, 0x1F, 0xF8, 0x1F, + 0xF8, 0x3F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0x7D, 0xF1, 0xF7, 0xC0, 0xFB, + 0xE3, 0xEF, 0x81, 0xF7, 0xEF, 0xDF, 0x03, 0xE7, 0xDF, 0x3E, 0x07, 0xCF, + 0xFE, 0x7C, 0x0F, 0x8F, 0xF8, 0xF8, 0x1F, 0x1F, 0xF1, 0xF0, 0x3E, 0x1F, + 0xE3, 0xE0, 0x7C, 0x3F, 0x87, 0xC0, 0xF8, 0x3F, 0x0F, 0x81, 0xF0, 0x00, + 0x1F, 0x03, 0xE0, 0x00, 0x3E, 0x1F, 0xF8, 0x03, 0xFF, 0x7F, 0xF8, 0x0F, + 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFD, 0xFF, 0x80, 0x3F, + 0xF0, 0x7F, 0x00, 0x7F, 0xEF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, + 0xFC, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, 0xFF, 0x00, 0xF8, 0x1F, 0xF0, + 0x0F, 0x81, 0xFF, 0x80, 0xF8, 0x1F, 0xFC, 0x0F, 0x81, 0xFF, 0xC0, 0xF8, + 0x1F, 0x7E, 0x0F, 0x81, 0xF3, 0xF0, 0xF8, 0x1F, 0x3F, 0x0F, 0x81, 0xF1, + 0xF8, 0xF8, 0x1F, 0x0F, 0xCF, 0x81, 0xF0, 0xFC, 0xF8, 0x1F, 0x07, 0xEF, + 0x81, 0xF0, 0x3F, 0xF8, 0x1F, 0x03, 0xFF, 0x81, 0xF0, 0x1F, 0xF8, 0x1F, + 0x00, 0xFF, 0x81, 0xF0, 0x0F, 0xF8, 0x7F, 0xE0, 0x7F, 0x8F, 0xFF, 0x03, + 0xF8, 0xFF, 0xF0, 0x3F, 0x8F, 0xFF, 0x01, 0xF8, 0x7F, 0xE0, 0x0F, 0x80, + 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xFE, 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, + 0xF8, 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, + 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, + 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, + 0x7F, 0xF0, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xE7, 0xE0, 0x00, 0xFC, 0x7E, + 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE0, 0xFF, 0x07, 0xF8, 0x0F, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x03, + 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFC, 0x7F, 0xFF, 0xFE, 0x1F, 0x00, 0xFE, 0x1F, 0x00, 0x3F, 0x1F, + 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, + 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF, + 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xE0, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, 0x0F, 0xE1, 0xF8, + 0x00, 0xFC, 0x7E, 0x00, 0x0F, 0xCF, 0x80, 0x00, 0xFB, 0xF0, 0x00, 0x1F, + 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x07, 0xFE, 0x00, + 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xFD, + 0xF0, 0x00, 0x1F, 0x3F, 0x00, 0x07, 0xE7, 0xF0, 0x01, 0xF8, 0x7F, 0x00, + 0x7F, 0x07, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x03, 0xFF, 0x87, 0x80, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x07, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x0F, 0x01, 0xF8, 0x00, 0x7F, 0xFF, + 0x80, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, + 0x7F, 0xFF, 0xFE, 0x00, 0xF8, 0x07, 0xE0, 0x0F, 0x80, 0x3F, 0x00, 0xF8, + 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3F, + 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xF0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xF8, 0x3F, + 0x80, 0x0F, 0x81, 0xFC, 0x00, 0xF8, 0x0F, 0xE0, 0x0F, 0x80, 0x7E, 0x00, + 0xF8, 0x03, 0xF0, 0x7F, 0xF0, 0x1F, 0xEF, 0xFF, 0x81, 0xFF, 0xFF, 0xF8, + 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0x7F, 0xF0, 0x07, 0xE0, 0x01, 0xFC, 0x70, + 0x1F, 0xFD, 0xE0, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFC, + 0x0F, 0xE7, 0xE0, 0x1F, 0x9F, 0x00, 0x3E, 0x7C, 0x00, 0xF9, 0xF0, 0x01, + 0xC7, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, + 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xE0, 0x00, + 0x0F, 0xDC, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0xC0, 0x0F, + 0xFF, 0xC0, 0xFE, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x1C, + 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xF0, 0x7F, + 0xE0, 0xF8, 0x3F, 0xF0, 0x7C, 0x1F, 0xF8, 0x3E, 0x0F, 0xFC, 0x1F, 0x07, + 0xFE, 0x0F, 0x83, 0xEE, 0x07, 0xC0, 0xE0, 0x03, 0xE0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE1, + 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, + 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, + 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, + 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, + 0x81, 0xF0, 0x00, 0xF8, 0x1F, 0x80, 0x1F, 0x80, 0xF8, 0x01, 0xF0, 0x0F, + 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, + 0x80, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x1F, 0xFB, + 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0x7F, + 0xE0, 0x1F, 0xF8, 0x7C, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x03, 0xE0, + 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, + 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x03, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0xF8, + 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x7E, 0x1F, 0x00, 0x00, 0xF8, 0x7C, 0x00, + 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x1F, 0xBE, 0x00, 0x00, + 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07, + 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x7F, 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0xE0, 0x7F, 0xE3, 0xE0, 0x00, 0x3C, 0x3E, + 0x0F, 0x83, 0xC3, 0xE1, 0xF8, 0x3C, 0x3E, 0x1F, 0x87, 0xC3, 0xE1, 0xFC, + 0x7C, 0x3E, 0x3F, 0xC7, 0xC1, 0xE3, 0xFC, 0x7C, 0x1F, 0x3F, 0xE7, 0xC1, + 0xF7, 0xFE, 0x78, 0x1F, 0x7F, 0xE7, 0x81, 0xF7, 0x9F, 0xF8, 0x1F, 0xF9, + 0xFF, 0x81, 0xFF, 0x9F, 0xF8, 0x0F, 0xF9, 0xFF, 0x80, 0xFF, 0x0F, 0xF8, + 0x0F, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFE, + 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x3F, + 0x00, 0x7F, 0x80, 0xFF, 0x3F, 0xF0, 0x7F, 0xEF, 0xFC, 0x1F, 0xFB, 0xFF, + 0x07, 0xFE, 0x7F, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xFC, 0x0F, 0x80, + 0x1F, 0x87, 0xC0, 0x03, 0xF3, 0xE0, 0x00, 0xFF, 0xF8, 0x00, 0x1F, 0xFC, + 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, + 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0xFC, 0xF8, 0x00, + 0x7E, 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, + 0x07, 0xFC, 0x0F, 0xFB, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8, + 0x7F, 0xF7, 0xFC, 0x0F, 0xF8, 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0x7F, 0x87, 0xE0, 0x1F, + 0x80, 0xFC, 0x07, 0xC0, 0x1F, 0x03, 0xE0, 0x03, 0xE1, 0xF8, 0x00, 0xFC, + 0x7C, 0x00, 0x1F, 0xBE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0xE0, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0xF3, + 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x3E, 0x03, + 0xF1, 0xF0, 0x1F, 0x8F, 0x81, 0xF8, 0x7C, 0x1F, 0x83, 0xE1, 0xF8, 0x0E, + 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x70, 0x7E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, + 0x01, 0xF7, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xBF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBE, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, + 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, + 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x60, 0x00, 0x0F, 0x00, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, + 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x07, + 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, + 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0xC0, 0x00, 0x40, 0x00, 0x06, 0x00, 0x00, 0xF0, + 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0x7F, 0xE0, 0x0F, 0xFF, 0x00, 0xFF, + 0xF8, 0x1F, 0x9F, 0x83, 0xF0, 0xFC, 0x7E, 0x07, 0xEF, 0xC0, 0x3F, 0xF8, + 0x01, 0xFF, 0x80, 0x0F, 0x70, 0x00, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xE0, 0x78, 0x3E, 0x0F, 0xC3, 0xF0, 0x7C, 0x1E, 0x06, 0x01, 0xFF, + 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x01, 0xFF, + 0xF8, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, + 0xF8, 0x7F, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x03, + 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFE, 0xFE, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x0F, + 0xE0, 0x03, 0xEF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xF8, 0x3F, 0xE0, 0x7F, 0x07, 0xF0, 0x03, 0xF0, 0xFC, 0x00, + 0x3E, 0x1F, 0x80, 0x07, 0xE3, 0xE0, 0x00, 0x7C, 0x7C, 0x00, 0x0F, 0x8F, + 0x80, 0x01, 0xF1, 0xF0, 0x00, 0x3E, 0x3E, 0x00, 0x07, 0xC7, 0xE0, 0x01, + 0xF8, 0xFC, 0x00, 0x3E, 0x1F, 0xC0, 0x0F, 0xCF, 0xFE, 0x07, 0xF3, 0xFF, + 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0xFE, 0x7F, 0xF0, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x18, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0x81, 0xFC, 0x7E, 0x00, + 0x7C, 0x7C, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, 0x38, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7C, 0x00, 0x06, 0x7E, 0x00, 0x1F, 0x7F, 0x80, 0x7F, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x00, 0xFF, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0xF8, 0x00, 0xFE, 0x3E, 0x00, 0xFF, 0xEF, 0x80, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFE, 0x1F, 0xE0, 0xFF, 0x87, 0xE0, + 0x0F, 0xE1, 0xF0, 0x01, 0xF8, 0xFC, 0x00, 0x7E, 0x3E, 0x00, 0x0F, 0x8F, + 0x80, 0x03, 0xE3, 0xE0, 0x00, 0xF8, 0xF8, 0x00, 0x3E, 0x3E, 0x00, 0x0F, + 0x8F, 0xC0, 0x07, 0xE1, 0xF0, 0x01, 0xF8, 0x7E, 0x00, 0xFE, 0x0F, 0xE0, + 0x7F, 0xE3, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, + 0xFF, 0xEF, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, + 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x7F, 0x81, 0xFC, + 0x7E, 0x00, 0x7E, 0xFC, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x80, 0x7E, + 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, + 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, + 0xFF, 0xFF, 0x07, 0xFF, 0xF8, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, + 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x01, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE1, 0xFF, + 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xBF, 0x83, 0xFF, 0xFF, 0xE3, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFB, 0xFC, 0x3F, 0xF9, 0xF8, 0x07, 0xF0, + 0xF8, 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0x7C, 0x00, 0x3E, 0x3E, 0x00, 0x1F, + 0x1F, 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xC0, 0x03, 0xE3, 0xF0, 0x03, + 0xF0, 0xF8, 0x01, 0xF8, 0x7E, 0x01, 0xFC, 0x3F, 0xC3, 0xFE, 0x0F, 0xFF, + 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xC0, 0x3F, 0xFB, 0xE0, 0x07, + 0xF1, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0x00, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFE, 0x00, + 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x0F, 0xC0, 0x07, 0xCF, 0xFC, 0x01, + 0xF7, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, 0xFC, 0x1F, + 0x81, 0xFC, 0x03, 0xE0, 0x7E, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, 0xC0, + 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, 0x07, + 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, 0x1F, 0x00, 0x3E, + 0x1F, 0xF0, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, + 0xFF, 0xDF, 0xF0, 0x3F, 0xE0, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, + 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7F, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, + 0xFF, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3F, 0xBF, 0xFF, 0xBF, 0xFF, + 0x9F, 0xFF, 0xCF, 0xFF, 0x83, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, + 0x87, 0xFC, 0x07, 0xC7, 0xFF, 0x03, 0xE3, 0xFF, 0x81, 0xF1, 0xFF, 0xC0, + 0xF8, 0x7F, 0xC0, 0x7C, 0xFE, 0x00, 0x3E, 0xFE, 0x00, 0x1F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0xE0, + 0x00, 0xFF, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0x3E, 0x3F, 0x80, 0x1F, 0x0F, + 0xE0, 0x3F, 0x81, 0xFF, 0xBF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, + 0x7F, 0xFB, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0xFE, + 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x03, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xF8, + 0x00, 0x3C, 0x1F, 0x00, 0xFD, 0xFC, 0xFF, 0x07, 0xFF, 0xFF, 0xFE, 0x1F, + 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0xF0, 0xFF, 0x1F, 0x87, 0xC1, 0xF8, + 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, + 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x1F, 0x07, 0xC1, 0xF1, 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF, + 0xF1, 0xFC, 0x7F, 0xFF, 0xC7, 0xF1, 0xFD, 0xFE, 0x1F, 0x87, 0xE0, 0x00, + 0x1F, 0x80, 0x1F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFE, 0x0F, 0xFF, 0xFF, 0x87, + 0xFF, 0xFF, 0xC1, 0xFF, 0x07, 0xF0, 0x7F, 0x01, 0xF8, 0x3F, 0x00, 0x7C, + 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0x83, 0xE0, 0x07, + 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, 0x3E, 0x00, + 0x7C, 0x1F, 0x00, 0x3E, 0x3F, 0xE0, 0x7F, 0xBF, 0xF8, 0x7F, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFE, 0x1F, 0xFB, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x01, + 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1, + 0xFE, 0x0F, 0xF1, 0xFC, 0x01, 0xFC, 0xFC, 0x00, 0x7E, 0xFC, 0x00, 0x1F, + 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x7E, 0x7F, 0x00, + 0x7F, 0x1F, 0xC0, 0xFF, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x03, + 0xF9, 0xFF, 0xC0, 0x7F, 0xBF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, + 0xFF, 0xC3, 0xFF, 0x83, 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0xFC, 0x00, 0x7E, + 0x0F, 0xC0, 0x03, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, + 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x03, + 0xF0, 0xFE, 0x00, 0x7E, 0x0F, 0xF8, 0x1F, 0xE0, 0xFF, 0xFF, 0xFC, 0x0F, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x0F, 0x9F, 0xFC, 0x00, 0xF8, 0x7F, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xFC, + 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x3F, 0xF9, 0xFC, 0x0F, 0xFF, 0xDF, 0xE1, 0xFF, 0xFF, 0xFE, 0x3F, + 0xFF, 0xFF, 0xE3, 0xF8, 0x1F, 0xFC, 0x7F, 0x00, 0x7F, 0x07, 0xC0, 0x03, + 0xF0, 0xFC, 0x00, 0x3F, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, + 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFC, 0x00, + 0x3F, 0x07, 0xE0, 0x07, 0xF0, 0x7F, 0x81, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, + 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x9F, 0x00, 0x0F, + 0xE1, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0x00, + 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01, + 0xF0, 0x3F, 0xC7, 0xFC, 0x7F, 0xCF, 0xFE, 0x7F, 0xDF, 0xFF, 0x7F, 0xFF, + 0xFF, 0x3F, 0xFF, 0x0E, 0x07, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, + 0x00, 0x07, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, + 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xC0, + 0x00, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xC0, 0x03, 0xFC, 0x60, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE7, 0xFF, 0xFF, 0x3F, 0x01, 0xF9, 0xF0, 0x07, 0xCF, 0xC0, + 0x1C, 0x7F, 0xF0, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, + 0x3F, 0xFF, 0x00, 0x0F, 0xFD, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0x3F, + 0xFF, 0xC0, 0x07, 0xF8, 0x00, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0xFF, + 0xF8, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, + 0x80, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, + 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x03, 0x83, 0xF0, 0x1F, 0x87, + 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03, + 0xFC, 0x00, 0x7F, 0x01, 0xFE, 0x7F, 0x81, 0xFF, 0x3F, 0xC0, 0xFF, 0x9F, + 0xE0, 0x7F, 0xC7, 0xF0, 0x1F, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0xF8, + 0x3E, 0x00, 0x7C, 0x1F, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, + 0x83, 0xE0, 0x07, 0xC1, 0xF0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x01, + 0xF8, 0x3F, 0x01, 0xFC, 0x1F, 0xC1, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF, + 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0x3F, 0xF3, 0xF0, 0x03, 0xF0, 0x00, 0x7F, + 0xE0, 0x7F, 0xEF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x0F, + 0xFF, 0x7F, 0xE0, 0x7F, 0xE0, 0xF8, 0x01, 0xF0, 0x0F, 0xC0, 0x1F, 0x00, + 0x7C, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF0, + 0x7C, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF8, 0xF8, 0x00, 0x0F, 0x9F, 0x00, + 0x00, 0xFD, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x7F, 0x80, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, + 0xFC, 0x03, 0xFF, 0x7F, 0x80, 0x1F, 0xE1, 0xF0, 0xF8, 0x7C, 0x1F, 0x1F, + 0x87, 0xC1, 0xF1, 0xF8, 0xFC, 0x1F, 0x1F, 0xCF, 0x80, 0xFB, 0xFC, 0xF8, + 0x0F, 0xBF, 0xDF, 0x80, 0xFB, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F, + 0xDF, 0xF0, 0x07, 0xF9, 0xFF, 0x00, 0x7F, 0x9F, 0xE0, 0x07, 0xF0, 0xFE, + 0x00, 0x3F, 0x0F, 0xE0, 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03, + 0xE0, 0x3C, 0x00, 0x3F, 0xC0, 0xFF, 0x1F, 0xF8, 0x7F, 0xE7, 0xFE, 0x1F, + 0xF9, 0xFF, 0x87, 0xFE, 0x3F, 0xC0, 0xFF, 0x03, 0xF8, 0x7F, 0x00, 0x7F, + 0x3F, 0x80, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0xFE, + 0x00, 0xFE, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x7F, 0xC0, 0xFF, 0xBF, 0xF8, + 0x7F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0x7F, 0xC0, 0xFF, 0x80, + 0x7F, 0x80, 0x7F, 0xBF, 0xF0, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03, + 0xFF, 0x7F, 0x80, 0x7F, 0x8F, 0xC0, 0x07, 0x81, 0xF0, 0x03, 0xE0, 0x7E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xF0, 0x3E, 0x00, 0x7C, 0x0F, 0x80, + 0x0F, 0x87, 0xC0, 0x03, 0xE1, 0xF0, 0x00, 0x7C, 0xF8, 0x00, 0x1F, 0xFE, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x07, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x3F, 0xBE, 0x0F, 0xC3, 0x83, 0xF0, 0x00, 0xFC, 0x00, + 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xC0, 0x3B, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x78, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0x07, + 0xF8, 0x1F, 0x80, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x0F, 0x81, 0xFE, 0x0F, + 0xF0, 0x3F, 0x80, 0xFF, 0x01, 0xFE, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, + 0x07, 0xF8, 0x0F, 0xF0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x77, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE0, 0x78, 0x03, 0xF0, 0x0F, + 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, + 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, + 0x07, 0xC0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x03, 0xFC, 0x1F, 0xE0, 0xFC, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x83, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0x78, + 0x00, 0x07, 0x80, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0x03, 0x9F, 0xFE, 0x1F, + 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0x87, 0xFF, 0x9C, 0x0F, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x1F, 0x00 }; + +const GFXglyph FreeMonoBold24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 28, 0, 1 }, // 0x20 ' ' + { 0, 7, 31, 28, 10, -29 }, // 0x21 '!' + { 28, 15, 14, 28, 6, -28 }, // 0x22 '"' + { 55, 22, 34, 28, 3, -30 }, // 0x23 '#' + { 149, 19, 38, 28, 5, -31 }, // 0x24 '$' + { 240, 21, 30, 28, 4, -28 }, // 0x25 '%' + { 319, 21, 28, 28, 4, -26 }, // 0x26 '&' + { 393, 6, 14, 28, 11, -28 }, // 0x27 ''' + { 404, 10, 37, 28, 12, -29 }, // 0x28 '(' + { 451, 10, 37, 28, 6, -29 }, // 0x29 ')' + { 498, 21, 19, 28, 4, -28 }, // 0x2A '*' + { 548, 23, 26, 28, 3, -25 }, // 0x2B '+' + { 623, 9, 14, 28, 7, -6 }, // 0x2C ',' + { 639, 24, 5, 28, 2, -15 }, // 0x2D '-' + { 654, 7, 6, 28, 11, -4 }, // 0x2E '.' + { 660, 20, 38, 28, 4, -32 }, // 0x2F '/' + { 755, 21, 31, 28, 4, -29 }, // 0x30 '0' + { 837, 20, 29, 28, 4, -28 }, // 0x31 '1' + { 910, 21, 30, 28, 3, -29 }, // 0x32 '2' + { 989, 21, 31, 28, 4, -29 }, // 0x33 '3' + { 1071, 20, 28, 28, 4, -27 }, // 0x34 '4' + { 1141, 21, 31, 28, 4, -29 }, // 0x35 '5' + { 1223, 20, 31, 28, 5, -29 }, // 0x36 '6' + { 1301, 20, 30, 28, 4, -29 }, // 0x37 '7' + { 1376, 20, 31, 28, 4, -29 }, // 0x38 '8' + { 1454, 20, 31, 28, 5, -29 }, // 0x39 '9' + { 1532, 7, 22, 28, 11, -20 }, // 0x3A ':' + { 1552, 10, 28, 28, 6, -20 }, // 0x3B ';' + { 1587, 24, 21, 28, 2, -23 }, // 0x3C '<' + { 1650, 24, 14, 28, 2, -19 }, // 0x3D '=' + { 1692, 23, 22, 28, 3, -23 }, // 0x3E '>' + { 1756, 20, 29, 28, 5, -27 }, // 0x3F '?' + { 1829, 19, 36, 28, 4, -28 }, // 0x40 '@' + { 1915, 29, 27, 28, -1, -26 }, // 0x41 'A' + { 2013, 26, 27, 28, 1, -26 }, // 0x42 'B' + { 2101, 25, 29, 28, 2, -27 }, // 0x43 'C' + { 2192, 25, 27, 28, 1, -26 }, // 0x44 'D' + { 2277, 25, 27, 28, 1, -26 }, // 0x45 'E' + { 2362, 25, 27, 28, 1, -26 }, // 0x46 'F' + { 2447, 25, 29, 28, 2, -27 }, // 0x47 'G' + { 2538, 26, 27, 28, 1, -26 }, // 0x48 'H' + { 2626, 19, 27, 28, 5, -26 }, // 0x49 'I' + { 2691, 25, 28, 28, 3, -26 }, // 0x4A 'J' + { 2779, 27, 27, 28, 1, -26 }, // 0x4B 'K' + { 2871, 25, 27, 28, 2, -26 }, // 0x4C 'L' + { 2956, 31, 27, 28, -1, -26 }, // 0x4D 'M' + { 3061, 28, 27, 28, 0, -26 }, // 0x4E 'N' + { 3156, 27, 29, 28, 1, -27 }, // 0x4F 'O' + { 3254, 24, 27, 28, 1, -26 }, // 0x50 'P' + { 3335, 27, 35, 28, 1, -27 }, // 0x51 'Q' + { 3454, 28, 27, 28, 0, -26 }, // 0x52 'R' + { 3549, 22, 29, 28, 3, -27 }, // 0x53 'S' + { 3629, 25, 27, 28, 2, -26 }, // 0x54 'T' + { 3714, 28, 28, 28, 0, -26 }, // 0x55 'U' + { 3812, 30, 27, 28, -1, -26 }, // 0x56 'V' + { 3914, 28, 27, 28, 0, -26 }, // 0x57 'W' + { 4009, 26, 27, 28, 1, -26 }, // 0x58 'X' + { 4097, 26, 27, 28, 1, -26 }, // 0x59 'Y' + { 4185, 21, 27, 28, 4, -26 }, // 0x5A 'Z' + { 4256, 10, 37, 28, 12, -29 }, // 0x5B '[' + { 4303, 20, 38, 28, 4, -32 }, // 0x5C '\' + { 4398, 10, 37, 28, 6, -29 }, // 0x5D ']' + { 4445, 20, 15, 28, 4, -29 }, // 0x5E '^' + { 4483, 28, 5, 28, 0, 5 }, // 0x5F '_' + { 4501, 9, 8, 28, 8, -30 }, // 0x60 '`' + { 4510, 24, 23, 28, 2, -21 }, // 0x61 'a' + { 4579, 27, 31, 28, 0, -29 }, // 0x62 'b' + { 4684, 24, 23, 28, 3, -21 }, // 0x63 'c' + { 4753, 26, 31, 28, 2, -29 }, // 0x64 'd' + { 4854, 24, 23, 28, 2, -21 }, // 0x65 'e' + { 4923, 22, 30, 28, 4, -29 }, // 0x66 'f' + { 5006, 25, 31, 28, 2, -21 }, // 0x67 'g' + { 5103, 26, 30, 28, 1, -29 }, // 0x68 'h' + { 5201, 21, 29, 28, 4, -28 }, // 0x69 'i' + { 5278, 17, 38, 28, 5, -28 }, // 0x6A 'j' + { 5359, 25, 30, 28, 2, -29 }, // 0x6B 'k' + { 5453, 21, 30, 28, 4, -29 }, // 0x6C 'l' + { 5532, 30, 22, 28, -1, -21 }, // 0x6D 'm' + { 5615, 25, 22, 28, 1, -21 }, // 0x6E 'n' + { 5684, 25, 23, 28, 2, -21 }, // 0x6F 'o' + { 5756, 28, 31, 28, 0, -21 }, // 0x70 'p' + { 5865, 28, 31, 28, 1, -21 }, // 0x71 'q' + { 5974, 24, 22, 28, 3, -21 }, // 0x72 'r' + { 6040, 21, 23, 28, 4, -21 }, // 0x73 's' + { 6101, 23, 28, 28, 1, -26 }, // 0x74 't' + { 6182, 25, 22, 28, 1, -20 }, // 0x75 'u' + { 6251, 28, 21, 28, 0, -20 }, // 0x76 'v' + { 6325, 28, 21, 28, 0, -20 }, // 0x77 'w' + { 6399, 26, 21, 28, 1, -20 }, // 0x78 'x' + { 6468, 26, 30, 28, 1, -20 }, // 0x79 'y' + { 6566, 19, 21, 28, 5, -20 }, // 0x7A 'z' + { 6616, 14, 37, 28, 7, -29 }, // 0x7B '{' + { 6681, 5, 36, 28, 12, -28 }, // 0x7C '|' + { 6704, 14, 37, 28, 8, -29 }, // 0x7D '}' + { 6769, 22, 10, 28, 3, -17 } }; // 0x7E '~' + +const GFXfont FreeMonoBold24pt7b PROGMEM = { + (uint8_t *)FreeMonoBold24pt7bBitmaps, + (GFXglyph *)FreeMonoBold24pt7bGlyphs, + 0x20, 0x7E, 47 }; + +// Approx. 7469 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold9pt7b.h new file mode 100644 index 0000000..75b1766 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBold9pt7b.h @@ -0,0 +1,189 @@ +const uint8_t FreeMonoBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xD2, 0x1F, 0x80, 0xEC, 0x89, 0x12, 0x24, 0x40, 0x36, 0x36, + 0x36, 0x7F, 0x7F, 0x36, 0xFF, 0xFF, 0x3C, 0x3C, 0x3C, 0x00, 0x18, 0xFF, + 0xFE, 0x3C, 0x1F, 0x1F, 0x83, 0x46, 0x8D, 0xF0, 0xC1, 0x83, 0x00, 0x61, + 0x22, 0x44, 0x86, 0x67, 0x37, 0x11, 0x22, 0x4C, 0x70, 0x3C, 0x7E, 0x60, + 0x60, 0x30, 0x7B, 0xDF, 0xCE, 0xFF, 0x7F, 0xC9, 0x24, 0x37, 0x66, 0xCC, + 0xCC, 0xCC, 0x66, 0x31, 0xCE, 0x66, 0x33, 0x33, 0x33, 0x66, 0xC8, 0x18, + 0x18, 0xFF, 0xFF, 0x3C, 0x3C, 0x66, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, + 0x18, 0x18, 0x18, 0x6B, 0x48, 0xFF, 0xFF, 0xC0, 0xF0, 0x02, 0x0C, 0x18, + 0x60, 0xC3, 0x06, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x20, 0x00, 0x38, + 0xFB, 0xBE, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x38, 0xF3, + 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0xFD, 0xF8, 0x3C, 0xFE, 0xC7, 0x03, + 0x03, 0x06, 0x0C, 0x18, 0x70, 0xE3, 0xFF, 0xFF, 0x7C, 0xFE, 0x03, 0x03, + 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xFE, 0x7C, 0x1C, 0x38, 0xB1, 0x64, + 0xD9, 0xBF, 0xFF, 0x3E, 0x7C, 0x7E, 0x3F, 0x18, 0x0F, 0xC7, 0xF3, 0x1C, + 0x06, 0x03, 0xC3, 0xFF, 0x9F, 0x80, 0x0F, 0x3F, 0x30, 0x60, 0x60, 0xDC, + 0xFE, 0xE3, 0xC3, 0x63, 0x7E, 0x3C, 0xFF, 0xFF, 0xC3, 0x03, 0x06, 0x06, + 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0x9F, 0x63, + 0xC7, 0x8F, 0xF1, 0xC0, 0x3C, 0x7E, 0xE6, 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, + 0x06, 0x0E, 0xFC, 0xF0, 0xF0, 0x0F, 0x6C, 0x00, 0x1A, 0xD2, 0x00, 0x01, + 0x83, 0x87, 0x0E, 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xC0, 0x00, + 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0xF9, 0xE3, 0xC1, 0x80, + 0x7C, 0xFE, 0xC7, 0x03, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x30, 0x30, 0x1E, + 0x1F, 0x1C, 0xDC, 0x6C, 0x76, 0x7B, 0x6D, 0xB6, 0xDB, 0x6F, 0xF3, 0xFC, + 0x06, 0x33, 0xF8, 0x78, 0x3C, 0x07, 0xC0, 0x38, 0x05, 0x81, 0xB0, 0x36, + 0x0F, 0xE1, 0xFC, 0x71, 0xDF, 0x7F, 0xEF, 0x80, 0xFF, 0x3F, 0xE6, 0x19, + 0x86, 0x7F, 0x1F, 0xE6, 0x1D, 0x83, 0x60, 0xFF, 0xFF, 0xF0, 0x1F, 0xBF, + 0xD8, 0xF8, 0x3C, 0x06, 0x03, 0x01, 0x80, 0x61, 0xBF, 0xC7, 0xC0, 0xFE, + 0x3F, 0xE6, 0x19, 0x83, 0x60, 0xD8, 0x36, 0x0D, 0x83, 0x61, 0xBF, 0xEF, + 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC3, 0x61, 0xFF, + 0xFF, 0xE0, 0xFF, 0xFF, 0xD8, 0x6D, 0xB7, 0xC3, 0xE1, 0xB0, 0xC0, 0x60, + 0x7C, 0x3E, 0x00, 0x1F, 0x9F, 0xE6, 0x1B, 0x06, 0xC0, 0x30, 0x0C, 0x7F, + 0x1F, 0xE1, 0x9F, 0xE3, 0xF0, 0xF7, 0xFB, 0xD8, 0xCC, 0x66, 0x33, 0xF9, + 0xFC, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, + 0x33, 0xFF, 0xC0, 0x1F, 0xC7, 0xF0, 0x30, 0x0C, 0x03, 0x00, 0xCC, 0x33, + 0x0C, 0xC7, 0x3F, 0x87, 0xC0, 0xF7, 0xBD, 0xE6, 0x61, 0xB0, 0x78, 0x1F, + 0x06, 0xE1, 0x98, 0x63, 0x3C, 0xFF, 0x3C, 0xFC, 0x7E, 0x0C, 0x06, 0x03, + 0x01, 0x80, 0xC6, 0x63, 0x31, 0xFF, 0xFF, 0xE0, 0xE0, 0xFE, 0x3D, 0xC7, + 0x3D, 0xE7, 0xBC, 0xD7, 0x9B, 0xB3, 0x76, 0x60, 0xDE, 0x3F, 0xC7, 0x80, + 0xE1, 0xFE, 0x3D, 0xE3, 0x3C, 0x66, 0xCC, 0xDD, 0x99, 0xB3, 0x1E, 0x63, + 0xDE, 0x3B, 0xC3, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, + 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, 0x00, 0xFE, 0x7F, 0x98, 0x6C, + 0x36, 0x1B, 0xF9, 0xF8, 0xC0, 0x60, 0x7C, 0x3E, 0x00, 0x1F, 0x07, 0xF1, + 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x07, 0x71, 0xC7, 0xF0, 0x7C, + 0x0C, 0x33, 0xFE, 0x7F, 0x80, 0xFC, 0x7F, 0x18, 0xCC, 0x66, 0x73, 0xF1, + 0xF0, 0xCC, 0x63, 0x7D, 0xFE, 0x60, 0x3F, 0xBF, 0xF0, 0x78, 0x0F, 0x03, + 0xF8, 0x3F, 0x83, 0xC3, 0xFF, 0xBF, 0x80, 0xFF, 0xFF, 0xF6, 0x7B, 0x3D, + 0x98, 0xC0, 0x60, 0x30, 0x18, 0x3F, 0x1F, 0x80, 0xF1, 0xFE, 0x3D, 0x83, + 0x30, 0x66, 0x0C, 0xC1, 0x98, 0x33, 0x06, 0x60, 0xC7, 0xF0, 0x7C, 0x00, + 0xFB, 0xFF, 0x7D, 0xC3, 0x18, 0xC3, 0x18, 0x36, 0x06, 0xC0, 0x50, 0x0E, + 0x01, 0xC0, 0x10, 0x00, 0xFB, 0xFE, 0xF6, 0x0D, 0x93, 0x6E, 0xDB, 0xB7, + 0xAD, 0xEE, 0x7B, 0x8E, 0xE3, 0x18, 0xF3, 0xFC, 0xF7, 0x38, 0xFC, 0x1E, + 0x03, 0x01, 0xE0, 0xCC, 0x73, 0xBC, 0xFF, 0x3C, 0xF3, 0xFC, 0xF7, 0x38, + 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x0F, 0xC3, 0xF0, 0xFE, 0xFE, + 0xC6, 0xCC, 0x18, 0x18, 0x30, 0x63, 0xC3, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xFF, 0x01, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, + 0x30, 0x30, 0x60, 0x60, 0xC0, 0x80, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, + 0xFF, 0x10, 0x71, 0xE3, 0x6C, 0x70, 0x40, 0xFF, 0xFF, 0xFC, 0x88, 0x80, + 0x7E, 0x3F, 0x8F, 0xCF, 0xEE, 0x36, 0x1B, 0xFE, 0xFF, 0xE0, 0x38, 0x06, + 0x01, 0xBC, 0x7F, 0x9C, 0x76, 0x0D, 0x83, 0x71, 0xFF, 0xEE, 0xF0, 0x3F, + 0xBF, 0xF8, 0x78, 0x3C, 0x07, 0x05, 0xFE, 0x7E, 0x03, 0x80, 0xE0, 0x18, + 0xF6, 0x7F, 0xB8, 0xEC, 0x1B, 0x06, 0xE3, 0x9F, 0xF3, 0xFC, 0x3E, 0x3F, + 0xB0, 0xFF, 0xFF, 0xFE, 0x01, 0xFE, 0x7E, 0x1F, 0x3F, 0x30, 0x7E, 0x7E, + 0x30, 0x30, 0x30, 0x30, 0xFE, 0xFE, 0x3F, 0xBF, 0xF9, 0xD8, 0x6C, 0x37, + 0x39, 0xFC, 0x76, 0x03, 0x01, 0x8F, 0xC7, 0xC0, 0xE0, 0x70, 0x18, 0x0D, + 0xC7, 0xF3, 0x99, 0x8C, 0xC6, 0x63, 0x7B, 0xFD, 0xE0, 0x18, 0x18, 0x00, + 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x60, 0x3F, 0xFC, + 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0x80, 0xE0, 0x70, 0x18, 0x0D, + 0xE6, 0xF3, 0xE1, 0xE0, 0xF8, 0x6E, 0x73, 0xF9, 0xE0, 0x78, 0x78, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0xFD, 0x9F, 0xF9, 0x9B, + 0x33, 0x66, 0x6C, 0xCD, 0xBD, 0xFF, 0xBF, 0xEE, 0x7F, 0x98, 0xCC, 0x66, + 0x33, 0x1B, 0xDF, 0xEF, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x1D, 0xFC, + 0x7C, 0xEF, 0x1F, 0xF9, 0xC3, 0xB0, 0x36, 0x06, 0xE1, 0xDF, 0xF3, 0x78, + 0x60, 0x0C, 0x03, 0xE0, 0x7C, 0x00, 0x1E, 0xEF, 0xFF, 0x87, 0x60, 0x6C, + 0x0D, 0xC3, 0x9F, 0xF0, 0xF6, 0x00, 0xC0, 0x18, 0x0F, 0x81, 0xF0, 0x77, + 0xBF, 0xCF, 0x06, 0x03, 0x01, 0x83, 0xF9, 0xFC, 0x3F, 0xFF, 0xC3, 0xFC, + 0x3F, 0xC3, 0xFF, 0xFC, 0x60, 0x60, 0x60, 0xFE, 0xFE, 0x60, 0x60, 0x60, + 0x61, 0x7F, 0x3E, 0xE7, 0x73, 0x98, 0xCC, 0x66, 0x33, 0x19, 0xFE, 0x7F, + 0xFB, 0xFF, 0x7C, 0xC6, 0x18, 0xC1, 0xB0, 0x36, 0x03, 0x80, 0x70, 0xF1, + 0xFE, 0x3D, 0xBB, 0x37, 0x63, 0xF8, 0x77, 0x0E, 0xE1, 0x8C, 0xF7, 0xFB, + 0xCD, 0x83, 0x83, 0xC3, 0xBB, 0xDF, 0xEF, 0xF3, 0xFC, 0xF6, 0x18, 0xCC, + 0x33, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x06, 0x0F, 0xC3, 0xF0, 0xFF, 0xFF, + 0x30, 0xC3, 0x0C, 0x7F, 0xFF, 0x37, 0x66, 0x66, 0xCC, 0x66, 0x66, 0x73, + 0xFF, 0xFF, 0xFF, 0xF0, 0xCE, 0x66, 0x66, 0x33, 0x66, 0x66, 0xEC, 0x70, + 0x7C, 0xF3, 0xC0, 0xC0 }; + +const GFXglyph FreeMonoBold9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' + { 0, 3, 11, 11, 4, -10 }, // 0x21 '!' + { 5, 7, 5, 11, 2, -10 }, // 0x22 '"' + { 10, 8, 12, 11, 1, -10 }, // 0x23 '#' + { 22, 7, 14, 11, 2, -11 }, // 0x24 '$' + { 35, 7, 11, 11, 2, -10 }, // 0x25 '%' + { 45, 8, 10, 11, 1, -9 }, // 0x26 '&' + { 55, 3, 5, 11, 4, -10 }, // 0x27 ''' + { 57, 4, 14, 11, 5, -10 }, // 0x28 '(' + { 64, 4, 14, 11, 2, -10 }, // 0x29 ')' + { 71, 8, 7, 11, 2, -10 }, // 0x2A '*' + { 78, 8, 9, 11, 2, -8 }, // 0x2B '+' + { 87, 3, 5, 11, 3, -1 }, // 0x2C ',' + { 89, 9, 2, 11, 1, -5 }, // 0x2D '-' + { 92, 2, 2, 11, 4, -1 }, // 0x2E '.' + { 93, 7, 15, 11, 2, -12 }, // 0x2F '/' + { 107, 7, 12, 11, 2, -11 }, // 0x30 '0' + { 118, 7, 11, 11, 2, -10 }, // 0x31 '1' + { 128, 8, 12, 11, 1, -11 }, // 0x32 '2' + { 140, 8, 12, 11, 2, -11 }, // 0x33 '3' + { 152, 7, 10, 11, 2, -9 }, // 0x34 '4' + { 161, 9, 11, 11, 1, -10 }, // 0x35 '5' + { 174, 8, 12, 11, 2, -11 }, // 0x36 '6' + { 186, 8, 11, 11, 1, -10 }, // 0x37 '7' + { 197, 7, 12, 11, 2, -11 }, // 0x38 '8' + { 208, 8, 12, 11, 2, -11 }, // 0x39 '9' + { 220, 2, 8, 11, 4, -7 }, // 0x3A ':' + { 222, 3, 11, 11, 3, -7 }, // 0x3B ';' + { 227, 9, 8, 11, 1, -8 }, // 0x3C '<' + { 236, 9, 6, 11, 1, -7 }, // 0x3D '=' + { 243, 9, 8, 11, 1, -8 }, // 0x3E '>' + { 252, 8, 11, 11, 2, -10 }, // 0x3F '?' + { 263, 9, 15, 11, 1, -11 }, // 0x40 '@' + { 280, 11, 11, 11, 0, -10 }, // 0x41 'A' + { 296, 10, 11, 11, 1, -10 }, // 0x42 'B' + { 310, 9, 11, 11, 1, -10 }, // 0x43 'C' + { 323, 10, 11, 11, 0, -10 }, // 0x44 'D' + { 337, 9, 11, 11, 1, -10 }, // 0x45 'E' + { 350, 9, 11, 11, 1, -10 }, // 0x46 'F' + { 363, 10, 11, 11, 1, -10 }, // 0x47 'G' + { 377, 9, 11, 11, 1, -10 }, // 0x48 'H' + { 390, 6, 11, 11, 3, -10 }, // 0x49 'I' + { 399, 10, 11, 11, 1, -10 }, // 0x4A 'J' + { 413, 10, 11, 11, 1, -10 }, // 0x4B 'K' + { 427, 9, 11, 11, 1, -10 }, // 0x4C 'L' + { 440, 11, 11, 11, 0, -10 }, // 0x4D 'M' + { 456, 11, 11, 11, 0, -10 }, // 0x4E 'N' + { 472, 11, 11, 11, 0, -10 }, // 0x4F 'O' + { 488, 9, 11, 11, 1, -10 }, // 0x50 'P' + { 501, 11, 14, 11, 0, -10 }, // 0x51 'Q' + { 521, 9, 11, 11, 1, -10 }, // 0x52 'R' + { 534, 9, 11, 11, 1, -10 }, // 0x53 'S' + { 547, 9, 11, 11, 1, -10 }, // 0x54 'T' + { 560, 11, 11, 11, 0, -10 }, // 0x55 'U' + { 576, 11, 11, 11, 0, -10 }, // 0x56 'V' + { 592, 10, 11, 11, 0, -10 }, // 0x57 'W' + { 606, 10, 11, 11, 0, -10 }, // 0x58 'X' + { 620, 10, 11, 11, 0, -10 }, // 0x59 'Y' + { 634, 8, 11, 11, 2, -10 }, // 0x5A 'Z' + { 645, 4, 14, 11, 5, -10 }, // 0x5B '[' + { 652, 7, 15, 11, 2, -12 }, // 0x5C '\' + { 666, 4, 14, 11, 2, -10 }, // 0x5D ']' + { 673, 7, 6, 11, 2, -11 }, // 0x5E '^' + { 679, 11, 2, 11, 0, 3 }, // 0x5F '_' + { 682, 3, 3, 11, 3, -11 }, // 0x60 '`' + { 684, 9, 8, 11, 1, -7 }, // 0x61 'a' + { 693, 10, 11, 11, 0, -10 }, // 0x62 'b' + { 707, 9, 8, 11, 1, -7 }, // 0x63 'c' + { 716, 10, 11, 11, 1, -10 }, // 0x64 'd' + { 730, 9, 8, 11, 1, -7 }, // 0x65 'e' + { 739, 8, 11, 11, 2, -10 }, // 0x66 'f' + { 750, 9, 12, 11, 1, -7 }, // 0x67 'g' + { 764, 9, 11, 11, 1, -10 }, // 0x68 'h' + { 777, 8, 11, 11, 2, -10 }, // 0x69 'i' + { 788, 6, 15, 11, 2, -10 }, // 0x6A 'j' + { 800, 9, 11, 11, 1, -10 }, // 0x6B 'k' + { 813, 8, 11, 11, 2, -10 }, // 0x6C 'l' + { 824, 11, 8, 11, 0, -7 }, // 0x6D 'm' + { 835, 9, 8, 11, 1, -7 }, // 0x6E 'n' + { 844, 9, 8, 11, 1, -7 }, // 0x6F 'o' + { 853, 11, 12, 11, 0, -7 }, // 0x70 'p' + { 870, 11, 12, 11, 0, -7 }, // 0x71 'q' + { 887, 9, 8, 11, 1, -7 }, // 0x72 'r' + { 896, 8, 8, 11, 2, -7 }, // 0x73 's' + { 904, 8, 11, 11, 1, -10 }, // 0x74 't' + { 915, 9, 8, 11, 1, -7 }, // 0x75 'u' + { 924, 11, 8, 11, 0, -7 }, // 0x76 'v' + { 935, 11, 8, 11, 0, -7 }, // 0x77 'w' + { 946, 9, 8, 11, 1, -7 }, // 0x78 'x' + { 955, 10, 12, 11, 0, -7 }, // 0x79 'y' + { 970, 7, 8, 11, 2, -7 }, // 0x7A 'z' + { 977, 4, 14, 11, 3, -10 }, // 0x7B '{' + { 984, 2, 14, 11, 5, -10 }, // 0x7C '|' + { 988, 4, 14, 11, 4, -10 }, // 0x7D '}' + { 995, 9, 4, 11, 1, -6 } }; // 0x7E '~' + +const GFXfont FreeMonoBold9pt7b PROGMEM = { + (uint8_t *)FreeMonoBold9pt7bBitmaps, + (GFXglyph *)FreeMonoBold9pt7bGlyphs, + 0x20, 0x7E, 18 }; + +// Approx. 1672 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h new file mode 100644 index 0000000..cc3ecb2 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h @@ -0,0 +1,269 @@ +const uint8_t FreeMonoBoldOblique12pt7bBitmaps[] PROGMEM = { + 0x1C, 0xF3, 0xCE, 0x38, 0xE7, 0x1C, 0x61, 0x86, 0x00, 0x63, 0x8C, 0x00, + 0xE7, 0xE7, 0xE6, 0xC6, 0xC6, 0xC4, 0x84, 0x03, 0x30, 0x19, 0x81, 0xDC, + 0x0C, 0xE0, 0x66, 0x1F, 0xFC, 0xFF, 0xE1, 0x98, 0x0C, 0xC0, 0xEE, 0x06, + 0x70, 0xFF, 0xCF, 0xFE, 0x1D, 0xC0, 0xCC, 0x06, 0x60, 0x77, 0x03, 0x30, + 0x00, 0x01, 0x00, 0x70, 0x0C, 0x07, 0xF1, 0xFE, 0x71, 0xCC, 0x11, 0x80, + 0x3F, 0x03, 0xF0, 0x0F, 0x20, 0x6E, 0x0D, 0xC3, 0x3F, 0xE7, 0xF8, 0x1C, + 0x03, 0x00, 0x60, 0x0C, 0x00, 0x0E, 0x03, 0xE0, 0xC4, 0x10, 0x82, 0x30, + 0x7C, 0x07, 0x78, 0x7C, 0x7F, 0x19, 0xF0, 0x62, 0x08, 0x41, 0x18, 0x3E, + 0x03, 0x80, 0x07, 0xC1, 0xF8, 0x62, 0x0C, 0x01, 0x80, 0x38, 0x0F, 0x03, + 0xF7, 0x6F, 0xD8, 0xF3, 0x1E, 0x7F, 0xE7, 0xF8, 0xFF, 0x6D, 0x20, 0x06, + 0x1C, 0x70, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x70, 0x60, 0xC1, 0x00, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x30, 0x61, 0xC3, 0x0E, 0x38, 0x61, 0xC2, 0x00, 0x06, 0x00, 0xC0, + 0x18, 0x3F, 0x7F, 0xFE, 0xFF, 0x07, 0x81, 0xF8, 0x77, 0x0C, 0x60, 0x03, + 0x00, 0x70, 0x07, 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0C, + 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x18, 0x00, 0x1C, 0xE3, 0x1C, 0x63, 0x08, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x70, 0x01, + 0x80, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, + 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x0C, 0x00, 0x70, + 0x03, 0x80, 0x0C, 0x00, 0x20, 0x00, 0x07, 0x83, 0xF8, 0xE3, 0x98, 0x37, + 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1B, 0x03, 0x60, 0xEE, 0x38, + 0xFE, 0x0F, 0x00, 0x03, 0xC1, 0xF0, 0x7E, 0x0C, 0xC0, 0x38, 0x07, 0x00, + 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, 0xFF, 0xFF, 0xF0, + 0x03, 0xE0, 0x3F, 0x83, 0x8E, 0x38, 0x31, 0x81, 0x80, 0x18, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x80, 0x38, 0x47, 0x87, 0x3F, 0xF3, 0xFF, + 0x80, 0x07, 0xC1, 0xFF, 0x18, 0x70, 0x03, 0x00, 0x30, 0x06, 0x07, 0xC0, + 0x7C, 0x00, 0xE0, 0x06, 0x00, 0x60, 0x06, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, + 0x01, 0xE0, 0x3C, 0x0F, 0x03, 0x60, 0xCC, 0x3B, 0x8E, 0x63, 0x8C, 0x61, + 0x9F, 0xFB, 0xFF, 0x01, 0x81, 0xF8, 0x3F, 0x00, 0x0F, 0xF1, 0xFE, 0x18, + 0x01, 0x80, 0x18, 0x03, 0xF8, 0x3F, 0xC3, 0x8E, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x0C, 0xC1, 0xCF, 0xF8, 0x7E, 0x00, 0x03, 0xE1, 0xFC, 0x70, 0x1C, + 0x03, 0x00, 0xC0, 0x1B, 0xC7, 0xFC, 0xF3, 0x98, 0x33, 0x06, 0x60, 0xCE, + 0x30, 0xFC, 0x0F, 0x00, 0xFF, 0xFF, 0xFB, 0x07, 0x60, 0xC0, 0x38, 0x06, + 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x08, + 0x00, 0x07, 0x83, 0xF8, 0xE3, 0xB0, 0x36, 0x06, 0xC0, 0xDC, 0x31, 0xFC, + 0x3F, 0x8C, 0x3B, 0x03, 0x60, 0x6C, 0x39, 0xFE, 0x1F, 0x00, 0x07, 0x81, + 0xF8, 0x63, 0x98, 0x33, 0x06, 0x60, 0xCE, 0x79, 0xFF, 0x1E, 0xC0, 0x18, + 0x06, 0x01, 0xC0, 0x71, 0xFC, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x00, + 0x67, 0x30, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0xC3, + 0x0E, 0x18, 0x20, 0x00, 0x00, 0x18, 0x03, 0xC0, 0x7C, 0x1F, 0x03, 0xE0, + 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x08, 0x7F, 0xFB, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x30, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x1F, 0x03, 0xE0, 0x7C, + 0x07, 0x80, 0x20, 0x00, 0x3E, 0x7F, 0xB0, 0xF8, 0x30, 0x18, 0x1C, 0x1C, + 0x3C, 0x38, 0x18, 0x00, 0x06, 0x07, 0x03, 0x00, 0x03, 0xC0, 0x7E, 0x0C, + 0x71, 0x83, 0x30, 0x33, 0x0F, 0x33, 0xE6, 0x76, 0x6C, 0x66, 0xC6, 0x6C, + 0x6C, 0xFC, 0xC7, 0xEC, 0x00, 0xC0, 0x0C, 0x00, 0xE3, 0x07, 0xF0, 0x3C, + 0x00, 0x07, 0xF0, 0x1F, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x3B, 0x00, 0xE7, + 0x01, 0x8E, 0x07, 0x1C, 0x1F, 0xF8, 0x3F, 0xF0, 0xE0, 0x71, 0x80, 0xEF, + 0xC7, 0xFF, 0x8F, 0xC0, 0x3F, 0xF1, 0xFF, 0xC3, 0x06, 0x38, 0x31, 0xC1, + 0x8C, 0x18, 0x7F, 0xC3, 0xFE, 0x38, 0x39, 0xC0, 0xCC, 0x06, 0x60, 0x6F, + 0xFF, 0x7F, 0xE0, 0x03, 0xEC, 0x3F, 0xF1, 0xC3, 0x8C, 0x06, 0x60, 0x19, + 0x80, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x03, 0x3C, 0x1C, + 0x7F, 0xE0, 0x7E, 0x00, 0x3F, 0xE1, 0xFF, 0x87, 0x0C, 0x30, 0x31, 0x81, + 0x8C, 0x0C, 0xE0, 0x67, 0x03, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0xE1, 0xCF, + 0xFC, 0x7F, 0x80, 0x1F, 0xFE, 0x3F, 0xFC, 0x38, 0x38, 0x70, 0x70, 0xCC, + 0xC1, 0x98, 0x03, 0xF0, 0x0F, 0xE0, 0x1D, 0x80, 0x31, 0x18, 0x60, 0x70, + 0xC0, 0xE7, 0xFF, 0x9F, 0xFF, 0x00, 0x1F, 0xFF, 0x1F, 0xFE, 0x0E, 0x06, + 0x0C, 0x0E, 0x0C, 0xC4, 0x0C, 0xC0, 0x1F, 0xC0, 0x1F, 0xC0, 0x19, 0xC0, + 0x19, 0x80, 0x18, 0x00, 0x38, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x07, 0xEC, + 0x7F, 0xF3, 0x83, 0x9C, 0x06, 0x60, 0x19, 0x80, 0x0C, 0x00, 0x30, 0xFE, + 0xC3, 0xFB, 0x01, 0xCC, 0x07, 0x3C, 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x0F, + 0xBF, 0x1F, 0xBE, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C, 0x1F, + 0xF8, 0x1F, 0xF8, 0x18, 0x18, 0x18, 0x38, 0x18, 0x38, 0x38, 0x30, 0x7C, + 0xFC, 0xFC, 0xF8, 0x3F, 0xF3, 0xFF, 0x03, 0x00, 0x70, 0x07, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0xFF, 0xCF, 0xFC, + 0x03, 0xFF, 0x03, 0xFF, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, + 0x00, 0x70, 0x20, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE1, 0xC0, + 0xFF, 0x80, 0x3F, 0x00, 0x1F, 0x9F, 0x1F, 0x9E, 0x0E, 0x38, 0x0C, 0x70, + 0x0C, 0xE0, 0x0F, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, 0x1C, 0xE0, 0x18, 0x60, + 0x18, 0x70, 0x38, 0x70, 0xFE, 0x3C, 0xFC, 0x3C, 0x3F, 0xC1, 0xFE, 0x01, + 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x18, 0xE0, + 0xC6, 0x06, 0x30, 0x7F, 0xFF, 0xFF, 0xF8, 0x1E, 0x07, 0x87, 0x81, 0xE0, + 0xF0, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x06, 0xCF, 0x81, 0xBF, 0x60, 0xEF, + 0x98, 0x3B, 0xEE, 0x0C, 0x73, 0x83, 0x1C, 0xC0, 0xC0, 0x30, 0xFC, 0x7E, + 0x3F, 0x1F, 0x80, 0x3C, 0x3F, 0x3E, 0x3F, 0x1E, 0x0C, 0x1F, 0x1C, 0x1F, + 0x1C, 0x1B, 0x98, 0x3B, 0x98, 0x3B, 0x98, 0x31, 0xF8, 0x31, 0xF8, 0x30, + 0xF0, 0x70, 0xF0, 0xFC, 0x70, 0xF8, 0x70, 0x03, 0xE0, 0x3F, 0xE1, 0xC3, + 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00, + 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0x7C, 0x00, 0x3F, 0xE1, 0xFF, 0x83, + 0x0E, 0x38, 0x31, 0xC1, 0x8C, 0x0C, 0x60, 0xC3, 0xFC, 0x3F, 0xC1, 0xC0, + 0x0C, 0x00, 0x60, 0x0F, 0xF0, 0x7F, 0x80, 0x03, 0xE0, 0x3F, 0xE1, 0xC3, + 0x8C, 0x07, 0x60, 0x0D, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1B, 0x00, + 0x6E, 0x03, 0x1C, 0x38, 0x7F, 0xC0, 0xFC, 0x03, 0x02, 0x1F, 0xFC, 0xFF, + 0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x38, 0x70, 0x60, 0x60, 0xC0, 0xC1, 0x87, + 0x07, 0xFC, 0x0F, 0xF0, 0x18, 0xF0, 0x30, 0xE0, 0x60, 0xC1, 0xC1, 0xCF, + 0xE1, 0xFF, 0xC3, 0xC0, 0x0F, 0xB1, 0xFF, 0x30, 0xE6, 0x06, 0x60, 0x67, + 0x80, 0x7F, 0x01, 0xFC, 0x01, 0xC4, 0x0C, 0xC0, 0xCE, 0x18, 0xFF, 0x8B, + 0xE0, 0x7F, 0xFB, 0xFF, 0xD9, 0xCF, 0xCE, 0x7C, 0x63, 0x63, 0x18, 0x18, + 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x03, 0x00, 0x18, 0x0F, 0xF8, 0x7F, 0xC0, + 0x7E, 0xFF, 0xF3, 0xF3, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x81, 0xC6, 0x06, + 0x38, 0x18, 0xE0, 0x63, 0x03, 0x8C, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8, + 0x00, 0xFC, 0x7F, 0xF8, 0xFD, 0xC0, 0x61, 0x81, 0xC3, 0x87, 0x07, 0x0C, + 0x0E, 0x38, 0x0C, 0x60, 0x19, 0xC0, 0x3F, 0x00, 0x7C, 0x00, 0xF8, 0x00, + 0xE0, 0x01, 0x80, 0x00, 0x7E, 0x7E, 0xFC, 0xFD, 0xC0, 0x73, 0x9C, 0xE7, + 0x79, 0x8E, 0xF7, 0x1B, 0xEE, 0x36, 0xD8, 0x7D, 0xF0, 0xF3, 0xE1, 0xE7, + 0x83, 0x8F, 0x07, 0x1E, 0x1C, 0x38, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, + 0x1C, 0x07, 0x38, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x07, + 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x38, 0x70, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, + 0xFF, 0xC7, 0xCC, 0x38, 0x73, 0x83, 0x9C, 0x0F, 0xC0, 0x7C, 0x01, 0xC0, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x0F, 0xF8, 0x7F, 0x80, 0x0F, 0xF8, + 0x7F, 0xE1, 0xC7, 0x86, 0x1C, 0x18, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0xC3, 0x83, 0x1C, 0x1C, 0x7F, 0xF3, 0xFF, 0x80, 0x0F, + 0x87, 0xC3, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x1C, 0x0C, 0x06, + 0x03, 0x03, 0x81, 0xC0, 0xC0, 0x60, 0x3E, 0x3F, 0x00, 0x41, 0xC3, 0x83, + 0x07, 0x0E, 0x1C, 0x18, 0x38, 0x70, 0xE0, 0xC1, 0xC3, 0x83, 0x06, 0x0E, + 0x1C, 0x18, 0x20, 0x1F, 0x0F, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x0C, + 0x0E, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x7C, 0x3E, + 0x00, 0x02, 0x01, 0x80, 0xF0, 0x7E, 0x3B, 0x9C, 0x7E, 0x1F, 0x03, 0xFF, + 0xFF, 0xFF, 0xFC, 0xCE, 0x73, 0x1F, 0xC3, 0xFE, 0x00, 0x60, 0x06, 0x0F, + 0xE3, 0xFE, 0x70, 0xCC, 0x0C, 0xC3, 0xCF, 0xFF, 0x7F, 0xF0, 0x1E, 0x00, + 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0x81, 0xFF, 0x83, 0xC3, 0x8F, + 0x03, 0x1C, 0x06, 0x38, 0x0C, 0x70, 0x18, 0xE0, 0x63, 0xE1, 0x9F, 0xFE, + 0x3D, 0xF8, 0x00, 0x0F, 0xF3, 0xFF, 0x30, 0x76, 0x07, 0xE0, 0x6C, 0x00, + 0xC0, 0x0C, 0x00, 0xE0, 0x67, 0xFE, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0xF0, + 0x01, 0xC0, 0x06, 0x07, 0xD8, 0x7F, 0xE3, 0x0F, 0x98, 0x1E, 0x60, 0x73, + 0x01, 0xCC, 0x07, 0x30, 0x3C, 0xE1, 0xF1, 0xFF, 0xE3, 0xF7, 0x80, 0x0F, + 0xC1, 0xFE, 0x78, 0x76, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x0C, 0x00, 0xE0, + 0xE7, 0xFE, 0x1F, 0x80, 0x00, 0xFC, 0x07, 0xF8, 0x0C, 0x00, 0x38, 0x01, + 0xFF, 0x07, 0xFE, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30, + 0x00, 0x60, 0x01, 0xC0, 0x1F, 0xF8, 0x3F, 0xF0, 0x00, 0x0F, 0xBC, 0x7F, + 0xF3, 0x0F, 0x18, 0x1C, 0xC0, 0x73, 0x01, 0x8C, 0x0E, 0x30, 0x38, 0xE3, + 0xE1, 0xFF, 0x83, 0xEC, 0x00, 0x30, 0x01, 0xC0, 0x06, 0x07, 0xF0, 0x1F, + 0x80, 0x1E, 0x01, 0xF0, 0x03, 0x00, 0x18, 0x00, 0xDE, 0x0F, 0xF8, 0x78, + 0xC3, 0x86, 0x18, 0x30, 0xC1, 0x8E, 0x1C, 0x70, 0xE3, 0x06, 0x7E, 0xFF, + 0xE7, 0xE0, 0x03, 0x80, 0x70, 0x00, 0x0F, 0xC1, 0xF0, 0x06, 0x00, 0xC0, + 0x38, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x70, + 0x07, 0x00, 0x00, 0xFF, 0x1F, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, + 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x03, 0x87, + 0xF0, 0xFE, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0C, 0xFC, + 0x33, 0xE0, 0xDE, 0x07, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF8, 0x06, 0xF0, + 0x39, 0xC3, 0xE7, 0xEF, 0x1F, 0x80, 0x0F, 0x81, 0xF0, 0x06, 0x01, 0xC0, + 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0x61, + 0xFF, 0xFF, 0xF8, 0x3F, 0xBC, 0x7F, 0xFC, 0xF3, 0x98, 0xC6, 0x33, 0x9C, + 0xE7, 0x39, 0xCC, 0x63, 0x18, 0xC6, 0x31, 0x8D, 0xF7, 0xBF, 0xEF, 0x78, + 0x3D, 0xE1, 0xFF, 0x8F, 0x8C, 0x38, 0x61, 0x83, 0x0C, 0x18, 0xE1, 0xC7, + 0x0E, 0x30, 0x67, 0xEF, 0xFE, 0x7E, 0x07, 0xC1, 0xFE, 0x38, 0x76, 0x03, + 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x1E, + 0xFC, 0x1F, 0xFE, 0x0F, 0x87, 0x0F, 0x03, 0x0E, 0x03, 0x0E, 0x03, 0x0E, + 0x07, 0x0E, 0x06, 0x1F, 0x0C, 0x1F, 0xF8, 0x19, 0xF0, 0x18, 0x00, 0x18, + 0x00, 0x38, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xDE, 0x3F, 0xFC, 0xC3, + 0xE3, 0x03, 0x84, 0x07, 0x18, 0x0E, 0x30, 0x1C, 0x60, 0x78, 0xE1, 0xE0, + 0xFF, 0xC0, 0xF9, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x1C, 0x01, 0xFC, 0x03, + 0xF8, 0x1E, 0x78, 0x7F, 0xF0, 0x7C, 0xC3, 0xC0, 0x0E, 0x00, 0x30, 0x00, + 0xC0, 0x03, 0x00, 0x1C, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0x07, 0xF1, 0xFF, + 0x30, 0x73, 0x86, 0x3F, 0x81, 0xFE, 0x03, 0xE6, 0x06, 0xE0, 0xEF, 0xFC, + 0xFF, 0x00, 0x0C, 0x07, 0x01, 0x83, 0xFF, 0xFF, 0xCE, 0x03, 0x00, 0xC0, + 0x30, 0x1C, 0x07, 0x01, 0x83, 0x7F, 0xCF, 0xC0, 0xF0, 0xFF, 0x1F, 0x60, + 0x76, 0x07, 0x60, 0x76, 0x06, 0x60, 0x66, 0x0E, 0x61, 0xE7, 0xFF, 0x3E, + 0xF0, 0x7E, 0x7E, 0xFC, 0xFC, 0xE0, 0xC0, 0xC3, 0x81, 0x86, 0x03, 0x98, + 0x07, 0x70, 0x06, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x38, 0x00, 0xF8, 0x7F, + 0xE3, 0xE6, 0x63, 0x1B, 0xDC, 0x6F, 0x61, 0xFF, 0x87, 0xFC, 0x1E, 0xF0, + 0x73, 0x81, 0xCE, 0x06, 0x38, 0x00, 0x3E, 0x7C, 0xF9, 0xF1, 0xE7, 0x03, + 0xF8, 0x07, 0xC0, 0x1F, 0x01, 0xFC, 0x0F, 0x38, 0x78, 0xFB, 0xF7, 0xEF, + 0x9F, 0x80, 0x1F, 0x1F, 0x3E, 0x1F, 0x1C, 0x1C, 0x0C, 0x18, 0x0E, 0x38, + 0x0E, 0x70, 0x06, 0x60, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x1F, 0xF1, + 0xFF, 0x38, 0xE3, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC6, 0x38, 0x67, + 0xFE, 0x7F, 0xE0, 0x01, 0xC0, 0xF0, 0x70, 0x18, 0x06, 0x03, 0x80, 0xE0, + 0x30, 0x1C, 0x3E, 0x0F, 0x00, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30, + 0x0F, 0x01, 0xC0, 0x0C, 0x71, 0xC7, 0x18, 0x63, 0x8E, 0x30, 0xC3, 0x1C, + 0x71, 0x86, 0x38, 0xE3, 0x04, 0x00, 0x0E, 0x07, 0x80, 0xC0, 0x60, 0x70, + 0x30, 0x18, 0x0C, 0x06, 0x01, 0xC1, 0xE1, 0xC0, 0xC0, 0xE0, 0x70, 0x30, + 0x38, 0x78, 0x38, 0x00, 0x3C, 0x27, 0xE6, 0xEF, 0xCC, 0x38 }; + +const GFXglyph FreeMonoBoldOblique12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' + { 0, 6, 15, 14, 6, -14 }, // 0x21 '!' + { 12, 8, 7, 14, 6, -13 }, // 0x22 '"' + { 19, 13, 18, 14, 2, -15 }, // 0x23 '#' + { 49, 11, 20, 14, 3, -16 }, // 0x24 '$' + { 77, 11, 15, 14, 3, -14 }, // 0x25 '%' + { 98, 11, 13, 14, 2, -12 }, // 0x26 '&' + { 116, 3, 7, 14, 8, -13 }, // 0x27 ''' + { 119, 7, 19, 14, 7, -14 }, // 0x28 '(' + { 136, 7, 19, 14, 2, -14 }, // 0x29 ')' + { 153, 11, 10, 14, 4, -14 }, // 0x2A '*' + { 167, 12, 13, 14, 3, -12 }, // 0x2B '+' + { 187, 6, 7, 14, 3, -2 }, // 0x2C ',' + { 193, 13, 2, 14, 2, -7 }, // 0x2D '-' + { 197, 3, 3, 14, 6, -2 }, // 0x2E '.' + { 199, 14, 20, 14, 2, -16 }, // 0x2F '/' + { 234, 11, 15, 14, 3, -14 }, // 0x30 '0' + { 255, 11, 15, 14, 2, -14 }, // 0x31 '1' + { 276, 13, 15, 14, 1, -14 }, // 0x32 '2' + { 301, 12, 15, 14, 2, -14 }, // 0x33 '3' + { 324, 11, 14, 14, 3, -13 }, // 0x34 '4' + { 344, 12, 15, 14, 2, -14 }, // 0x35 '5' + { 367, 11, 15, 14, 4, -14 }, // 0x36 '6' + { 388, 11, 15, 14, 4, -14 }, // 0x37 '7' + { 409, 11, 15, 14, 3, -14 }, // 0x38 '8' + { 430, 11, 15, 14, 3, -14 }, // 0x39 '9' + { 451, 5, 11, 14, 5, -10 }, // 0x3A ':' + { 458, 7, 15, 14, 3, -10 }, // 0x3B ';' + { 472, 13, 11, 14, 2, -11 }, // 0x3C '<' + { 490, 13, 7, 14, 2, -9 }, // 0x3D '=' + { 502, 13, 11, 14, 2, -11 }, // 0x3E '>' + { 520, 9, 14, 14, 5, -13 }, // 0x3F '?' + { 536, 12, 19, 14, 2, -14 }, // 0x40 '@' + { 565, 15, 14, 14, 0, -13 }, // 0x41 'A' + { 592, 13, 14, 14, 1, -13 }, // 0x42 'B' + { 615, 14, 14, 14, 2, -13 }, // 0x43 'C' + { 640, 13, 14, 14, 1, -13 }, // 0x44 'D' + { 663, 15, 14, 14, 0, -13 }, // 0x45 'E' + { 690, 16, 14, 14, 0, -13 }, // 0x46 'F' + { 718, 14, 14, 14, 1, -13 }, // 0x47 'G' + { 743, 16, 14, 14, 0, -13 }, // 0x48 'H' + { 771, 12, 14, 14, 2, -13 }, // 0x49 'I' + { 792, 16, 14, 14, 0, -13 }, // 0x4A 'J' + { 820, 16, 14, 14, 0, -13 }, // 0x4B 'K' + { 848, 13, 14, 14, 1, -13 }, // 0x4C 'L' + { 871, 18, 14, 14, 0, -13 }, // 0x4D 'M' + { 903, 16, 14, 14, 1, -13 }, // 0x4E 'N' + { 931, 14, 14, 14, 1, -13 }, // 0x4F 'O' + { 956, 13, 14, 14, 1, -13 }, // 0x50 'P' + { 979, 14, 17, 14, 1, -13 }, // 0x51 'Q' + { 1009, 15, 14, 14, 0, -13 }, // 0x52 'R' + { 1036, 12, 14, 14, 3, -13 }, // 0x53 'S' + { 1057, 13, 14, 14, 2, -13 }, // 0x54 'T' + { 1080, 14, 14, 14, 2, -13 }, // 0x55 'U' + { 1105, 15, 14, 14, 1, -13 }, // 0x56 'V' + { 1132, 15, 14, 14, 1, -13 }, // 0x57 'W' + { 1159, 16, 14, 14, 0, -13 }, // 0x58 'X' + { 1187, 13, 14, 14, 2, -13 }, // 0x59 'Y' + { 1210, 14, 14, 14, 1, -13 }, // 0x5A 'Z' + { 1235, 9, 19, 14, 5, -14 }, // 0x5B '[' + { 1257, 7, 20, 14, 5, -16 }, // 0x5C '\' + { 1275, 9, 19, 14, 3, -14 }, // 0x5D ']' + { 1297, 10, 8, 14, 4, -15 }, // 0x5E '^' + { 1307, 15, 2, 14, -1, 4 }, // 0x5F '_' + { 1311, 4, 4, 14, 7, -15 }, // 0x60 '`' + { 1313, 12, 11, 14, 2, -10 }, // 0x61 'a' + { 1330, 15, 15, 14, -1, -14 }, // 0x62 'b' + { 1359, 12, 11, 14, 2, -10 }, // 0x63 'c' + { 1376, 14, 15, 14, 2, -14 }, // 0x64 'd' + { 1403, 12, 11, 14, 2, -10 }, // 0x65 'e' + { 1420, 15, 15, 14, 2, -14 }, // 0x66 'f' + { 1449, 14, 16, 14, 2, -10 }, // 0x67 'g' + { 1477, 13, 15, 14, 1, -14 }, // 0x68 'h' + { 1502, 11, 14, 14, 2, -13 }, // 0x69 'i' + { 1522, 12, 19, 14, 1, -13 }, // 0x6A 'j' + { 1551, 14, 15, 14, 1, -14 }, // 0x6B 'k' + { 1578, 11, 15, 14, 2, -14 }, // 0x6C 'l' + { 1599, 15, 11, 14, 0, -10 }, // 0x6D 'm' + { 1620, 13, 11, 14, 1, -10 }, // 0x6E 'n' + { 1638, 12, 11, 14, 2, -10 }, // 0x6F 'o' + { 1655, 16, 16, 14, -1, -10 }, // 0x70 'p' + { 1687, 15, 16, 14, 1, -10 }, // 0x71 'q' + { 1717, 14, 11, 14, 1, -10 }, // 0x72 'r' + { 1737, 12, 11, 14, 2, -10 }, // 0x73 's' + { 1754, 10, 14, 14, 2, -13 }, // 0x74 't' + { 1772, 12, 11, 14, 2, -10 }, // 0x75 'u' + { 1789, 15, 11, 14, 1, -10 }, // 0x76 'v' + { 1810, 14, 11, 14, 2, -10 }, // 0x77 'w' + { 1830, 14, 11, 14, 1, -10 }, // 0x78 'x' + { 1850, 16, 16, 14, 0, -10 }, // 0x79 'y' + { 1882, 12, 11, 14, 2, -10 }, // 0x7A 'z' + { 1899, 10, 19, 14, 4, -14 }, // 0x7B '{' + { 1923, 6, 19, 14, 5, -14 }, // 0x7C '|' + { 1938, 9, 19, 14, 3, -14 }, // 0x7D '}' + { 1960, 12, 4, 14, 3, -7 } }; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique12pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique12pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique12pt7bGlyphs, + 0x20, 0x7E, 24 }; + +// Approx. 2638 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h new file mode 100644 index 0000000..bc4f20e --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h @@ -0,0 +1,460 @@ +const uint8_t FreeMonoBoldOblique18pt7bBitmaps[] PROGMEM = { + 0x0F, 0x07, 0xC7, 0xE3, 0xF1, 0xF0, 0xF8, 0xFC, 0x7C, 0x3E, 0x1F, 0x0F, + 0x07, 0x87, 0xC3, 0xC1, 0xE0, 0x60, 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83, + 0x80, 0xF8, 0xFF, 0x0E, 0xF1, 0xEF, 0x1E, 0xE1, 0xCE, 0x1C, 0xC1, 0xCC, + 0x18, 0xC1, 0x88, 0x18, 0x00, 0xE3, 0x80, 0x79, 0xE0, 0x1C, 0x70, 0x07, + 0x1C, 0x03, 0xCF, 0x00, 0xF3, 0xC0, 0x38, 0xE0, 0x7F, 0xFF, 0x3F, 0xFF, + 0xCF, 0xFF, 0xF3, 0xFF, 0xF8, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0x8E, 0x0F, + 0xFF, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0x3F, 0xFF, 0x83, 0xCF, 0x00, 0xF3, + 0xC0, 0x38, 0xE0, 0x1E, 0x78, 0x07, 0x9E, 0x01, 0xC7, 0x00, 0x71, 0xC0, + 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xF0, 0x03, 0xFF, + 0x81, 0xFF, 0xF0, 0xFF, 0xF8, 0x3C, 0x1E, 0x1E, 0x07, 0x87, 0x80, 0x01, + 0xF0, 0x00, 0x7F, 0xC0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x07, 0xF0, 0x00, + 0x3C, 0x70, 0x0F, 0x3C, 0x03, 0xCF, 0x83, 0xE3, 0xFF, 0xF8, 0xFF, 0xFC, + 0x3F, 0xFE, 0x0C, 0xFE, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, + 0xF0, 0x00, 0x18, 0x00, 0x03, 0xC0, 0x0F, 0xE0, 0x1C, 0x70, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1F, 0xC3, 0x0F, 0x1F, 0x01, 0xFC, + 0x0F, 0xE0, 0x7F, 0x00, 0xF8, 0xF0, 0x83, 0xF8, 0x07, 0x1C, 0x0E, 0x0C, + 0x0C, 0x0C, 0x0C, 0x1C, 0x0E, 0x38, 0x07, 0xF0, 0x03, 0xC0, 0x00, 0x7A, + 0x01, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0x9C, 0x0F, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x1F, 0x80, 0x3F, 0xC0, 0x7F, 0xCF, 0x79, 0xFF, + 0xF1, 0xFE, 0xF1, 0xFC, 0xF0, 0xF8, 0xFF, 0xFE, 0xFF, 0xFE, 0x7F, 0xFE, + 0x1F, 0xBC, 0x7B, 0xFD, 0xEF, 0x73, 0x9C, 0xC6, 0x00, 0x01, 0xC0, 0xF0, + 0x3C, 0x1E, 0x0F, 0x03, 0xC1, 0xE0, 0x70, 0x3C, 0x0F, 0x07, 0x81, 0xE0, + 0x78, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E, + 0x07, 0x81, 0xE0, 0x7C, 0x1F, 0x03, 0x80, 0x07, 0x03, 0xC0, 0xF8, 0x3E, + 0x07, 0x81, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xC0, 0xF0, 0x3C, 0x1E, 0x07, 0x83, 0xC1, + 0xE0, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x02, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x1F, 0xF0, 0x1F, 0x80, + 0x7F, 0x81, 0xEF, 0x07, 0x8F, 0x0F, 0x1E, 0x08, 0x10, 0x00, 0x00, 0x70, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, + 0x1E, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, + 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x07, 0x80, + 0x01, 0xC0, 0x00, 0x70, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, + 0xC0, 0xC0, 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x01, 0xFF, + 0x01, 0xFF, 0xC1, 0xFF, 0xE1, 0xF1, 0xF9, 0xE0, 0x7C, 0xF0, 0x1E, 0xF0, + 0x0F, 0x78, 0x07, 0xB8, 0x03, 0x9C, 0x03, 0xDE, 0x01, 0xCF, 0x00, 0xE7, + 0x00, 0x73, 0xC0, 0x79, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, 0x1E, 0x3E, 0x1E, + 0x0F, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x03, + 0xF8, 0x0F, 0xE0, 0x7F, 0xC0, 0xF7, 0x81, 0x8F, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00, + 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xE0, 0x1F, + 0xFF, 0x03, 0xC1, 0xF0, 0x78, 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, + 0x3F, 0x03, 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x87, 0xFF, 0xF8, 0xFF, 0xFF, + 0x00, 0x00, 0xFE, 0x00, 0xFF, 0xC0, 0x7F, 0xF8, 0x3F, 0xFF, 0x0E, 0x07, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, + 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xF1, 0xFF, 0xF8, 0xFF, 0xFC, + 0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, + 0xFE, 0x00, 0xFE, 0x01, 0xEE, 0x03, 0xDE, 0x07, 0x9E, 0x0F, 0x1C, 0x1E, + 0x1C, 0x3C, 0x3C, 0x78, 0x3C, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFC, 0x00, 0x70, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, + 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xE0, 0x00, 0x3B, 0xE0, 0x1F, 0xFE, 0x07, 0xFF, 0xC1, 0xFF, 0xF8, + 0x78, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x0F, 0x18, 0x0F, 0xCF, 0xFF, 0xE3, 0xFF, 0xF0, 0x7F, 0xF8, 0x07, 0xF0, + 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xFC, 0x03, 0xFF, 0x81, 0xFF, 0xE0, 0x7F, + 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x9F, + 0x01, 0xEF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xF1, 0xFC, 0x3E, 0x3E, 0x03, + 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, 0x03, 0xC3, 0xE0, 0xF8, 0x7F, 0xFE, + 0x07, 0xFF, 0x80, 0x7F, 0xE0, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x3C, + 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xC0, + 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, + 0xFF, 0xF0, 0xF8, 0x3E, 0x3E, 0x03, 0xC7, 0x80, 0x78, 0xF0, 0x0F, 0x1E, + 0x03, 0xC3, 0xE0, 0xF0, 0x3F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xE0, 0x7F, + 0xFE, 0x1F, 0x83, 0xE3, 0xC0, 0x3C, 0xF0, 0x07, 0x9E, 0x01, 0xF3, 0xE0, + 0x7C, 0x7F, 0xFF, 0x87, 0xFF, 0xE0, 0x7F, 0xF0, 0x03, 0xF8, 0x00, 0x00, + 0x7E, 0x00, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0x87, 0xC3, 0xC0, + 0xF1, 0xE0, 0x3C, 0x78, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xF1, 0xFC, + 0x7F, 0xFE, 0x0F, 0xFF, 0x81, 0xFD, 0xE0, 0x3E, 0xF0, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x81, 0xFF, 0xC0, 0xFF, 0xE0, 0x3F, 0xE0, + 0x07, 0xE0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x8F, 0x9F, 0x3E, 0x38, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xF0, 0x1E, + 0x07, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x30, 0x0E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x38, + 0x3F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x9F, 0xFF, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, 0xFF, 0xDF, 0xFF, 0xF0, + 0x00, 0x00, 0x03, 0x80, 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x0F, 0xE0, + 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x07, + 0x00, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0xFF, 0xBF, 0xFF, 0xF0, 0x7F, 0x80, + 0xFE, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x0F, 0xE1, 0xFE, 0x0F, 0xF0, 0x7E, + 0x01, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0x70, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x0F, 0x0F, + 0x07, 0x01, 0xC3, 0x80, 0x71, 0xE0, 0x1C, 0x70, 0x0E, 0x18, 0x0F, 0x8E, + 0x1F, 0xE3, 0x8F, 0xF0, 0xE7, 0x9C, 0x33, 0xC7, 0x1C, 0xE1, 0xC7, 0x38, + 0x71, 0xCF, 0x18, 0x73, 0xFE, 0x38, 0x7F, 0xCE, 0x0F, 0xF3, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0xC0, 0x7F, 0xF0, 0x0F, + 0xF8, 0x01, 0xF8, 0x00, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, + 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xBC, 0x00, + 0x1C, 0xF0, 0x00, 0xF3, 0xC0, 0x07, 0x87, 0x80, 0x1E, 0x1E, 0x00, 0xF0, + 0x78, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, + 0x1E, 0x00, 0xF1, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, + 0x07, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, + 0xF0, 0x38, 0x0F, 0x81, 0xC0, 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x3E, 0x07, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0xE0, 0x1F, + 0x87, 0x00, 0x3C, 0x38, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0xF3, 0xFF, + 0xFF, 0xBF, 0xFF, 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0x00, 0x00, 0x7F, + 0x30, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xF1, 0xF8, 0x3F, 0x1F, + 0x00, 0x78, 0xF0, 0x03, 0xCF, 0x80, 0x1C, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0x00, 0x38, 0x7E, 0x07, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, + 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xFF, 0x80, 0x7F, 0xFE, 0x07, + 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x78, 0x1F, 0x03, 0x80, 0x7C, 0x1C, 0x01, + 0xE1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x03, 0xC3, 0x80, 0x1E, 0x1C, + 0x00, 0xF1, 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x70, 0x07, 0xC3, 0x80, 0x7C, + 0x3C, 0x07, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF, + 0x80, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xFF, + 0xFF, 0x03, 0xC0, 0x3C, 0x0F, 0x00, 0xE0, 0x3C, 0x73, 0x80, 0xE3, 0xCC, + 0x03, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, + 0x1E, 0x00, 0x3C, 0x70, 0x00, 0xF0, 0x07, 0x03, 0xC0, 0x1C, 0x0E, 0x00, + 0xF1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFE, 0x3F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE0, + 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, + 0x3C, 0x01, 0xC0, 0x70, 0x07, 0x80, 0xE1, 0x8E, 0x03, 0xC7, 0x1C, 0x07, + 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0xF1, + 0xC0, 0x01, 0xE3, 0x80, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, + 0x00, 0x00, 0x3F, 0x18, 0x0F, 0xFF, 0xC0, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, + 0xFC, 0x0F, 0x0F, 0x80, 0x38, 0xF8, 0x01, 0x87, 0x80, 0x00, 0x78, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x7F, 0xEF, 0x07, 0xFF, 0x78, + 0x3F, 0xFB, 0xC0, 0xFF, 0x9E, 0x00, 0x38, 0xFC, 0x03, 0xC3, 0xFF, 0xFE, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x03, 0xF8, 0xFE, + 0x0F, 0xF3, 0xFC, 0x1F, 0xE7, 0xF8, 0x3F, 0x8F, 0xE0, 0x3C, 0x07, 0x80, + 0x70, 0x0E, 0x00, 0xE0, 0x1C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0xF0, 0x0F, + 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x01, 0xE0, + 0x3C, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x1E, 0x03, 0xC0, 0xFF, 0x1F, + 0xE1, 0xFE, 0x7F, 0xC7, 0xFC, 0xFF, 0x87, 0xF1, 0xFE, 0x00, 0x07, 0xFF, + 0xE1, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, 0xE0, 0x07, 0x80, 0x00, 0xE0, + 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00, + 0x01, 0xC0, 0x0F, 0xFF, 0xC3, 0xFF, 0xF8, 0x7F, 0xFF, 0x07, 0xFF, 0xE0, + 0x00, 0x3F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, + 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x80, 0x1C, 0x03, 0x80, + 0x78, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x1F, + 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFC, 0x00, + 0x00, 0x07, 0xF8, 0xFC, 0x1F, 0xFB, 0xFC, 0x3F, 0xE7, 0xF0, 0x7F, 0xCF, + 0xE0, 0x3C, 0x1E, 0x00, 0x70, 0xF8, 0x00, 0xE3, 0xE0, 0x03, 0xCF, 0x00, + 0x07, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, + 0xF9, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x83, 0xE0, 0x07, 0x03, 0xC0, 0x1E, + 0x07, 0x80, 0xFF, 0x8F, 0xE3, 0xFF, 0x0F, 0xC7, 0xFE, 0x1F, 0x8F, 0xF8, + 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, 0x1F, 0xFE, 0x00, 0xFF, 0xE0, + 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0, + 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x60, 0x78, + 0x0F, 0x07, 0x80, 0xF0, 0x70, 0x0E, 0x07, 0x00, 0xE7, 0xFF, 0xFE, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x0F, 0xC0, 0x1F, 0x87, 0xE0, + 0x0F, 0xC7, 0xF8, 0x0F, 0xE1, 0xFC, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x3F, + 0x07, 0xF0, 0x3F, 0xC7, 0xF8, 0x1F, 0xE3, 0xF8, 0x0E, 0xF3, 0xDC, 0x07, + 0x7B, 0xDE, 0x03, 0x9F, 0xEF, 0x03, 0xCF, 0xE7, 0x81, 0xE7, 0xE3, 0x80, + 0xE3, 0xF1, 0xC0, 0x70, 0xF1, 0xE0, 0x38, 0x70, 0xF0, 0x3C, 0x00, 0x70, + 0x3F, 0xC1, 0xFE, 0x3F, 0xE1, 0xFF, 0x1F, 0xF0, 0xFF, 0x8F, 0xF0, 0x7F, + 0x80, 0x0F, 0xC1, 0xFE, 0x1F, 0xC1, 0xFF, 0x1F, 0xC3, 0xFE, 0x1F, 0xE1, + 0xFE, 0x07, 0xE0, 0x38, 0x07, 0xF0, 0x78, 0x07, 0xF0, 0x78, 0x0F, 0xF8, + 0x70, 0x0F, 0x78, 0x70, 0x0E, 0x78, 0xF0, 0x0E, 0x7C, 0xF0, 0x1E, 0x3C, + 0xF0, 0x1E, 0x3E, 0xE0, 0x1E, 0x1E, 0xE0, 0x1C, 0x1F, 0xE0, 0x1C, 0x0F, + 0xE0, 0x3C, 0x0F, 0xE0, 0x7F, 0x87, 0xC0, 0xFF, 0x87, 0xC0, 0xFF, 0x87, + 0xC0, 0xFF, 0x03, 0xC0, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, 0xC0, + 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x0F, + 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x01, + 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, 0xFF, + 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x00, 0x0F, 0xFF, 0x80, + 0x7F, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x0F, 0x81, 0xC0, + 0x3C, 0x1E, 0x01, 0xE0, 0xF0, 0x0F, 0x07, 0x00, 0xF0, 0x38, 0x0F, 0x83, + 0xFF, 0xF8, 0x1F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x38, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x01, 0xFF, + 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xF8, 0x07, 0xFF, + 0xC0, 0xFF, 0xFE, 0x1F, 0x87, 0xE3, 0xE0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, + 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x01, 0xEF, 0x00, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x7C, 0x7C, 0x1F, 0x87, + 0xFF, 0xF0, 0x3F, 0xFE, 0x01, 0xFF, 0x80, 0x07, 0xE0, 0x01, 0xFE, 0x30, + 0x3F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFF, 0x07, 0x83, 0xC0, 0x07, 0xFF, + 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, 0x03, 0xC0, 0xF8, + 0x0E, 0x01, 0xE0, 0x38, 0x07, 0x81, 0xE0, 0x3E, 0x07, 0x83, 0xF0, 0x1F, + 0xFF, 0x80, 0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x3C, 0x3E, + 0x00, 0xE0, 0x7C, 0x03, 0x80, 0xF0, 0x1E, 0x03, 0xE1, 0xFF, 0x07, 0xFF, + 0xFC, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xF8, 0x00, 0x7C, 0xE0, 0x7F, + 0xFC, 0x1F, 0xFF, 0x87, 0xFF, 0xE0, 0xF8, 0x7C, 0x3C, 0x07, 0x87, 0x80, + 0xE0, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0xF8, 0x03, 0xFF, + 0x80, 0x07, 0xF8, 0x40, 0x1F, 0x3C, 0x01, 0xE7, 0x80, 0x3C, 0xFC, 0x1F, + 0x1F, 0xFF, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0x7F, 0xFF, + 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x0E, 0x1F, 0xE1, 0xC3, + 0xBC, 0x78, 0x77, 0x0F, 0x1E, 0xE1, 0xC1, 0x80, 0x38, 0x00, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x3C, 0x00, + 0x07, 0x80, 0x0F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x00, + 0x7F, 0x8F, 0xF3, 0xFE, 0x7F, 0xDF, 0xF7, 0xFC, 0xFF, 0x1F, 0xE3, 0xC0, + 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0F, 0x0F, 0x00, 0x70, 0x78, 0x03, 0x83, + 0xC0, 0x3C, 0x1C, 0x01, 0xE0, 0xE0, 0x0E, 0x0F, 0x00, 0x70, 0x78, 0x03, + 0x83, 0xC0, 0x3C, 0x1F, 0x01, 0xC0, 0xFC, 0x3E, 0x03, 0xFF, 0xE0, 0x1F, + 0xFE, 0x00, 0x7F, 0xE0, 0x00, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0xFF, + 0x87, 0xFF, 0xFF, 0x0F, 0xFB, 0xFC, 0x1F, 0xE1, 0xC0, 0x0F, 0x03, 0xC0, + 0x1C, 0x07, 0x80, 0x78, 0x0F, 0x01, 0xE0, 0x1E, 0x03, 0x80, 0x1E, 0x0F, + 0x00, 0x3C, 0x3C, 0x00, 0x78, 0x70, 0x00, 0xF1, 0xE0, 0x01, 0xE7, 0x80, + 0x01, 0xEF, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, + 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0x87, 0xFF, + 0xFF, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE1, 0xFE, 0x78, 0x00, 0xF1, 0xE3, + 0xC3, 0x87, 0x8F, 0x0E, 0x1E, 0x7C, 0x78, 0x79, 0xF9, 0xC1, 0xEF, 0xEF, + 0x07, 0xBF, 0xBC, 0x1D, 0xFE, 0xE0, 0x77, 0x7F, 0x81, 0xFD, 0xFE, 0x07, + 0xE3, 0xF0, 0x3F, 0x8F, 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0xF8, 0x0F, 0x83, + 0xE0, 0x3E, 0x0F, 0x80, 0xF0, 0x3C, 0x00, 0x07, 0xE0, 0x7E, 0x0F, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFE, 0x0F, 0xE0, 0xFE, 0x03, 0xC0, 0xF8, 0x01, 0xE1, + 0xE0, 0x01, 0xF3, 0xC0, 0x00, 0xF7, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xEF, + 0x00, 0x07, 0xCF, 0x80, 0x0F, 0x87, 0xC0, 0x1F, 0x03, 0xC0, 0x7F, 0x07, + 0xF0, 0xFF, 0x8F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0x7E, 0x0F, + 0xEF, 0xF0, 0xFF, 0xFF, 0x0F, 0xEF, 0xE0, 0xFE, 0x3C, 0x0F, 0x01, 0xE1, + 0xE0, 0x1E, 0x3E, 0x00, 0xF7, 0xC0, 0x0F, 0xF8, 0x00, 0x7F, 0x00, 0x07, + 0xE0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x78, 0x00, 0x07, 0x00, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0xFF, 0xFC, 0x3F, 0xFF, 0x87, 0xFF, + 0xF0, 0xF0, 0x7C, 0x1C, 0x1F, 0x03, 0x87, 0xC0, 0x61, 0xF0, 0x00, 0x7C, + 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x07, + 0x07, 0xC0, 0xE1, 0xF0, 0x3C, 0x7C, 0x07, 0x9F, 0xFF, 0xF3, 0xFF, 0xFC, + 0x7F, 0xFF, 0x8F, 0xFF, 0xF0, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xE0, + 0x70, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, + 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, + 0x80, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0xF0, 0x1C, 0x07, 0x81, 0xE0, 0x78, + 0x0E, 0x03, 0xC0, 0xF0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, + 0xF0, 0x3C, 0x0F, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x06, + 0x07, 0xF8, 0x3F, 0xC1, 0xFC, 0x0F, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1C, 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, + 0x1C, 0x0F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x80, 0x00, 0x40, 0x01, 0x80, + 0x07, 0x80, 0x3F, 0x80, 0xFF, 0x03, 0xFF, 0x0F, 0x9F, 0x3E, 0x1E, 0xF8, + 0x3F, 0xE0, 0x3F, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xC3, 0xC7, 0x0E, 0x3C, 0x30, 0x00, 0xFE, 0x00, + 0x7F, 0xF0, 0x1F, 0xFF, 0x03, 0xFF, 0xE0, 0x00, 0x3C, 0x07, 0xFF, 0x83, + 0xFF, 0xF0, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0x80, 0xF3, 0xE0, 0x1E, 0x78, + 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xF8, 0xFE, 0x7E, 0x07, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x3C, 0xFC, 0x00, 0xEF, 0xFC, 0x03, 0xFF, 0xF8, + 0x1F, 0xFF, 0xE0, 0x7E, 0x0F, 0xC1, 0xE0, 0x1F, 0x07, 0x00, 0x3C, 0x1C, + 0x00, 0xF0, 0xE0, 0x03, 0xC3, 0x80, 0x1E, 0x0F, 0x00, 0xF8, 0x3E, 0x07, + 0xC7, 0xFF, 0xFF, 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0x81, 0xF1, 0xF8, 0x00, + 0x00, 0xFE, 0x60, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, 0xF0, 0x3C, + 0xF8, 0x03, 0x9E, 0x00, 0x67, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, + 0xC0, 0x00, 0x7E, 0x01, 0xC7, 0xFF, 0xF8, 0xFF, 0xFE, 0x0F, 0xFF, 0x80, + 0x7F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x07, 0xE3, 0x80, 0xFF, 0xDC, 0x0F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x0F, 0xC1, 0xF0, 0xF8, 0x07, 0x87, 0x80, 0x1C, + 0x78, 0x00, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x07, 0x87, 0xE0, + 0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x07, 0xE3, 0xE0, + 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0x7F, 0xFE, 0x3E, 0x0F, 0xCE, + 0x00, 0xF7, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x1E, 0xFF, 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF0, 0x3F, 0xF0, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, + 0xFF, 0xFC, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x01, 0xC0, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x1F, + 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x01, 0xF9, + 0xF8, 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xE3, 0xE0, 0xFC, 0x3E, + 0x03, 0xE1, 0xE0, 0x0E, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x3C, + 0x3E, 0x03, 0xE1, 0xF8, 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x80, 0xFF, + 0xFC, 0x01, 0xF9, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, + 0x7F, 0xF8, 0x07, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0xFF, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xC0, 0x00, + 0x38, 0x00, 0x03, 0x9F, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFE, + 0x07, 0xC3, 0xE0, 0x70, 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x1C, 0x0E, 0x03, + 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0x81, 0xE0, 0x38, 0x7F, 0x0F, 0xFF, 0xF8, + 0xFF, 0xFF, 0x8F, 0xF7, 0xF0, 0xFE, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xF0, + 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x01, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x3F, 0xFE, 0x0F, 0xFF, 0x81, 0xFF, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x78, 0x00, + 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x1F, 0xFE, + 0x0F, 0xFF, 0x03, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, + 0xCF, 0xF0, 0x3C, 0xFF, 0x03, 0x9F, 0xF0, 0x38, 0xFE, 0x07, 0xBF, 0x00, + 0x7F, 0xC0, 0x07, 0xF8, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x0F, 0x7E, 0x00, 0xE3, 0xF0, 0x7E, 0x1F, 0xE7, 0xE1, 0xFE, 0xFE, 0x3F, + 0xE7, 0xE1, 0xFC, 0x03, 0xFC, 0x07, 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x00, + 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, + 0xF0, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, + 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, + 0x7C, 0x78, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF0, 0xF1, + 0xF1, 0xE1, 0xC3, 0x83, 0xC7, 0x87, 0x07, 0x8F, 0x0E, 0x0E, 0x1C, 0x3C, + 0x1C, 0x38, 0x78, 0x78, 0x70, 0xE0, 0xF1, 0xE1, 0xC1, 0xC7, 0xE3, 0xC3, + 0xFF, 0xCF, 0xC7, 0xFF, 0x9F, 0x9F, 0xFF, 0x3E, 0x3E, 0x0F, 0x8F, 0x80, + 0xFD, 0xFF, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0x7E, 0x1F, 0x07, 0xC0, + 0x78, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x01, 0xE0, 0x70, 0x0F, 0x07, + 0x80, 0x70, 0x3C, 0x03, 0x87, 0xF0, 0x3F, 0x7F, 0xC3, 0xFF, 0xFE, 0x1F, + 0xEF, 0xE0, 0xFE, 0x01, 0xFC, 0x01, 0xFF, 0x80, 0xFF, 0xF8, 0x7F, 0xFE, + 0x3E, 0x0F, 0xDF, 0x01, 0xF7, 0x80, 0x3F, 0xC0, 0x0F, 0xF0, 0x03, 0xFC, + 0x01, 0xEF, 0x80, 0xFB, 0xF0, 0x7C, 0x7F, 0xFF, 0x1F, 0xFF, 0x03, 0xFF, + 0x80, 0x3F, 0x80, 0x07, 0xC7, 0xE0, 0x1F, 0xBF, 0xF0, 0x3F, 0xFF, 0xF0, + 0x7F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x78, 0x03, 0xC0, 0xE0, 0x07, 0x81, + 0xC0, 0x0F, 0x07, 0x00, 0x1E, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x3E, + 0x07, 0xC0, 0xFF, 0xFF, 0x81, 0xFF, 0xFE, 0x03, 0xDF, 0xF0, 0x07, 0x1F, + 0x80, 0x0E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xF8, + 0xF8, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x3E, 0x07, 0xC1, + 0xF0, 0x0F, 0x07, 0x80, 0x1C, 0x3C, 0x00, 0x70, 0xF0, 0x03, 0x83, 0xC0, + 0x0E, 0x0F, 0x80, 0x78, 0x3F, 0x07, 0xE0, 0x7F, 0xFF, 0x81, 0xFF, 0xFC, + 0x03, 0xFF, 0x70, 0x03, 0xF3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, + 0xF8, 0x00, 0x0F, 0xC3, 0xC1, 0xFC, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFE, + 0x03, 0xFC, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x07, 0x80, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFC, 0x0F, 0xFF, + 0xE0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x03, 0xF3, 0x0F, 0xFF, 0x3F, 0xFF, + 0x3F, 0xFF, 0x7C, 0x0E, 0x78, 0x00, 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFF, + 0x00, 0x3F, 0x70, 0x0F, 0xF8, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF8, + 0x0F, 0xE0, 0x06, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x7F, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFC, 0x1C, 0x00, 0x3C, 0x00, + 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x0E, + 0x7F, 0xFF, 0x7F, 0xFE, 0x3F, 0xFC, 0x0F, 0xE0, 0x7C, 0x0F, 0xFF, 0x07, + 0xFF, 0x81, 0xFF, 0xE0, 0x7E, 0x78, 0x03, 0x9E, 0x00, 0xE7, 0x80, 0x79, + 0xE0, 0x1E, 0x78, 0x07, 0x1E, 0x01, 0xC7, 0x80, 0xF1, 0xE0, 0xFC, 0x7F, + 0xFF, 0x9F, 0xFF, 0xE3, 0xFF, 0xF8, 0x3E, 0x7C, 0x7F, 0x87, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xE1, 0xE0, 0x3C, 0x0F, 0x03, 0xC0, + 0x78, 0x3C, 0x01, 0xE1, 0xC0, 0x0F, 0x1E, 0x00, 0x79, 0xE0, 0x03, 0xCE, + 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00, + 0x78, 0x00, 0x7E, 0x03, 0xF7, 0xF0, 0x3F, 0xFF, 0x81, 0xFD, 0xF8, 0x0F, + 0xE7, 0x8E, 0x1C, 0x3C, 0xF9, 0xE1, 0xE7, 0xCE, 0x0F, 0x7E, 0xF0, 0x7B, + 0xF7, 0x03, 0xFF, 0xF8, 0x1F, 0xDF, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, + 0x3E, 0x3E, 0x01, 0xF1, 0xF0, 0x0F, 0x07, 0x00, 0x0F, 0xE3, 0xF8, 0xFF, + 0x1F, 0xC7, 0xF9, 0xFE, 0x1F, 0x87, 0xF0, 0x7E, 0x7C, 0x01, 0xFF, 0xC0, + 0x07, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x01, 0xF7, + 0xC0, 0x1F, 0x1F, 0x03, 0xF0, 0x7C, 0x7F, 0xCF, 0xFB, 0xFE, 0x7F, 0xDF, + 0xE3, 0xFC, 0x07, 0xF0, 0x7F, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x07, + 0xE0, 0xFE, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xF0, 0x01, + 0xE1, 0xE0, 0x01, 0xE1, 0xC0, 0x01, 0xE3, 0xC0, 0x00, 0xF7, 0x80, 0x00, + 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, + 0xF0, 0x00, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF0, 0x00, 0x1F, + 0xFF, 0xC7, 0xFF, 0xF1, 0xFF, 0xF8, 0xFF, 0xFE, 0x3C, 0x1F, 0x0E, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x3C, 0xFF, 0xFF, 0x3F, 0xFF, 0xCF, 0xFF, 0xE3, 0xFF, 0xF8, 0x00, + 0xF0, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xF0, 0x0E, + 0x00, 0xE0, 0x1E, 0x01, 0xC0, 0xFC, 0x0F, 0x80, 0xF8, 0x0F, 0xC0, 0x3C, + 0x03, 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xE0, 0x7E, + 0x03, 0xE0, 0x1C, 0x00, 0x02, 0x07, 0x07, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E, + 0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78, + 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0xE0, 0x01, 0xC0, 0x1F, 0x00, 0xFC, + 0x07, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, 0x03, 0xC0, 0x1C, + 0x00, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x0F, 0xE0, 0x7E, 0x07, + 0xE0, 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xFF, 0xFC, 0xFF, + 0x3F, 0xFF, 0x0F, 0xF8, 0x03, 0xF8, 0x00, 0xF0 }; + +const GFXglyph FreeMonoBoldOblique18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 21, 0, 1 }, // 0x20 ' ' + { 0, 9, 22, 21, 9, -21 }, // 0x21 '!' + { 25, 12, 10, 21, 9, -20 }, // 0x22 '"' + { 40, 18, 25, 21, 4, -22 }, // 0x23 '#' + { 97, 18, 28, 21, 4, -23 }, // 0x24 '$' + { 160, 16, 21, 21, 5, -20 }, // 0x25 '%' + { 202, 16, 20, 21, 4, -19 }, // 0x26 '&' + { 242, 5, 10, 21, 12, -20 }, // 0x27 ''' + { 249, 10, 27, 21, 11, -21 }, // 0x28 '(' + { 283, 10, 27, 21, 4, -21 }, // 0x29 ')' + { 317, 15, 15, 21, 6, -21 }, // 0x2A '*' + { 346, 18, 19, 21, 4, -18 }, // 0x2B '+' + { 389, 9, 10, 21, 4, -3 }, // 0x2C ',' + { 401, 18, 4, 21, 4, -11 }, // 0x2D '-' + { 410, 5, 5, 21, 8, -4 }, // 0x2E '.' + { 414, 21, 28, 21, 2, -23 }, // 0x2F '/' + { 488, 17, 23, 21, 5, -22 }, // 0x30 '0' + { 537, 15, 22, 21, 3, -21 }, // 0x31 '1' + { 579, 20, 23, 21, 2, -22 }, // 0x32 '2' + { 637, 18, 23, 21, 3, -22 }, // 0x33 '3' + { 689, 16, 21, 21, 4, -20 }, // 0x34 '4' + { 731, 18, 22, 21, 4, -21 }, // 0x35 '5' + { 781, 19, 23, 21, 5, -22 }, // 0x36 '6' + { 836, 16, 22, 21, 6, -21 }, // 0x37 '7' + { 880, 19, 23, 21, 3, -22 }, // 0x38 '8' + { 935, 18, 23, 21, 4, -22 }, // 0x39 '9' + { 987, 7, 16, 21, 9, -15 }, // 0x3A ':' + { 1001, 11, 22, 21, 4, -15 }, // 0x3B ';' + { 1032, 18, 16, 21, 4, -17 }, // 0x3C '<' + { 1068, 19, 10, 21, 3, -14 }, // 0x3D '=' + { 1092, 19, 16, 21, 3, -17 }, // 0x3E '>' + { 1130, 14, 21, 21, 8, -20 }, // 0x3F '?' + { 1167, 18, 27, 21, 3, -21 }, // 0x40 '@' + { 1228, 22, 21, 21, 0, -20 }, // 0x41 'A' + { 1286, 21, 21, 21, 1, -20 }, // 0x42 'B' + { 1342, 21, 21, 21, 2, -20 }, // 0x43 'C' + { 1398, 21, 21, 21, 1, -20 }, // 0x44 'D' + { 1454, 22, 21, 21, 0, -20 }, // 0x45 'E' + { 1512, 23, 21, 21, 0, -20 }, // 0x46 'F' + { 1573, 21, 21, 21, 2, -20 }, // 0x47 'G' + { 1629, 23, 21, 21, 0, -20 }, // 0x48 'H' + { 1690, 19, 21, 21, 2, -20 }, // 0x49 'I' + { 1740, 23, 21, 21, 0, -20 }, // 0x4A 'J' + { 1801, 23, 21, 21, 0, -20 }, // 0x4B 'K' + { 1862, 20, 21, 21, 1, -20 }, // 0x4C 'L' + { 1915, 25, 21, 21, 0, -20 }, // 0x4D 'M' + { 1981, 24, 21, 21, 1, -20 }, // 0x4E 'N' + { 2044, 20, 21, 21, 2, -20 }, // 0x4F 'O' + { 2097, 21, 21, 21, 1, -20 }, // 0x50 'P' + { 2153, 20, 26, 21, 2, -20 }, // 0x51 'Q' + { 2218, 22, 21, 21, 0, -20 }, // 0x52 'R' + { 2276, 19, 21, 21, 3, -20 }, // 0x53 'S' + { 2326, 19, 21, 21, 3, -20 }, // 0x54 'T' + { 2376, 21, 21, 21, 3, -20 }, // 0x55 'U' + { 2432, 23, 21, 21, 1, -20 }, // 0x56 'V' + { 2493, 22, 21, 21, 2, -20 }, // 0x57 'W' + { 2551, 24, 21, 21, 0, -20 }, // 0x58 'X' + { 2614, 20, 21, 21, 3, -20 }, // 0x59 'Y' + { 2667, 19, 21, 21, 2, -20 }, // 0x5A 'Z' + { 2717, 13, 27, 21, 8, -21 }, // 0x5B '[' + { 2761, 10, 28, 21, 8, -23 }, // 0x5C '\' + { 2796, 13, 27, 21, 4, -21 }, // 0x5D ']' + { 2840, 15, 11, 21, 6, -21 }, // 0x5E '^' + { 2861, 21, 4, 21, -1, 4 }, // 0x5F '_' + { 2872, 6, 6, 21, 10, -22 }, // 0x60 '`' + { 2877, 19, 16, 21, 2, -15 }, // 0x61 'a' + { 2915, 22, 22, 21, 0, -21 }, // 0x62 'b' + { 2976, 19, 16, 21, 3, -15 }, // 0x63 'c' + { 3014, 21, 22, 21, 3, -21 }, // 0x64 'd' + { 3072, 18, 16, 21, 3, -15 }, // 0x65 'e' + { 3108, 21, 22, 21, 3, -21 }, // 0x66 'f' + { 3166, 21, 23, 21, 2, -15 }, // 0x67 'g' + { 3227, 20, 22, 21, 1, -21 }, // 0x68 'h' + { 3282, 16, 22, 21, 3, -21 }, // 0x69 'i' + { 3326, 18, 29, 21, 2, -21 }, // 0x6A 'j' + { 3392, 20, 22, 21, 1, -21 }, // 0x6B 'k' + { 3447, 16, 22, 21, 3, -21 }, // 0x6C 'l' + { 3491, 23, 16, 21, 0, -15 }, // 0x6D 'm' + { 3537, 21, 16, 21, 1, -15 }, // 0x6E 'n' + { 3579, 18, 16, 21, 3, -15 }, // 0x6F 'o' + { 3615, 23, 23, 21, -1, -15 }, // 0x70 'p' + { 3682, 22, 23, 21, 2, -15 }, // 0x71 'q' + { 3746, 20, 16, 21, 2, -15 }, // 0x72 'r' + { 3786, 16, 16, 21, 4, -15 }, // 0x73 's' + { 3818, 16, 21, 21, 4, -20 }, // 0x74 't' + { 3860, 18, 16, 21, 3, -15 }, // 0x75 'u' + { 3896, 21, 16, 21, 2, -15 }, // 0x76 'v' + { 3938, 21, 16, 21, 3, -15 }, // 0x77 'w' + { 3980, 21, 16, 21, 1, -15 }, // 0x78 'x' + { 4022, 24, 23, 21, -1, -15 }, // 0x79 'y' + { 4091, 18, 16, 21, 3, -15 }, // 0x7A 'z' + { 4127, 12, 27, 21, 8, -21 }, // 0x7B '{' + { 4168, 8, 27, 21, 8, -21 }, // 0x7C '|' + { 4195, 13, 27, 21, 4, -21 }, // 0x7D '}' + { 4239, 17, 8, 21, 4, -13 } }; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique18pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique18pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique18pt7bGlyphs, + 0x20, 0x7E, 35 }; + +// Approx. 4928 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h new file mode 100644 index 0000000..a2bbbdf --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h @@ -0,0 +1,742 @@ +const uint8_t FreeMonoBoldOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x3F, 0x07, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xE0, 0xFE, + 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0xFC, 0x1F, 0xC1, 0xF8, 0x1F, 0x81, 0xF8, + 0x1F, 0x81, 0xF0, 0x1F, 0x01, 0xF0, 0x1E, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xC0, 0x7E, 0x0F, 0xE0, 0xFE, 0x0F, 0xC0, 0x78, 0x00, 0x7E, + 0x1F, 0xBF, 0x0F, 0xDF, 0x87, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF1, + 0xE0, 0xF8, 0xF0, 0x7C, 0x78, 0x3C, 0x38, 0x1E, 0x1C, 0x0F, 0x0E, 0x07, + 0x0E, 0x03, 0x83, 0x01, 0x80, 0x00, 0x1C, 0x1C, 0x00, 0x3E, 0x3E, 0x00, + 0x3E, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, + 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x0F, + 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFE, 0x03, 0xE3, 0xE0, 0x03, 0xE3, 0xE0, 0x03, 0xC3, 0xC0, 0x07, + 0xC7, 0xC0, 0x7F, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0x0F, 0x0F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, + 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x3E, 0x1E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, + 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x7C, 0x7C, 0x00, 0x38, 0x38, 0x00, 0x00, + 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0xFF, 0x00, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0x81, 0xFC, 0x1F, 0xC1, 0xF8, 0x03, 0xC0, 0xF8, 0x01, + 0xE0, 0x7C, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xFF, + 0x80, 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x00, + 0x7F, 0xC0, 0x00, 0x07, 0xE0, 0xE0, 0x01, 0xF0, 0xF0, 0x00, 0xF8, 0xF8, + 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xC3, 0xC0, 0x0E, 0x07, 0x00, + 0x70, 0x1C, 0x01, 0xC0, 0x70, 0x07, 0x01, 0xC0, 0x1C, 0x0E, 0x00, 0x78, + 0x78, 0x00, 0xFF, 0xC0, 0x03, 0xFE, 0x1F, 0x03, 0xE3, 0xFC, 0x00, 0x7F, + 0xC0, 0x0F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x03, 0xF8, 0x7C, 0x0F, + 0x07, 0xFC, 0x00, 0x3F, 0xF0, 0x01, 0xE1, 0xE0, 0x07, 0x03, 0x80, 0x38, + 0x0E, 0x00, 0xE0, 0x38, 0x03, 0x80, 0xE0, 0x0E, 0x07, 0x00, 0x3C, 0x3C, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, + 0x01, 0xFF, 0x80, 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFE, 0x01, 0xF1, + 0xE0, 0x1F, 0x04, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, + 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xE3, + 0xE7, 0xFF, 0x3F, 0x7E, 0xFF, 0xFB, 0xE7, 0xFF, 0x9E, 0x1F, 0xF1, 0xF0, + 0xFF, 0x8F, 0x83, 0xF8, 0x7C, 0x1F, 0xC3, 0xF0, 0xFF, 0x9F, 0xFF, 0xFC, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xFD, 0xF0, 0x1F, 0x80, 0x00, 0x7E, + 0xFD, 0xF3, 0xE7, 0xCF, 0x3E, 0x7C, 0xF1, 0xE3, 0xC7, 0x0E, 0x18, 0x00, + 0x00, 0x18, 0x00, 0xF0, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF8, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8, + 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x03, + 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x00, 0xC0, 0x07, 0x80, 0x3F, 0x00, 0xFC, + 0x03, 0xF0, 0x07, 0xE0, 0x1F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xF0, 0x07, + 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x00, 0x00, 0x3C, + 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x08, + 0x3C, 0x09, 0xF9, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0x87, 0xFF, 0xE0, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, 0xFF, 0x00, 0x7F, + 0xF8, 0x07, 0xE7, 0xE0, 0x3E, 0x3F, 0x01, 0xE0, 0xF8, 0x0E, 0x07, 0x80, + 0x00, 0x07, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x7C, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, + 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x07, 0x80, 0x78, 0x0F, 0x00, + 0xE0, 0x0C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, + 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F, 0x83, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F, + 0x1F, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xF8, 0x00, 0xF9, 0xF0, 0x01, 0xF3, + 0xC0, 0x07, 0xCF, 0x80, 0x0F, 0x9F, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x78, + 0x00, 0xF8, 0xF0, 0x01, 0xF3, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0x8F, 0x80, + 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, 0x01, 0xF0, 0xFC, 0x07, + 0xC1, 0xFC, 0x3F, 0x81, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, + 0x03, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x7E, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFB, 0xE0, 0x1F, + 0x9E, 0x00, 0xF1, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, + 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x01, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0xFF, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x03, 0xFF, 0xF0, + 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0x07, 0xF0, 0x1F, 0x00, + 0xFC, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF0, 0x01, 0xF0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x70, 0x3F, 0x80, 0x3E, 0x1F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x1F, + 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x0F, 0x81, 0xFC, 0x07, + 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xC0, + 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, + 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x3C, 0x01, + 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, + 0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xE0, 0x03, 0xFF, + 0x80, 0x1F, 0xBE, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0xC0, 0x1F, 0x1F, 0x00, + 0xF8, 0x7C, 0x07, 0xE1, 0xE0, 0x3F, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xC0, + 0xF8, 0x3E, 0x03, 0xC1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0x80, 0x00, 0xF8, 0x00, 0x3F, 0xF8, 0x01, + 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x7F, 0xF0, 0x01, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, 0x3F, + 0xFF, 0xE0, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF7, 0xF0, 0x00, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x0F, 0x01, 0xFC, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0xF8, 0x3C, 0x03, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0x00, + 0x01, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x7F, 0xFF, 0x00, + 0xFF, 0xFE, 0x01, 0xFE, 0x1C, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x0F, + 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x3E, + 0xFF, 0x80, 0x7D, 0xFF, 0xC0, 0x7F, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, 0x7F, + 0x87, 0xF0, 0xFF, 0x03, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8, + 0x01, 0xF0, 0xF8, 0x01, 0xF0, 0xF8, 0x03, 0xE0, 0xF8, 0x03, 0xE0, 0xFC, + 0x07, 0xC0, 0xFE, 0x0F, 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x00, 0x3F, + 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xFF, 0xFD, 0xFF, + 0xFF, 0xE7, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFB, 0xE0, 0x07, + 0xCF, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x00, + 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF, + 0xE0, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x7F, 0xFF, 0xC0, 0xFC, 0x1F, + 0xC3, 0xF0, 0x1F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x7C, + 0x7C, 0x01, 0xF0, 0xFC, 0x07, 0xE0, 0xFC, 0x1F, 0x81, 0xFF, 0xFE, 0x01, + 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0xFE, + 0x0F, 0xC3, 0xF0, 0x0F, 0xC7, 0xC0, 0x0F, 0x9F, 0x00, 0x1F, 0x3E, 0x00, + 0x3E, 0x7C, 0x00, 0xFC, 0xFC, 0x03, 0xF1, 0xFC, 0x1F, 0xE3, 0xFF, 0xFF, + 0x83, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFC, 0x00, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xFC, 0x01, 0xFF, + 0xFE, 0x03, 0xFF, 0xFE, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x3F, 0x07, 0xC0, + 0x1F, 0x0F, 0xC0, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, + 0x3F, 0x0F, 0xC0, 0x7F, 0x0F, 0xE1, 0xFF, 0x07, 0xFF, 0xFE, 0x07, 0xFF, + 0xFE, 0x03, 0xFF, 0xBE, 0x01, 0xFF, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0x00, + 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x0F, + 0xE0, 0x00, 0x1F, 0xC0, 0x38, 0x7F, 0x80, 0x7F, 0xFF, 0x00, 0xFF, 0xFE, + 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x07, 0x83, + 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0x8F, 0xE3, 0xF8, 0xFC, + 0x1E, 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, + 0x1F, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, + 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F, + 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xE0, + 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, + 0x80, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, + 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x7F, + 0xE0, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x07, 0xFC, + 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x01, 0xFF, + 0xE1, 0xFF, 0xFE, 0x3F, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0x1F, 0xFE, 0x00, + 0xFF, 0x80, 0x1F, 0xF0, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, + 0xE0, 0x07, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x0F, 0xE0, + 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, + 0x3F, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF0, 0x01, + 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xC1, 0xE0, + 0x07, 0x87, 0xC0, 0x0F, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x78, 0x78, 0x07, + 0xF1, 0xE0, 0x3F, 0xE3, 0xC1, 0xFF, 0x87, 0x87, 0xFF, 0x0E, 0x1F, 0x9E, + 0x3C, 0x7C, 0x3C, 0x78, 0xF0, 0x78, 0xF3, 0xC0, 0xE1, 0xC7, 0x83, 0xC3, + 0x8F, 0x07, 0x8F, 0x1E, 0x0F, 0x1E, 0x3E, 0x1C, 0x3C, 0x7F, 0xFC, 0x78, + 0x7F, 0xFC, 0xF0, 0x7F, 0xF1, 0xE0, 0x3F, 0xE3, 0xC0, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0x01, + 0xC0, 0x7F, 0xFF, 0x80, 0x7F, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x80, + 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x7F, 0xF0, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, + 0x7C, 0x7C, 0x00, 0x01, 0xE1, 0xF8, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x7C, + 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x3F, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFC, + 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xC0, 0x07, 0xE0, 0x3E, 0x00, 0x0F, 0x87, + 0xFF, 0x03, 0xFF, 0xBF, 0xFC, 0x1F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0xC1, 0xFF, 0xEF, 0xFE, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x3F, + 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, + 0xFF, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x03, 0xE0, 0x1E, 0x00, 0x1F, + 0x01, 0xF0, 0x00, 0xF8, 0x0F, 0x80, 0x0F, 0x80, 0x7C, 0x01, 0xF8, 0x03, + 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xC0, 0x0F, 0xF0, 0x3E, 0x00, 0x1F, + 0x81, 0xF0, 0x00, 0x7C, 0x0F, 0x80, 0x03, 0xE0, 0x78, 0x00, 0x1F, 0x03, + 0xC0, 0x03, 0xF1, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0x87, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x03, 0xFF, 0xE6, 0x00, 0x7F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0x03, + 0xFF, 0xFF, 0xF0, 0x7F, 0x81, 0xFF, 0x0F, 0xE0, 0x07, 0xE1, 0xF8, 0x00, + 0x3E, 0x1F, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x3C, 0x3E, 0x00, 0x03, 0xC7, + 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0, + 0x00, 0x70, 0x7E, 0x00, 0x1F, 0x07, 0xF8, 0x07, 0xF0, 0x3F, 0xFF, 0xFF, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF0, 0x07, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0x00, 0xFE, + 0x01, 0xF0, 0x07, 0xE0, 0x1E, 0x00, 0x3F, 0x01, 0xE0, 0x01, 0xF0, 0x3E, + 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xC0, 0x01, + 0xF0, 0x7C, 0x00, 0x1F, 0x07, 0xC0, 0x03, 0xF0, 0x7C, 0x00, 0x3E, 0x07, + 0x80, 0x03, 0xE0, 0x78, 0x00, 0x7E, 0x0F, 0x80, 0x07, 0xC0, 0xF8, 0x00, + 0xFC, 0x0F, 0x80, 0x1F, 0x80, 0xF0, 0x07, 0xF0, 0x7F, 0xFF, 0xFE, 0x07, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, + 0xFE, 0x1F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x00, 0x78, 0x00, 0xF8, + 0x07, 0xC0, 0x07, 0xC0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0xF1, 0xE0, 0x0F, + 0x0F, 0x8E, 0x00, 0x78, 0x7C, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x3F, 0xFE, + 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFF, 0xFC, 0x00, + 0x07, 0xC3, 0xC0, 0x00, 0x3E, 0x1E, 0x1E, 0x01, 0xE0, 0xE0, 0xF0, 0x0F, + 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x7C, 0x07, 0xC0, 0x03, 0xE1, 0xFF, 0xFF, + 0xFE, 0x1F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF8, + 0x1F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0, + 0x1F, 0x00, 0x0F, 0x80, 0x3E, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x7C, 0x00, + 0xF0, 0x70, 0xF8, 0x03, 0xE1, 0xF0, 0xE0, 0x07, 0xC3, 0xC0, 0x00, 0x0F, + 0xFF, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF, + 0xFC, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xC3, 0xE0, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x1F, 0x07, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0x80, + 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xF8, 0x00, + 0x00, 0x00, 0x07, 0xF8, 0x60, 0x03, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0x80, 0xFE, 0x0F, 0xE0, + 0x03, 0xE0, 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x03, 0xC3, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x7F, 0xFC, 0xF8, 0x0F, 0xFF, + 0xEF, 0x80, 0xFF, 0xFE, 0xF8, 0x0F, 0xFF, 0xCF, 0x80, 0x7F, 0xF8, 0xF8, + 0x00, 0x1F, 0x0F, 0xC0, 0x01, 0xF0, 0xFE, 0x00, 0x1F, 0x07, 0xF8, 0x07, + 0xE0, 0x7F, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFC, 0x00, + 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x0F, 0xF8, 0x0F, + 0xFC, 0x7F, 0xF0, 0x7F, 0xF1, 0xFF, 0xC1, 0xFF, 0xC7, 0xFE, 0x03, 0xFE, + 0x1F, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, + 0x00, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x07, 0x80, 0x1F, 0x00, 0x1E, + 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x07, 0xFE, 0x1F, 0xF8, 0x3F, 0xF8, 0xFF, + 0xF0, 0xFF, 0xE3, 0xFF, 0xC3, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x3F, 0xF8, + 0x00, 0x03, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x01, 0xFF, 0xFF, + 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFC, 0x00, 0x3F, + 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x07, 0x00, 0x0F, 0x80, + 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x78, 0x00, 0x78, 0x01, + 0xF0, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, + 0x80, 0x3F, 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, + 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xC3, 0xFE, 0x0F, 0xFF, 0x8F, 0xFC, 0x1F, + 0xFF, 0x3F, 0xF8, 0x3F, 0xFE, 0x7F, 0xF0, 0x7F, 0xF8, 0x7F, 0xC0, 0x1F, + 0x01, 0xFC, 0x00, 0x3E, 0x07, 0xF0, 0x00, 0x78, 0x3F, 0x80, 0x01, 0xF0, + 0xFE, 0x00, 0x03, 0xE3, 0xF0, 0x00, 0x07, 0xDF, 0xC0, 0x00, 0x0F, 0xFE, + 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x01, 0xFC, 0xFC, 0x00, 0x03, 0xE0, 0xFC, 0x00, 0x0F, 0x81, 0xF8, + 0x00, 0x1F, 0x01, 0xF8, 0x00, 0x3E, 0x03, 0xF0, 0x00, 0x78, 0x03, 0xE0, + 0x00, 0xF0, 0x07, 0xE0, 0x1F, 0xFE, 0x0F, 0xF8, 0x7F, 0xFC, 0x1F, 0xF8, + 0xFF, 0xF8, 0x1F, 0xF1, 0xFF, 0xF0, 0x3F, 0xE1, 0xFF, 0xC0, 0x7F, 0x80, + 0x03, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0xF0, 0x01, 0xE0, 0x3E, 0x00, + 0x7C, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x01, 0xF0, 0x1E, 0x00, 0x7C, 0x07, + 0xC0, 0x0F, 0x9F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0x9F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x3F, + 0xC1, 0xFF, 0x00, 0x1F, 0xF0, 0x7F, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0x03, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0xE0, + 0x3F, 0xE0, 0x0F, 0xF8, 0x1F, 0xF0, 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xF7, + 0xC3, 0xFF, 0x00, 0x7D, 0xF1, 0xF7, 0xC0, 0x1F, 0x7C, 0xFD, 0xF0, 0x07, + 0xDF, 0xBE, 0x78, 0x01, 0xE3, 0xFF, 0x3E, 0x00, 0x78, 0xFF, 0xCF, 0x80, + 0x3E, 0x3F, 0xE3, 0xE0, 0x0F, 0x87, 0xF0, 0xF8, 0x03, 0xE1, 0xFC, 0x3C, + 0x00, 0xF0, 0x7E, 0x1F, 0x00, 0x7C, 0x1F, 0x07, 0xC0, 0x1F, 0x00, 0x01, + 0xF0, 0x07, 0xC0, 0x00, 0x78, 0x07, 0xFE, 0x01, 0xFF, 0x83, 0xFF, 0xC0, + 0xFF, 0xF0, 0xFF, 0xF0, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F, 0xFE, 0x0F, 0xFC, + 0x03, 0xFF, 0x00, 0x07, 0xF8, 0x07, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, + 0xFC, 0x0F, 0xFF, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFE, 0x0F, 0xFE, 0x01, + 0xFE, 0x00, 0xF8, 0x01, 0xFF, 0x00, 0xF0, 0x01, 0xFF, 0x01, 0xF0, 0x03, + 0xFF, 0x81, 0xF0, 0x03, 0xFF, 0x81, 0xF0, 0x03, 0xEF, 0xC1, 0xF0, 0x03, + 0xCF, 0xC1, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07, 0xC7, 0xE3, 0xE0, 0x07, + 0xC3, 0xF3, 0xE0, 0x07, 0xC3, 0xF3, 0xC0, 0x07, 0x81, 0xF7, 0xC0, 0x0F, + 0x81, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F, 0x80, 0xFF, 0xC0, 0x0F, + 0x00, 0xFF, 0x80, 0x0F, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x7F, 0x80, 0xFF, + 0xF0, 0x3F, 0x80, 0xFF, 0xF0, 0x3F, 0x00, 0xFF, 0xF0, 0x1F, 0x00, 0x7F, + 0xE0, 0x1F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F, 0x83, + 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x7E, 0x1F, 0x00, 0x07, 0xE7, 0xE0, 0x00, + 0x7C, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3E, 0xF0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00, 0x07, + 0xDF, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x3E, 0x7C, 0x00, 0x0F, 0xCF, 0xC0, + 0x01, 0xF0, 0xF8, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x83, 0xFC, 0x1F, 0xE0, + 0x3F, 0xFF, 0xF8, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x03, 0xFF, + 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF8, + 0x07, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF0, 0x0F, + 0x80, 0x7F, 0x00, 0xF8, 0x01, 0xF0, 0x0F, 0x00, 0x1F, 0x01, 0xF0, 0x01, + 0xF0, 0x1F, 0x00, 0x1F, 0x01, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7E, 0x01, + 0xE0, 0x0F, 0xC0, 0x3F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, + 0xE0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7F, 0xFF, + 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xF0, 0x00, + 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x03, + 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x0F, 0xF0, 0x7F, + 0x83, 0xF8, 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x1F, 0x00, 0x07, 0xE7, 0xC0, + 0x00, 0x7D, 0xF8, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x3F, + 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3E, 0xF8, 0x00, + 0x07, 0xDF, 0x00, 0x01, 0xFB, 0xE0, 0x00, 0x3E, 0x7E, 0x00, 0x0F, 0x8F, + 0xC0, 0x03, 0xF0, 0xFC, 0x01, 0xFC, 0x1F, 0xE0, 0xFF, 0x01, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xF0, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xF8, 0x38, 0x0F, 0xFF, 0xFF, + 0x81, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x00, 0xF0, + 0x1F, 0x80, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, + 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x00, 0x7C, 0x03, + 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x00, 0xF0, 0x01, 0xF0, + 0x0F, 0x80, 0x1F, 0x80, 0x7C, 0x01, 0xF8, 0x03, 0xE0, 0x3F, 0x80, 0x1F, + 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, + 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x1E, 0x07, 0xF0, 0x01, 0xF0, 0x1F, 0xC0, + 0x0F, 0x80, 0x7E, 0x00, 0x7C, 0x03, 0xF8, 0x03, 0xC0, 0x0F, 0xC0, 0xFF, + 0xE0, 0x7F, 0xCF, 0xFF, 0x01, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xDF, 0xFC, 0x01, 0xFC, 0x00, 0x0F, 0xE1, 0x80, 0x0F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xC1, 0xFC, 0x0F, + 0xE0, 0x7C, 0x01, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x03, 0xE0, + 0x03, 0xC0, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFF, 0x80, 0x01, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFE, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0xF8, 0xF8, 0x00, + 0x3E, 0x3E, 0x00, 0x1F, 0x8F, 0xC0, 0x0F, 0xC3, 0xFC, 0x0F, 0xF0, 0xFF, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x03, 0x9F, 0xFE, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF7, 0xFF, + 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x9F, 0x07, 0x83, 0xE7, + 0x83, 0xE0, 0xFB, 0xE0, 0xF8, 0x3E, 0xF8, 0x3E, 0x0F, 0x3E, 0x0F, 0x07, + 0xCF, 0x07, 0xC1, 0xF3, 0x81, 0xF0, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x7C, 0x00, 0x07, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, + 0x80, 0x3F, 0xFF, 0xE0, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xF0, 0x7F, 0xE7, + 0xFF, 0x8F, 0xFF, 0x7F, 0xF9, 0xFF, 0xF7, 0xFF, 0x1F, 0xFE, 0x7F, 0xF0, + 0xFF, 0xC1, 0xE0, 0x01, 0xF0, 0x1E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, + 0x3E, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xE0, 0x3C, 0x00, 0x3E, 0x07, 0xC0, + 0x03, 0xE0, 0x7C, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xC0, 0x7C, 0x00, 0x3C, + 0x07, 0x80, 0x07, 0xC0, 0xF8, 0x00, 0x7C, 0x0F, 0x80, 0x07, 0xC0, 0xF8, + 0x00, 0x78, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, + 0x00, 0xFF, 0x07, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xC0, 0x03, + 0xFF, 0xF0, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7F, 0xF0, + 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFC, 0x0F, + 0xFF, 0x7F, 0xE0, 0x3F, 0xF8, 0x7C, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0xF8, + 0x07, 0xC0, 0x03, 0xE0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x00, + 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x1F, + 0x03, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x01, 0xF0, 0xFC, 0x00, 0x07, 0xC3, + 0xE0, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x3E, 0xFC, 0x00, 0x00, 0xFB, 0xE0, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0x1E, 0x00, + 0x01, 0xE0, 0xF0, 0x7C, 0x1F, 0x0F, 0x87, 0xE0, 0xF0, 0x7C, 0x3F, 0x0F, + 0x83, 0xE3, 0xF8, 0x7C, 0x1F, 0x1F, 0xE3, 0xC0, 0xF9, 0xFF, 0x3E, 0x07, + 0xCF, 0xF9, 0xF0, 0x3E, 0xFF, 0xCF, 0x01, 0xF7, 0xBE, 0xF8, 0x0F, 0xFD, + 0xF7, 0xC0, 0x7B, 0xCF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0, 0x3F, 0xE3, 0xFF, + 0x01, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x03, + 0xF8, 0x1F, 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x07, 0xF0, 0x07, 0xE0, + 0x3F, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF, + 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFE, 0x07, 0xFE, 0x03, 0xFC, + 0x03, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xFE, 0x07, 0xE0, 0x00, 0x7E, + 0x1F, 0xC0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x1F, + 0xFC, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, + 0xF8, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x03, 0xF0, + 0x7E, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x0F, 0xC0, 0x1F, 0x80, 0x7F, 0xE0, + 0x7F, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xE0, + 0xFF, 0xE0, 0x7F, 0xC0, 0xFF, 0xC0, 0x7F, 0xC0, 0x7F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0x80, 0xFF, 0x87, 0xC0, + 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0xC3, 0xE0, 0x01, + 0xF1, 0xF0, 0x00, 0x7E, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x00, + 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, + 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xE0, + 0x3F, 0xFF, 0xFC, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x0F, 0xC0, 0x1F, 0x03, + 0xF0, 0x03, 0xC0, 0xFC, 0x00, 0xF8, 0x3F, 0x00, 0x0E, 0x0F, 0xC0, 0x00, + 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x0E, 0x00, 0x7E, 0x03, 0xE0, 0x1F, + 0x80, 0x7C, 0x07, 0xE0, 0x0F, 0x01, 0xF8, 0x03, 0xE0, 0x7E, 0x00, 0x7C, + 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x0F, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x0F, + 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0x80, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, + 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x00, 0x20, 0x03, 0xC0, 0x3E, 0x01, 0xF0, + 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x03, 0xE0, 0x1F, + 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0xF8, + 0x07, 0xC0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x00, 0xFF, 0xC0, 0x7F, + 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x03, 0xE0, 0x00, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x7F, 0xE0, 0x3F, 0xF8, + 0x0F, 0xFC, 0x03, 0xFF, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x01, + 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xF0, 0x03, + 0xFF, 0x80, 0xFF, 0xF8, 0x1F, 0xCF, 0xC3, 0xF8, 0xFE, 0x7E, 0x07, 0xEF, + 0xC0, 0x3F, 0xF8, 0x03, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xE0, 0x7F, 0xFF, + 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, + 0x06, 0x00, 0x3F, 0xE0, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x07, 0xFF, + 0xFE, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x3E, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0x00, 0x78, 0x7C, 0x00, 0x78, 0xF8, 0x00, + 0xF8, 0xF8, 0x03, 0xF8, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFD, 0xFE, 0x0F, 0xE0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0x00, 0x0F, 0xBF, 0xFC, 0x00, 0x7F, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x00, 0xFF, 0x03, + 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x7E, 0x00, 0x3F, 0x03, 0xE0, 0x00, 0xF8, + 0x1F, 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0x7C, + 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0xC0, 0xFC, 0x00, + 0x7C, 0x0F, 0xE0, 0x07, 0xE3, 0xFF, 0xC0, 0xFE, 0x3F, 0xFF, 0xFF, 0xE1, + 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x7F, 0x9F, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF, + 0xE0, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0x01, 0xFC, 0x7E, 0x00, + 0x7C, 0x7E, 0x00, 0x3E, 0x3E, 0x00, 0x0E, 0x3E, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x0C, 0x7F, 0x80, 0x3F, 0x1F, + 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x00, + 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0x87, 0xC0, 0x0F, + 0xFF, 0x7C, 0x03, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0x81, 0xFC, 0x0F, 0xF8, 0x3F, 0x00, 0x3F, 0x83, 0xE0, 0x01, 0xF0, 0x7C, + 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x0F, 0x80, 0x01, + 0xF0, 0xF8, 0x00, 0x1E, 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F, + 0xC0, 0x07, 0xE0, 0xFC, 0x00, 0xFE, 0x07, 0xF0, 0x3F, 0xF8, 0x7F, 0xFF, + 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xC0, 0xFF, 0xE7, 0xF8, + 0x03, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xF0, 0x03, 0xFF, + 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x1F, 0xE0, 0x7E, 0x3F, 0x80, + 0x1F, 0x3F, 0x00, 0x0F, 0x7E, 0x00, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x1C, 0x7F, 0x01, 0xFE, 0x7F, 0xFF, + 0xFE, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, + 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x01, 0xF0, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x7F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x0F, 0xFE, 0xFF, 0x03, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF1, 0xFC, 0x1F, 0xFE, 0x3F, 0x80, 0x7F, 0x03, 0xE0, + 0x03, 0xF0, 0x7E, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0x3E, + 0x0F, 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x3E, 0x0F, 0x80, 0x03, 0xC0, 0xF8, + 0x00, 0x7C, 0x0F, 0xC0, 0x0F, 0xC0, 0xFC, 0x01, 0xFC, 0x07, 0xF0, 0x7F, + 0x80, 0x7F, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF8, 0x00, + 0xFF, 0xEF, 0x80, 0x03, 0xF0, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xF0, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0xE0, 0x03, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x03, + 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x79, 0xFF, 0x80, 0x1E, 0xFF, 0xF0, 0x0F, + 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8, + 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00, + 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8, + 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F, 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF, + 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F, + 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, + 0x3F, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x3F, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x07, + 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, + 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01, + 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, + 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0x0F, + 0xFC, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x3F, 0xF0, + 0x1F, 0x1F, 0xFC, 0x07, 0xC7, 0xFF, 0x01, 0xF1, 0xFF, 0xC0, 0x78, 0x7F, + 0xE0, 0x1E, 0x7F, 0x80, 0x0F, 0xBF, 0x80, 0x03, 0xFF, 0xC0, 0x00, 0xFF, + 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFF, 0x80, 0x01, + 0xF7, 0xF0, 0x00, 0x7C, 0xFE, 0x00, 0x1E, 0x1F, 0xC0, 0x0F, 0x83, 0xF8, + 0x1F, 0xE0, 0xFF, 0xEF, 0xF8, 0x3F, 0xFB, 0xFE, 0x1F, 0xFE, 0xFF, 0x07, + 0xFF, 0x9F, 0xC0, 0xFF, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x03, + 0xFF, 0x80, 0x07, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0x81, 0xE0, + 0x3F, 0xBF, 0x9F, 0xE1, 0xFF, 0xFE, 0xFF, 0x87, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFF, 0xFC, 0x7F, 0xC7, 0xF1, 0xF0, 0x7E, 0x1F, 0x87, 0xC1, 0xF0, + 0x7C, 0x1F, 0x07, 0x81, 0xE0, 0x7C, 0x1E, 0x0F, 0x81, 0xE0, 0xF8, 0x3E, + 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3C, 0x0F, 0x03, + 0xC1, 0xF0, 0x7C, 0x0F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF1, + 0xFE, 0x1F, 0x87, 0xEF, 0xFC, 0x7F, 0x1F, 0xFF, 0xF3, 0xFC, 0x7F, 0xFF, + 0xCF, 0xF3, 0xFF, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF9, + 0xFF, 0x80, 0xFE, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x83, + 0xFF, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x1F, 0x80, 0x3E, 0x07, 0xC0, 0x0F, + 0x81, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0xF0, 0x1E, 0x00, 0x7C, 0x0F, 0x80, + 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x3C, 0x00, 0xF8, 0x0F, + 0x00, 0x3E, 0x1F, 0xF8, 0x3F, 0xEF, 0xFE, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, + 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0xFF, + 0x03, 0xF8, 0xFE, 0x00, 0xFE, 0x7C, 0x00, 0x3F, 0x7C, 0x00, 0x0F, 0xBE, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0xFB, 0xE0, 0x00, 0xFD, 0xF8, 0x00, 0x7C, 0xFE, 0x00, 0xFE, + 0x3F, 0x81, 0xFE, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, + 0x00, 0x7F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x07, + 0xF9, 0xFF, 0xC0, 0x1F, 0xF7, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xC0, 0x7F, + 0xFF, 0xFF, 0xC0, 0x7F, 0xF0, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0x7E, + 0x00, 0x3F, 0x00, 0xF8, 0x00, 0x3E, 0x01, 0xF0, 0x00, 0x7C, 0x03, 0xC0, + 0x00, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x07, 0xE0, 0x3E, 0x00, + 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x01, 0xFC, 0x00, 0xFC, 0x03, 0xFE, 0x07, + 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0x80, 0x1E, 0xFF, 0xFC, + 0x00, 0x7C, 0xFF, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x07, 0xFF, 0x3F, 0xC0, 0xFF, 0xFD, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, + 0xFF, 0xFF, 0x8F, 0xE0, 0x7F, 0xF8, 0xFC, 0x00, 0xFE, 0x07, 0xC0, 0x03, + 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0xF8, 0x1E, 0x00, 0x07, 0xC1, + 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x01, 0xE0, 0x7C, 0x00, 0x1F, 0x03, 0xF0, + 0x01, 0xF8, 0x1F, 0x80, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x03, 0xFF, 0xFF, + 0xE0, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xE7, 0xC0, + 0x01, 0xFC, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x7F, + 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x0F, 0x80, 0x3F, 0xC3, 0xFE, 0x07, 0xFC, 0xFF, 0xE0, + 0x7F, 0xDF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0x1C, 0x00, 0x7F, + 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, + 0xFF, 0xF0, 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xCE, 0x03, 0xFF, 0xFC, + 0x0F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC3, 0xF8, 0x0F, 0x87, + 0xC0, 0x0E, 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x3F, + 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, + 0x3F, 0x1C, 0x00, 0x3E, 0x7C, 0x00, 0x7C, 0xFC, 0x03, 0xF3, 0xFF, 0xFF, + 0xE7, 0xFF, 0xFF, 0x8F, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, + 0x80, 0x00, 0x78, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, + 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00, + 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0xF7, 0xFF, + 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFE, 0x1F, 0xFF, 0x80, 0x7F, 0x80, 0x7F, + 0x01, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0, + 0x3F, 0xC7, 0xC0, 0x07, 0x8F, 0x80, 0x1F, 0x3E, 0x00, 0x3E, 0x7C, 0x00, + 0x7C, 0xF8, 0x00, 0xF1, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x0F, + 0x8F, 0x80, 0x1F, 0x1F, 0x00, 0x7C, 0x3E, 0x01, 0xF8, 0x7E, 0x0F, 0xFC, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF1, 0xFF, 0xEF, 0xE1, 0xFF, 0xBF, 0x80, + 0xFC, 0x00, 0x00, 0x7F, 0xF0, 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xE1, 0xF8, 0x03, 0xE0, + 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x0F, 0x80, 0xF8, 0x00, 0xFC, + 0x1F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xE7, 0xE0, + 0x00, 0x3E, 0x7C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x03, + 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F, 0xEF, 0xFC, 0x03, 0xFF, + 0xFF, 0xC0, 0x7F, 0xFF, 0xFC, 0x07, 0xFE, 0x7F, 0x80, 0x3F, 0xC3, 0xE1, + 0xF0, 0xF8, 0x3E, 0x3F, 0x0F, 0x03, 0xE3, 0xF1, 0xF0, 0x3E, 0x7F, 0x1E, + 0x03, 0xE7, 0xF3, 0xE0, 0x3E, 0xFF, 0xBC, 0x03, 0xFF, 0xFF, 0xC0, 0x3F, + 0xFF, 0xFC, 0x03, 0xFE, 0xFF, 0x80, 0x3F, 0xEF, 0xF8, 0x03, 0xFC, 0xFF, + 0x00, 0x3F, 0x8F, 0xF0, 0x03, 0xF8, 0x7E, 0x00, 0x3F, 0x07, 0xE0, 0x01, + 0xF0, 0x7C, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x03, 0xFE, 0x0F, 0xF8, 0x3F, + 0xF0, 0xFF, 0xC1, 0xFF, 0x8F, 0xFE, 0x0F, 0xFC, 0x7F, 0xF0, 0x7F, 0xC1, + 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, + 0x00, 0x3F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xE3, + 0xF8, 0x00, 0xFE, 0x0F, 0xE0, 0x3F, 0xE0, 0x7F, 0xC3, 0xFF, 0x87, 0xFF, + 0x3F, 0xFC, 0x7F, 0xF9, 0xFF, 0xE3, 0xFF, 0x87, 0xFE, 0x0F, 0xF8, 0x00, + 0x01, 0xFE, 0x03, 0xFE, 0x03, 0xFF, 0x07, 0xFF, 0x07, 0xFF, 0x07, 0xFF, + 0x07, 0xFF, 0x07, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x01, 0xF8, 0x01, 0xF0, + 0x00, 0xF8, 0x03, 0xF0, 0x00, 0xF8, 0x03, 0xE0, 0x00, 0xFC, 0x07, 0xC0, + 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x7E, 0x1F, 0x00, + 0x00, 0x7E, 0x3E, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x3E, 0x7C, 0x00, + 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, + 0x07, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0xE0, 0x7C, 0x0F, 0xE0, 0x3C, 0x0F, 0xE0, 0x1E, 0x0F, + 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, + 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0xF0, 0x3F, + 0x00, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x00, 0x1F, 0xC0, 0x1F, + 0xE0, 0x1F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x3F, 0xC0, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, + 0x80, 0x07, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, + 0x7E, 0x00, 0x3F, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3E, + 0x07, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x0F, + 0x03, 0xE0, 0x7C, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, + 0xC0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0xC0, + 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, + 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x1F, 0x80, 0x7F, + 0xC0, 0x7F, 0xC0, 0x3F, 0xC0, 0x1F, 0xC0, 0x07, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xE0, 0x39, 0xFF, 0xE0, 0xF7, 0xFF, 0xE7, + 0xFF, 0xCF, 0xFF, 0xFE, 0x0F, 0xFF, 0x38, 0x0F, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x0F, 0x80 }; + +const GFXglyph FreeMonoBoldOblique24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 28, 0, 1 }, // 0x20 ' ' + { 0, 12, 31, 28, 12, -29 }, // 0x21 '!' + { 47, 17, 14, 28, 11, -28 }, // 0x22 '"' + { 77, 24, 34, 28, 5, -30 }, // 0x23 '#' + { 179, 25, 38, 28, 4, -31 }, // 0x24 '$' + { 298, 22, 30, 28, 6, -28 }, // 0x25 '%' + { 381, 21, 28, 28, 5, -26 }, // 0x26 '&' + { 455, 7, 14, 28, 16, -28 }, // 0x27 ''' + { 468, 14, 37, 28, 14, -29 }, // 0x28 '(' + { 533, 14, 37, 28, 5, -29 }, // 0x29 ')' + { 598, 21, 19, 28, 8, -28 }, // 0x2A '*' + { 648, 24, 26, 28, 5, -25 }, // 0x2B '+' + { 726, 12, 14, 28, 6, -6 }, // 0x2C ',' + { 747, 24, 5, 28, 5, -15 }, // 0x2D '-' + { 762, 7, 6, 28, 11, -4 }, // 0x2E '.' + { 768, 28, 38, 28, 3, -32 }, // 0x2F '/' + { 901, 23, 31, 28, 6, -29 }, // 0x30 '0' + { 991, 21, 30, 28, 4, -29 }, // 0x31 '1' + { 1070, 26, 30, 28, 3, -29 }, // 0x32 '2' + { 1168, 25, 31, 28, 4, -29 }, // 0x33 '3' + { 1265, 22, 28, 28, 5, -27 }, // 0x34 '4' + { 1342, 25, 31, 28, 4, -29 }, // 0x35 '5' + { 1439, 24, 31, 28, 7, -29 }, // 0x36 '6' + { 1532, 22, 30, 28, 9, -29 }, // 0x37 '7' + { 1615, 23, 31, 28, 6, -29 }, // 0x38 '8' + { 1705, 24, 31, 28, 5, -29 }, // 0x39 '9' + { 1798, 10, 22, 28, 11, -20 }, // 0x3A ':' + { 1826, 15, 28, 28, 5, -20 }, // 0x3B ';' + { 1879, 25, 21, 28, 5, -23 }, // 0x3C '<' + { 1945, 26, 14, 28, 4, -19 }, // 0x3D '=' + { 1991, 25, 22, 28, 4, -23 }, // 0x3E '>' + { 2060, 19, 29, 28, 10, -27 }, // 0x3F '?' + { 2129, 23, 36, 28, 5, -28 }, // 0x40 '@' + { 2233, 30, 27, 28, 0, -26 }, // 0x41 'A' + { 2335, 29, 27, 28, 1, -26 }, // 0x42 'B' + { 2433, 28, 29, 28, 3, -27 }, // 0x43 'C' + { 2535, 28, 27, 28, 1, -26 }, // 0x44 'D' + { 2630, 29, 27, 28, 1, -26 }, // 0x45 'E' + { 2728, 31, 27, 28, 0, -26 }, // 0x46 'F' + { 2833, 28, 29, 28, 3, -27 }, // 0x47 'G' + { 2935, 30, 27, 28, 1, -26 }, // 0x48 'H' + { 3037, 25, 27, 28, 3, -26 }, // 0x49 'I' + { 3122, 31, 28, 28, 0, -26 }, // 0x4A 'J' + { 3231, 31, 27, 28, 0, -26 }, // 0x4B 'K' + { 3336, 27, 27, 28, 1, -26 }, // 0x4C 'L' + { 3428, 34, 27, 28, 0, -26 }, // 0x4D 'M' + { 3543, 32, 27, 28, 1, -26 }, // 0x4E 'N' + { 3651, 27, 29, 28, 3, -27 }, // 0x4F 'O' + { 3749, 28, 27, 28, 1, -26 }, // 0x50 'P' + { 3844, 27, 35, 28, 3, -27 }, // 0x51 'Q' + { 3963, 29, 27, 28, 0, -26 }, // 0x52 'R' + { 4061, 26, 29, 28, 3, -27 }, // 0x53 'S' + { 4156, 26, 27, 28, 4, -26 }, // 0x54 'T' + { 4244, 28, 28, 28, 4, -26 }, // 0x55 'U' + { 4342, 30, 27, 28, 2, -26 }, // 0x56 'V' + { 4444, 29, 27, 28, 3, -26 }, // 0x57 'W' + { 4542, 32, 27, 28, 0, -26 }, // 0x58 'X' + { 4650, 26, 27, 28, 4, -26 }, // 0x59 'Y' + { 4738, 27, 27, 28, 2, -26 }, // 0x5A 'Z' + { 4830, 18, 37, 28, 10, -29 }, // 0x5B '[' + { 4914, 13, 38, 28, 10, -32 }, // 0x5C '\' + { 4976, 18, 37, 28, 5, -29 }, // 0x5D ']' + { 5060, 20, 15, 28, 8, -29 }, // 0x5E '^' + { 5098, 29, 5, 28, -2, 5 }, // 0x5F '_' + { 5117, 8, 8, 28, 13, -30 }, // 0x60 '`' + { 5125, 24, 23, 28, 3, -21 }, // 0x61 'a' + { 5194, 29, 31, 28, 0, -29 }, // 0x62 'b' + { 5307, 25, 23, 28, 3, -21 }, // 0x63 'c' + { 5379, 28, 31, 28, 3, -29 }, // 0x64 'd' + { 5488, 24, 23, 28, 3, -21 }, // 0x65 'e' + { 5557, 28, 30, 28, 4, -29 }, // 0x66 'f' + { 5662, 28, 31, 28, 3, -21 }, // 0x67 'g' + { 5771, 26, 30, 28, 2, -29 }, // 0x68 'h' + { 5869, 23, 29, 28, 3, -28 }, // 0x69 'i' + { 5953, 23, 38, 28, 3, -28 }, // 0x6A 'j' + { 6063, 26, 30, 28, 2, -29 }, // 0x6B 'k' + { 6161, 23, 30, 28, 3, -29 }, // 0x6C 'l' + { 6248, 30, 22, 28, 0, -21 }, // 0x6D 'm' + { 6331, 26, 22, 28, 2, -21 }, // 0x6E 'n' + { 6403, 25, 23, 28, 3, -21 }, // 0x6F 'o' + { 6475, 31, 31, 28, -1, -21 }, // 0x70 'p' + { 6596, 29, 31, 28, 2, -21 }, // 0x71 'q' + { 6709, 28, 22, 28, 2, -21 }, // 0x72 'r' + { 6786, 23, 23, 28, 4, -21 }, // 0x73 's' + { 6853, 20, 28, 28, 5, -26 }, // 0x74 't' + { 6923, 23, 22, 28, 5, -20 }, // 0x75 'u' + { 6987, 28, 21, 28, 3, -20 }, // 0x76 'v' + { 7061, 28, 21, 28, 3, -20 }, // 0x77 'w' + { 7135, 29, 21, 28, 1, -20 }, // 0x78 'x' + { 7212, 32, 30, 28, -1, -20 }, // 0x79 'y' + { 7332, 25, 21, 28, 4, -20 }, // 0x7A 'z' + { 7398, 17, 37, 28, 10, -29 }, // 0x7B '{' + { 7477, 11, 36, 28, 11, -28 }, // 0x7C '|' + { 7527, 17, 37, 28, 6, -29 }, // 0x7D '}' + { 7606, 23, 10, 28, 5, -17 } }; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique24pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique24pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique24pt7bGlyphs, + 0x20, 0x7E, 47 }; + +// Approx. 8307 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h new file mode 100644 index 0000000..b530723 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h @@ -0,0 +1,203 @@ +const uint8_t FreeMonoBoldOblique9pt7bBitmaps[] PROGMEM = { + 0x39, 0xCC, 0x67, 0x31, 0x8C, 0x07, 0x38, 0x6C, 0xD9, 0x36, 0x48, 0x80, + 0x09, 0x0D, 0x86, 0xCF, 0xF7, 0xF9, 0xB3, 0xFD, 0xFE, 0x6C, 0x36, 0x1B, + 0x00, 0x00, 0x06, 0x07, 0x07, 0xE6, 0x33, 0x01, 0xE0, 0x7C, 0x06, 0x43, + 0x33, 0xBF, 0x83, 0x03, 0x00, 0x80, 0x1C, 0x11, 0x10, 0x88, 0x83, 0xB8, + 0xF3, 0xB8, 0x22, 0x21, 0x11, 0x07, 0x00, 0x0F, 0x1F, 0x30, 0x30, 0x38, + 0x7B, 0xDF, 0xCE, 0xFF, 0x7E, 0xFA, 0x80, 0x19, 0x8C, 0xC6, 0x63, 0x18, + 0xC6, 0x31, 0xC6, 0x30, 0x31, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0x98, 0xCC, + 0x40, 0x08, 0x08, 0xFF, 0xFF, 0x38, 0x6C, 0x6C, 0x0C, 0x06, 0x03, 0x1F, + 0xFF, 0xF8, 0xC0, 0x60, 0x30, 0x10, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0xFF, + 0xC0, 0xFC, 0x00, 0x00, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, + 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x00, 0x0F, + 0x0F, 0xCC, 0x6C, 0x36, 0x1B, 0x0D, 0x05, 0x86, 0xC3, 0x63, 0x3F, 0x8F, + 0x00, 0x06, 0x1C, 0x3C, 0x6C, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x18, 0xFE, + 0xFE, 0x07, 0x83, 0xF1, 0x8C, 0x43, 0x00, 0xC0, 0xE0, 0x70, 0x38, 0x38, + 0x1C, 0x6F, 0xF3, 0xFC, 0x1F, 0x1F, 0xC0, 0x60, 0x30, 0x30, 0x70, 0x38, + 0x06, 0x03, 0x03, 0xBF, 0x9F, 0x80, 0x03, 0x07, 0x0B, 0x1B, 0x32, 0x66, + 0xFF, 0xFF, 0x1E, 0x1E, 0x3F, 0x9F, 0x98, 0x0F, 0xC7, 0xF3, 0x18, 0x0C, + 0x06, 0x06, 0x7F, 0x1E, 0x00, 0x07, 0x87, 0xCE, 0x06, 0x06, 0x03, 0xF3, + 0xFD, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0xC3, 0x06, 0x06, + 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x1F, 0x1F, 0xDC, 0x6C, 0x36, 0x31, + 0xF1, 0xF8, 0xC6, 0xC3, 0x63, 0xBF, 0x8F, 0x80, 0x1E, 0x3F, 0x33, 0x63, + 0x63, 0x67, 0x7F, 0x3E, 0x06, 0x1C, 0xF8, 0xF0, 0x77, 0x00, 0x00, 0xEE, + 0x1C, 0x70, 0x00, 0x00, 0x03, 0x0C, 0x61, 0x08, 0x00, 0x00, 0xC1, 0xE1, + 0xE1, 0xE0, 0xF0, 0x07, 0x00, 0xF0, 0x0C, 0x7F, 0xDF, 0xF0, 0x00, 0x00, + 0x7F, 0xFF, 0xF0, 0x30, 0x0F, 0x00, 0xE0, 0x1E, 0x07, 0xC7, 0x87, 0x83, + 0x00, 0x7D, 0xFF, 0x18, 0x30, 0xE3, 0x9C, 0x30, 0x01, 0xC3, 0x80, 0x0F, + 0x0F, 0xCC, 0x6C, 0x36, 0x72, 0x79, 0x7D, 0xB6, 0xDA, 0x6F, 0xB3, 0xD8, + 0x0C, 0x07, 0xE1, 0xE0, 0x0F, 0x83, 0xF0, 0x1E, 0x03, 0xC0, 0xD8, 0x31, + 0x87, 0xF1, 0xFE, 0x30, 0xDF, 0x3F, 0xC7, 0x80, 0x3F, 0xC7, 0xFC, 0x61, + 0x8C, 0x31, 0xFC, 0x3F, 0x84, 0x19, 0x83, 0x30, 0x6F, 0xFB, 0xFE, 0x00, + 0x0F, 0xF1, 0xFF, 0x30, 0x66, 0x06, 0x60, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xE0, 0xC7, 0xF8, 0x3F, 0x00, 0x3F, 0x87, 0xF8, 0x63, 0x8C, 0x31, 0x06, + 0x60, 0xCC, 0x19, 0x86, 0x31, 0xCF, 0xF3, 0xF8, 0x00, 0x3F, 0xE3, 0xFE, + 0x18, 0x61, 0xB6, 0x1F, 0x01, 0xF0, 0x32, 0x03, 0x00, 0x30, 0x4F, 0xFC, + 0xFF, 0xC0, 0x3F, 0xF3, 0xFE, 0x18, 0x61, 0xB6, 0x1F, 0x03, 0xF0, 0x32, + 0x03, 0x00, 0x30, 0x0F, 0xC0, 0xFC, 0x00, 0x0F, 0xE3, 0xFC, 0xC1, 0x30, + 0x06, 0x01, 0x80, 0x31, 0xF6, 0x3E, 0xE1, 0x9F, 0xF0, 0xF8, 0x00, 0x1E, + 0xF3, 0xCF, 0x18, 0x61, 0x84, 0x10, 0xC3, 0xFC, 0x3F, 0xC3, 0x08, 0x31, + 0x8F, 0xBC, 0xFB, 0xC0, 0x3F, 0xCF, 0xF0, 0x60, 0x10, 0x0C, 0x03, 0x00, + 0xC0, 0x20, 0x18, 0x3F, 0xCF, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x80, 0x18, + 0x01, 0x80, 0x18, 0x61, 0x84, 0x10, 0xC3, 0x0F, 0xE0, 0x7C, 0x00, 0x3E, + 0xE7, 0xFC, 0x66, 0x0D, 0x81, 0x60, 0x7C, 0x0E, 0xC1, 0x98, 0x31, 0x1F, + 0x3B, 0xE7, 0x00, 0x3F, 0x07, 0xE0, 0x30, 0x06, 0x00, 0xC0, 0x10, 0x06, + 0x00, 0xC3, 0x18, 0x6F, 0xFB, 0xFF, 0x00, 0x38, 0x39, 0xC3, 0xC7, 0x3C, + 0x79, 0xE3, 0xDA, 0x1F, 0xF0, 0x9D, 0x8C, 0xCC, 0x60, 0x67, 0xCF, 0x3C, + 0x78, 0x3C, 0xF9, 0xE7, 0x87, 0x18, 0x3C, 0xC1, 0x66, 0x1B, 0xB0, 0xCD, + 0x06, 0x78, 0x31, 0xC3, 0xCE, 0x3E, 0x30, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, + 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, 0x9F, 0xC3, 0xC0, 0x3F, 0xC7, 0xFC, + 0x61, 0x8C, 0x31, 0x8E, 0x3F, 0x87, 0xE1, 0x80, 0x30, 0x0F, 0xC3, 0xF0, + 0x00, 0x0F, 0x0F, 0xE7, 0x1D, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x06, 0xE3, + 0x1F, 0xC3, 0xC0, 0x80, 0x7F, 0x3F, 0xC0, 0x3F, 0xC3, 0xFE, 0x18, 0x61, + 0x86, 0x10, 0xE3, 0xFC, 0x3F, 0x83, 0x18, 0x31, 0xCF, 0x8F, 0xF8, 0x70, + 0x1E, 0xCF, 0xF7, 0x19, 0x80, 0x70, 0x1F, 0x81, 0xF3, 0x0C, 0xC3, 0x3F, + 0x8B, 0xC0, 0x7F, 0xCF, 0xF9, 0x93, 0x66, 0x60, 0xC0, 0x18, 0x02, 0x00, + 0xC0, 0x18, 0x0F, 0xC1, 0xF8, 0x00, 0xF9, 0xFF, 0x7D, 0x83, 0x30, 0x64, + 0x09, 0x83, 0x30, 0x66, 0x0C, 0xE3, 0x0F, 0xC0, 0xF0, 0x00, 0xF9, 0xFE, + 0x3D, 0x83, 0x30, 0xC6, 0x30, 0xE6, 0x0D, 0x81, 0xB0, 0x3C, 0x07, 0x00, + 0x60, 0x00, 0xF9, 0xFF, 0x3D, 0x83, 0x36, 0x64, 0xC8, 0xBF, 0x35, 0xE7, + 0xB8, 0xE7, 0x1C, 0xE3, 0x18, 0x00, 0x3C, 0xF3, 0xCF, 0x1C, 0xC0, 0xD8, + 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xB8, 0x31, 0x8F, 0x3C, 0xF3, 0xC0, 0x79, + 0xEE, 0x38, 0xC6, 0x19, 0x81, 0xE0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x0F, + 0xC3, 0xF8, 0x00, 0x3F, 0xCF, 0xF3, 0x18, 0xCC, 0x06, 0x03, 0x01, 0x80, + 0xC6, 0x61, 0xBF, 0xCF, 0xF0, 0x1E, 0x3C, 0xC1, 0x83, 0x06, 0x08, 0x30, + 0x60, 0xC1, 0x06, 0x0F, 0x1E, 0x00, 0x06, 0x31, 0x86, 0x31, 0x8C, 0x31, + 0x8C, 0x61, 0x8C, 0x60, 0x1E, 0x78, 0x30, 0x60, 0xC1, 0x86, 0x0C, 0x18, + 0x30, 0x41, 0x8F, 0x1E, 0x00, 0x08, 0x1C, 0x3C, 0x76, 0xE7, 0xC3, 0x7F, + 0xFF, 0xFC, 0x88, 0x80, 0x0F, 0x07, 0xE1, 0xF9, 0xFE, 0xE3, 0x30, 0xCF, + 0xFD, 0xFF, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xC1, 0xFC, 0x71, 0xCC, 0x19, + 0x83, 0x30, 0xDF, 0xFB, 0xBC, 0x00, 0x1F, 0xCF, 0xF6, 0x1B, 0x00, 0xC0, + 0x30, 0x0F, 0xF1, 0xF8, 0x01, 0xE0, 0x38, 0x03, 0x0F, 0x63, 0xFC, 0xC3, + 0x30, 0x66, 0x0C, 0xC3, 0x9F, 0xF9, 0xF7, 0x00, 0x1F, 0x1F, 0xD8, 0x3F, + 0xFF, 0xFE, 0x1B, 0xFC, 0xF8, 0x07, 0xC3, 0xF1, 0x81, 0xFE, 0x7F, 0x84, + 0x03, 0x00, 0xC0, 0x30, 0x3F, 0x8F, 0xE0, 0x1E, 0xE7, 0xFD, 0x86, 0x60, + 0xCC, 0x19, 0xC6, 0x3F, 0xC1, 0xD8, 0x03, 0x00, 0xE1, 0xF8, 0x3E, 0x00, + 0x38, 0x1E, 0x01, 0x00, 0xDC, 0x3F, 0x8C, 0x62, 0x19, 0x84, 0x63, 0x3D, + 0xFF, 0x7C, 0x06, 0x03, 0x00, 0x03, 0xC3, 0xE0, 0x20, 0x30, 0x18, 0x0C, + 0x3F, 0xFF, 0xE0, 0x01, 0x81, 0x80, 0x07, 0xF3, 0xF8, 0x0C, 0x04, 0x06, + 0x03, 0x01, 0x80, 0xC0, 0x40, 0x67, 0xE3, 0xE0, 0x38, 0x0E, 0x01, 0x80, + 0x4F, 0x37, 0xCF, 0x83, 0xC0, 0xF0, 0x26, 0x39, 0xEE, 0x78, 0x1F, 0x0F, + 0x01, 0x80, 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x3F, 0xFF, 0xE0, 0x7E, + 0xE7, 0xFF, 0x33, 0x32, 0x63, 0x66, 0x36, 0x62, 0xF7, 0x7F, 0x67, 0x77, + 0x8F, 0xF8, 0xC3, 0x10, 0x66, 0x08, 0xC3, 0x3C, 0x7F, 0x8F, 0x1F, 0x0F, + 0xE6, 0x1F, 0x03, 0xC0, 0xF8, 0x67, 0xF0, 0xF8, 0x3F, 0xE3, 0xFF, 0x1C, + 0x31, 0x83, 0x18, 0x31, 0x86, 0x3F, 0xE3, 0x78, 0x30, 0x03, 0x00, 0xFC, + 0x0F, 0x80, 0x1E, 0xEF, 0xFD, 0x86, 0x60, 0xCC, 0x19, 0xC7, 0x3F, 0xE1, + 0xE8, 0x03, 0x00, 0x60, 0x3E, 0x07, 0xC0, 0x39, 0xDF, 0xF1, 0xC0, 0x60, + 0x10, 0x0C, 0x0F, 0xF3, 0xF8, 0x1F, 0x7F, 0x63, 0x7E, 0x1F, 0xC3, 0xFE, + 0xFC, 0x10, 0x08, 0x0C, 0x1F, 0xEF, 0xF1, 0x80, 0x80, 0xC0, 0x60, 0x3F, + 0x8F, 0x80, 0xF3, 0xFC, 0xF6, 0x09, 0x86, 0x61, 0x98, 0xE7, 0xF8, 0xFE, + 0xFB, 0xFF, 0x7C, 0xC6, 0x19, 0x83, 0x60, 0x6C, 0x07, 0x00, 0xC0, 0xF1, + 0xFE, 0x3D, 0xB3, 0x37, 0xC7, 0xF8, 0xEE, 0x1D, 0xC3, 0x30, 0x79, 0xEF, + 0x38, 0xEE, 0x0F, 0x01, 0xE0, 0x6E, 0x3C, 0xE7, 0xBC, 0x3C, 0xF3, 0x8F, + 0x18, 0xC1, 0x9C, 0x19, 0x81, 0xF0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, + 0xFC, 0x0F, 0xC0, 0x7F, 0xBF, 0xD9, 0xC1, 0x83, 0x83, 0x1B, 0xFD, 0xFE, + 0x06, 0x1C, 0x60, 0xC1, 0x86, 0x3C, 0x70, 0x30, 0x41, 0x83, 0x07, 0x06, + 0x00, 0x33, 0x32, 0x26, 0x66, 0x44, 0xCC, 0xC8, 0x0C, 0x0E, 0x04, 0x0C, + 0x0C, 0x0C, 0x0F, 0x0F, 0x18, 0x18, 0x10, 0x30, 0xF0, 0xE0, 0x38, 0x7C, + 0xF7, 0xC1, 0xC0 }; + +const GFXglyph FreeMonoBoldOblique9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' + { 0, 5, 11, 11, 4, -10 }, // 0x21 '!' + { 7, 7, 5, 11, 4, -10 }, // 0x22 '"' + { 12, 9, 12, 11, 2, -10 }, // 0x23 '#' + { 26, 9, 14, 11, 2, -11 }, // 0x24 '$' + { 42, 9, 11, 11, 2, -10 }, // 0x25 '%' + { 55, 8, 10, 11, 2, -9 }, // 0x26 '&' + { 65, 2, 5, 11, 6, -10 }, // 0x27 ''' + { 67, 5, 14, 11, 5, -10 }, // 0x28 '(' + { 76, 5, 14, 11, 2, -10 }, // 0x29 ')' + { 85, 8, 7, 11, 3, -10 }, // 0x2A '*' + { 92, 9, 9, 11, 2, -8 }, // 0x2B '+' + { 103, 4, 5, 11, 2, -1 }, // 0x2C ',' + { 106, 9, 2, 11, 2, -5 }, // 0x2D '-' + { 109, 3, 2, 11, 4, -1 }, // 0x2E '.' + { 110, 11, 15, 11, 1, -12 }, // 0x2F '/' + { 131, 9, 12, 11, 2, -11 }, // 0x30 '0' + { 145, 8, 12, 11, 2, -11 }, // 0x31 '1' + { 157, 10, 12, 11, 1, -11 }, // 0x32 '2' + { 172, 9, 12, 11, 2, -11 }, // 0x33 '3' + { 186, 8, 10, 11, 2, -9 }, // 0x34 '4' + { 196, 9, 11, 11, 3, -10 }, // 0x35 '5' + { 209, 9, 12, 11, 3, -11 }, // 0x36 '6' + { 223, 8, 11, 11, 3, -10 }, // 0x37 '7' + { 234, 9, 12, 11, 2, -11 }, // 0x38 '8' + { 248, 8, 12, 11, 3, -11 }, // 0x39 '9' + { 260, 4, 8, 11, 4, -7 }, // 0x3A ':' + { 264, 6, 11, 11, 2, -7 }, // 0x3B ';' + { 273, 10, 8, 11, 2, -8 }, // 0x3C '<' + { 283, 10, 6, 11, 1, -7 }, // 0x3D '=' + { 291, 10, 8, 11, 1, -8 }, // 0x3E '>' + { 301, 7, 11, 11, 4, -10 }, // 0x3F '?' + { 311, 9, 15, 11, 2, -11 }, // 0x40 '@' + { 328, 11, 11, 11, 0, -10 }, // 0x41 'A' + { 344, 11, 11, 11, 0, -10 }, // 0x42 'B' + { 360, 12, 11, 11, 1, -10 }, // 0x43 'C' + { 377, 11, 11, 11, 0, -10 }, // 0x44 'D' + { 393, 12, 11, 11, 0, -10 }, // 0x45 'E' + { 410, 12, 11, 11, 0, -10 }, // 0x46 'F' + { 427, 11, 11, 11, 1, -10 }, // 0x47 'G' + { 443, 12, 11, 11, 0, -10 }, // 0x48 'H' + { 460, 10, 11, 11, 1, -10 }, // 0x49 'I' + { 474, 12, 11, 11, 0, -10 }, // 0x4A 'J' + { 491, 11, 11, 11, 0, -10 }, // 0x4B 'K' + { 507, 11, 11, 11, 0, -10 }, // 0x4C 'L' + { 523, 13, 11, 11, 0, -10 }, // 0x4D 'M' + { 541, 13, 11, 11, 0, -10 }, // 0x4E 'N' + { 559, 10, 11, 11, 1, -10 }, // 0x4F 'O' + { 573, 11, 11, 11, 0, -10 }, // 0x50 'P' + { 589, 10, 14, 11, 1, -10 }, // 0x51 'Q' + { 607, 12, 11, 11, 0, -10 }, // 0x52 'R' + { 624, 10, 11, 11, 2, -10 }, // 0x53 'S' + { 638, 11, 11, 11, 1, -10 }, // 0x54 'T' + { 654, 11, 11, 11, 1, -10 }, // 0x55 'U' + { 670, 11, 11, 11, 1, -10 }, // 0x56 'V' + { 686, 11, 11, 11, 1, -10 }, // 0x57 'W' + { 702, 12, 11, 11, 0, -10 }, // 0x58 'X' + { 719, 11, 11, 11, 1, -10 }, // 0x59 'Y' + { 735, 10, 11, 11, 1, -10 }, // 0x5A 'Z' + { 749, 7, 14, 11, 4, -10 }, // 0x5B '[' + { 762, 5, 15, 11, 4, -12 }, // 0x5C '\' + { 772, 7, 14, 11, 2, -10 }, // 0x5D ']' + { 785, 8, 6, 11, 3, -11 }, // 0x5E '^' + { 791, 11, 2, 11, -1, 3 }, // 0x5F '_' + { 794, 3, 3, 11, 5, -11 }, // 0x60 '`' + { 796, 10, 8, 11, 1, -7 }, // 0x61 'a' + { 806, 11, 11, 11, 0, -10 }, // 0x62 'b' + { 822, 10, 8, 11, 1, -7 }, // 0x63 'c' + { 832, 11, 11, 11, 1, -10 }, // 0x64 'd' + { 848, 9, 8, 11, 1, -7 }, // 0x65 'e' + { 857, 10, 11, 11, 2, -10 }, // 0x66 'f' + { 871, 11, 12, 11, 1, -7 }, // 0x67 'g' + { 888, 10, 11, 11, 1, -10 }, // 0x68 'h' + { 902, 9, 11, 11, 1, -10 }, // 0x69 'i' + { 915, 9, 15, 11, 1, -10 }, // 0x6A 'j' + { 932, 10, 11, 11, 1, -10 }, // 0x6B 'k' + { 946, 9, 11, 11, 1, -10 }, // 0x6C 'l' + { 959, 12, 8, 11, 0, -7 }, // 0x6D 'm' + { 971, 11, 8, 11, 1, -7 }, // 0x6E 'n' + { 982, 10, 8, 11, 1, -7 }, // 0x6F 'o' + { 992, 12, 12, 11, -1, -7 }, // 0x70 'p' + { 1010, 11, 12, 11, 1, -7 }, // 0x71 'q' + { 1027, 10, 8, 11, 1, -7 }, // 0x72 'r' + { 1037, 8, 8, 11, 2, -7 }, // 0x73 's' + { 1045, 9, 11, 11, 1, -10 }, // 0x74 't' + { 1058, 10, 8, 11, 1, -7 }, // 0x75 'u' + { 1068, 11, 8, 11, 1, -7 }, // 0x76 'v' + { 1079, 11, 8, 11, 1, -7 }, // 0x77 'w' + { 1090, 11, 8, 11, 1, -7 }, // 0x78 'x' + { 1101, 12, 12, 11, 0, -7 }, // 0x79 'y' + { 1119, 9, 8, 11, 2, -7 }, // 0x7A 'z' + { 1128, 7, 14, 11, 3, -10 }, // 0x7B '{' + { 1141, 4, 14, 11, 4, -10 }, // 0x7C '|' + { 1148, 8, 14, 11, 2, -10 }, // 0x7D '}' + { 1162, 9, 4, 11, 2, -6 } }; // 0x7E '~' + +const GFXfont FreeMonoBoldOblique9pt7b PROGMEM = { + (uint8_t *)FreeMonoBoldOblique9pt7bBitmaps, + (GFXglyph *)FreeMonoBoldOblique9pt7bGlyphs, + 0x20, 0x7E, 18 }; + +// Approx. 1839 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique12pt7b.h new file mode 100644 index 0000000..83a9a77 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique12pt7b.h @@ -0,0 +1,248 @@ +const uint8_t FreeMonoOblique12pt7bBitmaps[] PROGMEM = { + 0x11, 0x11, 0x12, 0x22, 0x22, 0x00, 0x0E, 0xE0, 0xE7, 0xE7, 0xC6, 0xC6, + 0xC6, 0x84, 0x84, 0x02, 0x40, 0x88, 0x12, 0x02, 0x40, 0x48, 0x7F, 0xC2, + 0x40, 0x48, 0x11, 0x1F, 0xF8, 0x48, 0x09, 0x02, 0x40, 0x48, 0x09, 0x02, + 0x20, 0x02, 0x01, 0x00, 0xF4, 0xC3, 0x60, 0x50, 0x04, 0x00, 0xC0, 0x0F, + 0x00, 0x60, 0x0A, 0x02, 0x81, 0x30, 0xC7, 0xC0, 0x80, 0x20, 0x08, 0x00, + 0x0E, 0x02, 0x20, 0x84, 0x10, 0x82, 0x20, 0x38, 0x00, 0x38, 0x38, 0x38, + 0x08, 0xE0, 0x22, 0x08, 0x41, 0x08, 0x22, 0x03, 0x80, 0x07, 0x84, 0x04, + 0x02, 0x01, 0x00, 0xC1, 0xA2, 0x8A, 0x85, 0x43, 0x31, 0x8F, 0x60, 0xFF, + 0x6D, 0x20, 0x00, 0x44, 0x42, 0x21, 0x08, 0x84, 0x21, 0x08, 0x42, 0x10, + 0x42, 0x00, 0x00, 0x84, 0x10, 0x84, 0x21, 0x08, 0x46, 0x21, 0x10, 0x88, + 0x44, 0x00, 0x04, 0x02, 0x02, 0x1D, 0x13, 0xF0, 0x40, 0x50, 0x48, 0x44, + 0x00, 0x02, 0x00, 0x40, 0x08, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, + 0x08, 0x01, 0x00, 0x20, 0x00, 0x1C, 0xE3, 0x18, 0x63, 0x08, 0x00, 0xFF, + 0xE0, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, + 0x60, 0x02, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x00, 0x18, 0x00, 0x80, + 0x08, 0x00, 0x80, 0x04, 0x00, 0x40, 0x04, 0x00, 0x00, 0x07, 0x06, 0x23, + 0x04, 0x81, 0x40, 0x50, 0x14, 0x06, 0x02, 0x80, 0xA0, 0x28, 0x0A, 0x04, + 0x83, 0x11, 0x83, 0x80, 0x03, 0x03, 0x83, 0x83, 0x43, 0x20, 0x10, 0x08, + 0x08, 0x04, 0x02, 0x01, 0x01, 0x00, 0x80, 0x43, 0xFE, 0x01, 0xC0, 0x62, + 0x0C, 0x10, 0x81, 0x00, 0x10, 0x02, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20, + 0x0C, 0x01, 0x80, 0x20, 0x04, 0x04, 0xFF, 0xC0, 0x07, 0xC3, 0x0C, 0x00, + 0x80, 0x10, 0x06, 0x01, 0x81, 0xC0, 0x0C, 0x00, 0x40, 0x08, 0x01, 0x00, + 0x20, 0x09, 0x86, 0x0F, 0x00, 0x00, 0xC0, 0x50, 0x24, 0x12, 0x04, 0x82, + 0x21, 0x08, 0x82, 0x21, 0x10, 0x4F, 0xF8, 0x04, 0x01, 0x00, 0x80, 0xF8, + 0x0F, 0xE2, 0x00, 0x40, 0x08, 0x01, 0x00, 0x4E, 0x0E, 0x20, 0x02, 0x00, + 0x40, 0x08, 0x01, 0x00, 0x40, 0x19, 0x06, 0x1F, 0x00, 0x01, 0xE0, 0xC0, + 0x60, 0x18, 0x02, 0x00, 0x80, 0x13, 0xC5, 0x88, 0xE0, 0x98, 0x12, 0x02, + 0x40, 0x48, 0x10, 0x84, 0x0F, 0x00, 0xFF, 0xA0, 0x20, 0x08, 0x04, 0x01, + 0x00, 0x80, 0x20, 0x10, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10, 0x08, 0x02, + 0x00, 0x07, 0x81, 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0x84, 0x20, 0x78, + 0x30, 0x88, 0x0A, 0x01, 0x40, 0x28, 0x08, 0x82, 0x0F, 0x80, 0x07, 0x81, + 0x08, 0x40, 0x90, 0x12, 0x02, 0x40, 0xC8, 0x39, 0x8D, 0x1E, 0x40, 0x08, + 0x02, 0x00, 0xC0, 0x30, 0x18, 0x3E, 0x00, 0x19, 0xCC, 0x00, 0x00, 0x0C, + 0xE6, 0x00, 0x06, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x30, 0xE1, 0x86, + 0x08, 0x00, 0x00, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x06, 0x00, 0x30, + 0x00, 0xC0, 0x06, 0x00, 0x18, 0x00, 0xC0, 0x7F, 0xF8, 0x00, 0x00, 0x01, + 0xFF, 0xE0, 0x18, 0x00, 0xC0, 0x03, 0x00, 0x18, 0x00, 0x60, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x3E, 0xC3, 0x81, 0x01, 0x03, + 0x06, 0x18, 0x20, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x07, 0x82, 0x31, + 0x04, 0x81, 0x20, 0x48, 0x74, 0x65, 0x21, 0x48, 0x92, 0x28, 0x7A, 0x00, + 0x80, 0x20, 0x04, 0x00, 0xF8, 0x07, 0xE0, 0x02, 0x80, 0x0A, 0x00, 0x48, + 0x01, 0x20, 0x08, 0x40, 0x41, 0x01, 0x04, 0x0F, 0xF0, 0x20, 0x41, 0x01, + 0x04, 0x02, 0x20, 0x0B, 0xE1, 0xF0, 0x1F, 0xF0, 0x40, 0xC2, 0x02, 0x10, + 0x10, 0x81, 0x84, 0x18, 0x7F, 0x82, 0x02, 0x10, 0x08, 0x80, 0x44, 0x02, + 0x60, 0x22, 0x03, 0x7F, 0xE0, 0x07, 0x91, 0x87, 0x20, 0x34, 0x02, 0x40, + 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x04, 0x04, 0x61, + 0x81, 0xE0, 0x1F, 0xE0, 0x41, 0x82, 0x06, 0x10, 0x11, 0x00, 0x88, 0x04, + 0x40, 0x22, 0x01, 0x10, 0x11, 0x00, 0x88, 0x08, 0x40, 0xC2, 0x0C, 0x7F, + 0x80, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x82, 0x00, 0x08, 0x00, 0x22, 0x01, + 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x01, 0x0C, 0x04, 0x20, 0x13, + 0xFF, 0xC0, 0x1F, 0xFC, 0x20, 0x10, 0x80, 0x42, 0x01, 0x08, 0x00, 0x22, + 0x01, 0xF8, 0x04, 0x20, 0x10, 0x00, 0x40, 0x01, 0x00, 0x0C, 0x00, 0x20, + 0x03, 0xF8, 0x00, 0x07, 0xD0, 0x83, 0x30, 0x12, 0x00, 0x40, 0x04, 0x00, + 0x80, 0x08, 0x00, 0x83, 0xE8, 0x04, 0x80, 0x4C, 0x04, 0x60, 0x41, 0xF8, + 0x0F, 0x3C, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x81, 0x01, 0x02, 0x03, + 0xFC, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x80, 0x81, 0x02, 0x02, + 0x1F, 0x1E, 0x00, 0x3F, 0xE0, 0x40, 0x08, 0x01, 0x00, 0x20, 0x08, 0x01, + 0x00, 0x20, 0x04, 0x00, 0x80, 0x20, 0x04, 0x00, 0x81, 0xFF, 0x00, 0x03, + 0xFE, 0x00, 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x20, 0x40, 0x40, 0x80, 0x81, 0x01, 0x02, 0x04, 0x06, 0x10, 0x07, + 0xC0, 0x00, 0x1F, 0x1E, 0x10, 0x10, 0x20, 0xC0, 0x43, 0x00, 0x88, 0x01, + 0x20, 0x07, 0xC0, 0x0C, 0x40, 0x10, 0x40, 0x20, 0x80, 0x41, 0x01, 0x81, + 0x02, 0x02, 0x1F, 0x87, 0x00, 0x3F, 0x80, 0x40, 0x04, 0x00, 0x40, 0x08, + 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x01, 0x10, 0x11, 0x02, 0x10, + 0x2F, 0xFE, 0x1C, 0x03, 0x85, 0x03, 0x02, 0x82, 0x81, 0x41, 0x40, 0xA1, + 0x20, 0x89, 0x30, 0x44, 0x90, 0x22, 0x88, 0x11, 0x44, 0x08, 0x42, 0x08, + 0x03, 0x04, 0x01, 0x02, 0x00, 0x87, 0xC3, 0xE0, 0x3C, 0x3E, 0x18, 0x08, + 0x38, 0x20, 0x50, 0x41, 0x20, 0x82, 0x61, 0x04, 0x42, 0x08, 0x88, 0x10, + 0x90, 0x41, 0x20, 0x83, 0x41, 0x02, 0x82, 0x06, 0x1F, 0x04, 0x00, 0x03, + 0xC0, 0x61, 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x14, 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x0F, 0x00, 0x1F, 0xE0, + 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x40, 0x83, 0xF8, 0x10, + 0x00, 0x80, 0x04, 0x00, 0x60, 0x02, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x61, + 0x84, 0x04, 0x40, 0x14, 0x00, 0xA0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x14, + 0x00, 0xA0, 0x08, 0x80, 0x86, 0x18, 0x1F, 0x00, 0x40, 0x0F, 0xC4, 0x41, + 0xC0, 0x1F, 0xE0, 0x40, 0x82, 0x02, 0x10, 0x10, 0x80, 0x84, 0x08, 0x60, + 0x83, 0xF8, 0x10, 0xC0, 0x82, 0x04, 0x08, 0x40, 0x42, 0x03, 0x7E, 0x0C, + 0x07, 0xA3, 0x0C, 0x40, 0x90, 0x12, 0x00, 0x40, 0x06, 0x00, 0x3C, 0x00, + 0x40, 0x0A, 0x01, 0x40, 0x4C, 0x11, 0x7C, 0x00, 0xFF, 0xE8, 0x42, 0x84, + 0x20, 0x40, 0x04, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x10, + 0x01, 0x00, 0x10, 0x0F, 0xE0, 0xF8, 0xF9, 0x00, 0x88, 0x08, 0x80, 0x44, + 0x02, 0x20, 0x11, 0x01, 0x08, 0x08, 0x80, 0x44, 0x02, 0x20, 0x31, 0x01, + 0x04, 0x30, 0x1E, 0x00, 0xF8, 0x7D, 0x00, 0x42, 0x01, 0x08, 0x08, 0x20, + 0x40, 0x81, 0x02, 0x08, 0x08, 0x20, 0x11, 0x00, 0x48, 0x01, 0x20, 0x05, + 0x00, 0x14, 0x00, 0x60, 0x00, 0xF8, 0x7D, 0x00, 0x44, 0x01, 0x11, 0x84, + 0x46, 0x21, 0x18, 0x84, 0xA2, 0x12, 0x90, 0x91, 0x42, 0x45, 0x0A, 0x14, + 0x28, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1E, 0x1E, 0x10, 0x10, 0x10, 0x40, + 0x21, 0x00, 0x24, 0x00, 0x78, 0x00, 0x60, 0x01, 0xC0, 0x06, 0x80, 0x09, + 0x80, 0x21, 0x00, 0x81, 0x02, 0x02, 0x1E, 0x1F, 0x00, 0xF0, 0xF4, 0x04, + 0x20, 0x82, 0x18, 0x11, 0x01, 0x20, 0x1C, 0x00, 0x80, 0x08, 0x00, 0x80, + 0x10, 0x01, 0x00, 0x10, 0x0F, 0xE0, 0x0F, 0xF1, 0x01, 0x10, 0x21, 0x04, + 0x00, 0x80, 0x10, 0x02, 0x00, 0x40, 0x0C, 0x01, 0x82, 0x10, 0x22, 0x04, + 0x40, 0x47, 0xFC, 0x0E, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40, + 0x82, 0x04, 0x08, 0x10, 0x20, 0x81, 0xE0, 0x84, 0x20, 0x84, 0x20, 0x84, + 0x21, 0x04, 0x21, 0x08, 0x21, 0x08, 0x40, 0x1E, 0x04, 0x08, 0x20, 0x40, + 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, 0x81, 0x02, 0x08, 0x11, 0xE0, 0x04, + 0x06, 0x04, 0x84, 0x44, 0x14, 0x0C, 0xFF, 0xFE, 0x99, 0x90, 0x1F, 0xC0, + 0x06, 0x00, 0x20, 0x02, 0x1F, 0xE6, 0x04, 0xC0, 0x48, 0x04, 0x81, 0xC7, + 0xEF, 0x18, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x09, 0xF0, 0x50, + 0xC3, 0x03, 0x10, 0x08, 0x80, 0x48, 0x02, 0x40, 0x23, 0x03, 0x1C, 0x33, + 0xBE, 0x00, 0x0F, 0xD3, 0x07, 0x60, 0x24, 0x02, 0x80, 0x08, 0x00, 0x80, + 0x08, 0x06, 0x41, 0xC3, 0xF0, 0x00, 0x38, 0x00, 0x40, 0x02, 0x00, 0x20, + 0x01, 0x07, 0xC8, 0x43, 0x44, 0x0E, 0x40, 0x24, 0x01, 0x20, 0x09, 0x00, + 0xC8, 0x0E, 0x20, 0xE0, 0xF9, 0xC0, 0x0F, 0x86, 0x09, 0x00, 0xA0, 0x1F, + 0xFF, 0x00, 0x20, 0x06, 0x00, 0x60, 0xC7, 0xE0, 0x01, 0xF8, 0x10, 0x01, + 0x00, 0x08, 0x00, 0x40, 0x1F, 0xF0, 0x20, 0x01, 0x00, 0x08, 0x00, 0x40, + 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x03, 0xFE, 0x00, 0x0F, 0x31, 0x86, + 0x10, 0x10, 0x80, 0x88, 0x04, 0x40, 0x22, 0x02, 0x10, 0x10, 0x43, 0x81, + 0xE4, 0x00, 0x40, 0x02, 0x00, 0x20, 0x3E, 0x00, 0x1C, 0x00, 0x20, 0x03, + 0x00, 0x10, 0x00, 0x80, 0x05, 0xF0, 0x30, 0xC3, 0x02, 0x10, 0x10, 0x80, + 0x84, 0x0C, 0x20, 0x63, 0x02, 0x10, 0x13, 0xE3, 0xE0, 0x01, 0x80, 0x40, + 0x10, 0x00, 0x00, 0x07, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, + 0x04, 0x01, 0x0F, 0xFC, 0x00, 0x40, 0x10, 0x0C, 0x00, 0x00, 0x07, 0xF0, + 0x04, 0x01, 0x00, 0x40, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, + 0x01, 0x00, 0x8F, 0xC0, 0x18, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, + 0x1F, 0x10, 0x81, 0x30, 0x14, 0x01, 0xC0, 0x26, 0x02, 0x20, 0x21, 0x02, + 0x08, 0xE1, 0xE0, 0x0F, 0x80, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x20, + 0x08, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x0F, 0xFC, 0x3B, 0xB8, + 0x33, 0x91, 0x08, 0x44, 0x21, 0x10, 0x84, 0x42, 0x12, 0x10, 0x48, 0x42, + 0x21, 0x0B, 0xC6, 0x30, 0x19, 0xE0, 0xE3, 0x08, 0x11, 0x01, 0x10, 0x11, + 0x02, 0x10, 0x21, 0x02, 0x20, 0x2F, 0x87, 0x0F, 0x86, 0x19, 0x80, 0xA0, + 0x18, 0x03, 0x00, 0x60, 0x14, 0x06, 0x61, 0x87, 0xC0, 0x19, 0xF0, 0x28, + 0x20, 0xC0, 0x42, 0x01, 0x10, 0x04, 0x40, 0x11, 0x00, 0x86, 0x06, 0x14, + 0x30, 0xCF, 0x02, 0x00, 0x08, 0x00, 0x20, 0x03, 0xF0, 0x00, 0x0F, 0x39, + 0x85, 0x18, 0x18, 0x80, 0x88, 0x04, 0x40, 0x22, 0x01, 0x18, 0x18, 0x63, + 0x81, 0xE4, 0x00, 0x20, 0x01, 0x00, 0x10, 0x07, 0xE0, 0x1C, 0x78, 0x2C, + 0x01, 0x80, 0x18, 0x00, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x07, + 0xFC, 0x00, 0x0F, 0x44, 0x32, 0x04, 0x80, 0x1E, 0x00, 0x60, 0x0A, 0x02, + 0xC1, 0x2F, 0x80, 0x10, 0x08, 0x04, 0x02, 0x0F, 0xF9, 0x00, 0x80, 0x40, + 0x20, 0x20, 0x10, 0x08, 0x04, 0x19, 0xF0, 0xE0, 0xF2, 0x02, 0x40, 0x24, + 0x02, 0x40, 0x24, 0x06, 0x40, 0x44, 0x04, 0x41, 0xC3, 0xE6, 0xF8, 0xFA, + 0x01, 0x08, 0x10, 0x41, 0x02, 0x08, 0x10, 0x80, 0x48, 0x02, 0x40, 0x14, + 0x00, 0xC0, 0x00, 0xE0, 0x7A, 0x01, 0x10, 0x08, 0x8C, 0x84, 0xA4, 0x25, + 0x21, 0x4A, 0x0A, 0x50, 0x63, 0x02, 0x18, 0x00, 0x1E, 0x3C, 0x20, 0x40, + 0x46, 0x00, 0xB0, 0x03, 0x00, 0x0E, 0x00, 0xC8, 0x06, 0x10, 0x20, 0x23, + 0xE3, 0xC0, 0x3C, 0x3C, 0x40, 0x20, 0x81, 0x02, 0x08, 0x08, 0x20, 0x31, + 0x00, 0x48, 0x01, 0x40, 0x05, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x08, + 0x03, 0xF0, 0x00, 0x3F, 0xC4, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x9F, 0xF0, 0x06, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08, + 0x21, 0x80, 0x81, 0x02, 0x08, 0x10, 0x20, 0x40, 0xC0, 0x01, 0x11, 0x12, + 0x22, 0x24, 0x44, 0x44, 0x88, 0x80, 0x0C, 0x08, 0x10, 0x20, 0x40, 0x82, + 0x04, 0x08, 0x0C, 0x20, 0x81, 0x02, 0x04, 0x08, 0x21, 0x80, 0x38, 0x28, + 0x88, 0x0E, 0x00 }; + +const GFXglyph FreeMonoOblique12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' + { 0, 4, 15, 14, 6, -14 }, // 0x21 '!' + { 8, 8, 7, 14, 5, -14 }, // 0x22 '"' + { 15, 11, 16, 14, 3, -14 }, // 0x23 '#' + { 37, 10, 18, 14, 4, -15 }, // 0x24 '$' + { 60, 11, 15, 14, 3, -14 }, // 0x25 '%' + { 81, 9, 12, 14, 3, -11 }, // 0x26 '&' + { 95, 3, 7, 14, 8, -14 }, // 0x27 ''' + { 98, 5, 18, 14, 8, -14 }, // 0x28 '(' + { 110, 5, 18, 14, 4, -14 }, // 0x29 ')' + { 122, 9, 9, 14, 5, -14 }, // 0x2A '*' + { 133, 11, 11, 14, 3, -11 }, // 0x2B '+' + { 149, 6, 7, 14, 3, -3 }, // 0x2C ',' + { 155, 11, 1, 14, 3, -6 }, // 0x2D '-' + { 157, 3, 3, 14, 6, -2 }, // 0x2E '.' + { 159, 13, 18, 14, 2, -15 }, // 0x2F '/' + { 189, 10, 15, 14, 4, -14 }, // 0x30 '0' + { 208, 9, 15, 14, 3, -14 }, // 0x31 '1' + { 225, 12, 15, 14, 2, -14 }, // 0x32 '2' + { 248, 11, 15, 14, 3, -14 }, // 0x33 '3' + { 269, 10, 15, 14, 3, -14 }, // 0x34 '4' + { 288, 11, 15, 14, 3, -14 }, // 0x35 '5' + { 309, 11, 15, 14, 4, -14 }, // 0x36 '6' + { 330, 10, 15, 14, 5, -14 }, // 0x37 '7' + { 349, 11, 15, 14, 3, -14 }, // 0x38 '8' + { 370, 11, 15, 14, 3, -14 }, // 0x39 '9' + { 391, 5, 10, 14, 5, -9 }, // 0x3A ':' + { 398, 7, 13, 14, 3, -9 }, // 0x3B ';' + { 410, 12, 11, 14, 3, -11 }, // 0x3C '<' + { 427, 13, 4, 14, 2, -8 }, // 0x3D '=' + { 434, 12, 11, 14, 2, -11 }, // 0x3E '>' + { 451, 8, 14, 14, 6, -13 }, // 0x3F '?' + { 465, 10, 16, 14, 3, -14 }, // 0x40 '@' + { 485, 14, 14, 14, 0, -13 }, // 0x41 'A' + { 510, 13, 14, 14, 1, -13 }, // 0x42 'B' + { 533, 12, 14, 14, 3, -13 }, // 0x43 'C' + { 554, 13, 14, 14, 1, -13 }, // 0x44 'D' + { 577, 14, 14, 14, 1, -13 }, // 0x45 'E' + { 602, 14, 14, 14, 1, -13 }, // 0x46 'F' + { 627, 12, 14, 14, 3, -13 }, // 0x47 'G' + { 648, 15, 14, 14, 1, -13 }, // 0x48 'H' + { 675, 11, 14, 14, 3, -13 }, // 0x49 'I' + { 695, 15, 14, 14, 2, -13 }, // 0x4A 'J' + { 722, 15, 14, 14, 1, -13 }, // 0x4B 'K' + { 749, 12, 14, 14, 2, -13 }, // 0x4C 'L' + { 770, 17, 14, 14, 0, -13 }, // 0x4D 'M' + { 800, 15, 14, 14, 1, -13 }, // 0x4E 'N' + { 827, 13, 14, 14, 2, -13 }, // 0x4F 'O' + { 850, 13, 14, 14, 1, -13 }, // 0x50 'P' + { 873, 13, 17, 14, 2, -13 }, // 0x51 'Q' + { 901, 13, 14, 14, 1, -13 }, // 0x52 'R' + { 924, 11, 14, 14, 3, -13 }, // 0x53 'S' + { 944, 12, 14, 14, 4, -13 }, // 0x54 'T' + { 965, 13, 14, 14, 3, -13 }, // 0x55 'U' + { 988, 14, 14, 14, 3, -13 }, // 0x56 'V' + { 1013, 14, 14, 14, 3, -13 }, // 0x57 'W' + { 1038, 15, 14, 14, 1, -13 }, // 0x58 'X' + { 1065, 12, 14, 14, 4, -13 }, // 0x59 'Y' + { 1086, 12, 14, 14, 2, -13 }, // 0x5A 'Z' + { 1107, 7, 18, 14, 6, -14 }, // 0x5B '[' + { 1123, 5, 18, 14, 6, -15 }, // 0x5C '\' + { 1135, 7, 18, 14, 3, -14 }, // 0x5D ']' + { 1151, 9, 6, 14, 5, -14 }, // 0x5E '^' + { 1158, 15, 1, 14, -1, 3 }, // 0x5F '_' + { 1160, 3, 4, 14, 6, -15 }, // 0x60 '`' + { 1162, 12, 10, 14, 2, -9 }, // 0x61 'a' + { 1177, 13, 15, 14, 1, -14 }, // 0x62 'b' + { 1202, 12, 10, 14, 3, -9 }, // 0x63 'c' + { 1217, 13, 15, 14, 2, -14 }, // 0x64 'd' + { 1242, 11, 10, 14, 3, -9 }, // 0x65 'e' + { 1256, 13, 15, 14, 3, -14 }, // 0x66 'f' + { 1281, 13, 14, 14, 3, -9 }, // 0x67 'g' + { 1304, 13, 15, 14, 1, -14 }, // 0x68 'h' + { 1329, 10, 15, 14, 2, -14 }, // 0x69 'i' + { 1348, 10, 19, 14, 2, -14 }, // 0x6A 'j' + { 1372, 12, 15, 14, 2, -14 }, // 0x6B 'k' + { 1395, 10, 15, 14, 2, -14 }, // 0x6C 'l' + { 1414, 14, 10, 14, 0, -9 }, // 0x6D 'm' + { 1432, 12, 10, 14, 1, -9 }, // 0x6E 'n' + { 1447, 11, 10, 14, 3, -9 }, // 0x6F 'o' + { 1461, 14, 14, 14, 0, -9 }, // 0x70 'p' + { 1486, 13, 14, 14, 3, -9 }, // 0x71 'q' + { 1509, 13, 10, 14, 2, -9 }, // 0x72 'r' + { 1526, 10, 10, 14, 3, -9 }, // 0x73 's' + { 1539, 9, 14, 14, 3, -13 }, // 0x74 't' + { 1555, 12, 10, 14, 2, -9 }, // 0x75 'u' + { 1570, 13, 10, 14, 3, -9 }, // 0x76 'v' + { 1587, 13, 10, 14, 3, -9 }, // 0x77 'w' + { 1604, 14, 10, 14, 1, -9 }, // 0x78 'x' + { 1622, 14, 14, 14, 1, -9 }, // 0x79 'y' + { 1647, 11, 10, 14, 3, -9 }, // 0x7A 'z' + { 1661, 7, 18, 14, 5, -14 }, // 0x7B '{' + { 1677, 4, 17, 14, 6, -13 }, // 0x7C '|' + { 1686, 7, 18, 14, 4, -14 }, // 0x7D '}' + { 1702, 11, 3, 14, 3, -7 } }; // 0x7E '~' + +const GFXfont FreeMonoOblique12pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique12pt7bBitmaps, + (GFXglyph *)FreeMonoOblique12pt7bGlyphs, + 0x20, 0x7E, 24 }; + +// Approx. 2379 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique18pt7b.h new file mode 100644 index 0000000..1979e72 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique18pt7b.h @@ -0,0 +1,398 @@ +const uint8_t FreeMonoOblique18pt7bBitmaps[] PROGMEM = { + 0x00, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x06, 0x18, 0x30, 0x60, 0xC1, 0x02, + 0x04, 0x00, 0x00, 0x01, 0xC7, 0x8F, 0x1C, 0x00, 0x78, 0x7B, 0xC3, 0xFC, + 0x3D, 0xE1, 0xEF, 0x0F, 0x70, 0x73, 0x83, 0x98, 0x18, 0xC0, 0xC6, 0x06, + 0x00, 0x00, 0x8C, 0x01, 0x18, 0x06, 0x20, 0x08, 0x40, 0x11, 0x80, 0x62, + 0x00, 0xC4, 0x01, 0x18, 0x02, 0x30, 0x7F, 0xFC, 0x10, 0x80, 0x23, 0x00, + 0xC4, 0x01, 0x88, 0x3F, 0xFF, 0x04, 0x60, 0x18, 0x80, 0x21, 0x00, 0x46, + 0x01, 0x88, 0x03, 0x10, 0x04, 0x60, 0x08, 0xC0, 0x31, 0x00, 0x00, 0x30, + 0x00, 0x20, 0x00, 0x20, 0x00, 0xF9, 0x03, 0x0F, 0x06, 0x03, 0x04, 0x03, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x40, 0x04, 0x40, 0x08, 0x40, 0x18, + 0xF0, 0x60, 0x9F, 0x80, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x03, 0xC0, 0x0C, 0x60, 0x08, 0x20, 0x10, 0x20, 0x10, 0x20, + 0x10, 0x40, 0x18, 0x80, 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x78, 0x07, 0xC0, + 0x3C, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x02, 0x18, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x10, 0x0C, 0x20, 0x07, 0xC0, 0x01, 0xF0, 0x11, 0x81, + 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x80, 0x04, 0x00, 0xF0, + 0x09, 0x86, 0x84, 0x48, 0x32, 0x40, 0xA2, 0x07, 0x10, 0x30, 0x43, 0x81, + 0xE7, 0x80, 0x7B, 0xFD, 0xEF, 0x73, 0x98, 0xC6, 0x00, 0x01, 0x02, 0x06, + 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x04, 0x06, + 0x06, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, + 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, 0xC0, 0x01, + 0x00, 0x04, 0x00, 0x10, 0x00, 0xC6, 0xE3, 0xF8, 0x7E, 0x00, 0x70, 0x03, + 0x40, 0x19, 0x80, 0xC2, 0x06, 0x0C, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0xFF, 0xFE, + 0x02, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x02, + 0x00, 0x04, 0x00, 0x0F, 0x87, 0x87, 0x83, 0x83, 0xC1, 0xC1, 0xC0, 0xC0, + 0xE0, 0x60, 0x00, 0xFF, 0xFF, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x04, 0x00, + 0x01, 0x80, 0x00, 0x60, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, + 0x10, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x20, 0x00, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0x40, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x20, + 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x01, + 0xF0, 0x18, 0x60, 0x80, 0x86, 0x01, 0x10, 0x04, 0x80, 0x12, 0x00, 0x50, + 0x01, 0x40, 0x0D, 0x00, 0x24, 0x00, 0xA0, 0x02, 0x80, 0x1A, 0x00, 0x48, + 0x01, 0x20, 0x0C, 0x80, 0x22, 0x01, 0x84, 0x0C, 0x18, 0x60, 0x3E, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x68, 0x06, 0x40, 0xE4, 0x04, 0x20, 0x01, 0x00, + 0x08, 0x00, 0x40, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, + 0x00, 0x20, 0x01, 0x00, 0x08, 0x00, 0x80, 0x04, 0x0F, 0xFF, 0x80, 0x00, + 0x3C, 0x00, 0x61, 0x80, 0x40, 0x40, 0x40, 0x10, 0x60, 0x08, 0x00, 0x04, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, + 0x00, 0x1C, 0x01, 0x1C, 0x00, 0x8F, 0xFF, 0xC0, 0x00, 0xFC, 0x03, 0x06, + 0x06, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x0C, 0x00, 0xF0, 0x00, 0x18, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x40, 0x18, 0x70, 0x30, + 0x0F, 0xC0, 0x00, 0x1C, 0x00, 0xD0, 0x06, 0x80, 0x32, 0x00, 0x88, 0x04, + 0x20, 0x30, 0x81, 0x84, 0x04, 0x10, 0x20, 0x41, 0x81, 0x0C, 0x08, 0x60, + 0x21, 0x00, 0x8F, 0xFF, 0x80, 0x18, 0x00, 0x40, 0x01, 0x00, 0x04, 0x00, + 0x10, 0x07, 0xE0, 0x03, 0xFF, 0x03, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x30, 0x00, 0x1B, 0xE0, 0x0E, 0x0C, 0x00, 0x02, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x04, 0x60, 0x04, 0x18, 0x04, 0x06, 0x0C, 0x00, 0xF8, 0x00, + 0x00, 0x3F, 0x00, 0xC0, 0x03, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0x43, 0xE0, 0x4C, 0x30, 0xB0, 0x18, + 0xE0, 0x08, 0xC0, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x10, 0xC0, 0x10, + 0x40, 0x20, 0x20, 0xC0, 0x1F, 0x00, 0xFF, 0xFC, 0x00, 0xE0, 0x04, 0x00, + 0x60, 0x02, 0x00, 0x30, 0x01, 0x00, 0x18, 0x00, 0x80, 0x0C, 0x00, 0x40, + 0x06, 0x00, 0x20, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0xC0, 0x04, + 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0xF0, 0x06, 0x18, 0x10, 0x18, 0x40, + 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x88, 0x02, 0x18, 0x08, 0x18, 0x60, + 0x1F, 0x80, 0xC1, 0x82, 0x01, 0x88, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80, + 0x09, 0x00, 0x23, 0x00, 0x83, 0x06, 0x01, 0xF0, 0x00, 0x00, 0xF0, 0x06, + 0x18, 0x10, 0x10, 0x40, 0x30, 0x80, 0x22, 0x00, 0x44, 0x00, 0x88, 0x03, + 0x10, 0x0E, 0x30, 0x34, 0x30, 0xD0, 0x3E, 0x20, 0x00, 0x40, 0x01, 0x00, + 0x02, 0x00, 0x08, 0x00, 0x20, 0x00, 0xC0, 0x02, 0x00, 0x18, 0x0F, 0xC0, + 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xC7, 0xCF, + 0x9F, 0x1C, 0x00, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x0F, 0x01, + 0xC0, 0x70, 0x0E, 0x03, 0x80, 0x60, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x38, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x18, 0x00, 0x03, 0x80, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, + 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x1F, 0xCE, 0x06, 0x80, + 0x38, 0x01, 0x80, 0x10, 0x01, 0x00, 0x20, 0x04, 0x01, 0x80, 0xF0, 0x18, + 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x80, 0xF8, + 0x07, 0x00, 0x01, 0xF0, 0x0C, 0x30, 0x30, 0x30, 0x40, 0x21, 0x00, 0x44, + 0x00, 0x88, 0x01, 0x10, 0x1E, 0x40, 0xC4, 0x86, 0x11, 0x08, 0x22, 0x20, + 0x48, 0x40, 0x90, 0x82, 0x21, 0x84, 0x40, 0xFC, 0x80, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x0C, 0x18, 0x07, 0xC0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x68, 0x00, 0x06, 0x40, 0x00, 0x32, 0x00, 0x03, 0x10, 0x00, + 0x10, 0x80, 0x01, 0x84, 0x00, 0x18, 0x10, 0x00, 0xC0, 0x80, 0x0C, 0x04, + 0x00, 0x60, 0x20, 0x06, 0x01, 0x00, 0x3F, 0xFC, 0x02, 0x00, 0x20, 0x10, + 0x01, 0x01, 0x00, 0x08, 0x08, 0x00, 0x40, 0x80, 0x02, 0x0C, 0x00, 0x09, + 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, + 0x02, 0x00, 0x40, 0x80, 0x10, 0x40, 0x08, 0x10, 0x06, 0x04, 0x03, 0x01, + 0xFF, 0x80, 0x40, 0x38, 0x20, 0x02, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, + 0x04, 0x40, 0x01, 0x10, 0x00, 0x84, 0x00, 0x41, 0x00, 0x23, 0xFF, 0xF0, + 0x00, 0xFC, 0x40, 0xC1, 0xF0, 0xC0, 0x1C, 0x60, 0x06, 0x10, 0x00, 0x88, + 0x00, 0x24, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, + 0x40, 0x06, 0x08, 0x03, 0x01, 0x83, 0x80, 0x3F, 0x00, 0x0F, 0xFE, 0x00, + 0x80, 0xC0, 0x20, 0x18, 0x10, 0x02, 0x04, 0x00, 0x41, 0x00, 0x10, 0x40, + 0x04, 0x20, 0x01, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20, 0x02, + 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x10, 0x40, 0x08, 0x20, 0x06, 0x08, + 0x03, 0x02, 0x01, 0x83, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x10, 0x02, 0x02, + 0x00, 0x60, 0x20, 0x06, 0x02, 0x00, 0x60, 0x20, 0x00, 0x04, 0x00, 0x00, + 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00, 0x81, 0x00, + 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x81, 0x00, 0x08, 0x10, 0x00, + 0x81, 0x00, 0x18, 0x10, 0x01, 0x8F, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0x10, + 0x03, 0x02, 0x00, 0x30, 0x20, 0x03, 0x02, 0x00, 0x20, 0x20, 0x00, 0x04, + 0x00, 0x00, 0x40, 0x80, 0x04, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x10, 0x00, + 0x81, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, + 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFE, + 0x40, 0xC0, 0xF0, 0x40, 0x1C, 0x20, 0x03, 0x10, 0x00, 0x88, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x01, + 0xFE, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x40, 0x04, + 0x18, 0x01, 0x03, 0x81, 0xC0, 0x3F, 0x80, 0x07, 0xE1, 0xF8, 0x08, 0x02, + 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x01, 0x00, 0x20, 0x18, + 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x3F, 0xFC, 0x01, 0x00, 0x60, + 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x20, 0x04, 0x02, 0x00, + 0x40, 0x10, 0x02, 0x00, 0x80, 0x10, 0x04, 0x00, 0x81, 0xF8, 0x3F, 0x00, + 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x20, + 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x04, + 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x0C, 0x04, 0x00, + 0x80, 0x40, 0x08, 0x08, 0x00, 0x80, 0x80, 0x08, 0x08, 0x01, 0x00, 0x80, + 0x10, 0x0C, 0x02, 0x00, 0x60, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE1, 0xF8, + 0x08, 0x03, 0x00, 0x80, 0x60, 0x04, 0x06, 0x00, 0x20, 0x60, 0x01, 0x06, + 0x00, 0x10, 0xC0, 0x00, 0x8C, 0x00, 0x04, 0xC0, 0x00, 0x2F, 0x80, 0x01, + 0x8E, 0x00, 0x18, 0x30, 0x00, 0x80, 0xC0, 0x04, 0x06, 0x00, 0x20, 0x10, + 0x02, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x80, 0x30, 0x04, 0x00, 0x81, 0xFC, + 0x07, 0x80, 0x07, 0xFC, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, + 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x10, 0x20, 0x04, + 0x08, 0x01, 0x04, 0x00, 0x81, 0x00, 0x20, 0x40, 0x0B, 0xFF, 0xFE, 0x0F, + 0x00, 0x1E, 0x03, 0x00, 0x38, 0x05, 0x00, 0x68, 0x04, 0x80, 0x68, 0x04, + 0x80, 0xC8, 0x04, 0x80, 0x90, 0x04, 0x81, 0x90, 0x08, 0x43, 0x10, 0x08, + 0x42, 0x10, 0x08, 0x46, 0x10, 0x08, 0x4C, 0x20, 0x10, 0x2C, 0x20, 0x10, + 0x38, 0x20, 0x10, 0x30, 0x20, 0x10, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, + 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0xFC, 0x07, 0xE0, 0x1F, + 0x01, 0xFC, 0x0C, 0x00, 0x80, 0x78, 0x02, 0x01, 0xE0, 0x18, 0x04, 0x80, + 0x60, 0x13, 0x01, 0x00, 0x4C, 0x04, 0x03, 0x18, 0x10, 0x0C, 0x60, 0xC0, + 0x20, 0x83, 0x00, 0x83, 0x08, 0x06, 0x0C, 0x20, 0x18, 0x18, 0x80, 0x40, + 0x66, 0x01, 0x00, 0x98, 0x04, 0x03, 0x40, 0x30, 0x0D, 0x00, 0xC0, 0x14, + 0x02, 0x00, 0x70, 0x3F, 0x80, 0xC0, 0x00, 0xF8, 0x01, 0x83, 0x01, 0x00, + 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x40, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, 0x00, 0x14, 0x00, 0x12, + 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08, 0x0C, 0x18, 0x01, 0xF0, + 0x00, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00, + 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80, + 0x7F, 0x80, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x40, + 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xF8, + 0x01, 0x83, 0x01, 0x00, 0xC1, 0x00, 0x21, 0x00, 0x19, 0x00, 0x05, 0x00, + 0x02, 0x80, 0x01, 0x40, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, + 0x00, 0x14, 0x00, 0x12, 0x00, 0x09, 0x80, 0x08, 0x40, 0x08, 0x30, 0x08, + 0x0C, 0x18, 0x03, 0xF0, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0xFE, 0x18, 0xC0, + 0xF0, 0x0F, 0xFE, 0x00, 0x40, 0x60, 0x20, 0x0C, 0x08, 0x01, 0x02, 0x00, + 0x40, 0x80, 0x10, 0x40, 0x04, 0x10, 0x02, 0x04, 0x01, 0x01, 0x01, 0x80, + 0x7F, 0x80, 0x20, 0x60, 0x08, 0x0C, 0x02, 0x03, 0x80, 0x80, 0x60, 0x40, + 0x18, 0x10, 0x03, 0x04, 0x00, 0xC1, 0x00, 0x1B, 0xF8, 0x07, 0x00, 0x7E, + 0x40, 0x60, 0xF0, 0x20, 0x1C, 0x10, 0x02, 0x08, 0x00, 0x82, 0x00, 0x00, + 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, + 0x18, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x11, 0x00, 0x04, 0x40, 0x02, + 0x38, 0x01, 0x0B, 0x81, 0x82, 0x3F, 0x80, 0x3F, 0xFF, 0xA0, 0x20, 0x50, + 0x10, 0x28, 0x08, 0x24, 0x08, 0x10, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x1F, + 0xFC, 0x00, 0x7E, 0x0F, 0xC4, 0x00, 0x42, 0x00, 0x10, 0x80, 0x08, 0x20, + 0x02, 0x08, 0x00, 0x82, 0x00, 0x21, 0x00, 0x08, 0x40, 0x04, 0x10, 0x01, + 0x04, 0x00, 0x41, 0x00, 0x10, 0x80, 0x0C, 0x20, 0x02, 0x08, 0x00, 0x82, + 0x00, 0x60, 0x80, 0x10, 0x10, 0x08, 0x06, 0x0C, 0x00, 0x7C, 0x00, 0xFE, + 0x03, 0xF9, 0x80, 0x02, 0x0C, 0x00, 0x30, 0x20, 0x01, 0x01, 0x00, 0x10, + 0x08, 0x01, 0x80, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x00, 0x40, + 0x60, 0x02, 0x06, 0x00, 0x10, 0x20, 0x00, 0xC3, 0x00, 0x06, 0x10, 0x00, + 0x31, 0x80, 0x00, 0x88, 0x00, 0x04, 0x80, 0x00, 0x2C, 0x00, 0x01, 0xC0, + 0x00, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0xF2, 0x00, 0x04, 0x20, 0x00, 0xC2, + 0x00, 0x08, 0x20, 0xC0, 0x82, 0x0C, 0x18, 0x21, 0xA1, 0x02, 0x1A, 0x10, + 0x23, 0x23, 0x04, 0x32, 0x30, 0x46, 0x22, 0x04, 0x62, 0x60, 0x4C, 0x26, + 0x04, 0xC2, 0x40, 0x58, 0x24, 0x05, 0x82, 0xC0, 0x70, 0x28, 0x07, 0x02, + 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0x0F, 0xC1, 0xF8, 0x30, 0x03, 0x00, + 0xC0, 0x30, 0x06, 0x03, 0x00, 0x18, 0x10, 0x00, 0xC1, 0x00, 0x03, 0x18, + 0x00, 0x09, 0x80, 0x00, 0x78, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x01, + 0xA0, 0x00, 0x19, 0x80, 0x01, 0x84, 0x00, 0x18, 0x30, 0x01, 0x80, 0xC0, + 0x08, 0x06, 0x00, 0x80, 0x18, 0x08, 0x00, 0xC1, 0xF8, 0x3F, 0x80, 0x7E, + 0x0F, 0xC4, 0x00, 0xC1, 0x80, 0x60, 0x20, 0x30, 0x0C, 0x08, 0x03, 0x04, + 0x00, 0x43, 0x00, 0x19, 0x80, 0x02, 0xC0, 0x00, 0xE0, 0x00, 0x10, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, + 0x00, 0x01, 0x00, 0x00, 0x40, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0x86, 0x00, + 0x82, 0x00, 0x81, 0x00, 0xC1, 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0x00, + 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, + 0x60, 0x10, 0x60, 0x18, 0x20, 0x08, 0x20, 0x04, 0x20, 0x02, 0x30, 0x03, + 0x1F, 0xFF, 0x80, 0x07, 0xE0, 0x80, 0x10, 0x02, 0x00, 0xC0, 0x18, 0x02, + 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, + 0x00, 0x20, 0x04, 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x10, 0x06, 0x00, + 0xFC, 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, + 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x07, 0xE0, 0x0C, 0x01, 0x00, 0x20, 0x04, + 0x01, 0x80, 0x30, 0x04, 0x00, 0x80, 0x30, 0x06, 0x00, 0x80, 0x10, 0x02, + 0x00, 0xC0, 0x18, 0x02, 0x00, 0x40, 0x18, 0x03, 0x00, 0x40, 0x08, 0x03, + 0x00, 0x60, 0xF8, 0x00, 0x01, 0x00, 0x1C, 0x01, 0xB0, 0x19, 0x81, 0x86, + 0x18, 0x11, 0x80, 0xD8, 0x03, 0x80, 0x18, 0xFF, 0xFF, 0xF8, 0xC7, 0x1C, + 0x71, 0x80, 0x03, 0xF8, 0x0C, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x07, 0xFC, 0x18, 0x0C, 0x20, 0x04, 0x40, 0x04, 0x80, 0x04, + 0x80, 0x08, 0x80, 0x38, 0xC0, 0xE8, 0x3F, 0x0F, 0x0F, 0x00, 0x00, 0x20, + 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x04, 0x00, 0x00, 0x87, + 0xC0, 0x13, 0x0C, 0x06, 0x80, 0x40, 0xE0, 0x0C, 0x18, 0x00, 0x82, 0x00, + 0x10, 0xC0, 0x02, 0x10, 0x00, 0x42, 0x00, 0x08, 0x40, 0x02, 0x08, 0x00, + 0x43, 0x80, 0x10, 0x70, 0x04, 0x09, 0x83, 0x0F, 0x1F, 0x80, 0x01, 0xFC, + 0x83, 0x03, 0xC6, 0x00, 0xE4, 0x00, 0x22, 0x00, 0x12, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x18, 0x00, 0x64, + 0x00, 0x61, 0x81, 0xC0, 0x7F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, + 0x0C, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x60, 0x3F, 0x18, 0x10, 0x64, + 0x18, 0x0D, 0x08, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x0C, 0x80, 0x02, 0x20, + 0x00, 0x88, 0x00, 0x62, 0x00, 0x18, 0x80, 0x0E, 0x20, 0x03, 0x04, 0x03, + 0x40, 0xC1, 0xB0, 0x1F, 0x8F, 0x00, 0x01, 0xF0, 0x0E, 0x0C, 0x18, 0x06, + 0x30, 0x02, 0x60, 0x01, 0x40, 0x01, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x60, 0x06, 0x30, 0x1C, 0x0F, 0xE0, + 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x07, 0xFF, 0xC0, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, + 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0F, + 0xFF, 0x00, 0x03, 0xE3, 0xE1, 0x83, 0x60, 0x40, 0x38, 0x10, 0x03, 0x04, + 0x00, 0x60, 0x80, 0x0C, 0x20, 0x01, 0x84, 0x00, 0x20, 0x80, 0x04, 0x10, + 0x01, 0x82, 0x00, 0x30, 0x60, 0x0C, 0x04, 0x02, 0x80, 0x61, 0x90, 0x07, + 0xC6, 0x00, 0x00, 0xC0, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, + 0x30, 0x00, 0x0C, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x40, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x23, 0xE0, 0x0B, + 0x0C, 0x05, 0x00, 0x81, 0x80, 0x20, 0x40, 0x08, 0x10, 0x02, 0x08, 0x00, + 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x10, 0x01, 0x84, 0x00, 0x61, + 0x00, 0x30, 0x40, 0x0C, 0xFC, 0x1F, 0xC0, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x20, + 0x00, 0x40, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x1F, 0xFF, + 0x80, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, + 0x40, 0x00, 0x80, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, + 0x00, 0x80, 0x03, 0x00, 0x0C, 0x0F, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x60, + 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x30, 0xFC, + 0x08, 0x18, 0x02, 0x0C, 0x00, 0x8C, 0x00, 0x66, 0x00, 0x1B, 0x00, 0x05, + 0x80, 0x01, 0xB0, 0x00, 0x46, 0x00, 0x31, 0xC0, 0x0C, 0x30, 0x02, 0x06, + 0x00, 0x80, 0xC0, 0x60, 0x30, 0xF8, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x20, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x04, 0x00, 0x08, 0x0F, 0xFF, 0xC0, + 0x1C, 0xF1, 0xE0, 0xF1, 0xE3, 0x0E, 0x1C, 0x10, 0xC1, 0x81, 0x08, 0x10, + 0x30, 0x81, 0x03, 0x18, 0x10, 0x21, 0x83, 0x02, 0x10, 0x30, 0x21, 0x02, + 0x06, 0x10, 0x20, 0x63, 0x02, 0x04, 0x30, 0x60, 0x42, 0x06, 0x04, 0xF8, + 0x70, 0xF0, 0x0E, 0x3E, 0x01, 0x60, 0x81, 0xC0, 0x20, 0xC0, 0x10, 0x40, + 0x08, 0x20, 0x04, 0x30, 0x02, 0x10, 0x02, 0x08, 0x01, 0x04, 0x00, 0x82, + 0x00, 0x42, 0x00, 0x21, 0x00, 0x20, 0x80, 0x13, 0xF0, 0x3E, 0x01, 0xF0, + 0x06, 0x0C, 0x18, 0x06, 0x20, 0x03, 0x60, 0x01, 0x40, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x02, 0x80, 0x06, 0xC0, 0x04, 0x40, 0x18, + 0x30, 0x60, 0x1F, 0x80, 0x0F, 0x1F, 0x80, 0x16, 0x0C, 0x01, 0xC0, 0x20, + 0x30, 0x03, 0x03, 0x00, 0x10, 0x20, 0x01, 0x02, 0x00, 0x10, 0x40, 0x01, + 0x04, 0x00, 0x10, 0x40, 0x02, 0x06, 0x00, 0x60, 0x60, 0x04, 0x0B, 0x00, + 0x80, 0x98, 0x30, 0x08, 0xFC, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xF1, 0xE1, 0x83, 0x20, 0x40, 0x34, 0x10, 0x03, 0x84, 0x00, 0x30, 0x80, + 0x04, 0x20, 0x00, 0x84, 0x00, 0x10, 0x80, 0x06, 0x10, 0x00, 0xC2, 0x00, + 0x30, 0x60, 0x0E, 0x04, 0x03, 0x40, 0x60, 0xC8, 0x07, 0xE2, 0x00, 0x00, + 0x40, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x87, 0xC0, 0x23, 0x08, 0x04, 0xC0, 0x00, + 0xE0, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x08, + 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xFA, 0x0C, 0x1C, 0x20, 0x08, 0x80, 0x11, + 0x00, 0x03, 0x00, 0x03, 0xF8, 0x00, 0x7C, 0x00, 0x0C, 0x00, 0x09, 0x00, + 0x16, 0x00, 0x2C, 0x00, 0x9E, 0x06, 0x27, 0xF0, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0x10, 0x00, 0x80, 0x7F, 0xFC, 0x40, 0x02, 0x00, 0x10, 0x00, + 0x80, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00, 0x40, + 0x02, 0x00, 0xD8, 0x1C, 0x3F, 0x00, 0xF0, 0x1E, 0x20, 0x04, 0x80, 0x09, + 0x00, 0x12, 0x00, 0x24, 0x00, 0xC8, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80, + 0x09, 0x00, 0x12, 0x00, 0x64, 0x03, 0x8C, 0x1D, 0x0F, 0xC3, 0x80, 0xFE, + 0x0F, 0xE6, 0x00, 0x20, 0x40, 0x08, 0x08, 0x03, 0x01, 0x80, 0x40, 0x30, + 0x18, 0x06, 0x02, 0x00, 0x40, 0x80, 0x08, 0x30, 0x01, 0x84, 0x00, 0x31, + 0x80, 0x02, 0x20, 0x00, 0x48, 0x00, 0x09, 0x00, 0x01, 0xC0, 0x00, 0xF8, + 0x0F, 0xA0, 0x01, 0x90, 0x00, 0x88, 0x40, 0xC4, 0x30, 0x42, 0x18, 0x61, + 0x1A, 0x20, 0x8D, 0x10, 0x4C, 0x98, 0x26, 0x48, 0x16, 0x2C, 0x0B, 0x14, + 0x07, 0x0A, 0x03, 0x07, 0x01, 0x81, 0x00, 0x0F, 0x83, 0xE0, 0xC0, 0x18, + 0x0C, 0x0C, 0x01, 0x83, 0x00, 0x18, 0xC0, 0x01, 0xB0, 0x00, 0x1C, 0x00, + 0x03, 0x00, 0x00, 0xF0, 0x00, 0x63, 0x00, 0x18, 0x30, 0x06, 0x06, 0x01, + 0x80, 0x60, 0x60, 0x06, 0x3F, 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x30, 0x01, + 0x00, 0x80, 0x18, 0x04, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80, 0xC0, 0x04, + 0x04, 0x00, 0x30, 0x60, 0x01, 0x86, 0x00, 0x04, 0x20, 0x00, 0x23, 0x00, + 0x01, 0xB0, 0x00, 0x0D, 0x00, 0x00, 0x38, 0x00, 0x01, 0x80, 0x00, 0x08, + 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, + 0x20, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFF, 0x10, 0x06, 0x10, 0x0C, 0x10, + 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x60, 0x0C, 0xFF, 0xF8, 0x00, + 0xE0, 0x20, 0x08, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x04, 0x00, + 0x80, 0x20, 0x08, 0x0E, 0x00, 0x60, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, + 0x40, 0x08, 0x02, 0x00, 0x40, 0x08, 0x01, 0x00, 0x18, 0x00, 0x00, 0x10, + 0xC3, 0x08, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x08, 0x21, 0x86, + 0x10, 0x43, 0x0C, 0x20, 0x06, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x10, 0x04, 0x02, 0x00, 0x80, 0x20, 0x0C, 0x01, 0xC0, 0xC0, 0x40, 0x10, + 0x04, 0x03, 0x00, 0x80, 0x20, 0x08, 0x02, 0x01, 0x00, 0xC0, 0xE0, 0x00, + 0x1E, 0x02, 0x66, 0x0D, 0x86, 0x16, 0x06, 0x48, 0x07, 0x00 }; + +const GFXglyph FreeMonoOblique18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 21, 0, 1 }, // 0x20 ' ' + { 0, 7, 22, 21, 9, -21 }, // 0x21 '!' + { 20, 13, 10, 21, 7, -20 }, // 0x22 '"' + { 37, 15, 24, 21, 5, -21 }, // 0x23 '#' + { 82, 16, 26, 21, 4, -22 }, // 0x24 '$' + { 134, 16, 21, 21, 5, -20 }, // 0x25 '%' + { 176, 13, 18, 21, 5, -17 }, // 0x26 '&' + { 206, 5, 10, 21, 12, -20 }, // 0x27 ''' + { 213, 8, 25, 21, 12, -20 }, // 0x28 '(' + { 238, 8, 25, 21, 5, -20 }, // 0x29 ')' + { 263, 14, 11, 21, 7, -19 }, // 0x2A '*' + { 283, 15, 17, 21, 5, -17 }, // 0x2B '+' + { 315, 9, 10, 21, 4, -4 }, // 0x2C ',' + { 327, 16, 1, 21, 5, -9 }, // 0x2D '-' + { 329, 5, 5, 21, 8, -4 }, // 0x2E '.' + { 333, 19, 26, 21, 3, -22 }, // 0x2F '/' + { 395, 14, 21, 21, 5, -20 }, // 0x30 '0' + { 432, 13, 21, 21, 4, -20 }, // 0x31 '1' + { 467, 17, 21, 21, 3, -20 }, // 0x32 '2' + { 512, 16, 21, 21, 3, -20 }, // 0x33 '3' + { 554, 14, 21, 21, 5, -20 }, // 0x34 '4' + { 591, 17, 21, 21, 4, -20 }, // 0x35 '5' + { 636, 16, 21, 21, 6, -20 }, // 0x36 '6' + { 678, 13, 21, 21, 8, -20 }, // 0x37 '7' + { 713, 15, 21, 21, 5, -20 }, // 0x38 '8' + { 753, 15, 21, 21, 5, -20 }, // 0x39 '9' + { 793, 7, 15, 21, 8, -14 }, // 0x3A ':' + { 807, 11, 20, 21, 4, -14 }, // 0x3B ';' + { 835, 17, 16, 21, 5, -17 }, // 0x3C '<' + { 869, 19, 6, 21, 3, -12 }, // 0x3D '=' + { 884, 18, 16, 21, 3, -17 }, // 0x3E '>' + { 920, 12, 20, 21, 8, -19 }, // 0x3F '?' + { 950, 15, 23, 21, 5, -20 }, // 0x40 '@' + { 994, 21, 20, 21, 0, -19 }, // 0x41 'A' + { 1047, 18, 20, 21, 2, -19 }, // 0x42 'B' + { 1092, 18, 20, 21, 4, -19 }, // 0x43 'C' + { 1137, 18, 20, 21, 2, -19 }, // 0x44 'D' + { 1182, 20, 20, 21, 2, -19 }, // 0x45 'E' + { 1232, 20, 20, 21, 2, -19 }, // 0x46 'F' + { 1282, 18, 20, 21, 4, -19 }, // 0x47 'G' + { 1327, 21, 20, 21, 2, -19 }, // 0x48 'H' + { 1380, 17, 20, 21, 4, -19 }, // 0x49 'I' + { 1423, 20, 20, 21, 4, -19 }, // 0x4A 'J' + { 1473, 21, 20, 21, 2, -19 }, // 0x4B 'K' + { 1526, 18, 20, 21, 2, -19 }, // 0x4C 'L' + { 1571, 24, 20, 21, 1, -19 }, // 0x4D 'M' + { 1631, 22, 20, 21, 2, -19 }, // 0x4E 'N' + { 1686, 17, 20, 21, 4, -19 }, // 0x4F 'O' + { 1729, 18, 20, 21, 2, -19 }, // 0x50 'P' + { 1774, 17, 24, 21, 4, -19 }, // 0x51 'Q' + { 1825, 18, 20, 21, 2, -19 }, // 0x52 'R' + { 1870, 18, 20, 21, 3, -19 }, // 0x53 'S' + { 1915, 17, 20, 21, 5, -19 }, // 0x54 'T' + { 1958, 18, 20, 21, 5, -19 }, // 0x55 'U' + { 2003, 21, 20, 21, 4, -19 }, // 0x56 'V' + { 2056, 20, 20, 21, 4, -19 }, // 0x57 'W' + { 2106, 21, 20, 21, 2, -19 }, // 0x58 'X' + { 2159, 18, 20, 21, 5, -19 }, // 0x59 'Y' + { 2204, 17, 20, 21, 4, -19 }, // 0x5A 'Z' + { 2247, 11, 25, 21, 9, -20 }, // 0x5B '[' + { 2282, 8, 27, 21, 9, -22 }, // 0x5C '\' + { 2309, 11, 25, 21, 5, -20 }, // 0x5D ']' + { 2344, 13, 9, 21, 7, -20 }, // 0x5E '^' + { 2359, 21, 1, 21, -1, 4 }, // 0x5F '_' + { 2362, 5, 5, 21, 9, -21 }, // 0x60 '`' + { 2366, 16, 15, 21, 3, -14 }, // 0x61 'a' + { 2396, 19, 21, 21, 1, -20 }, // 0x62 'b' + { 2446, 17, 15, 21, 4, -14 }, // 0x63 'c' + { 2478, 18, 21, 21, 4, -20 }, // 0x64 'd' + { 2526, 16, 15, 21, 4, -14 }, // 0x65 'e' + { 2556, 19, 21, 21, 4, -20 }, // 0x66 'f' + { 2606, 19, 22, 21, 4, -14 }, // 0x67 'g' + { 2659, 18, 21, 21, 2, -20 }, // 0x68 'h' + { 2707, 15, 22, 21, 3, -21 }, // 0x69 'i' + { 2749, 15, 29, 21, 3, -21 }, // 0x6A 'j' + { 2804, 18, 21, 21, 2, -20 }, // 0x6B 'k' + { 2852, 15, 21, 21, 3, -20 }, // 0x6C 'l' + { 2892, 20, 15, 21, 1, -14 }, // 0x6D 'm' + { 2930, 17, 15, 21, 2, -14 }, // 0x6E 'n' + { 2962, 16, 15, 21, 4, -14 }, // 0x6F 'o' + { 2992, 20, 22, 21, 0, -14 }, // 0x70 'p' + { 3047, 19, 22, 21, 4, -14 }, // 0x71 'q' + { 3100, 19, 15, 21, 3, -14 }, // 0x72 'r' + { 3136, 15, 15, 21, 4, -14 }, // 0x73 's' + { 3165, 13, 20, 21, 5, -19 }, // 0x74 't' + { 3198, 15, 15, 21, 4, -14 }, // 0x75 'u' + { 3227, 19, 15, 21, 4, -14 }, // 0x76 'v' + { 3263, 17, 15, 21, 5, -14 }, // 0x77 'w' + { 3295, 19, 15, 21, 2, -14 }, // 0x78 'x' + { 3331, 21, 22, 21, 1, -14 }, // 0x79 'y' + { 3389, 16, 15, 21, 4, -14 }, // 0x7A 'z' + { 3419, 11, 25, 21, 8, -20 }, // 0x7B '{' + { 3454, 6, 24, 21, 9, -19 }, // 0x7C '|' + { 3472, 10, 25, 21, 6, -20 }, // 0x7D '}' + { 3504, 15, 5, 21, 5, -11 } }; // 0x7E '~' + +const GFXfont FreeMonoOblique18pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique18pt7bBitmaps, + (GFXglyph *)FreeMonoOblique18pt7bGlyphs, + 0x20, 0x7E, 35 }; + +// Approx. 4186 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique24pt7b.h new file mode 100644 index 0000000..8a5592c --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique24pt7b.h @@ -0,0 +1,643 @@ +const uint8_t FreeMonoOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, + 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x00, 0xC0, 0x70, 0x1C, 0x06, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0F, 0x83, 0xE0, 0xF8, + 0x1C, 0x00, 0x7E, 0x3F, 0x7E, 0x3F, 0x7C, 0x3E, 0x7C, 0x3E, 0x7C, 0x3E, + 0x78, 0x3C, 0xF8, 0x7C, 0xF0, 0x78, 0xF0, 0x78, 0xF0, 0x78, 0xE0, 0x70, + 0xE0, 0x70, 0xE0, 0x70, 0xC0, 0x60, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80, + 0x01, 0x86, 0x00, 0x04, 0x18, 0x00, 0x30, 0xC0, 0x00, 0xC3, 0x00, 0x03, + 0x0C, 0x00, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, + 0x07, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x03, 0x0C, 0x00, 0x18, 0x30, 0x00, + 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x30, 0xC0, 0x1F, 0xFF, + 0xF8, 0x7F, 0xFF, 0xE0, 0x18, 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, + 0x06, 0x18, 0x00, 0x30, 0x40, 0x00, 0xC3, 0x00, 0x03, 0x0C, 0x00, 0x18, + 0x30, 0x00, 0x61, 0x80, 0x01, 0x86, 0x00, 0x06, 0x18, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x00, 0x07, 0xFD, 0x80, + 0x70, 0x7C, 0x06, 0x00, 0xE0, 0x60, 0x02, 0x07, 0x00, 0x10, 0x30, 0x00, + 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, + 0x00, 0x00, 0xC2, 0x00, 0x06, 0x30, 0x00, 0x61, 0x80, 0x03, 0x1E, 0x00, + 0x30, 0xFC, 0x07, 0x06, 0x7F, 0xF0, 0x00, 0xFE, 0x00, 0x01, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0xC0, 0xC0, + 0x06, 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C, + 0x0E, 0x00, 0x38, 0x70, 0x00, 0x7F, 0x81, 0xC0, 0xF8, 0x3F, 0x00, 0x07, + 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, 0x78, 0x00, 0x01, + 0x00, 0x78, 0x00, 0x07, 0xF8, 0x00, 0x38, 0x60, 0x01, 0x80, 0xC0, 0x06, + 0x03, 0x00, 0x30, 0x0C, 0x00, 0xC0, 0x30, 0x03, 0x01, 0x80, 0x0C, 0x0E, + 0x00, 0x18, 0x70, 0x00, 0x7F, 0x80, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x0F, 0xF8, 0x03, 0x8E, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x01, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x03, + 0xE0, 0x01, 0xCC, 0x0E, 0x60, 0xC3, 0xD8, 0x18, 0x63, 0x03, 0x18, 0xC0, + 0x33, 0x18, 0x06, 0xC3, 0x00, 0x70, 0x60, 0x0E, 0x0C, 0x01, 0xC0, 0xC0, + 0x78, 0x1C, 0x3B, 0xE1, 0xFE, 0x3C, 0x1F, 0x00, 0x00, 0x7E, 0xFD, 0xF3, + 0xE7, 0xCF, 0x3E, 0x78, 0xF1, 0xE3, 0x87, 0x0E, 0x18, 0x00, 0x00, 0x60, + 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x80, + 0x60, 0x1C, 0x03, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0xF0, 0x1C, 0x03, 0x80, + 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, 0x02, 0x00, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00, + 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x38, 0x0E, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x20, 0x00, 0x18, + 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x30, 0x0E, 0x0C, 0x0B, + 0xF3, 0x3E, 0x3F, 0xFE, 0x01, 0xFC, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x0E, + 0x60, 0x07, 0x18, 0x01, 0x83, 0x00, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x30, 0x00, 0x01, + 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, + 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, + 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xE0, + 0x3C, 0x07, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x3C, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, + 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xF8, 0x01, + 0xC1, 0xC0, 0x38, 0x0E, 0x07, 0x00, 0x60, 0xE0, 0x03, 0x0C, 0x00, 0x31, + 0x80, 0x03, 0x18, 0x00, 0x33, 0x00, 0x03, 0x30, 0x00, 0x33, 0x00, 0x03, + 0x20, 0x00, 0x26, 0x00, 0x06, 0x60, 0x00, 0x66, 0x00, 0x06, 0x40, 0x00, + 0x4C, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x0C, 0xC0, 0x01, 0x8C, 0x00, + 0x18, 0xC0, 0x01, 0x8C, 0x00, 0x30, 0xC0, 0x07, 0x06, 0x00, 0xE0, 0x60, + 0x1C, 0x03, 0x87, 0x80, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00, 0x0E, 0x00, + 0x0F, 0x00, 0x0F, 0x80, 0x0E, 0xC0, 0x1C, 0xC0, 0x1C, 0x60, 0x1C, 0x30, + 0x08, 0x18, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x07, 0xE0, 0x00, 0x3F, 0xE0, 0x01, 0xE0, 0xE0, 0x07, 0x00, 0xE0, 0x1C, + 0x00, 0xE0, 0x30, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x00, 0x03, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, + 0x00, 0xC3, 0x80, 0x01, 0x87, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x00, + 0x0F, 0xC0, 0x01, 0xFF, 0xC0, 0x1E, 0x07, 0x80, 0xE0, 0x06, 0x03, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, + 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, + 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE3, 0x00, 0x07, 0x0E, 0x00, + 0x38, 0x1E, 0x03, 0xC0, 0x3F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x1B, 0x00, 0x06, 0x60, 0x01, 0x8C, 0x00, 0x63, + 0x00, 0x18, 0x60, 0x07, 0x0C, 0x00, 0xC1, 0x80, 0x30, 0x30, 0x0C, 0x0C, + 0x03, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x06, 0x00, 0xC1, 0x80, 0x30, + 0x60, 0x06, 0x18, 0x00, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xC0, 0x00, 0xC0, + 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x03, 0x00, + 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x40, + 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0xBF, 0xC0, 0x0F, 0xFF, + 0x80, 0xF8, 0x1E, 0x02, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, + 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0xC0, 0x01, 0x87, 0x00, + 0x38, 0x1E, 0x07, 0x80, 0x7F, 0xF8, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, + 0xF0, 0x00, 0xFF, 0xC0, 0x1F, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, + 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, + 0x0E, 0x00, 0x00, 0x60, 0x00, 0x07, 0x0F, 0x80, 0x31, 0xFF, 0x01, 0x9C, + 0x3C, 0x0D, 0x80, 0x60, 0xD8, 0x03, 0x87, 0x80, 0x0C, 0x38, 0x00, 0x61, + 0xC0, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x00, 0xC3, 0x00, 0x0C, 0x18, 0x00, + 0x60, 0xE0, 0x06, 0x03, 0x00, 0x30, 0x1C, 0x07, 0x00, 0x70, 0x70, 0x01, + 0xFF, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0xFF, 0xDF, 0xFF, 0xFC, 0x00, 0x0F, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x00, 0x3F, 0x00, 0x0F, + 0xFC, 0x01, 0xC1, 0xE0, 0x70, 0x06, 0x06, 0x00, 0x30, 0xC0, 0x03, 0x1C, + 0x00, 0x31, 0x80, 0x03, 0x18, 0x00, 0x31, 0x80, 0x06, 0x18, 0x00, 0xE0, + 0xC0, 0x1C, 0x0F, 0x07, 0x80, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0xE0, 0x70, + 0x18, 0x03, 0x83, 0x00, 0x1C, 0x60, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00, + 0xCC, 0x00, 0x0C, 0xC0, 0x00, 0xCC, 0x00, 0x18, 0xC0, 0x03, 0x8E, 0x00, + 0x70, 0x60, 0x0E, 0x07, 0x83, 0xC0, 0x3F, 0xF0, 0x00, 0xFC, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x0F, 0x07, 0x00, 0x70, 0x0E, 0x03, 0x80, + 0x18, 0x0C, 0x00, 0x70, 0x60, 0x00, 0xC1, 0x80, 0x03, 0x0C, 0x00, 0x0C, + 0x30, 0x00, 0x30, 0xC0, 0x01, 0xC3, 0x00, 0x0F, 0x0C, 0x00, 0x6C, 0x38, + 0x03, 0xF0, 0x60, 0x1D, 0x81, 0xE1, 0xE6, 0x03, 0xFE, 0x18, 0x03, 0xE0, + 0xC0, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03, + 0xC0, 0x00, 0x7C, 0x00, 0xFF, 0xC0, 0x01, 0xF8, 0x00, 0x00, 0x07, 0x83, + 0xF1, 0xFC, 0x7F, 0x1F, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7E, 0x3F, 0x8F, 0xE3, 0xF0, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3E, + 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x70, 0x01, + 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0xFF, 0xFF, 0x9F, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, + 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x3F, 0xFC, 0x78, + 0x1E, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x06, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x07, 0xC0, 0x07, + 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x07, 0x07, 0x01, 0xC0, + 0x70, 0x60, 0x06, 0x1C, 0x00, 0xC3, 0x00, 0x18, 0xC0, 0x03, 0x18, 0x00, + 0x66, 0x00, 0xFC, 0xC0, 0x7F, 0x98, 0x1C, 0x66, 0x06, 0x0C, 0xC1, 0x81, + 0x98, 0x30, 0x33, 0x0C, 0x0E, 0x61, 0x81, 0x98, 0x30, 0x33, 0x06, 0x06, + 0x60, 0xF0, 0xCC, 0x0F, 0xF9, 0x80, 0x7F, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x03, 0x80, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x18, 0x0F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x0F, + 0xFE, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x31, 0x80, + 0x00, 0x06, 0x30, 0x00, 0x01, 0x86, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x0C, + 0x1C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x40, 0x30, 0x00, 0x18, 0x06, 0x00, + 0x06, 0x00, 0xC0, 0x00, 0xC0, 0x18, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFF, + 0xF0, 0x01, 0xFF, 0xFE, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x03, + 0x00, 0x03, 0x00, 0x40, 0x00, 0x30, 0x18, 0x00, 0x06, 0x06, 0x00, 0x00, + 0xC0, 0xC0, 0x00, 0x18, 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x0F, 0xFC, 0x03, + 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x06, 0x00, 0x38, 0x01, 0x80, 0x07, + 0x00, 0xC0, 0x00, 0xC0, 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, + 0x03, 0x00, 0xC0, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x18, 0x01, 0xE0, 0x07, + 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0xE0, 0x03, 0x80, 0x30, 0x00, 0x70, + 0x0C, 0x00, 0x0E, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x60, 0x60, 0x00, + 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01, 0x80, 0x01, 0xC0, 0x60, + 0x00, 0xE0, 0x30, 0x00, 0x70, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C, 0x0F, 0x60, 0x78, 0x01, + 0xF0, 0x70, 0x00, 0x70, 0x70, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x30, 0x00, + 0x06, 0x38, 0x00, 0x02, 0x18, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, + 0x60, 0x00, 0x60, 0x38, 0x00, 0xE0, 0x0F, 0x01, 0xE0, 0x03, 0xFF, 0xC0, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0C, + 0x00, 0xF0, 0x03, 0x00, 0x1C, 0x01, 0xC0, 0x03, 0x80, 0x60, 0x00, 0x60, + 0x18, 0x00, 0x1C, 0x06, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00, + 0x30, 0x30, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC0, 0xC0, + 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, 0x06, 0x00, 0x03, 0x01, + 0x80, 0x00, 0xC0, 0xE0, 0x00, 0x70, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x0C, + 0x03, 0x00, 0x06, 0x00, 0xC0, 0x07, 0x00, 0x60, 0x07, 0x80, 0xFF, 0xFF, + 0xC0, 0x3F, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, + 0x01, 0x80, 0x01, 0x80, 0x30, 0x00, 0x60, 0x0C, 0x00, 0x0C, 0x01, 0x80, + 0x01, 0x80, 0x30, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, + 0x30, 0x18, 0x00, 0x06, 0x03, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x1F, 0xF8, + 0x00, 0x07, 0x03, 0x00, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x03, 0x00, 0x01, + 0x80, 0x60, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x01, 0x80, 0x01, 0x80, 0x60, + 0x00, 0x30, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, + 0xF0, 0x7F, 0xFF, 0xFF, 0x00, 0x60, 0x00, 0x30, 0x06, 0x00, 0x06, 0x00, + 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x06, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00, + 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x0C, 0x00, 0x01, 0x80, 0xC0, 0x00, + 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x38, 0x18, 0x00, 0x03, 0x01, + 0x80, 0x00, 0x30, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0xFC, 0xC0, 0x3C, + 0x0F, 0xE0, 0x78, 0x01, 0xF0, 0x70, 0x00, 0x30, 0x70, 0x00, 0x18, 0x70, + 0x00, 0x0C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x01, 0x80, 0x1F, 0xFE, 0xC0, 0x0F, 0xFF, 0x60, 0x00, 0x06, + 0x30, 0x00, 0x06, 0x18, 0x00, 0x03, 0x0C, 0x00, 0x01, 0x87, 0x00, 0x00, + 0xC1, 0x80, 0x00, 0xE0, 0xE0, 0x00, 0x60, 0x38, 0x00, 0x70, 0x0F, 0x00, + 0xF8, 0x03, 0xFF, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xFC, 0x1F, 0xE0, + 0x7F, 0x83, 0xFC, 0x03, 0x00, 0x06, 0x00, 0x60, 0x01, 0x80, 0x1C, 0x00, + 0x30, 0x03, 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x38, 0x01, + 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x18, 0x01, 0xFF, 0xFF, + 0x00, 0x3F, 0xFF, 0xC0, 0x06, 0x00, 0x18, 0x01, 0x80, 0x03, 0x00, 0x30, + 0x00, 0x60, 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x03, 0x00, 0x38, 0x00, 0x60, + 0x06, 0x00, 0x0C, 0x00, 0xC0, 0x01, 0x80, 0x18, 0x00, 0x70, 0x03, 0x00, + 0x0C, 0x00, 0xE0, 0x01, 0x80, 0xFF, 0x83, 0xFE, 0x1F, 0xF0, 0x7F, 0xC0, + 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x70, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, + 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, + 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, + 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0xFF, 0xFF, 0x83, 0xFF, 0xFE, 0x00, + 0x00, 0x0F, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x07, + 0x00, 0x20, 0x00, 0x60, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x06, + 0x00, 0x06, 0x00, 0x60, 0x00, 0xC0, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00, + 0xC0, 0x0C, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00, 0x07, 0x00, 0x70, 0x00, + 0x3C, 0x1C, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, + 0xFF, 0x07, 0xF8, 0x3F, 0xF8, 0x3F, 0xC0, 0x18, 0x00, 0x70, 0x00, 0xC0, + 0x07, 0x00, 0x0C, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x00, 0x03, 0x00, 0xE0, + 0x00, 0x18, 0x0C, 0x00, 0x00, 0xC1, 0xC0, 0x00, 0x0C, 0x1C, 0x00, 0x00, + 0x61, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x1B, 0x78, 0x00, 0x01, 0xF0, + 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0x70, + 0x00, 0x18, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x60, 0x00, + 0x60, 0x01, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, + 0x03, 0x00, 0xFF, 0xE0, 0x1F, 0x87, 0xFF, 0x00, 0x7C, 0x00, 0x07, 0xFF, + 0xE0, 0x03, 0xFF, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0xC0, 0x03, 0x00, 0x60, 0x01, 0x80, 0x60, 0x00, 0xC0, 0x30, 0x00, + 0x60, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0E, 0x00, 0x18, 0x06, 0x00, + 0x0C, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x07, 0xF0, 0x00, 0x7F, 0x01, 0xB0, 0x00, 0xD8, 0x01, 0xB0, 0x00, 0xD8, + 0x01, 0x98, 0x01, 0x98, 0x01, 0x98, 0x03, 0x30, 0x01, 0x98, 0x03, 0x30, + 0x03, 0x18, 0x06, 0x30, 0x03, 0x1C, 0x0C, 0x30, 0x03, 0x0C, 0x0C, 0x30, + 0x03, 0x0C, 0x18, 0x60, 0x07, 0x0C, 0x30, 0x60, 0x06, 0x0C, 0x30, 0x60, + 0x06, 0x06, 0x60, 0x60, 0x06, 0x06, 0xC0, 0x60, 0x06, 0x06, 0xC0, 0xC0, + 0x0C, 0x07, 0x80, 0xC0, 0x0C, 0x03, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0xC0, + 0x0C, 0x00, 0x01, 0xC0, 0x0C, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80, + 0x18, 0x00, 0x01, 0x80, 0x18, 0x00, 0x01, 0x80, 0xFF, 0x80, 0x3F, 0xE0, + 0xFF, 0x80, 0x3F, 0xE0, 0x07, 0xE0, 0x0F, 0xFC, 0x3F, 0x80, 0x3F, 0xF0, + 0x0F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x10, 0x01, 0x98, 0x00, 0xC0, 0x06, + 0x60, 0x03, 0x00, 0x19, 0xC0, 0x0C, 0x00, 0x63, 0x00, 0x30, 0x01, 0x0C, + 0x01, 0x80, 0x0C, 0x18, 0x06, 0x00, 0x30, 0x60, 0x18, 0x00, 0xC1, 0xC0, + 0x60, 0x03, 0x03, 0x01, 0x00, 0x08, 0x0C, 0x0C, 0x00, 0x60, 0x18, 0x30, + 0x01, 0x80, 0x60, 0xC0, 0x06, 0x01, 0xC3, 0x00, 0x18, 0x03, 0x18, 0x00, + 0xC0, 0x0C, 0x60, 0x03, 0x00, 0x19, 0x80, 0x0C, 0x00, 0x66, 0x00, 0x30, + 0x01, 0xD8, 0x00, 0x80, 0x03, 0xC0, 0x06, 0x00, 0x0F, 0x00, 0xFF, 0xC0, + 0x1C, 0x03, 0xFE, 0x00, 0x70, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xF0, + 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00, 0x06, + 0x0C, 0x00, 0x06, 0x18, 0x00, 0x07, 0x38, 0x00, 0x03, 0x30, 0x00, 0x03, + 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, + 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00, 0x30, + 0x60, 0x00, 0x70, 0x70, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x1E, 0x0F, 0x00, + 0x0F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0xC0, 0x30, + 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x01, 0xC0, + 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x18, 0x01, 0x80, 0x3C, + 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x7F, + 0xF0, 0x00, 0xF0, 0x78, 0x03, 0x80, 0x1C, 0x07, 0x00, 0x0E, 0x0E, 0x00, + 0x06, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x38, 0x00, 0x03, 0x30, 0x00, + 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0xC0, 0x00, + 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, + 0x06, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x1C, 0xC0, 0x00, 0x18, 0x60, 0x00, + 0x30, 0x60, 0x00, 0x70, 0x30, 0x00, 0xE0, 0x38, 0x01, 0xC0, 0x0E, 0x0F, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0xF8, + 0x30, 0x3F, 0xFF, 0xF0, 0x78, 0x0F, 0x80, 0x07, 0xFF, 0xFC, 0x01, 0xFF, + 0xFF, 0xC0, 0x06, 0x00, 0x78, 0x01, 0x80, 0x0E, 0x00, 0xC0, 0x01, 0xC0, + 0x30, 0x00, 0x30, 0x0C, 0x00, 0x0C, 0x03, 0x00, 0x03, 0x00, 0xC0, 0x00, + 0xC0, 0x60, 0x00, 0x60, 0x18, 0x00, 0x30, 0x06, 0x00, 0x38, 0x01, 0x80, + 0x3C, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x0C, 0x07, 0x80, 0x03, + 0x00, 0x70, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x01, 0x80, 0x18, 0x00, 0x70, + 0x06, 0x00, 0x0C, 0x01, 0x80, 0x03, 0x80, 0x60, 0x00, 0x60, 0x30, 0x00, + 0x1C, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x00, 0xF0, 0x00, 0x1F, 0xC0, 0x00, + 0x7F, 0xF3, 0x00, 0xE0, 0x3B, 0x03, 0x80, 0x0F, 0x07, 0x00, 0x0E, 0x06, + 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x18, 0x20, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, + 0x00, 0x30, 0x60, 0x00, 0x70, 0xF0, 0x00, 0xE0, 0xF8, 0x01, 0xC0, 0xDC, + 0x07, 0x80, 0x8F, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0xFF, 0xFE, 0x3F, + 0xFF, 0xFE, 0x30, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60, 0x18, 0x06, 0x60, + 0x38, 0x0C, 0x60, 0x30, 0x04, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0xFF, 0xFE, 0x00, 0xFF, + 0xFC, 0x00, 0x7F, 0xC0, 0xFF, 0xDF, 0xF0, 0x3F, 0xF1, 0x80, 0x00, 0x60, + 0x60, 0x00, 0x30, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x03, 0x03, 0x80, 0x00, + 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x06, 0x03, 0x00, + 0x01, 0x81, 0xC0, 0x00, 0x60, 0x60, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x06, + 0x00, 0x03, 0x01, 0x80, 0x00, 0xC0, 0xC0, 0x00, 0x30, 0x30, 0x00, 0x1C, + 0x0C, 0x00, 0x06, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0xC0, 0x30, 0x00, + 0x70, 0x0E, 0x00, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0x38, 0x1E, 0x00, 0x07, + 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x07, + 0xFC, 0xE0, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x60, 0x30, + 0x00, 0x18, 0x06, 0x00, 0x02, 0x00, 0xC0, 0x00, 0xC0, 0x0C, 0x00, 0x30, + 0x01, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x60, 0x00, 0xC0, + 0x0C, 0x00, 0x18, 0x03, 0x00, 0x01, 0x80, 0xC0, 0x00, 0x30, 0x18, 0x00, + 0x06, 0x06, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x18, 0x30, 0x00, 0x03, 0x8C, + 0x00, 0x00, 0x31, 0x80, 0x00, 0x06, 0x60, 0x00, 0x00, 0xD8, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x00, 0xFF, 0xC0, + 0x7F, 0xFF, 0xF8, 0x0F, 0xF8, 0xC0, 0x00, 0x0C, 0x18, 0x00, 0x01, 0x83, + 0x00, 0x00, 0x30, 0x60, 0x08, 0x0C, 0x0C, 0x07, 0x01, 0x81, 0x81, 0xE0, + 0x30, 0x60, 0x2C, 0x0C, 0x0C, 0x0D, 0x81, 0x81, 0x81, 0x30, 0x30, 0x30, + 0x66, 0x0C, 0x06, 0x08, 0xC1, 0x80, 0xC3, 0x0C, 0x30, 0x18, 0x41, 0x8C, + 0x03, 0x18, 0x31, 0x80, 0x62, 0x06, 0x30, 0x0C, 0xC0, 0xCC, 0x03, 0x10, + 0x19, 0x80, 0x66, 0x03, 0x30, 0x0C, 0x80, 0x6C, 0x01, 0xB0, 0x0D, 0x80, + 0x34, 0x01, 0xB0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, + 0xF0, 0x00, 0x03, 0xF8, 0x03, 0xF8, 0x1F, 0xC0, 0x3F, 0xC0, 0x30, 0x00, + 0x30, 0x01, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x30, 0x00, 0x18, 0x03, 0x00, + 0x00, 0xE0, 0x30, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x03, 0xB0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x36, 0x00, 0x00, 0x03, 0x38, 0x00, + 0x00, 0x30, 0xC0, 0x00, 0x03, 0x07, 0x00, 0x00, 0x30, 0x18, 0x00, 0x03, + 0x00, 0x60, 0x00, 0x30, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0x70, 0x03, 0x00, 0x01, 0x80, 0xFF, 0x80, 0xFF, 0x07, 0xFC, 0x07, 0xF8, + 0x00, 0x7F, 0x80, 0x7F, 0x7F, 0x00, 0x7F, 0x1C, 0x00, 0x18, 0x0C, 0x00, + 0x30, 0x0C, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x06, 0x00, 0xC0, 0x03, 0x01, + 0x80, 0x03, 0x03, 0x00, 0x01, 0x86, 0x00, 0x01, 0x8C, 0x00, 0x00, 0xD8, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, + 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, + 0x00, 0xFF, 0xFE, 0x00, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x07, 0xFF, + 0xF8, 0x0C, 0x00, 0x30, 0x10, 0x00, 0xC0, 0x60, 0x03, 0x80, 0xC0, 0x0E, + 0x01, 0x80, 0x38, 0x03, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x60, 0x18, + 0x00, 0xC0, 0x60, 0x01, 0x81, 0x80, 0x02, 0x06, 0x00, 0x0C, 0x18, 0x00, + 0x18, 0x60, 0x00, 0x30, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x80, 0x01, 0xFE, + 0x03, 0xFC, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, + 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01, + 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xFF, 0x01, + 0xFE, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x80, 0x60, 0x18, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03, + 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x04, 0x01, 0xFE, + 0x03, 0xFC, 0x00, 0x10, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x06, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0xFF, 0x01, + 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x07, 0x80, 0x03, 0x60, 0x01, + 0x8C, 0x00, 0xC3, 0x80, 0xE0, 0x60, 0x70, 0x1C, 0x38, 0x03, 0x1C, 0x00, + 0x6E, 0x00, 0x1F, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC3, 0x86, 0x0C, 0x18, 0x70, 0xC0, 0x00, 0x3F, 0x80, 0x0F, 0xFF, 0x80, + 0x78, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, + 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x38, 0x03, 0xFC, 0xC0, 0x7F, 0xFF, + 0x07, 0xC0, 0x0C, 0x38, 0x00, 0x31, 0xC0, 0x01, 0xCE, 0x00, 0x06, 0x30, + 0x00, 0x18, 0xC0, 0x00, 0xE3, 0x00, 0x07, 0x8E, 0x00, 0x7C, 0x1C, 0x0F, + 0x3F, 0x3F, 0xF0, 0xFC, 0x7F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x06, 0x07, 0xE0, 0x00, 0xC3, + 0xFF, 0x00, 0x19, 0xC0, 0xF0, 0x03, 0x60, 0x07, 0x00, 0xD8, 0x00, 0x60, + 0x1E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0xC0, 0x60, 0x00, 0x18, 0x0C, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x60, 0x60, 0x00, 0x0C, 0x0C, 0x00, 0x01, 0x81, + 0x80, 0x00, 0x60, 0x70, 0x00, 0x0C, 0x0E, 0x00, 0x03, 0x01, 0xC0, 0x00, + 0x60, 0x3C, 0x00, 0x18, 0x05, 0x80, 0x06, 0x01, 0xB8, 0x01, 0x83, 0xF3, + 0xC1, 0xE0, 0x7E, 0x3F, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x00, + 0x07, 0xFF, 0x30, 0x38, 0x0F, 0xC1, 0x80, 0x1F, 0x0C, 0x00, 0x18, 0x60, + 0x00, 0x63, 0x00, 0x01, 0x9C, 0x00, 0x06, 0x60, 0x00, 0x01, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0xC7, 0x00, + 0x0E, 0x0F, 0x01, 0xF0, 0x1F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0xFC, 0x0C, 0x01, + 0xFF, 0x86, 0x01, 0xC0, 0xE3, 0x03, 0x80, 0x1B, 0x03, 0x80, 0x05, 0x81, + 0x80, 0x03, 0xC1, 0x80, 0x00, 0xE1, 0x80, 0x00, 0x60, 0xC0, 0x00, 0x30, + 0x60, 0x00, 0x18, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x06, 0x18, 0x00, 0x02, + 0x0C, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0xC1, 0xC0, 0x01, + 0xE0, 0x60, 0x01, 0xE0, 0x38, 0x01, 0xB0, 0x0F, 0x03, 0x9F, 0x03, 0xFF, + 0x0F, 0x80, 0x7E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x80, 0x78, + 0x0F, 0x03, 0x80, 0x0E, 0x1C, 0x00, 0x18, 0xE0, 0x00, 0x73, 0x00, 0x00, + 0xD8, 0x00, 0x03, 0x60, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x03, 0x07, 0x80, 0xF8, + 0x0F, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, + 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xFF, 0xFC, 0x03, + 0xFF, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xC0, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFE, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x87, 0xC1, 0xE0, 0xF3, 0xE1, 0xC0, + 0x1B, 0x01, 0xC0, 0x07, 0x81, 0xC0, 0x03, 0xC0, 0xC0, 0x00, 0xE0, 0xC0, + 0x00, 0x60, 0x60, 0x00, 0x30, 0x60, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x18, + 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x03, 0x03, 0x00, 0x03, 0x81, + 0xC0, 0x01, 0xC0, 0x60, 0x01, 0xC0, 0x38, 0x03, 0x60, 0x0F, 0x07, 0x30, + 0x03, 0xFF, 0x18, 0x00, 0x7E, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x80, 0x03, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x83, 0xF0, 0x01, + 0x8F, 0xF8, 0x01, 0x98, 0x1C, 0x03, 0xB0, 0x0E, 0x03, 0x40, 0x06, 0x03, + 0x80, 0x06, 0x03, 0x00, 0x06, 0x03, 0x00, 0x06, 0x07, 0x00, 0x06, 0x06, + 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0C, 0x0C, + 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x1C, 0x0C, 0x00, 0x18, 0x0C, + 0x00, 0x18, 0x18, 0x00, 0x18, 0xFF, 0x01, 0xFF, 0xFF, 0x01, 0xFF, 0x00, + 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xF0, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, + 0xC0, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, + 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, + 0x00, 0x01, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x70, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x03, 0xFF, 0xF0, + 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, + 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x00, + 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, + 0x18, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, + 0x03, 0x80, 0xFF, 0xF0, 0x0F, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, + 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xC1, + 0xFF, 0x00, 0x80, 0x70, 0x01, 0x80, 0xC0, 0x01, 0x83, 0x80, 0x01, 0x87, + 0x00, 0x01, 0x8C, 0x00, 0x03, 0x38, 0x00, 0x03, 0x70, 0x00, 0x03, 0xF8, + 0x00, 0x03, 0x9C, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x0E, 0x00, 0x06, 0x07, + 0x00, 0x06, 0x03, 0x80, 0x06, 0x01, 0x80, 0x04, 0x00, 0xC0, 0x0C, 0x00, + 0xE0, 0xFC, 0x03, 0xFE, 0xFC, 0x03, 0xFC, 0x01, 0xFF, 0x00, 0x3F, 0xE0, + 0x00, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x00, 0x01, 0x80, + 0x00, 0x70, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, + 0x01, 0x80, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x18, 0x00, 0x03, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x1E, 0x07, 0x81, 0xE7, 0xE1, 0xF8, 0x3D, 0x8E, 0xE3, + 0x81, 0xE0, 0xF8, 0x30, 0x38, 0x1E, 0x06, 0x06, 0x03, 0x80, 0xC1, 0x80, + 0x60, 0x18, 0x30, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x08, + 0x18, 0x0C, 0x03, 0x06, 0x01, 0x80, 0x60, 0xC0, 0x30, 0x0C, 0x18, 0x06, + 0x01, 0x83, 0x00, 0x80, 0x60, 0x40, 0x30, 0x0C, 0x18, 0x06, 0x01, 0x83, + 0x00, 0xC0, 0x30, 0x60, 0x18, 0x06, 0x7F, 0x03, 0xC1, 0xFF, 0xE0, 0xF8, + 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x1F, 0xF0, 0x3E, 0x60, 0x70, 0x0F, 0x80, + 0x70, 0x3C, 0x00, 0x60, 0x70, 0x00, 0xC0, 0xC0, 0x01, 0x81, 0x80, 0x03, + 0x07, 0x00, 0x06, 0x0C, 0x00, 0x1C, 0x18, 0x00, 0x30, 0x30, 0x00, 0x60, + 0x60, 0x00, 0xC1, 0xC0, 0x01, 0x83, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x0C, + 0x00, 0x18, 0x18, 0x00, 0x30, 0x70, 0x00, 0x67, 0xFC, 0x07, 0xFF, 0xF0, + 0x0F, 0xE0, 0x00, 0x3F, 0x00, 0x07, 0xFF, 0x00, 0x3C, 0x0F, 0x01, 0xC0, + 0x1C, 0x0C, 0x00, 0x38, 0x60, 0x00, 0x63, 0x00, 0x00, 0xDC, 0x00, 0x03, + 0x60, 0x00, 0x0D, 0x80, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, + 0x00, 0x1B, 0x00, 0x00, 0x6C, 0x00, 0x03, 0xB0, 0x00, 0x0C, 0x60, 0x00, + 0x61, 0xC0, 0x03, 0x03, 0x80, 0x38, 0x0F, 0x03, 0xC0, 0x0F, 0xFE, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x8F, 0xFE, 0x00, 0xFC, + 0xE0, 0x78, 0x00, 0xCC, 0x00, 0xE0, 0x06, 0xC0, 0x03, 0x00, 0x3C, 0x00, + 0x1C, 0x01, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18, + 0x06, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x06, 0x01, 0x80, 0x00, 0x30, 0x0C, + 0x00, 0x03, 0x00, 0xE0, 0x00, 0x18, 0x07, 0x00, 0x01, 0x80, 0x3C, 0x00, + 0x1C, 0x01, 0xE0, 0x01, 0xC0, 0x0D, 0x80, 0x1C, 0x00, 0xCF, 0x03, 0xC0, + 0x06, 0x3F, 0xF8, 0x00, 0x30, 0x7F, 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, + 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0xE1, 0xF0, 0x78, + 0x1C, 0xFC, 0x38, 0x01, 0xB0, 0x1C, 0x00, 0x2C, 0x0E, 0x00, 0x0F, 0x03, + 0x00, 0x01, 0xC1, 0x80, 0x00, 0x60, 0x60, 0x00, 0x18, 0x30, 0x00, 0x06, + 0x0C, 0x00, 0x01, 0x83, 0x00, 0x00, 0x60, 0xC0, 0x00, 0x30, 0x30, 0x00, + 0x0C, 0x0C, 0x00, 0x07, 0x03, 0x80, 0x03, 0xC0, 0x60, 0x01, 0xB0, 0x1C, + 0x00, 0xD8, 0x03, 0xC0, 0xE6, 0x00, 0x7F, 0xF1, 0x80, 0x07, 0xE0, 0x60, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xC0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x7F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x3E, 0x03, 0xF8, 0x7F, + 0xC0, 0x18, 0xF0, 0x60, 0x0C, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xC0, + 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x0F, 0xFE, 0xC0, 0xF0, 0x3E, 0x0E, 0x00, 0x70, 0xE0, 0x01, 0x06, 0x00, + 0x08, 0x30, 0x00, 0x41, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3F, 0xF0, 0x00, + 0x3F, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x18, 0x00, 0x00, + 0xCC, 0x00, 0x06, 0x60, 0x00, 0x33, 0x00, 0x03, 0x3C, 0x00, 0x71, 0xF8, + 0x0F, 0x0D, 0xFF, 0xF0, 0x01, 0xFC, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, + 0x00, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0E, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x38, 0x0F, + 0x9F, 0xFF, 0x03, 0xF8, 0x00, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xC6, 0x00, + 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01, 0x86, + 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x18, 0x60, 0x01, + 0x86, 0x00, 0x0C, 0x30, 0x00, 0x61, 0x80, 0x03, 0x0C, 0x00, 0x38, 0x60, + 0x07, 0x83, 0x80, 0x6C, 0x1E, 0x1E, 0x7C, 0x7F, 0xE3, 0xE0, 0xF8, 0x00, + 0x00, 0x7F, 0xC0, 0xFF, 0xFF, 0xF0, 0x3F, 0xF1, 0xC0, 0x00, 0xC0, 0x30, + 0x00, 0x60, 0x0C, 0x00, 0x18, 0x03, 0x00, 0x0C, 0x00, 0xE0, 0x06, 0x00, + 0x18, 0x01, 0x80, 0x06, 0x00, 0xC0, 0x01, 0x80, 0x30, 0x00, 0x60, 0x18, + 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x03, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x30, + 0xC0, 0x00, 0x06, 0x30, 0x00, 0x01, 0x98, 0x00, 0x00, 0x6C, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x07, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x3F, + 0xCC, 0x00, 0x03, 0x06, 0x00, 0x01, 0x83, 0x00, 0x01, 0x81, 0x81, 0x80, + 0xC0, 0xC1, 0xE0, 0x60, 0x60, 0xF0, 0x60, 0x30, 0xD8, 0x30, 0x18, 0x6C, + 0x30, 0x0C, 0x66, 0x18, 0x06, 0x33, 0x18, 0x03, 0x31, 0x8C, 0x01, 0x98, + 0x66, 0x00, 0xD8, 0x36, 0x00, 0x6C, 0x1B, 0x00, 0x3C, 0x0F, 0x00, 0x1E, + 0x07, 0x80, 0x0E, 0x03, 0x80, 0x07, 0x01, 0xC0, 0x00, 0x07, 0xF0, 0x3F, + 0xC3, 0xFC, 0x0F, 0xF0, 0x38, 0x00, 0x60, 0x07, 0x00, 0x70, 0x00, 0xE0, + 0x38, 0x00, 0x18, 0x1C, 0x00, 0x03, 0x0C, 0x00, 0x00, 0xEE, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xDC, 0x00, + 0x00, 0xE3, 0x80, 0x00, 0x70, 0x70, 0x00, 0x38, 0x0E, 0x00, 0x18, 0x01, + 0x80, 0x1C, 0x00, 0x30, 0x0E, 0x00, 0x0E, 0x0F, 0xF0, 0x3F, 0xE3, 0xFC, + 0x0F, 0xF8, 0x03, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, 0x3F, 0xC0, 0x60, 0x00, + 0x30, 0x01, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, + 0x03, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0xC0, 0x00, 0x60, 0x0C, 0x00, 0x03, + 0x00, 0x60, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x60, 0x60, 0x00, 0x03, 0x06, + 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x63, 0x00, 0x00, 0x03, 0x30, 0x00, + 0x00, 0x19, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x60, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x30, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, + 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xC3, 0x00, 0x0C, 0x18, 0x00, 0xC0, 0xC0, + 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, + 0x00, 0x18, 0x00, 0x01, 0x80, 0x0C, 0x18, 0x00, 0x61, 0x80, 0x02, 0x1F, + 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x00, 0x0E, 0x00, 0x7C, 0x01, 0xC0, 0x03, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x00, + 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x01, 0xC0, 0x0F, 0x00, 0xF8, + 0x01, 0xF0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x80, + 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x03, + 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x01, 0x80, 0xC0, + 0x60, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x40, + 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, + 0x30, 0x18, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x80, 0xC0, 0x60, 0x30, + 0x00, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, + 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x0C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x7C, 0x03, + 0xC0, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x0E, + 0x00, 0xF8, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x01, 0xFC, 0x03, 0x70, 0xE0, + 0x7E, 0x07, 0x1E, 0xC0, 0x3F, 0x80, 0x01, 0xE0 }; + +const GFXglyph FreeMonoOblique24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 28, 0, 1 }, // 0x20 ' ' + { 0, 10, 30, 28, 12, -28 }, // 0x21 '!' + { 38, 16, 14, 28, 10, -28 }, // 0x22 '"' + { 66, 22, 32, 28, 6, -29 }, // 0x23 '#' + { 154, 21, 33, 28, 6, -29 }, // 0x24 '$' + { 241, 22, 29, 28, 6, -27 }, // 0x25 '%' + { 321, 19, 25, 28, 6, -23 }, // 0x26 '&' + { 381, 7, 14, 28, 16, -28 }, // 0x27 ''' + { 394, 11, 34, 28, 16, -27 }, // 0x28 '(' + { 441, 11, 34, 28, 7, -27 }, // 0x29 ')' + { 488, 18, 17, 28, 10, -28 }, // 0x2A '*' + { 527, 22, 22, 28, 6, -23 }, // 0x2B '+' + { 588, 12, 14, 28, 5, -6 }, // 0x2C ',' + { 609, 22, 2, 28, 6, -13 }, // 0x2D '-' + { 615, 7, 6, 28, 11, -4 }, // 0x2E '.' + { 621, 24, 35, 28, 5, -30 }, // 0x2F '/' + { 726, 20, 30, 28, 7, -28 }, // 0x30 '0' + { 801, 17, 29, 28, 6, -28 }, // 0x31 '1' + { 863, 23, 29, 28, 4, -28 }, // 0x32 '2' + { 947, 22, 30, 28, 5, -28 }, // 0x33 '3' + { 1030, 19, 28, 28, 7, -27 }, // 0x34 '4' + { 1097, 21, 29, 28, 6, -27 }, // 0x35 '5' + { 1174, 21, 30, 28, 9, -28 }, // 0x36 '6' + { 1253, 18, 28, 28, 10, -27 }, // 0x37 '7' + { 1316, 20, 30, 28, 7, -28 }, // 0x38 '8' + { 1391, 22, 30, 28, 6, -28 }, // 0x39 '9' + { 1474, 10, 21, 28, 11, -19 }, // 0x3A ':' + { 1501, 15, 27, 28, 5, -19 }, // 0x3B ';' + { 1552, 23, 22, 28, 6, -23 }, // 0x3C '<' + { 1616, 25, 9, 28, 4, -17 }, // 0x3D '=' + { 1645, 24, 22, 28, 4, -23 }, // 0x3E '>' + { 1711, 16, 28, 28, 11, -26 }, // 0x3F '?' + { 1767, 19, 32, 28, 7, -28 }, // 0x40 '@' + { 1843, 27, 26, 28, 1, -25 }, // 0x41 'A' + { 1931, 26, 26, 28, 2, -25 }, // 0x42 'B' + { 2016, 25, 28, 28, 5, -26 }, // 0x43 'C' + { 2104, 26, 26, 28, 2, -25 }, // 0x44 'D' + { 2189, 27, 26, 28, 2, -25 }, // 0x45 'E' + { 2277, 28, 26, 28, 2, -25 }, // 0x46 'F' + { 2368, 25, 28, 28, 5, -26 }, // 0x47 'G' + { 2456, 27, 26, 28, 3, -25 }, // 0x48 'H' + { 2544, 22, 26, 28, 6, -25 }, // 0x49 'I' + { 2616, 28, 27, 28, 5, -25 }, // 0x4A 'J' + { 2711, 29, 26, 28, 2, -25 }, // 0x4B 'K' + { 2806, 25, 26, 28, 3, -25 }, // 0x4C 'L' + { 2888, 32, 26, 28, 1, -25 }, // 0x4D 'M' + { 2992, 30, 26, 28, 2, -25 }, // 0x4E 'N' + { 3090, 24, 28, 28, 5, -26 }, // 0x4F 'O' + { 3174, 26, 26, 28, 2, -25 }, // 0x50 'P' + { 3259, 24, 32, 28, 5, -26 }, // 0x51 'Q' + { 3355, 26, 26, 28, 2, -25 }, // 0x52 'R' + { 3440, 24, 28, 28, 5, -26 }, // 0x53 'S' + { 3524, 24, 26, 28, 7, -25 }, // 0x54 'T' + { 3602, 26, 27, 28, 6, -25 }, // 0x55 'U' + { 3690, 27, 26, 28, 6, -25 }, // 0x56 'V' + { 3778, 27, 26, 28, 6, -25 }, // 0x57 'W' + { 3866, 29, 26, 28, 2, -25 }, // 0x58 'X' + { 3961, 24, 26, 28, 7, -25 }, // 0x59 'Y' + { 4039, 23, 26, 28, 5, -25 }, // 0x5A 'Z' + { 4114, 15, 34, 28, 12, -27 }, // 0x5B '[' + { 4178, 10, 35, 28, 12, -30 }, // 0x5C '\' + { 4222, 15, 34, 28, 6, -27 }, // 0x5D ']' + { 4286, 18, 12, 28, 9, -28 }, // 0x5E '^' + { 4313, 28, 2, 28, -1, 5 }, // 0x5F '_' + { 4320, 6, 7, 28, 13, -29 }, // 0x60 '`' + { 4326, 22, 22, 28, 4, -20 }, // 0x61 'a' + { 4387, 27, 29, 28, 1, -27 }, // 0x62 'b' + { 4485, 22, 22, 28, 6, -20 }, // 0x63 'c' + { 4546, 25, 29, 28, 5, -27 }, // 0x64 'd' + { 4637, 22, 22, 28, 5, -20 }, // 0x65 'e' + { 4698, 26, 28, 28, 5, -27 }, // 0x66 'f' + { 4789, 25, 30, 28, 5, -20 }, // 0x67 'g' + { 4883, 24, 28, 28, 3, -27 }, // 0x68 'h' + { 4967, 19, 29, 28, 5, -28 }, // 0x69 'i' + { 5036, 20, 38, 28, 4, -28 }, // 0x6A 'j' + { 5131, 24, 28, 28, 3, -27 }, // 0x6B 'k' + { 5215, 19, 28, 28, 5, -27 }, // 0x6C 'l' + { 5282, 27, 21, 28, 1, -20 }, // 0x6D 'm' + { 5353, 23, 21, 28, 3, -20 }, // 0x6E 'n' + { 5414, 22, 22, 28, 5, -20 }, // 0x6F 'o' + { 5475, 29, 30, 28, -1, -20 }, // 0x70 'p' + { 5584, 26, 30, 28, 5, -20 }, // 0x71 'q' + { 5682, 25, 20, 28, 4, -19 }, // 0x72 'r' + { 5745, 21, 22, 28, 5, -20 }, // 0x73 's' + { 5803, 17, 27, 28, 7, -25 }, // 0x74 't' + { 5861, 21, 21, 28, 6, -19 }, // 0x75 'u' + { 5917, 26, 20, 28, 5, -19 }, // 0x76 'v' + { 5982, 25, 20, 28, 6, -19 }, // 0x77 'w' + { 6045, 26, 20, 28, 3, -19 }, // 0x78 'x' + { 6110, 29, 29, 28, 1, -19 }, // 0x79 'y' + { 6216, 21, 20, 28, 5, -19 }, // 0x7A 'z' + { 6269, 15, 34, 28, 10, -27 }, // 0x7B '{' + { 6333, 9, 35, 28, 12, -28 }, // 0x7C '|' + { 6373, 15, 34, 28, 8, -27 }, // 0x7D '}' + { 6437, 20, 6, 28, 7, -15 } }; // 0x7E '~' + +const GFXfont FreeMonoOblique24pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique24pt7bBitmaps, + (GFXglyph *)FreeMonoOblique24pt7bGlyphs, + 0x20, 0x7E, 47 }; + +// Approx. 7124 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique9pt7b.h new file mode 100644 index 0000000..a00ca82 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeMonoOblique9pt7b.h @@ -0,0 +1,187 @@ +const uint8_t FreeMonoOblique9pt7bBitmaps[] PROGMEM = { + 0x11, 0x22, 0x24, 0x40, 0x00, 0xC0, 0xDE, 0xE5, 0x29, 0x00, 0x09, 0x05, + 0x02, 0x82, 0x47, 0xF8, 0xA0, 0x51, 0xFE, 0x28, 0x14, 0x0A, 0x09, 0x00, + 0x08, 0x1D, 0x23, 0x40, 0x70, 0x1C, 0x02, 0x82, 0x84, 0x78, 0x20, 0x20, + 0x1C, 0x11, 0x08, 0x83, 0x80, 0x18, 0x71, 0xC0, 0x1C, 0x11, 0x08, 0x83, + 0x80, 0x1E, 0x60, 0x81, 0x03, 0x0A, 0x65, 0x46, 0x88, 0xE8, 0xFA, 0x80, + 0x12, 0x24, 0x48, 0x88, 0x88, 0x88, 0x80, 0x01, 0x11, 0x11, 0x11, 0x22, + 0x44, 0x80, 0x10, 0x22, 0x5B, 0xC3, 0x0A, 0x22, 0x00, 0x04, 0x02, 0x02, + 0x1F, 0xF0, 0x80, 0x40, 0x20, 0x00, 0x36, 0x4C, 0x80, 0xFF, 0x80, 0xF0, + 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, + 0x08, 0x08, 0x00, 0x1C, 0x45, 0x0A, 0x18, 0x30, 0x61, 0x42, 0x85, 0x11, + 0xC0, 0x04, 0x38, 0x90, 0x20, 0x81, 0x02, 0x04, 0x08, 0x23, 0xF8, 0x07, + 0x04, 0xC4, 0x20, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0x40, 0x3F, 0x80, + 0x0F, 0x00, 0x40, 0x20, 0x20, 0x60, 0x18, 0x04, 0x02, 0x01, 0x43, 0x1E, + 0x00, 0x03, 0x05, 0x0A, 0x12, 0x22, 0x22, 0x42, 0x7F, 0x04, 0x04, 0x1E, + 0x1F, 0x88, 0x08, 0x05, 0xC3, 0x30, 0x08, 0x04, 0x02, 0x02, 0x42, 0x1E, + 0x00, 0x07, 0x18, 0x20, 0x40, 0x5C, 0xA6, 0xC2, 0x82, 0x82, 0xC4, 0x78, + 0xFF, 0x04, 0x10, 0x20, 0x82, 0x04, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x23, + 0x41, 0x41, 0x62, 0x1C, 0x66, 0x82, 0x82, 0x84, 0x78, 0x1E, 0x23, 0x41, + 0x41, 0x43, 0x65, 0x3A, 0x02, 0x04, 0x18, 0xE0, 0x6C, 0x00, 0x36, 0x18, + 0xC0, 0x00, 0x19, 0x8C, 0xC4, 0x00, 0x01, 0x83, 0x06, 0x0C, 0x06, 0x00, + 0x80, 0x30, 0x04, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x20, 0x0C, 0x01, 0x00, + 0x60, 0x20, 0x60, 0xC1, 0x80, 0x3D, 0x8E, 0x08, 0x10, 0xC6, 0x08, 0x00, + 0x01, 0x80, 0x1C, 0x45, 0x0A, 0x79, 0x34, 0x69, 0x4E, 0x81, 0x03, 0x03, + 0xC0, 0x0F, 0x00, 0x60, 0x12, 0x02, 0x40, 0x88, 0x21, 0x07, 0xE1, 0x04, + 0x20, 0x5E, 0x3C, 0x3F, 0x84, 0x11, 0x04, 0x82, 0x3F, 0x88, 0x32, 0x04, + 0x81, 0x60, 0xBF, 0xC0, 0x1E, 0x98, 0xD0, 0x28, 0x08, 0x04, 0x02, 0x01, + 0x00, 0x41, 0x1F, 0x00, 0x3F, 0x0C, 0x22, 0x04, 0x81, 0x20, 0x48, 0x12, + 0x09, 0x02, 0x43, 0x3F, 0x00, 0x3F, 0xC4, 0x11, 0x00, 0x88, 0x3E, 0x08, + 0x82, 0x00, 0x82, 0x60, 0xBF, 0xE0, 0x3F, 0xE2, 0x08, 0x40, 0x11, 0x03, + 0xE0, 0x44, 0x08, 0x01, 0x00, 0x60, 0x1F, 0x00, 0x1E, 0x98, 0xD0, 0x08, + 0x08, 0x04, 0x7A, 0x05, 0x02, 0x41, 0x1F, 0x00, 0x3D, 0xE2, 0x18, 0x42, + 0x08, 0x43, 0xF8, 0x41, 0x08, 0x21, 0x08, 0x21, 0x1E, 0xF0, 0x3F, 0x82, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x7F, 0x00, 0x0F, 0xE0, + 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x20, 0x84, 0x10, 0x84, 0x0F, 0x00, + 0x3C, 0xE2, 0x10, 0x44, 0x11, 0x02, 0xC0, 0x64, 0x08, 0x81, 0x08, 0x61, + 0x1E, 0x38, 0x3E, 0x02, 0x00, 0x80, 0x20, 0x10, 0x04, 0x01, 0x04, 0x42, + 0x10, 0xBF, 0xE0, 0x38, 0x38, 0xC3, 0x05, 0x28, 0x29, 0x42, 0x52, 0x13, + 0x10, 0x99, 0x84, 0x08, 0x20, 0x47, 0x8F, 0x00, 0x70, 0xE6, 0x08, 0xA1, + 0x14, 0x22, 0x48, 0x49, 0x11, 0x22, 0x14, 0x43, 0x1E, 0x20, 0x1E, 0x18, + 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x00, 0x3F, 0x84, + 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x00, 0x80, 0x60, 0x3E, 0x00, 0x1E, + 0x18, 0x90, 0x28, 0x18, 0x0C, 0x06, 0x05, 0x02, 0x46, 0x1E, 0x08, 0x0F, + 0x44, 0x60, 0x3F, 0x84, 0x31, 0x04, 0x81, 0x20, 0x8F, 0xC2, 0x10, 0x84, + 0x60, 0xBC, 0x10, 0x0F, 0x88, 0xC8, 0x24, 0x01, 0x80, 0x38, 0x05, 0x02, + 0xC2, 0x5E, 0x00, 0xFF, 0xC4, 0x44, 0x02, 0x01, 0x00, 0x80, 0x40, 0x60, + 0x20, 0x7E, 0x00, 0xF1, 0xD0, 0x24, 0x09, 0x02, 0x41, 0xA0, 0x48, 0x12, + 0x04, 0xC6, 0x1F, 0x00, 0xF1, 0xE8, 0x11, 0x02, 0x20, 0x82, 0x20, 0x44, + 0x09, 0x01, 0x40, 0x28, 0x02, 0x00, 0xF1, 0xE8, 0x09, 0x12, 0x26, 0x45, + 0x48, 0xAA, 0x29, 0x45, 0x28, 0xC6, 0x18, 0xC0, 0x38, 0xE2, 0x08, 0x26, + 0x05, 0x00, 0x40, 0x18, 0x04, 0x81, 0x08, 0x41, 0x1C, 0x70, 0xE3, 0xA0, + 0x90, 0x84, 0x81, 0x80, 0x80, 0x40, 0x20, 0x20, 0x7E, 0x00, 0x3F, 0x90, + 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x82, 0x7F, 0x00, 0x39, 0x08, + 0x44, 0x21, 0x08, 0x42, 0x21, 0x0E, 0x00, 0x88, 0x44, 0x44, 0x22, 0x22, + 0x11, 0x11, 0x38, 0x42, 0x11, 0x08, 0x42, 0x10, 0x84, 0x2E, 0x00, 0x08, + 0x28, 0x92, 0x18, 0x20, 0xFF, 0xC0, 0xA4, 0x3E, 0x00, 0x80, 0x47, 0xA4, + 0x34, 0x12, 0x18, 0xF7, 0x38, 0x01, 0x00, 0x40, 0x09, 0xE1, 0xC6, 0x20, + 0x44, 0x09, 0x01, 0x30, 0x46, 0x13, 0xBC, 0x00, 0x1F, 0x48, 0x74, 0x0A, + 0x00, 0x80, 0x20, 0x0C, 0x18, 0xF8, 0x01, 0x80, 0x40, 0x23, 0x96, 0x32, + 0x0A, 0x05, 0x02, 0x81, 0x61, 0x1F, 0xE0, 0x1F, 0x30, 0xD0, 0x3F, 0xF8, + 0x04, 0x01, 0x00, 0x7C, 0x07, 0xC3, 0x00, 0x80, 0xFE, 0x10, 0x04, 0x01, + 0x00, 0x40, 0x10, 0x08, 0x0F, 0xE0, 0x1D, 0xD8, 0xC4, 0x12, 0x04, 0x82, + 0x20, 0x8C, 0x61, 0xE8, 0x02, 0x01, 0x07, 0x80, 0x30, 0x04, 0x01, 0x00, + 0x5C, 0x38, 0x88, 0x22, 0x08, 0x82, 0x21, 0x18, 0x4F, 0x3C, 0x04, 0x04, + 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0xFF, 0x01, 0x00, 0x80, + 0x03, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x80, 0x40, 0x47, + 0xC0, 0x38, 0x08, 0x04, 0x02, 0x71, 0x20, 0xA0, 0xA0, 0x68, 0x24, 0x11, + 0x38, 0xE0, 0x3C, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, + 0xFF, 0x3E, 0xE2, 0x64, 0x88, 0x91, 0x12, 0x24, 0x48, 0x91, 0x17, 0x33, + 0x37, 0x14, 0x4C, 0x24, 0x12, 0x09, 0x08, 0x85, 0xE3, 0x1E, 0x10, 0x90, + 0x30, 0x18, 0x0C, 0x0B, 0x08, 0x78, 0x33, 0xC3, 0x8C, 0x40, 0x88, 0x12, + 0x02, 0x60, 0x8C, 0x31, 0x78, 0x20, 0x08, 0x03, 0xE0, 0x00, 0x1C, 0xD8, + 0xC4, 0x12, 0x04, 0x81, 0x20, 0x4C, 0x21, 0xF8, 0x02, 0x00, 0x81, 0xF0, + 0x73, 0x8E, 0x04, 0x04, 0x02, 0x01, 0x00, 0x81, 0xFC, 0x1F, 0x61, 0x40, + 0x3C, 0x03, 0x81, 0x82, 0xFC, 0x10, 0x63, 0xF9, 0x02, 0x04, 0x10, 0x20, + 0x40, 0x7C, 0xE3, 0x10, 0x90, 0x48, 0x24, 0x22, 0x11, 0x18, 0xF6, 0xF3, + 0xD0, 0x44, 0x10, 0x88, 0x24, 0x09, 0x02, 0x80, 0x40, 0xE1, 0xD0, 0x24, + 0x91, 0x24, 0x55, 0x19, 0x86, 0x61, 0x10, 0x39, 0xC4, 0x20, 0xB0, 0x30, + 0x0C, 0x04, 0x86, 0x13, 0x8E, 0x3C, 0x71, 0x04, 0x10, 0x40, 0x88, 0x09, + 0x00, 0xA0, 0x06, 0x00, 0x40, 0x08, 0x01, 0x00, 0xFC, 0x00, 0x7F, 0x42, + 0x04, 0x08, 0x10, 0x20, 0x42, 0xFE, 0x0C, 0x41, 0x04, 0x30, 0x8C, 0x08, + 0x21, 0x04, 0x10, 0x60, 0x24, 0x94, 0x92, 0x52, 0x40, 0x18, 0x20, 0x82, + 0x10, 0x40, 0xC4, 0x10, 0x82, 0x08, 0xC0, 0x61, 0x24, 0x30 }; + +const GFXglyph FreeMonoOblique9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' + { 0, 4, 11, 11, 4, -10 }, // 0x21 '!' + { 6, 5, 5, 11, 4, -10 }, // 0x22 '"' + { 10, 9, 12, 11, 2, -10 }, // 0x23 '#' + { 24, 8, 12, 11, 3, -10 }, // 0x24 '$' + { 36, 9, 11, 11, 2, -10 }, // 0x25 '%' + { 49, 7, 10, 11, 2, -9 }, // 0x26 '&' + { 58, 2, 5, 11, 6, -10 }, // 0x27 ''' + { 60, 4, 13, 11, 6, -10 }, // 0x28 '(' + { 67, 4, 13, 11, 3, -10 }, // 0x29 ')' + { 74, 7, 7, 11, 4, -10 }, // 0x2A '*' + { 81, 9, 8, 11, 2, -8 }, // 0x2B '+' + { 90, 4, 5, 11, 2, -1 }, // 0x2C ',' + { 93, 9, 1, 11, 2, -5 }, // 0x2D '-' + { 95, 2, 2, 11, 4, -1 }, // 0x2E '.' + { 96, 9, 13, 11, 2, -11 }, // 0x2F '/' + { 111, 7, 11, 11, 3, -10 }, // 0x30 '0' + { 121, 7, 11, 11, 2, -10 }, // 0x31 '1' + { 131, 9, 11, 11, 2, -10 }, // 0x32 '2' + { 144, 9, 11, 11, 2, -10 }, // 0x33 '3' + { 157, 8, 11, 11, 2, -10 }, // 0x34 '4' + { 168, 9, 11, 11, 2, -10 }, // 0x35 '5' + { 181, 8, 11, 11, 3, -10 }, // 0x36 '6' + { 192, 7, 11, 11, 4, -10 }, // 0x37 '7' + { 202, 8, 11, 11, 3, -10 }, // 0x38 '8' + { 213, 8, 11, 11, 3, -10 }, // 0x39 '9' + { 224, 3, 8, 11, 4, -7 }, // 0x3A ':' + { 227, 5, 11, 11, 2, -7 }, // 0x3B ';' + { 234, 9, 8, 11, 2, -8 }, // 0x3C '<' + { 243, 9, 4, 11, 2, -6 }, // 0x3D '=' + { 248, 9, 8, 11, 2, -8 }, // 0x3E '>' + { 257, 7, 10, 11, 4, -9 }, // 0x3F '?' + { 266, 7, 12, 11, 3, -10 }, // 0x40 '@' + { 277, 11, 10, 11, 0, -9 }, // 0x41 'A' + { 291, 10, 10, 11, 1, -9 }, // 0x42 'B' + { 304, 9, 10, 11, 2, -9 }, // 0x43 'C' + { 316, 10, 10, 11, 1, -9 }, // 0x44 'D' + { 329, 10, 10, 11, 1, -9 }, // 0x45 'E' + { 342, 11, 10, 11, 1, -9 }, // 0x46 'F' + { 356, 9, 10, 11, 2, -9 }, // 0x47 'G' + { 368, 11, 10, 11, 1, -9 }, // 0x48 'H' + { 382, 9, 10, 11, 2, -9 }, // 0x49 'I' + { 394, 11, 10, 11, 2, -9 }, // 0x4A 'J' + { 408, 11, 10, 11, 1, -9 }, // 0x4B 'K' + { 422, 10, 10, 11, 1, -9 }, // 0x4C 'L' + { 435, 13, 10, 11, 0, -9 }, // 0x4D 'M' + { 452, 11, 10, 11, 1, -9 }, // 0x4E 'N' + { 466, 9, 10, 11, 2, -9 }, // 0x4F 'O' + { 478, 10, 10, 11, 1, -9 }, // 0x50 'P' + { 491, 9, 13, 11, 2, -9 }, // 0x51 'Q' + { 506, 10, 10, 11, 1, -9 }, // 0x52 'R' + { 519, 9, 10, 11, 2, -9 }, // 0x53 'S' + { 531, 9, 10, 11, 3, -9 }, // 0x54 'T' + { 543, 10, 10, 11, 2, -9 }, // 0x55 'U' + { 556, 11, 10, 11, 2, -9 }, // 0x56 'V' + { 570, 11, 10, 11, 2, -9 }, // 0x57 'W' + { 584, 11, 10, 11, 1, -9 }, // 0x58 'X' + { 598, 9, 10, 11, 3, -9 }, // 0x59 'Y' + { 610, 9, 10, 11, 2, -9 }, // 0x5A 'Z' + { 622, 5, 13, 11, 5, -10 }, // 0x5B '[' + { 631, 4, 14, 11, 4, -11 }, // 0x5C '\' + { 638, 5, 13, 11, 2, -10 }, // 0x5D ']' + { 647, 7, 5, 11, 3, -10 }, // 0x5E '^' + { 652, 11, 1, 11, 0, 2 }, // 0x5F '_' + { 654, 2, 3, 11, 5, -11 }, // 0x60 '`' + { 655, 9, 8, 11, 2, -7 }, // 0x61 'a' + { 664, 11, 11, 11, 0, -10 }, // 0x62 'b' + { 680, 10, 8, 11, 2, -7 }, // 0x63 'c' + { 690, 9, 11, 11, 2, -10 }, // 0x64 'd' + { 703, 9, 8, 11, 2, -7 }, // 0x65 'e' + { 712, 10, 11, 11, 2, -10 }, // 0x66 'f' + { 726, 10, 11, 11, 2, -7 }, // 0x67 'g' + { 740, 10, 11, 11, 1, -10 }, // 0x68 'h' + { 754, 8, 11, 11, 2, -10 }, // 0x69 'i' + { 765, 9, 14, 11, 1, -10 }, // 0x6A 'j' + { 781, 9, 11, 11, 1, -10 }, // 0x6B 'k' + { 794, 8, 11, 11, 2, -10 }, // 0x6C 'l' + { 805, 11, 8, 11, 0, -7 }, // 0x6D 'm' + { 816, 9, 8, 11, 1, -7 }, // 0x6E 'n' + { 825, 9, 8, 11, 2, -7 }, // 0x6F 'o' + { 834, 11, 11, 11, 0, -7 }, // 0x70 'p' + { 850, 10, 11, 11, 2, -7 }, // 0x71 'q' + { 864, 9, 8, 11, 2, -7 }, // 0x72 'r' + { 873, 8, 8, 11, 2, -7 }, // 0x73 's' + { 881, 7, 10, 11, 2, -9 }, // 0x74 't' + { 890, 9, 8, 11, 2, -7 }, // 0x75 'u' + { 899, 10, 8, 11, 2, -7 }, // 0x76 'v' + { 909, 10, 8, 11, 2, -7 }, // 0x77 'w' + { 919, 10, 8, 11, 1, -7 }, // 0x78 'x' + { 929, 12, 11, 11, 0, -7 }, // 0x79 'y' + { 946, 8, 8, 11, 2, -7 }, // 0x7A 'z' + { 954, 6, 13, 11, 4, -10 }, // 0x7B '{' + { 964, 3, 12, 11, 5, -9 }, // 0x7C '|' + { 969, 6, 13, 11, 3, -10 }, // 0x7D '}' + { 979, 7, 3, 11, 3, -6 } }; // 0x7E '~' + +const GFXfont FreeMonoOblique9pt7b PROGMEM = { + (uint8_t *)FreeMonoOblique9pt7bBitmaps, + (GFXglyph *)FreeMonoOblique9pt7bGlyphs, + 0x20, 0x7E, 18 }; + +// Approx. 1654 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans12pt7b.h new file mode 100644 index 0000000..9ecbb8f --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans12pt7b.h @@ -0,0 +1,270 @@ +const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30, + 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18, + 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30, + 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E, + 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3, + 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E, + 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00, + 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18, + 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F, + 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03, + 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE, + 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98, + 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18, + 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62, + 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0, + 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60, + 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20, + 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, + 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63, + 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C, + 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00, + 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C, + 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07, + 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0, + 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06, + 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07, + 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74, + 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06, + 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60, + 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80, + 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66, + 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C, + 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05, + 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00, + 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0, + 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07, + 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F, + 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0, + 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE, + 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30, + 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C, + 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38, + 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01, + 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30, + 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C, + 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30, + 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF, + 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7, + 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C, + 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0, + 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00, + 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00, + 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF, + 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, + 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00, + 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03, + 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, + 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC, + 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03, + 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C, + 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, + 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0, + 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC, + 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE, + 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D, + 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F, + 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, + 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00, + 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, + 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, + 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78, + 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC, + 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3, + 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06, + 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60, + 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80, + 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80, + 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0, + 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C, + 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01, + 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0, + 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3, + 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98, + 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E, + 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60, + 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0, + 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06, + 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30, + 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03, + 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, + 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, + 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40, + 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19, + 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8, + 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C, + 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B, + 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F, + 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F, + 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F, + 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, + 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F, + 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7, + 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F, + 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF, + 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, + 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30, + 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1, + 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC, + 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83, + 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF, + 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, + 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D, + 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, + 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00, + 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F, + 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D, + 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C, + 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0, + 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36, + 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07, + 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1, + 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06, + 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B, + 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E, + 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30, + 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31, + 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03, + 0x80 }; + +const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 2, 18, 8, 3, -17 }, // 0x21 '!' + { 5, 6, 6, 8, 1, -16 }, // 0x22 '"' + { 10, 13, 16, 13, 0, -15 }, // 0x23 '#' + { 36, 11, 20, 13, 1, -17 }, // 0x24 '$' + { 64, 20, 17, 21, 1, -16 }, // 0x25 '%' + { 107, 14, 17, 16, 1, -16 }, // 0x26 '&' + { 137, 2, 6, 5, 1, -16 }, // 0x27 ''' + { 139, 5, 23, 8, 2, -17 }, // 0x28 '(' + { 154, 5, 23, 8, 1, -17 }, // 0x29 ')' + { 169, 7, 7, 9, 1, -17 }, // 0x2A '*' + { 176, 10, 11, 14, 2, -10 }, // 0x2B '+' + { 190, 2, 6, 7, 2, -1 }, // 0x2C ',' + { 192, 6, 2, 8, 1, -7 }, // 0x2D '-' + { 194, 2, 2, 6, 2, -1 }, // 0x2E '.' + { 195, 7, 18, 7, 0, -17 }, // 0x2F '/' + { 211, 11, 17, 13, 1, -16 }, // 0x30 '0' + { 235, 5, 17, 13, 3, -16 }, // 0x31 '1' + { 246, 11, 17, 13, 1, -16 }, // 0x32 '2' + { 270, 11, 17, 13, 1, -16 }, // 0x33 '3' + { 294, 11, 17, 13, 1, -16 }, // 0x34 '4' + { 318, 11, 17, 13, 1, -16 }, // 0x35 '5' + { 342, 11, 17, 13, 1, -16 }, // 0x36 '6' + { 366, 11, 17, 13, 1, -16 }, // 0x37 '7' + { 390, 11, 17, 13, 1, -16 }, // 0x38 '8' + { 414, 11, 17, 13, 1, -16 }, // 0x39 '9' + { 438, 2, 13, 6, 2, -12 }, // 0x3A ':' + { 442, 2, 16, 6, 2, -11 }, // 0x3B ';' + { 446, 12, 12, 14, 1, -11 }, // 0x3C '<' + { 464, 12, 6, 14, 1, -8 }, // 0x3D '=' + { 473, 12, 12, 14, 1, -11 }, // 0x3E '>' + { 491, 10, 18, 13, 2, -17 }, // 0x3F '?' + { 514, 22, 21, 24, 1, -17 }, // 0x40 '@' + { 572, 16, 18, 16, 0, -17 }, // 0x41 'A' + { 608, 13, 18, 16, 2, -17 }, // 0x42 'B' + { 638, 15, 18, 17, 1, -17 }, // 0x43 'C' + { 672, 14, 18, 17, 2, -17 }, // 0x44 'D' + { 704, 12, 18, 15, 2, -17 }, // 0x45 'E' + { 731, 11, 18, 14, 2, -17 }, // 0x46 'F' + { 756, 16, 18, 18, 1, -17 }, // 0x47 'G' + { 792, 13, 18, 17, 2, -17 }, // 0x48 'H' + { 822, 2, 18, 7, 2, -17 }, // 0x49 'I' + { 827, 9, 18, 13, 1, -17 }, // 0x4A 'J' + { 848, 14, 18, 16, 2, -17 }, // 0x4B 'K' + { 880, 10, 18, 14, 2, -17 }, // 0x4C 'L' + { 903, 16, 18, 20, 2, -17 }, // 0x4D 'M' + { 939, 13, 18, 18, 2, -17 }, // 0x4E 'N' + { 969, 17, 18, 19, 1, -17 }, // 0x4F 'O' + { 1008, 12, 18, 16, 2, -17 }, // 0x50 'P' + { 1035, 17, 19, 19, 1, -17 }, // 0x51 'Q' + { 1076, 14, 18, 17, 2, -17 }, // 0x52 'R' + { 1108, 14, 18, 16, 1, -17 }, // 0x53 'S' + { 1140, 12, 18, 15, 1, -17 }, // 0x54 'T' + { 1167, 13, 18, 17, 2, -17 }, // 0x55 'U' + { 1197, 15, 18, 15, 0, -17 }, // 0x56 'V' + { 1231, 22, 18, 22, 0, -17 }, // 0x57 'W' + { 1281, 15, 18, 16, 0, -17 }, // 0x58 'X' + { 1315, 16, 18, 16, 0, -17 }, // 0x59 'Y' + { 1351, 13, 18, 15, 1, -17 }, // 0x5A 'Z' + { 1381, 4, 23, 7, 2, -17 }, // 0x5B '[' + { 1393, 7, 18, 7, 0, -17 }, // 0x5C '\' + { 1409, 4, 23, 7, 1, -17 }, // 0x5D ']' + { 1421, 9, 9, 11, 1, -16 }, // 0x5E '^' + { 1432, 15, 1, 13, -1, 4 }, // 0x5F '_' + { 1434, 5, 4, 6, 1, -17 }, // 0x60 '`' + { 1437, 12, 13, 13, 1, -12 }, // 0x61 'a' + { 1457, 12, 18, 13, 1, -17 }, // 0x62 'b' + { 1484, 10, 13, 12, 1, -12 }, // 0x63 'c' + { 1501, 11, 18, 13, 1, -17 }, // 0x64 'd' + { 1526, 11, 13, 13, 1, -12 }, // 0x65 'e' + { 1544, 5, 18, 7, 1, -17 }, // 0x66 'f' + { 1556, 11, 18, 13, 1, -12 }, // 0x67 'g' + { 1581, 10, 18, 13, 1, -17 }, // 0x68 'h' + { 1604, 2, 18, 5, 2, -17 }, // 0x69 'i' + { 1609, 4, 23, 6, 0, -17 }, // 0x6A 'j' + { 1621, 11, 18, 12, 1, -17 }, // 0x6B 'k' + { 1646, 2, 18, 5, 1, -17 }, // 0x6C 'l' + { 1651, 17, 13, 19, 1, -12 }, // 0x6D 'm' + { 1679, 10, 13, 13, 1, -12 }, // 0x6E 'n' + { 1696, 11, 13, 13, 1, -12 }, // 0x6F 'o' + { 1714, 12, 17, 13, 1, -12 }, // 0x70 'p' + { 1740, 11, 17, 13, 1, -12 }, // 0x71 'q' + { 1764, 6, 13, 8, 1, -12 }, // 0x72 'r' + { 1774, 10, 13, 12, 1, -12 }, // 0x73 's' + { 1791, 5, 16, 7, 1, -15 }, // 0x74 't' + { 1801, 10, 13, 13, 1, -12 }, // 0x75 'u' + { 1818, 12, 13, 12, 0, -12 }, // 0x76 'v' + { 1838, 17, 13, 17, 0, -12 }, // 0x77 'w' + { 1866, 11, 13, 11, 0, -12 }, // 0x78 'x' + { 1884, 11, 18, 11, 0, -12 }, // 0x79 'y' + { 1909, 10, 13, 12, 1, -12 }, // 0x7A 'z' + { 1926, 5, 23, 8, 1, -17 }, // 0x7B '{' + { 1941, 2, 23, 6, 2, -17 }, // 0x7C '|' + { 1947, 5, 23, 8, 2, -17 }, // 0x7D '}' + { 1962, 10, 5, 12, 1, -10 } }; // 0x7E '~' + +const GFXfont FreeSans12pt7b PROGMEM = { + (uint8_t *)FreeSans12pt7bBitmaps, + (GFXglyph *)FreeSans12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2641 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans18pt7b.h new file mode 100644 index 0000000..3fdc591 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans18pt7b.h @@ -0,0 +1,452 @@ +const uint8_t FreeSans18pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x20, 0x3F, 0xFC, 0xE3, 0xF1, + 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0x82, 0x41, 0x00, 0x01, 0xC3, 0x80, + 0x38, 0x70, 0x06, 0x0E, 0x00, 0xC1, 0x80, 0x38, 0x70, 0x07, 0x0E, 0x0F, + 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0xE1, 0xC0, 0x1C, 0x38, 0x03, + 0x87, 0x00, 0x70, 0xE0, 0x0C, 0x18, 0x3F, 0xFF, 0xF7, 0xFF, 0xFE, 0xFF, + 0xFF, 0xC1, 0xC3, 0x80, 0x30, 0x60, 0x06, 0x0C, 0x01, 0xC3, 0x80, 0x38, + 0x70, 0x07, 0x0E, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x0F, 0xC0, 0x3F, 0xF0, + 0x3F, 0xF8, 0x7B, 0x3C, 0xF3, 0x1C, 0xE3, 0x0E, 0xE3, 0x0E, 0xE3, 0x0E, + 0xE3, 0x00, 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x00, 0x7F, 0x80, 0x1F, 0xF0, + 0x07, 0xFC, 0x03, 0x7E, 0x03, 0x0F, 0x03, 0x07, 0xE3, 0x07, 0xE3, 0x07, + 0xE3, 0x07, 0xE3, 0x0F, 0x73, 0x3E, 0x7F, 0xFC, 0x3F, 0xF8, 0x0F, 0xE0, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x78, 0x00, + 0xE0, 0x0F, 0xF0, 0x06, 0x00, 0xFF, 0xC0, 0x70, 0x07, 0x0E, 0x07, 0x00, + 0x70, 0x38, 0x38, 0x03, 0x00, 0xC3, 0x80, 0x18, 0x06, 0x1C, 0x00, 0xE0, + 0x71, 0xC0, 0x03, 0x87, 0x8C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x86, + 0x00, 0x01, 0xF8, 0x70, 0x00, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x38, 0x7F, + 0x80, 0x01, 0x87, 0xFE, 0x00, 0x1C, 0x38, 0x70, 0x00, 0xC3, 0x81, 0xC0, + 0x0E, 0x18, 0x06, 0x00, 0xE0, 0xC0, 0x30, 0x07, 0x07, 0x03, 0x80, 0x70, + 0x1C, 0x38, 0x03, 0x80, 0xFF, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, 0x07, + 0x80, 0x01, 0xF0, 0x00, 0x7F, 0x80, 0x0F, 0xFC, 0x01, 0xE1, 0xE0, 0x1C, + 0x0E, 0x01, 0xC0, 0xE0, 0x1C, 0x0E, 0x01, 0xE1, 0xE0, 0x0E, 0x3C, 0x00, + 0x77, 0x80, 0x07, 0xF0, 0x00, 0x7C, 0x00, 0x0F, 0xE0, 0x03, 0xCF, 0x1C, + 0x78, 0x79, 0xC7, 0x03, 0xDC, 0xE0, 0x1F, 0x8E, 0x00, 0xF8, 0xE0, 0x0F, + 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x87, 0xC3, 0xFC, 0x7F, 0xFD, 0xC3, 0xFF, + 0x0E, 0x0F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFA, 0x40, 0x06, 0x06, 0x0C, 0x0C, + 0x18, 0x18, 0x38, 0x30, 0x70, 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x70, 0x70, 0x30, 0x38, 0x18, + 0x18, 0x0C, 0x0C, 0x06, 0x03, 0xC0, 0x60, 0x30, 0x30, 0x38, 0x18, 0x1C, + 0x0C, 0x0E, 0x0E, 0x0E, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x0E, 0x0E, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x30, + 0x60, 0xC0, 0x0C, 0x03, 0x00, 0xC3, 0xB7, 0xFF, 0xC7, 0x81, 0xE0, 0xEC, + 0x73, 0x88, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, + 0xF6, 0xDA, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xC0, 0x30, 0x18, + 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x06, 0x01, 0x80, 0x60, 0x30, 0x0C, + 0x03, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x06, + 0x01, 0x80, 0xC0, 0x30, 0x00, 0x07, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, + 0x3C, 0x78, 0x1E, 0x70, 0x0E, 0x70, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3C, + 0x3C, 0x1F, 0xF8, 0x1F, 0xF0, 0x07, 0xE0, 0x03, 0x03, 0x07, 0x0F, 0x3F, + 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE0, 0x1F, 0xF8, + 0x3F, 0xFC, 0x7C, 0x3E, 0x70, 0x0F, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, + 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x70, 0x00, + 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF0, + 0x07, 0xFE, 0x07, 0xFF, 0x87, 0x83, 0xC3, 0x80, 0xF3, 0x80, 0x39, 0xC0, + 0x1C, 0xE0, 0x0E, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x3F, 0x00, + 0x1F, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xF0, 0x01, + 0xF8, 0x00, 0xFE, 0x00, 0x77, 0x00, 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, + 0xF8, 0x07, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8, + 0x00, 0xF8, 0x01, 0xF8, 0x03, 0xB8, 0x03, 0x38, 0x07, 0x38, 0x0E, 0x38, + 0x1C, 0x38, 0x18, 0x38, 0x38, 0x38, 0x70, 0x38, 0x60, 0x38, 0xE0, 0x38, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x1F, 0xFF, 0x0F, 0xFF, 0x8F, 0xFF, + 0xC7, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x39, + 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0x83, 0xE7, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xFC, 0x00, + 0xEF, 0x00, 0x73, 0xC0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xE0, 0x00, + 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 0x1E, 0x38, 0x0E, 0x70, 0x0E, + 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, 0xFF, 0xFC, + 0xFC, 0x3E, 0xF0, 0x0E, 0xF0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0x60, 0x07, 0x70, 0x0F, 0x70, 0x0E, 0x3C, 0x3E, 0x3F, 0xFC, 0x1F, 0xF8, + 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x18, 0x00, 0x38, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, + 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, + 0xC7, 0x80, 0xF3, 0x80, 0x39, 0xC0, 0x1C, 0xE0, 0x0E, 0x78, 0x0F, 0x1E, + 0x0F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xE0, 0xF9, 0xC0, 0x1D, + 0xC0, 0x0F, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xF7, 0x00, + 0x73, 0xE0, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, 0xE0, + 0x1F, 0xF8, 0x3F, 0xFC, 0x7C, 0x3C, 0x70, 0x0E, 0xF0, 0x0E, 0xE0, 0x06, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0x70, 0x0F, 0x78, 0x3F, + 0x3F, 0xFF, 0x1F, 0xF7, 0x07, 0xC7, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E, + 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xF8, 0x1F, 0xF0, 0x07, 0xC0, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x07, 0xFF, 0xB6, 0xD6, 0x00, 0x00, 0x80, 0x03, 0xC0, 0x07, 0xE0, + 0x0F, 0xC0, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x00, 0xE0, 0x00, + 0x7C, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x80, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0xFC, + 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0x80, 0x0F, 0xC0, + 0x1F, 0x80, 0x7F, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x01, 0xC0, 0x00, + 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE3, 0xC3, 0xEF, 0x01, + 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0x00, 0x0E, 0x00, 0x38, 0x00, 0xF0, + 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x0F, 0xE0, 0x03, 0xE0, 0x01, 0xF0, + 0x07, 0x80, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x1E, + 0x3C, 0x03, 0xE0, 0x1E, 0x38, 0x0F, 0xF3, 0x8E, 0x78, 0x1E, 0x3F, 0x0F, + 0x70, 0x38, 0x1F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, + 0xE0, 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1C, 0x07, + 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x38, 0x1C, + 0xF0, 0x70, 0x78, 0x3C, 0x70, 0x78, 0xFC, 0x78, 0x78, 0x3F, 0xDF, 0xF0, + 0x38, 0x1F, 0x0F, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x0E, 0x00, 0x01, 0xFF, 0xFE, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xDC, 0x00, 0x07, 0x78, + 0x00, 0x3C, 0xE0, 0x00, 0xE3, 0x80, 0x03, 0x8F, 0x00, 0x1E, 0x1C, 0x00, + 0x70, 0x70, 0x01, 0xC1, 0xE0, 0x0E, 0x03, 0x80, 0x38, 0x0E, 0x00, 0xE0, + 0x3C, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xC0, 0x0E, + 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xF1, 0xE0, 0x01, 0xC7, 0x00, 0x07, 0xBC, + 0x00, 0x1E, 0xF0, 0x00, 0x3B, 0x80, 0x00, 0xF0, 0xFF, 0xFC, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFE, 0x70, 0x03, 0xCE, 0x00, 0x3D, 0xC0, 0x03, 0xB8, 0x00, + 0x77, 0x00, 0x0E, 0xE0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1E, 0x7F, 0xFF, + 0x8F, 0xFF, 0xF1, 0xFF, 0xFF, 0x38, 0x00, 0xF7, 0x00, 0x0E, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x03, + 0xF8, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0x80, 0x00, 0xFF, + 0x00, 0x0F, 0xFF, 0x00, 0xFF, 0xFE, 0x07, 0xE0, 0x7C, 0x3E, 0x00, 0x78, + 0xF0, 0x00, 0xE7, 0x80, 0x03, 0xDC, 0x00, 0x07, 0x70, 0x00, 0x03, 0x80, + 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, + 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x1D, 0xC0, 0x00, 0x77, + 0x00, 0x03, 0xDE, 0x00, 0x0E, 0x3C, 0x00, 0x78, 0xF8, 0x03, 0xC1, 0xF8, + 0x1F, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xF8, 0x00, 0xFF, 0xF8, + 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x0E, 0x00, 0xF8, 0xE0, 0x03, 0xCE, 0x00, + 0x1C, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, 0x07, 0xE0, + 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, + 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x0F, 0xE0, 0x00, 0xEE, 0x00, 0x0E, + 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x0F, 0x8F, 0xFF, 0xF0, 0xFF, 0xFE, + 0x0F, 0xFF, 0x80, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, + 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xEE, 0x00, + 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, + 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x1F, 0xFF, 0xCF, 0xFF, 0xE7, 0xFF, 0xF3, 0x80, 0x01, 0xC0, 0x00, + 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7F, + 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x0F, 0x80, 0xFC, 0x1E, 0x00, + 0x3E, 0x3C, 0x00, 0x0E, 0x78, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x70, 0x00, + 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x03, + 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x0F, 0x78, 0x00, 0x0F, 0x3C, 0x00, + 0x1F, 0x1E, 0x00, 0x3F, 0x0F, 0xC0, 0xF7, 0x07, 0xFF, 0xE7, 0x03, 0xFF, + 0xC3, 0x00, 0xFF, 0x03, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, + 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, + 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, + 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, + 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, + 0x3F, 0x00, 0xE0, 0x01, 0xEE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0xF0, + 0xE0, 0x1E, 0x0E, 0x03, 0xE0, 0xE0, 0x7C, 0x0E, 0x0F, 0x80, 0xE1, 0xF0, + 0x0E, 0x1E, 0x00, 0xE3, 0xC0, 0x0E, 0x7C, 0x00, 0xEF, 0xE0, 0x0F, 0xCE, + 0x00, 0xF8, 0xF0, 0x0F, 0x07, 0x80, 0xE0, 0x3C, 0x0E, 0x03, 0xC0, 0xE0, + 0x1E, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0x78, 0xE0, 0x03, 0xCE, + 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0F, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, + 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, + 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0x00, 0x1F, 0xF8, + 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, + 0x00, 0x3F, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xEE, 0x00, 0x77, 0xE7, + 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE7, 0x00, 0xE7, 0xE3, 0x81, 0xC7, 0xE3, + 0x81, 0xC7, 0xE3, 0x81, 0xC7, 0xE1, 0xC3, 0x87, 0xE1, 0xC3, 0x87, 0xE1, + 0xC3, 0x87, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, 0xE7, 0x07, 0xE0, + 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3C, 0x07, 0xE0, + 0x3C, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xC0, 0x07, + 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xEF, 0x00, 0x7E, 0x70, 0x07, 0xE7, 0x80, + 0x7E, 0x3C, 0x07, 0xE1, 0xC0, 0x7E, 0x1E, 0x07, 0xE0, 0xE0, 0x7E, 0x0F, + 0x07, 0xE0, 0x78, 0x7E, 0x03, 0x87, 0xE0, 0x3C, 0x7E, 0x01, 0xE7, 0xE0, + 0x0E, 0x7E, 0x00, 0xF7, 0xE0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x03, 0xFE, + 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, + 0x00, 0xF1, 0xE0, 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xB8, 0x00, 0x03, 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x01, 0xE3, 0xC0, 0x01, + 0xE0, 0xF0, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x3F, 0xFF, 0x8F, 0xFF, 0xF3, + 0x80, 0x3E, 0xE0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, + 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1E, 0xFF, 0xFF, 0x3F, 0xFF, + 0x8F, 0xFF, 0xC3, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, + 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xFF, + 0xFC, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x03, 0xC1, 0xE0, 0x00, 0xF1, 0xE0, + 0x00, 0x3C, 0xE0, 0x00, 0x0E, 0x70, 0x00, 0x07, 0x70, 0x00, 0x01, 0xF8, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x03, + 0x9C, 0x00, 0x01, 0xCF, 0x00, 0x39, 0xE3, 0xC0, 0x1F, 0xE0, 0xF0, 0x07, + 0xE0, 0x3E, 0x03, 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xEE, 0x00, 0x3F, + 0x83, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0xFF, 0xFE, 0x0F, 0xFF, + 0xF8, 0xFF, 0xFF, 0xCE, 0x00, 0x3C, 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, + 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x01, 0xCE, + 0x00, 0x3C, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8E, 0x00, 0x3C, + 0xE0, 0x01, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, + 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xEE, 0x00, 0x0E, 0xE0, 0x00, 0xFE, 0x00, + 0x0F, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xE0, 0x7C, 0x38, + 0x01, 0xE7, 0x00, 0x0E, 0x70, 0x00, 0xE7, 0x00, 0x00, 0x70, 0x00, 0x07, + 0x80, 0x00, 0x3E, 0x00, 0x01, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xF8, + 0x00, 0x3F, 0xE0, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x00, + 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x77, 0x80, 0x0E, 0x7C, 0x03, 0xE3, 0xFF, + 0xFC, 0x1F, 0xFF, 0x80, 0x3F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x80, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, + 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, + 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0xFC, 0x00, + 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, + 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x1E, 0xF0, 0x07, + 0x9F, 0x01, 0xF1, 0xFF, 0xFC, 0x1F, 0xFE, 0x00, 0x7F, 0x00, 0xE0, 0x00, + 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1C, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x3C, + 0x00, 0x70, 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x1C, 0x01, 0xC0, 0xE0, 0x0E, + 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x83, 0x80, 0x1C, + 0x1C, 0x00, 0xE0, 0xE0, 0x07, 0x8E, 0x00, 0x1C, 0x70, 0x00, 0xE3, 0x80, + 0x07, 0xB8, 0x00, 0x1D, 0xC0, 0x00, 0xEE, 0x00, 0x07, 0xE0, 0x00, 0x1F, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0x80, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x70, + 0x03, 0xC0, 0x0F, 0x78, 0x03, 0xE0, 0x0F, 0x78, 0x03, 0xE0, 0x0E, 0x38, + 0x07, 0xE0, 0x0E, 0x38, 0x07, 0xF0, 0x1E, 0x3C, 0x07, 0x70, 0x1E, 0x3C, + 0x07, 0x70, 0x1C, 0x1C, 0x0E, 0x70, 0x1C, 0x1C, 0x0E, 0x38, 0x3C, 0x1C, + 0x0E, 0x38, 0x3C, 0x1E, 0x1E, 0x38, 0x38, 0x0E, 0x1C, 0x38, 0x38, 0x0E, + 0x1C, 0x1C, 0x38, 0x0E, 0x1C, 0x1C, 0x78, 0x0F, 0x3C, 0x1C, 0x70, 0x07, + 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, 0x38, 0x0E, 0x70, 0x07, + 0x70, 0x0E, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, + 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x03, 0xC0, 0x01, + 0xE0, 0x03, 0xC0, 0xF0, 0x00, 0x7B, 0xC0, 0x07, 0x8F, 0x00, 0x38, 0x78, + 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x1E, 0x00, 0xF1, 0xE0, + 0x03, 0x8E, 0x00, 0x1E, 0xF0, 0x00, 0x7F, 0x00, 0x01, 0xF0, 0x00, 0x0F, + 0x80, 0x00, 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x3B, 0x80, 0x03, 0xDE, 0x00, + 0x3C, 0x78, 0x01, 0xC1, 0xC0, 0x1E, 0x0F, 0x01, 0xE0, 0x3C, 0x0E, 0x00, + 0xE0, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0x70, 0x00, 0xF7, 0x80, 0x03, 0xC0, + 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0x81, + 0xE0, 0x0F, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x07, + 0x83, 0x80, 0x07, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0F, 0x78, 0x00, 0x0E, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, + 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x70, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, + 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, + 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xF8, 0xE3, 0x8E, 0x38, 0xE3, + 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, + 0x8E, 0x38, 0xE3, 0x8F, 0xFF, 0xFC, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x60, + 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x03, 0x00, + 0x40, 0x18, 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0x60, 0x18, 0x06, + 0x00, 0xC0, 0x30, 0xFF, 0xFF, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x7F, 0xFF, 0xFC, 0x07, 0x00, 0x78, 0x03, 0xC0, 0x3F, 0x01, 0xD8, + 0x0C, 0xE0, 0xE3, 0x06, 0x1C, 0x70, 0xE3, 0x83, 0x18, 0x1D, 0xC0, 0x6C, + 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0xF0, 0xE0, 0xE0, + 0xE0, 0x07, 0xF0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0x03, 0xC7, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0xFE, 0x0F, 0xFF, 0x1F, 0xF3, + 0x9F, 0x01, 0xCF, 0x00, 0xE7, 0x00, 0x73, 0x80, 0x79, 0xE0, 0xFC, 0x7F, + 0xEF, 0x9F, 0xE3, 0xC7, 0xE1, 0xE0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE3, 0xE0, 0xEF, 0xF8, + 0xFF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, + 0xF8, 0x1E, 0xFC, 0x3C, 0xEF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0x07, 0xF0, + 0x1F, 0xF8, 0x3F, 0xFC, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x07, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x07, + 0x70, 0x07, 0x78, 0x0E, 0x7C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, + 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, + 0x1C, 0x00, 0x0E, 0x0F, 0xC7, 0x1F, 0xFB, 0x9F, 0xFF, 0xDF, 0x07, 0xEF, + 0x01, 0xF7, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, + 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x77, 0x00, 0x7B, 0xC0, 0x7D, 0xF0, + 0x7E, 0x7F, 0xFB, 0x1F, 0xF9, 0x83, 0xF0, 0xC0, 0x07, 0xE0, 0x1F, 0xF8, + 0x3F, 0xFC, 0x7C, 0x1E, 0x70, 0x0E, 0x60, 0x06, 0xE0, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x07, + 0x78, 0x0E, 0x3C, 0x1E, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, 0x0E, 0x3C, + 0xF9, 0xC3, 0x87, 0x0E, 0x7F, 0xFF, 0xFC, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, + 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0x07, 0xC7, 0x1F, + 0xF7, 0x3F, 0xFF, 0x3C, 0x3F, 0x78, 0x0F, 0x70, 0x0F, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0x70, + 0x0F, 0x78, 0x0F, 0x7C, 0x3F, 0x3F, 0xF7, 0x1F, 0xE7, 0x07, 0xC7, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x0E, 0x70, 0x0E, 0x78, 0x1E, 0x3F, 0xFC, 0x1F, + 0xF8, 0x07, 0xE0, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x71, 0xF8, 0xE7, 0xFD, 0xDF, 0xFB, 0xF0, 0xFF, + 0xC0, 0xFF, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x0F, 0xC0, 0x1C, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x1C, 0x71, 0xC7, 0x00, 0x00, 0x07, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x73, 0xFF, 0xFB, 0xC0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x3C, 0xE0, 0x78, 0xE0, 0xF0, + 0xE1, 0xE0, 0xE3, 0xC0, 0xE7, 0x80, 0xEF, 0x00, 0xEF, 0x80, 0xFF, 0x80, + 0xFB, 0xC0, 0xF1, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xE0, 0x70, 0xE0, 0x78, + 0xE0, 0x3C, 0xE0, 0x1C, 0xE0, 0x1E, 0xE0, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xE0, 0xF8, 0xE7, 0xF1, 0xFE, + 0xEF, 0xFB, 0xFE, 0xF8, 0x7F, 0x0F, 0xF0, 0x3E, 0x07, 0xF0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, 0xE0, 0x1C, 0x07, + 0xE0, 0x1C, 0x07, 0xE3, 0xF1, 0xCF, 0xFB, 0xBF, 0xF7, 0xE1, 0xFF, 0x81, + 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, + 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x38, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0x83, 0xC7, + 0x80, 0xF3, 0x80, 0x3B, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, + 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3B, 0x80, 0x39, 0xE0, 0x3C, 0x78, + 0x3C, 0x3F, 0xFE, 0x0F, 0xFE, 0x01, 0xFC, 0x00, 0xE3, 0xE0, 0xE7, 0xF8, + 0xEF, 0xFC, 0xFC, 0x3E, 0xF8, 0x1E, 0xF0, 0x0E, 0xE0, 0x0F, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, + 0xF8, 0x1E, 0xFC, 0x3E, 0xFF, 0xFC, 0xEF, 0xF8, 0xE3, 0xE0, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x07, 0xE1, + 0x8F, 0xFC, 0xCF, 0xFF, 0x67, 0x83, 0xF7, 0x80, 0xFB, 0x80, 0x3F, 0xC0, + 0x1F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, + 0x00, 0x3B, 0x80, 0x3D, 0xE0, 0x3E, 0xF8, 0x3F, 0x3F, 0xFF, 0x8F, 0xFD, + 0xC1, 0xF8, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x03, 0x80, 0xE3, 0xF7, 0xFB, 0xFF, 0x8F, 0x07, 0x83, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, + 0x38, 0x00, 0x0F, 0xC0, 0xFF, 0x87, 0xFF, 0x3C, 0x1E, 0xE0, 0x3B, 0x80, + 0x0E, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00, + 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x1F, 0x7F, 0xF8, 0xFF, 0xC1, 0xFC, 0x00, + 0x38, 0x70, 0xE1, 0xCF, 0xFF, 0xFF, 0x9C, 0x38, 0x70, 0xE1, 0xC3, 0x87, + 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xE7, 0xC7, 0x80, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xFC, + 0x0F, 0xFC, 0x3F, 0x7F, 0xEE, 0xFF, 0x9C, 0x7E, 0x38, 0x70, 0x03, 0xB8, + 0x03, 0x9C, 0x01, 0xC7, 0x00, 0xE3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x38, + 0x38, 0x38, 0x1C, 0x1C, 0x07, 0x0E, 0x03, 0x8E, 0x01, 0xC7, 0x00, 0x77, + 0x00, 0x3B, 0x80, 0x1D, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0x70, 0x00, 0xF0, 0x1C, 0x03, 0xB8, 0x1F, 0x03, 0xDC, 0x0F, 0x81, 0xCE, + 0x07, 0xC0, 0xE7, 0x83, 0xE0, 0x71, 0xC3, 0xB8, 0x70, 0xE1, 0xDC, 0x38, + 0x70, 0xEE, 0x1C, 0x1C, 0x63, 0x0E, 0x0E, 0x71, 0xCE, 0x07, 0x38, 0xE7, + 0x03, 0x9C, 0x73, 0x80, 0xEC, 0x19, 0x80, 0x7E, 0x0F, 0xC0, 0x3F, 0x07, + 0xE0, 0x0F, 0x83, 0xF0, 0x07, 0x80, 0xF0, 0x03, 0xC0, 0x78, 0x01, 0xE0, + 0x3C, 0x00, 0x70, 0x07, 0x38, 0x0E, 0x3C, 0x1C, 0x1C, 0x1C, 0x0E, 0x38, + 0x0F, 0x70, 0x07, 0x70, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x03, 0xE0, + 0x07, 0xE0, 0x07, 0x70, 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x1C, 0x38, 0x1E, + 0x78, 0x0E, 0x70, 0x07, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC7, 0x01, + 0xC3, 0x80, 0xE1, 0xC0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x3C, 0x07, + 0x1C, 0x03, 0x8E, 0x01, 0xCE, 0x00, 0x77, 0x00, 0x3B, 0x80, 0x1F, 0x80, + 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, + 0x00, 0x00, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xF0, 0x00, 0xE0, 0x03, 0x80, + 0x0E, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x07, 0x0F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0xF8, 0xE0, 0xF8, 0x38, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x0F, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0xF0, 0xF8, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1F, + 0x07, 0x1F, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0xF8, 0xF0, 0xE0, 0x38, 0x00, 0xFC, 0x03, 0xFC, 0x1F, 0x3E, + 0x3C, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00 }; + +const GFXglyph FreeSans18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' + { 0, 3, 26, 12, 4, -25 }, // 0x21 '!' + { 10, 9, 9, 12, 1, -24 }, // 0x22 '"' + { 21, 19, 24, 19, 0, -23 }, // 0x23 '#' + { 78, 16, 30, 19, 2, -26 }, // 0x24 '$' + { 138, 29, 25, 31, 1, -24 }, // 0x25 '%' + { 229, 20, 25, 23, 2, -24 }, // 0x26 '&' + { 292, 3, 9, 7, 2, -24 }, // 0x27 ''' + { 296, 8, 33, 12, 3, -25 }, // 0x28 '(' + { 329, 8, 33, 12, 1, -25 }, // 0x29 ')' + { 362, 10, 10, 14, 2, -25 }, // 0x2A '*' + { 375, 16, 16, 20, 2, -15 }, // 0x2B '+' + { 407, 3, 9, 10, 3, -3 }, // 0x2C ',' + { 411, 8, 3, 12, 2, -10 }, // 0x2D '-' + { 414, 3, 4, 9, 3, -3 }, // 0x2E '.' + { 416, 10, 26, 10, 0, -25 }, // 0x2F '/' + { 449, 16, 25, 19, 2, -24 }, // 0x30 '0' + { 499, 8, 25, 19, 4, -24 }, // 0x31 '1' + { 524, 16, 25, 19, 2, -24 }, // 0x32 '2' + { 574, 17, 25, 19, 1, -24 }, // 0x33 '3' + { 628, 16, 25, 19, 1, -24 }, // 0x34 '4' + { 678, 17, 25, 19, 1, -24 }, // 0x35 '5' + { 732, 16, 25, 19, 2, -24 }, // 0x36 '6' + { 782, 16, 25, 19, 2, -24 }, // 0x37 '7' + { 832, 17, 25, 19, 1, -24 }, // 0x38 '8' + { 886, 16, 25, 19, 1, -24 }, // 0x39 '9' + { 936, 3, 19, 9, 3, -18 }, // 0x3A ':' + { 944, 3, 24, 9, 3, -18 }, // 0x3B ';' + { 953, 17, 17, 20, 2, -16 }, // 0x3C '<' + { 990, 17, 9, 20, 2, -12 }, // 0x3D '=' + { 1010, 17, 17, 20, 2, -16 }, // 0x3E '>' + { 1047, 15, 26, 19, 3, -25 }, // 0x3F '?' + { 1096, 32, 31, 36, 1, -25 }, // 0x40 '@' + { 1220, 22, 26, 23, 1, -25 }, // 0x41 'A' + { 1292, 19, 26, 23, 3, -25 }, // 0x42 'B' + { 1354, 22, 26, 25, 1, -25 }, // 0x43 'C' + { 1426, 20, 26, 24, 3, -25 }, // 0x44 'D' + { 1491, 18, 26, 22, 3, -25 }, // 0x45 'E' + { 1550, 17, 26, 21, 3, -25 }, // 0x46 'F' + { 1606, 24, 26, 27, 1, -25 }, // 0x47 'G' + { 1684, 19, 26, 25, 3, -25 }, // 0x48 'H' + { 1746, 3, 26, 10, 4, -25 }, // 0x49 'I' + { 1756, 14, 26, 18, 1, -25 }, // 0x4A 'J' + { 1802, 20, 26, 24, 3, -25 }, // 0x4B 'K' + { 1867, 15, 26, 20, 3, -25 }, // 0x4C 'L' + { 1916, 24, 26, 30, 3, -25 }, // 0x4D 'M' + { 1994, 20, 26, 26, 3, -25 }, // 0x4E 'N' + { 2059, 25, 26, 27, 1, -25 }, // 0x4F 'O' + { 2141, 18, 26, 23, 3, -25 }, // 0x50 'P' + { 2200, 25, 28, 27, 1, -25 }, // 0x51 'Q' + { 2288, 20, 26, 25, 3, -25 }, // 0x52 'R' + { 2353, 20, 26, 23, 1, -25 }, // 0x53 'S' + { 2418, 19, 26, 22, 1, -25 }, // 0x54 'T' + { 2480, 19, 26, 25, 3, -25 }, // 0x55 'U' + { 2542, 21, 26, 23, 1, -25 }, // 0x56 'V' + { 2611, 32, 26, 33, 0, -25 }, // 0x57 'W' + { 2715, 21, 26, 23, 1, -25 }, // 0x58 'X' + { 2784, 23, 26, 24, 0, -25 }, // 0x59 'Y' + { 2859, 19, 26, 22, 1, -25 }, // 0x5A 'Z' + { 2921, 6, 33, 10, 2, -25 }, // 0x5B '[' + { 2946, 10, 26, 10, 0, -25 }, // 0x5C '\' + { 2979, 6, 33, 10, 1, -25 }, // 0x5D ']' + { 3004, 13, 13, 16, 2, -24 }, // 0x5E '^' + { 3026, 21, 2, 19, -1, 5 }, // 0x5F '_' + { 3032, 7, 5, 9, 1, -25 }, // 0x60 '`' + { 3037, 17, 19, 19, 1, -18 }, // 0x61 'a' + { 3078, 16, 26, 20, 2, -25 }, // 0x62 'b' + { 3130, 16, 19, 18, 1, -18 }, // 0x63 'c' + { 3168, 17, 26, 20, 1, -25 }, // 0x64 'd' + { 3224, 16, 19, 19, 1, -18 }, // 0x65 'e' + { 3262, 7, 26, 10, 1, -25 }, // 0x66 'f' + { 3285, 16, 27, 19, 1, -18 }, // 0x67 'g' + { 3339, 15, 26, 19, 2, -25 }, // 0x68 'h' + { 3388, 3, 26, 8, 2, -25 }, // 0x69 'i' + { 3398, 6, 34, 9, 0, -25 }, // 0x6A 'j' + { 3424, 16, 26, 18, 2, -25 }, // 0x6B 'k' + { 3476, 3, 26, 7, 2, -25 }, // 0x6C 'l' + { 3486, 24, 19, 28, 2, -18 }, // 0x6D 'm' + { 3543, 15, 19, 19, 2, -18 }, // 0x6E 'n' + { 3579, 17, 19, 19, 1, -18 }, // 0x6F 'o' + { 3620, 16, 25, 20, 2, -18 }, // 0x70 'p' + { 3670, 17, 25, 20, 1, -18 }, // 0x71 'q' + { 3724, 9, 19, 12, 2, -18 }, // 0x72 'r' + { 3746, 14, 19, 17, 2, -18 }, // 0x73 's' + { 3780, 7, 23, 10, 1, -22 }, // 0x74 't' + { 3801, 15, 19, 19, 2, -18 }, // 0x75 'u' + { 3837, 17, 19, 17, 0, -18 }, // 0x76 'v' + { 3878, 25, 19, 25, 0, -18 }, // 0x77 'w' + { 3938, 16, 19, 17, 0, -18 }, // 0x78 'x' + { 3976, 17, 27, 17, 0, -18 }, // 0x79 'y' + { 4034, 15, 19, 17, 1, -18 }, // 0x7A 'z' + { 4070, 8, 33, 12, 1, -25 }, // 0x7B '{' + { 4103, 2, 33, 9, 3, -25 }, // 0x7C '|' + { 4112, 8, 33, 12, 3, -25 }, // 0x7D '}' + { 4145, 15, 7, 18, 1, -15 } }; // 0x7E '~' + +const GFXfont FreeSans18pt7b PROGMEM = { + (uint8_t *)FreeSans18pt7bBitmaps, + (GFXglyph *)FreeSans18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 4831 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans24pt7b.h new file mode 100644 index 0000000..ff2d174 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans24pt7b.h @@ -0,0 +1,727 @@ +const uint8_t FreeSans24pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, + 0x66, 0x00, 0x0F, 0xFF, 0xFF, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xFF, 0x1F, + 0xE3, 0xFC, 0x7F, 0x8F, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x60, 0x00, 0x70, + 0x3C, 0x00, 0x70, 0x3C, 0x00, 0xF0, 0x38, 0x00, 0xF0, 0x38, 0x00, 0xF0, + 0x78, 0x00, 0xE0, 0x78, 0x00, 0xE0, 0x78, 0x01, 0xE0, 0x70, 0x01, 0xE0, + 0x70, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x03, 0xC0, + 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0xC0, 0xE0, 0x03, 0x81, 0xE0, 0x03, 0x81, + 0xE0, 0x03, 0x81, 0xE0, 0x07, 0x81, 0xC0, 0x07, 0x81, 0xC0, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x0F, 0x03, 0x80, 0x0F, 0x03, + 0x80, 0x0F, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x0E, 0x07, 0x80, 0x1E, 0x07, + 0x00, 0x1E, 0x07, 0x00, 0x1E, 0x07, 0x00, 0x1C, 0x0F, 0x00, 0x1C, 0x0F, + 0x00, 0x00, 0x38, 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xFE, + 0x01, 0xFF, 0xFE, 0x07, 0xE7, 0x3E, 0x0F, 0x8E, 0x3C, 0x3E, 0x1C, 0x3C, + 0x78, 0x38, 0x38, 0xF0, 0x70, 0x71, 0xE0, 0xE0, 0xE3, 0xC1, 0xC0, 0x07, + 0x83, 0x80, 0x0F, 0x87, 0x00, 0x0F, 0x8E, 0x00, 0x1F, 0xDC, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x03, + 0xFF, 0x80, 0x07, 0x1F, 0x80, 0x0E, 0x1F, 0x00, 0x1C, 0x1F, 0x00, 0x38, + 0x1F, 0xC0, 0x70, 0x3F, 0x80, 0xE0, 0x7F, 0x81, 0xC0, 0xFF, 0x03, 0x81, + 0xEF, 0x07, 0x07, 0x9F, 0x0E, 0x0F, 0x3E, 0x1C, 0x3E, 0x3F, 0x39, 0xF8, + 0x3F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0x80, 0x00, + 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x3F, 0xE0, 0x00, + 0xE0, 0x01, 0xFF, 0xE0, 0x03, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0x00, 0x0F, + 0x87, 0xC0, 0x1C, 0x00, 0x3C, 0x03, 0xC0, 0x38, 0x00, 0x70, 0x03, 0x80, + 0xE0, 0x00, 0xE0, 0x07, 0x03, 0xC0, 0x01, 0xC0, 0x0E, 0x07, 0x00, 0x03, + 0x80, 0x1C, 0x1E, 0x00, 0x07, 0x80, 0x78, 0x38, 0x00, 0x07, 0xC3, 0xE0, + 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xC0, 0x00, 0x0F, 0xFF, 0x07, 0x80, 0x00, + 0x0F, 0xFC, 0x0E, 0x00, 0x00, 0x07, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x3F, 0x00, 0x00, 0x03, 0x80, 0xFF, + 0x80, 0x00, 0x0E, 0x07, 0xFF, 0x80, 0x00, 0x3C, 0x0F, 0xFF, 0x80, 0x00, + 0x70, 0x3E, 0x1F, 0x00, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x03, 0x81, 0xC0, + 0x0E, 0x00, 0x0F, 0x03, 0x80, 0x1C, 0x00, 0x1C, 0x07, 0x00, 0x38, 0x00, + 0x78, 0x0E, 0x00, 0x70, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x03, 0x80, 0x1F, + 0x0F, 0x80, 0x07, 0x00, 0x1F, 0xFF, 0x00, 0x1C, 0x00, 0x3F, 0xFC, 0x00, + 0x38, 0x00, 0x1F, 0xF0, 0x00, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, + 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xFC, 0x00, 0x07, + 0xC3, 0xC0, 0x00, 0xF8, 0x1E, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E, + 0x00, 0x0F, 0x00, 0xE0, 0x00, 0xF0, 0x0E, 0x00, 0x07, 0x81, 0xE0, 0x00, + 0x7C, 0x3C, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0x1E, 0x07, 0x83, 0xE0, 0xF0, 0x78, 0x7C, 0x0F, 0x8F, 0x87, 0x80, + 0x7C, 0xF0, 0xF0, 0x03, 0xFF, 0x0F, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0xFE, + 0x0F, 0x00, 0x0F, 0xC0, 0xF0, 0x00, 0x7E, 0x0F, 0x80, 0x0F, 0xF0, 0x7C, + 0x01, 0xFF, 0x07, 0xF0, 0x7D, 0xF8, 0x3F, 0xFF, 0x8F, 0xC1, 0xFF, 0xF0, + 0x7E, 0x0F, 0xFE, 0x03, 0xE0, 0x3F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF6, 0x66, 0x01, 0xC0, 0x70, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78, + 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x70, 0x3C, + 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, + 0xC0, 0x70, 0x1E, 0x07, 0x81, 0xE0, 0x38, 0x0F, 0x03, 0xC0, 0x70, 0x1E, + 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x18, 0x07, 0xE0, 0x38, 0x07, + 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0E, 0x03, 0x80, 0xF0, 0x1C, + 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x03, 0x80, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0x81, 0xE0, 0x78, + 0x1E, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0xE0, 0x38, + 0x1C, 0x06, 0x03, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x63, + 0x1B, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x07, 0x80, 0x3F, 0x01, 0xCE, 0x07, + 0x3C, 0x38, 0x70, 0x21, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xF3, + 0x33, 0x36, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, + 0x00, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x07, 0x00, 0x30, 0x03, 0x80, + 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0E, + 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0xE0, 0x07, 0x00, + 0x30, 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x06, 0x00, 0x70, 0x03, 0x80, 0x18, + 0x01, 0xC0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0xFC, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x87, 0xE0, 0xF8, + 0x07, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x79, 0xE0, 0x01, + 0xE7, 0x80, 0x07, 0xBC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, + 0xDE, 0x00, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x01, 0xE7, 0xC0, 0x0F, 0x8F, + 0x00, 0x3C, 0x3E, 0x01, 0xF0, 0x7C, 0x1F, 0x81, 0xFF, 0xFE, 0x03, 0xFF, + 0xF0, 0x03, 0xFF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x60, 0x1C, 0x03, 0x80, + 0xF0, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3C, 0x07, 0x80, 0xF0, + 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x01, 0xFF, + 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0x03, 0xF9, 0xF0, 0x03, 0xE7, 0x80, 0x07, + 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, + 0x7C, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xC0, + 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, + 0xF0, 0x1F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, 0x3C, 0x00, 0x1E, 0x78, + 0x00, 0x3C, 0xF0, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F, + 0xE0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x03, + 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xE7, 0xC0, 0x07, 0xC7, + 0xE0, 0x3F, 0x0F, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x03, + 0xFC, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0xE0, 0x00, 0x7B, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x00, 0x0F, 0x1E, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x03, 0xC0, 0xF0, 0x07, 0x81, 0xE0, + 0x1E, 0x03, 0xC0, 0x78, 0x07, 0x81, 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F, + 0x00, 0x3C, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF, 0xC1, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x1F, 0x3F, 0x80, 0x7B, 0xFF, + 0x81, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x1F, 0x80, 0xFC, 0x78, 0x01, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF1, 0xFC, 0x0F, 0xC3, + 0xFF, 0xFE, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x1F, 0x83, + 0xF0, 0xF8, 0x07, 0xC3, 0xC0, 0x0F, 0x8F, 0x00, 0x1E, 0x78, 0x00, 0x79, + 0xE0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0xFE, 0x03, 0xCF, + 0xFE, 0x0F, 0x7F, 0xFE, 0x3F, 0xFF, 0xFC, 0xFF, 0x03, 0xF3, 0xF0, 0x03, + 0xEF, 0x80, 0x07, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x70, 0x00, 0x3D, 0xC0, 0x00, 0xF7, 0x80, + 0x07, 0x9F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0xFC, 0x0F, 0xC1, 0xFF, 0xFE, + 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, + 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, + 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xFF, 0xFC, 0x07, 0xFF, 0xF8, 0x3F, + 0x03, 0xF1, 0xF0, 0x03, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0x78, 0x00, + 0x79, 0xE0, 0x01, 0xE7, 0x80, 0x0F, 0x8F, 0x00, 0x3C, 0x3F, 0x03, 0xF0, + 0x7F, 0xFF, 0x80, 0x7F, 0xF8, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0xFC, + 0x0F, 0xC7, 0xC0, 0x0F, 0x9E, 0x00, 0x1E, 0xF8, 0x00, 0x7F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x80, 0x07, 0xDE, 0x00, 0x1E, 0x7C, 0x00, 0xF8, 0xFC, 0x0F, 0xC3, 0xFF, + 0xFF, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0x80, 0x07, 0xF8, 0x00, 0x01, 0xFC, + 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xF0, 0x7E, 0x3E, + 0x00, 0xF1, 0xE0, 0x07, 0xCF, 0x00, 0x1E, 0xF0, 0x00, 0x77, 0x80, 0x03, + 0xBC, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, + 0x03, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF9, 0xF8, 0x3F, 0xCF, 0xFF, 0xFE, + 0x3F, 0xFE, 0xF0, 0xFF, 0xE7, 0x80, 0xFC, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x9E, 0x00, 0x3C, 0xF0, 0x03, 0xC7, + 0xC0, 0x3E, 0x1F, 0x03, 0xE0, 0xFF, 0xFE, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF3, 0x33, 0x36, 0xEC, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xC0, + 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x80, 0x03, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF0, + 0x00, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x3F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0xC0, 0x03, 0xFC, 0x00, 0x1F, + 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, + 0x0F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x7E, 0x0F, 0xE7, 0x80, + 0x3E, 0x78, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, + 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFC, 0x03, 0xFF, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7E, + 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00, + 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x3C, 0x00, 0x7E, 0x00, + 0x3E, 0x0F, 0x00, 0x3F, 0xE3, 0xC3, 0xE3, 0xE0, 0x1F, 0xFE, 0x78, 0x3C, + 0x78, 0x07, 0xE1, 0xFF, 0x07, 0xDF, 0x01, 0xF0, 0x1F, 0xC0, 0xFB, 0xC0, + 0x7C, 0x01, 0xF8, 0x0F, 0x78, 0x0F, 0x00, 0x3F, 0x01, 0xEF, 0x03, 0xC0, + 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x00, 0xF8, 0x07, 0xF8, 0x0F, 0x00, 0x1F, + 0x00, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x1F, 0xE0, 0x78, 0x00, 0x78, 0x07, + 0xFC, 0x0F, 0x00, 0x1F, 0x00, 0xF7, 0x81, 0xE0, 0x03, 0xC0, 0x1E, 0xF0, + 0x3C, 0x00, 0x78, 0x07, 0x9E, 0x07, 0x80, 0x1F, 0x01, 0xF3, 0xE0, 0xF8, + 0x07, 0xC0, 0x3C, 0x3C, 0x0F, 0x81, 0xF8, 0x0F, 0x87, 0x81, 0xF8, 0x7F, + 0x87, 0xE0, 0xF8, 0x1F, 0xFE, 0xFF, 0xF8, 0x0F, 0x01, 0xFF, 0x1F, 0xFC, + 0x01, 0xF0, 0x0F, 0x80, 0xFE, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, + 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xF7, 0xC0, 0x00, 0x03, + 0xDF, 0x00, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x78, 0xF8, 0x00, 0x01, 0xE3, + 0xE0, 0x00, 0x0F, 0x87, 0x80, 0x00, 0x3C, 0x1F, 0x00, 0x01, 0xF0, 0x7C, + 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E, 0x03, 0xE0, 0x00, 0xF8, 0x0F, 0x80, + 0x03, 0xC0, 0x1E, 0x00, 0x0F, 0x00, 0x7C, 0x00, 0x7C, 0x01, 0xF0, 0x01, + 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFE, 0x00, 0xFF, + 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x07, 0xC0, 0x78, 0x00, + 0x0F, 0x83, 0xE0, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x01, + 0xF1, 0xF0, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x3E, + 0xF8, 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xE0, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0x0F, 0x00, 0x0F, 0xC7, + 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF9, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E, + 0x78, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x9E, 0x00, 0x07, 0x8F, 0x00, 0x03, + 0xC7, 0x80, 0x07, 0xC3, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, + 0xF8, 0x7F, 0xFF, 0xFE, 0x3C, 0x00, 0x0F, 0x9E, 0x00, 0x03, 0xEF, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, + 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x01, 0xFF, + 0x00, 0x01, 0xF7, 0x80, 0x01, 0xFB, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF8, + 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFE, 0x01, + 0xF8, 0x07, 0xC0, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3C, + 0x3C, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x07, 0x9E, 0x00, 0x00, 0x3C, 0xF0, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, 0x78, 0x00, + 0x00, 0x7B, 0xC0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x3C, 0x78, 0x00, 0x01, + 0xE3, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x81, + 0xFE, 0x03, 0xF8, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xF8, 0x00, 0x3F, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFE, + 0x03, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F, 0x00, 0x0F, 0xE1, 0xE0, + 0x00, 0x7E, 0x3C, 0x00, 0x07, 0xE7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x0F, 0x78, 0x00, 0x01, 0xEF, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, + 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF7, + 0x80, 0x00, 0x1E, 0xF0, 0x00, 0x03, 0xDE, 0x00, 0x00, 0xFB, 0xC0, 0x00, + 0x3E, 0x78, 0x00, 0x0F, 0xCF, 0x00, 0x03, 0xF1, 0xE0, 0x01, 0xFC, 0x3F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFE, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 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, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0x80, 0x7F, + 0x01, 0xF8, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x1F, 0x0F, 0x80, 0x00, 0x1E, + 0x3E, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x3D, 0xF0, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0x00, + 0x07, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x07, 0xBC, 0x00, + 0x00, 0x0F, 0x78, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7D, 0xF0, 0x00, + 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xF3, 0xF0, 0x00, 0x07, 0xE3, 0xF0, 0x00, + 0x1F, 0xC3, 0xF0, 0x00, 0xFF, 0x83, 0xFC, 0x07, 0xEF, 0x03, 0xFF, 0xFF, + 0x9E, 0x03, 0xFF, 0xFE, 0x1C, 0x01, 0xFF, 0xF0, 0x38, 0x00, 0x7F, 0x80, + 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, + 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, + 0x07, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xF0, 0x0F, 0x9F, 0x83, 0xF1, 0xFF, + 0xFC, 0x3F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x7C, 0x78, 0x00, 0x1F, 0x0F, 0x00, + 0x07, 0xC1, 0xE0, 0x01, 0xF0, 0x3C, 0x00, 0x7C, 0x07, 0x80, 0x1F, 0x00, + 0xF0, 0x07, 0xC0, 0x1E, 0x01, 0xF0, 0x03, 0xC0, 0x7C, 0x00, 0x78, 0x1F, + 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE1, 0xF0, 0x00, 0x3C, 0x7E, 0x00, 0x07, + 0x9F, 0xE0, 0x00, 0xF7, 0xFE, 0x00, 0x1F, 0xF7, 0xC0, 0x03, 0xFC, 0x7C, + 0x00, 0x7F, 0x07, 0xC0, 0x0F, 0xC0, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x3C, + 0x00, 0xF8, 0x07, 0x80, 0x1F, 0x80, 0xF0, 0x01, 0xF0, 0x1E, 0x00, 0x1F, + 0x03, 0xC0, 0x03, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x03, 0xE1, 0xE0, + 0x00, 0x3E, 0x3C, 0x00, 0x07, 0xC7, 0x80, 0x00, 0x7C, 0xF0, 0x00, 0x07, + 0xDE, 0x00, 0x00, 0xFC, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x00, + 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x7F, 0xFE, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0xFF, 0xF7, 0x00, 0x00, 0xEF, 0xF7, 0x80, 0x01, 0xEF, 0xF7, 0x80, + 0x01, 0xEF, 0xF3, 0xC0, 0x01, 0xCF, 0xF3, 0xC0, 0x03, 0xCF, 0xF3, 0xC0, + 0x03, 0xCF, 0xF1, 0xE0, 0x03, 0x8F, 0xF1, 0xE0, 0x07, 0x8F, 0xF1, 0xE0, + 0x07, 0x8F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, 0x0F, 0x0F, 0xF0, 0xF0, + 0x0F, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78, 0x1E, 0x0F, 0xF0, 0x78, + 0x1E, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C, 0x3C, 0x0F, 0xF0, 0x3C, + 0x3C, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x1E, 0x78, 0x0F, 0xF0, 0x0E, + 0x78, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x07, + 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x03, + 0xE0, 0x0F, 0xF8, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x3F, + 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0xF8, 0x00, + 0x3F, 0xDE, 0x00, 0x0F, 0xF7, 0xC0, 0x03, 0xFC, 0xF8, 0x00, 0xFF, 0x1E, + 0x00, 0x3F, 0xC7, 0xC0, 0x0F, 0xF0, 0xF0, 0x03, 0xFC, 0x3E, 0x00, 0xFF, + 0x07, 0xC0, 0x3F, 0xC0, 0xF0, 0x0F, 0xF0, 0x3E, 0x03, 0xFC, 0x07, 0xC0, + 0xFF, 0x00, 0xF0, 0x3F, 0xC0, 0x3E, 0x0F, 0xF0, 0x07, 0x83, 0xFC, 0x01, + 0xF0, 0xFF, 0x00, 0x3E, 0x3F, 0xC0, 0x07, 0x8F, 0xF0, 0x01, 0xF3, 0xFC, + 0x00, 0x3E, 0xFF, 0x00, 0x07, 0xBF, 0xC0, 0x01, 0xFF, 0xF0, 0x00, 0x3F, + 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, + 0x0F, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, + 0x80, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80, + 0xFF, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00, + 0x00, 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00, + 0x00, 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F, + 0x3E, 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0x07, 0x87, 0xC0, 0x00, 0x07, + 0xC1, 0xF0, 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0x3F, 0x00, 0x07, + 0xE0, 0x0F, 0xF0, 0x1F, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, + 0xFE, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, + 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x3E, 0xF0, 0x00, 0xFE, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, + 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xFF, + 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x03, 0xF0, 0x3E, 0x00, 0x00, + 0xF8, 0x3E, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x00, + 0x07, 0xCF, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0xF7, 0xC0, 0x00, + 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x00, + 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x0F, 0x3E, + 0x00, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0x87, 0x87, 0xC0, 0x03, 0xE7, 0xC1, + 0xF0, 0x00, 0xFF, 0xC0, 0xFC, 0x00, 0x3F, 0xE0, 0x3F, 0x00, 0x0F, 0xE0, + 0x0F, 0xF0, 0x1F, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xC7, 0xC0, 0x01, 0xFF, 0x01, 0xE0, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, 0x3F, 0x3C, 0x00, 0x07, + 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC, 0x00, + 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E, 0xF0, 0x00, 0x07, 0xBC, + 0x00, 0x03, 0xCF, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0xF8, 0xFF, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0xF0, 0x00, + 0x3F, 0x3C, 0x00, 0x03, 0xCF, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x1E, 0xF0, + 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x1E, + 0xF0, 0x00, 0x07, 0xBC, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x7B, 0xC0, 0x00, + 0x1E, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xC0, 0x00, + 0x7F, 0xFF, 0x00, 0x1F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x81, 0xF8, 0x07, + 0xF0, 0x7C, 0x00, 0x1F, 0x0F, 0x00, 0x01, 0xE3, 0xE0, 0x00, 0x3E, 0x78, + 0x00, 0x03, 0xCF, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, + 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0xF8, + 0x00, 0x03, 0xFF, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x3E, 0xF8, 0x00, + 0x07, 0x9F, 0x80, 0x01, 0xF1, 0xFE, 0x01, 0xFC, 0x1F, 0xFF, 0xFF, 0x01, + 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x7D, 0xE0, 0x00, 0x1E, 0x7C, 0x00, 0x0F, 0x9F, + 0x80, 0x07, 0xE3, 0xF8, 0x07, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, + 0x00, 0xFF, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0xF7, 0xC0, + 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x03, 0xC7, 0xC0, 0x00, + 0x3E, 0x1E, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8, + 0x1E, 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3C, 0x07, 0xC0, 0x03, 0xE0, 0x1E, + 0x00, 0x1F, 0x00, 0xF8, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00, + 0x7C, 0x00, 0xF8, 0x03, 0xC0, 0x03, 0xC0, 0x1E, 0x00, 0x1F, 0x01, 0xF0, + 0x00, 0xF8, 0x0F, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x1F, 0x07, 0x80, 0x00, + 0xF8, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x78, + 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x1F, 0x78, 0x00, 0x00, 0x7B, 0xC0, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x01, 0xFF, 0x80, 0x03, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFC, 0x00, 0x1E, 0x7C, 0x00, 0x7F, 0x80, + 0x0F, 0x9F, 0x00, 0x1F, 0xE0, 0x03, 0xE7, 0xC0, 0x07, 0xF8, 0x00, 0xF8, + 0xF0, 0x01, 0xFF, 0x00, 0x3C, 0x3E, 0x00, 0xF3, 0xC0, 0x1F, 0x0F, 0x80, + 0x3C, 0xF0, 0x07, 0xC3, 0xE0, 0x0F, 0x3C, 0x01, 0xF0, 0x78, 0x07, 0xC7, + 0x80, 0x78, 0x1F, 0x01, 0xE1, 0xE0, 0x1E, 0x07, 0xC0, 0x78, 0x78, 0x0F, + 0x80, 0xF0, 0x1E, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0xF0, 0x0F, + 0x83, 0xC0, 0xF0, 0x3C, 0x03, 0xE0, 0xF0, 0x3C, 0x1F, 0x00, 0x78, 0x3C, + 0x0F, 0x87, 0xC0, 0x1E, 0x1E, 0x01, 0xE1, 0xE0, 0x07, 0x87, 0x80, 0x78, + 0x78, 0x01, 0xF1, 0xE0, 0x1E, 0x1E, 0x00, 0x3C, 0xF8, 0x03, 0xCF, 0x80, + 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF0, 0x00, 0xFB, + 0xC0, 0x0F, 0xBC, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00, + 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xF8, + 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x00, + 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x01, 0xF3, 0xF0, 0x00, 0x1F, 0x8F, 0x80, 0x00, 0xF8, 0x3E, 0x00, 0x0F, + 0x80, 0xF8, 0x00, 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x00, + 0x7C, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x3E, + 0x3E, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x1F, 0xF0, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x07, + 0xDF, 0x00, 0x00, 0x7C, 0x78, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x3E, 0x0F, + 0x80, 0x03, 0xE0, 0x3E, 0x00, 0x1F, 0x01, 0xF0, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0x3F, 0x00, 0xF8, 0x00, 0xF8, 0x0F, 0x80, 0x03, 0xE0, 0xF8, + 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7C, 0x7C, 0x00, 0x01, 0xF7, 0xC0, 0x00, + 0x0F, 0xC0, 0xFC, 0x00, 0x00, 0xFD, 0xF0, 0x00, 0x03, 0xE7, 0xE0, 0x00, + 0x1F, 0x0F, 0x80, 0x00, 0x7C, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x1F, + 0x00, 0xF8, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x0F, 0x80, 0x7C, 0x00, 0x1E, 0x01, 0xE0, 0x00, 0x7C, 0x0F, 0x80, 0x00, + 0xF8, 0x7C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F, + 0x3C, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0, 0x07, 0x00, 0x18, 0x00, 0xE0, + 0x07, 0x00, 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x07, 0x00, + 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x06, 0x00, 0x38, 0x01, + 0xC0, 0x06, 0x00, 0x38, 0x01, 0xC0, 0x06, 0x00, 0x30, 0x01, 0xC0, 0x0E, + 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3F, + 0x00, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xCE, 0x00, 0x73, 0x80, 0x3C, 0x70, + 0x0E, 0x1C, 0x07, 0x87, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x07, 0x0E, + 0x01, 0xC7, 0x80, 0x79, 0xC0, 0x0E, 0x70, 0x03, 0xB8, 0x00, 0x70, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0x00, 0xE0, 0x1C, 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xE0, + 0x3F, 0xFF, 0xF0, 0x7E, 0x03, 0xF8, 0x7C, 0x00, 0xF8, 0x78, 0x00, 0x78, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, + 0x00, 0x03, 0xF8, 0x00, 0xFF, 0xF8, 0x0F, 0xFF, 0xF8, 0x3F, 0xFE, 0x78, + 0x7F, 0x80, 0x78, 0xFC, 0x00, 0x78, 0xF8, 0x00, 0x78, 0xF0, 0x00, 0x78, + 0xF0, 0x00, 0xF8, 0xF0, 0x00, 0xF8, 0xF8, 0x03, 0xF8, 0x7E, 0x0F, 0xF8, + 0x7F, 0xFF, 0x7F, 0x3F, 0xFE, 0x3F, 0x1F, 0xFC, 0x3F, 0x07, 0xE0, 0x1F, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x7E, + 0x03, 0xC7, 0xFE, 0x0F, 0x7F, 0xFC, 0x3D, 0xFF, 0xF8, 0xFF, 0x07, 0xF3, + 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0, + 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF, + 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0, + 0x7F, 0x3B, 0xFF, 0xF8, 0xE7, 0xFF, 0xC3, 0x8F, 0xFE, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, + 0xF0, 0x3F, 0x1F, 0x00, 0xF9, 0xF0, 0x03, 0xCF, 0x00, 0x0F, 0x78, 0x00, + 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x1E, 0x00, 0x1E, 0xF0, 0x00, 0xF7, 0xC0, 0x0F, 0x9F, 0x00, 0xF8, 0xFC, + 0x0F, 0xC3, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x3F, 0xFC, 0x00, 0x7F, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, + 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x01, + 0xFC, 0x1E, 0x0F, 0xFE, 0x3C, 0x3F, 0xFF, 0x78, 0xFF, 0xFF, 0xF3, 0xF8, + 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00, + 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7, + 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xF7, 0x0F, 0xFF, 0xCE, 0x0F, + 0xFF, 0x1C, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0xFF, + 0xFC, 0x07, 0xFF, 0xF8, 0x1F, 0x83, 0xF0, 0xF8, 0x07, 0xC7, 0xC0, 0x0F, + 0x9E, 0x00, 0x1E, 0x78, 0x00, 0x7B, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x1E, + 0x7C, 0x00, 0x78, 0xF8, 0x03, 0xE3, 0xF0, 0x3F, 0x07, 0xFF, 0xF8, 0x0F, + 0xFF, 0xE0, 0x1F, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x03, 0xC3, 0xF0, 0xFC, + 0x7F, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x3F, 0xFF, 0xFF, 0xFF, 0x1E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, + 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, + 0x1E, 0x07, 0x80, 0x00, 0xFC, 0x00, 0x1F, 0xF8, 0xF0, 0xFF, 0xFB, 0xC7, + 0xFF, 0xFF, 0x3F, 0x83, 0xFC, 0xF8, 0x07, 0xF7, 0xC0, 0x0F, 0xDE, 0x00, + 0x1F, 0x78, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, + 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, + 0x00, 0x3F, 0xC0, 0x00, 0xF7, 0x80, 0x07, 0xDE, 0x00, 0x1F, 0x7C, 0x00, + 0xFC, 0xF8, 0x07, 0xF3, 0xF8, 0x3F, 0xC7, 0xFF, 0xEF, 0x0F, 0xFF, 0x3C, + 0x1F, 0xF8, 0xF0, 0x1F, 0x83, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x79, 0xE0, + 0x01, 0xE7, 0xC0, 0x0F, 0x8F, 0x80, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, + 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0x80, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0xFE, 0x1E, 0x3F, 0xE3, 0xCF, 0xFF, 0x7B, 0xFF, 0xEF, 0xF0, + 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, 0xF8, 0x01, 0xFE, 0x00, + 0x3F, 0xC0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, + 0x7F, 0x80, 0x0F, 0xF0, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF8, 0x00, + 0xFF, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x80, 0x0F, 0xF0, 0x01, + 0xFE, 0x00, 0x3C, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, + 0xFF, 0xFE, 0xFE, 0xF8, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x1F, 0x3C, 0x01, 0xF1, 0xE0, 0x1F, 0x0F, + 0x01, 0xF0, 0x78, 0x1F, 0x03, 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0xF1, 0xF0, + 0x07, 0x9F, 0x00, 0x3D, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x7F, + 0x7C, 0x03, 0xF1, 0xF0, 0x1F, 0x07, 0xC0, 0xF0, 0x3E, 0x07, 0x80, 0xF8, + 0x3C, 0x03, 0xC1, 0xE0, 0x1F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0, + 0x0F, 0x9E, 0x00, 0x3C, 0xF0, 0x01, 0xF7, 0x80, 0x07, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x03, 0xF0, 0xE3, 0xFE, 0x0F, 0xFC, 0xE7, + 0xFF, 0x1F, 0xFE, 0xEF, 0xFF, 0xBF, 0xFE, 0xFE, 0x0F, 0xF8, 0x3F, 0xFC, + 0x07, 0xF0, 0x1F, 0xF8, 0x03, 0xE0, 0x0F, 0xF8, 0x03, 0xE0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, + 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0xF0, 0x03, 0xC0, 0x0F, 0x00, + 0x7E, 0x0E, 0x1F, 0xF8, 0xE7, 0xFF, 0xCE, 0xFF, 0xFE, 0xEF, 0x07, 0xFF, + 0xE0, 0x1F, 0xFC, 0x01, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, + 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xFF, 0x00, 0x0F, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, 0x3F, 0xFF, + 0x80, 0xFF, 0xFF, 0x83, 0xF8, 0x3F, 0x87, 0xC0, 0x1F, 0x1F, 0x00, 0x1F, + 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, + 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, + 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xF3, 0xC0, + 0x01, 0xE7, 0xC0, 0x07, 0xC7, 0xC0, 0x1F, 0x0F, 0xE0, 0xFE, 0x0F, 0xFF, + 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFE, + 0x03, 0x8F, 0xFE, 0x0E, 0x7F, 0xFC, 0x3B, 0xFF, 0xF8, 0xFF, 0x87, 0xF3, + 0xF8, 0x07, 0xCF, 0xC0, 0x0F, 0xBE, 0x00, 0x1E, 0xF8, 0x00, 0x7B, 0xE0, + 0x01, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x01, 0xFF, + 0x80, 0x07, 0xBE, 0x00, 0x1E, 0xFC, 0x00, 0xFB, 0xF8, 0x07, 0xCF, 0xF0, + 0x7F, 0x3F, 0xFF, 0xF8, 0xF7, 0xFF, 0xC3, 0xC7, 0xFE, 0x0F, 0x07, 0xE0, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x00, 0x07, 0xFF, 0x1C, 0x3F, 0xFF, 0x38, 0xFF, 0xFF, 0x73, 0xF8, + 0x3F, 0xE7, 0xC0, 0x1F, 0xDF, 0x00, 0x1F, 0xBE, 0x00, 0x1F, 0x78, 0x00, + 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, + 0xF0, 0x00, 0x7D, 0xE0, 0x00, 0xFB, 0xC0, 0x01, 0xF7, 0xC0, 0x07, 0xE7, + 0xC0, 0x1F, 0xCF, 0xE0, 0xFF, 0x8F, 0xFF, 0xEF, 0x0F, 0xFF, 0xDE, 0x0F, + 0xFE, 0x3C, 0x07, 0xF0, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0xFE, 0x1F, 0xE7, 0xFE, 0xFF, 0xFF, 0x8F, + 0xC0, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x01, 0xFC, 0x00, 0xFF, 0xF0, + 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3E, 0x07, 0xE7, 0xC0, 0x3E, 0x78, 0x01, + 0xE7, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xFC, + 0x00, 0x1F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x03, 0xFE, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, + 0x80, 0x1F, 0x7E, 0x07, 0xE7, 0xFF, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, 0xF0, + 0x03, 0xFC, 0x00, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x8F, 0xFF, + 0xFF, 0xFF, 0xC7, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, + 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, 0x07, 0x81, + 0xE0, 0x78, 0x1F, 0xC7, 0xF0, 0xFC, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, + 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, + 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0xFF, 0x00, 0x1F, 0xF0, 0x01, 0xFF, 0x00, 0x3F, 0xF8, 0x07, 0xFF, + 0xE0, 0xFF, 0x7F, 0xFF, 0x77, 0xFF, 0xE7, 0x1F, 0xFC, 0x70, 0x7E, 0x00, + 0x78, 0x00, 0x3E, 0xF0, 0x00, 0x79, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xE3, + 0xC0, 0x07, 0x87, 0xC0, 0x0F, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0x78, 0x1F, + 0x01, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x7C, 0x1F, 0x00, 0x78, + 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, + 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x0F, 0x70, 0x00, 0x0F, 0xE0, + 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, + 0xF8, 0x03, 0xE0, 0x07, 0x9E, 0x00, 0xFC, 0x01, 0xE7, 0x80, 0x3F, 0x00, + 0x79, 0xF0, 0x0F, 0xC0, 0x3E, 0x3C, 0x07, 0xF0, 0x0F, 0x0F, 0x01, 0xFE, + 0x03, 0xC3, 0xC0, 0x7F, 0x80, 0xF0, 0x78, 0x1D, 0xE0, 0x78, 0x1E, 0x0F, + 0x38, 0x1E, 0x07, 0x83, 0xCF, 0x07, 0x81, 0xE0, 0xF3, 0xC1, 0xE0, 0x3C, + 0x38, 0xF0, 0xF0, 0x0F, 0x1E, 0x1C, 0x3C, 0x03, 0xC7, 0x87, 0x8F, 0x00, + 0x71, 0xE1, 0xE3, 0x80, 0x1E, 0x70, 0x79, 0xE0, 0x07, 0xBC, 0x0E, 0x78, + 0x01, 0xEF, 0x03, 0xDE, 0x00, 0x3B, 0xC0, 0xF7, 0x00, 0x0F, 0xE0, 0x3F, + 0xC0, 0x03, 0xF8, 0x07, 0xF0, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x1F, 0x80, + 0x7E, 0x00, 0x07, 0xC0, 0x1F, 0x80, 0x01, 0xF0, 0x03, 0xC0, 0x00, 0x7C, + 0x00, 0x78, 0xF0, 0x03, 0xE1, 0xE0, 0x0F, 0x07, 0xC0, 0x78, 0x0F, 0x03, + 0xE0, 0x1E, 0x0F, 0x00, 0x7C, 0x78, 0x00, 0xF3, 0xE0, 0x01, 0xEF, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x1E, + 0x00, 0x78, 0x7C, 0x03, 0xE0, 0xF0, 0x0F, 0x03, 0xE0, 0x78, 0x07, 0xC3, + 0xE0, 0x0F, 0x1F, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78, 0x00, 0x3D, 0xE0, + 0x01, 0xF7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0xF0, 0xF0, 0x03, + 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x78, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x3C, 0x03, 0xC0, 0xF0, 0x07, 0x87, 0xC0, 0x1E, 0x1E, 0x00, 0x78, + 0x78, 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0xE0, + 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, + 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, + 0x00, 0x01, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x00, + 0x3F, 0xC0, 0x00, 0xFE, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xF7, + 0xFF, 0xFF, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0x00, 0x01, 0xE0, 0x00, 0x3E, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, + 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xE0, 0xFC, 0x1F, 0x87, 0x80, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, + 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0x3C, 0x03, 0x80, + 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, + 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xFC, 0x1F, 0x80, + 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F, 0x83, 0xF0, 0x0F, 0x00, + 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0, 0x3E, 0x03, + 0xC0, 0x78, 0x1F, 0x07, 0x80, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x70, 0x1E, 0x1F, 0x83, 0xF0, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0xF0, 0x0D, + 0xFF, 0x01, 0xF0, 0xF8, 0x7C, 0x0F, 0xFD, 0x80, 0x7F, 0x80, 0x03, 0xE0 }; + +const GFXglyph FreeSans24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 4, 34, 16, 6, -33 }, // 0x21 '!' + { 17, 11, 12, 16, 2, -32 }, // 0x22 '"' + { 34, 24, 33, 26, 1, -31 }, // 0x23 '#' + { 133, 23, 41, 26, 1, -34 }, // 0x24 '$' + { 251, 39, 34, 42, 1, -32 }, // 0x25 '%' + { 417, 28, 34, 31, 2, -32 }, // 0x26 '&' + { 536, 4, 12, 9, 2, -32 }, // 0x27 ''' + { 542, 10, 44, 16, 3, -33 }, // 0x28 '(' + { 597, 10, 44, 16, 2, -33 }, // 0x29 ')' + { 652, 14, 14, 18, 2, -33 }, // 0x2A '*' + { 677, 23, 22, 27, 2, -21 }, // 0x2B '+' + { 741, 4, 12, 13, 4, -4 }, // 0x2C ',' + { 747, 11, 4, 16, 2, -14 }, // 0x2D '-' + { 753, 4, 5, 12, 4, -4 }, // 0x2E '.' + { 756, 13, 35, 13, 0, -33 }, // 0x2F '/' + { 813, 22, 34, 26, 2, -32 }, // 0x30 '0' + { 907, 11, 33, 26, 5, -32 }, // 0x31 '1' + { 953, 22, 33, 26, 2, -32 }, // 0x32 '2' + { 1044, 23, 34, 26, 1, -32 }, // 0x33 '3' + { 1142, 23, 33, 26, 1, -32 }, // 0x34 '4' + { 1237, 22, 34, 26, 2, -32 }, // 0x35 '5' + { 1331, 22, 34, 26, 2, -32 }, // 0x36 '6' + { 1425, 21, 33, 26, 2, -32 }, // 0x37 '7' + { 1512, 22, 34, 26, 2, -32 }, // 0x38 '8' + { 1606, 21, 34, 26, 2, -32 }, // 0x39 '9' + { 1696, 4, 25, 12, 4, -24 }, // 0x3A ':' + { 1709, 4, 32, 12, 4, -24 }, // 0x3B ';' + { 1725, 23, 23, 27, 2, -22 }, // 0x3C '<' + { 1792, 23, 12, 27, 2, -16 }, // 0x3D '=' + { 1827, 23, 23, 27, 2, -22 }, // 0x3E '>' + { 1894, 20, 35, 26, 4, -34 }, // 0x3F '?' + { 1982, 43, 42, 48, 2, -34 }, // 0x40 '@' + { 2208, 30, 34, 31, 1, -33 }, // 0x41 'A' + { 2336, 25, 34, 31, 4, -33 }, // 0x42 'B' + { 2443, 29, 36, 33, 2, -34 }, // 0x43 'C' + { 2574, 27, 34, 33, 4, -33 }, // 0x44 'D' + { 2689, 24, 34, 30, 4, -33 }, // 0x45 'E' + { 2791, 22, 34, 28, 4, -33 }, // 0x46 'F' + { 2885, 31, 36, 36, 2, -34 }, // 0x47 'G' + { 3025, 26, 34, 34, 4, -33 }, // 0x48 'H' + { 3136, 4, 34, 13, 5, -33 }, // 0x49 'I' + { 3153, 19, 35, 25, 2, -33 }, // 0x4A 'J' + { 3237, 27, 34, 32, 4, -33 }, // 0x4B 'K' + { 3352, 21, 34, 26, 4, -33 }, // 0x4C 'L' + { 3442, 32, 34, 40, 4, -33 }, // 0x4D 'M' + { 3578, 26, 34, 34, 4, -33 }, // 0x4E 'N' + { 3689, 33, 36, 37, 2, -34 }, // 0x4F 'O' + { 3838, 24, 34, 31, 4, -33 }, // 0x50 'P' + { 3940, 33, 38, 37, 2, -34 }, // 0x51 'Q' + { 4097, 26, 34, 33, 4, -33 }, // 0x52 'R' + { 4208, 27, 36, 31, 2, -34 }, // 0x53 'S' + { 4330, 26, 34, 30, 2, -33 }, // 0x54 'T' + { 4441, 26, 35, 34, 4, -33 }, // 0x55 'U' + { 4555, 29, 34, 30, 1, -33 }, // 0x56 'V' + { 4679, 42, 34, 44, 1, -33 }, // 0x57 'W' + { 4858, 29, 34, 31, 1, -33 }, // 0x58 'X' + { 4982, 30, 34, 32, 1, -33 }, // 0x59 'Y' + { 5110, 27, 34, 29, 1, -33 }, // 0x5A 'Z' + { 5225, 8, 44, 13, 3, -33 }, // 0x5B '[' + { 5269, 13, 35, 13, 0, -33 }, // 0x5C '\' + { 5326, 8, 44, 13, 1, -33 }, // 0x5D ']' + { 5370, 18, 18, 22, 2, -32 }, // 0x5E '^' + { 5411, 28, 2, 26, -1, 7 }, // 0x5F '_' + { 5418, 10, 7, 12, 1, -34 }, // 0x60 '`' + { 5427, 24, 27, 26, 1, -25 }, // 0x61 'a' + { 5508, 22, 35, 26, 3, -33 }, // 0x62 'b' + { 5605, 21, 27, 24, 1, -25 }, // 0x63 'c' + { 5676, 23, 35, 26, 1, -33 }, // 0x64 'd' + { 5777, 22, 27, 25, 1, -25 }, // 0x65 'e' + { 5852, 10, 34, 13, 1, -33 }, // 0x66 'f' + { 5895, 22, 36, 26, 1, -25 }, // 0x67 'g' + { 5994, 19, 34, 25, 3, -33 }, // 0x68 'h' + { 6075, 4, 34, 10, 3, -33 }, // 0x69 'i' + { 6092, 8, 44, 11, 0, -33 }, // 0x6A 'j' + { 6136, 21, 34, 24, 3, -33 }, // 0x6B 'k' + { 6226, 4, 34, 10, 3, -33 }, // 0x6C 'l' + { 6243, 32, 26, 38, 3, -25 }, // 0x6D 'm' + { 6347, 20, 26, 25, 3, -25 }, // 0x6E 'n' + { 6412, 23, 27, 25, 1, -25 }, // 0x6F 'o' + { 6490, 22, 35, 26, 3, -25 }, // 0x70 'p' + { 6587, 23, 35, 26, 1, -25 }, // 0x71 'q' + { 6688, 12, 26, 16, 3, -25 }, // 0x72 'r' + { 6727, 20, 27, 23, 1, -25 }, // 0x73 's' + { 6795, 10, 32, 13, 1, -30 }, // 0x74 't' + { 6835, 20, 26, 25, 3, -24 }, // 0x75 'u' + { 6900, 23, 25, 23, 0, -24 }, // 0x76 'v' + { 6972, 34, 25, 34, 0, -24 }, // 0x77 'w' + { 7079, 22, 25, 22, 0, -24 }, // 0x78 'x' + { 7148, 22, 35, 22, 0, -24 }, // 0x79 'y' + { 7245, 20, 25, 23, 1, -24 }, // 0x7A 'z' + { 7308, 11, 44, 16, 2, -33 }, // 0x7B '{' + { 7369, 3, 44, 12, 4, -33 }, // 0x7C '|' + { 7386, 11, 44, 16, 2, -33 }, // 0x7D '}' + { 7447, 19, 7, 24, 2, -19 } }; // 0x7E '~' + +const GFXfont FreeSans24pt7b PROGMEM = { + (uint8_t *)FreeSans24pt7bBitmaps, + (GFXglyph *)FreeSans24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 8136 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans9pt7b.h new file mode 100644 index 0000000..1f006a1 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSans9pt7b.h @@ -0,0 +1,201 @@ +const uint8_t FreeSans9pt7bBitmaps[] 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 FreeSans9pt7bGlyphs[] 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 FreeSans9pt7b PROGMEM = { + (uint8_t *)FreeSans9pt7bBitmaps, + (GFXglyph *)FreeSans9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1822 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold12pt7b.h new file mode 100644 index 0000000..e0922be --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold12pt7b.h @@ -0,0 +1,288 @@ +const uint8_t FreeSansBold12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x60, 0xFF, 0xF0, 0xF3, 0xFC, 0xFF, + 0x3F, 0xCF, 0x61, 0x98, 0x60, 0x0E, 0x70, 0x73, 0x83, 0x18, 0xFF, 0xF7, + 0xFF, 0xBF, 0xFC, 0x73, 0x83, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFD, 0xFF, + 0xE3, 0x18, 0x39, 0xC1, 0xCE, 0x0E, 0x70, 0x02, 0x00, 0x7E, 0x0F, 0xF8, + 0x7F, 0xE7, 0xAF, 0xB9, 0x3D, 0xC8, 0x0F, 0x40, 0x3F, 0x00, 0xFF, 0x00, + 0xFC, 0x05, 0xFF, 0x27, 0xF9, 0x3F, 0xEB, 0xEF, 0xFE, 0x3F, 0xE0, 0x7C, + 0x00, 0x80, 0x04, 0x00, 0x3C, 0x06, 0x0F, 0xC1, 0x81, 0xFC, 0x30, 0x73, + 0x8C, 0x0C, 0x31, 0x81, 0xCE, 0x60, 0x1F, 0xCC, 0x03, 0xF3, 0x00, 0x3C, + 0x67, 0x80, 0x19, 0xF8, 0x02, 0x7F, 0x80, 0xCE, 0x70, 0x11, 0x86, 0x06, + 0x39, 0xC1, 0x87, 0xF8, 0x30, 0x7E, 0x0C, 0x07, 0x80, 0x07, 0x80, 0x1F, + 0xC0, 0x3F, 0xE0, 0x3C, 0xE0, 0x3C, 0xE0, 0x3E, 0xE0, 0x0F, 0xC0, 0x07, + 0x00, 0x3F, 0x8C, 0x7F, 0xCC, 0xF1, 0xFC, 0xF0, 0xF8, 0xF0, 0x78, 0xF8, + 0xF8, 0x7F, 0xFC, 0x3F, 0xDE, 0x1F, 0x8E, 0xFF, 0xFF, 0x66, 0x0C, 0x73, + 0x8E, 0x71, 0xC7, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x1C, 0x71, 0xC3, + 0x8E, 0x18, 0x70, 0xC3, 0x87, 0x1C, 0x38, 0xE3, 0x87, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xCE, 0x38, 0xE7, 0x1C, 0x63, 0x80, 0x10, 0x23, 0x5F, 0xF3, + 0x87, 0x1B, 0x14, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x00, 0xFF, 0xF3, 0x36, 0xC0, 0xFF, + 0xFF, 0xC0, 0xFF, 0xF0, 0x0C, 0x30, 0x86, 0x18, 0x61, 0x0C, 0x30, 0xC2, + 0x18, 0x61, 0x84, 0x30, 0xC0, 0x1F, 0x83, 0xFC, 0x7F, 0xE7, 0x9E, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, + 0xF7, 0x9E, 0x7F, 0xE3, 0xFC, 0x0F, 0x00, 0x06, 0x1C, 0x7F, 0xFF, 0xE3, + 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x1F, 0x83, + 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xE0, + 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x03, 0x80, 0x7F, 0xF7, 0xFF, 0x7F, 0xF0, + 0x1F, 0x07, 0xFC, 0xFF, 0xEF, 0x1E, 0xF1, 0xE0, 0x1E, 0x03, 0xC0, 0x78, + 0x07, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0xF0, 0xFF, 0x1F, 0x7F, 0xE7, 0xFC, + 0x1F, 0x80, 0x03, 0xC0, 0xF8, 0x1F, 0x07, 0xE1, 0xBC, 0x27, 0x8C, 0xF3, + 0x1E, 0x63, 0xD8, 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x3F, 0xE7, 0xFE, 0x7F, 0xE7, 0x00, 0x60, 0x06, 0xF8, 0x7F, + 0xCF, 0xFE, 0xF1, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFE, 0x1E, 0xFF, + 0xE7, 0xFC, 0x3F, 0x00, 0x0F, 0x83, 0xFC, 0x7F, 0xE7, 0x9F, 0xF0, 0x0F, + 0x78, 0xFF, 0xCF, 0xFE, 0xF9, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF7, + 0x9F, 0x7F, 0xE3, 0xFC, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, + 0x1C, 0x07, 0x01, 0xE0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xE0, + 0x38, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x0F, 0x03, 0xFC, 0x7F, 0xC7, 0x9E, + 0x70, 0xE7, 0x0E, 0x39, 0xC1, 0xF8, 0x3F, 0xC7, 0x9E, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x9F, 0x7F, 0xE3, 0xFC, 0x1F, 0x80, 0x1F, 0x03, 0xFC, 0x7F, + 0xEF, 0x9E, 0xF0, 0xEF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF9, 0xF7, 0xFF, 0x3F, + 0xF1, 0xEF, 0x00, 0xEF, 0x1E, 0x7F, 0xE7, 0xFC, 0x1F, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0x11, 0x6C, + 0x00, 0x10, 0x07, 0x03, 0xF1, 0xFC, 0x7E, 0x0F, 0x80, 0xE0, 0x0F, 0xC0, + 0x3F, 0x80, 0x7F, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0E, 0x00, 0xFC, + 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0x00, 0xF0, 0x7F, 0x1F, 0x8F, 0xE0, 0xF0, + 0x08, 0x00, 0x1F, 0x07, 0xFC, 0x7F, 0xEF, 0x9F, 0xF0, 0xFF, 0x0F, 0x00, + 0xF0, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x00, 0xE0, 0x00, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xFC, 0x03, 0xC0, + 0xF0, 0x38, 0x01, 0xC3, 0x80, 0x07, 0x18, 0x3D, 0x99, 0x87, 0xEC, 0x6C, + 0x71, 0xC3, 0xC3, 0x06, 0x1E, 0x18, 0x30, 0xF1, 0x81, 0x87, 0x8C, 0x18, + 0x7C, 0x60, 0xC3, 0x63, 0x8E, 0x3B, 0x8F, 0xDF, 0x8C, 0x3C, 0xF0, 0x70, + 0x00, 0x01, 0xC0, 0x00, 0x07, 0x80, 0x80, 0x1F, 0xFE, 0x00, 0x1F, 0xC0, + 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, + 0x70, 0x0F, 0x78, 0x0E, 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x3C, 0x3F, + 0xFC, 0x3F, 0xFE, 0x3F, 0xFE, 0x78, 0x0E, 0x78, 0x0F, 0x70, 0x0F, 0xF0, + 0x07, 0xFF, 0xC3, 0xFF, 0xCF, 0xFF, 0x3C, 0x3E, 0xF0, 0x7B, 0xC1, 0xEF, + 0x0F, 0xBF, 0xFC, 0xFF, 0xE3, 0xFF, 0xCF, 0x07, 0xBC, 0x0F, 0xF0, 0x3F, + 0xC0, 0xFF, 0x07, 0xFF, 0xFE, 0xFF, 0xFB, 0xFF, 0x80, 0x07, 0xE0, 0x1F, + 0xF8, 0x3F, 0xFC, 0x7C, 0x3E, 0x78, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x0F, 0x78, + 0x1F, 0x7C, 0x3E, 0x3F, 0xFE, 0x1F, 0xFC, 0x07, 0xF0, 0xFF, 0xE1, 0xFF, + 0xE3, 0xFF, 0xE7, 0x83, 0xEF, 0x03, 0xDE, 0x07, 0xFC, 0x07, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x07, 0xBC, + 0x1F, 0x7F, 0xFC, 0xFF, 0xF1, 0xFF, 0x80, 0xFF, 0xF7, 0xFF, 0xBF, 0xFD, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFC, 0xFF, 0xE7, 0xFF, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0xFE, 0xFF, 0xEF, 0xFE, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0x03, 0xF0, 0x0F, 0xFC, 0x3F, 0xFE, 0x3E, 0x1F, + 0x78, 0x07, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, 0xF0, 0x7F, + 0xF0, 0x7F, 0xF0, 0x07, 0x78, 0x07, 0x7C, 0x0F, 0x3E, 0x1F, 0x3F, 0xFB, + 0x0F, 0xFB, 0x03, 0xE3, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, + 0x3F, 0xC0, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, + 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0xF8, 0xFF, 0x1F, 0xE3, 0xFC, 0x7B, 0xFE, 0x7F, 0xC3, 0xE0, 0xF0, 0x3E, + 0xF0, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, 0xF1, 0xE0, 0xF3, 0xC0, 0xF7, 0x80, + 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFB, 0xC0, 0xF1, 0xE0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0x78, 0xF0, 0x3C, 0xF0, 0x3E, 0xF0, 0x1E, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, + 0x1F, 0xFE, 0x0F, 0xFF, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xFF, 0xE1, 0xFF, + 0xF9, 0xFF, 0xFC, 0xEF, 0xFE, 0x77, 0xFB, 0x3B, 0xFD, 0xDD, 0xFE, 0xFC, + 0xFF, 0x7E, 0x7F, 0x9F, 0x3F, 0xCF, 0x9F, 0xE7, 0x8F, 0xF3, 0xC7, 0xF8, + 0xE3, 0xC0, 0xF0, 0x1F, 0xF0, 0x3F, 0xF0, 0x7F, 0xE0, 0xFF, 0xE1, 0xFF, + 0xC3, 0xFD, 0xC7, 0xFB, 0x8F, 0xF3, 0x9F, 0xE7, 0x3F, 0xC7, 0x7F, 0x8F, + 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x1F, 0xF8, 0x1F, 0xF0, 0x3F, 0xE0, 0x3C, + 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, + 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, + 0x00, 0xF7, 0x80, 0xF3, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFC, + 0x03, 0xF8, 0x00, 0xFF, 0xE3, 0xFF, 0xEF, 0xFF, 0xBC, 0x1F, 0xF0, 0x3F, + 0xC0, 0xFF, 0x03, 0xFC, 0x1F, 0xFF, 0xFB, 0xFF, 0xCF, 0xFE, 0x3C, 0x00, + 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x03, + 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, + 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x04, + 0xF7, 0x87, 0xF3, 0xC3, 0xF8, 0xF0, 0xF8, 0x7F, 0xFC, 0x1F, 0xFF, 0x83, + 0xF1, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3E, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xFF, 0xF8, 0xFF, 0xF0, + 0xFF, 0xF8, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, + 0xF0, 0x3C, 0xF0, 0x1F, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xC3, 0xEF, + 0x03, 0xDE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x7F, 0xF0, 0x3F, 0xF8, 0x0F, + 0xF8, 0x01, 0xF0, 0x01, 0xFE, 0x03, 0xDE, 0x0F, 0xBF, 0xFE, 0x3F, 0xF8, + 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, + 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, + 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, + 0x00, 0x70, 0x0E, 0xF0, 0x3D, 0xE0, 0x79, 0xC0, 0xE3, 0x81, 0xC7, 0x87, + 0x87, 0x0E, 0x0E, 0x1C, 0x1E, 0x78, 0x1C, 0xE0, 0x39, 0xC0, 0x73, 0x80, + 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x70, + 0x38, 0x1C, 0xE0, 0xF0, 0x79, 0xE1, 0xF0, 0xF3, 0xC3, 0xE1, 0xE3, 0x87, + 0xC3, 0x87, 0x0F, 0x87, 0x0E, 0x3B, 0x9E, 0x1E, 0x77, 0x38, 0x1C, 0xEE, + 0x70, 0x39, 0xCC, 0xE0, 0x73, 0x99, 0xC0, 0x6E, 0x3F, 0x00, 0xFC, 0x7E, + 0x01, 0xF8, 0xFC, 0x03, 0xF0, 0xF8, 0x03, 0xE1, 0xE0, 0x07, 0x83, 0xC0, + 0x0F, 0x07, 0x80, 0xF0, 0x3C, 0xF0, 0xF9, 0xE1, 0xE1, 0xE7, 0x83, 0xCF, + 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3F, 0x00, + 0xFF, 0x01, 0xFE, 0x07, 0x9E, 0x0F, 0x1E, 0x3C, 0x3C, 0xF8, 0x3D, 0xE0, + 0x78, 0xF0, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x1E, + 0x78, 0x0E, 0x70, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x7C, 0x03, 0xC0, 0x3C, 0x03, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0xF3, 0xCF, + 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xFF, 0xFF, + 0xC0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, + 0xC1, 0x81, 0x03, 0x06, 0xFF, 0xFF, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, + 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xFF, 0xC0, 0x0F, 0x00, + 0xF0, 0x0F, 0x01, 0xF8, 0x1B, 0x83, 0x9C, 0x39, 0xC3, 0x0C, 0x70, 0xE7, + 0x0E, 0xE0, 0x70, 0xFF, 0xFF, 0xFF, 0xFC, 0xE6, 0x30, 0x1F, 0x83, 0xFF, + 0x1F, 0xFD, 0xE1, 0xE0, 0x0F, 0x03, 0xF9, 0xFF, 0xDF, 0x1E, 0xF0, 0xF7, + 0x8F, 0xBF, 0xFC, 0xFF, 0xE3, 0xCF, 0x80, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x7B, 0xC3, 0xFF, 0x9F, 0xFE, 0xF8, 0xF7, 0x83, 0xFC, + 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xE3, 0xDF, 0xFE, 0xFF, 0xE7, 0xBE, + 0x00, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x8F, 0xF0, 0x7F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x77, 0x8F, 0x7F, 0xF3, 0xFE, 0x0F, 0x80, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x8F, 0xBC, 0xFF, 0xEF, 0xFF, 0x78, 0xFF, + 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D, 0xE3, 0xEF, 0xFF, 0x3F, + 0xF8, 0xFB, 0xC0, 0x1F, 0x81, 0xFE, 0x1F, 0xF9, 0xF1, 0xCF, 0x07, 0x7F, + 0xFB, 0xFF, 0xDE, 0x00, 0xF0, 0x03, 0xC3, 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, + 0x00, 0x3E, 0xFD, 0xFB, 0xC7, 0x9F, 0xBF, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, + 0x8F, 0x1E, 0x3C, 0x78, 0xF0, 0x1E, 0x79, 0xFB, 0xDF, 0xFE, 0xF1, 0xFF, + 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xDF, 0xFE, 0x7F, + 0xF1, 0xF7, 0x80, 0x3C, 0x01, 0xFF, 0x1E, 0x7F, 0xF0, 0xFE, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x7C, 0xFF, 0xEF, 0xFF, 0xF9, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, + 0xFF, 0x0F, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, + 0xF3, 0xC0, 0x00, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, + 0xF3, 0xCF, 0xFF, 0xFF, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, + 0x0F, 0x0F, 0xF1, 0xEF, 0x3C, 0xF7, 0x8F, 0xF0, 0xFF, 0x0F, 0xF8, 0xFF, + 0x8F, 0x3C, 0xF1, 0xCF, 0x1E, 0xF0, 0xEF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x8F, 0x9F, 0xFB, 0xFB, 0xFF, 0xFF, + 0xFC, 0xF8, 0xFF, 0x1E, 0x1F, 0xE3, 0xC3, 0xFC, 0x78, 0x7F, 0x8F, 0x0F, + 0xF1, 0xE1, 0xFE, 0x3C, 0x3F, 0xC7, 0x87, 0xF8, 0xF0, 0xFF, 0x1E, 0x1E, + 0xF7, 0xCF, 0xFE, 0xFF, 0xFF, 0x9F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xF0, 0x0F, 0x81, 0xFF, 0x1F, + 0xFC, 0xF1, 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7B, 0xC7, + 0x9F, 0xFC, 0x7F, 0xC0, 0xF8, 0x00, 0xF7, 0xC7, 0xFF, 0x3F, 0xFD, 0xF1, + 0xEF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0xC7, 0xBF, 0xFD, + 0xFF, 0xCF, 0x78, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x00, + 0x0F, 0x79, 0xFF, 0xDF, 0xFE, 0xF1, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, + 0x0F, 0xF0, 0x7B, 0xC7, 0xDF, 0xFE, 0x7F, 0xF1, 0xF7, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0xF3, 0xF7, 0xFF, 0xF8, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x1F, 0x87, 0xFC, 0xFF, 0xEF, + 0x0F, 0xF8, 0x0F, 0xF0, 0x7F, 0xE0, 0xFF, 0x01, 0xFF, 0x0F, 0xFF, 0xE7, + 0xFE, 0x1F, 0x80, 0x79, 0xE7, 0xBF, 0xFD, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, + 0x7D, 0xF3, 0xC0, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0x3E, 0xF0, 0xF0, + 0x7B, 0x83, 0x9E, 0x1C, 0xF1, 0xE3, 0x8E, 0x1C, 0x70, 0x77, 0x83, 0xB8, + 0x1D, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0xF0, 0xE1, 0xDC, + 0x78, 0x77, 0x1F, 0x3D, 0xE7, 0xCF, 0x79, 0xB3, 0x8E, 0x6C, 0xE3, 0xBB, + 0x38, 0xEE, 0xFC, 0x1F, 0x3F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x78, + 0x0E, 0x1E, 0x00, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x3B, 0x81, 0xFC, 0x07, + 0xC0, 0x1E, 0x01, 0xF0, 0x1F, 0xC0, 0xEF, 0x0F, 0x78, 0xF1, 0xE7, 0x87, + 0x00, 0xF0, 0x7B, 0x83, 0x9E, 0x1C, 0x71, 0xE3, 0x8E, 0x1E, 0x70, 0x73, + 0x83, 0xB8, 0x1F, 0xC0, 0x7E, 0x03, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, + 0x3C, 0x07, 0xC0, 0x3E, 0x01, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1C, 0xF3, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBC, 0xF0, 0xE3, 0x8E, + 0x38, 0xE3, 0x8E, 0x3C, 0xF1, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0xE3, 0x8F, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x0F, 0x3D, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0xF3, 0xCE, 0x00, 0x78, 0x0F, 0xE0, 0xCF, 0x30, 0x7F, + 0x01, 0xE0 }; + +const GFXglyph FreeSansBold12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 7, 0, 1 }, // 0x20 ' ' + { 0, 4, 17, 8, 3, -16 }, // 0x21 '!' + { 9, 10, 6, 11, 1, -17 }, // 0x22 '"' + { 17, 13, 16, 13, 0, -15 }, // 0x23 '#' + { 43, 13, 20, 13, 0, -17 }, // 0x24 '$' + { 76, 19, 17, 21, 1, -16 }, // 0x25 '%' + { 117, 16, 17, 17, 1, -16 }, // 0x26 '&' + { 151, 4, 6, 6, 1, -17 }, // 0x27 ''' + { 154, 6, 22, 8, 1, -17 }, // 0x28 '(' + { 171, 6, 22, 8, 1, -17 }, // 0x29 ')' + { 188, 7, 8, 9, 1, -17 }, // 0x2A '*' + { 195, 11, 11, 14, 2, -10 }, // 0x2B '+' + { 211, 4, 7, 6, 1, -2 }, // 0x2C ',' + { 215, 6, 3, 8, 1, -7 }, // 0x2D '-' + { 218, 4, 3, 6, 1, -2 }, // 0x2E '.' + { 220, 6, 17, 7, 0, -16 }, // 0x2F '/' + { 233, 12, 17, 13, 1, -16 }, // 0x30 '0' + { 259, 7, 17, 14, 3, -16 }, // 0x31 '1' + { 274, 12, 17, 13, 1, -16 }, // 0x32 '2' + { 300, 12, 17, 13, 1, -16 }, // 0x33 '3' + { 326, 11, 17, 13, 1, -16 }, // 0x34 '4' + { 350, 12, 17, 13, 1, -16 }, // 0x35 '5' + { 376, 12, 17, 13, 1, -16 }, // 0x36 '6' + { 402, 11, 17, 13, 1, -16 }, // 0x37 '7' + { 426, 12, 17, 13, 1, -16 }, // 0x38 '8' + { 452, 12, 17, 13, 1, -16 }, // 0x39 '9' + { 478, 4, 12, 6, 1, -11 }, // 0x3A ':' + { 484, 4, 16, 6, 1, -11 }, // 0x3B ';' + { 492, 12, 12, 14, 1, -11 }, // 0x3C '<' + { 510, 12, 9, 14, 1, -9 }, // 0x3D '=' + { 524, 12, 12, 14, 1, -11 }, // 0x3E '>' + { 542, 12, 18, 15, 2, -17 }, // 0x3F '?' + { 569, 21, 21, 23, 1, -17 }, // 0x40 '@' + { 625, 16, 18, 17, 0, -17 }, // 0x41 'A' + { 661, 14, 18, 17, 2, -17 }, // 0x42 'B' + { 693, 16, 18, 17, 1, -17 }, // 0x43 'C' + { 729, 15, 18, 17, 2, -17 }, // 0x44 'D' + { 763, 13, 18, 16, 2, -17 }, // 0x45 'E' + { 793, 12, 18, 15, 2, -17 }, // 0x46 'F' + { 820, 16, 18, 18, 1, -17 }, // 0x47 'G' + { 856, 14, 18, 18, 2, -17 }, // 0x48 'H' + { 888, 4, 18, 7, 2, -17 }, // 0x49 'I' + { 897, 11, 18, 14, 1, -17 }, // 0x4A 'J' + { 922, 16, 18, 17, 2, -17 }, // 0x4B 'K' + { 958, 11, 18, 15, 2, -17 }, // 0x4C 'L' + { 983, 17, 18, 21, 2, -17 }, // 0x4D 'M' + { 1022, 15, 18, 18, 2, -17 }, // 0x4E 'N' + { 1056, 17, 18, 19, 1, -17 }, // 0x4F 'O' + { 1095, 14, 18, 16, 2, -17 }, // 0x50 'P' + { 1127, 17, 19, 19, 1, -17 }, // 0x51 'Q' + { 1168, 16, 18, 17, 2, -17 }, // 0x52 'R' + { 1204, 15, 18, 16, 1, -17 }, // 0x53 'S' + { 1238, 12, 18, 15, 2, -17 }, // 0x54 'T' + { 1265, 14, 18, 18, 2, -17 }, // 0x55 'U' + { 1297, 15, 18, 16, 0, -17 }, // 0x56 'V' + { 1331, 23, 18, 23, 0, -17 }, // 0x57 'W' + { 1383, 15, 18, 16, 1, -17 }, // 0x58 'X' + { 1417, 16, 18, 15, 0, -17 }, // 0x59 'Y' + { 1453, 13, 18, 15, 1, -17 }, // 0x5A 'Z' + { 1483, 6, 23, 8, 2, -17 }, // 0x5B '[' + { 1501, 7, 17, 7, 0, -16 }, // 0x5C '\' + { 1516, 6, 23, 8, 0, -17 }, // 0x5D ']' + { 1534, 12, 11, 14, 1, -16 }, // 0x5E '^' + { 1551, 15, 2, 13, -1, 4 }, // 0x5F '_' + { 1555, 4, 3, 6, 0, -17 }, // 0x60 '`' + { 1557, 13, 13, 14, 1, -12 }, // 0x61 'a' + { 1579, 13, 18, 15, 2, -17 }, // 0x62 'b' + { 1609, 12, 13, 13, 1, -12 }, // 0x63 'c' + { 1629, 13, 18, 15, 1, -17 }, // 0x64 'd' + { 1659, 13, 13, 14, 1, -12 }, // 0x65 'e' + { 1681, 7, 18, 8, 1, -17 }, // 0x66 'f' + { 1697, 13, 18, 15, 1, -12 }, // 0x67 'g' + { 1727, 12, 18, 14, 2, -17 }, // 0x68 'h' + { 1754, 4, 18, 7, 2, -17 }, // 0x69 'i' + { 1763, 6, 23, 7, 0, -17 }, // 0x6A 'j' + { 1781, 12, 18, 14, 2, -17 }, // 0x6B 'k' + { 1808, 4, 18, 6, 2, -17 }, // 0x6C 'l' + { 1817, 19, 13, 21, 2, -12 }, // 0x6D 'm' + { 1848, 12, 13, 15, 2, -12 }, // 0x6E 'n' + { 1868, 13, 13, 15, 1, -12 }, // 0x6F 'o' + { 1890, 13, 18, 15, 2, -12 }, // 0x70 'p' + { 1920, 13, 18, 15, 1, -12 }, // 0x71 'q' + { 1950, 8, 13, 9, 2, -12 }, // 0x72 'r' + { 1963, 12, 13, 13, 1, -12 }, // 0x73 's' + { 1983, 6, 15, 8, 1, -14 }, // 0x74 't' + { 1995, 12, 13, 15, 2, -12 }, // 0x75 'u' + { 2015, 13, 13, 13, 0, -12 }, // 0x76 'v' + { 2037, 18, 13, 19, 0, -12 }, // 0x77 'w' + { 2067, 13, 13, 13, 0, -12 }, // 0x78 'x' + { 2089, 13, 18, 13, 0, -12 }, // 0x79 'y' + { 2119, 10, 13, 12, 1, -12 }, // 0x7A 'z' + { 2136, 6, 23, 9, 1, -17 }, // 0x7B '{' + { 2154, 2, 22, 7, 2, -17 }, // 0x7C '|' + { 2160, 6, 23, 9, 3, -17 }, // 0x7D '}' + { 2178, 12, 5, 12, 0, -7 } }; // 0x7E '~' + +const GFXfont FreeSansBold12pt7b PROGMEM = { + (uint8_t *)FreeSansBold12pt7bBitmaps, + (GFXglyph *)FreeSansBold12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2858 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold18pt7b.h new file mode 100644 index 0000000..d5927cd --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold18pt7b.h @@ -0,0 +1,481 @@ +const uint8_t FreeSansBold18pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE7, 0x39, 0xCE, 0x73, 0x80, + 0x0F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xC7, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, + 0xFC, 0x7D, 0xC1, 0xCE, 0x0E, 0x70, 0x70, 0x03, 0xC3, 0x80, 0x3C, 0x78, + 0x03, 0xC7, 0x80, 0x38, 0x78, 0x07, 0x87, 0x07, 0xFF, 0xFF, 0x7F, 0xFF, + 0xF7, 0xFF, 0xFF, 0x7F, 0xFF, 0xF0, 0xF0, 0xE0, 0x0F, 0x0E, 0x00, 0xF1, + 0xE0, 0x0F, 0x1E, 0x00, 0xE1, 0xE0, 0xFF, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xCF, 0xFF, 0xFC, 0x1C, 0x3C, 0x03, 0xC3, 0x80, 0x3C, 0x78, 0x03, + 0xC7, 0x80, 0x38, 0x78, 0x03, 0x87, 0x80, 0x00, 0x60, 0x00, 0x7F, 0x80, + 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xFF, 0xFC, 0xFC, 0xDF, 0x9F, 0x19, 0xFB, + 0xC3, 0x1F, 0x78, 0x63, 0xEF, 0x8C, 0x01, 0xFD, 0x80, 0x1F, 0xF0, 0x01, + 0xFF, 0xC0, 0x1F, 0xFE, 0x00, 0x7F, 0xE0, 0x03, 0xFE, 0x00, 0x67, 0xE0, + 0x0C, 0x7F, 0xE1, 0x8F, 0xFC, 0x31, 0xFF, 0xC6, 0x3E, 0xFC, 0xDF, 0x9F, + 0xFF, 0xF1, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, 0x7F, 0x80, 0x01, 0x80, 0x00, + 0x30, 0x00, 0x06, 0x00, 0x0F, 0x00, 0x1C, 0x01, 0xFE, 0x00, 0xE0, 0x1F, + 0xF8, 0x0E, 0x00, 0xFF, 0xC0, 0x70, 0x0F, 0x0F, 0x07, 0x00, 0x70, 0x38, + 0x38, 0x03, 0x81, 0xC3, 0x80, 0x1C, 0x0E, 0x3C, 0x00, 0xF0, 0xF1, 0xC0, + 0x03, 0xFF, 0x1C, 0x00, 0x1F, 0xF8, 0xE0, 0x00, 0x7F, 0x8E, 0x00, 0x00, + 0xF0, 0x70, 0xF8, 0x00, 0x07, 0x1F, 0xF0, 0x00, 0x39, 0xFF, 0xC0, 0x03, + 0x8F, 0xFE, 0x00, 0x1C, 0xF0, 0x78, 0x01, 0xC7, 0x01, 0xC0, 0x0C, 0x38, + 0x0E, 0x00, 0xE1, 0xC0, 0x70, 0x06, 0x0F, 0x07, 0x80, 0x70, 0x3F, 0xF8, + 0x07, 0x01, 0xFF, 0xC0, 0x38, 0x07, 0xFC, 0x03, 0x80, 0x0F, 0x80, 0x01, + 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xC0, 0x03, 0xFF, 0x80, 0x1F, 0x1E, + 0x00, 0x7C, 0x78, 0x01, 0xF1, 0xE0, 0x07, 0xE7, 0x80, 0x0F, 0xBC, 0x00, + 0x1F, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0xF0, 0xFF, + 0xE3, 0xC7, 0xE7, 0xCF, 0x3F, 0x0F, 0xF8, 0xF8, 0x3F, 0xE3, 0xE0, 0x7F, + 0x8F, 0x80, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x3F, 0xE1, 0xFF, 0xFF, 0x83, + 0xFF, 0xFF, 0x07, 0xFE, 0x7E, 0x07, 0xF0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFD, + 0xCE, 0x70, 0x07, 0x87, 0x83, 0xC3, 0xC1, 0xE1, 0xE0, 0xF0, 0x78, 0x78, + 0x3C, 0x1E, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, + 0x0F, 0x03, 0x81, 0xE0, 0xF0, 0x78, 0x1E, 0x0F, 0x03, 0x81, 0xE0, 0x70, + 0x3C, 0x0E, 0x07, 0x80, 0xF0, 0x38, 0x1E, 0x07, 0x83, 0xC0, 0xF0, 0x78, + 0x3C, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xC1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x0F, 0x0F, 0x07, 0x87, 0x83, + 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, 0x00, 0x06, 0x00, 0x60, 0x06, 0x07, 0x6E, + 0x7F, 0xE3, 0xFC, 0x0F, 0x01, 0xF8, 0x1F, 0x83, 0x9C, 0x10, 0x80, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0, 0x03, + 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x8C, 0x63, + 0x37, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x80, 0x01, + 0x81, 0xC0, 0xC0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x06, 0x03, 0x01, + 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01, + 0x81, 0xC0, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, 0x87, 0xFF, + 0xC7, 0xE3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, + 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, + 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xDF, 0x07, 0xCF, 0x83, 0xE7, 0xE3, + 0xF1, 0xFF, 0xF0, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x01, 0xC0, + 0xF0, 0x3C, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xC1, 0xF0, 0x7C, + 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC0, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0xFF, + 0x8F, 0xFF, 0xE7, 0xE3, 0xF7, 0xE0, 0xFF, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x03, 0xF0, + 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x07, 0xC0, + 0x03, 0xE0, 0x03, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0x7F, 0xFF, 0x80, + 0x07, 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xCF, 0xC3, 0xF7, 0xC0, + 0xFB, 0xE0, 0x7D, 0xF0, 0x3E, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x0F, 0x80, + 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, 0xC3, 0xF3, 0xFF, 0xF8, 0xFF, + 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x01, 0xFC, + 0x01, 0xFC, 0x03, 0xFC, 0x07, 0x7C, 0x07, 0x7C, 0x0E, 0x7C, 0x0E, 0x7C, + 0x1C, 0x7C, 0x18, 0x7C, 0x38, 0x7C, 0x70, 0x7C, 0x60, 0x7C, 0xE0, 0x7C, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7C, 0x00, 0x7C, + 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7C, 0x1F, 0xFF, 0x0F, 0xFF, + 0x8F, 0xFF, 0xC7, 0xFF, 0xE3, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, + 0x00, 0x79, 0xF0, 0x3F, 0xFE, 0x1F, 0xFF, 0x8F, 0xFF, 0xE7, 0xC3, 0xF0, + 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xFE, 0x03, + 0xFF, 0x03, 0xFF, 0xC3, 0xF3, 0xFF, 0xF1, 0xFF, 0xF8, 0x3F, 0xF0, 0x07, + 0xE0, 0x00, 0x03, 0xF8, 0x03, 0xFF, 0x81, 0xFF, 0xF0, 0xFF, 0xFE, 0x3E, + 0x1F, 0x9F, 0x03, 0xE7, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF, + 0x8F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFE, 0x1F, 0xBF, 0x03, 0xFF, 0x80, 0x7F, + 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xF7, 0x80, 0x7D, 0xF0, 0x3E, 0x7E, + 0x1F, 0x8F, 0xFF, 0xC1, 0xFF, 0xF0, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF0, 0x00, 0xF8, + 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, + 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x0F, 0xFF, 0x07, + 0xFF, 0xC7, 0xC3, 0xF3, 0xC0, 0xF9, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x1F, + 0x1E, 0x1F, 0x07, 0xFF, 0x01, 0xFF, 0x03, 0xFF, 0xE3, 0xF1, 0xF9, 0xF0, + 0x7D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, 0xF7, + 0xC3, 0xF3, 0xFF, 0xF8, 0xFF, 0xF8, 0x3F, 0xF8, 0x07, 0xF0, 0x00, 0x07, + 0xE0, 0x0F, 0xFC, 0x0F, 0xFF, 0x0F, 0xFF, 0xC7, 0xE3, 0xF7, 0xE0, 0xFB, + 0xE0, 0x3D, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x83, + 0xF7, 0xE3, 0xFB, 0xFF, 0xFC, 0xFF, 0xFE, 0x3F, 0xDF, 0x07, 0xCF, 0x80, + 0x07, 0x80, 0x03, 0xDF, 0x03, 0xE7, 0xC3, 0xE3, 0xFF, 0xF0, 0xFF, 0xF0, + 0x3F, 0xF0, 0x07, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC6, 0x33, 0x9B, 0xD8, 0x00, 0x00, 0xC0, 0x00, + 0xF0, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0xFC, 0x03, + 0xF8, 0x00, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x07, + 0xFF, 0x00, 0x3F, 0xF0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x00, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xC0, 0x00, 0x3C, 0x00, 0x0F, 0xE0, 0x03, 0xFF, 0x00, 0x3F, 0xF0, + 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xC0, 0x07, 0xF0, + 0x0F, 0xFC, 0x1F, 0xF8, 0x3F, 0xF8, 0x3F, 0xF0, 0x0F, 0xE0, 0x03, 0xC0, + 0x00, 0xC0, 0x00, 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0xFF, 0xF1, 0xFF, + 0xFC, 0x7E, 0x3F, 0xBF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, + 0xC0, 0x03, 0xF0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xC0, 0x01, 0xF8, 0x07, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x07, + 0x80, 0x00, 0x7C, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x03, 0xE3, 0x9E, 0x3C, + 0x0F, 0xF7, 0x8E, 0x38, 0x1F, 0xFF, 0x0E, 0x78, 0x3E, 0x1F, 0x07, 0x70, + 0x38, 0x0F, 0x07, 0x70, 0x78, 0x0F, 0x07, 0xE0, 0x70, 0x0E, 0x07, 0xE0, + 0x70, 0x0E, 0x07, 0xE0, 0xE0, 0x0E, 0x07, 0xE0, 0xE0, 0x1E, 0x0F, 0xE0, + 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x3C, 0x1E, 0xE0, 0xF0, 0x3C, 0x3C, 0xF0, + 0xF0, 0xFC, 0x7C, 0x70, 0x7F, 0xFF, 0xF8, 0x78, 0x3F, 0xCF, 0xF0, 0x3C, + 0x1F, 0x07, 0xC0, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x01, 0x00, 0x07, 0xF0, 0x0F, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x80, 0x01, 0xFF, + 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF7, 0xC0, 0x03, 0xE7, 0xC0, 0x03, 0xE7, + 0xC0, 0x03, 0xE3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC3, 0xE0, 0x07, 0xC1, + 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0x81, 0xF0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xF8, 0x1F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x3E, 0x00, 0x7C, 0x3E, 0x00, + 0x7E, 0x3E, 0x00, 0x3E, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x3F, 0x7C, 0x00, + 0x1F, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFC, 0xF8, + 0x07, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x07, 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xCF, 0x80, 0x7E, 0xF8, 0x01, 0xEF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x3E, 0xFF, 0xFF, 0xEF, 0xFF, + 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0x80, + 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xF8, 0x1F, 0x87, 0xE0, 0x1F, 0x9F, + 0x80, 0x1F, 0x3E, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7D, 0xF0, 0x00, + 0xFB, 0xF0, 0x03, 0xF3, 0xF0, 0x0F, 0xC7, 0xF0, 0x3F, 0x87, 0xFF, 0xFE, + 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xC0, 0x01, 0xFE, 0x00, 0xFF, 0xFC, 0x07, + 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x8F, 0x80, 0xFE, 0x7C, 0x01, + 0xF3, 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x07, 0xFE, + 0x00, 0x3F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x03, + 0xFF, 0x00, 0x1F, 0xF8, 0x00, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7D, 0xF0, + 0x03, 0xEF, 0x80, 0x3E, 0x7C, 0x07, 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, + 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xDF, 0xFF, 0xFB, 0xFF, + 0xFF, 0x7F, 0xFF, 0xEF, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7F, 0xFF, 0xCF, 0xFF, + 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE7, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, + 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0xFF, 0xEF, 0xFF, 0xF7, + 0xFF, 0xFB, 0xFF, 0xFD, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x03, 0xFF, 0xE0, 0x07, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xC0, 0xFE, 0x3F, 0x00, 0x7E, 0x7E, 0x00, + 0x3F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x03, 0xFF, 0xF8, 0x03, + 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x0F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, + 0x1F, 0x7E, 0x00, 0x3F, 0x3F, 0x00, 0x7F, 0x1F, 0xC1, 0xFF, 0x0F, 0xFF, + 0xFF, 0x07, 0xFF, 0xE7, 0x03, 0xFF, 0xC7, 0x00, 0xFF, 0x07, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, + 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, + 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, + 0xF8, 0x1F, 0xFC, 0x3F, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8, 0x07, 0xE0, + 0xF8, 0x01, 0xFB, 0xE0, 0x0F, 0xCF, 0x80, 0x7E, 0x3E, 0x03, 0xF0, 0xF8, + 0x1F, 0x83, 0xE0, 0xFC, 0x0F, 0x87, 0xE0, 0x3E, 0x3F, 0x00, 0xF8, 0xF8, + 0x03, 0xE7, 0xE0, 0x0F, 0xBF, 0x00, 0x3F, 0xF8, 0x00, 0xFF, 0xF0, 0x03, + 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x3F, 0xBF, 0x00, 0xFC, 0x7E, 0x03, 0xE0, + 0xFC, 0x0F, 0x81, 0xF8, 0x3E, 0x07, 0xE0, 0xF8, 0x0F, 0xC3, 0xE0, 0x1F, + 0x8F, 0x80, 0x7F, 0x3E, 0x00, 0xFC, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF0, + 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, + 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0xFF, + 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFB, 0xC3, 0xDF, 0xFB, + 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xFB, 0xC3, 0xDF, 0xF9, 0xC7, 0xDF, 0xF9, + 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF9, 0xE7, 0x9F, 0xF8, + 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, 0xFF, 0x1F, 0xF8, + 0x7F, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, 0x7E, 0x1F, 0xF8, + 0x3E, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x1F, 0xFE, 0x01, 0xFF, 0xE0, 0x1F, + 0xFF, 0x01, 0xFF, 0xF0, 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x1F, 0xFF, 0xC1, + 0xFF, 0xBC, 0x1F, 0xFB, 0xE1, 0xFF, 0x9F, 0x1F, 0xF9, 0xF1, 0xFF, 0x8F, + 0x9F, 0xF8, 0x79, 0xFF, 0x87, 0xDF, 0xF8, 0x3D, 0xFF, 0x83, 0xFF, 0xF8, + 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x07, 0xFF, + 0x80, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x1F, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8, + 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x00, 0x0F, + 0xBE, 0x00, 0x0F, 0x9F, 0x00, 0x07, 0xCF, 0xC0, 0x07, 0xE3, 0xF0, 0x07, + 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0xE3, 0xFF, 0xFE, + 0x7F, 0xFF, 0xEF, 0x80, 0xFF, 0xF0, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, + 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, 0xFC, 0x07, 0xEF, 0xFF, 0xFD, + 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFF, 0xE0, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, + 0xF0, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x01, 0xFC, 0x1F, 0xC1, 0xF8, + 0x03, 0xF1, 0xF8, 0x00, 0xFC, 0xF8, 0x00, 0x3E, 0x7C, 0x00, 0x1F, 0x7C, + 0x00, 0x07, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, + 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0xF8, 0x01, 0x0F, + 0xBE, 0x01, 0xCF, 0x9F, 0x01, 0xFF, 0xCF, 0xC0, 0x7F, 0xE3, 0xF0, 0x1F, + 0xE0, 0xFE, 0x0F, 0xF0, 0x7F, 0xFF, 0xF8, 0x0F, 0xFF, 0xFE, 0x03, 0xFF, + 0xEF, 0x80, 0x3F, 0xC3, 0x80, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0xFF, + 0xFE, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF, 0x80, 0x3F, 0x7C, 0x00, 0xFB, + 0xE0, 0x07, 0xDF, 0x00, 0x3E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0x3E, 0x00, + 0xF9, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, + 0x00, 0xFC, 0xF8, 0x03, 0xE7, 0xC0, 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07, + 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7C, 0xF8, + 0x03, 0xF7, 0xC0, 0x0F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, + 0x87, 0xFF, 0xFC, 0x7E, 0x0F, 0xCF, 0xC0, 0x7E, 0xF8, 0x03, 0xEF, 0x80, + 0x3E, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFF, 0xC0, 0x3F, + 0xFF, 0x81, 0xFF, 0xFC, 0x03, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7E, + 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x1F, 0xFF, 0x00, 0x3F, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, + 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, + 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x01, 0xFF, + 0x80, 0x1F, 0x7C, 0x03, 0xE7, 0xE0, 0x7E, 0x3F, 0xFF, 0xC3, 0xFF, 0xFC, + 0x0F, 0xFF, 0x00, 0x3F, 0xC0, 0xF8, 0x00, 0xFB, 0xE0, 0x03, 0xE7, 0xC0, + 0x1F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xE0, 0x3E, + 0x0F, 0x80, 0xF8, 0x1E, 0x03, 0xE0, 0x7C, 0x1F, 0x01, 0xF0, 0x7C, 0x03, + 0xC1, 0xF0, 0x0F, 0x87, 0x80, 0x3E, 0x3E, 0x00, 0xF8, 0xF8, 0x01, 0xE3, + 0xC0, 0x07, 0xCF, 0x00, 0x1F, 0x7C, 0x00, 0x3D, 0xE0, 0x00, 0xFF, 0x80, + 0x03, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x07, 0xC0, 0x3F, 0xF8, 0x07, 0xE0, + 0x3E, 0xFC, 0x07, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0, 0x3E, 0x7C, 0x0F, 0xE0, + 0x7E, 0x7C, 0x0F, 0xE0, 0x7C, 0x7C, 0x0F, 0xF0, 0x7C, 0x3E, 0x0F, 0xF0, + 0x7C, 0x3E, 0x1E, 0xF0, 0x78, 0x3E, 0x1E, 0x70, 0xF8, 0x1E, 0x1E, 0x70, + 0xF8, 0x1E, 0x1E, 0x78, 0xF8, 0x1F, 0x1E, 0x78, 0xF0, 0x1F, 0x3C, 0x78, + 0xF0, 0x0F, 0x3C, 0x39, 0xF0, 0x0F, 0x3C, 0x3D, 0xF0, 0x0F, 0x3C, 0x3D, + 0xE0, 0x0F, 0xBC, 0x3D, 0xE0, 0x07, 0xF8, 0x3D, 0xE0, 0x07, 0xF8, 0x1F, + 0xE0, 0x07, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, + 0xC0, 0x03, 0xF0, 0x0F, 0x80, 0x03, 0xF0, 0x0F, 0x80, 0x01, 0xF0, 0x0F, + 0x80, 0xFE, 0x01, 0xF9, 0xF8, 0x07, 0xE3, 0xF0, 0x3F, 0x0F, 0xC0, 0xF8, + 0x1F, 0x87, 0xE0, 0x7E, 0x3F, 0x00, 0xFC, 0xFC, 0x01, 0xF7, 0xE0, 0x07, + 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0xFC, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFF, 0x00, + 0x1F, 0x7E, 0x00, 0xFC, 0xF8, 0x03, 0xE3, 0xF0, 0x1F, 0x87, 0xC0, 0x7C, + 0x1F, 0x83, 0xF0, 0x3F, 0x1F, 0x80, 0xFC, 0x7E, 0x01, 0xFB, 0xF0, 0x07, + 0xF0, 0xFC, 0x01, 0xFF, 0xE0, 0x0F, 0x9F, 0x00, 0xFC, 0xFC, 0x07, 0xC3, + 0xE0, 0x7E, 0x1F, 0x83, 0xE0, 0x7C, 0x1F, 0x03, 0xF1, 0xF0, 0x0F, 0x8F, + 0x80, 0x7E, 0xF8, 0x01, 0xF7, 0xC0, 0x0F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, + 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x7E, 0x00, 0x1F, + 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF8, + 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x00, + 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, + 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x38, 0x06, + 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C, 0x03, 0x80, + 0x60, 0x18, 0x07, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E, + 0x78, 0x1E, 0x78, 0x1E, 0x70, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0x07, 0xF8, 0x07, + 0xFF, 0x83, 0xFF, 0xF1, 0xFF, 0xFE, 0x7C, 0x1F, 0xBE, 0x03, 0xE0, 0x00, + 0xF8, 0x01, 0xFE, 0x0F, 0xFF, 0x8F, 0xFF, 0xE7, 0xF8, 0xFB, 0xF0, 0x3E, + 0xF8, 0x0F, 0xBE, 0x07, 0xEF, 0xC3, 0xFB, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F, + 0xFB, 0xF1, 0xF8, 0xFC, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE7, 0xE0, 0xFB, 0xFC, + 0x3F, 0xFF, 0xCF, 0xFF, 0xF3, 0xF8, 0x7E, 0xFC, 0x0F, 0xBF, 0x03, 0xFF, + 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xF0, + 0x3F, 0xFC, 0x0F, 0xBF, 0x87, 0xEF, 0xFF, 0xF3, 0xFF, 0xFC, 0xFB, 0xFC, + 0x3E, 0x7E, 0x00, 0x03, 0xF0, 0x07, 0xFE, 0x0F, 0xFF, 0x87, 0xFF, 0xE7, + 0xE1, 0xFB, 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0xFB, 0xE0, 0x7D, 0xF8, 0x7E, 0x7F, + 0xFE, 0x3F, 0xFE, 0x0F, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x1F, 0x0F, 0xFB, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0x8F, + 0xF7, 0xC0, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFE, 0x03, 0xF7, 0xC0, 0x7E, 0xFC, 0x3F, + 0xCF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xFB, 0xE0, 0xFC, 0x7C, 0x07, 0xE0, + 0x07, 0xFE, 0x03, 0xFF, 0xE0, 0xFF, 0xF8, 0x7E, 0x1F, 0x1F, 0x03, 0xCF, + 0x80, 0xFB, 0xE0, 0x1E, 0xFF, 0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xFB, 0xE0, + 0x00, 0xF8, 0x00, 0x3F, 0x03, 0xE7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE, + 0x07, 0xFF, 0x00, 0x7F, 0x00, 0x0F, 0xC7, 0xF3, 0xFC, 0xFF, 0x3E, 0x0F, + 0x83, 0xE3, 0xFE, 0xFF, 0xBF, 0xE3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, + 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, + 0x0F, 0x80, 0x07, 0xC7, 0xC3, 0xFD, 0xF3, 0xFF, 0xFC, 0xFF, 0xFF, 0x7E, + 0x1F, 0xDF, 0x03, 0xFF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, 0xFE, 0x01, + 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xDF, 0x03, 0xF7, 0xE1, 0xFD, + 0xFF, 0xFF, 0x3F, 0xFF, 0xC7, 0xFD, 0xF0, 0x7C, 0x7C, 0x00, 0x1F, 0x00, + 0x07, 0xFF, 0x03, 0xF7, 0xE1, 0xF9, 0xFF, 0xFC, 0x3F, 0xFE, 0x01, 0xFE, + 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xF1, 0xF0, 0xFB, 0xFE, 0x7F, 0xFF, 0xBF, 0xFF, + 0xDF, 0xC3, 0xFF, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, + 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x3E, 0x7C, 0xF9, 0xF0, 0x00, 0x00, 0x1F, 0x3E, 0x7C, 0xF9, + 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, + 0x7C, 0xF9, 0xF3, 0xFF, 0xFF, 0xFE, 0xF8, 0xF8, 0x00, 0x7C, 0x00, 0x3E, + 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x3E, + 0xF8, 0x3E, 0x7C, 0x3F, 0x3E, 0x3F, 0x1F, 0x3F, 0x0F, 0x9F, 0x07, 0xDF, + 0x03, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xF0, 0x7F, 0xF8, 0x3F, 0x7E, 0x1F, + 0x1F, 0x0F, 0x87, 0xC7, 0xC3, 0xF3, 0xE0, 0xF9, 0xF0, 0x7E, 0xF8, 0x1F, + 0x7C, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0xF8, 0x3F, 0x1F, + 0x7F, 0x9F, 0xF3, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xC3, 0xF8, + 0x7F, 0xF8, 0x3F, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0, 0xF8, 0x1F, 0xF8, + 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xFC, 0x0F, 0x81, + 0xFF, 0x81, 0xF0, 0x3F, 0xF0, 0x3E, 0x07, 0xFE, 0x07, 0xC0, 0xFF, 0xC0, + 0xF8, 0x1F, 0xF8, 0x1F, 0x03, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, + 0x80, 0xF8, 0xF8, 0x7D, 0xFF, 0x3F, 0xFF, 0xDF, 0xFF, 0xEF, 0xE1, 0xFF, + 0xE0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, + 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, + 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xE0, 0x03, 0xF8, 0x01, 0xFF, 0xC0, 0x7F, + 0xFC, 0x1F, 0xFF, 0xC7, 0xF0, 0xFC, 0xF8, 0x0F, 0xBF, 0x01, 0xFF, 0xC0, + 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0, + 0x7E, 0xF8, 0x0F, 0x9F, 0x87, 0xF1, 0xFF, 0xFC, 0x1F, 0xFF, 0x01, 0xFF, + 0xC0, 0x0F, 0xE0, 0x00, 0xF8, 0xF8, 0x3E, 0xFF, 0x8F, 0xFF, 0xF3, 0xFF, + 0xFC, 0xFE, 0x1F, 0xBF, 0x03, 0xEF, 0xC0, 0xFF, 0xE0, 0x1F, 0xF8, 0x07, + 0xFE, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xFC, 0x0F, 0xFF, 0x03, 0xEF, + 0xE1, 0xFB, 0xFF, 0xFC, 0xFF, 0xFF, 0x3E, 0xFF, 0x0F, 0x8F, 0x83, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0xE3, 0xE1, 0xFF, 0x7C, 0x7F, 0xFF, 0x9F, 0xFF, + 0xF7, 0xF1, 0xFE, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0xC0, 0x7E, 0xF8, 0x0F, + 0xDF, 0x83, 0xF9, 0xFF, 0xFF, 0x3F, 0xFF, 0xE1, 0xFF, 0x7C, 0x1F, 0x8F, + 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0xF8, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xE1, + 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, + 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x0F, 0xFE, + 0x0F, 0xFF, 0x87, 0xFF, 0xE7, 0xE1, 0xF3, 0xE0, 0x79, 0xF8, 0x00, 0xFF, + 0x80, 0x3F, 0xFC, 0x1F, 0xFF, 0x83, 0xFF, 0xC0, 0x3F, 0xF0, 0x01, 0xFF, + 0xC0, 0x7D, 0xF0, 0x7E, 0xFF, 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0x01, 0xFE, + 0x00, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0x3E, 0x1F, + 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xF3, + 0xF8, 0xFC, 0x3E, 0xF8, 0x0F, 0xFC, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, + 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x1F, 0xF8, 0x0F, 0xFC, 0x07, + 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xFF, + 0xFF, 0x7F, 0xFF, 0x9F, 0xF7, 0xC7, 0xE3, 0xE0, 0x7C, 0x07, 0xCF, 0x80, + 0xF9, 0xF0, 0x1F, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0x83, + 0xC0, 0xF8, 0xF8, 0x1F, 0x1F, 0x01, 0xE3, 0xC0, 0x3E, 0x78, 0x07, 0xDF, + 0x00, 0x7B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x03, 0xF8, + 0x00, 0x7F, 0x00, 0x07, 0xC0, 0x00, 0xFC, 0x1F, 0x03, 0xEF, 0x83, 0xE0, + 0x7D, 0xF0, 0x7E, 0x1F, 0x3E, 0x0F, 0xC3, 0xE3, 0xC3, 0xF8, 0x7C, 0x7C, + 0x7F, 0x0F, 0x0F, 0x8F, 0xF3, 0xE1, 0xF1, 0xDE, 0x7C, 0x1E, 0x7B, 0xCF, + 0x83, 0xEF, 0x39, 0xE0, 0x7D, 0xE7, 0x3C, 0x07, 0xB8, 0xFF, 0x80, 0xF7, + 0x1F, 0xE0, 0x1F, 0xE3, 0xFC, 0x03, 0xFC, 0x3F, 0x80, 0x3F, 0x07, 0xF0, + 0x07, 0xE0, 0xFC, 0x00, 0xFC, 0x1F, 0x80, 0x0F, 0x83, 0xF0, 0x00, 0xFC, + 0x1F, 0x9F, 0x07, 0xE7, 0xE3, 0xF0, 0xF8, 0xF8, 0x1F, 0x7E, 0x07, 0xDF, + 0x00, 0xFF, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0x00, 0xF8, 0x00, 0x7F, 0x00, + 0x3F, 0xE0, 0x0F, 0xF8, 0x07, 0xDF, 0x03, 0xF7, 0xE0, 0xF8, 0xF8, 0x7E, + 0x3F, 0x1F, 0x07, 0xEF, 0xC0, 0xF8, 0x7C, 0x03, 0xEF, 0x80, 0xF9, 0xF8, + 0x1F, 0x1F, 0x03, 0xE3, 0xE0, 0xF8, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, + 0x78, 0x0F, 0x1F, 0x01, 0xF3, 0xC0, 0x3E, 0x78, 0x03, 0xDF, 0x00, 0x7F, + 0xC0, 0x0F, 0xF8, 0x00, 0xFF, 0x00, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x07, 0xF8, + 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x03, 0xE0, 0x00, 0x7F, 0xFE, 0x7F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, + 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, + 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x87, + 0xC7, 0xE3, 0xF1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, + 0xE0, 0xF0, 0xF9, 0xF8, 0xF0, 0x7E, 0x0F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, + 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xFC, 0x7E, 0x1F, 0x07, 0x80, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0xF0, 0x7C, 0x3E, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, + 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x1F, 0x83, 0xC7, 0xE7, 0xC3, + 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC7, 0xE3, 0xE1, + 0xF0, 0xF0, 0x00, 0x3C, 0x00, 0xFE, 0x0F, 0xFE, 0x1E, 0x1F, 0xFC, 0x0F, + 0xC0, 0x0F, 0x00 }; + +const GFXglyph FreeSansBold18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 10, 0, 1 }, // 0x20 ' ' + { 0, 5, 25, 12, 4, -24 }, // 0x21 '!' + { 16, 13, 9, 17, 2, -25 }, // 0x22 '"' + { 31, 20, 24, 19, 0, -23 }, // 0x23 '#' + { 91, 19, 29, 19, 0, -25 }, // 0x24 '$' + { 160, 29, 25, 31, 1, -24 }, // 0x25 '%' + { 251, 22, 25, 25, 2, -24 }, // 0x26 '&' + { 320, 5, 9, 9, 2, -25 }, // 0x27 ''' + { 326, 9, 33, 12, 1, -25 }, // 0x28 '(' + { 364, 9, 33, 12, 1, -25 }, // 0x29 ')' + { 402, 12, 11, 14, 0, -25 }, // 0x2A '*' + { 419, 16, 16, 20, 2, -15 }, // 0x2B '+' + { 451, 5, 11, 9, 2, -4 }, // 0x2C ',' + { 458, 9, 4, 12, 1, -10 }, // 0x2D '-' + { 463, 5, 5, 9, 2, -4 }, // 0x2E '.' + { 467, 9, 25, 10, 0, -24 }, // 0x2F '/' + { 496, 17, 25, 19, 1, -24 }, // 0x30 '0' + { 550, 10, 25, 19, 3, -24 }, // 0x31 '1' + { 582, 17, 25, 19, 1, -24 }, // 0x32 '2' + { 636, 17, 25, 19, 1, -24 }, // 0x33 '3' + { 690, 16, 25, 19, 2, -24 }, // 0x34 '4' + { 740, 17, 25, 19, 1, -24 }, // 0x35 '5' + { 794, 18, 25, 19, 1, -24 }, // 0x36 '6' + { 851, 17, 25, 19, 1, -24 }, // 0x37 '7' + { 905, 17, 25, 19, 1, -24 }, // 0x38 '8' + { 959, 17, 25, 19, 1, -24 }, // 0x39 '9' + { 1013, 5, 18, 9, 2, -17 }, // 0x3A ':' + { 1025, 5, 24, 9, 2, -17 }, // 0x3B ';' + { 1040, 18, 17, 20, 1, -16 }, // 0x3C '<' + { 1079, 17, 12, 20, 2, -13 }, // 0x3D '=' + { 1105, 18, 17, 20, 1, -16 }, // 0x3E '>' + { 1144, 18, 26, 21, 2, -25 }, // 0x3F '?' + { 1203, 32, 31, 34, 1, -25 }, // 0x40 '@' + { 1327, 24, 26, 24, 0, -25 }, // 0x41 'A' + { 1405, 20, 26, 25, 3, -25 }, // 0x42 'B' + { 1470, 23, 26, 25, 1, -25 }, // 0x43 'C' + { 1545, 21, 26, 25, 3, -25 }, // 0x44 'D' + { 1614, 19, 26, 23, 3, -25 }, // 0x45 'E' + { 1676, 17, 26, 22, 3, -25 }, // 0x46 'F' + { 1732, 24, 26, 27, 1, -25 }, // 0x47 'G' + { 1810, 20, 26, 26, 3, -25 }, // 0x48 'H' + { 1875, 5, 26, 11, 3, -25 }, // 0x49 'I' + { 1892, 16, 26, 20, 1, -25 }, // 0x4A 'J' + { 1944, 22, 26, 25, 3, -25 }, // 0x4B 'K' + { 2016, 17, 26, 22, 3, -25 }, // 0x4C 'L' + { 2072, 24, 26, 30, 3, -25 }, // 0x4D 'M' + { 2150, 20, 26, 26, 3, -25 }, // 0x4E 'N' + { 2215, 25, 26, 27, 1, -25 }, // 0x4F 'O' + { 2297, 19, 26, 24, 3, -25 }, // 0x50 'P' + { 2359, 25, 27, 27, 1, -25 }, // 0x51 'Q' + { 2444, 21, 26, 25, 3, -25 }, // 0x52 'R' + { 2513, 20, 26, 24, 2, -25 }, // 0x53 'S' + { 2578, 19, 26, 23, 2, -25 }, // 0x54 'T' + { 2640, 20, 26, 26, 3, -25 }, // 0x55 'U' + { 2705, 22, 26, 23, 1, -25 }, // 0x56 'V' + { 2777, 32, 26, 34, 1, -25 }, // 0x57 'W' + { 2881, 22, 26, 24, 1, -25 }, // 0x58 'X' + { 2953, 21, 26, 22, 1, -25 }, // 0x59 'Y' + { 3022, 19, 26, 21, 1, -25 }, // 0x5A 'Z' + { 3084, 8, 33, 12, 2, -25 }, // 0x5B '[' + { 3117, 10, 25, 10, 0, -24 }, // 0x5C '\' + { 3149, 8, 33, 12, 1, -25 }, // 0x5D ']' + { 3182, 16, 15, 20, 2, -23 }, // 0x5E '^' + { 3212, 21, 3, 19, -1, 5 }, // 0x5F '_' + { 3220, 7, 5, 9, 1, -25 }, // 0x60 '`' + { 3225, 18, 19, 20, 1, -18 }, // 0x61 'a' + { 3268, 18, 26, 22, 2, -25 }, // 0x62 'b' + { 3327, 17, 19, 20, 1, -18 }, // 0x63 'c' + { 3368, 19, 26, 22, 1, -25 }, // 0x64 'd' + { 3430, 18, 19, 20, 1, -18 }, // 0x65 'e' + { 3473, 10, 26, 12, 1, -25 }, // 0x66 'f' + { 3506, 18, 26, 21, 1, -18 }, // 0x67 'g' + { 3565, 17, 26, 21, 2, -25 }, // 0x68 'h' + { 3621, 5, 26, 10, 2, -25 }, // 0x69 'i' + { 3638, 7, 33, 10, 0, -25 }, // 0x6A 'j' + { 3667, 17, 26, 20, 2, -25 }, // 0x6B 'k' + { 3723, 5, 26, 9, 2, -25 }, // 0x6C 'l' + { 3740, 27, 19, 31, 2, -18 }, // 0x6D 'm' + { 3805, 17, 19, 21, 2, -18 }, // 0x6E 'n' + { 3846, 19, 19, 21, 1, -18 }, // 0x6F 'o' + { 3892, 18, 26, 22, 2, -18 }, // 0x70 'p' + { 3951, 19, 26, 22, 1, -18 }, // 0x71 'q' + { 4013, 11, 19, 14, 2, -18 }, // 0x72 'r' + { 4040, 17, 19, 19, 1, -18 }, // 0x73 's' + { 4081, 9, 23, 12, 1, -22 }, // 0x74 't' + { 4107, 17, 19, 21, 2, -18 }, // 0x75 'u' + { 4148, 19, 19, 19, 0, -18 }, // 0x76 'v' + { 4194, 27, 19, 27, 0, -18 }, // 0x77 'w' + { 4259, 18, 19, 19, 1, -18 }, // 0x78 'x' + { 4302, 19, 26, 19, 0, -18 }, // 0x79 'y' + { 4364, 16, 19, 18, 1, -18 }, // 0x7A 'z' + { 4402, 9, 33, 14, 1, -25 }, // 0x7B '{' + { 4440, 3, 33, 10, 4, -25 }, // 0x7C '|' + { 4453, 9, 33, 14, 3, -25 }, // 0x7D '}' + { 4491, 15, 6, 18, 1, -10 } }; // 0x7E '~' + +const GFXfont FreeSansBold18pt7b PROGMEM = { + (uint8_t *)FreeSansBold18pt7bBitmaps, + (GFXglyph *)FreeSansBold18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 5175 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold24pt7b.h new file mode 100644 index 0000000..aadc9a1 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold24pt7b.h @@ -0,0 +1,784 @@ +const uint8_t FreeSansBold24pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xDF, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xC7, 0x0E, 0x1C, 0x00, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, + 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFD, 0xF0, 0x3E, + 0x7C, 0x0F, 0x9F, 0x03, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x00, 0xF8, 0x3E, + 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, + 0x7C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC1, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, + 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x1F, 0x00, 0x1F, 0x07, + 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x03, 0xFF, + 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, + 0xFF, 0xFF, 0xFC, 0x0F, 0x87, 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, + 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC3, 0xE0, 0x03, 0xE0, + 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0x73, 0xFE, 0x7F, 0x38, + 0xFF, 0x3F, 0x1C, 0x3F, 0xDF, 0x8E, 0x0F, 0xEF, 0xC7, 0x07, 0xF7, 0xE3, + 0x80, 0x03, 0xF9, 0xC0, 0x01, 0xFE, 0xE0, 0x00, 0x7F, 0xF0, 0x00, 0x3F, + 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x80, + 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xE7, 0xFC, 0x00, 0x71, 0xFF, + 0x00, 0x38, 0x7F, 0xFF, 0x1C, 0x1F, 0xFF, 0x8E, 0x0F, 0xFF, 0xC7, 0x07, + 0xFF, 0xE3, 0x87, 0xFB, 0xF9, 0xC3, 0xF9, 0xFE, 0xE7, 0xFC, 0x7F, 0xFF, + 0xFC, 0x3F, 0xFF, 0xFC, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x00, 0x3F, + 0xE0, 0x00, 0x03, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x70, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x78, 0x00, + 0x7F, 0xF8, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0x03, 0xC0, 0x07, 0xFF, 0xF0, + 0x0F, 0x00, 0x0F, 0x83, 0xE0, 0x1E, 0x00, 0x3E, 0x03, 0xE0, 0x78, 0x00, + 0x78, 0x03, 0xC0, 0xF0, 0x00, 0xF0, 0x07, 0x83, 0xC0, 0x01, 0xE0, 0x0F, + 0x07, 0x80, 0x03, 0xE0, 0x3E, 0x1E, 0x00, 0x03, 0xE0, 0xF8, 0x3C, 0x00, + 0x07, 0xFF, 0xF0, 0xF0, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x07, 0xFF, + 0x07, 0x80, 0x00, 0x07, 0xFC, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0xFF, 0x80, 0x00, + 0x07, 0x87, 0xFF, 0xC0, 0x00, 0x0F, 0x0F, 0xFF, 0x80, 0x00, 0x3C, 0x3F, + 0xFF, 0x80, 0x00, 0x78, 0xFC, 0x1F, 0x00, 0x01, 0xE1, 0xF0, 0x1F, 0x00, + 0x03, 0xC3, 0xC0, 0x1E, 0x00, 0x0F, 0x07, 0x80, 0x3C, 0x00, 0x1E, 0x0F, + 0x00, 0x78, 0x00, 0x78, 0x1F, 0x01, 0xF0, 0x00, 0xF0, 0x1F, 0x07, 0xC0, + 0x03, 0xC0, 0x3F, 0xFF, 0x80, 0x07, 0x80, 0x3F, 0xFE, 0x00, 0x1E, 0x00, + 0x7F, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0xE0, 0x00, 0xF0, 0x00, 0x1F, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xCF, 0xC0, 0x00, 0xFE, + 0x1F, 0x00, 0x03, 0xF8, 0x7C, 0x00, 0x0F, 0xE1, 0xF0, 0x00, 0x3F, 0xC7, + 0xC0, 0x00, 0x7F, 0x3E, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x07, 0xFF, 0x03, 0xE0, 0x3F, 0xFE, 0x0F, 0x83, 0xFF, 0xF8, 0x3E, 0x1F, + 0xF3, 0xF1, 0xF8, 0x7F, 0x07, 0xE7, 0xE3, 0xFC, 0x1F, 0xFF, 0x0F, 0xE0, + 0x3F, 0xFC, 0x3F, 0x80, 0x7F, 0xF0, 0xFE, 0x01, 0xFF, 0x83, 0xF8, 0x03, + 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0x3F, 0xE0, 0x7F, 0xE0, 0x7F, 0xC3, 0xFF, + 0xC1, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFB, 0xFC, + 0x0F, 0xFF, 0xC7, 0xF8, 0x1F, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7C, 0xF8, 0xE1, 0xC0, 0x00, + 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0, + 0x1F, 0x80, 0xF8, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, + 0xC0, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, + 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0x01, + 0xF8, 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xC0, 0x3F, 0x00, 0xF8, 0x07, + 0xE0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x7C, 0x01, 0xE0, 0x78, + 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, + 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, + 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x3F, 0x01, 0xF8, + 0x0F, 0xC0, 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x1F, 0x80, 0xF8, 0x0F, + 0xC0, 0x7C, 0x07, 0xE0, 0x3E, 0x03, 0xF0, 0x1F, 0x01, 0xF0, 0x00, 0x03, + 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x06, 0x38, 0xDF, 0xFF, 0xFF, 0xFF, + 0x9F, 0xFE, 0x07, 0xC0, 0x1F, 0xC0, 0x3F, 0x80, 0xF7, 0x83, 0xC7, 0x87, + 0x8F, 0x02, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, + 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x87, 0x0E, 0x1C, 0x78, 0xEF, 0xDF, 0x38, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x38, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, + 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, + 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, + 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x1F, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFE, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x81, 0xFE, 0x3F, + 0xC3, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x0F, + 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0x3C, 0x01, 0xF0, + 0x07, 0xC0, 0x3F, 0x01, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, + 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, + 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x01, 0xFE, 0x00, 0x0F, 0xFF, 0x80, + 0x3F, 0xFF, 0x80, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x9F, + 0xE0, 0xFF, 0x7F, 0x80, 0xFF, 0xFE, 0x01, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, + 0x03, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, + 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01, + 0xFC, 0x00, 0x03, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x01, 0xFE, 0x00, 0x0F, + 0xFF, 0x80, 0x7F, 0xFF, 0x81, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0x8F, 0xFF, + 0xFF, 0x1F, 0xE1, 0xFF, 0x7F, 0x81, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, 0x03, + 0xFB, 0xF8, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7F, + 0x00, 0x01, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0xC0, + 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, + 0x07, 0xFF, 0xF8, 0x0F, 0xF7, 0xF8, 0x3F, 0xCF, 0xFF, 0xFF, 0x9F, 0xFF, + 0xFE, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x07, 0xF8, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, + 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x7B, 0xF8, 0x01, + 0xEF, 0xE0, 0x0F, 0x3F, 0x80, 0x78, 0xFE, 0x01, 0xE3, 0xF8, 0x0F, 0x0F, + 0xE0, 0x38, 0x3F, 0x81, 0xE0, 0xFE, 0x07, 0x03, 0xF8, 0x3C, 0x0F, 0xE1, + 0xE0, 0x3F, 0x87, 0x00, 0xFE, 0x3C, 0x03, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, + 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, 0xFC, 0x3F, + 0xFF, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0x8F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xF1, 0xF8, 0x03, 0xEF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, + 0x1F, 0xFF, 0xFE, 0x7F, 0xFF, 0xFC, 0xFE, 0x07, 0xFC, 0x00, 0x07, 0xF8, + 0x00, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, + 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF8, + 0x0F, 0xF7, 0xF8, 0x3F, 0xEF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0x0F, 0xFF, + 0xFC, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x00, 0xFF, + 0x00, 0x07, 0xFF, 0x80, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xFF, 0xFF, + 0x87, 0xFF, 0xFF, 0x8F, 0xF0, 0xFF, 0x3F, 0xC0, 0xFE, 0x7F, 0x00, 0x00, + 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE3, 0xF0, 0x1F, + 0xDF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0xFF, 0xFF, 0xF9, 0xFF, + 0x87, 0xFB, 0xFC, 0x07, 0xF7, 0xF8, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, + 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0x7E, 0x00, 0xFE, 0xFC, 0x01, + 0xFD, 0xFC, 0x07, 0xFB, 0xF8, 0x0F, 0xE3, 0xFC, 0x7F, 0xC7, 0xFF, 0xFF, + 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0x80, + 0x03, 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0x00, + 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x7F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, + 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF0, + 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x7F, 0x83, 0xFC, 0x7F, + 0x00, 0xFC, 0x7E, 0x00, 0xFC, 0x7E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7E, + 0x00, 0xFC, 0x3F, 0x00, 0xF8, 0x3F, 0x83, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, + 0xFF, 0xC0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F, + 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, + 0x00, 0xFE, 0x7F, 0x83, 0xFE, 0x7F, 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, + 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xC3, 0xFC, 0x7F, 0x01, 0xFE, 0xFF, + 0x00, 0xFE, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0x7F, + 0x01, 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xFC, 0x7E, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x01, 0xFC, 0x7F, + 0x83, 0xFC, 0x7F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF0, 0x1F, + 0xFF, 0xE0, 0x07, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x1C, 0x38, 0x71, 0xE7, 0xBF, 0x7C, 0xE0, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xF0, 0x01, + 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, 0x7F, 0xFC, + 0x01, 0xFF, 0xC0, 0x03, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xE0, 0x00, + 0x1F, 0xF8, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, + 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x80, 0x00, + 0x01, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFE, 0x00, + 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, + 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xE0, + 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0xFF, 0xF8, 0x0F, 0xFF, 0x80, 0xFF, + 0xFC, 0x03, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x1E, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xFF, 0xC0, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, + 0x83, 0xFE, 0x7F, 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFE, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, + 0x01, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, + 0x3F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x7F, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xE0, + 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, + 0x03, 0xFE, 0x01, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x07, 0xF0, 0x00, + 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x3F, 0x00, 0x00, 0x00, + 0x3E, 0x0F, 0xC0, 0x07, 0xE3, 0xC3, 0xE1, 0xF0, 0x03, 0xFE, 0xF8, 0x3C, + 0x7E, 0x01, 0xFF, 0xFF, 0x07, 0x8F, 0x80, 0x7E, 0x1F, 0xC0, 0x7B, 0xF0, + 0x1F, 0x81, 0xF8, 0x0F, 0x7C, 0x03, 0xE0, 0x1F, 0x01, 0xEF, 0x80, 0xF8, + 0x03, 0xC0, 0x3F, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xFC, 0x07, 0xC0, 0x0F, + 0x00, 0xFF, 0x80, 0xF0, 0x01, 0xE0, 0x1F, 0xF0, 0x1E, 0x00, 0x38, 0x07, + 0xFE, 0x07, 0xC0, 0x0F, 0x00, 0xFF, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0xF8, + 0x1F, 0x00, 0x38, 0x07, 0xDF, 0x03, 0xE0, 0x0F, 0x00, 0xF3, 0xF0, 0x7C, + 0x03, 0xE0, 0x3E, 0x3E, 0x0F, 0xC0, 0xFC, 0x0F, 0x87, 0xC0, 0xFC, 0x3F, + 0xC7, 0xF0, 0xFC, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xC1, 0xFF, 0xEF, 0xFF, + 0x01, 0xFC, 0x1F, 0xF8, 0xFF, 0x80, 0x1F, 0xC0, 0xFC, 0x07, 0xC0, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, + 0x0F, 0xF8, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0x1F, 0xFC, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, + 0x3F, 0xFE, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, + 0x7F, 0x7F, 0x00, 0x00, 0x7E, 0x3F, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x00, + 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x1F, 0x80, 0x01, 0xFC, 0x1F, 0xC0, 0x01, + 0xF8, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x03, 0xF8, 0x0F, 0xE0, 0x03, + 0xF0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x07, + 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x1F, + 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, + 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x00, 0xFE, 0x3F, 0x80, 0x00, 0xFE, 0x7F, + 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, + 0x8F, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0x80, 0x1F, 0xF7, 0xF0, + 0x01, 0xFE, 0xFE, 0x00, 0x1F, 0xDF, 0xC0, 0x03, 0xFB, 0xF8, 0x00, 0x7F, + 0x7F, 0x00, 0x1F, 0xCF, 0xE0, 0x07, 0xF9, 0xFF, 0xFF, 0xFE, 0x3F, 0xFF, + 0xFF, 0x87, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF, 0xE3, + 0xFF, 0xFF, 0xFE, 0x7F, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFD, 0xFC, 0x00, + 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, + 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xEF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFC, 0x1F, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0xC1, 0xFF, 0x81, 0xFF, 0x0F, 0xF8, 0x01, 0xFE, + 0x3F, 0xC0, 0x07, 0xF9, 0xFE, 0x00, 0x0F, 0xE7, 0xF8, 0x00, 0x1F, 0xDF, + 0xC0, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0x7F, 0x00, 0x01, 0xFD, 0xFC, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x3F, 0xCF, + 0xF0, 0x00, 0xFE, 0x3F, 0xE0, 0x07, 0xF8, 0x7F, 0xE0, 0x7F, 0xC0, 0xFF, + 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, + 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0xFF, 0xFF, 0xC0, + 0x0F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0xFE, 0x00, 0xFF, 0xCF, 0xE0, 0x03, + 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, + 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, + 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, + 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x1F, + 0xEF, 0xE0, 0x01, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x0F, 0xFC, 0xFF, + 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, + 0xFF, 0xFF, 0xFB, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFE, 0x7F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x9F, 0xC0, 0x00, 0x0F, 0xE0, + 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFC, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, + 0x07, 0xFE, 0x03, 0xFF, 0x0F, 0xF0, 0x01, 0xFE, 0x3F, 0xC0, 0x01, 0xFC, + 0x7F, 0x00, 0x01, 0xFD, 0xFE, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xF8, + 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0, + 0x07, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, 0xBF, 0x80, 0x00, 0x3F, 0x7F, 0x00, + 0x00, 0x7E, 0xFF, 0x00, 0x01, 0xFC, 0xFF, 0x00, 0x03, 0xF9, 0xFF, 0x00, + 0x0F, 0xF1, 0xFF, 0x00, 0x3F, 0xE3, 0xFF, 0x83, 0xFF, 0xC3, 0xFF, 0xFF, + 0xFF, 0x83, 0xFF, 0xFF, 0xDF, 0x03, 0xFF, 0xFF, 0x9E, 0x03, 0xFF, 0xFE, + 0x3C, 0x01, 0xFF, 0xF0, 0x78, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x0F, + 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, + 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, + 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, + 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, + 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, + 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, + 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, + 0xFF, 0xC0, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, + 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, + 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, + 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, + 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0xE0, + 0x1F, 0xFF, 0x80, 0x7F, 0xFE, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xE0, 0x1F, + 0xFF, 0xC0, 0xFF, 0xFF, 0x87, 0xFD, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x7F, 0x8F, 0xE0, 0x03, 0xFC, 0x3F, 0x80, + 0x1F, 0xE0, 0xFE, 0x00, 0xFF, 0x83, 0xF8, 0x07, 0xFC, 0x0F, 0xE0, 0x1F, + 0xE0, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x07, 0xF8, 0x03, 0xF8, 0x3F, 0xC0, + 0x0F, 0xE1, 0xFE, 0x00, 0x3F, 0x8F, 0xF0, 0x00, 0xFE, 0x7F, 0x80, 0x03, + 0xFB, 0xFC, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0xFF, + 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x3F, 0xF7, + 0xF8, 0x00, 0xFF, 0x8F, 0xF0, 0x03, 0xFC, 0x3F, 0xC0, 0x0F, 0xE0, 0x7F, + 0x80, 0x3F, 0x80, 0xFF, 0x00, 0xFE, 0x01, 0xFE, 0x03, 0xF8, 0x07, 0xFC, + 0x0F, 0xE0, 0x0F, 0xF0, 0x3F, 0x80, 0x1F, 0xE0, 0xFE, 0x00, 0x3F, 0xC3, + 0xF8, 0x00, 0xFF, 0x8F, 0xE0, 0x01, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0xFE, + 0x00, 0x07, 0xFB, 0xF8, 0x00, 0x1F, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, + 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, + 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, + 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, + 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, + 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xE0, 0x03, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xFC, + 0x07, 0xFF, 0xFF, 0xBE, 0x03, 0xEF, 0xFF, 0xDF, 0x01, 0xF7, 0xFF, 0xEF, + 0x80, 0xFB, 0xFF, 0xF7, 0xC0, 0xFD, 0xFF, 0xFB, 0xF0, 0x7C, 0xFF, 0xFC, + 0xF8, 0x3E, 0x7F, 0xFE, 0x7C, 0x1F, 0x3F, 0xFF, 0x3E, 0x0F, 0x9F, 0xFF, + 0x9F, 0x8F, 0x8F, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, + 0xF1, 0xF1, 0xF1, 0xFF, 0xF8, 0xFC, 0xF8, 0xFF, 0xFC, 0x3E, 0xF8, 0x7F, + 0xFE, 0x1F, 0x7C, 0x3F, 0xFF, 0x0F, 0xBE, 0x1F, 0xFF, 0x87, 0xDF, 0x0F, + 0xFF, 0xC3, 0xFF, 0x07, 0xFF, 0xE0, 0xFF, 0x83, 0xFF, 0xF0, 0x7F, 0xC1, + 0xFF, 0xF8, 0x3F, 0xE0, 0xFF, 0xFC, 0x1F, 0xF0, 0x7F, 0xFE, 0x07, 0xF0, + 0x3F, 0xFF, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, + 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xC0, 0x07, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xF0, + 0x07, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xEF, 0xC0, 0x7F, + 0xFE, 0xFE, 0x07, 0xFF, 0xE7, 0xE0, 0x7F, 0xFE, 0x7F, 0x07, 0xFF, 0xE3, + 0xF0, 0x7F, 0xFE, 0x1F, 0x87, 0xFF, 0xE1, 0xFC, 0x7F, 0xFE, 0x0F, 0xC7, + 0xFF, 0xE0, 0xFE, 0x7F, 0xFE, 0x07, 0xE7, 0xFF, 0xE0, 0x3F, 0x7F, 0xFE, + 0x03, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xE0, 0x0F, + 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, + 0x0F, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, + 0x80, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0, + 0x0F, 0xF8, 0x3F, 0xC0, 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, + 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8, + 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE, + 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, + 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, + 0xFC, 0x00, 0x01, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x7F, + 0x3F, 0xC0, 0x00, 0x7F, 0x8F, 0xE0, 0x00, 0x3F, 0x87, 0xF8, 0x00, 0x3F, + 0xC1, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, + 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xEF, 0xE0, 0x0F, 0xFB, 0xF8, 0x00, 0xFF, + 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xF8, 0x00, + 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF8, + 0x03, 0xFE, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xF3, + 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x0F, 0xE0, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, + 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x7F, 0xFF, + 0xE0, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, + 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x3F, 0xC0, + 0x01, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0, + 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xF8, + 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, 0xFF, + 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x21, 0xFE, + 0xFE, 0x00, 0x38, 0xFE, 0x7F, 0x00, 0x3E, 0x7F, 0x3F, 0xC0, 0x3F, 0xFF, + 0x8F, 0xE0, 0x0F, 0xFF, 0x87, 0xF8, 0x03, 0xFF, 0xC1, 0xFE, 0x00, 0xFF, + 0xC0, 0xFF, 0xC0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xCF, 0xC0, 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xF8, + 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFC, 0xFE, 0x00, 0x3F, 0xEF, 0xE0, + 0x01, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, + 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0xFC, 0xFE, + 0x00, 0x3F, 0xCF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x8F, + 0xE0, 0x07, 0xF8, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, + 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, + 0xFE, 0x00, 0x1F, 0xCF, 0xE0, 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xCF, 0xE0, + 0x01, 0xFC, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xC0, + 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xFC, 0x7F, 0xC0, 0xFF, 0xCF, 0xF0, 0x03, + 0xFE, 0xFE, 0x00, 0x1F, 0xEF, 0xE0, 0x00, 0xFE, 0xFE, 0x00, 0x0F, 0xEF, + 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xFC, + 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xF0, + 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, + 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, + 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, + 0x00, 0x0F, 0xE7, 0xFC, 0x03, 0xFE, 0x7F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFC, 0x00, + 0x07, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, + 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, + 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x03, + 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, + 0x00, 0x3F, 0xFF, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, 0x1F, + 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0xC0, + 0x01, 0xFF, 0xFC, 0x00, 0x7F, 0xBF, 0xC0, 0x1F, 0xE7, 0xFC, 0x07, 0xFC, + 0x7F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, + 0xFE, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC, 0xFE, 0x00, 0x0F, 0xE7, + 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x03, 0xF0, 0xFE, 0x00, 0x3F, 0x87, 0xF0, + 0x01, 0xFC, 0x1F, 0xC0, 0x0F, 0xC0, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x07, + 0xF0, 0x1F, 0x80, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, + 0x1F, 0x80, 0xFC, 0x00, 0xFE, 0x07, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x1F, + 0x83, 0xF0, 0x00, 0xFE, 0x1F, 0x80, 0x03, 0xF1, 0xF8, 0x00, 0x1F, 0x8F, + 0xC0, 0x00, 0xFC, 0x7E, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x1F, 0xBF, 0x00, + 0x00, 0xFD, 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFF, + 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0xFF, 0xE0, 0x07, 0xF0, 0x03, 0xFD, + 0xFC, 0x01, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xE0, 0x0F, 0xE7, 0xF0, + 0x07, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0xFF, 0x80, 0x7F, 0x8F, 0xE0, 0x1F, + 0xF0, 0x0F, 0xE1, 0xFC, 0x07, 0xFF, 0x01, 0xFC, 0x3F, 0x80, 0xFB, 0xE0, + 0x3F, 0x83, 0xF0, 0x1F, 0x7C, 0x07, 0xE0, 0x7F, 0x03, 0xEF, 0x81, 0xFC, + 0x0F, 0xE0, 0x7D, 0xF0, 0x3F, 0x80, 0xFC, 0x1F, 0x9F, 0x07, 0xF0, 0x1F, + 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0x7C, 0x7C, 0x1F, 0x80, 0x7F, 0x0F, + 0x8F, 0x87, 0xF0, 0x07, 0xE1, 0xF0, 0xF8, 0xFC, 0x00, 0xFC, 0x7E, 0x1F, + 0x1F, 0x80, 0x1F, 0x8F, 0x83, 0xE3, 0xF0, 0x01, 0xF9, 0xF0, 0x7C, 0x7E, + 0x00, 0x3F, 0x3E, 0x0F, 0x9F, 0x80, 0x07, 0xE7, 0xC0, 0xFB, 0xF0, 0x00, + 0xFD, 0xF0, 0x1F, 0x7E, 0x00, 0x0F, 0xBE, 0x03, 0xEF, 0xC0, 0x01, 0xFF, + 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F, 0xFE, 0x00, 0x03, 0xFF, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x00, 0x0F, 0xF8, 0x03, 0xFE, + 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00, + 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0x07, + 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x07, 0xF9, 0xFF, 0x00, 0x3F, 0xC3, + 0xFC, 0x00, 0xFF, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x1F, 0xC0, 0x3F, + 0xC0, 0xFF, 0x00, 0xFF, 0x07, 0xF8, 0x01, 0xFE, 0x1F, 0xE0, 0x03, 0xF8, + 0xFF, 0x00, 0x0F, 0xF3, 0xF8, 0x00, 0x1F, 0xDF, 0xE0, 0x00, 0x3F, 0xFF, + 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFF, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x7F, 0x7F, 0x80, 0x03, 0xF8, + 0xFF, 0x00, 0x1F, 0xE1, 0xFC, 0x00, 0x7F, 0x07, 0xF8, 0x03, 0xFC, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0x7F, 0x83, 0xFC, 0x01, 0xFE, + 0x0F, 0xF0, 0x03, 0xFC, 0x7F, 0x80, 0x0F, 0xFB, 0xFE, 0x00, 0x1F, 0xE0, + 0xFF, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x7F, 0x9F, 0xE0, 0x03, 0xFC, 0xFF, + 0x00, 0x3F, 0xC3, 0xFC, 0x01, 0xFE, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00, + 0xFF, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x7F, 0x80, 0x3F, 0x83, 0xF8, + 0x01, 0xFC, 0x3F, 0xC0, 0x07, 0xF1, 0xFC, 0x00, 0x3F, 0x8F, 0xE0, 0x00, + 0xFE, 0xFE, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, + 0xF8, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, + 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xC0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFE, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, + 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, + 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, + 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, + 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x03, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, + 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, + 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, + 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, + 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xF0, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, + 0x7D, 0xF0, 0x01, 0xF7, 0xC0, 0x0F, 0xDF, 0x80, 0x3E, 0x3E, 0x00, 0xF8, + 0xFC, 0x07, 0xE1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x1F, 0x83, 0xE0, 0x3E, + 0x0F, 0x80, 0xFC, 0x7E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, 0xC0, 0x1F, 0xBE, + 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x0F, 0x83, 0xC0, 0xF0, 0x38, 0x1E, + 0x01, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, + 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x7F, 0x03, 0xFC, 0x7E, 0x01, 0xFC, + 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xFC, + 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, 0xC1, 0xFC, 0xFF, 0x01, 0xFC, + 0xFE, 0x01, 0xFC, 0xFE, 0x03, 0xFC, 0xFE, 0x03, 0xFC, 0xFF, 0x07, 0xFC, + 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x7F, 0xFF, 0xFC, 0x3F, 0xFD, 0xFE, + 0x1F, 0xF0, 0xFF, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, + 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x0F, + 0xC0, 0x3F, 0x9F, 0xF8, 0x1F, 0xDF, 0xFF, 0x0F, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0xE3, 0xFF, 0xFF, 0xF9, 0xFF, 0x83, 0xFE, 0xFF, 0x80, 0xFF, 0x7F, + 0x80, 0x3F, 0xBF, 0xC0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, + 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x3F, + 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xDF, 0xF0, 0x1F, 0xEF, 0xFC, 0x1F, + 0xF7, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xF8, 0xFE, 0xFF, + 0xF8, 0x7F, 0x3F, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x07, + 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0x9F, 0xF0, 0x7F, 0xBF, 0xC0, 0x7F, 0x7F, 0x00, 0x7F, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0xFD, + 0xFE, 0x03, 0xFB, 0xFE, 0x0F, 0xF3, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x87, + 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, + 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0xFF, 0xCF, 0xE1, 0xFF, 0xF7, + 0xF1, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0x83, + 0xFF, 0x7F, 0x80, 0xFF, 0xBF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, + 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, + 0x00, 0x7F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xDF, 0xC0, 0x1F, 0xEF, + 0xF0, 0x1F, 0xF7, 0xFC, 0x1F, 0xF9, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFE, + 0x3F, 0xFF, 0xFF, 0x0F, 0xFF, 0xBF, 0x81, 0xFF, 0x9F, 0xC0, 0x3F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, + 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xC3, 0xF8, 0x7F, 0x80, 0xFC, 0x7F, 0x00, + 0xFC, 0x7F, 0x00, 0x7C, 0xFE, 0x00, 0x7E, 0xFE, 0x00, 0x7E, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0xFE, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x7F, 0x00, + 0xFE, 0x3F, 0xC1, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, + 0xF0, 0x03, 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x01, 0xFC, 0x1F, 0xF0, 0xFF, + 0xC3, 0xFF, 0x1F, 0xFC, 0x7F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, + 0x0F, 0xFF, 0xBF, 0xFE, 0xFF, 0xFB, 0xFF, 0xE1, 0xFC, 0x07, 0xF0, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, + 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, + 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x00, 0x00, 0xF8, 0x7F, 0x07, 0xFE, + 0x7F, 0x0F, 0xFF, 0x7F, 0x1F, 0xFF, 0x7F, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x7F, 0xC3, 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, + 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFF, 0x00, + 0xFF, 0x7F, 0x81, 0xFF, 0x7F, 0xC3, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0x7F, 0x07, 0xFE, 0x7F, 0x01, 0xF8, + 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x7F, 0x00, + 0xFF, 0x7F, 0x01, 0xFE, 0x7F, 0xC3, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, + 0xF8, 0x0F, 0xFF, 0xE0, 0x01, 0xFF, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x3F, 0x83, + 0xF8, 0xFF, 0xC7, 0xF7, 0xFF, 0xCF, 0xEF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0x01, 0xFF, 0xFE, 0x01, 0xFF, 0xF8, + 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, + 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, + 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, + 0xFF, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF0, 0x00, + 0x00, 0x00, 0x07, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, + 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, + 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, 0x1F, 0xC7, 0xF1, 0xFC, 0x7F, + 0x1F, 0xC7, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFE, 0xFE, 0x00, + 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, + 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, 0x00, 0xFE, + 0x00, 0x01, 0xFC, 0x03, 0xFB, 0xF8, 0x0F, 0xE7, 0xF0, 0x3F, 0xCF, 0xE0, + 0xFF, 0x1F, 0xC3, 0xFC, 0x3F, 0x87, 0xF0, 0x7F, 0x1F, 0xC0, 0xFE, 0x7F, + 0x01, 0xFD, 0xFC, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xE0, 0x7F, 0xDF, 0xC0, 0xFF, 0x3F, 0xC1, + 0xFC, 0x3F, 0x83, 0xF8, 0x3F, 0x87, 0xF0, 0x7F, 0x8F, 0xE0, 0x7F, 0x1F, + 0xC0, 0xFF, 0x3F, 0x80, 0xFE, 0x7F, 0x01, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, + 0x03, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x1F, 0x80, 0x7E, + 0x0F, 0xE7, 0xFE, 0x1F, 0xF8, 0xFE, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x83, 0xFF, 0x0F, 0xFF, 0xF0, 0x1F, 0xE0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, + 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, + 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, + 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, + 0x01, 0xFC, 0x07, 0xFF, 0xE0, 0x1F, 0xC0, 0x7F, 0xFE, 0x01, 0xFC, 0x07, + 0xF0, 0xFE, 0x1F, 0xC1, 0xFC, 0xFF, 0xE3, 0xFB, 0xFF, 0xE7, 0xFF, 0xFF, + 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0xFF, + 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, + 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, + 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, + 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFE, 0x00, + 0xFE, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0xF0, 0x01, 0xFF, 0xFE, 0x01, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF1, 0xFF, 0x07, 0xFC, 0xFF, + 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, + 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F, 0x9F, 0xE0, 0x3F, + 0xCF, 0xF8, 0x3F, 0xE3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, + 0xF0, 0x0F, 0xFF, 0xF0, 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0xFE, + 0x1F, 0x80, 0x7F, 0x3F, 0xF0, 0x3F, 0xBF, 0xFE, 0x1F, 0xDF, 0xFF, 0x8F, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF3, 0xFF, 0x07, 0xFD, 0xFF, 0x01, 0xFE, + 0xFF, 0x00, 0x7F, 0x7F, 0x80, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x07, + 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xBF, 0xE0, 0x3F, 0xDF, 0xF8, + 0x3F, 0xCF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE3, 0xFB, 0xFF, 0xE1, 0xFD, + 0xFF, 0xF0, 0xFE, 0x7F, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x81, 0xFF, 0x9F, 0xC3, 0xFF, + 0xEF, 0xE1, 0xFF, 0xF7, 0xF1, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFD, 0xFF, + 0x07, 0xFE, 0xFF, 0x01, 0xFF, 0x7F, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, + 0x80, 0x0F, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x01, 0xFF, + 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xBF, 0x80, 0x3F, + 0xDF, 0xE0, 0x3F, 0xEF, 0xF8, 0x3F, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFC, 0x7F, 0xFE, 0xFE, 0x1F, 0xFF, 0x7F, 0x03, 0xFF, 0x3F, 0x80, 0x7E, + 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0xFE, 0x1F, 0xFC, + 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x80, + 0xFF, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, + 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, + 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x07, + 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x7F, + 0x81, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0x00, 0xFE, 0x7F, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x07, + 0xFF, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, 0x81, 0xFE, 0x7F, + 0xFF, 0xFE, 0x3F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x01, + 0xFF, 0x80, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, + 0x83, 0xF8, 0x3F, 0x83, 0xF8, 0x3F, 0x83, 0xFF, 0x3F, 0xF1, 0xFF, 0x0F, + 0xF0, 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, + 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, + 0x7F, 0xFE, 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x07, + 0xFF, 0xE0, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, + 0xFE, 0x00, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xDF, 0xFF, 0xBF, 0x9F, 0xFF, 0x7F, 0x1F, + 0xFC, 0xFE, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0x9F, + 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xE1, 0xFC, 0x07, 0xF0, + 0x7E, 0x03, 0xF8, 0x3F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x07, 0xE0, 0xFE, + 0x03, 0xF8, 0x7E, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x1F, + 0x80, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xF7, 0xE0, 0x00, 0xFF, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x07, + 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0xFC, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF, 0xF8, 0x0F, 0xE0, + 0x3F, 0x3F, 0x03, 0xFE, 0x07, 0xE7, 0xE0, 0x7F, 0xC1, 0xFC, 0xFE, 0x0F, + 0xF8, 0x3F, 0x9F, 0xC1, 0xFF, 0x07, 0xE1, 0xF8, 0x3D, 0xE0, 0xFC, 0x3F, + 0x0F, 0xBE, 0x3F, 0x87, 0xF1, 0xF7, 0xC7, 0xE0, 0x7E, 0x3E, 0xF8, 0xFC, + 0x0F, 0xC7, 0xDF, 0x1F, 0x81, 0xF9, 0xF1, 0xE3, 0xF0, 0x3F, 0x3E, 0x3E, + 0xFC, 0x03, 0xF7, 0xC7, 0xDF, 0x80, 0x7E, 0xF8, 0xFB, 0xF0, 0x0F, 0xDE, + 0x1F, 0x7C, 0x00, 0xFF, 0xC1, 0xFF, 0x80, 0x1F, 0xF8, 0x3F, 0xF0, 0x03, + 0xFF, 0x07, 0xFE, 0x00, 0x7F, 0xC0, 0xFF, 0x80, 0x07, 0xF8, 0x1F, 0xF0, + 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, + 0xF0, 0x00, 0xFF, 0x00, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x81, 0xFC, 0x3F, + 0xC3, 0xFC, 0x1F, 0xC3, 0xF8, 0x0F, 0xE7, 0xF0, 0x0F, 0xEF, 0xF0, 0x07, + 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x03, + 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xE7, 0xF0, 0x1F, + 0xE7, 0xF0, 0x1F, 0xC3, 0xF8, 0x3F, 0xC3, 0xFC, 0x7F, 0x81, 0xFC, 0x7F, + 0x01, 0xFE, 0xFF, 0x00, 0xFF, 0x7F, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xDF, + 0xC0, 0x0F, 0xC7, 0xF0, 0x07, 0xE3, 0xF8, 0x07, 0xF1, 0xFC, 0x03, 0xF0, + 0x7F, 0x01, 0xF8, 0x3F, 0x81, 0xFC, 0x0F, 0xC0, 0xFC, 0x07, 0xF0, 0x7E, + 0x03, 0xF8, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0x7E, 0x1F, 0x80, 0x3F, 0x8F, + 0xC0, 0x0F, 0xCF, 0xC0, 0x07, 0xE7, 0xE0, 0x03, 0xFB, 0xF0, 0x00, 0xFD, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x07, + 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x0F, 0xFC, 0x00, + 0x07, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0xFF, + 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xBF, + 0xFF, 0xFC, 0x00, 0x3F, 0xE0, 0x03, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, + 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, + 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, 0x1F, 0xE0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0xFF, + 0x87, 0xE0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, + 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3F, + 0x0F, 0xF0, 0x7F, 0x03, 0xF8, 0x1F, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, + 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xE0, 0x3F, 0xE0, 0xFF, 0x07, 0xF8, 0x1F, + 0xC0, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x07, 0xF0, 0x3F, 0xC1, 0xFE, 0x0F, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x80, 0x7F, 0x81, 0xFC, + 0x0F, 0xE0, 0xFF, 0x0F, 0xC0, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, + 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, + 0x0F, 0xC3, 0xFE, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, 0x3F, 0x00, 0x1F, 0x00, + 0x03, 0xFE, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0xFF, 0x0F, 0xFF, 0xF0, + 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xF8 }; + +const GFXglyph FreeSansBold24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 13, 0, 1 }, // 0x20 ' ' + { 0, 7, 34, 16, 5, -33 }, // 0x21 '!' + { 30, 18, 12, 22, 2, -33 }, // 0x22 '"' + { 57, 26, 33, 26, 0, -31 }, // 0x23 '#' + { 165, 25, 40, 26, 1, -34 }, // 0x24 '$' + { 290, 39, 34, 42, 1, -32 }, // 0x25 '%' + { 456, 30, 35, 34, 3, -33 }, // 0x26 '&' + { 588, 7, 12, 12, 3, -33 }, // 0x27 ''' + { 599, 13, 44, 16, 2, -33 }, // 0x28 '(' + { 671, 13, 44, 16, 1, -33 }, // 0x29 ')' + { 743, 15, 15, 18, 1, -33 }, // 0x2A '*' + { 772, 23, 22, 27, 2, -21 }, // 0x2B '+' + { 836, 7, 15, 12, 2, -6 }, // 0x2C ',' + { 850, 13, 6, 16, 1, -15 }, // 0x2D '-' + { 860, 7, 7, 12, 2, -6 }, // 0x2E '.' + { 867, 13, 34, 13, 0, -32 }, // 0x2F '/' + { 923, 24, 35, 26, 1, -33 }, // 0x30 '0' + { 1028, 14, 33, 26, 4, -32 }, // 0x31 '1' + { 1086, 23, 34, 26, 2, -33 }, // 0x32 '2' + { 1184, 23, 35, 26, 2, -33 }, // 0x33 '3' + { 1285, 22, 33, 26, 2, -32 }, // 0x34 '4' + { 1376, 23, 34, 26, 2, -32 }, // 0x35 '5' + { 1474, 23, 35, 26, 2, -33 }, // 0x36 '6' + { 1575, 23, 33, 26, 1, -32 }, // 0x37 '7' + { 1670, 24, 35, 26, 1, -33 }, // 0x38 '8' + { 1775, 24, 35, 26, 1, -33 }, // 0x39 '9' + { 1880, 7, 25, 12, 2, -24 }, // 0x3A ':' + { 1902, 7, 33, 12, 2, -24 }, // 0x3B ';' + { 1931, 23, 23, 27, 2, -22 }, // 0x3C '<' + { 1998, 23, 18, 27, 2, -19 }, // 0x3D '=' + { 2050, 23, 23, 27, 2, -22 }, // 0x3E '>' + { 2117, 24, 35, 29, 3, -34 }, // 0x3F '?' + { 2222, 43, 41, 46, 1, -34 }, // 0x40 '@' + { 2443, 32, 34, 33, 0, -33 }, // 0x41 'A' + { 2579, 27, 34, 33, 4, -33 }, // 0x42 'B' + { 2694, 30, 36, 34, 2, -34 }, // 0x43 'C' + { 2829, 28, 34, 34, 4, -33 }, // 0x44 'D' + { 2948, 25, 34, 31, 4, -33 }, // 0x45 'E' + { 3055, 24, 34, 30, 4, -33 }, // 0x46 'F' + { 3157, 31, 36, 36, 2, -34 }, // 0x47 'G' + { 3297, 27, 34, 35, 4, -33 }, // 0x48 'H' + { 3412, 7, 34, 15, 4, -33 }, // 0x49 'I' + { 3442, 22, 35, 27, 1, -33 }, // 0x4A 'J' + { 3539, 30, 34, 34, 4, -33 }, // 0x4B 'K' + { 3667, 23, 34, 29, 4, -33 }, // 0x4C 'L' + { 3765, 33, 34, 41, 4, -33 }, // 0x4D 'M' + { 3906, 28, 34, 35, 4, -33 }, // 0x4E 'N' + { 4025, 33, 36, 37, 2, -34 }, // 0x4F 'O' + { 4174, 26, 34, 32, 4, -33 }, // 0x50 'P' + { 4285, 33, 37, 37, 2, -34 }, // 0x51 'Q' + { 4438, 28, 34, 34, 4, -33 }, // 0x52 'R' + { 4557, 28, 36, 32, 2, -34 }, // 0x53 'S' + { 4683, 27, 34, 30, 2, -33 }, // 0x54 'T' + { 4798, 27, 35, 35, 4, -33 }, // 0x55 'U' + { 4917, 29, 34, 31, 1, -33 }, // 0x56 'V' + { 5041, 43, 34, 45, 1, -33 }, // 0x57 'W' + { 5224, 30, 34, 32, 1, -33 }, // 0x58 'X' + { 5352, 29, 34, 30, 1, -33 }, // 0x59 'Y' + { 5476, 26, 34, 29, 1, -33 }, // 0x5A 'Z' + { 5587, 11, 43, 16, 3, -33 }, // 0x5B '[' + { 5647, 14, 34, 13, -1, -32 }, // 0x5C '\' + { 5707, 11, 43, 16, 1, -33 }, // 0x5D ']' + { 5767, 22, 20, 27, 3, -32 }, // 0x5E '^' + { 5822, 28, 4, 26, -1, 6 }, // 0x5F '_' + { 5836, 9, 7, 12, 1, -35 }, // 0x60 '`' + { 5844, 24, 26, 27, 2, -24 }, // 0x61 'a' + { 5922, 25, 35, 29, 3, -33 }, // 0x62 'b' + { 6032, 23, 26, 26, 2, -24 }, // 0x63 'c' + { 6107, 25, 35, 29, 2, -33 }, // 0x64 'd' + { 6217, 24, 26, 27, 2, -24 }, // 0x65 'e' + { 6295, 14, 34, 16, 1, -33 }, // 0x66 'f' + { 6355, 24, 36, 29, 2, -24 }, // 0x67 'g' + { 6463, 23, 34, 28, 3, -33 }, // 0x68 'h' + { 6561, 7, 34, 13, 3, -33 }, // 0x69 'i' + { 6591, 10, 45, 13, 0, -33 }, // 0x6A 'j' + { 6648, 23, 34, 27, 3, -33 }, // 0x6B 'k' + { 6746, 7, 34, 13, 3, -33 }, // 0x6C 'l' + { 6776, 36, 25, 42, 3, -24 }, // 0x6D 'm' + { 6889, 23, 25, 29, 3, -24 }, // 0x6E 'n' + { 6961, 25, 26, 29, 2, -24 }, // 0x6F 'o' + { 7043, 25, 36, 29, 3, -24 }, // 0x70 'p' + { 7156, 25, 36, 29, 2, -24 }, // 0x71 'q' + { 7269, 15, 25, 18, 3, -24 }, // 0x72 'r' + { 7316, 24, 26, 26, 1, -24 }, // 0x73 's' + { 7394, 12, 32, 16, 2, -30 }, // 0x74 't' + { 7442, 23, 26, 29, 3, -24 }, // 0x75 'u' + { 7517, 25, 25, 25, 0, -24 }, // 0x76 'v' + { 7596, 35, 25, 37, 1, -24 }, // 0x77 'w' + { 7706, 24, 25, 26, 1, -24 }, // 0x78 'x' + { 7781, 25, 36, 26, 0, -24 }, // 0x79 'y' + { 7894, 21, 25, 24, 1, -24 }, // 0x7A 'z' + { 7960, 13, 43, 18, 2, -33 }, // 0x7B '{' + { 8030, 4, 44, 13, 5, -33 }, // 0x7C '|' + { 8052, 13, 43, 18, 3, -33 }, // 0x7D '}' + { 8122, 21, 8, 23, 1, -14 } }; // 0x7E '~' + +const GFXfont FreeSansBold24pt7b PROGMEM = { + (uint8_t *)FreeSansBold24pt7bBitmaps, + (GFXglyph *)FreeSansBold24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 8815 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold9pt7b.h new file mode 100644 index 0000000..aeea463 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBold9pt7b.h @@ -0,0 +1,208 @@ +const uint8_t FreeSansBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFF, 0xFE, 0x48, 0x7E, 0xEF, 0xDF, 0xBF, 0x74, 0x40, 0x19, 0x86, + 0x67, 0xFD, 0xFF, 0x33, 0x0C, 0xC3, 0x33, 0xFE, 0xFF, 0x99, 0x86, 0x61, + 0x90, 0x10, 0x1F, 0x1F, 0xDE, 0xFF, 0x3F, 0x83, 0xC0, 0xFC, 0x1F, 0x09, + 0xFC, 0xFE, 0xF7, 0xF1, 0xE0, 0x40, 0x38, 0x10, 0x7C, 0x30, 0xC6, 0x20, + 0xC6, 0x40, 0xC6, 0x40, 0x7C, 0x80, 0x39, 0x9C, 0x01, 0x3E, 0x03, 0x63, + 0x02, 0x63, 0x04, 0x63, 0x0C, 0x3E, 0x08, 0x1C, 0x0E, 0x01, 0xF8, 0x3B, + 0x83, 0xB8, 0x3F, 0x01, 0xE0, 0x3E, 0x67, 0x76, 0xE3, 0xEE, 0x1C, 0xF3, + 0xC7, 0xFE, 0x3F, 0x70, 0xFF, 0xF4, 0x18, 0x63, 0x1C, 0x73, 0x8E, 0x38, + 0xE3, 0x8E, 0x18, 0x70, 0xC3, 0x06, 0x08, 0x61, 0x83, 0x0E, 0x38, 0x71, + 0xC7, 0x1C, 0x71, 0xC6, 0x38, 0xE3, 0x18, 0x40, 0x21, 0x3E, 0x45, 0x28, + 0x38, 0x70, 0xE7, 0xFF, 0xE7, 0x0E, 0x1C, 0xFC, 0x9C, 0xFF, 0xC0, 0xFC, + 0x08, 0xC4, 0x23, 0x10, 0x84, 0x62, 0x11, 0x88, 0x00, 0x3E, 0x3F, 0x9D, + 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xDD, 0xCF, 0xE3, 0xE0, + 0x08, 0xFF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x80, 0x3E, 0x3F, 0xB8, + 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x0F, 0xF7, 0xF8, + 0x3C, 0x7F, 0xE7, 0xE7, 0x07, 0x0C, 0x0E, 0x07, 0x07, 0xE7, 0xE7, 0x7E, + 0x3C, 0x0E, 0x1E, 0x1E, 0x2E, 0x2E, 0x4E, 0x4E, 0x8E, 0xFF, 0xFF, 0x0E, + 0x0E, 0x0E, 0x7F, 0x3F, 0x90, 0x18, 0x0D, 0xE7, 0xFB, 0x9E, 0x07, 0x03, + 0x81, 0xF1, 0xFF, 0xE7, 0xC0, 0x3E, 0x3F, 0x9C, 0xFC, 0x0E, 0xE7, 0xFB, + 0xDF, 0xC7, 0xE3, 0xF1, 0xDD, 0xEF, 0xE3, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, + 0xE0, 0x60, 0x70, 0x30, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03, 0x80, 0x3F, + 0x1F, 0xEE, 0x3F, 0x87, 0xE3, 0xCF, 0xC7, 0xFB, 0xCF, 0xE1, 0xF8, 0x7F, + 0x3D, 0xFE, 0x3F, 0x00, 0x3E, 0x3F, 0xBD, 0xDC, 0x7E, 0x3F, 0x1F, 0xDE, + 0xFF, 0x3B, 0x81, 0xF9, 0xCF, 0xE3, 0xC0, 0xFC, 0x00, 0x07, 0xE0, 0xFC, + 0x00, 0x07, 0xE5, 0xE0, 0x00, 0x83, 0xC7, 0xDF, 0x0C, 0x07, 0x80, 0xF8, + 0x1F, 0x01, 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x70, + 0x3F, 0x03, 0xE0, 0x38, 0x7D, 0xF1, 0xE0, 0x80, 0x00, 0x3E, 0x3F, 0xB8, + 0xFC, 0x70, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x00, 0x03, 0x81, 0xC0, + 0x03, 0xF0, 0x0F, 0xFC, 0x1E, 0x0E, 0x38, 0x02, 0x70, 0xE9, 0x63, 0x19, + 0xC2, 0x19, 0xC6, 0x11, 0xC6, 0x33, 0xC6, 0x32, 0x63, 0xFE, 0x73, 0xDC, + 0x3C, 0x00, 0x1F, 0xF8, 0x07, 0xF0, 0x07, 0x00, 0xF0, 0x0F, 0x80, 0xF8, + 0x1D, 0x81, 0x9C, 0x19, 0xC3, 0x8C, 0x3F, 0xE7, 0xFE, 0x70, 0x66, 0x07, + 0xE0, 0x70, 0xFF, 0x9F, 0xFB, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0x3F, 0xF7, + 0x06, 0xE0, 0xFC, 0x1F, 0x83, 0xFF, 0xEF, 0xF8, 0x1F, 0x83, 0xFE, 0x78, + 0xE7, 0x07, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x07, 0x07, 0x78, + 0xF3, 0xFE, 0x1F, 0x80, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0x7E, + 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x0E, 0xE0, 0xEF, 0xFC, 0xFF, 0x80, + 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, 0xE0, 0x70, 0x38, + 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xF8, 0x1C, 0x0E, 0x07, 0xFB, 0xFD, 0xC0, + 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x00, 0x0F, 0x87, 0xF9, 0xE3, 0xB8, 0x3E, + 0x01, 0xC0, 0x38, 0xFF, 0x1F, 0xE0, 0x6E, 0x0D, 0xE3, 0x9F, 0xD0, 0xF2, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xFF, 0xFF, 0xFF, 0x07, 0xE0, + 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xE7, 0xE7, 0xE7, 0x7E, 0x3C, + 0xE0, 0xEE, 0x1C, 0xE3, 0x8E, 0x70, 0xEE, 0x0F, 0xC0, 0xFE, 0x0F, 0x70, + 0xE7, 0x0E, 0x38, 0xE1, 0xCE, 0x0E, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xE1, + 0xFF, 0x87, 0xFE, 0x1F, 0xEC, 0x7F, 0xB3, 0x7E, 0xCD, 0xFB, 0x37, 0xEC, + 0xDF, 0x9E, 0x7E, 0x79, 0xF9, 0xE7, 0xE7, 0x9C, 0xE0, 0xFE, 0x1F, 0xC3, + 0xFC, 0x7F, 0xCF, 0xD9, 0xFB, 0xBF, 0x37, 0xE7, 0xFC, 0x7F, 0x87, 0xF0, + 0xFE, 0x0E, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0, 0xEE, 0x03, 0xF0, 0x1F, + 0x80, 0xFC, 0x07, 0xE0, 0x3B, 0x83, 0x9E, 0x3C, 0x7F, 0xC0, 0xF8, 0x00, + 0xFF, 0x9F, 0xFB, 0x87, 0xF0, 0x7E, 0x0F, 0xC3, 0xFF, 0xF7, 0xFC, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x0F, 0x81, 0xFF, 0x1E, 0x3C, 0xE0, + 0xEE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE1, 0xBB, 0x8F, 0x9E, 0x3C, + 0x7F, 0xE0, 0xFB, 0x80, 0x08, 0xFF, 0x8F, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, + 0xEE, 0x0E, 0xFF, 0xCF, 0xFC, 0xE0, 0xEE, 0x0E, 0xE0, 0xEE, 0x0E, 0xE0, + 0xF0, 0x3F, 0x0F, 0xFB, 0xC7, 0xF0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F, + 0x00, 0xFC, 0x1D, 0xC7, 0xBF, 0xE1, 0xF8, 0xFF, 0xFF, 0xC7, 0x03, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0xFC, + 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, + 0xC7, 0xBF, 0xE1, 0xF0, 0x60, 0x67, 0x0E, 0x70, 0xE3, 0x0C, 0x30, 0xC3, + 0x9C, 0x19, 0x81, 0x98, 0x1F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x06, 0x00, + 0x61, 0xC3, 0xB8, 0xE1, 0x9C, 0x70, 0xCE, 0x3C, 0xE3, 0x36, 0x71, 0x9B, + 0x30, 0xED, 0x98, 0x36, 0x7C, 0x1B, 0x3C, 0x0F, 0x1E, 0x07, 0x8F, 0x01, + 0xC3, 0x80, 0xE1, 0x80, 0x70, 0xE7, 0x8E, 0x39, 0xC1, 0xF8, 0x1F, 0x80, + 0xF0, 0x07, 0x00, 0xF0, 0x1F, 0x81, 0x9C, 0x39, 0xC7, 0x0E, 0x70, 0xE0, + 0xE0, 0xFC, 0x39, 0xC7, 0x18, 0xC3, 0xB8, 0x36, 0x07, 0xC0, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, 0xF0, + 0x70, 0x70, 0x70, 0x78, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xEE, 0xEE, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xF0, 0x86, 0x10, 0x86, 0x10, 0x84, 0x30, + 0x84, 0x30, 0x80, 0xFF, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7F, 0xF0, + 0x18, 0x1C, 0x3C, 0x3E, 0x36, 0x66, 0x63, 0xC3, 0xFF, 0xC0, 0xCC, 0x3F, + 0x1F, 0xEE, 0x38, 0x0E, 0x3F, 0x9E, 0xEE, 0x3B, 0x9E, 0xFF, 0x9E, 0xE0, + 0xE0, 0x38, 0x0E, 0x03, 0xBC, 0xFF, 0xBC, 0xEE, 0x1F, 0x87, 0xE1, 0xF8, + 0x7F, 0x3B, 0xFE, 0xEF, 0x00, 0x1F, 0x3F, 0xDC, 0x7C, 0x0E, 0x07, 0x03, + 0x80, 0xE3, 0x7F, 0x8F, 0x00, 0x03, 0x81, 0xC0, 0xE7, 0x77, 0xFB, 0xBF, + 0x8F, 0xC7, 0xE3, 0xF1, 0xFD, 0xEF, 0xF3, 0xB8, 0x3E, 0x3F, 0x9C, 0xDC, + 0x3F, 0xFF, 0xFF, 0x81, 0xC3, 0x7F, 0x8F, 0x00, 0x3B, 0xDD, 0xFF, 0xB9, + 0xCE, 0x73, 0x9C, 0xE7, 0x00, 0x3B, 0xBF, 0xDD, 0xFC, 0x7E, 0x3F, 0x1F, + 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xFC, 0x77, 0xF1, 0xF0, 0xE0, 0x70, 0x38, + 0x1D, 0xEF, 0xFF, 0x9F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x38, + 0xFC, 0x7F, 0xFF, 0xFF, 0xFE, 0x77, 0x07, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x7F, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x7E, 0x77, 0x73, 0xF1, 0xF8, 0xFE, + 0x77, 0x39, 0xDC, 0x6E, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEF, 0x7B, + 0xFF, 0xFE, 0x39, 0xF8, 0xE7, 0xE3, 0x9F, 0x8E, 0x7E, 0x39, 0xF8, 0xE7, + 0xE3, 0x9F, 0x8E, 0x70, 0xEF, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, + 0xC7, 0xE3, 0xF1, 0xC0, 0x1E, 0x1F, 0xE7, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, + 0x1D, 0xCE, 0x7F, 0x87, 0x80, 0xEF, 0x3F, 0xEF, 0x3B, 0x87, 0xE1, 0xF8, + 0x7E, 0x1F, 0xCE, 0xFF, 0xBB, 0xCE, 0x03, 0x80, 0xE0, 0x38, 0x00, 0x3B, + 0xBF, 0xFD, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xEF, 0x7F, 0x9D, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0xEF, 0xFF, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x80, 0x3E, + 0x3F, 0xB8, 0xFC, 0x0F, 0xC3, 0xFC, 0x3F, 0xC7, 0xFF, 0x1F, 0x00, 0x73, + 0xBF, 0xF7, 0x39, 0xCE, 0x73, 0x9E, 0x70, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, + 0x3F, 0x1F, 0x8F, 0xC7, 0xFF, 0xBD, 0xC0, 0xE1, 0x98, 0x67, 0x39, 0xCC, + 0x33, 0x0D, 0xC3, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xE3, 0x1D, 0x9E, 0x66, + 0x79, 0x99, 0xE6, 0x77, 0xB8, 0xD2, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, + 0x73, 0x80, 0x73, 0x9C, 0xE3, 0xF0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0xFC, + 0x73, 0x9C, 0xE0, 0xE1, 0xD8, 0x67, 0x39, 0xCE, 0x33, 0x0E, 0xC3, 0xE0, + 0x78, 0x1E, 0x03, 0x00, 0xC0, 0x70, 0x38, 0x0E, 0x00, 0xFE, 0xFE, 0x0E, + 0x1C, 0x38, 0x38, 0x70, 0xE0, 0xFF, 0xFF, 0x37, 0x66, 0x66, 0x6E, 0xE6, + 0x66, 0x66, 0x67, 0x30, 0xFF, 0xFF, 0x80, 0xCE, 0x66, 0x66, 0x67, 0x76, + 0x66, 0x66, 0x6E, 0xC0, 0x71, 0x8E }; + +const GFXglyph FreeSansBold9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 3, 13, 6, 2, -12 }, // 0x21 '!' + { 5, 7, 5, 9, 1, -12 }, // 0x22 '"' + { 10, 10, 12, 10, 0, -11 }, // 0x23 '#' + { 25, 9, 15, 10, 1, -13 }, // 0x24 '$' + { 42, 16, 13, 16, 0, -12 }, // 0x25 '%' + { 68, 12, 13, 13, 1, -12 }, // 0x26 '&' + { 88, 3, 5, 5, 1, -12 }, // 0x27 ''' + { 90, 6, 17, 6, 1, -12 }, // 0x28 '(' + { 103, 6, 17, 6, 0, -12 }, // 0x29 ')' + { 116, 5, 6, 7, 1, -12 }, // 0x2A '*' + { 120, 7, 8, 11, 2, -7 }, // 0x2B '+' + { 127, 3, 5, 4, 1, -1 }, // 0x2C ',' + { 129, 5, 2, 6, 0, -5 }, // 0x2D '-' + { 131, 3, 2, 4, 1, -1 }, // 0x2E '.' + { 132, 5, 13, 5, 0, -12 }, // 0x2F '/' + { 141, 9, 13, 10, 1, -12 }, // 0x30 '0' + { 156, 5, 13, 10, 2, -12 }, // 0x31 '1' + { 165, 9, 13, 10, 1, -12 }, // 0x32 '2' + { 180, 8, 13, 10, 1, -12 }, // 0x33 '3' + { 193, 8, 13, 10, 2, -12 }, // 0x34 '4' + { 206, 9, 13, 10, 1, -12 }, // 0x35 '5' + { 221, 9, 13, 10, 1, -12 }, // 0x36 '6' + { 236, 9, 13, 10, 0, -12 }, // 0x37 '7' + { 251, 10, 13, 10, 0, -12 }, // 0x38 '8' + { 268, 9, 13, 10, 1, -12 }, // 0x39 '9' + { 283, 3, 9, 4, 1, -8 }, // 0x3A ':' + { 287, 3, 12, 4, 1, -8 }, // 0x3B ';' + { 292, 9, 9, 11, 1, -8 }, // 0x3C '<' + { 303, 9, 6, 11, 1, -6 }, // 0x3D '=' + { 310, 9, 9, 11, 1, -8 }, // 0x3E '>' + { 321, 9, 13, 11, 1, -12 }, // 0x3F '?' + { 336, 16, 15, 18, 0, -12 }, // 0x40 '@' + { 366, 12, 13, 13, 0, -12 }, // 0x41 'A' + { 386, 11, 13, 13, 1, -12 }, // 0x42 'B' + { 404, 12, 13, 13, 1, -12 }, // 0x43 'C' + { 424, 12, 13, 13, 1, -12 }, // 0x44 'D' + { 444, 9, 13, 12, 1, -12 }, // 0x45 'E' + { 459, 9, 13, 11, 1, -12 }, // 0x46 'F' + { 474, 11, 13, 14, 1, -12 }, // 0x47 'G' + { 492, 11, 13, 13, 1, -12 }, // 0x48 'H' + { 510, 3, 13, 6, 1, -12 }, // 0x49 'I' + { 515, 8, 13, 10, 1, -12 }, // 0x4A 'J' + { 528, 12, 13, 13, 1, -12 }, // 0x4B 'K' + { 548, 8, 13, 11, 1, -12 }, // 0x4C 'L' + { 561, 14, 13, 16, 1, -12 }, // 0x4D 'M' + { 584, 11, 13, 14, 1, -12 }, // 0x4E 'N' + { 602, 13, 13, 14, 1, -12 }, // 0x4F 'O' + { 624, 11, 13, 12, 1, -12 }, // 0x50 'P' + { 642, 13, 14, 14, 1, -12 }, // 0x51 'Q' + { 665, 12, 13, 13, 1, -12 }, // 0x52 'R' + { 685, 11, 13, 12, 1, -12 }, // 0x53 'S' + { 703, 9, 13, 12, 2, -12 }, // 0x54 'T' + { 718, 11, 13, 13, 1, -12 }, // 0x55 'U' + { 736, 12, 13, 12, 0, -12 }, // 0x56 'V' + { 756, 17, 13, 17, 0, -12 }, // 0x57 'W' + { 784, 12, 13, 12, 0, -12 }, // 0x58 'X' + { 804, 11, 13, 12, 1, -12 }, // 0x59 'Y' + { 822, 9, 13, 11, 1, -12 }, // 0x5A 'Z' + { 837, 4, 17, 6, 1, -12 }, // 0x5B '[' + { 846, 5, 13, 5, 0, -12 }, // 0x5C '\' + { 855, 4, 17, 6, 0, -12 }, // 0x5D ']' + { 864, 8, 8, 11, 1, -12 }, // 0x5E '^' + { 872, 10, 1, 10, 0, 4 }, // 0x5F '_' + { 874, 3, 2, 5, 0, -12 }, // 0x60 '`' + { 875, 10, 10, 10, 1, -9 }, // 0x61 'a' + { 888, 10, 13, 11, 1, -12 }, // 0x62 'b' + { 905, 9, 10, 10, 1, -9 }, // 0x63 'c' + { 917, 9, 13, 11, 1, -12 }, // 0x64 'd' + { 932, 9, 10, 10, 1, -9 }, // 0x65 'e' + { 944, 5, 13, 6, 1, -12 }, // 0x66 'f' + { 953, 9, 14, 11, 1, -9 }, // 0x67 'g' + { 969, 9, 13, 11, 1, -12 }, // 0x68 'h' + { 984, 3, 13, 5, 1, -12 }, // 0x69 'i' + { 989, 4, 17, 5, 0, -12 }, // 0x6A 'j' + { 998, 9, 13, 10, 1, -12 }, // 0x6B 'k' + { 1013, 3, 13, 5, 1, -12 }, // 0x6C 'l' + { 1018, 14, 10, 16, 1, -9 }, // 0x6D 'm' + { 1036, 9, 10, 11, 1, -9 }, // 0x6E 'n' + { 1048, 10, 10, 11, 1, -9 }, // 0x6F 'o' + { 1061, 10, 14, 11, 1, -9 }, // 0x70 'p' + { 1079, 9, 14, 11, 1, -9 }, // 0x71 'q' + { 1095, 6, 10, 7, 1, -9 }, // 0x72 'r' + { 1103, 9, 10, 10, 1, -9 }, // 0x73 's' + { 1115, 5, 12, 6, 1, -11 }, // 0x74 't' + { 1123, 9, 10, 11, 1, -9 }, // 0x75 'u' + { 1135, 10, 10, 10, 0, -9 }, // 0x76 'v' + { 1148, 14, 10, 14, 0, -9 }, // 0x77 'w' + { 1166, 10, 10, 10, 0, -9 }, // 0x78 'x' + { 1179, 10, 14, 10, 0, -9 }, // 0x79 'y' + { 1197, 8, 10, 9, 1, -9 }, // 0x7A 'z' + { 1207, 4, 17, 7, 1, -12 }, // 0x7B '{' + { 1216, 1, 17, 5, 2, -12 }, // 0x7C '|' + { 1219, 4, 17, 7, 2, -12 }, // 0x7D '}' + { 1228, 8, 2, 9, 0, -4 } }; // 0x7E '~' + +const GFXfont FreeSansBold9pt7b PROGMEM = { + (uint8_t *)FreeSansBold9pt7bBitmaps, + (GFXglyph *)FreeSansBold9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1902 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h new file mode 100644 index 0000000..fabbad3 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h @@ -0,0 +1,317 @@ +const uint8_t FreeSansBoldOblique12pt7bBitmaps[] PROGMEM = { + 0x1C, 0x3C, 0x78, 0xE1, 0xC3, 0x8F, 0x1C, 0x38, 0x70, 0xC1, 0x83, 0x00, + 0x1C, 0x78, 0xF0, 0x71, 0xFC, 0xFE, 0x3B, 0x8E, 0xC3, 0x30, 0xC0, 0x01, + 0x8C, 0x07, 0x38, 0x0C, 0x61, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x83, 0x9C, + 0x0E, 0x70, 0x1C, 0xE1, 0xFF, 0xF3, 0xFF, 0xC7, 0xFF, 0x83, 0x18, 0x0E, + 0x70, 0x18, 0xC0, 0x73, 0x80, 0x00, 0x40, 0x07, 0xF0, 0x3F, 0xF0, 0xFF, + 0xF3, 0xC9, 0xE7, 0xB3, 0xCF, 0x60, 0x1F, 0xC0, 0x3F, 0xC0, 0x3F, 0xE0, + 0x1F, 0xE0, 0x1B, 0xE0, 0x33, 0xDE, 0x47, 0xBC, 0x8F, 0x7F, 0x7C, 0x7F, + 0xF0, 0x7F, 0x80, 0x18, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x87, + 0x80, 0xC3, 0xF0, 0x61, 0xFE, 0x10, 0xE1, 0x8C, 0x30, 0x66, 0x0C, 0x3B, + 0x03, 0xFC, 0x80, 0x7E, 0x60, 0x0F, 0x30, 0x00, 0x18, 0x70, 0x0C, 0x7E, + 0x03, 0x1F, 0xC1, 0x8E, 0x30, 0xC3, 0x1C, 0x60, 0xFE, 0x18, 0x1F, 0x8C, + 0x07, 0x80, 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xE0, 0x79, 0xC0, 0xF3, 0x81, + 0xEE, 0x01, 0xF8, 0x01, 0xE0, 0x1F, 0xC6, 0x7B, 0xDD, 0xE3, 0xF7, 0x87, + 0xEF, 0x07, 0x9F, 0x1F, 0x3F, 0xFF, 0x3F, 0xDE, 0x3F, 0x1C, 0x7F, 0xEE, + 0xCC, 0x03, 0x83, 0x81, 0x81, 0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x70, 0x38, + 0x3C, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x18, 0x0E, 0x07, + 0x01, 0x80, 0x06, 0x03, 0x81, 0xC0, 0x60, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x06, + 0x07, 0x07, 0x00, 0x0C, 0x0C, 0x4F, 0xFF, 0x1C, 0x3C, 0x6C, 0x44, 0x03, + 0x80, 0x38, 0x07, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, 0x0E, + 0x00, 0xE0, 0x0C, 0x00, 0x7B, 0xDC, 0x23, 0x33, 0x00, 0x7F, 0xFF, 0xF0, + 0x7F, 0xE0, 0x00, 0xC0, 0x30, 0x18, 0x04, 0x03, 0x00, 0x80, 0x60, 0x10, + 0x0C, 0x02, 0x01, 0x80, 0x40, 0x30, 0x08, 0x06, 0x01, 0x00, 0xC0, 0x00, + 0x03, 0xC0, 0x7F, 0x87, 0xFC, 0x78, 0xF3, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF, + 0x0F, 0xF0, 0x7F, 0x87, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x78, 0xF3, 0xFF, + 0x0F, 0xF0, 0x3E, 0x00, 0x03, 0x83, 0x83, 0xCF, 0xEF, 0xF0, 0x78, 0x38, + 0x1C, 0x0E, 0x0F, 0x07, 0x03, 0x81, 0xC1, 0xE0, 0xF0, 0x70, 0x38, 0x00, + 0x03, 0xF0, 0x0F, 0xF8, 0x7F, 0xF8, 0xF1, 0xF3, 0xC1, 0xE7, 0x83, 0xC0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x00, 0x7C, 0x01, 0xE0, + 0x07, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0xFF, 0xF0, 0x07, 0xE0, 0xFF, 0x8F, + 0xFE, 0xF8, 0xF7, 0x87, 0x80, 0x78, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x0F, + 0x80, 0x3C, 0x01, 0xEF, 0x0F, 0x78, 0xF3, 0xFF, 0x8F, 0xF8, 0x3F, 0x00, + 0x00, 0x78, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x37, 0x03, 0x38, 0x31, 0xC3, + 0x9E, 0x38, 0xF1, 0x87, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0xF0, 0x07, + 0x00, 0x38, 0x03, 0xC0, 0x07, 0xFC, 0x1F, 0xF0, 0xFF, 0xC3, 0x00, 0x1C, + 0x00, 0x7F, 0x81, 0xFF, 0x0F, 0xFE, 0x38, 0xF8, 0x01, 0xE0, 0x07, 0x80, + 0x1E, 0xF0, 0xF3, 0xC7, 0xCF, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x03, 0xE0, + 0x7F, 0x87, 0xFE, 0x78, 0xF3, 0xC0, 0x3D, 0xE1, 0xFF, 0x8F, 0xFE, 0xF8, + 0xF7, 0xC7, 0xBC, 0x3D, 0xE1, 0xEF, 0x1E, 0x7C, 0xF3, 0xFF, 0x0F, 0xF0, + 0x1F, 0x00, 0x7F, 0xFB, 0xFF, 0xDF, 0xFE, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C, + 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x00, 0x03, 0xF0, 0x1F, 0xE0, 0xFF, 0xC7, + 0x8F, 0x1C, 0x3C, 0x71, 0xE0, 0xFF, 0x03, 0xF8, 0x3F, 0xF1, 0xF1, 0xE7, + 0x87, 0xBC, 0x1E, 0xF0, 0x7B, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x1F, 0x80, + 0x03, 0xE0, 0x3F, 0xE1, 0xFF, 0x8F, 0x9F, 0x3C, 0x3D, 0xE0, 0xF7, 0x83, + 0xDE, 0x1F, 0x78, 0xFD, 0xFF, 0xE3, 0xFF, 0x87, 0xDE, 0x00, 0xF3, 0xC7, + 0x8F, 0xFE, 0x1F, 0xF0, 0x3F, 0x00, 0x1C, 0xF3, 0x80, 0x00, 0x00, 0x00, + 0x01, 0xCF, 0x38, 0x0E, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, + 0xE3, 0x81, 0x06, 0x18, 0x60, 0x00, 0x00, 0x01, 0xC0, 0x7E, 0x1F, 0xE7, + 0xF8, 0x7E, 0x03, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x78, 0x00, + 0xC0, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0x9F, 0xFC, 0x7F, 0xF0, 0x30, 0x01, 0xE0, 0x0F, 0xE0, 0x3F, 0xC0, + 0x7F, 0x80, 0x7C, 0x07, 0xE1, 0xFE, 0x7F, 0x87, 0xE0, 0x38, 0x00, 0x00, + 0x00, 0x0F, 0xC1, 0xFF, 0x8F, 0xFC, 0xF1, 0xFF, 0x07, 0xF0, 0x3C, 0x01, + 0xE0, 0x1E, 0x01, 0xE0, 0x3E, 0x03, 0xE0, 0x1C, 0x01, 0xC0, 0x0E, 0x00, + 0x00, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF, + 0x80, 0x3C, 0x0F, 0x01, 0xC0, 0x0E, 0x0E, 0x00, 0x1C, 0x70, 0xF7, 0x73, + 0x87, 0xF8, 0xCC, 0x31, 0xE3, 0x61, 0x87, 0x0D, 0x8C, 0x1C, 0x3C, 0x30, + 0x61, 0xB1, 0x81, 0x86, 0xC6, 0x0C, 0x3B, 0x18, 0x71, 0xCC, 0x63, 0xCE, + 0x31, 0xFB, 0xF0, 0xE3, 0xCF, 0x01, 0xC0, 0x00, 0x03, 0xC0, 0xC0, 0x07, + 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x1F, 0x80, + 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, 0x7C, 0x07, 0x1E, 0x03, 0x8F, + 0x03, 0x87, 0x83, 0xC3, 0xC1, 0xFF, 0xE1, 0xFF, 0xF0, 0xFF, 0xFC, 0xF0, + 0x1E, 0x70, 0x0F, 0x78, 0x07, 0xB8, 0x03, 0xC0, 0x0F, 0xFE, 0x0F, 0xFF, + 0x87, 0xFF, 0xE3, 0xC0, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x3C, 0x7F, + 0xFC, 0x3F, 0xFC, 0x1F, 0xFF, 0x0E, 0x07, 0xCF, 0x01, 0xE7, 0x80, 0xF3, + 0x80, 0x79, 0xC0, 0x79, 0xFF, 0xF8, 0xFF, 0xFC, 0x7F, 0xF8, 0x00, 0x01, + 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xF3, 0xC0, 0x79, 0xE0, 0x3D, + 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x0F, 0x00, 0xE7, 0x80, 0xF3, 0xE0, 0xF0, 0xFF, 0xF8, 0x3F, 0xF0, 0x07, + 0xE0, 0x00, 0x1F, 0xFC, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0x81, 0xF1, 0xC0, + 0x79, 0xE0, 0x3C, 0xF0, 0x1E, 0x78, 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xDE, + 0x03, 0xCF, 0x01, 0xE7, 0x81, 0xF3, 0x80, 0xF1, 0xC1, 0xF1, 0xFF, 0xF0, + 0xFF, 0xF0, 0x7F, 0xE0, 0x00, 0x0F, 0xFF, 0x1F, 0xFF, 0x1F, 0xFF, 0x1C, + 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF, + 0xF8, 0xFF, 0xF8, 0xFF, 0xF8, 0x1F, 0xFF, 0x1F, 0xFE, 0x1F, 0xFE, 0x1C, + 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0xF8, 0x3F, 0xF8, 0x3F, + 0xF8, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x01, 0xFC, 0x03, 0xFF, 0x03, 0xFF, 0xC3, + 0xE0, 0xF3, 0xC0, 0x39, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, + 0x78, 0x3F, 0xBC, 0x1F, 0xDE, 0x01, 0xCF, 0x00, 0xE7, 0xC0, 0xF1, 0xF0, + 0xF8, 0xFF, 0xFC, 0x3F, 0xEC, 0x07, 0xE6, 0x00, 0x1E, 0x03, 0x8F, 0x01, + 0xC7, 0x01, 0xE3, 0x80, 0xF3, 0xC0, 0x79, 0xE0, 0x38, 0xF0, 0x1C, 0x7F, + 0xFE, 0x3F, 0xFF, 0x3F, 0xFF, 0x9E, 0x03, 0x8F, 0x01, 0xC7, 0x01, 0xE3, + 0x80, 0xF3, 0xC0, 0x71, 0xE0, 0x38, 0xF0, 0x3C, 0x70, 0x1E, 0x00, 0x1E, + 0x3C, 0x78, 0xE1, 0xC7, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x8E, 0x1C, + 0x78, 0xF1, 0xE0, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x38, + 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x3C, 0x3C, + 0xF0, 0xF3, 0xC3, 0x8F, 0x1E, 0x3F, 0xF8, 0x7F, 0xC0, 0xFC, 0x00, 0x1E, + 0x07, 0xC7, 0x83, 0xE1, 0xE1, 0xE0, 0x70, 0xF0, 0x1C, 0x78, 0x0F, 0x3C, + 0x03, 0xDE, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, 0x07, 0xDE, 0x01, + 0xE7, 0xC0, 0x78, 0xF0, 0x1C, 0x3E, 0x0F, 0x07, 0x83, 0xC0, 0xF0, 0xF0, + 0x3C, 0x38, 0x07, 0x80, 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, + 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x38, 0x01, 0xC0, 0x1F, 0xFE, 0xFF, 0xF7, 0xFF, 0x80, 0x1F, 0x03, + 0xF1, 0xF0, 0x3F, 0x1F, 0x07, 0xF1, 0xF0, 0x7F, 0x3F, 0x0F, 0xE3, 0xF0, + 0xEE, 0x3B, 0x1E, 0xE3, 0xB1, 0xDE, 0x3B, 0x1D, 0xE7, 0xB3, 0x9C, 0x7B, + 0x39, 0xC7, 0x37, 0x9C, 0x73, 0x73, 0xCF, 0x3F, 0x3C, 0xF3, 0xE3, 0x8F, + 0x3E, 0x38, 0xE3, 0xC3, 0x8E, 0x3C, 0x78, 0x1E, 0x03, 0x87, 0xC0, 0xE1, + 0xF0, 0x38, 0x7C, 0x1E, 0x1F, 0x87, 0x8F, 0xE1, 0xC3, 0xB8, 0x70, 0xEF, + 0x1C, 0x39, 0xCF, 0x1E, 0x73, 0xC7, 0x8E, 0xE1, 0xC3, 0xB8, 0x70, 0xEE, + 0x1C, 0x1F, 0x8F, 0x07, 0xE3, 0xC1, 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x00, + 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3, 0xC0, 0xF9, 0xE0, + 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x03, 0xDE, + 0x01, 0xEF, 0x00, 0xF7, 0xC0, 0xF1, 0xF0, 0xF0, 0xFF, 0xF0, 0x3F, 0xF0, + 0x07, 0xE0, 0x00, 0x1F, 0xFC, 0x1F, 0xFE, 0x1F, 0xFF, 0x1C, 0x1F, 0x1C, + 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x1E, 0x3F, 0xFC, 0x3F, 0xFC, 0x7F, + 0xF0, 0x78, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE3, 0xE3, + 0xC0, 0xF9, 0xC0, 0x3D, 0xE0, 0x1E, 0xF0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, + 0xFC, 0x03, 0xDE, 0x09, 0xEF, 0x0E, 0xE7, 0xC7, 0xF1, 0xF1, 0xF0, 0xFF, + 0xF8, 0x3F, 0xFE, 0x07, 0xE6, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x0F, 0xFF, + 0x87, 0xFF, 0xE3, 0x81, 0xF1, 0xC0, 0x78, 0xE0, 0x3C, 0xF0, 0x1C, 0x78, + 0x1E, 0x3F, 0xFC, 0x1F, 0xFC, 0x1F, 0xFF, 0x8F, 0x03, 0xC7, 0x81, 0xE3, + 0x80, 0xF1, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x3C, 0x78, 0x1F, 0x00, 0x03, + 0xF8, 0x0F, 0xFE, 0x1F, 0xFF, 0x1E, 0x1F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, + 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0x0F, 0xFC, 0x01, 0xFE, 0x00, 0x3E, 0xF0, + 0x1E, 0xF0, 0x1E, 0xF8, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x7F, + 0xFE, 0xFF, 0xFD, 0xFF, 0xF8, 0x1C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, + 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x01, + 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x1E, 0x07, 0x1C, + 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0E, 0x38, 0x0E, 0x78, 0x1E, 0x78, + 0x1E, 0x78, 0x1E, 0x78, 0x1C, 0x70, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, + 0x38, 0xF8, 0x78, 0xFF, 0xF0, 0x7F, 0xE0, 0x1F, 0x80, 0xF0, 0x1F, 0xE0, + 0x39, 0xC0, 0xF3, 0x81, 0xC7, 0x07, 0x8E, 0x0E, 0x1C, 0x3C, 0x3C, 0x70, + 0x79, 0xE0, 0xF3, 0x80, 0xEF, 0x01, 0xDC, 0x03, 0xB8, 0x07, 0xE0, 0x0F, + 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x70, 0x7F, 0x87, 0x83, + 0xFC, 0x3C, 0x3D, 0xE1, 0xE1, 0xEF, 0x1F, 0x0E, 0x78, 0xD8, 0xF3, 0xC6, + 0xC7, 0x0E, 0x76, 0x78, 0x73, 0x33, 0x83, 0xB9, 0x9C, 0x1D, 0xCD, 0xC0, + 0xEC, 0x6E, 0x07, 0xE3, 0xE0, 0x3E, 0x1F, 0x01, 0xF0, 0xF0, 0x0F, 0x87, + 0x80, 0x78, 0x38, 0x03, 0xC1, 0xC0, 0x00, 0x0F, 0x03, 0xC3, 0xC1, 0xE0, + 0xF8, 0xF0, 0x1E, 0x78, 0x07, 0x9E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x0F, + 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xF0, + 0x07, 0x9E, 0x03, 0xC7, 0x80, 0xF0, 0xF0, 0x78, 0x3C, 0x3C, 0x0F, 0x80, + 0x78, 0x1E, 0xF0, 0x79, 0xE0, 0xF3, 0xC3, 0xC3, 0xCF, 0x07, 0x9E, 0x0F, + 0x78, 0x0F, 0xE0, 0x1F, 0x80, 0x3F, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, + 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x1F, 0xFF, + 0x0F, 0xFF, 0x87, 0xFF, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xE0, 0x03, + 0xE0, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, + 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xFF, 0xF0, 0xFF, 0xF8, 0x7F, 0xFC, + 0x00, 0x0F, 0xC3, 0xF0, 0xFC, 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C, + 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, + 0x03, 0x80, 0xFC, 0x3F, 0x0F, 0xC0, 0x08, 0x88, 0xC4, 0x44, 0x66, 0x66, + 0x66, 0x62, 0x22, 0x33, 0x33, 0x30, 0x0F, 0xC3, 0xF0, 0xFC, 0x07, 0x03, + 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x03, 0xC0, + 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE0, 0x70, 0xFC, 0x3F, 0x0F, 0xC0, 0x03, + 0x80, 0xF0, 0x1E, 0x07, 0xE1, 0xDC, 0x3B, 0x8E, 0x71, 0x86, 0x70, 0xFC, + 0x1F, 0x83, 0x80, 0x7F, 0xFE, 0xFF, 0xFC, 0xE6, 0x30, 0x07, 0xE0, 0xFF, + 0x8F, 0xFE, 0x70, 0xE0, 0x07, 0x03, 0xF8, 0xFF, 0xCF, 0x9E, 0xF0, 0xF7, + 0x8F, 0x3F, 0xF8, 0xFF, 0xC3, 0xDF, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x9F, 0x07, 0xFF, 0x0F, 0xFF, 0x3E, 0x3E, + 0x78, 0x3C, 0xF0, 0x79, 0xC0, 0xF3, 0x81, 0xEF, 0x07, 0x9F, 0x1F, 0x3F, + 0xFC, 0x7F, 0xF0, 0xEF, 0x80, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF8, 0xF7, + 0x87, 0xB8, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0xF7, 0x8F, 0x1F, 0xF8, 0xFF, + 0x81, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, + 0xC0, 0xF7, 0x87, 0xFE, 0x1F, 0xFC, 0x7C, 0x78, 0xF0, 0x73, 0xC0, 0xE7, + 0x81, 0x8F, 0x07, 0x1E, 0x0E, 0x3E, 0x3C, 0x7F, 0xF8, 0x7F, 0xE0, 0x7D, + 0xC0, 0x07, 0xC0, 0xFF, 0x8F, 0xFE, 0xF0, 0xF7, 0x87, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0xF0, 0x07, 0xC7, 0x9F, 0xF8, 0xFF, 0x81, 0xF0, 0x00, 0x07, + 0x87, 0xC7, 0xE3, 0xC1, 0xC3, 0xF9, 0xFC, 0x78, 0x3C, 0x1C, 0x0E, 0x07, + 0x07, 0x83, 0x81, 0xC0, 0xE0, 0xF0, 0x78, 0x00, 0x03, 0xDE, 0x1F, 0xF8, + 0x7F, 0xF1, 0xF1, 0xE3, 0xC1, 0xCF, 0x03, 0x9E, 0x06, 0x3C, 0x0C, 0x78, + 0x38, 0xF8, 0xF1, 0xFF, 0xC1, 0xFF, 0x81, 0xF7, 0x00, 0x0E, 0x3C, 0x3C, + 0x78, 0xF0, 0x7F, 0xC0, 0x7E, 0x00, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x3C, 0x00, 0xF7, 0xC3, 0xBF, 0x8F, 0xFF, 0x3C, 0x3D, 0xE0, 0xE7, + 0x83, 0x9C, 0x0E, 0x70, 0x79, 0xC1, 0xEF, 0x07, 0x3C, 0x1C, 0xE0, 0x73, + 0x83, 0xC0, 0x0E, 0x3C, 0x70, 0x00, 0x03, 0x8F, 0x1E, 0x38, 0x71, 0xE3, + 0xC7, 0x0E, 0x1C, 0x78, 0xF1, 0xC0, 0x03, 0xC0, 0xE0, 0x38, 0x00, 0x00, + 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0x38, 0x0E, 0x03, 0x81, + 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0xF0, 0xF8, 0x3E, 0x0F, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x87, 0x87, 0x1E, + 0x0E, 0x78, 0x3D, 0xE0, 0x7F, 0x80, 0xFE, 0x01, 0xFE, 0x03, 0xFC, 0x0F, + 0x38, 0x1E, 0x78, 0x38, 0xF0, 0x70, 0xF0, 0xE1, 0xE0, 0x0E, 0x3C, 0x78, + 0xE1, 0xC3, 0x8F, 0x1E, 0x38, 0x71, 0xE3, 0xC7, 0x0E, 0x1C, 0x78, 0xF1, + 0xC0, 0x1C, 0xF1, 0xE0, 0xEF, 0xDF, 0x87, 0xFF, 0xFE, 0x7C, 0x78, 0xF3, + 0xC3, 0x87, 0x9C, 0x1C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x78, 0x70, + 0xF3, 0xC3, 0x87, 0x9C, 0x3C, 0x38, 0xE1, 0xE1, 0xC7, 0x0E, 0x0E, 0x00, + 0x3D, 0xF0, 0xEF, 0xE3, 0xFF, 0xCF, 0x0F, 0x78, 0x39, 0xC0, 0xE7, 0x03, + 0x9C, 0x1E, 0xF0, 0x7B, 0xC1, 0xCE, 0x07, 0x38, 0x1C, 0xE0, 0xF0, 0x07, + 0xE0, 0x7F, 0xE3, 0xFF, 0x9F, 0x1F, 0x78, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, + 0x1F, 0xF0, 0x7B, 0xE3, 0xE7, 0xFF, 0x1F, 0xF8, 0x1F, 0x80, 0x0E, 0x7C, + 0x0F, 0xFE, 0x0F, 0xFF, 0x1F, 0x1F, 0x1E, 0x0F, 0x1E, 0x0F, 0x1C, 0x0F, + 0x1C, 0x0F, 0x3C, 0x1E, 0x3E, 0x3E, 0x3F, 0xFC, 0x3F, 0xF8, 0x7B, 0xE0, + 0x78, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xF0, 0x00, 0x07, 0xBC, + 0x7F, 0xF3, 0xFF, 0x9F, 0x1E, 0x78, 0x3B, 0xC0, 0xEF, 0x03, 0x3C, 0x0C, + 0xF0, 0x73, 0xE3, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0x03, 0x80, 0x1E, + 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3D, 0xCE, 0xE3, 0xF8, 0xF0, 0x78, + 0x1E, 0x07, 0x01, 0xC0, 0xF0, 0x3C, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x1F, + 0xC3, 0xFE, 0x7F, 0xFF, 0x0F, 0xF0, 0x0F, 0xE0, 0x7F, 0xC1, 0xFE, 0x03, + 0xEE, 0x1E, 0xFF, 0xC7, 0xFC, 0x3F, 0x00, 0x1E, 0x1E, 0x1C, 0x7F, 0xFF, + 0x3C, 0x38, 0x38, 0x38, 0x78, 0x78, 0x70, 0x7C, 0xF8, 0x78, 0x38, 0x3C, + 0xE0, 0xE3, 0x83, 0x9E, 0x0E, 0x70, 0x79, 0xC1, 0xE7, 0x07, 0x3C, 0x1C, + 0xF0, 0xF3, 0xE7, 0xCF, 0xFF, 0x1F, 0xF8, 0x3C, 0xE0, 0xF0, 0x77, 0x87, + 0xBC, 0x38, 0xE3, 0xC7, 0x1C, 0x39, 0xE1, 0xCE, 0x0E, 0xE0, 0x77, 0x03, + 0xF0, 0x0F, 0x80, 0x78, 0x03, 0xC0, 0x00, 0xF1, 0xC3, 0xF8, 0xE3, 0xFC, + 0xF1, 0xDE, 0x79, 0xEF, 0x3C, 0xE7, 0xB6, 0x73, 0xDB, 0x70, 0xED, 0xB8, + 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3C, 0x0F, 0x1E, 0x07, 0x8E, 0x00, 0x0F, + 0x1E, 0x0F, 0x3C, 0x0F, 0x38, 0x07, 0x70, 0x07, 0xF0, 0x03, 0xE0, 0x03, + 0xC0, 0x07, 0xC0, 0x0F, 0xE0, 0x1E, 0xE0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, + 0x78, 0x3C, 0x1C, 0x78, 0x78, 0xF0, 0xE1, 0xE3, 0xC1, 0xC7, 0x03, 0x9E, + 0x07, 0x38, 0x0E, 0xE0, 0x1D, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xE0, 0x00, 0x1F, + 0xF9, 0xFF, 0xCF, 0xFC, 0x01, 0xE0, 0x3E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3F, 0xF9, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0x87, 0xC3, + 0xE3, 0xC1, 0xC0, 0xE0, 0x70, 0x38, 0x3C, 0x1C, 0x0E, 0x1E, 0x0F, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0F, 0x87, 0xC1, 0xC0, 0x0C, + 0x30, 0x86, 0x18, 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x61, 0x86, 0x18, 0x63, + 0x0C, 0x30, 0xC2, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE0, 0x70, 0x38, 0x3C, + 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xE0, 0xF0, 0xE0, 0x70, 0x78, 0x38, 0x1C, + 0x0E, 0x07, 0x07, 0x8F, 0x87, 0xC3, 0xC0, 0x3C, 0x07, 0xE0, 0xC7, 0x30, + 0x7E, 0x01, 0xC0 }; + +const GFXglyph FreeSansBoldOblique12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 7, 0, 1 }, // 0x20 ' ' + { 0, 7, 17, 8, 3, -16 }, // 0x21 '!' + { 15, 10, 6, 11, 4, -17 }, // 0x22 '"' + { 23, 15, 16, 13, 1, -15 }, // 0x23 '#' + { 53, 15, 21, 13, 1, -17 }, // 0x24 '$' + { 93, 18, 18, 21, 3, -17 }, // 0x25 '%' + { 134, 15, 17, 17, 2, -16 }, // 0x26 '&' + { 166, 4, 6, 6, 4, -17 }, // 0x27 ''' + { 169, 9, 22, 8, 2, -17 }, // 0x28 '(' + { 194, 9, 22, 8, -1, -16 }, // 0x29 ')' + { 219, 8, 8, 9, 3, -17 }, // 0x2A '*' + { 227, 12, 11, 14, 2, -10 }, // 0x2B '+' + { 244, 5, 7, 7, 1, -2 }, // 0x2C ',' + { 249, 7, 3, 8, 2, -7 }, // 0x2D '-' + { 252, 4, 3, 7, 2, -2 }, // 0x2E '.' + { 254, 10, 17, 7, 0, -16 }, // 0x2F '/' + { 276, 13, 17, 13, 2, -16 }, // 0x30 '0' + { 304, 9, 17, 13, 4, -16 }, // 0x31 '1' + { 324, 15, 17, 13, 1, -16 }, // 0x32 '2' + { 356, 13, 17, 13, 2, -16 }, // 0x33 '3' + { 384, 13, 17, 13, 1, -16 }, // 0x34 '4' + { 412, 14, 17, 13, 1, -16 }, // 0x35 '5' + { 442, 13, 17, 13, 2, -16 }, // 0x36 '6' + { 470, 13, 17, 13, 3, -16 }, // 0x37 '7' + { 498, 14, 17, 13, 1, -16 }, // 0x38 '8' + { 528, 14, 17, 13, 2, -16 }, // 0x39 '9' + { 558, 6, 12, 8, 3, -11 }, // 0x3A ':' + { 567, 7, 16, 8, 2, -11 }, // 0x3B ';' + { 581, 13, 12, 14, 2, -11 }, // 0x3C '<' + { 601, 14, 9, 14, 1, -9 }, // 0x3D '=' + { 617, 13, 12, 14, 1, -10 }, // 0x3E '>' + { 637, 13, 18, 15, 4, -17 }, // 0x3F '?' + { 667, 22, 21, 23, 2, -17 }, // 0x40 '@' + { 725, 17, 18, 17, 0, -17 }, // 0x41 'A' + { 764, 17, 18, 17, 2, -17 }, // 0x42 'B' + { 803, 17, 18, 17, 3, -17 }, // 0x43 'C' + { 842, 17, 18, 17, 2, -17 }, // 0x44 'D' + { 881, 16, 18, 16, 2, -17 }, // 0x45 'E' + { 917, 16, 18, 15, 2, -17 }, // 0x46 'F' + { 953, 17, 18, 19, 3, -17 }, // 0x47 'G' + { 992, 17, 18, 17, 2, -17 }, // 0x48 'H' + { 1031, 7, 18, 7, 2, -17 }, // 0x49 'I' + { 1047, 14, 18, 13, 1, -17 }, // 0x4A 'J' + { 1079, 18, 18, 17, 2, -17 }, // 0x4B 'K' + { 1120, 13, 18, 15, 2, -17 }, // 0x4C 'L' + { 1150, 20, 18, 20, 2, -17 }, // 0x4D 'M' + { 1195, 18, 18, 17, 2, -17 }, // 0x4E 'N' + { 1236, 17, 18, 19, 3, -17 }, // 0x4F 'O' + { 1275, 16, 18, 16, 2, -17 }, // 0x50 'P' + { 1311, 17, 19, 19, 3, -17 }, // 0x51 'Q' + { 1352, 17, 18, 17, 2, -17 }, // 0x52 'R' + { 1391, 16, 18, 16, 2, -17 }, // 0x53 'S' + { 1427, 15, 18, 15, 3, -17 }, // 0x54 'T' + { 1461, 16, 18, 17, 3, -17 }, // 0x55 'U' + { 1497, 15, 18, 16, 4, -17 }, // 0x56 'V' + { 1531, 21, 18, 23, 4, -17 }, // 0x57 'W' + { 1579, 18, 18, 16, 1, -17 }, // 0x58 'X' + { 1620, 15, 18, 16, 4, -17 }, // 0x59 'Y' + { 1654, 17, 18, 15, 1, -17 }, // 0x5A 'Z' + { 1693, 10, 23, 8, 1, -17 }, // 0x5B '[' + { 1722, 4, 23, 7, 3, -22 }, // 0x5C '\' + { 1734, 10, 23, 8, 0, -17 }, // 0x5D ']' + { 1763, 11, 11, 14, 3, -16 }, // 0x5E '^' + { 1779, 15, 2, 13, -2, 4 }, // 0x5F '_' + { 1783, 4, 3, 8, 4, -17 }, // 0x60 '`' + { 1785, 13, 13, 13, 1, -12 }, // 0x61 'a' + { 1807, 15, 18, 15, 1, -17 }, // 0x62 'b' + { 1841, 13, 13, 13, 2, -12 }, // 0x63 'c' + { 1863, 15, 18, 15, 2, -17 }, // 0x64 'd' + { 1897, 13, 13, 13, 2, -12 }, // 0x65 'e' + { 1919, 9, 18, 8, 2, -17 }, // 0x66 'f' + { 1940, 15, 18, 15, 1, -12 }, // 0x67 'g' + { 1974, 14, 18, 15, 2, -17 }, // 0x68 'h' + { 2006, 7, 18, 7, 2, -17 }, // 0x69 'i' + { 2022, 10, 23, 7, -1, -17 }, // 0x6A 'j' + { 2051, 15, 18, 13, 1, -17 }, // 0x6B 'k' + { 2085, 7, 18, 7, 2, -17 }, // 0x6C 'l' + { 2101, 21, 13, 21, 1, -12 }, // 0x6D 'm' + { 2136, 14, 13, 15, 2, -12 }, // 0x6E 'n' + { 2159, 14, 13, 15, 2, -12 }, // 0x6F 'o' + { 2182, 16, 18, 15, 0, -12 }, // 0x70 'p' + { 2218, 14, 18, 15, 2, -12 }, // 0x71 'q' + { 2250, 10, 13, 9, 2, -12 }, // 0x72 'r' + { 2267, 12, 13, 13, 3, -12 }, // 0x73 's' + { 2287, 8, 15, 8, 2, -14 }, // 0x74 't' + { 2302, 14, 13, 15, 2, -12 }, // 0x75 'u' + { 2325, 13, 13, 13, 3, -12 }, // 0x76 'v' + { 2347, 17, 13, 19, 3, -12 }, // 0x77 'w' + { 2375, 16, 13, 13, 0, -12 }, // 0x78 'x' + { 2401, 15, 18, 13, 1, -12 }, // 0x79 'y' + { 2435, 13, 13, 12, 1, -12 }, // 0x7A 'z' + { 2457, 9, 23, 9, 3, -17 }, // 0x7B '{' + { 2483, 6, 23, 7, 1, -17 }, // 0x7C '|' + { 2501, 9, 23, 9, 0, -17 }, // 0x7D '}' + { 2527, 12, 5, 14, 2, -7 } }; // 0x7E '~' + +const GFXfont FreeSansBoldOblique12pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique12pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 3207 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h new file mode 100644 index 0000000..79c748c --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h @@ -0,0 +1,545 @@ +const uint8_t FreeSansBoldOblique18pt7bBitmaps[] PROGMEM = { + 0x06, 0x01, 0xC0, 0x7C, 0x1F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x83, + 0xC0, 0xF0, 0x7C, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x01, 0xC0, + 0x60, 0x7C, 0x1F, 0x07, 0xC3, 0xF0, 0xF8, 0x00, 0x78, 0x7B, 0xC3, 0xFE, + 0x3F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0x83, 0x9C, 0x1C, 0xC0, 0xC0, 0x00, + 0x3C, 0x38, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0xF0, + 0xE0, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8, + 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x00, 0xE1, 0xE0, 0x07, 0x8F, 0x00, 0x1C, + 0x3C, 0x07, 0xFF, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, + 0x01, 0xE3, 0xC0, 0x0F, 0x0E, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xC0, 0x07, + 0x8F, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x80, 0x00, 0xFC, + 0x00, 0xFF, 0xC0, 0x3F, 0xFC, 0x0F, 0xFF, 0xC3, 0xE6, 0x78, 0x78, 0xCF, + 0x1E, 0x39, 0xE3, 0xC7, 0x3C, 0x78, 0xC0, 0x0F, 0x98, 0x01, 0xFF, 0x00, + 0x1F, 0xF8, 0x01, 0xFF, 0x80, 0x1F, 0xF8, 0x00, 0x7F, 0x80, 0x0F, 0xF0, + 0x03, 0xBE, 0x00, 0x67, 0xCF, 0x8C, 0xF9, 0xF1, 0x9F, 0x3E, 0x77, 0xC7, + 0xEF, 0xF8, 0x7F, 0xFE, 0x0F, 0xFF, 0x80, 0xFF, 0xE0, 0x03, 0xE0, 0x00, + 0x38, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x07, 0x01, 0xE0, + 0x03, 0x81, 0xFE, 0x00, 0xC0, 0xFF, 0x80, 0x70, 0x7F, 0xF0, 0x38, 0x1E, + 0x3C, 0x1C, 0x0F, 0x07, 0x06, 0x03, 0x81, 0xC3, 0x80, 0xE0, 0xF1, 0xC0, + 0x3C, 0x78, 0xE0, 0x0F, 0xFE, 0x30, 0x01, 0xFF, 0x1C, 0x00, 0x7F, 0x8E, + 0x00, 0x07, 0x83, 0x00, 0x00, 0x01, 0x83, 0xE0, 0x00, 0xE3, 0xFE, 0x00, + 0x71, 0xFF, 0x80, 0x18, 0xFF, 0xF0, 0x0C, 0x3C, 0x3C, 0x07, 0x1C, 0x07, + 0x03, 0x87, 0x01, 0xC0, 0xC1, 0xE1, 0xE0, 0x60, 0x7F, 0xF8, 0x38, 0x0F, + 0xFC, 0x1C, 0x03, 0xFE, 0x06, 0x00, 0x3E, 0x00, 0x00, 0x1F, 0x00, 0x03, + 0xFC, 0x00, 0x3F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0x3C, 0x01, 0xF1, 0xE0, + 0x0F, 0x8F, 0x00, 0x7C, 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xF8, 0x00, 0x3F, + 0x00, 0x03, 0xF0, 0x00, 0x7F, 0xC7, 0x8F, 0xFE, 0x3C, 0xFC, 0xFB, 0xCF, + 0x83, 0xFE, 0xF8, 0x1F, 0xE7, 0xC0, 0x7E, 0x3E, 0x03, 0xE1, 0xF0, 0x1F, + 0x0F, 0xE3, 0xFC, 0x7F, 0xFF, 0xE1, 0xFF, 0xFF, 0x87, 0xFE, 0x7C, 0x0F, + 0xE1, 0xF0, 0x7B, 0xFF, 0xEF, 0x7B, 0x9C, 0xC0, 0x00, 0x78, 0x07, 0x80, + 0x78, 0x03, 0x80, 0x3C, 0x03, 0xC0, 0x1E, 0x01, 0xE0, 0x1E, 0x00, 0xF0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x80, + 0x1C, 0x00, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x01, 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1E, 0x01, + 0xE0, 0x1E, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0x03, 0x00, 0x70, 0x07, + 0x04, 0x63, 0xFF, 0xF7, 0xFF, 0x1F, 0x83, 0xF0, 0x3B, 0x87, 0x38, 0x21, + 0x00, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x7C, 0x07, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, + 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x3E, 0x7C, 0xF3, 0xE7, 0xC1, 0x87, 0x0C, 0x39, 0xE3, 0x00, 0x7F, + 0xDF, 0xFF, 0xFB, 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x0E, 0x00, 0x18, + 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x30, 0x00, + 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, + 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, + 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xC0, + 0x7F, 0xF8, 0x3F, 0xFE, 0x0F, 0x8F, 0xC7, 0xC1, 0xF1, 0xE0, 0x7C, 0xF8, + 0x1F, 0x3E, 0x07, 0xDF, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x3F, 0x7C, 0x0F, + 0xBF, 0x03, 0xEF, 0x80, 0xFB, 0xE0, 0x3E, 0xF8, 0x1F, 0x3E, 0x07, 0xCF, + 0x81, 0xE3, 0xE0, 0xF8, 0xFC, 0x7C, 0x1F, 0xFF, 0x07, 0xFF, 0x80, 0xFF, + 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0xFF, + 0x3F, 0xF3, 0xFF, 0x9F, 0xFC, 0x03, 0xE0, 0x1F, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x03, 0xE0, 0x1E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, + 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x3E, 0x00, 0x00, 0x1F, 0x80, + 0x07, 0xFF, 0x00, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7E, 0x1F, 0x83, 0xE0, + 0x7C, 0x1F, 0x03, 0xE1, 0xF0, 0x1F, 0x0F, 0x80, 0xF8, 0x00, 0x0F, 0x80, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xE0, 0x00, 0xFC, + 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, + 0x00, 0x03, 0xF0, 0x00, 0x1F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xF0, + 0x7F, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x03, 0xFF, 0xE0, 0x7F, + 0xFF, 0x0F, 0x83, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, 0xE0, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0F, 0xF0, 0x00, 0xFF, 0x80, + 0x0F, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xCF, 0x80, 0x7C, + 0xF8, 0x07, 0xCF, 0x80, 0xF8, 0xFC, 0x3F, 0x8F, 0xFF, 0xF0, 0x7F, 0xFE, + 0x03, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, + 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xFC, 0x00, 0xEF, 0x80, 0x3D, 0xF0, 0x0F, + 0x7C, 0x03, 0xCF, 0x80, 0xF1, 0xF0, 0x1C, 0x3E, 0x07, 0x07, 0xC1, 0xE1, + 0xF0, 0x78, 0x3E, 0x1E, 0x07, 0xC3, 0xFF, 0xFE, 0x7F, 0xFF, 0xDF, 0xFF, + 0xFB, 0xFF, 0xFF, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0xFF, 0xF0, 0x3F, 0xFF, 0x03, + 0xFF, 0xF0, 0x3F, 0xFF, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x00, + 0xF7, 0xE0, 0x0F, 0xFF, 0x01, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xF0, 0xFC, + 0x3E, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, + 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x8F, 0xC3, 0xF0, 0xFF, 0xFE, 0x07, 0xFF, + 0xC0, 0x3F, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, + 0xFF, 0x03, 0xFF, 0xE0, 0xF8, 0x7E, 0x3E, 0x07, 0xC7, 0x80, 0x01, 0xF0, + 0x00, 0x3C, 0xFC, 0x07, 0xFF, 0xC1, 0xFF, 0xFC, 0x3F, 0xFF, 0xC7, 0xE1, + 0xF8, 0xF8, 0x1F, 0x3E, 0x03, 0xE7, 0x80, 0x7C, 0xF0, 0x0F, 0x9E, 0x01, + 0xE3, 0xC0, 0x7C, 0x78, 0x1F, 0x0F, 0x87, 0xE0, 0xFF, 0xF8, 0x1F, 0xFE, + 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xF9, 0xFF, + 0xFF, 0x7F, 0xFF, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x7C, + 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xFC, 0x07, 0xFF, 0xE0, 0xFF, + 0xFF, 0x0F, 0x81, 0xF1, 0xF0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1F, + 0x07, 0xE0, 0xFF, 0xFC, 0x07, 0xFF, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, + 0xF0, 0xFC, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x07, 0xCF, 0x80, 0x7C, + 0xF8, 0x0F, 0x8F, 0x80, 0xF8, 0xFC, 0x3F, 0x0F, 0xFF, 0xF0, 0x7F, 0xFE, + 0x03, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, + 0xFF, 0x03, 0xFF, 0xE0, 0xFC, 0x3E, 0x3F, 0x03, 0xC7, 0xC0, 0x79, 0xF0, + 0x0F, 0x3E, 0x01, 0xE7, 0xC0, 0x3C, 0xF8, 0x0F, 0x9F, 0x03, 0xE3, 0xF0, + 0xFC, 0x7F, 0xFF, 0x87, 0xFF, 0xF0, 0x7F, 0xFE, 0x07, 0xE7, 0x80, 0x01, + 0xF0, 0x00, 0x3C, 0x7C, 0x0F, 0x8F, 0xC3, 0xE1, 0xFF, 0xF8, 0x1F, 0xFE, + 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0F, 0x87, 0xC3, 0xC3, 0xE1, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE1, 0xF0, 0xF0, + 0xF8, 0x7C, 0x00, 0x07, 0xC1, 0xF0, 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x83, 0xE0, 0xF0, 0x7C, + 0x1F, 0x00, 0xC0, 0x70, 0x18, 0x0E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x3C, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x3F, 0xFC, 0x3F, 0xFC, 0x1F, + 0xFC, 0x07, 0xFC, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0x80, 0x1F, + 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x78, 0x00, + 0x03, 0x00, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xC7, 0xFF, 0xFC, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x18, 0x00, 0x03, 0xC0, + 0x00, 0x7F, 0x00, 0x0F, 0xF8, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x3F, + 0xF8, 0x01, 0xFF, 0x00, 0x07, 0xE0, 0x07, 0xFC, 0x07, 0xFF, 0x07, 0xFF, + 0x87, 0xFF, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x07, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x03, 0xF8, 0x03, 0xFF, 0xC1, 0xFF, 0xF8, 0xFF, 0xFE, 0x7E, 0x1F, + 0xDF, 0x03, 0xFF, 0x80, 0x7F, 0xE0, 0x1F, 0xF8, 0x07, 0xC0, 0x03, 0xE0, + 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, + 0x80, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFE, + 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xE0, 0x0F, 0x80, 0x00, + 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF1, 0xCF, 0x0F, 0x03, 0xFD, + 0xC7, 0x8F, 0x03, 0xFF, 0xE1, 0xC7, 0x03, 0xE3, 0xE0, 0xE7, 0x03, 0xC0, + 0xF0, 0x73, 0x83, 0xC0, 0x78, 0x3B, 0x81, 0xE0, 0x38, 0x1D, 0xC1, 0xE0, + 0x1C, 0x1C, 0xC0, 0xF0, 0x1C, 0x0E, 0xE0, 0x70, 0x0E, 0x0F, 0x70, 0x78, + 0x0E, 0x07, 0x38, 0x3C, 0x0F, 0x07, 0x1C, 0x1E, 0x0F, 0x87, 0x8E, 0x0F, + 0x8F, 0xCF, 0x87, 0x07, 0xFF, 0xFF, 0x83, 0xC1, 0xFE, 0x7F, 0x00, 0xE0, + 0x3C, 0x1F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x01, 0x00, 0x03, 0xF8, 0x07, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, + 0x1F, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, + 0x0F, 0xE0, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x03, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1F, 0x7C, 0x00, 0x7E, 0xF8, 0x00, 0xF9, + 0xF0, 0x03, 0xF3, 0xE0, 0x07, 0xC3, 0xE0, 0x1F, 0x87, 0xC0, 0x3E, 0x0F, + 0x80, 0xF8, 0x1F, 0x01, 0xF0, 0x3E, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, + 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xF1, 0xF0, 0x03, 0xE7, 0xC0, 0x07, 0xCF, + 0x80, 0x0F, 0xBE, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x7C, 0x07, + 0xFF, 0xF0, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, + 0xC0, 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, + 0x80, 0x1E, 0x1F, 0x80, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3F, 0xFF, 0xF8, 0x3E, 0x00, 0xFC, 0x3E, + 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, + 0x00, 0xF8, 0x7C, 0x01, 0xF8, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, + 0xFF, 0xFC, 0x03, 0xFF, 0xFE, 0x07, 0xE0, 0x7F, 0x0F, 0xC0, 0x3F, 0x1F, + 0x80, 0x1F, 0x3F, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x7C, 0xF8, + 0x00, 0x7C, 0xFC, 0x00, 0xF8, 0xFC, 0x01, 0xF8, 0x7F, 0x07, 0xF0, 0x7F, + 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x07, + 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xFE, 0x0F, + 0x80, 0x7E, 0x0F, 0x80, 0x3F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, + 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x3F, + 0x00, 0x1F, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, + 0x00, 0x3E, 0x7E, 0x00, 0x7C, 0x7C, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0x7C, + 0x01, 0xF8, 0x7C, 0x07, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFE, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0F, + 0x80, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF0, 0x3F, + 0xFF, 0xF0, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xE0, 0xF8, + 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0xFF, 0xFE, + 0x07, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xFC, 0x03, + 0xFF, 0xFE, 0x07, 0xE0, 0x7E, 0x0F, 0x80, 0x3F, 0x1F, 0x00, 0x1F, 0x3E, + 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0xF8, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x07, 0xFE, 0xF8, + 0x07, 0xFE, 0xF8, 0x00, 0x3E, 0xF8, 0x00, 0x3E, 0xFC, 0x00, 0x7E, 0xFC, + 0x00, 0x7C, 0x7E, 0x00, 0xFC, 0x7F, 0x83, 0xFC, 0x3F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xBC, 0x0F, 0xFF, 0x38, 0x03, 0xFC, 0x38, 0x03, 0xE0, 0x07, 0xC0, + 0xF8, 0x01, 0xF0, 0x7E, 0x00, 0x7C, 0x1F, 0x00, 0x3F, 0x07, 0xC0, 0x0F, + 0x81, 0xF0, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, + 0x1F, 0x83, 0xE0, 0x07, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x1F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC1, 0xF0, 0x03, 0xE0, 0x7C, 0x00, 0xF8, + 0x3F, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x07, 0xE0, 0xF8, 0x01, + 0xF0, 0x3E, 0x00, 0x7C, 0x1F, 0x80, 0x1F, 0x07, 0xC0, 0x0F, 0xC1, 0xF0, + 0x03, 0xF0, 0x7C, 0x00, 0xF8, 0x3F, 0x00, 0x3E, 0x00, 0x07, 0xC3, 0xF0, + 0xFC, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, + 0x3F, 0x0F, 0xC3, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, 0xE1, 0xF0, 0x7C, 0x1F, + 0x07, 0xC3, 0xF0, 0xFC, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x7C, 0x0F, + 0x8F, 0x81, 0xF8, 0xF8, 0x1F, 0x0F, 0x81, 0xF0, 0xF8, 0x1F, 0x0F, 0xC3, + 0xF0, 0xFF, 0xFE, 0x07, 0xFF, 0xC0, 0x3F, 0xF8, 0x01, 0xFC, 0x00, 0x07, + 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0x7C, 0x03, 0xF0, 0x3F, 0x03, 0xF8, + 0x0F, 0x81, 0xF8, 0x03, 0xE0, 0xFC, 0x00, 0xF8, 0x7E, 0x00, 0x7E, 0x3F, + 0x00, 0x1F, 0x1F, 0x80, 0x07, 0xCF, 0xC0, 0x01, 0xF7, 0xE0, 0x00, 0x7F, + 0xF0, 0x00, 0x3F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x03, 0xFF, 0xF0, 0x00, + 0xFE, 0xFC, 0x00, 0x3F, 0x1F, 0x80, 0x1F, 0x87, 0xE0, 0x07, 0xC0, 0xFC, + 0x01, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x01, 0xFC, 0x0F, 0xC0, + 0x3F, 0x03, 0xE0, 0x0F, 0xE0, 0xF8, 0x01, 0xF8, 0x3E, 0x00, 0x3F, 0x00, + 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xC0, 0x01, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0x03, + 0xF8, 0x01, 0xFC, 0x07, 0xF0, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0x3F, + 0xC0, 0x3F, 0xE0, 0x7F, 0x80, 0x7F, 0xC0, 0xFF, 0x01, 0xFF, 0x01, 0xFE, + 0x03, 0xFE, 0x07, 0xDC, 0x07, 0x7C, 0x0F, 0xB8, 0x1E, 0xF8, 0x1F, 0x70, + 0x3D, 0xF0, 0x3E, 0xF0, 0xF7, 0xC0, 0xF9, 0xE1, 0xEF, 0x81, 0xF3, 0xC7, + 0x9F, 0x03, 0xE7, 0x8F, 0x3E, 0x07, 0xCF, 0x3C, 0x7C, 0x0F, 0x9E, 0x79, + 0xF0, 0x3E, 0x3C, 0xE3, 0xE0, 0x7C, 0x7B, 0xC7, 0xC0, 0xF8, 0xF7, 0x8F, + 0x81, 0xF1, 0xFE, 0x1E, 0x07, 0xE3, 0xFC, 0x7C, 0x0F, 0x87, 0xF0, 0xF8, + 0x1F, 0x0F, 0xE1, 0xF0, 0x3E, 0x1F, 0x83, 0xE0, 0x7C, 0x3F, 0x0F, 0x81, + 0xF0, 0x7E, 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x7E, 0x00, 0xF8, 0x1F, + 0xC0, 0x1F, 0x03, 0xF8, 0x03, 0xE0, 0x7F, 0x80, 0x7C, 0x0F, 0xF0, 0x1F, + 0x01, 0xFF, 0x03, 0xE0, 0x7F, 0xE0, 0x7C, 0x0F, 0xBC, 0x0F, 0x81, 0xF7, + 0xC1, 0xF0, 0x3E, 0xF8, 0x7C, 0x0F, 0x8F, 0x0F, 0x81, 0xF1, 0xF1, 0xF0, + 0x3E, 0x3E, 0x3E, 0x07, 0xC3, 0xC7, 0xC0, 0xF8, 0x7D, 0xF0, 0x3E, 0x0F, + 0xBE, 0x07, 0xC0, 0xF7, 0xC0, 0xF8, 0x1F, 0xF8, 0x1F, 0x01, 0xFE, 0x03, + 0xC0, 0x3F, 0xC0, 0xF8, 0x07, 0xF8, 0x1F, 0x00, 0x7F, 0x03, 0xE0, 0x0F, + 0xE0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7E, 0x07, 0xF0, + 0x7E, 0x01, 0xF8, 0x7C, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, 0x0F, + 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xFF, 0x80, 0x00, + 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, 0x00, + 0x1F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, 0x0F, 0x87, 0xE0, + 0x0F, 0x83, 0xF8, 0x1F, 0x80, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x0F, + 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0xF0, 0xF8, 0x07, 0xE1, 0xF0, 0x07, 0xC3, + 0xE0, 0x0F, 0x8F, 0xC0, 0x1F, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0xF8, 0x7C, + 0x01, 0xF0, 0xF8, 0x07, 0xC3, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, + 0xF8, 0x1F, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x3F, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x7F, 0xFF, 0xC0, 0x7F, 0x07, + 0xF0, 0x7E, 0x01, 0xF8, 0x7E, 0x00, 0x7E, 0x3E, 0x00, 0x1F, 0x3E, 0x00, + 0x0F, 0x9E, 0x00, 0x07, 0xDF, 0x00, 0x03, 0xEF, 0x80, 0x01, 0xF7, 0x80, + 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7D, 0xF0, 0x00, 0x3E, 0xF8, + 0x02, 0x1F, 0x7C, 0x03, 0x9F, 0x3E, 0x03, 0xFF, 0x9F, 0x81, 0xFF, 0x87, + 0xE0, 0x7F, 0x83, 0xF8, 0x3F, 0xC0, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF0, + 0x0F, 0xFF, 0xFC, 0x01, 0xFE, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x07, 0xFF, + 0xF8, 0x07, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0x80, + 0x3F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x0F, 0x80, 0x1F, 0x1F, 0x80, + 0x1E, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7C, 0x1F, 0xFF, 0xF8, 0x1F, 0xFF, + 0xE0, 0x3F, 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x3E, 0x01, 0xF8, 0x3E, 0x00, + 0xF8, 0x3E, 0x00, 0xF8, 0x7E, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x01, + 0xF0, 0x7C, 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0xFC, 0x01, 0xF0, 0xF8, 0x01, + 0xF0, 0xF8, 0x01, 0xF0, 0x00, 0x3F, 0xC0, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, + 0x81, 0xFF, 0xFF, 0x0F, 0xC0, 0xFC, 0x3E, 0x01, 0xF1, 0xF0, 0x07, 0xC7, + 0xC0, 0x1F, 0x1F, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, + 0x80, 0x0F, 0xFF, 0xC0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, 0x03, 0xFE, + 0x00, 0x01, 0xF8, 0x00, 0x03, 0xEF, 0x80, 0x0F, 0xBE, 0x00, 0x3C, 0xFC, + 0x01, 0xF3, 0xF8, 0x1F, 0x87, 0xFF, 0xFE, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, + 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, + 0x00, 0x0F, 0x80, 0x1F, 0x1F, 0x80, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, + 0x3F, 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, 0x00, + 0x7E, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x3E, 0x00, 0x7C, 0x7C, 0x00, + 0x7C, 0x7C, 0x00, 0xFC, 0x7C, 0x00, 0xF8, 0x7C, 0x00, 0xF8, 0x7C, 0x00, + 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x01, 0xF8, 0xF8, 0x01, 0xF0, 0xF8, 0x01, + 0xF0, 0xF8, 0x03, 0xE0, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0x7F, 0xFF, + 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x03, + 0xE7, 0xC0, 0x0F, 0x9F, 0x00, 0x7C, 0x7C, 0x01, 0xF1, 0xF0, 0x0F, 0x87, + 0xC0, 0x3E, 0x1F, 0x01, 0xF0, 0x7C, 0x07, 0x81, 0xF0, 0x3E, 0x03, 0xC0, + 0xF0, 0x0F, 0x07, 0xC0, 0x3E, 0x1E, 0x00, 0xF8, 0xF8, 0x03, 0xE3, 0xC0, + 0x0F, 0x9F, 0x00, 0x3E, 0x78, 0x00, 0xFB, 0xE0, 0x01, 0xEF, 0x00, 0x07, + 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xE0, + 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x07, 0xE0, 0x1F, 0xF8, + 0x07, 0xE0, 0x3F, 0xF8, 0x0F, 0xE0, 0x3E, 0xF8, 0x0F, 0xE0, 0x7E, 0xF8, + 0x1F, 0xE0, 0x7C, 0xF8, 0x1F, 0xE0, 0x7C, 0xF8, 0x3F, 0xE0, 0xF8, 0xF8, + 0x3D, 0xE0, 0xF8, 0x78, 0x3D, 0xE1, 0xF0, 0x78, 0x79, 0xE1, 0xF0, 0x78, + 0x79, 0xE1, 0xE0, 0x78, 0xF9, 0xE3, 0xE0, 0x78, 0xF1, 0xE3, 0xC0, 0x79, + 0xF1, 0xE7, 0xC0, 0x79, 0xE1, 0xE7, 0x80, 0x79, 0xE1, 0xE7, 0x80, 0x7B, + 0xC1, 0xEF, 0x80, 0x7B, 0xC1, 0xEF, 0x00, 0x7F, 0x81, 0xFF, 0x00, 0x7F, + 0x81, 0xFE, 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x7E, 0x01, 0xF8, 0x00, 0x3E, 0x01, 0xF8, 0x00, 0x3C, + 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xE0, + 0x7E, 0x00, 0xFC, 0x1F, 0x80, 0x1F, 0x83, 0xE0, 0x01, 0xF8, 0xF8, 0x00, + 0x3F, 0x3F, 0x00, 0x03, 0xEF, 0xC0, 0x00, 0x7F, 0xF0, 0x00, 0x0F, 0xFC, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x3E, 0xF8, 0x00, 0x0F, 0xDF, 0x80, 0x03, 0xF3, 0xF0, 0x00, 0xFC, + 0x3F, 0x00, 0x3F, 0x07, 0xE0, 0x07, 0xE0, 0xFC, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x01, 0xF8, 0x1F, 0x80, 0x3F, 0x80, 0x7C, 0x00, 0xFD, 0xF8, 0x07, + 0xE7, 0xE0, 0x1F, 0x1F, 0x80, 0xFC, 0x3E, 0x07, 0xE0, 0xFC, 0x1F, 0x03, + 0xF0, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x1F, 0x00, 0x7E, 0xFC, 0x00, 0xFB, + 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x01, + 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xE0, 0x00, + 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0x00, + 0x03, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xF0, 0x7F, 0xFF, 0xF0, 0x00, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, + 0xF0, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x00, 0xE7, 0x39, 0xCE, 0x31, 0x8C, + 0x63, 0x1C, 0xE7, 0x39, 0xCE, 0x31, 0x8C, 0x63, 0x9C, 0xE7, 0x38, 0x01, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x3E, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x1F, 0xF0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, + 0x00, 0x00, 0x7C, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0xFC, 0x03, + 0x9E, 0x07, 0x9E, 0x0F, 0x1E, 0x0F, 0x1E, 0x1E, 0x1E, 0x1C, 0x0F, 0x3C, + 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xF3, 0x8C, 0x71, 0x80, 0x01, 0xFE, 0x01, 0xFF, 0xE0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x1F, 0x0F, 0xC7, 0x81, 0xF0, 0x00, 0x7C, 0x00, + 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xE3, 0xFE, 0xF9, 0xF0, 0x7C, 0xF8, 0x1F, + 0x3E, 0x0F, 0xCF, 0x87, 0xF3, 0xFF, 0xF8, 0xFF, 0xFE, 0x1F, 0xEF, 0x81, + 0xE3, 0xF0, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF9, 0xF8, 0x0F, 0xFF, + 0xC1, 0xFF, 0xFE, 0x1F, 0xFF, 0xE1, 0xFC, 0x3F, 0x1F, 0x83, 0xF1, 0xF0, + 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, + 0x03, 0xE7, 0xC0, 0x3E, 0x7E, 0x07, 0xC7, 0xF1, 0xFC, 0x7F, 0xFF, 0x87, + 0xFF, 0xF0, 0xFB, 0xFE, 0x0F, 0x9F, 0x80, 0x00, 0xFC, 0x01, 0xFF, 0xC0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF7, 0xC0, 0x7D, 0xF0, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x0F, + 0xBE, 0x07, 0xCF, 0xC3, 0xF1, 0xFF, 0xF8, 0x7F, 0xFC, 0x0F, 0xFE, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, + 0x3E, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x7E, 0x7C, + 0x07, 0xFD, 0xF0, 0x3F, 0xFF, 0xC1, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, + 0x07, 0xE1, 0xF0, 0x1F, 0x87, 0xC0, 0x3C, 0x3E, 0x00, 0xF0, 0xF8, 0x07, + 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, + 0xF0, 0xFE, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x7E, + 0x7C, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xE0, 0x3F, 0xFE, 0x0F, 0xFF, 0xE3, + 0xF0, 0x7E, 0x7C, 0x07, 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x3F, + 0x07, 0xE3, 0xFF, 0xF8, 0x7F, 0xFE, 0x03, 0xFF, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0xF8, 0x1F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7C, 0x07, 0xC0, 0x3E, 0x0F, + 0xFE, 0x7F, 0xF3, 0xFF, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, + 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x07, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0x80, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x7C, 0x7C, 0x07, 0xFD, + 0xF0, 0x3F, 0xF7, 0x81, 0xFF, 0xFE, 0x0F, 0xE3, 0xF8, 0x3E, 0x07, 0xE1, + 0xF8, 0x0F, 0x87, 0xC0, 0x3C, 0x1E, 0x00, 0xF0, 0xF8, 0x03, 0xC3, 0xE0, + 0x1F, 0x0F, 0x80, 0x78, 0x3E, 0x03, 0xE0, 0xF8, 0x1F, 0x83, 0xF0, 0xFE, + 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x3F, 0xEF, 0x00, 0x3E, 0x7C, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xC3, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3F, 0x0F, + 0xC0, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x0F, 0x80, 0x00, 0xF8, 0xF8, 0x0F, 0xBF, 0xE0, 0xFF, 0xFF, 0x0F, + 0xFF, 0xF1, 0xFC, 0x3F, 0x1F, 0x81, 0xF1, 0xF0, 0x1F, 0x1F, 0x01, 0xF1, + 0xE0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, + 0x7C, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, 0x07, + 0xCF, 0x80, 0x78, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, + 0x0F, 0x87, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, + 0x00, 0x3E, 0x00, 0x78, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, + 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, + 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, + 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x1F, 0xC0, 0x3F, 0x80, + 0x7E, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, + 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, + 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x07, 0xC7, 0xE0, 0x3E, 0x7E, 0x01, + 0xF7, 0xE0, 0x0F, 0xFE, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xFC, + 0x01, 0xFF, 0xE0, 0x0F, 0xDF, 0x00, 0xFC, 0xFC, 0x07, 0xC3, 0xE0, 0x3E, + 0x1F, 0x01, 0xF0, 0xFC, 0x0F, 0x83, 0xE0, 0xF8, 0x1F, 0x87, 0xC0, 0xFC, + 0x00, 0x07, 0xC1, 0xF0, 0x7C, 0x3E, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x1F, + 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x0F, 0x83, 0xE0, 0xF8, 0x3E, 0x0F, 0x87, + 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC3, 0xE0, 0xF8, 0x3E, 0x00, 0x0F, 0x8F, + 0x83, 0xF0, 0x3E, 0xFF, 0x3F, 0xE0, 0xF7, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, + 0xFF, 0x1F, 0xC7, 0xF8, 0x7C, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, 0x3E, 0x07, + 0xCF, 0x81, 0xF0, 0x3E, 0x3E, 0x07, 0xC0, 0xF8, 0xF8, 0x1F, 0x03, 0xE3, + 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x7C, 0x0F, 0x81, 0xF1, 0xF0, + 0x3E, 0x07, 0xC7, 0xC0, 0xF8, 0x1F, 0x1F, 0x03, 0xE0, 0x7C, 0x7C, 0x0F, + 0x81, 0xE3, 0xE0, 0x7C, 0x0F, 0x8F, 0x81, 0xF0, 0x3E, 0x00, 0x0F, 0x8F, + 0x80, 0xFB, 0xFE, 0x0F, 0xFF, 0xF1, 0xFF, 0xFF, 0x1F, 0xC3, 0xF1, 0xF8, + 0x1F, 0x1F, 0x01, 0xF1, 0xF0, 0x1F, 0x3E, 0x01, 0xF3, 0xE0, 0x3E, 0x3E, + 0x03, 0xE3, 0xE0, 0x3E, 0x3C, 0x03, 0xE7, 0xC0, 0x3E, 0x7C, 0x07, 0xC7, + 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0x80, 0x7C, 0xF8, 0x07, 0x80, 0x00, 0xFE, + 0x00, 0x7F, 0xF0, 0x3F, 0xFF, 0x0F, 0xFF, 0xE3, 0xF8, 0xFE, 0x7C, 0x0F, + 0xDF, 0x00, 0xFB, 0xE0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x1F, + 0xFC, 0x03, 0xEF, 0x80, 0x7D, 0xF8, 0x1F, 0x3F, 0x07, 0xE3, 0xFF, 0xF8, + 0x7F, 0xFE, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xE7, 0xE0, 0x0F, + 0xBF, 0xC0, 0x7D, 0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xF0, 0xFC, 0x1F, 0x81, + 0xF0, 0x7C, 0x07, 0xC3, 0xE0, 0x1F, 0x0F, 0x80, 0x7C, 0x3E, 0x01, 0xF0, + 0xF0, 0x07, 0xC3, 0xC0, 0x3E, 0x1F, 0x00, 0xF8, 0x7E, 0x07, 0xC1, 0xFC, + 0x7F, 0x07, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0xFB, 0xFE, 0x03, 0xE7, 0xE0, + 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, + 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x01, + 0xF1, 0xF0, 0x7F, 0xDF, 0x0F, 0xFD, 0xF1, 0xFF, 0xFE, 0x3F, 0x8F, 0xE3, + 0xE0, 0x7E, 0x7C, 0x03, 0xE7, 0xC0, 0x3E, 0xF8, 0x03, 0xCF, 0x80, 0x3C, + 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xFC, 0x3F, + 0x87, 0xFF, 0xF8, 0x7F, 0xFF, 0x83, 0xFF, 0xF0, 0x1F, 0x9F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x0F, 0x8E, 0x1F, 0x7C, 0x3F, + 0xF0, 0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00, + 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, 0x00, 0x01, 0xFC, 0x01, 0xFF, 0xC0, + 0xFF, 0xF8, 0x7F, 0xFF, 0x3F, 0x0F, 0xCF, 0x81, 0xF3, 0xF0, 0x00, 0xFF, + 0x80, 0x3F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1F, + 0xBE, 0x03, 0xEF, 0xC1, 0xFB, 0xFF, 0xFC, 0x7F, 0xFE, 0x0F, 0xFF, 0x00, + 0xFE, 0x00, 0x0F, 0x81, 0xF0, 0x7C, 0x0F, 0x81, 0xF0, 0xFF, 0xBF, 0xF7, + 0xFE, 0x3E, 0x07, 0xC0, 0xF8, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0xF8, 0x1F, 0x03, 0xE0, 0x7F, 0x0F, 0xE1, 0xFC, 0x1F, 0x80, 0x1F, 0x01, + 0xF1, 0xF0, 0x1F, 0x3E, 0x03, 0xE3, 0xE0, 0x3E, 0x3E, 0x03, 0xE3, 0xE0, + 0x3E, 0x3E, 0x03, 0xE7, 0xC0, 0x7C, 0x7C, 0x07, 0xC7, 0xC0, 0x7C, 0x7C, + 0x07, 0xC7, 0xC0, 0x7C, 0xF8, 0x0F, 0x8F, 0x81, 0xF8, 0xF8, 0x3F, 0x8F, + 0xFF, 0xF8, 0xFF, 0xFF, 0x07, 0xFD, 0xF0, 0x3F, 0x1F, 0x00, 0xF8, 0x0F, + 0xFE, 0x03, 0xEF, 0x81, 0xF3, 0xE0, 0x7C, 0xF8, 0x3E, 0x3E, 0x0F, 0x8F, + 0x87, 0xC1, 0xE1, 0xF0, 0x78, 0xF8, 0x1E, 0x3E, 0x07, 0x9F, 0x01, 0xF7, + 0x80, 0x7F, 0xE0, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, + 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x1F, 0x07, 0xFF, 0x03, 0xE0, 0xFB, + 0xE0, 0xFC, 0x1F, 0x7C, 0x1F, 0x87, 0xCF, 0x87, 0xF0, 0xF9, 0xF0, 0xFE, + 0x3E, 0x3E, 0x3D, 0xC7, 0xC3, 0xC7, 0xB9, 0xF0, 0x79, 0xE7, 0x3E, 0x0F, + 0x3C, 0xE7, 0x81, 0xEF, 0x1D, 0xF0, 0x3D, 0xE3, 0xBC, 0x07, 0xBC, 0x7F, + 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE1, 0xFC, 0x03, 0xF8, 0x3F, 0x00, 0x7F, + 0x07, 0xE0, 0x0F, 0xC0, 0xF8, 0x01, 0xF8, 0x1F, 0x00, 0x00, 0x0F, 0xC1, + 0xF8, 0x3F, 0x07, 0xC0, 0x7C, 0x3E, 0x01, 0xF9, 0xF8, 0x03, 0xEF, 0xC0, + 0x0F, 0xBE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x3E, 0xF8, + 0x01, 0xFB, 0xF0, 0x07, 0xC7, 0xC0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, 0x0F, + 0xC0, 0xF8, 0x00, 0x1F, 0x80, 0x7C, 0x3E, 0x03, 0xE0, 0xF8, 0x0F, 0x03, + 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3E, 0x0F, 0x80, 0xF8, 0x3C, 0x03, 0xE1, + 0xF0, 0x07, 0x87, 0x80, 0x1F, 0x3E, 0x00, 0x7C, 0xF0, 0x01, 0xF7, 0xC0, + 0x07, 0xDE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFE, 0x00, 0x03, + 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x01, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFC, 0x3F, + 0xFF, 0x87, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, + 0xF0, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, + 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xFF, 0xF8, 0xFF, 0xFF, 0x1F, 0xFF, + 0xE3, 0xFF, 0xFC, 0x00, 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, + 0xE0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, + 0xE0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, 0x1F, 0x80, 0x70, 0x01, 0xF8, 0x01, + 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, + 0xF0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xFC, 0x07, 0xE0, 0x0F, 0x80, + 0x1E, 0x00, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, + 0x03, 0x81, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x1C, 0x0E, 0x07, 0x01, + 0x80, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0xFE, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, + 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x7E, 0x00, 0x38, 0x07, 0xE0, + 0x3E, 0x00, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, + 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x00, + 0xF8, 0x00, 0x0F, 0x00, 0x1F, 0xC1, 0xDF, 0xF0, 0xEE, 0x3F, 0xE6, 0x07, + 0xF0, 0x01, 0xE0 }; + +const GFXglyph FreeSansBoldOblique18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 10, 0, 1 }, // 0x20 ' ' + { 0, 10, 25, 12, 4, -24 }, // 0x21 '!' + { 32, 13, 9, 17, 6, -25 }, // 0x22 '"' + { 47, 22, 24, 19, 1, -23 }, // 0x23 '#' + { 113, 19, 31, 19, 2, -26 }, // 0x24 '$' + { 187, 26, 26, 31, 5, -25 }, // 0x25 '%' + { 272, 21, 25, 25, 3, -24 }, // 0x26 '&' + { 338, 5, 9, 8, 6, -25 }, // 0x27 ''' + { 344, 13, 33, 12, 3, -25 }, // 0x28 '(' + { 398, 13, 33, 12, -1, -25 }, // 0x29 ')' + { 452, 12, 11, 14, 5, -25 }, // 0x2A '*' + { 469, 18, 16, 20, 3, -15 }, // 0x2B '+' + { 505, 7, 11, 10, 1, -4 }, // 0x2C ',' + { 515, 10, 4, 12, 2, -10 }, // 0x2D '-' + { 520, 6, 5, 10, 2, -4 }, // 0x2E '.' + { 524, 15, 25, 10, 0, -24 }, // 0x2F '/' + { 571, 18, 25, 19, 3, -24 }, // 0x30 '0' + { 628, 13, 25, 19, 6, -24 }, // 0x31 '1' + { 669, 21, 25, 19, 1, -24 }, // 0x32 '2' + { 735, 20, 25, 19, 2, -24 }, // 0x33 '3' + { 798, 19, 25, 19, 2, -24 }, // 0x34 '4' + { 858, 20, 24, 19, 2, -23 }, // 0x35 '5' + { 918, 19, 25, 19, 3, -24 }, // 0x36 '6' + { 978, 19, 24, 19, 5, -23 }, // 0x37 '7' + { 1035, 20, 25, 19, 2, -24 }, // 0x38 '8' + { 1098, 19, 25, 19, 2, -24 }, // 0x39 '9' + { 1158, 9, 18, 12, 4, -17 }, // 0x3A ':' + { 1179, 10, 24, 12, 3, -17 }, // 0x3B ';' + { 1209, 19, 17, 20, 3, -16 }, // 0x3C '<' + { 1250, 20, 12, 20, 2, -13 }, // 0x3D '=' + { 1280, 19, 17, 20, 1, -15 }, // 0x3E '>' + { 1321, 18, 26, 21, 6, -25 }, // 0x3F '?' + { 1380, 33, 31, 34, 3, -25 }, // 0x40 '@' + { 1508, 23, 26, 25, 1, -25 }, // 0x41 'A' + { 1583, 24, 26, 25, 3, -25 }, // 0x42 'B' + { 1661, 24, 26, 25, 4, -25 }, // 0x43 'C' + { 1739, 24, 26, 25, 3, -25 }, // 0x44 'D' + { 1817, 24, 26, 23, 3, -25 }, // 0x45 'E' + { 1895, 23, 26, 21, 3, -25 }, // 0x46 'F' + { 1970, 24, 26, 27, 4, -25 }, // 0x47 'G' + { 2048, 26, 26, 25, 2, -25 }, // 0x48 'H' + { 2133, 10, 26, 10, 2, -25 }, // 0x49 'I' + { 2166, 20, 26, 19, 2, -25 }, // 0x4A 'J' + { 2231, 26, 26, 25, 3, -25 }, // 0x4B 'K' + { 2316, 18, 26, 21, 3, -25 }, // 0x4C 'L' + { 2375, 31, 26, 29, 2, -25 }, // 0x4D 'M' + { 2476, 27, 26, 25, 2, -25 }, // 0x4E 'N' + { 2564, 25, 26, 27, 4, -25 }, // 0x4F 'O' + { 2646, 23, 26, 23, 3, -25 }, // 0x50 'P' + { 2721, 25, 27, 27, 4, -25 }, // 0x51 'Q' + { 2806, 24, 26, 25, 3, -25 }, // 0x52 'R' + { 2884, 22, 26, 23, 3, -25 }, // 0x53 'S' + { 2956, 21, 26, 21, 5, -25 }, // 0x54 'T' + { 3025, 24, 26, 25, 4, -25 }, // 0x55 'U' + { 3103, 22, 26, 23, 6, -25 }, // 0x56 'V' + { 3175, 32, 26, 33, 6, -25 }, // 0x57 'W' + { 3279, 27, 26, 23, 1, -25 }, // 0x58 'X' + { 3367, 22, 26, 23, 6, -25 }, // 0x59 'Y' + { 3439, 25, 26, 21, 1, -25 }, // 0x5A 'Z' + { 3521, 15, 33, 12, 1, -25 }, // 0x5B '[' + { 3583, 5, 25, 10, 5, -24 }, // 0x5C '\' + { 3599, 15, 33, 12, -1, -25 }, // 0x5D ']' + { 3661, 16, 15, 20, 4, -23 }, // 0x5E '^' + { 3691, 21, 3, 19, -2, 5 }, // 0x5F '_' + { 3699, 5, 5, 12, 6, -25 }, // 0x60 '`' + { 3703, 18, 19, 19, 2, -18 }, // 0x61 'a' + { 3746, 20, 26, 21, 2, -25 }, // 0x62 'b' + { 3811, 18, 19, 19, 3, -18 }, // 0x63 'c' + { 3854, 22, 26, 21, 3, -25 }, // 0x64 'd' + { 3926, 19, 19, 19, 2, -18 }, // 0x65 'e' + { 3972, 13, 26, 12, 3, -25 }, // 0x66 'f' + { 4015, 22, 27, 21, 1, -18 }, // 0x67 'g' + { 4090, 20, 26, 21, 2, -25 }, // 0x68 'h' + { 4155, 10, 26, 10, 2, -25 }, // 0x69 'i' + { 4188, 15, 34, 10, -2, -25 }, // 0x6A 'j' + { 4252, 21, 26, 19, 2, -25 }, // 0x6B 'k' + { 4321, 10, 26, 10, 2, -25 }, // 0x6C 'l' + { 4354, 30, 19, 31, 2, -18 }, // 0x6D 'm' + { 4426, 20, 19, 21, 2, -18 }, // 0x6E 'n' + { 4474, 19, 19, 21, 3, -18 }, // 0x6F 'o' + { 4520, 22, 27, 21, 0, -18 }, // 0x70 'p' + { 4595, 20, 27, 21, 3, -18 }, // 0x71 'q' + { 4663, 15, 19, 14, 2, -18 }, // 0x72 'r' + { 4699, 18, 19, 19, 2, -18 }, // 0x73 's' + { 4742, 11, 23, 12, 4, -22 }, // 0x74 't' + { 4774, 20, 19, 21, 3, -18 }, // 0x75 'u' + { 4822, 18, 19, 19, 5, -18 }, // 0x76 'v' + { 4865, 27, 19, 27, 4, -18 }, // 0x77 'w' + { 4930, 22, 19, 19, 1, -18 }, // 0x78 'x' + { 4983, 22, 27, 19, 1, -18 }, // 0x79 'y' + { 5058, 19, 19, 17, 1, -18 }, // 0x7A 'z' + { 5104, 14, 33, 14, 2, -25 }, // 0x7B '{' + { 5162, 9, 33, 10, 2, -25 }, // 0x7C '|' + { 5200, 14, 33, 14, 2, -25 }, // 0x7D '}' + { 5258, 17, 6, 20, 3, -10 } }; // 0x7E '~' + +const GFXfont FreeSansBoldOblique18pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique18pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 5943 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h new file mode 100644 index 0000000..ea65f9b --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h @@ -0,0 +1,893 @@ +const uint8_t FreeSansBoldOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x07, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, + 0x80, 0xFE, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x1F, + 0x80, 0x7E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x80, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE, 0x03, 0xF8, 0x00, + 0x7E, 0x0F, 0xDF, 0x83, 0xF7, 0xE0, 0xFF, 0xF0, 0x7E, 0xFC, 0x1F, 0xBF, + 0x07, 0xEF, 0xC1, 0xFB, 0xE0, 0x7C, 0xF8, 0x1F, 0x3C, 0x07, 0x8F, 0x01, + 0xE3, 0x80, 0x70, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x03, + 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x83, + 0xE0, 0x00, 0xF8, 0x3E, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, + 0x7F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x0F, + 0x83, 0xE0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x3E, 0x0F, + 0x80, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x7C, 0x00, + 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0x07, 0xC0, 0x00, 0xF8, 0x3E, + 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x7C, 0x1F, 0x00, 0x07, 0xC1, 0xF0, 0x00, + 0x3E, 0x0F, 0x80, 0x01, 0xF0, 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0xF8, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x3F, 0xFF, 0xE0, 0x1F, + 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0x07, 0xF3, 0x9F, 0xC1, 0xF8, 0xE3, 0xF0, + 0x7C, 0x38, 0xFC, 0x3F, 0x0E, 0x3F, 0x0F, 0xC7, 0x8F, 0xC3, 0xF1, 0xC0, + 0x00, 0xFE, 0x70, 0x00, 0x3F, 0xDC, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0xFF, + 0xE0, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x77, 0xF8, 0x00, 0x1C, 0xFE, + 0x00, 0x07, 0x3F, 0x8F, 0xE3, 0xCF, 0xE3, 0xF8, 0xE3, 0xF8, 0xFE, 0x38, + 0xFC, 0x3F, 0x8E, 0x7F, 0x0F, 0xF3, 0x9F, 0xC3, 0xFD, 0xFF, 0xE0, 0x7F, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x80, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, + 0x80, 0x7F, 0xE0, 0x00, 0xF0, 0x0F, 0xFF, 0x00, 0x1E, 0x01, 0xFF, 0xF0, + 0x01, 0xC0, 0x3F, 0xFF, 0x80, 0x3C, 0x07, 0xE1, 0xF8, 0x07, 0x80, 0x78, + 0x07, 0x80, 0xF0, 0x0F, 0x80, 0x78, 0x0E, 0x00, 0xF0, 0x07, 0x81, 0xC0, + 0x0F, 0x00, 0xF8, 0x3C, 0x00, 0xF0, 0x0F, 0x07, 0x80, 0x0F, 0xC3, 0xF0, + 0xF0, 0x00, 0xFF, 0xFE, 0x0E, 0x00, 0x07, 0xFF, 0xC1, 0xE0, 0x00, 0x7F, + 0xF8, 0x3C, 0x00, 0x03, 0xFF, 0x07, 0x80, 0x00, 0x0F, 0xC0, 0x70, 0x00, + 0x00, 0x00, 0x0E, 0x03, 0xF0, 0x00, 0x01, 0xE0, 0xFF, 0xC0, 0x00, 0x3C, + 0x1F, 0xFE, 0x00, 0x03, 0x83, 0xFF, 0xE0, 0x00, 0x70, 0x7F, 0xFF, 0x00, + 0x0F, 0x0F, 0xC3, 0xF0, 0x01, 0xE0, 0xF0, 0x0F, 0x00, 0x3C, 0x1F, 0x00, + 0xF0, 0x03, 0x81, 0xE0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xF0, 0x0F, 0x01, + 0xE0, 0x1E, 0x01, 0xE0, 0x1F, 0x87, 0xE0, 0x1C, 0x01, 0xFF, 0xFC, 0x03, + 0x80, 0x0F, 0xFF, 0x80, 0x78, 0x00, 0xFF, 0xF0, 0x0F, 0x00, 0x07, 0xFE, + 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0xF0, + 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xF8, 0x00, + 0x3F, 0x9F, 0xC0, 0x03, 0xF8, 0x7E, 0x00, 0x1F, 0xC3, 0xF0, 0x00, 0xFE, + 0x1F, 0x00, 0x07, 0xF1, 0xF8, 0x00, 0x3F, 0xCF, 0xC0, 0x01, 0xFE, 0xFC, + 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0x07, 0xC1, 0xFF, + 0xF8, 0x3E, 0x3F, 0xFF, 0xE3, 0xE3, 0xFE, 0x3F, 0x1F, 0x1F, 0xC1, 0xFD, + 0xF1, 0xFC, 0x07, 0xFF, 0x8F, 0xC0, 0x3F, 0xF8, 0xFE, 0x00, 0xFF, 0xC7, + 0xF0, 0x07, 0xFC, 0x3F, 0x80, 0x1F, 0xC1, 0xFC, 0x00, 0xFE, 0x0F, 0xF0, + 0x1F, 0xF8, 0x7F, 0xC1, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, + 0xFC, 0x3F, 0xFF, 0xCF, 0xE0, 0x7F, 0xF8, 0x7F, 0x80, 0xFF, 0x00, 0x00, + 0x7E, 0xFD, 0xFF, 0xEF, 0xDF, 0xBF, 0x7C, 0xF9, 0xE3, 0xC7, 0x00, 0x00, + 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, + 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8, + 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x03, 0xF0, 0x01, + 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, + 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, + 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, + 0x00, 0x1F, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x03, + 0xE0, 0x03, 0xF0, 0x01, 0xF0, 0x01, 0xF8, 0x00, 0xF8, 0x00, 0xFC, 0x00, + 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, + 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x07, 0x3C, 0x6F, 0xFF, 0xFF, 0xFF, 0xBF, 0xFE, 0x0F, 0xE0, + 0x1F, 0xC0, 0x7F, 0x81, 0xEF, 0x87, 0x8F, 0x0E, 0x1E, 0x08, 0x10, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF8, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xC7, 0xF1, 0xF8, 0xFE, 0x3F, + 0x8F, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, 0xF0, 0xFC, 0x3C, 0x0C, + 0x00, 0x7F, 0xFD, 0xFF, 0xF7, 0xFF, 0x9F, 0xFE, 0xFF, 0xFB, 0xFF, 0xE0, + 0x7F, 0x7F, 0x7F, 0x7E, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x70, 0x00, 0x0E, + 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03, + 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01, + 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, + 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, + 0x1F, 0xC7, 0xF8, 0x1F, 0xC1, 0xFE, 0x1F, 0xC0, 0x7F, 0x0F, 0xC0, 0x3F, + 0x8F, 0xE0, 0x1F, 0xC7, 0xF0, 0x0F, 0xE3, 0xF0, 0x07, 0xF3, 0xF8, 0x03, + 0xF9, 0xFC, 0x01, 0xFC, 0xFC, 0x01, 0xFE, 0xFE, 0x00, 0xFE, 0x7F, 0x00, + 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0xC0, 0x1F, 0xCF, 0xE0, 0x1F, 0xEF, 0xE0, + 0x0F, 0xE7, 0xF0, 0x07, 0xF3, 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xF8, 0xFE, + 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0xFE, 0x1F, 0xE0, 0x7F, 0x0F, + 0xF8, 0xFF, 0x03, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, + 0x1F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x0F, + 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x07, 0xE0, 0x0F, 0xF0, 0x3F, 0xF9, 0xFF, + 0xF8, 0xFF, 0xFC, 0xFF, 0xFE, 0x7F, 0xFF, 0x00, 0x3F, 0x80, 0x1F, 0x80, + 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xFC, + 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x1F, 0xC0, 0x0F, + 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, + 0x7F, 0x00, 0x3F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x00, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, + 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0x07, 0xFC, 0x07, 0xF0, 0x1F, 0xE0, 0x7F, + 0x00, 0x7F, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0x80, 0x1F, 0xC1, 0xF8, 0x00, + 0xFE, 0x0F, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0xFF, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0xFC, 0x1F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0xF0, 0x07, + 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xC0, 0xFE, 0x1F, 0xF0, 0x7F, 0x01, 0xFC, + 0x1F, 0x80, 0x7F, 0x07, 0xE0, 0x1F, 0xC3, 0xF0, 0x07, 0xF0, 0xFC, 0x01, + 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x80, 0x01, + 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xFF, 0x80, + 0x01, 0xFF, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x3F, 0x80, + 0x3F, 0xCF, 0xE0, 0x0F, 0xE3, 0xF8, 0x07, 0xF8, 0xFF, 0x83, 0xFC, 0x3F, + 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xE0, + 0x03, 0xFF, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x7F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, + 0x3F, 0xF8, 0x00, 0x3D, 0xFC, 0x00, 0x3C, 0xFE, 0x00, 0x3E, 0x7E, 0x00, + 0x3E, 0x7F, 0x00, 0x1E, 0x3F, 0x80, 0x1E, 0x1F, 0xC0, 0x1E, 0x0F, 0xC0, + 0x1F, 0x07, 0xE0, 0x1F, 0x07, 0xF0, 0x1F, 0x03, 0xF8, 0x1F, 0x01, 0xFC, + 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFE, 0x0F, 0x80, 0x7F, 0x07, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, + 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x7F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, + 0xF0, 0x0F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x03, 0xE3, 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xF0, 0x1F, 0xE1, 0xFF, 0x03, 0xF0, 0x1F, 0xE0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0xFE, 0x1F, + 0xC0, 0x3F, 0x83, 0xF8, 0x07, 0xF0, 0x7F, 0x83, 0xFC, 0x0F, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFE, 0x00, 0x0F, + 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, + 0x00, 0x1F, 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0xF8, 0x1F, 0xC3, + 0xFC, 0x1F, 0x80, 0xFE, 0x0F, 0xC0, 0x3F, 0x0F, 0xC0, 0x00, 0x07, 0xE0, + 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF8, 0xFC, 0x01, 0xF9, + 0xFF, 0x80, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF, 0xFC, 0x3F, + 0xE1, 0xFF, 0x1F, 0xE0, 0x7F, 0x8F, 0xE0, 0x1F, 0xCF, 0xE0, 0x0F, 0xE7, + 0xF0, 0x07, 0xF3, 0xF0, 0x03, 0xF9, 0xF8, 0x01, 0xF8, 0xFC, 0x01, 0xFC, + 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0xFE, 0x1F, 0xC0, 0xFF, 0x0F, 0xF0, 0xFF, + 0x03, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, + 0x80, 0x07, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, + 0x9F, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xE0, + 0x00, 0x03, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, + 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x0F, 0xFF, 0x80, 0x07, 0xFF, 0xF0, 0x03, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, + 0xC0, 0xFE, 0x0F, 0xF0, 0x3E, 0x01, 0xFC, 0x1F, 0x80, 0x3F, 0x07, 0xC0, + 0x0F, 0xC1, 0xF0, 0x03, 0xF0, 0x7C, 0x01, 0xF8, 0x1F, 0x00, 0xFC, 0x03, + 0xF0, 0x7F, 0x00, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, + 0x07, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0x81, 0xFE, 0x1F, 0xE0, 0xFE, 0x03, + 0xFC, 0x3F, 0x00, 0x7F, 0x1F, 0xC0, 0x1F, 0xC7, 0xE0, 0x07, 0xF3, 0xF8, + 0x01, 0xFC, 0xFE, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x8F, 0xE0, 0x0F, 0xE3, + 0xFC, 0x07, 0xF0, 0xFF, 0x87, 0xFC, 0x3F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, + 0x00, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x00, 0x3F, + 0xC0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFF, 0x00, + 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0xF0, 0x3F, 0xC3, 0xF8, 0x3F, 0xC0, 0xFE, + 0x1F, 0xC0, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC7, 0xE0, 0x07, + 0xE7, 0xF0, 0x03, 0xF3, 0xF8, 0x01, 0xF9, 0xFC, 0x01, 0xFC, 0xFE, 0x00, + 0xFE, 0x7F, 0x00, 0xFE, 0x3F, 0xC0, 0xFF, 0x1F, 0xF0, 0xFF, 0x87, 0xFF, + 0xFF, 0xC3, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xE0, 0x3F, 0xF3, 0xF0, 0x07, + 0xE3, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7E, 0x1F, 0xC0, 0x7E, 0x0F, 0xF0, 0xFF, 0x07, 0xFF, 0xFF, 0x01, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x7E, 0x0F, 0xE0, + 0xFE, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x07, 0xF0, 0x7F, 0x07, + 0xE0, 0xFE, 0x0F, 0xE0, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, + 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, + 0x03, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0xF0, 0x0F, 0xC0, + 0x3C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0xF8, 0x00, 0x03, 0xFE, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xE0, + 0x1F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0x1F, 0xFF, 0x80, + 0x0F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x3F, 0xFE, + 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xF8, 0x00, + 0x7F, 0xFF, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x01, 0xF8, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0xF1, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xF8, 0xFF, + 0xFF, 0xFE, 0x3F, 0xFF, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x7F, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xC0, + 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0xE0, 0x0F, 0xFF, 0xF0, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, + 0xE0, 0x1F, 0xFF, 0xC0, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, + 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, + 0x1F, 0xFF, 0xFE, 0x3F, 0xC1, 0xFF, 0x3F, 0x80, 0xFF, 0x7F, 0x00, 0x7F, + 0x7E, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, + 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, + 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00, + 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x1F, 0xF8, 0x00, 0x07, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x80, 0x07, 0xE0, + 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF0, 0x0F, 0xC0, 0x00, + 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x03, 0xF1, + 0xF1, 0xF0, 0x7C, 0x00, 0xFF, 0xCF, 0x07, 0x87, 0xE0, 0x1F, 0xFF, 0xF8, + 0x3C, 0x7E, 0x01, 0xF8, 0x7F, 0x81, 0xE3, 0xE0, 0x1F, 0x01, 0xF8, 0x0F, + 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x79, 0xF0, 0x1F, 0x00, 0x7C, 0x03, 0xDF, + 0x00, 0xF0, 0x03, 0xE0, 0x1C, 0xF8, 0x0F, 0x80, 0x1E, 0x01, 0xE7, 0xC0, + 0x78, 0x00, 0xF0, 0x0F, 0x3C, 0x07, 0xC0, 0x0F, 0x00, 0xF3, 0xE0, 0x3C, + 0x00, 0x78, 0x07, 0x9F, 0x03, 0xE0, 0x07, 0x80, 0x78, 0xF8, 0x1F, 0x00, + 0x7C, 0x07, 0xC7, 0xC0, 0xF8, 0x07, 0xC0, 0x7C, 0x3E, 0x07, 0xC0, 0x7E, + 0x07, 0xC1, 0xF0, 0x3F, 0x07, 0xF8, 0xFC, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, + 0xC0, 0x7E, 0x07, 0xFF, 0xBF, 0xFC, 0x01, 0xF0, 0x1F, 0xF8, 0xFF, 0x80, + 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x03, 0x80, 0x00, 0x01, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x7F, + 0xF0, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0xFF, + 0xF0, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x03, 0xFB, + 0xF8, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x07, 0xE3, 0xF8, 0x00, 0x0F, 0xE3, + 0xF8, 0x00, 0x0F, 0xC3, 0xF8, 0x00, 0x1F, 0xC3, 0xF8, 0x00, 0x1F, 0x83, + 0xF8, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x7F, 0x01, + 0xFC, 0x00, 0xFE, 0x01, 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFF, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, + 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x0F, 0xE0, 0x00, + 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x00, + 0xFE, 0x3F, 0x80, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, + 0x7F, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0xFF, 0x03, 0xF8, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0x7F, 0x07, 0xF0, 0x00, + 0x7F, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x7E, 0x07, 0xF0, 0x00, + 0xFE, 0x0F, 0xF0, 0x03, 0xFC, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, + 0xF8, 0x1F, 0xFF, 0xFF, 0xF8, 0x1F, 0xC0, 0x07, 0xFC, 0x1F, 0xC0, 0x01, + 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01, + 0xFC, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x7F, 0x00, 0x07, + 0xF8, 0x7F, 0x00, 0x0F, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, + 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0x03, 0xFE, 0x07, 0xFC, 0x01, + 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, + 0x7F, 0x1F, 0xC0, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xF8, 0xFE, 0x00, 0x03, + 0xF8, 0xFF, 0x00, 0x07, 0xF8, 0xFF, 0x00, 0x07, 0xF0, 0x7F, 0x80, 0x1F, + 0xF0, 0x7F, 0xE0, 0x7F, 0xE0, 0x3F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, + 0x80, 0x1F, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xF8, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, + 0xE0, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, + 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x03, 0xFE, 0x07, 0xF0, 0x01, + 0xFF, 0x07, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, + 0x7F, 0x0F, 0xF0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, + 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x7F, 0x1F, 0xC0, 0x00, + 0x7F, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xC0, 0x00, + 0xFE, 0x1F, 0xC0, 0x01, 0xFE, 0x3F, 0x80, 0x01, 0xFC, 0x3F, 0x80, 0x01, + 0xFC, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x07, 0xF8, 0x7F, 0x00, 0x0F, + 0xF0, 0x7F, 0x00, 0x1F, 0xF0, 0x7F, 0x00, 0x7F, 0xE0, 0x7F, 0xFF, 0xFF, + 0xC0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, + 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, + 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, + 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, + 0xE0, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, + 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, + 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, + 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, + 0xC0, 0x0F, 0xFF, 0xFF, 0xC0, 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, + 0xF8, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, + 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFC, 0x07, 0xFC, 0x0F, 0xF8, + 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x1F, 0xC7, 0xF0, + 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x7F, + 0x00, 0x3F, 0xFF, 0x3F, 0x00, 0x1F, 0xFF, 0xBF, 0x80, 0x0F, 0xFF, 0x9F, + 0xC0, 0x07, 0xFF, 0xCF, 0xE0, 0x03, 0xFF, 0xE7, 0xF0, 0x03, 0xFF, 0xF3, + 0xF8, 0x00, 0x01, 0xF9, 0xFC, 0x00, 0x01, 0xF8, 0xFF, 0x00, 0x00, 0xFC, + 0x7F, 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, + 0x87, 0xFC, 0x00, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFE, 0xF8, 0x03, 0xFF, 0xFC, + 0x78, 0x00, 0x7F, 0xFC, 0x3C, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F, 0x80, + 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0x3F, + 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8, 0x00, + 0x3F, 0x80, 0xFF, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x03, 0xF8, + 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFE, 0x03, + 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xF8, 0x0F, 0xE0, 0x00, + 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, 0xF0, + 0x00, 0x7F, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x01, 0xFC, 0x07, + 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x01, 0xFC, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0xFE, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, + 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x7F, 0x00, 0x07, 0xF0, 0x1F, 0xC0, + 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x07, 0xF0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, + 0x0F, 0xE0, 0x3F, 0x81, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, + 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, 0xFC, + 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xF8, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0xFE, + 0x03, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x0F, 0xE0, 0xFE, 0x03, 0xFC, 0x1F, 0xC0, 0x7F, 0x03, 0xF8, 0x0F, 0xE0, + 0xFE, 0x01, 0xFC, 0x1F, 0xC0, 0x3F, 0x83, 0xF8, 0x0F, 0xE0, 0x7F, 0x01, + 0xFC, 0x0F, 0xF0, 0xFF, 0x81, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xF8, 0x03, + 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFF, 0xE0, 0x00, 0x1F, 0xE0, + 0x00, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x00, 0xFF, 0x00, + 0x7F, 0x00, 0x1F, 0xF0, 0x03, 0xF8, 0x01, 0xFF, 0x00, 0x1F, 0xC0, 0x1F, + 0xE0, 0x00, 0xFE, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x1F, 0xE0, 0x00, 0x7F, + 0x01, 0xFE, 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x1F, 0xC1, 0xFE, 0x00, + 0x00, 0xFE, 0x1F, 0xE0, 0x00, 0x0F, 0xE3, 0xFE, 0x00, 0x00, 0x7F, 0x3F, + 0xC0, 0x00, 0x03, 0xFB, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, + 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xC0, + 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x01, 0xFF, + 0x9F, 0xE0, 0x00, 0x0F, 0xF8, 0xFF, 0x00, 0x00, 0x7F, 0x83, 0xFC, 0x00, + 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x1F, 0xC0, 0x7F, 0x80, 0x01, 0xFC, 0x01, + 0xFE, 0x00, 0x0F, 0xE0, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x3F, 0xC0, 0x03, + 0xF8, 0x01, 0xFF, 0x00, 0x3F, 0x80, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3F, + 0xE0, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x07, 0xFC, 0x03, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xF8, + 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, + 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, + 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, + 0x00, 0x1F, 0xC0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, + 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, + 0x80, 0x03, 0xFF, 0x80, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x7F, 0xE0, 0x01, + 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0xFF, 0xE0, 0x3F, 0xF8, 0x00, 0xFF, 0xF0, + 0x1F, 0xFC, 0x00, 0x7F, 0xF8, 0x0F, 0xFE, 0x00, 0x7D, 0xF8, 0x07, 0xEF, + 0x00, 0x3E, 0xFC, 0x03, 0xF7, 0x80, 0x3F, 0xFE, 0x03, 0xFB, 0xC0, 0x1F, + 0x7F, 0x01, 0xFD, 0xE0, 0x1F, 0xBF, 0x00, 0xFE, 0xF0, 0x0F, 0x9F, 0x80, + 0x7E, 0x78, 0x0F, 0xDF, 0xC0, 0x7F, 0x3E, 0x07, 0xCF, 0xE0, 0x3F, 0x9F, + 0x07, 0xE7, 0xF0, 0x1F, 0xCF, 0x83, 0xE3, 0xF0, 0x0F, 0xE7, 0xC3, 0xF1, + 0xF8, 0x07, 0xE3, 0xE1, 0xF9, 0xFC, 0x07, 0xF1, 0xF0, 0xF8, 0xFE, 0x03, + 0xF8, 0xF8, 0xFC, 0x7F, 0x01, 0xFC, 0x7C, 0x7C, 0x3F, 0x00, 0xFC, 0x3E, + 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x3E, 0x1F, 0xC0, 0x7F, 0x0F, 0xBF, 0x0F, + 0xE0, 0x3F, 0x87, 0xDF, 0x07, 0xE0, 0x1F, 0xC3, 0xFF, 0x83, 0xF0, 0x0F, + 0xC1, 0xFF, 0xC3, 0xF8, 0x0F, 0xE0, 0xFF, 0xC1, 0xFC, 0x07, 0xF0, 0x7F, + 0xE0, 0xFE, 0x03, 0xF8, 0x3F, 0xE0, 0x7E, 0x01, 0xFC, 0x1F, 0xF0, 0x3F, + 0x00, 0xFC, 0x0F, 0xF0, 0x3F, 0x80, 0xFE, 0x07, 0xF8, 0x1F, 0xC0, 0x7F, + 0x03, 0xF8, 0x0F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xC0, + 0x01, 0xFC, 0x07, 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x07, 0xF0, 0x1F, + 0xF0, 0x00, 0xFC, 0x07, 0xFF, 0x00, 0x3F, 0x80, 0xFF, 0xE0, 0x07, 0xF0, + 0x1F, 0xFC, 0x00, 0xFE, 0x03, 0xFF, 0xC0, 0x1F, 0x80, 0xFF, 0xF8, 0x03, + 0xF0, 0x1F, 0xFF, 0x80, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xC0, 0x7E, 0x7E, + 0x03, 0xF8, 0x0F, 0xC7, 0xE0, 0x7E, 0x03, 0xF8, 0xFC, 0x0F, 0xC0, 0x7F, + 0x1F, 0x83, 0xF8, 0x0F, 0xE1, 0xF8, 0x7F, 0x01, 0xF8, 0x3F, 0x0F, 0xE0, + 0x3F, 0x07, 0xF1, 0xF8, 0x0F, 0xE0, 0x7E, 0x3F, 0x01, 0xFC, 0x0F, 0xCF, + 0xE0, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xE0, 0x1F, 0xBF, 0x81, 0xFC, 0x03, + 0xF7, 0xE0, 0x3F, 0x80, 0x3F, 0xFC, 0x07, 0xF0, 0x07, 0xFF, 0x80, 0xFC, + 0x00, 0xFF, 0xF0, 0x1F, 0x80, 0x0F, 0xFC, 0x07, 0xF0, 0x01, 0xFF, 0x80, + 0xFE, 0x00, 0x3F, 0xF0, 0x1F, 0xC0, 0x03, 0xFE, 0x03, 0xF0, 0x00, 0x7F, + 0xC0, 0x7E, 0x00, 0x07, 0xF0, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, + 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, + 0x3F, 0xF0, 0x3F, 0xF8, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF0, 0x00, 0x7F, + 0x83, 0xF8, 0x00, 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00, + 0x7F, 0x3F, 0x80, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF7, 0xF0, 0x00, + 0x01, 0xFD, 0xFC, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0xC0, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, + 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x00, 0x07, 0xF3, + 0xF8, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F, + 0x8F, 0xF0, 0x00, 0x1F, 0xC1, 0xFE, 0x00, 0x0F, 0xE0, 0x7F, 0xC0, 0x0F, + 0xF8, 0x1F, 0xFC, 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0xFF, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x03, + 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, + 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC1, 0xFE, 0x00, 0xFF, 0x83, 0xF8, + 0x00, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0, + 0x03, 0xF8, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC1, 0xFC, 0x00, + 0x3F, 0x83, 0xF8, 0x00, 0xFE, 0x07, 0xF0, 0x07, 0xFC, 0x1F, 0xFF, 0xFF, + 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x03, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xE0, 0x00, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, + 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x01, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xF0, + 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x3F, 0xF0, 0x3F, + 0xF0, 0x1F, 0xF0, 0x03, 0xFE, 0x07, 0xF8, 0x00, 0x7F, 0x83, 0xFC, 0x00, + 0x0F, 0xF1, 0xFE, 0x00, 0x03, 0xFC, 0x7F, 0x00, 0x00, 0x7F, 0x3F, 0x80, + 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x07, 0xF3, 0xF0, 0x00, 0x01, 0xFD, 0xFC, + 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x1F, 0xDF, 0x80, 0x00, 0x07, 0xFF, + 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x3F, + 0xBF, 0x80, 0x00, 0x0F, 0xEF, 0xE0, 0x01, 0x87, 0xF3, 0xF8, 0x00, 0xF1, + 0xFC, 0xFE, 0x00, 0x7C, 0xFE, 0x3F, 0xC0, 0x3F, 0xFF, 0x8F, 0xF0, 0x07, + 0xFF, 0xC1, 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xC0, 0x3F, 0xF8, 0x1F, 0xFC, + 0x0F, 0xFC, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0x9F, 0x80, + 0x01, 0xFF, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0xFF, + 0xF0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, + 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xFC, 0x0F, 0xE0, + 0x03, 0xFE, 0x0F, 0xF0, 0x00, 0xFF, 0x07, 0xF0, 0x00, 0x3F, 0x83, 0xF8, + 0x00, 0x1F, 0xC1, 0xFC, 0x00, 0x0F, 0xC0, 0xFE, 0x00, 0x07, 0xE0, 0xFE, + 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x80, 0x0F, 0xF0, 0x1F, + 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, + 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0x01, + 0xFC, 0x00, 0x7F, 0x80, 0xFE, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x0F, 0xE0, + 0x3F, 0x80, 0x07, 0xF0, 0x1F, 0xC0, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0xFC, + 0x0F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x00, 0xFE, 0x03, 0xF8, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x3F, 0x81, 0xFC, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x0F, + 0xE0, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x7F, + 0xFF, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xF8, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xC0, 0x7F, 0xC1, 0xFE, 0x00, 0xFF, + 0x07, 0xF0, 0x01, 0xFC, 0x3F, 0x80, 0x07, 0xF0, 0xFE, 0x00, 0x1F, 0xC3, + 0xF8, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, + 0xE0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, + 0xFE, 0x00, 0x1F, 0xFF, 0xFE, 0x00, 0x0F, 0xFF, 0xF8, 0x00, 0x03, 0xFF, + 0xF0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x07, 0xF3, 0xF8, 0x00, 0x1F, 0xCF, 0xE0, 0x00, 0x7E, 0x3F, + 0x80, 0x03, 0xF8, 0xFF, 0x00, 0x1F, 0xE3, 0xFF, 0x01, 0xFF, 0x07, 0xFF, + 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, + 0xF0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, + 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x7F, + 0x07, 0xF0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, + 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, 0x0F, 0xE0, 0x00, 0xFE, + 0x0F, 0xE0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, + 0x1F, 0xC0, 0x01, 0xFC, 0x1F, 0xC0, 0x01, 0xFC, 0x3F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8, 0x3F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, + 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x0F, 0xE0, + 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x0F, 0xE0, + 0xFE, 0x00, 0x1F, 0xC0, 0xFE, 0x00, 0x1F, 0xC0, 0xFF, 0x00, 0x3F, 0x80, + 0xFF, 0xC0, 0xFF, 0x80, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xE0, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xE7, + 0xF0, 0x00, 0x7F, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x00, 0x0F, 0xE1, 0xFC, + 0x00, 0x3F, 0x87, 0xF0, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xF0, 0x3F, 0x00, + 0x3F, 0x80, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x07, 0xF0, 0x0F, 0xC0, 0x1F, + 0x80, 0x3F, 0x80, 0xFE, 0x00, 0xFE, 0x03, 0xF0, 0x03, 0xF8, 0x1F, 0xC0, + 0x0F, 0xE0, 0x7E, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0x7E, 0x0F, 0xC0, 0x01, + 0xF8, 0x7E, 0x00, 0x07, 0xE1, 0xF8, 0x00, 0x1F, 0x8F, 0xC0, 0x00, 0x7E, + 0x3F, 0x00, 0x01, 0xF9, 0xF8, 0x00, 0x07, 0xE7, 0xE0, 0x00, 0x0F, 0xFF, + 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x01, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, + 0xFE, 0x00, 0x7F, 0x80, 0x1F, 0xFF, 0xC0, 0x0F, 0xF0, 0x03, 0xFB, 0xF8, + 0x01, 0xFE, 0x00, 0x7F, 0x7F, 0x00, 0x7F, 0xC0, 0x1F, 0xCF, 0xE0, 0x0F, + 0xF8, 0x03, 0xF9, 0xFC, 0x03, 0xFF, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0xE0, + 0x1F, 0xC7, 0xF0, 0x1F, 0xFC, 0x07, 0xF0, 0x7E, 0x03, 0xFF, 0x80, 0xFE, + 0x0F, 0xC0, 0x7D, 0xF0, 0x1F, 0x81, 0xF8, 0x1F, 0xBE, 0x07, 0xF0, 0x3F, + 0x03, 0xE7, 0xC0, 0xFC, 0x07, 0xE0, 0xFC, 0xF8, 0x3F, 0x80, 0xFC, 0x1F, + 0x1F, 0x07, 0xE0, 0x1F, 0x83, 0xE3, 0xE0, 0xFC, 0x03, 0xF0, 0xFC, 0x7C, + 0x3F, 0x00, 0x7E, 0x1F, 0x0F, 0x87, 0xE0, 0x0F, 0xC7, 0xE1, 0xF1, 0xF8, + 0x01, 0xF8, 0xF8, 0x3E, 0x3F, 0x00, 0x3F, 0x3F, 0x07, 0xCF, 0xC0, 0x07, + 0xE7, 0xC0, 0xF9, 0xF8, 0x00, 0xFC, 0xF8, 0x1F, 0x3E, 0x00, 0x1F, 0xBE, + 0x03, 0xEF, 0xC0, 0x01, 0xF7, 0xC0, 0x7D, 0xF0, 0x00, 0x3F, 0xF8, 0x0F, + 0xFE, 0x00, 0x07, 0xFE, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, + 0x00, 0x1F, 0xF0, 0x07, 0xFC, 0x00, 0x03, 0xFE, 0x00, 0xFF, 0x80, 0x00, + 0x7F, 0x80, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x01, 0xFC, + 0x00, 0x7F, 0x80, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x01, + 0xFC, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x0F, 0xF0, 0x07, 0xFC, 0x00, 0xFF, + 0x00, 0x1F, 0xE0, 0x07, 0xF8, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x03, 0xFC, + 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x00, 0xFF, 0x07, 0xF8, 0x00, + 0x03, 0xFC, 0x3F, 0x80, 0x00, 0x1F, 0xE3, 0xF8, 0x00, 0x00, 0x7F, 0x3F, + 0xC0, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, + 0x7F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x1F, + 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, + 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0xFE, + 0x00, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0x3F, 0xC0, 0x00, 0x0F, + 0xF1, 0xFE, 0x00, 0x00, 0xFF, 0x07, 0xF8, 0x00, 0x07, 0xF0, 0x3F, 0xC0, + 0x00, 0x7F, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x07, 0xF8, 0x00, 0x7F, 0x80, + 0x3F, 0xC0, 0x07, 0xF8, 0x01, 0xFF, 0x00, 0x7F, 0x80, 0x07, 0xF8, 0x07, + 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x7F, + 0xBF, 0xC0, 0x07, 0xF8, 0xFE, 0x00, 0x3F, 0x87, 0xF8, 0x03, 0xFC, 0x3F, + 0xC0, 0x3F, 0xC0, 0xFE, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x3F, 0xC1, + 0xFE, 0x00, 0xFE, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, 0x00, 0x3F, 0x8F, 0xE0, + 0x00, 0xFE, 0x7F, 0x00, 0x07, 0xF7, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, + 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0xFF, + 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFF, + 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0xFF, 0xFF, + 0xC0, 0x3F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0x80, + 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0x7E, 0x00, 0x03, 0xF0, + 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, + 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x7E, + 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, + 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, + 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFF, 0xC0, + 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x81, + 0xC3, 0xC7, 0x8F, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0xC7, 0x8F, 0x1E, + 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x8F, 0x1E, 0x3C, 0x38, 0x70, 0xE1, + 0xC3, 0x87, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0x00, 0x7F, 0xF8, 0x03, 0xFF, + 0xC0, 0x1F, 0xFC, 0x00, 0xFF, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00, + 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, + 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, + 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, + 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x7F, + 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, + 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, + 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x01, 0xFF, + 0xE0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x03, 0xFF, 0x80, 0x3F, 0xFC, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, + 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x80, 0x3E, 0xFC, 0x01, 0xF3, 0xE0, + 0x1F, 0x1F, 0x01, 0xF8, 0xF8, 0x0F, 0x87, 0xE0, 0xFC, 0x3F, 0x07, 0xC0, + 0xF8, 0x7C, 0x07, 0xC7, 0xE0, 0x3E, 0x3E, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, + 0x00, 0x3F, 0xF0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xE0, 0xF8, 0xF0, 0xF1, 0xE1, + 0xC3, 0xC3, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x7F, 0x03, 0xFC, 0x3F, 0x00, + 0xFE, 0x1F, 0x80, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xFF, 0xC0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF0, 0xFF, + 0x83, 0xF8, 0xFF, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, + 0x80, 0x7F, 0x1F, 0xC0, 0x7F, 0x8F, 0xF0, 0xFF, 0x87, 0xFF, 0xFF, 0xC3, + 0xFF, 0xFF, 0xE0, 0xFF, 0xF7, 0xF8, 0x3F, 0xF3, 0xFC, 0x07, 0xE0, 0x00, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x3F, 0x80, 0x1F, + 0x9F, 0xFC, 0x03, 0xF7, 0xFF, 0xC0, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, + 0x83, 0xFF, 0x0F, 0xF0, 0x7F, 0x80, 0xFF, 0x0F, 0xE0, 0x1F, 0xE3, 0xF8, + 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xC0, 0x07, 0xF1, 0xF8, 0x00, 0xFE, + 0x7F, 0x00, 0x1F, 0xCF, 0xC0, 0x03, 0xF9, 0xF8, 0x00, 0xFE, 0x3F, 0x00, + 0x1F, 0xC7, 0xE0, 0x03, 0xF9, 0xFC, 0x00, 0xFE, 0x3F, 0xC0, 0x3F, 0xC7, + 0xF8, 0x0F, 0xF0, 0xFF, 0x83, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, + 0xC0, 0xFF, 0xFF, 0xF0, 0x1F, 0x9F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, + 0xE0, 0x7F, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x7F, 0x00, 0xFE, 0x3F, 0x00, + 0x7F, 0x3F, 0x80, 0x3F, 0x9F, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x0F, 0xE0, + 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0x9F, + 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0x83, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, + 0x3F, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x7F, 0x00, 0x3F, + 0xF3, 0xF8, 0x03, 0xFF, 0xDF, 0x80, 0x7F, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, + 0xE0, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xC0, 0x3F, 0x81, + 0xFC, 0x01, 0xFC, 0x1F, 0xC0, 0x07, 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0, + 0x03, 0xF8, 0x7F, 0x00, 0x1F, 0x83, 0xF8, 0x00, 0xFC, 0x1F, 0xC0, 0x07, + 0xE0, 0xFE, 0x00, 0x3F, 0x07, 0xF0, 0x03, 0xF0, 0x3F, 0x80, 0x3F, 0x81, + 0xFC, 0x01, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC3, 0xFF, 0x01, 0xFF, + 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xCF, + 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xFC, 0x00, + 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x7F, 0x87, 0xF8, + 0x7F, 0x01, 0xFE, 0x7F, 0x00, 0x7F, 0x3F, 0x80, 0x3F, 0xBF, 0x80, 0x1F, + 0xDF, 0xC0, 0x0F, 0xEF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x3F, 0x80, 0x3F, 0x9F, 0xE0, 0x3F, 0x87, 0xF8, 0x3F, 0xC3, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0x0F, 0xF8, 0x07, 0xFE, + 0x01, 0xFF, 0x80, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x03, 0xF0, 0x01, + 0xFC, 0x03, 0xFF, 0xF1, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x80, 0xFE, + 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, + 0x1F, 0xC0, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, + 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x07, 0xC3, 0xF8, + 0x01, 0xFF, 0x9F, 0x80, 0x1F, 0xFE, 0xFC, 0x01, 0xFF, 0xFF, 0xE0, 0x1F, + 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xF8, 0x1F, 0xE0, 0x3F, 0x80, 0xFE, 0x01, + 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF8, + 0x3F, 0x80, 0x0F, 0x81, 0xF8, 0x00, 0x7C, 0x1F, 0xC0, 0x07, 0xE0, 0xFE, + 0x00, 0x3F, 0x07, 0xF0, 0x01, 0xF0, 0x3F, 0x80, 0x1F, 0x81, 0xFC, 0x00, + 0xFC, 0x0F, 0xE0, 0x0F, 0xE0, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x1F, 0xF0, + 0x0F, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xF7, 0xE0, 0x07, + 0xFE, 0x7F, 0x00, 0x0F, 0xC3, 0xF0, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, + 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x7F, 0x00, 0xFE, 0x03, 0xFC, 0x1F, 0xE0, + 0x1F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xE0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x0F, + 0xC0, 0x1F, 0xCF, 0xFE, 0x03, 0xFB, 0xFF, 0xE0, 0x7F, 0xFF, 0xFE, 0x0F, + 0xFF, 0xFF, 0xC3, 0xFF, 0x07, 0xF8, 0x7F, 0x80, 0x7F, 0x0F, 0xE0, 0x0F, + 0xE1, 0xFC, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x0F, 0xE0, 0x07, 0xE1, 0xFC, + 0x01, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1, 0xFC, 0x00, 0xFC, + 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80, + 0x1F, 0xC7, 0xF0, 0x03, 0xF0, 0xFE, 0x00, 0x7E, 0x1F, 0xC0, 0x1F, 0xC3, + 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x1F, 0xC0, 0x0F, 0xC0, 0x01, 0xFC, + 0x07, 0xF0, 0x1F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xF8, 0x0F, 0xC0, 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E, + 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F, + 0x01, 0xFC, 0x07, 0xE0, 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x00, 0x0F, + 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x3F, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0xFE, + 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x03, 0xF8, + 0x00, 0x7F, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, + 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, + 0x07, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, + 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xC0, 0x0F, + 0xF8, 0x03, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x7F, 0x00, 0xFE, 0x07, 0xE0, 0x3F, 0xC0, 0x7E, 0x07, + 0xF8, 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE3, 0xF8, 0x00, + 0xFC, 0x7F, 0x00, 0x0F, 0xCF, 0xE0, 0x01, 0xFD, 0xFC, 0x00, 0x1F, 0xFF, + 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x03, 0xFF, 0xFC, 0x00, + 0x3F, 0xFF, 0xC0, 0x03, 0xFE, 0xFE, 0x00, 0x3F, 0xCF, 0xE0, 0x03, 0xF0, + 0xFE, 0x00, 0x7F, 0x07, 0xF0, 0x07, 0xF0, 0x7F, 0x00, 0x7F, 0x07, 0xF8, + 0x07, 0xE0, 0x3F, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xC0, 0xFE, + 0x01, 0xFC, 0x0F, 0xC0, 0x1F, 0xE0, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0x80, + 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, + 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xC0, + 0x3F, 0x01, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, + 0x3F, 0x80, 0xFC, 0x03, 0xF0, 0x1F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, + 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x00, 0x07, 0xF0, 0xFC, 0x03, 0xF0, 0x07, + 0xE3, 0xFF, 0x0F, 0xFC, 0x07, 0xEF, 0xFF, 0x3F, 0xFE, 0x0F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x7F, 0xF0, 0xFF, + 0x0F, 0xE0, 0x3F, 0xC0, 0x7F, 0x0F, 0xE0, 0x3F, 0x80, 0x7F, 0x1F, 0xC0, + 0x3F, 0x80, 0x7E, 0x1F, 0xC0, 0x3F, 0x00, 0x7E, 0x1F, 0xC0, 0x3F, 0x00, + 0xFE, 0x1F, 0x80, 0x7F, 0x00, 0xFE, 0x3F, 0x80, 0x7F, 0x00, 0xFC, 0x3F, + 0x80, 0x7F, 0x00, 0xFC, 0x3F, 0x80, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0x7E, + 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x01, 0xFC, 0x7F, 0x00, 0xFE, 0x01, 0xF8, + 0x7F, 0x00, 0xFE, 0x01, 0xF8, 0x7F, 0x00, 0xFC, 0x03, 0xF8, 0x7E, 0x01, + 0xFC, 0x03, 0xF8, 0x7E, 0x01, 0xFC, 0x03, 0xF8, 0xFE, 0x01, 0xFC, 0x03, + 0xF0, 0xFE, 0x01, 0xF8, 0x03, 0xF0, 0xFE, 0x01, 0xF8, 0x07, 0xF0, 0x07, + 0xF0, 0xFE, 0x00, 0xFE, 0x7F, 0xF0, 0x1F, 0x9F, 0xFF, 0x03, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0xFE, 0x1F, 0xF8, 0x3F, 0xC3, 0xFC, 0x03, 0xF8, 0x7F, + 0x00, 0x7F, 0x0F, 0xE0, 0x0F, 0xE3, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x3F, + 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F, 0x00, 0x3F, 0x8F, 0xE0, + 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x00, 0x3F, 0x87, 0xE0, 0x07, 0xF1, + 0xFC, 0x00, 0xFE, 0x3F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0, 0xFC, 0x00, + 0xFE, 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x03, 0xF8, 0xFE, 0x00, 0x7E, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0xE0, 0x0F, 0xFF, + 0xFC, 0x07, 0xFF, 0xFF, 0x83, 0xFC, 0x1F, 0xE1, 0xFE, 0x03, 0xFC, 0xFF, + 0x00, 0xFF, 0x3F, 0x80, 0x1F, 0xDF, 0xC0, 0x07, 0xF7, 0xF0, 0x01, 0xFD, + 0xFC, 0x00, 0x7F, 0xFE, 0x00, 0x1F, 0xFF, 0x80, 0x07, 0xFF, 0xE0, 0x03, + 0xFB, 0xF8, 0x00, 0xFE, 0xFE, 0x00, 0x3F, 0xBF, 0x80, 0x1F, 0xCF, 0xF0, + 0x0F, 0xF3, 0xFC, 0x07, 0xF8, 0x7F, 0x83, 0xFC, 0x1F, 0xFF, 0xFE, 0x03, + 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x01, 0xFC, 0x3F, 0x00, 0x0F, 0xCF, 0xFE, 0x00, 0x7E, 0xFF, 0xF8, + 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0x01, 0xFF, 0x87, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0xFF, 0x00, 0xFF, 0x07, 0xF0, 0x03, 0xF8, 0x3F, 0x80, + 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x0F, 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x3F, + 0x87, 0xF0, 0x01, 0xFC, 0x3F, 0x00, 0x1F, 0xC1, 0xF8, 0x00, 0xFE, 0x1F, + 0xC0, 0x07, 0xF0, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x07, 0xF8, 0x3F, 0xC0, + 0x7F, 0x81, 0xFF, 0x87, 0xF8, 0x1F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, + 0x07, 0xF7, 0xFF, 0xC0, 0x3F, 0x1F, 0xF8, 0x01, 0xF8, 0x7F, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x87, 0xF0, + 0x0F, 0xFE, 0x7F, 0x01, 0xFF, 0xF7, 0xE0, 0x3F, 0xFF, 0x7E, 0x07, 0xFF, + 0xFF, 0xE0, 0xFF, 0x07, 0xFE, 0x1F, 0xE0, 0x3F, 0xE3, 0xFC, 0x03, 0xFC, + 0x3F, 0x80, 0x1F, 0xC7, 0xF0, 0x01, 0xFC, 0x7F, 0x00, 0x1F, 0xC7, 0xF0, + 0x01, 0xF8, 0xFE, 0x00, 0x1F, 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x3F, + 0x8F, 0xE0, 0x03, 0xF8, 0xFE, 0x00, 0x7F, 0x0F, 0xE0, 0x07, 0xF0, 0xFE, + 0x00, 0xFF, 0x0F, 0xF0, 0x1F, 0xF0, 0x7F, 0x87, 0xFF, 0x07, 0xFF, 0xFF, + 0xE0, 0x3F, 0xFF, 0x7E, 0x03, 0xFF, 0xEF, 0xE0, 0x1F, 0xFC, 0xFE, 0x00, + 0x7F, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x07, + 0xF0, 0xF0, 0x7F, 0x3F, 0x07, 0xE7, 0xE0, 0x7E, 0xFE, 0x0F, 0xFF, 0xE0, + 0xFF, 0xFE, 0x0F, 0xFC, 0x00, 0xFF, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, + 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, + 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, + 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x07, + 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x0F, 0xE0, 0xFF, 0x1F, 0xC0, 0x7F, 0x1F, + 0xC0, 0x7F, 0x1F, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x1F, 0xFF, 0xC0, 0x0F, + 0xFF, 0xF0, 0x07, 0xFF, 0xF8, 0x03, 0xFF, 0xFC, 0x00, 0x7F, 0xFE, 0x00, + 0x0F, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFE, 0xFC, 0x00, 0xFE, 0xFE, + 0x00, 0xFE, 0xFF, 0x03, 0xFC, 0x7F, 0xFF, 0xF8, 0x7F, 0xFF, 0xF8, 0x3F, + 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x03, 0xFE, 0x00, 0x03, 0xF0, 0x1F, 0xC0, + 0x7F, 0x01, 0xFC, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x1F, 0xFF, 0x7F, 0xFD, + 0xFF, 0xFF, 0xFF, 0xC7, 0xF0, 0x1F, 0xC0, 0x7E, 0x01, 0xF8, 0x0F, 0xE0, + 0x3F, 0x80, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x07, 0xE0, + 0x1F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0xF0, 0xFF, 0xC3, 0xFF, + 0x07, 0xFC, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xE1, 0xF8, 0x01, 0xFC, 0x7F, + 0x00, 0x3F, 0x0F, 0xE0, 0x0F, 0xE1, 0xFC, 0x01, 0xFC, 0x3F, 0x00, 0x3F, + 0x87, 0xE0, 0x07, 0xE1, 0xFC, 0x00, 0xFC, 0x3F, 0x80, 0x3F, 0x87, 0xF0, + 0x07, 0xF0, 0xFC, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0x87, 0xF0, 0x03, 0xF0, + 0xFE, 0x00, 0xFE, 0x1F, 0x80, 0x1F, 0xC3, 0xF0, 0x03, 0xF0, 0xFE, 0x00, + 0x7E, 0x1F, 0xC0, 0x1F, 0xC3, 0xF8, 0x07, 0xF8, 0x7F, 0x01, 0xFF, 0x0F, + 0xF0, 0x7F, 0xC1, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0x03, 0xFF, 0xEF, + 0xE0, 0x3F, 0xF9, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0x7F, + 0x00, 0x3F, 0xBF, 0x80, 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x1F, 0xC3, + 0xF0, 0x0F, 0xC1, 0xFC, 0x0F, 0xE0, 0xFE, 0x07, 0xE0, 0x7F, 0x07, 0xF0, + 0x3F, 0x83, 0xF0, 0x0F, 0xC3, 0xF8, 0x07, 0xE1, 0xF8, 0x03, 0xF1, 0xFC, + 0x01, 0xF8, 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7E, 0x00, 0x3F, 0x7E, + 0x00, 0x0F, 0xBF, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xFF, + 0x80, 0x00, 0xFF, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x00, 0xFE, 0x03, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0x01, 0xFF, + 0xF8, 0x1F, 0xE0, 0x3F, 0x7F, 0x03, 0xFC, 0x0F, 0xEF, 0xE0, 0xFF, 0x81, + 0xF9, 0xFC, 0x1F, 0xF0, 0x7F, 0x3F, 0x83, 0xFE, 0x0F, 0xC3, 0xF0, 0xFF, + 0xC3, 0xF8, 0x7E, 0x1E, 0xF8, 0x7E, 0x0F, 0xC7, 0xDF, 0x1F, 0xC1, 0xF8, + 0xFB, 0xE3, 0xF0, 0x3F, 0x1E, 0x7C, 0x7E, 0x07, 0xE7, 0xCF, 0x9F, 0x80, + 0xFC, 0xF1, 0xF3, 0xF0, 0x1F, 0xBE, 0x3E, 0xFC, 0x03, 0xF7, 0x87, 0xDF, + 0x80, 0x7E, 0xF0, 0xFF, 0xE0, 0x0F, 0xFE, 0x1F, 0xFC, 0x01, 0xFF, 0x83, + 0xFF, 0x00, 0x3F, 0xF0, 0x7F, 0xE0, 0x07, 0xFC, 0x0F, 0xF8, 0x00, 0x7F, + 0x81, 0xFF, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x01, 0xFC, 0x07, 0xF8, 0x00, + 0x3F, 0x80, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x07, 0xF8, 0x1F, 0xE0, 0x7F, + 0x80, 0x7F, 0x03, 0xF8, 0x03, 0xF8, 0x3F, 0x80, 0x1F, 0xE3, 0xF8, 0x00, + 0x7F, 0x3F, 0x80, 0x03, 0xF9, 0xFC, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x7F, + 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x7F, 0xC0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0xFF, 0x80, 0x00, + 0x1F, 0xFE, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x1F, 0xDF, 0xC0, 0x01, 0xFC, + 0xFE, 0x00, 0x1F, 0xE7, 0xF8, 0x00, 0xFE, 0x1F, 0xC0, 0x0F, 0xE0, 0xFE, + 0x00, 0xFF, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x00, 0xFF, 0x00, + 0x0F, 0xE0, 0x03, 0xF0, 0x7F, 0x00, 0x3F, 0x83, 0xF8, 0x01, 0xF8, 0x1F, + 0xC0, 0x1F, 0xC0, 0xFE, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0xE0, 0x1F, 0xC0, + 0x7E, 0x00, 0xFE, 0x07, 0xE0, 0x07, 0xF0, 0x3F, 0x00, 0x3F, 0x83, 0xF0, + 0x01, 0xFC, 0x1F, 0x80, 0x0F, 0xE1, 0xF8, 0x00, 0x3F, 0x0F, 0xC0, 0x01, + 0xF8, 0xFC, 0x00, 0x0F, 0xC7, 0xC0, 0x00, 0x7F, 0x7E, 0x00, 0x03, 0xFB, + 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x03, 0xFF, 0x80, + 0x00, 0x1F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x3F, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF8, 0x00, + 0x01, 0xFF, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x07, + 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0xF0, 0x3F, 0xFF, 0xF8, 0x1F, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF8, + 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x7F, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, + 0xE0, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x0F, 0xF0, 0x07, 0xFC, + 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x3F, 0x00, 0x7F, 0x80, 0x1F, 0x80, 0x07, 0xE0, 0x03, 0xFC, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x01, 0xFE, 0x00, 0x7F, + 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x1C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x70, + 0x07, 0x80, 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x01, + 0xFE, 0x00, 0x7F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, + 0xFF, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0xF8, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x80, 0x07, 0xC0, 0x01, 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x80, + 0x3F, 0xC0, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0x80, 0x07, 0xFF, + 0x03, 0xDF, 0xFE, 0x0F, 0xF0, 0x7F, 0xFB, 0x80, 0xFF, 0xE0, 0x01, 0xFF, + 0x00, 0x03, 0xF0 }; + +const GFXglyph FreeSansBoldOblique24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 13, 0, 1 }, // 0x20 ' ' + { 0, 14, 34, 16, 5, -33 }, // 0x21 '!' + { 60, 18, 12, 22, 8, -33 }, // 0x22 '"' + { 87, 29, 33, 26, 2, -31 }, // 0x23 '#' + { 207, 26, 42, 26, 3, -35 }, // 0x24 '$' + { 344, 36, 34, 42, 6, -32 }, // 0x25 '%' + { 497, 29, 35, 34, 4, -33 }, // 0x26 '&' + { 624, 7, 12, 11, 8, -33 }, // 0x27 ''' + { 635, 17, 44, 16, 4, -33 }, // 0x28 '(' + { 729, 17, 44, 16, 0, -34 }, // 0x29 ')' + { 823, 15, 15, 18, 7, -33 }, // 0x2A '*' + { 852, 24, 22, 27, 4, -21 }, // 0x2B '+' + { 918, 10, 15, 13, 1, -6 }, // 0x2C ',' + { 937, 14, 6, 16, 3, -15 }, // 0x2D '-' + { 948, 8, 7, 13, 3, -6 }, // 0x2E '.' + { 955, 20, 34, 13, 0, -32 }, // 0x2F '/' + { 1040, 25, 35, 26, 4, -33 }, // 0x30 '0' + { 1150, 17, 33, 26, 8, -32 }, // 0x31 '1' + { 1221, 29, 34, 26, 1, -33 }, // 0x32 '2' + { 1345, 26, 35, 26, 3, -33 }, // 0x33 '3' + { 1459, 25, 32, 26, 3, -31 }, // 0x34 '4' + { 1559, 27, 34, 26, 3, -32 }, // 0x35 '5' + { 1674, 25, 35, 26, 4, -33 }, // 0x36 '6' + { 1784, 26, 33, 26, 6, -32 }, // 0x37 '7' + { 1892, 26, 35, 26, 3, -33 }, // 0x38 '8' + { 2006, 25, 35, 26, 4, -33 }, // 0x39 '9' + { 2116, 12, 25, 16, 5, -24 }, // 0x3A ':' + { 2154, 14, 33, 16, 3, -24 }, // 0x3B ';' + { 2212, 26, 23, 27, 4, -22 }, // 0x3C '<' + { 2287, 26, 18, 27, 3, -19 }, // 0x3D '=' + { 2346, 26, 23, 27, 1, -21 }, // 0x3E '>' + { 2421, 24, 35, 29, 8, -34 }, // 0x3F '?' + { 2526, 45, 41, 46, 3, -34 }, // 0x40 '@' + { 2757, 32, 34, 34, 1, -33 }, // 0x41 'A' + { 2893, 32, 34, 34, 4, -33 }, // 0x42 'B' + { 3029, 32, 36, 34, 5, -34 }, // 0x43 'C' + { 3173, 32, 34, 34, 4, -33 }, // 0x44 'D' + { 3309, 32, 34, 31, 4, -33 }, // 0x45 'E' + { 3445, 32, 34, 29, 3, -33 }, // 0x46 'F' + { 3581, 33, 36, 37, 5, -34 }, // 0x47 'G' + { 3730, 35, 34, 34, 3, -33 }, // 0x48 'H' + { 3879, 14, 34, 13, 3, -33 }, // 0x49 'I' + { 3939, 27, 35, 26, 3, -33 }, // 0x4A 'J' + { 4058, 37, 34, 34, 3, -33 }, // 0x4B 'K' + { 4216, 24, 34, 29, 4, -33 }, // 0x4C 'L' + { 4318, 41, 34, 39, 3, -33 }, // 0x4D 'M' + { 4493, 35, 34, 34, 3, -33 }, // 0x4E 'N' + { 4642, 34, 36, 37, 5, -34 }, // 0x4F 'O' + { 4795, 31, 34, 31, 4, -33 }, // 0x50 'P' + { 4927, 34, 37, 37, 5, -34 }, // 0x51 'Q' + { 5085, 33, 34, 34, 4, -33 }, // 0x52 'R' + { 5226, 30, 36, 31, 4, -34 }, // 0x53 'S' + { 5361, 28, 34, 29, 7, -33 }, // 0x54 'T' + { 5480, 32, 35, 34, 6, -33 }, // 0x55 'U' + { 5620, 30, 34, 31, 8, -33 }, // 0x56 'V' + { 5748, 43, 34, 44, 8, -33 }, // 0x57 'W' + { 5931, 37, 34, 31, 1, -33 }, // 0x58 'X' + { 6089, 29, 34, 31, 9, -33 }, // 0x59 'Y' + { 6213, 33, 34, 29, 1, -33 }, // 0x5A 'Z' + { 6354, 21, 43, 16, 1, -33 }, // 0x5B '[' + { 6467, 7, 36, 13, 6, -34 }, // 0x5C '\' + { 6499, 21, 43, 16, -1, -33 }, // 0x5D ']' + { 6612, 21, 20, 27, 6, -32 }, // 0x5E '^' + { 6665, 29, 4, 26, -3, 6 }, // 0x5F '_' + { 6680, 7, 7, 16, 8, -35 }, // 0x60 '`' + { 6687, 25, 26, 26, 2, -24 }, // 0x61 'a' + { 6769, 27, 35, 29, 3, -33 }, // 0x62 'b' + { 6888, 25, 26, 26, 4, -24 }, // 0x63 'c' + { 6970, 29, 35, 29, 4, -33 }, // 0x64 'd' + { 7097, 25, 26, 26, 3, -24 }, // 0x65 'e' + { 7179, 18, 34, 16, 4, -33 }, // 0x66 'f' + { 7256, 29, 35, 29, 2, -24 }, // 0x67 'g' + { 7383, 27, 34, 29, 3, -33 }, // 0x68 'h' + { 7498, 14, 34, 13, 3, -33 }, // 0x69 'i' + { 7558, 19, 44, 13, -2, -33 }, // 0x6A 'j' + { 7663, 28, 34, 26, 3, -33 }, // 0x6B 'k' + { 7782, 14, 34, 13, 3, -33 }, // 0x6C 'l' + { 7842, 40, 25, 42, 3, -24 }, // 0x6D 'm' + { 7967, 27, 25, 29, 3, -24 }, // 0x6E 'n' + { 8052, 26, 26, 29, 4, -24 }, // 0x6F 'o' + { 8137, 29, 35, 29, 1, -24 }, // 0x70 'p' + { 8264, 28, 35, 29, 3, -24 }, // 0x71 'q' + { 8387, 20, 25, 18, 3, -24 }, // 0x72 'r' + { 8450, 24, 26, 26, 3, -24 }, // 0x73 's' + { 8528, 14, 32, 16, 5, -30 }, // 0x74 't' + { 8584, 27, 26, 29, 4, -24 }, // 0x75 'u' + { 8672, 25, 25, 26, 6, -24 }, // 0x76 'v' + { 8751, 35, 25, 37, 6, -24 }, // 0x77 'w' + { 8861, 29, 25, 26, 1, -24 }, // 0x78 'x' + { 8952, 29, 35, 26, 2, -24 }, // 0x79 'y' + { 9079, 26, 25, 23, 1, -24 }, // 0x7A 'z' + { 9161, 18, 43, 18, 4, -33 }, // 0x7B '{' + { 9258, 13, 43, 13, 3, -33 }, // 0x7C '|' + { 9328, 18, 43, 18, 2, -33 }, // 0x7D '}' + { 9425, 22, 8, 27, 5, -14 } }; // 0x7E '~' + +const GFXfont FreeSansBoldOblique24pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique24pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 10119 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h new file mode 100644 index 0000000..6250aca --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h @@ -0,0 +1,227 @@ +const uint8_t FreeSansBoldOblique9pt7bBitmaps[] PROGMEM = { + 0x21, 0x8E, 0x73, 0x18, 0xC6, 0x21, 0x19, 0xCE, 0x00, 0xEF, 0xDF, 0xBE, + 0x68, 0x80, 0x06, 0xC1, 0x99, 0xFF, 0xBF, 0xF1, 0xB0, 0x66, 0x0C, 0xC7, + 0xFC, 0xFF, 0x8C, 0x83, 0x30, 0x64, 0x00, 0x02, 0x00, 0xF0, 0x7F, 0x1D, + 0x73, 0xEE, 0x78, 0x0F, 0x00, 0xF8, 0x0F, 0xC1, 0xBB, 0xA7, 0x74, 0xEF, + 0xF8, 0xFE, 0x04, 0x00, 0x80, 0x3C, 0x11, 0xF8, 0x8E, 0x66, 0x31, 0x90, + 0xCE, 0x83, 0xF4, 0x07, 0xB0, 0x00, 0x9E, 0x04, 0xFC, 0x26, 0x31, 0x98, + 0xC4, 0x7E, 0x20, 0xF0, 0x07, 0x80, 0xFC, 0x1D, 0xC1, 0xDC, 0x1F, 0x80, + 0xE0, 0x3E, 0x37, 0x77, 0xE3, 0xEE, 0x3C, 0xE3, 0xCF, 0xFE, 0x3C, 0xE0, + 0xFF, 0xE8, 0x06, 0x06, 0x0C, 0x18, 0x38, 0x30, 0x70, 0x60, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x70, 0x30, 0x0C, 0x0E, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x30, 0x60, 0x60, + 0x32, 0xBF, 0x9C, 0xD2, 0x40, 0x0C, 0x06, 0x07, 0x1F, 0xFF, 0xF0, 0xC0, + 0xE0, 0x60, 0x77, 0x72, 0x6C, 0xFF, 0xC0, 0xFC, 0x02, 0x02, 0x04, 0x04, + 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F, 0x07, 0xE3, + 0x9D, 0xC7, 0x71, 0xDC, 0x7E, 0x1F, 0x8E, 0xE3, 0xB8, 0xEE, 0x73, 0xF8, + 0x3C, 0x00, 0x04, 0x3B, 0xF7, 0xE1, 0xC3, 0x06, 0x1C, 0x38, 0x70, 0xC1, + 0x87, 0x00, 0x0F, 0x87, 0xFC, 0xE3, 0xB8, 0x70, 0x0E, 0x03, 0x80, 0xF0, + 0x38, 0x1E, 0x07, 0x01, 0xC0, 0x7F, 0xCF, 0xF8, 0x0F, 0xC7, 0xFC, 0xE3, + 0xB8, 0x70, 0x1C, 0x0F, 0x03, 0xF0, 0x0E, 0x01, 0xDC, 0x3B, 0x8E, 0x7F, + 0x83, 0xE0, 0x03, 0xC0, 0xE0, 0x58, 0x2E, 0x13, 0x8C, 0xE6, 0x33, 0xFE, + 0xFF, 0x81, 0xC0, 0x60, 0x18, 0x0F, 0xE3, 0xFC, 0x60, 0x0C, 0x03, 0x78, + 0x7F, 0x9C, 0x70, 0x0E, 0x01, 0xDC, 0x33, 0x8E, 0x7F, 0x83, 0xE0, 0x0F, + 0x07, 0xE3, 0x9D, 0xC0, 0x7F, 0x1F, 0xEF, 0x3B, 0x8E, 0xE3, 0xB8, 0xCE, + 0x71, 0xF8, 0x3C, 0x00, 0x7F, 0xDF, 0xF0, 0x18, 0x0C, 0x06, 0x03, 0x81, + 0xC0, 0x60, 0x38, 0x0C, 0x07, 0x01, 0x80, 0x60, 0x00, 0x0F, 0x83, 0xFC, + 0xE3, 0x9C, 0x73, 0x9C, 0x3F, 0x0F, 0xE3, 0x8E, 0xE1, 0xDC, 0x3B, 0x8E, + 0x7F, 0xC3, 0xE0, 0x0F, 0x83, 0xF8, 0xE3, 0xB8, 0x77, 0x0E, 0xE1, 0xDC, + 0x7B, 0xFE, 0x3D, 0xC0, 0x33, 0x8E, 0x7F, 0x87, 0xC0, 0x77, 0x00, 0x00, + 0x0E, 0xE0, 0x39, 0xC0, 0x00, 0x01, 0xCE, 0x71, 0x19, 0x80, 0x00, 0x00, + 0x70, 0xFD, 0xF8, 0x70, 0x3F, 0x03, 0xF8, 0x1E, 0x01, 0x80, 0x7F, 0xDF, + 0xF0, 0x00, 0x00, 0xFF, 0xBF, 0xE0, 0x60, 0x1E, 0x07, 0xF0, 0x3F, 0x03, + 0x87, 0xEF, 0xC3, 0x80, 0x00, 0x00, 0x1F, 0x1F, 0xFE, 0x1F, 0x87, 0x01, + 0xC0, 0xE0, 0x70, 0x78, 0x3C, 0x0E, 0x00, 0x00, 0xE0, 0x38, 0x00, 0x00, + 0xFC, 0x00, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x07, 0x38, 0x01, 0xCC, 0x3F, + 0x36, 0x31, 0x8D, 0x98, 0x63, 0xC4, 0x11, 0xF3, 0x0C, 0x6C, 0xC6, 0x73, + 0x3E, 0xF8, 0xE7, 0x3C, 0x1E, 0x00, 0x03, 0xFE, 0x00, 0x3F, 0x00, 0x01, + 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x6F, 0x03, 0x38, 0x31, 0xC3, 0x8E, + 0x1F, 0xF1, 0xFF, 0x8C, 0x1E, 0xE0, 0x76, 0x03, 0x80, 0x1F, 0xF0, 0xFF, + 0xC6, 0x0E, 0x70, 0x73, 0x87, 0x1F, 0xF0, 0xFF, 0x86, 0x0E, 0x70, 0x73, + 0x83, 0x9C, 0x38, 0xFF, 0xC7, 0xF8, 0x00, 0x07, 0xE0, 0xFF, 0x8F, 0x1E, + 0x70, 0x77, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x03, 0xBC, + 0x38, 0xFF, 0x83, 0xF0, 0x00, 0x1F, 0xE0, 0xFF, 0x86, 0x1E, 0x70, 0x73, + 0x83, 0x9C, 0x1C, 0xC0, 0xE6, 0x07, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, + 0x8F, 0xF0, 0x00, 0x1F, 0xF8, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1F, + 0xF0, 0xFF, 0x86, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xFF, 0xC7, 0xFC, + 0x00, 0x1F, 0xF1, 0xFF, 0x18, 0x03, 0x80, 0x38, 0x03, 0xFC, 0x3F, 0xC7, + 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, 0x00, 0x07, 0xC1, 0xFE, + 0x38, 0x77, 0x03, 0x70, 0x0E, 0x00, 0xE1, 0xEE, 0x1E, 0xE0, 0x6E, 0x0E, + 0x70, 0xE7, 0xFC, 0x1F, 0x40, 0x1C, 0x1C, 0x60, 0x63, 0x83, 0x8E, 0x0E, + 0x38, 0x38, 0xFF, 0xC3, 0xFF, 0x1C, 0x1C, 0x70, 0x71, 0xC1, 0xC6, 0x06, + 0x18, 0x38, 0xE0, 0xE0, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, + 0x00, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C, + 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x87, 0xC0, 0x1C, 0x3C, 0x71, 0xC1, 0x8E, + 0x0E, 0x70, 0x3B, 0x80, 0xFC, 0x03, 0xF0, 0x0E, 0xE0, 0x73, 0x81, 0xC7, + 0x07, 0x1C, 0x18, 0x38, 0xE0, 0xF0, 0x1C, 0x07, 0x01, 0x80, 0xE0, 0x38, + 0x0E, 0x03, 0x80, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xFF, 0x7F, 0x80, 0x1E, + 0x1F, 0x1E, 0x1E, 0x3E, 0x1E, 0x3E, 0x3E, 0x36, 0x3E, 0x36, 0x6E, 0x36, + 0x6C, 0x76, 0xCC, 0x76, 0xDC, 0x67, 0x9C, 0x67, 0x98, 0xE7, 0x18, 0xE7, + 0x18, 0x1C, 0x1C, 0x70, 0x63, 0xE1, 0x8F, 0x8E, 0x3E, 0x38, 0xDC, 0xC3, + 0x33, 0x1C, 0xEC, 0x71, 0xF1, 0xC7, 0xC6, 0x1E, 0x18, 0x38, 0xE0, 0xE0, + 0x07, 0xC0, 0xFF, 0x8E, 0x1E, 0xE0, 0x77, 0x03, 0xF0, 0x1F, 0x80, 0xFC, + 0x07, 0xE0, 0x77, 0x03, 0xBC, 0x38, 0xFF, 0x81, 0xF0, 0x00, 0x1F, 0xF0, + 0xFF, 0xC6, 0x0E, 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xF8, 0x70, + 0x03, 0x80, 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x8F, + 0x1C, 0xE0, 0x77, 0x03, 0xB0, 0x1F, 0x80, 0xFC, 0x06, 0xE1, 0x77, 0x1F, + 0x3C, 0x78, 0xFF, 0xC1, 0xF6, 0x00, 0x20, 0x1F, 0xF0, 0xFF, 0xC6, 0x0E, + 0x70, 0x73, 0x83, 0x9C, 0x38, 0xFF, 0x87, 0xFC, 0x70, 0x73, 0x83, 0x9C, + 0x38, 0xC1, 0xC6, 0x0F, 0x00, 0x07, 0xE0, 0xFF, 0xC7, 0x0E, 0x70, 0x73, + 0x80, 0x1F, 0x80, 0x7F, 0x80, 0x7E, 0x00, 0x77, 0x03, 0xBC, 0x38, 0xFF, + 0xC3, 0xF8, 0x00, 0xFF, 0xDF, 0xF8, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x06, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0x38, 0x31, 0xC1, + 0x8C, 0x1C, 0xE0, 0xE7, 0x07, 0x38, 0x31, 0xC3, 0x9C, 0x1C, 0xE0, 0xE7, + 0x06, 0x38, 0x70, 0xFF, 0x03, 0xE0, 0x00, 0xE0, 0xFC, 0x1D, 0x87, 0x30, + 0xC6, 0x38, 0xC6, 0x19, 0xC3, 0xB0, 0x7E, 0x0F, 0x80, 0xF0, 0x1C, 0x03, + 0x00, 0xE1, 0xC3, 0xF1, 0xE3, 0xB8, 0xF1, 0xDC, 0x78, 0xCE, 0x6C, 0xE7, + 0x36, 0x63, 0xB3, 0x70, 0xD9, 0xB0, 0x7C, 0xD8, 0x3C, 0x78, 0x1E, 0x3C, + 0x0E, 0x1C, 0x07, 0x0E, 0x00, 0x0E, 0x1C, 0x38, 0xE0, 0xE7, 0x01, 0xD8, + 0x07, 0xE0, 0x0F, 0x00, 0x38, 0x01, 0xE0, 0x0F, 0xC0, 0x77, 0x01, 0x8E, + 0x0E, 0x38, 0x70, 0xF0, 0xE0, 0xEE, 0x39, 0xC7, 0x39, 0xC3, 0x70, 0x7C, + 0x0F, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x3F, 0xF3, + 0xFF, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x3C, 0x07, + 0x80, 0x70, 0x0F, 0xFC, 0xFF, 0xC0, 0x0F, 0x0F, 0x0C, 0x1C, 0x18, 0x18, + 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x78, 0x78, 0x12, + 0x4C, 0x92, 0x49, 0x26, 0xD9, 0x20, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x0C, + 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x38, 0x30, 0xF0, 0xF0, 0x06, + 0x0E, 0x0E, 0x1B, 0x33, 0x33, 0x63, 0x63, 0xFF, 0xE0, 0xCC, 0x1F, 0x8F, + 0xF3, 0x1C, 0x06, 0x1F, 0x9F, 0xEE, 0x3B, 0x9C, 0xFF, 0x1D, 0xC0, 0x18, + 0x03, 0x00, 0xE0, 0x1D, 0xC3, 0xFC, 0x71, 0xDC, 0x3B, 0x87, 0x70, 0xEE, + 0x39, 0xCF, 0x7F, 0xCF, 0xE0, 0x0F, 0x0F, 0xF7, 0x1D, 0xC0, 0xE0, 0x38, + 0x0E, 0x03, 0x8E, 0x7F, 0x0F, 0x80, 0x00, 0x60, 0x06, 0x00, 0x61, 0xEE, + 0x3F, 0xE7, 0x9C, 0x71, 0xCE, 0x1C, 0xE1, 0xCE, 0x1C, 0xE3, 0x87, 0xF8, + 0x7F, 0x80, 0x1F, 0x0F, 0xE7, 0x1D, 0xC7, 0xFF, 0xFF, 0xFE, 0x03, 0x8E, + 0x7F, 0x0F, 0x80, 0x1C, 0xF3, 0x3F, 0xFD, 0xC7, 0x18, 0x63, 0x8E, 0x30, + 0xC0, 0x0F, 0x71, 0xFE, 0x3C, 0xE3, 0x8E, 0x70, 0xE7, 0x0E, 0x70, 0xC7, + 0x1C, 0x3F, 0xC3, 0xFC, 0x01, 0xCE, 0x38, 0x7F, 0x03, 0xE0, 0x18, 0x03, + 0x00, 0xE0, 0x1D, 0xE3, 0xFE, 0x71, 0xCC, 0x3B, 0x86, 0x70, 0xCC, 0x39, + 0x87, 0x30, 0xEE, 0x18, 0x39, 0xC0, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, + 0x00, 0x06, 0x06, 0x00, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x1C, 0x1C, 0x18, + 0x18, 0x38, 0x38, 0x30, 0x70, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x1C, 0xE3, + 0x38, 0x6E, 0x1F, 0x83, 0xF0, 0x7E, 0x0E, 0xE1, 0x9C, 0x73, 0x8E, 0x38, + 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x63, 0x39, 0xCE, 0x00, 0x3B, 0x9E, 0x3F, + 0xFF, 0x39, 0xC7, 0x71, 0xC6, 0x71, 0x86, 0x71, 0x8E, 0x63, 0x8E, 0x63, + 0x8C, 0xE3, 0x8C, 0xE3, 0x1C, 0x3B, 0xC7, 0xFC, 0xE3, 0xB8, 0x77, 0x0C, + 0xE1, 0x98, 0x73, 0x0E, 0xE1, 0xDC, 0x30, 0x0F, 0x87, 0xF9, 0xE7, 0xB8, + 0x7E, 0x0F, 0xC1, 0xF8, 0x77, 0x9E, 0x7F, 0x87, 0xC0, 0x1D, 0xE1, 0xFE, + 0x1C, 0x73, 0x87, 0x38, 0x73, 0x87, 0x38, 0xE3, 0x8E, 0x7F, 0xC7, 0xF8, + 0x60, 0x06, 0x00, 0x60, 0x0E, 0x00, 0x1E, 0xE7, 0xFD, 0xE7, 0x38, 0xEE, + 0x1D, 0xC3, 0xB8, 0x77, 0x1C, 0x7F, 0x8F, 0xF0, 0x0E, 0x01, 0x80, 0x30, + 0x06, 0x00, 0x3B, 0x36, 0x38, 0x70, 0x70, 0x70, 0x60, 0x60, 0xE0, 0xE0, + 0x3E, 0x3F, 0xF8, 0xFC, 0x0F, 0xC3, 0xF8, 0x3D, 0x8E, 0xFE, 0x3E, 0x00, + 0x38, 0xCF, 0xFE, 0x71, 0x86, 0x38, 0xE3, 0x8F, 0x3C, 0x31, 0xDC, 0x77, + 0x19, 0x86, 0x63, 0xB8, 0xEE, 0x33, 0x9C, 0xFF, 0x1F, 0xC0, 0xE1, 0x98, + 0xE6, 0x31, 0x9C, 0x66, 0x1B, 0x86, 0xC1, 0xF0, 0x78, 0x0E, 0x00, 0xE7, + 0x1B, 0x9C, 0xEE, 0x73, 0x3B, 0xDC, 0xEB, 0x63, 0xAD, 0x8F, 0xBC, 0x1C, + 0xF0, 0x73, 0xC1, 0xCE, 0x00, 0x1C, 0xE1, 0xCC, 0x0D, 0x80, 0xF8, 0x0F, + 0x00, 0xF0, 0x1F, 0x03, 0xB8, 0x33, 0x87, 0x38, 0x70, 0xCE, 0x38, 0xC6, + 0x19, 0xC3, 0x30, 0x66, 0x0F, 0x81, 0xF0, 0x3C, 0x03, 0x80, 0x60, 0x18, + 0x0F, 0x01, 0xC0, 0x00, 0x1F, 0xCF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0x7F, 0xBF, 0xE0, 0x0E, 0x38, 0x61, 0x83, 0x06, 0x0C, 0x78, + 0xF0, 0xC1, 0x83, 0x0E, 0x1C, 0x38, 0x78, 0x70, 0x18, 0xC4, 0x21, 0x18, + 0xC4, 0x21, 0x18, 0xC4, 0x23, 0x18, 0x80, 0x1C, 0x3C, 0x38, 0x70, 0xE1, + 0x83, 0x06, 0x1E, 0x5C, 0x60, 0xC1, 0x83, 0x0C, 0x38, 0xE0, 0x71, 0x8E }; + +const GFXglyph FreeSansBoldOblique9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 5, 13, 6, 2, -12 }, // 0x21 '!' + { 9, 7, 5, 9, 3, -12 }, // 0x22 '"' + { 14, 11, 12, 10, 1, -11 }, // 0x23 '#' + { 31, 11, 16, 10, 1, -13 }, // 0x24 '$' + { 53, 14, 13, 16, 2, -12 }, // 0x25 '%' + { 76, 12, 13, 13, 2, -12 }, // 0x26 '&' + { 96, 3, 5, 4, 3, -12 }, // 0x27 ''' + { 98, 8, 17, 6, 2, -12 }, // 0x28 '(' + { 115, 8, 17, 6, -2, -13 }, // 0x29 ')' + { 132, 6, 6, 7, 3, -12 }, // 0x2A '*' + { 137, 9, 8, 11, 2, -7 }, // 0x2B '+' + { 146, 4, 6, 5, 0, -2 }, // 0x2C ',' + { 149, 5, 2, 6, 1, -5 }, // 0x2D '-' + { 151, 3, 2, 5, 1, -1 }, // 0x2E '.' + { 152, 8, 13, 5, 0, -12 }, // 0x2F '/' + { 165, 10, 13, 10, 1, -12 }, // 0x30 '0' + { 182, 7, 13, 10, 3, -12 }, // 0x31 '1' + { 194, 11, 13, 10, 1, -12 }, // 0x32 '2' + { 212, 11, 13, 10, 1, -12 }, // 0x33 '3' + { 230, 10, 12, 10, 1, -11 }, // 0x34 '4' + { 245, 11, 13, 10, 1, -12 }, // 0x35 '5' + { 263, 10, 13, 10, 2, -12 }, // 0x36 '6' + { 280, 10, 13, 10, 2, -12 }, // 0x37 '7' + { 297, 11, 13, 10, 1, -12 }, // 0x38 '8' + { 315, 11, 13, 10, 1, -12 }, // 0x39 '9' + { 333, 4, 9, 6, 2, -8 }, // 0x3A ':' + { 338, 5, 12, 6, 1, -8 }, // 0x3B ';' + { 346, 10, 9, 11, 1, -8 }, // 0x3C '<' + { 358, 10, 6, 11, 1, -6 }, // 0x3D '=' + { 366, 10, 9, 11, 1, -7 }, // 0x3E '>' + { 378, 10, 13, 11, 3, -12 }, // 0x3F '?' + { 395, 18, 16, 18, 1, -13 }, // 0x40 '@' + { 431, 13, 13, 13, 0, -12 }, // 0x41 'A' + { 453, 13, 13, 13, 1, -12 }, // 0x42 'B' + { 475, 13, 13, 13, 2, -12 }, // 0x43 'C' + { 497, 13, 13, 13, 1, -12 }, // 0x44 'D' + { 519, 13, 13, 12, 1, -12 }, // 0x45 'E' + { 541, 12, 13, 11, 1, -12 }, // 0x46 'F' + { 561, 12, 13, 14, 2, -12 }, // 0x47 'G' + { 581, 14, 13, 13, 1, -12 }, // 0x48 'H' + { 604, 5, 13, 5, 1, -12 }, // 0x49 'I' + { 613, 11, 13, 10, 1, -12 }, // 0x4A 'J' + { 631, 14, 13, 13, 1, -12 }, // 0x4B 'K' + { 654, 10, 13, 11, 1, -12 }, // 0x4C 'L' + { 671, 16, 13, 15, 1, -12 }, // 0x4D 'M' + { 697, 14, 13, 13, 1, -12 }, // 0x4E 'N' + { 720, 13, 13, 14, 2, -12 }, // 0x4F 'O' + { 742, 13, 13, 12, 1, -12 }, // 0x50 'P' + { 764, 13, 14, 14, 2, -12 }, // 0x51 'Q' + { 787, 13, 13, 13, 1, -12 }, // 0x52 'R' + { 809, 13, 13, 12, 1, -12 }, // 0x53 'S' + { 831, 11, 13, 11, 3, -12 }, // 0x54 'T' + { 849, 13, 13, 13, 2, -12 }, // 0x55 'U' + { 871, 11, 13, 12, 3, -12 }, // 0x56 'V' + { 889, 17, 13, 17, 3, -12 }, // 0x57 'W' + { 917, 14, 13, 12, 0, -12 }, // 0x58 'X' + { 940, 11, 13, 12, 3, -12 }, // 0x59 'Y' + { 958, 12, 13, 11, 1, -12 }, // 0x5A 'Z' + { 978, 8, 17, 6, 0, -12 }, // 0x5B '[' + { 995, 3, 17, 5, 2, -16 }, // 0x5C '\' + { 1002, 8, 17, 6, 0, -13 }, // 0x5D ']' + { 1019, 8, 8, 11, 2, -12 }, // 0x5E '^' + { 1027, 11, 1, 10, -1, 4 }, // 0x5F '_' + { 1029, 3, 2, 6, 3, -12 }, // 0x60 '`' + { 1030, 10, 10, 10, 1, -9 }, // 0x61 'a' + { 1043, 11, 13, 11, 1, -12 }, // 0x62 'b' + { 1061, 10, 10, 10, 1, -9 }, // 0x63 'c' + { 1074, 12, 13, 11, 1, -12 }, // 0x64 'd' + { 1094, 10, 10, 10, 1, -9 }, // 0x65 'e' + { 1107, 6, 13, 6, 2, -12 }, // 0x66 'f' + { 1117, 12, 14, 11, 0, -9 }, // 0x67 'g' + { 1138, 11, 13, 11, 1, -12 }, // 0x68 'h' + { 1156, 5, 13, 5, 1, -12 }, // 0x69 'i' + { 1165, 8, 17, 5, -1, -12 }, // 0x6A 'j' + { 1182, 11, 13, 10, 1, -12 }, // 0x6B 'k' + { 1200, 5, 13, 5, 1, -12 }, // 0x6C 'l' + { 1209, 16, 10, 16, 1, -9 }, // 0x6D 'm' + { 1229, 11, 10, 11, 1, -9 }, // 0x6E 'n' + { 1243, 11, 10, 11, 1, -9 }, // 0x6F 'o' + { 1257, 12, 14, 11, 0, -9 }, // 0x70 'p' + { 1278, 11, 14, 11, 1, -9 }, // 0x71 'q' + { 1298, 8, 10, 7, 1, -9 }, // 0x72 'r' + { 1308, 9, 10, 10, 2, -9 }, // 0x73 's' + { 1320, 6, 12, 6, 2, -11 }, // 0x74 't' + { 1329, 10, 10, 11, 2, -9 }, // 0x75 'u' + { 1342, 10, 10, 10, 2, -9 }, // 0x76 'v' + { 1355, 14, 10, 14, 2, -9 }, // 0x77 'w' + { 1373, 12, 10, 10, 0, -9 }, // 0x78 'x' + { 1388, 11, 14, 10, 1, -9 }, // 0x79 'y' + { 1408, 10, 10, 9, 0, -9 }, // 0x7A 'z' + { 1421, 7, 17, 7, 2, -12 }, // 0x7B '{' + { 1436, 5, 17, 5, 1, -12 }, // 0x7C '|' + { 1447, 7, 17, 7, 0, -13 }, // 0x7D '}' + { 1462, 8, 2, 11, 2, -4 } }; // 0x7E '~' + +const GFXfont FreeSansBoldOblique9pt7b PROGMEM = { + (uint8_t *)FreeSansBoldOblique9pt7bBitmaps, + (GFXglyph *)FreeSansBoldOblique9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 2136 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique12pt7b.h new file mode 100644 index 0000000..efdbd8d --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique12pt7b.h @@ -0,0 +1,302 @@ +const uint8_t FreeSansOblique12pt7bBitmaps[] PROGMEM = { + 0x0C, 0x61, 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC2, 0x18, 0x61, 0x00, 0x00, + 0xC3, 0x00, 0xCF, 0x3C, 0xE2, 0x8A, 0x20, 0x01, 0x8C, 0x03, 0x18, 0x06, + 0x60, 0x18, 0xC0, 0x31, 0x83, 0xFF, 0x87, 0xFF, 0x03, 0x18, 0x0C, 0x60, + 0x18, 0xC0, 0x23, 0x03, 0xFF, 0x8F, 0xFF, 0x02, 0x30, 0x0C, 0x60, 0x18, + 0x80, 0x63, 0x00, 0xC6, 0x00, 0x00, 0x80, 0x3F, 0x03, 0xFC, 0x32, 0x73, + 0x91, 0x99, 0x8C, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0x7E, 0x01, 0xFC, 0x0C, + 0xEC, 0x43, 0x62, 0x1B, 0x11, 0x9D, 0x9C, 0x7F, 0xC1, 0xF8, 0x02, 0x00, + 0x10, 0x01, 0x80, 0x00, 0x00, 0x01, 0x83, 0xC0, 0x60, 0xFC, 0x18, 0x30, + 0xC2, 0x0C, 0x18, 0xC1, 0x83, 0x30, 0x38, 0xCC, 0x03, 0xF1, 0x00, 0x3C, + 0x40, 0x00, 0x18, 0xF0, 0x06, 0x3F, 0x01, 0x8C, 0x30, 0x23, 0x06, 0x0C, + 0x60, 0xC3, 0x0E, 0x30, 0xC0, 0xFC, 0x10, 0x0F, 0x00, 0x01, 0xE0, 0x3F, + 0x81, 0x8C, 0x18, 0x60, 0xC3, 0x06, 0x30, 0x1F, 0x00, 0xE0, 0x1F, 0x01, + 0xDC, 0xD8, 0x6D, 0x81, 0xEC, 0x0E, 0x60, 0x73, 0x87, 0xCF, 0xE6, 0x3E, + 0x38, 0xFE, 0xA0, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, + 0x60, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x60, + 0x60, 0x20, 0x04, 0x06, 0x06, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x20, 0x60, + 0xC0, 0x0C, 0x0C, 0x49, 0x7F, 0x3C, 0x3C, 0x6C, 0x00, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0xC0, + 0x0C, 0x00, 0x77, 0x22, 0x6C, 0xFF, 0xF0, 0xFC, 0x00, 0x40, 0x30, 0x08, + 0x06, 0x01, 0x00, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x00, 0x80, 0x40, 0x10, + 0x08, 0x02, 0x01, 0x00, 0xC0, 0x20, 0x00, 0x07, 0xC0, 0xFE, 0x1C, 0x73, + 0x83, 0x30, 0x36, 0x03, 0x60, 0x36, 0x03, 0xC0, 0x7C, 0x07, 0xC0, 0x6C, + 0x06, 0xC0, 0xEC, 0x0C, 0xE3, 0x87, 0xF0, 0x3E, 0x00, 0x02, 0x0C, 0x77, + 0xEF, 0xC1, 0x83, 0x0C, 0x18, 0x30, 0x61, 0xC3, 0x06, 0x0C, 0x18, 0x60, + 0x03, 0xF0, 0x1F, 0xE0, 0xE1, 0xC7, 0x03, 0x18, 0x0C, 0x00, 0x30, 0x01, + 0x80, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x78, 0x07, 0x80, 0x38, 0x01, 0xC0, + 0x06, 0x00, 0x1F, 0xFC, 0xFF, 0xE0, 0x07, 0xC0, 0xFE, 0x1C, 0x73, 0x03, + 0x30, 0x30, 0x03, 0x00, 0xE0, 0x7C, 0x07, 0xC0, 0x0E, 0x00, 0x60, 0x06, + 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x00, 0x60, 0x06, 0x00, + 0xE0, 0x1E, 0x03, 0xE0, 0x6C, 0x0C, 0xC1, 0x8C, 0x30, 0xC6, 0x1C, 0xC1, + 0x8F, 0xFF, 0xFF, 0xE0, 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x0F, 0xF8, + 0x7F, 0xC6, 0x00, 0x30, 0x01, 0x00, 0x1B, 0xC0, 0xFF, 0x06, 0x1C, 0x60, + 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x60, 0x63, 0x86, 0x0F, 0xE0, + 0x3E, 0x00, 0x03, 0xC0, 0xFE, 0x1C, 0x73, 0x83, 0x30, 0x06, 0x00, 0x67, + 0x87, 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0x4C, 0x0C, 0xE1, + 0x87, 0xF8, 0x3E, 0x00, 0x3F, 0xFB, 0xFF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x70, 0x03, 0x00, 0x30, 0x03, + 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x00, 0x07, 0xC0, 0xFE, 0x1C, + 0x73, 0x03, 0x30, 0x33, 0x03, 0x38, 0x61, 0xFC, 0x3F, 0xC7, 0x0E, 0x60, + 0x6C, 0x06, 0xC0, 0x6C, 0x0C, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0xC1, + 0xFE, 0x38, 0x73, 0x03, 0x60, 0x36, 0x03, 0x60, 0x36, 0x07, 0x70, 0xF3, + 0xFE, 0x1E, 0x60, 0x0E, 0x00, 0xCC, 0x1C, 0xE3, 0x87, 0xF0, 0x3C, 0x00, + 0x39, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC0, 0x1C, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x1C, 0x20, 0x86, 0x30, 0x00, 0x00, 0x01, 0xC0, + 0x3C, 0x0F, 0x81, 0xE0, 0x7C, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x3E, + 0x00, 0x38, 0x00, 0x40, 0x7F, 0xFB, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, + 0x7F, 0xF0, 0x20, 0x01, 0xC0, 0x07, 0xC0, 0x0F, 0x80, 0x0F, 0x00, 0x1C, + 0x03, 0xE0, 0x78, 0x1F, 0x03, 0xC0, 0x38, 0x00, 0x00, 0x00, 0x0F, 0x87, + 0xF9, 0xC3, 0xB0, 0x3C, 0x06, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x01, 0xC0, + 0x30, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x3F, 0x80, 0x01, 0xFF, 0xE0, 0x0F, 0x01, 0xE0, 0x38, 0x00, 0xE0, 0xE0, + 0x00, 0xC3, 0x87, 0x81, 0xCE, 0x1F, 0xB1, 0x98, 0x71, 0xC3, 0x61, 0x83, + 0x86, 0xC6, 0x06, 0x0F, 0x0C, 0x0C, 0x3E, 0x30, 0x30, 0x6C, 0x60, 0x61, + 0xD8, 0xC1, 0x87, 0x31, 0xC7, 0x1C, 0x61, 0xF7, 0xF0, 0x63, 0xCF, 0x80, + 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x7F, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x78, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xDC, 0x01, 0xCC, + 0x01, 0x8C, 0x03, 0x8C, 0x03, 0x0C, 0x06, 0x0C, 0x0E, 0x0E, 0x0F, 0xFE, + 0x1F, 0xFE, 0x18, 0x06, 0x38, 0x06, 0x30, 0x06, 0x70, 0x06, 0x60, 0x07, + 0x0F, 0xF8, 0x1F, 0xF8, 0x60, 0x38, 0xC0, 0x31, 0x80, 0x63, 0x00, 0xCE, + 0x03, 0x18, 0x0C, 0x3F, 0xF0, 0x7F, 0xF0, 0xC0, 0x73, 0x00, 0x66, 0x00, + 0xCC, 0x01, 0x98, 0x06, 0x70, 0x1C, 0xFF, 0xF1, 0xFF, 0x80, 0x01, 0xF8, + 0x07, 0xFE, 0x0E, 0x0E, 0x1C, 0x03, 0x38, 0x03, 0x30, 0x00, 0x60, 0x00, + 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x06, + 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x78, 0x3F, 0xF0, 0x1F, 0x80, 0x0F, 0xF8, + 0x1F, 0xFC, 0x18, 0x0E, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x38, 0x03, + 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x70, 0x06, 0x70, 0x06, 0x60, 0x0C, + 0x60, 0x0C, 0x60, 0x18, 0xE0, 0x78, 0xFF, 0xE0, 0xFF, 0x80, 0x0F, 0xFF, + 0x1F, 0xFE, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x38, 0x00, + 0x30, 0x00, 0x3F, 0xFC, 0x3F, 0xF8, 0x70, 0x00, 0x70, 0x00, 0x60, 0x00, + 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xFF, 0xF8, 0xFF, 0xF8, 0x0F, 0xFE, + 0x3F, 0xFC, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18, + 0x00, 0x3F, 0xF0, 0x7F, 0xE1, 0xC0, 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00, + 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x01, 0xF8, 0x07, 0xFE, + 0x0E, 0x0F, 0x18, 0x03, 0x30, 0x03, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, + 0xC0, 0x7F, 0xC0, 0x7E, 0xC0, 0x02, 0xC0, 0x06, 0xC0, 0x06, 0xE0, 0x0E, + 0x60, 0x1E, 0x78, 0x3C, 0x3F, 0xE4, 0x0F, 0x84, 0x0C, 0x01, 0x8E, 0x00, + 0xC6, 0x00, 0xE3, 0x00, 0x61, 0x80, 0x30, 0xC0, 0x18, 0xE0, 0x0C, 0x60, + 0x0E, 0x3F, 0xFE, 0x1F, 0xFF, 0x1C, 0x01, 0x8E, 0x01, 0xC6, 0x00, 0xE3, + 0x00, 0x61, 0x80, 0x31, 0xC0, 0x18, 0xC0, 0x1C, 0x60, 0x0C, 0x00, 0x0C, + 0x71, 0x86, 0x18, 0x63, 0x8C, 0x30, 0xC3, 0x1C, 0x61, 0x86, 0x18, 0xE3, + 0x00, 0x00, 0x18, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x38, 0x01, 0x8C, 0x0C, 0x60, 0x63, + 0x07, 0x1C, 0x70, 0x7F, 0x01, 0xF0, 0x00, 0x0C, 0x03, 0x87, 0x01, 0xC1, + 0x80, 0xE0, 0x60, 0x60, 0x18, 0x70, 0x06, 0x38, 0x03, 0x9C, 0x00, 0xCE, + 0x00, 0x37, 0x80, 0x0F, 0x70, 0x07, 0x8C, 0x01, 0xC3, 0x80, 0x60, 0x60, + 0x18, 0x1C, 0x06, 0x03, 0x03, 0x80, 0xE0, 0xC0, 0x18, 0x30, 0x07, 0x00, + 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x0E, 0x01, 0x80, 0x30, + 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xFF, 0xFF, + 0xFC, 0x0E, 0x00, 0x71, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E, + 0x01, 0xE1, 0xE0, 0x36, 0x3B, 0x03, 0x63, 0x30, 0x6E, 0x33, 0x0E, 0xC3, + 0x30, 0xCC, 0x33, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x31, 0xC6, 0x33, 0x18, + 0x61, 0xE1, 0x8E, 0x1E, 0x18, 0xC1, 0xC1, 0x8C, 0x1C, 0x38, 0x0C, 0x01, + 0x8F, 0x00, 0xC7, 0x80, 0x63, 0xE0, 0x71, 0xF0, 0x30, 0xD8, 0x18, 0xEE, + 0x0C, 0x63, 0x06, 0x31, 0xC7, 0x18, 0xE3, 0x0C, 0x31, 0x8C, 0x1C, 0xC6, + 0x06, 0x63, 0x03, 0xF1, 0x80, 0xF1, 0xC0, 0x78, 0xC0, 0x3C, 0x60, 0x0E, + 0x00, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0x83, 0xC3, 0x80, 0x63, 0x00, 0x3B, + 0x80, 0x0D, 0x80, 0x06, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0xF8, 0x00, 0x6C, 0x00, 0x36, 0x00, 0x31, 0x80, 0x30, 0xF0, 0x78, 0x3F, + 0xF0, 0x07, 0xE0, 0x00, 0x0F, 0xF8, 0x3F, 0xF8, 0x60, 0x38, 0xC0, 0x31, + 0x80, 0x63, 0x00, 0xCE, 0x03, 0x18, 0x0E, 0x3F, 0xF8, 0x7F, 0xE1, 0xC0, + 0x03, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x01, + 0x80, 0x00, 0x00, 0xFC, 0x01, 0xFF, 0xC0, 0xF0, 0x78, 0x70, 0x06, 0x38, + 0x01, 0xCC, 0x00, 0x36, 0x00, 0x0D, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1B, 0x00, 0x06, 0xC0, 0x03, 0x38, 0x1D, 0xC6, 0x03, 0xE1, + 0xE0, 0xF0, 0x3F, 0xFE, 0x03, 0xF1, 0xC0, 0x00, 0x20, 0x0F, 0xFC, 0x1F, + 0xFE, 0x18, 0x07, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03, 0x38, 0x06, 0x30, + 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x70, 0x1C, 0x70, 0x0C, 0x60, 0x0C, 0x60, + 0x0C, 0x60, 0x18, 0xE0, 0x18, 0xC0, 0x18, 0xC0, 0x1C, 0x03, 0xF8, 0x1F, + 0xF8, 0x70, 0x38, 0xC0, 0x33, 0x00, 0x66, 0x00, 0x0C, 0x00, 0x1E, 0x00, + 0x1F, 0xC0, 0x0F, 0xF0, 0x01, 0xF0, 0x00, 0xEC, 0x00, 0xD8, 0x01, 0xB0, + 0x06, 0x70, 0x38, 0x7F, 0xE0, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, + 0x01, 0xC0, 0x06, 0x00, 0x18, 0x00, 0x60, 0x03, 0x80, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x18, + 0x00, 0xE0, 0x00, 0x18, 0x03, 0x38, 0x03, 0x30, 0x07, 0x30, 0x06, 0x30, + 0x06, 0x70, 0x06, 0x70, 0x0E, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0xE0, + 0x0C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18, 0xC0, 0x38, 0xE0, 0x70, 0x7F, + 0xE0, 0x1F, 0x80, 0xC0, 0x0F, 0xC0, 0x1B, 0x80, 0x73, 0x00, 0xC6, 0x03, + 0x0C, 0x06, 0x18, 0x18, 0x30, 0x70, 0x60, 0xC0, 0xE3, 0x81, 0xC6, 0x01, + 0x9C, 0x03, 0x30, 0x06, 0xE0, 0x0D, 0x80, 0x1E, 0x00, 0x3C, 0x00, 0x70, + 0x00, 0xC0, 0x70, 0x1F, 0x01, 0xC0, 0x6C, 0x0F, 0x03, 0xB0, 0x3C, 0x0C, + 0xC1, 0xF0, 0x73, 0x06, 0xC1, 0x8C, 0x3B, 0x06, 0x30, 0xC6, 0x30, 0xC7, + 0x18, 0xC3, 0x18, 0x67, 0x0C, 0xE1, 0x98, 0x33, 0x06, 0xE0, 0xDC, 0x1B, + 0x03, 0x60, 0x6C, 0x07, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0x70, 0x1C, 0x01, + 0x80, 0x70, 0x00, 0x07, 0x00, 0xE0, 0xE0, 0x38, 0x0C, 0x0E, 0x01, 0xC3, + 0x80, 0x18, 0xE0, 0x03, 0x98, 0x00, 0x36, 0x00, 0x07, 0x80, 0x00, 0xF0, + 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x01, 0xDC, 0x00, 0x73, 0x80, 0x1C, 0x30, + 0x03, 0x07, 0x00, 0xC0, 0x60, 0x38, 0x0E, 0x0E, 0x00, 0xC0, 0xE0, 0x06, + 0x60, 0x0C, 0x70, 0x1C, 0x70, 0x38, 0x30, 0x70, 0x38, 0x60, 0x18, 0xC0, + 0x1D, 0xC0, 0x1F, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x0F, 0xFF, + 0x87, 0xFF, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, + 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, + 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xF8, 0x7F, 0xFC, + 0x00, 0x07, 0xC1, 0xE0, 0x60, 0x18, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x1C, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x06, + 0x01, 0x80, 0x60, 0x1E, 0x07, 0x80, 0x93, 0x6C, 0x92, 0x49, 0x24, 0xDB, + 0x24, 0x07, 0x81, 0xE0, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x03, + 0x01, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x03, 0x00, + 0xC0, 0x60, 0x18, 0x1E, 0x0F, 0x80, 0x03, 0x01, 0xC0, 0xD8, 0x36, 0x19, + 0x84, 0x63, 0x19, 0x83, 0x60, 0xC0, 0xFF, 0xFC, 0xE6, 0x23, 0x07, 0xC3, + 0xFC, 0xE3, 0x98, 0x30, 0x06, 0x01, 0x87, 0xF3, 0xC6, 0xC0, 0xD8, 0x3B, + 0x0E, 0x7F, 0x77, 0xCC, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0xF0, 0x7F, 0xC3, 0x87, 0x38, 0x19, 0x80, 0xCC, 0x06, 0x60, 0x32, + 0x03, 0xB0, 0x19, 0xC1, 0xCE, 0x1C, 0x7F, 0xC3, 0x7C, 0x00, 0x0F, 0x83, + 0xF8, 0xE3, 0xB8, 0x36, 0x07, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x1B, + 0x86, 0x3F, 0xC3, 0xE0, 0x00, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, + 0x18, 0x3E, 0x61, 0xFF, 0x0E, 0x3C, 0x70, 0x71, 0x80, 0xCE, 0x07, 0x30, + 0x18, 0xC0, 0x63, 0x01, 0x8C, 0x0E, 0x38, 0x78, 0x7F, 0xC0, 0xFB, 0x00, + 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x37, 0xFF, 0xFF, 0xFC, 0x00, + 0xC0, 0x0C, 0x06, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x07, 0x0F, 0x1C, 0x18, + 0x18, 0x7E, 0x7E, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, + 0xC0, 0xC0, 0x03, 0xCC, 0x3F, 0xA1, 0xC7, 0x8E, 0x0E, 0x30, 0x38, 0xC0, + 0xC6, 0x03, 0x18, 0x0C, 0x60, 0x71, 0x81, 0xC7, 0x0E, 0x0F, 0xF8, 0x1E, + 0x60, 0x03, 0x80, 0x0C, 0x30, 0x70, 0x7F, 0x80, 0xF8, 0x00, 0x0C, 0x00, + 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x9E, 0x1F, 0xF1, 0xC7, 0x38, 0x33, + 0x03, 0x30, 0x33, 0x07, 0x30, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0xC6, + 0x0C, 0x18, 0xC0, 0x00, 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6, + 0x00, 0x01, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x0C, 0x06, 0x03, + 0x01, 0x81, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x03, + 0x87, 0x83, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x18, 0x61, 0x83, 0x38, 0x33, 0x81, 0xB8, 0x0F, 0xC0, 0x77, 0x03, 0x18, + 0x30, 0xC1, 0x87, 0x0C, 0x18, 0x60, 0xE3, 0x03, 0x00, 0x18, 0xC6, 0x63, + 0x18, 0xC6, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xC6, 0x00, 0x1B, 0xE3, 0xC3, + 0xFD, 0xFC, 0xF1, 0xE1, 0x9C, 0x18, 0x33, 0x03, 0x06, 0x60, 0xC0, 0xCC, + 0x18, 0x3B, 0x83, 0x06, 0x60, 0x60, 0xCC, 0x0C, 0x19, 0x83, 0x03, 0x30, + 0x60, 0xE6, 0x0C, 0x18, 0x1B, 0xE1, 0xFF, 0x3C, 0x73, 0x83, 0x30, 0x33, + 0x03, 0x30, 0x77, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C, 0x60, 0xC0, + 0x07, 0xC1, 0xFE, 0x38, 0x77, 0x03, 0x60, 0x3E, 0x03, 0xC0, 0x3C, 0x06, + 0xC0, 0x6C, 0x0E, 0xE1, 0xC7, 0xF8, 0x3E, 0x00, 0x0C, 0xF0, 0x3F, 0xE0, + 0xE1, 0xC7, 0x03, 0x1C, 0x0C, 0x60, 0x31, 0x80, 0xCE, 0x07, 0x38, 0x18, + 0xE0, 0xE3, 0xC7, 0x0F, 0xF8, 0x77, 0xC1, 0x80, 0x06, 0x00, 0x18, 0x00, + 0x60, 0x03, 0x80, 0x00, 0x0F, 0x98, 0xFF, 0xCE, 0x3C, 0xE0, 0xE6, 0x03, + 0x70, 0x1B, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x07, 0x38, 0x78, 0xFF, 0x83, + 0xCC, 0x00, 0x60, 0x07, 0x00, 0x38, 0x01, 0x80, 0x0C, 0x00, 0x1B, 0x8F, + 0xCF, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x00, 0x0F, 0xC1, 0xFF, 0x30, 0x76, 0x03, 0x60, 0x07, 0x80, 0x3F, 0x80, + 0x7E, 0x00, 0x6C, 0x06, 0xE0, 0xCF, 0xF8, 0x3E, 0x00, 0x18, 0x30, 0x67, + 0xEF, 0xC6, 0x0C, 0x30, 0x60, 0xC1, 0x83, 0x0C, 0x18, 0x3C, 0x38, 0x30, + 0x33, 0x03, 0x30, 0x37, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0xC0, + 0xEC, 0x0C, 0xC3, 0xCF, 0xFC, 0x7C, 0xC0, 0xC0, 0x78, 0x1B, 0x03, 0x60, + 0xC6, 0x18, 0xC6, 0x19, 0xC3, 0x30, 0x6C, 0x0D, 0x81, 0xE0, 0x3C, 0x03, + 0x00, 0xC1, 0xC3, 0xE1, 0xE1, 0xB0, 0xF0, 0xD8, 0x78, 0xCC, 0x6C, 0x66, + 0x36, 0x63, 0x33, 0x30, 0x99, 0xB0, 0x58, 0xD8, 0x2C, 0x78, 0x1C, 0x3C, + 0x0E, 0x1C, 0x06, 0x0E, 0x00, 0x0C, 0x1C, 0x30, 0xE0, 0xE3, 0x01, 0x98, + 0x07, 0xC0, 0x0E, 0x00, 0x30, 0x01, 0xE0, 0x0F, 0x80, 0x73, 0x01, 0x8C, + 0x0C, 0x38, 0x60, 0x60, 0x18, 0x0C, 0x60, 0x61, 0x83, 0x86, 0x0C, 0x1C, + 0x60, 0x31, 0x80, 0xCC, 0x03, 0x30, 0x0D, 0x80, 0x36, 0x00, 0xF0, 0x03, + 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0xF0, 0x03, 0x80, 0x00, + 0x1F, 0xF1, 0xFF, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x60, 0x0F, 0xFC, 0xFF, 0xC0, 0x07, 0x0E, 0x18, 0x18, + 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0xE0, 0xE0, 0x60, 0x60, 0x60, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x60, 0x0C, 0x30, 0x82, 0x08, 0x61, + 0x84, 0x10, 0x43, 0x0C, 0x20, 0x86, 0x18, 0x41, 0x04, 0x30, 0xC2, 0x00, + 0x00, 0x06, 0x07, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, + 0x01, 0xC0, 0xE0, 0x60, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x01, + 0x83, 0x83, 0x80, 0x38, 0x0F, 0x82, 0x38, 0x83, 0xE0, 0x38 }; + +const GFXglyph FreeSansOblique12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 7, 0, 1 }, // 0x20 ' ' + { 0, 6, 18, 7, 3, -17 }, // 0x21 '!' + { 14, 6, 6, 9, 4, -16 }, // 0x22 '"' + { 19, 15, 18, 13, 1, -17 }, // 0x23 '#' + { 53, 13, 21, 13, 2, -17 }, // 0x24 '$' + { 88, 19, 17, 21, 3, -16 }, // 0x25 '%' + { 129, 13, 17, 16, 2, -16 }, // 0x26 '&' + { 157, 2, 6, 5, 4, -16 }, // 0x27 ''' + { 159, 8, 23, 8, 3, -17 }, // 0x28 '(' + { 182, 8, 23, 8, 0, -16 }, // 0x29 ')' + { 205, 8, 8, 9, 4, -17 }, // 0x2A '*' + { 213, 12, 11, 14, 2, -10 }, // 0x2B '+' + { 230, 4, 6, 7, 1, -1 }, // 0x2C ',' + { 233, 6, 2, 8, 2, -7 }, // 0x2D '-' + { 235, 3, 2, 7, 2, -1 }, // 0x2E '.' + { 236, 10, 18, 7, 0, -17 }, // 0x2F '/' + { 259, 12, 17, 13, 2, -16 }, // 0x30 '0' + { 285, 7, 17, 13, 5, -16 }, // 0x31 '1' + { 300, 14, 17, 13, 1, -16 }, // 0x32 '2' + { 330, 12, 17, 13, 2, -16 }, // 0x33 '3' + { 356, 12, 17, 13, 2, -16 }, // 0x34 '4' + { 382, 13, 17, 13, 2, -16 }, // 0x35 '5' + { 410, 12, 17, 13, 2, -16 }, // 0x36 '6' + { 436, 13, 17, 13, 3, -16 }, // 0x37 '7' + { 464, 12, 17, 13, 2, -16 }, // 0x38 '8' + { 490, 12, 17, 13, 2, -16 }, // 0x39 '9' + { 516, 5, 12, 7, 3, -11 }, // 0x3A ':' + { 524, 6, 16, 7, 2, -11 }, // 0x3B ';' + { 536, 13, 12, 14, 2, -11 }, // 0x3C '<' + { 556, 13, 6, 14, 2, -8 }, // 0x3D '=' + { 566, 13, 12, 14, 1, -10 }, // 0x3E '>' + { 586, 11, 18, 13, 4, -17 }, // 0x3F '?' + { 611, 23, 21, 24, 2, -17 }, // 0x40 '@' + { 672, 16, 18, 16, 0, -17 }, // 0x41 'A' + { 708, 15, 18, 16, 2, -17 }, // 0x42 'B' + { 742, 16, 18, 17, 2, -17 }, // 0x43 'C' + { 778, 16, 18, 17, 2, -17 }, // 0x44 'D' + { 814, 16, 18, 16, 2, -17 }, // 0x45 'E' + { 850, 15, 18, 14, 2, -17 }, // 0x46 'F' + { 884, 16, 18, 19, 3, -17 }, // 0x47 'G' + { 920, 17, 18, 17, 2, -17 }, // 0x48 'H' + { 959, 6, 18, 7, 2, -17 }, // 0x49 'I' + { 973, 13, 18, 12, 1, -17 }, // 0x4A 'J' + { 1003, 18, 18, 16, 2, -17 }, // 0x4B 'K' + { 1044, 11, 18, 13, 2, -17 }, // 0x4C 'L' + { 1069, 20, 18, 20, 2, -17 }, // 0x4D 'M' + { 1114, 17, 18, 18, 2, -17 }, // 0x4E 'N' + { 1153, 17, 18, 18, 2, -17 }, // 0x4F 'O' + { 1192, 15, 18, 15, 2, -17 }, // 0x50 'P' + { 1226, 18, 19, 19, 2, -17 }, // 0x51 'Q' + { 1269, 16, 18, 17, 2, -17 }, // 0x52 'R' + { 1305, 15, 18, 16, 2, -17 }, // 0x53 'S' + { 1339, 14, 18, 15, 4, -17 }, // 0x54 'T' + { 1371, 16, 18, 17, 3, -17 }, // 0x55 'U' + { 1407, 15, 18, 15, 4, -17 }, // 0x56 'V' + { 1441, 22, 18, 22, 4, -17 }, // 0x57 'W' + { 1491, 19, 18, 16, 0, -17 }, // 0x58 'X' + { 1534, 16, 18, 16, 4, -17 }, // 0x59 'Y' + { 1570, 17, 18, 15, 1, -17 }, // 0x5A 'Z' + { 1609, 10, 23, 7, 0, -17 }, // 0x5B '[' + { 1638, 3, 18, 7, 4, -17 }, // 0x5C '\' + { 1645, 10, 23, 7, -1, -16 }, // 0x5D ']' + { 1674, 10, 9, 11, 2, -16 }, // 0x5E '^' + { 1686, 14, 1, 13, -1, 4 }, // 0x5F '_' + { 1688, 4, 4, 8, 4, -17 }, // 0x60 '`' + { 1690, 11, 13, 13, 2, -12 }, // 0x61 'a' + { 1708, 13, 18, 13, 1, -17 }, // 0x62 'b' + { 1738, 11, 13, 12, 2, -12 }, // 0x63 'c' + { 1756, 14, 18, 13, 2, -17 }, // 0x64 'd' + { 1788, 12, 13, 13, 2, -12 }, // 0x65 'e' + { 1808, 8, 18, 6, 2, -17 }, // 0x66 'f' + { 1826, 14, 18, 13, 1, -12 }, // 0x67 'g' + { 1858, 12, 18, 13, 1, -17 }, // 0x68 'h' + { 1885, 5, 18, 5, 2, -17 }, // 0x69 'i' + { 1897, 9, 23, 6, -1, -17 }, // 0x6A 'j' + { 1923, 13, 18, 12, 1, -17 }, // 0x6B 'k' + { 1953, 5, 18, 5, 2, -17 }, // 0x6C 'l' + { 1965, 19, 13, 20, 1, -12 }, // 0x6D 'm' + { 1996, 12, 13, 13, 1, -12 }, // 0x6E 'n' + { 2016, 12, 13, 13, 2, -12 }, // 0x6F 'o' + { 2036, 14, 18, 14, 0, -12 }, // 0x70 'p' + { 2068, 13, 18, 13, 2, -12 }, // 0x71 'q' + { 2098, 9, 13, 8, 1, -12 }, // 0x72 'r' + { 2113, 12, 13, 12, 1, -12 }, // 0x73 's' + { 2133, 7, 16, 6, 2, -15 }, // 0x74 't' + { 2147, 12, 13, 13, 2, -12 }, // 0x75 'u' + { 2167, 11, 13, 12, 3, -12 }, // 0x76 'v' + { 2185, 17, 13, 17, 3, -12 }, // 0x77 'w' + { 2213, 14, 13, 12, 0, -12 }, // 0x78 'x' + { 2236, 14, 18, 11, 0, -12 }, // 0x79 'y' + { 2268, 12, 13, 12, 1, -12 }, // 0x7A 'z' + { 2288, 8, 23, 8, 3, -17 }, // 0x7B '{' + { 2311, 6, 23, 6, 1, -17 }, // 0x7C '|' + { 2329, 9, 23, 8, -1, -16 }, // 0x7D '}' + { 2355, 11, 5, 14, 3, -10 } }; // 0x7E '~' + +const GFXfont FreeSansOblique12pt7b PROGMEM = { + (uint8_t *)FreeSansOblique12pt7bBitmaps, + (GFXglyph *)FreeSansOblique12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 3034 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique18pt7b.h new file mode 100644 index 0000000..2a18a3f --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique18pt7b.h @@ -0,0 +1,518 @@ +const uint8_t FreeSansOblique18pt7bBitmaps[] PROGMEM = { + 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0x78, 0x38, 0x1C, 0x0E, 0x07, 0x07, + 0x83, 0x81, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x0C, 0x04, 0x00, 0x00, + 0x01, 0xC0, 0xE0, 0x70, 0x78, 0x00, 0x71, 0xDC, 0x7F, 0x3F, 0x8E, 0xE3, + 0xB8, 0xEC, 0x33, 0x0C, 0xC3, 0x00, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80, + 0x0C, 0x18, 0x00, 0xE1, 0xC0, 0x06, 0x0C, 0x00, 0x70, 0xE0, 0x03, 0x87, + 0x03, 0xFF, 0xFF, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x80, 0x60, 0xC0, 0x07, + 0x0E, 0x00, 0x30, 0x60, 0x03, 0x87, 0x00, 0x18, 0x30, 0x1F, 0xFF, 0xF8, + 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x07, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x87, + 0x00, 0x1C, 0x38, 0x00, 0xC1, 0x80, 0x0E, 0x1C, 0x00, 0x60, 0xC0, 0x00, + 0x00, 0x0C, 0x00, 0x07, 0xF8, 0x01, 0xFF, 0xC0, 0x3F, 0xFE, 0x07, 0x99, + 0xF0, 0xF1, 0x87, 0x0E, 0x18, 0x71, 0xC1, 0x87, 0x1C, 0x38, 0x01, 0xC3, + 0x00, 0x1C, 0x30, 0x01, 0xE3, 0x00, 0x0F, 0xB0, 0x00, 0xFF, 0x80, 0x03, + 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x6F, 0xC0, 0x06, 0x3C, 0x00, 0xC1, 0xCE, + 0x0C, 0x1C, 0xE0, 0xC1, 0xCE, 0x0C, 0x38, 0xF1, 0xC3, 0x8F, 0x98, 0xF0, + 0x7F, 0xFE, 0x03, 0xFF, 0xC0, 0x0F, 0xF0, 0x00, 0x30, 0x00, 0x03, 0x00, + 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0xE0, 0x03, + 0x81, 0xFC, 0x00, 0xC0, 0xFF, 0x00, 0x60, 0x70, 0xE0, 0x38, 0x38, 0x18, + 0x1C, 0x0C, 0x06, 0x0E, 0x03, 0x01, 0x83, 0x00, 0xC0, 0xE1, 0x80, 0x38, + 0x70, 0xE0, 0x0F, 0xF8, 0x70, 0x01, 0xFC, 0x18, 0x00, 0x3E, 0x0C, 0x00, + 0x00, 0x06, 0x07, 0x80, 0x03, 0x87, 0xF8, 0x00, 0xC3, 0xFE, 0x00, 0x61, + 0xE1, 0xC0, 0x30, 0x60, 0x30, 0x1C, 0x30, 0x0C, 0x0E, 0x0C, 0x03, 0x03, + 0x03, 0x01, 0x81, 0x80, 0xE1, 0xE0, 0xC0, 0x1F, 0xF0, 0x70, 0x07, 0xF8, + 0x18, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x1E, 0x3C, 0x03, 0xC1, 0xC0, 0x38, 0x1C, 0x03, 0x81, 0xC0, 0x38, 0x38, + 0x03, 0xC7, 0x00, 0x1D, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xF0, + 0x01, 0xF7, 0x87, 0x3C, 0x3C, 0xE7, 0x81, 0xCE, 0x70, 0x1F, 0xCE, 0x00, + 0xFC, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xF0, 0x1F, 0x8F, 0x87, 0xFC, 0x7F, + 0xF9, 0xC3, 0xFE, 0x1E, 0x1F, 0x80, 0xE0, 0x77, 0xFE, 0xEE, 0xCC, 0xC0, + 0x00, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x30, 0x06, 0x00, 0xE0, + 0x0C, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, 0x00, + 0x70, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x06, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, 0x00, + 0x18, 0x00, 0x01, 0x80, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x06, 0x00, + 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03, + 0x80, 0x38, 0x03, 0x00, 0x70, 0x06, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x00, 0x06, 0x01, 0x84, 0x47, 0xF7, 0xFF, 0xCF, 0xC1, + 0xE0, 0xD8, 0x67, 0x18, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00, + 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x0E, 0x00, 0x3B, 0xDC, 0x21, 0x18, 0x98, 0xFF, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, 0x00, 0xC0, + 0x01, 0x80, 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x03, + 0x00, 0x0C, 0x00, 0x18, 0x00, 0x60, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, + 0x18, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x06, 0x00, 0x18, 0x00, 0x30, + 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x7F, 0xC0, 0x7F, 0xF8, + 0x3E, 0x1E, 0x0F, 0x03, 0xC7, 0x80, 0x71, 0xC0, 0x1C, 0xE0, 0x07, 0x38, + 0x01, 0xDE, 0x00, 0x77, 0x00, 0x1D, 0xC0, 0x0F, 0x70, 0x03, 0xFC, 0x00, + 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xE0, 0x07, 0xB8, 0x01, 0xCE, 0x00, 0xF3, + 0x80, 0x38, 0xF0, 0x1E, 0x1E, 0x1F, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F, + 0x80, 0x00, 0x00, 0xC0, 0x70, 0x3C, 0x3E, 0xFF, 0xBF, 0xEF, 0xF8, 0x1E, + 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x07, + 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0xE0, 0x38, 0x00, 0x00, 0x3F, + 0x00, 0x0F, 0xFC, 0x03, 0xFF, 0xE0, 0x7C, 0x1E, 0x07, 0x80, 0xF0, 0xF0, + 0x07, 0x0E, 0x00, 0x70, 0xE0, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0x80, 0x00, + 0x70, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0xFF, 0xF0, 0xFF, 0xFF, + 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xC1, 0xF0, 0x70, + 0x0E, 0x1C, 0x01, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0x00, 0x01, 0xC0, 0x00, + 0xF0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1E, 0x70, 0x03, + 0x8F, 0x00, 0xF1, 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0, + 0x00, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x1F, + 0x80, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xDC, 0x01, 0xE7, 0x00, 0x71, 0xC0, + 0x38, 0xF0, 0x1C, 0x38, 0x0E, 0x0E, 0x07, 0x03, 0x83, 0x80, 0xE1, 0xC0, + 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x01, 0xFF, + 0xF0, 0x3F, 0xFF, 0x03, 0xFF, 0xE0, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70, + 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0xFC, 0x01, 0xFF, 0xF0, 0x1F, + 0xFF, 0x83, 0xE0, 0x78, 0x3C, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x8E, 0x00, 0x78, + 0xE0, 0x0F, 0x0F, 0x81, 0xE0, 0x7F, 0xFC, 0x03, 0xFF, 0x80, 0x0F, 0xE0, + 0x00, 0x00, 0x7E, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x03, 0xE1, 0xF0, 0xF0, + 0x0E, 0x1C, 0x01, 0xC7, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x1F, + 0x01, 0xCF, 0xF8, 0x3B, 0xFF, 0x87, 0xE0, 0xF8, 0xF0, 0x0F, 0x3C, 0x00, + 0xE7, 0x80, 0x1C, 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x1C, 0x70, 0x03, + 0x8F, 0x00, 0xE0, 0xF0, 0x78, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0x0F, 0xC0, + 0x00, 0x3F, 0xFF, 0xCF, 0xFF, 0xF7, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, + 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, + 0x00, 0x0E, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00, + 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x7E, + 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xF0, 0xE0, 0x0E, 0x38, 0x01, + 0xC7, 0x00, 0x38, 0xE0, 0x0E, 0x1C, 0x01, 0xC3, 0xC0, 0xF0, 0x3F, 0xFC, + 0x03, 0xFE, 0x01, 0xFF, 0xF0, 0x7C, 0x1E, 0x1E, 0x01, 0xE3, 0x80, 0x1C, + 0xE0, 0x03, 0x9C, 0x00, 0x73, 0x80, 0x0E, 0x70, 0x03, 0x8F, 0x00, 0xF1, + 0xF0, 0x7C, 0x1F, 0xFF, 0x01, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0x00, 0x7E, + 0x00, 0x3F, 0xF0, 0x1F, 0xFF, 0x07, 0xC1, 0xE0, 0xE0, 0x1E, 0x38, 0x01, + 0xC7, 0x00, 0x39, 0xC0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x3C, 0xE0, 0x07, + 0x9E, 0x01, 0xE3, 0xE0, 0xFC, 0x3F, 0xFB, 0x83, 0xFE, 0xF0, 0x3F, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x70, 0x07, 0x8E, 0x01, 0xE1, + 0xE0, 0xF8, 0x1F, 0xFE, 0x01, 0xFF, 0x80, 0x0F, 0xC0, 0x00, 0x0E, 0x3C, + 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0xF1, 0xE3, 0x80, 0x07, 0x0F, 0x0F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x78, 0x70, 0x10, 0x10, + 0x30, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x1F, 0x80, 0x1F, + 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0xE0, 0x03, 0xF0, 0x00, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, + 0x00, 0x0F, 0xC0, 0x00, 0x78, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0xDF, 0xFF, + 0xF7, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFB, + 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x10, 0x00, 0x03, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, + 0x00, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0x7E, 0x00, + 0x7F, 0x00, 0x3F, 0x00, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xF8, + 0x0F, 0xFC, 0x1F, 0xFE, 0x3C, 0x1F, 0x78, 0x07, 0x70, 0x07, 0xE0, 0x07, + 0xE0, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x0F, 0x80, 0x03, 0xE0, 0x0F, + 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x01, 0xF0, 0x0F, 0x0F, + 0x03, 0xFD, 0xC7, 0x8F, 0x03, 0xFE, 0xE1, 0xC7, 0x03, 0xC3, 0x60, 0xE7, + 0x03, 0xC0, 0xF0, 0x77, 0x83, 0xC0, 0x70, 0x3B, 0x83, 0xC0, 0x78, 0x1D, + 0xC1, 0xC0, 0x38, 0x1F, 0xC1, 0xE0, 0x1C, 0x0E, 0xE0, 0xE0, 0x1C, 0x0F, + 0x70, 0x70, 0x0E, 0x07, 0x38, 0x38, 0x0E, 0x07, 0x9C, 0x1C, 0x0F, 0x07, + 0x8E, 0x0F, 0x0F, 0x8F, 0x87, 0x03, 0xFD, 0xFF, 0x83, 0xC1, 0xFC, 0xFF, + 0x80, 0xE0, 0x7C, 0x3F, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x01, 0xF8, 0x07, 0x00, 0x00, 0x7F, 0xFF, + 0x80, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF, + 0x00, 0x01, 0xDE, 0x00, 0x07, 0x9C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70, + 0x00, 0x70, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0x83, 0xC0, 0x0E, 0x07, 0x80, + 0x38, 0x07, 0x00, 0x70, 0x0E, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xFC, 0x0F, + 0xFF, 0xF8, 0x1C, 0x00, 0xF0, 0x70, 0x01, 0xE1, 0xE0, 0x01, 0xC3, 0x80, + 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x78, 0x00, 0x1E, 0xE0, 0x00, + 0x3C, 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0xF0, + 0xF0, 0x03, 0x87, 0x00, 0x1C, 0x38, 0x00, 0xE1, 0xC0, 0x07, 0x0E, 0x00, + 0x70, 0xF0, 0x03, 0x87, 0x00, 0x78, 0x3F, 0xFF, 0x81, 0xFF, 0xF8, 0x0F, + 0xFF, 0xF0, 0xE0, 0x03, 0xC7, 0x00, 0x0E, 0x38, 0x00, 0x71, 0xC0, 0x03, + 0x9E, 0x00, 0x1C, 0xE0, 0x00, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xF1, 0xC0, + 0x0F, 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x1F, + 0x80, 0x03, 0xFF, 0x80, 0x1F, 0xFF, 0x01, 0xF8, 0x3E, 0x07, 0x80, 0x38, + 0x38, 0x00, 0xF1, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0, + 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, + 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x7B, 0x80, 0x01, 0xCE, + 0x00, 0x0F, 0x3C, 0x00, 0x38, 0x70, 0x01, 0xE1, 0xE0, 0x0F, 0x07, 0xC0, + 0xF8, 0x0F, 0xFF, 0xC0, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, + 0xC0, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xE0, 0x38, 0x03, 0xE0, 0xF0, 0x03, + 0xC1, 0xC0, 0x03, 0x83, 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E, + 0x3C, 0x00, 0x1C, 0x70, 0x00, 0x38, 0xE0, 0x00, 0x71, 0xC0, 0x00, 0xE7, + 0x80, 0x03, 0x8F, 0x00, 0x07, 0x1C, 0x00, 0x0E, 0x38, 0x00, 0x3C, 0x70, + 0x00, 0x71, 0xE0, 0x01, 0xE3, 0x80, 0x03, 0x87, 0x00, 0x0E, 0x0E, 0x00, + 0x3C, 0x1C, 0x01, 0xF0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x01, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFE, 0x0F, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x38, 0x00, + 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0x07, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x70, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, + 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0xFF, 0xFF, + 0xC1, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, 0xF0, 0x7F, 0xFF, + 0xC1, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, + 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF, + 0xF0, 0x1F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, + 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xFF, + 0xFC, 0x03, 0xE0, 0x3E, 0x07, 0x80, 0x0E, 0x0F, 0x00, 0x0F, 0x1E, 0x00, + 0x07, 0x1C, 0x00, 0x07, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x00, 0xF0, 0x07, 0xFE, 0xE0, 0x07, 0xFE, 0xE0, 0x07, + 0xFE, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, + 0x1C, 0xF0, 0x00, 0x3C, 0x70, 0x00, 0x7C, 0x78, 0x00, 0xFC, 0x3E, 0x03, + 0xDC, 0x1F, 0xFF, 0x98, 0x0F, 0xFE, 0x18, 0x03, 0xF8, 0x18, 0x07, 0x00, + 0x07, 0x83, 0x80, 0x03, 0xC1, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0xF0, + 0x00, 0x70, 0x70, 0x00, 0x78, 0x38, 0x00, 0x3C, 0x1C, 0x00, 0x1C, 0x1E, + 0x00, 0x0E, 0x0F, 0x00, 0x07, 0x07, 0x00, 0x07, 0x83, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xE0, 0x00, 0x70, 0x70, 0x00, 0x78, + 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x1E, 0x00, 0x0E, 0x0E, 0x00, 0x0F, + 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0x81, 0xC0, 0x01, 0xC1, 0xE0, 0x00, + 0xE0, 0xE0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x0F, 0x0F, 0x0E, + 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0x38, + 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xF0, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, + 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, + 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x1E, + 0x1C, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x3C, 0x38, 0x0E, 0x0F, + 0x0F, 0x81, 0xFF, 0xC0, 0x7F, 0xE0, 0x07, 0xE0, 0x00, 0x07, 0x00, 0x07, + 0x83, 0x80, 0x07, 0x81, 0xC0, 0x0F, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0x70, 0x0F, 0x00, 0x38, 0x0F, 0x00, 0x1C, 0x1F, 0x00, 0x1E, 0x1E, + 0x00, 0x0F, 0x1E, 0x00, 0x07, 0x1E, 0x00, 0x03, 0x9F, 0x00, 0x01, 0xDF, + 0xC0, 0x01, 0xFC, 0xE0, 0x00, 0xFC, 0x78, 0x00, 0x7C, 0x1C, 0x00, 0x3C, + 0x0F, 0x00, 0x1C, 0x07, 0x80, 0x1E, 0x01, 0xE0, 0x0E, 0x00, 0xF0, 0x07, + 0x00, 0x38, 0x03, 0x80, 0x1E, 0x01, 0xC0, 0x07, 0x01, 0xE0, 0x03, 0xC0, + 0xE0, 0x00, 0xE0, 0x70, 0x00, 0x78, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x78, 0x00, 0x70, 0x00, 0x70, + 0x00, 0x70, 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, + 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x7E, 0x0F, 0x80, + 0x03, 0xF0, 0xFC, 0x00, 0x3F, 0x07, 0x70, 0x01, 0xF8, 0x3B, 0x80, 0x1D, + 0xC1, 0xDC, 0x00, 0xEE, 0x0E, 0xE0, 0x0E, 0xE0, 0xE7, 0x00, 0x77, 0x07, + 0x38, 0x07, 0x38, 0x39, 0xC0, 0x31, 0xC1, 0xCE, 0x03, 0x9E, 0x1E, 0x38, + 0x38, 0xE0, 0xE1, 0xC1, 0xC7, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x70, 0xE1, + 0xC1, 0xC3, 0x8E, 0x1E, 0x1E, 0x1C, 0x70, 0xE0, 0xE0, 0xE7, 0x07, 0x07, + 0x07, 0x38, 0x38, 0x38, 0x1F, 0x81, 0xC1, 0xC0, 0xF8, 0x1E, 0x1C, 0x07, + 0xC0, 0xE0, 0xE0, 0x3C, 0x07, 0x07, 0x01, 0xE0, 0x38, 0x00, 0x07, 0x80, + 0x03, 0x83, 0xE0, 0x01, 0xC1, 0xF0, 0x00, 0xE0, 0xF8, 0x00, 0xE0, 0xFE, + 0x00, 0x70, 0x7F, 0x00, 0x38, 0x3B, 0xC0, 0x1C, 0x1D, 0xE0, 0x1E, 0x0E, + 0x70, 0x0E, 0x0E, 0x3C, 0x07, 0x07, 0x0E, 0x03, 0x83, 0x87, 0x81, 0xC1, + 0xC3, 0xC1, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0x78, 0x70, 0x70, 0x1C, 0x38, + 0x38, 0x0F, 0x1C, 0x1C, 0x07, 0x9E, 0x1E, 0x01, 0xCE, 0x0E, 0x00, 0xF7, + 0x07, 0x00, 0x3B, 0x83, 0x80, 0x1F, 0xC1, 0xC0, 0x07, 0xC1, 0xC0, 0x03, + 0xE0, 0xE0, 0x01, 0xF0, 0x70, 0x00, 0x78, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0xFF, 0xF0, 0x01, 0xFF, 0xF8, 0x03, 0xE0, 0x7C, 0x07, 0x80, 0x1E, 0x0F, + 0x00, 0x0E, 0x1C, 0x00, 0x0F, 0x3C, 0x00, 0x07, 0x38, 0x00, 0x07, 0x70, + 0x00, 0x07, 0x70, 0x00, 0x07, 0x70, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0, + 0x00, 0x0F, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, 0x00, 0x0E, 0xE0, + 0x00, 0x1C, 0xE0, 0x00, 0x1C, 0xF0, 0x00, 0x38, 0x70, 0x00, 0x78, 0x78, + 0x00, 0xF0, 0x3E, 0x07, 0xE0, 0x1F, 0xFF, 0xC0, 0x0F, 0xFF, 0x00, 0x03, + 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x81, 0xC0, + 0x1F, 0x0F, 0x00, 0x3C, 0x38, 0x00, 0x70, 0xE0, 0x01, 0xC3, 0x80, 0x07, + 0x1E, 0x00, 0x1C, 0x78, 0x00, 0xE1, 0xC0, 0x07, 0x87, 0x00, 0x3C, 0x1F, + 0xFF, 0xE0, 0xFF, 0xFF, 0x03, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0x38, 0x00, + 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x01, + 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, + 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xFF, 0x00, + 0x7C, 0x07, 0xC0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0x38, 0x78, 0x00, 0x1E, + 0x78, 0x00, 0x07, 0x38, 0x00, 0x03, 0xBC, 0x00, 0x01, 0xDC, 0x00, 0x00, + 0xEE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x1D, 0xC0, 0x00, 0x0E, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x07, 0x38, 0x00, + 0x87, 0x9E, 0x00, 0xE7, 0x87, 0x00, 0x7F, 0x83, 0xC0, 0x1F, 0x80, 0xF8, + 0x1F, 0x80, 0x3F, 0xFF, 0xE0, 0x0F, 0xFF, 0x78, 0x01, 0xFE, 0x1E, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xF8, + 0x1F, 0xFF, 0xF0, 0x38, 0x00, 0xF0, 0xF0, 0x00, 0xE1, 0xC0, 0x01, 0xC3, + 0x80, 0x03, 0x87, 0x00, 0x07, 0x1E, 0x00, 0x0E, 0x3C, 0x00, 0x38, 0x70, + 0x00, 0xF0, 0xE0, 0x03, 0xC1, 0xFF, 0xFE, 0x07, 0xFF, 0xF8, 0x0F, 0xFF, + 0xF8, 0x1C, 0x00, 0x78, 0x38, 0x00, 0x70, 0x70, 0x00, 0xE1, 0xE0, 0x01, + 0xC3, 0x80, 0x03, 0x87, 0x00, 0x06, 0x0E, 0x00, 0x1C, 0x1C, 0x00, 0x38, + 0x78, 0x00, 0x70, 0xE0, 0x00, 0xE1, 0xC0, 0x01, 0xE0, 0x00, 0x3F, 0xC0, + 0x07, 0xFF, 0xC0, 0x3F, 0xFF, 0x81, 0xF0, 0x1E, 0x0F, 0x00, 0x3C, 0x38, + 0x00, 0x71, 0xC0, 0x01, 0xC7, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFF, 0x00, + 0x03, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x01, 0xCE, 0x00, + 0x07, 0x38, 0x00, 0x18, 0xE0, 0x00, 0xE3, 0xC0, 0x07, 0x07, 0x80, 0x7C, + 0x1F, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, + 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0xC0, + 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x78, + 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0F, 0x0E, 0x00, 0x0E, 0x0E, + 0x00, 0x0E, 0x1E, 0x00, 0x0E, 0x1C, 0x00, 0x1E, 0x1C, 0x00, 0x1C, 0x1C, + 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x3C, 0x00, 0x1C, 0x38, 0x00, 0x3C, 0x38, + 0x00, 0x38, 0x38, 0x00, 0x38, 0x78, 0x00, 0x38, 0x70, 0x00, 0x78, 0x70, + 0x00, 0x78, 0x70, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xF0, 0x00, 0x70, 0xE0, + 0x00, 0xF0, 0xE0, 0x00, 0xE0, 0xF0, 0x03, 0xE0, 0x78, 0x0F, 0xC0, 0x7F, + 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0xE0, 0x00, 0x3F, 0x80, + 0x03, 0xFC, 0x00, 0x1D, 0xE0, 0x01, 0xE7, 0x00, 0x0E, 0x38, 0x00, 0xE1, + 0xC0, 0x07, 0x0E, 0x00, 0x70, 0x70, 0x07, 0x83, 0xC0, 0x38, 0x1E, 0x03, + 0xC0, 0xF0, 0x1C, 0x03, 0x81, 0xE0, 0x1C, 0x0E, 0x00, 0xE0, 0xF0, 0x07, + 0x07, 0x00, 0x3C, 0x70, 0x01, 0xE3, 0x80, 0x0F, 0x38, 0x00, 0x39, 0xC0, + 0x01, 0xDC, 0x00, 0x0E, 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0xE0, 0x07, 0x80, + 0x1E, 0xE0, 0x07, 0xC0, 0x1E, 0xE0, 0x0F, 0xC0, 0x1C, 0xE0, 0x0F, 0xC0, + 0x3C, 0xE0, 0x1F, 0xC0, 0x38, 0xE0, 0x1D, 0xC0, 0x78, 0xE0, 0x3D, 0xC0, + 0x70, 0xE0, 0x39, 0xC0, 0xF0, 0xE0, 0x79, 0xC0, 0xE0, 0xE0, 0x71, 0xC0, + 0xE0, 0xE0, 0xF1, 0xC1, 0xC0, 0xE0, 0xE1, 0xC1, 0xC0, 0xE1, 0xE1, 0xC3, + 0xC0, 0x61, 0xC1, 0xC3, 0x80, 0x63, 0xC1, 0xC7, 0x80, 0x63, 0x80, 0xE7, + 0x00, 0x67, 0x80, 0xEF, 0x00, 0x67, 0x00, 0xEE, 0x00, 0x7F, 0x00, 0xEE, + 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF8, 0x00, 0x78, 0x00, 0xF0, + 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, + 0xF0, 0x07, 0x80, 0x0F, 0x01, 0xE0, 0x01, 0xE0, 0x78, 0x00, 0x1C, 0x1E, + 0x00, 0x03, 0xC7, 0x80, 0x00, 0x39, 0xE0, 0x00, 0x07, 0xB8, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x3C, + 0x78, 0x00, 0x0F, 0x0F, 0x00, 0x03, 0xC0, 0xF0, 0x00, 0x70, 0x1E, 0x00, + 0x1E, 0x01, 0xE0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x03, 0xC0, 0x78, 0x00, + 0x78, 0x1E, 0x00, 0x0F, 0x00, 0xF0, 0x00, 0x3C, 0xE0, 0x00, 0x71, 0xE0, + 0x01, 0xE3, 0xC0, 0x07, 0x83, 0xC0, 0x1E, 0x07, 0x80, 0x78, 0x07, 0x00, + 0xE0, 0x0F, 0x03, 0xC0, 0x1E, 0x0F, 0x00, 0x1C, 0x3C, 0x00, 0x3C, 0xF0, + 0x00, 0x39, 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00, + 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xC0, 0x00, 0x03, + 0x80, 0x00, 0x07, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x81, + 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x01, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, + 0x00, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0xC0, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0x00, 0x38, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, + 0xCC, 0xCC, 0xCC, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0x33, 0x33, + 0x33, 0x03, 0xF8, 0x1F, 0xC0, 0xFE, 0x00, 0x70, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x1E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1E, 0x00, 0xE0, + 0x07, 0x03, 0xF8, 0x1F, 0xC0, 0xFC, 0x00, 0x00, 0xF0, 0x03, 0xC0, 0x1F, + 0x00, 0x7C, 0x03, 0xB8, 0x1C, 0xE0, 0x63, 0x83, 0x8E, 0x1C, 0x38, 0x60, + 0x73, 0x81, 0xCC, 0x07, 0x70, 0x1F, 0x80, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0xF1, 0xC3, 0x86, 0x0C, 0x00, 0xFE, 0x01, 0xFF, 0xE0, 0xFF, + 0xFC, 0x3C, 0x0F, 0x1C, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x1F, 0x83, 0xFF, 0xE3, 0xFE, 0x39, 0xF0, 0x1E, 0xF0, 0x07, 0x38, + 0x01, 0xCE, 0x00, 0xF3, 0xC0, 0xFC, 0xFF, 0xF7, 0x9F, 0xF1, 0xE1, 0xF0, + 0x38, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, + 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x71, 0xF0, 0x0E, 0xFF, 0x83, 0xFF, + 0xF8, 0x7F, 0x0F, 0x0F, 0x80, 0xF1, 0xE0, 0x0E, 0x38, 0x01, 0xCF, 0x00, + 0x39, 0xE0, 0x07, 0x38, 0x00, 0xE7, 0x00, 0x38, 0xE0, 0x07, 0x3C, 0x00, + 0xE7, 0x80, 0x38, 0xF8, 0x0F, 0x1F, 0x87, 0xC3, 0xFF, 0xF0, 0xE7, 0xFC, + 0x1C, 0x7E, 0x00, 0x01, 0xF8, 0x07, 0xFC, 0x0F, 0xFE, 0x1E, 0x0F, 0x3C, + 0x07, 0x78, 0x07, 0x70, 0x07, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xE0, + 0x00, 0xE0, 0x00, 0xE0, 0x0E, 0xE0, 0x1C, 0xF0, 0x3C, 0x78, 0x78, 0x7F, + 0xF0, 0x3F, 0xE0, 0x0F, 0x80, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x1F, + 0x1C, 0x07, 0xFD, 0xC0, 0xFF, 0xDC, 0x1E, 0x0F, 0xC3, 0xC0, 0x7C, 0x38, + 0x07, 0x87, 0x00, 0x38, 0x70, 0x03, 0x8F, 0x00, 0x38, 0xE0, 0x07, 0x8E, + 0x00, 0x70, 0xE0, 0x07, 0x0E, 0x00, 0xF0, 0xE0, 0x0F, 0x0F, 0x01, 0xF0, + 0x78, 0x7E, 0x07, 0xFF, 0xE0, 0x3F, 0xEE, 0x01, 0xF8, 0xE0, 0x01, 0xF8, + 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xC1, 0xF3, 0xC0, 0x79, 0xC0, 0x1D, 0xC0, + 0x0E, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0x78, 0x7F, 0xF8, 0x1F, 0xF8, + 0x03, 0xF0, 0x00, 0x01, 0xE0, 0x7C, 0x1F, 0x83, 0x80, 0x70, 0x1C, 0x03, + 0x83, 0xFC, 0x7F, 0x8F, 0xF0, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x0F, 0x01, + 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0xE0, 0x1C, 0x00, 0x00, 0xFC, 0x60, 0x7F, 0xCC, 0x1F, 0xFF, 0x87, 0xC3, + 0xF1, 0xE0, 0x3E, 0x38, 0x03, 0x8E, 0x00, 0x71, 0xC0, 0x0E, 0x38, 0x01, + 0xCE, 0x00, 0x79, 0xC0, 0x0E, 0x38, 0x01, 0xC7, 0x00, 0x78, 0xE0, 0x0F, + 0x1E, 0x03, 0xC1, 0xE1, 0xF8, 0x3F, 0xFF, 0x03, 0xFE, 0xE0, 0x1F, 0x1C, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x18, 0x38, 0x07, 0x07, 0x83, 0xC0, + 0x7F, 0xF8, 0x0F, 0xFC, 0x00, 0x7E, 0x00, 0x00, 0x07, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0x80, 0x00, 0xE0, 0x00, + 0x38, 0xFC, 0x0E, 0xFF, 0x87, 0xFF, 0xF1, 0xF8, 0x3C, 0x7C, 0x07, 0x1E, + 0x01, 0xC7, 0x00, 0x73, 0xC0, 0x1C, 0xE0, 0x0F, 0x38, 0x03, 0x8E, 0x00, + 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x07, 0x9C, 0x01, 0xC7, 0x00, 0x71, + 0xC0, 0x1C, 0xE0, 0x07, 0x38, 0x03, 0x80, 0x07, 0x07, 0x0F, 0x0E, 0x00, + 0x00, 0x00, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, 0x00, 0x3C, 0x00, + 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, + 0x38, 0x00, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, + 0x38, 0x00, 0xE0, 0x1F, 0x80, 0x7C, 0x03, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x03, + 0x80, 0x00, 0x70, 0x1E, 0x0E, 0x07, 0x83, 0xC1, 0xE0, 0x70, 0x70, 0x0E, + 0x1C, 0x01, 0xCF, 0x00, 0x3B, 0xC0, 0x0F, 0xF8, 0x01, 0xFF, 0x80, 0x3E, + 0x70, 0x07, 0x8E, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x07, 0x03, 0xC0, 0xE0, + 0x38, 0x1C, 0x07, 0x03, 0x80, 0xF0, 0xE0, 0x0E, 0x1C, 0x01, 0xE0, 0x07, + 0x07, 0x0F, 0x0E, 0x0E, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, + 0xE0, 0x1E, 0x7C, 0x0F, 0x83, 0xBF, 0xE7, 0xF8, 0x7F, 0xFD, 0xFF, 0x8F, + 0xC3, 0xF0, 0xF1, 0xE0, 0x3C, 0x0E, 0x38, 0x07, 0x01, 0xCF, 0x01, 0xE0, + 0x39, 0xC0, 0x38, 0x07, 0x38, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0, + 0x1C, 0x07, 0x3C, 0x07, 0x00, 0xE7, 0x00, 0xE0, 0x1C, 0xE0, 0x1C, 0x03, + 0x9C, 0x03, 0x80, 0xF3, 0x80, 0x70, 0x1C, 0x70, 0x1C, 0x03, 0x9C, 0x03, + 0x80, 0x73, 0x80, 0x70, 0x0E, 0x00, 0x1E, 0x3E, 0x07, 0x7F, 0xE1, 0xFF, + 0xF8, 0x7E, 0x0F, 0x1F, 0x01, 0xC7, 0x80, 0x73, 0xC0, 0x1C, 0xE0, 0x07, + 0x38, 0x03, 0xCE, 0x00, 0xE3, 0x80, 0x39, 0xE0, 0x0E, 0x70, 0x03, 0x9C, + 0x01, 0xC7, 0x00, 0x71, 0xC0, 0x1C, 0x70, 0x07, 0x38, 0x01, 0xCE, 0x00, + 0xE0, 0x01, 0xF8, 0x03, 0xFF, 0x03, 0xFF, 0xC3, 0xE1, 0xE3, 0xC0, 0x79, + 0xC0, 0x1D, 0xC0, 0x0E, 0xE0, 0x07, 0x70, 0x03, 0xF0, 0x01, 0xF8, 0x01, + 0xDC, 0x00, 0xEE, 0x00, 0x77, 0x00, 0x73, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, + 0xF8, 0x1F, 0xF8, 0x03, 0xF0, 0x00, 0x03, 0x8F, 0x80, 0x1D, 0xFF, 0x01, + 0xFF, 0xFC, 0x0F, 0xC1, 0xE0, 0x7C, 0x07, 0x83, 0xC0, 0x1C, 0x1C, 0x00, + 0xE1, 0xE0, 0x07, 0x0E, 0x00, 0x38, 0x70, 0x01, 0xC3, 0x80, 0x1E, 0x1C, + 0x00, 0xE1, 0xE0, 0x07, 0x0F, 0x00, 0x70, 0x78, 0x07, 0x83, 0xF0, 0xF8, + 0x3F, 0xFF, 0x81, 0xDF, 0xF8, 0x0E, 0x3F, 0x00, 0x70, 0x00, 0x03, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, + 0x80, 0x00, 0x00, 0x00, 0xF8, 0xF0, 0x7F, 0xEE, 0x0F, 0xFF, 0xE1, 0xF0, + 0xFE, 0x3C, 0x07, 0xE3, 0x80, 0x3E, 0x70, 0x03, 0xC7, 0x00, 0x3C, 0x70, + 0x03, 0xCE, 0x00, 0x3C, 0xE0, 0x07, 0x8E, 0x00, 0x78, 0xE0, 0x07, 0x8E, + 0x00, 0xF8, 0xF0, 0x1F, 0x87, 0x87, 0xF0, 0x7F, 0xF7, 0x03, 0xFE, 0x70, + 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0E, + 0x00, 0x01, 0xE0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x00, 0x1E, + 0x78, 0xE7, 0xC7, 0x7C, 0x3F, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00, + 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x07, 0x00, 0x38, 0x00, 0x01, 0xF8, 0x07, 0xFE, 0x0F, 0xFF, + 0x1E, 0x0F, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x00, 0x3C, 0x00, 0x3F, 0x80, + 0x1F, 0xF8, 0x07, 0xFC, 0x00, 0x7E, 0x00, 0x0E, 0xE0, 0x0E, 0xE0, 0x1E, + 0xF0, 0x3C, 0x7F, 0xF8, 0x7F, 0xF0, 0x1F, 0xC0, 0x0E, 0x03, 0x80, 0xE0, + 0x38, 0x7F, 0xDF, 0xEF, 0xF8, 0x70, 0x1C, 0x0E, 0x03, 0x80, 0xE0, 0x38, + 0x1E, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xFC, 0x3F, 0x07, + 0x80, 0x1C, 0x03, 0xC7, 0x00, 0xE1, 0xC0, 0x38, 0xF0, 0x0E, 0x38, 0x03, + 0x8E, 0x00, 0xE3, 0x80, 0x70, 0xE0, 0x1C, 0x78, 0x07, 0x1C, 0x01, 0xC7, + 0x00, 0x71, 0xC0, 0x3C, 0x70, 0x0E, 0x38, 0x07, 0x8E, 0x03, 0xE3, 0x81, + 0xF8, 0xFF, 0xFE, 0x1F, 0xFF, 0x03, 0xF1, 0xC0, 0xE0, 0x07, 0xE0, 0x0F, + 0xE0, 0x0E, 0xE0, 0x1C, 0x70, 0x1C, 0x70, 0x38, 0x70, 0x38, 0x70, 0x70, + 0x70, 0xF0, 0x70, 0xE0, 0x71, 0xC0, 0x71, 0xC0, 0x33, 0x80, 0x3B, 0x80, + 0x3F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xE0, 0x1C, + 0x07, 0xE0, 0x3C, 0x0E, 0xE0, 0x3C, 0x0E, 0xE0, 0x7C, 0x1C, 0xE0, 0x7C, + 0x1C, 0xE0, 0xEC, 0x38, 0xE0, 0xEC, 0x38, 0x61, 0xCC, 0x70, 0x61, 0xCC, + 0x70, 0x63, 0x8C, 0xE0, 0x73, 0x8C, 0xE0, 0x77, 0x0C, 0xC0, 0x77, 0x0D, + 0xC0, 0x7E, 0x0D, 0x80, 0x7E, 0x0F, 0x80, 0x7C, 0x0F, 0x80, 0x7C, 0x0F, + 0x00, 0x78, 0x0F, 0x00, 0x78, 0x0E, 0x00, 0x0E, 0x00, 0xE1, 0xE0, 0x38, + 0x1C, 0x0E, 0x03, 0xC3, 0x80, 0x38, 0xE0, 0x07, 0xBC, 0x00, 0x77, 0x00, + 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1C, 0x00, 0x07, 0xC0, 0x01, 0xF8, 0x00, + 0x77, 0x80, 0x1E, 0x70, 0x07, 0x8F, 0x00, 0xE0, 0xE0, 0x38, 0x1C, 0x0E, + 0x01, 0xC3, 0x80, 0x38, 0x00, 0x0E, 0x00, 0x70, 0xF0, 0x0F, 0x07, 0x00, + 0xE0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x38, 0x07, 0x03, 0x80, 0x70, + 0x70, 0x07, 0x07, 0x00, 0x70, 0xE0, 0x03, 0x9E, 0x00, 0x39, 0xC0, 0x03, + 0xB8, 0x00, 0x3B, 0x80, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xE0, 0x00, + 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, + 0x07, 0x00, 0x00, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, + 0x00, 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x3F, 0xFF, 0x00, 0x01, 0xC0, 0x00, + 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x1C, + 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0x7F, 0xFE, 0x1F, 0xFF, 0xC3, 0xFF, 0xF8, 0x00, 0x00, + 0x70, 0x1F, 0x01, 0xF0, 0x3C, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x01, 0xE0, 0x3C, 0x0F, 0x80, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38, + 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xF8, 0x0F, 0x80, 0x78, + 0x00, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0C, 0x06, 0x03, + 0x01, 0x81, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x01, + 0x81, 0x80, 0xC0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x01, + 0x80, 0xC0, 0x00, 0x01, 0xE0, 0x1F, 0x01, 0xF0, 0x07, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, + 0x01, 0xE0, 0x0F, 0x00, 0x70, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0x00, 0x70, + 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0xC0, + 0xF8, 0x0F, 0x80, 0xE0, 0x00, 0x1C, 0x00, 0x3F, 0x00, 0x7F, 0x83, 0x63, + 0xC7, 0xC1, 0xFE, 0x00, 0xFC, 0x00, 0x78 }; + +const GFXglyph FreeSansOblique18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 10, 0, 1 }, // 0x20 ' ' + { 0, 9, 26, 10, 4, -25 }, // 0x21 '!' + { 30, 10, 9, 12, 6, -24 }, // 0x22 '"' + { 42, 21, 25, 19, 2, -24 }, // 0x23 '#' + { 108, 20, 31, 19, 2, -26 }, // 0x24 '$' + { 186, 26, 25, 31, 5, -24 }, // 0x25 '%' + { 268, 20, 25, 23, 3, -24 }, // 0x26 '&' + { 331, 4, 9, 7, 6, -24 }, // 0x27 ''' + { 336, 12, 33, 12, 4, -25 }, // 0x28 '(' + { 386, 12, 33, 12, -1, -24 }, // 0x29 ')' + { 436, 10, 10, 14, 6, -25 }, // 0x2A '*' + { 449, 18, 16, 20, 3, -15 }, // 0x2B '+' + { 485, 5, 8, 10, 2, -2 }, // 0x2C ',' + { 490, 9, 3, 12, 3, -10 }, // 0x2D '-' + { 494, 4, 4, 10, 3, -3 }, // 0x2E '.' + { 496, 15, 26, 10, 0, -25 }, // 0x2F '/' + { 545, 18, 25, 19, 3, -24 }, // 0x30 '0' + { 602, 10, 25, 19, 7, -24 }, // 0x31 '1' + { 634, 20, 25, 19, 2, -24 }, // 0x32 '2' + { 697, 19, 25, 19, 2, -24 }, // 0x33 '3' + { 757, 18, 25, 19, 2, -24 }, // 0x34 '4' + { 814, 20, 25, 19, 2, -24 }, // 0x35 '5' + { 877, 19, 25, 19, 3, -24 }, // 0x36 '6' + { 937, 18, 25, 19, 5, -24 }, // 0x37 '7' + { 994, 19, 25, 19, 3, -24 }, // 0x38 '8' + { 1054, 19, 25, 19, 2, -24 }, // 0x39 '9' + { 1114, 7, 19, 10, 4, -18 }, // 0x3A ':' + { 1131, 8, 24, 10, 3, -18 }, // 0x3B ';' + { 1155, 19, 17, 20, 3, -16 }, // 0x3C '<' + { 1196, 18, 9, 20, 3, -12 }, // 0x3D '=' + { 1217, 19, 17, 20, 2, -15 }, // 0x3E '>' + { 1258, 16, 26, 19, 6, -25 }, // 0x3F '?' + { 1310, 33, 31, 36, 3, -25 }, // 0x40 '@' + { 1438, 23, 26, 23, 0, -25 }, // 0x41 'A' + { 1513, 21, 26, 23, 3, -25 }, // 0x42 'B' + { 1582, 22, 26, 25, 4, -25 }, // 0x43 'C' + { 1654, 23, 26, 25, 3, -25 }, // 0x44 'D' + { 1729, 23, 26, 23, 3, -25 }, // 0x45 'E' + { 1804, 22, 26, 21, 3, -25 }, // 0x46 'F' + { 1876, 24, 26, 27, 4, -25 }, // 0x47 'G' + { 1954, 25, 26, 25, 3, -25 }, // 0x48 'H' + { 2036, 8, 26, 10, 4, -25 }, // 0x49 'I' + { 2062, 18, 26, 18, 2, -25 }, // 0x4A 'J' + { 2121, 25, 26, 23, 3, -25 }, // 0x4B 'K' + { 2203, 16, 26, 19, 3, -25 }, // 0x4C 'L' + { 2255, 29, 26, 30, 3, -25 }, // 0x4D 'M' + { 2350, 25, 26, 26, 3, -25 }, // 0x4E 'N' + { 2432, 24, 26, 27, 4, -25 }, // 0x4F 'O' + { 2510, 22, 26, 23, 3, -25 }, // 0x50 'P' + { 2582, 25, 28, 27, 4, -25 }, // 0x51 'Q' + { 2670, 23, 26, 25, 3, -25 }, // 0x52 'R' + { 2745, 22, 26, 23, 3, -25 }, // 0x53 'S' + { 2817, 20, 26, 21, 6, -25 }, // 0x54 'T' + { 2882, 24, 26, 25, 4, -25 }, // 0x55 'U' + { 2960, 21, 26, 23, 6, -25 }, // 0x56 'V' + { 3029, 32, 26, 33, 6, -25 }, // 0x57 'W' + { 3133, 27, 26, 23, 1, -25 }, // 0x58 'X' + { 3221, 23, 26, 24, 6, -25 }, // 0x59 'Y' + { 3296, 25, 26, 21, 1, -25 }, // 0x5A 'Z' + { 3378, 13, 33, 10, 1, -25 }, // 0x5B '[' + { 3432, 4, 26, 10, 5, -25 }, // 0x5C '\' + { 3445, 13, 33, 10, -1, -24 }, // 0x5D ']' + { 3499, 14, 14, 16, 3, -24 }, // 0x5E '^' + { 3524, 21, 2, 19, -2, 5 }, // 0x5F '_' + { 3530, 6, 5, 12, 6, -25 }, // 0x60 '`' + { 3534, 18, 19, 19, 2, -18 }, // 0x61 'a' + { 3577, 19, 26, 20, 2, -25 }, // 0x62 'b' + { 3639, 16, 19, 18, 3, -18 }, // 0x63 'c' + { 3677, 20, 26, 20, 3, -25 }, // 0x64 'd' + { 3742, 17, 19, 19, 3, -18 }, // 0x65 'e' + { 3783, 11, 26, 9, 2, -25 }, // 0x66 'f' + { 3819, 19, 27, 19, 2, -18 }, // 0x67 'g' + { 3884, 18, 26, 19, 2, -25 }, // 0x68 'h' + { 3943, 8, 26, 8, 2, -25 }, // 0x69 'i' + { 3969, 14, 34, 8, -2, -25 }, // 0x6A 'j' + { 4029, 19, 26, 18, 2, -25 }, // 0x6B 'k' + { 4091, 8, 26, 8, 2, -25 }, // 0x6C 'l' + { 4117, 27, 19, 29, 2, -18 }, // 0x6D 'm' + { 4182, 18, 19, 19, 2, -18 }, // 0x6E 'n' + { 4225, 17, 19, 19, 3, -18 }, // 0x6F 'o' + { 4266, 21, 26, 20, 0, -18 }, // 0x70 'p' + { 4335, 20, 27, 19, 2, -18 }, // 0x71 'q' + { 4403, 13, 19, 11, 2, -18 }, // 0x72 'r' + { 4434, 16, 19, 18, 2, -18 }, // 0x73 's' + { 4472, 10, 23, 9, 3, -22 }, // 0x74 't' + { 4501, 18, 19, 19, 3, -18 }, // 0x75 'u' + { 4544, 16, 19, 17, 4, -18 }, // 0x76 'v' + { 4582, 24, 19, 25, 4, -18 }, // 0x77 'w' + { 4639, 19, 19, 17, 1, -18 }, // 0x78 'x' + { 4685, 20, 27, 17, 0, -18 }, // 0x79 'y' + { 4753, 19, 19, 17, 1, -18 }, // 0x7A 'z' + { 4799, 12, 33, 12, 3, -25 }, // 0x7B '{' + { 4849, 9, 33, 9, 2, -25 }, // 0x7C '|' + { 4887, 12, 33, 12, 0, -24 }, // 0x7D '}' + { 4937, 16, 7, 20, 5, -15 } }; // 0x7E '~' + +const GFXfont FreeSansOblique18pt7b PROGMEM = { + (uint8_t *)FreeSansOblique18pt7bBitmaps, + (GFXglyph *)FreeSansOblique18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 5623 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique24pt7b.h new file mode 100644 index 0000000..4c8c8ab --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique24pt7b.h @@ -0,0 +1,840 @@ +const uint8_t FreeSansOblique24pt7bBitmaps[] PROGMEM = { + 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x1E, 0x00, 0x78, + 0x7B, 0xC3, 0xDE, 0x1F, 0xE1, 0xEF, 0x0F, 0x78, 0x7B, 0xC3, 0xDC, 0x1C, + 0xE0, 0xE7, 0x07, 0x30, 0x31, 0x81, 0x80, 0x00, 0x07, 0x81, 0xC0, 0x00, + 0x78, 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0xF0, 0x38, 0x00, 0x0E, 0x07, + 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xC0, 0xF0, 0x00, + 0x3C, 0x0E, 0x00, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, + 0xFE, 0x00, 0x70, 0x3C, 0x00, 0x0F, 0x03, 0x80, 0x00, 0xF0, 0x78, 0x00, + 0x0E, 0x07, 0x80, 0x01, 0xE0, 0x70, 0x00, 0x1C, 0x0F, 0x00, 0x03, 0xC0, + 0xE0, 0x00, 0x3C, 0x1E, 0x00, 0x03, 0x81, 0xE0, 0x0F, 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0xE0, 0x0F, 0x03, 0x80, 0x00, 0xE0, + 0x78, 0x00, 0x1E, 0x07, 0x00, 0x01, 0xC0, 0xF0, 0x00, 0x1C, 0x0F, 0x00, + 0x03, 0xC0, 0xE0, 0x00, 0x38, 0x1E, 0x00, 0x07, 0x81, 0xC0, 0x00, 0x78, + 0x3C, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0x00, 0x7F, + 0xFF, 0xE0, 0x1F, 0x18, 0xF8, 0x0F, 0x8E, 0x1F, 0x07, 0xC3, 0x83, 0xC1, + 0xE0, 0xE0, 0xF0, 0x70, 0x38, 0x3C, 0x3C, 0x0C, 0x0F, 0x0F, 0x07, 0x00, + 0x03, 0xC1, 0xC0, 0x00, 0xF0, 0x70, 0x00, 0x3E, 0x1C, 0x00, 0x0F, 0xE6, + 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xE0, 0x00, + 0x3F, 0xFC, 0x00, 0x03, 0xFF, 0x80, 0x01, 0xC7, 0xF0, 0x00, 0x70, 0x7C, + 0x00, 0x1C, 0x0F, 0x00, 0x06, 0x03, 0xCF, 0x03, 0x80, 0xF3, 0xC0, 0xE0, + 0x3C, 0xF0, 0x38, 0x0E, 0x3C, 0x0E, 0x07, 0x8F, 0x03, 0x01, 0xE3, 0xE1, + 0xC0, 0xF0, 0xF8, 0x70, 0x78, 0x1F, 0x9C, 0xFC, 0x03, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x80, 0x1F, 0x00, 0x00, 0x70, 0x07, 0xFC, 0x00, 0x0E, + 0x00, 0xFF, 0xE0, 0x01, 0xC0, 0x1E, 0x1E, 0x00, 0x3C, 0x03, 0x80, 0xF0, + 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0E, 0x00, 0xE0, + 0x07, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x3C, 0x00, 0xE0, 0x0E, 0x03, 0x80, + 0x0E, 0x00, 0xE0, 0x70, 0x00, 0xF0, 0x1C, 0x0E, 0x00, 0x07, 0x87, 0xC1, + 0xE0, 0x00, 0x7F, 0xF8, 0x1C, 0x00, 0x03, 0xFE, 0x03, 0x80, 0x00, 0x0F, + 0x80, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x1F, + 0x00, 0x00, 0x1C, 0x07, 0xFC, 0x00, 0x03, 0x80, 0xFF, 0xE0, 0x00, 0x70, + 0x1E, 0x1E, 0x00, 0x0F, 0x03, 0x80, 0xF0, 0x00, 0xE0, 0x70, 0x07, 0x00, + 0x1C, 0x07, 0x00, 0x70, 0x03, 0x80, 0xE0, 0x07, 0x00, 0x70, 0x0E, 0x00, + 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1C, 0x00, + 0xF0, 0x1C, 0x03, 0x80, 0x07, 0x87, 0xC0, 0x70, 0x00, 0x7F, 0xF8, 0x07, + 0x00, 0x03, 0xFE, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, + 0x03, 0xFF, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x78, 0x0F, + 0x00, 0x1E, 0x03, 0xC0, 0x0F, 0x00, 0xF0, 0x03, 0xC0, 0x3C, 0x00, 0xF0, + 0x1E, 0x00, 0x3C, 0x07, 0x80, 0x0F, 0x87, 0xC0, 0x01, 0xE3, 0xE0, 0x00, + 0x7F, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x03, 0xFC, 0x00, + 0x03, 0xFF, 0x00, 0x01, 0xFB, 0xE0, 0x70, 0xF8, 0x7C, 0x1C, 0x7C, 0x1F, + 0x0E, 0x3C, 0x03, 0xE3, 0x9E, 0x00, 0x79, 0xE7, 0x80, 0x1F, 0xF3, 0xC0, + 0x03, 0xF8, 0xF0, 0x00, 0xFE, 0x3C, 0x00, 0x1F, 0x0F, 0x00, 0x07, 0xC3, + 0xE0, 0x03, 0xF8, 0xF8, 0x03, 0xFE, 0x3F, 0x83, 0xF7, 0xC7, 0xFF, 0xF8, + 0xF0, 0xFF, 0xFC, 0x3E, 0x1F, 0xFC, 0x07, 0x81, 0xFC, 0x00, 0x00, 0x7B, + 0xDF, 0xEF, 0x7B, 0xDC, 0xE7, 0x31, 0x80, 0x00, 0x0E, 0x00, 0x38, 0x00, + 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, + 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, + 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, + 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x07, + 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, + 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x07, 0x00, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x18, 0xE3, + 0x7B, 0xBF, 0xFF, 0xF3, 0xFF, 0x01, 0xE0, 0x1F, 0xC0, 0xF7, 0x07, 0x9E, + 0x1C, 0x38, 0x20, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x78, + 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, + 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3E, 0x7C, 0xF9, 0xE7, + 0xC1, 0x83, 0x0C, 0x18, 0x63, 0xC6, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x7D, 0xF7, 0xBE, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, + 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, 0x0C, + 0x00, 0x00, 0xE0, 0x00, 0x06, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00, + 0x38, 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, + 0x00, 0x60, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x00, 0x01, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00, + 0x60, 0x00, 0x07, 0x00, 0x00, 0x30, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, + 0xE0, 0x3F, 0x0F, 0xC0, 0xF8, 0x07, 0x81, 0xE0, 0x0F, 0x87, 0x80, 0x0F, + 0x1F, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x79, 0xE0, 0x00, 0xF3, + 0xC0, 0x01, 0xE7, 0x80, 0x07, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78, + 0x00, 0x3C, 0xF0, 0x00, 0x79, 0xE0, 0x00, 0xF7, 0x80, 0x03, 0xEF, 0x00, + 0x07, 0xDE, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x7C, 0xF0, 0x00, + 0xF1, 0xE0, 0x03, 0xE3, 0xC0, 0x07, 0x87, 0xC0, 0x1F, 0x0F, 0x80, 0x7C, + 0x0F, 0xC3, 0xF0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x1F, 0xFC, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x18, 0x01, 0xC0, 0x1C, 0x01, 0xE0, 0x1F, 0x0F, + 0xFB, 0xFF, 0xDF, 0xFC, 0xFF, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x00, 0x00, 0x03, 0xFC, + 0x00, 0x03, 0xFF, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xE0, 0x0F, + 0xC0, 0xFC, 0x03, 0xE0, 0x07, 0xC0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x0F, + 0x03, 0xC0, 0x01, 0xE0, 0xF8, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x80, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xFF, + 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x3F, + 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x1F, 0x00, 0x1E, 0x0F, + 0x00, 0x0F, 0x0F, 0x80, 0x07, 0x87, 0x80, 0x03, 0xC0, 0x00, 0x03, 0xC0, + 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0xE0, + 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1E, 0x78, 0x00, 0x1E, 0x3C, 0x00, + 0x0F, 0x1E, 0x00, 0x0F, 0x0F, 0x80, 0x1F, 0x83, 0xF0, 0x3F, 0x81, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x03, 0xFC, 0x00, 0x07, 0xBC, + 0x00, 0x0F, 0xBC, 0x00, 0x1F, 0x7C, 0x00, 0x3E, 0x78, 0x00, 0x7C, 0x78, + 0x00, 0xF8, 0x78, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x03, 0xC0, 0xF0, + 0x07, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x1E, 0x01, 0xF0, 0x3C, 0x01, 0xE0, + 0x78, 0x01, 0xE0, 0x7F, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, + 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x03, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0xE0, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC7, 0xE0, 0x00, 0xF7, 0xFF, 0x80, 0x1F, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0x80, 0xFE, 0x03, 0xF0, 0x1F, 0x00, 0x3F, + 0x03, 0xC0, 0x03, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x7C, 0x00, + 0x3C, 0x0F, 0x80, 0x0F, 0x80, 0xFC, 0x07, 0xE0, 0x1F, 0xFF, 0xF8, 0x01, + 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xFE, 0x01, 0xF8, + 0x3E, 0x03, 0xE0, 0x1F, 0x07, 0xC0, 0x1F, 0x0F, 0x80, 0x0F, 0x0F, 0x00, + 0x0F, 0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x1F, + 0x80, 0x3C, 0x7F, 0xE0, 0x3D, 0xFF, 0xF0, 0x7B, 0xFF, 0xF8, 0x7F, 0xC1, + 0xF8, 0x7F, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0xFC, 0x00, 0x3C, 0xF8, 0x00, + 0x3C, 0xF8, 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0xF0, 0x00, 0x38, 0xF0, 0x00, + 0x78, 0xF0, 0x00, 0x78, 0xF0, 0x00, 0xF0, 0xF8, 0x01, 0xF0, 0x7C, 0x03, + 0xE0, 0x7E, 0x0F, 0xC0, 0x3F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, + 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, + 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xFE, 0x00, 0x1F, + 0xFF, 0x80, 0x1F, 0xFF, 0xE0, 0x1F, 0x81, 0xF8, 0x1F, 0x00, 0x7C, 0x0F, + 0x00, 0x1E, 0x0F, 0x00, 0x0F, 0x07, 0x80, 0x07, 0x83, 0xC0, 0x03, 0xC1, + 0xE0, 0x03, 0xC0, 0xF8, 0x03, 0xC0, 0x7E, 0x07, 0xC0, 0x1F, 0xFF, 0xC0, + 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xE0, 0x07, 0xFF, 0xF8, 0x07, 0xE0, 0x7E, + 0x07, 0xC0, 0x0F, 0x07, 0x80, 0x07, 0xC7, 0xC0, 0x01, 0xE3, 0xC0, 0x00, + 0xF3, 0xC0, 0x00, 0x79, 0xE0, 0x00, 0x3C, 0xF0, 0x00, 0x1C, 0x78, 0x00, + 0x1E, 0x3C, 0x00, 0x0F, 0x1F, 0x00, 0x0F, 0x0F, 0xC0, 0x0F, 0x83, 0xF0, + 0x3F, 0x81, 0xFF, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xFC, + 0x03, 0xFF, 0xFC, 0x07, 0xF0, 0x7E, 0x07, 0xC0, 0x3E, 0x0F, 0x80, 0x1F, + 0x0F, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x0F, + 0x3C, 0x00, 0x0F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0x3C, 0x00, 0x3F, + 0x3E, 0x00, 0x7E, 0x3E, 0x00, 0xFE, 0x1F, 0x83, 0xFE, 0x1F, 0xFF, 0xFE, + 0x0F, 0xFF, 0xBC, 0x07, 0xFE, 0x3C, 0x01, 0xF8, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x78, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF0, 0xF0, 0x01, 0xF0, + 0xF0, 0x03, 0xE0, 0xF8, 0x07, 0xC0, 0xFC, 0x1F, 0xC0, 0x7F, 0xFF, 0x80, + 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xC1, 0xF0, + 0x78, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, + 0x07, 0x83, 0xE0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x0F, 0x03, 0xE0, 0x7C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x7C, 0x0F, + 0x81, 0xE0, 0x7C, 0x01, 0x80, 0x30, 0x0C, 0x01, 0x80, 0x60, 0x3C, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0xFE, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x00, + 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0E, + 0x00, 0x00, 0x00, 0x80, 0x1F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xE3, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, + 0xC7, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF8, 0x04, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0xC0, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x01, + 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x3F, 0xF8, 0x0F, 0xFF, 0xC1, 0xFF, 0xFE, 0x1F, 0x03, 0xE3, 0xE0, + 0x1F, 0x7C, 0x00, 0xF7, 0x80, 0x0F, 0x78, 0x00, 0xFF, 0x00, 0x0F, 0xF0, + 0x01, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x0F, 0x80, + 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x3E, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x7F, 0xE0, 0x0F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, + 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, + 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0xF8, + 0x00, 0xFC, 0x00, 0x3E, 0x0F, 0x80, 0x1F, 0xF9, 0xE1, 0xF0, 0x78, 0x03, + 0xFF, 0xCF, 0x07, 0x87, 0xC0, 0x3F, 0x0F, 0xF0, 0x3C, 0x7C, 0x03, 0xE0, + 0x3F, 0x01, 0xE3, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0x3E, 0x03, 0xE0, 0x0F, + 0x80, 0x79, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xDF, 0x01, 0xE0, 0x03, 0xC0, + 0x3E, 0xF0, 0x1F, 0x00, 0x3E, 0x01, 0xE7, 0x80, 0xF0, 0x01, 0xE0, 0x0F, + 0x38, 0x07, 0x80, 0x0F, 0x00, 0xFB, 0xC0, 0x78, 0x00, 0xF0, 0x07, 0x9E, + 0x03, 0xC0, 0x07, 0x80, 0x7C, 0xF0, 0x1E, 0x00, 0x78, 0x07, 0xC7, 0x80, + 0xF0, 0x07, 0xC0, 0x7E, 0x3C, 0x07, 0x80, 0x7C, 0x07, 0xE1, 0xE0, 0x3E, + 0x07, 0xE0, 0x7E, 0x0F, 0x00, 0xF8, 0x7F, 0x8F, 0xC0, 0x7C, 0x07, 0xFF, + 0x7F, 0xFC, 0x01, 0xE0, 0x1F, 0xF1, 0xFF, 0x80, 0x0F, 0x00, 0x7E, 0x0F, + 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x1E, + 0x7C, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x03, 0xC7, 0xC0, 0x00, 0x0F, 0x1F, + 0x00, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x03, 0xE0, + 0x00, 0x78, 0x0F, 0x80, 0x01, 0xE0, 0x3E, 0x00, 0x0F, 0x00, 0xF8, 0x00, + 0x3C, 0x03, 0xE0, 0x01, 0xE0, 0x0F, 0x80, 0x0F, 0x80, 0x1E, 0x00, 0x3C, + 0x00, 0x7C, 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0xFC, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x03, + 0xC0, 0xF8, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0xF8, + 0xF8, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x3E, 0xF8, + 0x00, 0x00, 0x7B, 0xE0, 0x00, 0x01, 0xF0, 0x01, 0xFF, 0xFF, 0x00, 0x0F, + 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFC, 0x03, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, + 0x1F, 0x81, 0xE0, 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0x78, 0x00, 0x0F, + 0x03, 0xC0, 0x00, 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x3C, 0x0F, + 0x00, 0x01, 0xE0, 0x78, 0x00, 0x1E, 0x07, 0xC0, 0x03, 0xE0, 0x3F, 0xFF, + 0xFC, 0x01, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE, + 0x07, 0x80, 0x01, 0xF0, 0x3C, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, + 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x07, 0x87, 0x80, 0x00, 0x3C, 0x3C, 0x00, + 0x01, 0xE1, 0xE0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x0F, + 0x87, 0x80, 0x00, 0xF8, 0x3C, 0x00, 0x1F, 0x81, 0xFF, 0xFF, 0xF8, 0x1F, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F, + 0xFF, 0xFC, 0x00, 0xFE, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x3E, 0x00, + 0x07, 0x81, 0xF0, 0x00, 0x1E, 0x07, 0x80, 0x00, 0x3C, 0x3C, 0x00, 0x00, + 0xF1, 0xF0, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xF3, 0xC0, 0x00, 0x07, + 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x07, 0xC1, + 0xF0, 0x00, 0x3E, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0xE0, 0x3F, 0x80, 0x1F, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, + 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0x3F, 0x80, 0x78, 0x00, + 0x1F, 0x80, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x1E, 0x07, 0xC0, 0x00, + 0x3E, 0x0F, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, + 0xF0, 0xF8, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x07, + 0x87, 0x80, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0x78, + 0x7C, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x01, 0xE1, 0xE0, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x78, 0x3C, + 0x00, 0x01, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x0F, 0x03, 0xE0, + 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF8, 0x0F, 0x00, 0x0F, 0xE0, 0x1F, 0xFF, + 0xFF, 0x80, 0x7F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x03, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, + 0xFF, 0xF0, 0x1F, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x07, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0xFF, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, 0xF0, 0x1F, 0xFF, + 0xFF, 0xC0, 0xFF, 0xFF, 0xFE, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFF, + 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, + 0xF0, 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xC0, 0x00, 0x01, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, + 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xC0, 0x00, 0xF8, 0x0F, + 0xC0, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x07, 0x87, + 0xC0, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xFF, + 0xBC, 0x00, 0x0F, 0xFF, 0xDE, 0x00, 0x0F, 0xFF, 0xEF, 0x00, 0x07, 0xFF, + 0xF7, 0x80, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x00, 0x39, 0xE0, 0x00, 0x00, + 0x3C, 0xF0, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x00, + 0x0F, 0x8F, 0x00, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x0F, 0xC3, 0xF0, 0x00, + 0x0F, 0xE0, 0xFC, 0x00, 0x1F, 0xF0, 0x7F, 0x80, 0x7F, 0x78, 0x1F, 0xFF, + 0xFE, 0x38, 0x03, 0xFF, 0xFE, 0x1C, 0x00, 0xFF, 0xFC, 0x0E, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x03, 0xC0, + 0x78, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01, 0xF0, 0x3E, 0x00, 0x00, 0xF0, + 0x1E, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x07, + 0x80, 0xF0, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x01, + 0xF0, 0x3C, 0x00, 0x00, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0xFF, 0xFF, + 0xFC, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x00, + 0x0F, 0x01, 0xE0, 0x00, 0x07, 0x81, 0xF0, 0x00, 0x07, 0xC0, 0xF8, 0x00, + 0x03, 0xE0, 0x78, 0x00, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0xF0, 0x1E, 0x00, + 0x00, 0x78, 0x1F, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0x80, + 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x0F, 0x81, 0xF0, + 0x00, 0x07, 0xC0, 0xF0, 0x00, 0x03, 0xC0, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81, 0xF0, 0x3E, 0x07, + 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x03, 0xC0, 0x78, 0x1F, 0x03, + 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x7C, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0x81, + 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xC0, 0xF8, 0x1E, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, + 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0xF0, + 0x01, 0xE0, 0x78, 0x00, 0xF0, 0x78, 0x00, 0xF8, 0x3C, 0x00, 0x78, 0x1E, + 0x00, 0x3C, 0x0F, 0x00, 0x3E, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x7E, 0x00, + 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0xC0, 0x1E, 0x00, + 0x03, 0xE0, 0x0F, 0x80, 0x03, 0xF0, 0x03, 0xE0, 0x01, 0xF8, 0x00, 0xF0, + 0x00, 0xFC, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x07, + 0xC0, 0x3F, 0x00, 0x01, 0xE0, 0x1F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00, + 0x1E, 0x07, 0xC0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x03, 0xE3, 0xF0, 0x00, + 0x00, 0xF1, 0xFC, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x0F, 0x7F, 0xE0, + 0x00, 0x07, 0xFE, 0xF8, 0x00, 0x01, 0xFE, 0x1E, 0x00, 0x00, 0x7F, 0x07, + 0xC0, 0x00, 0x1F, 0x80, 0xF0, 0x00, 0x0F, 0xC0, 0x3E, 0x00, 0x03, 0xE0, + 0x07, 0x80, 0x00, 0xF0, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x78, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x07, 0x80, 0x00, 0xF8, + 0x03, 0xE0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, + 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x0F, + 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x7C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x3C, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xE0, + 0x01, 0xF8, 0x00, 0x00, 0x7E, 0x03, 0xF8, 0x00, 0x01, 0xFC, 0x0F, 0xF0, + 0x00, 0x03, 0xF8, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x3F, 0xC0, 0x00, 0x1F, + 0xC0, 0x7F, 0x80, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x00, 0xEF, 0x03, 0xFE, + 0x00, 0x03, 0xFE, 0x07, 0xBC, 0x00, 0x0F, 0x78, 0x0F, 0x3C, 0x00, 0x1E, + 0xF0, 0x1E, 0x78, 0x00, 0x79, 0xE0, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0xF9, + 0xE0, 0x03, 0xCF, 0x81, 0xE3, 0xC0, 0x07, 0x9E, 0x03, 0xC7, 0x80, 0x1E, + 0x3C, 0x07, 0x8F, 0x00, 0x38, 0x78, 0x1F, 0x1E, 0x00, 0xF0, 0xF0, 0x3C, + 0x1E, 0x03, 0xC3, 0xE0, 0x78, 0x3C, 0x07, 0x87, 0x80, 0xF0, 0x78, 0x1E, + 0x0F, 0x01, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, 0xC1, 0xE0, 0xF0, 0x7C, 0x0F, + 0x03, 0xC1, 0xE0, 0xF0, 0x1E, 0x07, 0x87, 0x81, 0xE0, 0x3C, 0x0F, 0x0E, + 0x03, 0xC0, 0x78, 0x0F, 0x3C, 0x07, 0x81, 0xF0, 0x1E, 0x70, 0x1F, 0x03, + 0xC0, 0x3D, 0xE0, 0x3C, 0x07, 0x80, 0x7F, 0x80, 0x78, 0x0F, 0x00, 0xFF, + 0x00, 0xF0, 0x3E, 0x01, 0xFC, 0x01, 0xE0, 0x78, 0x03, 0xF8, 0x07, 0xC0, + 0xF0, 0x07, 0xE0, 0x0F, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x01, 0xF0, + 0x00, 0x03, 0xC0, 0x7E, 0x00, 0x01, 0xF0, 0x3F, 0x80, 0x00, 0x78, 0x0F, + 0xE0, 0x00, 0x1E, 0x03, 0xFC, 0x00, 0x07, 0x80, 0xFF, 0x00, 0x03, 0xE0, + 0x3F, 0xE0, 0x00, 0xF0, 0x1F, 0xF8, 0x00, 0x3C, 0x07, 0x9E, 0x00, 0x0F, + 0x01, 0xE7, 0xC0, 0x03, 0xC0, 0x78, 0xF0, 0x01, 0xF0, 0x1E, 0x3E, 0x00, + 0x78, 0x0F, 0x87, 0x80, 0x1E, 0x03, 0xC1, 0xF0, 0x07, 0x80, 0xF0, 0x7C, + 0x01, 0xE0, 0x3C, 0x0F, 0x00, 0xF8, 0x1F, 0x03, 0xE0, 0x3C, 0x07, 0x80, + 0x78, 0x0F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x78, 0x07, 0xC1, 0xF0, 0x1E, + 0x00, 0xF8, 0x78, 0x0F, 0x80, 0x3E, 0x1E, 0x03, 0xC0, 0x07, 0x87, 0x80, + 0xF0, 0x01, 0xF1, 0xE0, 0x3C, 0x00, 0x3C, 0xF8, 0x0F, 0x00, 0x0F, 0xBC, + 0x07, 0xC0, 0x03, 0xEF, 0x01, 0xE0, 0x00, 0x7F, 0xC0, 0x78, 0x00, 0x1F, + 0xF0, 0x1E, 0x00, 0x03, 0xFC, 0x0F, 0x80, 0x00, 0xFE, 0x03, 0xC0, 0x00, + 0x1F, 0x80, 0xF0, 0x00, 0x07, 0xE0, 0x3C, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00, + 0x0F, 0xFF, 0xFF, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, + 0x0F, 0x80, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F, + 0x07, 0x80, 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00, + 0xF3, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, + 0x1E, 0xF0, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x07, 0xFC, 0x00, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x00, 0xFB, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, + 0x00, 0x3C, 0xF0, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x1E, 0x3E, 0x00, + 0x00, 0x1F, 0x0F, 0x00, 0x00, 0x1F, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xF0, + 0x00, 0x1F, 0x00, 0xFC, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x7F, 0x80, 0x1F, + 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, + 0x0F, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xE0, 0x3E, 0x00, 0x3F, 0x81, 0xE0, + 0x00, 0x7C, 0x0F, 0x00, 0x01, 0xE0, 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, + 0x78, 0x3C, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x00, 0x01, 0xE0, + 0xF8, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0xF8, 0x3C, 0x00, 0x0F, 0x81, 0xE0, + 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xFF, + 0x80, 0x3F, 0xFF, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, + 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x0F, 0xC0, 0x00, + 0xFC, 0x0F, 0x80, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x0F, 0x07, 0x80, 0x00, + 0x07, 0xC7, 0xC0, 0x00, 0x01, 0xE3, 0xC0, 0x00, 0x00, 0xF3, 0xC0, 0x00, + 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, 0x1E, 0xF0, 0x00, + 0x00, 0x0F, 0x78, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x00, 0x00, 0xF7, 0x80, + 0x00, 0x00, 0x7B, 0xC0, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x00, 0x3C, 0xF0, + 0x00, 0x00, 0x3C, 0x78, 0x00, 0x08, 0x3E, 0x3E, 0x00, 0x0E, 0x1E, 0x0F, + 0x00, 0x0F, 0x9F, 0x07, 0xC0, 0x07, 0xFF, 0x03, 0xF0, 0x01, 0xFF, 0x00, + 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xE0, + 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x7E, 0x00, 0x0F, 0xF0, 0x1F, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, + 0xC0, 0x07, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFE, + 0x03, 0xE0, 0x00, 0xFC, 0x0F, 0x00, 0x01, 0xF0, 0x3C, 0x00, 0x03, 0xC1, + 0xF0, 0x00, 0x0F, 0x07, 0xC0, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0xF0, 0x78, + 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00, 0x78, 0x3E, 0x00, + 0x03, 0xE0, 0xF0, 0x00, 0x1F, 0x03, 0xC0, 0x01, 0xF8, 0x0F, 0xFF, 0xFF, + 0xC0, 0x7F, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xF0, + 0x1E, 0x00, 0x07, 0xE0, 0xF8, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E, 0x0F, + 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xE0, 0xF0, 0x00, 0x07, 0x87, 0xC0, + 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0x0F, 0x07, 0x80, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x03, + 0xC3, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, + 0x00, 0x1F, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xC0, 0x1F, 0xC0, 0x7F, 0x01, + 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x0F, 0x07, 0x00, + 0x00, 0x78, 0x78, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0x1E, 0x1E, 0x00, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0xFF, 0xE0, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x0F, + 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x07, + 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3C, 0xF0, 0x00, 0x01, 0xE7, + 0x80, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x71, 0xE0, 0x00, 0x07, 0x8F, 0x00, + 0x00, 0x3C, 0x7C, 0x00, 0x03, 0xC1, 0xF0, 0x00, 0x7C, 0x0F, 0xE0, 0x1F, + 0xC0, 0x3F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xF8, 0x00, + 0x03, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0x7F, + 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x3C, 0x1E, + 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03, 0xC1, 0xE0, + 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x1F, 0x00, + 0x00, 0x7C, 0x3C, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x01, 0xE0, 0xF0, 0x00, + 0x03, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x00, 0x00, + 0x3C, 0x1E, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x03, + 0xE1, 0xF0, 0x00, 0x07, 0x83, 0xC0, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x1E, + 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x78, 0x00, 0x01, 0xE0, + 0xF0, 0x00, 0x03, 0xC1, 0xE0, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x1E, 0x07, + 0x80, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x07, 0xE0, 0x1F, + 0xC0, 0x7F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x79, 0xF0, 0x00, 0x07, 0xC7, 0x80, 0x00, + 0x3C, 0x3C, 0x00, 0x03, 0xE1, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x01, 0xF0, + 0x7C, 0x00, 0x0F, 0x03, 0xE0, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x80, 0x78, + 0x00, 0x78, 0x03, 0xC0, 0x07, 0xC0, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x03, + 0xE0, 0x07, 0xC0, 0x1E, 0x00, 0x3E, 0x01, 0xF0, 0x01, 0xF0, 0x0F, 0x00, + 0x07, 0x80, 0xF0, 0x00, 0x3C, 0x07, 0x80, 0x01, 0xE0, 0x78, 0x00, 0x0F, + 0x07, 0xC0, 0x00, 0x7C, 0x3C, 0x00, 0x03, 0xE3, 0xE0, 0x00, 0x1F, 0x1E, + 0x00, 0x00, 0xF9, 0xF0, 0x00, 0x03, 0xCF, 0x00, 0x00, 0x1E, 0xF0, 0x00, + 0x00, 0xF7, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF0, + 0x00, 0x1F, 0x00, 0x03, 0xDE, 0x00, 0x07, 0xE0, 0x00, 0xFB, 0xC0, 0x00, + 0xFC, 0x00, 0x1E, 0x78, 0x00, 0x3F, 0x80, 0x07, 0xCF, 0x00, 0x07, 0xF0, + 0x00, 0xF9, 0xE0, 0x01, 0xFE, 0x00, 0x3E, 0x3C, 0x00, 0x7F, 0xC0, 0x07, + 0xC7, 0x80, 0x0F, 0x78, 0x01, 0xF0, 0xF0, 0x03, 0xEF, 0x00, 0x3E, 0x1E, + 0x00, 0x79, 0xE0, 0x0F, 0x83, 0xC0, 0x1F, 0x3C, 0x01, 0xF0, 0x78, 0x03, + 0xC7, 0x80, 0x3C, 0x0F, 0x00, 0xF8, 0xF0, 0x0F, 0x80, 0xE0, 0x1E, 0x1E, + 0x01, 0xE0, 0x1C, 0x07, 0xC1, 0xC0, 0x7C, 0x03, 0x80, 0xF0, 0x3C, 0x0F, + 0x00, 0x70, 0x3E, 0x07, 0x83, 0xE0, 0x0E, 0x07, 0x80, 0xF0, 0x78, 0x01, + 0xC1, 0xF0, 0x1E, 0x1F, 0x00, 0x3C, 0x3C, 0x03, 0xC3, 0xE0, 0x07, 0x8F, + 0x80, 0x78, 0x78, 0x00, 0xF1, 0xE0, 0x0F, 0x1F, 0x00, 0x1E, 0x7C, 0x01, + 0xE3, 0xC0, 0x03, 0xCF, 0x00, 0x3C, 0xF8, 0x00, 0x7B, 0xE0, 0x07, 0x9E, + 0x00, 0x0F, 0x78, 0x00, 0xF7, 0xC0, 0x01, 0xFF, 0x00, 0x1E, 0xF0, 0x00, + 0x3F, 0xC0, 0x03, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0x00, 0xFE, + 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7C, + 0x00, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x01, 0xF0, 0x03, 0xE0, 0x00, 0x1F, 0x00, 0x7C, 0x00, 0x00, 0xF8, + 0x0F, 0x80, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x00, + 0x07, 0xC3, 0xE0, 0x00, 0x00, 0x7C, 0x7C, 0x00, 0x00, 0x03, 0xEF, 0x80, + 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x0F, 0xBE, 0x00, + 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x03, 0xE1, + 0xF0, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x0F, 0x80, 0xF8, 0x00, 0x01, + 0xF0, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x03, 0xF0, 0x00, + 0x1F, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x0F, 0xC0, 0x00, 0x0F, 0x80, 0xF8, + 0x00, 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x1F, 0x1F, 0x80, + 0x00, 0xF8, 0x3E, 0x00, 0x03, 0xE0, 0xF8, 0x00, 0x1F, 0x01, 0xF0, 0x00, + 0xF8, 0x07, 0xC0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x3E, 0x01, 0xF0, + 0x00, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x07, 0xC1, 0xF0, 0x00, + 0x0F, 0x0F, 0x80, 0x00, 0x3E, 0x7C, 0x00, 0x00, 0x79, 0xE0, 0x00, 0x01, + 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, + 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xC0, 0x1F, + 0xF0, 0x07, 0xFC, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, + 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x7F, 0xC0, 0x3F, 0xE0, 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0xE3, + 0x8E, 0x38, 0xE1, 0x86, 0x18, 0x61, 0x87, 0x1C, 0x71, 0xC7, 0x0C, 0x30, + 0xC3, 0x0C, 0x38, 0xE3, 0x8E, 0x38, 0x61, 0x86, 0x18, 0x61, 0xC7, 0x1C, + 0x71, 0xC0, 0x00, 0x7F, 0xC0, 0x1F, 0xF0, 0x07, 0xFC, 0x03, 0xFE, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x7F, 0x80, 0x3F, 0xE0, + 0x0F, 0xF8, 0x03, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x1F, 0x00, + 0x1F, 0xC0, 0x0E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x0E, + 0x03, 0x83, 0x83, 0x81, 0xC3, 0xC0, 0xE1, 0xC0, 0x71, 0xC0, 0x39, 0xE0, + 0x0E, 0xE0, 0x07, 0xF0, 0x03, 0xF0, 0x01, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0xF8, 0x78, 0x3C, 0x1C, 0x0E, 0x0E, 0x07, 0x00, + 0x1F, 0xE0, 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xF0, 0x7E, + 0x07, 0xE1, 0xF0, 0x07, 0xC3, 0xC0, 0x07, 0x80, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x07, 0xE0, 0x0F, 0xFF, + 0xC0, 0xFF, 0xFF, 0x07, 0xFF, 0x9E, 0x1F, 0xC0, 0x3C, 0x7C, 0x00, 0x78, + 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1F, 0x1E, + 0x00, 0x7E, 0x3F, 0x07, 0xFC, 0x3F, 0xFF, 0x7E, 0x7F, 0xFC, 0xFC, 0x7F, + 0xF0, 0xF8, 0x3F, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x83, 0xE0, 0x03, 0xC7, 0xFC, + 0x01, 0xEF, 0xFF, 0x00, 0xFF, 0xFF, 0xC0, 0xF7, 0x83, 0xF0, 0x7F, 0x00, + 0xF8, 0x3F, 0x00, 0x3E, 0x1F, 0x00, 0x0F, 0x1F, 0x80, 0x07, 0x8F, 0x80, + 0x03, 0xC7, 0x80, 0x01, 0xE3, 0xC0, 0x00, 0xF1, 0xE0, 0x00, 0x79, 0xF0, + 0x00, 0x3C, 0xF0, 0x00, 0x3C, 0x78, 0x00, 0x1E, 0x3C, 0x00, 0x0F, 0x1E, + 0x00, 0x0F, 0x9F, 0x00, 0x07, 0x8F, 0xC0, 0x07, 0xC7, 0xE0, 0x07, 0xC3, + 0xF8, 0x07, 0xC1, 0xFE, 0x0F, 0xC1, 0xEF, 0xFF, 0xE0, 0xF3, 0xFF, 0xC0, + 0x78, 0xFF, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x03, 0xFF, + 0x80, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x0F, 0xE0, 0xF8, 0x7E, 0x01, 0xF1, + 0xF0, 0x03, 0xCF, 0x80, 0x0F, 0x3C, 0x00, 0x3D, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x0F, 0x3C, + 0x00, 0x3C, 0xF8, 0x01, 0xE1, 0xF0, 0x0F, 0x87, 0xE0, 0xFC, 0x0F, 0xFF, + 0xE0, 0x3F, 0xFF, 0x00, 0x7F, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x3C, 0x00, 0x3F, 0x07, 0x80, 0x1F, 0xF8, 0xF0, 0x0F, 0xFF, 0x3E, 0x03, + 0xFF, 0xF7, 0x80, 0xFC, 0x1F, 0xF0, 0x3F, 0x00, 0xFE, 0x07, 0xC0, 0x0F, + 0xC1, 0xF0, 0x01, 0xF0, 0x3C, 0x00, 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xE0, + 0x00, 0x78, 0x3C, 0x00, 0x1F, 0x0F, 0x80, 0x03, 0xC1, 0xE0, 0x00, 0x78, + 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x7C, 0x1E, 0x00, + 0x0F, 0x03, 0xC0, 0x03, 0xE0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x1F, 0x80, + 0xF8, 0x07, 0xF0, 0x1F, 0x83, 0xFC, 0x03, 0xFF, 0xFF, 0x80, 0x3F, 0xFE, + 0xF0, 0x03, 0xFF, 0x1E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x80, + 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE, 0x0F, 0xC1, + 0xF0, 0x07, 0xC7, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, + 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xBF, 0xFF, 0xFF, 0x78, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x07, 0x80, 0x03, 0xCF, 0x80, 0x0F, 0x0F, 0x80, 0x3E, + 0x1F, 0x81, 0xF8, 0x1F, 0xFF, 0xE0, 0x1F, 0xFF, 0x80, 0x1F, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x00, 0x3E, 0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xE0, 0x3E, + 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x7F, 0xF0, 0xFF, 0xE3, + 0xFF, 0xC0, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x3E, + 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x80, 0x1E, 0x00, + 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x07, + 0xFE, 0x3C, 0x01, 0xFF, 0xE7, 0x00, 0xFF, 0xFE, 0xE0, 0x1F, 0x83, 0xFC, + 0x07, 0xC0, 0x3F, 0x81, 0xF0, 0x03, 0xF0, 0x3C, 0x00, 0x7C, 0x0F, 0x00, + 0x0F, 0x81, 0xE0, 0x01, 0xF0, 0x78, 0x00, 0x3E, 0x0F, 0x00, 0x07, 0xC1, + 0xE0, 0x00, 0xF0, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0xF8, 0x3C, 0x00, 0x1F, 0x07, 0x80, 0x03, 0xC0, 0xF0, 0x00, 0xF8, 0x1E, + 0x00, 0x3F, 0x03, 0xE0, 0x07, 0xE0, 0x3E, 0x01, 0xF8, 0x07, 0xE0, 0xFF, + 0x00, 0x7F, 0xFD, 0xE0, 0x0F, 0xFF, 0x3C, 0x00, 0xFF, 0xCF, 0x00, 0x07, + 0xE1, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x01, 0xE0, 0x03, 0xE0, + 0x3C, 0x00, 0xF8, 0x07, 0xE0, 0x7F, 0x00, 0x7F, 0xFF, 0xC0, 0x0F, 0xFF, + 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x78, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x83, 0xF0, 0x0F, + 0x1F, 0xF0, 0x1E, 0xFF, 0xF0, 0x3F, 0xFF, 0xE0, 0xFF, 0x87, 0xE1, 0xFC, + 0x07, 0xC3, 0xF0, 0x07, 0x87, 0xC0, 0x0F, 0x1F, 0x00, 0x1E, 0x3E, 0x00, + 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE1, 0xE0, 0x03, 0xC7, 0xC0, 0x07, + 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0x78, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x1E, + 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x01, + 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, + 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, + 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, + 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, + 0x78, 0x00, 0x3E, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x0F, 0xE0, 0x03, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x0F, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x03, 0xC0, 0x0F, 0x81, 0xE0, 0x0F, 0x80, + 0xF0, 0x0F, 0x80, 0xF0, 0x1F, 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x1F, 0x00, + 0x1E, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x0F, 0x1E, 0x00, 0x07, 0xBF, 0x80, + 0x03, 0xFF, 0xC0, 0x01, 0xFD, 0xE0, 0x01, 0xFC, 0xF8, 0x00, 0xFC, 0x3C, + 0x00, 0x7C, 0x1F, 0x00, 0x3C, 0x07, 0x80, 0x1E, 0x03, 0xC0, 0x1F, 0x01, + 0xF0, 0x0F, 0x00, 0x78, 0x07, 0x80, 0x3E, 0x03, 0xC0, 0x0F, 0x01, 0xE0, + 0x07, 0x81, 0xE0, 0x03, 0xE0, 0xF0, 0x00, 0xF0, 0x78, 0x00, 0x7C, 0x00, + 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF0, 0x1E, 0x00, 0x00, + 0x07, 0xE0, 0x1F, 0x80, 0xF9, 0xFF, 0x07, 0xFC, 0x0F, 0x3F, 0xF8, 0xFF, + 0xE0, 0xF7, 0xFF, 0x9F, 0xFF, 0x0F, 0xF0, 0xFF, 0xC3, 0xF0, 0xFC, 0x07, + 0xF8, 0x1F, 0x1F, 0x80, 0x3F, 0x00, 0xF1, 0xF0, 0x03, 0xE0, 0x0F, 0x1E, + 0x00, 0x3C, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0x00, + 0xF1, 0xE0, 0x07, 0x80, 0x0F, 0x3C, 0x00, 0x78, 0x01, 0xF3, 0xC0, 0x07, + 0x80, 0x1E, 0x3C, 0x00, 0x78, 0x01, 0xE3, 0xC0, 0x0F, 0x80, 0x1E, 0x3C, + 0x00, 0xF0, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x3C, 0x78, 0x00, 0xF0, 0x03, + 0xC7, 0x80, 0x0F, 0x00, 0x3C, 0x78, 0x01, 0xE0, 0x03, 0xC7, 0x80, 0x1E, + 0x00, 0x3C, 0xF8, 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x1E, 0x00, 0x78, 0xF0, + 0x01, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x07, 0xE0, 0x1F, + 0x3F, 0xF0, 0x3C, 0xFF, 0xF0, 0x7B, 0xFF, 0xE0, 0xFF, 0x07, 0xE1, 0xF8, + 0x07, 0xC7, 0xE0, 0x07, 0x8F, 0x80, 0x0F, 0x1F, 0x00, 0x1E, 0x3C, 0x00, + 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07, + 0x8F, 0x00, 0x0F, 0x1E, 0x00, 0x3E, 0x3C, 0x00, 0x78, 0xF0, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x0F, 0x8F, 0x00, 0x1E, 0x3E, + 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC0, 0x00, + 0x1F, 0x80, 0x01, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xC0, 0xFE, + 0x0F, 0xC1, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x00, 0x0F, 0x3C, 0x00, + 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0, 0x00, 0xF7, 0x80, 0x01, + 0xFE, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0x78, 0x00, 0x1E, 0xF0, 0x00, 0x3D, + 0xE0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x07, 0x8F, 0x80, 0x1F, 0x0F, + 0x80, 0x7C, 0x1F, 0x83, 0xF8, 0x1F, 0xFF, 0xE0, 0x3F, 0xFF, 0x00, 0x1F, + 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x3C, 0x7F, 0xE0, + 0x07, 0xBF, 0xFE, 0x01, 0xFF, 0xFF, 0xC0, 0x3D, 0xE0, 0xFC, 0x07, 0xF0, + 0x0F, 0x80, 0xFC, 0x00, 0xF8, 0x1F, 0x00, 0x0F, 0x07, 0xC0, 0x01, 0xE0, + 0xF8, 0x00, 0x3C, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x00, 0xF0, 0x78, 0x00, + 0x1E, 0x1F, 0x00, 0x03, 0xC3, 0xC0, 0x00, 0xF0, 0x78, 0x00, 0x1E, 0x0F, + 0x00, 0x03, 0xC3, 0xE0, 0x00, 0xF8, 0x7C, 0x00, 0x1E, 0x0F, 0x80, 0x07, + 0xC1, 0xF8, 0x01, 0xF0, 0x3F, 0x80, 0x7C, 0x0F, 0xF8, 0x3F, 0x81, 0xEF, + 0xFF, 0xE0, 0x3C, 0xFF, 0xF8, 0x07, 0x8F, 0xFC, 0x00, 0xF0, 0xFE, 0x00, + 0x3E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x3F, + 0xF8, 0xF0, 0x1F, 0xFF, 0x3C, 0x0F, 0xFF, 0xDF, 0x07, 0xE0, 0xFF, 0x83, + 0xE0, 0x1F, 0xE1, 0xF0, 0x03, 0xF8, 0x78, 0x00, 0xFE, 0x3C, 0x00, 0x1F, + 0x8F, 0x00, 0x07, 0xC7, 0x80, 0x01, 0xF1, 0xE0, 0x00, 0x7C, 0x78, 0x00, + 0x1F, 0x3C, 0x00, 0x0F, 0x8F, 0x00, 0x03, 0xE3, 0xC0, 0x00, 0xF8, 0xF0, + 0x00, 0x3E, 0x3C, 0x00, 0x1F, 0x8F, 0x00, 0x0F, 0xC3, 0xC0, 0x03, 0xF0, + 0xF8, 0x01, 0xFC, 0x1F, 0x00, 0xFF, 0x07, 0xE0, 0xFF, 0xC0, 0xFF, 0xFD, + 0xE0, 0x1F, 0xFE, 0x78, 0x03, 0xFF, 0x3E, 0x00, 0x3F, 0x0F, 0x80, 0x00, + 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x87, 0xCF, 0xC3, 0xCF, 0xE1, 0xEF, + 0xE0, 0xFF, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x3F, 0x80, 0x07, 0xFF, 0x00, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0xFC, + 0x1F, 0x87, 0x80, 0x3C, 0x7C, 0x01, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xFF, + 0xC0, 0x07, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xBC, + 0x00, 0x3D, 0xE0, 0x01, 0xEF, 0x00, 0x1F, 0x7C, 0x01, 0xF3, 0xF0, 0x1F, + 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0x80, 0xFF, 0xF0, 0x01, 0xFE, 0x00, 0x03, + 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC1, 0xFF, 0xEF, 0xFF, + 0x7F, 0xF0, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x07, 0xC0, 0x3C, 0x01, 0xE0, 0x0F, 0xF0, 0x7F, 0x81, + 0xF8, 0x07, 0xC0, 0x0F, 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x1E, + 0x1F, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x3C, + 0x1E, 0x00, 0x3C, 0x3E, 0x00, 0x3C, 0x3C, 0x00, 0x3C, 0x3C, 0x00, 0x3C, + 0x3C, 0x00, 0x7C, 0x3C, 0x00, 0x78, 0x78, 0x00, 0x78, 0x78, 0x00, 0x78, + 0x78, 0x00, 0x78, 0x78, 0x00, 0xF8, 0x78, 0x00, 0xF0, 0xF0, 0x01, 0xF0, + 0xF0, 0x03, 0xF0, 0xF0, 0x07, 0xF0, 0xF8, 0x1F, 0xF0, 0xFF, 0xFF, 0xE0, + 0x7F, 0xFD, 0xE0, 0x3F, 0xF1, 0xE0, 0x1F, 0xC0, 0x00, 0xF0, 0x00, 0x7F, + 0xC0, 0x01, 0xEF, 0x00, 0x0F, 0xBC, 0x00, 0x3C, 0x78, 0x01, 0xE1, 0xE0, + 0x07, 0x87, 0x80, 0x3C, 0x1E, 0x01, 0xF0, 0x78, 0x07, 0x81, 0xE0, 0x3E, + 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x80, 0x38, 0x1E, 0x00, 0xF0, 0xF0, 0x03, + 0xC7, 0xC0, 0x0F, 0x1E, 0x00, 0x3C, 0xF0, 0x00, 0xF3, 0xC0, 0x03, 0xDE, + 0x00, 0x07, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x07, 0xC0, 0x0F, 0x78, 0x03, + 0xE0, 0x0F, 0xBC, 0x03, 0xF0, 0x07, 0x9E, 0x01, 0xF8, 0x03, 0xCF, 0x00, + 0xFC, 0x03, 0xC7, 0x80, 0xFE, 0x01, 0xE3, 0xC0, 0x77, 0x01, 0xE0, 0xE0, + 0x7B, 0x80, 0xF0, 0x70, 0x39, 0xC0, 0xF0, 0x38, 0x3C, 0xE0, 0x78, 0x1C, + 0x1E, 0x78, 0x78, 0x0F, 0x1E, 0x3C, 0x3C, 0x07, 0x8F, 0x1E, 0x3C, 0x03, + 0xC7, 0x0F, 0x1E, 0x01, 0xE7, 0x87, 0x9E, 0x00, 0xF3, 0x81, 0xCF, 0x00, + 0x7B, 0xC0, 0xEF, 0x00, 0x3D, 0xC0, 0x77, 0x80, 0x1F, 0xE0, 0x3F, 0x80, + 0x0F, 0xF0, 0x1F, 0xC0, 0x07, 0xF0, 0x0F, 0xC0, 0x01, 0xF8, 0x07, 0xE0, + 0x00, 0xF8, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0xF0, + 0x00, 0x00, 0x03, 0xC0, 0x07, 0xC0, 0xF8, 0x01, 0xE0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x78, 0x00, 0xF0, 0x3C, 0x00, 0x3C, 0x1F, 0x00, 0x0F, 0x8F, + 0x80, 0x01, 0xE7, 0xC0, 0x00, 0x7D, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xF7, 0x80, 0x00, 0xF9, 0xF0, + 0x00, 0x3C, 0x3C, 0x00, 0x1E, 0x0F, 0x80, 0x0F, 0x01, 0xE0, 0x07, 0x80, + 0x7C, 0x03, 0xE0, 0x0F, 0x01, 0xF0, 0x03, 0xE0, 0xF8, 0x00, 0x78, 0x00, + 0x03, 0xC0, 0x01, 0xE0, 0x78, 0x00, 0x78, 0x0F, 0x00, 0x0F, 0x01, 0xE0, + 0x03, 0xC0, 0x3C, 0x00, 0x78, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0xC0, + 0x0F, 0x00, 0xF0, 0x01, 0xE0, 0x3C, 0x00, 0x3C, 0x07, 0x80, 0x07, 0x81, + 0xE0, 0x00, 0xF0, 0x3C, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xC0, 0x00, + 0x3C, 0x78, 0x00, 0x07, 0x9E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x1E, 0xF0, + 0x00, 0x03, 0xDE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xE0, + 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, + 0x00, 0x01, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, + 0x00, 0x01, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, + 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, + 0x00, 0x03, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xE0, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xFE, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x00, + 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00, + 0x78, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x70, + 0x07, 0x00, 0x60, 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x00, + 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, + 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, + 0x00, 0xE0, 0x06, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x0F, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x1E, + 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x1C, + 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xF0, + 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xE0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, + 0x0F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xFE, + 0x00, 0xCF, 0xFC, 0x0E, 0xE3, 0xF0, 0xE6, 0x07, 0xFF, 0x60, 0x0F, 0xF0, + 0x00, 0x1E, 0x00 }; + +const GFXglyph FreeSansOblique24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 13, 0, 1 }, // 0x20 ' ' + { 0, 11, 34, 13, 6, -33 }, // 0x21 '!' + { 47, 13, 12, 17, 8, -32 }, // 0x22 '"' + { 67, 28, 34, 26, 3, -32 }, // 0x23 '#' + { 186, 26, 42, 26, 3, -35 }, // 0x24 '$' + { 323, 36, 34, 42, 6, -32 }, // 0x25 '%' + { 476, 26, 34, 31, 4, -32 }, // 0x26 '&' + { 587, 5, 12, 9, 8, -32 }, // 0x27 ''' + { 595, 15, 44, 16, 5, -33 }, // 0x28 '(' + { 678, 15, 44, 16, 1, -33 }, // 0x29 ')' + { 761, 14, 13, 18, 8, -33 }, // 0x2A '*' + { 784, 23, 22, 27, 5, -20 }, // 0x2B '+' + { 848, 7, 12, 13, 3, -4 }, // 0x2C ',' + { 859, 12, 4, 16, 5, -14 }, // 0x2D '-' + { 865, 6, 5, 13, 4, -4 }, // 0x2E '.' + { 869, 21, 35, 13, -1, -33 }, // 0x2F '/' + { 961, 23, 34, 26, 5, -32 }, // 0x30 '0' + { 1059, 13, 33, 26, 10, -32 }, // 0x31 '1' + { 1113, 27, 33, 26, 2, -32 }, // 0x32 '2' + { 1225, 25, 34, 26, 3, -32 }, // 0x33 '3' + { 1332, 24, 33, 26, 3, -32 }, // 0x34 '4' + { 1431, 27, 34, 26, 3, -32 }, // 0x35 '5' + { 1546, 24, 34, 26, 4, -32 }, // 0x36 '6' + { 1648, 26, 33, 26, 6, -32 }, // 0x37 '7' + { 1756, 25, 34, 26, 3, -32 }, // 0x38 '8' + { 1863, 24, 34, 26, 4, -32 }, // 0x39 '9' + { 1965, 10, 25, 13, 5, -24 }, // 0x3A ':' + { 1997, 11, 32, 13, 4, -24 }, // 0x3B ';' + { 2041, 26, 23, 27, 4, -22 }, // 0x3C '<' + { 2116, 26, 12, 27, 3, -16 }, // 0x3D '=' + { 2155, 26, 23, 27, 2, -21 }, // 0x3E '>' + { 2230, 20, 35, 26, 9, -34 }, // 0x3F '?' + { 2318, 45, 42, 48, 4, -34 }, // 0x40 '@' + { 2555, 30, 34, 31, 1, -33 }, // 0x41 'A' + { 2683, 29, 34, 31, 4, -33 }, // 0x42 'B' + { 2807, 30, 36, 33, 5, -34 }, // 0x43 'C' + { 2942, 31, 34, 33, 4, -33 }, // 0x44 'D' + { 3074, 31, 34, 31, 4, -33 }, // 0x45 'E' + { 3206, 30, 34, 28, 4, -33 }, // 0x46 'F' + { 3334, 33, 36, 37, 5, -34 }, // 0x47 'G' + { 3483, 33, 34, 34, 4, -33 }, // 0x48 'H' + { 3624, 11, 34, 13, 5, -33 }, // 0x49 'I' + { 3671, 25, 35, 24, 2, -33 }, // 0x4A 'J' + { 3781, 34, 34, 31, 4, -33 }, // 0x4B 'K' + { 3926, 22, 34, 26, 4, -33 }, // 0x4C 'L' + { 4020, 39, 34, 40, 4, -33 }, // 0x4D 'M' + { 4186, 34, 34, 34, 4, -33 }, // 0x4E 'N' + { 4331, 33, 36, 36, 5, -34 }, // 0x4F 'O' + { 4480, 29, 34, 30, 4, -33 }, // 0x50 'P' + { 4604, 33, 38, 36, 5, -34 }, // 0x51 'Q' + { 4761, 30, 34, 33, 4, -33 }, // 0x52 'R' + { 4889, 29, 36, 31, 4, -34 }, // 0x53 'S' + { 5020, 28, 34, 29, 7, -33 }, // 0x54 'T' + { 5139, 31, 35, 34, 6, -33 }, // 0x55 'U' + { 5275, 29, 34, 30, 8, -33 }, // 0x56 'V' + { 5399, 43, 34, 44, 8, -33 }, // 0x57 'W' + { 5582, 36, 34, 31, 1, -33 }, // 0x58 'X' + { 5735, 30, 34, 32, 8, -33 }, // 0x59 'Y' + { 5863, 34, 34, 29, 1, -33 }, // 0x5A 'Z' + { 6008, 18, 44, 13, 1, -33 }, // 0x5B '[' + { 6107, 6, 35, 13, 7, -33 }, // 0x5C '\' + { 6134, 18, 44, 13, -1, -33 }, // 0x5D ']' + { 6233, 17, 18, 22, 6, -32 }, // 0x5E '^' + { 6272, 29, 2, 26, -3, 7 }, // 0x5F '_' + { 6280, 8, 7, 16, 8, -34 }, // 0x60 '`' + { 6287, 23, 27, 26, 3, -25 }, // 0x61 'a' + { 6365, 25, 35, 26, 3, -33 }, // 0x62 'b' + { 6475, 22, 27, 24, 4, -25 }, // 0x63 'c' + { 6550, 27, 35, 26, 4, -33 }, // 0x64 'd' + { 6669, 23, 27, 26, 4, -25 }, // 0x65 'e' + { 6747, 15, 34, 12, 3, -33 }, // 0x66 'f' + { 6811, 27, 36, 26, 2, -25 }, // 0x67 'g' + { 6933, 23, 34, 25, 3, -33 }, // 0x68 'h' + { 7031, 11, 34, 10, 3, -33 }, // 0x69 'i' + { 7078, 18, 44, 11, -2, -33 }, // 0x6A 'j' + { 7177, 25, 34, 24, 3, -33 }, // 0x6B 'k' + { 7284, 11, 34, 10, 3, -33 }, // 0x6C 'l' + { 7331, 36, 26, 38, 3, -25 }, // 0x6D 'm' + { 7448, 23, 26, 25, 3, -25 }, // 0x6E 'n' + { 7523, 23, 27, 26, 4, -25 }, // 0x6F 'o' + { 7601, 27, 36, 26, 1, -25 }, // 0x70 'p' + { 7723, 26, 36, 26, 3, -25 }, // 0x71 'q' + { 7840, 17, 26, 15, 3, -25 }, // 0x72 'r' + { 7896, 21, 27, 24, 3, -25 }, // 0x73 's' + { 7967, 13, 32, 12, 4, -30 }, // 0x74 't' + { 8019, 24, 26, 25, 4, -24 }, // 0x75 'u' + { 8097, 22, 25, 23, 6, -24 }, // 0x76 'v' + { 8166, 33, 25, 34, 6, -24 }, // 0x77 'w' + { 8270, 26, 25, 23, 1, -24 }, // 0x78 'x' + { 8352, 27, 35, 23, 0, -24 }, // 0x79 'y' + { 8471, 25, 25, 23, 1, -24 }, // 0x7A 'z' + { 8550, 16, 44, 16, 5, -33 }, // 0x7B '{' + { 8638, 12, 44, 12, 3, -33 }, // 0x7C '|' + { 8704, 16, 44, 16, -1, -33 }, // 0x7D '}' + { 8792, 21, 7, 27, 6, -19 } }; // 0x7E '~' + +const GFXfont FreeSansOblique24pt7b PROGMEM = { + (uint8_t *)FreeSansOblique24pt7bBitmaps, + (GFXglyph *)FreeSansOblique24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 9483 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique9pt7b.h new file mode 100644 index 0000000..18a6cbe --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSansOblique9pt7b.h @@ -0,0 +1,220 @@ +const uint8_t FreeSansOblique9pt7bBitmaps[] PROGMEM = { + 0x10, 0x84, 0x22, 0x10, 0x84, 0x42, 0x10, 0x08, 0x00, 0xDE, 0xE5, 0x20, + 0x06, 0x40, 0x88, 0x13, 0x06, 0x43, 0xFE, 0x32, 0x04, 0x40, 0x98, 0x32, + 0x1F, 0xF0, 0x98, 0x22, 0x04, 0xC0, 0x02, 0x01, 0xF8, 0x6B, 0x99, 0x33, + 0x40, 0x68, 0x0F, 0x00, 0xF8, 0x07, 0xC1, 0x1B, 0x23, 0x64, 0x4E, 0x98, + 0xFC, 0x04, 0x00, 0x80, 0x3C, 0x08, 0xCC, 0x23, 0x18, 0x86, 0x32, 0x0C, + 0x64, 0x19, 0x90, 0x1E, 0x40, 0x01, 0x1E, 0x02, 0x66, 0x09, 0x8C, 0x23, + 0x18, 0x86, 0x62, 0x07, 0x80, 0x0F, 0x06, 0x63, 0x18, 0xC6, 0x3F, 0x07, + 0x03, 0xC1, 0xB3, 0xC7, 0xB0, 0xCC, 0x33, 0x3E, 0x79, 0x80, 0xFA, 0x04, + 0x10, 0x60, 0x83, 0x04, 0x18, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x10, + 0x30, 0x20, 0x08, 0x18, 0x10, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x18, 0x30, + 0x41, 0x82, 0x0C, 0x10, 0x40, 0x19, 0x73, 0x16, 0x48, 0x04, 0x04, 0x02, + 0x1F, 0xF0, 0x80, 0x80, 0x40, 0x20, 0x6D, 0x28, 0xF0, 0xC0, 0x01, 0x02, + 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x0F, + 0x19, 0xC8, 0x6C, 0x36, 0x1A, 0x0F, 0x05, 0x86, 0xC3, 0x61, 0xB1, 0x9C, + 0x87, 0x80, 0x08, 0xCD, 0xE3, 0x18, 0xC4, 0x23, 0x18, 0xC4, 0x00, 0x07, + 0x83, 0x1C, 0x41, 0x98, 0x30, 0x06, 0x01, 0x80, 0x60, 0x38, 0x1C, 0x06, + 0x01, 0x80, 0x20, 0x0F, 0xF8, 0x0F, 0x86, 0x73, 0x0C, 0x83, 0x00, 0xC0, + 0x60, 0xE0, 0x06, 0x01, 0xB0, 0x6C, 0x13, 0x8C, 0x7C, 0x00, 0x00, 0x80, + 0xC0, 0xE0, 0xA0, 0x90, 0x98, 0x8C, 0x86, 0xFF, 0x81, 0x01, 0x80, 0xC0, + 0x60, 0x0F, 0xC3, 0x00, 0x40, 0x08, 0x03, 0x00, 0x7F, 0x1C, 0x70, 0x06, + 0x00, 0xC0, 0x1B, 0x06, 0x71, 0x87, 0xE0, 0x0F, 0x86, 0x73, 0x0D, 0x80, + 0x60, 0x1F, 0xCF, 0x3B, 0x86, 0xC1, 0xB0, 0x6C, 0x33, 0x98, 0x3C, 0x00, + 0x7F, 0xC0, 0x20, 0x10, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x60, 0x10, 0x0C, + 0x02, 0x01, 0x80, 0x40, 0x00, 0x0F, 0x86, 0x73, 0x0C, 0xC3, 0x30, 0xCC, + 0x61, 0xE1, 0x86, 0x41, 0xB0, 0x6C, 0x13, 0x8C, 0x3E, 0x00, 0x0F, 0x06, + 0x73, 0x0D, 0x83, 0x60, 0xD8, 0x77, 0x3C, 0xFE, 0x01, 0x80, 0x6C, 0x33, + 0x98, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x00, 0x00, + 0x0C, 0x62, 0x11, 0x00, 0x00, 0x01, 0xC3, 0x8F, 0x0C, 0x07, 0x00, 0xE0, + 0x1E, 0x01, 0x00, 0x7F, 0xC0, 0x00, 0x03, 0xFE, 0x40, 0x3C, 0x03, 0x80, + 0x70, 0x18, 0x78, 0xE1, 0xC0, 0x00, 0x00, 0x1F, 0x30, 0xD0, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFE, + 0x00, 0xC0, 0xE0, 0xC0, 0x18, 0x61, 0xD3, 0x31, 0x9C, 0xD8, 0xC2, 0x36, + 0x31, 0x8F, 0x18, 0x67, 0xC6, 0x11, 0xB1, 0x8C, 0xCC, 0x67, 0x63, 0x0E, + 0xF0, 0x60, 0x00, 0x1C, 0x00, 0x01, 0x81, 0x00, 0x1F, 0xC0, 0x01, 0xC0, + 0x1C, 0x03, 0xC0, 0x24, 0x06, 0x60, 0x46, 0x0C, 0x61, 0x86, 0x1F, 0xE3, + 0x06, 0x20, 0x26, 0x03, 0x40, 0x30, 0x1F, 0xE1, 0x87, 0x30, 0x33, 0x03, + 0x30, 0x23, 0x06, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x0C, + 0x7F, 0x80, 0x07, 0xC1, 0x86, 0x30, 0x32, 0x03, 0x60, 0x04, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x6C, 0x06, 0xC0, 0xC6, 0x18, 0x3E, 0x00, 0x1F, 0xE0, + 0xC1, 0x84, 0x06, 0x60, 0x33, 0x01, 0x98, 0x0C, 0x80, 0x64, 0x02, 0x60, + 0x33, 0x01, 0x98, 0x18, 0x81, 0x87, 0xF0, 0x00, 0x1F, 0xF1, 0x80, 0x10, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x3F, 0xE2, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x04, 0x00, 0x7F, 0xC0, 0x1F, 0xF1, 0x80, 0x10, 0x03, 0x00, 0x30, 0x03, + 0x00, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x00, + 0x07, 0xE0, 0xE1, 0x8C, 0x06, 0xC0, 0x36, 0x00, 0x60, 0x03, 0x07, 0xF8, + 0x02, 0xC0, 0x36, 0x01, 0x98, 0x1C, 0xE1, 0xC1, 0xF2, 0x00, 0x18, 0x08, + 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18, 0x18, 0xFF, 0xC4, 0x06, 0x60, + 0x23, 0x01, 0x18, 0x18, 0x80, 0xC4, 0x06, 0x00, 0x33, 0x32, 0x26, 0x66, + 0x44, 0xCC, 0xC0, 0x00, 0xC0, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x30, + 0x0C, 0x03, 0x30, 0xCC, 0x63, 0x18, 0x7C, 0x00, 0x18, 0x18, 0x60, 0xC1, + 0x0E, 0x0C, 0x60, 0x33, 0x00, 0xD8, 0x03, 0xF0, 0x0C, 0xC0, 0x61, 0x81, + 0x86, 0x06, 0x0C, 0x10, 0x30, 0x40, 0x60, 0x18, 0x0C, 0x04, 0x06, 0x03, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x08, 0x07, 0xF8, 0x18, 0x06, + 0x18, 0x0E, 0x18, 0x0E, 0x34, 0x1E, 0x34, 0x36, 0x34, 0x34, 0x24, 0x64, + 0x24, 0x6C, 0x64, 0xCC, 0x64, 0x8C, 0x65, 0x88, 0x43, 0x08, 0x43, 0x18, + 0x18, 0x08, 0xE0, 0x47, 0x06, 0x6C, 0x33, 0x61, 0x99, 0x08, 0x8C, 0xC4, + 0x66, 0x61, 0xB3, 0x0D, 0x18, 0x38, 0x81, 0xC4, 0x06, 0x00, 0x07, 0xC0, + 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x36, 0x01, 0xB8, 0x18, 0xE1, 0x81, 0xF0, 0x00, 0x1F, 0xE1, 0x83, 0x10, + 0x33, 0x03, 0x30, 0x33, 0x06, 0x3F, 0xC2, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x04, 0x00, 0x40, 0x00, 0x07, 0xC0, 0xC3, 0x8C, 0x0E, 0xC0, 0x36, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x36, 0x09, 0xB8, 0x78, 0xE3, 0x81, + 0xF6, 0x00, 0x10, 0x1F, 0xF0, 0xC0, 0xC4, 0x06, 0x60, 0x33, 0x01, 0x18, + 0x18, 0xFF, 0x04, 0x0C, 0x60, 0x63, 0x03, 0x18, 0x18, 0x80, 0xC4, 0x06, + 0x00, 0x07, 0xC1, 0x87, 0x30, 0x33, 0x03, 0x30, 0x03, 0xC0, 0x0F, 0xC0, + 0x1E, 0x00, 0x6C, 0x06, 0xC0, 0x46, 0x0C, 0x3F, 0x00, 0xFF, 0xC3, 0x00, + 0xC0, 0x20, 0x18, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, 0x03, 0x00, 0xC0, + 0x20, 0x00, 0x30, 0x13, 0x03, 0x20, 0x36, 0x03, 0x60, 0x26, 0x06, 0x60, + 0x64, 0x06, 0xC0, 0x6C, 0x04, 0xC0, 0xCE, 0x18, 0x3E, 0x00, 0xC0, 0x78, + 0x0B, 0x03, 0x20, 0xC4, 0x18, 0xC6, 0x18, 0x83, 0x30, 0x64, 0x0D, 0x80, + 0xA0, 0x1C, 0x03, 0x00, 0xC1, 0x83, 0xC1, 0x83, 0xC3, 0x86, 0xC2, 0x86, + 0xC6, 0x84, 0xC4, 0x8C, 0xCC, 0xC8, 0xC8, 0xD8, 0xD8, 0xD0, 0xD0, 0xF0, + 0x70, 0xE0, 0x60, 0xE0, 0x60, 0xE0, 0x0C, 0x0C, 0x30, 0x60, 0x63, 0x01, + 0x98, 0x02, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x0C, 0x80, 0x33, 0x01, + 0x8C, 0x0C, 0x18, 0x60, 0x60, 0xC0, 0x66, 0x0C, 0x60, 0xC2, 0x18, 0x33, + 0x03, 0x60, 0x1C, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x00, 0x30, + 0x00, 0x1F, 0xF0, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, 0xFF, 0xC0, 0x0E, 0x10, 0x20, + 0x41, 0x02, 0x04, 0x08, 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0x20, 0xE0, + 0xAA, 0xA9, 0x55, 0x40, 0x0E, 0x08, 0x10, 0x20, 0x41, 0x02, 0x04, 0x08, + 0x20, 0x40, 0x81, 0x04, 0x08, 0x10, 0xE0, 0x0C, 0x18, 0x51, 0xA2, 0x4C, + 0x50, 0x80, 0xFF, 0xE0, 0xC8, 0x80, 0x0F, 0x86, 0x33, 0x0C, 0x03, 0x03, + 0xDF, 0xEE, 0x0B, 0x02, 0xC1, 0x9F, 0xE0, 0x10, 0x04, 0x01, 0x00, 0xDC, + 0x39, 0x88, 0x32, 0x0D, 0x83, 0x40, 0xD0, 0x64, 0x1B, 0x8C, 0xBC, 0x00, + 0x1F, 0x18, 0xD8, 0x6C, 0x0C, 0x06, 0x03, 0x01, 0x86, 0x66, 0x3E, 0x00, + 0x00, 0x20, 0x08, 0x01, 0x0F, 0x23, 0x14, 0xC1, 0x18, 0x26, 0x04, 0xC0, + 0x98, 0x23, 0x04, 0x71, 0x87, 0xD0, 0x0F, 0x0C, 0x76, 0x0D, 0x83, 0xFF, + 0xF0, 0x0C, 0x03, 0x06, 0x63, 0x0F, 0x80, 0x1C, 0xC2, 0x1E, 0x20, 0x84, + 0x10, 0x41, 0x04, 0x20, 0x80, 0x0F, 0x46, 0x33, 0x0C, 0xC1, 0x60, 0xD8, + 0x26, 0x09, 0x86, 0x71, 0x8F, 0xE0, 0x10, 0x04, 0xC2, 0x1F, 0x00, 0x10, + 0x04, 0x01, 0x00, 0x9F, 0x39, 0x88, 0x22, 0x09, 0x02, 0x40, 0x90, 0x44, + 0x12, 0x04, 0x81, 0x00, 0x10, 0x02, 0x22, 0x64, 0x44, 0x48, 0x80, 0x04, + 0x00, 0x01, 0x08, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0x42, 0x08, 0xE0, + 0x10, 0x08, 0x04, 0x04, 0x32, 0x31, 0x20, 0xA0, 0xB8, 0x6C, 0x22, 0x11, + 0x90, 0xC8, 0x30, 0x11, 0x22, 0x22, 0x64, 0x44, 0x48, 0x80, 0x2F, 0x3C, + 0x63, 0x8C, 0x86, 0x19, 0x08, 0x44, 0x10, 0x88, 0x21, 0x10, 0x82, 0x21, + 0x04, 0x82, 0x11, 0x04, 0x20, 0x00, 0x0B, 0xF3, 0x18, 0x82, 0x20, 0x90, + 0x24, 0x09, 0x04, 0x41, 0x20, 0x48, 0x10, 0x0F, 0x0C, 0x76, 0x0D, 0x83, + 0xC0, 0xF0, 0x3C, 0x1B, 0x06, 0xE3, 0x0F, 0x00, 0x17, 0xC3, 0x1C, 0x41, + 0x98, 0x32, 0x06, 0x40, 0xC8, 0x33, 0x06, 0x71, 0x8B, 0xC1, 0x00, 0x20, + 0x08, 0x01, 0x00, 0x00, 0x1E, 0xCC, 0x66, 0x09, 0x82, 0xC0, 0xB0, 0x4C, + 0x13, 0x04, 0x63, 0x0F, 0xC0, 0x20, 0x08, 0x02, 0x00, 0x80, 0x2C, 0x60, + 0x81, 0x04, 0x08, 0x10, 0x20, 0x81, 0x00, 0x1E, 0x33, 0x63, 0x60, 0x70, + 0x1E, 0x03, 0xC3, 0xC6, 0x7C, 0x22, 0xF2, 0x44, 0x44, 0xCC, 0xCE, 0x21, + 0x20, 0x90, 0x48, 0x24, 0x12, 0x13, 0x09, 0x84, 0xE6, 0x3E, 0x00, 0xC1, + 0xE1, 0xB0, 0xC8, 0xC4, 0x43, 0x61, 0xA0, 0xF0, 0x70, 0x18, 0x00, 0xC7, + 0x1E, 0x38, 0xB3, 0xCD, 0x96, 0x4C, 0xB6, 0x6D, 0xB1, 0x4D, 0x0E, 0x78, + 0x63, 0x83, 0x1C, 0x00, 0x10, 0xC3, 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C, + 0x07, 0x81, 0x90, 0x23, 0x08, 0x20, 0x30, 0x46, 0x18, 0x42, 0x08, 0xC1, + 0x10, 0x24, 0x07, 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x08, 0x03, 0x01, + 0xC0, 0x00, 0x3F, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0x7F, 0x00, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC3, 0x18, 0x88, 0x42, 0x18, + 0xE0, 0x11, 0x22, 0x22, 0x24, 0x44, 0x4C, 0x88, 0x88, 0x00, 0x38, 0xC2, + 0x10, 0x88, 0xC6, 0x18, 0x88, 0x42, 0x10, 0x88, 0xC0, 0x70, 0x4E, 0x41, + 0xC0 }; + +const GFXglyph FreeSansOblique9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 5, 13, 5, 2, -12 }, // 0x21 '!' + { 9, 5, 4, 6, 3, -12 }, // 0x22 '"' + { 12, 11, 13, 10, 1, -12 }, // 0x23 '#' + { 30, 11, 16, 10, 1, -13 }, // 0x24 '$' + { 52, 15, 13, 16, 2, -12 }, // 0x25 '%' + { 77, 10, 13, 12, 2, -12 }, // 0x26 '&' + { 94, 2, 4, 3, 3, -12 }, // 0x27 ''' + { 95, 7, 17, 6, 2, -12 }, // 0x28 '(' + { 110, 7, 17, 6, -1, -12 }, // 0x29 ')' + { 125, 6, 5, 7, 3, -12 }, // 0x2A '*' + { 129, 9, 8, 11, 2, -7 }, // 0x2B '+' + { 138, 3, 5, 5, 1, -1 }, // 0x2C ',' + { 140, 4, 1, 6, 2, -4 }, // 0x2D '-' + { 141, 2, 1, 5, 2, 0 }, // 0x2E '.' + { 142, 8, 13, 5, 0, -12 }, // 0x2F '/' + { 155, 9, 13, 10, 2, -12 }, // 0x30 '0' + { 170, 5, 13, 10, 4, -12 }, // 0x31 '1' + { 179, 11, 13, 10, 1, -12 }, // 0x32 '2' + { 197, 10, 13, 10, 1, -12 }, // 0x33 '3' + { 214, 9, 13, 10, 1, -12 }, // 0x34 '4' + { 229, 11, 13, 10, 1, -12 }, // 0x35 '5' + { 247, 10, 13, 10, 2, -12 }, // 0x36 '6' + { 264, 10, 13, 10, 2, -12 }, // 0x37 '7' + { 281, 10, 13, 10, 1, -12 }, // 0x38 '8' + { 298, 10, 13, 10, 1, -12 }, // 0x39 '9' + { 315, 4, 9, 5, 2, -8 }, // 0x3A ':' + { 320, 5, 12, 5, 1, -8 }, // 0x3B ';' + { 328, 9, 9, 11, 2, -8 }, // 0x3C '<' + { 339, 10, 4, 11, 1, -5 }, // 0x3D '=' + { 344, 9, 9, 11, 1, -7 }, // 0x3E '>' + { 355, 9, 13, 10, 3, -12 }, // 0x3F '?' + { 370, 18, 16, 18, 1, -12 }, // 0x40 '@' + { 406, 12, 13, 12, 0, -12 }, // 0x41 'A' + { 426, 12, 13, 12, 1, -12 }, // 0x42 'B' + { 446, 12, 13, 13, 2, -12 }, // 0x43 'C' + { 466, 13, 13, 13, 1, -12 }, // 0x44 'D' + { 488, 12, 13, 12, 1, -12 }, // 0x45 'E' + { 508, 12, 13, 11, 1, -12 }, // 0x46 'F' + { 528, 13, 13, 14, 2, -12 }, // 0x47 'G' + { 550, 13, 13, 13, 1, -12 }, // 0x48 'H' + { 572, 4, 13, 5, 2, -12 }, // 0x49 'I' + { 579, 10, 13, 9, 1, -12 }, // 0x4A 'J' + { 596, 14, 13, 12, 1, -12 }, // 0x4B 'K' + { 619, 9, 13, 10, 1, -12 }, // 0x4C 'L' + { 634, 16, 13, 15, 1, -12 }, // 0x4D 'M' + { 660, 13, 13, 13, 1, -12 }, // 0x4E 'N' + { 682, 13, 13, 14, 2, -12 }, // 0x4F 'O' + { 704, 12, 13, 12, 1, -12 }, // 0x50 'P' + { 724, 13, 14, 14, 2, -12 }, // 0x51 'Q' + { 747, 13, 13, 13, 1, -12 }, // 0x52 'R' + { 769, 12, 13, 12, 1, -12 }, // 0x53 'S' + { 789, 10, 13, 11, 3, -12 }, // 0x54 'T' + { 806, 12, 13, 13, 2, -12 }, // 0x55 'U' + { 826, 11, 13, 12, 3, -12 }, // 0x56 'V' + { 844, 16, 13, 17, 3, -12 }, // 0x57 'W' + { 870, 14, 13, 12, 0, -12 }, // 0x58 'X' + { 893, 12, 13, 12, 3, -12 }, // 0x59 'Y' + { 913, 12, 13, 11, 1, -12 }, // 0x5A 'Z' + { 933, 7, 17, 5, 0, -12 }, // 0x5B '[' + { 948, 2, 13, 5, 3, -12 }, // 0x5C '\' + { 952, 7, 17, 5, 0, -12 }, // 0x5D ']' + { 967, 7, 7, 8, 2, -12 }, // 0x5E '^' + { 974, 11, 1, 10, -1, 3 }, // 0x5F '_' + { 976, 3, 3, 6, 3, -12 }, // 0x60 '`' + { 978, 10, 10, 10, 1, -9 }, // 0x61 'a' + { 991, 10, 13, 10, 1, -12 }, // 0x62 'b' + { 1008, 9, 10, 9, 1, -9 }, // 0x63 'c' + { 1020, 11, 13, 10, 1, -12 }, // 0x64 'd' + { 1038, 10, 10, 10, 1, -9 }, // 0x65 'e' + { 1051, 6, 13, 5, 1, -12 }, // 0x66 'f' + { 1061, 10, 14, 10, 0, -9 }, // 0x67 'g' + { 1079, 10, 13, 10, 1, -12 }, // 0x68 'h' + { 1096, 4, 13, 4, 1, -12 }, // 0x69 'i' + { 1103, 6, 17, 4, -1, -12 }, // 0x6A 'j' + { 1116, 9, 13, 9, 1, -12 }, // 0x6B 'k' + { 1131, 4, 13, 4, 1, -12 }, // 0x6C 'l' + { 1138, 15, 10, 15, 1, -9 }, // 0x6D 'm' + { 1157, 10, 11, 10, 1, -10 }, // 0x6E 'n' + { 1171, 10, 10, 10, 1, -9 }, // 0x6F 'o' + { 1184, 11, 14, 10, 0, -9 }, // 0x70 'p' + { 1204, 10, 14, 10, 1, -9 }, // 0x71 'q' + { 1222, 7, 10, 6, 1, -9 }, // 0x72 'r' + { 1231, 8, 10, 9, 1, -9 }, // 0x73 's' + { 1241, 4, 12, 5, 2, -11 }, // 0x74 't' + { 1247, 9, 10, 10, 2, -9 }, // 0x75 'u' + { 1259, 9, 10, 9, 2, -9 }, // 0x76 'v' + { 1271, 13, 10, 13, 2, -9 }, // 0x77 'w' + { 1288, 11, 10, 9, 0, -9 }, // 0x78 'x' + { 1302, 11, 14, 9, 0, -9 }, // 0x79 'y' + { 1322, 9, 10, 9, 1, -9 }, // 0x7A 'z' + { 1334, 5, 17, 6, 2, -12 }, // 0x7B '{' + { 1345, 4, 17, 5, 1, -12 }, // 0x7C '|' + { 1354, 5, 17, 6, 0, -12 }, // 0x7D '}' + { 1365, 9, 3, 11, 2, -7 } }; // 0x7E '~' + +const GFXfont FreeSansOblique9pt7b PROGMEM = { + (uint8_t *)FreeSansOblique9pt7bBitmaps, + (GFXglyph *)FreeSansOblique9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 2041 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif12pt7b.h new file mode 100644 index 0000000..48ad3da --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif12pt7b.h @@ -0,0 +1,259 @@ +const uint8_t FreeSerif12pt7bBitmaps[] PROGMEM = { + 0xFF, 0xFE, 0xA8, 0x3F, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x0C, 0x40, 0xC4, + 0x08, 0x40, 0x8C, 0x08, 0xC7, 0xFF, 0x18, 0x81, 0x88, 0x10, 0x81, 0x08, + 0xFF, 0xE1, 0x18, 0x31, 0x03, 0x10, 0x31, 0x02, 0x10, 0x04, 0x07, 0xC6, + 0x5B, 0x12, 0xC4, 0xB1, 0x0F, 0x41, 0xF0, 0x1E, 0x01, 0xE0, 0x58, 0x13, + 0x84, 0xE1, 0x3C, 0x4F, 0x96, 0x3F, 0x01, 0x00, 0x00, 0x04, 0x03, 0x83, + 0x03, 0x9F, 0x81, 0xC2, 0x20, 0x60, 0x90, 0x38, 0x24, 0x0C, 0x12, 0x03, + 0x0D, 0x00, 0xC6, 0x47, 0x9E, 0x23, 0x10, 0x09, 0x84, 0x04, 0xE1, 0x03, + 0x30, 0x40, 0x8C, 0x20, 0x43, 0x08, 0x10, 0xC4, 0x08, 0x1E, 0x00, 0x03, + 0xC0, 0x02, 0x30, 0x03, 0x08, 0x01, 0x84, 0x00, 0xC4, 0x00, 0x7C, 0xF8, + 0x1C, 0x38, 0x1E, 0x08, 0x33, 0x0C, 0x31, 0xC4, 0x10, 0x74, 0x18, 0x3A, + 0x0C, 0x0E, 0x07, 0x03, 0x83, 0xC3, 0xE2, 0x7E, 0x3E, 0xFF, 0xA0, 0x04, + 0x21, 0x08, 0x61, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC1, 0x04, 0x18, 0x20, + 0x40, 0x81, 0x81, 0x02, 0x04, 0x18, 0x20, 0x83, 0x0C, 0x30, 0xC3, 0x0C, + 0x30, 0x86, 0x10, 0x84, 0x20, 0x30, 0xB3, 0xD7, 0x54, 0x38, 0x7C, 0xD3, + 0x30, 0x30, 0x10, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, + 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x00, 0xDF, 0x95, 0x00, 0xFC, 0xFC, + 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, + 0x10, 0x60, 0xC0, 0x1E, 0x0C, 0xC6, 0x19, 0x86, 0xC0, 0xB0, 0x3C, 0x0F, + 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, + 0x00, 0x11, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0xFC, 0x1E, 0x18, 0xC4, 0x1A, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, + 0x02, 0x01, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x1F, 0xF8, 0x1E, 0x18, 0xE8, + 0x18, 0x06, 0x01, 0x00, 0x80, 0xF0, 0x7E, 0x03, 0xC0, 0x70, 0x0C, 0x03, + 0x00, 0xC0, 0x6E, 0x11, 0xF8, 0x01, 0x00, 0xC0, 0x70, 0x2C, 0x0B, 0x04, + 0xC2, 0x30, 0x8C, 0x43, 0x20, 0xC8, 0x33, 0xFF, 0x03, 0x00, 0xC0, 0x30, + 0x0C, 0x00, 0x03, 0xF1, 0x00, 0x40, 0x18, 0x0F, 0x80, 0xF8, 0x0E, 0x01, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x1B, 0x8C, 0x7C, 0x00, 0x01, + 0xC3, 0xC1, 0xC0, 0xC0, 0x70, 0x18, 0x0E, 0xF3, 0xCE, 0xC1, 0xF0, 0x3C, + 0x0F, 0x03, 0xC0, 0xD8, 0x36, 0x08, 0xC6, 0x1E, 0x00, 0x3F, 0xD0, 0x38, + 0x08, 0x06, 0x01, 0x80, 0x40, 0x10, 0x0C, 0x02, 0x00, 0x80, 0x20, 0x10, + 0x04, 0x01, 0x00, 0x80, 0x20, 0x1F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0xF8, + 0x67, 0x30, 0xF0, 0x1E, 0x09, 0xE6, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0D, + 0x86, 0x1F, 0x00, 0x1E, 0x08, 0xC6, 0x1B, 0x02, 0xC0, 0xF0, 0x3C, 0x0F, + 0x03, 0xE0, 0xDC, 0x73, 0xEC, 0x06, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x38, + 0x18, 0x00, 0xFC, 0x00, 0x3F, 0xCC, 0xC0, 0x00, 0x00, 0x06, 0x77, 0x12, + 0x40, 0x00, 0x00, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x00, 0x10, 0xFF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0xF0, + 0x03, 0xC0, 0x0F, 0x00, 0x30, 0x0E, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00, + 0x00, 0x00, 0x7C, 0x86, 0x83, 0xC3, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x08, + 0x10, 0x10, 0x00, 0x00, 0x30, 0x30, 0x30, 0x03, 0xF0, 0x06, 0x06, 0x06, + 0x00, 0x86, 0x00, 0x26, 0x0E, 0xD3, 0x0C, 0xC7, 0x0C, 0x63, 0x84, 0x31, + 0xC6, 0x18, 0xE3, 0x08, 0x71, 0x8C, 0x4C, 0xC6, 0x46, 0x3D, 0xC1, 0x80, + 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x80, 0x00, 0x60, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x2E, 0x00, 0x13, 0x00, 0x19, 0xC0, 0x08, 0x60, 0x04, 0x38, + 0x04, 0x0C, 0x03, 0xFF, 0x03, 0x03, 0x81, 0x00, 0xE1, 0x80, 0x70, 0xC0, + 0x3D, 0xF0, 0x3F, 0xFF, 0x83, 0x0C, 0x30, 0x63, 0x06, 0x30, 0x63, 0x06, + 0x30, 0xC3, 0xF0, 0x30, 0xE3, 0x06, 0x30, 0x33, 0x03, 0x30, 0x33, 0x07, + 0x30, 0xEF, 0xFC, 0x07, 0xE2, 0x38, 0x3C, 0xC0, 0x3B, 0x00, 0x36, 0x00, + 0x38, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x03, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x47, 0x03, 0x03, 0xF8, 0xFF, 0xC0, 0x30, + 0x78, 0x30, 0x1C, 0x30, 0x0E, 0x30, 0x06, 0x30, 0x03, 0x30, 0x03, 0x30, + 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x06, 0x30, 0x06, 0x30, + 0x0C, 0x30, 0x78, 0xFF, 0xC0, 0xFF, 0xFC, 0xC0, 0x33, 0x00, 0x4C, 0x00, + 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, 0x30, 0xC0, 0x43, 0x00, + 0x0C, 0x00, 0x30, 0x08, 0xC0, 0x23, 0x03, 0xBF, 0xFE, 0xFF, 0xFC, 0xC0, + 0x33, 0x00, 0x4C, 0x00, 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, + 0x30, 0xC0, 0x43, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x3F, + 0x00, 0x07, 0xE4, 0x1C, 0x3C, 0x30, 0x0C, 0x60, 0x0C, 0x60, 0x04, 0xC0, + 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, + 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x1C, 0x1C, 0x07, 0xE0, 0xFC, 0x3F, 0x30, + 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, + 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, + 0x0C, 0x30, 0x0C, 0xFC, 0x3F, 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, + 0xC3, 0x0C, 0x30, 0xC3, 0x3F, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xC8, 0xF0, 0xFC, 0xFE, 0x30, + 0x38, 0x30, 0x20, 0x30, 0x40, 0x30, 0x80, 0x33, 0x00, 0x36, 0x00, 0x3E, + 0x00, 0x37, 0x00, 0x33, 0x80, 0x31, 0xC0, 0x30, 0xE0, 0x30, 0x70, 0x30, + 0x38, 0x30, 0x3C, 0xFC, 0x7F, 0xFC, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x01, 0x80, 0x03, 0x00, 0x26, 0x00, 0x8C, 0x07, 0x7F, 0xFE, 0xF8, + 0x01, 0xE7, 0x00, 0x70, 0xE0, 0x0E, 0x1E, 0x03, 0xC2, 0xC0, 0x58, 0x5C, + 0x1B, 0x09, 0x82, 0x61, 0x38, 0x4C, 0x27, 0x11, 0x84, 0x72, 0x30, 0x8E, + 0xC6, 0x10, 0xD0, 0xC2, 0x1E, 0x18, 0x41, 0x83, 0x1C, 0x30, 0x67, 0xC4, + 0x3F, 0xF0, 0x1F, 0x78, 0x0E, 0x3C, 0x04, 0x3E, 0x04, 0x2E, 0x04, 0x27, + 0x04, 0x23, 0x84, 0x23, 0xC4, 0x21, 0xE4, 0x20, 0xE4, 0x20, 0x74, 0x20, + 0x3C, 0x20, 0x1C, 0x20, 0x0C, 0x70, 0x0C, 0xF8, 0x04, 0x07, 0xC0, 0x30, + 0x60, 0xC0, 0x63, 0x00, 0x66, 0x00, 0xD8, 0x00, 0xF0, 0x01, 0xE0, 0x03, + 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1B, 0x00, 0x66, 0x00, 0xC6, 0x03, 0x06, + 0x0C, 0x03, 0xE0, 0xFF, 0x83, 0x0E, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, + 0x30, 0x63, 0x0E, 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x0F, 0xC0, 0x0F, 0xE0, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0C, 0x60, + 0x0C, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, + 0x06, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x03, + 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0xFF, 0x80, 0x61, 0xC0, 0xC1, + 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x0C, 0x1C, 0x18, 0x70, 0x3F, 0x80, + 0x67, 0x00, 0xC7, 0x01, 0x8F, 0x03, 0x0F, 0x06, 0x0E, 0x0C, 0x0E, 0x7E, + 0x0F, 0x1F, 0x46, 0x19, 0x81, 0x30, 0x27, 0x02, 0xF0, 0x0F, 0x00, 0xF8, + 0x07, 0xC0, 0x38, 0x03, 0xC0, 0x34, 0x06, 0x80, 0xDC, 0x32, 0x7C, 0xFF, + 0xFF, 0x86, 0x0E, 0x0C, 0x1C, 0x18, 0x10, 0x30, 0x00, 0x60, 0x00, 0xC0, + 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, + 0x60, 0x00, 0xC0, 0x07, 0xE0, 0xFC, 0x1F, 0x30, 0x0E, 0x30, 0x04, 0x30, + 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, + 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x18, 0x08, 0x1C, 0x18, 0x07, + 0xE0, 0xFE, 0x0F, 0x9C, 0x03, 0x0E, 0x01, 0x83, 0x00, 0x81, 0xC0, 0x40, + 0x60, 0x40, 0x38, 0x20, 0x0C, 0x30, 0x07, 0x10, 0x01, 0x98, 0x00, 0xE8, + 0x00, 0x34, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFC, + 0xFC, 0x3D, 0xE1, 0xC0, 0x63, 0x83, 0x01, 0x86, 0x0E, 0x04, 0x1C, 0x18, + 0x10, 0x70, 0x70, 0x80, 0xC3, 0xC2, 0x03, 0x8B, 0x08, 0x06, 0x6E, 0x40, + 0x1D, 0x19, 0x00, 0x74, 0x78, 0x00, 0xE1, 0xE0, 0x03, 0x83, 0x80, 0x0E, + 0x0C, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x7F, 0x1F, 0x9E, 0x03, 0x07, + 0x03, 0x01, 0xC3, 0x00, 0x71, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x03, 0x80, + 0x01, 0xE0, 0x01, 0xB0, 0x01, 0x9C, 0x00, 0x87, 0x00, 0x81, 0xC0, 0x80, + 0xE0, 0xC0, 0x79, 0xF8, 0x7F, 0xFE, 0x1F, 0x78, 0x0C, 0x38, 0x08, 0x1C, + 0x18, 0x0E, 0x10, 0x06, 0x20, 0x07, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, + 0xE0, 0x7F, 0xFB, 0x00, 0xC8, 0x07, 0x20, 0x38, 0x01, 0xC0, 0x07, 0x00, + 0x38, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x05, + 0xC0, 0x3E, 0x01, 0xBF, 0xFE, 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xF0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, + 0x18, 0x10, 0x30, 0x60, 0x40, 0xC1, 0x81, 0x03, 0x06, 0xF8, 0xC6, 0x31, + 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xF0, 0x0C, 0x07, + 0x01, 0x60, 0xD8, 0x23, 0x18, 0xC4, 0x1B, 0x06, 0x80, 0xC0, 0xFF, 0xF0, + 0xC7, 0x0C, 0x30, 0x3E, 0x31, 0x8C, 0x30, 0x0C, 0x03, 0x07, 0xC6, 0x33, + 0x0C, 0xC3, 0x31, 0xC7, 0xB8, 0x20, 0x38, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0xF1, 0xC6, 0x61, 0xD8, 0x36, 0x0D, 0x83, 0x60, 0xD8, 0x26, 0x19, + 0x84, 0x3E, 0x00, 0x1E, 0x23, 0x63, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, + 0x72, 0x3C, 0x00, 0x80, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x61, 0xD8, 0x8E, + 0x61, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x19, 0xCE, 0x3D, 0xC0, + 0x1E, 0x08, 0xE4, 0x1B, 0xFE, 0xC0, 0x30, 0x0C, 0x03, 0x81, 0x60, 0x9C, + 0x41, 0xE0, 0x0F, 0x08, 0xC4, 0x06, 0x03, 0x01, 0x81, 0xF0, 0x60, 0x30, + 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0xFC, 0x00, 0x1F, 0x03, + 0x1F, 0x60, 0xC6, 0x0C, 0x60, 0xC3, 0x18, 0x1F, 0x02, 0x00, 0x40, 0x07, + 0xFC, 0x40, 0x24, 0x02, 0xC0, 0x2C, 0x04, 0xE0, 0x83, 0xF0, 0x30, 0x1E, + 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0D, 0xE1, 0xCE, 0x30, 0xC6, 0x18, + 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x79, 0xE0, 0x31, 0x80, + 0x00, 0x09, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xDF, 0x0C, 0x30, 0x00, 0x00, + 0x31, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xF2, 0xF0, + 0x20, 0x1C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0xFB, 0x08, 0x62, + 0x0C, 0x81, 0xE0, 0x3E, 0x06, 0xE0, 0xCE, 0x18, 0xC3, 0x0E, 0xF3, 0xE0, + 0x13, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xF8, 0xF7, + 0x8F, 0x0E, 0x3C, 0xE3, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, + 0x63, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, 0x67, 0x9E, 0x3C, + 0xF7, 0x87, 0x18, 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x30, + 0xC6, 0x19, 0xE7, 0x80, 0x1E, 0x18, 0xE4, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, + 0x0F, 0x03, 0x60, 0x9C, 0x41, 0xE0, 0x77, 0x87, 0x18, 0xC3, 0x98, 0x33, + 0x06, 0x60, 0xCC, 0x19, 0x83, 0x30, 0xC7, 0x10, 0xDC, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x07, 0xE0, 0x1E, 0x8C, 0xE6, 0x1B, 0x06, 0xC1, 0xB0, 0x6C, + 0x1B, 0x06, 0xE1, 0x98, 0xE3, 0xD8, 0x06, 0x01, 0x80, 0x60, 0x18, 0x1F, + 0x37, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7C, 0x7B, + 0x0E, 0x1C, 0x1E, 0x0F, 0x07, 0xC3, 0x87, 0x8A, 0xE0, 0x21, 0x8F, 0x98, + 0x61, 0x86, 0x18, 0x61, 0x86, 0x19, 0x38, 0xE3, 0x98, 0x66, 0x19, 0x86, + 0x61, 0x98, 0x66, 0x19, 0x86, 0x61, 0x9C, 0xE3, 0xDC, 0xF8, 0xEE, 0x08, + 0xC1, 0x18, 0x41, 0x88, 0x32, 0x03, 0x40, 0x68, 0x06, 0x00, 0xC0, 0x10, + 0x00, 0xF3, 0xE7, 0x61, 0x83, 0x70, 0xC2, 0x30, 0xC2, 0x30, 0xC4, 0x19, + 0x64, 0x19, 0x68, 0x0E, 0x38, 0x0E, 0x38, 0x0C, 0x30, 0x04, 0x10, 0xFB, + 0xC6, 0x30, 0x64, 0x0F, 0x00, 0xC0, 0x0C, 0x03, 0xC0, 0x98, 0x21, 0x8C, + 0x3B, 0xCF, 0x80, 0xF8, 0xEE, 0x08, 0xC1, 0x18, 0x41, 0x88, 0x31, 0x03, + 0x40, 0x68, 0x06, 0x00, 0xC0, 0x08, 0x02, 0x00, 0x40, 0x10, 0x1E, 0x03, + 0x80, 0x7F, 0x90, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0xE0, 0x30, + 0x5C, 0x3F, 0xF8, 0x19, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xB0, 0x63, 0x18, + 0xC6, 0x31, 0x8C, 0x61, 0x80, 0xFF, 0xFF, 0x80, 0xC3, 0x18, 0xC6, 0x31, + 0x8C, 0x63, 0x06, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xCC, 0x00, 0x38, 0x06, + 0x62, 0x41, 0xC0 }; + +const GFXglyph FreeSerif12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 2, 16, 8, 3, -15 }, // 0x21 '!' + { 4, 6, 6, 10, 1, -15 }, // 0x22 '"' + { 9, 12, 16, 12, 0, -15 }, // 0x23 '#' + { 33, 10, 18, 12, 1, -16 }, // 0x24 '$' + { 56, 18, 17, 20, 1, -16 }, // 0x25 '%' + { 95, 17, 16, 19, 1, -15 }, // 0x26 '&' + { 129, 2, 6, 5, 1, -15 }, // 0x27 ''' + { 131, 6, 20, 8, 1, -15 }, // 0x28 '(' + { 146, 6, 20, 8, 1, -15 }, // 0x29 ')' + { 161, 8, 10, 12, 3, -14 }, // 0x2A '*' + { 171, 11, 11, 14, 1, -10 }, // 0x2B '+' + { 187, 3, 6, 6, 2, -2 }, // 0x2C ',' + { 190, 6, 1, 8, 1, -5 }, // 0x2D '-' + { 191, 2, 3, 6, 2, -2 }, // 0x2E '.' + { 192, 7, 17, 7, 0, -16 }, // 0x2F '/' + { 207, 10, 17, 12, 1, -16 }, // 0x30 '0' + { 229, 6, 17, 12, 3, -16 }, // 0x31 '1' + { 242, 10, 15, 12, 1, -14 }, // 0x32 '2' + { 261, 10, 16, 12, 1, -15 }, // 0x33 '3' + { 281, 10, 16, 12, 1, -15 }, // 0x34 '4' + { 301, 10, 17, 12, 1, -16 }, // 0x35 '5' + { 323, 10, 17, 12, 1, -16 }, // 0x36 '6' + { 345, 10, 16, 12, 0, -15 }, // 0x37 '7' + { 365, 10, 17, 12, 1, -16 }, // 0x38 '8' + { 387, 10, 18, 12, 1, -16 }, // 0x39 '9' + { 410, 2, 12, 6, 2, -11 }, // 0x3A ':' + { 413, 4, 15, 6, 2, -11 }, // 0x3B ';' + { 421, 12, 13, 14, 1, -12 }, // 0x3C '<' + { 441, 12, 6, 14, 1, -8 }, // 0x3D '=' + { 450, 12, 13, 14, 1, -11 }, // 0x3E '>' + { 470, 8, 17, 11, 2, -16 }, // 0x3F '?' + { 487, 17, 16, 21, 2, -15 }, // 0x40 '@' + { 521, 17, 16, 17, 0, -15 }, // 0x41 'A' + { 555, 12, 16, 15, 1, -15 }, // 0x42 'B' + { 579, 15, 16, 16, 1, -15 }, // 0x43 'C' + { 609, 16, 16, 17, 0, -15 }, // 0x44 'D' + { 641, 14, 16, 15, 0, -15 }, // 0x45 'E' + { 669, 14, 16, 14, 0, -15 }, // 0x46 'F' + { 697, 16, 16, 17, 1, -15 }, // 0x47 'G' + { 729, 16, 16, 17, 0, -15 }, // 0x48 'H' + { 761, 6, 16, 8, 1, -15 }, // 0x49 'I' + { 773, 8, 16, 9, 0, -15 }, // 0x4A 'J' + { 789, 16, 16, 17, 1, -15 }, // 0x4B 'K' + { 821, 15, 16, 15, 0, -15 }, // 0x4C 'L' + { 851, 19, 16, 21, 1, -15 }, // 0x4D 'M' + { 889, 16, 16, 17, 1, -15 }, // 0x4E 'N' + { 921, 15, 16, 17, 1, -15 }, // 0x4F 'O' + { 951, 12, 16, 14, 0, -15 }, // 0x50 'P' + { 975, 16, 20, 17, 1, -15 }, // 0x51 'Q' + { 1015, 15, 16, 16, 0, -15 }, // 0x52 'R' + { 1045, 11, 16, 13, 0, -15 }, // 0x53 'S' + { 1067, 15, 16, 15, 0, -15 }, // 0x54 'T' + { 1097, 16, 16, 17, 1, -15 }, // 0x55 'U' + { 1129, 17, 16, 17, 0, -15 }, // 0x56 'V' + { 1163, 22, 16, 23, 0, -15 }, // 0x57 'W' + { 1207, 17, 16, 17, 0, -15 }, // 0x58 'X' + { 1241, 16, 16, 17, 0, -15 }, // 0x59 'Y' + { 1273, 14, 16, 15, 1, -15 }, // 0x5A 'Z' + { 1301, 5, 20, 8, 2, -15 }, // 0x5B '[' + { 1314, 7, 17, 7, 0, -16 }, // 0x5C '\' + { 1329, 5, 20, 8, 1, -15 }, // 0x5D ']' + { 1342, 10, 9, 11, 1, -15 }, // 0x5E '^' + { 1354, 12, 1, 12, 0, 3 }, // 0x5F '_' + { 1356, 5, 4, 6, 0, -15 }, // 0x60 '`' + { 1359, 10, 11, 10, 1, -10 }, // 0x61 'a' + { 1373, 10, 17, 12, 1, -16 }, // 0x62 'b' + { 1395, 8, 11, 11, 1, -10 }, // 0x63 'c' + { 1406, 10, 17, 12, 1, -16 }, // 0x64 'd' + { 1428, 10, 11, 11, 1, -10 }, // 0x65 'e' + { 1442, 9, 17, 9, 0, -16 }, // 0x66 'f' + { 1462, 12, 16, 11, 0, -10 }, // 0x67 'g' + { 1486, 11, 17, 12, 0, -16 }, // 0x68 'h' + { 1510, 5, 16, 7, 0, -15 }, // 0x69 'i' + { 1520, 6, 21, 8, 0, -15 }, // 0x6A 'j' + { 1536, 11, 17, 12, 1, -16 }, // 0x6B 'k' + { 1560, 5, 17, 6, 0, -16 }, // 0x6C 'l' + { 1571, 18, 11, 19, 0, -10 }, // 0x6D 'm' + { 1596, 11, 11, 12, 0, -10 }, // 0x6E 'n' + { 1612, 10, 11, 12, 1, -10 }, // 0x6F 'o' + { 1626, 11, 16, 12, 0, -10 }, // 0x70 'p' + { 1648, 10, 16, 12, 1, -10 }, // 0x71 'q' + { 1668, 8, 11, 8, 0, -10 }, // 0x72 'r' + { 1679, 7, 11, 9, 1, -10 }, // 0x73 's' + { 1689, 6, 13, 7, 1, -12 }, // 0x74 't' + { 1699, 10, 11, 12, 1, -10 }, // 0x75 'u' + { 1713, 11, 11, 11, 0, -10 }, // 0x76 'v' + { 1729, 16, 11, 16, 0, -10 }, // 0x77 'w' + { 1751, 11, 11, 12, 0, -10 }, // 0x78 'x' + { 1767, 11, 16, 11, 0, -10 }, // 0x79 'y' + { 1789, 10, 11, 10, 0, -10 }, // 0x7A 'z' + { 1803, 5, 21, 12, 2, -16 }, // 0x7B '{' + { 1817, 1, 17, 5, 2, -16 }, // 0x7C '|' + { 1820, 5, 21, 12, 5, -15 }, // 0x7D '}' + { 1834, 12, 3, 12, 0, -6 } }; // 0x7E '~' + +const GFXfont FreeSerif12pt7b PROGMEM = { + (uint8_t *)FreeSerif12pt7bBitmaps, + (GFXglyph *)FreeSerif12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2511 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif18pt7b.h new file mode 100644 index 0000000..7d19dd1 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif18pt7b.h @@ -0,0 +1,429 @@ +const uint8_t FreeSerif18pt7bBitmaps[] PROGMEM = { + 0x6F, 0xFF, 0xFF, 0xFE, 0x66, 0x66, 0x66, 0x64, 0x40, 0x00, 0x6F, 0xF6, + 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x46, 0x42, 0x42, 0x42, 0x03, 0x06, 0x01, + 0x83, 0x00, 0xC1, 0x80, 0x61, 0xC0, 0x30, 0xC0, 0x38, 0x60, 0x18, 0x30, + 0xFF, 0xFF, 0x7F, 0xFF, 0x83, 0x06, 0x01, 0x86, 0x00, 0xC3, 0x00, 0xC1, + 0x87, 0xFF, 0xFF, 0xFF, 0xFE, 0x18, 0x30, 0x0C, 0x18, 0x06, 0x18, 0x06, + 0x0C, 0x03, 0x06, 0x01, 0x83, 0x00, 0xC1, 0x80, 0x60, 0xC0, 0x02, 0x00, + 0x10, 0x03, 0xE0, 0x64, 0xE6, 0x23, 0x61, 0x1B, 0x08, 0x58, 0x42, 0xE2, + 0x03, 0x90, 0x1F, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF0, 0x0F, 0xC0, 0x4E, + 0x02, 0x38, 0x10, 0xE0, 0x87, 0x04, 0x3C, 0x21, 0xE1, 0x1B, 0xC9, 0xCF, + 0xFC, 0x1F, 0x80, 0x10, 0x00, 0x80, 0x07, 0x80, 0x20, 0x0F, 0xF0, 0x70, + 0x0F, 0x07, 0xD0, 0x0F, 0x02, 0x18, 0x07, 0x01, 0x18, 0x07, 0x00, 0x8C, + 0x03, 0x80, 0x4C, 0x01, 0x80, 0x44, 0x00, 0xC0, 0x26, 0x00, 0x60, 0x22, + 0x0F, 0x30, 0x33, 0x1F, 0xCC, 0x73, 0x1E, 0x37, 0xF1, 0x8E, 0x19, 0xE1, + 0x8E, 0x04, 0x00, 0x86, 0x02, 0x00, 0xC7, 0x01, 0x00, 0xC3, 0x80, 0x80, + 0x61, 0x80, 0x80, 0x60, 0xC0, 0x40, 0x30, 0x60, 0x40, 0x30, 0x38, 0xE0, + 0x30, 0x0F, 0xE0, 0x18, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0x61, 0x80, 0x00, 0x60, 0x60, 0x00, 0x30, 0x30, 0x00, 0x18, 0x18, + 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x8E, 0x00, 0x01, 0xCE, + 0x00, 0x00, 0x7C, 0x3F, 0xC0, 0x38, 0x07, 0x80, 0x3E, 0x03, 0x80, 0x77, + 0x01, 0x80, 0x73, 0xC0, 0x80, 0xF0, 0xF0, 0xC0, 0x70, 0x7C, 0xC0, 0x78, + 0x1E, 0x40, 0x3C, 0x07, 0xC0, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x0F, + 0xC0, 0xFF, 0x0D, 0xF0, 0xC7, 0xFC, 0x7F, 0xC1, 0xFC, 0x1F, 0x80, 0x3C, + 0x00, 0xFF, 0xFE, 0x92, 0x40, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, + 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x0C, 0x06, 0x03, 0x80, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x00, + 0xC0, 0x30, 0x0C, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x0C, + 0x07, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, + 0xE0, 0x60, 0x30, 0x38, 0x18, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x00, 0x0C, 0x00, 0xC0, 0x0C, 0x0C, 0x46, 0xE4, 0xF7, 0x5E, 0x1F, 0x00, + 0xC0, 0x17, 0x8E, 0x4E, 0xE4, 0xFC, 0xC6, 0x0C, 0x00, 0xC0, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x6F, 0xFF, + 0x11, 0x24, 0x80, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0xC0, 0x60, 0x18, 0x06, + 0x03, 0x80, 0xC0, 0x30, 0x1C, 0x06, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x07, + 0x01, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, + 0x00, 0x03, 0xE0, 0x0E, 0x70, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x1C, 0x78, + 0x1E, 0x70, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0E, 0x70, + 0x0E, 0x78, 0x1E, 0x38, 0x1C, 0x38, 0x1C, 0x1C, 0x38, 0x0C, 0x30, 0x03, + 0xC0, 0x06, 0x03, 0x83, 0xE3, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, + 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, + 0xE0, 0x38, 0x0E, 0x03, 0x81, 0xE1, 0xFF, 0x07, 0xC0, 0x1F, 0xF0, 0x3F, + 0xF8, 0x70, 0xF8, 0x60, 0x3C, 0xC0, 0x3C, 0x80, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, + 0xC0, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x01, 0x10, + 0x02, 0x3F, 0xFE, 0x7F, 0xFC, 0xFF, 0xFC, 0x0F, 0xC0, 0xFF, 0x0C, 0x3C, + 0x80, 0xE4, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x04, 0x00, 0x40, 0x04, 0x00, + 0xF8, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0x60, 0x03, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xB0, 0x01, 0x30, 0x03, 0x30, + 0x06, 0x30, 0x04, 0x30, 0x08, 0x30, 0x18, 0x30, 0x10, 0x30, 0x20, 0x30, + 0x60, 0x30, 0xC0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x30, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x7F, 0xC3, + 0xFE, 0x1F, 0xE1, 0x80, 0x08, 0x00, 0xC0, 0x07, 0xC0, 0x7F, 0x81, 0xFF, + 0x00, 0xFC, 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xC0, 0x06, 0x00, 0x60, 0x07, 0x78, 0x73, 0xFF, 0x0F, 0xC0, 0x00, + 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x7C, 0x00, 0x79, 0xF0, 0x7F, 0xFC, 0xF8, 0x3C, 0xF0, 0x1E, 0xF0, + 0x1F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x70, 0x0F, 0x78, + 0x0F, 0x78, 0x0E, 0x3C, 0x1E, 0x1E, 0x3C, 0x0F, 0xF8, 0x07, 0xE0, 0x3F, + 0xFD, 0xFF, 0xF7, 0xFF, 0xF0, 0x06, 0x80, 0x18, 0x00, 0x60, 0x03, 0x00, + 0x0C, 0x00, 0x30, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0xE0, 0x03, 0x00, + 0x0C, 0x00, 0x70, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, + 0x1C, 0x00, 0x60, 0x00, 0x0F, 0x83, 0xFC, 0x70, 0xE6, 0x07, 0xC0, 0x3C, + 0x03, 0xC0, 0x3E, 0x03, 0x70, 0x67, 0x8C, 0x3D, 0x81, 0xF0, 0x0F, 0x81, + 0x7C, 0x21, 0xE6, 0x0E, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x36, + 0x06, 0x70, 0xE3, 0xFC, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0xF0, 0x3C, 0x78, + 0x38, 0x3C, 0x78, 0x1E, 0x70, 0x1E, 0xF0, 0x0E, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF8, 0x0F, 0x78, 0x0F, 0x3C, 0x3F, + 0x1F, 0xEE, 0x0F, 0x9E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x78, + 0x00, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x00, 0x6F, 0xF6, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x67, 0xBC, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 0xEF, 0x78, 0x42, 0x22, 0x20, 0x00, 0x00, 0xC0, + 0x00, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0xF0, + 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, + 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xC0, + 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x80, + 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF8, 0x00, 0xF0, + 0x00, 0x30, 0x00, 0x00, 0x1F, 0x81, 0xFF, 0x18, 0x7D, 0x81, 0xEC, 0x07, + 0xF0, 0x3F, 0x81, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0x80, + 0x08, 0x00, 0xC0, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0x00, + 0x01, 0xFF, 0xC0, 0x07, 0x80, 0xF0, 0x0F, 0x00, 0x38, 0x1C, 0x00, 0x1C, + 0x38, 0x00, 0x0C, 0x38, 0x00, 0x06, 0x70, 0x1E, 0x02, 0x70, 0x3F, 0xE3, + 0xF0, 0x71, 0xE1, 0xE0, 0xE0, 0xC1, 0xE0, 0xC0, 0xC1, 0xE0, 0xC1, 0xC1, + 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x83, 0xE1, 0x83, 0x82, 0xE1, 0x83, 0x86, + 0x71, 0xC7, 0x8C, 0x70, 0xF9, 0xF8, 0x38, 0xF0, 0xF0, 0x3C, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x07, 0x80, 0x70, 0x03, 0xFF, 0xE0, 0x00, 0x7F, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x5C, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x8E, 0x00, + 0x01, 0x8F, 0x00, 0x01, 0x87, 0x00, 0x03, 0x07, 0x80, 0x03, 0x03, 0x80, + 0x02, 0x03, 0xC0, 0x06, 0x03, 0xC0, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0xE0, + 0x0C, 0x01, 0xE0, 0x18, 0x00, 0xF0, 0x18, 0x00, 0xF0, 0x30, 0x00, 0x78, + 0x30, 0x00, 0x78, 0x70, 0x00, 0x7C, 0xFC, 0x01, 0xFF, 0xFF, 0xFC, 0x03, + 0xFF, 0xF8, 0x1E, 0x0F, 0xC1, 0xE0, 0x3C, 0x1E, 0x01, 0xE1, 0xE0, 0x1E, + 0x1E, 0x01, 0xE1, 0xE0, 0x1E, 0x1E, 0x03, 0xC1, 0xE0, 0x78, 0x1F, 0xFE, + 0x01, 0xFF, 0xF0, 0x1E, 0x07, 0xC1, 0xE0, 0x1E, 0x1E, 0x00, 0xF1, 0xE0, + 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x0F, 0x1E, 0x00, 0xF1, 0xE0, 0x1E, 0x1E, + 0x07, 0xE3, 0xFF, 0xF8, 0xFF, 0xFE, 0x00, 0x00, 0xFE, 0x08, 0x0F, 0xFF, + 0x60, 0xFC, 0x1F, 0x87, 0xC0, 0x1E, 0x3C, 0x00, 0x38, 0xF0, 0x00, 0x67, + 0x80, 0x01, 0x9E, 0x00, 0x02, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, + 0x00, 0x02, 0x1F, 0x00, 0x38, 0x3F, 0x03, 0x80, 0x7F, 0xFC, 0x00, 0x3F, + 0x80, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0x00, 0x78, 0x3F, 0x80, 0xF0, 0x0F, + 0x81, 0xE0, 0x0F, 0x83, 0xC0, 0x0F, 0x07, 0x80, 0x0F, 0x0F, 0x00, 0x1E, + 0x1E, 0x00, 0x1E, 0x3C, 0x00, 0x3C, 0x78, 0x00, 0x78, 0xF0, 0x00, 0xF1, + 0xE0, 0x01, 0xE3, 0xC0, 0x03, 0xC7, 0x80, 0x07, 0x8F, 0x00, 0x1E, 0x1E, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xE0, 0xF0, 0x0F, 0x81, 0xE0, + 0x7E, 0x07, 0xFF, 0xF0, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x87, 0xFF, + 0xF8, 0x3C, 0x01, 0x83, 0xC0, 0x08, 0x3C, 0x00, 0x83, 0xC0, 0x00, 0x3C, + 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x02, 0x03, 0xC0, 0x60, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3C, 0x06, 0x03, 0xC0, 0x20, 0x3C, 0x00, 0x03, 0xC0, 0x00, + 0x3C, 0x00, 0x03, 0xC0, 0x01, 0x3C, 0x00, 0x23, 0xC0, 0x06, 0x3C, 0x01, + 0xE7, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xBF, 0xFF, 0xCF, 0x00, + 0x67, 0x80, 0x13, 0xC0, 0x09, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, + 0x02, 0x1E, 0x03, 0x0F, 0xFF, 0x87, 0xFF, 0xC3, 0xC0, 0x61, 0xE0, 0x10, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x03, 0xF0, 0x03, 0xFC, 0x00, 0x00, 0xFE, 0x04, 0x07, 0xFF, + 0xB8, 0x1F, 0x03, 0xF0, 0xF8, 0x01, 0xE3, 0xE0, 0x01, 0xC7, 0x80, 0x01, + 0x9E, 0x00, 0x01, 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, + 0xC0, 0x00, 0x07, 0x80, 0x07, 0xFF, 0x00, 0x07, 0xDE, 0x00, 0x07, 0xBC, + 0x00, 0x0F, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xF0, + 0x00, 0xF1, 0xF0, 0x01, 0xE1, 0xF0, 0x03, 0xC1, 0xF8, 0x1F, 0x00, 0xFF, + 0xFC, 0x00, 0x3F, 0x80, 0xFF, 0x03, 0xFD, 0xF8, 0x07, 0xE3, 0xC0, 0x0F, + 0x0F, 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, + 0x00, 0x3C, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xFF, 0xFF, 0x0F, 0xFF, + 0xFC, 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C, + 0x3C, 0x00, 0xF0, 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x0F, 0x00, 0x3C, 0x3C, + 0x00, 0xF1, 0xF8, 0x07, 0xEF, 0xF0, 0x3F, 0xC0, 0xFF, 0xBF, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xF3, 0xFE, 0x0F, 0xF0, + 0x7E, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC6, 0x38, 0xF3, 0x8F, 0xF0, 0x7C, 0x00, 0xFF, 0x07, 0xFC, + 0xFC, 0x03, 0xC0, 0xF0, 0x07, 0x01, 0xE0, 0x1C, 0x03, 0xC0, 0x60, 0x07, + 0x81, 0x80, 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79, + 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDF, 0x00, 0x07, 0x8F, + 0x00, 0x0F, 0x0F, 0x00, 0x1E, 0x0F, 0x00, 0x3C, 0x0F, 0x00, 0x78, 0x0F, + 0x00, 0xF0, 0x1F, 0x01, 0xE0, 0x1F, 0x03, 0xC0, 0x1F, 0x0F, 0xC0, 0x3F, + 0x3F, 0xC1, 0xFF, 0x80, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x04, 0xF0, + 0x01, 0x1E, 0x00, 0x63, 0xC0, 0x3C, 0xFF, 0xFF, 0xBF, 0xFF, 0xE0, 0xFC, + 0x00, 0x03, 0xF9, 0xF0, 0x00, 0x1F, 0x87, 0x80, 0x01, 0xF8, 0x3E, 0x00, + 0x0F, 0xC1, 0xF0, 0x00, 0x5E, 0x0B, 0xC0, 0x06, 0xF0, 0x5E, 0x00, 0x37, + 0x82, 0x78, 0x03, 0x3C, 0x13, 0xC0, 0x19, 0xE0, 0x8F, 0x01, 0x8F, 0x04, + 0x78, 0x0C, 0x78, 0x21, 0xE0, 0xC3, 0xC1, 0x0F, 0x06, 0x1E, 0x08, 0x3C, + 0x60, 0xF0, 0x41, 0xE3, 0x07, 0x82, 0x07, 0xB0, 0x3C, 0x10, 0x3D, 0x81, + 0xE0, 0x81, 0xF8, 0x0F, 0x04, 0x07, 0xC0, 0x78, 0x20, 0x3C, 0x03, 0xC1, + 0x00, 0xE0, 0x1E, 0x1C, 0x06, 0x01, 0xFB, 0xF8, 0x10, 0x1F, 0xE0, 0xFC, + 0x00, 0xFE, 0x78, 0x00, 0x70, 0x78, 0x00, 0x40, 0xF8, 0x00, 0x81, 0xF8, + 0x01, 0x02, 0xF8, 0x02, 0x04, 0xF8, 0x04, 0x08, 0xF0, 0x08, 0x11, 0xF0, + 0x10, 0x21, 0xF0, 0x20, 0x41, 0xF0, 0x40, 0x81, 0xF0, 0x81, 0x01, 0xF1, + 0x02, 0x01, 0xE2, 0x04, 0x03, 0xE4, 0x08, 0x03, 0xE8, 0x10, 0x03, 0xF0, + 0x20, 0x03, 0xE0, 0x40, 0x03, 0xC0, 0x80, 0x03, 0x81, 0x00, 0x07, 0x07, + 0x00, 0x06, 0x3F, 0x80, 0x04, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF, 0x00, + 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x07, 0x1E, + 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0xC0, + 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, 0x00, + 0x07, 0xF8, 0x00, 0x0F, 0x78, 0x00, 0x3C, 0xF0, 0x00, 0x78, 0xE0, 0x01, + 0xE1, 0xE0, 0x03, 0xC1, 0xE0, 0x0F, 0x01, 0xF0, 0x7C, 0x00, 0xFF, 0xE0, + 0x00, 0x7F, 0x00, 0xFF, 0xF8, 0x1F, 0xFF, 0x83, 0xC1, 0xF0, 0xF0, 0x1E, + 0x3C, 0x07, 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x0F, 0x3C, 0x03, 0xCF, + 0x01, 0xF3, 0xC0, 0x78, 0xF0, 0x7C, 0x3F, 0xFE, 0x0F, 0xFE, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, + 0x3C, 0x00, 0x1F, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xFF, + 0x00, 0x3E, 0x0F, 0x80, 0xF0, 0x07, 0x83, 0xC0, 0x07, 0x87, 0x80, 0x0F, + 0x1E, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF0, 0x00, 0x1D, 0xE0, 0x00, 0x3F, + 0xC0, 0x00, 0x7F, 0x80, 0x00, 0xFF, 0x00, 0x01, 0xFE, 0x00, 0x03, 0xFC, + 0x00, 0x07, 0xF8, 0x00, 0x0F, 0x70, 0x00, 0x1C, 0xF0, 0x00, 0x79, 0xE0, + 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x07, 0x01, 0xC0, 0x1C, 0x01, 0xE0, + 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xF0, + 0x03, 0xFF, 0xF0, 0x0F, 0x07, 0xC0, 0x78, 0x1E, 0x03, 0xC0, 0x78, 0x1E, + 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x78, + 0x0F, 0x0F, 0x80, 0x7F, 0xF8, 0x03, 0xFE, 0x00, 0x1E, 0x78, 0x00, 0xF1, + 0xE0, 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xE0, 0xF0, 0x0F, 0x03, 0xC0, + 0x78, 0x0F, 0x03, 0xC0, 0x7C, 0x3F, 0x01, 0xF3, 0xFC, 0x07, 0xE0, 0x07, + 0x84, 0x1F, 0xFC, 0x3C, 0x3E, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, + 0x02, 0x78, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, + 0xF8, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, + 0x0F, 0xE0, 0x0F, 0x70, 0x1E, 0x78, 0x3C, 0x4F, 0xF8, 0x43, 0xF0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x7C, 0x0F, 0x03, 0x80, 0xF0, 0x10, + 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0xFF, 0x01, 0xFD, + 0xF8, 0x01, 0xC3, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, + 0x00, 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, + 0x83, 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x83, + 0xC0, 0x02, 0x0F, 0x00, 0x08, 0x3C, 0x00, 0x20, 0xF0, 0x00, 0x81, 0xE0, + 0x04, 0x07, 0x80, 0x30, 0x0F, 0x81, 0x80, 0x1F, 0xFC, 0x00, 0x1F, 0xC0, + 0x00, 0xFF, 0xC0, 0x7F, 0x3E, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0E, 0x00, + 0x18, 0x0F, 0x00, 0x18, 0x07, 0x00, 0x10, 0x07, 0x80, 0x30, 0x07, 0x80, + 0x30, 0x03, 0xC0, 0x60, 0x03, 0xC0, 0x60, 0x01, 0xE0, 0x40, 0x01, 0xE0, + 0xC0, 0x00, 0xF0, 0xC0, 0x00, 0xF1, 0x80, 0x00, 0x71, 0x80, 0x00, 0x7B, + 0x00, 0x00, 0x3B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x9F, + 0xF0, 0x3F, 0x9F, 0x03, 0xE0, 0x07, 0x07, 0x80, 0xF0, 0x03, 0x03, 0xC0, + 0x78, 0x01, 0x80, 0xE0, 0x1E, 0x00, 0x80, 0x78, 0x0F, 0x00, 0xC0, 0x1C, + 0x03, 0x80, 0x60, 0x0F, 0x01, 0xE0, 0x20, 0x07, 0x81, 0xF0, 0x30, 0x01, + 0xC0, 0xBC, 0x18, 0x00, 0xF0, 0xDE, 0x08, 0x00, 0x78, 0x67, 0x0C, 0x00, + 0x1E, 0x23, 0xC4, 0x00, 0x0F, 0x31, 0xE6, 0x00, 0x03, 0x90, 0x7B, 0x00, + 0x01, 0xF8, 0x3D, 0x00, 0x00, 0xFC, 0x0F, 0x80, 0x00, 0x3C, 0x07, 0xC0, + 0x00, 0x1E, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x03, 0x00, 0x70, + 0x00, 0x01, 0x80, 0x10, 0x00, 0x00, 0x80, 0x08, 0x00, 0x7F, 0xE0, 0xFF, + 0x0F, 0xC0, 0x1E, 0x03, 0xE0, 0x0E, 0x00, 0xF0, 0x06, 0x00, 0x3C, 0x06, + 0x00, 0x0F, 0x06, 0x00, 0x07, 0x86, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x7B, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0x78, 0x00, 0x01, 0x9E, 0x00, 0x01, 0x87, 0x80, 0x01, + 0x83, 0xE0, 0x01, 0x80, 0xF0, 0x01, 0x80, 0x3C, 0x01, 0x80, 0x1F, 0x01, + 0xC0, 0x07, 0xC1, 0xE0, 0x03, 0xF3, 0xFE, 0x0F, 0xFE, 0xFF, 0xC0, 0xFF, + 0x7E, 0x00, 0x1C, 0x1E, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x0F, 0x00, 0x60, + 0x07, 0x80, 0x60, 0x03, 0xC0, 0xC0, 0x03, 0xE1, 0x80, 0x01, 0xE1, 0x80, + 0x00, 0xF3, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, + 0x00, 0x7E, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x9C, + 0x00, 0x78, 0xC0, 0x07, 0x84, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x3C, + 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x00, 0x00, 0x78, 0x00, 0x47, 0x80, 0x06, 0x78, 0x00, 0x33, 0x80, + 0x07, 0x3F, 0xFF, 0xFB, 0xFF, 0xFF, 0xC0, 0xFF, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0xF0, 0xC0, 0x18, 0x06, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x18, 0x06, 0x01, 0xC0, 0x30, 0x0C, + 0x03, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, + 0x1C, 0x03, 0xFE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, + 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x1F, 0xF0, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x76, 0x00, 0xCE, + 0x03, 0x8C, 0x06, 0x1C, 0x1C, 0x18, 0x30, 0x30, 0xE0, 0x31, 0x80, 0x67, + 0x00, 0x6C, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xC0, 0xE0, 0x70, + 0x18, 0x0C, 0x03, 0x1F, 0x03, 0x8C, 0x38, 0x31, 0xC1, 0x8E, 0x0C, 0x00, + 0x60, 0x0F, 0x01, 0x98, 0x30, 0xC3, 0x86, 0x38, 0x31, 0xC1, 0x8E, 0x0C, + 0x78, 0xE5, 0xFB, 0xCF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0xF8, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x39, + 0xF0, 0x3B, 0xFC, 0x3C, 0x3E, 0x38, 0x0E, 0x38, 0x0F, 0x38, 0x07, 0x38, + 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38, 0x0E, 0x38, + 0x0C, 0x3C, 0x1C, 0x1F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x7F, 0xE3, 0x87, + 0xD8, 0x0F, 0x60, 0x1B, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, + 0x0E, 0x00, 0x3C, 0x01, 0x78, 0x19, 0xFF, 0xC3, 0xFE, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0x1C, 0x00, 0x7C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x07, 0x9C, 0x1F, 0xDC, 0x38, 0x7C, 0x70, + 0x3C, 0x70, 0x1C, 0x60, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, + 0x1C, 0xE0, 0x1C, 0xF0, 0x1C, 0x70, 0x1C, 0x7C, 0x3E, 0x3F, 0xDF, 0x0F, + 0x90, 0x0F, 0x81, 0xFF, 0x08, 0x3C, 0x80, 0xE7, 0xFF, 0x7F, 0xFF, 0x00, + 0x18, 0x00, 0xC0, 0x07, 0x00, 0x38, 0x03, 0xE0, 0x37, 0x83, 0x3F, 0xF0, + 0xFF, 0x03, 0xF0, 0x01, 0xF0, 0x3F, 0xC3, 0x8E, 0x18, 0x00, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x03, 0xFE, 0x1F, 0xF0, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x0E, 0x00, 0x70, 0x07, 0xC0, 0xFF, 0x80, 0x0F, 0xC0, 0x1F, 0xFF, + 0x38, 0xFF, 0x70, 0x70, 0x70, 0x70, 0x70, 0x30, 0x70, 0x30, 0x70, 0x30, + 0x38, 0x20, 0x1C, 0x60, 0x0F, 0x80, 0x10, 0x00, 0x20, 0x00, 0x60, 0x00, + 0x7F, 0xE0, 0x3F, 0xFC, 0x1F, 0xFE, 0x20, 0x06, 0x40, 0x02, 0xC0, 0x02, + 0xC0, 0x04, 0xF0, 0x18, 0x7F, 0xF0, 0x1F, 0x80, 0x00, 0x00, 0x38, 0x00, + 0xF8, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, + 0x38, 0x00, 0x38, 0xF0, 0x3B, 0xF8, 0x3E, 0x3C, 0x3C, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x7C, 0x3E, 0xFE, 0x7F, 0x18, 0x3C, + 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0x7C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x03, 0x03, + 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC3, 0xE0, 0x70, + 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x37, 0x3B, 0xF8, 0xF8, 0x00, 0x00, + 0x1C, 0x00, 0x3E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x3F, 0x8E, 0x0F, 0x07, 0x06, 0x03, + 0x86, 0x01, 0xC4, 0x00, 0xE4, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x1D, 0xC0, + 0x0E, 0x70, 0x07, 0x1C, 0x03, 0x8F, 0x01, 0xC3, 0xC0, 0xE0, 0xF0, 0xF8, + 0x3C, 0xFE, 0x7F, 0x80, 0x00, 0x1C, 0x7C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x3C, 0xFF, 0x38, 0xF0, 0x7C, 0x3E, 0xFE, 0x7F, 0x83, + 0xE3, 0xF0, 0xE0, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07, 0x01, + 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, 0x07, + 0x01, 0xC3, 0x81, 0xC0, 0x70, 0xE0, 0x70, 0x1C, 0x38, 0x1C, 0x07, 0x0E, + 0x07, 0x01, 0xC3, 0x81, 0xE0, 0x73, 0xF9, 0xFC, 0x7F, 0x38, 0xF0, 0xFB, + 0xF8, 0x3E, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, + 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, + 0x1C, 0x78, 0x3C, 0xFE, 0x7F, 0x07, 0xE0, 0x1F, 0xF8, 0x3C, 0x7C, 0x78, + 0x3E, 0x70, 0x1E, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, + 0x0F, 0xF8, 0x0F, 0x78, 0x0E, 0x7C, 0x1C, 0x3E, 0x3C, 0x0F, 0xF0, 0x07, + 0xC0, 0x18, 0xF0, 0xFB, 0xFC, 0x3E, 0x1E, 0x38, 0x0E, 0x38, 0x0F, 0x38, + 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x07, 0x38, 0x06, 0x38, + 0x0E, 0x38, 0x0C, 0x3E, 0x1C, 0x3B, 0xF8, 0x39, 0xE0, 0x38, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFF, + 0x00, 0x07, 0xC4, 0x1F, 0xEC, 0x3C, 0x3C, 0x70, 0x1C, 0x70, 0x1C, 0x60, + 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xE0, 0x1C, 0xF0, + 0x1C, 0x70, 0x1C, 0x78, 0x3C, 0x3F, 0xDC, 0x1F, 0x1C, 0x00, 0x1C, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, + 0xFF, 0x19, 0xFF, 0x7C, 0xF3, 0x9C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, + 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x1F, 0x07, 0xF0, 0x3E, + 0x58, 0x7C, 0x0F, 0x03, 0xC0, 0x7C, 0x07, 0x80, 0xF8, 0x1F, 0x81, 0xF8, + 0x1E, 0x03, 0xC0, 0xF0, 0x3E, 0x1A, 0x7C, 0x10, 0x30, 0x70, 0xFE, 0xFE, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x79, + 0x7E, 0x3C, 0xF8, 0x7C, 0x38, 0x3C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, + 0x38, 0x1C, 0x38, 0x1C, 0x3C, 0x7C, 0x1F, 0xDF, 0x0F, 0x18, 0xFE, 0x1F, + 0x7C, 0x06, 0x38, 0x04, 0x1C, 0x04, 0x1C, 0x0C, 0x0E, 0x08, 0x0E, 0x18, + 0x07, 0x10, 0x07, 0x10, 0x07, 0x20, 0x03, 0xA0, 0x03, 0xE0, 0x01, 0xC0, + 0x01, 0xC0, 0x00, 0x80, 0x00, 0x80, 0xFC, 0x7F, 0x1F, 0x78, 0x3C, 0x06, + 0x38, 0x1C, 0x04, 0x38, 0x1C, 0x04, 0x1C, 0x1C, 0x0C, 0x1C, 0x0E, 0x08, + 0x1C, 0x1E, 0x18, 0x0E, 0x17, 0x10, 0x0E, 0x37, 0x10, 0x07, 0x23, 0x30, + 0x07, 0x63, 0xA0, 0x07, 0x43, 0xE0, 0x03, 0xC1, 0xC0, 0x03, 0x81, 0xC0, + 0x01, 0x80, 0x80, 0x01, 0x00, 0x80, 0x7F, 0x7E, 0x1E, 0x0C, 0x07, 0x8C, + 0x01, 0xC4, 0x00, 0x76, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x03, + 0xE0, 0x01, 0x70, 0x01, 0x1C, 0x01, 0x8F, 0x01, 0x83, 0x80, 0x80, 0xE0, + 0xC0, 0x79, 0xF0, 0xFF, 0xFE, 0x0F, 0x7C, 0x06, 0x38, 0x06, 0x1C, 0x04, + 0x1C, 0x0C, 0x0E, 0x0C, 0x0E, 0x08, 0x0F, 0x18, 0x07, 0x10, 0x07, 0x90, + 0x03, 0xB0, 0x03, 0xA0, 0x01, 0xE0, 0x01, 0xE0, 0x00, 0xC0, 0x00, 0xC0, + 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x7E, 0x00, + 0x7C, 0x00, 0x78, 0x00, 0x7F, 0xF9, 0xFF, 0xE6, 0x07, 0x10, 0x38, 0x00, + 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xE0, 0x07, + 0x01, 0x38, 0x0D, 0xC0, 0x3F, 0xFF, 0xBF, 0xFE, 0x07, 0x0E, 0x1C, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0x60, + 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, + 0x0E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0x38, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x08, 0x06, 0x06, + 0x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, + 0x70, 0xE0, 0x3E, 0x00, 0x7F, 0x87, 0xE3, 0xFE, 0x00, 0x7C }; + +const GFXglyph FreeSerif18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' + { 0, 4, 24, 12, 5, -23 }, // 0x21 '!' + { 12, 8, 9, 14, 3, -23 }, // 0x22 '"' + { 21, 17, 23, 17, 0, -22 }, // 0x23 '#' + { 70, 13, 27, 17, 2, -24 }, // 0x24 '$' + { 114, 25, 23, 29, 2, -22 }, // 0x25 '%' + { 186, 25, 25, 27, 1, -24 }, // 0x26 '&' + { 265, 3, 9, 7, 2, -23 }, // 0x27 ''' + { 269, 9, 30, 12, 2, -23 }, // 0x28 '(' + { 303, 9, 30, 12, 1, -22 }, // 0x29 ')' + { 337, 12, 14, 18, 3, -23 }, // 0x2A '*' + { 358, 16, 18, 20, 2, -17 }, // 0x2B '+' + { 394, 4, 9, 9, 2, -3 }, // 0x2C ',' + { 399, 8, 2, 12, 1, -8 }, // 0x2D '-' + { 401, 4, 4, 9, 2, -3 }, // 0x2E '.' + { 403, 10, 24, 10, 0, -23 }, // 0x2F '/' + { 433, 16, 24, 18, 1, -23 }, // 0x30 '0' + { 481, 10, 24, 18, 3, -23 }, // 0x31 '1' + { 511, 16, 24, 17, 1, -23 }, // 0x32 '2' + { 559, 13, 24, 17, 2, -23 }, // 0x33 '3' + { 598, 16, 23, 18, 0, -22 }, // 0x34 '4' + { 644, 13, 24, 17, 2, -23 }, // 0x35 '5' + { 683, 16, 24, 18, 1, -23 }, // 0x36 '6' + { 731, 14, 23, 18, 1, -22 }, // 0x37 '7' + { 772, 12, 25, 18, 2, -24 }, // 0x38 '8' + { 810, 16, 26, 17, 1, -24 }, // 0x39 '9' + { 862, 4, 17, 9, 2, -16 }, // 0x3A ':' + { 871, 5, 22, 9, 2, -16 }, // 0x3B ';' + { 885, 18, 18, 20, 1, -17 }, // 0x3C '<' + { 926, 18, 9, 20, 1, -12 }, // 0x3D '=' + { 947, 18, 18, 20, 1, -17 }, // 0x3E '>' + { 988, 13, 25, 16, 2, -24 }, // 0x3F '?' + { 1029, 24, 25, 30, 3, -24 }, // 0x40 '@' + { 1104, 24, 23, 25, 1, -22 }, // 0x41 'A' + { 1173, 20, 23, 22, 1, -22 }, // 0x42 'B' + { 1231, 22, 24, 23, 1, -23 }, // 0x43 'C' + { 1297, 23, 23, 25, 1, -22 }, // 0x44 'D' + { 1364, 20, 23, 21, 2, -22 }, // 0x45 'E' + { 1422, 17, 23, 20, 2, -22 }, // 0x46 'F' + { 1471, 23, 24, 25, 1, -23 }, // 0x47 'G' + { 1540, 22, 23, 25, 2, -22 }, // 0x48 'H' + { 1604, 9, 23, 11, 2, -22 }, // 0x49 'I' + { 1630, 12, 23, 13, 0, -22 }, // 0x4A 'J' + { 1665, 23, 23, 25, 2, -22 }, // 0x4B 'K' + { 1732, 19, 23, 21, 2, -22 }, // 0x4C 'L' + { 1787, 29, 23, 31, 1, -22 }, // 0x4D 'M' + { 1871, 23, 23, 25, 1, -22 }, // 0x4E 'N' + { 1938, 23, 24, 25, 1, -23 }, // 0x4F 'O' + { 2007, 18, 23, 20, 1, -22 }, // 0x50 'P' + { 2059, 23, 30, 25, 1, -23 }, // 0x51 'Q' + { 2146, 21, 23, 23, 2, -22 }, // 0x52 'R' + { 2207, 16, 24, 19, 1, -23 }, // 0x53 'S' + { 2255, 20, 23, 21, 1, -22 }, // 0x54 'T' + { 2313, 22, 23, 25, 2, -22 }, // 0x55 'U' + { 2377, 24, 23, 25, 0, -22 }, // 0x56 'V' + { 2446, 33, 23, 33, 0, -22 }, // 0x57 'W' + { 2541, 25, 23, 25, 0, -22 }, // 0x58 'X' + { 2613, 24, 23, 25, 1, -22 }, // 0x59 'Y' + { 2682, 21, 23, 21, 0, -22 }, // 0x5A 'Z' + { 2743, 7, 28, 12, 3, -22 }, // 0x5B '[' + { 2768, 10, 24, 10, 0, -23 }, // 0x5C '\' + { 2798, 7, 28, 12, 2, -22 }, // 0x5D ']' + { 2823, 15, 13, 16, 1, -22 }, // 0x5E '^' + { 2848, 18, 2, 17, 0, 3 }, // 0x5F '_' + { 2853, 8, 6, 9, 1, -23 }, // 0x60 '`' + { 2859, 13, 16, 15, 2, -15 }, // 0x61 'a' + { 2885, 16, 25, 17, 1, -24 }, // 0x62 'b' + { 2935, 14, 16, 16, 1, -15 }, // 0x63 'c' + { 2963, 16, 25, 17, 1, -24 }, // 0x64 'd' + { 3013, 13, 16, 16, 1, -15 }, // 0x65 'e' + { 3039, 13, 25, 13, 0, -24 }, // 0x66 'f' + { 3080, 16, 24, 16, 1, -15 }, // 0x67 'g' + { 3128, 16, 25, 17, 1, -24 }, // 0x68 'h' + { 3178, 8, 24, 10, 0, -23 }, // 0x69 'i' + { 3202, 9, 32, 12, 0, -23 }, // 0x6A 'j' + { 3238, 17, 25, 18, 1, -24 }, // 0x6B 'k' + { 3292, 8, 25, 9, 0, -24 }, // 0x6C 'l' + { 3317, 26, 16, 27, 1, -15 }, // 0x6D 'm' + { 3369, 16, 16, 17, 1, -15 }, // 0x6E 'n' + { 3401, 16, 16, 17, 1, -15 }, // 0x6F 'o' + { 3433, 16, 24, 17, 1, -15 }, // 0x70 'p' + { 3481, 16, 24, 17, 1, -15 }, // 0x71 'q' + { 3529, 11, 16, 12, 1, -15 }, // 0x72 'r' + { 3551, 10, 16, 13, 1, -15 }, // 0x73 's' + { 3571, 8, 19, 10, 2, -18 }, // 0x74 't' + { 3590, 16, 16, 17, 1, -15 }, // 0x75 'u' + { 3622, 16, 16, 16, 0, -15 }, // 0x76 'v' + { 3654, 24, 16, 24, 0, -15 }, // 0x77 'w' + { 3702, 17, 16, 17, 0, -15 }, // 0x78 'x' + { 3736, 16, 24, 16, 0, -15 }, // 0x79 'y' + { 3784, 14, 16, 15, 0, -15 }, // 0x7A 'z' + { 3812, 8, 30, 17, 3, -23 }, // 0x7B '{' + { 3842, 2, 24, 7, 2, -23 }, // 0x7C '|' + { 3848, 8, 30, 17, 6, -22 }, // 0x7D '}' + { 3878, 16, 4, 17, 1, -10 } }; // 0x7E '~' + +const GFXfont FreeSerif18pt7b PROGMEM = { + (uint8_t *)FreeSerif18pt7bBitmaps, + (GFXglyph *)FreeSerif18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 4558 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif24pt7b.h new file mode 100644 index 0000000..99ff3f4 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif24pt7b.h @@ -0,0 +1,690 @@ +const uint8_t FreeSerif24pt7bBitmaps[] PROGMEM = { + 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x61, 0x08, + 0x42, 0x10, 0x84, 0x00, 0x00, 0xEF, 0xFF, 0xEE, 0x60, 0x6F, 0x0F, 0xF0, + 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, + 0x66, 0x06, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x07, + 0x03, 0x80, 0x0E, 0x06, 0x00, 0x18, 0x0C, 0x00, 0x30, 0x38, 0x00, 0xE0, + 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC1, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, + 0xF0, 0x18, 0x0C, 0x00, 0x70, 0x38, 0x00, 0xE0, 0x70, 0x01, 0xC0, 0xE0, + 0x03, 0x81, 0xC0, 0x07, 0x03, 0x80, 0x0C, 0x06, 0x07, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x06, + 0x03, 0x80, 0x0C, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, + 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x08, + 0x00, 0x01, 0x00, 0x01, 0xFC, 0x01, 0xE4, 0xF8, 0x70, 0x87, 0x9C, 0x10, + 0x77, 0x02, 0x06, 0xE0, 0x40, 0xDC, 0x08, 0x0B, 0x81, 0x00, 0x78, 0x20, + 0x07, 0x84, 0x00, 0xFC, 0x80, 0x0F, 0xF0, 0x00, 0xFE, 0x00, 0x07, 0xF0, + 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x3F, 0xC0, 0x05, 0xFC, 0x00, 0x8F, + 0x80, 0x10, 0xF8, 0x02, 0x0F, 0x00, 0x40, 0xF0, 0x08, 0x1E, 0x01, 0x03, + 0xE0, 0x20, 0x7C, 0x04, 0x0F, 0xC0, 0x83, 0xBC, 0x10, 0xE3, 0xE2, 0x78, + 0x3F, 0xFE, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFC, 0x01, 0xE0, 0x03, 0xC7, 0x81, 0xE0, + 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xE0, 0x10, 0x30, + 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0, 0x02, 0x1C, + 0x00, 0x78, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C, 0x01, 0x86, + 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1, 0x80, 0xC3, + 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0xC1, 0x87, 0x81, 0x8F, 0x81, + 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0, 0x10, 0x00, + 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0, 0x06, 0x00, + 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C, 0x01, 0x00, + 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01, 0xC3, 0x80, + 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x70, 0xE0, 0x00, + 0x00, 0xE0, 0x60, 0x00, 0x00, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00, + 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x30, 0x00, 0x01, 0xC0, 0x70, 0x00, + 0x01, 0xE0, 0xE0, 0x00, 0x01, 0xE1, 0xC0, 0x00, 0x00, 0xF3, 0x80, 0x00, + 0x00, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x03, 0xF0, 0x00, 0xF8, 0x01, 0xE0, + 0x01, 0xFC, 0x01, 0xC0, 0x07, 0x7C, 0x01, 0xC0, 0x0F, 0x3E, 0x01, 0x80, + 0x1E, 0x3E, 0x03, 0x00, 0x3C, 0x1F, 0x03, 0x00, 0x7C, 0x1F, 0x06, 0x00, + 0x78, 0x0F, 0x86, 0x00, 0x78, 0x07, 0xCC, 0x00, 0xF8, 0x07, 0xE8, 0x00, + 0xF8, 0x03, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x00, 0xF8, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0xFC, 0x01, 0xFC, 0x01, 0xFE, 0x01, 0x7E, 0x03, 0xBF, 0x86, + 0x7F, 0x0F, 0x1F, 0xFE, 0x3F, 0xFC, 0x0F, 0xF8, 0x0F, 0xE0, 0x03, 0xF0, + 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x66, 0x00, 0x10, 0x02, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x38, 0x03, 0x80, + 0x78, 0x07, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x07, 0x80, + 0x38, 0x03, 0x80, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x06, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0x00, 0x60, 0x07, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x1C, + 0x01, 0xE0, 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0E, 0x00, 0xE0, 0x1E, + 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x0E, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x40, 0x08, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, + 0x43, 0x86, 0xE1, 0x0F, 0xF1, 0x1F, 0xF9, 0x3E, 0x3D, 0x78, 0x07, 0xC0, + 0x01, 0x00, 0x07, 0xC0, 0x19, 0x30, 0xF9, 0x1E, 0xF1, 0x0F, 0xE1, 0x07, + 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x38, 0x00, 0x00, + 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, + 0x00, 0x00, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, + 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, + 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x73, 0xEF, 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00, + 0xFF, 0xFF, 0xFC, 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x1C, 0x00, 0xE0, 0x03, + 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x03, + 0x80, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, + 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x07, + 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x1C, 0x00, 0x70, 0x38, 0x03, + 0x80, 0x70, 0x1E, 0x01, 0xE0, 0xF0, 0x03, 0x83, 0xC0, 0x0F, 0x0F, 0x00, + 0x3C, 0x7C, 0x00, 0xF9, 0xE0, 0x01, 0xE7, 0x80, 0x07, 0xBE, 0x00, 0x1F, + 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, + 0x7F, 0xE0, 0x01, 0xF7, 0x80, 0x07, 0x9E, 0x00, 0x1E, 0x7C, 0x00, 0xF8, + 0xF0, 0x03, 0xC3, 0xC0, 0x0F, 0x07, 0x00, 0x38, 0x1E, 0x01, 0xE0, 0x38, + 0x07, 0x00, 0x70, 0x38, 0x00, 0xE1, 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x80, + 0x1C, 0x03, 0xE0, 0x7F, 0x0C, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x3F, + 0x0F, 0xFF, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x07, 0xFF, 0xE0, 0x70, 0x3F, + 0x83, 0x00, 0x7C, 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3C, 0x80, + 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, + 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x70, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x43, 0x00, + 0x02, 0x30, 0x00, 0x23, 0xFF, 0xFF, 0x3F, 0xFF, 0xF3, 0xFF, 0xFF, 0x80, + 0x03, 0xF8, 0x03, 0xFF, 0x01, 0x83, 0xE0, 0x80, 0x3C, 0x40, 0x0F, 0x10, + 0x01, 0xC8, 0x00, 0x70, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, + 0x80, 0x00, 0xC0, 0x00, 0x78, 0x00, 0x7F, 0x80, 0x7F, 0xF0, 0x01, 0xFE, + 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x1C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x0C, 0x70, 0x06, 0x3F, 0x07, 0x0F, 0xFF, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x01, + 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xDC, 0x00, 0x0C, 0xE0, 0x00, 0x47, 0x00, + 0x06, 0x38, 0x00, 0x61, 0xC0, 0x06, 0x0E, 0x00, 0x30, 0x70, 0x03, 0x03, + 0x80, 0x30, 0x1C, 0x01, 0x80, 0xE0, 0x18, 0x07, 0x01, 0x80, 0x38, 0x08, + 0x01, 0xC0, 0xC0, 0x0E, 0x0C, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE0, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x00, + 0x40, 0x7F, 0xF8, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0xC0, 0x00, 0x18, 0x00, + 0x06, 0x00, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x07, 0xF8, 0x00, 0xFF, 0xC0, + 0x3F, 0xFE, 0x00, 0xFF, 0xE0, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x30, + 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x71, 0xE0, 0x1C, 0x3F, 0x07, 0x07, + 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xC7, 0xE0, 0x3E, 0xFF, 0xC3, 0xF8, 0x3F, 0x1F, 0x80, 0x7C, 0xF8, + 0x03, 0xF7, 0xC0, 0x0F, 0xBE, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0x80, 0x0F, + 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x00, 0x1F, 0x78, 0x00, 0xFB, 0xE0, + 0x07, 0x9F, 0x00, 0x3C, 0x78, 0x03, 0xE3, 0xE0, 0x1E, 0x0F, 0x81, 0xE0, + 0x3E, 0x1E, 0x00, 0xFF, 0xE0, 0x00, 0xFC, 0x00, 0x3F, 0xFF, 0xF3, 0xFF, + 0xFF, 0x3F, 0xFF, 0xE7, 0x00, 0x0E, 0x40, 0x00, 0xEC, 0x00, 0x1C, 0x80, + 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x38, + 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, + 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x1E, 0x00, 0x01, + 0xC0, 0x00, 0x03, 0xF0, 0x03, 0xFF, 0x03, 0xC1, 0xE0, 0xC0, 0x1C, 0x70, + 0x07, 0x18, 0x00, 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xF0, 0x03, 0xBC, 0x00, + 0xE7, 0x80, 0x71, 0xF0, 0x38, 0x3E, 0x1C, 0x07, 0xEE, 0x00, 0xFE, 0x00, + 0x1F, 0xC0, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC7, 0xE0, 0xE0, 0xFC, 0x70, + 0x0F, 0x98, 0x01, 0xEE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x01, 0xF8, 0x00, + 0x7E, 0x00, 0x1F, 0xC0, 0x07, 0x70, 0x03, 0x9E, 0x00, 0xE3, 0xE0, 0xF0, + 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC3, + 0xE0, 0x3C, 0x0F, 0x83, 0xC0, 0x3C, 0x3E, 0x00, 0xF1, 0xE0, 0x07, 0xCF, + 0x00, 0x3E, 0xF8, 0x00, 0xF7, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xF0, 0x01, + 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0, 0x03, 0xEF, 0x80, 0x1F, 0x7C, + 0x00, 0xF9, 0xF0, 0x0F, 0xC7, 0xE1, 0xFC, 0x1F, 0xF9, 0xE0, 0x3F, 0x1F, + 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, + 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, + 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x00, 0x77, 0xFF, 0xF7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, 0xB8, 0x39, 0xF7, + 0xDF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xEF, + 0xFF, 0x7C, 0x10, 0x42, 0x08, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, + 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x07, + 0xF8, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, + 0x0F, 0xFE, 0x0C, 0x1F, 0x88, 0x03, 0xEC, 0x01, 0xF7, 0x00, 0x7F, 0xC0, + 0x3F, 0xE0, 0x1F, 0x70, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0x30, 0x00, 0x10, + 0x00, 0x18, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x03, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x3F, + 0xFF, 0x00, 0x00, 0xFC, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x07, 0xC0, + 0x00, 0x30, 0x0F, 0x00, 0x00, 0x18, 0x1E, 0x00, 0x00, 0x0C, 0x1E, 0x00, + 0x00, 0x04, 0x3C, 0x00, 0xF8, 0x06, 0x3C, 0x01, 0xFD, 0xC2, 0x78, 0x03, + 0xC7, 0xC3, 0x78, 0x07, 0x07, 0x81, 0xF0, 0x0E, 0x03, 0x81, 0xF0, 0x0E, + 0x03, 0x81, 0xF0, 0x1C, 0x07, 0x81, 0xF0, 0x1C, 0x07, 0x01, 0xF0, 0x38, + 0x07, 0x01, 0xF0, 0x38, 0x07, 0x03, 0xF0, 0x38, 0x0F, 0x02, 0xF0, 0x38, + 0x0E, 0x02, 0xF0, 0x38, 0x1E, 0x04, 0x78, 0x38, 0x1E, 0x0C, 0x78, 0x1C, + 0x6E, 0x18, 0x38, 0x1F, 0xC7, 0xF0, 0x3C, 0x0F, 0x03, 0xE0, 0x1E, 0x00, + 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x60, 0x00, 0xFC, 0x03, 0xE0, 0x00, 0x3F, + 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x0D, + 0xF0, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x00, 0x18, 0xF0, 0x00, 0x00, 0x18, + 0xF8, 0x00, 0x00, 0x38, 0x78, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x00, 0x30, + 0x7C, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x60, 0x3E, 0x00, 0x00, 0xE0, + 0x1E, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x01, 0x80, + 0x0F, 0x80, 0x01, 0xFF, 0xFF, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, 0x00, + 0x07, 0xC0, 0x07, 0x00, 0x07, 0xC0, 0x06, 0x00, 0x03, 0xE0, 0x06, 0x00, + 0x03, 0xE0, 0x0E, 0x00, 0x01, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x1C, 0x00, + 0x01, 0xF8, 0x3C, 0x00, 0x01, 0xF8, 0x7E, 0x00, 0x01, 0xFC, 0xFF, 0x80, + 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0x80, 0x1F, 0x01, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF8, 0x0F, 0x80, 0x1F, 0x81, 0xF0, + 0x01, 0xF0, 0x3E, 0x00, 0x3E, 0x07, 0xC0, 0x07, 0xC0, 0xF8, 0x00, 0xF8, + 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07, 0xC0, 0x7C, 0x01, 0xF0, 0x0F, 0x80, + 0xFC, 0x01, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xC0, 0x07, 0xC0, 0x7F, 0x00, + 0xF8, 0x01, 0xF0, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x03, 0xE0, 0x7C, 0x00, + 0x3E, 0x0F, 0x80, 0x07, 0xC1, 0xF0, 0x00, 0xF8, 0x3E, 0x00, 0x1F, 0x07, + 0xC0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x1F, 0x00, 0x1F, 0x03, 0xE0, 0x07, + 0xC0, 0x7C, 0x07, 0xF0, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x00, 0x00, + 0x1F, 0xF0, 0x20, 0x07, 0xFF, 0xEE, 0x01, 0xF8, 0x1F, 0xE0, 0x3E, 0x00, + 0x7E, 0x07, 0x80, 0x01, 0xE0, 0xF0, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0xE3, + 0xE0, 0x00, 0x06, 0x3C, 0x00, 0x00, 0x67, 0xC0, 0x00, 0x02, 0x7C, 0x00, + 0x00, 0x27, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x02, 0x0F, 0x80, 0x00, 0xE0, 0x7E, 0x00, 0x1C, 0x03, 0xF8, 0x0F, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, + 0xFF, 0xF8, 0x00, 0x3E, 0x03, 0xFC, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0xF8, + 0x00, 0x7E, 0x01, 0xF0, 0x00, 0x7E, 0x03, 0xE0, 0x00, 0x7C, 0x07, 0xC0, + 0x00, 0x7C, 0x0F, 0x80, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0xF8, 0x3E, 0x00, + 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xF0, 0xF8, 0x00, 0x03, 0xE1, 0xF0, 0x00, + 0x07, 0xC3, 0xE0, 0x00, 0x0F, 0x87, 0xC0, 0x00, 0x1F, 0x0F, 0x80, 0x00, + 0x3E, 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, + 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xF0, 0x00, 0x0F, 0x83, 0xE0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0x7C, 0x0F, 0x80, 0x01, 0xF0, 0x1F, 0x00, 0x03, 0xE0, + 0x3E, 0x00, 0x1F, 0x80, 0x7C, 0x00, 0x7C, 0x00, 0xF8, 0x0F, 0xF0, 0x07, + 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, + 0xFF, 0xFF, 0xE0, 0x7C, 0x00, 0x1C, 0x0F, 0x80, 0x01, 0x81, 0xF0, 0x00, + 0x30, 0x3E, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x0F, 0x80, 0x04, + 0x01, 0xF0, 0x01, 0x80, 0x3E, 0x00, 0x70, 0x07, 0xFF, 0xFE, 0x00, 0xFF, + 0xFF, 0xC0, 0x1F, 0x00, 0x38, 0x03, 0xE0, 0x03, 0x00, 0x7C, 0x00, 0x20, + 0x0F, 0x80, 0x04, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0x1F, 0x00, 0x00, 0x43, 0xE0, 0x00, 0x18, + 0x7C, 0x00, 0x07, 0x0F, 0x80, 0x01, 0xC1, 0xF0, 0x00, 0xF8, 0x7F, 0xFF, + 0xFF, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, + 0x00, 0x07, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x1F, 0x00, 0x01, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x38, 0x1F, + 0xFF, 0xF8, 0x1F, 0xFF, 0xF8, 0x1F, 0x00, 0x38, 0x1F, 0x00, 0x18, 0x1F, + 0x00, 0x08, 0x1F, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0xFF, + 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00, 0xFF, 0xFE, 0x70, 0x07, 0xE0, + 0x1F, 0xE0, 0x1F, 0x00, 0x0F, 0xC0, 0x78, 0x00, 0x07, 0x81, 0xE0, 0x00, + 0x07, 0x07, 0xC0, 0x00, 0x0E, 0x1F, 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x00, + 0x08, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, + 0x7C, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x01, 0xFD, 0xF0, 0x00, 0x01, 0xF3, + 0xE0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x07, 0xCF, 0x80, 0x00, 0x0F, 0x8F, + 0x80, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x7C, 0x3E, + 0x00, 0x00, 0xF8, 0x7C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0xFC, + 0x00, 0x07, 0xC0, 0xFC, 0x00, 0x0F, 0x80, 0x7C, 0x00, 0x3F, 0x00, 0x7F, + 0x01, 0xFC, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xE0, + 0x1F, 0xFC, 0xFE, 0x00, 0x1F, 0xC1, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, + 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, + 0x00, 0x0F, 0x81, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x1F, 0x00, + 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, + 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, 0xF0, 0x00, 0x3E, + 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0x7C, 0x00, 0x0F, 0x81, + 0xF0, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0xF8, 0x1F, 0x00, 0x03, 0xE0, 0xFE, + 0x00, 0x1F, 0xCF, 0xFE, 0x01, 0xFF, 0xC0, 0xFF, 0xF8, 0xFE, 0x03, 0xE0, + 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, + 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, + 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, + 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0xE3, 0xFF, 0xE0, 0x0F, 0xFF, + 0x80, 0xFE, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, + 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x0E, 0x1E, 0x0F, 0x8F, 0x07, + 0xCF, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0xFF, 0xF8, 0x3F, 0xFC, 0x3F, 0xC0, + 0x07, 0xE0, 0x0F, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x07, 0x00, 0x0F, 0x80, + 0x0E, 0x00, 0x0F, 0x80, 0x1C, 0x00, 0x0F, 0x80, 0x38, 0x00, 0x0F, 0x80, + 0x70, 0x00, 0x0F, 0x80, 0xE0, 0x00, 0x0F, 0x81, 0xC0, 0x00, 0x0F, 0x83, + 0x80, 0x00, 0x0F, 0x87, 0x00, 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x0F, 0xBC, + 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x0F, 0xDF, + 0x80, 0x00, 0x0F, 0x8F, 0xC0, 0x00, 0x0F, 0x87, 0xE0, 0x00, 0x0F, 0x83, + 0xF0, 0x00, 0x0F, 0x81, 0xF8, 0x00, 0x0F, 0x80, 0xFC, 0x00, 0x0F, 0x80, + 0x7E, 0x00, 0x0F, 0x80, 0x3F, 0x00, 0x0F, 0x80, 0x3F, 0x80, 0x0F, 0x80, + 0x1F, 0x80, 0x0F, 0x80, 0x0F, 0xC0, 0x0F, 0x80, 0x07, 0xE0, 0x0F, 0x80, + 0x07, 0xF0, 0x1F, 0xC0, 0x07, 0xFC, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF0, + 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x7C, 0x00, 0x01, 0x1F, 0x00, 0x00, 0xC7, 0xC0, 0x00, 0x21, 0xF0, + 0x00, 0x18, 0x7C, 0x00, 0x0E, 0x1F, 0x00, 0x1F, 0x8F, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFF, 0xF0, 0xFF, 0x80, 0x00, 0x03, 0xFE, 0x7F, 0x80, 0x00, 0x07, + 0xF0, 0x3F, 0x00, 0x00, 0x1F, 0xC0, 0x7E, 0x00, 0x00, 0x3F, 0x80, 0xFE, + 0x00, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x01, 0xBE, 0x03, 0x7C, 0x00, 0x03, + 0x7C, 0x06, 0xF8, 0x00, 0x0E, 0xF8, 0x0D, 0xF8, 0x00, 0x19, 0xF0, 0x19, + 0xF0, 0x00, 0x73, 0xE0, 0x33, 0xF0, 0x00, 0xC7, 0xC0, 0x63, 0xE0, 0x03, + 0x8F, 0x80, 0xC7, 0xE0, 0x06, 0x1F, 0x01, 0x87, 0xC0, 0x1C, 0x3E, 0x03, + 0x0F, 0xC0, 0x30, 0x7C, 0x06, 0x0F, 0x80, 0x60, 0xF8, 0x0C, 0x1F, 0x81, + 0x81, 0xF0, 0x18, 0x1F, 0x03, 0x03, 0xE0, 0x30, 0x3F, 0x0C, 0x07, 0xC0, + 0x60, 0x3E, 0x18, 0x0F, 0x80, 0xC0, 0x7C, 0x70, 0x1F, 0x01, 0x80, 0x7C, + 0xC0, 0x3E, 0x03, 0x00, 0xFB, 0x80, 0x7C, 0x06, 0x00, 0xFE, 0x00, 0xF8, + 0x0C, 0x01, 0xFC, 0x01, 0xF0, 0x18, 0x03, 0xF0, 0x03, 0xE0, 0x30, 0x03, + 0xE0, 0x07, 0xC0, 0x60, 0x07, 0x80, 0x0F, 0x81, 0xE0, 0x07, 0x00, 0x1F, + 0x07, 0xE0, 0x0C, 0x00, 0xFF, 0x3F, 0xF0, 0x08, 0x07, 0xFF, 0x80, 0xFF, + 0x00, 0x03, 0xFF, 0x3F, 0x80, 0x00, 0xFC, 0x1F, 0xC0, 0x00, 0x78, 0x0F, + 0xC0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xF0, 0x00, 0x30, 0x0D, + 0xF8, 0x00, 0x30, 0x0D, 0xFC, 0x00, 0x30, 0x0C, 0xFC, 0x00, 0x30, 0x0C, + 0x7E, 0x00, 0x30, 0x0C, 0x3F, 0x00, 0x30, 0x0C, 0x1F, 0x80, 0x30, 0x0C, + 0x1F, 0xC0, 0x30, 0x0C, 0x0F, 0xE0, 0x30, 0x0C, 0x07, 0xE0, 0x30, 0x0C, + 0x03, 0xF0, 0x30, 0x0C, 0x01, 0xF8, 0x30, 0x0C, 0x01, 0xFC, 0x30, 0x0C, + 0x00, 0xFE, 0x30, 0x0C, 0x00, 0x7E, 0x30, 0x0C, 0x00, 0x3F, 0x30, 0x0C, + 0x00, 0x1F, 0xB0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, + 0x00, 0x07, 0xF0, 0x0C, 0x00, 0x03, 0xF0, 0x0C, 0x00, 0x01, 0xF0, 0x0C, + 0x00, 0x00, 0xF0, 0x1E, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x70, 0xFF, + 0xC0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xE0, 0x00, 0x03, + 0xFF, 0xF0, 0x00, 0x1F, 0x03, 0xE0, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, + 0x07, 0xC0, 0x7C, 0x00, 0x0F, 0x01, 0xE0, 0x00, 0x1E, 0x0F, 0x80, 0x00, + 0x7C, 0x3C, 0x00, 0x00, 0xF1, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F, + 0x9E, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFF, + 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xE0, + 0x00, 0x01, 0xFF, 0x80, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x1F, 0xF8, 0x00, + 0x00, 0x7D, 0xF0, 0x00, 0x03, 0xE7, 0xC0, 0x00, 0x0F, 0x9F, 0x00, 0x00, + 0x3E, 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x07, 0xC1, 0xE0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0x80, 0x07, 0xC0, 0x1F, 0x00, 0x3E, 0x00, + 0x1F, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0x80, 0x7C, 0x1F, 0xC0, 0xF8, 0x07, 0xC1, 0xF0, + 0x07, 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x0F, 0x8F, 0x80, 0x1F, 0x1F, 0x00, + 0x3E, 0x3E, 0x00, 0x7C, 0x7C, 0x00, 0xF8, 0xF8, 0x01, 0xF1, 0xF0, 0x07, + 0xC3, 0xE0, 0x0F, 0x87, 0xC0, 0x3E, 0x0F, 0x81, 0xF8, 0x1F, 0xFF, 0xC0, + 0x3F, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xF0, + 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFF, 0xF8, + 0x00, 0x07, 0xC0, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x7C, + 0x03, 0xE0, 0x00, 0x7C, 0x07, 0x80, 0x00, 0x78, 0x1F, 0x00, 0x00, 0xF8, + 0x3C, 0x00, 0x00, 0xF0, 0xF8, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x03, 0xE3, + 0xC0, 0x00, 0x03, 0xCF, 0x80, 0x00, 0x07, 0xDF, 0x00, 0x00, 0x0F, 0xBE, + 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x3E, 0xF8, 0x00, 0x00, 0x7D, 0xF0, + 0x00, 0x00, 0xFB, 0xE0, 0x00, 0x01, 0xF7, 0xC0, 0x00, 0x03, 0xEF, 0x80, + 0x00, 0x07, 0xCF, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x3E, 0x3E, 0x00, + 0x00, 0x7C, 0x3C, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x03, 0xE0, 0x78, 0x00, + 0x0F, 0x80, 0x78, 0x00, 0x1E, 0x00, 0x78, 0x00, 0x78, 0x00, 0x7C, 0x03, + 0xE0, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x1F, + 0x03, 0xF8, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x03, + 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01, + 0xF0, 0x03, 0xE0, 0x1F, 0x00, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x0F, 0x80, 0x1F, 0x07, 0xF0, 0x01, 0xFF, 0xFC, 0x00, + 0x1F, 0xFE, 0x00, 0x01, 0xF1, 0xF0, 0x00, 0x1F, 0x1F, 0x80, 0x01, 0xF0, + 0xF8, 0x00, 0x1F, 0x07, 0xC0, 0x01, 0xF0, 0x3E, 0x00, 0x1F, 0x03, 0xF0, + 0x01, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0xFC, 0x01, 0xF0, 0x07, 0xC0, 0x1F, + 0x00, 0x7E, 0x01, 0xF0, 0x03, 0xF0, 0x1F, 0x00, 0x1F, 0x83, 0xF8, 0x00, + 0xFC, 0xFF, 0xF0, 0x0F, 0xF0, 0x03, 0xF0, 0x20, 0x7F, 0xF3, 0x07, 0xC1, + 0xF8, 0x78, 0x03, 0xC3, 0x80, 0x0E, 0x3C, 0x00, 0x31, 0xE0, 0x01, 0xCF, + 0x00, 0x06, 0x7C, 0x00, 0x33, 0xE0, 0x01, 0x9F, 0x80, 0x00, 0x7E, 0x00, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xC0, 0x01, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x7F, + 0x00, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, + 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1F, 0x3C, 0x01, 0xF1, + 0xF8, 0x1F, 0x0C, 0xFF, 0xF0, 0x40, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x7C, 0x07, 0xF0, 0x0F, 0x80, 0x3C, 0x01, 0xF0, + 0x07, 0x00, 0x3E, 0x00, 0x60, 0x07, 0xC0, 0x08, 0x00, 0xF8, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x7F, + 0x00, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00, + 0xFC, 0x0F, 0x80, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, + 0x30, 0x0F, 0x80, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x20, 0x07, 0xC0, 0x00, + 0x60, 0x07, 0xC0, 0x00, 0x60, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xF0, 0x01, + 0xC0, 0x01, 0xFC, 0x07, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x0F, 0xF8, + 0x00, 0xFF, 0xF8, 0x01, 0xFF, 0x3F, 0xC0, 0x00, 0x7E, 0x0F, 0x80, 0x00, + 0x3C, 0x0F, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00, 0x38, 0x07, 0xC0, 0x00, + 0x30, 0x03, 0xE0, 0x00, 0x70, 0x03, 0xE0, 0x00, 0x60, 0x01, 0xF0, 0x00, + 0x60, 0x01, 0xF0, 0x00, 0xE0, 0x01, 0xF8, 0x00, 0xC0, 0x00, 0xF8, 0x01, + 0xC0, 0x00, 0xF8, 0x01, 0x80, 0x00, 0x7C, 0x01, 0x80, 0x00, 0x7C, 0x03, + 0x80, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x1F, 0x06, + 0x00, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x1F, 0x8E, 0x00, 0x00, 0x0F, 0x8C, + 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x07, 0xD8, 0x00, 0x00, 0x07, 0xD8, + 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0xE0, + 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xF1, 0xFF, + 0xF0, 0x1F, 0xF3, 0xF8, 0x07, 0xF8, 0x00, 0x7C, 0x1F, 0x80, 0x3F, 0x00, + 0x03, 0x80, 0xF8, 0x01, 0xF0, 0x00, 0x30, 0x0F, 0x80, 0x1F, 0x00, 0x03, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x30, 0x07, 0xC0, 0x0F, 0x80, 0x06, 0x00, + 0x3E, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0xC0, 0x06, 0x00, 0x3E, + 0x00, 0x7C, 0x00, 0xC0, 0x01, 0xF0, 0x07, 0xE0, 0x0C, 0x00, 0x1F, 0x00, + 0xFE, 0x01, 0xC0, 0x01, 0xF0, 0x0D, 0xE0, 0x18, 0x00, 0x0F, 0x80, 0xDF, + 0x01, 0x80, 0x00, 0xF8, 0x19, 0xF0, 0x30, 0x00, 0x07, 0xC1, 0x8F, 0x83, + 0x00, 0x00, 0x7C, 0x38, 0xF8, 0x30, 0x00, 0x07, 0xC3, 0x0F, 0x86, 0x00, + 0x00, 0x3E, 0x30, 0x7C, 0x60, 0x00, 0x03, 0xE7, 0x07, 0xCE, 0x00, 0x00, + 0x3E, 0x60, 0x3E, 0xC0, 0x00, 0x01, 0xF6, 0x03, 0xEC, 0x00, 0x00, 0x1F, + 0xE0, 0x3F, 0xC0, 0x00, 0x01, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0xC0, + 0x1F, 0x80, 0x00, 0x00, 0xF8, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0x80, 0x0F, + 0x00, 0x00, 0x00, 0x78, 0x00, 0xF0, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x7F, 0xFE, 0x03, 0xFF, 0x8F, 0xF8, 0x00, + 0x7E, 0x01, 0xFC, 0x00, 0x1C, 0x00, 0x7E, 0x00, 0x1C, 0x00, 0x1F, 0x00, + 0x0C, 0x00, 0x07, 0xC0, 0x0E, 0x00, 0x03, 0xF0, 0x0E, 0x00, 0x00, 0xF8, + 0x0E, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x00, 0x1F, 0x86, 0x00, 0x00, 0x07, + 0xC7, 0x00, 0x00, 0x01, 0xF7, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x3F, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x03, 0x9F, 0x00, 0x00, + 0x01, 0x8F, 0xC0, 0x00, 0x01, 0x83, 0xF0, 0x00, 0x01, 0xC0, 0xF8, 0x00, + 0x01, 0xC0, 0x7E, 0x00, 0x01, 0xC0, 0x1F, 0x80, 0x01, 0xC0, 0x07, 0xC0, + 0x00, 0xC0, 0x03, 0xF0, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0xE0, 0x00, 0x7F, + 0x00, 0xF0, 0x00, 0x1F, 0x80, 0xFC, 0x00, 0x1F, 0xF3, 0xFF, 0x80, 0x7F, + 0xFE, 0xFF, 0xF8, 0x03, 0xFF, 0x3F, 0xE0, 0x00, 0x7C, 0x1F, 0xC0, 0x00, + 0x78, 0x0F, 0xC0, 0x00, 0x70, 0x07, 0xE0, 0x00, 0x60, 0x03, 0xF0, 0x00, + 0xE0, 0x01, 0xF0, 0x01, 0xC0, 0x01, 0xF8, 0x01, 0x80, 0x00, 0xFC, 0x03, + 0x80, 0x00, 0x7C, 0x07, 0x00, 0x00, 0x7E, 0x06, 0x00, 0x00, 0x3F, 0x0E, + 0x00, 0x00, 0x1F, 0x1C, 0x00, 0x00, 0x1F, 0x98, 0x00, 0x00, 0x0F, 0xF8, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xF8, + 0xF0, 0x00, 0x3E, 0x38, 0x00, 0x0F, 0x86, 0x00, 0x03, 0xF0, 0xC0, 0x00, + 0x7C, 0x10, 0x00, 0x1F, 0x02, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7E, + 0x00, 0x01, 0x0F, 0x80, 0x00, 0x63, 0xF0, 0x00, 0x0C, 0xFC, 0x00, 0x03, + 0xBF, 0x00, 0x00, 0xE7, 0xC0, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, + 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0F, 0x07, 0xFC, 0xE0, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, + 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, 0x01, + 0xC0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xFF, 0x83, 0xC0, 0xE0, 0x70, 0x38, 0x1C, + 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, + 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x3F, 0xFC, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xDC, + 0x00, 0x39, 0xC0, 0x07, 0x9E, 0x00, 0x70, 0xE0, 0x0F, 0x0F, 0x00, 0xE0, + 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78, + 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x3C, 0x0F, 0x81, 0xF0, 0x1E, 0x03, 0xC0, 0x38, 0x07, 0x03, + 0xF0, 0x07, 0x0E, 0x03, 0x81, 0xC1, 0xE0, 0x30, 0x78, 0x0E, 0x1E, 0x03, + 0x83, 0x00, 0xE0, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x73, 0x80, 0x70, 0xE0, + 0x70, 0x38, 0x38, 0x0E, 0x1C, 0x03, 0x8F, 0x00, 0xE3, 0xC0, 0x38, 0xF0, + 0x0E, 0x3E, 0x07, 0x8F, 0xC3, 0xE1, 0xFF, 0x3F, 0x1F, 0x07, 0x80, 0x06, + 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x07, 0x80, 0x00, 0x3C, 0x7E, 0x01, 0xEF, 0xFC, 0x0F, 0xC3, 0xF0, + 0x7C, 0x07, 0x83, 0xC0, 0x3E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xC7, 0x80, + 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F, 0x00, 0x3C, 0x78, 0x01, 0xE3, + 0xC0, 0x0F, 0x1E, 0x00, 0x70, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x3C, 0x01, + 0xC1, 0xE0, 0x1C, 0x0F, 0xC1, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80, 0x01, + 0xFC, 0x00, 0xFF, 0xE0, 0x38, 0x3E, 0x0E, 0x03, 0xE3, 0x80, 0x7C, 0xE0, + 0x07, 0x18, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, + 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x1B, 0xC0, + 0x02, 0x7C, 0x01, 0x87, 0xE0, 0x60, 0x7F, 0xF8, 0x07, 0xFE, 0x00, 0x3F, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x7C, 0x78, 0x07, 0xFD, + 0xE0, 0x3C, 0x3F, 0x81, 0xC0, 0x3E, 0x0E, 0x00, 0xF8, 0x38, 0x01, 0xE1, + 0xE0, 0x07, 0x87, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xC0, + 0x07, 0x8F, 0x00, 0x1E, 0x3C, 0x00, 0x78, 0xF0, 0x01, 0xE3, 0xE0, 0x07, + 0x87, 0x80, 0x1E, 0x1F, 0x00, 0x78, 0x3E, 0x03, 0xE0, 0xFC, 0x1F, 0xF0, + 0xFF, 0xDF, 0x00, 0xFC, 0x60, 0x03, 0xF8, 0x03, 0xFF, 0x01, 0xC1, 0xE0, + 0xC0, 0x3C, 0x70, 0x0F, 0x98, 0x01, 0xE7, 0xFF, 0xFB, 0xFF, 0xFE, 0xE0, + 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, + 0x1F, 0x00, 0x05, 0xE0, 0x02, 0x7C, 0x01, 0x8F, 0xC1, 0xC3, 0xFF, 0xE0, + 0x7F, 0xF0, 0x07, 0xF0, 0x00, 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xE3, 0xE0, + 0x60, 0x70, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x07, 0xFF, 0x83, 0xFF, 0xC0, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3F, + 0x00, 0xFF, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF0, 0x03, 0xC7, 0xFE, + 0x3C, 0x1F, 0xF1, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0xF0, 0x0E, 0x07, 0x80, + 0x70, 0x3C, 0x03, 0x81, 0xE0, 0x1C, 0x07, 0x80, 0xC0, 0x3E, 0x0E, 0x00, + 0x78, 0xE0, 0x01, 0xFC, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, + 0x01, 0xE0, 0x00, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0x80, 0xFF, 0xFE, 0x0C, + 0x00, 0x38, 0xC0, 0x00, 0x4C, 0x00, 0x02, 0x60, 0x00, 0x17, 0x00, 0x01, + 0x38, 0x00, 0x09, 0xE0, 0x00, 0x87, 0xC0, 0x38, 0x1F, 0xFF, 0x00, 0x3F, + 0xC0, 0x00, 0x06, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, + 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x87, 0xE0, 0x1E, + 0x7F, 0xC0, 0x7B, 0x0F, 0x81, 0xF8, 0x1E, 0x07, 0x80, 0x3C, 0x1E, 0x00, + 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, + 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, + 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, + 0xC3, 0xF0, 0x1F, 0x9F, 0xF1, 0xFF, 0x0E, 0x03, 0xE0, 0x7C, 0x0F, 0x80, + 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70, + 0x7E, 0x1F, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, + 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, + 0xE7, 0xFF, 0x00, 0xE0, 0x1F, 0x01, 0xF0, 0x1F, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, 0x3F, 0x07, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, + 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xE0, 0x0E, 0xE0, + 0xEF, 0x1C, 0xFF, 0x87, 0xE0, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, + 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x7F, 0xE1, 0xE0, 0x3E, 0x03, 0xC0, 0x70, 0x07, 0x81, 0x80, + 0x0F, 0x06, 0x00, 0x1E, 0x18, 0x00, 0x3C, 0x60, 0x00, 0x79, 0x80, 0x00, + 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xDE, 0x00, 0x07, 0x9E, 0x00, 0x0F, + 0x3E, 0x00, 0x1E, 0x3E, 0x00, 0x3C, 0x3E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x3C, 0x01, 0xE0, 0x7C, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xFE, 0x7F, 0xE3, + 0xFF, 0x03, 0x03, 0xE1, 0xFC, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0xE7, 0xFF, 0x1E, 0x1F, 0x01, + 0xF8, 0x1F, 0xCF, 0xF0, 0xFF, 0x80, 0xFF, 0x0F, 0x70, 0xF8, 0x0F, 0x81, + 0xF8, 0x0F, 0x01, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07, + 0x80, 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F, + 0x03, 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x0F, 0x00, 0xF0, + 0x07, 0x81, 0xE0, 0x1E, 0x00, 0xF0, 0x3C, 0x03, 0xC0, 0x1E, 0x07, 0x80, + 0x78, 0x03, 0xC0, 0xF0, 0x0F, 0x00, 0x78, 0x1E, 0x01, 0xE0, 0x0F, 0x03, + 0xC0, 0x3C, 0x01, 0xE0, 0x78, 0x07, 0x80, 0x3C, 0x1F, 0x81, 0xF8, 0x0F, + 0xCF, 0xFC, 0xFF, 0xC7, 0xFE, 0x1E, 0x1F, 0x83, 0xF9, 0xFF, 0x03, 0xFC, + 0x3E, 0x07, 0xC0, 0x7C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, + 0x07, 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, + 0x80, 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x07, 0x80, + 0x3C, 0x1E, 0x00, 0xF0, 0x78, 0x03, 0xC1, 0xE0, 0x0F, 0x0F, 0xC0, 0x7E, + 0x7F, 0xC3, 0xFC, 0x01, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0xF0, 0x7C, 0x0F, + 0x80, 0xF8, 0x3C, 0x01, 0xF1, 0xE0, 0x03, 0xE7, 0x80, 0x0F, 0xBE, 0x00, + 0x3F, 0xF8, 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x07, 0xFE, 0x00, 0x1F, + 0xF8, 0x00, 0x7F, 0xF0, 0x01, 0xE7, 0xC0, 0x07, 0x9F, 0x80, 0x3E, 0x3E, + 0x00, 0xF0, 0x7C, 0x07, 0x80, 0xF8, 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFC, + 0x00, 0x0E, 0x3F, 0x07, 0xF7, 0xFE, 0x07, 0xE0, 0xF8, 0x3E, 0x03, 0xE1, + 0xE0, 0x0F, 0x0F, 0x00, 0x7C, 0x78, 0x03, 0xE3, 0xC0, 0x0F, 0x1E, 0x00, + 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x8F, + 0x00, 0x38, 0x78, 0x03, 0xC3, 0xC0, 0x1E, 0x1E, 0x00, 0xE0, 0xF8, 0x0E, + 0x07, 0xE0, 0xE0, 0x3D, 0xFE, 0x01, 0xE7, 0xC0, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x80, 0x03, 0xFF, 0x80, 0x00, 0x01, + 0xF8, 0x20, 0x3F, 0xF3, 0x03, 0xC1, 0xF8, 0x3C, 0x07, 0xC3, 0xC0, 0x1E, + 0x1C, 0x00, 0xF1, 0xE0, 0x07, 0x8E, 0x00, 0x3C, 0xF0, 0x01, 0xE7, 0x80, + 0x0F, 0x3C, 0x00, 0x79, 0xE0, 0x03, 0xCF, 0x00, 0x1E, 0x78, 0x00, 0xF3, + 0xE0, 0x07, 0x9F, 0x00, 0x3C, 0x7C, 0x01, 0xE3, 0xE0, 0x1F, 0x0F, 0xC1, + 0xF8, 0x3F, 0xF3, 0xC0, 0x7E, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x1E, 0x00, 0x03, 0xF8, 0x00, 0x7F, 0xE0, 0x06, 0x3C, 0xFC, + 0xFE, 0xFA, 0x78, 0xF8, 0x71, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x01, 0xF8, 0x0F, 0xFC, + 0x00, 0x1F, 0x91, 0x87, 0x98, 0x1D, 0xC0, 0x6E, 0x03, 0x70, 0x0B, 0xC0, + 0x5F, 0x80, 0x7E, 0x01, 0xFC, 0x07, 0xF0, 0x0F, 0xE0, 0x3F, 0x00, 0x7E, + 0x01, 0xF0, 0x07, 0xC0, 0x3E, 0x01, 0xF8, 0x0D, 0xE0, 0xC8, 0xF8, 0x00, + 0x04, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x3C, 0x07, 0xFC, 0xFF, 0xC3, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xE2, + 0x1F, 0xC0, 0xF8, 0xFC, 0x0F, 0xE1, 0xF0, 0x0F, 0x83, 0xC0, 0x1E, 0x0F, + 0x00, 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, + 0x78, 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78, + 0x3C, 0x01, 0xE0, 0xF0, 0x07, 0x83, 0xC0, 0x1E, 0x0F, 0x00, 0x78, 0x3C, + 0x01, 0xE0, 0xF8, 0x0F, 0x81, 0xF0, 0xFF, 0x03, 0xFE, 0x7F, 0x07, 0xE1, + 0xC0, 0xFF, 0x81, 0xFC, 0xFC, 0x01, 0xC1, 0xE0, 0x07, 0x07, 0x80, 0x18, + 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x00, 0x78, 0x0C, 0x01, 0xE0, 0x30, 0x07, + 0x81, 0x80, 0x0F, 0x06, 0x00, 0x3C, 0x10, 0x00, 0x78, 0xC0, 0x01, 0xE3, + 0x00, 0x03, 0x98, 0x00, 0x0F, 0x60, 0x00, 0x3D, 0x00, 0x00, 0x7C, 0x00, + 0x01, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x40, 0x00, 0xFF, 0x8F, 0xF8, 0x3F, 0x7E, 0x07, 0xE0, 0x0E, 0x3E, 0x03, + 0xC0, 0x0C, 0x1E, 0x03, 0xE0, 0x0C, 0x1E, 0x01, 0xE0, 0x0C, 0x1E, 0x01, + 0xE0, 0x18, 0x0F, 0x00, 0xF0, 0x18, 0x0F, 0x01, 0xF0, 0x10, 0x07, 0x81, + 0xF0, 0x30, 0x07, 0x81, 0x78, 0x30, 0x07, 0x83, 0x78, 0x60, 0x03, 0xC3, + 0x38, 0x60, 0x03, 0xC6, 0x3C, 0x40, 0x01, 0xC6, 0x3C, 0xC0, 0x01, 0xEC, + 0x1E, 0xC0, 0x01, 0xEC, 0x1F, 0x80, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0xF8, + 0x0F, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x60, + 0x06, 0x00, 0x00, 0x20, 0x02, 0x00, 0x7F, 0xE7, 0xF0, 0x7E, 0x0F, 0x00, + 0xF8, 0x38, 0x01, 0xE0, 0xC0, 0x07, 0xC6, 0x00, 0x0F, 0x30, 0x00, 0x1E, + 0xC0, 0x00, 0x7E, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, + 0x00, 0x3F, 0x00, 0x00, 0xDE, 0x00, 0x06, 0x7C, 0x00, 0x30, 0xF0, 0x01, + 0xC1, 0xE0, 0x06, 0x07, 0xC0, 0x30, 0x0F, 0x01, 0xC0, 0x1E, 0x0F, 0x00, + 0xFC, 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0xFC, 0xFC, 0x01, 0xE1, 0xE0, 0x03, + 0x07, 0x80, 0x18, 0x0F, 0x00, 0x60, 0x3C, 0x01, 0x80, 0x78, 0x0C, 0x01, + 0xE0, 0x30, 0x03, 0xC0, 0xC0, 0x0F, 0x06, 0x00, 0x3E, 0x18, 0x00, 0x78, + 0x40, 0x01, 0xF3, 0x00, 0x03, 0xCC, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x60, + 0x00, 0x01, 0x80, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x01, + 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0x9F, 0xFF, 0xE6, 0x00, + 0xF1, 0x00, 0x78, 0x40, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, 0xE0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x03, + 0xE0, 0x01, 0xF0, 0x04, 0x78, 0x01, 0x3E, 0x00, 0xDF, 0x00, 0x37, 0x80, + 0x1F, 0xFF, 0xFE, 0xFF, 0xFF, 0x80, 0x01, 0xE0, 0x78, 0x1C, 0x07, 0x80, + 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x1C, 0x0E, 0x00, 0x70, + 0x07, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0, + 0x1E, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x70, 0x0F, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x0E, 0x07, 0x01, 0xC0, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x3C, 0x07, 0x03, 0xC0, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0x0F, 0x87, 0xB8, 0x0F, 0xFC, 0x00, + 0x07, 0xC0 }; + +const GFXglyph FreeSerif24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 5, 32, 16, 6, -31 }, // 0x21 '!' + { 20, 12, 12, 19, 4, -31 }, // 0x22 '"' + { 38, 23, 31, 23, 0, -30 }, // 0x23 '#' + { 128, 19, 37, 24, 2, -33 }, // 0x24 '$' + { 216, 33, 32, 39, 3, -30 }, // 0x25 '%' + { 348, 32, 33, 37, 2, -31 }, // 0x26 '&' + { 480, 4, 12, 9, 3, -31 }, // 0x27 ''' + { 486, 12, 40, 16, 2, -31 }, // 0x28 '(' + { 546, 12, 40, 16, 2, -30 }, // 0x29 ')' + { 606, 16, 19, 24, 4, -30 }, // 0x2A '*' + { 644, 23, 23, 27, 2, -22 }, // 0x2B '+' + { 711, 6, 11, 12, 2, -4 }, // 0x2C ',' + { 720, 11, 2, 16, 2, -10 }, // 0x2D '-' + { 723, 5, 5, 12, 3, -3 }, // 0x2E '.' + { 727, 14, 32, 14, 0, -30 }, // 0x2F '/' + { 783, 22, 33, 23, 1, -31 }, // 0x30 '0' + { 874, 13, 32, 24, 5, -31 }, // 0x31 '1' + { 926, 21, 31, 23, 1, -30 }, // 0x32 '2' + { 1008, 18, 32, 23, 2, -30 }, // 0x33 '3' + { 1080, 21, 31, 24, 1, -30 }, // 0x34 '4' + { 1162, 19, 33, 24, 2, -31 }, // 0x35 '5' + { 1241, 21, 33, 23, 2, -31 }, // 0x36 '6' + { 1328, 20, 31, 24, 1, -30 }, // 0x37 '7' + { 1406, 18, 33, 23, 3, -31 }, // 0x38 '8' + { 1481, 21, 33, 24, 1, -31 }, // 0x39 '9' + { 1568, 5, 22, 12, 4, -20 }, // 0x3A ':' + { 1582, 6, 27, 12, 3, -20 }, // 0x3B ';' + { 1603, 24, 25, 27, 1, -24 }, // 0x3C '<' + { 1678, 24, 11, 27, 1, -16 }, // 0x3D '=' + { 1711, 24, 25, 27, 2, -23 }, // 0x3E '>' + { 1786, 17, 32, 21, 3, -31 }, // 0x3F '?' + { 1854, 32, 33, 41, 4, -31 }, // 0x40 '@' + { 1986, 32, 32, 34, 1, -31 }, // 0x41 'A' + { 2114, 27, 31, 30, 0, -30 }, // 0x42 'B' + { 2219, 28, 33, 31, 2, -31 }, // 0x43 'C' + { 2335, 31, 31, 34, 1, -30 }, // 0x44 'D' + { 2456, 27, 31, 29, 2, -30 }, // 0x45 'E' + { 2561, 24, 31, 27, 2, -30 }, // 0x46 'F' + { 2654, 31, 33, 35, 2, -31 }, // 0x47 'G' + { 2782, 30, 31, 34, 2, -30 }, // 0x48 'H' + { 2899, 13, 31, 15, 1, -30 }, // 0x49 'I' + { 2950, 17, 32, 18, 0, -30 }, // 0x4A 'J' + { 3018, 32, 31, 33, 1, -30 }, // 0x4B 'K' + { 3142, 26, 31, 29, 2, -30 }, // 0x4C 'L' + { 3243, 39, 31, 41, 1, -30 }, // 0x4D 'M' + { 3395, 32, 32, 34, 1, -30 }, // 0x4E 'N' + { 3523, 30, 33, 34, 2, -31 }, // 0x4F 'O' + { 3647, 23, 31, 27, 2, -30 }, // 0x50 'P' + { 3737, 31, 40, 34, 2, -31 }, // 0x51 'Q' + { 3892, 28, 31, 31, 2, -30 }, // 0x52 'R' + { 4001, 21, 33, 25, 2, -31 }, // 0x53 'S' + { 4088, 27, 31, 28, 1, -30 }, // 0x54 'T' + { 4193, 32, 32, 34, 1, -30 }, // 0x55 'U' + { 4321, 32, 32, 33, 0, -30 }, // 0x56 'V' + { 4449, 44, 32, 45, 0, -30 }, // 0x57 'W' + { 4625, 33, 31, 34, 0, -30 }, // 0x58 'X' + { 4753, 32, 31, 33, 0, -30 }, // 0x59 'Y' + { 4877, 27, 31, 29, 1, -30 }, // 0x5A 'Z' + { 4982, 9, 38, 16, 4, -30 }, // 0x5B '[' + { 5025, 14, 32, 14, 0, -30 }, // 0x5C '\' + { 5081, 9, 38, 16, 3, -30 }, // 0x5D ']' + { 5124, 20, 17, 22, 1, -30 }, // 0x5E '^' + { 5167, 24, 2, 23, 0, 5 }, // 0x5F '_' + { 5173, 10, 8, 12, 1, -31 }, // 0x60 '`' + { 5183, 18, 21, 20, 1, -20 }, // 0x61 'a' + { 5231, 21, 32, 24, 1, -31 }, // 0x62 'b' + { 5315, 19, 21, 21, 1, -20 }, // 0x63 'c' + { 5365, 22, 32, 23, 1, -31 }, // 0x64 'd' + { 5453, 18, 21, 21, 1, -20 }, // 0x65 'e' + { 5501, 17, 33, 18, 0, -32 }, // 0x66 'f' + { 5572, 21, 31, 22, 1, -20 }, // 0x67 'g' + { 5654, 22, 32, 23, 0, -31 }, // 0x68 'h' + { 5742, 11, 32, 13, 0, -31 }, // 0x69 'i' + { 5786, 12, 42, 16, 0, -31 }, // 0x6A 'j' + { 5849, 23, 32, 24, 1, -31 }, // 0x6B 'k' + { 5941, 11, 32, 12, 0, -31 }, // 0x6C 'l' + { 5985, 35, 21, 37, 1, -20 }, // 0x6D 'm' + { 6077, 22, 21, 23, 0, -20 }, // 0x6E 'n' + { 6135, 22, 21, 23, 1, -20 }, // 0x6F 'o' + { 6193, 21, 31, 24, 1, -20 }, // 0x70 'p' + { 6275, 21, 31, 23, 1, -20 }, // 0x71 'q' + { 6357, 15, 21, 16, 1, -20 }, // 0x72 'r' + { 6397, 13, 21, 17, 2, -20 }, // 0x73 's' + { 6432, 12, 26, 13, 1, -25 }, // 0x74 't' + { 6471, 22, 21, 23, 1, -20 }, // 0x75 'u' + { 6529, 22, 22, 22, 0, -20 }, // 0x76 'v' + { 6590, 32, 22, 32, 0, -20 }, // 0x77 'w' + { 6678, 22, 21, 23, 0, -20 }, // 0x78 'x' + { 6736, 22, 31, 22, 0, -20 }, // 0x79 'y' + { 6822, 18, 21, 20, 1, -20 }, // 0x7A 'z' + { 6870, 11, 41, 23, 5, -31 }, // 0x7B '{' + { 6927, 3, 32, 9, 3, -30 }, // 0x7C '|' + { 6939, 11, 41, 23, 7, -31 }, // 0x7D '}' + { 6996, 22, 5, 23, 1, -13 } }; // 0x7E '~' + +const GFXfont FreeSerif24pt7b PROGMEM = { + (uint8_t *)FreeSerif24pt7bBitmaps, + (GFXglyph *)FreeSerif24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 7682 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif9pt7b.h new file mode 100644 index 0000000..cdb20c7 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerif9pt7b.h @@ -0,0 +1,195 @@ +const uint8_t FreeSerif9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xEA, 0x03, 0xDE, 0xF7, 0x20, 0x11, 0x09, 0x04, 0x82, 0x4F, 0xF9, + 0x10, 0x89, 0xFF, 0x24, 0x12, 0x09, 0x0C, 0x80, 0x10, 0x7C, 0xD6, 0xD2, + 0xD0, 0xF0, 0x38, 0x1E, 0x17, 0x93, 0x93, 0xD6, 0x7C, 0x10, 0x38, 0x43, + 0x3C, 0x39, 0x21, 0x8A, 0x0C, 0x50, 0x65, 0x39, 0xCB, 0x20, 0xB9, 0x05, + 0x88, 0x4C, 0x44, 0x64, 0x21, 0xC0, 0x0E, 0x00, 0xC8, 0x06, 0x40, 0x32, + 0x01, 0xA0, 0x07, 0x78, 0x31, 0x87, 0x88, 0x46, 0x86, 0x34, 0x30, 0xC1, + 0xC7, 0x17, 0xCF, 0x00, 0xFE, 0x08, 0x88, 0x84, 0x63, 0x18, 0xC6, 0x10, + 0x82, 0x08, 0x20, 0x82, 0x08, 0x21, 0x0C, 0x63, 0x18, 0xC4, 0x22, 0x22, + 0x00, 0x63, 0x9A, 0xDC, 0x72, 0xB6, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, + 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD8, 0xF0, 0xF0, 0x08, 0x84, 0x22, + 0x10, 0x8C, 0x42, 0x31, 0x00, 0x1C, 0x31, 0x98, 0xD8, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC4, 0x61, 0xC0, 0x13, 0x8C, 0x63, 0x18, + 0xC6, 0x31, 0x8C, 0x67, 0x80, 0x3C, 0x4E, 0x86, 0x06, 0x06, 0x04, 0x0C, + 0x08, 0x10, 0x20, 0x41, 0xFE, 0x3C, 0xC6, 0x06, 0x04, 0x1C, 0x3E, 0x07, + 0x03, 0x03, 0x03, 0x06, 0xF8, 0x04, 0x18, 0x71, 0x64, 0xC9, 0xA3, 0x46, + 0xFE, 0x18, 0x30, 0x60, 0x0F, 0x10, 0x20, 0x3C, 0x0E, 0x07, 0x03, 0x03, + 0x03, 0x02, 0x04, 0xF8, 0x07, 0x1C, 0x30, 0x60, 0x60, 0xDC, 0xE6, 0xC3, + 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0x7F, 0x82, 0x02, 0x02, 0x04, 0x04, 0x04, + 0x08, 0x08, 0x08, 0x10, 0x10, 0x3C, 0x8F, 0x1E, 0x3E, 0x4F, 0x06, 0x36, + 0xC7, 0x8F, 0x1B, 0x33, 0xC0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0xC3, + 0x63, 0x3F, 0x06, 0x06, 0x0C, 0x38, 0x60, 0xF0, 0x0F, 0xD8, 0x00, 0x03, + 0x28, 0x01, 0x87, 0x0E, 0x1C, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x01, + 0xC0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x79, 0x1A, 0x18, 0x30, 0x60, 0x83, + 0x04, 0x10, 0x20, 0x40, 0x03, 0x00, 0x0F, 0x83, 0x8C, 0x60, 0x26, 0x02, + 0xC7, 0x9C, 0xC9, 0xD8, 0x9D, 0x99, 0xD9, 0x26, 0xEC, 0x60, 0x03, 0x04, + 0x0F, 0x80, 0x02, 0x00, 0x10, 0x01, 0xC0, 0x16, 0x00, 0x98, 0x04, 0xC0, + 0x43, 0x03, 0xF8, 0x20, 0x61, 0x03, 0x18, 0x1D, 0xE1, 0xF0, 0xFF, 0x86, + 0x1C, 0xC1, 0x98, 0x33, 0x0C, 0x7E, 0x0C, 0x31, 0x83, 0x30, 0x66, 0x0C, + 0xC3, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0x81, 0xE0, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC1, 0x8F, 0xC0, 0xFF, 0x03, 0x1C, 0x30, + 0x63, 0x07, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 0x06, 0x30, + 0xCF, 0xF0, 0xFF, 0x98, 0x26, 0x01, 0x80, 0x61, 0x1F, 0xC6, 0x11, 0x80, + 0x60, 0x18, 0x16, 0x0F, 0xFE, 0xFF, 0xB0, 0x58, 0x0C, 0x06, 0x13, 0xF9, + 0x84, 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x23, 0x0E, 0x60, 0x26, + 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x6C, 0x06, 0xC0, 0x66, 0x06, 0x30, 0x60, + 0xF8, 0xF1, 0xEC, 0x19, 0x83, 0x30, 0x66, 0x0C, 0xFF, 0x98, 0x33, 0x06, + 0x60, 0xCC, 0x19, 0x83, 0x78, 0xF0, 0xF6, 0x66, 0x66, 0x66, 0x66, 0x6F, + 0x3C, 0x61, 0x86, 0x18, 0x61, 0x86, 0x18, 0x6D, 0xBC, 0xF3, 0xE6, 0x08, + 0x61, 0x06, 0x20, 0x64, 0x07, 0x80, 0x6C, 0x06, 0x60, 0x63, 0x06, 0x18, + 0x60, 0xCF, 0x3F, 0xF0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x18, 0x16, 0x0B, 0xFE, 0xF0, 0x0E, 0x70, 0x38, 0xE0, 0x71, + 0xE1, 0x62, 0xC2, 0xC5, 0xC9, 0x89, 0x93, 0x13, 0x26, 0x23, 0x8C, 0x47, + 0x18, 0x84, 0x33, 0x88, 0xF0, 0xE0, 0xEE, 0x09, 0xC1, 0x2C, 0x25, 0xC4, + 0x9C, 0x91, 0x92, 0x1A, 0x41, 0xC8, 0x19, 0x03, 0x70, 0x20, 0x1F, 0x06, + 0x31, 0x83, 0x20, 0x2C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x09, + 0x83, 0x18, 0xC1, 0xF0, 0xFE, 0x31, 0x98, 0x6C, 0x36, 0x1B, 0x19, 0xF8, + 0xC0, 0x60, 0x30, 0x18, 0x1E, 0x00, 0x1F, 0x06, 0x31, 0x83, 0x20, 0x2C, + 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x68, 0x19, 0x83, 0x18, 0xC0, 0xE0, + 0x0E, 0x00, 0xE0, 0x07, 0xFE, 0x0C, 0x61, 0x86, 0x30, 0xC6, 0x18, 0xC6, + 0x1F, 0x83, 0x70, 0x67, 0x0C, 0x71, 0x87, 0x78, 0x70, 0x1D, 0x31, 0x98, + 0x4C, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xA0, 0xD8, 0xCB, 0xC0, 0xFF, + 0xF8, 0xCE, 0x18, 0x83, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x07, 0x80, 0xF0, 0xEC, 0x09, 0x81, 0x30, 0x26, 0x04, 0xC0, + 0x98, 0x13, 0x02, 0x60, 0x4C, 0x08, 0xC2, 0x0F, 0x80, 0xF8, 0x77, 0x02, + 0x30, 0x23, 0x04, 0x18, 0x41, 0x84, 0x0C, 0x80, 0xC8, 0x07, 0x00, 0x70, + 0x02, 0x00, 0x20, 0xFB, 0xE7, 0xB0, 0xC0, 0x8C, 0x20, 0x86, 0x18, 0x41, + 0x8C, 0x40, 0xCB, 0x20, 0x65, 0x90, 0x1A, 0x70, 0x0E, 0x38, 0x03, 0x1C, + 0x01, 0x04, 0x00, 0x82, 0x00, 0xFC, 0xF9, 0x83, 0x06, 0x10, 0x19, 0x00, + 0xD0, 0x03, 0x00, 0x1C, 0x01, 0x30, 0x11, 0xC1, 0x86, 0x08, 0x19, 0xE3, + 0xF0, 0xF8, 0xF6, 0x06, 0x30, 0x41, 0x88, 0x1D, 0x00, 0xD0, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xF0, 0x3F, 0xCC, 0x11, 0x06, 0x01, + 0x80, 0x70, 0x0C, 0x03, 0x00, 0xE0, 0x38, 0x06, 0x05, 0xC1, 0x7F, 0xE0, + 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0x82, 0x10, 0x82, 0x10, 0x86, 0x10, + 0x86, 0x10, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xF8, 0x18, 0x1C, 0x34, 0x26, + 0x62, 0x42, 0xC1, 0xFF, 0x80, 0x84, 0x20, 0x79, 0x98, 0x30, 0xE6, 0xD9, + 0xB3, 0x3F, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC3, 0x61, + 0xB0, 0xD8, 0x6C, 0x63, 0xE0, 0x3C, 0xCF, 0x06, 0x0C, 0x18, 0x18, 0x9E, + 0x01, 0x03, 0x80, 0xC0, 0x60, 0x31, 0xD9, 0x9D, 0x86, 0xC3, 0x61, 0xB0, + 0xCC, 0x63, 0xF0, 0x3C, 0x46, 0xFE, 0xC0, 0xC0, 0xE1, 0x62, 0x3C, 0x1E, + 0x41, 0x83, 0x06, 0x1E, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0F, 0x00, 0x3C, + 0x19, 0xF6, 0x31, 0x8C, 0x1E, 0x08, 0x04, 0x01, 0xFC, 0x40, 0xB0, 0x2E, + 0x11, 0xF8, 0x20, 0x70, 0x18, 0x0C, 0x06, 0x03, 0x71, 0xCC, 0xC6, 0x63, + 0x31, 0x98, 0xCC, 0x6F, 0x78, 0x60, 0x02, 0xE6, 0x66, 0x66, 0xF0, 0x18, + 0x00, 0x33, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8B, 0x80, 0x20, 0x70, 0x18, + 0x0C, 0x06, 0x03, 0x3D, 0x88, 0xD8, 0x78, 0x36, 0x19, 0x8C, 0x6F, 0x78, + 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF0, 0xEE, 0x71, 0xCE, 0x66, 0x31, + 0x98, 0xC6, 0x63, 0x19, 0x8C, 0x66, 0x31, 0xBD, 0xEF, 0xEE, 0x39, 0x98, + 0xCC, 0x66, 0x33, 0x19, 0x8D, 0xEF, 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1E, + 0x0D, 0x8C, 0x7C, 0xEE, 0x39, 0x98, 0x6C, 0x36, 0x1B, 0x0D, 0x8C, 0xFC, + 0x60, 0x30, 0x18, 0x1E, 0x00, 0x3D, 0x31, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, + 0x8C, 0xFE, 0x03, 0x01, 0x80, 0xC0, 0xF0, 0x6D, 0xC6, 0x18, 0x61, 0x86, + 0x3C, 0x76, 0x38, 0x58, 0x3E, 0x38, 0xFE, 0x27, 0x98, 0xC6, 0x31, 0x8C, + 0x38, 0xE7, 0x31, 0x98, 0xCC, 0x66, 0x33, 0x19, 0x8C, 0x7F, 0xF3, 0x61, + 0x22, 0x32, 0x14, 0x1C, 0x08, 0x08, 0xEF, 0x36, 0x61, 0x62, 0x22, 0x32, + 0x35, 0x41, 0x9C, 0x18, 0x81, 0x08, 0xF7, 0x12, 0x0E, 0x03, 0x01, 0xC1, + 0x21, 0x09, 0xCF, 0xF3, 0x61, 0x62, 0x32, 0x34, 0x14, 0x1C, 0x08, 0x08, + 0x08, 0x10, 0xE0, 0xFD, 0x18, 0x60, 0x83, 0x0C, 0x70, 0xFE, 0x19, 0x8C, + 0x63, 0x18, 0xC4, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF0, 0xC3, 0x18, + 0xC6, 0x31, 0x84, 0x33, 0x18, 0xC6, 0x31, 0x98, 0x70, 0x24, 0xC1, 0xC0 }; + +const GFXglyph FreeSerif9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 2, 12, 6, 2, -11 }, // 0x21 '!' + { 3, 5, 4, 7, 1, -11 }, // 0x22 '"' + { 6, 9, 12, 9, 0, -11 }, // 0x23 '#' + { 20, 8, 14, 9, 1, -12 }, // 0x24 '$' + { 34, 13, 12, 15, 1, -11 }, // 0x25 '%' + { 54, 13, 13, 14, 1, -12 }, // 0x26 '&' + { 76, 2, 4, 4, 1, -11 }, // 0x27 ''' + { 77, 5, 15, 6, 1, -11 }, // 0x28 '(' + { 87, 5, 15, 6, 0, -11 }, // 0x29 ')' + { 97, 6, 8, 9, 3, -11 }, // 0x2A '*' + { 103, 9, 9, 10, 0, -8 }, // 0x2B '+' + { 114, 2, 3, 4, 2, 0 }, // 0x2C ',' + { 115, 4, 1, 6, 1, -3 }, // 0x2D '-' + { 116, 2, 2, 5, 1, -1 }, // 0x2E '.' + { 117, 5, 12, 5, 0, -11 }, // 0x2F '/' + { 125, 9, 13, 9, 0, -12 }, // 0x30 '0' + { 140, 5, 13, 9, 2, -12 }, // 0x31 '1' + { 149, 8, 12, 9, 1, -11 }, // 0x32 '2' + { 161, 8, 12, 9, 0, -11 }, // 0x33 '3' + { 173, 7, 12, 9, 1, -11 }, // 0x34 '4' + { 184, 8, 12, 9, 0, -11 }, // 0x35 '5' + { 196, 8, 13, 9, 1, -12 }, // 0x36 '6' + { 209, 8, 12, 9, 0, -11 }, // 0x37 '7' + { 221, 7, 13, 9, 1, -12 }, // 0x38 '8' + { 233, 8, 14, 9, 1, -12 }, // 0x39 '9' + { 247, 2, 8, 5, 1, -7 }, // 0x3A ':' + { 249, 3, 10, 5, 1, -7 }, // 0x3B ';' + { 253, 9, 9, 10, 1, -8 }, // 0x3C '<' + { 264, 9, 5, 10, 1, -6 }, // 0x3D '=' + { 270, 10, 9, 10, 0, -8 }, // 0x3E '>' + { 282, 7, 13, 8, 1, -12 }, // 0x3F '?' + { 294, 12, 13, 16, 2, -12 }, // 0x40 '@' + { 314, 13, 12, 13, 0, -11 }, // 0x41 'A' + { 334, 11, 12, 11, 0, -11 }, // 0x42 'B' + { 351, 11, 12, 12, 1, -11 }, // 0x43 'C' + { 368, 12, 12, 13, 0, -11 }, // 0x44 'D' + { 386, 10, 12, 11, 1, -11 }, // 0x45 'E' + { 401, 9, 12, 10, 1, -11 }, // 0x46 'F' + { 415, 12, 12, 13, 1, -11 }, // 0x47 'G' + { 433, 11, 12, 13, 1, -11 }, // 0x48 'H' + { 450, 4, 12, 6, 1, -11 }, // 0x49 'I' + { 456, 6, 12, 7, 0, -11 }, // 0x4A 'J' + { 465, 12, 12, 13, 1, -11 }, // 0x4B 'K' + { 483, 10, 12, 11, 1, -11 }, // 0x4C 'L' + { 498, 15, 12, 16, 0, -11 }, // 0x4D 'M' + { 521, 11, 12, 13, 1, -11 }, // 0x4E 'N' + { 538, 11, 13, 13, 1, -12 }, // 0x4F 'O' + { 556, 9, 12, 10, 1, -11 }, // 0x50 'P' + { 570, 11, 16, 13, 1, -12 }, // 0x51 'Q' + { 592, 11, 12, 12, 1, -11 }, // 0x52 'R' + { 609, 9, 12, 10, 0, -11 }, // 0x53 'S' + { 623, 11, 12, 11, 0, -11 }, // 0x54 'T' + { 640, 11, 12, 13, 1, -11 }, // 0x55 'U' + { 657, 12, 12, 13, 0, -11 }, // 0x56 'V' + { 675, 17, 12, 17, 0, -11 }, // 0x57 'W' + { 701, 13, 12, 13, 0, -11 }, // 0x58 'X' + { 721, 12, 12, 13, 0, -11 }, // 0x59 'Y' + { 739, 11, 12, 11, 0, -11 }, // 0x5A 'Z' + { 756, 3, 15, 6, 2, -11 }, // 0x5B '[' + { 762, 5, 12, 5, 0, -11 }, // 0x5C '\' + { 770, 3, 15, 6, 1, -11 }, // 0x5D ']' + { 776, 8, 7, 8, 0, -11 }, // 0x5E '^' + { 783, 9, 1, 9, 0, 2 }, // 0x5F '_' + { 785, 4, 3, 5, 0, -11 }, // 0x60 '`' + { 787, 7, 8, 8, 1, -7 }, // 0x61 'a' + { 794, 9, 13, 9, 0, -12 }, // 0x62 'b' + { 809, 7, 8, 8, 0, -7 }, // 0x63 'c' + { 816, 9, 13, 9, 0, -12 }, // 0x64 'd' + { 831, 8, 8, 8, 0, -7 }, // 0x65 'e' + { 839, 7, 13, 7, 1, -12 }, // 0x66 'f' + { 851, 10, 12, 8, 0, -7 }, // 0x67 'g' + { 866, 9, 13, 9, 0, -12 }, // 0x68 'h' + { 881, 4, 11, 5, 1, -10 }, // 0x69 'i' + { 887, 5, 15, 6, 0, -10 }, // 0x6A 'j' + { 897, 9, 13, 9, 1, -12 }, // 0x6B 'k' + { 912, 4, 13, 5, 1, -12 }, // 0x6C 'l' + { 919, 14, 8, 14, 0, -7 }, // 0x6D 'm' + { 933, 9, 8, 9, 0, -7 }, // 0x6E 'n' + { 942, 9, 8, 9, 0, -7 }, // 0x6F 'o' + { 951, 9, 12, 9, 0, -7 }, // 0x70 'p' + { 965, 9, 12, 9, 0, -7 }, // 0x71 'q' + { 979, 6, 8, 6, 0, -7 }, // 0x72 'r' + { 985, 6, 8, 7, 1, -7 }, // 0x73 's' + { 991, 5, 9, 5, 0, -8 }, // 0x74 't' + { 997, 9, 8, 9, 0, -7 }, // 0x75 'u' + { 1006, 8, 8, 8, 0, -7 }, // 0x76 'v' + { 1014, 12, 8, 12, 0, -7 }, // 0x77 'w' + { 1026, 9, 8, 9, 0, -7 }, // 0x78 'x' + { 1035, 8, 12, 8, 0, -7 }, // 0x79 'y' + { 1047, 7, 8, 7, 1, -7 }, // 0x7A 'z' + { 1054, 5, 16, 9, 1, -12 }, // 0x7B '{' + { 1064, 1, 12, 4, 1, -11 }, // 0x7C '|' + { 1066, 5, 16, 9, 3, -11 }, // 0x7D '}' + { 1076, 9, 3, 9, 0, -5 } }; // 0x7E '~' + +const GFXfont FreeSerif9pt7b PROGMEM = { + (uint8_t *)FreeSerif9pt7bBitmaps, + (GFXglyph *)FreeSerif9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1752 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold12pt7b.h new file mode 100644 index 0000000..1d49981 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold12pt7b.h @@ -0,0 +1,271 @@ +const uint8_t FreeSerifBold12pt7bBitmaps[] PROGMEM = { + 0x7F, 0xFF, 0x77, 0x66, 0x22, 0x00, 0x6F, 0xF7, 0xE3, 0xF1, 0xF8, 0xFC, + 0x7E, 0x3A, 0x09, 0x04, 0x0C, 0x40, 0xCC, 0x0C, 0xC0, 0x8C, 0x18, 0xC7, + 0xFF, 0x18, 0xC1, 0x88, 0x19, 0x81, 0x98, 0xFF, 0xE3, 0x18, 0x31, 0x83, + 0x18, 0x33, 0x03, 0x30, 0x08, 0x01, 0x00, 0xFC, 0x24, 0xEC, 0x8D, 0x90, + 0xBA, 0x07, 0xC0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0xF0, 0x9F, 0x11, 0xE2, + 0x3E, 0x46, 0xE9, 0xC7, 0xC0, 0x20, 0x04, 0x00, 0x1E, 0x0C, 0x0E, 0x7F, + 0x07, 0x10, 0x83, 0xC4, 0x40, 0xE1, 0x30, 0x38, 0x88, 0x0E, 0x26, 0x03, + 0x91, 0x1E, 0x78, 0x8E, 0x40, 0x27, 0x10, 0x11, 0xC4, 0x0C, 0xE1, 0x02, + 0x38, 0x81, 0x0E, 0x20, 0x43, 0x90, 0x20, 0x78, 0x03, 0xE0, 0x01, 0x9E, + 0x00, 0xE3, 0x80, 0x38, 0xE0, 0x0F, 0x30, 0x03, 0xF0, 0x00, 0x78, 0x7C, + 0x1F, 0x06, 0x1B, 0xE1, 0x1C, 0x7C, 0x8F, 0x1F, 0x23, 0xC3, 0xF0, 0xF8, + 0x7C, 0x3E, 0x0F, 0x97, 0xC7, 0xFC, 0xFE, 0x3E, 0xFF, 0xFE, 0x90, 0x00, + 0x31, 0x0C, 0x31, 0x86, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x86, 0x18, 0x60, + 0xC1, 0x02, 0x04, 0x03, 0x06, 0x0C, 0x30, 0x61, 0x87, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0x86, 0x38, 0xC2, 0x10, 0x80, 0x1C, 0x6E, 0xFA, 0xEF, 0xF1, + 0xC7, 0xFF, 0xAF, 0xBB, 0x1C, 0x04, 0x00, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x6F, 0xF7, 0x11, 0x24, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6, 0x03, 0x07, + 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x60, + 0x60, 0x60, 0xC0, 0x0E, 0x07, 0x71, 0xC7, 0x38, 0xEF, 0x1D, 0xE3, 0xFC, + 0x7F, 0x8F, 0xF1, 0xFE, 0x3F, 0xC7, 0xF8, 0xF7, 0x1C, 0xE3, 0x8E, 0xE0, + 0xF8, 0x06, 0x0F, 0x1F, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0xF9, 0xFF, 0x0F, 0x03, 0xFC, 0x7F, 0xC4, + 0x3E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x03, 0x80, 0x30, 0x06, 0x00, + 0xC1, 0x18, 0x13, 0xFE, 0x7F, 0xEF, 0xFE, 0x1F, 0x0C, 0xFA, 0x0F, 0x01, + 0xE0, 0x38, 0x0E, 0x03, 0xE0, 0x3E, 0x03, 0xE0, 0x3C, 0x03, 0x80, 0x70, + 0x0D, 0xC1, 0xBC, 0x43, 0xF0, 0x03, 0x80, 0xE0, 0x78, 0x3E, 0x17, 0x89, + 0xE2, 0x79, 0x1E, 0x87, 0xA1, 0xEF, 0xFF, 0xFF, 0xFF, 0xC1, 0xE0, 0x78, + 0x1E, 0x3F, 0xE7, 0xF8, 0xFF, 0x10, 0x04, 0x00, 0xF8, 0x1F, 0xC7, 0xFC, + 0x1F, 0xC0, 0x78, 0x07, 0x00, 0x60, 0x0D, 0xC1, 0x3C, 0x43, 0xF0, 0x00, + 0xE0, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xF0, 0x3F, 0xE7, 0x9E, 0xF1, 0xFE, + 0x3F, 0xC7, 0xF8, 0xF7, 0x1E, 0xE3, 0x8E, 0x60, 0xF8, 0x7F, 0xEF, 0xFD, + 0xFF, 0xA0, 0x68, 0x0C, 0x03, 0x80, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x0C, + 0x03, 0x00, 0x60, 0x1C, 0x03, 0x00, 0x60, 0x1F, 0x0E, 0x73, 0x87, 0x70, + 0xEF, 0x1D, 0xF3, 0x1F, 0x81, 0xF8, 0x1F, 0xCC, 0xFB, 0x8F, 0xF0, 0xFE, + 0x1F, 0xC3, 0x9C, 0xF1, 0xF8, 0x1F, 0x06, 0x71, 0xC7, 0x78, 0xEF, 0x1F, + 0xE3, 0xFC, 0x7F, 0x8F, 0x79, 0xE7, 0xFC, 0x0F, 0x01, 0xC0, 0x78, 0x1C, + 0x0F, 0x07, 0x00, 0x6F, 0xF6, 0x00, 0x06, 0xFF, 0x60, 0x6F, 0xF6, 0x00, + 0x06, 0xFF, 0x71, 0x22, 0xC0, 0x00, 0x04, 0x00, 0x70, 0x07, 0xC0, 0xFC, + 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x80, 0x0F, + 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x1F, 0x01, 0xF0, + 0x1F, 0x03, 0xF0, 0x3E, 0x00, 0xE0, 0x02, 0x00, 0x00, 0x3E, 0x11, 0xEC, + 0x3F, 0x8F, 0xE3, 0xC0, 0xF0, 0x78, 0x18, 0x08, 0x02, 0x00, 0x00, 0x00, + 0x1C, 0x07, 0x81, 0xE0, 0x30, 0x03, 0xF0, 0x0E, 0x18, 0x18, 0x04, 0x30, + 0x66, 0x70, 0xDB, 0x61, 0x99, 0xE3, 0x19, 0xE3, 0x31, 0xE6, 0x31, 0xE6, + 0x31, 0xE6, 0xF2, 0x66, 0xB2, 0x73, 0x3C, 0x38, 0x00, 0x1E, 0x04, 0x03, + 0xF8, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3E, 0x00, + 0x1F, 0x00, 0x1B, 0xC0, 0x09, 0xE0, 0x0C, 0xF8, 0x04, 0x3C, 0x02, 0x1F, + 0x03, 0xFF, 0x81, 0x03, 0xC1, 0x80, 0xF0, 0x80, 0x7D, 0xF0, 0xFF, 0xFF, + 0xC0, 0xF3, 0xC3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xCE, 0x0F, + 0xF0, 0x3C, 0x70, 0xF0, 0xE3, 0xC3, 0xCF, 0x0F, 0x3C, 0x3C, 0xF0, 0xE3, + 0xC7, 0xBF, 0xF8, 0x07, 0xE2, 0x38, 0x7C, 0xE0, 0x3B, 0xC0, 0x37, 0x00, + 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x03, + 0x80, 0x07, 0x80, 0x27, 0x00, 0xC7, 0x86, 0x03, 0xF0, 0xFF, 0xE0, 0x1E, + 0x1E, 0x0F, 0x07, 0x87, 0x81, 0xE3, 0xC0, 0xF1, 0xE0, 0x3C, 0xF0, 0x1E, + 0x78, 0x0F, 0x3C, 0x07, 0x9E, 0x03, 0xCF, 0x01, 0xE7, 0x80, 0xE3, 0xC0, + 0xF1, 0xE0, 0xF0, 0xF0, 0xE1, 0xFF, 0xC0, 0xFF, 0xFC, 0x78, 0x38, 0xF0, + 0x31, 0xE0, 0x23, 0xC4, 0x07, 0x88, 0x0F, 0x30, 0x1F, 0xE0, 0x3C, 0xC0, + 0x78, 0x80, 0xF1, 0x01, 0xE0, 0x23, 0xC0, 0x47, 0x81, 0x8F, 0x07, 0x7F, + 0xFE, 0xFF, 0xFC, 0xF0, 0x73, 0xC0, 0xCF, 0x01, 0x3C, 0x40, 0xF1, 0x03, + 0xCC, 0x0F, 0xF0, 0x3C, 0xC0, 0xF1, 0x03, 0xC4, 0x0F, 0x00, 0x3C, 0x00, + 0xF0, 0x03, 0xC0, 0x3F, 0xC0, 0x07, 0xE2, 0x1C, 0x3E, 0x38, 0x0E, 0x78, + 0x06, 0x70, 0x06, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, + 0x7F, 0xF0, 0x1E, 0x70, 0x1E, 0x78, 0x1E, 0x38, 0x1E, 0x1E, 0x1E, 0x07, + 0xF0, 0xFE, 0xFF, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x3C, 0x7F, 0xFC, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xFE, 0xFF, 0xFF, 0x3C, 0x3C, + 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, + 0xFF, 0x0F, 0xF0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0xE3, 0xCE, + 0x38, 0xE3, 0x83, 0xE0, 0xFE, 0x7F, 0x3C, 0x0E, 0x1E, 0x04, 0x0F, 0x04, + 0x07, 0x84, 0x03, 0xCC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0xC0, 0x3C, + 0xF0, 0x1E, 0x7C, 0x0F, 0x1F, 0x07, 0x87, 0xC3, 0xC1, 0xF1, 0xE0, 0x7D, + 0xFC, 0xFF, 0xFE, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x01, 0x78, + 0x0D, 0xE0, 0x67, 0x83, 0xBF, 0xFE, 0xFC, 0x01, 0xF3, 0xC0, 0x3E, 0x3E, + 0x03, 0xE2, 0xE0, 0x5E, 0x2F, 0x05, 0xE2, 0xF0, 0x5E, 0x27, 0x09, 0xE2, + 0x78, 0x9E, 0x23, 0x91, 0xE2, 0x3D, 0x1E, 0x23, 0xF1, 0xE2, 0x1E, 0x1E, + 0x21, 0xE1, 0xE2, 0x0C, 0x1E, 0x20, 0xC1, 0xEF, 0x88, 0x3F, 0xF8, 0x1E, + 0xF8, 0x18, 0xF8, 0x11, 0xF8, 0x22, 0xF8, 0x45, 0xF0, 0x89, 0xF1, 0x11, + 0xF2, 0x21, 0xF4, 0x41, 0xF8, 0x81, 0xF1, 0x01, 0xE2, 0x03, 0xC4, 0x03, + 0x8C, 0x03, 0x7C, 0x02, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x03, 0x8F, 0x01, + 0xE7, 0x00, 0x77, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, + 0x03, 0xFC, 0x01, 0xEE, 0x00, 0xE7, 0x80, 0xF1, 0xC0, 0x70, 0x70, 0x70, + 0x0F, 0xE0, 0xFF, 0x87, 0x9E, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, + 0xF7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, + 0x0F, 0xE0, 0x07, 0xF0, 0x0F, 0x1E, 0x0E, 0x07, 0x8F, 0x01, 0xE7, 0x00, + 0xF7, 0x80, 0x3F, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC, + 0x01, 0xEE, 0x00, 0xE7, 0x00, 0xF1, 0xC0, 0x70, 0x70, 0x70, 0x1C, 0xF0, + 0x03, 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x07, 0xE0, 0xFF, 0xE0, 0x3C, + 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x38, 0x3C, + 0x70, 0x3F, 0xC0, 0x3D, 0xE0, 0x3C, 0xF0, 0x3C, 0xF8, 0x3C, 0x78, 0x3C, + 0x3C, 0x3C, 0x3E, 0xFF, 0x1F, 0x1F, 0x27, 0x0E, 0x60, 0x6E, 0x06, 0xF0, + 0x2F, 0x80, 0x7F, 0x07, 0xFC, 0x1F, 0xE0, 0x7E, 0x01, 0xF8, 0x07, 0xC0, + 0x7C, 0x06, 0xF0, 0xC9, 0xF8, 0xFF, 0xFF, 0xC7, 0x9F, 0x0F, 0x1C, 0x1E, + 0x10, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, + 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x07, 0xF8, 0xFE, + 0x1E, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x4F, 0x00, 0x9E, 0x01, + 0x3C, 0x02, 0x78, 0x04, 0xF0, 0x09, 0xE0, 0x13, 0xC0, 0x27, 0x80, 0x47, + 0x81, 0x07, 0x84, 0x07, 0xF0, 0xFF, 0x0F, 0x9E, 0x03, 0x0F, 0x00, 0x83, + 0xC0, 0x81, 0xE0, 0x40, 0xF8, 0x60, 0x3C, 0x20, 0x1E, 0x10, 0x07, 0x90, + 0x03, 0xC8, 0x00, 0xF4, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x7F, 0x9E, 0xF8, 0x3C, 0x08, + 0xF0, 0x78, 0x31, 0xE0, 0xF0, 0x41, 0xE0, 0xF0, 0x83, 0xC3, 0xE3, 0x07, + 0x85, 0xC4, 0x07, 0x93, 0xC8, 0x0F, 0x27, 0xB0, 0x0E, 0x47, 0x40, 0x1F, + 0x0F, 0x80, 0x3E, 0x1F, 0x00, 0x38, 0x1C, 0x00, 0x70, 0x38, 0x00, 0xE0, + 0x30, 0x00, 0x80, 0x40, 0xFF, 0x9F, 0x9F, 0x07, 0x07, 0x83, 0x03, 0xE3, + 0x00, 0xF9, 0x00, 0x3D, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, + 0xF8, 0x00, 0xBE, 0x00, 0x8F, 0x00, 0x83, 0xC0, 0xC1, 0xF0, 0xE0, 0xFD, + 0xF8, 0xFF, 0xFF, 0x1F, 0x7C, 0x06, 0x3C, 0x04, 0x3E, 0x0C, 0x1E, 0x08, + 0x0F, 0x10, 0x0F, 0x30, 0x07, 0xA0, 0x07, 0xC0, 0x03, 0xC0, 0x03, 0xC0, + 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x0F, 0xF0, 0x7F, 0xFC, + 0xE0, 0xF1, 0x83, 0xE2, 0x07, 0x84, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x08, 0xF0, 0x13, 0xC0, 0x6F, 0x81, + 0x9E, 0x07, 0x7F, 0xFE, 0xFF, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xF0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, + 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x03, 0xF9, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCF, 0xF0, 0x0C, + 0x07, 0x81, 0xE0, 0xCC, 0x33, 0x18, 0x66, 0x1B, 0x87, 0xC0, 0xC0, 0xFF, + 0xF0, 0xC7, 0x1C, 0x30, 0x1F, 0x0E, 0x71, 0xCF, 0x39, 0xE0, 0x3C, 0x1F, + 0x8E, 0xF3, 0x9E, 0xF3, 0xDE, 0x79, 0xFF, 0x80, 0xF8, 0x07, 0x80, 0x78, + 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7, 0x8E, 0x78, 0xF7, 0x8F, 0x78, + 0xF7, 0x8F, 0x78, 0xF7, 0x8E, 0x79, 0xC4, 0x78, 0x1F, 0x1D, 0xDC, 0xFE, + 0x7F, 0x07, 0x83, 0xC1, 0xE0, 0x78, 0x3C, 0x47, 0xC0, 0x03, 0xE0, 0x1E, + 0x01, 0xE0, 0x1E, 0x01, 0xE1, 0xDE, 0x7B, 0xE7, 0x1E, 0xF1, 0xEF, 0x1E, + 0xF1, 0xEF, 0x1E, 0xF1, 0xE7, 0x1E, 0x7B, 0xE1, 0xDF, 0x1F, 0x0C, 0x67, + 0x1B, 0xC7, 0xFF, 0xFC, 0x0F, 0x03, 0xC0, 0x78, 0x4E, 0x21, 0xF0, 0x1E, + 0x3B, 0x7B, 0x78, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0xFC, 0x3E, 0x0E, 0x7F, 0xCE, 0x79, 0xEF, 0x3C, 0xE7, 0x0F, + 0xC1, 0x00, 0x60, 0x1C, 0x03, 0xFE, 0x7F, 0xE3, 0xFF, 0x80, 0xF0, 0x33, + 0xFC, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0xB8, 0x7D, 0xE7, + 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xEF, + 0xFF, 0x31, 0xE7, 0x8C, 0x03, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, + 0xBF, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0xCF, 0xCE, 0x7C, 0xF8, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0xF9, 0xE1, 0x8F, 0x10, 0x79, + 0x03, 0xD8, 0x1F, 0xE0, 0xF7, 0x87, 0x9E, 0x3C, 0x71, 0xE3, 0xDF, 0xBF, + 0xF9, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0xBF, + 0xFB, 0xCF, 0x0F, 0xBE, 0x79, 0xE7, 0x8F, 0x3C, 0xF1, 0xE7, 0x9E, 0x3C, + 0xF3, 0xC7, 0x9E, 0x78, 0xF3, 0xCF, 0x1E, 0x79, 0xE3, 0xCF, 0x3C, 0x7B, + 0xFF, 0xDF, 0x80, 0xFB, 0x87, 0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, + 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0xFF, 0xF0, 0x1F, 0x07, 0x71, 0xC7, + 0x78, 0xFF, 0x1F, 0xE3, 0xFC, 0x7F, 0x8F, 0x71, 0xC7, 0x70, 0x7C, 0x00, + 0xFB, 0x87, 0xDE, 0x78, 0xE7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, + 0x78, 0xE7, 0x9E, 0x7F, 0x87, 0x80, 0x78, 0x07, 0x80, 0x78, 0x0F, 0xC0, + 0x1E, 0x23, 0x9E, 0x71, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, + 0x71, 0xE7, 0x9E, 0x1F, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3F, + 0xF9, 0xDF, 0xF7, 0xDD, 0xE0, 0x78, 0x1E, 0x07, 0x81, 0xE0, 0x78, 0x1E, + 0x0F, 0xC0, 0x3D, 0x43, 0xC3, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0x83, 0xC2, + 0xBC, 0x08, 0x18, 0x38, 0x78, 0xFC, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x79, 0x3E, 0xFB, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, + 0x9E, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0x3F, 0xF0, 0xFC, 0xEF, 0x08, + 0xE1, 0x1E, 0x41, 0xC8, 0x3D, 0x03, 0xC0, 0x78, 0x0E, 0x00, 0xC0, 0x10, + 0x00, 0xFD, 0xF7, 0xBC, 0x71, 0x9E, 0x38, 0x87, 0x1E, 0x43, 0xCF, 0x40, + 0xEB, 0xA0, 0x7C, 0xF0, 0x1C, 0x70, 0x0E, 0x38, 0x06, 0x08, 0x01, 0x04, + 0x00, 0xFC, 0xF7, 0x84, 0x3C, 0x81, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x80, + 0xBC, 0x13, 0xC2, 0x1E, 0xFB, 0xF0, 0xFC, 0xEF, 0x08, 0xE1, 0x1E, 0x43, + 0xC8, 0x3A, 0x07, 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x18, 0x02, 0x00, 0x41, + 0xC8, 0x3A, 0x03, 0x80, 0xFF, 0xB1, 0xE8, 0x70, 0x3C, 0x1E, 0x07, 0x83, + 0xC1, 0xE0, 0x78, 0xBC, 0x2F, 0xF8, 0x07, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x1C, 0xE0, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE0, 0x70, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x18, 0x07, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x70, 0xE0, 0x70, 0x1F, 0x8B, 0x3F, 0x01, 0xC0 }; + +const GFXglyph FreeSerifBold12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 4, 16, 8, 2, -15 }, // 0x21 '!' + { 8, 9, 7, 13, 2, -15 }, // 0x22 '"' + { 16, 12, 16, 12, 0, -15 }, // 0x23 '#' + { 40, 11, 20, 12, 1, -17 }, // 0x24 '$' + { 68, 18, 16, 24, 3, -15 }, // 0x25 '%' + { 104, 18, 16, 20, 1, -15 }, // 0x26 '&' + { 140, 3, 7, 7, 2, -15 }, // 0x27 ''' + { 143, 6, 21, 8, 1, -16 }, // 0x28 '(' + { 159, 6, 21, 8, 1, -16 }, // 0x29 ')' + { 175, 9, 10, 12, 2, -15 }, // 0x2A '*' + { 187, 12, 12, 16, 2, -11 }, // 0x2B '+' + { 205, 4, 8, 6, 1, -3 }, // 0x2C ',' + { 209, 6, 3, 8, 1, -6 }, // 0x2D '-' + { 212, 4, 4, 6, 1, -3 }, // 0x2E '.' + { 214, 8, 17, 7, -1, -15 }, // 0x2F '/' + { 231, 11, 16, 12, 1, -15 }, // 0x30 '0' + { 253, 9, 16, 12, 1, -15 }, // 0x31 '1' + { 271, 12, 16, 12, 0, -15 }, // 0x32 '2' + { 295, 11, 16, 12, 1, -15 }, // 0x33 '3' + { 317, 10, 16, 12, 1, -15 }, // 0x34 '4' + { 337, 11, 16, 12, 1, -15 }, // 0x35 '5' + { 359, 11, 16, 12, 1, -15 }, // 0x36 '6' + { 381, 11, 16, 12, 0, -15 }, // 0x37 '7' + { 403, 11, 16, 12, 1, -15 }, // 0x38 '8' + { 425, 11, 16, 12, 1, -15 }, // 0x39 '9' + { 447, 4, 11, 8, 2, -10 }, // 0x3A ':' + { 453, 4, 15, 8, 2, -10 }, // 0x3B ';' + { 461, 14, 14, 16, 1, -12 }, // 0x3C '<' + { 486, 14, 8, 16, 1, -9 }, // 0x3D '=' + { 500, 14, 14, 16, 1, -12 }, // 0x3E '>' + { 525, 10, 16, 12, 1, -15 }, // 0x3F '?' + { 545, 16, 16, 22, 3, -15 }, // 0x40 '@' + { 577, 17, 16, 17, 0, -15 }, // 0x41 'A' + { 611, 14, 16, 16, 1, -15 }, // 0x42 'B' + { 639, 15, 16, 17, 1, -15 }, // 0x43 'C' + { 669, 17, 16, 18, 0, -15 }, // 0x44 'D' + { 703, 15, 16, 16, 1, -15 }, // 0x45 'E' + { 733, 14, 16, 15, 1, -15 }, // 0x46 'F' + { 761, 16, 16, 19, 1, -15 }, // 0x47 'G' + { 793, 16, 16, 19, 2, -15 }, // 0x48 'H' + { 825, 8, 16, 9, 1, -15 }, // 0x49 'I' + { 841, 12, 18, 12, 0, -15 }, // 0x4A 'J' + { 868, 17, 16, 19, 2, -15 }, // 0x4B 'K' + { 902, 14, 16, 16, 2, -15 }, // 0x4C 'L' + { 930, 20, 16, 23, 1, -15 }, // 0x4D 'M' + { 970, 15, 16, 17, 1, -15 }, // 0x4E 'N' + { 1000, 17, 16, 19, 1, -15 }, // 0x4F 'O' + { 1034, 12, 16, 15, 2, -15 }, // 0x50 'P' + { 1058, 17, 20, 19, 1, -15 }, // 0x51 'Q' + { 1101, 16, 16, 17, 1, -15 }, // 0x52 'R' + { 1133, 12, 16, 14, 1, -15 }, // 0x53 'S' + { 1157, 15, 16, 15, 0, -15 }, // 0x54 'T' + { 1187, 15, 16, 17, 1, -15 }, // 0x55 'U' + { 1217, 17, 17, 17, 0, -15 }, // 0x56 'V' + { 1254, 23, 16, 24, 0, -15 }, // 0x57 'W' + { 1300, 17, 16, 17, 0, -15 }, // 0x58 'X' + { 1334, 16, 16, 17, 1, -15 }, // 0x59 'Y' + { 1366, 15, 16, 16, 0, -15 }, // 0x5A 'Z' + { 1396, 5, 20, 8, 2, -15 }, // 0x5B '[' + { 1409, 8, 17, 7, -1, -15 }, // 0x5C '\' + { 1426, 5, 20, 8, 2, -15 }, // 0x5D ']' + { 1439, 10, 9, 14, 2, -15 }, // 0x5E '^' + { 1451, 12, 1, 12, 0, 4 }, // 0x5F '_' + { 1453, 5, 4, 8, 0, -16 }, // 0x60 '`' + { 1456, 11, 11, 12, 1, -10 }, // 0x61 'a' + { 1472, 12, 16, 13, 1, -15 }, // 0x62 'b' + { 1496, 9, 11, 10, 1, -10 }, // 0x63 'c' + { 1509, 12, 16, 13, 1, -15 }, // 0x64 'd' + { 1533, 10, 11, 11, 1, -10 }, // 0x65 'e' + { 1547, 8, 16, 9, 1, -15 }, // 0x66 'f' + { 1563, 11, 16, 12, 1, -10 }, // 0x67 'g' + { 1585, 12, 16, 13, 1, -15 }, // 0x68 'h' + { 1609, 6, 16, 7, 1, -15 }, // 0x69 'i' + { 1621, 8, 21, 10, 0, -15 }, // 0x6A 'j' + { 1642, 13, 16, 13, 1, -15 }, // 0x6B 'k' + { 1668, 6, 16, 7, 1, -15 }, // 0x6C 'l' + { 1680, 19, 11, 20, 1, -10 }, // 0x6D 'm' + { 1707, 12, 11, 13, 1, -10 }, // 0x6E 'n' + { 1724, 11, 11, 12, 1, -10 }, // 0x6F 'o' + { 1740, 12, 16, 13, 1, -10 }, // 0x70 'p' + { 1764, 12, 16, 13, 1, -10 }, // 0x71 'q' + { 1788, 10, 11, 10, 1, -10 }, // 0x72 'r' + { 1802, 8, 11, 10, 1, -10 }, // 0x73 's' + { 1813, 8, 15, 8, 1, -14 }, // 0x74 't' + { 1828, 12, 11, 14, 1, -10 }, // 0x75 'u' + { 1845, 11, 11, 12, 0, -10 }, // 0x76 'v' + { 1861, 17, 11, 17, 0, -10 }, // 0x77 'w' + { 1885, 12, 11, 12, 0, -10 }, // 0x78 'x' + { 1902, 11, 16, 12, 0, -10 }, // 0x79 'y' + { 1924, 10, 11, 11, 1, -10 }, // 0x7A 'z' + { 1938, 8, 21, 9, 0, -16 }, // 0x7B '{' + { 1959, 2, 17, 5, 2, -15 }, // 0x7C '|' + { 1964, 8, 21, 9, 2, -16 }, // 0x7D '}' + { 1985, 11, 4, 12, 1, -7 } }; // 0x7E '~' + +const GFXfont FreeSerifBold12pt7b PROGMEM = { + (uint8_t *)FreeSerifBold12pt7bBitmaps, + (GFXglyph *)FreeSerifBold12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2663 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold18pt7b.h new file mode 100644 index 0000000..11d3c7e --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold18pt7b.h @@ -0,0 +1,462 @@ +const uint8_t FreeSerifBold18pt7bBitmaps[] PROGMEM = { + 0x7B, 0xEF, 0xFF, 0xFF, 0xF7, 0x9E, 0x71, 0xC7, 0x0C, 0x20, 0x82, 0x00, + 0x00, 0x07, 0x3E, 0xFF, 0xFF, 0xDC, 0x60, 0x37, 0x83, 0xFC, 0x1F, 0xE0, + 0xFF, 0x07, 0xB8, 0x3D, 0xC0, 0xCC, 0x06, 0x20, 0x31, 0x01, 0x80, 0x03, + 0x8E, 0x00, 0xC3, 0x80, 0x30, 0xE0, 0x1C, 0x38, 0x07, 0x0E, 0x01, 0xC3, + 0x87, 0xFF, 0xFD, 0xFF, 0xFF, 0x7F, 0xFF, 0xC1, 0x87, 0x00, 0xE1, 0xC0, + 0x38, 0x70, 0x0E, 0x1C, 0x03, 0x86, 0x0F, 0xFF, 0xF3, 0xFF, 0xFC, 0xFF, + 0xFF, 0x07, 0x0E, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x1C, 0x30, 0x07, 0x0C, + 0x01, 0x87, 0x00, 0x61, 0xC0, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xFF, + 0x03, 0x27, 0x8C, 0x47, 0x38, 0x86, 0x71, 0x0C, 0xF2, 0x09, 0xF4, 0x03, + 0xF8, 0x03, 0xF8, 0x07, 0xFC, 0x03, 0xFC, 0x03, 0xFE, 0x01, 0xFE, 0x03, + 0xFC, 0x04, 0xFC, 0x08, 0xFA, 0x10, 0xF4, 0x21, 0xEC, 0x43, 0xD8, 0x8F, + 0x3D, 0x3C, 0x3F, 0xF0, 0x1F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x03, 0xC0, + 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x90, 0x07, + 0xC1, 0x06, 0x00, 0xF0, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0x81, 0x8C, + 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x18, 0x1E, 0x3C, + 0xE3, 0x0F, 0xE7, 0xF8, 0xC3, 0xE6, 0x3C, 0x18, 0xF8, 0x40, 0x06, 0x3E, + 0x08, 0x01, 0x87, 0x81, 0x00, 0x31, 0xF0, 0x20, 0x0C, 0x3E, 0x04, 0x01, + 0x87, 0x81, 0x00, 0x60, 0xF0, 0x60, 0x18, 0x1E, 0x08, 0x03, 0x03, 0xC7, + 0x00, 0xC0, 0x3F, 0xC0, 0x18, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x00, 0x7F, + 0xE0, 0x00, 0x38, 0xF8, 0x00, 0x1E, 0x1F, 0x00, 0x07, 0x83, 0xC0, 0x01, + 0xF0, 0xF0, 0x00, 0x7C, 0x38, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFE, 0x0F, 0xF0, 0x3F, 0x80, 0xF0, 0x1F, 0xF0, 0x18, 0x1C, 0xFE, + 0x0C, 0x0E, 0x1F, 0xC3, 0x07, 0x87, 0xF1, 0x81, 0xE0, 0xFE, 0x40, 0xF8, + 0x1F, 0xF0, 0x3F, 0x07, 0xF8, 0x0F, 0xC0, 0xFE, 0x03, 0xF8, 0x1F, 0xC0, + 0xFE, 0x07, 0xF8, 0x9F, 0xE3, 0xFF, 0xE7, 0xFF, 0x9F, 0xF0, 0xFF, 0xC3, + 0xF8, 0x0F, 0x80, 0x3C, 0x00, 0x6F, 0xFF, 0xFF, 0x66, 0x66, 0x00, 0x81, + 0x81, 0x81, 0x81, 0x80, 0xC0, 0xE0, 0x70, 0x70, 0x38, 0x3C, 0x1E, 0x0F, + 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0E, 0x07, 0x03, 0x80, 0xE0, + 0x70, 0x18, 0x06, 0x01, 0x00, 0x40, 0x10, 0x04, 0x80, 0x30, 0x0C, 0x03, + 0x00, 0xC0, 0x60, 0x38, 0x1C, 0x07, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x3C, + 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xE0, 0x70, 0x38, 0x38, 0x1C, 0x0C, + 0x0C, 0x06, 0x04, 0x04, 0x04, 0x00, 0x03, 0x00, 0x1E, 0x00, 0x78, 0x1D, + 0xE6, 0xFB, 0x3D, 0xED, 0xF3, 0xFF, 0x01, 0xC0, 0x7F, 0xF3, 0xED, 0xFF, + 0x33, 0xD9, 0xE6, 0x07, 0x80, 0x1E, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, + 0x1C, 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, + 0x38, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, + 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x80, 0x00, 0x73, 0xEF, 0xFF, 0xFD, 0xF0, + 0xC2, 0x18, 0xC6, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x7B, 0xFF, 0xFF, 0xFD, + 0xE0, 0x00, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, + 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, + 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x1C, 0x07, 0x00, 0xE0, 0x00, + 0x03, 0xC0, 0x0E, 0x70, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x7C, 0x3E, + 0x7C, 0x3E, 0x7C, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3E, 0x7C, 0x3E, + 0x7C, 0x3E, 0x3C, 0x3C, 0x3C, 0x3C, 0x1E, 0x78, 0x0E, 0x70, 0x03, 0xC0, + 0x00, 0xC0, 0x3C, 0x0F, 0xC3, 0xFC, 0x4F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x1F, 0xEF, 0xFF, + 0x03, 0xE0, 0x0F, 0xF8, 0x1F, 0xFC, 0x3F, 0xFC, 0x30, 0xFE, 0x60, 0x7E, + 0x40, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x78, + 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x01, + 0x0C, 0x03, 0x1F, 0xFF, 0x1F, 0xFF, 0x3F, 0xFE, 0x7F, 0xFE, 0xFF, 0xFE, + 0x03, 0xF0, 0x0F, 0xF8, 0x3F, 0xFC, 0x21, 0xFE, 0x40, 0xFE, 0x00, 0x7E, + 0x00, 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xFC, 0x03, 0xFE, + 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0x00, 0x0E, 0x70, 0x0E, 0xFC, 0x1C, 0xFE, 0x38, 0x7F, 0xE0, 0x3F, 0x80, + 0x00, 0x38, 0x00, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x1F, 0x80, 0x5F, 0x00, + 0xBE, 0x02, 0x7C, 0x08, 0xF8, 0x31, 0xF0, 0x43, 0xE1, 0x07, 0xC4, 0x0F, + 0x88, 0x1F, 0x20, 0x3E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x0F, 0xFE, 0x1F, + 0xF8, 0x7F, 0xF0, 0xFF, 0xE1, 0x80, 0x03, 0x00, 0x0C, 0x00, 0x18, 0x00, + 0x3F, 0x80, 0xFF, 0xC1, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0x80, 0x3F, 0x80, + 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x37, 0x80, 0x4F, 0x81, + 0x9F, 0xC6, 0x3F, 0xF8, 0x1F, 0x80, 0x00, 0x07, 0x00, 0x7C, 0x01, 0xF0, + 0x03, 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x3E, 0x00, 0x7E, 0x00, + 0x7F, 0xF0, 0x7F, 0xFC, 0xFC, 0x7E, 0xFC, 0x7E, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0x7C, 0x3F, 0x7C, 0x3E, 0x3C, 0x3E, + 0x3E, 0x3C, 0x1E, 0x78, 0x07, 0xE0, 0x7F, 0xFF, 0x7F, 0xFE, 0x7F, 0xFE, + 0xFF, 0xFE, 0xFF, 0xFC, 0xC0, 0x1C, 0x80, 0x18, 0x80, 0x38, 0x00, 0x38, + 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, + 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80, + 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0xE0, 0x38, 0x78, 0x70, 0x3C, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF8, 0x1E, 0xF8, 0x1E, 0xFE, 0x3C, 0x7F, 0xB0, + 0x7F, 0xE0, 0x3F, 0xF0, 0x0F, 0xF8, 0x1F, 0xFC, 0x39, 0xFE, 0x70, 0xFF, + 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x1F, 0xF0, 0x1F, 0xF0, 0x1E, 0x78, 0x3E, + 0x7C, 0x7C, 0x3F, 0xF8, 0x0F, 0xE0, 0x07, 0xE0, 0x1E, 0x78, 0x3C, 0x7C, + 0x7C, 0x3C, 0x7C, 0x3E, 0xFC, 0x3E, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFC, 0x3F, 0x7E, 0x3F, 0x7E, 0x3F, 0x3F, 0xFE, 0x0F, 0xFE, + 0x00, 0x7E, 0x00, 0x7C, 0x00, 0xF8, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xC0, + 0x0F, 0x80, 0x3E, 0x00, 0xE0, 0x00, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0x00, + 0x00, 0x07, 0xBF, 0xFF, 0xFF, 0xDE, 0x39, 0xFB, 0xF7, 0xEF, 0xC7, 0x00, + 0x00, 0x00, 0x01, 0xE7, 0xEF, 0xFF, 0xFF, 0xBF, 0x06, 0x08, 0x30, 0xC2, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x07, 0xF0, + 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, + 0xC0, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7C, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x03, + 0xE0, 0x00, 0x7F, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xF8, 0x03, 0xFC, 0x00, 0xFE, 0x00, 0x1F, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xC7, 0x1F, + 0xB8, 0x3E, 0xF0, 0xFF, 0xC3, 0xFF, 0x0F, 0xD8, 0x3F, 0x00, 0xF8, 0x07, + 0xC0, 0x1E, 0x00, 0x60, 0x03, 0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x03, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x01, + 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xE0, 0x07, 0xC0, 0xF0, 0x0F, 0x00, + 0x38, 0x1E, 0x00, 0x0C, 0x3C, 0x07, 0x06, 0x38, 0x1F, 0x72, 0x78, 0x3C, + 0xF3, 0x78, 0x78, 0xE1, 0xF0, 0x70, 0xE1, 0xF0, 0xF0, 0xE1, 0xF0, 0xE0, + 0xC1, 0xF1, 0xE1, 0xC1, 0xF1, 0xC1, 0xC1, 0xF1, 0xC3, 0x82, 0xF1, 0xC3, + 0x86, 0x71, 0xC7, 0x8C, 0x79, 0xFB, 0xF8, 0x78, 0xF1, 0xF0, 0x3C, 0x00, + 0x00, 0x1E, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x78, 0x03, 0xFF, + 0xE0, 0x00, 0x7F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01, 0xBF, 0x00, 0x01, 0x1F, + 0x00, 0x03, 0x1F, 0x80, 0x02, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x0F, + 0xC0, 0x04, 0x07, 0xE0, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x03, + 0xF0, 0x18, 0x03, 0xF0, 0x30, 0x01, 0xF8, 0x30, 0x01, 0xF8, 0x70, 0x01, + 0xFC, 0xFE, 0x0F, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFE, 0x0F, 0xE1, 0xF8, + 0x3F, 0x07, 0xC1, 0xF8, 0x3F, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0, + 0x7E, 0x1F, 0x87, 0xE0, 0xFC, 0x7C, 0x07, 0xFF, 0x00, 0x3F, 0xFF, 0x01, + 0xF8, 0xFE, 0x0F, 0xC1, 0xF8, 0x7E, 0x0F, 0xC3, 0xF0, 0x3F, 0x1F, 0x81, + 0xF8, 0xFC, 0x0F, 0xC7, 0xE0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x3F, 0x0F, + 0xC3, 0xF0, 0xFF, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x7E, 0x04, 0x07, 0xFF, + 0x18, 0x1F, 0x07, 0xF0, 0x7C, 0x03, 0xE1, 0xF0, 0x03, 0xC7, 0xC0, 0x03, + 0x9F, 0x80, 0x03, 0x3F, 0x00, 0x06, 0x7C, 0x00, 0x05, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x3F, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, + 0x00, 0x01, 0xF0, 0x00, 0x23, 0xF0, 0x00, 0xC3, 0xF0, 0x07, 0x03, 0xF0, + 0x3C, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0x00, 0x7E, 0x1F, 0x80, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0x83, 0xF0, 0x1F, + 0x07, 0xE0, 0x3F, 0x0F, 0xC0, 0x7E, 0x1F, 0x80, 0x7E, 0x3F, 0x00, 0xFC, + 0x7E, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x0F, 0xC7, + 0xE0, 0x1F, 0x8F, 0xC0, 0x3F, 0x1F, 0x80, 0x7C, 0x3F, 0x01, 0xF8, 0x7E, + 0x03, 0xE0, 0xFC, 0x0F, 0x81, 0xF8, 0x1F, 0x03, 0xF0, 0xFC, 0x0F, 0xFF, + 0xE0, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x0F, 0xC0, 0x78, + 0x7E, 0x01, 0xC3, 0xF0, 0x06, 0x1F, 0x80, 0x10, 0xFC, 0x10, 0x87, 0xE0, + 0x80, 0x3F, 0x0C, 0x01, 0xF8, 0xE0, 0x0F, 0xFF, 0x00, 0x7F, 0xF8, 0x03, + 0xF1, 0xC0, 0x1F, 0x86, 0x00, 0xFC, 0x10, 0x07, 0xE0, 0x80, 0x3F, 0x00, + 0x09, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F, 0x1F, + 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xFF, 0xEF, 0xFF, 0xFC, + 0xFC, 0x0F, 0x9F, 0x80, 0x73, 0xF0, 0x06, 0x7E, 0x00, 0x4F, 0xC1, 0x09, + 0xF8, 0x20, 0x3F, 0x0C, 0x07, 0xE3, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, + 0xF1, 0xC0, 0x7E, 0x18, 0x0F, 0xC1, 0x01, 0xF8, 0x20, 0x3F, 0x00, 0x07, + 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x1F, + 0xE0, 0x07, 0xFF, 0x00, 0x00, 0x7E, 0x02, 0x01, 0xFF, 0xE3, 0x01, 0xF0, + 0x3F, 0x81, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xE1, 0xF0, 0x00, 0x71, 0xF8, + 0x00, 0x18, 0xFC, 0x00, 0x0C, 0x7C, 0x00, 0x02, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xF0, 0x0F, 0xFF, 0xF8, 0x01, 0xFE, 0x7C, 0x00, 0x7E, 0x3F, 0x00, 0x3F, + 0x1F, 0x80, 0x1F, 0x87, 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xE0, 0xFC, 0x03, + 0xF0, 0x1F, 0x83, 0xF0, 0x07, 0xFF, 0xE0, 0x00, 0x7F, 0x80, 0x00, 0xFF, + 0xC3, 0xFF, 0x7F, 0x81, 0xFE, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, + 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x7F, 0x81, 0xFE, 0xFF, 0xC3, 0xFF, 0xFF, + 0xEF, 0xF0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, + 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0xE7, 0xFF, 0x07, 0xFF, 0x01, 0xFE, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, + 0x70, 0xFC, 0xF8, 0xFC, 0xF8, 0xF8, 0xF0, 0xF8, 0x71, 0xF0, 0x7F, 0xE0, + 0x1F, 0x80, 0xFF, 0xC3, 0xFF, 0x3F, 0xC0, 0x3E, 0x0F, 0xC0, 0x1C, 0x07, + 0xE0, 0x18, 0x03, 0xF0, 0x18, 0x01, 0xF8, 0x18, 0x00, 0xFC, 0x18, 0x00, + 0x7E, 0x18, 0x00, 0x3F, 0x18, 0x00, 0x1F, 0x9C, 0x00, 0x0F, 0xDF, 0x00, + 0x07, 0xFF, 0xC0, 0x03, 0xFF, 0xF0, 0x01, 0xF9, 0xF8, 0x00, 0xFC, 0xFE, + 0x00, 0x7E, 0x3F, 0x80, 0x3F, 0x0F, 0xE0, 0x1F, 0x83, 0xF8, 0x0F, 0xC0, + 0xFC, 0x07, 0xE0, 0x7F, 0x03, 0xF0, 0x1F, 0xC1, 0xF8, 0x07, 0xF1, 0xFE, + 0x03, 0xFD, 0xFF, 0x8F, 0xFF, 0xFF, 0xE0, 0x03, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, + 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x01, 0x3F, + 0x00, 0x19, 0xF8, 0x00, 0xCF, 0xC0, 0x0C, 0x7E, 0x00, 0x63, 0xF0, 0x0F, + 0x1F, 0x81, 0xFB, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0x80, 0x03, 0xFE, + 0x7F, 0x00, 0x07, 0xF8, 0x7E, 0x00, 0x0F, 0xE0, 0xFE, 0x00, 0x3F, 0xC1, + 0x7C, 0x00, 0x5F, 0x82, 0xFC, 0x01, 0xBF, 0x05, 0xF8, 0x02, 0x7E, 0x09, + 0xF8, 0x0C, 0xFC, 0x13, 0xF0, 0x11, 0xF8, 0x23, 0xE0, 0x23, 0xF0, 0x47, + 0xE0, 0xC7, 0xE0, 0x87, 0xC1, 0x0F, 0xC1, 0x0F, 0xC6, 0x1F, 0x82, 0x0F, + 0x88, 0x3F, 0x04, 0x1F, 0xB0, 0x7E, 0x08, 0x3F, 0x60, 0xFC, 0x10, 0x3E, + 0x81, 0xF8, 0x20, 0x7F, 0x03, 0xF0, 0x40, 0x7C, 0x07, 0xE0, 0x80, 0xF8, + 0x0F, 0xC1, 0x00, 0xE0, 0x1F, 0x82, 0x01, 0xC0, 0x3F, 0x0E, 0x03, 0x80, + 0xFF, 0x7F, 0x82, 0x03, 0xFF, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x70, 0xFE, + 0x00, 0x40, 0xFE, 0x00, 0x81, 0xFC, 0x01, 0x03, 0xFC, 0x02, 0x05, 0xFC, + 0x04, 0x09, 0xFC, 0x08, 0x11, 0xFC, 0x10, 0x23, 0xF8, 0x20, 0x43, 0xF8, + 0x40, 0x83, 0xF8, 0x81, 0x03, 0xF9, 0x02, 0x03, 0xFA, 0x04, 0x03, 0xF4, + 0x08, 0x07, 0xF8, 0x10, 0x07, 0xF0, 0x20, 0x07, 0xE0, 0x40, 0x07, 0xC0, + 0x80, 0x07, 0x81, 0x00, 0x0F, 0x02, 0x00, 0x0E, 0x0E, 0x00, 0x0C, 0x7F, + 0x00, 0x08, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, 0x01, 0xF0, 0x7C, 0x01, + 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01, 0xF1, 0xF8, 0x00, 0xFC, + 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, 0x0F, 0xFF, 0x00, 0x07, + 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, 0x00, 0xFF, 0xF0, 0x00, + 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E, 0x00, 0x1F, 0x9F, 0x80, + 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x3F, + 0x07, 0xC0, 0x07, 0xFF, 0xC0, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0xFC, 0x0F, + 0xFF, 0xE0, 0xFC, 0x7E, 0x1F, 0x87, 0xE3, 0xF0, 0x7E, 0x7E, 0x0F, 0xCF, + 0xC1, 0xF9, 0xF8, 0x3F, 0x3F, 0x07, 0xE7, 0xE0, 0xFC, 0xFC, 0x3F, 0x1F, + 0x8F, 0xC3, 0xFF, 0xF0, 0x7F, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, + 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, + 0x00, 0x1F, 0xE0, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x01, 0xFF, 0xF0, + 0x01, 0xF0, 0x7C, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x07, 0xC1, 0xF0, 0x01, + 0xF1, 0xF8, 0x00, 0xFC, 0xFC, 0x00, 0x7E, 0x7C, 0x00, 0x1F, 0x7E, 0x00, + 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xE0, + 0x00, 0xFF, 0xF0, 0x00, 0x7F, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x3E, + 0x00, 0x0F, 0x9F, 0x80, 0x0F, 0xC7, 0xC0, 0x07, 0xC1, 0xF0, 0x07, 0xC0, + 0x78, 0x03, 0xC0, 0x1E, 0x07, 0xC0, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x0F, 0xF0, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, + 0xF8, 0x00, 0x0F, 0xE0, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0xFC, 0x3F, + 0x01, 0xF8, 0x3F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFC, + 0x1F, 0x81, 0xF8, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, 0x1F, 0x81, + 0xF8, 0x7E, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xC0, 0x0F, 0xDF, 0xC0, 0x1F, + 0x9F, 0x80, 0x3F, 0x1F, 0x80, 0x7E, 0x3F, 0x80, 0xFC, 0x3F, 0x81, 0xF8, + 0x3F, 0x03, 0xF0, 0x7F, 0x07, 0xE0, 0x7F, 0x1F, 0xE0, 0x7F, 0x7F, 0xE0, + 0xFF, 0x07, 0xC2, 0x1F, 0xF2, 0x3C, 0x3E, 0x70, 0x0E, 0xF0, 0x06, 0xF0, + 0x06, 0xF0, 0x02, 0xF8, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0xE0, 0x3F, + 0xF8, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFF, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0E, 0xF0, 0x1E, 0xF8, 0x3C, 0x9F, + 0xF8, 0x87, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x3F, 0x83, + 0xF0, 0x7C, 0x1F, 0x81, 0xC0, 0xFC, 0x06, 0x07, 0xE0, 0x20, 0x3F, 0x00, + 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, + 0x80, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, + 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, + 0x00, 0x0F, 0xF0, 0x01, 0xFF, 0xE0, 0xFF, 0xC1, 0xFD, 0xFE, 0x01, 0xC3, + 0xF0, 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, + 0x02, 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, + 0x0F, 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F, + 0xC0, 0x08, 0x3F, 0x00, 0x20, 0xFC, 0x00, 0x83, 0xF0, 0x02, 0x0F, 0xC0, + 0x18, 0x1F, 0x80, 0x40, 0x7E, 0x03, 0x00, 0xFC, 0x18, 0x01, 0xFF, 0xC0, + 0x00, 0xFC, 0x00, 0xFF, 0xF0, 0x7F, 0x3F, 0xC0, 0x1E, 0x1F, 0x80, 0x0C, + 0x1F, 0x80, 0x08, 0x0F, 0xC0, 0x18, 0x0F, 0xC0, 0x18, 0x07, 0xE0, 0x10, + 0x07, 0xE0, 0x30, 0x07, 0xE0, 0x20, 0x03, 0xF0, 0x60, 0x03, 0xF0, 0x60, + 0x01, 0xF8, 0x40, 0x01, 0xF8, 0xC0, 0x00, 0xF8, 0x80, 0x00, 0xFC, 0x80, + 0x00, 0xFD, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3E, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0xFF, 0xE7, 0xFF, 0x0F, 0xCF, 0xE0, 0x7F, 0x00, 0xE1, + 0xF8, 0x0F, 0xC0, 0x30, 0x7E, 0x03, 0xF0, 0x0C, 0x1F, 0x80, 0x7C, 0x02, + 0x03, 0xE0, 0x1F, 0x81, 0x80, 0xFC, 0x07, 0xE0, 0x60, 0x3F, 0x03, 0xF8, + 0x10, 0x07, 0xC0, 0xBF, 0x0C, 0x01, 0xF8, 0x2F, 0xC3, 0x00, 0x7E, 0x19, + 0xF0, 0x80, 0x0F, 0x84, 0x7C, 0x60, 0x03, 0xF3, 0x0F, 0x98, 0x00, 0xFC, + 0xC3, 0xE4, 0x00, 0x1F, 0x20, 0xFB, 0x00, 0x07, 0xF8, 0x1F, 0xC0, 0x00, + 0xFC, 0x07, 0xE0, 0x00, 0x3F, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x3E, 0x00, + 0x01, 0xE0, 0x0F, 0x00, 0x00, 0x78, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x70, + 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x06, 0x00, 0x00, 0x20, 0x00, + 0x80, 0x00, 0xFF, 0xF3, 0xFE, 0x7F, 0x80, 0x78, 0x3F, 0x80, 0x70, 0x1F, + 0xC0, 0x60, 0x0F, 0xC0, 0xC0, 0x0F, 0xE1, 0x80, 0x07, 0xF1, 0x00, 0x03, + 0xF3, 0x00, 0x03, 0xFE, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00, + 0x9F, 0x80, 0x01, 0x8F, 0xC0, 0x03, 0x0F, 0xE0, 0x06, 0x07, 0xE0, 0x06, + 0x07, 0xF0, 0x0C, 0x03, 0xF8, 0x1C, 0x03, 0xF8, 0x3C, 0x03, 0xFC, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0x7F, 0x80, 0x1E, 0x3F, 0x80, 0x1C, 0x1F, + 0x80, 0x18, 0x1F, 0xC0, 0x10, 0x0F, 0xC0, 0x30, 0x07, 0xE0, 0x20, 0x07, + 0xE0, 0x60, 0x03, 0xF0, 0xC0, 0x03, 0xF0, 0x80, 0x01, 0xF9, 0x80, 0x01, + 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFF, 0x00, 0x01, + 0xFF, 0x80, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0x01, 0xF8, 0xE0, 0x1F, + 0x86, 0x01, 0xFC, 0x20, 0x0F, 0xC1, 0x00, 0xFC, 0x00, 0x07, 0xE0, 0x00, + 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, + 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x01, 0x0F, 0xC0, 0x18, 0xFC, + 0x00, 0xC7, 0xE0, 0x06, 0x7E, 0x00, 0x77, 0xF0, 0x07, 0x3F, 0x00, 0xFB, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xE0, 0x1E, + 0x01, 0xC0, 0x38, 0x07, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x1C, 0x03, 0x80, + 0x70, 0x07, 0x00, 0xE0, 0x1C, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x70, 0x0E, + 0x01, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0xFF, 0xFF, 0x03, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x7E, 0x00, 0xEE, 0x03, + 0x9C, 0x07, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0xE0, 0x71, 0xC0, 0x77, 0x00, + 0xEE, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE0, 0xF0, + 0x78, 0x3C, 0x0E, 0x07, 0x0F, 0xE0, 0x3F, 0xF0, 0x78, 0xF8, 0x78, 0x7C, + 0x78, 0x7C, 0x38, 0x7C, 0x00, 0x7C, 0x03, 0xFC, 0x1E, 0x7C, 0x7C, 0x7C, + 0xFC, 0x7C, 0xFC, 0x7C, 0xFC, 0xFC, 0xFF, 0xFD, 0x7F, 0x7F, 0x3C, 0x3C, + 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0xF8, 0x1F, 0x7F, 0x87, 0xE3, + 0xF1, 0xF0, 0x7E, 0x7C, 0x0F, 0x9F, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3F, + 0x7C, 0x0F, 0xDF, 0x03, 0xF7, 0xC0, 0xFD, 0xF0, 0x3E, 0x7C, 0x1F, 0x1F, + 0x8F, 0xC6, 0x7F, 0xC1, 0x07, 0xC0, 0x07, 0xC0, 0x7F, 0xC3, 0xC7, 0x9F, + 0x1E, 0x78, 0x7B, 0xE1, 0xCF, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x80, 0x3F, 0x00, 0x7C, 0x00, 0xFC, 0x61, 0xFF, 0x03, 0xF0, 0x00, 0x7F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x01, 0xF0, 0x00, 0x7C, 0x07, 0x9F, 0x07, 0xF7, 0xC3, 0xE3, 0xF1, 0xF8, + 0x7C, 0x7C, 0x1F, 0x3F, 0x07, 0xCF, 0xC1, 0xF3, 0xF0, 0x7C, 0xFC, 0x1F, + 0x3F, 0x07, 0xCF, 0xC1, 0xF1, 0xF0, 0x7C, 0x7E, 0x1F, 0x0F, 0x8F, 0xC1, + 0xFD, 0xFC, 0x3E, 0x70, 0x0F, 0xC0, 0x7F, 0xC3, 0xC7, 0x1E, 0x1E, 0xF8, + 0x7B, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xC0, 0x1F, + 0x03, 0x7E, 0x18, 0xFF, 0xC1, 0xFE, 0x03, 0xF0, 0x0F, 0x83, 0xF8, 0xF3, + 0xBE, 0xF7, 0xDC, 0xF8, 0x1F, 0x03, 0xE0, 0xFF, 0x1F, 0xE1, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x07, 0xF8, 0x0F, 0xC0, 0x1F, 0xFF, 0xDF, 0x1F, 0xFF, + 0x07, 0x8F, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7C, 0x78, 0x3C, + 0x1E, 0x3E, 0x03, 0xFC, 0x03, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03, 0xFF, + 0xF1, 0xFF, 0xFE, 0x7F, 0xFF, 0x8F, 0xFF, 0xF8, 0x01, 0xFC, 0x00, 0x7F, + 0x00, 0x73, 0xFF, 0xF0, 0x7F, 0xC0, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF8, 0x00, 0x7C, + 0x7C, 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, + 0xF0, 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83, + 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x39, 0xFB, 0xF7, + 0xE7, 0x80, 0x00, 0x00, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, + 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x7F, 0x03, 0xC0, 0xFC, 0x1F, 0x83, 0xF0, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7D, 0xCF, 0xF9, 0xEE, 0x7C, 0xFF, 0x0F, + 0x80, 0xFC, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x7F, 0x9F, 0x07, 0x87, + 0xC1, 0x81, 0xF0, 0xC0, 0x7C, 0x60, 0x1F, 0x30, 0x07, 0xDE, 0x01, 0xFF, + 0xC0, 0x7F, 0xF0, 0x1F, 0x3E, 0x07, 0xCF, 0xC1, 0xF1, 0xF8, 0x7C, 0x3E, + 0x1F, 0x07, 0xC7, 0xC1, 0xFB, 0xF9, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 0xCF, + 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, + 0xE7, 0xCF, 0x9F, 0x7F, 0xFC, 0x7C, 0x1F, 0x0F, 0xBF, 0xCF, 0xF1, 0xF8, + 0xFF, 0x3F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C, 0xF8, 0x3E, 0x0F, + 0x9F, 0x07, 0xC1, 0xF3, 0xE0, 0xF8, 0x3E, 0x7C, 0x1F, 0x07, 0xCF, 0x83, + 0xE0, 0xF9, 0xF0, 0x7C, 0x1F, 0x3E, 0x0F, 0x83, 0xE7, 0xC1, 0xF0, 0x7C, + 0xF8, 0x3E, 0x0F, 0x9F, 0x07, 0xC1, 0xF7, 0xF1, 0xFC, 0x7F, 0xFC, 0x7C, + 0x3E, 0xFF, 0x1F, 0xCF, 0xCF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, + 0x7C, 0xF8, 0x3E, 0x7C, 0x1F, 0x3E, 0x0F, 0x9F, 0x07, 0xCF, 0x83, 0xE7, + 0xC1, 0xF3, 0xE0, 0xF9, 0xF0, 0x7D, 0xFC, 0x7F, 0x07, 0xF0, 0x0F, 0xFE, + 0x0F, 0x8F, 0x8F, 0x87, 0xE7, 0xC1, 0xF7, 0xE0, 0xFF, 0xF0, 0x7F, 0xF8, + 0x3F, 0xFC, 0x1F, 0xFE, 0x0F, 0xFF, 0x07, 0xEF, 0x83, 0xE7, 0xC1, 0xF1, + 0xF1, 0xF0, 0x7F, 0xF0, 0x0F, 0xE0, 0xFE, 0x7C, 0x07, 0xDF, 0xE0, 0xFE, + 0x3E, 0x1F, 0x07, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0xCF, 0x81, 0xF9, 0xF0, + 0x3F, 0x3E, 0x07, 0xE7, 0xC0, 0xFC, 0xF8, 0x1F, 0x9F, 0x03, 0xE3, 0xE0, + 0xFC, 0x7E, 0x3F, 0x0F, 0xBF, 0xC1, 0xF3, 0xE0, 0x3E, 0x00, 0x07, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7E, 0x00, 0x1F, 0xE0, + 0x00, 0x07, 0xC1, 0x0F, 0xF9, 0x8F, 0xCD, 0xCF, 0xC3, 0xE7, 0xC1, 0xF7, + 0xE0, 0xFB, 0xF0, 0x7D, 0xF8, 0x3E, 0xFC, 0x1F, 0x7E, 0x0F, 0xBF, 0x07, + 0xDF, 0x83, 0xE7, 0xE1, 0xF1, 0xF1, 0xF8, 0x7F, 0x7C, 0x1F, 0x3E, 0x00, + 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8, + 0x01, 0xFE, 0xFC, 0x73, 0xEF, 0xDF, 0xFE, 0xFC, 0xF7, 0xC3, 0xBE, 0x01, + 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x07, 0xC0, 0x3E, + 0x01, 0xF0, 0x1F, 0xE0, 0x1E, 0x23, 0xFE, 0x70, 0xEE, 0x06, 0xE0, 0x2F, + 0x80, 0xFF, 0x07, 0xFC, 0x3F, 0xE0, 0xFF, 0x81, 0xF8, 0x07, 0xC0, 0x7E, + 0x0E, 0xBF, 0xC8, 0xF8, 0x04, 0x03, 0x01, 0xC0, 0xF0, 0x7C, 0x3F, 0xEF, + 0xF9, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, 0x7C, 0x1F, 0x07, 0xC1, 0xF0, + 0x7C, 0x5F, 0x37, 0xF8, 0xFE, 0x1E, 0x00, 0xFC, 0x7F, 0x1F, 0x07, 0xC7, + 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, + 0x7C, 0x7C, 0x1F, 0x1F, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x7C, 0x1F, + 0x1F, 0x8F, 0xC3, 0xFD, 0xFC, 0x7C, 0x60, 0xFF, 0x9F, 0xBF, 0x83, 0x0F, + 0x81, 0x87, 0xE0, 0x81, 0xF0, 0x40, 0xF8, 0x40, 0x3E, 0x20, 0x1F, 0x30, + 0x07, 0xD0, 0x03, 0xF8, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x0E, + 0x00, 0x07, 0x00, 0x01, 0x00, 0xFF, 0x3F, 0xCF, 0x7E, 0x1F, 0x06, 0x3E, + 0x0F, 0x06, 0x3E, 0x0F, 0x84, 0x1F, 0x0F, 0x8C, 0x1F, 0x1F, 0x88, 0x0F, + 0x17, 0xC8, 0x0F, 0x97, 0xD8, 0x0F, 0xB3, 0xD0, 0x07, 0xE3, 0xF0, 0x07, + 0xE3, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0xC1, 0xE0, 0x03, 0x81, 0xC0, 0x01, + 0x80, 0xC0, 0x01, 0x80, 0x80, 0xFF, 0x3F, 0x7E, 0x0C, 0x3E, 0x08, 0x3F, + 0x18, 0x1F, 0x30, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xE0, 0x03, + 0xF0, 0x05, 0xF8, 0x0C, 0xF8, 0x18, 0xFC, 0x30, 0x7E, 0x70, 0x7E, 0xFC, + 0xFF, 0xFF, 0x3F, 0x7E, 0x0C, 0x7C, 0x0C, 0x3E, 0x08, 0x3E, 0x08, 0x1E, + 0x18, 0x1F, 0x10, 0x0F, 0x30, 0x0F, 0xA0, 0x0F, 0xA0, 0x07, 0xE0, 0x07, + 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, + 0x00, 0x61, 0x00, 0xF2, 0x00, 0xF6, 0x00, 0xFC, 0x00, 0x78, 0x00, 0x7F, + 0xFD, 0xFF, 0xF7, 0x0F, 0xD0, 0x3E, 0x01, 0xF0, 0x0F, 0xC0, 0x3E, 0x01, + 0xF0, 0x0F, 0xC0, 0x3E, 0x01, 0xF8, 0x0F, 0xC1, 0x3E, 0x05, 0xF8, 0x7F, + 0xFF, 0xFF, 0xFF, 0x01, 0xE0, 0xF8, 0x3E, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x87, + 0x80, 0x1E, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x0F, 0x80, 0x78, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0x0F, 0x80, 0xF0, + 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x03, 0xC0, 0x0F, 0x0F, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xE0, + 0xF8, 0x3C, 0x00, 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00, + 0x7C }; + +const GFXglyph FreeSerifBold18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' + { 0, 6, 24, 12, 3, -23 }, // 0x21 '!' + { 18, 13, 10, 19, 3, -23 }, // 0x22 '"' + { 35, 18, 24, 17, 0, -23 }, // 0x23 '#' + { 89, 15, 28, 17, 1, -25 }, // 0x24 '$' + { 142, 27, 24, 35, 4, -23 }, // 0x25 '%' + { 223, 26, 25, 29, 2, -23 }, // 0x26 '&' + { 305, 4, 10, 10, 3, -23 }, // 0x27 ''' + { 310, 9, 30, 12, 2, -23 }, // 0x28 '(' + { 344, 9, 30, 12, 1, -23 }, // 0x29 ')' + { 378, 14, 15, 18, 2, -23 }, // 0x2A '*' + { 405, 19, 19, 24, 2, -17 }, // 0x2B '+' + { 451, 6, 12, 9, 1, -5 }, // 0x2C ',' + { 460, 8, 4, 12, 2, -9 }, // 0x2D '-' + { 464, 6, 6, 9, 1, -5 }, // 0x2E '.' + { 469, 11, 25, 10, -1, -23 }, // 0x2F '/' + { 504, 16, 24, 18, 1, -23 }, // 0x30 '0' + { 552, 12, 24, 18, 3, -23 }, // 0x31 '1' + { 588, 16, 24, 17, 1, -23 }, // 0x32 '2' + { 636, 16, 24, 18, 0, -23 }, // 0x33 '3' + { 684, 15, 24, 18, 1, -23 }, // 0x34 '4' + { 729, 15, 24, 18, 1, -23 }, // 0x35 '5' + { 774, 16, 24, 18, 1, -23 }, // 0x36 '6' + { 822, 16, 24, 17, 1, -23 }, // 0x37 '7' + { 870, 16, 24, 17, 1, -23 }, // 0x38 '8' + { 918, 16, 24, 18, 1, -23 }, // 0x39 '9' + { 966, 6, 16, 12, 3, -15 }, // 0x3A ':' + { 978, 7, 22, 12, 2, -15 }, // 0x3B ';' + { 998, 19, 20, 24, 2, -18 }, // 0x3C '<' + { 1046, 19, 12, 24, 2, -14 }, // 0x3D '=' + { 1075, 19, 20, 24, 3, -18 }, // 0x3E '>' + { 1123, 14, 24, 18, 2, -23 }, // 0x3F '?' + { 1165, 24, 25, 33, 4, -23 }, // 0x40 '@' + { 1240, 24, 24, 25, 1, -23 }, // 0x41 'A' + { 1312, 21, 24, 23, 1, -23 }, // 0x42 'B' + { 1375, 23, 25, 25, 1, -23 }, // 0x43 'C' + { 1447, 23, 24, 26, 1, -23 }, // 0x44 'D' + { 1516, 21, 24, 23, 2, -23 }, // 0x45 'E' + { 1579, 19, 24, 22, 2, -23 }, // 0x46 'F' + { 1636, 25, 25, 27, 1, -23 }, // 0x47 'G' + { 1715, 24, 24, 27, 2, -23 }, // 0x48 'H' + { 1787, 11, 24, 14, 2, -23 }, // 0x49 'I' + { 1820, 16, 27, 18, 0, -23 }, // 0x4A 'J' + { 1874, 25, 24, 27, 2, -23 }, // 0x4B 'K' + { 1949, 21, 24, 23, 2, -23 }, // 0x4C 'L' + { 2012, 31, 24, 33, 1, -23 }, // 0x4D 'M' + { 2105, 23, 24, 25, 1, -23 }, // 0x4E 'N' + { 2174, 25, 25, 27, 1, -23 }, // 0x4F 'O' + { 2253, 19, 24, 22, 2, -23 }, // 0x50 'P' + { 2310, 25, 30, 27, 1, -23 }, // 0x51 'Q' + { 2404, 23, 24, 25, 2, -23 }, // 0x52 'R' + { 2473, 16, 25, 20, 2, -23 }, // 0x53 'S' + { 2523, 21, 24, 23, 1, -23 }, // 0x54 'T' + { 2586, 22, 25, 25, 2, -23 }, // 0x55 'U' + { 2655, 24, 24, 25, 0, -23 }, // 0x56 'V' + { 2727, 34, 25, 34, 0, -23 }, // 0x57 'W' + { 2834, 24, 24, 25, 1, -23 }, // 0x58 'X' + { 2906, 24, 24, 25, 1, -23 }, // 0x59 'Y' + { 2978, 21, 24, 23, 1, -23 }, // 0x5A 'Z' + { 3041, 8, 29, 12, 2, -23 }, // 0x5B '[' + { 3070, 11, 25, 10, -1, -23 }, // 0x5C '\' + { 3105, 8, 29, 12, 2, -23 }, // 0x5D ']' + { 3134, 15, 13, 20, 3, -23 }, // 0x5E '^' + { 3159, 18, 3, 17, 0, 3 }, // 0x5F '_' + { 3166, 8, 6, 12, 0, -23 }, // 0x60 '`' + { 3172, 16, 16, 18, 1, -15 }, // 0x61 'a' + { 3204, 18, 24, 19, 1, -23 }, // 0x62 'b' + { 3258, 14, 16, 15, 1, -15 }, // 0x63 'c' + { 3286, 18, 24, 19, 1, -23 }, // 0x64 'd' + { 3340, 14, 16, 16, 1, -15 }, // 0x65 'e' + { 3368, 11, 24, 14, 2, -23 }, // 0x66 'f' + { 3401, 17, 23, 17, 1, -15 }, // 0x67 'g' + { 3450, 17, 24, 19, 1, -23 }, // 0x68 'h' + { 3501, 7, 24, 10, 2, -23 }, // 0x69 'i' + { 3522, 11, 31, 14, 0, -23 }, // 0x6A 'j' + { 3565, 18, 24, 19, 1, -23 }, // 0x6B 'k' + { 3619, 7, 24, 10, 1, -23 }, // 0x6C 'l' + { 3640, 27, 16, 29, 1, -15 }, // 0x6D 'm' + { 3694, 17, 16, 19, 1, -15 }, // 0x6E 'n' + { 3728, 17, 16, 18, 1, -15 }, // 0x6F 'o' + { 3762, 19, 23, 19, 0, -15 }, // 0x70 'p' + { 3817, 17, 23, 19, 1, -15 }, // 0x71 'q' + { 3866, 13, 16, 15, 1, -15 }, // 0x72 'r' + { 3892, 12, 16, 14, 1, -15 }, // 0x73 's' + { 3916, 10, 21, 12, 1, -20 }, // 0x74 't' + { 3943, 18, 16, 20, 1, -15 }, // 0x75 'u' + { 3979, 17, 16, 17, 0, -15 }, // 0x76 'v' + { 4013, 24, 16, 25, 0, -15 }, // 0x77 'w' + { 4061, 16, 16, 18, 1, -15 }, // 0x78 'x' + { 4093, 16, 23, 17, 0, -15 }, // 0x79 'y' + { 4139, 14, 16, 16, 0, -15 }, // 0x7A 'z' + { 4167, 11, 31, 14, 1, -24 }, // 0x7B '{' + { 4210, 3, 25, 8, 2, -23 }, // 0x7C '|' + { 4220, 11, 31, 14, 3, -24 }, // 0x7D '}' + { 4263, 16, 5, 18, 1, -11 } }; // 0x7E '~' + +const GFXfont FreeSerifBold18pt7b PROGMEM = { + (uint8_t *)FreeSerifBold18pt7bBitmaps, + (GFXglyph *)FreeSerifBold18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 4945 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold24pt7b.h new file mode 100644 index 0000000..0eb2d0b --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold24pt7b.h @@ -0,0 +1,759 @@ +const uint8_t FreeSerifBold24pt7bBitmaps[] PROGMEM = { + 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x7E, 0x7C, 0x7C, + 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x18, 0x10, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x70, 0x07, + 0x7C, 0x07, 0xFE, 0x03, 0xFF, 0x01, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xC0, + 0x3E, 0xE0, 0x0E, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xC4, 0x00, 0xE2, + 0x00, 0x20, 0x00, 0xF0, 0x70, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0x0F, + 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x78, 0x01, 0xC0, 0xE0, 0x03, 0x81, 0xC0, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, + 0xF3, 0xFF, 0xFF, 0xE0, 0x78, 0x3C, 0x00, 0xF0, 0x78, 0x01, 0xC0, 0xE0, + 0x03, 0x81, 0xC0, 0x0F, 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x0F, + 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x03, 0x81, 0xC0, 0x0F, + 0x07, 0x80, 0x1E, 0x0F, 0x00, 0x3C, 0x1E, 0x00, 0x78, 0x3C, 0x00, 0xF0, + 0x78, 0x01, 0xE0, 0xE0, 0x03, 0x81, 0xC0, 0x07, 0x07, 0x80, 0x1E, 0x0F, + 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, + 0x7F, 0xF0, 0x0F, 0x37, 0xE0, 0xE1, 0x8F, 0x8E, 0x0C, 0x3C, 0x70, 0x60, + 0xE7, 0x83, 0x03, 0x3C, 0x18, 0x19, 0xF0, 0xC0, 0x4F, 0xC6, 0x02, 0x7F, + 0xF0, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, + 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, 0x1F, 0xFE, 0x00, 0x3F, 0xF8, 0x01, + 0xFF, 0xC0, 0x0C, 0xFF, 0x00, 0x63, 0xFA, 0x03, 0x0F, 0xD0, 0x18, 0x3E, + 0x80, 0xC1, 0xF6, 0x06, 0x0F, 0xB8, 0x30, 0x79, 0xC1, 0x87, 0xCF, 0x0C, + 0x3C, 0x7E, 0x67, 0xC0, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x3E, 0x00, 0x0C, 0x00, 0x0F, 0xF0, 0x03, 0x80, 0x07, 0xE7, 0x03, + 0xE0, 0x01, 0xF8, 0x7F, 0xFC, 0x00, 0x3E, 0x07, 0xF7, 0x00, 0x0F, 0xC0, + 0x80, 0xE0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0x7E, 0x02, 0x07, 0x00, 0x0F, + 0x80, 0x41, 0xC0, 0x03, 0xF0, 0x10, 0x30, 0x00, 0x7E, 0x02, 0x0E, 0x00, + 0x0F, 0x80, 0xC1, 0x80, 0x01, 0xF0, 0x10, 0x70, 0x00, 0x3E, 0x06, 0x1C, + 0x00, 0x07, 0xC1, 0x83, 0x80, 0x00, 0x7C, 0x60, 0xE0, 0x1F, 0x07, 0xF8, + 0x18, 0x0F, 0xF8, 0x7C, 0x07, 0x07, 0xF1, 0x00, 0x00, 0xC1, 0xF8, 0x10, + 0x00, 0x38, 0x3F, 0x02, 0x00, 0x06, 0x0F, 0xC0, 0x40, 0x01, 0xC3, 0xF0, + 0x08, 0x00, 0x30, 0x7E, 0x01, 0x00, 0x0E, 0x1F, 0x80, 0x40, 0x03, 0x83, + 0xF0, 0x08, 0x00, 0x60, 0x7E, 0x01, 0x00, 0x1C, 0x0F, 0x80, 0x40, 0x03, + 0x01, 0xF0, 0x18, 0x00, 0xE0, 0x3E, 0x02, 0x00, 0x18, 0x03, 0xC0, 0xC0, + 0x07, 0x00, 0x7C, 0x70, 0x00, 0xC0, 0x07, 0xFC, 0x00, 0x38, 0x00, 0x7E, + 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x07, 0x8F, + 0xE0, 0x00, 0x03, 0xC1, 0xF8, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x7C, + 0x07, 0xC0, 0x00, 0x1F, 0x01, 0xF0, 0x00, 0x07, 0xE0, 0x7C, 0x00, 0x01, + 0xF8, 0x1E, 0x00, 0x00, 0x7F, 0x07, 0x80, 0x00, 0x1F, 0xE3, 0x80, 0x00, + 0x03, 0xFF, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xE0, 0x3F, + 0xF0, 0x07, 0xFC, 0x01, 0xF0, 0x07, 0xFF, 0x00, 0x78, 0x07, 0xBF, 0xE0, + 0x1C, 0x03, 0x87, 0xFC, 0x07, 0x01, 0xE0, 0xFF, 0x81, 0x80, 0xF0, 0x3F, + 0xE0, 0xC0, 0x7C, 0x07, 0xFC, 0x30, 0x1F, 0x00, 0xFF, 0x98, 0x0F, 0xC0, + 0x3F, 0xFC, 0x03, 0xF0, 0x07, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x3F, + 0x80, 0x3F, 0xF0, 0x0F, 0xF0, 0x07, 0xFE, 0x03, 0xFC, 0x00, 0xFF, 0x81, + 0x7F, 0x80, 0x3F, 0xF8, 0xDF, 0xF0, 0x1F, 0xFF, 0xE3, 0xFF, 0x0E, 0xFF, + 0xF8, 0xFF, 0xFE, 0x1F, 0xFC, 0x0F, 0xFE, 0x03, 0xFE, 0x00, 0xFE, 0x00, + 0x3E, 0x00, 0x77, 0xFF, 0xFF, 0xFF, 0xEE, 0x73, 0x9C, 0xE2, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x60, 0x1C, 0x03, 0x80, 0x70, 0x06, 0x00, 0xE0, 0x1C, + 0x01, 0xC0, 0x3C, 0x03, 0xC0, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0xF8, + 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0xF8, + 0x0F, 0x80, 0x78, 0x07, 0x80, 0x78, 0x03, 0xC0, 0x3C, 0x01, 0xC0, 0x1C, + 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x03, 0x00, + 0x10, 0x00, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, + 0x70, 0x03, 0x80, 0x38, 0x03, 0xC0, 0x3C, 0x03, 0xE0, 0x1E, 0x01, 0xE0, + 0x1E, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, + 0x1F, 0x01, 0xF0, 0x1F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x03, 0xC0, + 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x0C, + 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x03, 0xE0, 0x3C, 0x78, 0xEF, 0x9C, 0x7B, 0xF7, 0x3F, 0xFE, 0xDF, 0x8F, + 0xFF, 0xC0, 0x7F, 0x00, 0x3F, 0xC0, 0x7E, 0xBF, 0x3F, 0x77, 0xEF, 0x9C, + 0xFF, 0xC7, 0x1E, 0x63, 0xE3, 0x80, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, + 0x01, 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, 0x80, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x07, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x3C, 0x7E, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0x07, 0x06, 0x06, 0x0C, + 0x18, 0x30, 0x60, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, + 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x00, 0x1E, 0x00, 0x7C, 0x00, + 0xF0, 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, + 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, + 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xE0, 0x03, + 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x00, 0xFC, 0x00, + 0x0F, 0x3C, 0x00, 0x78, 0x78, 0x03, 0xE1, 0xF0, 0x1F, 0x03, 0xE0, 0x7C, + 0x0F, 0x83, 0xF0, 0x3F, 0x0F, 0xC0, 0xFC, 0x7F, 0x03, 0xF9, 0xFC, 0x0F, + 0xE7, 0xF0, 0x3F, 0xBF, 0xC0, 0xFE, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, + 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, 0x3F, + 0x9F, 0xC0, 0xFE, 0x7F, 0x03, 0xF9, 0xFC, 0x0F, 0xE3, 0xF0, 0x3F, 0x0F, + 0xC0, 0xFC, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x80, 0xF8, 0x7C, 0x01, 0xE1, + 0xE0, 0x03, 0xCF, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x18, 0x00, 0x1E, 0x00, + 0x1F, 0x80, 0x1F, 0xE0, 0x1F, 0xF8, 0x1D, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, + 0xE0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xF8, 0xFF, 0xFF, 0xC0, 0x00, 0xFC, + 0x00, 0x1F, 0xF8, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x1C, + 0x1F, 0xF1, 0xC0, 0x7F, 0x8C, 0x01, 0xFC, 0x40, 0x0F, 0xE0, 0x00, 0x3F, + 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x01, 0x03, 0x80, 0x18, 0x38, 0x00, 0x81, 0x80, 0x1C, 0x1F, 0xFF, 0xE1, + 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, + 0xE0, 0x00, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x30, 0xFF, 0xC2, + 0x01, 0xFE, 0x30, 0x0F, 0xF1, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, + 0xE0, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0xC0, 0x03, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0x7F, 0xF0, 0x00, 0xFF, + 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xC7, 0x80, 0x0E, 0x7F, 0x00, 0xE3, 0xFC, 0x06, 0x1F, 0xF8, + 0xE0, 0x7F, 0xFC, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, + 0xFF, 0x00, 0x0D, 0xF8, 0x00, 0xEF, 0xC0, 0x06, 0x7E, 0x00, 0x63, 0xF0, + 0x07, 0x1F, 0x80, 0x30, 0xFC, 0x03, 0x07, 0xE0, 0x38, 0x3F, 0x03, 0x81, + 0xF8, 0x18, 0x0F, 0xC1, 0xC0, 0x7E, 0x1C, 0x03, 0xF0, 0xC0, 0x1F, 0x8E, + 0x00, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x00, + 0x07, 0xE0, 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x07, 0xFF, + 0xF0, 0x7F, 0xFF, 0x0F, 0xFF, 0xE0, 0xFF, 0xFE, 0x0F, 0xFF, 0xE1, 0xFF, + 0xFC, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x3F, + 0x80, 0x03, 0xFF, 0x80, 0x7F, 0xFE, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0x87, + 0xFF, 0xFC, 0x7F, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x7E, + 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, + 0xC0, 0x00, 0x0C, 0x78, 0x00, 0x8F, 0xE0, 0x18, 0xFF, 0x87, 0x0F, 0xFF, + 0xE0, 0x7F, 0xF8, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x38, 0x00, 0x1F, 0x00, + 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, + 0x00, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, + 0x00, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0x01, 0xFF, 0xFE, 0x1F, 0xF1, 0xFC, + 0xFF, 0x07, 0xE7, 0xF8, 0x3F, 0xBF, 0xC1, 0xFD, 0xFE, 0x07, 0xFF, 0xF0, + 0x3F, 0xFF, 0x81, 0xFF, 0xFC, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0x03, 0xFB, + 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0x1F, 0xC1, + 0xF0, 0x7E, 0x0F, 0x01, 0xF0, 0xF8, 0x03, 0xC7, 0x00, 0x07, 0xE0, 0x00, + 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xDF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE7, 0xFF, + 0xFF, 0x3F, 0xFF, 0xF9, 0x80, 0x07, 0x98, 0x00, 0x3C, 0xC0, 0x03, 0xE4, + 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x3C, 0x00, 0x01, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, + 0x01, 0xFE, 0x00, 0x38, 0x7C, 0x07, 0x80, 0xF0, 0x78, 0x07, 0xC3, 0xC0, + 0x1F, 0x3E, 0x00, 0xF9, 0xF0, 0x07, 0xCF, 0xC0, 0x3E, 0x7E, 0x01, 0xF3, + 0xF8, 0x0F, 0x1F, 0xE0, 0xF8, 0x7F, 0xC7, 0x83, 0xFF, 0xF0, 0x0F, 0xFE, + 0x00, 0x7F, 0xFC, 0x01, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, 0x1F, 0xFF, 0x03, + 0xBF, 0xFC, 0x7C, 0x7F, 0xE7, 0xC1, 0xFF, 0x3E, 0x07, 0xFF, 0xE0, 0x1F, + 0xFF, 0x00, 0x7F, 0xF8, 0x03, 0xFF, 0xC0, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, + 0x03, 0xE7, 0x80, 0x1F, 0x3E, 0x01, 0xF0, 0xF8, 0x0F, 0x83, 0xE1, 0xF8, + 0x0F, 0xFF, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFC, 0x00, 0x1C, 0x3C, 0x00, + 0xF0, 0x78, 0x07, 0x81, 0xF8, 0x3E, 0x07, 0xE1, 0xF8, 0x0F, 0xC7, 0xE0, + 0x3F, 0x3F, 0x80, 0xFE, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, + 0xFF, 0x80, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, 0xE0, 0x3F, 0xDF, + 0xC0, 0xFF, 0x7F, 0x03, 0xFC, 0xFC, 0x0F, 0xF3, 0xFC, 0x7F, 0x83, 0xFF, + 0xFE, 0x07, 0xF7, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0x00, 0x03, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7E, 0x3C, 0x3C, 0x3F, 0x3F, 0xDF, 0xEF, 0xF7, 0xF9, 0xF8, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7F, 0x7F, + 0xBF, 0xFF, 0xFF, 0xFB, 0xFC, 0xFE, 0x07, 0x03, 0x01, 0x81, 0x81, 0x81, + 0x83, 0x81, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x01, + 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, + 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x3F, 0xE0, 0x00, + 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, + 0xE0, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0xFF, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x0F, + 0xFE, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xE0, + 0x00, 0x07, 0xFE, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, + 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x0F, + 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x07, 0xF0, 0x07, 0xFF, 0x03, 0x87, 0xE1, 0xC0, 0xFC, 0xF0, 0x3F, + 0xBE, 0x07, 0xEF, 0xC1, 0xFF, 0xF0, 0x7F, 0xFC, 0x1F, 0xDF, 0x07, 0xF7, + 0x81, 0xFC, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x07, 0xE0, 0x03, + 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x04, 0x00, 0x01, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x00, 0x1F, 0x80, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x00, 0x3F, + 0xC0, 0x07, 0xE0, 0x00, 0xF0, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x1F, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x03, 0x80, 0x3C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x30, 0x3E, + 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x3C, 0x37, 0x1F, 0x00, 0x7E, 0xF1, 0x9F, + 0x00, 0x7C, 0xF8, 0xCF, 0x80, 0x78, 0x7C, 0x37, 0xC0, 0x7C, 0x3C, 0x1F, + 0xC0, 0x3C, 0x1E, 0x0F, 0xE0, 0x3C, 0x0F, 0x07, 0xF0, 0x3E, 0x0F, 0x03, + 0xF8, 0x1E, 0x07, 0x81, 0xFC, 0x0F, 0x03, 0xC0, 0xFE, 0x0F, 0x03, 0xE0, + 0x7F, 0x07, 0x81, 0xE0, 0x6F, 0x83, 0xC1, 0xF0, 0x37, 0xC1, 0xE1, 0x78, + 0x31, 0xF0, 0xF9, 0xBC, 0x18, 0xF8, 0x3F, 0x9E, 0x38, 0x3C, 0x0F, 0x0F, + 0xF8, 0x1F, 0x00, 0x01, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0xC0, 0x01, 0xF8, 0x03, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x03, + 0xFF, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, + 0x03, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, + 0x37, 0xF8, 0x00, 0x00, 0x33, 0xF8, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, + 0x61, 0xFC, 0x00, 0x00, 0x61, 0xFE, 0x00, 0x00, 0xC1, 0xFE, 0x00, 0x00, + 0xC0, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x01, + 0x80, 0x7F, 0x80, 0x03, 0x80, 0x7F, 0x80, 0x03, 0xFF, 0xFF, 0xC0, 0x03, + 0xFF, 0xFF, 0xC0, 0x07, 0x00, 0x3F, 0xC0, 0x06, 0x00, 0x1F, 0xE0, 0x0E, + 0x00, 0x1F, 0xE0, 0x0C, 0x00, 0x0F, 0xF0, 0x0C, 0x00, 0x0F, 0xF0, 0x1C, + 0x00, 0x0F, 0xF8, 0x1C, 0x00, 0x0F, 0xF8, 0x7E, 0x00, 0x0F, 0xFC, 0xFF, + 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xF8, + 0x7F, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x01, 0xFE, + 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, + 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, + 0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xC0, 0x0F, + 0xF0, 0xFF, 0x00, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0x01, + 0xFE, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, + 0xFF, 0x00, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0xFF, 0x00, 0xFF, 0x0F, 0xF0, + 0x0F, 0xE0, 0xFF, 0x01, 0xFE, 0x0F, 0xF0, 0x1F, 0xC0, 0xFF, 0x87, 0xF0, + 0x3F, 0xFF, 0xFE, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x01, + 0xFF, 0xF0, 0x60, 0x0F, 0xC1, 0xF9, 0x80, 0xFC, 0x01, 0xFE, 0x07, 0xE0, + 0x01, 0xF8, 0x3F, 0x00, 0x03, 0xE1, 0xFC, 0x00, 0x07, 0x87, 0xE0, 0x00, + 0x1E, 0x3F, 0x80, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x67, 0xF8, 0x00, 0x01, + 0x9F, 0xC0, 0x00, 0x02, 0x7F, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x87, 0xF0, 0x00, 0x07, 0x0F, 0xE0, 0x00, 0x38, 0x1F, 0x80, 0x01, 0xC0, + 0x3F, 0x00, 0x1E, 0x00, 0x7F, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x0F, + 0xF8, 0x7F, 0x80, 0x0F, 0xF0, 0x1F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, + 0xF0, 0x07, 0xF0, 0x0F, 0xF0, 0x03, 0xF8, 0x0F, 0xF0, 0x03, 0xFC, 0x0F, + 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, 0xF0, 0x00, 0xFF, 0x0F, + 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x00, 0xFE, 0x0F, 0xF0, 0x01, 0xFE, 0x0F, + 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x01, 0xFC, 0x0F, 0xF0, 0x03, 0xF8, 0x0F, + 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x07, 0xE0, 0x0F, 0xF0, 0x0F, 0xC0, 0x0F, + 0xF8, 0x3F, 0x80, 0x1F, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, + 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0x1F, 0xC1, 0xFE, 0x00, + 0x3C, 0x1F, 0xE0, 0x01, 0xC1, 0xFE, 0x00, 0x0C, 0x1F, 0xE0, 0x00, 0xC1, + 0xFE, 0x00, 0x04, 0x1F, 0xE0, 0x20, 0x41, 0xFE, 0x02, 0x00, 0x1F, 0xE0, + 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0xE0, 0x01, 0xFE, 0x1E, 0x00, + 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xFE, 0x00, 0x1F, 0xE3, 0xE0, 0x01, 0xFE, + 0x0E, 0x00, 0x1F, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x00, 0x1F, 0xE0, 0x20, + 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xE0, 0x00, 0x11, 0xFE, 0x00, 0x03, 0x1F, + 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xE1, 0xFE, 0x00, + 0x1E, 0x1F, 0xE0, 0x03, 0xE3, 0xFF, 0x01, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xC7, 0xFC, 0x07, + 0xE3, 0xFC, 0x00, 0xF1, 0xFE, 0x00, 0x38, 0xFF, 0x00, 0x0C, 0x7F, 0x80, + 0x06, 0x3F, 0xC0, 0x01, 0x1F, 0xE0, 0x20, 0x8F, 0xF0, 0x10, 0x07, 0xF8, + 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x0E, 0x00, 0xFF, 0x1F, 0x00, 0x7F, + 0xFF, 0x80, 0x3F, 0xFF, 0xC0, 0x1F, 0xE3, 0xE0, 0x0F, 0xF0, 0x70, 0x07, + 0xF8, 0x18, 0x03, 0xFC, 0x0C, 0x01, 0xFE, 0x02, 0x00, 0xFF, 0x01, 0x00, + 0x7F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, + 0x07, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0xFF, 0xC0, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x08, 0x00, + 0x3F, 0xFE, 0x0C, 0x00, 0x3F, 0x07, 0xC6, 0x00, 0x7E, 0x00, 0xFF, 0x00, + 0x7E, 0x00, 0x1F, 0x80, 0x7E, 0x00, 0x07, 0xC0, 0x7F, 0x00, 0x01, 0xE0, + 0x3F, 0x00, 0x00, 0x70, 0x3F, 0x80, 0x00, 0x38, 0x1F, 0xC0, 0x00, 0x0C, + 0x1F, 0xE0, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x01, 0x07, 0xF0, 0x00, 0x00, + 0x07, 0xF8, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x0F, 0xF0, 0x03, 0xFF, 0xFF, 0xF8, 0x00, + 0x3F, 0xF1, 0xFC, 0x00, 0x0F, 0xF0, 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80, + 0x03, 0xFC, 0x1F, 0xC0, 0x01, 0xFE, 0x0F, 0xE0, 0x00, 0xFF, 0x03, 0xF8, + 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x1F, 0xE0, 0x0F, + 0xC0, 0x0F, 0xF0, 0x03, 0xF8, 0x1F, 0xF0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, + 0x07, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x1F, 0xFF, 0x9F, 0xF8, 0x03, 0xFF, + 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, + 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07, + 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, + 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, + 0x1F, 0xE0, 0x7F, 0x80, 0x0F, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, + 0xFF, 0xFC, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, + 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0x7F, + 0x80, 0x0F, 0xF0, 0x3F, 0xC0, 0x07, 0xF8, 0x1F, 0xE0, 0x03, 0xFC, 0x0F, + 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x03, 0xFC, 0x00, 0x7F, 0x81, + 0xFE, 0x00, 0x3F, 0xC0, 0xFF, 0x00, 0x1F, 0xE0, 0xFF, 0xC0, 0x1F, 0xF9, + 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xFE, 0x7F, 0xE0, 0x7F, 0x80, 0xFF, 0x01, + 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, + 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, + 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x0F, + 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC, + 0x0F, 0xFC, 0x7F, 0xFF, 0x01, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x01, 0xFE, + 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, + 0x07, 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, + 0x1F, 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F, + 0xE0, 0x00, 0x7F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF8, 0x78, 0x1F, 0xE3, + 0xF0, 0x7F, 0x8F, 0xC1, 0xFC, 0x3F, 0x07, 0xF0, 0xFC, 0x1F, 0xC1, 0xE0, + 0xFE, 0x07, 0xC3, 0xF0, 0x0F, 0xFF, 0x80, 0x07, 0xF0, 0x00, 0xFF, 0xFC, + 0x1F, 0xFF, 0x0F, 0xFC, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x1E, 0x00, 0x7F, + 0x80, 0x07, 0x00, 0x1F, 0xE0, 0x03, 0x80, 0x07, 0xF8, 0x01, 0xC0, 0x01, + 0xFE, 0x00, 0xE0, 0x00, 0x7F, 0x80, 0x70, 0x00, 0x1F, 0xE0, 0x38, 0x00, + 0x07, 0xF8, 0x1C, 0x00, 0x01, 0xFE, 0x0E, 0x00, 0x00, 0x7F, 0x87, 0x00, + 0x00, 0x1F, 0xE3, 0xC0, 0x00, 0x07, 0xF9, 0xF8, 0x00, 0x01, 0xFE, 0xFE, + 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x07, 0xFD, + 0xFF, 0x00, 0x01, 0xFE, 0x7F, 0xE0, 0x00, 0x7F, 0x8F, 0xF8, 0x00, 0x1F, + 0xE1, 0xFF, 0x00, 0x07, 0xF8, 0x3F, 0xE0, 0x01, 0xFE, 0x07, 0xFC, 0x00, + 0x7F, 0x81, 0xFF, 0x80, 0x1F, 0xE0, 0x3F, 0xE0, 0x07, 0xF8, 0x07, 0xFC, + 0x01, 0xFE, 0x00, 0xFF, 0x80, 0x7F, 0x80, 0x1F, 0xF0, 0x1F, 0xE0, 0x07, + 0xFE, 0x07, 0xF8, 0x00, 0xFF, 0x83, 0xFF, 0x00, 0x3F, 0xF3, 0xFF, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, + 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, + 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x1F, 0xE0, 0x00, 0x31, 0xFE, + 0x00, 0x03, 0x1F, 0xE0, 0x00, 0x71, 0xFE, 0x00, 0x07, 0x1F, 0xE0, 0x00, + 0xE1, 0xFE, 0x00, 0x1E, 0x1F, 0xE0, 0x07, 0xE3, 0xFF, 0x01, 0xFE, 0xFF, + 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0x7F, 0xF0, 0x00, 0x01, 0xFF, 0xE1, + 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x1F, 0xE0, 0x00, 0x0F, 0xFC, 0x03, 0xFC, + 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xC0, 0x00, 0x2F, 0xF0, 0x0B, 0xF8, 0x00, + 0x0D, 0xFE, 0x01, 0x7F, 0x80, 0x01, 0xBF, 0xC0, 0x27, 0xF0, 0x00, 0x67, + 0xF8, 0x04, 0xFF, 0x00, 0x0C, 0xFF, 0x00, 0x8F, 0xE0, 0x03, 0x1F, 0xE0, + 0x11, 0xFE, 0x00, 0x63, 0xFC, 0x02, 0x3F, 0xC0, 0x08, 0x7F, 0x80, 0x43, + 0xF8, 0x03, 0x0F, 0xF0, 0x08, 0x7F, 0x80, 0x61, 0xFE, 0x01, 0x07, 0xF0, + 0x18, 0x3F, 0xC0, 0x20, 0xFF, 0x03, 0x07, 0xF8, 0x04, 0x0F, 0xE0, 0xC0, + 0xFF, 0x00, 0x81, 0xFE, 0x18, 0x1F, 0xE0, 0x10, 0x3F, 0xC6, 0x03, 0xFC, + 0x02, 0x03, 0xF8, 0xC0, 0x7F, 0x80, 0x40, 0x7F, 0x98, 0x0F, 0xF0, 0x08, + 0x07, 0xF6, 0x01, 0xFE, 0x01, 0x00, 0xFF, 0xC0, 0x3F, 0xC0, 0x20, 0x0F, + 0xF0, 0x07, 0xF8, 0x04, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0x80, 0x1F, 0x80, + 0x1F, 0xE0, 0x10, 0x03, 0xF0, 0x03, 0xFC, 0x02, 0x00, 0x7E, 0x00, 0x7F, + 0x80, 0x40, 0x07, 0x80, 0x0F, 0xF0, 0x0C, 0x00, 0xF0, 0x01, 0xFE, 0x07, + 0xC0, 0x0C, 0x00, 0x7F, 0xE7, 0xFF, 0x01, 0x80, 0x3F, 0xFF, 0xFF, 0xC0, + 0x03, 0xFE, 0xFF, 0xC0, 0x01, 0xF0, 0xFF, 0xC0, 0x01, 0xC0, 0xFF, 0xC0, + 0x01, 0x80, 0xFF, 0x80, 0x03, 0x01, 0xFF, 0x80, 0x06, 0x03, 0xFF, 0x80, + 0x0C, 0x07, 0xFF, 0x80, 0x18, 0x0D, 0xFF, 0x80, 0x30, 0x19, 0xFF, 0x00, + 0x60, 0x31, 0xFF, 0x00, 0xC0, 0x61, 0xFF, 0x01, 0x80, 0xC1, 0xFF, 0x03, + 0x01, 0x83, 0xFF, 0x06, 0x03, 0x03, 0xFE, 0x0C, 0x06, 0x03, 0xFE, 0x18, + 0x0C, 0x03, 0xFE, 0x30, 0x18, 0x03, 0xFE, 0x60, 0x30, 0x03, 0xFE, 0xC0, + 0x60, 0x07, 0xFD, 0x80, 0xC0, 0x07, 0xFF, 0x01, 0x80, 0x07, 0xFE, 0x03, + 0x00, 0x07, 0xFC, 0x06, 0x00, 0x07, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x18, + 0x00, 0x0F, 0xE0, 0x30, 0x00, 0x0F, 0xC0, 0x60, 0x00, 0x0F, 0x80, 0xC0, + 0x00, 0x0F, 0x01, 0xC0, 0x00, 0x0E, 0x0F, 0xC0, 0x00, 0x1C, 0x7F, 0xE0, + 0x00, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x3F, + 0x07, 0xF0, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x7E, + 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, 0x3F, 0x00, 0x03, 0xF8, 0x3F, + 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x00, 0x7F, 0x1F, 0xE0, 0x00, 0x3F, 0xCF, + 0xE0, 0x00, 0x0F, 0xEF, 0xF0, 0x00, 0x07, 0xF7, 0xF8, 0x00, 0x03, 0xFF, + 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x7F, + 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x0F, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x03, 0xFD, 0xFC, 0x00, 0x01, + 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80, 0x00, 0xFF, 0x1F, 0xC0, 0x00, + 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8, 0x00, 0x3F, 0x80, 0xFC, 0x00, + 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x03, 0xF8, + 0x3F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xFF, + 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0x01, 0xFE, 0x1F, 0xE0, 0x7F, 0x81, 0xFC, + 0x1F, 0xE0, 0x7F, 0x87, 0xF8, 0x0F, 0xE1, 0xFE, 0x03, 0xFC, 0x7F, 0x80, + 0xFF, 0x1F, 0xE0, 0x3F, 0xC7, 0xF8, 0x0F, 0xF1, 0xFE, 0x03, 0xFC, 0x7F, + 0x80, 0xFF, 0x1F, 0xE0, 0x3F, 0x87, 0xF8, 0x1F, 0xE1, 0xFE, 0x07, 0xF0, + 0x7F, 0x87, 0xF8, 0x1F, 0xFF, 0xF8, 0x07, 0xFF, 0xF8, 0x01, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xFE, + 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF8, 0x00, + 0x03, 0xFF, 0x00, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, + 0x3F, 0xFF, 0x80, 0x00, 0x3F, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0xFC, 0x00, + 0x7E, 0x00, 0x3F, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x7F, 0x00, 0x07, 0xF0, + 0x3F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFE, 0x1F, 0xC0, 0x00, 0x7F, + 0x1F, 0xE0, 0x00, 0x3F, 0xCF, 0xE0, 0x00, 0x0F, 0xE7, 0xF0, 0x00, 0x07, + 0xF7, 0xF8, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xC0, 0x00, + 0x1F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x03, 0xFD, 0xFC, 0x00, 0x01, 0xFC, 0xFE, 0x00, 0x01, 0xFE, 0x7F, 0x80, + 0x00, 0xFF, 0x1F, 0xC0, 0x00, 0x7F, 0x0F, 0xE0, 0x00, 0x3F, 0x83, 0xF8, + 0x00, 0x3F, 0x80, 0xFC, 0x00, 0x1F, 0x80, 0x3F, 0x00, 0x1F, 0x80, 0x0F, + 0xC0, 0x1F, 0x80, 0x03, 0xF0, 0x1F, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, + 0x0F, 0xFC, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00, + 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x07, 0xFF, 0x80, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xFF, 0xFF, 0xE0, + 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xC3, 0xFC, 0x00, 0xFF, 0x01, 0xFC, + 0x01, 0xFE, 0x03, 0xFC, 0x03, 0xFC, 0x03, 0xF8, 0x07, 0xF8, 0x07, 0xF8, + 0x0F, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0xC0, + 0x7F, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x01, 0xFC, 0x03, + 0xFC, 0x07, 0xF8, 0x07, 0xF8, 0x1F, 0xE0, 0x0F, 0xF0, 0xFF, 0x00, 0x1F, + 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0x9F, 0xE0, 0x00, 0xFF, + 0x3F, 0xC0, 0x01, 0xFE, 0x3F, 0xC0, 0x03, 0xFC, 0x7F, 0xC0, 0x07, 0xF8, + 0x7F, 0xC0, 0x0F, 0xF0, 0x7F, 0x80, 0x1F, 0xE0, 0xFF, 0x80, 0x3F, 0xC0, + 0xFF, 0x80, 0x7F, 0x80, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x01, 0xFE, 0x01, + 0xFF, 0x03, 0xFC, 0x01, 0xFF, 0x0F, 0xFC, 0x03, 0xFE, 0x7F, 0xFE, 0x03, + 0xFF, 0x03, 0xF8, 0x10, 0x7F, 0xF9, 0x87, 0xC1, 0xFC, 0x78, 0x03, 0xE7, + 0x80, 0x0F, 0x3C, 0x00, 0x3B, 0xE0, 0x01, 0xDF, 0x00, 0x06, 0xF8, 0x00, + 0x37, 0xE0, 0x00, 0xBF, 0x80, 0x01, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x3F, + 0xFC, 0x01, 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, + 0x00, 0xFF, 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x07, 0xFC, 0x00, + 0x1F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0xC0, 0x01, 0xEE, 0x00, 0x0F, 0x78, 0x00, 0xF3, 0xE0, 0x0F, 0x9F, 0xC0, + 0xF8, 0x8F, 0xFF, 0x04, 0x0F, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x3F, 0xC3, 0xFF, 0x03, 0xFC, 0x0F, 0xE0, 0x3F, 0xC0, + 0x7C, 0x03, 0xFC, 0x03, 0xC0, 0x3F, 0xC0, 0x38, 0x03, 0xFC, 0x01, 0x80, + 0x3F, 0xC0, 0x10, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, + 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, + 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, + 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x3F, 0xFF, 0xC0, 0xFF, + 0xFE, 0x07, 0xFC, 0xFF, 0xC0, 0x07, 0xC1, 0xFE, 0x00, 0x0E, 0x07, 0xF8, + 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, + 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, + 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, + 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, + 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, 0x06, 0x07, 0xF8, + 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x01, 0x81, 0xFE, 0x00, + 0x06, 0x07, 0xF8, 0x00, 0x18, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x80, 0x03, + 0x00, 0xFF, 0x00, 0x0C, 0x03, 0xFC, 0x00, 0x30, 0x07, 0xF0, 0x01, 0x80, + 0x0F, 0xE0, 0x0E, 0x00, 0x1F, 0xE0, 0xF0, 0x00, 0x1F, 0xFF, 0x00, 0x00, + 0x1F, 0xF0, 0x00, 0xFF, 0xFF, 0x01, 0xFF, 0x9F, 0xFC, 0x00, 0x1F, 0x07, + 0xFC, 0x00, 0x07, 0x01, 0xFE, 0x00, 0x03, 0x00, 0x7F, 0x80, 0x03, 0x80, + 0x3F, 0xC0, 0x01, 0x80, 0x1F, 0xE0, 0x00, 0xC0, 0x07, 0xF8, 0x00, 0xC0, + 0x03, 0xFC, 0x00, 0x60, 0x00, 0xFF, 0x00, 0x30, 0x00, 0x7F, 0x80, 0x30, + 0x00, 0x1F, 0xE0, 0x18, 0x00, 0x0F, 0xF0, 0x18, 0x00, 0x07, 0xF8, 0x0C, + 0x00, 0x01, 0xFE, 0x06, 0x00, 0x00, 0xFF, 0x06, 0x00, 0x00, 0x3F, 0xC3, + 0x00, 0x00, 0x1F, 0xE3, 0x80, 0x00, 0x0F, 0xF1, 0x80, 0x00, 0x03, 0xFC, + 0xC0, 0x00, 0x01, 0xFE, 0xC0, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x3F, + 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0xFF, 0xF8, 0x7F, 0xFF, 0x0F, 0xFB, 0xFF, 0x00, 0xFF, + 0xC0, 0x1F, 0x0F, 0xF0, 0x03, 0xFC, 0x00, 0x70, 0x3F, 0x80, 0x0F, 0xE0, + 0x03, 0x81, 0xFE, 0x00, 0x7F, 0x80, 0x1C, 0x0F, 0xF0, 0x03, 0xFC, 0x00, + 0xC0, 0x3F, 0x80, 0x0F, 0xE0, 0x06, 0x01, 0xFE, 0x00, 0x7F, 0x00, 0x70, + 0x0F, 0xF0, 0x07, 0xFC, 0x03, 0x00, 0x3F, 0x80, 0x3F, 0xE0, 0x18, 0x01, + 0xFE, 0x01, 0xFF, 0x01, 0xC0, 0x0F, 0xF0, 0x1B, 0xFC, 0x0C, 0x00, 0x3F, + 0x80, 0xCF, 0xE0, 0x60, 0x01, 0xFE, 0x06, 0x7F, 0x07, 0x00, 0x0F, 0xF0, + 0x63, 0xFC, 0x30, 0x00, 0x3F, 0x83, 0x0F, 0xE1, 0x80, 0x01, 0xFE, 0x30, + 0x7F, 0x1C, 0x00, 0x07, 0xF1, 0x81, 0xFC, 0xC0, 0x00, 0x3F, 0x8C, 0x0F, + 0xE6, 0x00, 0x01, 0xFE, 0xC0, 0x7F, 0x70, 0x00, 0x07, 0xF6, 0x01, 0xFB, + 0x00, 0x00, 0x3F, 0xE0, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x7F, 0xC0, + 0x00, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, + 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x07, 0xE0, 0x01, 0xF0, 0x00, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x00, 0x07, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0x0F, + 0xFF, 0x3F, 0xF8, 0x01, 0xF8, 0x1F, 0xF8, 0x01, 0xE0, 0x0F, 0xF8, 0x01, + 0xC0, 0x0F, 0xF8, 0x01, 0x80, 0x07, 0xFC, 0x03, 0x80, 0x03, 0xFE, 0x07, + 0x00, 0x03, 0xFE, 0x06, 0x00, 0x01, 0xFF, 0x0C, 0x00, 0x00, 0xFF, 0x9C, + 0x00, 0x00, 0xFF, 0x98, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x3F, 0xF0, + 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0F, 0xFC, + 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x19, 0xFE, 0x00, 0x00, 0x31, 0xFF, + 0x00, 0x00, 0x70, 0xFF, 0x80, 0x00, 0x60, 0x7F, 0x80, 0x00, 0xC0, 0x7F, + 0xC0, 0x01, 0xC0, 0x3F, 0xE0, 0x03, 0x80, 0x1F, 0xE0, 0x07, 0x00, 0x1F, + 0xF0, 0x07, 0x00, 0x0F, 0xF8, 0x0F, 0x00, 0x0F, 0xF8, 0x3F, 0x80, 0x1F, + 0xFC, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0x7F, 0xF0, 0x00, + 0x7E, 0x1F, 0xF0, 0x00, 0x38, 0x1F, 0xF0, 0x00, 0x38, 0x0F, 0xF0, 0x00, + 0x70, 0x0F, 0xF8, 0x00, 0x60, 0x07, 0xF8, 0x00, 0x60, 0x07, 0xFC, 0x00, + 0xC0, 0x03, 0xFC, 0x01, 0xC0, 0x01, 0xFE, 0x01, 0x80, 0x01, 0xFE, 0x03, + 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x86, 0x00, 0x00, 0x7F, 0x8E, + 0x00, 0x00, 0x7F, 0xCC, 0x00, 0x00, 0x3F, 0xD8, 0x00, 0x00, 0x3F, 0xF8, + 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x7F, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xFC, 0x3F, 0x80, 0x7F, 0xC3, + 0xE0, 0x07, 0xF8, 0x38, 0x00, 0xFF, 0x83, 0x80, 0x0F, 0xF0, 0x30, 0x01, + 0xFE, 0x07, 0x00, 0x3F, 0xE0, 0x60, 0x03, 0xFC, 0x06, 0x00, 0x7F, 0xC0, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, + 0xFE, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x7F, 0x80, + 0x00, 0x0F, 0xF8, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, + 0xFE, 0x00, 0x00, 0x3F, 0xC0, 0x01, 0x07, 0xFC, 0x00, 0x30, 0xFF, 0x80, + 0x03, 0x0F, 0xF0, 0x00, 0x31, 0xFF, 0x00, 0x07, 0x1F, 0xE0, 0x00, 0xF3, + 0xFE, 0x00, 0x1E, 0x7F, 0xC0, 0x03, 0xE7, 0xF8, 0x01, 0xFE, 0xFF, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0x7C, 0x0F, 0x81, + 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, + 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, + 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xFF, 0xFF, 0xF8, 0xF0, + 0x01, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00, + 0x1F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x00, 0xF0, 0x01, + 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1F, + 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, + 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, + 0x1E, 0xFF, 0xFF, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, + 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, + 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, + 0x0F, 0x81, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x00, 0x78, 0x00, 0x07, 0xC0, + 0x00, 0x3F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xE0, 0x01, 0xEF, 0x00, 0x0F, + 0x3C, 0x00, 0xF1, 0xE0, 0x07, 0x87, 0x80, 0x78, 0x3C, 0x03, 0xC0, 0xF0, + 0x3C, 0x07, 0x81, 0xE0, 0x1E, 0x1E, 0x00, 0xF0, 0xF0, 0x07, 0xCF, 0x00, + 0x1E, 0x78, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x70, 0x1F, 0x03, 0xF0, 0x7E, 0x03, 0xE0, 0x3E, 0x01, 0xE0, 0x1E, + 0x00, 0xE0, 0x03, 0xFC, 0x00, 0x3F, 0xFC, 0x03, 0xE1, 0xF8, 0x0F, 0x03, + 0xF0, 0x7C, 0x07, 0xC1, 0xF8, 0x1F, 0x87, 0xE0, 0x7E, 0x1F, 0x81, 0xF8, + 0x3C, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x01, 0xFE, 0x00, 0x3F, 0xF8, 0x03, + 0xE7, 0xE0, 0x3E, 0x1F, 0x83, 0xF0, 0x7E, 0x1F, 0x81, 0xF8, 0x7E, 0x07, + 0xE3, 0xF8, 0x1F, 0x8F, 0xE0, 0x7E, 0x3F, 0x83, 0xF8, 0xFF, 0x1F, 0xE1, + 0xFF, 0xDF, 0xF7, 0xFE, 0x3F, 0x07, 0xE0, 0xF8, 0xFF, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, 0x00, + 0x0F, 0xC7, 0xF0, 0x07, 0xEF, 0xFE, 0x03, 0xFC, 0x3F, 0x81, 0xFC, 0x0F, + 0xE0, 0xFC, 0x03, 0xF0, 0x7E, 0x01, 0xFC, 0x3F, 0x00, 0xFE, 0x1F, 0x80, + 0x3F, 0x8F, 0xC0, 0x1F, 0xC7, 0xE0, 0x0F, 0xE3, 0xF0, 0x07, 0xF1, 0xF8, + 0x03, 0xF8, 0xFC, 0x01, 0xFC, 0x7E, 0x00, 0xFE, 0x3F, 0x00, 0x7F, 0x1F, + 0x80, 0x3F, 0x0F, 0xC0, 0x1F, 0x87, 0xE0, 0x1F, 0xC3, 0xF0, 0x0F, 0xC1, + 0xF8, 0x07, 0xE0, 0xFE, 0x07, 0xE0, 0x73, 0x87, 0xE0, 0x30, 0xFF, 0xC0, + 0x10, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0xE0, 0x3E, 0x3E, 0x0F, + 0x83, 0xE3, 0xE0, 0x7C, 0x7C, 0x0F, 0x9F, 0x01, 0xF3, 0xE0, 0x1C, 0x7C, + 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, + 0x00, 0x3F, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, + 0x00, 0x1F, 0xC0, 0x21, 0xFE, 0x0C, 0x3F, 0xFF, 0x01, 0xFF, 0x80, 0x0F, + 0xC0, 0x00, 0x1F, 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x03, 0xF1, 0xF8, 0x07, 0xFD, 0xF8, 0x1F, 0xC7, + 0xF8, 0x1F, 0x83, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01, + 0xF8, 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, + 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, + 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01, + 0xF8, 0x3F, 0x03, 0xF8, 0x3F, 0x03, 0xF8, 0x1F, 0x87, 0xFC, 0x0F, 0xFD, + 0xFF, 0x03, 0xF1, 0xC0, 0x03, 0xF0, 0x03, 0xFF, 0x01, 0xE1, 0xE0, 0xF8, + 0x7C, 0x3C, 0x0F, 0x1F, 0x03, 0xE7, 0xC0, 0xFB, 0xF0, 0x3E, 0xFC, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xC0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x0C, 0xFC, + 0x06, 0x3F, 0xC3, 0x07, 0xFF, 0x80, 0xFF, 0xC0, 0x0F, 0xC0, 0x00, 0xFC, + 0x01, 0xFF, 0x81, 0xF1, 0xC1, 0xF0, 0xF0, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E, + 0x1C, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x1F, 0xFF, 0x0F, + 0xFF, 0x80, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, + 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, + 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0x7E, 0x00, 0x7F, 0x80, 0xFF, 0xF8, 0x00, 0x07, 0xF0, 0x03, + 0xFF, 0xFC, 0xF8, 0x7F, 0xBE, 0x07, 0x87, 0xC0, 0xF9, 0xF8, 0x1F, 0xBF, + 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xDF, 0x81, 0xF9, 0xF0, 0x3F, 0x3E, + 0x07, 0xC3, 0xE1, 0xF8, 0x3C, 0x7E, 0x01, 0xFF, 0x00, 0x60, 0x00, 0x38, + 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x7F, 0xFF, 0x0F, 0xFF, 0xF9, 0xFF, + 0xFF, 0x9F, 0xFF, 0xF9, 0xFF, 0xFF, 0x0F, 0xFF, 0xEF, 0x00, 0x3F, 0xC0, + 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x1C, 0xF8, 0x07, 0x0F, 0xFF, 0xC0, 0x7F, + 0xC0, 0xFF, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, + 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, + 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x87, 0xE0, 0x1F, 0x9F, 0xF0, 0x1F, 0xBF, + 0xF8, 0x1F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, + 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3, + 0xFF, 0x0F, 0x07, 0xE1, 0xFE, 0x3F, 0xC7, 0xF8, 0x7F, 0x03, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, + 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, + 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE1, 0xFE, 0xFF, 0xE0, 0x00, + 0x70, 0x07, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0xF0, + 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, + 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, + 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, + 0xDC, 0x3F, 0xF8, 0xFB, 0xE3, 0xEF, 0x0F, 0xBC, 0x7C, 0x7F, 0xE0, 0x7E, + 0x00, 0xFF, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xF0, + 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, + 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xE1, 0xFF, 0x83, + 0xF0, 0x3F, 0x01, 0xF8, 0x0E, 0x00, 0xFC, 0x06, 0x00, 0x7E, 0x06, 0x00, + 0x3F, 0x06, 0x00, 0x1F, 0x86, 0x00, 0x0F, 0xC7, 0x00, 0x07, 0xE7, 0x80, + 0x03, 0xF7, 0xE0, 0x01, 0xFF, 0xF8, 0x00, 0xFF, 0xFC, 0x00, 0x7E, 0x7F, + 0x00, 0x3F, 0x1F, 0xC0, 0x1F, 0x8F, 0xE0, 0x0F, 0xC3, 0xF8, 0x07, 0xE0, + 0xFE, 0x03, 0xF0, 0x7F, 0x81, 0xF8, 0x1F, 0xC0, 0xFC, 0x0F, 0xF0, 0xFF, + 0x07, 0xFD, 0xFF, 0xC7, 0xFF, 0xFF, 0x87, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, + 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, + 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, + 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x0F, 0xF7, + 0xFF, 0x00, 0x07, 0xE0, 0x3F, 0x07, 0xFC, 0xFF, 0x87, 0xFC, 0x0F, 0xEF, + 0xFE, 0x7F, 0xF0, 0x3F, 0xC3, 0xFF, 0x1F, 0x81, 0xFC, 0x0F, 0xE0, 0x7E, + 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0, 0x1F, + 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F, 0x07, + 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, 0xC0, + 0x7E, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x83, 0xF0, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0xFC, 0x07, 0xE0, 0x3F, + 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x0F, + 0xC0, 0x7E, 0x1F, 0xE0, 0xFF, 0x07, 0xFB, 0xFF, 0x8F, 0xFC, 0x7F, 0xE0, + 0x00, 0x07, 0xE0, 0xFF, 0x9F, 0xF0, 0x3F, 0xBF, 0xF8, 0x1F, 0xF1, 0xF8, + 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, + 0x1F, 0x80, 0xFC, 0x3F, 0xC1, 0xFE, 0xFF, 0xE3, 0xFF, 0x01, 0xFC, 0x00, + 0x3F, 0xF8, 0x03, 0xE3, 0xE0, 0x3E, 0x0F, 0x83, 0xF0, 0x7E, 0x1F, 0x01, + 0xF1, 0xF8, 0x0F, 0xCF, 0xC0, 0x7E, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, + 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, + 0xFF, 0xC0, 0x7F, 0x7E, 0x03, 0xF3, 0xF0, 0x1F, 0x8F, 0x80, 0xF8, 0x7E, + 0x0F, 0xC1, 0xF0, 0x7C, 0x07, 0xC7, 0xC0, 0x1F, 0xFC, 0x00, 0x3F, 0x80, + 0x00, 0x0F, 0xC0, 0xFF, 0xBF, 0xF0, 0x3F, 0xF1, 0xF8, 0x1F, 0xC0, 0xFC, + 0x1F, 0xC0, 0xFC, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, 0x1F, 0x80, 0x7F, + 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0x7E, 0x1F, 0x80, 0xFE, 0x1F, 0x80, 0xFC, + 0x1F, 0xC1, 0xF8, 0x1F, 0xE3, 0xF8, 0x1F, 0xBF, 0xE0, 0x1F, 0x8F, 0xC0, + 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, + 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0xF8, 0x00, + 0x00, 0xF8, 0x08, 0x07, 0xFE, 0x18, 0x0F, 0xC7, 0x38, 0x1F, 0x83, 0xF8, + 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7E, 0x01, 0xF8, + 0x7E, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, + 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, 0xFE, 0x01, 0xF8, + 0xFE, 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, + 0x3F, 0x83, 0xF8, 0x1F, 0xC7, 0xF8, 0x0F, 0xFD, 0xF8, 0x03, 0xF1, 0xF8, + 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, + 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x03, 0xFC, 0x00, 0x0F, 0xFF, + 0x00, 0x07, 0x9F, 0xF3, 0xF8, 0xFE, 0xFF, 0x8F, 0xFF, 0xF1, 0xFE, 0x7E, + 0x3F, 0x87, 0x87, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x07, 0xE0, 0x00, + 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x01, + 0xF8, 0x00, 0x7F, 0x80, 0x3F, 0xFC, 0x00, 0x0F, 0x84, 0x3F, 0xF8, 0xE1, + 0xF3, 0x80, 0xEF, 0x00, 0xDE, 0x01, 0xBE, 0x01, 0x7E, 0x00, 0xFF, 0x01, + 0xFF, 0x81, 0xFF, 0xC3, 0xFF, 0xC3, 0xFF, 0xC1, 0xFF, 0x80, 0xFF, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xDF, 0x0F, + 0x37, 0xFC, 0x43, 0xF0, 0x01, 0x00, 0x0C, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x7C, 0x03, 0xF0, 0x1F, 0xC0, 0xFF, 0xF3, 0xFF, 0xC3, 0xF0, 0x0F, + 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, + 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, + 0xFC, 0x23, 0xF0, 0x8F, 0xE6, 0x1F, 0xF0, 0x7F, 0x80, 0xF8, 0x00, 0xFF, + 0x87, 0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, 0x81, + 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, 0xF8, + 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x3F, 0x03, 0xF0, 0x1F, + 0x81, 0xF8, 0x0F, 0xC0, 0xFC, 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x01, + 0xF8, 0x1F, 0x80, 0xFC, 0x0F, 0xC0, 0x7E, 0x07, 0xE0, 0x7F, 0x03, 0xF8, + 0x7F, 0xC0, 0xFF, 0xEF, 0xF8, 0x3F, 0xE7, 0xC0, 0x0F, 0xC2, 0x00, 0xFF, + 0xF1, 0xFC, 0xFF, 0x01, 0xE3, 0xFC, 0x03, 0x07, 0xF0, 0x0C, 0x1F, 0xC0, + 0x60, 0x3F, 0x81, 0x80, 0xFE, 0x04, 0x01, 0xF8, 0x30, 0x07, 0xF0, 0xC0, + 0x1F, 0xC6, 0x00, 0x3F, 0x98, 0x00, 0xFE, 0x40, 0x01, 0xFB, 0x00, 0x07, + 0xFC, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, 0x01, 0xF0, + 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, + 0x01, 0x00, 0x00, 0xFF, 0xE7, 0xFF, 0x3F, 0xBF, 0xE0, 0xFE, 0x07, 0x0F, + 0xE0, 0x7F, 0x03, 0x83, 0xF0, 0x1F, 0x81, 0x81, 0xFC, 0x0F, 0xC0, 0xC0, + 0xFE, 0x07, 0xF0, 0x40, 0x3F, 0x03, 0xF8, 0x60, 0x1F, 0xC3, 0xFC, 0x30, + 0x07, 0xE1, 0xFE, 0x10, 0x03, 0xF0, 0x9F, 0x98, 0x01, 0xFC, 0xCF, 0xCC, + 0x00, 0x7E, 0x67, 0xEC, 0x00, 0x3F, 0xE1, 0xFE, 0x00, 0x1F, 0xF0, 0xFE, + 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x03, 0xF8, 0x3F, 0x80, 0x00, 0xFC, 0x0F, + 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03, 0xE0, 0x00, 0x0F, 0x00, + 0xE0, 0x00, 0x07, 0x00, 0x70, 0x00, 0x03, 0x80, 0x38, 0x00, 0x00, 0x80, + 0x08, 0x00, 0xFF, 0xF3, 0xFD, 0xFF, 0x03, 0xC3, 0xFC, 0x0E, 0x07, 0xF0, + 0x30, 0x1F, 0xE1, 0x80, 0x3F, 0x8C, 0x00, 0x7F, 0x70, 0x01, 0xFF, 0x80, + 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x00, + 0xFF, 0x00, 0x07, 0xFE, 0x00, 0x1B, 0xF8, 0x00, 0xCF, 0xF0, 0x06, 0x1F, + 0xC0, 0x38, 0x3F, 0x80, 0xC0, 0xFF, 0x07, 0x01, 0xFC, 0x3C, 0x07, 0xFB, + 0xFC, 0x7F, 0xF0, 0xFF, 0xE3, 0xFB, 0xFC, 0x07, 0x8F, 0xE0, 0x18, 0x7F, + 0x01, 0x81, 0xF8, 0x0C, 0x0F, 0xE0, 0x60, 0x7F, 0x06, 0x01, 0xF8, 0x30, + 0x0F, 0xE1, 0x80, 0x7F, 0x18, 0x01, 0xF8, 0xC0, 0x0F, 0xE6, 0x00, 0x3F, + 0x60, 0x01, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, + 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x03, 0x82, 0x00, 0x3E, + 0x30, 0x01, 0xF1, 0x00, 0x0F, 0x98, 0x00, 0x3F, 0x80, 0x00, 0xF0, 0x00, + 0x00, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xE0, 0x7F, 0x30, 0x1F, 0xC6, 0x07, + 0xF8, 0x80, 0xFE, 0x00, 0x3F, 0xC0, 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x3F, + 0x80, 0x0F, 0xE0, 0x03, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x03, 0xF8, + 0x00, 0xFE, 0x03, 0x3F, 0xC0, 0x67, 0xF0, 0x19, 0xFE, 0x07, 0x3F, 0x83, + 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x00, 0x7C, 0x07, 0xE0, 0x3E, 0x00, + 0xF8, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, + 0x1F, 0x00, 0xF8, 0x03, 0xC0, 0x3C, 0x01, 0xF0, 0x00, 0xF0, 0x03, 0xE0, + 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, + 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, + 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, 0x00, + 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, + 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF0, + 0x00, 0xF0, 0x03, 0xE0, 0x3C, 0x01, 0xF0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, + 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, + 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x01, 0xF0, 0x07, 0xC0, 0x7E, + 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0xFF, 0xC0, 0x47, 0xFF, 0xC3, 0x9F, + 0xFF, 0xFF, 0x70, 0x7F, 0xF8, 0x80, 0x7F, 0xC0, 0x00, 0x3E, 0x00 }; + +const GFXglyph FreeSerifBold24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 8, 34, 16, 4, -32 }, // 0x21 '!' + { 34, 17, 13, 26, 4, -32 }, // 0x22 '"' + { 62, 23, 33, 23, 0, -32 }, // 0x23 '#' + { 157, 21, 39, 24, 1, -34 }, // 0x24 '$' + { 260, 35, 34, 47, 6, -32 }, // 0x25 '%' + { 409, 34, 34, 39, 3, -32 }, // 0x26 '&' + { 554, 5, 13, 13, 4, -32 }, // 0x27 ''' + { 563, 12, 41, 16, 2, -32 }, // 0x28 '(' + { 625, 12, 41, 16, 1, -32 }, // 0x29 ')' + { 687, 18, 21, 24, 3, -32 }, // 0x2A '*' + { 735, 26, 25, 32, 3, -24 }, // 0x2B '+' + { 817, 8, 15, 12, 2, -6 }, // 0x2C ',' + { 832, 11, 5, 16, 2, -12 }, // 0x2D '-' + { 839, 8, 8, 12, 2, -6 }, // 0x2E '.' + { 847, 15, 33, 13, -1, -32 }, // 0x2F '/' + { 909, 22, 34, 23, 1, -32 }, // 0x30 '0' + { 1003, 18, 33, 23, 3, -32 }, // 0x31 '1' + { 1078, 21, 33, 24, 1, -32 }, // 0x32 '2' + { 1165, 21, 34, 24, 1, -32 }, // 0x33 '3' + { 1255, 21, 33, 24, 1, -32 }, // 0x34 '4' + { 1342, 20, 32, 23, 2, -31 }, // 0x35 '5' + { 1422, 21, 34, 24, 1, -32 }, // 0x36 '6' + { 1512, 21, 32, 23, 1, -31 }, // 0x37 '7' + { 1596, 21, 34, 23, 1, -32 }, // 0x38 '8' + { 1686, 22, 34, 23, 1, -32 }, // 0x39 '9' + { 1780, 8, 24, 16, 4, -22 }, // 0x3A ':' + { 1804, 9, 31, 16, 3, -22 }, // 0x3B ';' + { 1839, 26, 26, 32, 3, -24 }, // 0x3C '<' + { 1924, 26, 17, 32, 3, -20 }, // 0x3D '=' + { 1980, 26, 26, 32, 3, -24 }, // 0x3E '>' + { 2065, 18, 34, 24, 3, -32 }, // 0x3F '?' + { 2142, 33, 34, 44, 5, -32 }, // 0x40 '@' + { 2283, 32, 33, 34, 1, -32 }, // 0x41 'A' + { 2415, 28, 32, 31, 1, -31 }, // 0x42 'B' + { 2527, 30, 34, 33, 2, -32 }, // 0x43 'C' + { 2655, 32, 32, 34, 1, -31 }, // 0x44 'D' + { 2783, 28, 32, 32, 2, -31 }, // 0x45 'E' + { 2895, 25, 32, 29, 2, -31 }, // 0x46 'F' + { 2995, 33, 34, 36, 2, -32 }, // 0x47 'G' + { 3136, 33, 32, 37, 2, -31 }, // 0x48 'H' + { 3268, 15, 32, 18, 2, -31 }, // 0x49 'I' + { 3328, 22, 37, 24, 0, -31 }, // 0x4A 'J' + { 3430, 34, 32, 36, 2, -31 }, // 0x4B 'K' + { 3566, 28, 32, 31, 2, -31 }, // 0x4C 'L' + { 3678, 43, 32, 45, 0, -31 }, // 0x4D 'M' + { 3850, 31, 32, 34, 1, -31 }, // 0x4E 'N' + { 3974, 33, 34, 37, 2, -32 }, // 0x4F 'O' + { 4115, 26, 32, 30, 2, -31 }, // 0x50 'P' + { 4219, 33, 41, 37, 2, -32 }, // 0x51 'Q' + { 4389, 31, 32, 34, 2, -31 }, // 0x52 'R' + { 4513, 21, 34, 27, 3, -32 }, // 0x53 'S' + { 4603, 28, 32, 30, 1, -31 }, // 0x54 'T' + { 4715, 30, 33, 34, 2, -31 }, // 0x55 'U' + { 4839, 33, 32, 33, 0, -31 }, // 0x56 'V' + { 4971, 45, 33, 46, 1, -31 }, // 0x57 'W' + { 5157, 32, 32, 34, 1, -31 }, // 0x58 'X' + { 5285, 32, 32, 33, 1, -31 }, // 0x59 'Y' + { 5413, 28, 32, 30, 1, -31 }, // 0x5A 'Z' + { 5525, 11, 39, 16, 3, -31 }, // 0x5B '[' + { 5579, 15, 33, 13, -1, -32 }, // 0x5C '\' + { 5641, 11, 39, 16, 2, -31 }, // 0x5D ']' + { 5695, 21, 17, 27, 3, -31 }, // 0x5E '^' + { 5740, 24, 3, 23, 0, 5 }, // 0x5F '_' + { 5749, 11, 9, 16, 0, -33 }, // 0x60 '`' + { 5762, 22, 24, 23, 1, -22 }, // 0x61 'a' + { 5828, 25, 33, 26, 0, -31 }, // 0x62 'b' + { 5932, 19, 24, 20, 1, -22 }, // 0x63 'c' + { 5989, 24, 33, 26, 1, -31 }, // 0x64 'd' + { 6088, 18, 24, 21, 1, -22 }, // 0x65 'e' + { 6142, 17, 33, 18, 1, -32 }, // 0x66 'f' + { 6213, 19, 32, 24, 2, -22 }, // 0x67 'g' + { 6289, 24, 32, 26, 0, -31 }, // 0x68 'h' + { 6385, 11, 33, 14, 1, -32 }, // 0x69 'i' + { 6431, 14, 42, 18, 0, -32 }, // 0x6A 'j' + { 6505, 25, 32, 26, 0, -31 }, // 0x6B 'k' + { 6605, 11, 32, 13, 0, -31 }, // 0x6C 'l' + { 6649, 37, 23, 39, 0, -22 }, // 0x6D 'm' + { 6756, 24, 23, 26, 0, -22 }, // 0x6E 'n' + { 6825, 21, 24, 24, 1, -22 }, // 0x6F 'o' + { 6888, 24, 32, 26, 0, -22 }, // 0x70 'p' + { 6984, 24, 32, 26, 1, -22 }, // 0x71 'q' + { 7080, 19, 23, 20, 0, -22 }, // 0x72 'r' + { 7135, 15, 24, 19, 2, -22 }, // 0x73 's' + { 7180, 14, 31, 16, 1, -29 }, // 0x74 't' + { 7235, 25, 23, 27, 0, -21 }, // 0x75 'u' + { 7307, 22, 23, 23, 0, -21 }, // 0x76 'v' + { 7371, 33, 23, 33, 0, -21 }, // 0x77 'w' + { 7466, 22, 22, 24, 1, -21 }, // 0x78 'x' + { 7527, 21, 31, 23, 0, -21 }, // 0x79 'y' + { 7609, 19, 22, 21, 1, -21 }, // 0x7A 'z' + { 7662, 14, 42, 19, 1, -33 }, // 0x7B '{' + { 7736, 4, 33, 10, 3, -32 }, // 0x7C '|' + { 7753, 14, 42, 19, 4, -33 }, // 0x7D '}' + { 7827, 22, 7, 24, 1, -14 } }; // 0x7E '~' + +const GFXfont FreeSerifBold24pt7b PROGMEM = { + (uint8_t *)FreeSerifBold24pt7bBitmaps, + (GFXglyph *)FreeSerifBold24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 8519 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold9pt7b.h new file mode 100644 index 0000000..52dbe36 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBold9pt7b.h @@ -0,0 +1,202 @@ +const uint8_t FreeSerifBold9pt7bBitmaps[] PROGMEM = { + 0xFF, 0xF4, 0x92, 0x1F, 0xF0, 0xCF, 0x3C, 0xE3, 0x88, 0x13, 0x09, 0x84, + 0xC2, 0x47, 0xF9, 0x90, 0xC8, 0x4C, 0xFF, 0x13, 0x09, 0x0C, 0x86, 0x40, + 0x10, 0x38, 0xD6, 0x92, 0xD2, 0xF0, 0x7C, 0x3E, 0x17, 0x93, 0x93, 0xD6, + 0x7C, 0x10, 0x3C, 0x21, 0xCF, 0x0E, 0x24, 0x30, 0xA0, 0xC5, 0x03, 0x34, + 0xE7, 0x26, 0x40, 0xB9, 0x04, 0xC4, 0x23, 0x30, 0x8C, 0x84, 0x1C, 0x0F, + 0x00, 0xCC, 0x06, 0x60, 0x3E, 0x00, 0xE7, 0x8F, 0x18, 0x9C, 0x8C, 0xE4, + 0xE3, 0xC7, 0x9E, 0x3C, 0x72, 0xFD, 0xE0, 0xFF, 0x80, 0x32, 0x44, 0xCC, + 0xCC, 0xCC, 0xC4, 0x62, 0x10, 0x84, 0x22, 0x33, 0x33, 0x33, 0x32, 0x64, + 0x80, 0x31, 0x6B, 0xB1, 0x8E, 0xD6, 0x8C, 0x00, 0x08, 0x04, 0x02, 0x01, + 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xDF, 0x95, 0x00, 0xFF, 0xFF, + 0x80, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC0, 0x1C, + 0x33, 0x98, 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xB1, 0x98, 0xC3, + 0x80, 0x08, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBF, 0x3C, 0x3F, + 0x23, 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x18, 0x5F, 0xDF, 0xE0, + 0x7C, 0x8E, 0x0E, 0x0E, 0x0C, 0x1E, 0x07, 0x03, 0x03, 0x02, 0xE6, 0xF8, + 0x06, 0x0E, 0x0E, 0x3E, 0x2E, 0x4E, 0x8E, 0x8E, 0xFF, 0xFF, 0x0E, 0x0E, + 0x3F, 0x7E, 0x40, 0x40, 0xF8, 0xFC, 0x1E, 0x06, 0x02, 0x02, 0xE4, 0xF8, + 0x07, 0x1C, 0x30, 0x70, 0xFC, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C, + 0x7F, 0x3F, 0xA0, 0xD0, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x04, 0x06, + 0x03, 0x00, 0x3C, 0xC6, 0xC6, 0xC6, 0xFC, 0x7C, 0x3E, 0xCF, 0xC7, 0xC7, + 0xC6, 0x7C, 0x3E, 0x33, 0xB8, 0xDC, 0x7E, 0x3F, 0x1D, 0xCE, 0x7F, 0x07, + 0x07, 0x0F, 0x1C, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x37, 0xE5, + 0x40, 0x00, 0x00, 0x70, 0x78, 0x78, 0x78, 0x38, 0x03, 0x80, 0x3C, 0x03, + 0xC0, 0x30, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0xC0, 0x3C, 0x03, + 0xC0, 0x1C, 0x01, 0xC1, 0xE1, 0xE1, 0xE0, 0xE0, 0x00, 0x00, 0x3D, 0x9F, + 0x3E, 0x70, 0xE1, 0x04, 0x08, 0x00, 0x70, 0xE1, 0xC0, 0x0F, 0x81, 0x83, + 0x18, 0xC4, 0x89, 0x9C, 0x4C, 0xE4, 0x67, 0x22, 0x39, 0x22, 0x4F, 0xE3, + 0x00, 0x0C, 0x10, 0x1F, 0x00, 0x02, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, + 0xB8, 0x05, 0xC0, 0x4F, 0x02, 0x38, 0x3F, 0xE1, 0x07, 0x18, 0x3D, 0xE3, + 0xF0, 0xFF, 0x87, 0x1C, 0xE3, 0x9C, 0x73, 0x9C, 0x7F, 0x0E, 0x71, 0xC7, + 0x38, 0xE7, 0x1C, 0xE7, 0x7F, 0xC0, 0x1F, 0x26, 0x1D, 0xC1, 0xB0, 0x1E, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x04, 0xE1, 0x0F, 0xC0, 0xFF, + 0x0E, 0x71, 0xC7, 0x38, 0x77, 0x0E, 0xE1, 0xDC, 0x3B, 0x87, 0x70, 0xCE, + 0x39, 0xC6, 0x7F, 0x80, 0xFF, 0xCE, 0x19, 0xC1, 0x38, 0x87, 0x30, 0xFE, + 0x1C, 0xC3, 0x88, 0x70, 0x2E, 0x0D, 0xC3, 0x7F, 0xE0, 0xFF, 0xDC, 0x37, + 0x05, 0xC4, 0x73, 0x1F, 0xC7, 0x31, 0xC4, 0x70, 0x1C, 0x07, 0x03, 0xE0, + 0x1F, 0x23, 0x0E, 0x70, 0x6E, 0x02, 0xE0, 0x0E, 0x00, 0xE1, 0xFE, 0x0E, + 0x60, 0xE7, 0x0E, 0x38, 0xE0, 0xF8, 0xF9, 0xF7, 0x0E, 0x70, 0xE7, 0x0E, + 0x70, 0xE7, 0xFE, 0x70, 0xE7, 0x0E, 0x70, 0xE7, 0x0E, 0x70, 0xEF, 0x9F, + 0xFB, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0x1F, 0x0E, 0x0E, 0x0E, + 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xCE, 0xCC, 0x78, 0xF9, 0xF3, + 0x82, 0x1C, 0x20, 0xE2, 0x07, 0x20, 0x3F, 0x01, 0xDC, 0x0E, 0x70, 0x73, + 0xC3, 0x8F, 0x1C, 0x3D, 0xF3, 0xF0, 0xF8, 0x0E, 0x01, 0xC0, 0x38, 0x07, + 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x2E, 0x09, 0xC3, 0x7F, 0xE0, 0xF8, + 0x0F, 0x3C, 0x1E, 0x3C, 0x1E, 0x2E, 0x2E, 0x2E, 0x2E, 0x26, 0x4E, 0x27, + 0x4E, 0x27, 0x4E, 0x23, 0x8E, 0x23, 0x8E, 0x21, 0x0E, 0x71, 0x1F, 0xF0, + 0xEE, 0x09, 0xE1, 0x3E, 0x25, 0xE4, 0x9E, 0x91, 0xD2, 0x1E, 0x43, 0xC8, + 0x39, 0x03, 0x70, 0x20, 0x1F, 0x83, 0x0C, 0x70, 0xEE, 0x07, 0xE0, 0x7E, + 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, 0x0E, 0x30, 0xC1, 0xF8, 0xFF, 0x1C, + 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0xE7, 0xF1, 0xC0, 0x70, 0x1C, 0x07, 0x03, + 0xE0, 0x0F, 0x83, 0x9C, 0x70, 0xE6, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, + 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0x78, 0x03, 0xE0, + 0xFF, 0x07, 0x38, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x38, 0x7E, 0x07, 0x70, + 0x77, 0x87, 0x3C, 0x71, 0xEF, 0x8F, 0x39, 0x47, 0xC1, 0xC0, 0xF0, 0x7C, + 0x3E, 0x0F, 0x83, 0xC3, 0xC6, 0xBC, 0xFF, 0xFC, 0xE3, 0x8E, 0x10, 0xE0, + 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xF0, + 0xF8, 0xEE, 0x09, 0xC1, 0x38, 0x27, 0x04, 0xE0, 0x9C, 0x13, 0x82, 0x70, + 0x4E, 0x08, 0xE2, 0x0F, 0x80, 0xFC, 0x7B, 0xC1, 0x0E, 0x08, 0x70, 0x81, + 0xC4, 0x0E, 0x20, 0x7A, 0x01, 0xD0, 0x0E, 0x80, 0x38, 0x01, 0xC0, 0x04, + 0x00, 0x20, 0x00, 0xFD, 0xFB, 0xDC, 0x38, 0x43, 0x87, 0x10, 0xE1, 0xC4, + 0x38, 0xF2, 0x07, 0x2E, 0x81, 0xD3, 0xA0, 0x34, 0x70, 0x0E, 0x1C, 0x03, + 0x87, 0x00, 0x60, 0x80, 0x10, 0x20, 0xFE, 0xF3, 0xC3, 0x0F, 0x10, 0x39, + 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x01, 0x70, 0x09, 0xC0, 0x8F, 0x08, 0x3D, + 0xF3, 0xF0, 0xFC, 0x7B, 0xC1, 0x8E, 0x08, 0x38, 0x81, 0xE8, 0x07, 0x40, + 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1F, 0x00, 0xFF, 0xD8, + 0x72, 0x1E, 0x43, 0x80, 0xE0, 0x1C, 0x07, 0x01, 0xC0, 0x38, 0x2E, 0x0F, + 0x83, 0x7F, 0xE0, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF0, 0xC1, + 0x06, 0x18, 0x20, 0xC3, 0x04, 0x18, 0x60, 0x83, 0x0C, 0xF3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0xF0, 0x18, 0x1C, 0x34, 0x26, 0x62, 0x43, 0xC1, + 0xFF, 0x80, 0xC6, 0x30, 0x7C, 0x63, 0xB1, 0xC0, 0xE1, 0xF3, 0x3B, 0x9D, + 0xCE, 0xFF, 0x80, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0x77, 0x1D, + 0xC7, 0x71, 0xDC, 0x77, 0x39, 0x3C, 0x3C, 0xED, 0x9F, 0x0E, 0x1C, 0x38, + 0x39, 0x3C, 0x07, 0x80, 0xE0, 0x38, 0xEE, 0x77, 0xB8, 0xEE, 0x3B, 0x8E, + 0xE3, 0xB8, 0xE7, 0x78, 0xEF, 0x3C, 0x66, 0xE6, 0xFE, 0xE0, 0xE0, 0xE0, + 0x72, 0x3C, 0x3E, 0xED, 0xC7, 0xC7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC7, + 0xC0, 0x31, 0xDF, 0xBF, 0x7E, 0xE7, 0x90, 0x60, 0xFC, 0xFE, 0x0C, 0x17, + 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xDC, 0x7B, 0x9C, 0xE7, 0x39, 0xCE, 0x73, + 0x9C, 0xE7, 0x3B, 0xFF, 0x73, 0x9D, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, + 0x1C, 0x71, 0xCF, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x7D, 0xBE, + 0xF0, 0x1C, 0x07, 0x01, 0xCE, 0x71, 0x1C, 0x87, 0x41, 0xF8, 0x77, 0x1C, + 0xE7, 0x1B, 0xEF, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF0, 0xF7, + 0x38, 0xF7, 0xB9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, + 0x39, 0xCE, 0xFF, 0xFE, 0xF7, 0x1E, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, + 0x39, 0xCE, 0xFF, 0xC0, 0x3E, 0x31, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, + 0xC6, 0x3E, 0x00, 0xF7, 0x1E, 0xE7, 0x1D, 0xC7, 0x71, 0xDC, 0x77, 0x1D, + 0xCE, 0x7F, 0x1C, 0x07, 0x01, 0xC0, 0xF8, 0x00, 0x3C, 0x9C, 0xEE, 0x3B, + 0x8E, 0xE3, 0xB8, 0xEE, 0x39, 0xCE, 0x3F, 0x80, 0xE0, 0x38, 0x0E, 0x07, + 0xC0, 0xF7, 0x7B, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7E, 0x73, + 0xC7, 0x8E, 0x39, 0xB0, 0x10, 0xCF, 0x9C, 0x71, 0xC7, 0x1C, 0x71, 0xD3, + 0x80, 0xF7, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x3F, + 0xC0, 0xFB, 0xB8, 0x8C, 0x87, 0x43, 0xC0, 0xE0, 0x70, 0x10, 0x08, 0x00, + 0xF7, 0xB6, 0x31, 0x73, 0xA3, 0x3A, 0x3D, 0xA3, 0xDC, 0x18, 0xC1, 0x88, + 0x10, 0x80, 0xFB, 0xB8, 0x8E, 0x83, 0x81, 0xC0, 0xF0, 0x98, 0xCE, 0xEF, + 0x80, 0xF7, 0x62, 0x72, 0x34, 0x34, 0x3C, 0x18, 0x18, 0x10, 0x10, 0x10, + 0xE0, 0xE0, 0xFF, 0x1C, 0x70, 0xE3, 0x87, 0x1C, 0x71, 0xFE, 0x19, 0x8C, + 0x63, 0x18, 0xCC, 0x61, 0x8C, 0x63, 0x18, 0xC3, 0xFF, 0xF8, 0xC3, 0x18, + 0xC6, 0x31, 0x86, 0x33, 0x18, 0xC6, 0x31, 0x98, 0xF0, 0x8E }; + +const GFXglyph FreeSerifBold9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 3, 12, 6, 1, -11 }, // 0x21 '!' + { 5, 6, 5, 10, 2, -11 }, // 0x22 '"' + { 9, 9, 13, 9, 0, -12 }, // 0x23 '#' + { 24, 8, 14, 9, 1, -12 }, // 0x24 '$' + { 38, 14, 12, 18, 2, -11 }, // 0x25 '%' + { 59, 13, 12, 15, 1, -11 }, // 0x26 '&' + { 79, 2, 5, 5, 1, -11 }, // 0x27 ''' + { 81, 4, 15, 6, 1, -11 }, // 0x28 '(' + { 89, 4, 15, 6, 1, -11 }, // 0x29 ')' + { 97, 7, 7, 9, 2, -11 }, // 0x2A '*' + { 104, 9, 9, 12, 1, -8 }, // 0x2B '+' + { 115, 3, 6, 4, 1, -2 }, // 0x2C ',' + { 118, 4, 2, 6, 1, -4 }, // 0x2D '-' + { 119, 3, 3, 4, 1, -2 }, // 0x2E '.' + { 121, 6, 13, 5, 0, -11 }, // 0x2F '/' + { 131, 9, 12, 9, 0, -11 }, // 0x30 '0' + { 145, 6, 12, 9, 1, -11 }, // 0x31 '1' + { 154, 9, 12, 9, 0, -11 }, // 0x32 '2' + { 168, 8, 12, 9, 0, -11 }, // 0x33 '3' + { 180, 8, 12, 9, 1, -11 }, // 0x34 '4' + { 192, 8, 12, 9, 1, -11 }, // 0x35 '5' + { 204, 8, 12, 9, 1, -11 }, // 0x36 '6' + { 216, 9, 12, 9, 0, -11 }, // 0x37 '7' + { 230, 8, 12, 9, 1, -11 }, // 0x38 '8' + { 242, 9, 12, 9, 0, -11 }, // 0x39 '9' + { 256, 3, 9, 6, 1, -8 }, // 0x3A ':' + { 260, 3, 12, 6, 2, -8 }, // 0x3B ';' + { 265, 10, 10, 12, 1, -9 }, // 0x3C '<' + { 278, 10, 5, 12, 1, -6 }, // 0x3D '=' + { 285, 10, 10, 12, 1, -8 }, // 0x3E '>' + { 298, 7, 12, 9, 1, -11 }, // 0x3F '?' + { 309, 13, 12, 17, 2, -11 }, // 0x40 '@' + { 329, 13, 12, 13, 0, -11 }, // 0x41 'A' + { 349, 11, 12, 12, 0, -11 }, // 0x42 'B' + { 366, 11, 12, 13, 1, -11 }, // 0x43 'C' + { 383, 11, 12, 13, 1, -11 }, // 0x44 'D' + { 400, 11, 12, 12, 1, -11 }, // 0x45 'E' + { 417, 10, 12, 11, 1, -11 }, // 0x46 'F' + { 432, 12, 12, 14, 1, -11 }, // 0x47 'G' + { 450, 12, 12, 14, 1, -11 }, // 0x48 'H' + { 468, 5, 12, 7, 1, -11 }, // 0x49 'I' + { 476, 8, 14, 9, 0, -11 }, // 0x4A 'J' + { 490, 13, 12, 14, 1, -11 }, // 0x4B 'K' + { 510, 11, 12, 12, 1, -11 }, // 0x4C 'L' + { 527, 16, 12, 17, 0, -11 }, // 0x4D 'M' + { 551, 11, 12, 13, 1, -11 }, // 0x4E 'N' + { 568, 12, 12, 14, 1, -11 }, // 0x4F 'O' + { 586, 10, 12, 11, 1, -11 }, // 0x50 'P' + { 601, 12, 15, 14, 1, -11 }, // 0x51 'Q' + { 624, 12, 12, 13, 1, -11 }, // 0x52 'R' + { 642, 8, 12, 10, 1, -11 }, // 0x53 'S' + { 654, 12, 12, 12, 0, -11 }, // 0x54 'T' + { 672, 11, 12, 13, 1, -11 }, // 0x55 'U' + { 689, 13, 13, 13, 0, -11 }, // 0x56 'V' + { 711, 18, 12, 18, 0, -11 }, // 0x57 'W' + { 738, 13, 12, 13, 0, -11 }, // 0x58 'X' + { 758, 13, 12, 13, 0, -11 }, // 0x59 'Y' + { 778, 11, 12, 12, 1, -11 }, // 0x5A 'Z' + { 795, 4, 15, 6, 1, -11 }, // 0x5B '[' + { 803, 6, 13, 5, 0, -11 }, // 0x5C '\' + { 813, 4, 15, 6, 1, -11 }, // 0x5D ']' + { 821, 8, 7, 10, 1, -11 }, // 0x5E '^' + { 828, 9, 1, 9, 0, 3 }, // 0x5F '_' + { 830, 4, 3, 6, 0, -12 }, // 0x60 '`' + { 832, 9, 9, 9, 0, -8 }, // 0x61 'a' + { 843, 10, 12, 10, 0, -11 }, // 0x62 'b' + { 858, 7, 9, 8, 0, -8 }, // 0x63 'c' + { 866, 10, 12, 10, 0, -11 }, // 0x64 'd' + { 881, 8, 9, 8, 0, -8 }, // 0x65 'e' + { 890, 7, 12, 7, 0, -11 }, // 0x66 'f' + { 901, 7, 13, 9, 1, -8 }, // 0x67 'g' + { 913, 10, 12, 10, 0, -11 }, // 0x68 'h' + { 928, 5, 12, 5, 0, -11 }, // 0x69 'i' + { 936, 6, 16, 7, 0, -11 }, // 0x6A 'j' + { 948, 10, 12, 10, 0, -11 }, // 0x6B 'k' + { 963, 5, 12, 5, 0, -11 }, // 0x6C 'l' + { 971, 15, 9, 15, 0, -8 }, // 0x6D 'm' + { 988, 10, 9, 10, 0, -8 }, // 0x6E 'n' + { 1000, 9, 9, 9, 0, -8 }, // 0x6F 'o' + { 1011, 10, 13, 10, 0, -8 }, // 0x70 'p' + { 1028, 10, 13, 10, 0, -8 }, // 0x71 'q' + { 1045, 8, 9, 8, 0, -8 }, // 0x72 'r' + { 1054, 5, 9, 7, 1, -8 }, // 0x73 's' + { 1060, 6, 11, 6, 0, -10 }, // 0x74 't' + { 1069, 10, 9, 10, 0, -8 }, // 0x75 'u' + { 1081, 9, 9, 9, 0, -8 }, // 0x76 'v' + { 1092, 12, 9, 13, 0, -8 }, // 0x77 'w' + { 1106, 9, 9, 9, 0, -8 }, // 0x78 'x' + { 1117, 8, 13, 9, 0, -8 }, // 0x79 'y' + { 1130, 7, 9, 8, 1, -8 }, // 0x7A 'z' + { 1138, 5, 16, 7, 0, -12 }, // 0x7B '{' + { 1148, 1, 13, 4, 1, -11 }, // 0x7C '|' + { 1150, 5, 16, 7, 2, -12 }, // 0x7D '}' + { 1160, 8, 2, 9, 1, -4 } }; // 0x7E '~' + +const GFXfont FreeSerifBold9pt7b PROGMEM = { + (uint8_t *)FreeSerifBold9pt7bBitmaps, + (GFXglyph *)FreeSerifBold9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1834 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h new file mode 100644 index 0000000..1f674e9 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h @@ -0,0 +1,292 @@ +const uint8_t FreeSerifBoldItalic12pt7bBitmaps[] PROGMEM = { + 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x10, 0x00, + 0x00, 0x60, 0xF0, 0xF0, 0x60, 0x61, 0xF1, 0xF8, 0xF8, 0x6C, 0x34, 0x12, + 0x08, 0x01, 0x8C, 0x06, 0x60, 0x31, 0x80, 0xCC, 0x06, 0x30, 0xFF, 0xF0, + 0xC6, 0x03, 0x18, 0x0C, 0xC0, 0x63, 0x0F, 0xFF, 0x0C, 0x60, 0x33, 0x01, + 0x8C, 0x06, 0x30, 0x19, 0x80, 0x00, 0x80, 0x08, 0x07, 0xC1, 0x96, 0x31, + 0x33, 0x13, 0x3A, 0x23, 0xE0, 0x1E, 0x01, 0xF0, 0x07, 0x80, 0x7C, 0x05, + 0xC4, 0xCC, 0x48, 0xCC, 0x8C, 0xF8, 0x83, 0x30, 0x1E, 0x01, 0x00, 0x00, + 0x02, 0x07, 0x83, 0x03, 0x9F, 0x81, 0xC4, 0x20, 0x71, 0x10, 0x3C, 0x44, + 0x0E, 0x22, 0x03, 0x88, 0x80, 0xE4, 0x40, 0x1E, 0x31, 0xE0, 0x08, 0xE4, + 0x06, 0x71, 0x01, 0x3C, 0x40, 0x8E, 0x10, 0x23, 0x88, 0x10, 0xE2, 0x04, + 0x39, 0x02, 0x07, 0x80, 0x00, 0xF0, 0x01, 0x98, 0x03, 0x98, 0x03, 0x98, + 0x03, 0xB0, 0x03, 0xE0, 0x03, 0x80, 0x0F, 0x9F, 0x19, 0xCE, 0x31, 0xCC, + 0x61, 0xC8, 0xE1, 0xC8, 0xE0, 0xF0, 0xE0, 0xE0, 0xF0, 0x70, 0x78, 0x79, + 0x3F, 0xBE, 0x7F, 0xED, 0x20, 0x02, 0x08, 0x20, 0xC3, 0x0E, 0x18, 0x30, + 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x20, 0x40, 0x80, 0x81, 0x01, 0x00, + 0x10, 0x10, 0x20, 0x20, 0x40, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x70, 0xE1, + 0x83, 0x0C, 0x18, 0x61, 0x86, 0x00, 0x00, 0x0C, 0x33, 0x6C, 0x9B, 0xAE, + 0x1C, 0x3F, 0xEC, 0x9B, 0x36, 0x0C, 0x02, 0x00, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x0F, 0xFF, 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x31, 0xCE, 0x31, 0x08, 0x98, 0xFF, 0xFF, 0xC0, 0x6F, 0xF6, + 0x01, 0x80, 0x60, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0x30, 0x1C, 0x06, + 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x03, 0x00, 0x03, 0x81, 0xC8, 0x71, + 0x1C, 0x33, 0x86, 0xE1, 0xDC, 0x3B, 0x87, 0xE0, 0xFC, 0x3B, 0x87, 0x70, + 0xEC, 0x39, 0x87, 0x31, 0xC2, 0x30, 0x3C, 0x00, 0x01, 0xC3, 0xF0, 0x38, + 0x0E, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xE0, 0x38, 0x1E, + 0x07, 0x01, 0xC0, 0xF0, 0xFF, 0x80, 0x07, 0x81, 0xF8, 0x47, 0x90, 0x70, + 0x0E, 0x01, 0xC0, 0x30, 0x0E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x40, 0x8F, 0xF3, 0xFC, 0xFF, 0x80, 0x07, 0xC3, 0x3C, 0x03, 0x80, 0x70, + 0x0C, 0x03, 0x81, 0xC0, 0xFC, 0x07, 0xC0, 0x78, 0x07, 0x00, 0xE0, 0x1C, + 0x03, 0x30, 0xE7, 0x10, 0x7C, 0x00, 0x00, 0x10, 0x01, 0x80, 0x3C, 0x03, + 0xE0, 0x2E, 0x02, 0x70, 0x23, 0x82, 0x38, 0x21, 0xC2, 0x0E, 0x1F, 0xF9, + 0xFF, 0xC0, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0xF0, 0x7E, 0x0F, + 0xE0, 0x80, 0x08, 0x01, 0xE0, 0x1F, 0x83, 0xF8, 0x03, 0xC0, 0x1C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x08, 0x61, 0x8F, 0x30, 0x7C, 0x00, 0x00, 0x60, + 0x78, 0x1C, 0x0F, 0x01, 0xC0, 0x70, 0x1F, 0xC3, 0x8C, 0xE1, 0xDC, 0x3B, + 0x87, 0x61, 0xEC, 0x3D, 0x87, 0x31, 0xE2, 0x38, 0x3C, 0x00, 0x3F, 0xEF, + 0xF9, 0xFF, 0x60, 0xC8, 0x18, 0x06, 0x00, 0x80, 0x30, 0x0C, 0x01, 0x80, + 0x60, 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x06, 0x00, 0x03, 0x81, 0x88, 0x61, + 0x8C, 0x31, 0x86, 0x38, 0xC7, 0xB0, 0x78, 0x0F, 0x86, 0x71, 0x87, 0x60, + 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x18, 0x3E, 0x00, 0x07, 0x81, 0xC8, 0x71, + 0x8E, 0x33, 0xC6, 0x70, 0xCE, 0x39, 0xC7, 0x38, 0xE3, 0x38, 0x3F, 0x01, + 0xC0, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0xE0, 0x00, 0x0C, 0x3C, 0x78, 0x60, + 0x00, 0x00, 0x00, 0x61, 0xE3, 0xC3, 0x00, 0x0E, 0x0F, 0x0F, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x18, 0x10, 0x20, 0x40, 0x00, 0x10, + 0x07, 0x01, 0xF0, 0x7C, 0x3F, 0x0F, 0x80, 0xE0, 0x0F, 0x80, 0x3E, 0x00, + 0xF8, 0x03, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C, 0x00, + 0xF8, 0x01, 0xE0, 0x1F, 0x07, 0xE0, 0xF8, 0x1F, 0x01, 0xE0, 0x0C, 0x00, + 0x00, 0x1E, 0x19, 0x8C, 0xE6, 0x70, 0x38, 0x38, 0x1C, 0x18, 0x18, 0x08, + 0x08, 0x00, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x03, 0xF0, 0x07, + 0x06, 0x06, 0x00, 0x86, 0x0E, 0x66, 0x0D, 0xDB, 0x0C, 0xE7, 0x06, 0x33, + 0x83, 0x31, 0xC3, 0x18, 0xE1, 0x8C, 0x70, 0xCC, 0x4C, 0x66, 0x46, 0x1F, + 0xC1, 0x80, 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x10, 0x00, 0x30, 0x00, + 0x70, 0x00, 0x70, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0x78, 0x03, 0x78, 0x02, + 0x38, 0x04, 0x38, 0x0C, 0x38, 0x0F, 0xF8, 0x18, 0x3C, 0x30, 0x3C, 0x20, + 0x3C, 0x60, 0x3C, 0xF8, 0x7F, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07, + 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C, 0x0F, 0xE0, 0x1E, 0x3C, 0x1E, + 0x1E, 0x1C, 0x1E, 0x3C, 0x1E, 0x3C, 0x1E, 0x3C, 0x3E, 0x38, 0x3C, 0x7C, + 0x78, 0xFF, 0xE0, 0x01, 0xF2, 0x0E, 0x1C, 0x38, 0x18, 0xE0, 0x33, 0xC0, + 0x4F, 0x00, 0x9E, 0x00, 0x7C, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x04, 0x1E, 0x30, 0x0F, 0x80, 0x1F, + 0xFC, 0x01, 0xE3, 0xC0, 0x70, 0x78, 0x1C, 0x0E, 0x0F, 0x03, 0xC3, 0xC0, + 0xF0, 0xE0, 0x3C, 0x38, 0x0F, 0x1E, 0x03, 0xC7, 0x81, 0xF1, 0xC0, 0x78, + 0xF0, 0x1E, 0x3C, 0x0F, 0x0F, 0x03, 0xC3, 0x81, 0xC1, 0xE1, 0xE0, 0xFF, + 0xE0, 0x00, 0x1F, 0xFF, 0x83, 0xC1, 0xC1, 0xC0, 0x40, 0xE0, 0x20, 0xF0, + 0x00, 0x78, 0xC0, 0x38, 0x40, 0x1F, 0xE0, 0x1E, 0x70, 0x0F, 0x18, 0x07, + 0x08, 0x03, 0x84, 0x03, 0xC0, 0x61, 0xE0, 0x20, 0xE0, 0x30, 0xF8, 0x78, + 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0x07, 0x87, 0x07, 0x02, 0x07, 0x02, 0x0F, + 0x00, 0x0F, 0x18, 0x0E, 0x10, 0x0F, 0xF0, 0x1E, 0x70, 0x1E, 0x30, 0x1C, + 0x20, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xFE, + 0x00, 0x01, 0xF9, 0x03, 0xC3, 0x83, 0x81, 0xC3, 0x80, 0x43, 0xC0, 0x23, + 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x3F, 0xF8, 0x0F, 0x3C, 0x07, + 0x9E, 0x03, 0xCF, 0x01, 0xC3, 0x80, 0xE1, 0xE0, 0xF0, 0x78, 0x70, 0x0F, + 0xE0, 0x00, 0x1F, 0xE7, 0xF0, 0x78, 0x3C, 0x07, 0x83, 0xC0, 0x70, 0x3C, + 0x0F, 0x03, 0x80, 0xF0, 0x78, 0x0E, 0x07, 0x80, 0xE0, 0x70, 0x1F, 0xFF, + 0x01, 0xE0, 0xF0, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, + 0xE0, 0x38, 0x1E, 0x07, 0xC3, 0xE0, 0xFE, 0x7F, 0x00, 0x1F, 0xC1, 0xE0, + 0x70, 0x1C, 0x0F, 0x03, 0xC0, 0xE0, 0x38, 0x1E, 0x07, 0x81, 0xC0, 0x70, + 0x3C, 0x0F, 0x03, 0x81, 0xF0, 0xFE, 0x00, 0x01, 0xFC, 0x03, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x0E, 0x70, 0x3B, 0xC0, 0xCE, + 0x01, 0xF0, 0x00, 0x1F, 0xEF, 0x83, 0xC1, 0x81, 0xC1, 0x80, 0xE1, 0x80, + 0xF1, 0x80, 0x79, 0x00, 0x39, 0x00, 0x1F, 0x80, 0x1F, 0xE0, 0x0F, 0x70, + 0x07, 0x3C, 0x07, 0x8E, 0x03, 0xC7, 0x01, 0xE3, 0xC0, 0xE0, 0xE0, 0xF8, + 0x78, 0xFE, 0xFE, 0x00, 0x1F, 0xE0, 0x0F, 0x00, 0x1C, 0x00, 0x38, 0x00, + 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70, + 0x00, 0xE0, 0x03, 0xC0, 0x27, 0x00, 0xCE, 0x03, 0x3C, 0x1E, 0xFF, 0xFC, + 0x0F, 0x80, 0x7E, 0x0F, 0x00, 0xF0, 0x1E, 0x03, 0xE0, 0x3C, 0x0F, 0x80, + 0xB8, 0x17, 0x01, 0x70, 0x5E, 0x02, 0xF1, 0xBC, 0x05, 0xE2, 0x70, 0x11, + 0xC8, 0xE0, 0x23, 0xB3, 0xC0, 0x47, 0x47, 0x81, 0x0F, 0x8E, 0x02, 0x1E, + 0x1C, 0x04, 0x38, 0x78, 0x08, 0x70, 0xF0, 0x30, 0xC3, 0xE0, 0xF9, 0x8F, + 0xE0, 0x1F, 0x03, 0xE0, 0xF0, 0x38, 0x1E, 0x02, 0x03, 0xE0, 0xC0, 0xBC, + 0x10, 0x13, 0xC2, 0x02, 0x78, 0x40, 0x47, 0x90, 0x10, 0xF2, 0x02, 0x0F, + 0x40, 0x41, 0xE8, 0x18, 0x1E, 0x02, 0x03, 0xC0, 0x40, 0x38, 0x08, 0x06, + 0x03, 0x00, 0x40, 0x10, 0x08, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E, + 0x1E, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x0F, 0xF8, 0x1F, + 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70, + 0x38, 0xE0, 0x1F, 0x80, 0x1F, 0xFC, 0x07, 0x9E, 0x07, 0x0F, 0x07, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x1E, 0x0E, 0x3C, 0x1F, 0xF0, 0x1E, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x7C, 0x00, + 0xFE, 0x00, 0x01, 0xF8, 0x07, 0x1C, 0x0E, 0x0E, 0x1E, 0x0F, 0x3C, 0x0F, + 0x3C, 0x0F, 0x78, 0x0F, 0x78, 0x1F, 0xF8, 0x1F, 0xF0, 0x1E, 0xF0, 0x1E, + 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x78, 0x70, 0x70, 0x39, 0xC0, 0x0E, 0x00, + 0x08, 0x02, 0x3F, 0x04, 0x7F, 0xF8, 0x83, 0xF0, 0x1F, 0xF8, 0x07, 0x9E, + 0x07, 0x8F, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x1E, 0x0E, 0x3C, + 0x1F, 0xF0, 0x1E, 0xF0, 0x1C, 0xF0, 0x3C, 0xF0, 0x3C, 0x78, 0x3C, 0x78, + 0x3C, 0x78, 0x7C, 0x3C, 0xFE, 0x3E, 0x07, 0x91, 0xC7, 0x18, 0x73, 0x82, + 0x38, 0x23, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x01, 0xE0, 0x1E, + 0x40, 0xE4, 0x0E, 0x60, 0xCE, 0x1C, 0x9F, 0x00, 0x7F, 0xFE, 0xE7, 0x9D, + 0x0E, 0x16, 0x3C, 0x20, 0x78, 0x40, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x0F, 0x00, + 0x1E, 0x00, 0xFF, 0x00, 0x7F, 0x1F, 0x3C, 0x0E, 0x38, 0x04, 0x38, 0x0C, + 0x78, 0x08, 0x78, 0x08, 0x70, 0x08, 0x70, 0x10, 0xF0, 0x10, 0xF0, 0x10, + 0xF0, 0x10, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x40, 0x78, 0xC0, + 0x3F, 0x00, 0xFF, 0x1F, 0x3C, 0x06, 0x3C, 0x04, 0x3C, 0x08, 0x3C, 0x08, + 0x3C, 0x10, 0x1C, 0x20, 0x1C, 0x20, 0x1E, 0x40, 0x1E, 0x80, 0x1E, 0x80, + 0x1F, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x08, 0x00, 0xFE, 0x7C, + 0x79, 0xE1, 0xC1, 0x8F, 0x0E, 0x08, 0x78, 0x70, 0x43, 0xC7, 0x84, 0x1E, + 0x3E, 0x20, 0x72, 0xF2, 0x03, 0x97, 0x90, 0x1D, 0x1D, 0x00, 0xE8, 0xE8, + 0x07, 0x87, 0x80, 0x3C, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x0E, 0x00, 0x20, + 0x60, 0x01, 0x02, 0x00, 0x1F, 0xCF, 0x83, 0xC1, 0x81, 0xE1, 0x80, 0x71, + 0x80, 0x39, 0x80, 0x1F, 0x80, 0x07, 0x80, 0x03, 0x80, 0x01, 0xE0, 0x01, + 0xF0, 0x00, 0xB8, 0x00, 0x9C, 0x00, 0x8F, 0x00, 0x83, 0x80, 0xC1, 0xC0, + 0xE0, 0xF0, 0xF9, 0xFE, 0x00, 0xFE, 0x7C, 0xE0, 0x63, 0x81, 0x0F, 0x08, + 0x1C, 0x40, 0x71, 0x01, 0xE8, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, + 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0xFF, 0x00, 0x1F, + 0xFE, 0x38, 0x78, 0x60, 0xF1, 0x83, 0xC2, 0x0F, 0x00, 0x1E, 0x00, 0x78, + 0x01, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x47, + 0x81, 0x1F, 0x06, 0x3C, 0x3C, 0xFF, 0xF0, 0x07, 0xC1, 0x80, 0xE0, 0x30, + 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x06, 0x03, 0x80, 0xC0, 0x30, 0x0C, + 0x07, 0x01, 0xC0, 0x60, 0x18, 0x0E, 0x03, 0xE0, 0xC3, 0x06, 0x18, 0x61, + 0x83, 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x60, 0xC3, 0x0F, 0x81, 0xC0, 0xE0, + 0x60, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80, 0xC0, 0x60, + 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x1F, 0x00, 0x0C, 0x07, 0x81, 0xE0, 0xDC, + 0x33, 0x18, 0xC6, 0x1B, 0x06, 0xC0, 0xC0, 0xFF, 0xF0, 0xC7, 0x0C, 0x30, + 0x07, 0x70, 0xCE, 0x1C, 0xE3, 0x8E, 0x70, 0xC7, 0x0C, 0x71, 0xCE, 0x1C, + 0xE1, 0x8E, 0x79, 0xE9, 0xA7, 0x1C, 0x02, 0x07, 0xC0, 0x38, 0x06, 0x01, + 0xC0, 0x38, 0x06, 0x71, 0xF7, 0x38, 0xE7, 0x1C, 0xC3, 0xB8, 0x77, 0x1C, + 0xE3, 0xB8, 0xE7, 0x18, 0xE6, 0x0F, 0x80, 0x07, 0x0C, 0xCE, 0x66, 0x07, + 0x03, 0x83, 0x81, 0xC0, 0xE0, 0x70, 0xBC, 0x87, 0x80, 0x00, 0x08, 0x03, + 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x77, 0x03, 0x3C, 0x18, + 0xE0, 0xE3, 0x87, 0x0E, 0x1C, 0x70, 0x71, 0xC3, 0x87, 0x0E, 0x3C, 0x38, + 0xE8, 0xE5, 0xA1, 0xE7, 0x00, 0x07, 0x0C, 0xCE, 0x66, 0x37, 0x33, 0xBB, + 0xB1, 0xE0, 0xE0, 0x70, 0xB8, 0x87, 0x80, 0x00, 0x38, 0x01, 0xB0, 0x0C, + 0xC0, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x7E, 0x00, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x30, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xC0, 0x33, 0x00, 0xD8, 0x01, 0xC0, 0x00, 0x03, 0x80, + 0x73, 0xC7, 0x1C, 0x38, 0xE1, 0xCF, 0x06, 0x70, 0x1E, 0x01, 0x00, 0x1C, + 0x00, 0xF8, 0x07, 0xF0, 0xC7, 0x8C, 0x0C, 0x60, 0x63, 0x86, 0x07, 0xE0, + 0x01, 0x00, 0xF8, 0x01, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x31, 0xC3, + 0xBE, 0x1E, 0x70, 0xE3, 0x8F, 0x38, 0x71, 0xC3, 0x8E, 0x1C, 0xE1, 0xC7, + 0x0E, 0x3A, 0x71, 0xD3, 0x0F, 0x00, 0x1C, 0x71, 0xC0, 0x00, 0x6F, 0x8E, + 0x31, 0xC7, 0x18, 0x63, 0x8E, 0xBC, 0xE0, 0x00, 0xE0, 0x1C, 0x03, 0x80, + 0x00, 0x00, 0x0F, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x70, 0x0E, 0x01, 0xC0, + 0x38, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x01, 0xC3, 0x38, 0x6E, 0x07, 0x80, + 0x01, 0x00, 0xF8, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x33, 0xE3, + 0x8C, 0x1C, 0xC0, 0xE4, 0x06, 0x40, 0x7E, 0x03, 0xF0, 0x1D, 0x81, 0xCE, + 0x0E, 0x72, 0x71, 0xA3, 0x8E, 0x00, 0x06, 0x7C, 0x70, 0xE1, 0xC3, 0x0E, + 0x1C, 0x38, 0x61, 0xC3, 0x87, 0x0C, 0x38, 0x72, 0xE9, 0xE0, 0x3C, 0x73, + 0xC7, 0x7D, 0x71, 0xE7, 0x9C, 0xF1, 0xCE, 0x3C, 0xF3, 0x8E, 0x39, 0xC3, + 0x8E, 0x71, 0xC3, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xD7, 0x1C, 0x7B, 0x8E, + 0x1C, 0x3C, 0xF1, 0xD7, 0x1E, 0x73, 0xCE, 0x3C, 0xE3, 0x8E, 0x39, 0xC7, + 0x9C, 0x71, 0xC7, 0x1D, 0x71, 0xEE, 0x1C, 0x0F, 0x06, 0x63, 0x9D, 0xC7, + 0x71, 0xF8, 0x7E, 0x3F, 0x8E, 0xE3, 0xB9, 0xC6, 0x60, 0xF0, 0x0F, 0x38, + 0x1F, 0x70, 0x71, 0xC1, 0xC7, 0x0E, 0x1C, 0x38, 0xF0, 0xE3, 0x83, 0x8E, + 0x1C, 0x70, 0x71, 0xC1, 0xCE, 0x07, 0xE0, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x3F, 0x00, 0x07, 0x70, 0xCE, 0x18, 0xE3, 0x8E, 0x70, 0xE7, 0x1C, 0xF1, + 0xCE, 0x1C, 0xE3, 0x8E, 0x38, 0xE7, 0x87, 0xB0, 0x07, 0x00, 0x70, 0x0F, + 0x03, 0xF8, 0x0D, 0xDF, 0x71, 0xAC, 0xF0, 0x38, 0x0E, 0x03, 0x81, 0xC0, + 0x70, 0x1C, 0x0E, 0x00, 0x1D, 0x99, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x70, + 0x1C, 0x06, 0x23, 0x19, 0x17, 0x00, 0x0C, 0x10, 0xE3, 0xF3, 0x86, 0x1C, + 0x38, 0x71, 0xC3, 0x87, 0x0E, 0x9E, 0x38, 0x00, 0xF8, 0xE3, 0x8E, 0x38, + 0xC3, 0x9C, 0x71, 0xC7, 0x18, 0x71, 0x87, 0x38, 0xE3, 0x8E, 0xFA, 0xF3, + 0xAE, 0x3C, 0xF0, 0xDC, 0x33, 0x0C, 0xC2, 0x31, 0x8C, 0xC3, 0x60, 0xF0, + 0x38, 0x0C, 0x02, 0x00, 0xE0, 0x86, 0xE3, 0x0C, 0xC6, 0x19, 0x9C, 0x23, + 0x78, 0xC7, 0xF9, 0x0E, 0x74, 0x1C, 0xF0, 0x31, 0xC0, 0x43, 0x00, 0x84, + 0x00, 0x0E, 0x31, 0xF3, 0x83, 0xA0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, + 0x00, 0xE0, 0x0B, 0x02, 0x5D, 0x3C, 0xF1, 0xC3, 0x00, 0x04, 0x67, 0x8C, + 0x79, 0x87, 0x10, 0xE2, 0x1C, 0x81, 0x90, 0x3A, 0x07, 0x80, 0xF0, 0x1C, + 0x03, 0x00, 0x40, 0x08, 0x32, 0x07, 0x80, 0x3F, 0xCF, 0xE6, 0x30, 0x08, + 0x04, 0x02, 0x01, 0x00, 0xC0, 0x30, 0x1E, 0x0F, 0x98, 0x76, 0x07, 0x00, + 0x01, 0xE0, 0x70, 0x1C, 0x03, 0x80, 0x60, 0x1C, 0x03, 0x80, 0x60, 0x0C, + 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x00, 0x40, 0x0C, 0x01, 0x80, 0x70, 0x0E, + 0x01, 0xC0, 0x30, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xE0, + 0x18, 0x06, 0x01, 0x80, 0xE0, 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x1F, + 0x07, 0x03, 0x80, 0xE0, 0x30, 0x0C, 0x07, 0x01, 0x80, 0xE0, 0xE0, 0x00, + 0x38, 0x0F, 0xCD, 0x1F, 0x80, 0xE0 }; + +const GFXglyph FreeSerifBoldItalic12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 8, 17, 9, 2, -15 }, // 0x21 '!' + { 17, 9, 7, 13, 4, -15 }, // 0x22 '"' + { 25, 14, 16, 12, -1, -15 }, // 0x23 '#' + { 53, 12, 20, 12, 0, -17 }, // 0x24 '$' + { 83, 18, 18, 20, 1, -16 }, // 0x25 '%' + { 124, 16, 17, 19, 0, -15 }, // 0x26 '&' + { 158, 3, 7, 7, 3, -15 }, // 0x27 ''' + { 161, 7, 21, 8, 1, -15 }, // 0x28 '(' + { 180, 7, 21, 8, -1, -15 }, // 0x29 ')' + { 199, 10, 10, 12, 1, -15 }, // 0x2A '*' + { 212, 12, 12, 14, 1, -11 }, // 0x2B '+' + { 230, 5, 8, 6, -2, -3 }, // 0x2C ',' + { 235, 6, 3, 8, 0, -6 }, // 0x2D '-' + { 238, 4, 4, 6, 0, -2 }, // 0x2E '.' + { 240, 10, 16, 8, 0, -15 }, // 0x2F '/' + { 260, 11, 17, 12, 0, -15 }, // 0x30 '0' + { 284, 10, 17, 12, 0, -15 }, // 0x31 '1' + { 306, 11, 17, 12, 0, -15 }, // 0x32 '2' + { 330, 11, 17, 12, 0, -15 }, // 0x33 '3' + { 354, 13, 16, 12, 0, -15 }, // 0x34 '4' + { 380, 12, 17, 12, 0, -15 }, // 0x35 '5' + { 406, 11, 17, 12, 1, -15 }, // 0x36 '6' + { 430, 11, 16, 12, 2, -15 }, // 0x37 '7' + { 452, 11, 17, 12, 0, -15 }, // 0x38 '8' + { 476, 11, 17, 12, 0, -15 }, // 0x39 '9' + { 500, 7, 12, 6, 0, -10 }, // 0x3A ':' + { 511, 8, 15, 6, -1, -10 }, // 0x3B ';' + { 526, 12, 13, 14, 1, -12 }, // 0x3C '<' + { 546, 12, 6, 14, 2, -8 }, // 0x3D '=' + { 555, 13, 13, 14, 1, -12 }, // 0x3E '>' + { 577, 9, 17, 12, 2, -15 }, // 0x3F '?' + { 597, 17, 16, 20, 1, -15 }, // 0x40 '@' + { 631, 16, 17, 17, 0, -15 }, // 0x41 'A' + { 665, 16, 17, 15, 0, -15 }, // 0x42 'B' + { 699, 15, 17, 15, 1, -15 }, // 0x43 'C' + { 731, 18, 17, 17, 0, -15 }, // 0x44 'D' + { 770, 17, 17, 15, 0, -15 }, // 0x45 'E' + { 807, 16, 17, 15, 0, -15 }, // 0x46 'F' + { 841, 17, 17, 17, 1, -15 }, // 0x47 'G' + { 878, 20, 17, 18, 0, -15 }, // 0x48 'H' + { 921, 10, 17, 9, 0, -15 }, // 0x49 'I' + { 943, 14, 18, 12, 0, -15 }, // 0x4A 'J' + { 975, 17, 17, 16, 0, -15 }, // 0x4B 'K' + { 1012, 15, 17, 15, 0, -15 }, // 0x4C 'L' + { 1044, 23, 17, 21, 0, -15 }, // 0x4D 'M' + { 1093, 19, 17, 17, 0, -15 }, // 0x4E 'N' + { 1134, 16, 17, 16, 1, -15 }, // 0x4F 'O' + { 1168, 16, 17, 14, 0, -15 }, // 0x50 'P' + { 1202, 16, 21, 16, 1, -15 }, // 0x51 'Q' + { 1244, 16, 17, 16, 0, -15 }, // 0x52 'R' + { 1278, 12, 17, 12, 0, -15 }, // 0x53 'S' + { 1304, 15, 17, 14, 2, -15 }, // 0x54 'T' + { 1336, 16, 17, 17, 3, -15 }, // 0x55 'U' + { 1370, 16, 16, 17, 3, -15 }, // 0x56 'V' + { 1402, 21, 16, 22, 3, -15 }, // 0x57 'W' + { 1444, 17, 17, 17, 0, -15 }, // 0x58 'X' + { 1481, 14, 17, 15, 3, -15 }, // 0x59 'Y' + { 1511, 15, 17, 13, 0, -15 }, // 0x5A 'Z' + { 1543, 10, 20, 8, -1, -15 }, // 0x5B '[' + { 1568, 6, 16, 10, 3, -15 }, // 0x5C '\' + { 1580, 9, 20, 8, -1, -15 }, // 0x5D ']' + { 1603, 10, 9, 14, 2, -15 }, // 0x5E '^' + { 1615, 12, 1, 12, 0, 4 }, // 0x5F '_' + { 1617, 5, 4, 8, 2, -15 }, // 0x60 '`' + { 1620, 12, 12, 12, 0, -10 }, // 0x61 'a' + { 1638, 11, 18, 12, 1, -16 }, // 0x62 'b' + { 1663, 9, 12, 10, 1, -10 }, // 0x63 'c' + { 1677, 14, 18, 12, 0, -16 }, // 0x64 'd' + { 1709, 9, 12, 10, 1, -10 }, // 0x65 'e' + { 1723, 14, 22, 12, -2, -16 }, // 0x66 'f' + { 1762, 13, 16, 12, -1, -10 }, // 0x67 'g' + { 1788, 13, 18, 13, 0, -16 }, // 0x68 'h' + { 1818, 6, 17, 7, 1, -15 }, // 0x69 'i' + { 1831, 11, 21, 8, -2, -15 }, // 0x6A 'j' + { 1860, 13, 18, 12, 0, -16 }, // 0x6B 'k' + { 1890, 7, 18, 7, 1, -16 }, // 0x6C 'l' + { 1906, 18, 12, 18, 0, -10 }, // 0x6D 'm' + { 1933, 12, 12, 13, 0, -10 }, // 0x6E 'n' + { 1951, 10, 12, 11, 1, -10 }, // 0x6F 'o' + { 1966, 14, 16, 12, -2, -10 }, // 0x70 'p' + { 1994, 12, 16, 12, 0, -10 }, // 0x71 'q' + { 2018, 10, 11, 10, 0, -10 }, // 0x72 'r' + { 2032, 9, 12, 9, 0, -10 }, // 0x73 's' + { 2046, 7, 15, 7, 1, -13 }, // 0x74 't' + { 2060, 12, 12, 13, 1, -10 }, // 0x75 'u' + { 2078, 10, 11, 11, 1, -10 }, // 0x76 'v' + { 2092, 15, 11, 16, 1, -10 }, // 0x77 'w' + { 2113, 13, 12, 11, -1, -10 }, // 0x78 'x' + { 2133, 11, 16, 10, -1, -10 }, // 0x79 'y' + { 2155, 10, 13, 10, 0, -10 }, // 0x7A 'z' + { 2172, 11, 21, 8, 0, -16 }, // 0x7B '{' + { 2201, 2, 16, 6, 3, -15 }, // 0x7C '|' + { 2205, 10, 21, 8, -3, -16 }, // 0x7D '}' + { 2232, 11, 4, 14, 1, -7 } }; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic12pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic12pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2910 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h new file mode 100644 index 0000000..e24eea6 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h @@ -0,0 +1,500 @@ +const uint8_t FreeSerifBoldItalic18pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x3C, 0x07, + 0x80, 0xE0, 0x1C, 0x03, 0x00, 0x60, 0x0C, 0x03, 0x00, 0x60, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x81, 0xF8, 0x3F, 0x07, 0xE0, 0x78, 0x00, 0x38, + 0x1D, 0xE0, 0xF7, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC0, 0xE6, 0x03, 0x18, + 0x0C, 0x40, 0x23, 0x01, 0x80, 0x00, 0x38, 0x60, 0x07, 0x0E, 0x00, 0x70, + 0xC0, 0x06, 0x1C, 0x00, 0xE1, 0xC0, 0x0E, 0x38, 0x01, 0xC3, 0x81, 0xFF, + 0xFF, 0x1F, 0xFF, 0xE1, 0xFF, 0xFE, 0x03, 0x86, 0x00, 0x30, 0xE0, 0x07, + 0x0E, 0x00, 0x71, 0xC0, 0x0E, 0x1C, 0x0F, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, + 0xFF, 0xF0, 0x1C, 0x30, 0x01, 0x87, 0x00, 0x38, 0x70, 0x03, 0x0E, 0x00, + 0x70, 0xE0, 0x07, 0x0C, 0x00, 0xE1, 0xC0, 0x00, 0x00, 0x08, 0x00, 0x0C, + 0x00, 0x7E, 0x00, 0xFF, 0xC0, 0xF3, 0x70, 0x71, 0x9C, 0x70, 0xC6, 0x38, + 0x43, 0x1C, 0x61, 0x0F, 0x30, 0x87, 0xD8, 0x03, 0xF8, 0x00, 0xFE, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xDF, 0x10, 0x47, + 0x88, 0x63, 0xCC, 0x31, 0xE6, 0x10, 0xF3, 0x98, 0x71, 0xCC, 0x78, 0x7E, + 0x78, 0x07, 0xF8, 0x03, 0xF0, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x03, 0xC0, + 0x18, 0x01, 0xFE, 0x0F, 0x00, 0x7C, 0xFF, 0xC0, 0x1F, 0x0F, 0x98, 0x07, + 0xC1, 0x06, 0x00, 0xF8, 0x21, 0x80, 0x3E, 0x04, 0x30, 0x07, 0xC1, 0x8C, + 0x00, 0xF0, 0x21, 0x80, 0x1E, 0x0C, 0x60, 0x03, 0xC1, 0x0C, 0x00, 0x78, + 0xC3, 0x03, 0xC7, 0xF8, 0x61, 0xFC, 0x7C, 0x18, 0x7C, 0xC0, 0x06, 0x1F, + 0x08, 0x00, 0xC7, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x06, 0x3E, 0x04, 0x01, + 0x87, 0xC1, 0x00, 0x30, 0xF0, 0x20, 0x0C, 0x1E, 0x0C, 0x03, 0x03, 0xC1, + 0x00, 0x60, 0x3C, 0xC0, 0x18, 0x07, 0xF8, 0x03, 0x00, 0x7C, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0x38, 0x00, 0x0E, 0x0E, 0x00, + 0x0F, 0x07, 0x00, 0x07, 0x83, 0x80, 0x03, 0xC3, 0x80, 0x01, 0xE3, 0x80, + 0x00, 0xF7, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x7F, 0x0F, + 0xF0, 0xE7, 0x81, 0xE0, 0xE3, 0xE0, 0xE0, 0xE1, 0xF0, 0x60, 0xE0, 0x7C, + 0x60, 0xF0, 0x3E, 0x20, 0x78, 0x1F, 0xB0, 0x3C, 0x07, 0xF0, 0x1F, 0x03, + 0xF0, 0x0F, 0x80, 0xFC, 0x03, 0xF0, 0x7F, 0x8D, 0xFF, 0xEF, 0xFC, 0x7F, + 0xE3, 0xFC, 0x0F, 0xC0, 0x78, 0x00, 0x3B, 0xDE, 0xE7, 0x39, 0x8C, 0x46, + 0x00, 0x00, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1C, 0x07, 0x01, 0xE0, + 0x38, 0x0F, 0x01, 0xC0, 0x38, 0x0F, 0x01, 0xE0, 0x38, 0x07, 0x00, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x06, + 0x00, 0xC0, 0x08, 0x00, 0x80, 0x10, 0x00, 0x06, 0x00, 0x40, 0x04, 0x00, + 0x80, 0x18, 0x01, 0x00, 0x30, 0x06, 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x01, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x3C, + 0x07, 0x00, 0xE0, 0x38, 0x06, 0x01, 0xC0, 0x70, 0x18, 0x06, 0x01, 0x80, + 0x00, 0x07, 0x00, 0x38, 0x01, 0xC1, 0x8E, 0x3E, 0x23, 0xF9, 0x3F, 0xEB, + 0xE0, 0xE0, 0xFF, 0xF7, 0x93, 0xF8, 0x9F, 0x8E, 0x60, 0x70, 0x03, 0x80, + 0x08, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, + 0x00, 0x0E, 0x00, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x01, 0xC0, 0x00, 0x1C, 0x7C, 0xF9, 0xF1, 0xE1, 0xC3, 0x0C, 0x30, 0xC2, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x7B, 0xFF, 0xFF, 0x78, 0x00, 0x1C, + 0x00, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, + 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, + 0x03, 0x80, 0x0E, 0x00, 0x70, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x30, 0x1C, 0x30, + 0x78, 0x60, 0xE0, 0xE3, 0xC1, 0xCF, 0x83, 0x9E, 0x0F, 0x3C, 0x1E, 0xF8, + 0x3D, 0xE0, 0x7B, 0xC1, 0xFF, 0x83, 0xFF, 0x07, 0xBC, 0x0F, 0x78, 0x3E, + 0xF0, 0x7D, 0xE0, 0xF3, 0x81, 0xE7, 0x07, 0x8E, 0x0F, 0x0C, 0x3C, 0x18, + 0x70, 0x19, 0xC0, 0x1E, 0x00, 0x00, 0x06, 0x01, 0xF8, 0x1F, 0xF0, 0x03, + 0xE0, 0x07, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x03, 0xE0, + 0x07, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xE0, 0x07, + 0xC0, 0x0F, 0x80, 0x1F, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, + 0x0F, 0xC0, 0xFF, 0xF0, 0x00, 0xF8, 0x01, 0xFC, 0x03, 0xFE, 0x06, 0x3F, + 0x08, 0x1F, 0x18, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xC0, + 0x01, 0x80, 0x03, 0x00, 0x06, 0x02, 0x0C, 0x06, 0x08, 0x0C, 0x1F, 0xFC, + 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF8, 0x00, 0xF0, 0x07, 0xF8, 0x1F, 0xF0, + 0x61, 0xF0, 0x81, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x3C, 0x00, + 0xE0, 0x07, 0xC0, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80, 0x1F, 0x00, 0x1E, + 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xC0, 0x07, 0x9C, 0x0E, 0x3C, + 0x38, 0x7F, 0xE0, 0x7E, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x07, 0xE0, 0x02, 0xF8, 0x01, 0x3C, 0x00, + 0x9F, 0x00, 0x47, 0xC0, 0x31, 0xE0, 0x18, 0x78, 0x0C, 0x3E, 0x06, 0x0F, + 0x83, 0x03, 0xC1, 0x80, 0xF0, 0x7F, 0xFF, 0x1F, 0xFF, 0xCF, 0xFF, 0xF0, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0x7F, 0xE0, 0x60, 0x00, 0x30, 0x00, + 0x10, 0x00, 0x1F, 0x00, 0x0F, 0xE0, 0x0F, 0xF8, 0x07, 0xFE, 0x00, 0x3F, + 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1C, 0x00, + 0x0E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x87, 0x83, 0x83, 0xE3, 0x81, + 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0F, 0x80, 0x1F, 0x00, + 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1F, 0x00, + 0x1F, 0xF0, 0x1F, 0xFE, 0x0F, 0xCF, 0x07, 0xC3, 0xC7, 0xE1, 0xE3, 0xE0, + 0xF1, 0xF0, 0x78, 0xF8, 0x3C, 0x78, 0x3E, 0x3C, 0x1F, 0x1E, 0x0F, 0x0F, + 0x0F, 0x83, 0x87, 0x81, 0xE7, 0x80, 0x7F, 0x80, 0x0F, 0x80, 0x00, 0x3F, + 0xFF, 0x3F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFC, 0x60, 0x1C, 0x80, 0x38, 0x80, + 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x01, 0xC0, 0x03, + 0x80, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x1C, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0x00, + 0xF8, 0x00, 0xFF, 0x00, 0xE1, 0xC0, 0xE0, 0xF0, 0xF0, 0x38, 0x78, 0x1C, + 0x3C, 0x0E, 0x1F, 0x07, 0x0F, 0x87, 0x07, 0xE7, 0x01, 0xFF, 0x00, 0x7E, + 0x00, 0x1F, 0x80, 0x3F, 0xE0, 0x73, 0xF0, 0x70, 0xFC, 0x70, 0x3E, 0x70, + 0x0F, 0x38, 0x07, 0x9C, 0x03, 0xCE, 0x01, 0xE7, 0x00, 0xE1, 0xC0, 0xE0, + 0x70, 0xE0, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x01, 0xFF, 0x01, 0xF3, 0xC1, + 0xF0, 0xE1, 0xF0, 0x70, 0xF0, 0x3C, 0xF8, 0x1E, 0x7C, 0x0F, 0x3C, 0x0F, + 0x9E, 0x07, 0xCF, 0x03, 0xE7, 0x83, 0xF3, 0xC1, 0xF0, 0xF1, 0xF8, 0x3F, + 0xF8, 0x0F, 0xFC, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x3E, 0x00, + 0x3C, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x07, + 0x83, 0xF0, 0xFC, 0x3F, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x3F, 0x0F, 0xC3, 0xF0, 0x78, 0x00, 0x03, 0xC0, 0xFC, + 0x1F, 0x83, 0xF0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x03, 0xC0, 0x7C, 0x0F, 0x80, 0xF0, 0x0E, 0x01, 0x80, 0x30, 0x0C, + 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x7C, 0x00, + 0x7F, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0x3E, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xE0, 0x01, 0xFE, 0x00, + 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x0F, 0xC0, 0x00, 0xF0, 0x00, 0x04, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x38, 0x00, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xFC, 0x00, + 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0xFC, 0x00, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xFC, 0x00, 0xFC, 0x00, + 0x3C, 0x00, 0x08, 0x00, 0x00, 0x07, 0xC0, 0xFF, 0x0E, 0x3C, 0x70, 0xF3, + 0xC7, 0x8C, 0x3C, 0x01, 0xE0, 0x1F, 0x00, 0xF0, 0x07, 0x80, 0x78, 0x07, + 0x80, 0x30, 0x03, 0x00, 0x10, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x80, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0x78, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0xFF, 0xF8, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x03, 0x81, 0xC0, + 0x00, 0xE1, 0xC0, 0x18, 0x38, 0xE0, 0x3F, 0xCC, 0xE0, 0x3C, 0xE7, 0x70, + 0x3C, 0x71, 0xF0, 0x1C, 0x30, 0xF8, 0x1E, 0x38, 0x7C, 0x0E, 0x1C, 0x3E, + 0x0F, 0x0E, 0x1F, 0x07, 0x0E, 0x0F, 0x83, 0x87, 0x0D, 0xC1, 0xC7, 0x86, + 0x70, 0xE5, 0xC6, 0x38, 0x7C, 0xFE, 0x1C, 0x1C, 0x3E, 0x07, 0x00, 0x00, + 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x40, 0x1F, 0x00, 0xE0, 0x03, 0xFF, + 0xE0, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x17, 0xC0, 0x00, 0x67, 0x80, 0x00, 0x8F, + 0x00, 0x03, 0x1F, 0x00, 0x0C, 0x3E, 0x00, 0x10, 0x7C, 0x00, 0x60, 0xF8, + 0x00, 0x81, 0xF0, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0xE0, 0x18, 0x07, 0xC0, + 0x60, 0x0F, 0x81, 0xC0, 0x1F, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x7C, 0x3C, + 0x00, 0xFC, 0xFE, 0x0F, 0xFE, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, 0x01, + 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F, 0x01, 0xF0, 0x3F, 0x01, + 0xF0, 0x3F, 0x03, 0xE0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFC, 0x03, + 0xE3, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xC3, 0xE0, 0x07, 0xC1, 0xF8, 0x0F, + 0xC0, 0xF8, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x0F, 0x80, 0xFC, 0x1F, + 0x80, 0xFC, 0x1F, 0x01, 0xFC, 0x1F, 0x01, 0xF8, 0x1F, 0x03, 0xF0, 0x3F, + 0x0F, 0xE0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFE, 0x00, 0x00, 0x1F, 0x82, 0x01, + 0xFF, 0xE8, 0x07, 0xE0, 0xF0, 0x3F, 0x80, 0xE0, 0xFE, 0x00, 0xC1, 0xF8, + 0x01, 0x87, 0xE0, 0x02, 0x1F, 0x80, 0x04, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0xE0, 0x01, 0x07, 0xE0, 0x06, 0x07, 0xE0, 0x18, 0x07, + 0xE0, 0xE0, 0x07, 0xFF, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xFF, 0xE0, 0x01, + 0xFF, 0xFE, 0x00, 0x1F, 0x87, 0xE0, 0x07, 0xE0, 0x7C, 0x01, 0xF0, 0x1F, + 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x0F, 0x80, 0x3F, 0x03, 0xE0, + 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x3E, 0x00, 0xFC, 0x1F, 0x00, 0x3F, 0x07, + 0xC0, 0x0F, 0xC1, 0xF0, 0x07, 0xF0, 0xFC, 0x01, 0xF8, 0x3E, 0x00, 0x7E, + 0x0F, 0x80, 0x3F, 0x83, 0xE0, 0x0F, 0xC1, 0xF8, 0x07, 0xF0, 0x7C, 0x01, + 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x01, 0xFF, + 0xFF, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, + 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80, + 0x7C, 0x01, 0x01, 0xF8, 0x10, 0x03, 0xE0, 0x60, 0x07, 0xC3, 0x80, 0x0F, + 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0, + 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x10, 0x7E, 0x00, + 0x60, 0xF8, 0x01, 0xC1, 0xF0, 0x07, 0x03, 0xE0, 0x1E, 0x0F, 0xC0, 0xFC, + 0x3F, 0xFF, 0xF8, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFE, 0x03, 0xFF, 0xFC, + 0x07, 0xE0, 0x78, 0x0F, 0xC0, 0x60, 0x1F, 0x00, 0x40, 0x3E, 0x00, 0x80, + 0x7C, 0x01, 0x01, 0xF8, 0x20, 0x03, 0xE0, 0xC0, 0x07, 0xC3, 0x80, 0x0F, + 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x7C, 0x38, 0x00, 0xF8, 0x30, 0x03, 0xF0, + 0x60, 0x07, 0xC0, 0x80, 0x0F, 0x81, 0x00, 0x1F, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, + 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0xFF, 0xF6, + 0x01, 0xF8, 0x3C, 0x03, 0xE0, 0x1C, 0x0F, 0xC0, 0x0C, 0x0F, 0xC0, 0x08, + 0x1F, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFC, 0x03, 0xFF, + 0xFC, 0x00, 0xFC, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8, 0xFC, 0x00, 0xF8, + 0xFC, 0x00, 0xF0, 0x7C, 0x01, 0xF0, 0x7E, 0x01, 0xF0, 0x3E, 0x01, 0xF0, + 0x1F, 0x83, 0xE0, 0x0F, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x3F, + 0xF8, 0x0F, 0xE0, 0x7F, 0x00, 0x7E, 0x01, 0xF8, 0x03, 0xF0, 0x0F, 0x80, + 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x07, 0xE0, 0x07, 0xC0, 0x3E, 0x00, 0x7E, + 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0xF8, 0x00, 0xF8, 0x07, + 0xC0, 0x0F, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xF0, 0x03, 0xE0, 0x1F, 0x00, + 0x3F, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x7E, 0x00, 0x7C, + 0x03, 0xE0, 0x07, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x01, 0xF0, 0x0F, + 0xC0, 0x0F, 0x80, 0x7C, 0x00, 0xFC, 0x03, 0xE0, 0x0F, 0xE0, 0x3F, 0x80, + 0xFF, 0xC7, 0xFF, 0x00, 0x07, 0xFE, 0x03, 0xF8, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, + 0x80, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, + 0x1F, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0xC0, 0x3F, + 0x80, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x01, 0xFE, 0x00, 0x0F, 0xC0, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, + 0x07, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0xC0, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x61, 0xF0, + 0x0F, 0x3F, 0x00, 0xE7, 0xE0, 0x07, 0xFC, 0x00, 0x3F, 0x00, 0x00, 0x07, + 0xFF, 0x3F, 0x80, 0xFE, 0x07, 0x80, 0x7E, 0x03, 0x00, 0x3F, 0x03, 0x00, + 0x1F, 0x03, 0x00, 0x0F, 0x83, 0x00, 0x07, 0xC3, 0x00, 0x07, 0xE3, 0x00, + 0x03, 0xE3, 0x00, 0x01, 0xF3, 0x00, 0x00, 0xFB, 0x80, 0x00, 0xFB, 0xC0, + 0x00, 0x7F, 0xE0, 0x00, 0x3E, 0xF8, 0x00, 0x3F, 0x7C, 0x00, 0x1F, 0x1F, + 0x00, 0x0F, 0x8F, 0x80, 0x07, 0xC7, 0xE0, 0x07, 0xE1, 0xF0, 0x03, 0xE0, + 0xFC, 0x01, 0xF0, 0x3E, 0x00, 0xF8, 0x1F, 0x00, 0xFC, 0x07, 0xC0, 0xFE, + 0x07, 0xF0, 0xFF, 0xCF, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x07, 0xF0, 0x00, + 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, + 0x00, 0x00, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, + 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x11, 0xF0, 0x00, 0xC7, 0xC0, + 0x06, 0x1F, 0x00, 0x38, 0x7C, 0x01, 0xE3, 0xF0, 0x3F, 0x9F, 0xFF, 0xFC, + 0xFF, 0xFF, 0xF0, 0x07, 0xF8, 0x00, 0x7F, 0x80, 0xFC, 0x00, 0x3F, 0x80, + 0x3E, 0x00, 0x3F, 0x80, 0x1F, 0x00, 0x3F, 0x80, 0x1F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x1B, 0xE0, 0x07, 0xF0, 0x0D, 0xF0, 0x02, 0xF8, 0x0D, 0xF0, + 0x03, 0x7C, 0x0C, 0xF8, 0x01, 0xBE, 0x06, 0x7C, 0x00, 0xDF, 0x06, 0x7C, + 0x00, 0xCF, 0x83, 0x3E, 0x00, 0x67, 0xC3, 0x1F, 0x00, 0x31, 0xE3, 0x0F, + 0x80, 0x38, 0xF9, 0x8F, 0x80, 0x18, 0x7D, 0x87, 0xC0, 0x0C, 0x3F, 0x83, + 0xE0, 0x06, 0x1F, 0xC1, 0xF0, 0x06, 0x0F, 0xC1, 0xF0, 0x03, 0x07, 0xC0, + 0xF8, 0x01, 0x83, 0xE0, 0x7C, 0x01, 0xC0, 0xE0, 0x7E, 0x00, 0xE0, 0x70, + 0x3F, 0x00, 0xF8, 0x30, 0x3F, 0x80, 0xFF, 0x10, 0x7F, 0xF0, 0x00, 0x07, + 0xF0, 0x0F, 0xE0, 0x3E, 0x00, 0x78, 0x07, 0xE0, 0x06, 0x00, 0x7C, 0x00, + 0xC0, 0x1F, 0xC0, 0x10, 0x03, 0xF8, 0x06, 0x00, 0x6F, 0x80, 0xC0, 0x19, + 0xF0, 0x10, 0x03, 0x3F, 0x02, 0x00, 0x63, 0xE0, 0xC0, 0x0C, 0x7C, 0x18, + 0x03, 0x07, 0xC2, 0x00, 0x60, 0xF8, 0x40, 0x0C, 0x0F, 0x98, 0x03, 0x81, + 0xF3, 0x00, 0x60, 0x3F, 0x40, 0x0C, 0x03, 0xF8, 0x01, 0x80, 0x7F, 0x00, + 0x60, 0x07, 0xC0, 0x0C, 0x00, 0xF8, 0x01, 0x80, 0x0F, 0x00, 0x70, 0x01, + 0xE0, 0x0E, 0x00, 0x18, 0x03, 0xE0, 0x03, 0x00, 0x02, 0x00, 0x60, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0, + 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F, + 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xE0, 0x03, 0xF7, 0xC0, + 0x07, 0xDF, 0x80, 0x1F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01, + 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x0F, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C, + 0x0F, 0x81, 0xF0, 0x0F, 0x87, 0xC0, 0x0F, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xFF, 0xE0, 0x03, 0xFF, 0xF0, 0x07, 0xE3, 0xF0, 0x0F, 0x83, 0xE0, + 0x1F, 0x07, 0xE0, 0x3E, 0x0F, 0xC0, 0x7C, 0x1F, 0x81, 0xF0, 0x3F, 0x03, + 0xE0, 0xFE, 0x07, 0xC1, 0xF8, 0x0F, 0x87, 0xF0, 0x3E, 0x1F, 0xC0, 0x7F, + 0xFE, 0x00, 0xFF, 0xF0, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x80, + 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xF0, 0x00, + 0x03, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0xFF, 0xC0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0xFF, 0xC0, 0x07, 0xC3, 0xE0, 0x1F, 0x03, 0xC0, + 0x7C, 0x03, 0xC1, 0xF0, 0x07, 0x87, 0xE0, 0x0F, 0x8F, 0x80, 0x1F, 0x3F, + 0x00, 0x3E, 0x7C, 0x00, 0x7D, 0xF8, 0x01, 0xFB, 0xF0, 0x03, 0xF7, 0xC0, + 0x07, 0xDF, 0x80, 0x0F, 0xBF, 0x00, 0x3F, 0x7C, 0x00, 0x7C, 0xF8, 0x01, + 0xF9, 0xF0, 0x03, 0xE3, 0xE0, 0x07, 0xC7, 0xC0, 0x1F, 0x07, 0x80, 0x7C, + 0x0F, 0x01, 0xF0, 0x0F, 0x07, 0x80, 0x07, 0xFE, 0x00, 0x03, 0x80, 0x00, + 0x0C, 0x00, 0x00, 0x3C, 0x00, 0x20, 0xFF, 0xC1, 0x87, 0xFF, 0xFE, 0x1E, + 0xFF, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xFF, 0xE0, 0x01, 0xFF, 0xFC, + 0x01, 0xF8, 0x7E, 0x01, 0xF8, 0x3F, 0x01, 0xF8, 0x3F, 0x01, 0xF0, 0x3F, + 0x01, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xE0, 0x7E, 0x03, 0xE0, 0xFE, + 0x03, 0xE1, 0xF8, 0x07, 0xFF, 0xF0, 0x07, 0xFF, 0x80, 0x07, 0xDF, 0xC0, + 0x0F, 0xCF, 0xC0, 0x0F, 0xCF, 0xC0, 0x0F, 0x8F, 0xE0, 0x0F, 0x87, 0xE0, + 0x1F, 0x87, 0xE0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0, 0x1F, 0x03, 0xF0, + 0x3F, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0xE1, 0xFE, 0x00, 0xF8, 0x40, + 0xFF, 0xB0, 0x38, 0x3C, 0x1C, 0x07, 0x0F, 0x01, 0xC3, 0xC0, 0x20, 0xF0, + 0x08, 0x3E, 0x02, 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x0F, 0xE0, + 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x00, + 0x03, 0xC4, 0x00, 0xF1, 0x00, 0x3C, 0x60, 0x0F, 0x38, 0x07, 0x8F, 0x83, + 0xC2, 0x3F, 0xE0, 0x83, 0xF0, 0x00, 0x3F, 0xFF, 0xF9, 0xFF, 0xFF, 0xCF, + 0x1F, 0x1E, 0x70, 0xF8, 0x77, 0x0F, 0x83, 0x30, 0x7C, 0x09, 0x03, 0xE0, + 0x40, 0x3F, 0x02, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x07, + 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, + 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00, + 0x7F, 0xF0, 0xFF, 0x1F, 0xC0, 0x3E, 0x1F, 0x80, 0x1C, 0x1F, 0x80, 0x18, + 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x18, 0x1F, 0x00, 0x30, 0x3F, 0x00, 0x30, + 0x3E, 0x00, 0x30, 0x3E, 0x00, 0x30, 0x7E, 0x00, 0x60, 0x7C, 0x00, 0x60, + 0x7C, 0x00, 0x60, 0x7C, 0x00, 0xC0, 0x7C, 0x00, 0xC0, 0xF8, 0x00, 0xC0, + 0xF8, 0x00, 0xC0, 0xF8, 0x01, 0x80, 0xF8, 0x01, 0x80, 0xF8, 0x03, 0x80, + 0xF8, 0x03, 0x00, 0x7C, 0x06, 0x00, 0x7E, 0x1E, 0x00, 0x3F, 0xF8, 0x00, + 0x0F, 0xE0, 0x00, 0xFF, 0xE0, 0x7F, 0x3F, 0x80, 0x1C, 0x1F, 0x80, 0x18, + 0x1F, 0x80, 0x18, 0x1F, 0x80, 0x30, 0x1F, 0x80, 0x30, 0x0F, 0x80, 0x60, + 0x0F, 0x80, 0x40, 0x0F, 0x80, 0xC0, 0x0F, 0x81, 0x80, 0x0F, 0x81, 0x00, + 0x0F, 0xC3, 0x00, 0x0F, 0xC6, 0x00, 0x07, 0xC6, 0x00, 0x07, 0xCC, 0x00, + 0x07, 0xC8, 0x00, 0x07, 0xD8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x03, 0x80, 0x00, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0xFF, 0xCF, 0xF8, 0x7E, 0x7F, 0x07, + 0xE0, 0x38, 0x7C, 0x07, 0x80, 0x60, 0xF8, 0x0F, 0x00, 0x81, 0xF0, 0x1E, + 0x03, 0x03, 0xE0, 0x3E, 0x04, 0x07, 0xE0, 0xFC, 0x18, 0x07, 0xC1, 0xF8, + 0x20, 0x0F, 0x87, 0xF0, 0xC0, 0x1F, 0x0B, 0xE1, 0x00, 0x3E, 0x37, 0xC6, + 0x00, 0x7C, 0x47, 0x88, 0x00, 0xF9, 0x8F, 0x30, 0x01, 0xF2, 0x1F, 0x40, + 0x03, 0xEC, 0x3E, 0x80, 0x03, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0xFC, 0x00, + 0x0F, 0x81, 0xF8, 0x00, 0x1F, 0x03, 0xE0, 0x00, 0x3C, 0x07, 0xC0, 0x00, + 0x78, 0x07, 0x00, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0xC0, 0x18, 0x00, 0x01, + 0x80, 0x30, 0x00, 0x02, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x3F, 0x81, 0xFC, + 0x07, 0x80, 0x7C, 0x03, 0x00, 0x3F, 0x03, 0x00, 0x0F, 0x83, 0x80, 0x07, + 0xC1, 0x80, 0x03, 0xE1, 0x80, 0x00, 0xF9, 0x80, 0x00, 0x7D, 0x80, 0x00, + 0x3F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x03, 0xE0, 0x00, + 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xBE, 0x00, 0x00, 0xCF, 0x00, + 0x00, 0xC7, 0xC0, 0x00, 0xC3, 0xE0, 0x00, 0xC1, 0xF0, 0x00, 0xC0, 0x7C, + 0x00, 0xE0, 0x3E, 0x00, 0xE0, 0x1F, 0x00, 0xF8, 0x1F, 0xE0, 0xFF, 0x1F, + 0xF8, 0x00, 0xFF, 0xC3, 0xF9, 0xF8, 0x07, 0x87, 0xC0, 0x38, 0x3E, 0x01, + 0x81, 0xF0, 0x18, 0x07, 0xC0, 0x80, 0x3E, 0x0C, 0x01, 0xF0, 0xC0, 0x07, + 0xC4, 0x00, 0x3E, 0x60, 0x01, 0xF6, 0x00, 0x07, 0xA0, 0x00, 0x3F, 0x00, + 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0xFC, 0x00, 0x07, 0xC0, 0x00, 0x3E, + 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, + 0x7E, 0x00, 0x07, 0xF0, 0x00, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xF8, 0x3F, + 0xFF, 0xC3, 0xE0, 0x7E, 0x1C, 0x07, 0xE0, 0xC0, 0x3E, 0x0C, 0x03, 0xF0, + 0x40, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x1F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x00, + 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x83, 0xE0, 0x0C, 0x3F, 0x00, + 0xC3, 0xF0, 0x0E, 0x1F, 0x00, 0xF1, 0xF8, 0x1F, 0x9F, 0xFF, 0xF8, 0xFF, + 0xFF, 0xC0, 0x01, 0xFC, 0x0F, 0xE0, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x1E, + 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x01, 0xE0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, + 0x00, 0x38, 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xFF, 0x03, 0xF8, 0x00, 0xE0, 0x38, 0x07, 0x01, 0xC0, + 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, + 0x80, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, 0x80, 0xE0, 0x38, + 0x07, 0x01, 0xC0, 0x03, 0xFC, 0x0F, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x38, + 0x00, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, 0x3C, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x1C, + 0x00, 0xF0, 0x03, 0xC0, 0xFE, 0x03, 0xF8, 0x00, 0x03, 0xC0, 0x03, 0xC0, + 0x07, 0xE0, 0x07, 0xE0, 0x0E, 0x70, 0x0E, 0x70, 0x1C, 0x78, 0x1C, 0x38, + 0x3C, 0x3C, 0x38, 0x1C, 0x78, 0x1E, 0x70, 0x0E, 0xF0, 0x0E, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE1, 0xE3, 0xC1, 0xC1, 0xC0, 0xC0, 0x00, + 0xF7, 0x80, 0xFD, 0xE0, 0x7C, 0xF0, 0x3C, 0x3C, 0x1E, 0x0F, 0x0F, 0x83, + 0x83, 0xC1, 0xE1, 0xE0, 0x78, 0x78, 0x1C, 0x3E, 0x0F, 0x0F, 0x03, 0xC3, + 0xC1, 0xF0, 0xF0, 0xFC, 0xFE, 0x6F, 0x6F, 0xF3, 0xF1, 0xF8, 0xF8, 0x3C, + 0x1C, 0x00, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0x80, + 0x07, 0x80, 0x0F, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x3C, 0x1E, 0xFE, + 0x1F, 0x9F, 0x1F, 0x0F, 0x1E, 0x0F, 0x3E, 0x0F, 0x3C, 0x0F, 0x3C, 0x1F, + 0x78, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x78, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, + 0xF1, 0xE0, 0x7F, 0xC0, 0x3F, 0x00, 0x01, 0xF0, 0x3F, 0xC3, 0xCE, 0x3C, + 0xF3, 0xC7, 0x1E, 0x01, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x03, 0x78, 0x31, 0xE3, 0x0F, 0xF0, 0x1E, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F, + 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x01, 0xEF, 0x00, 0x7F, 0xE0, 0x3E, 0x7C, + 0x07, 0x8F, 0x01, 0xE1, 0xE0, 0x78, 0x3C, 0x0F, 0x0F, 0x83, 0xC1, 0xE0, + 0x78, 0x3C, 0x1E, 0x0F, 0x83, 0xC1, 0xF0, 0x78, 0x7C, 0x0F, 0x0F, 0x91, + 0xE3, 0xF6, 0x3F, 0xDF, 0x83, 0xF3, 0xE0, 0x3C, 0x38, 0x00, 0x01, 0xE0, + 0x3F, 0x83, 0xCE, 0x3C, 0x73, 0xC3, 0x9E, 0x1D, 0xE1, 0xCF, 0x1C, 0xFB, + 0xC7, 0xF8, 0x3C, 0x01, 0xE0, 0x0F, 0x02, 0x78, 0x31, 0xE3, 0x0F, 0xF0, + 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x1D, 0xC0, 0x01, 0xCE, 0x00, 0x1C, + 0x70, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0x3C, 0x00, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, + 0x00, 0x0F, 0x00, 0x0E, 0x70, 0x00, 0x77, 0x80, 0x03, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFC, 0x1F, 0x1F, 0x87, 0xC3, 0xC1, + 0xF0, 0x78, 0x3C, 0x1F, 0x07, 0x83, 0xE0, 0xF0, 0xF8, 0x0E, 0x3E, 0x01, + 0xFF, 0x80, 0x3F, 0xC0, 0x0C, 0x00, 0x03, 0xC0, 0x00, 0x7F, 0x80, 0x0F, + 0xFE, 0x00, 0x7F, 0xF0, 0x70, 0xFF, 0x1C, 0x03, 0xE3, 0x80, 0x3C, 0x70, + 0x07, 0x0F, 0x03, 0xE0, 0xFF, 0xF0, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x03, + 0xE0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x1F, 0x00, 0x0F, 0x0E, 0x07, 0x9F, 0x83, 0xDF, 0xC3, 0xE9, 0xE1, 0xE8, + 0xF0, 0xF8, 0xF8, 0x7C, 0x78, 0x7C, 0x3C, 0x3E, 0x3E, 0x1E, 0x1E, 0x1F, + 0x0F, 0x0F, 0x0F, 0x87, 0x87, 0xCB, 0xC3, 0xCB, 0xE1, 0xE9, 0xE0, 0xFC, + 0xF0, 0x38, 0x00, 0x03, 0x03, 0xC1, 0xE0, 0xF0, 0x30, 0x00, 0x00, 0x00, + 0x07, 0x3F, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0xF0, 0x78, 0x3C, 0x1E, 0x1E, + 0x0F, 0x27, 0x17, 0x93, 0xF1, 0xF8, 0x70, 0x00, 0x00, 0x06, 0x00, 0x0F, + 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0xFE, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, + 0x00, 0x7C, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0xF0, 0x01, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x03, 0xC0, 0xE3, 0xC0, 0xE7, 0x80, 0xFF, 0x00, 0x7C, 0x00, 0x1F, 0xC0, + 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, + 0x00, 0x1F, 0x00, 0x0F, 0x3F, 0x87, 0x87, 0x83, 0xC3, 0x03, 0xE3, 0x01, + 0xE3, 0x00, 0xF3, 0x00, 0x7B, 0x80, 0x7B, 0xC0, 0x3F, 0xE0, 0x1E, 0xF0, + 0x1F, 0x78, 0x0F, 0x1E, 0x07, 0x8F, 0x13, 0xC7, 0x93, 0xE1, 0xF9, 0xE0, + 0xF8, 0xF0, 0x38, 0x00, 0x1F, 0xC0, 0xF8, 0x1F, 0x03, 0xC0, 0x78, 0x1F, + 0x03, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, + 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x8F, 0x31, 0xEC, 0x3F, 0x07, + 0xC0, 0x70, 0x00, 0x01, 0x87, 0x07, 0x0F, 0xE7, 0xE7, 0xE0, 0xF3, 0xF9, + 0xF8, 0x3D, 0x9E, 0x9E, 0x0F, 0x47, 0xC7, 0x83, 0xE1, 0xD1, 0xE1, 0xF8, + 0xF8, 0xF0, 0x7C, 0x3C, 0x3C, 0x1F, 0x0F, 0x1F, 0x0F, 0x87, 0xC7, 0x83, + 0xE1, 0xE1, 0xE0, 0xF0, 0x78, 0x78, 0x3C, 0x1E, 0x3C, 0x1F, 0x0F, 0x0F, + 0x27, 0x83, 0xC3, 0xD1, 0xE0, 0xF0, 0xFC, 0xF8, 0x78, 0x1C, 0x00, 0x01, + 0x8F, 0x0F, 0xE7, 0xE0, 0xF3, 0xF8, 0x3C, 0x9E, 0x0F, 0x47, 0x87, 0xA3, + 0xC1, 0xE8, 0xF0, 0x7C, 0x3C, 0x1E, 0x1E, 0x0F, 0x87, 0x83, 0xE1, 0xE0, + 0xF0, 0xF8, 0x3C, 0x3C, 0x1F, 0x0F, 0x27, 0x83, 0xD1, 0xE0, 0xFC, 0x78, + 0x1C, 0x00, 0x01, 0xF0, 0x0E, 0x30, 0x38, 0x70, 0xF0, 0xF3, 0xC1, 0xE7, + 0x83, 0xDE, 0x07, 0xBC, 0x1F, 0xF8, 0x3F, 0xE0, 0x7B, 0xC0, 0xF7, 0x83, + 0xCF, 0x07, 0x9E, 0x1E, 0x1C, 0x38, 0x1C, 0xE0, 0x1F, 0x00, 0x00, 0xE3, + 0x80, 0xFD, 0xF8, 0x0F, 0xFF, 0x81, 0xE8, 0xF0, 0x3E, 0x1E, 0x07, 0x83, + 0xC0, 0xF0, 0x78, 0x3E, 0x1F, 0x07, 0x83, 0xC0, 0xF0, 0x78, 0x1E, 0x1F, + 0x07, 0x83, 0xC0, 0xF0, 0xF8, 0x1E, 0x1E, 0x03, 0xC7, 0x80, 0xFF, 0xE0, + 0x1E, 0xF0, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, + 0xF8, 0x00, 0x3F, 0xC0, 0x00, 0x01, 0xEF, 0x07, 0xFF, 0x0F, 0x1E, 0x1E, + 0x1E, 0x1E, 0x1E, 0x3C, 0x1E, 0x7C, 0x3C, 0x78, 0x3C, 0x78, 0x3C, 0xF0, + 0x7C, 0xF0, 0x78, 0xF0, 0xF8, 0xF0, 0xF8, 0xF1, 0xF0, 0xFE, 0xF0, 0x7E, + 0xF0, 0x39, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x03, + 0xC0, 0x1F, 0xF8, 0x03, 0x9C, 0x7F, 0x7C, 0x3D, 0xF8, 0x7A, 0xE0, 0xF8, + 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF0, 0x01, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1E, 0x00, 0x7C, 0x00, 0x07, 0x18, 0xFF, + 0xC7, 0x1C, 0x70, 0x63, 0x81, 0x1E, 0x08, 0xF8, 0x07, 0xE0, 0x1F, 0x00, + 0x7C, 0x01, 0xF0, 0x07, 0x84, 0x3C, 0x20, 0xE1, 0x87, 0x1C, 0x70, 0x9E, + 0x00, 0x00, 0x80, 0x60, 0x30, 0x1C, 0x1F, 0x1F, 0xF7, 0xFC, 0x78, 0x1E, + 0x07, 0x83, 0xC0, 0xF0, 0x3C, 0x1F, 0x07, 0x81, 0xE0, 0x79, 0x3C, 0x4F, + 0x23, 0xF0, 0xFC, 0x1C, 0x00, 0x0F, 0x0F, 0x3F, 0x87, 0x8F, 0x83, 0xC7, + 0xC1, 0xE3, 0xE1, 0xE1, 0xE0, 0xF0, 0xF0, 0x78, 0xF8, 0x78, 0x78, 0x3C, + 0x3C, 0x3E, 0x1E, 0x1F, 0x1E, 0x1F, 0x0F, 0x17, 0x97, 0x9B, 0xCB, 0xF9, + 0xF9, 0xF8, 0xF8, 0x78, 0x38, 0x00, 0x18, 0x37, 0xC3, 0xDE, 0x1E, 0x78, + 0x73, 0xC1, 0x9E, 0x08, 0xF0, 0xC7, 0x84, 0x3C, 0x41, 0xE4, 0x0F, 0x40, + 0x7C, 0x03, 0xC0, 0x1C, 0x00, 0xC0, 0x04, 0x00, 0x38, 0x10, 0xDF, 0x06, + 0x3D, 0xE0, 0xC7, 0xBC, 0x38, 0x73, 0xC7, 0x06, 0x79, 0xF0, 0x8F, 0x3E, + 0x11, 0xEB, 0xC4, 0x3F, 0x79, 0x07, 0xCF, 0x60, 0xF9, 0xE8, 0x1E, 0x3E, + 0x03, 0x87, 0x80, 0x70, 0xF0, 0x0C, 0x0C, 0x01, 0x01, 0x00, 0x03, 0x83, + 0x87, 0xF1, 0xF0, 0x3C, 0xF8, 0x0F, 0x60, 0x03, 0xD0, 0x00, 0xF8, 0x00, + 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x0F, + 0xC0, 0x02, 0xF1, 0x39, 0x3C, 0xCF, 0xCF, 0xE3, 0xE1, 0xF0, 0x70, 0x38, + 0x00, 0x01, 0x83, 0x07, 0xE3, 0xC1, 0xF1, 0xE0, 0x78, 0xF0, 0x3E, 0x18, + 0x1F, 0x08, 0x07, 0x84, 0x03, 0xC6, 0x01, 0xE2, 0x00, 0xFB, 0x00, 0x3D, + 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xE0, 0x00, 0x60, 0x00, 0x60, 0x0E, 0x60, 0x0F, 0xE0, 0x07, 0xE0, 0x01, + 0xC0, 0x00, 0x1F, 0xFC, 0x3F, 0xF8, 0x7F, 0xE1, 0x81, 0x82, 0x06, 0x00, + 0x08, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x40, + 0x01, 0x80, 0x07, 0xC0, 0x1F, 0x86, 0x3F, 0x8E, 0xCF, 0x9C, 0x07, 0x30, + 0x03, 0xC0, 0x00, 0x1E, 0x00, 0xF8, 0x03, 0xC0, 0x0F, 0x00, 0x1E, 0x00, + 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x78, 0x01, 0xE0, 0x03, 0xC0, 0x1F, 0x00, 0x7E, 0x00, 0x30, 0x00, + 0x60, 0x00, 0xE0, 0x01, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x38, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, + 0x00, 0xF0, 0x00, 0x70, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xE0, 0x03, 0xC0, 0x07, + 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x00, 0xF0, 0x03, 0xF0, + 0x0F, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, + 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x70, 0x01, 0xE0, 0x0F, 0x80, 0x7C, 0x00, + 0x3E, 0x00, 0x7F, 0xC6, 0xFF, 0xFF, 0x61, 0xFE, 0x00, 0x7C }; + +const GFXglyph FreeSerifBoldItalic18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' + { 0, 11, 25, 14, 2, -23 }, // 0x21 '!' + { 35, 14, 10, 19, 4, -23 }, // 0x22 '"' + { 53, 20, 25, 17, -1, -24 }, // 0x23 '#' + { 116, 17, 29, 18, 0, -25 }, // 0x24 '$' + { 178, 27, 25, 29, 1, -23 }, // 0x25 '%' + { 263, 25, 25, 27, 0, -23 }, // 0x26 '&' + { 342, 5, 10, 10, 4, -23 }, // 0x27 ''' + { 349, 11, 30, 12, 1, -23 }, // 0x28 '(' + { 391, 11, 30, 12, -2, -23 }, // 0x29 ')' + { 433, 13, 15, 18, 2, -23 }, // 0x2A '*' + { 458, 17, 17, 20, 1, -16 }, // 0x2B '+' + { 495, 7, 11, 9, -2, -4 }, // 0x2C ',' + { 505, 9, 4, 12, 0, -9 }, // 0x2D '-' + { 510, 6, 5, 9, 0, -3 }, // 0x2E '.' + { 514, 14, 25, 12, 0, -23 }, // 0x2F '/' + { 558, 15, 25, 18, 1, -23 }, // 0x30 '0' + { 605, 15, 25, 17, 0, -23 }, // 0x31 '1' + { 652, 16, 25, 18, 0, -23 }, // 0x32 '2' + { 702, 15, 25, 17, 1, -23 }, // 0x33 '3' + { 749, 18, 24, 17, 0, -23 }, // 0x34 '4' + { 803, 17, 25, 18, 0, -23 }, // 0x35 '5' + { 857, 17, 25, 18, 1, -23 }, // 0x36 '6' + { 911, 16, 24, 17, 3, -23 }, // 0x37 '7' + { 959, 17, 25, 18, 0, -23 }, // 0x38 '8' + { 1013, 17, 25, 18, 0, -23 }, // 0x39 '9' + { 1067, 10, 17, 9, 0, -15 }, // 0x3A ':' + { 1089, 11, 22, 9, -1, -15 }, // 0x3B ';' + { 1120, 18, 19, 20, 1, -18 }, // 0x3C '<' + { 1163, 18, 10, 20, 2, -13 }, // 0x3D '=' + { 1186, 18, 19, 20, 2, -18 }, // 0x3E '>' + { 1229, 13, 25, 17, 3, -23 }, // 0x3F '?' + { 1270, 25, 25, 29, 2, -23 }, // 0x40 '@' + { 1349, 23, 25, 24, 0, -23 }, // 0x41 'A' + { 1421, 24, 25, 22, 0, -23 }, // 0x42 'B' + { 1496, 23, 25, 22, 1, -23 }, // 0x43 'C' + { 1568, 26, 25, 25, 0, -23 }, // 0x44 'D' + { 1650, 23, 25, 22, 0, -23 }, // 0x45 'E' + { 1722, 23, 25, 21, 0, -23 }, // 0x46 'F' + { 1794, 24, 25, 25, 2, -23 }, // 0x47 'G' + { 1869, 29, 25, 26, 0, -23 }, // 0x48 'H' + { 1960, 15, 25, 13, 0, -23 }, // 0x49 'I' + { 2007, 20, 27, 17, 0, -23 }, // 0x4A 'J' + { 2075, 25, 25, 23, 0, -23 }, // 0x4B 'K' + { 2154, 22, 25, 21, 0, -23 }, // 0x4C 'L' + { 2223, 33, 25, 31, 0, -23 }, // 0x4D 'M' + { 2327, 27, 25, 25, 0, -23 }, // 0x4E 'N' + { 2412, 23, 25, 24, 1, -23 }, // 0x4F 'O' + { 2484, 23, 25, 21, 0, -23 }, // 0x50 'P' + { 2556, 23, 31, 24, 1, -23 }, // 0x51 'Q' + { 2646, 24, 25, 23, 0, -23 }, // 0x52 'R' + { 2721, 18, 25, 18, 0, -23 }, // 0x53 'S' + { 2778, 21, 25, 21, 3, -23 }, // 0x54 'T' + { 2844, 24, 25, 25, 4, -23 }, // 0x55 'U' + { 2919, 24, 25, 25, 4, -23 }, // 0x56 'V' + { 2994, 31, 25, 32, 4, -23 }, // 0x57 'W' + { 3091, 25, 25, 24, 0, -23 }, // 0x58 'X' + { 3170, 21, 25, 22, 4, -23 }, // 0x59 'Y' + { 3236, 21, 25, 20, 0, -23 }, // 0x5A 'Z' + { 3302, 14, 30, 12, -1, -23 }, // 0x5B '[' + { 3355, 10, 25, 14, 4, -23 }, // 0x5C '\' + { 3387, 14, 30, 12, -2, -23 }, // 0x5D ']' + { 3440, 16, 13, 20, 2, -23 }, // 0x5E '^' + { 3466, 18, 3, 17, 0, 3 }, // 0x5F '_' + { 3473, 7, 6, 12, 3, -23 }, // 0x60 '`' + { 3479, 18, 17, 18, 0, -15 }, // 0x61 'a' + { 3518, 16, 26, 17, 1, -24 }, // 0x62 'b' + { 3570, 13, 17, 15, 1, -15 }, // 0x63 'c' + { 3598, 19, 25, 18, 1, -23 }, // 0x64 'd' + { 3658, 13, 17, 15, 1, -15 }, // 0x65 'e' + { 3686, 21, 32, 17, -3, -24 }, // 0x66 'f' + { 3770, 19, 23, 17, -1, -15 }, // 0x67 'g' + { 3825, 17, 25, 19, 1, -23 }, // 0x68 'h' + { 3879, 9, 25, 10, 1, -23 }, // 0x69 'i' + { 3908, 16, 31, 12, -3, -23 }, // 0x6A 'j' + { 3970, 17, 25, 18, 1, -23 }, // 0x6B 'k' + { 4024, 11, 25, 10, 1, -23 }, // 0x6C 'l' + { 4059, 26, 17, 27, 0, -15 }, // 0x6D 'm' + { 4115, 18, 17, 18, 0, -15 }, // 0x6E 'n' + { 4154, 15, 17, 17, 1, -15 }, // 0x6F 'o' + { 4186, 19, 23, 17, -2, -15 }, // 0x70 'p' + { 4241, 16, 23, 17, 1, -15 }, // 0x71 'q' + { 4287, 15, 16, 14, 0, -15 }, // 0x72 'r' + { 4317, 13, 17, 12, 0, -15 }, // 0x73 's' + { 4345, 10, 22, 10, 1, -20 }, // 0x74 't' + { 4373, 17, 17, 19, 1, -15 }, // 0x75 'u' + { 4410, 13, 16, 15, 2, -15 }, // 0x76 'v' + { 4436, 19, 16, 23, 3, -15 }, // 0x77 'w' + { 4474, 18, 17, 17, -1, -15 }, // 0x78 'x' + { 4513, 17, 23, 15, -2, -15 }, // 0x79 'y' + { 4562, 15, 19, 14, 0, -15 }, // 0x7A 'z' + { 4598, 15, 32, 12, 0, -24 }, // 0x7B '{' + { 4658, 3, 25, 9, 4, -23 }, // 0x7C '|' + { 4668, 15, 32, 12, -5, -24 }, // 0x7D '}' + { 4728, 16, 5, 20, 2, -11 } }; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic18pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic18pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 5410 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h new file mode 100644 index 0000000..fcb857e --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h @@ -0,0 +1,793 @@ +const uint8_t FreeSerifBoldItalic24pt7bBitmaps[] PROGMEM = { + 0x00, 0x3C, 0x00, 0xFC, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, + 0x3F, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x1E, + 0x00, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00, + 0x18, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF0, 0x03, 0xF0, 0x0F, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x3F, 0x00, + 0x3C, 0x00, 0x1C, 0x01, 0xC7, 0xC0, 0x7D, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, + 0xC0, 0x7C, 0xF8, 0x0F, 0x9E, 0x01, 0xE3, 0xC0, 0x3C, 0x70, 0x07, 0x1E, + 0x00, 0xE3, 0x80, 0x38, 0x70, 0x07, 0x0C, 0x00, 0xC0, 0x00, 0x03, 0xC1, + 0xE0, 0x00, 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0xC1, 0xE0, 0x00, + 0x70, 0x38, 0x00, 0x1E, 0x0F, 0x00, 0x03, 0x81, 0xC0, 0x00, 0xF0, 0x78, + 0x00, 0x1E, 0x0F, 0x00, 0x07, 0x83, 0xC0, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xF0, 0x7F, 0xFF, 0xFC, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00, + 0x07, 0x83, 0xC0, 0x00, 0xE0, 0x70, 0x00, 0x3C, 0x1E, 0x00, 0x07, 0x83, + 0xC0, 0x00, 0xE0, 0x70, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x1F, + 0xFF, 0xFF, 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xE0, 0xF0, + 0x00, 0x38, 0x1C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78, + 0x3C, 0x00, 0x0F, 0x07, 0x80, 0x01, 0xC0, 0xE0, 0x00, 0x78, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x1F, + 0xE0, 0x00, 0x7F, 0xF8, 0x01, 0xF1, 0x9E, 0x01, 0xC1, 0x8F, 0x03, 0x83, + 0x8F, 0x03, 0x83, 0x06, 0x07, 0x83, 0x06, 0x07, 0x87, 0x06, 0x07, 0xC7, + 0x04, 0x07, 0xE6, 0x04, 0x07, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFF, + 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x1F, + 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x3F, 0xF0, 0x00, 0x3B, 0xF8, 0x20, 0x31, + 0xF8, 0x20, 0x30, 0xF8, 0x60, 0x70, 0xF8, 0x60, 0x60, 0xF8, 0x60, 0x60, + 0xF8, 0xF0, 0xE0, 0xF0, 0xF0, 0xE1, 0xE0, 0x78, 0xC3, 0xE0, 0x3C, 0xC7, + 0xC0, 0x0F, 0xFF, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, + 0x00, 0x03, 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xF0, + 0x00, 0x70, 0x00, 0xFF, 0x80, 0x1C, 0x00, 0x3F, 0x38, 0x1F, 0x00, 0x0F, + 0xC7, 0xFF, 0xE0, 0x03, 0xF0, 0x3F, 0xB8, 0x00, 0x7E, 0x04, 0x07, 0x00, + 0x1F, 0x80, 0x81, 0xC0, 0x03, 0xF0, 0x10, 0x38, 0x00, 0xFC, 0x02, 0x0E, + 0x00, 0x1F, 0x80, 0x81, 0x80, 0x03, 0xF0, 0x10, 0x70, 0x00, 0x7C, 0x06, + 0x1C, 0x00, 0x0F, 0x80, 0x83, 0x80, 0x01, 0xF0, 0x30, 0xE0, 0x00, 0x1E, + 0x0C, 0x1C, 0x07, 0xC3, 0xE3, 0x07, 0x03, 0xFC, 0x3F, 0xC0, 0xC0, 0xFC, + 0x43, 0xE0, 0x38, 0x3E, 0x0C, 0x00, 0x0E, 0x0F, 0xC0, 0x80, 0x01, 0xC3, + 0xF0, 0x10, 0x00, 0x70, 0xFC, 0x02, 0x00, 0x0C, 0x1F, 0x80, 0x40, 0x03, + 0x83, 0xE0, 0x08, 0x00, 0x60, 0xFC, 0x02, 0x00, 0x1C, 0x1F, 0x80, 0x40, + 0x07, 0x03, 0xE0, 0x10, 0x00, 0xE0, 0x7C, 0x02, 0x00, 0x38, 0x0F, 0x80, + 0xC0, 0x06, 0x01, 0xF0, 0x30, 0x01, 0xC0, 0x1F, 0x0C, 0x00, 0x30, 0x01, + 0xFF, 0x00, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x01, 0xF1, 0xE0, 0x00, 0x00, 0xF0, 0x78, 0x00, 0x00, + 0xF0, 0x3C, 0x00, 0x00, 0x78, 0x1E, 0x00, 0x00, 0x7C, 0x0F, 0x00, 0x00, + 0x3E, 0x0F, 0x80, 0x00, 0x1F, 0x07, 0x80, 0x00, 0x0F, 0x87, 0x80, 0x00, + 0x07, 0xC7, 0x80, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, + 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x07, 0xFE, + 0x03, 0xCF, 0xC0, 0xFE, 0x03, 0xC7, 0xE0, 0x3C, 0x07, 0xC3, 0xF0, 0x1C, + 0x07, 0xC0, 0xFC, 0x0C, 0x03, 0xC0, 0x7E, 0x0E, 0x03, 0xE0, 0x3F, 0x0E, + 0x01, 0xF0, 0x1F, 0xC6, 0x01, 0xF8, 0x07, 0xF6, 0x00, 0xFC, 0x03, 0xFF, + 0x00, 0x7E, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x7F, 0x80, 0x1F, 0xC0, 0x1F, + 0xC0, 0x07, 0xF0, 0x0F, 0xF0, 0x13, 0xFE, 0x0F, 0xFE, 0x18, 0xFF, 0xFE, + 0xFF, 0xF8, 0x3F, 0xFE, 0x3F, 0xF8, 0x07, 0xF8, 0x03, 0xF0, 0x00, 0x1C, + 0x7D, 0xFB, 0xF7, 0xCF, 0x9E, 0x3C, 0x71, 0xE3, 0x87, 0x0C, 0x00, 0x00, + 0x04, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x80, 0x3C, 0x00, 0xF0, 0x07, + 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF0, 0x03, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x01, 0x80, + 0x06, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x01, + 0x00, 0x06, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x01, 0x80, 0x06, 0x00, + 0x1C, 0x00, 0x30, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xF0, + 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x7C, + 0x01, 0xF0, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x03, 0xE0, 0x0F, 0x80, 0x3C, + 0x01, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0xF0, + 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x06, 0x00, 0x30, 0x00, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0x0E, 0x1D, 0xF1, + 0xC7, 0xFF, 0x11, 0xFF, 0xE2, 0x3F, 0x7E, 0x4F, 0xC0, 0x3E, 0x00, 0x07, + 0xC0, 0x3F, 0x27, 0xEF, 0xC4, 0x7F, 0xF8, 0x8F, 0xFE, 0x38, 0xFB, 0x87, + 0x0E, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x70, 0x00, 0x00, + 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x01, + 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x07, 0x80, 0x00, 0x0F, 0x07, 0xE1, 0xFC, 0x7F, 0x1F, 0xC3, 0xF0, 0x7C, + 0x0E, 0x03, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x1C, 0x04, 0x00, 0x7F, 0xF7, + 0xFF, 0x7F, 0xEF, 0xFE, 0xFF, 0xE0, 0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0x7E, + 0x3C, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, + 0xC0, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x01, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, + 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, + 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0xE3, 0x80, 0x0F, 0x07, 0x00, 0x7C, 0x1C, 0x03, 0xE0, 0x78, 0x0F, 0x81, + 0xE0, 0x7C, 0x07, 0x83, 0xF0, 0x1F, 0x0F, 0xC0, 0xFC, 0x7E, 0x03, 0xF1, + 0xF8, 0x0F, 0xCF, 0xE0, 0x3F, 0x3F, 0x00, 0xFD, 0xFC, 0x07, 0xF7, 0xF0, + 0x1F, 0xDF, 0xC0, 0x7F, 0x7E, 0x01, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, + 0xBF, 0x80, 0xFE, 0xFC, 0x03, 0xF3, 0xF0, 0x1F, 0xCF, 0xC0, 0x7F, 0x3F, + 0x01, 0xF8, 0xFC, 0x07, 0xE3, 0xE0, 0x3F, 0x0F, 0x80, 0xFC, 0x1E, 0x07, + 0xE0, 0x78, 0x1F, 0x00, 0xE0, 0x78, 0x03, 0x83, 0xC0, 0x07, 0x1E, 0x00, + 0x07, 0xE0, 0x00, 0x00, 0x00, 0x70, 0x01, 0xFE, 0x01, 0xFF, 0xE0, 0x00, + 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, + 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x3F, 0x00, + 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, + 0x00, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFC, + 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xF0, 0x00, 0x3F, + 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xF8, 0x0F, 0xFF, 0xF0, 0x00, + 0x0F, 0x80, 0x01, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x7F, 0xFE, 0x03, 0x83, + 0xF8, 0x0C, 0x07, 0xF0, 0x60, 0x1F, 0xC3, 0x00, 0x3F, 0x00, 0x00, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00, + 0x07, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x01, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x06, 0x03, 0x80, 0x10, 0x1C, 0x00, 0xC0, 0xE0, + 0x06, 0x07, 0xFF, 0xF8, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, + 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0x80, + 0x60, 0xFE, 0x03, 0x01, 0xFC, 0x08, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, + 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0xFC, + 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x00, 0x07, 0xF8, 0x00, 0x7F, 0xF0, 0x00, + 0x7F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x00, 0x01, 0xFC, 0x00, 0x03, + 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, + 0x00, 0x0F, 0x80, 0x00, 0x3C, 0x1C, 0x01, 0xF0, 0xF8, 0x07, 0x83, 0xF0, + 0x3C, 0x0F, 0xE1, 0xE0, 0x1F, 0xFE, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xE0, 0x00, + 0x07, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xFC, 0x00, + 0x06, 0xFC, 0x00, 0x06, 0x7E, 0x00, 0x06, 0x3F, 0x00, 0x06, 0x3F, 0x00, + 0x06, 0x1F, 0x80, 0x06, 0x0F, 0xC0, 0x06, 0x07, 0xE0, 0x03, 0x07, 0xE0, + 0x03, 0x03, 0xF0, 0x03, 0x01, 0xF8, 0x03, 0x01, 0xFC, 0x03, 0x00, 0xFC, + 0x03, 0x00, 0x7E, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x03, + 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, 0x7F, 0xFE, 0x00, + 0x7F, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, + 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xFE, 0x00, 0x07, + 0xFF, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0xE0, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, + 0x03, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, + 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0xFC, + 0x07, 0x80, 0xFC, 0x0F, 0x00, 0xFE, 0x1E, 0x00, 0x7F, 0xF8, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x01, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, 0xFE, 0x00, + 0x01, 0xFF, 0xF0, 0x07, 0xFF, 0xF0, 0x0F, 0xE1, 0xF0, 0x3F, 0x81, 0xF0, + 0x7F, 0x03, 0xF0, 0xFC, 0x07, 0xE3, 0xF8, 0x0F, 0xC7, 0xF0, 0x1F, 0x8F, + 0xC0, 0x7F, 0x1F, 0x80, 0xFE, 0x3F, 0x01, 0xFC, 0x7C, 0x03, 0xF0, 0xF8, + 0x0F, 0xE1, 0xF0, 0x1F, 0xC1, 0xE0, 0x3F, 0x03, 0xC0, 0xFC, 0x07, 0x81, + 0xF0, 0x07, 0x87, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xFF, + 0xFC, 0x1F, 0xFF, 0xF8, 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, + 0x07, 0x00, 0x1C, 0x08, 0x00, 0x78, 0x30, 0x01, 0xE0, 0x40, 0x03, 0xC0, + 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, + 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, 0x00, 0x01, + 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x1E, 0x00, + 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFE, 0x00, 0x3C, 0x78, + 0x03, 0xC1, 0xE0, 0x3C, 0x07, 0x81, 0xE0, 0x3C, 0x1F, 0x01, 0xE0, 0xF8, + 0x0F, 0x07, 0xC0, 0x78, 0x3F, 0x03, 0xC1, 0xF8, 0x3C, 0x0F, 0xE1, 0xE0, + 0x3F, 0x9E, 0x01, 0xFF, 0xC0, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0xFF, + 0x00, 0x1F, 0xFC, 0x03, 0xCF, 0xF0, 0x3C, 0x3F, 0x83, 0xC0, 0xFC, 0x3C, + 0x03, 0xF1, 0xE0, 0x1F, 0x9E, 0x00, 0x7C, 0xF0, 0x03, 0xE7, 0x80, 0x1F, + 0x3C, 0x00, 0xF9, 0xE0, 0x07, 0x87, 0x00, 0x3C, 0x3C, 0x03, 0xC0, 0xF0, + 0x3C, 0x03, 0xC3, 0xC0, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, + 0xE0, 0x03, 0xF1, 0xE0, 0x0F, 0xC1, 0xC0, 0x3F, 0x03, 0xC0, 0xFE, 0x07, + 0x81, 0xF8, 0x0F, 0x87, 0xF0, 0x1F, 0x0F, 0xC0, 0x3E, 0x3F, 0x80, 0xFC, + 0x7F, 0x01, 0xF8, 0xFC, 0x03, 0xF1, 0xF8, 0x07, 0xE3, 0xF0, 0x1F, 0xC7, + 0xE0, 0x3F, 0x8F, 0xC0, 0x7E, 0x0F, 0x81, 0xFC, 0x1F, 0x03, 0xF8, 0x1F, + 0x0F, 0xE0, 0x1F, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x03, + 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF8, + 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x1F, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x1F, 0x81, 0xFE, 0x0F, + 0xF0, 0x7F, 0x81, 0xF8, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x7E, 0x07, 0xF8, 0x3F, + 0xC1, 0xFE, 0x07, 0xE0, 0x1E, 0x00, 0x00, 0x78, 0x01, 0xF8, 0x07, 0xF8, + 0x0F, 0xF0, 0x1F, 0xE0, 0x1F, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, + 0x1F, 0x80, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xF8, 0x00, + 0xE0, 0x01, 0xC0, 0x07, 0x00, 0x0C, 0x00, 0x30, 0x01, 0xC0, 0x0E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0x00, 0x0F, 0xFC, 0x00, 0x3F, 0xF0, + 0x01, 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x1F, 0xF8, 0x00, 0x7F, 0xE0, 0x00, + 0xFF, 0x80, 0x00, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00, + 0x1F, 0xF8, 0x00, 0x07, 0xFE, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, + 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0xFF, 0x80, + 0x00, 0x7F, 0xE0, 0x00, 0x1F, 0xF8, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x1F, 0xFC, + 0x00, 0x7F, 0xE0, 0x01, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x3F, 0xF0, 0x00, + 0xFF, 0xC0, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0x80, 0xF1, 0xF0, 0x38, 0x3E, + 0x1E, 0x0F, 0xC7, 0xC3, 0xF1, 0xF0, 0xFC, 0x7C, 0x3F, 0x0E, 0x0F, 0xC0, + 0x07, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xC0, 0x01, 0xF8, 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x0F, 0xF0, + 0x01, 0xF8, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0xC0, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C, + 0x00, 0x03, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x7C, 0x00, 0x00, 0x38, 0x3C, + 0x00, 0xF0, 0x4C, 0x3E, 0x00, 0xFD, 0xE7, 0x1E, 0x00, 0xF3, 0xF1, 0x9F, + 0x00, 0xF1, 0xF0, 0xEF, 0x80, 0xF0, 0x78, 0x3F, 0x80, 0xF0, 0x3C, 0x1F, + 0xC0, 0x78, 0x1E, 0x0F, 0xE0, 0x78, 0x1E, 0x07, 0xF0, 0x3C, 0x0F, 0x03, + 0xF8, 0x3E, 0x07, 0x81, 0xFC, 0x1E, 0x07, 0x81, 0xFE, 0x0F, 0x03, 0xC0, + 0xDF, 0x07, 0x83, 0xC0, 0x6F, 0x83, 0xC3, 0xE0, 0x63, 0xE1, 0xF3, 0xF0, + 0x71, 0xF0, 0x7E, 0x78, 0x70, 0xF8, 0x1E, 0x3F, 0xF0, 0x3E, 0x00, 0x07, + 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0, + 0x07, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, + 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, + 0x7E, 0x00, 0x00, 0x06, 0xFC, 0x00, 0x00, 0x19, 0xF8, 0x00, 0x00, 0x63, + 0xF8, 0x00, 0x00, 0xC7, 0xF0, 0x00, 0x03, 0x07, 0xE0, 0x00, 0x06, 0x0F, + 0xC0, 0x00, 0x18, 0x1F, 0x80, 0x00, 0x60, 0x3F, 0x00, 0x00, 0xC0, 0x7F, + 0x00, 0x03, 0x00, 0xFE, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, + 0x00, 0x60, 0x03, 0xF0, 0x00, 0xC0, 0x07, 0xE0, 0x03, 0x00, 0x0F, 0xE0, + 0x0E, 0x00, 0x1F, 0xC0, 0x18, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x01, + 0xC0, 0x00, 0xFE, 0x03, 0x80, 0x01, 0xFE, 0x1F, 0x80, 0x07, 0xFE, 0x7F, + 0xC0, 0x3F, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00, + 0xFE, 0x1F, 0xE0, 0x01, 0xFC, 0x1F, 0xE0, 0x03, 0xF8, 0x1F, 0xE0, 0x0F, + 0xE0, 0x3F, 0xC0, 0x1F, 0xC0, 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7F, + 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x03, 0xF8, 0x0F, 0xF0, 0x07, 0xF0, + 0x1F, 0xC0, 0x0F, 0xC0, 0x7F, 0x00, 0x3F, 0x87, 0xF0, 0x00, 0x7F, 0xFF, + 0x00, 0x00, 0xFE, 0x1F, 0xC0, 0x03, 0xF8, 0x0F, 0xE0, 0x07, 0xF0, 0x0F, + 0xE0, 0x0F, 0xE0, 0x1F, 0xC0, 0x1F, 0xC0, 0x3F, 0xC0, 0x7F, 0x00, 0x7F, + 0x80, 0xFE, 0x00, 0xFF, 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xF0, 0x07, 0xFC, + 0x0F, 0xE0, 0x0F, 0xF0, 0x1F, 0xC0, 0x3F, 0xE0, 0x3F, 0x80, 0x7F, 0x80, + 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x0F, 0xF8, 0x07, 0xFF, 0xFF, 0xC0, 0x3F, + 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x08, 0x00, 0x7F, 0xFE, 0xC0, + 0x0F, 0xF0, 0x7E, 0x00, 0xFE, 0x01, 0xF0, 0x1F, 0xE0, 0x07, 0x01, 0xFE, + 0x00, 0x38, 0x1F, 0xE0, 0x00, 0xC0, 0xFE, 0x00, 0x06, 0x0F, 0xF0, 0x00, + 0x30, 0xFF, 0x00, 0x01, 0x07, 0xF8, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x03, + 0xFC, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x60, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x00, + 0x70, 0x0F, 0xE0, 0x07, 0x00, 0x1F, 0xC0, 0xE0, 0x00, 0x7F, 0xFE, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFE, + 0x00, 0x00, 0xFE, 0x07, 0xF0, 0x00, 0x1F, 0xC0, 0x3F, 0x00, 0x03, 0xF8, + 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x03, + 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x1F, 0xC0, 0x03, 0xFC, + 0x03, 0xF8, 0x00, 0x7F, 0x80, 0x7F, 0x00, 0x0F, 0xF0, 0x0F, 0xC0, 0x01, + 0xFE, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x7F, 0x00, 0x07, 0xF8, 0x0F, 0xE0, + 0x01, 0xFF, 0x03, 0xF8, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, 0x0F, + 0xE0, 0x00, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xE0, 0x7F, 0x00, 0x07, 0xF8, + 0x0F, 0xE0, 0x01, 0xFF, 0x01, 0xFC, 0x00, 0x3F, 0xC0, 0x3F, 0x00, 0x0F, + 0xF0, 0x0F, 0xE0, 0x01, 0xFC, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x01, 0xFE, 0x07, 0xF8, 0x00, 0x7F, + 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x3F, 0xC0, 0x7E, 0x00, 0x3F, 0x80, 0x1E, + 0x00, 0x3F, 0x80, 0x0E, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x04, + 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x80, + 0x00, 0xFE, 0x01, 0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0x00, + 0x01, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFC, 0x3E, 0x00, + 0x03, 0xF8, 0x1E, 0x00, 0x03, 0xF8, 0x0C, 0x00, 0x03, 0xF8, 0x0C, 0x00, + 0x03, 0xF8, 0x0C, 0x00, 0x07, 0xF0, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x08, + 0x07, 0xF0, 0x00, 0x18, 0x07, 0xE0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, + 0x0F, 0xE0, 0x00, 0x70, 0x0F, 0xE0, 0x01, 0xE0, 0x1F, 0xC0, 0x07, 0xE0, + 0x1F, 0xE0, 0x3F, 0xE0, 0x3F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0, + 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0x03, 0xF0, + 0x01, 0xFC, 0x01, 0xE0, 0x03, 0xF8, 0x01, 0xC0, 0x0F, 0xE0, 0x01, 0x80, + 0x1F, 0xC0, 0x02, 0x00, 0x3F, 0x80, 0x04, 0x00, 0x7F, 0x00, 0x00, 0x01, + 0xFC, 0x03, 0x00, 0x03, 0xF8, 0x04, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F, + 0xC0, 0xF0, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFE, + 0x1F, 0x00, 0x03, 0xF8, 0x1E, 0x00, 0x07, 0xF0, 0x18, 0x00, 0x0F, 0xE0, + 0x30, 0x00, 0x1F, 0xC0, 0x60, 0x00, 0x7F, 0x00, 0x80, 0x00, 0xFE, 0x01, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, + 0x01, 0xFE, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0F, 0xFF, 0xEE, 0x00, 0x3F, 0xC0, + 0xFC, 0x00, 0x7F, 0x00, 0x7C, 0x01, 0xFE, 0x00, 0x3C, 0x03, 0xFC, 0x00, + 0x38, 0x07, 0xF8, 0x00, 0x18, 0x07, 0xF0, 0x00, 0x18, 0x0F, 0xF0, 0x00, + 0x10, 0x1F, 0xE0, 0x00, 0x10, 0x1F, 0xE0, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, + 0x00, 0x7F, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x1F, + 0xFF, 0xFF, 0x00, 0x07, 0xFC, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, + 0xF8, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x03, 0xF0, 0xFF, 0x00, 0x07, + 0xF0, 0x7F, 0x00, 0x07, 0xF0, 0x7F, 0x00, 0x07, 0xE0, 0x7F, 0x80, 0x07, + 0xE0, 0x3F, 0x80, 0x0F, 0xE0, 0x1F, 0xC0, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, + 0xC0, 0x07, 0xF0, 0x3F, 0x80, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xE0, + 0x00, 0x01, 0xFF, 0xFC, 0x7F, 0xFE, 0x00, 0xFF, 0xC0, 0x3F, 0xF0, 0x00, + 0xFE, 0x00, 0x3F, 0xC0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, + 0xFE, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x01, 0xFC, 0x00, + 0x7F, 0x00, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x01, 0xFC, 0x00, + 0x0F, 0xC0, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x00, 0x7F, 0xFF, + 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0x80, 0x03, 0xF8, 0x00, 0x7F, 0x00, + 0x07, 0xF0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0x1F, 0xC0, + 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x3F, 0x80, + 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, + 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x0F, 0xE0, + 0x00, 0xFF, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x7F, 0x80, 0x07, 0xFC, + 0x01, 0xFF, 0x00, 0x3F, 0xFF, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xF8, + 0x03, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, + 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, + 0x00, 0x3F, 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, + 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFC, + 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x00, + 0x3F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, + 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x07, 0x03, 0xF0, 0x01, 0xF0, 0xFE, 0x00, + 0x3E, 0x1F, 0xC0, 0x07, 0xC3, 0xF0, 0x00, 0xF8, 0xFC, 0x00, 0x0F, 0x3F, + 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFF, 0xC0, 0x1F, 0xF8, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xC0, 0x00, 0xFE, + 0x00, 0xE0, 0x00, 0x3F, 0x80, 0x70, 0x00, 0x1F, 0xC0, 0x38, 0x00, 0x07, + 0xF0, 0x1C, 0x00, 0x01, 0xFC, 0x0E, 0x00, 0x00, 0x7F, 0x07, 0x00, 0x00, + 0x3F, 0x83, 0x80, 0x00, 0x0F, 0xE1, 0xC0, 0x00, 0x03, 0xF8, 0xE0, 0x00, + 0x00, 0xFC, 0x60, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x00, 0x1F, 0xFF, 0x00, + 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x03, 0xFB, 0xF8, 0x00, 0x00, 0xFE, 0x7F, + 0x00, 0x00, 0x3F, 0x9F, 0xC0, 0x00, 0x0F, 0xE3, 0xF8, 0x00, 0x07, 0xF0, + 0xFE, 0x00, 0x01, 0xFC, 0x1F, 0xC0, 0x00, 0x7F, 0x07, 0xF0, 0x00, 0x1F, + 0x80, 0xFE, 0x00, 0x0F, 0xE0, 0x3F, 0x80, 0x03, 0xF8, 0x0F, 0xE0, 0x00, + 0xFE, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x1F, 0xE0, 0x0F, 0xE0, + 0x0F, 0xF8, 0x07, 0xFC, 0x0F, 0xFF, 0xC7, 0xFF, 0xC0, 0x01, 0xFF, 0xF8, + 0x00, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, + 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x01, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x04, 0x1F, 0xC0, 0x00, 0x60, 0xFC, 0x00, 0x06, + 0x0F, 0xE0, 0x00, 0x30, 0x7F, 0x00, 0x03, 0x83, 0xF8, 0x00, 0x7C, 0x3F, + 0x80, 0x0F, 0xC1, 0xFE, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x3F, 0xF0, 0x03, 0xFC, 0x00, 0x03, + 0xFC, 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x0F, 0xF8, + 0x00, 0x3F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xF0, 0x00, + 0x6F, 0xC0, 0x03, 0xFF, 0x00, 0x06, 0xFC, 0x00, 0x37, 0xF0, 0x00, 0x6F, + 0xE0, 0x06, 0x7E, 0x00, 0x04, 0xFE, 0x00, 0xEF, 0xE0, 0x00, 0xCF, 0xE0, + 0x0C, 0xFE, 0x00, 0x0C, 0xFE, 0x01, 0x8F, 0xE0, 0x00, 0xCF, 0xE0, 0x38, + 0xFC, 0x00, 0x18, 0x7E, 0x03, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0x61, 0xFC, + 0x00, 0x18, 0x7E, 0x0E, 0x1F, 0xC0, 0x01, 0x87, 0xE0, 0xC3, 0xF8, 0x00, + 0x30, 0x7F, 0x18, 0x3F, 0x80, 0x03, 0x07, 0xF3, 0x83, 0xF8, 0x00, 0x30, + 0x7F, 0x30, 0x3F, 0x00, 0x06, 0x07, 0xF7, 0x07, 0xF0, 0x00, 0x60, 0x3F, + 0xE0, 0x7F, 0x00, 0x06, 0x03, 0xFC, 0x07, 0xF0, 0x00, 0xE0, 0x3F, 0xC0, + 0x7E, 0x00, 0x0C, 0x03, 0xF8, 0x0F, 0xE0, 0x00, 0xC0, 0x3F, 0x00, 0xFE, + 0x00, 0x0C, 0x03, 0xF0, 0x0F, 0xE0, 0x01, 0xC0, 0x3E, 0x01, 0xFC, 0x00, + 0x1C, 0x03, 0xC0, 0x1F, 0xC0, 0x07, 0xE0, 0x3C, 0x03, 0xFE, 0x00, 0xFF, + 0xC1, 0x81, 0xFF, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0xFF, + 0x00, 0x1F, 0xF8, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x00, 0xF0, + 0x00, 0x7F, 0x00, 0x07, 0x00, 0x03, 0xFC, 0x00, 0x38, 0x00, 0x1F, 0xE0, + 0x01, 0x80, 0x01, 0xBF, 0x80, 0x0C, 0x00, 0x0D, 0xFC, 0x00, 0x60, 0x00, + 0x67, 0xF0, 0x07, 0x00, 0x02, 0x3F, 0x80, 0x30, 0x00, 0x30, 0xFE, 0x01, + 0x80, 0x01, 0x87, 0xF0, 0x0C, 0x00, 0x0C, 0x1F, 0xC0, 0xC0, 0x00, 0xC0, + 0xFE, 0x06, 0x00, 0x06, 0x07, 0xF8, 0x30, 0x00, 0x30, 0x1F, 0xC1, 0x80, + 0x01, 0x80, 0xFF, 0x18, 0x00, 0x18, 0x03, 0xF8, 0xC0, 0x00, 0xC0, 0x1F, + 0xC6, 0x00, 0x06, 0x00, 0x7F, 0x60, 0x00, 0x60, 0x03, 0xFB, 0x00, 0x03, + 0x00, 0x0F, 0xF8, 0x00, 0x18, 0x00, 0x7F, 0xC0, 0x01, 0xC0, 0x01, 0xFC, + 0x00, 0x0C, 0x00, 0x0F, 0xE0, 0x00, 0x60, 0x00, 0x3F, 0x00, 0x03, 0x00, + 0x01, 0xF0, 0x00, 0x38, 0x00, 0x07, 0x80, 0x01, 0xC0, 0x00, 0x3C, 0x00, + 0x3F, 0x00, 0x01, 0xE0, 0x03, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x7E, + 0x1F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, + 0x1F, 0x80, 0xFE, 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00, + 0xFE, 0x1F, 0xC0, 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07, + 0xF3, 0xFC, 0x00, 0x1F, 0xE7, 0xF0, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F, + 0xBF, 0xC0, 0x00, 0xFE, 0x7F, 0x80, 0x03, 0xFC, 0xFE, 0x00, 0x07, 0xFB, + 0xFC, 0x00, 0x0F, 0xF7, 0xF8, 0x00, 0x3F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F, + 0xC0, 0x00, 0xFE, 0x3F, 0x80, 0x03, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE, + 0x00, 0x1F, 0xC0, 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0xFE, 0x03, 0xF0, + 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, + 0xFC, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0xFE, 0x1F, 0xE0, 0x01, 0xFC, + 0x1F, 0xE0, 0x03, 0xF0, 0x1F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x1F, 0xC0, + 0x7F, 0x80, 0x3F, 0x80, 0xFF, 0x00, 0x7E, 0x01, 0xFE, 0x01, 0xFC, 0x03, + 0xFC, 0x03, 0xF8, 0x0F, 0xF8, 0x07, 0xF0, 0x1F, 0xE0, 0x0F, 0xC0, 0x7F, + 0x80, 0x3F, 0x81, 0xFE, 0x00, 0x7F, 0x07, 0xF8, 0x00, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x1F, 0x80, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x01, 0xFC, + 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x7E, 0x1F, 0x80, 0x01, + 0xF0, 0x0F, 0x80, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x80, 0x1F, 0x80, 0xFE, + 0x00, 0x3F, 0x03, 0xF8, 0x00, 0x7E, 0x07, 0xF0, 0x00, 0xFE, 0x1F, 0xC0, + 0x01, 0xFC, 0x7F, 0x80, 0x03, 0xF8, 0xFE, 0x00, 0x07, 0xF3, 0xFC, 0x00, + 0x1F, 0xE7, 0xF8, 0x00, 0x3F, 0xDF, 0xE0, 0x00, 0x7F, 0xBF, 0xC0, 0x00, + 0xFF, 0x7F, 0x80, 0x01, 0xFC, 0xFE, 0x00, 0x07, 0xFB, 0xFC, 0x00, 0x0F, + 0xF7, 0xF8, 0x00, 0x1F, 0xCF, 0xF0, 0x00, 0x7F, 0x9F, 0xC0, 0x00, 0xFE, + 0x3F, 0x80, 0x01, 0xFC, 0x7F, 0x00, 0x07, 0xF0, 0xFE, 0x00, 0x0F, 0xE1, + 0xFC, 0x00, 0x3F, 0x81, 0xF8, 0x00, 0x7E, 0x03, 0xF0, 0x01, 0xF8, 0x03, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x1F, 0x80, 0x03, 0xE0, 0x7E, 0x00, 0x03, + 0xF3, 0xF0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xC0, 0x7F, 0xE0, 0x03, 0x03, 0xFF, + 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0xE0, 0x3F, + 0xFF, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, + 0xFF, 0xF8, 0x00, 0x3F, 0xC3, 0xFC, 0x00, 0x3F, 0x81, 0xFE, 0x00, 0x3F, + 0x80, 0xFF, 0x00, 0x7F, 0x80, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x7F, + 0x00, 0xFF, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0xFE, + 0x01, 0xFE, 0x00, 0xFE, 0x03, 0xFC, 0x00, 0xFE, 0x07, 0xF8, 0x01, 0xFC, + 0x1F, 0xF0, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, 0x03, 0xFD, + 0xFE, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8, 0xFF, 0x00, 0x03, 0xF8, + 0xFF, 0x00, 0x07, 0xF8, 0x7F, 0x80, 0x07, 0xF0, 0x7F, 0x80, 0x07, 0xF0, + 0x3F, 0x80, 0x07, 0xF0, 0x3F, 0xC0, 0x0F, 0xE0, 0x3F, 0xC0, 0x0F, 0xE0, + 0x1F, 0xC0, 0x0F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, + 0x0F, 0xF0, 0x3F, 0xF0, 0x0F, 0xF8, 0xFF, 0xFC, 0x0F, 0xFE, 0x00, 0x1F, + 0x83, 0x00, 0x7F, 0xF7, 0x00, 0xF8, 0x7E, 0x01, 0xE0, 0x1E, 0x03, 0xC0, + 0x0E, 0x03, 0xC0, 0x0E, 0x07, 0xC0, 0x0E, 0x07, 0xC0, 0x04, 0x07, 0xC0, + 0x04, 0x07, 0xE0, 0x04, 0x07, 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFC, + 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0xC0, 0x00, 0x7F, + 0xE0, 0x00, 0x3F, 0xE0, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0xF0, 0x00, 0x07, + 0xF8, 0x00, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x20, 0x00, 0xF8, 0x20, 0x00, + 0xF8, 0x20, 0x00, 0xF8, 0x70, 0x00, 0xF8, 0x70, 0x00, 0xF0, 0x78, 0x01, + 0xF0, 0x78, 0x03, 0xE0, 0x7E, 0x07, 0xC0, 0x47, 0xFF, 0x80, 0xC0, 0xFC, + 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFC, 0xFE, 0x3F, 0x8F, 0x9E, + 0x07, 0xF0, 0xF3, 0x81, 0xFC, 0x0E, 0x60, 0x3F, 0x81, 0x98, 0x07, 0xF0, + 0x13, 0x00, 0xFC, 0x02, 0x00, 0x3F, 0x80, 0x40, 0x07, 0xF0, 0x00, 0x00, + 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, + 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, + 0x00, 0x00, 0x7E, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, + 0x03, 0xFF, 0x0F, 0xFC, 0x00, 0xFC, 0x07, 0xF0, 0x00, 0x38, 0x07, 0xF0, + 0x00, 0x38, 0x07, 0xF0, 0x00, 0x30, 0x0F, 0xE0, 0x00, 0x30, 0x0F, 0xE0, + 0x00, 0x70, 0x0F, 0xE0, 0x00, 0x60, 0x0F, 0xE0, 0x00, 0x60, 0x1F, 0xC0, + 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0xC0, 0x1F, 0xC0, 0x00, 0xC0, 0x3F, 0x80, + 0x00, 0xC0, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80, 0x01, 0x80, 0x3F, 0x80, + 0x01, 0x80, 0x7F, 0x00, 0x01, 0x80, 0x7F, 0x00, 0x03, 0x00, 0x7F, 0x00, + 0x03, 0x00, 0x7E, 0x00, 0x03, 0x00, 0xFE, 0x00, 0x06, 0x00, 0xFE, 0x00, + 0x06, 0x00, 0xFC, 0x00, 0x06, 0x00, 0xFC, 0x00, 0x0E, 0x00, 0xFC, 0x00, + 0x0C, 0x00, 0xFC, 0x00, 0x1C, 0x00, 0xFC, 0x00, 0x18, 0x00, 0x7E, 0x00, + 0x38, 0x00, 0x7E, 0x00, 0x70, 0x00, 0x3F, 0x81, 0xE0, 0x00, 0x0F, 0xFF, + 0x80, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0x03, 0xFE, 0x7F, 0xE0, + 0x01, 0xF8, 0x7F, 0x80, 0x01, 0xC0, 0xFF, 0x00, 0x03, 0x80, 0xFE, 0x00, + 0x0E, 0x01, 0xFC, 0x00, 0x18, 0x03, 0xF8, 0x00, 0x70, 0x07, 0xF0, 0x00, + 0xC0, 0x0F, 0xF0, 0x03, 0x80, 0x1F, 0xE0, 0x0E, 0x00, 0x1F, 0xC0, 0x18, + 0x00, 0x3F, 0x80, 0x70, 0x00, 0x7F, 0x00, 0xC0, 0x00, 0xFE, 0x03, 0x00, + 0x01, 0xFC, 0x0E, 0x00, 0x03, 0xF8, 0x18, 0x00, 0x07, 0xF8, 0x60, 0x00, + 0x07, 0xF1, 0xC0, 0x00, 0x0F, 0xE3, 0x00, 0x00, 0x1F, 0xCC, 0x00, 0x00, + 0x3F, 0xB8, 0x00, 0x00, 0x7F, 0x60, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, + 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xFF, 0xF8, + 0xFF, 0xF0, 0xFF, 0x9F, 0xF8, 0x1F, 0xE0, 0x0F, 0x87, 0xF8, 0x07, 0xE0, + 0x07, 0x03, 0xF8, 0x03, 0xF0, 0x03, 0x80, 0xFE, 0x01, 0xF8, 0x01, 0x80, + 0x7F, 0x00, 0xFC, 0x00, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xC0, 0x1F, 0xC0, + 0x7F, 0x80, 0x60, 0x0F, 0xE0, 0x3F, 0xC0, 0x60, 0x07, 0xF0, 0x37, 0xE0, + 0x30, 0x03, 0xF8, 0x1B, 0xF0, 0x30, 0x00, 0xFC, 0x19, 0xF8, 0x18, 0x00, + 0x7E, 0x0C, 0xFE, 0x18, 0x00, 0x3F, 0x84, 0x7F, 0x0C, 0x00, 0x1F, 0xC6, + 0x3F, 0x8C, 0x00, 0x0F, 0xE2, 0x1F, 0xC6, 0x00, 0x07, 0xF3, 0x07, 0xE6, + 0x00, 0x03, 0xF9, 0x83, 0xF3, 0x00, 0x01, 0xFD, 0x81, 0xFB, 0x00, 0x00, + 0x7E, 0xC0, 0xFD, 0x80, 0x00, 0x3F, 0xC0, 0x7F, 0x80, 0x00, 0x1F, 0xE0, + 0x3F, 0xC0, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x00, 0x07, 0xF0, 0x0F, 0xE0, + 0x00, 0x03, 0xF0, 0x07, 0xE0, 0x00, 0x01, 0xF8, 0x01, 0xF0, 0x00, 0x00, + 0x78, 0x00, 0xF0, 0x00, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, + 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x03, 0xFF, 0xF0, 0xFF, 0xC0, 0x3F, + 0xE0, 0x0F, 0xC0, 0x03, 0xF8, 0x01, 0xE0, 0x00, 0xFE, 0x00, 0xE0, 0x00, + 0x3F, 0x80, 0x70, 0x00, 0x07, 0xE0, 0x18, 0x00, 0x01, 0xFC, 0x0C, 0x00, + 0x00, 0x7F, 0x06, 0x00, 0x00, 0x0F, 0xC3, 0x00, 0x00, 0x03, 0xF9, 0x80, + 0x00, 0x00, 0xFE, 0xC0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x07, 0xF8, + 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x0F, + 0xC0, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, + 0xFF, 0x80, 0x00, 0x00, 0x77, 0xF0, 0x00, 0x00, 0x39, 0xFC, 0x00, 0x00, + 0x1C, 0x3F, 0x00, 0x00, 0x06, 0x0F, 0xE0, 0x00, 0x03, 0x03, 0xF8, 0x00, + 0x01, 0x80, 0x7E, 0x00, 0x00, 0xE0, 0x1F, 0xC0, 0x00, 0x70, 0x07, 0xF0, + 0x00, 0x38, 0x01, 0xFC, 0x00, 0x1E, 0x00, 0x7F, 0x80, 0x1F, 0xC0, 0x1F, + 0xF0, 0x0F, 0xFC, 0x3F, 0xFF, 0x80, 0xFF, 0xF8, 0x3F, 0xF3, 0xFC, 0x00, + 0xFC, 0x1F, 0xC0, 0x07, 0x81, 0xFC, 0x00, 0x70, 0x0F, 0xC0, 0x0E, 0x00, + 0xFE, 0x00, 0xC0, 0x0F, 0xE0, 0x1C, 0x00, 0x7E, 0x03, 0x80, 0x07, 0xF0, + 0x30, 0x00, 0x7F, 0x06, 0x00, 0x03, 0xF0, 0xE0, 0x00, 0x3F, 0x8C, 0x00, + 0x03, 0xF9, 0x80, 0x00, 0x1F, 0xB0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x1F, + 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x1F, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x03, + 0xF8, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x07, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, + 0xFF, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x3F, + 0xFF, 0xFF, 0x03, 0xF8, 0x0F, 0xF0, 0x7C, 0x01, 0xFE, 0x07, 0x80, 0x3F, + 0xC0, 0x70, 0x03, 0xF8, 0x06, 0x00, 0x7F, 0x80, 0xC0, 0x0F, 0xF0, 0x08, + 0x01, 0xFE, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x7F, + 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, 0xE0, 0x00, + 0x03, 0xFC, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x3F, 0xC0, 0x00, + 0x07, 0xF8, 0x00, 0xC0, 0xFF, 0x00, 0x0C, 0x1F, 0xE0, 0x01, 0x81, 0xFE, + 0x00, 0x38, 0x3F, 0xC0, 0x07, 0x87, 0xF8, 0x01, 0xF0, 0xFF, 0x00, 0xFF, + 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE0, 0x0F, + 0xFC, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, + 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, + 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, + 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xFE, 0x01, + 0xFF, 0xC0, 0x00, 0xF0, 0x07, 0x80, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x1C, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x01, + 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x00, 0x78, 0x00, 0x7F, 0xE0, + 0x0F, 0xFC, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1E, 0x00, 0x07, 0xC0, 0x00, + 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, + 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x07, 0xFC, + 0x01, 0xFF, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0x00, 0x7F, 0x00, + 0x03, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xEF, 0x00, 0x1E, 0x78, 0x00, 0xF1, + 0xE0, 0x0F, 0x0F, 0x00, 0x78, 0x3C, 0x07, 0xC1, 0xE0, 0x3C, 0x07, 0x83, + 0xE0, 0x3C, 0x1E, 0x00, 0xF1, 0xF0, 0x07, 0x8F, 0x00, 0x1E, 0xF8, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x3E, + 0x0F, 0x83, 0xF0, 0x3E, 0x07, 0x80, 0xF0, 0x0E, 0x01, 0xC0, 0x00, 0x3C, + 0x0C, 0x03, 0xF9, 0xF0, 0x1F, 0x3F, 0x80, 0xF8, 0x7E, 0x07, 0xC1, 0xF8, + 0x3F, 0x07, 0xC0, 0xF8, 0x1F, 0x07, 0xE0, 0x7C, 0x3F, 0x01, 0xF0, 0xFC, + 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E, 0x03, 0xC3, 0xF8, 0x1F, + 0x0F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, 0x83, 0xF0, 0x7E, 0x3F, + 0xC2, 0xF8, 0xBF, 0x9B, 0xE4, 0x7F, 0xCF, 0xE0, 0xFE, 0x3F, 0x01, 0xE0, + 0x78, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x7E, + 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x00, 0x00, 0x7C, 0x00, + 0x03, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x3E, 0x01, 0xF9, 0xFC, 0x07, + 0xEF, 0xF8, 0x1F, 0x47, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x0F, 0xC0, + 0xFC, 0x3F, 0x03, 0xF1, 0xF8, 0x0F, 0xC7, 0xE0, 0x3F, 0x1F, 0x01, 0xF8, + 0x7C, 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0xFC, 0x3E, 0x03, 0xF1, 0xF8, + 0x0F, 0x87, 0xE0, 0x7C, 0x1F, 0x03, 0xE0, 0xFC, 0x0F, 0x03, 0xF0, 0x78, + 0x0F, 0xC7, 0xC0, 0x1F, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x3F, 0x00, + 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x87, 0xC3, 0xE1, 0xF1, 0xF0, + 0x38, 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, + 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x03, 0x3F, + 0x00, 0xCF, 0xE0, 0x61, 0xFC, 0x70, 0x3F, 0xF8, 0x07, 0xFC, 0x00, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xC0, 0x00, 0x7F, 0xE0, 0x00, + 0x07, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x80, + 0x07, 0x9F, 0x80, 0x0F, 0xFF, 0xC0, 0x0F, 0x9F, 0xE0, 0x0F, 0x87, 0xF0, + 0x0F, 0x83, 0xF0, 0x0F, 0xC1, 0xF8, 0x07, 0xC0, 0xFC, 0x07, 0xE0, 0x7C, + 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x1F, 0x81, 0xF8, 0x0F, + 0x80, 0xFC, 0x0F, 0xC0, 0xFE, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x3F, 0x03, + 0xF0, 0x1F, 0x83, 0xF8, 0x0F, 0xC1, 0xF8, 0xC7, 0xE1, 0xFC, 0xC3, 0xF9, + 0xBE, 0xC0, 0xFF, 0x9F, 0xC0, 0x7F, 0x8F, 0xC0, 0x0F, 0x83, 0xC0, 0x00, + 0x00, 0x3F, 0x00, 0x3F, 0xE0, 0x1E, 0x3C, 0x0F, 0x0F, 0x07, 0x83, 0xC3, + 0xE0, 0xF1, 0xF0, 0x3C, 0xFC, 0x1E, 0x3F, 0x0F, 0x9F, 0x83, 0xC7, 0xE3, + 0xE1, 0xFB, 0xE0, 0xFF, 0xE0, 0x3F, 0xC0, 0x0F, 0xC0, 0x03, 0xF0, 0x00, + 0xFC, 0x03, 0x3F, 0x01, 0x8F, 0xC0, 0xC1, 0xF8, 0x70, 0x7F, 0xF8, 0x07, + 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x03, 0xCE, 0x00, + 0x00, 0x78, 0xF0, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0xF0, 0xF0, 0x00, 0x1F, + 0x06, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xFF, 0xC0, 0x00, 0x3F, + 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, + 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x03, 0xF0, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xC0, + 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x1F, 0x00, 0x00, 0xF1, 0xE0, + 0x00, 0x0F, 0x3E, 0x00, 0x00, 0xF3, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, + 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x7F, 0xF0, 0x00, 0x7E, + 0x3F, 0xE0, 0x7C, 0x0F, 0xF0, 0x7E, 0x07, 0xC0, 0x7E, 0x03, 0xE0, 0x3F, + 0x01, 0xF0, 0x1F, 0x01, 0xF8, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0xFC, 0x01, + 0xE0, 0xFC, 0x00, 0x78, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF0, 0x00, + 0x1C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0xF8, 0x00, + 0x07, 0xFF, 0x80, 0x01, 0xFF, 0xF8, 0x00, 0x7F, 0xFE, 0x00, 0x77, 0xFF, + 0x80, 0xF0, 0x7F, 0xC0, 0xF0, 0x07, 0xE0, 0xF0, 0x01, 0xF0, 0x78, 0x00, + 0xF8, 0x3C, 0x00, 0x78, 0x1F, 0x00, 0x7C, 0x07, 0xC0, 0x78, 0x01, 0xFF, + 0xF8, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x1F, + 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xC0, + 0x00, 0x1F, 0x87, 0xC0, 0x3E, 0x1F, 0xC0, 0xFC, 0x7F, 0x81, 0xF9, 0x9F, + 0x03, 0xE6, 0x3E, 0x07, 0xD8, 0x7C, 0x1F, 0xA0, 0xF8, 0x3F, 0x83, 0xF0, + 0x7F, 0x07, 0xE0, 0xFC, 0x0F, 0xC3, 0xF8, 0x3F, 0x07, 0xE0, 0x7E, 0x0F, + 0xC0, 0xFC, 0x3F, 0x03, 0xF0, 0x7E, 0x07, 0xE0, 0xFC, 0x0F, 0xC1, 0xF0, + 0x3F, 0x17, 0xE0, 0x7E, 0x6F, 0xC0, 0xF9, 0x9F, 0x01, 0xF6, 0x3E, 0x03, + 0xF8, 0xFC, 0x07, 0xF1, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC7, + 0xFC, 0x1F, 0xC0, 0xF8, 0x0F, 0x81, 0xF8, 0x1F, 0x81, 0xF0, 0x1F, 0x03, + 0xF0, 0x3E, 0x03, 0xE0, 0x3E, 0x07, 0xE0, 0x7C, 0x07, 0xC0, 0xFC, 0x2F, + 0x84, 0xF8, 0xCF, 0x98, 0xFF, 0x0F, 0xE0, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0xF0, 0x00, 0x1F, 0xC0, + 0x00, 0x3E, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, + 0x7C, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xF8, + 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, + 0x0F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x1F, + 0x80, 0x00, 0x7E, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x3F, 0x00, + 0x60, 0xF8, 0x03, 0xC3, 0xC0, 0x0F, 0x1F, 0x00, 0x3C, 0xF8, 0x00, 0x7F, + 0xC0, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xFC, 0x00, 0x07, + 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xF8, 0x00, 0x01, + 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xF0, 0x00, 0x01, 0xF0, 0x00, 0x03, + 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xE3, 0xFF, 0x03, 0xE0, 0xFC, 0x07, + 0xE0, 0xF0, 0x07, 0xE0, 0xE0, 0x07, 0xC1, 0xC0, 0x0F, 0xC3, 0x80, 0x0F, + 0xC7, 0x00, 0x0F, 0x8E, 0x00, 0x0F, 0xBE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, + 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0x3E, 0x00, 0x3F, 0x3F, 0x00, 0x3F, + 0x1F, 0x00, 0x3E, 0x1F, 0x00, 0x7E, 0x1F, 0x04, 0x7E, 0x1F, 0x8C, 0x7E, + 0x0F, 0x98, 0x7C, 0x0F, 0xF0, 0xFC, 0x07, 0xE0, 0xE0, 0x03, 0xC0, 0x00, + 0x08, 0x0F, 0xC7, 0xFE, 0x07, 0xF0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7C, + 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0x80, 0x7C, 0x07, 0xE0, 0x3E, 0x01, + 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xC0, 0x3E, 0x03, 0xF0, 0x1F, 0x80, 0xF8, + 0x0F, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0xF8, 0x8F, 0x8C, 0x7C, 0x43, + 0xE4, 0x1F, 0xE0, 0xFE, 0x03, 0xC0, 0x00, 0x00, 0x70, 0x78, 0x0F, 0x83, + 0xFE, 0x3F, 0x87, 0xF8, 0x1F, 0xCF, 0xF1, 0xFF, 0x03, 0xF1, 0x3E, 0x73, + 0xE0, 0x7E, 0x47, 0xD8, 0x7C, 0x0F, 0xD0, 0xFB, 0x1F, 0x81, 0xF4, 0x3E, + 0xC3, 0xF0, 0x3E, 0x87, 0xF0, 0x7C, 0x0F, 0xE0, 0xFE, 0x1F, 0x81, 0xF4, + 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x1F, 0x81, + 0xF8, 0x1F, 0x83, 0xF0, 0x3F, 0x07, 0xE0, 0x7C, 0x07, 0xE0, 0xFC, 0x0F, + 0x80, 0xF8, 0x1F, 0x03, 0xF0, 0x3F, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0xFC, + 0x0F, 0x88, 0xF8, 0x1F, 0x81, 0xF3, 0x3F, 0x03, 0xE0, 0x3E, 0x47, 0xE0, + 0xFC, 0x07, 0xF0, 0xFC, 0x1F, 0x80, 0xFE, 0x18, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x70, 0xF8, 0x7F, 0xC3, 0xF8, 0x1F, 0x8F, 0xF0, 0x3F, 0x33, 0xE0, + 0x7C, 0x87, 0xC1, 0xF9, 0x0F, 0x83, 0xF4, 0x1F, 0x07, 0xD0, 0x3E, 0x0F, + 0xE0, 0xFC, 0x3F, 0x81, 0xF8, 0x7F, 0x03, 0xE0, 0xFC, 0x0F, 0xC1, 0xF8, + 0x1F, 0x87, 0xE0, 0x3E, 0x0F, 0xC0, 0xFC, 0x1F, 0x81, 0xF0, 0x3E, 0x03, + 0xE0, 0xFC, 0x0F, 0xC9, 0xF8, 0x1F, 0x33, 0xE0, 0x3E, 0x47, 0xC0, 0x7F, + 0x1F, 0x80, 0xFE, 0x38, 0x00, 0xF0, 0x00, 0x00, 0x3F, 0x00, 0x0E, 0x38, + 0x03, 0xC1, 0xC0, 0x78, 0x1E, 0x0F, 0x81, 0xF0, 0xF0, 0x1F, 0x1F, 0x01, + 0xF3, 0xE0, 0x1F, 0x3E, 0x03, 0xF7, 0xC0, 0x3F, 0x7C, 0x03, 0xF7, 0xC0, + 0x3E, 0xFC, 0x03, 0xEF, 0xC0, 0x7E, 0xF8, 0x07, 0xCF, 0x80, 0x7C, 0xF8, + 0x0F, 0x8F, 0x80, 0xF8, 0xF8, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x3C, 0x03, + 0xC7, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x1F, 0x00, 0x3F, 0xE7, 0xF8, + 0x01, 0xF9, 0xFF, 0x00, 0x1F, 0x47, 0xF0, 0x07, 0xF0, 0x7E, 0x00, 0xFE, + 0x0F, 0xC0, 0x1F, 0x81, 0xF8, 0x03, 0xF0, 0x3F, 0x00, 0xFC, 0x07, 0xE0, + 0x1F, 0x81, 0xFC, 0x03, 0xE0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x1F, 0x81, + 0xFC, 0x03, 0xF0, 0x3F, 0x00, 0x7C, 0x07, 0xE0, 0x0F, 0x81, 0xF8, 0x03, + 0xF0, 0x3E, 0x00, 0x7E, 0x0F, 0xC0, 0x0F, 0x81, 0xF0, 0x01, 0xF0, 0x7C, + 0x00, 0x7F, 0x1F, 0x00, 0x0F, 0xFF, 0xC0, 0x01, 0xF3, 0xE0, 0x00, 0x3E, + 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0xFC, + 0x00, 0x00, 0x00, 0x3E, 0x00, 0x03, 0xF9, 0xF0, 0x1F, 0x1F, 0xC0, 0xF8, + 0x7E, 0x07, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xF8, 0x1F, 0x87, 0xE0, 0x7C, + 0x3F, 0x01, 0xF0, 0xFC, 0x0F, 0xC7, 0xE0, 0x3E, 0x1F, 0x80, 0xF8, 0x7E, + 0x07, 0xE3, 0xF0, 0x1F, 0x8F, 0xC0, 0x7C, 0x3F, 0x03, 0xF0, 0xFC, 0x0F, + 0xC3, 0xF0, 0x7E, 0x0F, 0xC3, 0xF8, 0x3F, 0x9B, 0xE0, 0x7F, 0xDF, 0x01, + 0xFE, 0x7C, 0x01, 0xF1, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x3E, 0x00, 0x00, + 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7C, 0x00, 0x03, 0xF8, + 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x71, 0xE1, 0xFF, 0x3E, 0x07, 0xE7, 0xF0, + 0x7E, 0xFF, 0x07, 0xE9, 0xE0, 0x7D, 0x0E, 0x07, 0xD0, 0x00, 0xFE, 0x00, + 0x0F, 0xE0, 0x00, 0xFC, 0x00, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, + 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, + 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xC0, 0x00, 0x01, + 0xF1, 0x07, 0xFF, 0x0F, 0x0F, 0x0E, 0x07, 0x1E, 0x06, 0x1E, 0x06, 0x1F, + 0x02, 0x1F, 0x02, 0x1F, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, + 0xF8, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFC, 0x40, 0x7C, 0x40, 0x7C, 0x60, + 0x3C, 0xE0, 0x38, 0xF0, 0x38, 0xF8, 0xF0, 0xDF, 0xC0, 0x00, 0x20, 0x03, + 0x00, 0x38, 0x03, 0x80, 0x3C, 0x03, 0xE0, 0x7F, 0x07, 0xFF, 0x3F, 0xF8, + 0x7C, 0x07, 0xE0, 0x3F, 0x01, 0xF0, 0x0F, 0x80, 0xFC, 0x07, 0xC0, 0x3E, + 0x03, 0xF0, 0x1F, 0x80, 0xF8, 0x07, 0xC0, 0x7E, 0x03, 0xF1, 0x1F, 0x08, + 0xF8, 0x87, 0xC8, 0x3F, 0xC1, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x40, 0x00, + 0x1F, 0x03, 0xF7, 0xF8, 0x0F, 0x87, 0xE0, 0x3E, 0x1F, 0x81, 0xF8, 0x7E, + 0x07, 0xC1, 0xF0, 0x1F, 0x07, 0xC0, 0xFC, 0x3F, 0x03, 0xE0, 0xF8, 0x0F, + 0x83, 0xE0, 0x7E, 0x0F, 0x81, 0xF8, 0x7E, 0x0F, 0xC1, 0xF0, 0x3F, 0x07, + 0xC1, 0xFC, 0x1F, 0x07, 0xE0, 0xF8, 0x2F, 0x83, 0xE1, 0x3C, 0x6F, 0x8D, + 0xF1, 0x3E, 0x67, 0xC8, 0xFF, 0x1F, 0xE3, 0xF8, 0x7F, 0x07, 0xC0, 0xF0, + 0x00, 0x06, 0x07, 0x1F, 0x07, 0xBF, 0x83, 0xE7, 0xC1, 0xF3, 0xE0, 0xF9, + 0xF8, 0x3C, 0x7C, 0x0C, 0x3E, 0x06, 0x1F, 0x03, 0x0F, 0x83, 0x07, 0xC1, + 0x83, 0xE1, 0x81, 0xF1, 0x80, 0xF9, 0x80, 0x7C, 0xC0, 0x3E, 0xC0, 0x1F, + 0xC0, 0x0F, 0xC0, 0x07, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0xC0, 0x00, + 0x40, 0x00, 0x06, 0x01, 0x81, 0xC7, 0xC0, 0x30, 0x7F, 0xF8, 0x0E, 0x0F, + 0x9F, 0x01, 0xC1, 0xF3, 0xE0, 0x78, 0x3E, 0x7C, 0x1F, 0x03, 0xCF, 0xC3, + 0xE0, 0x30, 0xF8, 0xFC, 0x06, 0x1F, 0x1F, 0xC0, 0x83, 0xE7, 0xF8, 0x30, + 0x7C, 0xFF, 0x04, 0x0F, 0xB7, 0xE1, 0x81, 0xF6, 0xFC, 0x60, 0x3F, 0x8F, + 0x98, 0x07, 0xE1, 0xF3, 0x00, 0xFC, 0x3E, 0xC0, 0x1F, 0x07, 0xF0, 0x03, + 0xE0, 0xFC, 0x00, 0x78, 0x1F, 0x80, 0x0F, 0x03, 0xE0, 0x01, 0xC0, 0x78, + 0x00, 0x30, 0x0E, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0xF0, 0x1E, 0x0F, + 0xF0, 0x3E, 0x01, 0xF8, 0x7F, 0x01, 0xF8, 0xFF, 0x00, 0xF9, 0x8E, 0x00, + 0xFB, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFE, 0x00, 0x01, 0xBF, 0x00, 0x01, + 0xBF, 0x08, 0x73, 0x1F, 0x18, 0xFF, 0x1F, 0x30, 0xFE, 0x1F, 0xE0, 0xFC, + 0x0F, 0xC0, 0x78, 0x07, 0x80, 0x00, 0x30, 0x1C, 0x0F, 0xF0, 0x7C, 0x07, + 0xE0, 0xF8, 0x0F, 0xC1, 0xF0, 0x0F, 0xC1, 0xE0, 0x1F, 0x81, 0xC0, 0x3F, + 0x03, 0x00, 0x3E, 0x06, 0x00, 0x7E, 0x08, 0x00, 0xFC, 0x30, 0x01, 0xF8, + 0x60, 0x01, 0xF1, 0x80, 0x03, 0xE3, 0x00, 0x07, 0xCC, 0x00, 0x0F, 0xD8, + 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, + 0x00, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x01, 0xC1, 0x80, 0x07, 0xE6, + 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x07, + 0xFF, 0xE1, 0xFF, 0xF8, 0x3F, 0xFF, 0x07, 0xFF, 0xC0, 0x80, 0x70, 0x30, + 0x1C, 0x04, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x38, 0x00, 0x0E, 0x00, 0x03, + 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0xC0, 0x00, 0x30, + 0x00, 0x0C, 0x00, 0x03, 0xE0, 0x00, 0xFE, 0x00, 0x1F, 0xE0, 0xC7, 0xFC, + 0x3D, 0xCF, 0xC7, 0x90, 0xF8, 0xF0, 0x07, 0x9C, 0x00, 0x3E, 0x00, 0x00, + 0x01, 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, + 0x07, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7E, 0x00, + 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x3E, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, + 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x7C, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, + 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x03, 0xE0, 0x00, + 0x7C, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, + 0x03, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x03, 0xFF, 0x01, 0x3F, + 0xFE, 0x1D, 0xFF, 0xFF, 0xFE, 0x0F, 0xFF, 0x00, 0x1F, 0xF0, 0x00, 0x1F, + 0x00 }; + +const GFXglyph FreeSerifBoldItalic24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 15, 33, 18, 3, -31 }, // 0x21 '!' + { 62, 19, 13, 26, 6, -31 }, // 0x22 '"' + { 93, 27, 33, 23, -2, -32 }, // 0x23 '#' + { 205, 24, 39, 24, -1, -33 }, // 0x24 '$' + { 322, 35, 32, 39, 2, -30 }, // 0x25 '%' + { 462, 33, 33, 37, 0, -31 }, // 0x26 '&' + { 599, 7, 13, 13, 6, -31 }, // 0x27 ''' + { 611, 14, 41, 16, 1, -31 }, // 0x28 '(' + { 683, 14, 41, 16, -2, -31 }, // 0x29 ')' + { 755, 19, 20, 23, 3, -31 }, // 0x2A '*' + { 803, 22, 23, 27, 2, -22 }, // 0x2B '+' + { 867, 10, 15, 12, -3, -5 }, // 0x2C ',' + { 886, 12, 5, 16, 0, -12 }, // 0x2D '-' + { 894, 8, 7, 12, 0, -5 }, // 0x2E '.' + { 901, 19, 33, 16, 0, -31 }, // 0x2F '/' + { 980, 22, 33, 23, 1, -31 }, // 0x30 '0' + { 1071, 20, 32, 23, 0, -31 }, // 0x31 '1' + { 1151, 22, 32, 23, 1, -31 }, // 0x32 '2' + { 1239, 22, 33, 24, 0, -31 }, // 0x33 '3' + { 1330, 25, 32, 23, 0, -31 }, // 0x34 '4' + { 1430, 24, 32, 24, 0, -30 }, // 0x35 '5' + { 1526, 23, 32, 24, 1, -30 }, // 0x36 '6' + { 1618, 23, 31, 23, 3, -30 }, // 0x37 '7' + { 1708, 21, 33, 23, 1, -31 }, // 0x38 '8' + { 1795, 23, 33, 23, 0, -31 }, // 0x39 '9' + { 1890, 13, 22, 12, 0, -20 }, // 0x3A ':' + { 1926, 15, 30, 12, -2, -20 }, // 0x3B ';' + { 1983, 24, 25, 27, 1, -23 }, // 0x3C '<' + { 2058, 24, 14, 27, 3, -18 }, // 0x3D '=' + { 2100, 24, 25, 27, 3, -23 }, // 0x3E '>' + { 2175, 18, 33, 24, 4, -31 }, // 0x3F '?' + { 2250, 33, 33, 39, 3, -31 }, // 0x40 '@' + { 2387, 31, 32, 33, 0, -31 }, // 0x41 'A' + { 2511, 31, 31, 30, 0, -30 }, // 0x42 'B' + { 2632, 29, 33, 29, 2, -31 }, // 0x43 'C' + { 2752, 35, 31, 34, 0, -30 }, // 0x44 'D' + { 2888, 32, 31, 30, 0, -30 }, // 0x45 'E' + { 3012, 31, 31, 29, 0, -30 }, // 0x46 'F' + { 3133, 32, 33, 33, 2, -31 }, // 0x47 'G' + { 3265, 39, 31, 35, 0, -30 }, // 0x48 'H' + { 3417, 21, 31, 18, 0, -30 }, // 0x49 'I' + { 3499, 27, 36, 23, 0, -30 }, // 0x4A 'J' + { 3621, 34, 31, 31, 0, -30 }, // 0x4B 'K' + { 3753, 29, 31, 29, 0, -30 }, // 0x4C 'L' + { 3866, 44, 32, 41, 0, -30 }, // 0x4D 'M' + { 4042, 37, 32, 33, 0, -30 }, // 0x4E 'N' + { 4190, 31, 33, 32, 2, -31 }, // 0x4F 'O' + { 4318, 31, 31, 28, 0, -30 }, // 0x50 'P' + { 4439, 31, 42, 32, 2, -31 }, // 0x51 'Q' + { 4602, 32, 31, 31, 0, -30 }, // 0x52 'R' + { 4726, 24, 33, 24, 0, -31 }, // 0x53 'S' + { 4825, 27, 31, 28, 4, -30 }, // 0x54 'T' + { 4930, 32, 32, 34, 5, -30 }, // 0x55 'U' + { 5058, 31, 32, 33, 6, -30 }, // 0x56 'V' + { 5182, 41, 32, 44, 6, -30 }, // 0x57 'W' + { 5346, 34, 31, 33, 0, -30 }, // 0x58 'X' + { 5478, 28, 31, 30, 6, -30 }, // 0x59 'Y' + { 5587, 28, 31, 26, 0, -30 }, // 0x5A 'Z' + { 5696, 19, 38, 16, -2, -30 }, // 0x5B '[' + { 5787, 13, 33, 19, 6, -31 }, // 0x5C '\' + { 5841, 19, 38, 16, -3, -30 }, // 0x5D ']' + { 5932, 21, 17, 27, 3, -30 }, // 0x5E '^' + { 5977, 24, 3, 23, 0, 5 }, // 0x5F '_' + { 5986, 10, 9, 16, 4, -32 }, // 0x60 '`' + { 5998, 22, 23, 24, 1, -21 }, // 0x61 'a' + { 6062, 22, 33, 23, 1, -31 }, // 0x62 'b' + { 6153, 18, 23, 20, 1, -21 }, // 0x63 'c' + { 6205, 25, 34, 24, 1, -32 }, // 0x64 'd' + { 6312, 18, 23, 20, 1, -21 }, // 0x65 'e' + { 6364, 28, 41, 23, -4, -31 }, // 0x66 'f' + { 6508, 25, 31, 23, -1, -21 }, // 0x67 'g' + { 6605, 23, 34, 26, 1, -32 }, // 0x68 'h' + { 6703, 12, 33, 14, 2, -31 }, // 0x69 'i' + { 6753, 22, 42, 16, -4, -31 }, // 0x6A 'j' + { 6869, 24, 34, 24, 1, -32 }, // 0x6B 'k' + { 6971, 13, 34, 14, 2, -32 }, // 0x6C 'l' + { 7027, 35, 23, 36, 0, -21 }, // 0x6D 'm' + { 7128, 23, 23, 25, 0, -21 }, // 0x6E 'n' + { 7195, 20, 23, 22, 1, -21 }, // 0x6F 'o' + { 7253, 27, 31, 23, -4, -21 }, // 0x70 'p' + { 7358, 22, 31, 23, 1, -21 }, // 0x71 'q' + { 7444, 20, 22, 19, 0, -21 }, // 0x72 'r' + { 7499, 16, 23, 17, 0, -21 }, // 0x73 's' + { 7545, 13, 29, 13, 2, -27 }, // 0x74 't' + { 7593, 22, 23, 25, 2, -21 }, // 0x75 'u' + { 7657, 17, 23, 21, 3, -21 }, // 0x76 'v' + { 7706, 27, 23, 31, 3, -21 }, // 0x77 'w' + { 7784, 24, 23, 22, -1, -21 }, // 0x78 'x' + { 7853, 23, 31, 20, -3, -21 }, // 0x79 'y' + { 7943, 19, 25, 19, 0, -20 }, // 0x7A 'z' + { 8003, 20, 41, 16, 0, -31 }, // 0x7B '{' + { 8106, 4, 33, 13, 5, -31 }, // 0x7C '|' + { 8123, 20, 41, 16, -6, -31 }, // 0x7D '}' + { 8226, 21, 7, 27, 3, -14 } }; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic24pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic24pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 8917 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h new file mode 100644 index 0000000..47711ee --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h @@ -0,0 +1,215 @@ +const uint8_t FreeSerifBoldItalic9pt7bBitmaps[] PROGMEM = { + 0x0C, 0x31, 0xC6, 0x18, 0x41, 0x08, 0x20, 0x0E, 0x38, 0xE0, 0xCF, 0x38, + 0xA2, 0x88, 0x02, 0x40, 0xC8, 0x13, 0x06, 0x43, 0xFC, 0x32, 0x06, 0x40, + 0x98, 0x7F, 0x84, 0xC0, 0x90, 0x32, 0x04, 0xC0, 0x01, 0x01, 0xF0, 0x4B, + 0x99, 0x33, 0x24, 0x78, 0x07, 0x80, 0x38, 0x0B, 0x89, 0x31, 0x26, 0x64, + 0xC7, 0x30, 0x3C, 0x04, 0x00, 0x38, 0x41, 0x9F, 0x06, 0x48, 0x31, 0x60, + 0xCD, 0x03, 0x2C, 0x07, 0x27, 0x81, 0x39, 0x05, 0xC4, 0x26, 0x10, 0x98, + 0x84, 0x66, 0x10, 0xE0, 0x03, 0x80, 0x22, 0x03, 0x10, 0x19, 0x00, 0xF0, + 0x0F, 0x3C, 0xF8, 0xCC, 0xC4, 0xE7, 0x47, 0x3E, 0x38, 0xE1, 0xE7, 0x97, + 0xCF, 0x00, 0xFA, 0x80, 0x08, 0x88, 0x84, 0x62, 0x10, 0x84, 0x21, 0x08, + 0x41, 0x00, 0x20, 0x84, 0x10, 0x84, 0x21, 0x08, 0xC6, 0x23, 0x11, 0x00, + 0x18, 0x18, 0xD6, 0x38, 0x18, 0xF7, 0x18, 0x18, 0x08, 0x04, 0x02, 0x01, + 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0x6D, 0x95, 0x00, 0xFF, 0xC0, + 0xFF, 0x80, 0x06, 0x0C, 0x30, 0x60, 0x83, 0x04, 0x18, 0x20, 0xC1, 0x06, + 0x00, 0x0F, 0x0C, 0x8C, 0x6E, 0x37, 0x1B, 0x1F, 0x8F, 0xC7, 0xC7, 0x63, + 0xB1, 0x89, 0x83, 0x80, 0x06, 0x1E, 0x0E, 0x0E, 0x0C, 0x0C, 0x1C, 0x18, + 0x18, 0x18, 0x38, 0x38, 0xFC, 0x1F, 0x13, 0xD0, 0xE0, 0x70, 0x38, 0x38, + 0x18, 0x18, 0x18, 0x08, 0x08, 0x4F, 0xCF, 0xE0, 0x1F, 0x11, 0xC0, 0xE0, + 0x60, 0xC1, 0xF0, 0x38, 0x0C, 0x06, 0x03, 0x01, 0x19, 0x8F, 0x00, 0x00, + 0x80, 0xC0, 0xE1, 0xE0, 0xB0, 0x98, 0x9C, 0x8C, 0xFF, 0x07, 0x03, 0x01, + 0x80, 0x0F, 0x88, 0x08, 0x07, 0x83, 0xE0, 0x78, 0x1C, 0x06, 0x03, 0x01, + 0x80, 0x9C, 0x87, 0x80, 0x03, 0x87, 0x07, 0x07, 0x07, 0x03, 0xE3, 0x99, + 0xCC, 0xC6, 0x63, 0x33, 0x89, 0x87, 0x80, 0x3F, 0xBF, 0x90, 0x80, 0xC0, + 0x40, 0x60, 0x20, 0x30, 0x30, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x13, 0x31, + 0x31, 0x3A, 0x1C, 0x1C, 0x6E, 0xC6, 0xC6, 0xC6, 0x44, 0x38, 0x0E, 0x1C, + 0x8C, 0x6C, 0x36, 0x3B, 0x1D, 0x8E, 0x7E, 0x0E, 0x07, 0x07, 0x0E, 0x0C, + 0x00, 0x39, 0xCE, 0x00, 0x03, 0x9C, 0xE0, 0x39, 0xCE, 0x00, 0x01, 0x8C, + 0x22, 0x20, 0x00, 0x01, 0xC3, 0xC7, 0x8E, 0x06, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x60, 0x1E, 0x03, + 0xC0, 0x78, 0x1C, 0x3C, 0x78, 0xF0, 0x40, 0x00, 0x1C, 0x27, 0x37, 0x07, + 0x0E, 0x1C, 0x30, 0x60, 0x40, 0x00, 0xE0, 0xE0, 0xE0, 0x0F, 0x80, 0xC3, + 0x08, 0x04, 0xC3, 0x3C, 0x24, 0xE2, 0x27, 0x33, 0x39, 0x11, 0xC9, 0x93, + 0x77, 0x18, 0x00, 0x70, 0x40, 0xFC, 0x00, 0x00, 0x80, 0x18, 0x01, 0x80, + 0x38, 0x05, 0x80, 0x5C, 0x09, 0xC1, 0x1C, 0x1F, 0xC2, 0x0C, 0x20, 0xC4, + 0x0E, 0xF3, 0xF0, 0x3F, 0xE0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0xE1, 0xF0, + 0x39, 0xC3, 0x8E, 0x38, 0xE3, 0x0E, 0x71, 0xE7, 0x1C, 0xFF, 0x00, 0x07, + 0xD1, 0xC7, 0x38, 0x27, 0x02, 0x70, 0x0F, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0x60, 0x87, 0x18, 0x1E, 0x00, 0x3F, 0xE0, 0x30, 0xE0, 0xC1, + 0x87, 0x07, 0x1C, 0x1C, 0x60, 0x73, 0x81, 0xCE, 0x07, 0x38, 0x38, 0xC0, + 0xE7, 0x07, 0x1C, 0x78, 0xFF, 0x80, 0x1F, 0xF8, 0x61, 0xC3, 0x04, 0x38, + 0x81, 0xCC, 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x81, 0x1C, 0x18, + 0xE3, 0x8F, 0xFC, 0x00, 0x3F, 0xF8, 0x61, 0xC3, 0x04, 0x38, 0x81, 0xCC, + 0x0F, 0xE0, 0xE2, 0x07, 0x10, 0x38, 0x81, 0x80, 0x1C, 0x00, 0xE0, 0x0F, + 0x80, 0x00, 0x07, 0x91, 0xC7, 0x38, 0x27, 0x00, 0x70, 0x0F, 0x00, 0xE1, + 0xFE, 0x0E, 0xE0, 0xCE, 0x0C, 0x60, 0xC7, 0x1C, 0x1F, 0x00, 0x1F, 0x7E, + 0x1C, 0x38, 0x30, 0x60, 0xE1, 0xC1, 0xC3, 0x83, 0x06, 0x0F, 0xFC, 0x1C, + 0x38, 0x38, 0x70, 0x60, 0xC1, 0xC3, 0x83, 0x87, 0x0F, 0x9F, 0x00, 0x3F, + 0x0C, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0xF8, + 0x07, 0xC0, 0xE0, 0x38, 0x0C, 0x07, 0x01, 0xC0, 0x70, 0x18, 0x0E, 0x03, + 0x80, 0xC3, 0x30, 0xDC, 0x1E, 0x00, 0x1F, 0x78, 0x71, 0x83, 0x18, 0x39, + 0x81, 0xD0, 0x0D, 0x00, 0xFC, 0x07, 0x60, 0x3B, 0x81, 0x8C, 0x1C, 0x70, + 0xE1, 0x8F, 0xBE, 0x00, 0x1F, 0x00, 0xC0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, + 0x80, 0x38, 0x03, 0x80, 0x38, 0x03, 0x01, 0x70, 0x37, 0x0E, 0xFF, 0xE0, + 0x1E, 0x07, 0x87, 0x07, 0x83, 0x83, 0x82, 0xC3, 0xC1, 0x62, 0xE0, 0xB1, + 0x70, 0x99, 0x30, 0x4D, 0xB8, 0x27, 0x9C, 0x13, 0x8C, 0x11, 0xC6, 0x0C, + 0xC7, 0x0F, 0x47, 0xC0, 0x3C, 0x3C, 0x38, 0x20, 0xE0, 0x85, 0xC4, 0x13, + 0x10, 0x4E, 0x42, 0x3A, 0x08, 0x78, 0x21, 0xE0, 0x83, 0x84, 0x0C, 0x18, + 0x10, 0x00, 0x40, 0x07, 0xC1, 0xCE, 0x38, 0x73, 0x87, 0x70, 0x77, 0x07, + 0xF0, 0xFE, 0x0E, 0xE0, 0xEE, 0x1C, 0xE1, 0xC6, 0x38, 0x3E, 0x00, 0x3F, + 0xC0, 0xC7, 0x0C, 0x71, 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0xC3, 0x80, 0x30, + 0x03, 0x00, 0x70, 0x07, 0x00, 0xF8, 0x00, 0x07, 0xC0, 0xCE, 0x38, 0x73, + 0x87, 0x70, 0x77, 0x07, 0xF0, 0x7E, 0x0E, 0xE0, 0xEE, 0x0C, 0xE1, 0xC6, + 0x38, 0x36, 0x01, 0x80, 0x3C, 0x2D, 0xFC, 0x3F, 0xC0, 0xE7, 0x0C, 0x71, + 0xC7, 0x1C, 0x71, 0x8E, 0x3F, 0x83, 0xB8, 0x3B, 0x83, 0x3C, 0x71, 0xC7, + 0x1C, 0xF9, 0xF0, 0x0C, 0x89, 0x8C, 0x46, 0x23, 0x80, 0xE0, 0x78, 0x0E, + 0x03, 0x21, 0x90, 0xCC, 0xC9, 0xC0, 0x7F, 0xE9, 0xDF, 0x31, 0x4E, 0x21, + 0xC0, 0x38, 0x06, 0x01, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x38, 0x0F, 0xC0, + 0x7C, 0xF3, 0x82, 0x30, 0x27, 0x04, 0x70, 0x46, 0x04, 0xE0, 0x4E, 0x08, + 0xE0, 0x8E, 0x08, 0xE1, 0x0F, 0x30, 0x3C, 0x00, 0xFC, 0x73, 0x82, 0x38, + 0x23, 0x84, 0x38, 0x83, 0x90, 0x39, 0x01, 0xA0, 0x1C, 0x01, 0xC0, 0x18, + 0x01, 0x00, 0xF9, 0xF7, 0x30, 0xE2, 0x30, 0xC2, 0x38, 0xC4, 0x3B, 0xC4, + 0x3A, 0xE8, 0x3C, 0xE8, 0x3C, 0xF0, 0x18, 0xF0, 0x18, 0x60, 0x10, 0x60, + 0x10, 0x40, 0x3F, 0x78, 0x61, 0x83, 0x98, 0x1D, 0x00, 0x70, 0x03, 0x80, + 0x1C, 0x01, 0x60, 0x0B, 0x80, 0x9C, 0x08, 0x60, 0xC3, 0x8F, 0x7E, 0x00, + 0xF9, 0xE6, 0x18, 0xC2, 0x1C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0xC0, 0x18, + 0x07, 0x00, 0xE0, 0x1C, 0x0F, 0xC0, 0x3F, 0xE6, 0x19, 0x87, 0x21, 0xC0, + 0x30, 0x0E, 0x03, 0x80, 0x60, 0x1C, 0x07, 0x05, 0xC1, 0x38, 0xEF, 0xFC, + 0x0E, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, 0x30, 0x20, 0x60, 0x60, + 0x60, 0x40, 0xF0, 0xC6, 0x10, 0xC6, 0x10, 0x86, 0x30, 0x86, 0x30, 0x1E, + 0x0C, 0x18, 0x20, 0xC1, 0x83, 0x04, 0x18, 0x30, 0x60, 0x83, 0x06, 0x3C, + 0x00, 0x18, 0x1C, 0x34, 0x26, 0x66, 0x43, 0xC3, 0xFF, 0x80, 0xC6, 0x30, + 0x0D, 0x9D, 0x8C, 0xCC, 0x6E, 0x26, 0x33, 0x19, 0xBE, 0x66, 0x00, 0x00, + 0x78, 0x18, 0x30, 0x30, 0x3E, 0x73, 0x63, 0x63, 0x63, 0xC6, 0xC6, 0xCC, + 0x70, 0x0F, 0x3B, 0x70, 0x70, 0xE0, 0xE0, 0xE2, 0xE4, 0x78, 0x00, 0x00, + 0xF0, 0x1C, 0x06, 0x01, 0x83, 0xE3, 0x30, 0xCC, 0x63, 0x19, 0xCC, 0x63, + 0x38, 0xCF, 0x1D, 0x80, 0x0E, 0x75, 0xCB, 0xBE, 0xDE, 0x38, 0x72, 0x78, + 0x00, 0xE0, 0x34, 0x0C, 0x01, 0x80, 0x30, 0x1F, 0x01, 0x80, 0x30, 0x06, + 0x01, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x30, 0x06, 0x04, 0x80, 0xE0, 0x00, + 0x1C, 0x19, 0xD8, 0xCC, 0x66, 0x60, 0xE1, 0x80, 0xF0, 0x7E, 0x43, 0x21, + 0x8F, 0x00, 0x00, 0x1E, 0x07, 0x03, 0x01, 0x80, 0xD8, 0xFC, 0x76, 0x33, + 0x19, 0x99, 0xCC, 0xD6, 0x77, 0x30, 0x39, 0xC0, 0x0F, 0x31, 0x8C, 0xC6, + 0x31, 0xAE, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x18, + 0x0C, 0x06, 0x03, 0x03, 0x01, 0x80, 0xC2, 0xC1, 0xC0, 0x00, 0x0F, 0x00, + 0xC0, 0x60, 0x18, 0x06, 0xF3, 0x90, 0xC8, 0x34, 0x0F, 0x06, 0xC1, 0x98, + 0x66, 0xB9, 0xC0, 0x03, 0xCC, 0x63, 0x39, 0x8C, 0x66, 0x31, 0x8E, 0x70, + 0x7B, 0x99, 0xAF, 0xCE, 0x66, 0x63, 0x67, 0x33, 0x31, 0x99, 0x8C, 0xCC, + 0xE7, 0xC6, 0x30, 0x73, 0x7F, 0x73, 0x73, 0x63, 0x67, 0xE6, 0xC7, 0xC6, + 0x1E, 0x33, 0x63, 0x63, 0xC3, 0xC6, 0xC6, 0xCC, 0x78, 0x1D, 0xC3, 0xB1, + 0xCC, 0x63, 0x19, 0xCE, 0x63, 0x18, 0xCC, 0x3E, 0x1C, 0x06, 0x03, 0xE0, + 0x0D, 0x99, 0x8C, 0xCC, 0x6E, 0x76, 0x33, 0x19, 0x9C, 0x7C, 0x06, 0x07, + 0x07, 0xC0, 0x76, 0x3A, 0x30, 0x70, 0x60, 0x60, 0x60, 0xE0, 0x3D, 0x14, + 0x58, 0x38, 0x60, 0xA2, 0xF0, 0x08, 0xCC, 0xF6, 0x31, 0x98, 0xC6, 0x35, + 0xC0, 0xE3, 0x63, 0x66, 0x66, 0x66, 0xCC, 0xCC, 0xFE, 0xEC, 0xE6, 0xCD, + 0x8B, 0x26, 0x8E, 0x18, 0x20, 0xE4, 0xD9, 0x36, 0xE5, 0xDA, 0x77, 0x19, + 0xC6, 0x61, 0x10, 0x39, 0xC7, 0xB0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xE1, + 0x5A, 0x67, 0x00, 0x39, 0x8C, 0xC3, 0x21, 0xA0, 0xD0, 0x68, 0x38, 0x0C, + 0x04, 0x04, 0x14, 0x0C, 0x00, 0x3E, 0x46, 0x0C, 0x08, 0x10, 0x20, 0x70, + 0x1A, 0x0E, 0x03, 0x0E, 0x0C, 0x0C, 0x08, 0x18, 0x18, 0x10, 0x60, 0x30, + 0x30, 0x30, 0x60, 0x60, 0x60, 0x30, 0xFF, 0xF0, 0x0C, 0x06, 0x06, 0x06, + 0x04, 0x0C, 0x0C, 0x0C, 0x06, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0xE0, + 0x71, 0x8F }; + +const GFXglyph FreeSerifBoldItalic9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 6, 13, 7, 1, -11 }, // 0x21 '!' + { 10, 6, 5, 10, 3, -11 }, // 0x22 '"' + { 14, 11, 13, 9, -1, -12 }, // 0x23 '#' + { 32, 11, 15, 9, -1, -12 }, // 0x24 '$' + { 53, 14, 13, 15, 1, -11 }, // 0x25 '%' + { 76, 13, 13, 14, 0, -11 }, // 0x26 '&' + { 98, 2, 5, 5, 3, -11 }, // 0x27 ''' + { 100, 5, 16, 6, 1, -11 }, // 0x28 '(' + { 110, 5, 16, 6, -1, -11 }, // 0x29 ')' + { 120, 8, 8, 9, 1, -11 }, // 0x2A '*' + { 128, 9, 9, 10, 0, -8 }, // 0x2B '+' + { 139, 3, 6, 5, -1, -2 }, // 0x2C ',' + { 142, 5, 2, 6, 0, -4 }, // 0x2D '-' + { 144, 3, 3, 4, 0, -1 }, // 0x2E '.' + { 146, 7, 12, 6, 0, -11 }, // 0x2F '/' + { 157, 9, 13, 9, 0, -11 }, // 0x30 '0' + { 172, 8, 13, 9, 0, -11 }, // 0x31 '1' + { 185, 9, 13, 9, 0, -11 }, // 0x32 '2' + { 200, 9, 13, 9, 0, -11 }, // 0x33 '3' + { 215, 9, 12, 9, 0, -11 }, // 0x34 '4' + { 229, 9, 13, 9, 0, -11 }, // 0x35 '5' + { 244, 9, 13, 9, 1, -11 }, // 0x36 '6' + { 259, 9, 12, 9, 1, -11 }, // 0x37 '7' + { 273, 8, 13, 9, 0, -11 }, // 0x38 '8' + { 286, 9, 13, 9, 0, -11 }, // 0x39 '9' + { 301, 5, 9, 5, 0, -7 }, // 0x3A ':' + { 307, 5, 11, 5, 0, -7 }, // 0x3B ';' + { 314, 9, 10, 10, 1, -9 }, // 0x3C '<' + { 326, 9, 5, 10, 1, -6 }, // 0x3D '=' + { 332, 9, 10, 10, 1, -9 }, // 0x3E '>' + { 344, 8, 13, 9, 1, -11 }, // 0x3F '?' + { 357, 13, 13, 15, 1, -12 }, // 0x40 '@' + { 379, 12, 13, 13, 0, -11 }, // 0x41 'A' + { 399, 12, 13, 12, 0, -11 }, // 0x42 'B' + { 419, 12, 13, 11, 1, -11 }, // 0x43 'C' + { 439, 14, 13, 13, 0, -11 }, // 0x44 'D' + { 462, 13, 13, 11, 0, -11 }, // 0x45 'E' + { 484, 13, 13, 11, 0, -11 }, // 0x46 'F' + { 506, 12, 13, 13, 1, -11 }, // 0x47 'G' + { 526, 15, 13, 14, 0, -11 }, // 0x48 'H' + { 551, 8, 13, 7, 0, -11 }, // 0x49 'I' + { 564, 10, 14, 9, 0, -11 }, // 0x4A 'J' + { 582, 13, 13, 12, 0, -11 }, // 0x4B 'K' + { 604, 12, 13, 11, 0, -11 }, // 0x4C 'L' + { 624, 17, 13, 16, 0, -11 }, // 0x4D 'M' + { 652, 14, 13, 13, 0, -11 }, // 0x4E 'N' + { 675, 12, 13, 12, 1, -11 }, // 0x4F 'O' + { 695, 12, 13, 11, 0, -11 }, // 0x50 'P' + { 715, 12, 16, 12, 1, -11 }, // 0x51 'Q' + { 739, 12, 13, 12, 0, -11 }, // 0x52 'R' + { 759, 9, 13, 9, 0, -11 }, // 0x53 'S' + { 774, 11, 13, 11, 2, -11 }, // 0x54 'T' + { 792, 12, 13, 13, 2, -11 }, // 0x55 'U' + { 812, 12, 12, 13, 2, -11 }, // 0x56 'V' + { 830, 16, 12, 17, 2, -11 }, // 0x57 'W' + { 854, 13, 13, 13, 0, -11 }, // 0x58 'X' + { 876, 11, 13, 11, 2, -11 }, // 0x59 'Y' + { 894, 11, 13, 10, 0, -11 }, // 0x5A 'Z' + { 912, 8, 15, 6, -1, -11 }, // 0x5B '[' + { 927, 5, 12, 7, 2, -11 }, // 0x5C '\' + { 935, 7, 15, 6, -1, -11 }, // 0x5D ']' + { 949, 8, 7, 10, 1, -11 }, // 0x5E '^' + { 956, 9, 1, 9, 0, 3 }, // 0x5F '_' + { 958, 4, 3, 6, 2, -11 }, // 0x60 '`' + { 960, 9, 9, 9, 0, -7 }, // 0x61 'a' + { 971, 8, 14, 9, 0, -12 }, // 0x62 'b' + { 985, 8, 9, 8, 0, -7 }, // 0x63 'c' + { 994, 10, 14, 9, 0, -12 }, // 0x64 'd' + { 1012, 7, 9, 7, 0, -7 }, // 0x65 'e' + { 1020, 11, 17, 9, -2, -12 }, // 0x66 'f' + { 1044, 9, 12, 9, 0, -7 }, // 0x67 'g' + { 1058, 9, 14, 10, 0, -12 }, // 0x68 'h' + { 1074, 5, 13, 5, 1, -11 }, // 0x69 'i' + { 1083, 9, 16, 6, -1, -11 }, // 0x6A 'j' + { 1101, 10, 14, 9, 0, -12 }, // 0x6B 'k' + { 1119, 5, 14, 5, 1, -12 }, // 0x6C 'l' + { 1128, 13, 9, 14, 0, -7 }, // 0x6D 'm' + { 1143, 8, 9, 9, 0, -7 }, // 0x6E 'n' + { 1152, 8, 9, 9, 0, -7 }, // 0x6F 'o' + { 1161, 10, 12, 9, -2, -7 }, // 0x70 'p' + { 1176, 9, 12, 9, 0, -7 }, // 0x71 'q' + { 1190, 8, 8, 7, 0, -7 }, // 0x72 'r' + { 1198, 6, 9, 6, 0, -7 }, // 0x73 's' + { 1205, 5, 12, 5, 1, -10 }, // 0x74 't' + { 1213, 8, 9, 10, 1, -7 }, // 0x75 'u' + { 1222, 7, 8, 8, 1, -7 }, // 0x76 'v' + { 1229, 10, 8, 12, 1, -7 }, // 0x77 'w' + { 1239, 10, 9, 9, -1, -7 }, // 0x78 'x' + { 1251, 9, 12, 8, -1, -7 }, // 0x79 'y' + { 1265, 8, 9, 7, 0, -7 }, // 0x7A 'z' + { 1274, 8, 16, 6, 0, -12 }, // 0x7B '{' + { 1290, 1, 12, 5, 2, -11 }, // 0x7C '|' + { 1292, 8, 16, 6, -2, -12 }, // 0x7D '}' + { 1308, 8, 2, 10, 1, -4 } }; // 0x7E '~' + +const GFXfont FreeSerifBoldItalic9pt7b PROGMEM = { + (uint8_t *)FreeSerifBoldItalic9pt7bBitmaps, + (GFXglyph *)FreeSerifBoldItalic9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1982 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic12pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic12pt7b.h new file mode 100644 index 0000000..52332a7 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic12pt7b.h @@ -0,0 +1,271 @@ +const uint8_t FreeSerifItalic12pt7bBitmaps[] PROGMEM = { + 0x0C, 0x31, 0xC6, 0x18, 0x43, 0x0C, 0x20, 0x84, 0x10, 0x03, 0x0C, 0x30, + 0x66, 0xCD, 0x12, 0x24, 0x51, 0x00, 0x03, 0x10, 0x11, 0x80, 0x8C, 0x0C, + 0x40, 0x46, 0x1F, 0xFC, 0x21, 0x01, 0x18, 0x18, 0x80, 0x84, 0x3F, 0xF8, + 0x62, 0x02, 0x30, 0x31, 0x01, 0x08, 0x08, 0xC0, 0x00, 0x40, 0x08, 0x07, + 0xC0, 0xCA, 0x18, 0xA1, 0x92, 0x19, 0x01, 0xD0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x2E, 0x02, 0x64, 0x46, 0x44, 0x64, 0x46, 0x64, 0xC1, 0xF0, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x0F, 0x0C, 0x0C, 0x7C, 0x0C, 0x22, 0x06, 0x12, + 0x06, 0x09, 0x03, 0x09, 0x01, 0x84, 0x80, 0xC4, 0x8F, 0x3C, 0x4C, 0x40, + 0x4C, 0x20, 0x4E, 0x10, 0x26, 0x08, 0x23, 0x08, 0x11, 0x84, 0x10, 0xC4, + 0x08, 0x3C, 0x00, 0x00, 0xE0, 0x02, 0x60, 0x0C, 0xC0, 0x19, 0x80, 0x36, + 0x00, 0x70, 0x00, 0xC0, 0x07, 0x9F, 0x33, 0x08, 0xC3, 0x13, 0x06, 0x46, + 0x0D, 0x0C, 0x0C, 0x18, 0x1C, 0x1C, 0x5C, 0x9F, 0x1E, 0xFA, 0xA0, 0x02, + 0x08, 0x20, 0xC3, 0x06, 0x18, 0x30, 0xE1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0x40, 0x80, 0x81, 0x00, 0x08, 0x10, 0x10, 0x20, 0x40, 0xC1, 0x83, + 0x06, 0x0C, 0x18, 0x70, 0xC1, 0x83, 0x0C, 0x10, 0x41, 0x04, 0x00, 0x18, + 0x18, 0x18, 0x93, 0x74, 0x38, 0xD7, 0x93, 0x18, 0x18, 0x04, 0x00, 0x80, + 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, + 0x00, 0x6C, 0x95, 0x00, 0xF8, 0xFC, 0x00, 0x40, 0x18, 0x02, 0x00, 0xC0, + 0x30, 0x06, 0x01, 0x80, 0x20, 0x0C, 0x01, 0x00, 0x60, 0x18, 0x03, 0x00, + 0xC0, 0x10, 0x06, 0x00, 0x07, 0x81, 0x98, 0x61, 0x18, 0x33, 0x06, 0xC0, + 0xD8, 0x1B, 0x03, 0xE0, 0xF8, 0x1F, 0x03, 0x60, 0x6C, 0x19, 0x83, 0x10, + 0xC3, 0x30, 0x3C, 0x00, 0x01, 0x87, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x18, + 0x0C, 0x06, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, 0xFE, 0x00, + 0x0F, 0x0C, 0x64, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x18, 0x0C, 0x02, 0x01, + 0x00, 0x80, 0x40, 0x20, 0x10, 0x2F, 0xF0, 0x07, 0x86, 0x30, 0x0C, 0x03, + 0x01, 0x81, 0x81, 0xF0, 0x1E, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0x00, + 0xCC, 0x63, 0xE0, 0x00, 0x20, 0x0C, 0x03, 0x80, 0xA0, 0x2C, 0x09, 0x82, + 0x30, 0x84, 0x31, 0x8C, 0x33, 0x06, 0x7F, 0xE0, 0x30, 0x06, 0x00, 0x80, + 0x30, 0x03, 0xE1, 0x80, 0x20, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x06, + 0x00, 0xC0, 0x18, 0x03, 0x00, 0x40, 0x18, 0x02, 0x30, 0x87, 0xE0, 0x00, + 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x7F, 0x07, 0x18, 0x60, + 0xCE, 0x0C, 0xC0, 0xCC, 0x0C, 0xC0, 0xCC, 0x18, 0x41, 0x86, 0x30, 0x3E, + 0x00, 0x7F, 0xF0, 0x18, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x01, 0x80, 0x30, + 0x0C, 0x01, 0x00, 0x60, 0x08, 0x03, 0x00, 0xC0, 0x10, 0x06, 0x00, 0x0F, + 0x83, 0x18, 0xC1, 0x98, 0x33, 0x06, 0x71, 0x87, 0x60, 0x70, 0x17, 0x0C, + 0x71, 0x07, 0x60, 0x6C, 0x0D, 0x81, 0xB0, 0x63, 0x1C, 0x3E, 0x00, 0x07, + 0x83, 0x18, 0xC1, 0x18, 0x36, 0x06, 0xC0, 0xD8, 0x1B, 0x07, 0x60, 0xE6, + 0x38, 0x7F, 0x00, 0xC0, 0x30, 0x0C, 0x07, 0x03, 0xC0, 0xC0, 0x00, 0x33, + 0x30, 0x00, 0x00, 0xCC, 0xC0, 0x18, 0xC6, 0x00, 0x00, 0x00, 0x03, 0x18, + 0x44, 0x40, 0x00, 0x00, 0x03, 0x00, 0xF0, 0x38, 0x1E, 0x07, 0x80, 0xE0, + 0x0F, 0x00, 0x1C, 0x00, 0x78, 0x01, 0xE0, 0x07, 0x00, 0x10, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x0C, 0x00, 0xF0, 0x01, + 0xC0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x0F, 0x03, 0xC1, 0xE0, 0x78, 0x0E, + 0x00, 0x80, 0x00, 0x3E, 0x21, 0x90, 0x60, 0x30, 0x38, 0x38, 0x30, 0x30, + 0x20, 0x20, 0x10, 0x00, 0x00, 0x06, 0x03, 0x01, 0x80, 0x07, 0xE0, 0x1C, + 0x18, 0x30, 0x04, 0x60, 0x02, 0x61, 0xDA, 0xC3, 0x31, 0xC6, 0x31, 0xC4, + 0x31, 0xCC, 0x31, 0xCC, 0x21, 0xCC, 0x62, 0x6C, 0xE4, 0x67, 0x38, 0x30, + 0x00, 0x1C, 0x08, 0x07, 0xF0, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x80, 0x0B, + 0x00, 0x16, 0x00, 0x4E, 0x00, 0x9C, 0x02, 0x18, 0x08, 0x30, 0x1F, 0xE0, + 0x40, 0xC1, 0x81, 0xC2, 0x03, 0x8C, 0x07, 0x3C, 0x1F, 0x80, 0x1F, 0xF0, + 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x60, 0xC3, 0x03, 0xF0, + 0x1C, 0x30, 0x60, 0x61, 0x81, 0x86, 0x06, 0x38, 0x18, 0xC0, 0xC3, 0x06, + 0x3F, 0xF0, 0x01, 0xF9, 0x06, 0x0F, 0x1C, 0x06, 0x38, 0x02, 0x30, 0x02, + 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, + 0xC0, 0x00, 0xC0, 0x08, 0x60, 0x10, 0x30, 0x60, 0x1F, 0x80, 0x1F, 0xF0, + 0x07, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x0E, 0x03, 0x0C, 0x03, + 0x0C, 0x03, 0x1C, 0x03, 0x1C, 0x07, 0x18, 0x06, 0x18, 0x06, 0x38, 0x0C, + 0x30, 0x18, 0x30, 0x70, 0xFF, 0x80, 0x1F, 0xFF, 0x07, 0x07, 0x06, 0x02, + 0x06, 0x02, 0x06, 0x00, 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20, + 0x18, 0x20, 0x18, 0x00, 0x18, 0x00, 0x38, 0x04, 0x30, 0x08, 0x30, 0x38, + 0xFF, 0xF8, 0x1F, 0xFF, 0x07, 0x07, 0x07, 0x02, 0x06, 0x02, 0x06, 0x00, + 0x0E, 0x10, 0x0C, 0x30, 0x0F, 0xF0, 0x1C, 0x20, 0x1C, 0x20, 0x18, 0x00, + 0x18, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x01, 0xF1, + 0x06, 0x0F, 0x18, 0x07, 0x38, 0x02, 0x30, 0x02, 0x60, 0x00, 0x60, 0x00, + 0xE0, 0x00, 0xC0, 0x7F, 0xC0, 0x1C, 0xC0, 0x1C, 0xC0, 0x18, 0xC0, 0x18, + 0x60, 0x18, 0x30, 0x38, 0x0F, 0xC0, 0x1F, 0xC7, 0xE0, 0xE0, 0x70, 0x18, + 0x0E, 0x03, 0x01, 0x80, 0x60, 0x30, 0x1C, 0x0E, 0x03, 0x01, 0x80, 0x7F, + 0xF0, 0x1C, 0x06, 0x03, 0x01, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, 0x81, + 0xC0, 0x60, 0x38, 0x0C, 0x06, 0x07, 0xE3, 0xF0, 0x1F, 0x83, 0x81, 0x80, + 0xC0, 0x60, 0x70, 0x30, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x81, 0x80, + 0xC1, 0xF8, 0x03, 0xF0, 0x0C, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x18, 0x03, + 0x80, 0x30, 0x03, 0x00, 0x30, 0x07, 0x00, 0x60, 0x06, 0x0C, 0xE0, 0xCC, + 0x07, 0x80, 0x1F, 0xCF, 0x83, 0x83, 0x81, 0x81, 0x00, 0xC3, 0x00, 0x62, + 0x00, 0x72, 0x00, 0x36, 0x00, 0x1E, 0x00, 0x1D, 0x80, 0x0C, 0xE0, 0x06, + 0x30, 0x03, 0x1C, 0x03, 0x87, 0x01, 0x81, 0x80, 0xC0, 0xE1, 0xF9, 0xFC, + 0x1F, 0xC0, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x00, 0xC0, + 0x03, 0x00, 0x1C, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x38, 0x0C, 0xC0, + 0x23, 0x03, 0xBF, 0xFE, 0x0F, 0x00, 0x78, 0x38, 0x07, 0x81, 0xC0, 0x38, + 0x0E, 0x02, 0xC0, 0x70, 0x3E, 0x05, 0xC1, 0x70, 0x2E, 0x13, 0x01, 0x31, + 0x98, 0x11, 0x89, 0xC0, 0x8C, 0x8C, 0x04, 0x6C, 0x60, 0x23, 0x43, 0x02, + 0x1C, 0x38, 0x10, 0xE1, 0x81, 0x86, 0x1C, 0x1F, 0x23, 0xF8, 0x1E, 0x07, + 0xC1, 0xC0, 0x60, 0x70, 0x10, 0x1C, 0x0C, 0x05, 0x82, 0x02, 0x60, 0x80, + 0x9C, 0x60, 0x23, 0x10, 0x10, 0xC4, 0x04, 0x19, 0x01, 0x06, 0xC0, 0x40, + 0xE0, 0x20, 0x38, 0x08, 0x0E, 0x06, 0x01, 0x03, 0xE0, 0x40, 0x01, 0xF0, + 0x0C, 0x10, 0x30, 0x10, 0xC0, 0x33, 0x00, 0x6E, 0x00, 0xD8, 0x01, 0xF0, + 0x03, 0xC0, 0x0D, 0x80, 0x1B, 0x00, 0x76, 0x00, 0xCC, 0x03, 0x08, 0x0C, + 0x18, 0x70, 0x0F, 0x80, 0x1F, 0xF0, 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x38, 0x30, 0xC1, 0x83, 0x0E, 0x1F, 0xE0, 0x60, 0x01, 0x80, 0x06, + 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x06, 0x10, + 0x30, 0x30, 0xC0, 0x33, 0x00, 0x66, 0x00, 0xD8, 0x01, 0xB0, 0x03, 0xE0, + 0x0F, 0x80, 0x1B, 0x00, 0x36, 0x00, 0xCC, 0x03, 0x98, 0x06, 0x18, 0x18, + 0x18, 0xC0, 0x0E, 0x00, 0x20, 0x01, 0xF8, 0x36, 0x7F, 0x80, 0x1F, 0xF0, + 0x1C, 0x60, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x38, 0x70, 0xC3, 0x83, 0xF8, + 0x1D, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x18, 0x38, 0x60, 0xC1, 0xC3, 0x03, + 0x3F, 0x0F, 0x07, 0x90, 0xC7, 0x18, 0x21, 0x82, 0x18, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xC4, 0x0C, 0x40, 0xC6, 0x08, 0xE1, + 0x89, 0xE0, 0x7F, 0xFE, 0xC7, 0x1D, 0x0C, 0x14, 0x18, 0x20, 0x70, 0x00, + 0xE0, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, + 0x01, 0xC0, 0x03, 0x00, 0x0E, 0x00, 0x7F, 0x80, 0x7E, 0x1F, 0x38, 0x0C, + 0x38, 0x0C, 0x30, 0x08, 0x30, 0x08, 0x70, 0x08, 0x70, 0x10, 0x60, 0x10, + 0x60, 0x10, 0xE0, 0x10, 0xC0, 0x20, 0xC0, 0x20, 0xC0, 0x60, 0xC0, 0x40, + 0x61, 0x80, 0x3F, 0x00, 0xFC, 0x3E, 0xE0, 0x18, 0xC0, 0x21, 0x80, 0xC3, + 0x81, 0x07, 0x04, 0x0E, 0x08, 0x0C, 0x20, 0x18, 0x80, 0x31, 0x00, 0x64, + 0x00, 0xF0, 0x01, 0xE0, 0x01, 0x80, 0x02, 0x00, 0x04, 0x00, 0xFD, 0xF8, + 0xF7, 0x07, 0x06, 0x30, 0x60, 0x63, 0x07, 0x04, 0x30, 0x70, 0x83, 0x8F, + 0x08, 0x38, 0xB1, 0x03, 0x93, 0x10, 0x19, 0x32, 0x01, 0xA3, 0x20, 0x1A, + 0x34, 0x01, 0xC3, 0x40, 0x1C, 0x38, 0x01, 0x83, 0x00, 0x18, 0x30, 0x01, + 0x02, 0x00, 0x1F, 0x9F, 0x0E, 0x06, 0x06, 0x04, 0x07, 0x08, 0x03, 0x10, + 0x03, 0x20, 0x03, 0xC0, 0x01, 0x80, 0x01, 0xC0, 0x03, 0xC0, 0x06, 0xE0, + 0x0C, 0x60, 0x18, 0x60, 0x30, 0x70, 0x70, 0x78, 0xF8, 0xFC, 0xFC, 0xFB, + 0x81, 0x8C, 0x08, 0x60, 0x83, 0x8C, 0x0C, 0xC0, 0x64, 0x03, 0xC0, 0x0C, + 0x00, 0xE0, 0x07, 0x00, 0x30, 0x01, 0x80, 0x1C, 0x00, 0xC0, 0x1F, 0xC0, + 0x1F, 0xFE, 0x30, 0x38, 0xC0, 0xF1, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x01, 0xC0, + 0x47, 0x01, 0x1C, 0x06, 0x7F, 0xF8, 0x07, 0x04, 0x08, 0x08, 0x08, 0x18, + 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, + 0x80, 0xE0, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x08, + 0x0C, 0x04, 0x06, 0x06, 0x03, 0x03, 0x0E, 0x04, 0x08, 0x10, 0x60, 0x81, + 0x02, 0x04, 0x18, 0x20, 0x40, 0x81, 0x02, 0x08, 0x10, 0x20, 0x47, 0x80, + 0x0C, 0x03, 0x81, 0xE0, 0x4C, 0x33, 0x08, 0x66, 0x19, 0x03, 0xC0, 0xC0, + 0xFF, 0xF0, 0xCE, 0x63, 0x07, 0xA0, 0xCE, 0x18, 0x63, 0x04, 0x60, 0xC6, + 0x0C, 0xC0, 0xCC, 0x18, 0xC3, 0x8C, 0x5A, 0x79, 0xC0, 0x38, 0x06, 0x01, + 0x80, 0x40, 0x30, 0x0C, 0xE3, 0xCC, 0xC3, 0x70, 0xD8, 0x36, 0x19, 0x06, + 0xC3, 0x30, 0x8C, 0xC3, 0xE0, 0x0F, 0x0C, 0xCC, 0x6C, 0x06, 0x06, 0x03, + 0x01, 0x80, 0xC0, 0x73, 0x1E, 0x00, 0x00, 0x70, 0x01, 0x80, 0x0C, 0x00, + 0x60, 0x02, 0x03, 0xF0, 0x31, 0x83, 0x08, 0x30, 0xC3, 0x06, 0x18, 0x31, + 0x81, 0x8C, 0x18, 0x61, 0xCB, 0x16, 0x8F, 0x38, 0x07, 0x19, 0x31, 0x63, + 0x62, 0xEC, 0xD0, 0xC0, 0xC0, 0xE6, 0x78, 0x00, 0x38, 0x01, 0x30, 0x0C, + 0x00, 0x20, 0x01, 0x80, 0x06, 0x00, 0xFE, 0x00, 0x40, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0x80, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x04, + 0x00, 0x30, 0x00, 0xC0, 0x02, 0x00, 0x90, 0x03, 0x80, 0x00, 0x07, 0xC0, + 0xC7, 0x18, 0x61, 0x86, 0x18, 0xE1, 0x8C, 0x07, 0x80, 0x80, 0x1C, 0x00, + 0xF0, 0x33, 0x84, 0x18, 0x80, 0x88, 0x08, 0x61, 0x03, 0xE0, 0x1C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x18, 0x01, 0x8E, 0x1B, 0x61, 0xC6, 0x38, 0x63, + 0x8C, 0x30, 0xC3, 0x0C, 0x60, 0xC6, 0x1A, 0x61, 0xA4, 0x1C, 0x18, 0xC6, + 0x00, 0x0B, 0xC6, 0x23, 0x18, 0x8C, 0x63, 0x5C, 0x01, 0x80, 0xC0, 0x60, + 0x00, 0x00, 0x0C, 0x1E, 0x02, 0x03, 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, + 0x18, 0x08, 0x0C, 0x06, 0x02, 0x1B, 0x0F, 0x00, 0x1C, 0x01, 0x80, 0x30, + 0x06, 0x01, 0x80, 0x33, 0xC6, 0x30, 0x88, 0x32, 0x06, 0x80, 0xF0, 0x1B, + 0x06, 0x60, 0xC4, 0x18, 0xD2, 0x0C, 0x3C, 0x61, 0x86, 0x18, 0xC3, 0x0C, + 0x21, 0x86, 0x18, 0x43, 0x2D, 0x38, 0x78, 0xE7, 0x0D, 0xB5, 0x8D, 0x1C, + 0xC7, 0x0C, 0x63, 0x8E, 0x31, 0x86, 0x30, 0xC3, 0x18, 0xC1, 0x0C, 0x61, + 0x84, 0xB0, 0xC6, 0xB0, 0x63, 0x80, 0x78, 0xE1, 0xB6, 0x14, 0x63, 0x84, + 0x38, 0xC3, 0x0C, 0x70, 0x86, 0x18, 0x61, 0x96, 0x1A, 0xC1, 0xC0, 0x0F, + 0x06, 0x63, 0x0D, 0x83, 0x60, 0xF0, 0x3C, 0x1B, 0x06, 0xC3, 0x39, 0x87, + 0x80, 0x1E, 0xF0, 0x39, 0xC1, 0x86, 0x0C, 0x30, 0xC1, 0x86, 0x0C, 0x30, + 0xC3, 0x06, 0x18, 0x60, 0xC6, 0x07, 0xC0, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x1F, 0x00, 0x07, 0x81, 0x9C, 0x63, 0x98, 0x76, 0x0C, 0xC1, 0xB0, + 0x76, 0x0E, 0xC3, 0x98, 0xB1, 0xE6, 0x00, 0x80, 0x30, 0x06, 0x00, 0xC0, + 0xFC, 0x79, 0x8F, 0xC5, 0x07, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x30, + 0x10, 0x00, 0x1E, 0x98, 0xCC, 0x27, 0x11, 0x80, 0xE0, 0x39, 0x0C, 0x86, + 0x62, 0x2E, 0x00, 0x08, 0x67, 0xCC, 0x30, 0xC6, 0x18, 0x61, 0x8C, 0x34, + 0xE0, 0xF0, 0xCC, 0x19, 0x83, 0x30, 0xC6, 0x18, 0x87, 0x31, 0x66, 0x3C, + 0xCB, 0x1A, 0x6B, 0x8E, 0x00, 0x70, 0xCC, 0x33, 0x04, 0xC2, 0x18, 0x86, + 0x41, 0x90, 0x68, 0x1C, 0x06, 0x01, 0x00, 0x61, 0x0F, 0x84, 0x36, 0x30, + 0xDC, 0xC1, 0x35, 0x08, 0xD4, 0x23, 0x91, 0x0E, 0x48, 0x30, 0xE0, 0xC3, + 0x02, 0x08, 0x00, 0x0C, 0x63, 0x4A, 0x07, 0x00, 0x70, 0x06, 0x00, 0x20, + 0x07, 0x00, 0xB0, 0x0B, 0x21, 0x14, 0xE1, 0x80, 0x38, 0x63, 0x0C, 0x30, + 0x86, 0x10, 0xC4, 0x0C, 0x81, 0xA0, 0x34, 0x07, 0x00, 0x60, 0x08, 0x02, + 0x00, 0x40, 0x10, 0x04, 0x07, 0x00, 0x1F, 0x90, 0x80, 0x80, 0xC0, 0xC0, + 0x40, 0x60, 0x60, 0x60, 0x38, 0x3E, 0x03, 0xA0, 0x60, 0x00, 0x83, 0x81, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x10, 0x10, 0x1C, 0x06, 0x03, 0x03, + 0x01, 0x80, 0xC0, 0x40, 0x60, 0x30, 0x18, 0x07, 0x00, 0xFF, 0xFF, 0x07, + 0x00, 0xC0, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, + 0x60, 0x40, 0x60, 0x30, 0x10, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x78, + 0x18, 0x8C, 0x0F, 0x00 }; + +const GFXglyph FreeSerifItalic12pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 6, 0, 1 }, // 0x20 ' ' + { 0, 6, 16, 8, 1, -15 }, // 0x21 '!' + { 12, 7, 6, 8, 3, -15 }, // 0x22 '"' + { 18, 13, 16, 12, 0, -15 }, // 0x23 '#' + { 44, 12, 20, 12, 0, -17 }, // 0x24 '$' + { 74, 17, 17, 20, 2, -16 }, // 0x25 '%' + { 111, 15, 16, 19, 2, -15 }, // 0x26 '&' + { 141, 2, 6, 5, 4, -15 }, // 0x27 ''' + { 143, 7, 20, 8, 1, -15 }, // 0x28 '(' + { 161, 7, 20, 8, 0, -15 }, // 0x29 ')' + { 179, 8, 10, 12, 4, -15 }, // 0x2A '*' + { 189, 11, 11, 16, 2, -10 }, // 0x2B '+' + { 205, 3, 6, 6, 0, -2 }, // 0x2C ',' + { 208, 5, 1, 8, 1, -5 }, // 0x2D '-' + { 209, 2, 3, 6, 1, -2 }, // 0x2E '.' + { 210, 11, 16, 7, 0, -15 }, // 0x2F '/' + { 232, 11, 17, 12, 1, -16 }, // 0x30 '0' + { 256, 9, 17, 12, 1, -16 }, // 0x31 '1' + { 276, 10, 15, 12, 1, -14 }, // 0x32 '2' + { 295, 10, 16, 12, 1, -15 }, // 0x33 '3' + { 315, 11, 16, 12, 0, -15 }, // 0x34 '4' + { 337, 11, 16, 12, 0, -15 }, // 0x35 '5' + { 359, 12, 17, 12, 1, -16 }, // 0x36 '6' + { 385, 11, 16, 12, 2, -15 }, // 0x37 '7' + { 407, 11, 17, 12, 1, -16 }, // 0x38 '8' + { 431, 11, 17, 12, 1, -16 }, // 0x39 '9' + { 455, 4, 11, 6, 1, -10 }, // 0x3A ':' + { 461, 5, 14, 6, 0, -10 }, // 0x3B ';' + { 470, 12, 13, 14, 1, -12 }, // 0x3C '<' + { 490, 12, 6, 16, 2, -8 }, // 0x3D '=' + { 499, 12, 13, 14, 2, -12 }, // 0x3E '>' + { 519, 9, 16, 11, 3, -15 }, // 0x3F '?' + { 537, 16, 16, 19, 2, -15 }, // 0x40 '@' + { 569, 15, 15, 16, 0, -14 }, // 0x41 'A' + { 598, 14, 16, 14, 0, -15 }, // 0x42 'B' + { 626, 16, 16, 15, 1, -15 }, // 0x43 'C' + { 658, 16, 16, 17, 0, -15 }, // 0x44 'D' + { 690, 16, 16, 14, 0, -15 }, // 0x45 'E' + { 722, 16, 16, 14, 0, -15 }, // 0x46 'F' + { 754, 16, 16, 17, 1, -15 }, // 0x47 'G' + { 786, 19, 16, 17, 0, -15 }, // 0x48 'H' + { 824, 9, 16, 8, 0, -15 }, // 0x49 'I' + { 842, 12, 16, 10, 0, -15 }, // 0x4A 'J' + { 866, 17, 16, 15, 0, -15 }, // 0x4B 'K' + { 900, 14, 16, 14, 0, -15 }, // 0x4C 'L' + { 928, 21, 16, 20, 0, -15 }, // 0x4D 'M' + { 970, 18, 16, 16, 0, -15 }, // 0x4E 'N' + { 1006, 15, 16, 16, 1, -15 }, // 0x4F 'O' + { 1036, 14, 16, 14, 0, -15 }, // 0x50 'P' + { 1064, 15, 20, 16, 1, -15 }, // 0x51 'Q' + { 1102, 14, 16, 15, 0, -15 }, // 0x52 'R' + { 1130, 12, 16, 11, 0, -15 }, // 0x53 'S' + { 1154, 15, 16, 14, 2, -15 }, // 0x54 'T' + { 1184, 16, 16, 17, 3, -15 }, // 0x55 'U' + { 1216, 15, 16, 16, 3, -15 }, // 0x56 'V' + { 1246, 20, 16, 21, 3, -15 }, // 0x57 'W' + { 1286, 16, 16, 16, 0, -15 }, // 0x58 'X' + { 1318, 13, 16, 14, 3, -15 }, // 0x59 'Y' + { 1344, 15, 16, 14, 0, -15 }, // 0x5A 'Z' + { 1374, 8, 20, 9, 1, -15 }, // 0x5B '[' + { 1394, 8, 16, 12, 3, -15 }, // 0x5C '\' + { 1410, 7, 20, 9, 1, -15 }, // 0x5D ']' + { 1428, 10, 9, 10, 0, -15 }, // 0x5E '^' + { 1440, 12, 1, 12, 0, 3 }, // 0x5F '_' + { 1442, 4, 4, 6, 3, -15 }, // 0x60 '`' + { 1444, 12, 11, 12, 0, -10 }, // 0x61 'a' + { 1461, 10, 16, 11, 1, -15 }, // 0x62 'b' + { 1481, 9, 11, 10, 1, -10 }, // 0x63 'c' + { 1494, 13, 16, 12, 0, -15 }, // 0x64 'd' + { 1520, 8, 11, 10, 1, -10 }, // 0x65 'e' + { 1531, 14, 22, 10, -2, -16 }, // 0x66 'f' + { 1570, 12, 16, 11, -1, -10 }, // 0x67 'g' + { 1594, 12, 16, 12, 0, -15 }, // 0x68 'h' + { 1618, 5, 16, 6, 1, -15 }, // 0x69 'i' + { 1628, 9, 21, 7, -2, -15 }, // 0x6A 'j' + { 1652, 11, 16, 11, 0, -15 }, // 0x6B 'k' + { 1674, 6, 16, 6, 1, -15 }, // 0x6C 'l' + { 1686, 17, 11, 17, 0, -10 }, // 0x6D 'm' + { 1710, 12, 11, 12, 0, -10 }, // 0x6E 'n' + { 1727, 10, 11, 11, 1, -10 }, // 0x6F 'o' + { 1741, 13, 16, 11, -2, -10 }, // 0x70 'p' + { 1767, 11, 16, 12, 0, -10 }, // 0x71 'q' + { 1789, 9, 11, 9, 0, -10 }, // 0x72 'r' + { 1802, 9, 11, 8, 0, -10 }, // 0x73 's' + { 1815, 6, 13, 6, 1, -12 }, // 0x74 't' + { 1825, 11, 11, 12, 1, -10 }, // 0x75 'u' + { 1841, 10, 11, 11, 1, -10 }, // 0x76 'v' + { 1855, 14, 11, 16, 2, -10 }, // 0x77 'w' + { 1875, 12, 11, 10, -1, -10 }, // 0x78 'x' + { 1892, 11, 16, 11, 0, -10 }, // 0x79 'y' + { 1914, 9, 13, 9, 0, -10 }, // 0x7A 'z' + { 1929, 9, 21, 10, 1, -16 }, // 0x7B '{' + { 1953, 1, 16, 7, 3, -15 }, // 0x7C '|' + { 1955, 9, 21, 10, 0, -16 }, // 0x7D '}' + { 1979, 11, 3, 13, 1, -6 } }; // 0x7E '~' + +const GFXfont FreeSerifItalic12pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic12pt7bBitmaps, + (GFXglyph *)FreeSerifItalic12pt7bGlyphs, + 0x20, 0x7E, 29 }; + +// Approx. 2656 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic18pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic18pt7b.h new file mode 100644 index 0000000..666ae7e --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic18pt7b.h @@ -0,0 +1,450 @@ +const uint8_t FreeSerifItalic18pt7bBitmaps[] PROGMEM = { + 0x01, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0x81, 0xE0, 0x70, 0x1C, 0x06, 0x01, + 0x80, 0xC0, 0x30, 0x0C, 0x02, 0x01, 0x80, 0x40, 0x10, 0x00, 0x00, 0x01, + 0x80, 0xF0, 0x3C, 0x06, 0x00, 0x38, 0x77, 0x8F, 0x78, 0xF7, 0x0E, 0x60, + 0xE6, 0x0C, 0xC1, 0x8C, 0x18, 0x81, 0x00, 0x00, 0x60, 0xC0, 0x0C, 0x38, + 0x03, 0x86, 0x00, 0x60, 0xC0, 0x0C, 0x38, 0x03, 0x06, 0x00, 0x60, 0xC0, + 0xFF, 0xFF, 0x1F, 0xFF, 0xE0, 0x61, 0xC0, 0x1C, 0x30, 0x03, 0x06, 0x00, + 0x61, 0xC0, 0x18, 0x30, 0x3F, 0xFF, 0xC7, 0xFF, 0xF8, 0x18, 0x30, 0x03, + 0x0E, 0x00, 0xE1, 0x80, 0x18, 0x30, 0x03, 0x0C, 0x00, 0xC1, 0x80, 0x18, + 0x70, 0x00, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x0F, 0xC0, 0x61, 0xE1, + 0x86, 0xC6, 0x0D, 0x8C, 0x1A, 0x18, 0x24, 0x38, 0xC0, 0x39, 0x80, 0x7F, + 0x00, 0x7E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xDC, 0x03, 0x38, + 0x06, 0x32, 0x0C, 0x64, 0x18, 0xDC, 0x71, 0xB8, 0xC6, 0x39, 0x8C, 0x3F, + 0x30, 0x1F, 0x80, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x07, 0x80, 0x60, + 0x0F, 0xE0, 0xE0, 0x0F, 0x0F, 0xB0, 0x0E, 0x04, 0x30, 0x07, 0x02, 0x18, + 0x07, 0x01, 0x18, 0x03, 0x00, 0x8C, 0x01, 0x80, 0x8C, 0x00, 0xC0, 0x4C, + 0x00, 0x60, 0x66, 0x1F, 0x30, 0x66, 0x1F, 0xCC, 0x63, 0x1C, 0x67, 0xE3, + 0x1C, 0x19, 0xE1, 0x1C, 0x04, 0x01, 0x8C, 0x02, 0x00, 0x8E, 0x01, 0x00, + 0xC7, 0x00, 0x80, 0xC3, 0x00, 0x80, 0x61, 0x80, 0xC0, 0x60, 0xC0, 0xC0, + 0x20, 0x70, 0xE0, 0x30, 0x1F, 0xC0, 0x10, 0x07, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xFC, 0x00, 0x07, 0x18, 0x00, 0x18, 0x60, 0x00, 0xE1, 0x80, 0x03, + 0x8C, 0x00, 0x0E, 0x60, 0x00, 0x3B, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, + 0x00, 0x7F, 0x1F, 0xC3, 0x3C, 0x1C, 0x38, 0x70, 0x61, 0xE1, 0xE3, 0x87, + 0x07, 0x8C, 0x3C, 0x0F, 0x60, 0xF0, 0x3D, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xE0, 0x3E, 0x07, 0xC0, 0x7C, 0x77, 0x84, 0xFF, 0x8F, 0xE1, 0xF8, 0x0F, + 0x00, 0x3B, 0xDE, 0xE7, 0x33, 0x18, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, + 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x38, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x01, 0x00, 0x80, 0x40, 0x30, + 0x08, 0x04, 0x02, 0x00, 0x04, 0x01, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04, + 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x0E, 0x07, 0x03, 0x81, + 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x06, 0x00, 0x60, 0x06, 0x0C, 0x43, 0xE4, 0xF1, 0x58, 0x0E, 0x00, + 0xF0, 0x74, 0xEE, 0x47, 0xC4, 0x30, 0x60, 0x06, 0x00, 0x60, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x31, 0xCE, + 0x31, 0x08, 0x98, 0xFF, 0xFF, 0x6F, 0xF6, 0x00, 0x06, 0x00, 0x0E, 0x00, + 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, + 0xE0, 0x00, 0xC0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, + 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, + 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00, 0x78, 0x00, 0xC3, 0x00, 0xC1, 0xC0, + 0xC0, 0x60, 0xE0, 0x30, 0xE0, 0x1C, 0x70, 0x0E, 0x70, 0x07, 0x38, 0x03, + 0xBC, 0x01, 0xDC, 0x01, 0xEE, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x3B, 0x80, + 0x1D, 0xC0, 0x1E, 0xE0, 0x0E, 0x70, 0x0F, 0x38, 0x07, 0x1C, 0x07, 0x06, + 0x03, 0x83, 0x83, 0x80, 0xC3, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x7F, 0x00, + 0x70, 0x07, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x1C, 0x01, + 0xC0, 0x38, 0x03, 0x80, 0x38, 0x03, 0x80, 0x70, 0x07, 0x00, 0x70, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x1E, 0x0F, 0xF8, 0x01, 0xF0, 0x07, 0xFC, + 0x0C, 0x3E, 0x10, 0x1F, 0x20, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, + 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, + 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x04, + 0x30, 0x0C, 0x7F, 0xF8, 0xFF, 0xF0, 0x00, 0x7C, 0x00, 0xFF, 0x00, 0xC3, + 0xC0, 0x80, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0xF0, 0x03, 0xFC, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x01, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x03, 0x07, 0x87, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xB0, 0x01, 0xB8, + 0x01, 0x9C, 0x01, 0x8C, 0x00, 0x86, 0x00, 0x87, 0x00, 0x83, 0x80, 0x81, + 0x80, 0x81, 0xC0, 0xC0, 0xE0, 0xC0, 0x70, 0xFF, 0xFF, 0x7F, 0xFF, 0x00, + 0x1C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0x80, + 0x01, 0xFF, 0x01, 0xFF, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x0F, 0xC0, 0x0F, 0xF0, 0x00, 0xF8, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, + 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, + 0x00, 0x30, 0x00, 0x30, 0x70, 0xE0, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x03, + 0x80, 0x1F, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x3C, 0x00, 0x3D, 0xF0, 0x1F, 0xFE, 0x1F, 0x0F, 0x8E, 0x03, 0xC7, + 0x00, 0xF7, 0x00, 0x7B, 0x80, 0x3D, 0x80, 0x1E, 0xC0, 0x0F, 0x60, 0x0F, + 0xB0, 0x07, 0x98, 0x03, 0xC4, 0x03, 0xC3, 0x03, 0xC0, 0xC3, 0x80, 0x1F, + 0x00, 0x3F, 0xFF, 0x7F, 0xFE, 0x40, 0x0E, 0x80, 0x0C, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xC0, 0x01, 0xC0, 0x01, + 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, + 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0x00, + 0xF8, 0x03, 0x0E, 0x06, 0x06, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, + 0x03, 0x0E, 0x06, 0x07, 0x8E, 0x07, 0xD8, 0x03, 0xE0, 0x07, 0xF0, 0x1C, + 0xF8, 0x30, 0x3C, 0x60, 0x1C, 0x60, 0x0E, 0xC0, 0x06, 0xC0, 0x06, 0xC0, + 0x06, 0xC0, 0x06, 0xE0, 0x0C, 0x60, 0x18, 0x38, 0x30, 0x0F, 0xC0, 0x01, + 0xF8, 0x07, 0x8C, 0x0E, 0x06, 0x1E, 0x02, 0x3C, 0x03, 0x3C, 0x03, 0x78, + 0x03, 0x78, 0x03, 0x78, 0x03, 0x78, 0x07, 0x78, 0x07, 0x78, 0x07, 0x3C, + 0x0E, 0x3E, 0x1E, 0x1F, 0xEE, 0x07, 0x9C, 0x00, 0x38, 0x00, 0x78, 0x00, + 0x70, 0x01, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x0C, + 0x3C, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1E, 0x18, + 0x00, 0x07, 0x03, 0xC1, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x03, 0x81, 0xC0, 0xE0, 0x30, 0x10, 0x10, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0x01, 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01, + 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xE0, + 0x00, 0x7E, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xF0, 0x00, 0x3F, + 0x00, 0x03, 0xC0, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0xC0, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, + 0xE0, 0x00, 0x3E, 0x00, 0x03, 0xE0, 0x00, 0x3F, 0x00, 0x03, 0xC0, 0x01, + 0xF0, 0x01, 0xF8, 0x01, 0xF8, 0x01, 0xF0, 0x01, 0xF0, 0x03, 0xF0, 0x03, + 0xF0, 0x00, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x0F, 0x81, 0x86, 0x30, 0x33, + 0x03, 0x30, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x01, 0xC0, 0x38, 0x06, 0x00, + 0xC0, 0x08, 0x01, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xFF, 0xE0, + 0x07, 0x80, 0xF0, 0x0E, 0x00, 0x38, 0x1C, 0x00, 0x0C, 0x38, 0x0E, 0x06, + 0x70, 0x3F, 0xE2, 0x70, 0x71, 0xE3, 0xF0, 0x60, 0xE1, 0xE0, 0xC0, 0xC1, + 0xE0, 0xC0, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0xC1, 0xE1, 0x81, 0x82, + 0xE1, 0x83, 0x82, 0x71, 0x83, 0x86, 0x71, 0xC7, 0x8C, 0x38, 0xF9, 0xF8, + 0x3C, 0xF0, 0xF0, 0x1E, 0x00, 0x00, 0x0F, 0x80, 0x30, 0x03, 0xFF, 0xE0, + 0x00, 0x7F, 0x00, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x01, 0xC0, 0x00, + 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x5E, 0x00, 0x04, 0xF0, + 0x00, 0x63, 0x80, 0x02, 0x1C, 0x00, 0x20, 0xE0, 0x01, 0x07, 0x00, 0x10, + 0x3C, 0x01, 0xFF, 0xE0, 0x0F, 0xFF, 0x00, 0xC0, 0x38, 0x04, 0x01, 0xC0, + 0x60, 0x0E, 0x06, 0x00, 0x78, 0x30, 0x03, 0xC3, 0x00, 0x1E, 0x38, 0x00, + 0xFB, 0xF0, 0x1F, 0xE0, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C, + 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78, + 0x1E, 0x03, 0x83, 0xE0, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x0F, 0x0F, 0x00, + 0x70, 0x3C, 0x03, 0x80, 0xF0, 0x3C, 0x07, 0x81, 0xC0, 0x3C, 0x0E, 0x01, + 0xE0, 0xF0, 0x0F, 0x07, 0x80, 0xF0, 0x38, 0x0F, 0x81, 0xC1, 0xF8, 0x1F, + 0xFF, 0x83, 0xFF, 0xE0, 0x00, 0x00, 0x3F, 0x08, 0x07, 0xFF, 0xC0, 0xF8, + 0x3E, 0x0F, 0x00, 0x70, 0xF0, 0x03, 0x8F, 0x00, 0x08, 0xF0, 0x00, 0x47, + 0x80, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x01, 0xE0, 0x00, + 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xF0, + 0x00, 0x03, 0x80, 0x02, 0x1E, 0x00, 0x20, 0x78, 0x02, 0x03, 0xE0, 0x60, + 0x07, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0xFF, 0xFC, + 0x00, 0x78, 0x1F, 0x00, 0x3C, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0E, 0x00, + 0x78, 0x07, 0x00, 0x1E, 0x07, 0x80, 0x0F, 0x03, 0x80, 0x07, 0x81, 0xC0, + 0x03, 0xC1, 0xE0, 0x01, 0xE0, 0xF0, 0x00, 0xF0, 0x70, 0x00, 0x78, 0x38, + 0x00, 0x78, 0x3C, 0x00, 0x3C, 0x1E, 0x00, 0x3E, 0x0E, 0x00, 0x1E, 0x0F, + 0x00, 0x1E, 0x07, 0x80, 0x1E, 0x03, 0x80, 0x3E, 0x01, 0xC0, 0x7E, 0x01, + 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x07, 0xFF, 0xF0, + 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08, 0x07, 0x00, 0x00, 0x1C, + 0x08, 0x00, 0xF0, 0x60, 0x03, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xF0, + 0x01, 0xE0, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x08, 0x00, 0xF0, 0x20, 0x03, + 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x81, 0xE0, 0x06, 0x07, 0x00, + 0x38, 0x1C, 0x03, 0xC0, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x07, 0xFF, + 0xFC, 0x07, 0xFF, 0xF0, 0x1E, 0x01, 0xC0, 0x78, 0x02, 0x01, 0xE0, 0x08, + 0x07, 0x00, 0x20, 0x1C, 0x00, 0x00, 0xF0, 0x20, 0x03, 0x81, 0x80, 0x0E, + 0x0C, 0x00, 0x7F, 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0x03, 0x00, 0x1C, 0x0C, + 0x00, 0xF0, 0x20, 0x03, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x01, + 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xF8, + 0x00, 0x00, 0x00, 0x3F, 0x02, 0x01, 0xFF, 0x88, 0x0F, 0x81, 0xF0, 0x3C, + 0x01, 0xE0, 0xF0, 0x01, 0xC3, 0xC0, 0x01, 0x0F, 0x80, 0x02, 0x1E, 0x00, + 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xC0, 0x00, + 0x0F, 0x00, 0x3F, 0xFE, 0x00, 0x1E, 0x3C, 0x00, 0x38, 0x78, 0x00, 0x70, + 0xF0, 0x00, 0xE0, 0xE0, 0x01, 0xC1, 0xE0, 0x07, 0x01, 0xE0, 0x0E, 0x01, + 0xF0, 0x3C, 0x01, 0xFF, 0xF0, 0x00, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x3F, + 0xE0, 0x3E, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x1C, + 0x00, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x00, 0x70, + 0x03, 0x80, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFF, 0xF0, 0x03, 0xFF, + 0xFE, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, + 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xC0, 0x0E, 0x00, 0x78, 0x01, + 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x0E, 0x00, 0x78, 0x03, 0xE0, 0x3F, + 0xE1, 0xFF, 0x00, 0x07, 0xFC, 0x07, 0xC0, 0x1E, 0x00, 0x78, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x03, 0x80, 0x0E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x00, 0x1C, 0x00, 0xF0, 0x0F, 0xF8, 0x00, 0x00, 0xFF, 0x80, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x70, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, + 0x1E, 0x78, 0x0F, 0x38, 0x07, 0xF8, 0x01, 0xF0, 0x00, 0x07, 0xFC, 0x7F, + 0x80, 0xF8, 0x0F, 0x00, 0x38, 0x07, 0x00, 0x3C, 0x07, 0x00, 0x1C, 0x06, + 0x00, 0x0E, 0x06, 0x00, 0x07, 0x0C, 0x00, 0x07, 0x8C, 0x00, 0x03, 0x9C, + 0x00, 0x01, 0xD8, 0x00, 0x01, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x73, + 0x80, 0x00, 0x39, 0xE0, 0x00, 0x3C, 0x78, 0x00, 0x1C, 0x1C, 0x00, 0x0E, + 0x0F, 0x00, 0x07, 0x03, 0x80, 0x07, 0x81, 0xE0, 0x03, 0x80, 0x70, 0x01, + 0xC0, 0x3C, 0x01, 0xE0, 0x1F, 0x03, 0xFE, 0x3F, 0xE0, 0x07, 0xFC, 0x00, + 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, + 0x01, 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, + 0x00, 0x78, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, 0xE0, + 0x00, 0x0E, 0x00, 0x11, 0xE0, 0x03, 0x1E, 0x00, 0x61, 0xC0, 0x06, 0x1C, + 0x01, 0xE3, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x07, 0xF0, 0x00, 0x7E, 0x03, + 0xE0, 0x01, 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x07, 0x80, 0x0F, 0x80, 0x1F, + 0x00, 0x37, 0x00, 0x2E, 0x00, 0x5E, 0x00, 0x5C, 0x01, 0xB8, 0x01, 0xB8, + 0x06, 0x70, 0x02, 0x78, 0x09, 0xE0, 0x04, 0x70, 0x33, 0xC0, 0x08, 0xE0, + 0xC7, 0x00, 0x31, 0xC1, 0x0E, 0x00, 0x43, 0x86, 0x3C, 0x00, 0x87, 0x18, + 0x70, 0x03, 0x0E, 0x20, 0xE0, 0x06, 0x1C, 0xC3, 0xC0, 0x08, 0x3B, 0x07, + 0x80, 0x10, 0x7C, 0x0E, 0x00, 0x60, 0x78, 0x1C, 0x00, 0x80, 0xE0, 0x78, + 0x03, 0x01, 0x80, 0xF0, 0x07, 0x03, 0x03, 0xE0, 0x3F, 0x84, 0x1F, 0xF0, + 0x00, 0x07, 0xC0, 0x3F, 0xC0, 0x78, 0x03, 0xE0, 0x0E, 0x00, 0x70, 0x03, + 0xC0, 0x18, 0x01, 0xF0, 0x0E, 0x00, 0x6C, 0x03, 0x00, 0x1B, 0x80, 0xC0, + 0x0C, 0xE0, 0x30, 0x03, 0x18, 0x1C, 0x00, 0xC7, 0x06, 0x00, 0x30, 0xC1, + 0x80, 0x18, 0x38, 0xE0, 0x06, 0x06, 0x30, 0x01, 0x81, 0x8C, 0x00, 0xC0, + 0x73, 0x00, 0x30, 0x0D, 0xC0, 0x0C, 0x03, 0xE0, 0x03, 0x00, 0x78, 0x01, + 0x80, 0x1E, 0x00, 0x60, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x0E, 0x00, 0x30, + 0x0F, 0xE0, 0x04, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x07, 0xC1, + 0xE0, 0x1E, 0x01, 0xE0, 0x78, 0x01, 0xC1, 0xE0, 0x03, 0xC7, 0x80, 0x07, + 0x9F, 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0xF8, 0x00, 0x3D, 0xE0, 0x00, 0xFF, + 0xC0, 0x01, 0xEF, 0x80, 0x03, 0xDE, 0x00, 0x0F, 0xBC, 0x00, 0x1E, 0x78, + 0x00, 0x7C, 0xF0, 0x00, 0xF1, 0xE0, 0x03, 0xC1, 0xC0, 0x0F, 0x03, 0xC0, + 0x3C, 0x03, 0xC1, 0xF0, 0x03, 0xFF, 0x80, 0x01, 0xFC, 0x00, 0x00, 0x07, + 0xFF, 0xC0, 0x07, 0xFF, 0xC0, 0x0E, 0x0F, 0x80, 0x78, 0x1F, 0x01, 0xC0, + 0x3C, 0x07, 0x00, 0xF0, 0x1C, 0x03, 0xC0, 0xF0, 0x0F, 0x03, 0x80, 0x78, + 0x0E, 0x01, 0xE0, 0x78, 0x1F, 0x01, 0xFF, 0xF8, 0x07, 0x7F, 0x00, 0x1C, + 0x00, 0x00, 0xF0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, + 0x01, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0xFF, 0xE0, 0x03, 0xC1, 0xE0, + 0x1E, 0x01, 0xC0, 0x78, 0x03, 0xC1, 0xE0, 0x03, 0x87, 0x80, 0x07, 0x8F, + 0x00, 0x0F, 0x3C, 0x00, 0x1E, 0x78, 0x00, 0x3D, 0xE0, 0x00, 0x7B, 0xC0, + 0x01, 0xFF, 0x80, 0x03, 0xDE, 0x00, 0x07, 0xBC, 0x00, 0x1F, 0x78, 0x00, + 0x3C, 0xF0, 0x00, 0xF1, 0xE0, 0x01, 0xE3, 0xC0, 0x07, 0x83, 0x80, 0x1E, + 0x07, 0x80, 0x78, 0x07, 0x01, 0xC0, 0x03, 0xDE, 0x00, 0x01, 0xC0, 0x00, + 0x06, 0x00, 0x00, 0x18, 0x00, 0x10, 0x7F, 0xC0, 0xC3, 0xFF, 0xFF, 0x08, + 0x07, 0xF0, 0x00, 0x07, 0xFF, 0x80, 0x0F, 0xFF, 0x00, 0x78, 0x3C, 0x03, + 0xC0, 0xF0, 0x1E, 0x07, 0x80, 0xE0, 0x3C, 0x07, 0x01, 0xE0, 0x78, 0x1E, + 0x03, 0x83, 0xF0, 0x1F, 0xFE, 0x01, 0xFF, 0xC0, 0x0F, 0x38, 0x00, 0x71, + 0xE0, 0x03, 0x87, 0x00, 0x3C, 0x38, 0x01, 0xC1, 0xE0, 0x0E, 0x07, 0x00, + 0xF0, 0x3C, 0x07, 0x81, 0xE0, 0x38, 0x07, 0x01, 0xC0, 0x3C, 0x1E, 0x00, + 0xF3, 0xFC, 0x07, 0xC0, 0x00, 0xF8, 0x81, 0xFF, 0xC1, 0xE1, 0xE1, 0xE0, + 0x70, 0xF0, 0x10, 0x78, 0x08, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, + 0x80, 0x3C, 0x40, 0x1E, 0x20, 0x0F, 0x38, 0x07, 0x9E, 0x07, 0x8F, 0x87, + 0x84, 0x7F, 0xC2, 0x0F, 0x80, 0x3F, 0xFF, 0xF7, 0xFF, 0xFF, 0x70, 0x78, + 0x76, 0x07, 0x02, 0xC0, 0x70, 0x28, 0x0F, 0x02, 0x00, 0xF0, 0x00, 0x0E, + 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x03, + 0xC0, 0x00, 0x3C, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x07, 0x80, 0x00, + 0x70, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, + 0xFF, 0xE0, 0x00, 0x7F, 0xE0, 0xFE, 0x3F, 0x00, 0x78, 0x3C, 0x00, 0x60, + 0xF0, 0x01, 0x81, 0xE0, 0x03, 0x03, 0xC0, 0x06, 0x07, 0x00, 0x08, 0x1E, + 0x00, 0x30, 0x3C, 0x00, 0x60, 0x70, 0x00, 0x81, 0xE0, 0x01, 0x03, 0xC0, + 0x06, 0x07, 0x80, 0x0C, 0x0E, 0x00, 0x10, 0x3C, 0x00, 0x60, 0x78, 0x00, + 0xC0, 0xF0, 0x01, 0x01, 0xE0, 0x06, 0x03, 0xC0, 0x08, 0x03, 0xC0, 0x30, + 0x07, 0xC1, 0xC0, 0x07, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFF, 0x01, + 0xFB, 0xE0, 0x07, 0x8E, 0x00, 0x18, 0x78, 0x01, 0x83, 0xC0, 0x0C, 0x1E, + 0x00, 0xC0, 0xF0, 0x06, 0x03, 0x80, 0x60, 0x1C, 0x02, 0x00, 0xE0, 0x30, + 0x07, 0x83, 0x00, 0x3C, 0x10, 0x01, 0xE1, 0x80, 0x07, 0x08, 0x00, 0x38, + 0x80, 0x01, 0xC4, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x00, + 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, + 0x3F, 0xC3, 0xFB, 0xE0, 0x78, 0x07, 0x8E, 0x03, 0xC0, 0x18, 0x78, 0x0E, + 0x01, 0x83, 0xC0, 0x70, 0x0C, 0x1E, 0x03, 0x80, 0x40, 0xF0, 0x3C, 0x06, + 0x03, 0x81, 0xE0, 0x60, 0x1C, 0x17, 0x83, 0x00, 0xE0, 0xBC, 0x30, 0x07, + 0x09, 0xE1, 0x00, 0x38, 0x47, 0x18, 0x01, 0xE4, 0x38, 0x80, 0x0F, 0x21, + 0xCC, 0x00, 0x7A, 0x0E, 0x40, 0x01, 0xD0, 0x76, 0x00, 0x0F, 0x03, 0xA0, + 0x00, 0x78, 0x1F, 0x00, 0x03, 0x80, 0xF0, 0x00, 0x1C, 0x07, 0x00, 0x00, + 0xC0, 0x38, 0x00, 0x06, 0x00, 0x80, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0F, + 0xF8, 0x7F, 0x03, 0xE0, 0x3E, 0x01, 0xC0, 0x18, 0x01, 0xE0, 0x30, 0x01, + 0xE0, 0x60, 0x00, 0xE0, 0xC0, 0x00, 0xF1, 0xC0, 0x00, 0x71, 0x80, 0x00, + 0x7B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x3C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xCE, 0x00, 0x01, 0x8F, 0x00, 0x01, + 0x07, 0x00, 0x03, 0x07, 0x00, 0x06, 0x07, 0x80, 0x0C, 0x03, 0x80, 0x18, + 0x03, 0xC0, 0x78, 0x03, 0xE0, 0xFE, 0x1F, 0xF8, 0xFF, 0x87, 0xE7, 0xC0, + 0x38, 0x70, 0x06, 0x0E, 0x01, 0x81, 0xE0, 0x30, 0x1C, 0x0C, 0x03, 0x83, + 0x00, 0x78, 0xC0, 0x07, 0x30, 0x00, 0xE4, 0x00, 0x1D, 0x80, 0x03, 0xE0, + 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x7C, 0x00, + 0x3F, 0xF0, 0x00, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xE0, 0x0F, 0x82, + 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x40, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, + 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x07, + 0x80, 0x00, 0x3C, 0x00, 0xC1, 0xE0, 0x02, 0x0F, 0x00, 0x18, 0x38, 0x01, + 0xE1, 0xFF, 0xFF, 0x0F, 0xFF, 0xFC, 0x00, 0x01, 0xF8, 0x0C, 0x00, 0xC0, + 0x06, 0x00, 0x30, 0x01, 0x80, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x03, + 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x60, 0x03, 0x00, 0x18, 0x01, 0xC0, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x06, + 0x00, 0x30, 0x01, 0xF8, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x30, + 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x07, + 0x00, 0x30, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, + 0x60, 0x07, 0x00, 0x30, 0x03, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x18, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x0F, 0xC0, 0x03, 0x80, + 0x07, 0x00, 0x1F, 0x00, 0x36, 0x00, 0xCE, 0x01, 0x8C, 0x06, 0x1C, 0x0C, + 0x18, 0x38, 0x38, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x6E, 0x00, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0xE3, 0x8F, 0x0E, 0x18, 0x30, 0x01, 0xEC, 0x0E, + 0x58, 0x30, 0x70, 0xE0, 0xC3, 0x81, 0x86, 0x07, 0x1C, 0x0C, 0x38, 0x18, + 0xE0, 0x71, 0xC0, 0xE3, 0x83, 0x87, 0x0B, 0x2F, 0x36, 0xCF, 0xCF, 0x1F, + 0x1C, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, + 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x1C, 0x7C, 0x1C, 0xFE, + 0x19, 0x8F, 0x1A, 0x07, 0x3C, 0x07, 0x38, 0x07, 0x38, 0x07, 0x70, 0x0E, + 0x70, 0x0E, 0x70, 0x1C, 0x60, 0x18, 0xE0, 0x30, 0xE0, 0x60, 0xE1, 0xC0, + 0x3F, 0x00, 0x01, 0xF0, 0x38, 0xC3, 0x8E, 0x78, 0x73, 0x80, 0x3C, 0x01, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x47, 0x84, 0x3F, + 0xC0, 0x7C, 0x00, 0x00, 0x01, 0x80, 0x07, 0xC0, 0x00, 0xE0, 0x00, 0x60, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0xF7, + 0x01, 0xC7, 0x81, 0xC3, 0x81, 0xC1, 0xC1, 0xE0, 0xE0, 0xE0, 0x60, 0xF0, + 0x30, 0x78, 0x38, 0x78, 0x18, 0x3C, 0x0C, 0x1E, 0x0C, 0x0F, 0x0E, 0x27, + 0xCB, 0x21, 0xF9, 0xE0, 0x78, 0xE0, 0x00, 0xF0, 0x1C, 0xC3, 0x86, 0x38, + 0x33, 0xC3, 0x1C, 0x31, 0xE3, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x47, 0x84, 0x3F, 0xC0, 0x7C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x33, + 0x00, 0x06, 0x30, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x01, 0xC0, 0x00, 0x18, + 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x3F, 0xF8, 0x03, 0xFF, 0x80, 0x03, + 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x06, 0x00, 0x00, + 0x60, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00, + 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x18, 0x00, + 0x03, 0x00, 0x00, 0x30, 0x00, 0xC6, 0x00, 0x0C, 0xC0, 0x00, 0x78, 0x00, + 0x00, 0x01, 0xF8, 0x07, 0x1F, 0x0E, 0x0F, 0x0C, 0x0E, 0x18, 0x0E, 0x18, + 0x0E, 0x18, 0x1E, 0x18, 0x3C, 0x0C, 0x78, 0x07, 0xE0, 0x08, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x0F, 0xE0, 0x13, 0xF0, 0x60, 0x78, 0xC0, 0x38, 0xC0, + 0x18, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x60, 0x3F, 0x80, 0x03, 0x00, 0x1F, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0E, + 0x00, 0x0C, 0x00, 0x1C, 0x38, 0x1C, 0x7C, 0x1C, 0xCC, 0x19, 0x0C, 0x3A, + 0x0C, 0x3C, 0x1C, 0x3C, 0x18, 0x38, 0x18, 0x70, 0x38, 0x70, 0x38, 0x70, + 0x30, 0x60, 0x72, 0xE0, 0x76, 0xE0, 0x7C, 0xC0, 0x70, 0x03, 0x03, 0xC1, + 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7E, 0x0F, 0x03, 0x81, 0x81, + 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x1C, 0x4C, 0x47, 0xC3, 0xC0, 0x00, + 0x0C, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x03, 0xF0, 0x00, 0xE0, 0x01, 0x80, 0x03, 0x00, + 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x06, + 0x00, 0x0C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, 0x03, 0x80, 0x06, 0x00, + 0x0C, 0x06, 0x30, 0x0C, 0xC0, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0C, + 0x00, 0x38, 0xFC, 0x70, 0x60, 0xE1, 0x81, 0x86, 0x07, 0x10, 0x0E, 0x40, + 0x1B, 0x80, 0x3F, 0x00, 0xE7, 0x01, 0xCE, 0x03, 0x0C, 0x06, 0x1C, 0x5C, + 0x1D, 0x38, 0x3E, 0x60, 0x38, 0x03, 0x1F, 0x07, 0x07, 0x06, 0x0E, 0x0E, + 0x0E, 0x0C, 0x1C, 0x1C, 0x18, 0x38, 0x38, 0x38, 0x30, 0x70, 0x70, 0x70, + 0x64, 0xE4, 0xE8, 0xF0, 0xE0, 0x00, 0x06, 0x18, 0x1E, 0x3E, 0x3C, 0x3F, + 0x0E, 0x4C, 0x47, 0x0C, 0x8C, 0x8E, 0x1D, 0x0D, 0x0E, 0x1E, 0x1A, 0x0E, + 0x1C, 0x1E, 0x0C, 0x3C, 0x1C, 0x1C, 0x38, 0x38, 0x1C, 0x38, 0x38, 0x1C, + 0x30, 0x38, 0x18, 0x70, 0x30, 0x39, 0x70, 0x70, 0x32, 0x60, 0x70, 0x3C, + 0x60, 0x60, 0x38, 0x06, 0x0E, 0x1F, 0x1F, 0x83, 0x99, 0xC1, 0x98, 0xC1, + 0xD8, 0xE0, 0xE8, 0x70, 0x78, 0x30, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x0E, + 0x0E, 0x06, 0x0E, 0x03, 0x17, 0x01, 0xB3, 0x80, 0xF1, 0x80, 0x70, 0x01, + 0xF0, 0x0E, 0x38, 0x38, 0x30, 0xE0, 0x73, 0x80, 0xEE, 0x01, 0xDC, 0x03, + 0xF8, 0x0F, 0xE0, 0x1D, 0xC0, 0x3B, 0x80, 0xE7, 0x03, 0x8E, 0x06, 0x0E, + 0x38, 0x07, 0xC0, 0x00, 0x00, 0xE7, 0xC0, 0x7C, 0xFE, 0x01, 0xD1, 0xF0, + 0x1E, 0x0F, 0x01, 0xC0, 0xF0, 0x38, 0x0F, 0x03, 0x80, 0xF0, 0x38, 0x0E, + 0x03, 0x01, 0xE0, 0x70, 0x1C, 0x07, 0x03, 0xC0, 0x60, 0x78, 0x06, 0x0F, + 0x00, 0xE1, 0xC0, 0x0F, 0xF0, 0x00, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xC0, + 0x00, 0x1C, 0x00, 0x01, 0x80, 0x00, 0x38, 0x00, 0x0F, 0xF0, 0x00, 0x00, + 0xF7, 0x03, 0xCE, 0x0F, 0x06, 0x1E, 0x06, 0x1C, 0x04, 0x3C, 0x04, 0x78, + 0x04, 0x78, 0x0C, 0xF0, 0x08, 0xF0, 0x18, 0xF0, 0x38, 0xF0, 0xF0, 0xF9, + 0x70, 0x7E, 0x70, 0x3C, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x0F, 0xF0, 0x7C, 0x70, 0xE7, 0xC7, 0x4C, + 0x34, 0x01, 0xA0, 0x1E, 0x00, 0xF0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x1C, + 0x00, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x07, 0x88, 0x63, 0x86, + 0x0C, 0x30, 0x21, 0xC1, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x1C, + 0x10, 0x60, 0x83, 0x06, 0x18, 0x71, 0x82, 0x78, 0x00, 0x02, 0x03, 0x03, + 0x07, 0xF7, 0xF8, 0xE0, 0x60, 0x70, 0x38, 0x1C, 0x0C, 0x0E, 0x07, 0x03, + 0x01, 0x91, 0xC8, 0xF8, 0x78, 0x00, 0x1C, 0x0D, 0xF8, 0x38, 0x60, 0x70, + 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0C, 0x1E, 0x38, 0x78, 0x70, 0xB0, 0xE2, + 0x61, 0x8D, 0xC7, 0x33, 0x2C, 0xC6, 0x5F, 0x0F, 0x38, 0x1C, 0x00, 0x18, + 0x1B, 0xE0, 0x73, 0x81, 0xC6, 0x03, 0x18, 0x0C, 0x70, 0x21, 0xC1, 0x83, + 0x0C, 0x0C, 0x20, 0x31, 0x00, 0xC8, 0x03, 0x40, 0x0E, 0x00, 0x30, 0x00, + 0x80, 0x00, 0x18, 0x04, 0x1B, 0xE0, 0x30, 0x71, 0x80, 0xC1, 0xC6, 0x07, + 0x01, 0x1C, 0x2C, 0x08, 0x70, 0xB0, 0x20, 0xC4, 0xC1, 0x03, 0x21, 0x84, + 0x0D, 0x86, 0x20, 0x34, 0x19, 0x00, 0xE0, 0x68, 0x03, 0x81, 0xA0, 0x0C, + 0x07, 0x00, 0x30, 0x18, 0x00, 0x80, 0x40, 0x00, 0x03, 0x07, 0x0F, 0x8F, + 0x13, 0x93, 0x01, 0xB0, 0x01, 0xE0, 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xC0, + 0x01, 0xC0, 0x03, 0xE0, 0x02, 0x60, 0x04, 0x62, 0x08, 0x64, 0xF0, 0x7C, + 0xE0, 0x30, 0x06, 0x06, 0x3F, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x81, + 0x03, 0x82, 0x01, 0x82, 0x01, 0xC4, 0x01, 0xC4, 0x01, 0xC8, 0x00, 0xC8, + 0x00, 0xD0, 0x00, 0xF0, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x80, + 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x70, 0x00, 0x1F, 0xFC, + 0x7F, 0xE1, 0x01, 0x08, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, + 0x06, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x38, 0x01, 0xF0, 0x0B, 0xE0, + 0x01, 0xC6, 0x03, 0x98, 0x03, 0x80, 0x00, 0x70, 0x0C, 0x01, 0x80, 0x38, + 0x03, 0x80, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xE0, + 0x0C, 0x01, 0xC0, 0x1C, 0x07, 0x80, 0x30, 0x04, 0x00, 0x20, 0x03, 0x00, + 0x30, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0C, 0x00, + 0xC0, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x00, 0x40, 0x04, 0x00, 0xC0, 0x1E, + 0x03, 0x80, 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE0, + 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x70, 0x00, 0x1E, 0x00, 0x3F, 0xE1, + 0xF8, 0x7F, 0xC0, 0x07, 0x80 }; + +const GFXglyph FreeSerifItalic18pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 9, 0, 1 }, // 0x20 ' ' + { 0, 10, 23, 12, 1, -22 }, // 0x21 '!' + { 29, 12, 9, 12, 4, -22 }, // 0x22 '"' + { 43, 19, 23, 17, 0, -22 }, // 0x23 '#' + { 98, 15, 29, 17, 1, -25 }, // 0x24 '$' + { 153, 25, 23, 29, 3, -22 }, // 0x25 '%' + { 225, 22, 23, 27, 3, -22 }, // 0x26 '&' + { 289, 5, 9, 7, 4, -22 }, // 0x27 ''' + { 295, 9, 29, 12, 1, -22 }, // 0x28 '(' + { 328, 9, 29, 12, 1, -22 }, // 0x29 ')' + { 361, 12, 14, 18, 5, -22 }, // 0x2A '*' + { 382, 16, 18, 24, 4, -17 }, // 0x2B '+' + { 418, 5, 8, 9, -1, -2 }, // 0x2C ',' + { 423, 8, 2, 12, 2, -8 }, // 0x2D '-' + { 425, 4, 4, 9, 1, -3 }, // 0x2E '.' + { 427, 16, 23, 10, 0, -22 }, // 0x2F '/' + { 473, 17, 24, 17, 1, -23 }, // 0x30 '0' + { 524, 12, 24, 17, 2, -23 }, // 0x31 '1' + { 560, 16, 23, 17, 1, -22 }, // 0x32 '2' + { 606, 17, 24, 18, 0, -23 }, // 0x33 '3' + { 657, 17, 24, 17, 0, -23 }, // 0x34 '4' + { 708, 16, 23, 18, 0, -22 }, // 0x35 '5' + { 754, 17, 24, 18, 1, -23 }, // 0x36 '6' + { 805, 16, 23, 17, 3, -22 }, // 0x37 '7' + { 851, 16, 24, 18, 1, -23 }, // 0x38 '8' + { 899, 16, 24, 17, 1, -23 }, // 0x39 '9' + { 947, 7, 15, 9, 2, -14 }, // 0x3A ':' + { 961, 9, 20, 9, 1, -14 }, // 0x3B ';' + { 984, 18, 18, 20, 2, -17 }, // 0x3C '<' + { 1025, 18, 9, 23, 3, -12 }, // 0x3D '=' + { 1046, 18, 18, 20, 2, -17 }, // 0x3E '>' + { 1087, 12, 23, 16, 4, -22 }, // 0x3F '?' + { 1122, 24, 23, 27, 2, -22 }, // 0x40 '@' + { 1191, 21, 23, 23, 0, -22 }, // 0x41 'A' + { 1252, 21, 23, 21, 0, -22 }, // 0x42 'B' + { 1313, 21, 23, 21, 2, -22 }, // 0x43 'C' + { 1374, 25, 23, 25, 0, -22 }, // 0x44 'D' + { 1446, 22, 23, 20, 0, -22 }, // 0x45 'E' + { 1510, 22, 23, 20, 0, -22 }, // 0x46 'F' + { 1574, 23, 23, 24, 2, -22 }, // 0x47 'G' + { 1641, 27, 23, 25, 0, -22 }, // 0x48 'H' + { 1719, 14, 23, 11, 0, -22 }, // 0x49 'I' + { 1760, 17, 23, 15, 0, -22 }, // 0x4A 'J' + { 1809, 25, 23, 22, 0, -22 }, // 0x4B 'K' + { 1881, 20, 23, 20, 0, -22 }, // 0x4C 'L' + { 1939, 31, 23, 29, 0, -22 }, // 0x4D 'M' + { 2029, 26, 23, 24, 0, -22 }, // 0x4E 'N' + { 2104, 23, 23, 23, 1, -22 }, // 0x4F 'O' + { 2171, 22, 23, 20, 0, -22 }, // 0x50 'P' + { 2235, 23, 29, 23, 1, -22 }, // 0x51 'Q' + { 2319, 21, 23, 22, 0, -22 }, // 0x52 'R' + { 2380, 17, 23, 16, 0, -22 }, // 0x53 'S' + { 2429, 20, 23, 21, 3, -22 }, // 0x54 'T' + { 2487, 23, 23, 25, 4, -22 }, // 0x55 'U' + { 2554, 21, 23, 23, 5, -22 }, // 0x56 'V' + { 2615, 29, 23, 31, 5, -22 }, // 0x57 'W' + { 2699, 24, 23, 23, 0, -22 }, // 0x58 'X' + { 2768, 19, 23, 21, 4, -22 }, // 0x59 'Y' + { 2823, 22, 23, 20, 0, -22 }, // 0x5A 'Z' + { 2887, 13, 28, 14, 1, -22 }, // 0x5B '[' + { 2933, 12, 23, 17, 4, -22 }, // 0x5C '\' + { 2968, 12, 28, 14, 1, -22 }, // 0x5D ']' + { 3010, 15, 13, 15, 0, -22 }, // 0x5E '^' + { 3035, 18, 2, 17, 0, 3 }, // 0x5F '_' + { 3040, 6, 6, 9, 5, -22 }, // 0x60 '`' + { 3045, 15, 15, 17, 1, -14 }, // 0x61 'a' + { 3074, 16, 24, 17, 1, -23 }, // 0x62 'b' + { 3122, 13, 15, 14, 1, -14 }, // 0x63 'c' + { 3147, 17, 24, 18, 1, -23 }, // 0x64 'd' + { 3198, 13, 15, 14, 1, -14 }, // 0x65 'e' + { 3223, 20, 31, 15, -3, -23 }, // 0x66 'f' + { 3301, 16, 22, 15, -1, -14 }, // 0x67 'g' + { 3345, 16, 24, 17, 1, -23 }, // 0x68 'h' + { 3393, 9, 23, 9, 1, -22 }, // 0x69 'i' + { 3419, 15, 30, 10, -3, -22 }, // 0x6A 'j' + { 3476, 15, 24, 16, 1, -23 }, // 0x6B 'k' + { 3521, 8, 25, 9, 1, -23 }, // 0x6C 'l' + { 3546, 24, 15, 25, 0, -14 }, // 0x6D 'm' + { 3591, 17, 15, 17, 0, -14 }, // 0x6E 'n' + { 3623, 15, 15, 17, 1, -14 }, // 0x6F 'o' + { 3652, 20, 22, 16, -3, -14 }, // 0x70 'p' + { 3707, 16, 22, 17, 1, -14 }, // 0x71 'q' + { 3751, 13, 15, 13, 1, -14 }, // 0x72 'r' + { 3776, 13, 15, 12, 0, -14 }, // 0x73 's' + { 3801, 9, 18, 8, 1, -17 }, // 0x74 't' + { 3822, 15, 15, 17, 1, -14 }, // 0x75 'u' + { 3851, 14, 15, 16, 2, -14 }, // 0x76 'v' + { 3878, 22, 15, 24, 1, -14 }, // 0x77 'w' + { 3920, 16, 15, 15, -1, -14 }, // 0x78 'x' + { 3950, 16, 22, 16, 0, -14 }, // 0x79 'y' + { 3994, 14, 18, 14, 0, -14 }, // 0x7A 'z' + { 4026, 12, 30, 14, 2, -23 }, // 0x7B '{' + { 4071, 2, 23, 10, 4, -22 }, // 0x7C '|' + { 4077, 12, 31, 14, 0, -24 }, // 0x7D '}' + { 4124, 17, 4, 19, 1, -10 } }; // 0x7E '~' + +const GFXfont FreeSerifItalic18pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic18pt7bBitmaps, + (GFXglyph *)FreeSerifItalic18pt7bGlyphs, + 0x20, 0x7E, 42 }; + +// Approx. 4805 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic24pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic24pt7b.h new file mode 100644 index 0000000..75da1e0 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic24pt7b.h @@ -0,0 +1,737 @@ +const uint8_t FreeSerifItalic24pt7bBitmaps[] PROGMEM = { + 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xF0, 0x1E, 0x01, 0xE0, 0x1C, + 0x01, 0xC0, 0x3C, 0x03, 0x80, 0x38, 0x03, 0x80, 0x30, 0x07, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x04, 0x00, 0x40, 0x0C, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF8, 0x0F, 0x80, 0xF8, 0x07, 0x00, + 0x38, 0x1D, 0xE0, 0x77, 0x83, 0xDC, 0x0E, 0x70, 0x39, 0xC1, 0xEE, 0x07, + 0x38, 0x1C, 0xC0, 0x63, 0x01, 0x8C, 0x06, 0x20, 0x10, 0x00, 0x06, 0x03, + 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0, + 0xE0, 0x00, 0xE0, 0x70, 0x00, 0xE0, 0x70, 0x00, 0x70, 0x38, 0x00, 0x30, + 0x18, 0x00, 0x38, 0x1C, 0x03, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xF0, 0x0E, + 0x07, 0x00, 0x06, 0x03, 0x00, 0x07, 0x03, 0x80, 0x03, 0x81, 0xC0, 0x03, + 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0xE0, 0x70, 0x1F, 0xFF, 0xFF, 0x8F, + 0xFF, 0xFF, 0x80, 0x70, 0x38, 0x00, 0x38, 0x1C, 0x00, 0x1C, 0x0C, 0x00, + 0x1C, 0x0E, 0x00, 0x0E, 0x07, 0x00, 0x0E, 0x07, 0x00, 0x07, 0x03, 0x80, + 0x03, 0x81, 0xC0, 0x03, 0x81, 0xC0, 0x01, 0xC0, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x18, 0x00, 0x00, 0xC0, 0x00, 0xFF, 0x80, 0x1C, 0x2F, 0x01, + 0x83, 0x3C, 0x1C, 0x18, 0xE1, 0xC0, 0xC3, 0x0E, 0x06, 0x18, 0x70, 0x60, + 0x83, 0x83, 0x04, 0x1E, 0x18, 0x00, 0xF8, 0xC0, 0x03, 0xEC, 0x00, 0x0F, + 0xE0, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, + 0x00, 0x7F, 0x00, 0x03, 0x7C, 0x00, 0x19, 0xE0, 0x01, 0x87, 0x80, 0x0C, + 0x3C, 0x00, 0x60, 0xE2, 0x03, 0x07, 0x10, 0x30, 0x39, 0x81, 0x81, 0xCE, + 0x0C, 0x0C, 0x70, 0x60, 0xE3, 0xC6, 0x06, 0x0F, 0x30, 0x60, 0x1F, 0x9E, + 0x00, 0x3F, 0x80, 0x00, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, + 0x80, 0x00, 0x01, 0xF0, 0x00, 0xC0, 0x03, 0xFE, 0x01, 0xE0, 0x03, 0xC7, + 0x83, 0xE0, 0x03, 0xC0, 0x7F, 0x60, 0x03, 0xC0, 0x20, 0x70, 0x01, 0xC0, + 0x10, 0x30, 0x01, 0xE0, 0x08, 0x38, 0x00, 0xE0, 0x04, 0x18, 0x00, 0xF0, + 0x02, 0x1C, 0x00, 0x70, 0x02, 0x0C, 0x00, 0x38, 0x01, 0x0E, 0x00, 0x1C, + 0x01, 0x8E, 0x00, 0x0E, 0x00, 0x86, 0x00, 0x07, 0x00, 0x87, 0x03, 0xE1, + 0x80, 0xC3, 0x07, 0xFC, 0xE1, 0xC3, 0x87, 0xC6, 0x3F, 0x81, 0x87, 0x81, + 0x8F, 0x81, 0xC7, 0x80, 0x40, 0x00, 0xC3, 0xC0, 0x20, 0x00, 0xE3, 0xC0, + 0x10, 0x00, 0x61, 0xC0, 0x08, 0x00, 0x61, 0xE0, 0x04, 0x00, 0x70, 0xF0, + 0x06, 0x00, 0x30, 0x70, 0x02, 0x00, 0x38, 0x38, 0x03, 0x00, 0x18, 0x1C, + 0x01, 0x00, 0x1C, 0x0E, 0x01, 0x80, 0x0C, 0x07, 0x01, 0x80, 0x0E, 0x01, + 0xC3, 0x80, 0x06, 0x00, 0x7F, 0x80, 0x06, 0x00, 0x1F, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x71, + 0xC0, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x38, 0x38, + 0x00, 0x01, 0xE0, 0xE0, 0x00, 0x07, 0x87, 0x00, 0x00, 0x1E, 0x18, 0x00, + 0x00, 0x78, 0xC0, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7F, + 0xC1, 0xFE, 0x03, 0x9F, 0x03, 0xE0, 0x3C, 0x3C, 0x07, 0x01, 0xE0, 0xF8, + 0x1C, 0x0F, 0x03, 0xE0, 0xE0, 0x7C, 0x07, 0x83, 0x01, 0xE0, 0x1F, 0x1C, + 0x07, 0x80, 0x7C, 0x60, 0x3E, 0x00, 0xFB, 0x00, 0xF8, 0x03, 0xFC, 0x03, + 0xE0, 0x07, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x7C, + 0x00, 0xFC, 0x01, 0xF8, 0x0F, 0xF0, 0x03, 0xF0, 0xF3, 0xF0, 0x87, 0xFF, + 0x07, 0xFC, 0x07, 0xF0, 0x07, 0xC0, 0x39, 0xDE, 0xE7, 0x3B, 0x9C, 0xC6, + 0x31, 0x00, 0x00, 0x10, 0x01, 0x00, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, + 0x1C, 0x00, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3C, + 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00, + 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, + 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x01, 0x00, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x80, 0x06, 0x00, 0x10, 0x00, + 0x80, 0x06, 0x00, 0x30, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x38, 0x03, 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, + 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0xE1, 0x07, 0xE1, 0x0F, + 0xF1, 0x1F, 0x19, 0x30, 0x07, 0xC0, 0x03, 0x80, 0x0D, 0x60, 0x79, 0x3C, + 0xF1, 0x1F, 0xE1, 0x0F, 0xE1, 0x07, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, + 0xC0, 0x00, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x70, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x70, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, + 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1C, 0x7C, 0xF9, + 0xF1, 0xE1, 0xC3, 0x0C, 0x10, 0xC1, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, + 0x77, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C, + 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0x00, + 0xF0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, + 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, + 0x00, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x00, 0x01, + 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00, + 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, + 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x03, 0x86, + 0x00, 0x30, 0x18, 0x03, 0x00, 0xC0, 0x38, 0x03, 0x03, 0x80, 0x18, 0x38, + 0x00, 0xC1, 0xC0, 0x07, 0x1C, 0x00, 0x38, 0xE0, 0x01, 0xCF, 0x00, 0x0E, + 0x70, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xE0, 0x01, 0xEE, 0x00, + 0x0F, 0xF0, 0x00, 0x77, 0x80, 0x07, 0xBC, 0x00, 0x3D, 0xC0, 0x01, 0xCE, + 0x00, 0x1E, 0x70, 0x00, 0xF3, 0x80, 0x07, 0x1C, 0x00, 0x78, 0xE0, 0x03, + 0x83, 0x00, 0x38, 0x18, 0x03, 0x80, 0xE0, 0x18, 0x03, 0x01, 0x80, 0x0C, + 0x38, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, + 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, + 0xF0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1E, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xE0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3F, 0x01, 0xFF, + 0xF0, 0x00, 0x3F, 0x00, 0x07, 0xFE, 0x00, 0x7F, 0xF8, 0x07, 0x07, 0xE0, + 0x60, 0x1F, 0x06, 0x00, 0x7C, 0x20, 0x01, 0xE0, 0x00, 0x0F, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00, + 0x00, 0xF0, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, + 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x03, + 0x00, 0x00, 0x30, 0x00, 0x03, 0x00, 0x00, 0x30, 0x01, 0x03, 0x00, 0x08, + 0x30, 0x00, 0xC3, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0xFF, 0xC0, 0x06, 0x0F, 0x80, 0x30, 0x1E, 0x01, 0x80, + 0x3C, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x78, + 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0E, 0x00, 0x01, + 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x0F, + 0x80, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, + 0x00, 0x1E, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, + 0x38, 0x00, 0x00, 0xC0, 0x70, 0x06, 0x03, 0xF8, 0x70, 0x07, 0xFF, 0x00, + 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0, + 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x37, 0x80, 0x00, + 0xDC, 0x00, 0x06, 0x70, 0x00, 0x33, 0xC0, 0x01, 0x8F, 0x00, 0x0C, 0x38, + 0x00, 0x60, 0xE0, 0x03, 0x07, 0x80, 0x18, 0x1E, 0x00, 0xC0, 0x70, 0x06, + 0x03, 0xC0, 0x30, 0x0F, 0x01, 0x80, 0x38, 0x0C, 0x00, 0xE0, 0x70, 0x07, + 0x81, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFE, 0x00, 0x0F, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, + 0x70, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0xFF, + 0xF0, 0x07, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x70, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0xF0, 0x00, 0x1F, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3C, + 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, + 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0C, 0x00, 0x00, + 0x70, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, + 0x70, 0x0E, 0x03, 0xF0, 0xE0, 0x07, 0xFF, 0x00, 0x0F, 0xE0, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x03, + 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xC0, + 0x00, 0x0F, 0x80, 0x00, 0x3E, 0x00, 0x00, 0xF9, 0xF8, 0x01, 0xFF, 0xFC, + 0x07, 0xE0, 0x7C, 0x0F, 0x80, 0x7C, 0x3E, 0x00, 0x78, 0x78, 0x00, 0x78, + 0xF0, 0x00, 0xF3, 0xC0, 0x01, 0xE7, 0x80, 0x03, 0xCF, 0x00, 0x07, 0x9C, + 0x00, 0x0F, 0x38, 0x00, 0x3E, 0x70, 0x00, 0x78, 0xE0, 0x00, 0xF1, 0xC0, + 0x03, 0xC1, 0x80, 0x07, 0x83, 0x00, 0x1E, 0x03, 0x00, 0x38, 0x06, 0x01, + 0xE0, 0x03, 0x07, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0xFF, 0xF9, 0xFF, 0xFF, + 0xCF, 0xFF, 0xFC, 0xE0, 0x00, 0xCC, 0x00, 0x0E, 0x40, 0x00, 0x60, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x38, 0x00, 0x01, 0x80, + 0x00, 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x07, + 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x03, 0x80, 0x00, + 0x1C, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x0E, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x38, + 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x03, 0x83, + 0x80, 0x1C, 0x03, 0x00, 0xE0, 0x0E, 0x07, 0x00, 0x1C, 0x1C, 0x00, 0x70, + 0x70, 0x01, 0xC1, 0xC0, 0x07, 0x07, 0x80, 0x1C, 0x1E, 0x00, 0xE0, 0x3C, + 0x07, 0x80, 0xFC, 0x38, 0x01, 0xFB, 0xC0, 0x03, 0xF8, 0x00, 0x0F, 0xE0, + 0x00, 0x7F, 0xC0, 0x07, 0x1F, 0x80, 0x78, 0x3F, 0x03, 0x80, 0x7C, 0x1E, + 0x00, 0xF8, 0x70, 0x01, 0xE3, 0x80, 0x03, 0xCE, 0x00, 0x07, 0x38, 0x00, + 0x1C, 0xE0, 0x00, 0x73, 0x80, 0x01, 0xCE, 0x00, 0x06, 0x1C, 0x00, 0x38, + 0x70, 0x01, 0xC0, 0xE0, 0x0E, 0x01, 0xE0, 0xE0, 0x01, 0xFE, 0x00, 0x00, + 0x1F, 0x80, 0x03, 0xC3, 0x00, 0x1C, 0x02, 0x00, 0xE0, 0x0C, 0x07, 0x00, + 0x18, 0x3C, 0x00, 0x60, 0xE0, 0x01, 0xC7, 0x80, 0x07, 0x1E, 0x00, 0x1C, + 0xF0, 0x00, 0x73, 0xC0, 0x01, 0xCF, 0x00, 0x07, 0x3C, 0x00, 0x3C, 0xF0, + 0x00, 0xF3, 0xC0, 0x03, 0xCF, 0x00, 0x1E, 0x1E, 0x00, 0x78, 0x7C, 0x03, + 0xE0, 0xF8, 0x3F, 0x01, 0xFF, 0xBC, 0x03, 0xF1, 0xE0, 0x00, 0x0F, 0x80, + 0x00, 0x3C, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x03, + 0xE0, 0x00, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x78, 0x00, + 0x0F, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x07, 0xC3, 0xE1, 0xF0, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x3E, 0x1F, 0x0F, 0x83, 0x80, 0x01, 0xC0, 0x7C, 0x0F, 0x81, + 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x80, 0xF8, 0x1F, 0x01, 0xE0, + 0x1C, 0x03, 0x00, 0xC0, 0x18, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, + 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0xFF, 0x00, 0x07, 0xF8, 0x00, 0x3F, + 0xC0, 0x01, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x80, + 0x00, 0x3F, 0xC0, 0x00, 0x1F, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xF8, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x1F, + 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, + 0x0F, 0xF0, 0x00, 0x03, 0xFC, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x07, 0xF0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x07, 0xF8, 0x00, 0x1F, 0xE0, + 0x00, 0x7F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0xC0, 0x00, + 0xFF, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x03, 0xF0, 0x06, 0x1C, 0x0C, 0x0E, 0x1C, 0x06, 0x1C, 0x07, 0x1C, 0x07, + 0x1C, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x3C, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x00, + 0xF8, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x1F, + 0xFF, 0x80, 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x7C, + 0x00, 0x07, 0x80, 0x7C, 0x00, 0x00, 0xE0, 0x3C, 0x00, 0x00, 0x38, 0x3C, + 0x00, 0x00, 0x0C, 0x3C, 0x00, 0x78, 0x07, 0x1E, 0x00, 0xFE, 0xE1, 0x9E, + 0x00, 0xF1, 0xF0, 0xEF, 0x00, 0xE0, 0xF0, 0x37, 0x80, 0xE0, 0x38, 0x1F, + 0x80, 0x70, 0x1C, 0x0F, 0xC0, 0x70, 0x1E, 0x07, 0xE0, 0x38, 0x0F, 0x03, + 0xF0, 0x18, 0x07, 0x01, 0xF8, 0x1C, 0x03, 0x80, 0xFC, 0x0E, 0x01, 0xC0, + 0xDE, 0x07, 0x01, 0xE0, 0x6F, 0x03, 0x80, 0xE0, 0x73, 0xC1, 0xC0, 0xF0, + 0x31, 0xE0, 0xF0, 0xF8, 0x30, 0xF0, 0x38, 0xDC, 0x30, 0x3C, 0x1F, 0xC7, + 0xF0, 0x0E, 0x07, 0x81, 0xF0, 0x07, 0x80, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x03, 0xF0, + 0x0F, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, + 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x03, 0xF0, + 0x00, 0x00, 0x37, 0x80, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x19, 0xE0, 0x00, + 0x01, 0x8F, 0x80, 0x00, 0x08, 0x7C, 0x00, 0x00, 0xC3, 0xE0, 0x00, 0x0C, + 0x0F, 0x00, 0x00, 0x60, 0x78, 0x00, 0x06, 0x03, 0xC0, 0x00, 0x20, 0x1F, + 0x00, 0x03, 0x00, 0xF8, 0x00, 0x3F, 0xFF, 0xC0, 0x01, 0xFF, 0xFE, 0x00, + 0x18, 0x00, 0xF0, 0x00, 0xC0, 0x07, 0x80, 0x0C, 0x00, 0x3E, 0x00, 0xE0, + 0x01, 0xF0, 0x06, 0x00, 0x0F, 0x80, 0x70, 0x00, 0x3C, 0x03, 0x00, 0x01, + 0xE0, 0x38, 0x00, 0x0F, 0x83, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x07, 0xF3, + 0xFC, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x3E, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0, + 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0, + 0x3F, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0xFF, 0xFC, 0x00, 0x1F, 0x07, 0xE0, + 0x01, 0xE0, 0x1F, 0x00, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x07, 0xC0, 0x3C, + 0x00, 0x7C, 0x03, 0xC0, 0x07, 0xC0, 0x7C, 0x00, 0x7C, 0x07, 0xC0, 0x07, + 0xC0, 0x78, 0x00, 0x7C, 0x0F, 0x80, 0x0F, 0x80, 0xF8, 0x00, 0xF8, 0x0F, + 0x00, 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1F, 0x81, 0xFC, 0x03, 0xFF, 0xFF, + 0x80, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFE, 0x04, 0x00, 0x3F, 0xFF, + 0xE0, 0x03, 0xF0, 0x1F, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x78, + 0x0F, 0x80, 0x00, 0xE0, 0x3C, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x04, 0x0F, + 0x80, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x41, 0xF0, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x3E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x07, 0xC0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x07, 0xC0, 0x00, 0x18, 0x0F, 0x80, + 0x00, 0xC0, 0x3E, 0x00, 0x06, 0x00, 0x7C, 0x00, 0x70, 0x00, 0xFC, 0x07, + 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, 0x0F, 0xC0, 0xFC, 0x00, 0x07, 0xC0, + 0x1F, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xF0, + 0x00, 0x7C, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0x0F, 0x00, 0x3C, + 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x01, 0xF0, 0x0F, + 0x00, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x7C, 0x07, 0xC0, 0x00, 0x3E, 0x03, + 0xE0, 0x00, 0x1F, 0x01, 0xE0, 0x00, 0x1F, 0x81, 0xF0, 0x00, 0x0F, 0x80, + 0xF8, 0x00, 0x07, 0xC0, 0x78, 0x00, 0x03, 0xE0, 0x3C, 0x00, 0x03, 0xE0, + 0x3E, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, + 0x0F, 0x80, 0x01, 0xF8, 0x07, 0xC0, 0x01, 0xF0, 0x03, 0xE0, 0x01, 0xF0, + 0x01, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x0F, 0xE0, 0x01, 0xFF, 0xFF, 0xC0, + 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, + 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0x30, 0x03, 0xE0, 0x01, 0x00, + 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40, 0x0F, 0x80, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x03, 0xC0, 0x10, 0x00, 0x3E, 0x01, 0x80, 0x01, 0xF0, 0x08, + 0x00, 0x0F, 0x01, 0xC0, 0x00, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF0, 0x00, + 0x3E, 0x07, 0x00, 0x01, 0xE0, 0x18, 0x00, 0x1F, 0x00, 0xC0, 0x00, 0xF8, + 0x04, 0x00, 0x07, 0x80, 0x20, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x08, 0x0F, 0x80, 0x00, 0xC0, + 0x7C, 0x00, 0x0E, 0x03, 0xC0, 0x00, 0xE0, 0x1E, 0x00, 0x0F, 0x01, 0xF8, + 0x03, 0xF8, 0x1F, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFC, 0x00, 0x03, 0xFF, + 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x7C, 0x00, + 0x30, 0x03, 0xE0, 0x01, 0x00, 0x1E, 0x00, 0x08, 0x01, 0xF0, 0x00, 0x40, + 0x0F, 0x80, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x3E, + 0x00, 0x80, 0x01, 0xF0, 0x0C, 0x00, 0x0F, 0x00, 0xC0, 0x00, 0xF8, 0x0E, + 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0xE0, 0x18, 0x00, + 0x1F, 0x00, 0xC0, 0x00, 0xF8, 0x06, 0x00, 0x07, 0xC0, 0x20, 0x00, 0x3C, + 0x01, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x02, 0x00, 0x1F, 0xFF, 0x8C, 0x00, + 0xFC, 0x07, 0xF8, 0x03, 0xE0, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0xC0, 0x3C, + 0x00, 0x03, 0x80, 0xF0, 0x00, 0x07, 0x03, 0xC0, 0x00, 0x0E, 0x0F, 0x80, + 0x00, 0x08, 0x3E, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x01, 0xF0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3F, + 0xFF, 0xE0, 0x00, 0x0F, 0xE7, 0xC0, 0x00, 0x0F, 0x0F, 0x80, 0x00, 0x1E, + 0x1F, 0x00, 0x00, 0x7C, 0x3E, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x01, 0xE0, + 0x78, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x0F, 0x01, 0xF0, 0x00, 0x1E, 0x01, + 0xF0, 0x00, 0x3C, 0x01, 0xE0, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x01, + 0xF8, 0x0F, 0x80, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x03, + 0xFF, 0xE0, 0x7F, 0xF0, 0x07, 0xF8, 0x01, 0xFC, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, + 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x03, 0xC0, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x01, + 0xE0, 0x00, 0x78, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xF8, 0x00, + 0xFE, 0x00, 0xFF, 0xE0, 0x7F, 0xFC, 0x00, 0x01, 0xFF, 0xC0, 0x1F, 0xE0, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1E, + 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, + 0x0F, 0xE0, 0x0F, 0xFE, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x07, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0F, 0x80, 0x00, 0x1F, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x01, 0xF0, 0x00, 0x03, 0xE0, + 0x00, 0x07, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x78, 0x00, + 0x00, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xC0, 0x00, 0x0F, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xF0, 0x01, 0xC1, 0xE0, 0x07, 0xC7, + 0x80, 0x0F, 0x8F, 0x00, 0x1F, 0x3C, 0x00, 0x1F, 0xF0, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xFF, 0xE1, 0xFF, 0x80, 0x3F, 0xC0, 0x1F, 0x80, 0x0F, 0x80, + 0x0F, 0x00, 0x07, 0xC0, 0x0F, 0x00, 0x03, 0xC0, 0x0F, 0x00, 0x01, 0xE0, + 0x0E, 0x00, 0x01, 0xF0, 0x0E, 0x00, 0x00, 0xF8, 0x0E, 0x00, 0x00, 0x78, + 0x1C, 0x00, 0x00, 0x3C, 0x1C, 0x00, 0x00, 0x3E, 0x3C, 0x00, 0x00, 0x1F, + 0x38, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x07, + 0xFE, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x00, 0x01, 0xE7, 0xC0, 0x00, 0x01, + 0xF3, 0xE0, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x78, 0x3C, 0x00, 0x00, + 0x3C, 0x1F, 0x00, 0x00, 0x3E, 0x07, 0xC0, 0x00, 0x1F, 0x03, 0xE0, 0x00, + 0x0F, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x07, 0xC0, 0x1F, 0x00, + 0x03, 0xC0, 0x07, 0x80, 0x01, 0xE0, 0x03, 0xE0, 0x01, 0xF0, 0x01, 0xF8, + 0x01, 0xFC, 0x01, 0xFE, 0x03, 0xFF, 0xC3, 0xFF, 0xE0, 0x03, 0xFF, 0xE0, + 0x00, 0x0F, 0xF0, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, + 0x0F, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x80, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x01, + 0xF0, 0x00, 0x08, 0x3C, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41, 0xF0, 0x00, + 0x18, 0x3C, 0x00, 0x07, 0x07, 0x80, 0x01, 0xC1, 0xF8, 0x01, 0xF8, 0x7F, + 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0x00, 0x00, 0x3F, 0xC0, + 0x0F, 0xC0, 0x00, 0x1F, 0xC0, 0x01, 0xF0, 0x00, 0x0F, 0xE0, 0x00, 0xFC, + 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x01, 0xFC, 0x00, 0x0F, 0xC0, 0x00, + 0xFF, 0x00, 0x02, 0xF0, 0x00, 0x37, 0x80, 0x01, 0xBC, 0x00, 0x19, 0xE0, + 0x00, 0x6F, 0x80, 0x0E, 0xF8, 0x00, 0x1B, 0xE0, 0x03, 0x3E, 0x00, 0x04, + 0x78, 0x01, 0x8F, 0x00, 0x03, 0x1E, 0x00, 0xE7, 0xC0, 0x00, 0xC7, 0x80, + 0x31, 0xF0, 0x00, 0x21, 0xE0, 0x18, 0x78, 0x00, 0x18, 0x78, 0x0E, 0x1E, + 0x00, 0x06, 0x1E, 0x03, 0x0F, 0x80, 0x01, 0x87, 0x81, 0x83, 0xE0, 0x00, + 0x41, 0xF0, 0xE0, 0xF0, 0x00, 0x30, 0x7C, 0x30, 0x3C, 0x00, 0x0C, 0x0F, + 0x18, 0x1F, 0x00, 0x03, 0x03, 0xCE, 0x07, 0xC0, 0x01, 0x80, 0xF3, 0x01, + 0xE0, 0x00, 0x60, 0x3D, 0x80, 0xF8, 0x00, 0x18, 0x0F, 0xE0, 0x3E, 0x00, + 0x0C, 0x03, 0xF0, 0x0F, 0x00, 0x03, 0x00, 0xF8, 0x03, 0xC0, 0x00, 0xC0, + 0x3E, 0x01, 0xF0, 0x00, 0x70, 0x0F, 0x00, 0x7C, 0x00, 0x1C, 0x01, 0x80, + 0x3F, 0x00, 0x0F, 0x80, 0x60, 0x1F, 0xC0, 0x0F, 0xF8, 0x10, 0x1F, 0xFE, + 0x00, 0x03, 0xFC, 0x00, 0x3F, 0xE0, 0x1F, 0xC0, 0x01, 0xF8, 0x00, 0xF8, + 0x00, 0x1C, 0x00, 0x1F, 0x00, 0x03, 0x80, 0x03, 0xF0, 0x00, 0x60, 0x00, + 0x7E, 0x00, 0x0C, 0x00, 0x0B, 0xE0, 0x03, 0x80, 0x03, 0x7C, 0x00, 0x60, + 0x00, 0x67, 0x80, 0x0C, 0x00, 0x0C, 0xF8, 0x03, 0x80, 0x03, 0x0F, 0x00, + 0x70, 0x00, 0x61, 0xF0, 0x0C, 0x00, 0x0C, 0x3E, 0x01, 0x80, 0x01, 0x83, + 0xC0, 0x70, 0x00, 0x60, 0x7C, 0x0C, 0x00, 0x0C, 0x07, 0x81, 0x80, 0x01, + 0x80, 0xF8, 0x30, 0x00, 0x60, 0x0F, 0x0E, 0x00, 0x0C, 0x01, 0xE1, 0x80, + 0x01, 0x80, 0x3E, 0x30, 0x00, 0x30, 0x03, 0xCE, 0x00, 0x0C, 0x00, 0x7D, + 0x80, 0x01, 0x80, 0x07, 0xB0, 0x00, 0x30, 0x00, 0xF6, 0x00, 0x0E, 0x00, + 0x1F, 0xC0, 0x01, 0x80, 0x01, 0xF0, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x0E, + 0x00, 0x03, 0xC0, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x06, 0x00, + 0x3F, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFE, + 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78, + 0x00, 0x78, 0x00, 0xF0, 0x07, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0x81, + 0xF0, 0x00, 0x1E, 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF0, + 0x00, 0x07, 0xC7, 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00, + 0x01, 0xF7, 0xE0, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0x3F, 0x7C, 0x00, 0x00, + 0xFB, 0xF0, 0x00, 0x07, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C, + 0xF8, 0x00, 0x03, 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E, + 0x00, 0x01, 0xF0, 0xF8, 0x00, 0x0F, 0x81, 0xE0, 0x00, 0x3E, 0x07, 0x80, + 0x01, 0xF0, 0x1F, 0x00, 0x0F, 0x80, 0x3C, 0x00, 0x7C, 0x00, 0x78, 0x03, + 0xC0, 0x00, 0xF8, 0x3E, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x01, 0xFC, 0x00, + 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x0F, 0x81, 0xF8, + 0x00, 0x7C, 0x03, 0xE0, 0x03, 0xE0, 0x1F, 0x00, 0x1E, 0x00, 0x7C, 0x01, + 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x78, 0x00, 0xF8, 0x03, 0xC0, + 0x07, 0xC0, 0x3E, 0x00, 0x3C, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x00, 0x3E, + 0x00, 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x7E, 0x00, 0x3F, 0xFF, 0xE0, 0x01, + 0xEF, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0x3C, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0xC0, + 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1F, + 0xFE, 0x00, 0x00, 0xF0, 0x7C, 0x00, 0x0F, 0x00, 0x78, 0x00, 0x78, 0x00, + 0xF0, 0x03, 0xC0, 0x03, 0xE0, 0x1E, 0x00, 0x07, 0x80, 0xF0, 0x00, 0x1E, + 0x07, 0xC0, 0x00, 0x7C, 0x3E, 0x00, 0x01, 0xF1, 0xF8, 0x00, 0x07, 0xC7, + 0xC0, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01, 0xF7, 0xE0, + 0x00, 0x0F, 0xDF, 0x80, 0x00, 0x3F, 0x7C, 0x00, 0x00, 0xFB, 0xF0, 0x00, + 0x03, 0xEF, 0xC0, 0x00, 0x1F, 0xBE, 0x00, 0x00, 0x7C, 0xF8, 0x00, 0x01, + 0xF3, 0xE0, 0x00, 0x0F, 0x8F, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x01, 0xF0, + 0xF8, 0x00, 0x07, 0xC3, 0xE0, 0x00, 0x3E, 0x07, 0x80, 0x01, 0xF0, 0x1F, + 0x00, 0x07, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xE0, 0x01, 0xE0, + 0x1E, 0x00, 0x01, 0xF3, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x04, 0x0F, 0xF0, 0x00, + 0x60, 0x7F, 0xFC, 0x07, 0x03, 0xFF, 0xFF, 0xF8, 0x38, 0x1F, 0xFF, 0x80, + 0x00, 0x07, 0xF8, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xF8, 0x00, + 0x3E, 0x0F, 0xC0, 0x03, 0xE0, 0x3E, 0x00, 0x3E, 0x01, 0xF0, 0x03, 0xC0, + 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x78, 0x01, 0xF0, + 0x07, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x7C, 0x00, 0xF0, + 0x1F, 0x80, 0x1F, 0xFF, 0xE0, 0x01, 0xFF, 0xF0, 0x00, 0x1E, 0x1E, 0x00, + 0x01, 0xE1, 0xE0, 0x00, 0x3E, 0x1F, 0x00, 0x03, 0xE0, 0xF0, 0x00, 0x3C, + 0x0F, 0x00, 0x03, 0xC0, 0xF8, 0x00, 0x7C, 0x07, 0x80, 0x07, 0xC0, 0x7C, + 0x00, 0x78, 0x03, 0xC0, 0x0F, 0x80, 0x3C, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x00, 0x1E, 0x00, 0xF0, 0x01, 0xE0, 0x1F, 0x00, 0x1F, 0x03, 0xF8, 0x00, + 0xF8, 0xFF, 0xE0, 0x0F, 0xE0, 0x00, 0x3F, 0x06, 0x01, 0xFF, 0xDC, 0x07, + 0xC1, 0xF0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0xF0, 0x03, 0x81, 0xE0, + 0x03, 0x03, 0xC0, 0x04, 0x07, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x1F, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x3E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x08, 0x00, 0x78, 0x10, + 0x00, 0xF0, 0x20, 0x01, 0xE0, 0xC0, 0x03, 0xC1, 0x80, 0x07, 0x83, 0x80, + 0x1E, 0x07, 0x00, 0x3C, 0x0F, 0x00, 0xF0, 0x1F, 0x87, 0xC0, 0x23, 0xFF, + 0x00, 0x81, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFD, 0xF0, + 0x3E, 0x07, 0xB8, 0x07, 0xC0, 0x76, 0x00, 0xF8, 0x04, 0x80, 0x3E, 0x00, + 0xB0, 0x07, 0xC0, 0x14, 0x00, 0xF8, 0x02, 0x00, 0x1E, 0x00, 0x00, 0x07, + 0xC0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00, + 0x00, 0xF8, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xF8, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x03, + 0xE0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0x7F, 0xFE, 0x03, 0xFE, 0x1F, 0xE0, 0x01, 0xF8, 0x1F, 0x80, 0x01, + 0xC0, 0x3E, 0x00, 0x03, 0x80, 0x7C, 0x00, 0x07, 0x00, 0xF8, 0x00, 0x0C, + 0x03, 0xE0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x70, 0x0F, 0x80, 0x00, 0xC0, + 0x1F, 0x00, 0x01, 0x80, 0x7C, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x0E, 0x01, + 0xF0, 0x00, 0x18, 0x07, 0xC0, 0x00, 0x30, 0x0F, 0x80, 0x00, 0x60, 0x1F, + 0x00, 0x01, 0x80, 0x3E, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x06, 0x01, 0xF0, + 0x00, 0x18, 0x03, 0xE0, 0x00, 0x30, 0x07, 0xC0, 0x00, 0x60, 0x1F, 0x00, + 0x00, 0xC0, 0x3E, 0x00, 0x03, 0x00, 0x7C, 0x00, 0x06, 0x00, 0xF8, 0x00, + 0x18, 0x01, 0xF0, 0x00, 0x30, 0x03, 0xE0, 0x00, 0xC0, 0x03, 0xE0, 0x03, + 0x80, 0x03, 0xE0, 0x0E, 0x00, 0x03, 0xF0, 0x78, 0x00, 0x03, 0xFF, 0xC0, + 0x00, 0x01, 0xFE, 0x00, 0x00, 0xFF, 0xE0, 0x0F, 0xF9, 0xFC, 0x00, 0x1F, + 0x07, 0xC0, 0x00, 0x78, 0x3E, 0x00, 0x03, 0x81, 0xF0, 0x00, 0x18, 0x0F, + 0x80, 0x01, 0xC0, 0x7C, 0x00, 0x0C, 0x01, 0xE0, 0x00, 0xC0, 0x0F, 0x80, + 0x06, 0x00, 0x7C, 0x00, 0x60, 0x03, 0xE0, 0x07, 0x00, 0x1F, 0x00, 0x30, + 0x00, 0xF8, 0x03, 0x00, 0x03, 0xC0, 0x18, 0x00, 0x1E, 0x01, 0x80, 0x00, + 0xF8, 0x1C, 0x00, 0x07, 0xC0, 0xC0, 0x00, 0x3E, 0x0C, 0x00, 0x01, 0xF0, + 0x60, 0x00, 0x07, 0x86, 0x00, 0x00, 0x3C, 0x30, 0x00, 0x01, 0xE3, 0x00, + 0x00, 0x0F, 0xB0, 0x00, 0x00, 0x7D, 0x80, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0xFF, 0xE3, 0xFF, 0x81, 0xFE, 0x7F, 0x01, 0xFC, 0x00, 0xF8, 0x7C, + 0x01, 0xF0, 0x00, 0xE0, 0xF8, 0x03, 0xE0, 0x01, 0x81, 0xF0, 0x03, 0xC0, + 0x07, 0x03, 0xE0, 0x07, 0x80, 0x0C, 0x03, 0xC0, 0x0F, 0x00, 0x18, 0x07, + 0x80, 0x1E, 0x00, 0x60, 0x0F, 0x00, 0x7E, 0x00, 0xC0, 0x1F, 0x00, 0xFC, + 0x03, 0x00, 0x3E, 0x03, 0xF8, 0x06, 0x00, 0x7C, 0x05, 0xF0, 0x18, 0x00, + 0xF8, 0x1B, 0xE0, 0x30, 0x01, 0xF0, 0x33, 0xC0, 0xC0, 0x01, 0xE0, 0xC7, + 0x83, 0x80, 0x03, 0xC1, 0x8F, 0x06, 0x00, 0x07, 0x86, 0x1E, 0x1C, 0x00, + 0x0F, 0x0C, 0x3C, 0x30, 0x00, 0x1F, 0x30, 0x7C, 0xE0, 0x00, 0x3E, 0x60, + 0xF9, 0x80, 0x00, 0x7D, 0x81, 0xF7, 0x00, 0x00, 0xFB, 0x03, 0xEC, 0x00, + 0x01, 0xFC, 0x03, 0xF8, 0x00, 0x01, 0xF8, 0x07, 0xE0, 0x00, 0x03, 0xE0, + 0x0F, 0x80, 0x00, 0x07, 0xC0, 0x1F, 0x00, 0x00, 0x0F, 0x00, 0x3C, 0x00, + 0x00, 0x1E, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0xE0, 0x00, 0x00, 0x70, + 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, + 0x00, 0x07, 0xFF, 0x83, 0xFF, 0x01, 0xFE, 0x00, 0xFE, 0x00, 0x7C, 0x00, + 0x78, 0x00, 0x7C, 0x00, 0x70, 0x00, 0x3C, 0x00, 0xE0, 0x00, 0x3E, 0x01, + 0xC0, 0x00, 0x3E, 0x01, 0x80, 0x00, 0x1F, 0x03, 0x00, 0x00, 0x1F, 0x07, + 0x00, 0x00, 0x0F, 0x0E, 0x00, 0x00, 0x0F, 0x9C, 0x00, 0x00, 0x0F, 0xB8, + 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x03, 0xC0, + 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, + 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x1C, 0xF0, 0x00, 0x00, 0x38, 0xF8, + 0x00, 0x00, 0x30, 0xF8, 0x00, 0x00, 0x60, 0x7C, 0x00, 0x00, 0xC0, 0x7C, + 0x00, 0x01, 0xC0, 0x3C, 0x00, 0x03, 0x80, 0x3E, 0x00, 0x07, 0x00, 0x3E, + 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0x3F, + 0xC0, 0xFF, 0xC1, 0xFF, 0xF0, 0x7F, 0xF0, 0x7F, 0xC7, 0xF0, 0x03, 0xE0, + 0xF8, 0x00, 0x70, 0x3E, 0x00, 0x38, 0x07, 0x80, 0x0C, 0x01, 0xE0, 0x07, + 0x00, 0x7C, 0x03, 0x80, 0x1F, 0x00, 0xC0, 0x03, 0xC0, 0x60, 0x00, 0xF0, + 0x30, 0x00, 0x3E, 0x1C, 0x00, 0x07, 0x8E, 0x00, 0x01, 0xE3, 0x00, 0x00, + 0x7D, 0x80, 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x3C, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x01, 0xF0, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x03, + 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x0F, 0xC0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x03, 0xFF, + 0xFF, 0xF8, 0x1F, 0xFF, 0xFF, 0x81, 0xF0, 0x00, 0xFC, 0x0E, 0x00, 0x0F, + 0xC0, 0x60, 0x00, 0xFC, 0x06, 0x00, 0x0F, 0xC0, 0x20, 0x00, 0x7C, 0x00, + 0x00, 0x07, 0xE0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x1F, 0x00, 0x00, + 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xFC, 0x00, + 0x08, 0x0F, 0xC0, 0x00, 0x80, 0xFC, 0x00, 0x0C, 0x07, 0xC0, 0x00, 0x60, + 0x7E, 0x00, 0x07, 0x07, 0xE0, 0x01, 0xF0, 0x7F, 0xFF, 0xFF, 0x83, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0x80, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xE0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, + 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0x80, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x80, 0x03, + 0xFC, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, + 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x03, 0x80, + 0x01, 0xC0, 0x00, 0xF0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, + 0x80, 0x01, 0xE0, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, + 0x80, 0x00, 0xFF, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0xF0, + 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x07, + 0x00, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, + 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x78, 0x00, 0x38, + 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, + 0xC0, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x38, 0x03, 0xFC, 0x00, + 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x03, 0xBC, + 0x00, 0x39, 0xC0, 0x07, 0x1E, 0x00, 0x70, 0xE0, 0x0E, 0x0F, 0x00, 0xE0, + 0x70, 0x1E, 0x07, 0x81, 0xC0, 0x38, 0x3C, 0x03, 0xC3, 0x80, 0x1C, 0x78, + 0x01, 0xE7, 0x00, 0x0E, 0xF0, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x60, 0xF0, 0xF8, 0x78, 0x3C, 0x1E, 0x0E, 0x07, 0x00, 0x1E, 0x70, + 0x03, 0x0B, 0x80, 0x70, 0x3C, 0x07, 0x01, 0xE0, 0x70, 0x0E, 0x07, 0x00, + 0x70, 0x78, 0x03, 0x83, 0x80, 0x38, 0x3C, 0x01, 0xC1, 0xC0, 0x0E, 0x1E, + 0x00, 0xF0, 0xF0, 0x07, 0x0F, 0x00, 0x78, 0x78, 0x03, 0xC3, 0xC0, 0x3E, + 0x1E, 0x01, 0x70, 0xF0, 0x17, 0x0F, 0x81, 0x38, 0xBE, 0x11, 0xC8, 0xFF, + 0x0F, 0x83, 0xF0, 0x70, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x0F, + 0x80, 0x71, 0xFE, 0x03, 0x98, 0xF8, 0x3D, 0x03, 0xE1, 0xE8, 0x0F, 0x0E, + 0x80, 0x78, 0x78, 0x03, 0xC7, 0xC0, 0x1E, 0x3C, 0x00, 0xF1, 0xE0, 0x0F, + 0x1E, 0x00, 0x78, 0xF0, 0x03, 0xC7, 0x80, 0x3C, 0x38, 0x01, 0xE3, 0xC0, + 0x1E, 0x1E, 0x00, 0xE0, 0xE0, 0x0E, 0x07, 0x00, 0xF0, 0x78, 0x07, 0x03, + 0xC0, 0xE0, 0x0F, 0x0E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x38, + 0x60, 0x38, 0x1C, 0x1C, 0x0F, 0x0E, 0x03, 0x87, 0x80, 0x03, 0xC0, 0x00, + 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x00, 0xF0, + 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x02, 0x3E, 0x01, + 0x87, 0x80, 0xC1, 0xF0, 0x60, 0x3F, 0xF0, 0x03, 0xF0, 0x00, 0x00, 0x00, + 0x0E, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3C, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x78, 0x00, 0x1E, 0x78, 0x00, 0x71, + 0x70, 0x00, 0xC1, 0x70, 0x03, 0x80, 0xF0, 0x07, 0x80, 0xE0, 0x07, 0x01, + 0xE0, 0x0E, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x3C, 0x01, 0xC0, 0x3C, 0x01, + 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0x80, 0xF0, 0x07, + 0x80, 0xF0, 0x07, 0x80, 0xF0, 0x0F, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x17, + 0x08, 0xF0, 0x27, 0x10, 0x78, 0x47, 0x20, 0x7F, 0x87, 0xC0, 0x1E, 0x07, + 0x00, 0x00, 0x1F, 0x00, 0x1C, 0xF0, 0x1C, 0x1C, 0x0E, 0x07, 0x07, 0x01, + 0xC3, 0xC0, 0xF1, 0xE0, 0x38, 0x70, 0x1C, 0x3C, 0x0E, 0x1F, 0x0F, 0x07, + 0x8F, 0x01, 0xFE, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x01, 0x3C, 0x00, 0xC7, 0x80, 0x61, 0xF0, 0x60, 0x3F, 0xF0, + 0x03, 0xE0, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x03, 0x1C, 0x00, 0x00, + 0xC3, 0x80, 0x00, 0x38, 0x70, 0x00, 0x06, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x30, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x07, 0xFF, 0xC0, 0x00, + 0xFF, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, + 0xE0, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x1C, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1E, + 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, + 0x03, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x01, 0x80, 0x00, 0x38, + 0x60, 0x00, 0x07, 0x0C, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x0F, 0x80, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x07, 0x0E, 0x00, 0x70, 0x3E, 0x07, 0x01, 0xF0, + 0x70, 0x0E, 0x07, 0x80, 0x70, 0x3C, 0x03, 0x81, 0xC0, 0x1C, 0x0E, 0x01, + 0xE0, 0x70, 0x0E, 0x03, 0x80, 0xF0, 0x0E, 0x0F, 0x00, 0x30, 0xE0, 0x00, + 0xFE, 0x00, 0x0C, 0x00, 0x00, 0xC0, 0x00, 0x0E, 0x00, 0x00, 0x7E, 0x00, + 0x03, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x8F, 0xF0, 0x18, 0x0F, 0xC1, 0x80, + 0x1F, 0x18, 0x00, 0x78, 0xC0, 0x01, 0xC6, 0x00, 0x0E, 0x30, 0x00, 0x61, + 0xC0, 0x07, 0x06, 0x00, 0x70, 0x1C, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0x00, + 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, + 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, + 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x03, 0x80, 0x78, 0x7E, 0x03, 0x86, 0x70, + 0x3C, 0x43, 0x81, 0xE4, 0x1C, 0x0E, 0x40, 0xE0, 0x74, 0x0E, 0x07, 0xA0, + 0x70, 0x3E, 0x03, 0x81, 0xE0, 0x1C, 0x0F, 0x00, 0xE0, 0xF0, 0x0E, 0x07, + 0x80, 0x70, 0x38, 0x03, 0x81, 0xC0, 0x1C, 0x1E, 0x00, 0xC2, 0xF0, 0x0E, + 0x27, 0x00, 0x73, 0x38, 0x03, 0x93, 0xC0, 0x1F, 0x1E, 0x00, 0xE0, 0x03, + 0x81, 0xF0, 0x7C, 0x1F, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x71, 0xFC, 0x1F, 0x07, 0x81, 0xE0, 0x78, 0x1C, 0x07, 0x03, 0xC0, 0xF0, + 0x38, 0x0E, 0x07, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x84, 0xE2, 0x39, + 0x0F, 0x81, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, + 0xF0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0xC0, 0x00, 0xF0, 0x00, 0x1E, + 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x78, + 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x01, 0xE0, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x01, 0xE0, 0x00, 0x38, 0x00, 0x07, 0x00, + 0x00, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x00, + 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, 0x01, 0xC7, 0x00, 0x38, 0xC0, 0x07, + 0x30, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x7F, 0x00, 0x00, 0x78, + 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, + 0x78, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, + 0x00, 0x70, 0xFF, 0x83, 0x80, 0xF0, 0x3C, 0x06, 0x01, 0xE0, 0x60, 0x0E, + 0x06, 0x00, 0x70, 0xE0, 0x07, 0x8C, 0x00, 0x3C, 0xC0, 0x01, 0xCC, 0x00, + 0x0F, 0xF0, 0x00, 0xFF, 0x80, 0x07, 0x9E, 0x00, 0x38, 0xF0, 0x01, 0xC3, + 0x80, 0x1E, 0x1E, 0x00, 0xF0, 0x70, 0x07, 0x03, 0xC2, 0x78, 0x0E, 0x13, + 0xC0, 0x79, 0x1E, 0x01, 0xF0, 0x00, 0x07, 0x00, 0x00, 0xE1, 0xFC, 0x0F, + 0x80, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x70, 0x1E, 0x03, 0xC0, 0x78, 0x0E, 0x03, + 0xC0, 0x78, 0x0E, 0x01, 0xC0, 0x78, 0x0F, 0x01, 0xC0, 0x38, 0x4F, 0x11, + 0xE4, 0x39, 0x07, 0xC0, 0x70, 0x00, 0x07, 0x81, 0xC0, 0x78, 0xFE, 0x0F, + 0xC1, 0xF8, 0x3C, 0x33, 0x84, 0x70, 0x78, 0x87, 0x10, 0xE0, 0xF2, 0x0E, + 0x41, 0xC1, 0xC8, 0x39, 0x07, 0x87, 0xA0, 0x74, 0x0F, 0x0F, 0x40, 0xE8, + 0x1E, 0x1F, 0x01, 0xE0, 0x38, 0x3C, 0x07, 0xC0, 0xF0, 0xF8, 0x0F, 0x01, + 0xE1, 0xE0, 0x1E, 0x03, 0xC3, 0xC0, 0x38, 0x07, 0x07, 0x00, 0xF0, 0x1E, + 0x1E, 0x01, 0xE0, 0x3C, 0x3C, 0x03, 0x80, 0x79, 0x70, 0x07, 0x00, 0xE2, + 0xE0, 0x1E, 0x03, 0x8B, 0xC0, 0x3C, 0x07, 0x27, 0x80, 0x70, 0x0F, 0x8E, + 0x00, 0xE0, 0x1E, 0x00, 0x07, 0x81, 0xE3, 0xFC, 0x3F, 0x83, 0xC2, 0x3C, + 0x1E, 0x21, 0xE0, 0xF2, 0x0F, 0x07, 0x20, 0x70, 0x39, 0x07, 0x83, 0xD0, + 0x3C, 0x1F, 0x01, 0xE0, 0xE8, 0x0E, 0x0F, 0x80, 0xF0, 0x78, 0x07, 0x83, + 0xC0, 0x38, 0x1C, 0x01, 0xC1, 0xE0, 0x1E, 0x0F, 0x00, 0xF1, 0x70, 0x07, + 0x0B, 0x80, 0x38, 0xBC, 0x01, 0xC9, 0xE0, 0x0F, 0x8E, 0x00, 0x38, 0x00, + 0x00, 0x1F, 0x80, 0x07, 0x8F, 0x00, 0x70, 0x3C, 0x07, 0x00, 0xE0, 0x70, + 0x07, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE7, 0x80, 0x0F, 0x3C, 0x00, 0x7B, + 0xC0, 0x03, 0xDE, 0x00, 0x3D, 0xF0, 0x01, 0xEF, 0x80, 0x0F, 0x78, 0x00, + 0xF3, 0xC0, 0x07, 0x9E, 0x00, 0x78, 0xF0, 0x03, 0x87, 0x80, 0x38, 0x1C, + 0x03, 0x80, 0xF0, 0x38, 0x03, 0xC3, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x3C, + 0x3F, 0x00, 0x7F, 0x8F, 0xF0, 0x01, 0xF7, 0x3F, 0x00, 0x1D, 0x83, 0xF0, + 0x07, 0xA0, 0x3E, 0x00, 0xF8, 0x07, 0xC0, 0x1E, 0x00, 0xF8, 0x03, 0xC0, + 0x1F, 0x00, 0xF0, 0x03, 0xE0, 0x1E, 0x00, 0x7C, 0x03, 0xC0, 0x1F, 0x00, + 0x70, 0x03, 0xE0, 0x1E, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0x00, 0x70, 0x03, + 0xC0, 0x0E, 0x00, 0xF8, 0x03, 0xC0, 0x1E, 0x00, 0x78, 0x07, 0x80, 0x0F, + 0x01, 0xE0, 0x01, 0xE0, 0x70, 0x00, 0x7C, 0x3C, 0x00, 0x0F, 0x7C, 0x00, + 0x01, 0xC0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, + 0x7E, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x8D, + 0xC0, 0x38, 0x2E, 0x07, 0x80, 0xF0, 0x78, 0x07, 0x03, 0x80, 0x38, 0x38, + 0x03, 0xC3, 0xC0, 0x1E, 0x3C, 0x00, 0xE1, 0xE0, 0x07, 0x1E, 0x00, 0x78, + 0xF0, 0x03, 0x87, 0x80, 0x3C, 0x78, 0x01, 0xE3, 0xC0, 0x1F, 0x1E, 0x01, + 0x70, 0xF0, 0x17, 0x87, 0x80, 0xBC, 0x3C, 0x09, 0xC0, 0xF1, 0x8E, 0x07, + 0xF8, 0xF0, 0x1F, 0x07, 0x80, 0x00, 0x38, 0x00, 0x03, 0xC0, 0x00, 0x1E, + 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, + 0x3E, 0x00, 0x0F, 0xFE, 0x00, 0x07, 0x87, 0x3F, 0x87, 0xC3, 0xC7, 0xE1, + 0xE6, 0xF0, 0xF6, 0x00, 0x72, 0x00, 0x3A, 0x00, 0x1D, 0x00, 0x1F, 0x00, + 0x0E, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, + 0x00, 0x00, 0x01, 0xF8, 0x81, 0x87, 0xC1, 0x80, 0xE1, 0xC0, 0x60, 0xE0, + 0x10, 0x70, 0x08, 0x3C, 0x04, 0x1F, 0x00, 0x07, 0xC0, 0x03, 0xE0, 0x00, + 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x00, 0x03, 0xC1, 0x01, 0xE0, 0x80, 0x70, + 0x40, 0x38, 0x30, 0x1C, 0x38, 0x0C, 0x1C, 0x0E, 0x0F, 0x0E, 0x04, 0x7C, + 0x00, 0x00, 0xC0, 0x18, 0x03, 0x80, 0x78, 0x1F, 0x03, 0xFF, 0x7F, 0xF0, + 0xF0, 0x0E, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x1C, 0x01, 0xC0, 0x3C, 0x03, + 0xC0, 0x38, 0x03, 0x80, 0x78, 0x07, 0x80, 0x70, 0x8F, 0x10, 0xF1, 0x0F, + 0x20, 0xFC, 0x07, 0x80, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x7F, 0x00, 0xE0, + 0xF0, 0x1E, 0x0E, 0x01, 0xE1, 0xE0, 0x3C, 0x1E, 0x03, 0xC1, 0xE0, 0x3C, + 0x1C, 0x07, 0xC3, 0xC0, 0x78, 0x3C, 0x0F, 0x83, 0xC0, 0xB8, 0x38, 0x1F, + 0x87, 0x83, 0x70, 0x78, 0x27, 0x07, 0x86, 0x70, 0x70, 0xC7, 0x1F, 0x08, + 0xE1, 0xE1, 0x0E, 0x2E, 0x60, 0xE4, 0xFC, 0x0F, 0x87, 0x00, 0x70, 0x1C, + 0x03, 0xBF, 0x00, 0xF1, 0xE0, 0x3C, 0x78, 0x07, 0x1E, 0x00, 0xC3, 0x80, + 0x30, 0xE0, 0x08, 0x38, 0x06, 0x0E, 0x01, 0x03, 0x80, 0xC0, 0xF0, 0x20, + 0x3C, 0x10, 0x07, 0x04, 0x01, 0xC2, 0x00, 0x71, 0x00, 0x1C, 0xC0, 0x07, + 0x60, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x01, 0x00, + 0x00, 0x0C, 0x00, 0x40, 0x3B, 0xF8, 0x01, 0x00, 0xF1, 0xE0, 0x0C, 0x03, + 0xC3, 0x80, 0x78, 0x07, 0x0E, 0x01, 0xE0, 0x0C, 0x38, 0x0F, 0x80, 0x20, + 0xE0, 0x6E, 0x00, 0x83, 0x81, 0x38, 0x04, 0x0F, 0x0C, 0xE0, 0x10, 0x1C, + 0x23, 0x80, 0x80, 0x71, 0x8E, 0x06, 0x01, 0xCC, 0x38, 0x10, 0x07, 0x20, + 0xE0, 0x80, 0x1D, 0x83, 0x86, 0x00, 0x7C, 0x07, 0x30, 0x01, 0xF0, 0x1C, + 0x80, 0x07, 0x80, 0x74, 0x00, 0x1E, 0x01, 0xF0, 0x00, 0x70, 0x07, 0x80, + 0x01, 0xC0, 0x1C, 0x00, 0x06, 0x00, 0x60, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x00, 0xE0, 0x38, 0x1F, 0x81, 0xF0, 0x8F, 0x09, 0x80, 0x3C, 0x40, 0x00, + 0x72, 0x00, 0x01, 0xD0, 0x00, 0x07, 0xC0, 0x00, 0x1E, 0x00, 0x00, 0x38, + 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x7C, 0x00, + 0x01, 0x70, 0x00, 0x09, 0xC0, 0x00, 0x67, 0x00, 0x01, 0x1E, 0x10, 0x08, + 0x38, 0x40, 0x40, 0xE2, 0x39, 0x03, 0xD0, 0xF8, 0x0F, 0x83, 0xC0, 0x1C, + 0x00, 0x07, 0x80, 0x33, 0xFC, 0x03, 0xC1, 0xE0, 0x1E, 0x07, 0x80, 0x70, + 0x3C, 0x01, 0x80, 0xE0, 0x0C, 0x07, 0x80, 0x40, 0x3C, 0x02, 0x00, 0xE0, + 0x20, 0x07, 0x81, 0x00, 0x3C, 0x18, 0x01, 0xE0, 0x80, 0x07, 0x0C, 0x00, + 0x38, 0x40, 0x01, 0xE4, 0x00, 0x0F, 0x60, 0x00, 0x3A, 0x00, 0x01, 0xF0, + 0x00, 0x0F, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x18, 0x00, 0x00, + 0x80, 0x00, 0x0C, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x0E, 0x40, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x0F, + 0xFF, 0x87, 0xFF, 0x82, 0x00, 0x83, 0x00, 0xC1, 0x00, 0xC0, 0x00, 0xC0, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, + 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x1F, 0xC0, 0x1F, 0xF0, 0xE8, 0xFC, 0x70, 0x1E, 0x38, 0x03, 0x88, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x0F, + 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x70, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x07, 0x80, 0x07, 0x80, 0x03, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x00, 0x80, + 0x00, 0x60, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x07, + 0x80, 0x03, 0x80, 0x01, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x70, 0x00, + 0x38, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x01, 0x80, + 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x18, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x07, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, + 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3C, + 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1C, + 0x00, 0x7E, 0x00, 0x78, 0x00, 0xF0, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xE0, + 0x01, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x80, + 0x07, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0xF8, 0x00, 0x1F, 0x80, 0x00, 0xFF, 0x80, 0xC7, 0xFF, 0x87, 0xBC, 0x3F, + 0xFE, 0x60, 0x3F, 0xF0, 0x00, 0x1F, 0x00 }; + +const GFXglyph FreeSerifItalic24pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 12, 0, 1 }, // 0x20 ' ' + { 0, 12, 32, 16, 2, -30 }, // 0x21 '!' + { 48, 14, 12, 16, 6, -31 }, // 0x22 '"' + { 69, 25, 31, 23, 0, -30 }, // 0x23 '#' + { 166, 21, 38, 24, 2, -33 }, // 0x24 '$' + { 266, 33, 32, 39, 4, -30 }, // 0x25 '%' + { 398, 30, 33, 37, 4, -31 }, // 0x26 '&' + { 522, 5, 12, 9, 6, -31 }, // 0x27 ''' + { 530, 13, 39, 16, 2, -30 }, // 0x28 '(' + { 594, 13, 39, 16, 0, -30 }, // 0x29 ')' + { 658, 16, 20, 23, 7, -31 }, // 0x2A '*' + { 698, 23, 23, 32, 4, -22 }, // 0x2B '+' + { 765, 7, 11, 12, -1, -4 }, // 0x2C ',' + { 775, 11, 3, 16, 2, -11 }, // 0x2D '-' + { 780, 5, 5, 12, 1, -3 }, // 0x2E '.' + { 784, 21, 33, 14, 0, -31 }, // 0x2F '/' + { 871, 21, 31, 23, 2, -30 }, // 0x30 '0' + { 953, 17, 32, 23, 2, -31 }, // 0x31 '1' + { 1021, 21, 31, 24, 0, -30 }, // 0x32 '2' + { 1103, 22, 32, 23, 0, -31 }, // 0x33 '3' + { 1191, 22, 32, 23, 0, -31 }, // 0x34 '4' + { 1279, 22, 32, 24, 0, -31 }, // 0x35 '5' + { 1367, 23, 32, 23, 1, -31 }, // 0x36 '6' + { 1459, 21, 32, 23, 4, -31 }, // 0x37 '7' + { 1543, 22, 32, 23, 1, -31 }, // 0x38 '8' + { 1631, 22, 33, 23, 1, -31 }, // 0x39 '9' + { 1722, 9, 22, 12, 2, -20 }, // 0x3A ':' + { 1747, 11, 27, 12, 1, -20 }, // 0x3B ';' + { 1785, 23, 25, 27, 3, -24 }, // 0x3C '<' + { 1857, 24, 12, 31, 4, -17 }, // 0x3D '=' + { 1893, 24, 25, 27, 3, -24 }, // 0x3E '>' + { 1968, 16, 33, 21, 6, -31 }, // 0x3F '?' + { 2034, 33, 33, 37, 3, -31 }, // 0x40 '@' + { 2171, 29, 31, 31, 0, -30 }, // 0x41 'A' + { 2284, 28, 31, 28, 0, -30 }, // 0x42 'B' + { 2393, 30, 33, 29, 2, -31 }, // 0x43 'C' + { 2517, 33, 31, 33, 0, -30 }, // 0x44 'D' + { 2645, 29, 31, 27, 0, -30 }, // 0x45 'E' + { 2758, 29, 31, 27, 0, -30 }, // 0x46 'F' + { 2871, 31, 33, 32, 2, -31 }, // 0x47 'G' + { 2999, 36, 31, 33, 0, -30 }, // 0x48 'H' + { 3139, 18, 31, 15, 0, -30 }, // 0x49 'I' + { 3209, 23, 32, 20, 0, -30 }, // 0x4A 'J' + { 3301, 33, 31, 30, 0, -30 }, // 0x4B 'K' + { 3429, 27, 31, 27, 0, -30 }, // 0x4C 'L' + { 3534, 42, 31, 39, 0, -30 }, // 0x4D 'M' + { 3697, 35, 32, 32, 0, -30 }, // 0x4E 'N' + { 3837, 30, 33, 31, 2, -31 }, // 0x4F 'O' + { 3961, 29, 31, 27, 0, -30 }, // 0x50 'P' + { 4074, 30, 41, 31, 2, -31 }, // 0x51 'Q' + { 4228, 28, 31, 29, 0, -30 }, // 0x52 'R' + { 4337, 23, 33, 21, 0, -31 }, // 0x53 'S' + { 4432, 27, 31, 28, 4, -30 }, // 0x54 'T' + { 4537, 31, 32, 33, 5, -30 }, // 0x55 'U' + { 4661, 29, 32, 31, 6, -30 }, // 0x56 'V' + { 4777, 39, 32, 42, 6, -30 }, // 0x57 'W' + { 4933, 32, 31, 31, 0, -30 }, // 0x58 'X' + { 5057, 26, 31, 28, 5, -30 }, // 0x59 'Y' + { 5158, 29, 31, 26, 0, -30 }, // 0x5A 'Z' + { 5271, 17, 39, 18, 1, -31 }, // 0x5B '[' + { 5354, 17, 33, 23, 5, -31 }, // 0x5C '\' + { 5425, 17, 39, 18, 1, -31 }, // 0x5D ']' + { 5508, 20, 17, 20, 0, -31 }, // 0x5E '^' + { 5551, 24, 2, 23, 0, 5 }, // 0x5F '_' + { 5557, 8, 8, 12, 6, -31 }, // 0x60 '`' + { 5565, 21, 21, 23, 1, -20 }, // 0x61 'a' + { 5621, 21, 33, 22, 1, -31 }, // 0x62 'b' + { 5708, 18, 22, 19, 1, -20 }, // 0x63 'c' + { 5758, 24, 33, 23, 1, -31 }, // 0x64 'd' + { 5857, 18, 22, 19, 1, -20 }, // 0x65 'e' + { 5907, 27, 42, 20, -4, -31 }, // 0x66 'f' + { 6049, 21, 31, 21, -1, -20 }, // 0x67 'g' + { 6131, 21, 32, 23, 1, -31 }, // 0x68 'h' + { 6215, 10, 32, 12, 2, -30 }, // 0x69 'i' + { 6255, 19, 41, 13, -3, -30 }, // 0x6A 'j' + { 6353, 21, 33, 21, 1, -31 }, // 0x6B 'k' + { 6440, 11, 33, 12, 2, -31 }, // 0x6C 'l' + { 6486, 31, 21, 34, 1, -20 }, // 0x6D 'm' + { 6568, 21, 21, 23, 1, -20 }, // 0x6E 'n' + { 6624, 21, 22, 22, 1, -20 }, // 0x6F 'o' + { 6682, 27, 31, 22, -4, -20 }, // 0x70 'p' + { 6787, 21, 31, 23, 1, -20 }, // 0x71 'q' + { 6869, 17, 21, 17, 1, -20 }, // 0x72 'r' + { 6914, 17, 22, 16, 0, -20 }, // 0x73 's' + { 6961, 12, 26, 11, 1, -24 }, // 0x74 't' + { 7000, 20, 22, 23, 1, -20 }, // 0x75 'u' + { 7055, 18, 22, 21, 3, -20 }, // 0x76 'v' + { 7105, 30, 22, 32, 2, -20 }, // 0x77 'w' + { 7188, 22, 22, 20, -1, -20 }, // 0x78 'x' + { 7249, 21, 31, 22, 1, -20 }, // 0x79 'y' + { 7331, 17, 24, 18, 0, -19 }, // 0x7A 'z' + { 7382, 17, 40, 19, 2, -31 }, // 0x7B '{' + { 7467, 3, 33, 13, 5, -31 }, // 0x7C '|' + { 7480, 16, 41, 19, 0, -32 }, // 0x7D '}' + { 7562, 22, 6, 25, 2, -14 } }; // 0x7E '~' + +const GFXfont FreeSerifItalic24pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic24pt7bBitmaps, + (GFXglyph *)FreeSerifItalic24pt7bGlyphs, + 0x20, 0x7E, 56 }; + +// Approx. 8251 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic9pt7b.h b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic9pt7b.h new file mode 100644 index 0000000..34e6b8d --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/FreeSerifItalic9pt7b.h @@ -0,0 +1,202 @@ +const uint8_t FreeSerifItalic9pt7bBitmaps[] PROGMEM = { + 0x11, 0x12, 0x22, 0x24, 0x40, 0x0C, 0xDE, 0xE5, 0x40, 0x04, 0x82, 0x20, + 0x98, 0x24, 0x7F, 0xC4, 0x82, 0x23, 0xFC, 0x24, 0x11, 0x04, 0x83, 0x20, + 0x1C, 0x1B, 0x99, 0x4D, 0x26, 0x81, 0xC0, 0x70, 0x1C, 0x13, 0x49, 0xA4, + 0xDA, 0xC7, 0xC1, 0x00, 0x80, 0x1C, 0x61, 0xCF, 0x0E, 0x28, 0x30, 0xA0, + 0xC5, 0x03, 0x34, 0xE7, 0xAE, 0x40, 0xB1, 0x05, 0x84, 0x26, 0x20, 0x99, + 0x84, 0x3C, 0x03, 0x80, 0x6C, 0x06, 0xC0, 0x78, 0x06, 0x01, 0xEF, 0x66, + 0x24, 0x24, 0xC3, 0x8C, 0x10, 0xE3, 0x87, 0xCE, 0xFA, 0x08, 0x21, 0x08, + 0x61, 0x8C, 0x30, 0xC3, 0x0C, 0x30, 0x41, 0x02, 0x00, 0x10, 0x40, 0x82, + 0x0C, 0x30, 0xC3, 0x0C, 0x61, 0x84, 0x21, 0x08, 0x00, 0x30, 0xCA, 0x5E, + 0x6A, 0x93, 0x08, 0x08, 0x04, 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, + 0x08, 0x00, 0x56, 0xF0, 0xF0, 0x03, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, + 0x30, 0x20, 0x60, 0x40, 0xC0, 0x0E, 0x0C, 0x8C, 0x6C, 0x36, 0x1F, 0x0F, + 0x07, 0x87, 0xC3, 0x61, 0xB1, 0x88, 0x83, 0x80, 0x04, 0x70, 0xC3, 0x08, + 0x21, 0x86, 0x10, 0x43, 0x08, 0xF8, 0x1C, 0x67, 0x83, 0x03, 0x02, 0x06, + 0x0C, 0x08, 0x10, 0x20, 0x42, 0xFC, 0x0F, 0x08, 0xC0, 0x60, 0xC1, 0xE0, + 0x38, 0x0C, 0x06, 0x03, 0x01, 0x01, 0x1F, 0x00, 0x01, 0x01, 0x81, 0x41, + 0x61, 0x21, 0x11, 0x18, 0x88, 0xFF, 0x02, 0x03, 0x01, 0x00, 0x0F, 0x84, + 0x04, 0x03, 0x80, 0x60, 0x18, 0x0C, 0x06, 0x03, 0x03, 0x03, 0x1E, 0x00, + 0x01, 0x83, 0x87, 0x07, 0x03, 0x03, 0x73, 0xCD, 0x86, 0xC3, 0x61, 0xB1, + 0x88, 0xC3, 0xC0, 0x7F, 0x40, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20, + 0x10, 0x10, 0x18, 0x08, 0x00, 0x1E, 0x19, 0xCC, 0x66, 0x33, 0xB0, 0xE0, + 0x50, 0xCC, 0xC3, 0x61, 0xB0, 0xCC, 0xC3, 0xC0, 0x0E, 0x19, 0x8C, 0x6C, + 0x36, 0x1B, 0x0D, 0x86, 0xE6, 0x3F, 0x03, 0x03, 0x06, 0x0C, 0x00, 0x33, + 0x00, 0x00, 0xCC, 0x33, 0x00, 0x00, 0x44, 0x48, 0x01, 0x83, 0x86, 0x1C, + 0x0C, 0x03, 0x80, 0x30, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x0F, + 0xF8, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0x70, 0xC0, 0x80, 0x00, + 0x3C, 0x8C, 0x18, 0x30, 0xC3, 0x0C, 0x20, 0x40, 0x80, 0x06, 0x00, 0x0F, + 0xC0, 0xC3, 0x0C, 0x04, 0xC7, 0xBC, 0x64, 0xE2, 0x27, 0x31, 0x39, 0x91, + 0xCC, 0x93, 0x3B, 0x0E, 0x00, 0x1F, 0x80, 0x01, 0x00, 0x60, 0x14, 0x04, + 0xC0, 0x98, 0x23, 0x07, 0xE1, 0x04, 0x20, 0x88, 0x1B, 0x8F, 0x80, 0x3F, + 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3E, 0x04, 0x61, 0x86, 0x30, 0xC4, + 0x19, 0x86, 0x7F, 0x80, 0x07, 0x91, 0x86, 0x30, 0x26, 0x02, 0x60, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x61, 0x83, 0xE0, 0x3F, 0xC0, + 0x63, 0x82, 0x0C, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0x40, 0x66, 0x07, 0x30, + 0x31, 0x03, 0x18, 0x71, 0xFE, 0x00, 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, + 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, 0x30, 0x02, 0x04, 0x60, 0x8F, 0xF8, + 0x3F, 0xF0, 0xC2, 0x08, 0x21, 0x80, 0x19, 0x81, 0xF8, 0x11, 0x03, 0x10, + 0x30, 0x02, 0x00, 0x60, 0x0F, 0x80, 0x07, 0x91, 0x87, 0x30, 0x26, 0x02, + 0x60, 0x0C, 0x00, 0xC1, 0xFC, 0x0C, 0xC0, 0xCC, 0x0C, 0x60, 0x83, 0xF0, + 0x3E, 0x3C, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0x81, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x3C, 0x78, 0x1E, 0x18, 0x20, + 0xC1, 0x83, 0x04, 0x18, 0x30, 0x41, 0x87, 0x80, 0x0F, 0x81, 0x80, 0x80, + 0xC0, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x04, 0x36, 0x1E, 0x00, 0x3E, 0x78, + 0x61, 0x82, 0x10, 0x31, 0x01, 0xB0, 0x0E, 0x00, 0x58, 0x06, 0x60, 0x33, + 0x01, 0x0C, 0x18, 0x61, 0xE7, 0xC0, 0x3E, 0x01, 0x80, 0x20, 0x0C, 0x01, + 0x80, 0x30, 0x04, 0x01, 0x80, 0x30, 0x04, 0x0D, 0x83, 0x7F, 0xE0, 0x1C, + 0x07, 0x0C, 0x0E, 0x0C, 0x14, 0x14, 0x1C, 0x14, 0x2C, 0x16, 0x4C, 0x26, + 0x48, 0x26, 0x98, 0x27, 0x18, 0x27, 0x10, 0x42, 0x30, 0xF4, 0x7C, 0x38, + 0x78, 0x60, 0x83, 0x04, 0x2C, 0x41, 0x22, 0x09, 0x10, 0x4D, 0x84, 0x28, + 0x21, 0x41, 0x06, 0x10, 0x21, 0xE1, 0x00, 0x07, 0x83, 0x18, 0xC1, 0xB0, + 0x36, 0x07, 0xC0, 0xF0, 0x3E, 0x06, 0xC0, 0xD8, 0x31, 0x8C, 0x1E, 0x00, + 0x3F, 0xC1, 0x9C, 0x21, 0x8C, 0x31, 0x86, 0x31, 0x87, 0xE1, 0x80, 0x30, + 0x04, 0x01, 0x80, 0x78, 0x00, 0x07, 0x83, 0x18, 0xC1, 0x98, 0x36, 0x07, + 0xC0, 0xF0, 0x1E, 0x06, 0xC0, 0xD8, 0x31, 0x04, 0x13, 0x01, 0x80, 0x70, + 0xB7, 0xE0, 0x3F, 0xC1, 0x8C, 0x21, 0x8C, 0x31, 0x8C, 0x3F, 0x04, 0xC1, + 0x98, 0x31, 0x84, 0x31, 0x86, 0x78, 0x70, 0x1E, 0x4C, 0x63, 0x08, 0xC0, + 0x38, 0x07, 0x00, 0x60, 0x0C, 0x43, 0x10, 0xC6, 0x62, 0x70, 0x7F, 0xE9, + 0x8E, 0x31, 0x04, 0x01, 0x80, 0x30, 0x06, 0x00, 0x80, 0x30, 0x06, 0x00, + 0x80, 0x7E, 0x00, 0x7C, 0xF3, 0x02, 0x30, 0x46, 0x04, 0x60, 0x46, 0x04, + 0x40, 0x8C, 0x08, 0xC0, 0x8C, 0x10, 0xE3, 0x03, 0xC0, 0xF8, 0xEC, 0x0C, + 0x81, 0x18, 0x43, 0x08, 0x62, 0x0C, 0x81, 0x90, 0x14, 0x03, 0x00, 0x60, + 0x08, 0x00, 0xFB, 0xCE, 0x43, 0x0C, 0x86, 0x11, 0x8C, 0x43, 0x38, 0x86, + 0xB2, 0x0D, 0x24, 0x1C, 0x50, 0x38, 0xA0, 0x21, 0x80, 0x42, 0x01, 0x04, + 0x00, 0x3E, 0x71, 0x82, 0x0C, 0x40, 0xC8, 0x07, 0x00, 0x60, 0x06, 0x00, + 0xB0, 0x13, 0x02, 0x18, 0x61, 0x8F, 0x3E, 0xF9, 0xC8, 0x23, 0x10, 0xC8, + 0x34, 0x05, 0x01, 0x80, 0x40, 0x30, 0x0C, 0x03, 0x03, 0xE0, 0x3F, 0xE4, + 0x19, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x40, 0x18, 0x06, 0x05, + 0x81, 0x7F, 0xE0, 0x0E, 0x10, 0x20, 0x81, 0x02, 0x04, 0x10, 0x20, 0x40, + 0x82, 0x04, 0x08, 0x1C, 0x00, 0x81, 0x04, 0x18, 0x20, 0xC1, 0x04, 0x08, + 0x20, 0x41, 0x38, 0x20, 0x82, 0x08, 0x41, 0x04, 0x10, 0xC2, 0x08, 0x20, + 0x8C, 0x00, 0x18, 0x18, 0x2C, 0x24, 0x46, 0x42, 0x83, 0xFF, 0x80, 0xD8, + 0x80, 0x1F, 0x98, 0x98, 0x4C, 0x2C, 0x36, 0x33, 0x3A, 0xEE, 0x38, 0x08, + 0x04, 0x02, 0x03, 0x71, 0xCC, 0xC6, 0xC3, 0x63, 0x21, 0x93, 0x8F, 0x00, + 0x1F, 0x33, 0x60, 0xC0, 0xC0, 0xC0, 0xC4, 0x78, 0x01, 0x80, 0x40, 0x60, + 0x20, 0xF1, 0x89, 0x8C, 0xC4, 0xC2, 0x63, 0x33, 0xAE, 0xE0, 0x0E, 0x65, + 0x8B, 0x2F, 0x98, 0x31, 0x3C, 0x01, 0xE0, 0x40, 0x08, 0x02, 0x00, 0x40, + 0x3E, 0x03, 0x00, 0x40, 0x08, 0x01, 0x00, 0x60, 0x0C, 0x01, 0x00, 0x20, + 0x04, 0x01, 0x00, 0xC0, 0x00, 0x1E, 0x19, 0xD8, 0xCC, 0xE1, 0xC3, 0x01, + 0xE0, 0xBC, 0x82, 0x41, 0x31, 0x0F, 0x00, 0x38, 0x08, 0x04, 0x02, 0x03, + 0x39, 0x6C, 0xC6, 0x46, 0x63, 0x21, 0x11, 0xB8, 0xE0, 0x30, 0x00, 0xE2, + 0x44, 0xC8, 0xCE, 0x06, 0x00, 0x00, 0x00, 0xC0, 0x83, 0x04, 0x08, 0x10, + 0x60, 0x81, 0x02, 0x04, 0x70, 0x38, 0x10, 0x10, 0x10, 0x37, 0x22, 0x24, + 0x38, 0x78, 0x48, 0x4D, 0xC6, 0x73, 0x32, 0x26, 0x64, 0x4C, 0xDE, 0x77, + 0x39, 0x5E, 0xCC, 0xCC, 0xCE, 0x66, 0x62, 0x22, 0x11, 0x11, 0xB9, 0x8E, + 0x77, 0x3B, 0x33, 0x62, 0x62, 0x42, 0x4D, 0xCE, 0x0F, 0x18, 0xD8, 0x7C, + 0x3C, 0x3E, 0x1B, 0x18, 0xF0, 0x3B, 0x87, 0x31, 0x8C, 0x43, 0x31, 0x88, + 0x62, 0x30, 0xF0, 0x60, 0x10, 0x04, 0x03, 0x80, 0x0F, 0x18, 0x98, 0x4C, + 0x2C, 0x26, 0x33, 0x38, 0xEC, 0x04, 0x02, 0x03, 0x03, 0xC0, 0x76, 0x50, + 0xC1, 0x06, 0x08, 0x10, 0x60, 0x1A, 0x6C, 0xC8, 0xC0, 0xD1, 0xB3, 0x5C, + 0x23, 0xC8, 0xC4, 0x21, 0x18, 0xE0, 0xC3, 0x42, 0x42, 0xC6, 0x86, 0x8C, + 0x9D, 0xEE, 0x62, 0xC4, 0x89, 0xA3, 0x47, 0x0C, 0x10, 0xE2, 0x2C, 0x44, + 0xD8, 0x9D, 0x23, 0xA4, 0x65, 0x0C, 0xC1, 0x10, 0x19, 0x95, 0x43, 0x01, + 0x80, 0xC0, 0xA0, 0x91, 0x8E, 0x70, 0x88, 0x46, 0x23, 0x20, 0x90, 0x50, + 0x28, 0x18, 0x08, 0x08, 0x08, 0x18, 0x00, 0x3F, 0x42, 0x04, 0x08, 0x10, + 0x20, 0x40, 0x72, 0x0E, 0x08, 0x61, 0x04, 0x30, 0x86, 0x08, 0x61, 0x04, + 0x30, 0xC3, 0x8F, 0x00, 0xFF, 0xF0, 0x1E, 0x0C, 0x10, 0x20, 0xC1, 0x82, + 0x04, 0x1C, 0x30, 0x40, 0x83, 0x04, 0x08, 0x20, 0x60, 0x99, 0x8E }; + +const GFXglyph FreeSerifItalic9pt7bGlyphs[] PROGMEM = { + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 4, 12, 6, 1, -11 }, // 0x21 '!' + { 6, 5, 4, 6, 3, -11 }, // 0x22 '"' + { 9, 10, 12, 9, 0, -11 }, // 0x23 '#' + { 24, 9, 15, 9, 1, -12 }, // 0x24 '$' + { 41, 14, 12, 15, 1, -11 }, // 0x25 '%' + { 62, 12, 12, 14, 1, -11 }, // 0x26 '&' + { 80, 2, 4, 4, 3, -11 }, // 0x27 ''' + { 81, 6, 15, 6, 1, -11 }, // 0x28 '(' + { 93, 6, 15, 6, 0, -11 }, // 0x29 ')' + { 105, 6, 8, 9, 3, -11 }, // 0x2A '*' + { 111, 9, 9, 12, 1, -8 }, // 0x2B '+' + { 122, 2, 4, 5, 0, -1 }, // 0x2C ',' + { 123, 4, 1, 6, 1, -3 }, // 0x2D '-' + { 124, 2, 2, 5, 0, -1 }, // 0x2E '.' + { 125, 8, 12, 5, 0, -11 }, // 0x2F '/' + { 137, 9, 13, 9, 1, -12 }, // 0x30 '0' + { 152, 6, 13, 9, 1, -12 }, // 0x31 '1' + { 162, 8, 12, 9, 1, -11 }, // 0x32 '2' + { 174, 9, 12, 9, 0, -11 }, // 0x33 '3' + { 188, 9, 12, 9, 0, -11 }, // 0x34 '4' + { 202, 9, 12, 9, 0, -11 }, // 0x35 '5' + { 216, 9, 13, 9, 1, -12 }, // 0x36 '6' + { 231, 9, 12, 9, 1, -11 }, // 0x37 '7' + { 245, 9, 13, 9, 1, -12 }, // 0x38 '8' + { 260, 9, 13, 9, 0, -12 }, // 0x39 '9' + { 275, 4, 8, 4, 1, -7 }, // 0x3A ':' + { 279, 4, 10, 4, 1, -7 }, // 0x3B ';' + { 284, 9, 9, 10, 1, -8 }, // 0x3C '<' + { 295, 9, 5, 12, 2, -6 }, // 0x3D '=' + { 301, 9, 9, 10, 1, -8 }, // 0x3E '>' + { 312, 7, 12, 8, 2, -11 }, // 0x3F '?' + { 323, 13, 12, 14, 1, -11 }, // 0x40 '@' + { 343, 11, 11, 12, 0, -10 }, // 0x41 'A' + { 359, 11, 12, 11, 0, -11 }, // 0x42 'B' + { 376, 12, 12, 11, 1, -11 }, // 0x43 'C' + { 394, 13, 12, 13, 0, -11 }, // 0x44 'D' + { 414, 12, 12, 10, 0, -11 }, // 0x45 'E' + { 432, 12, 12, 10, 0, -11 }, // 0x46 'F' + { 450, 12, 12, 12, 1, -11 }, // 0x47 'G' + { 468, 14, 12, 13, 0, -11 }, // 0x48 'H' + { 489, 7, 12, 6, 0, -11 }, // 0x49 'I' + { 500, 9, 12, 8, 0, -11 }, // 0x4A 'J' + { 514, 13, 12, 12, 0, -11 }, // 0x4B 'K' + { 534, 11, 12, 10, 0, -11 }, // 0x4C 'L' + { 551, 16, 12, 15, 0, -11 }, // 0x4D 'M' + { 575, 13, 12, 12, 0, -11 }, // 0x4E 'N' + { 595, 11, 12, 12, 1, -11 }, // 0x4F 'O' + { 612, 11, 12, 10, 0, -11 }, // 0x50 'P' + { 629, 11, 15, 12, 1, -11 }, // 0x51 'Q' + { 650, 11, 12, 11, 0, -11 }, // 0x52 'R' + { 667, 10, 12, 8, 0, -11 }, // 0x53 'S' + { 682, 11, 12, 11, 2, -11 }, // 0x54 'T' + { 699, 12, 12, 13, 2, -11 }, // 0x55 'U' + { 717, 11, 12, 12, 2, -11 }, // 0x56 'V' + { 734, 15, 12, 16, 2, -11 }, // 0x57 'W' + { 757, 12, 12, 12, 0, -11 }, // 0x58 'X' + { 775, 10, 12, 11, 2, -11 }, // 0x59 'Y' + { 790, 11, 12, 10, 0, -11 }, // 0x5A 'Z' + { 807, 7, 15, 7, 0, -11 }, // 0x5B '[' + { 821, 6, 12, 9, 2, -11 }, // 0x5C '\' + { 830, 6, 15, 7, 1, -11 }, // 0x5D ']' + { 842, 8, 7, 8, 0, -11 }, // 0x5E '^' + { 849, 9, 1, 9, 0, 2 }, // 0x5F '_' + { 851, 3, 3, 5, 2, -11 }, // 0x60 '`' + { 853, 9, 8, 9, 0, -7 }, // 0x61 'a' + { 862, 9, 12, 9, 0, -11 }, // 0x62 'b' + { 876, 8, 8, 7, 0, -7 }, // 0x63 'c' + { 884, 9, 12, 9, 0, -11 }, // 0x64 'd' + { 898, 7, 8, 7, 0, -7 }, // 0x65 'e' + { 905, 11, 17, 8, -1, -12 }, // 0x66 'f' + { 929, 9, 12, 8, 0, -7 }, // 0x67 'g' + { 943, 9, 12, 9, 0, -11 }, // 0x68 'h' + { 957, 4, 12, 4, 1, -11 }, // 0x69 'i' + { 963, 7, 16, 5, -1, -11 }, // 0x6A 'j' + { 977, 8, 12, 8, 0, -11 }, // 0x6B 'k' + { 989, 4, 12, 5, 1, -11 }, // 0x6C 'l' + { 995, 13, 8, 13, 0, -7 }, // 0x6D 'm' + { 1008, 8, 8, 9, 0, -7 }, // 0x6E 'n' + { 1016, 9, 8, 9, 0, -7 }, // 0x6F 'o' + { 1025, 10, 12, 8, -1, -7 }, // 0x70 'p' + { 1040, 9, 12, 9, 0, -7 }, // 0x71 'q' + { 1054, 7, 8, 7, 0, -7 }, // 0x72 'r' + { 1061, 7, 8, 6, 0, -7 }, // 0x73 's' + { 1068, 5, 9, 4, 0, -8 }, // 0x74 't' + { 1074, 8, 8, 9, 1, -7 }, // 0x75 'u' + { 1082, 7, 8, 8, 1, -7 }, // 0x76 'v' + { 1089, 11, 8, 12, 1, -7 }, // 0x77 'w' + { 1100, 9, 8, 8, -1, -7 }, // 0x78 'x' + { 1109, 9, 12, 9, 0, -7 }, // 0x79 'y' + { 1123, 8, 9, 7, 0, -7 }, // 0x7A 'z' + { 1132, 6, 15, 7, 1, -11 }, // 0x7B '{' + { 1144, 1, 12, 5, 2, -11 }, // 0x7C '|' + { 1146, 7, 16, 7, 0, -12 }, // 0x7D '}' + { 1160, 8, 3, 10, 1, -5 } }; // 0x7E '~' + +const GFXfont FreeSerifItalic9pt7b PROGMEM = { + (uint8_t *)FreeSerifItalic9pt7bBitmaps, + (GFXglyph *)FreeSerifItalic9pt7bGlyphs, + 0x20, 0x7E, 22 }; + +// Approx. 1835 bytes diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/TomThumb.h b/libraries/TFT_eSPI/Fonts/GFXFF/TomThumb.h new file mode 100644 index 0000000..dad420d --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/TomThumb.h @@ -0,0 +1,474 @@ +/** +** The original 3x5 font is licensed under the 3-clause BSD license: +** +** Copyright 1999 Brian J. Swetland +** Copyright 1999 Vassilii Khachaturov +** Portions (of vt100.c/vt100.h) copyright Dan Marks +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions, and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions, and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the authors may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +** Modifications to Tom Thumb for improved readability are from Robey Pointer, +** see: +** http://robey.lag.net/2010/01/23/tiny-monospace-font.html +** +** The original author does not have any objection to relicensing of Robey +** Pointer's modifications (in this file) in a more permissive license. See +** the discussion at the above blog, and also here: +** http://opengameart.org/forumtopic/how-to-submit-art-using-the-3-clause-bsd-license +** +** Feb 21, 2016: Conversion from Linux BDF --> Adafruit GFX font, +** with the help of this Python script: +** https://gist.github.com/skelliam/322d421f028545f16f6d +** William Skellenger (williamj@skellenger.net) +** Twitter: @skelliam +** +*/ + +#define TOMTHUMB_USE_EXTENDED 0 + +const uint8_t TomThumbBitmaps[] PROGMEM = { + 0x00, /* 0x20 space */ + 0x80, 0x80, 0x80, 0x00, 0x80, /* 0x21 exclam */ + 0xA0, 0xA0, /* 0x22 quotedbl */ + 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, /* 0x23 numbersign */ + 0x60, 0xC0, 0x60, 0xC0, 0x40, /* 0x24 dollar */ + 0x80, 0x20, 0x40, 0x80, 0x20, /* 0x25 percent */ + 0xC0, 0xC0, 0xE0, 0xA0, 0x60, /* 0x26 ampersand */ + 0x80, 0x80, /* 0x27 quotesingle */ + 0x40, 0x80, 0x80, 0x80, 0x40, /* 0x28 parenleft */ + 0x80, 0x40, 0x40, 0x40, 0x80, /* 0x29 parenright */ + 0xA0, 0x40, 0xA0, /* 0x2A asterisk */ + 0x40, 0xE0, 0x40, /* 0x2B plus */ + 0x40, 0x80, /* 0x2C comma */ + 0xE0, /* 0x2D hyphen */ + 0x80, /* 0x2E period */ + 0x20, 0x20, 0x40, 0x80, 0x80, /* 0x2F slash */ + 0x60, 0xA0, 0xA0, 0xA0, 0xC0, /* 0x30 zero */ + 0x40, 0xC0, 0x40, 0x40, 0x40, /* 0x31 one */ + 0xC0, 0x20, 0x40, 0x80, 0xE0, /* 0x32 two */ + 0xC0, 0x20, 0x40, 0x20, 0xC0, /* 0x33 three */ + 0xA0, 0xA0, 0xE0, 0x20, 0x20, /* 0x34 four */ + 0xE0, 0x80, 0xC0, 0x20, 0xC0, /* 0x35 five */ + 0x60, 0x80, 0xE0, 0xA0, 0xE0, /* 0x36 six */ + 0xE0, 0x20, 0x40, 0x80, 0x80, /* 0x37 seven */ + 0xE0, 0xA0, 0xE0, 0xA0, 0xE0, /* 0x38 eight */ + 0xE0, 0xA0, 0xE0, 0x20, 0xC0, /* 0x39 nine */ + 0x80, 0x00, 0x80, /* 0x3A colon */ + 0x40, 0x00, 0x40, 0x80, /* 0x3B semicolon */ + 0x20, 0x40, 0x80, 0x40, 0x20, /* 0x3C less */ + 0xE0, 0x00, 0xE0, /* 0x3D equal */ + 0x80, 0x40, 0x20, 0x40, 0x80, /* 0x3E greater */ + 0xE0, 0x20, 0x40, 0x00, 0x40, /* 0x3F question */ + 0x40, 0xA0, 0xE0, 0x80, 0x60, /* 0x40 at */ + 0x40, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x41 A */ + 0xC0, 0xA0, 0xC0, 0xA0, 0xC0, /* 0x42 B */ + 0x60, 0x80, 0x80, 0x80, 0x60, /* 0x43 C */ + 0xC0, 0xA0, 0xA0, 0xA0, 0xC0, /* 0x44 D */ + 0xE0, 0x80, 0xE0, 0x80, 0xE0, /* 0x45 E */ + 0xE0, 0x80, 0xE0, 0x80, 0x80, /* 0x46 F */ + 0x60, 0x80, 0xE0, 0xA0, 0x60, /* 0x47 G */ + 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, /* 0x48 H */ + 0xE0, 0x40, 0x40, 0x40, 0xE0, /* 0x49 I */ + 0x20, 0x20, 0x20, 0xA0, 0x40, /* 0x4A J */ + 0xA0, 0xA0, 0xC0, 0xA0, 0xA0, /* 0x4B K */ + 0x80, 0x80, 0x80, 0x80, 0xE0, /* 0x4C L */ + 0xA0, 0xE0, 0xE0, 0xA0, 0xA0, /* 0x4D M */ + 0xA0, 0xE0, 0xE0, 0xE0, 0xA0, /* 0x4E N */ + 0x40, 0xA0, 0xA0, 0xA0, 0x40, /* 0x4F O */ + 0xC0, 0xA0, 0xC0, 0x80, 0x80, /* 0x50 P */ + 0x40, 0xA0, 0xA0, 0xE0, 0x60, /* 0x51 Q */ + 0xC0, 0xA0, 0xE0, 0xC0, 0xA0, /* 0x52 R */ + 0x60, 0x80, 0x40, 0x20, 0xC0, /* 0x53 S */ + 0xE0, 0x40, 0x40, 0x40, 0x40, /* 0x54 T */ + 0xA0, 0xA0, 0xA0, 0xA0, 0x60, /* 0x55 U */ + 0xA0, 0xA0, 0xA0, 0x40, 0x40, /* 0x56 V */ + 0xA0, 0xA0, 0xE0, 0xE0, 0xA0, /* 0x57 W */ + 0xA0, 0xA0, 0x40, 0xA0, 0xA0, /* 0x58 X */ + 0xA0, 0xA0, 0x40, 0x40, 0x40, /* 0x59 Y */ + 0xE0, 0x20, 0x40, 0x80, 0xE0, /* 0x5A Z */ + 0xE0, 0x80, 0x80, 0x80, 0xE0, /* 0x5B bracketleft */ + 0x80, 0x40, 0x20, /* 0x5C backslash */ + 0xE0, 0x20, 0x20, 0x20, 0xE0, /* 0x5D bracketright */ + 0x40, 0xA0, /* 0x5E asciicircum */ + 0xE0, /* 0x5F underscore */ + 0x80, 0x40, /* 0x60 grave */ + 0xC0, 0x60, 0xA0, 0xE0, /* 0x61 a */ + 0x80, 0xC0, 0xA0, 0xA0, 0xC0, /* 0x62 b */ + 0x60, 0x80, 0x80, 0x60, /* 0x63 c */ + 0x20, 0x60, 0xA0, 0xA0, 0x60, /* 0x64 d */ + 0x60, 0xA0, 0xC0, 0x60, /* 0x65 e */ + 0x20, 0x40, 0xE0, 0x40, 0x40, /* 0x66 f */ + 0x60, 0xA0, 0xE0, 0x20, 0x40, /* 0x67 g */ + 0x80, 0xC0, 0xA0, 0xA0, 0xA0, /* 0x68 h */ + 0x80, 0x00, 0x80, 0x80, 0x80, /* 0x69 i */ + 0x20, 0x00, 0x20, 0x20, 0xA0, 0x40, /* 0x6A j */ + 0x80, 0xA0, 0xC0, 0xC0, 0xA0, /* 0x6B k */ + 0xC0, 0x40, 0x40, 0x40, 0xE0, /* 0x6C l */ + 0xE0, 0xE0, 0xE0, 0xA0, /* 0x6D m */ + 0xC0, 0xA0, 0xA0, 0xA0, /* 0x6E n */ + 0x40, 0xA0, 0xA0, 0x40, /* 0x6F o */ + 0xC0, 0xA0, 0xA0, 0xC0, 0x80, /* 0x70 p */ + 0x60, 0xA0, 0xA0, 0x60, 0x20, /* 0x71 q */ + 0x60, 0x80, 0x80, 0x80, /* 0x72 r */ + 0x60, 0xC0, 0x60, 0xC0, /* 0x73 s */ + 0x40, 0xE0, 0x40, 0x40, 0x60, /* 0x74 t */ + 0xA0, 0xA0, 0xA0, 0x60, /* 0x75 u */ + 0xA0, 0xA0, 0xE0, 0x40, /* 0x76 v */ + 0xA0, 0xE0, 0xE0, 0xE0, /* 0x77 w */ + 0xA0, 0x40, 0x40, 0xA0, /* 0x78 x */ + 0xA0, 0xA0, 0x60, 0x20, 0x40, /* 0x79 y */ + 0xE0, 0x60, 0xC0, 0xE0, /* 0x7A z */ + 0x60, 0x40, 0x80, 0x40, 0x60, /* 0x7B braceleft */ + 0x80, 0x80, 0x00, 0x80, 0x80, /* 0x7C bar */ + 0xC0, 0x40, 0x20, 0x40, 0xC0, /* 0x7D braceright */ + 0x60, 0xC0, /* 0x7E asciitilde */ +#if (TOMTHUMB_USE_EXTENDED) + 0x80, 0x00, 0x80, 0x80, 0x80, /* 0xA1 exclamdown */ + 0x40, 0xE0, 0x80, 0xE0, 0x40, /* 0xA2 cent */ + 0x60, 0x40, 0xE0, 0x40, 0xE0, /* 0xA3 sterling */ + 0xA0, 0x40, 0xE0, 0x40, 0xA0, /* 0xA4 currency */ + 0xA0, 0xA0, 0x40, 0xE0, 0x40, /* 0xA5 yen */ + 0x80, 0x80, 0x00, 0x80, 0x80, /* 0xA6 brokenbar */ + 0x60, 0x40, 0xA0, 0x40, 0xC0, /* 0xA7 section */ + 0xA0, /* 0xA8 dieresis */ + 0x60, 0x80, 0x60, /* 0xA9 copyright */ + 0x60, 0xA0, 0xE0, 0x00, 0xE0, /* 0xAA ordfeminine */ + 0x40, 0x80, 0x40, /* 0xAB guillemotleft */ + 0xE0, 0x20, /* 0xAC logicalnot */ + 0xC0, /* 0xAD softhyphen */ + 0xC0, 0xC0, 0xA0, /* 0xAE registered */ + 0xE0, /* 0xAF macron */ + 0x40, 0xA0, 0x40, /* 0xB0 degree */ + 0x40, 0xE0, 0x40, 0x00, 0xE0, /* 0xB1 plusminus */ + 0xC0, 0x40, 0x60, /* 0xB2 twosuperior */ + 0xE0, 0x60, 0xE0, /* 0xB3 threesuperior */ + 0x40, 0x80, /* 0xB4 acute */ + 0xA0, 0xA0, 0xA0, 0xC0, 0x80, /* 0xB5 mu */ + 0x60, 0xA0, 0x60, 0x60, 0x60, /* 0xB6 paragraph */ + 0xE0, 0xE0, 0xE0, /* 0xB7 periodcentered */ + 0x40, 0x20, 0xC0, /* 0xB8 cedilla */ + 0x80, 0x80, 0x80, /* 0xB9 onesuperior */ + 0x40, 0xA0, 0x40, 0x00, 0xE0, /* 0xBA ordmasculine */ + 0x80, 0x40, 0x80, /* 0xBB guillemotright */ + 0x80, 0x80, 0x00, 0x60, 0x20, /* 0xBC onequarter */ + 0x80, 0x80, 0x00, 0xC0, 0x60, /* 0xBD onehalf */ + 0xC0, 0xC0, 0x00, 0x60, 0x20, /* 0xBE threequarters */ + 0x40, 0x00, 0x40, 0x80, 0xE0, /* 0xBF questiondown */ + 0x40, 0x20, 0x40, 0xE0, 0xA0, /* 0xC0 Agrave */ + 0x40, 0x80, 0x40, 0xE0, 0xA0, /* 0xC1 Aacute */ + 0xE0, 0x00, 0x40, 0xE0, 0xA0, /* 0xC2 Acircumflex */ + 0x60, 0xC0, 0x40, 0xE0, 0xA0, /* 0xC3 Atilde */ + 0xA0, 0x40, 0xA0, 0xE0, 0xA0, /* 0xC4 Adieresis */ + 0xC0, 0xC0, 0xA0, 0xE0, 0xA0, /* 0xC5 Aring */ + 0x60, 0xC0, 0xE0, 0xC0, 0xE0, /* 0xC6 AE */ + 0x60, 0x80, 0x80, 0x60, 0x20, 0x40, /* 0xC7 Ccedilla */ + 0x40, 0x20, 0xE0, 0xC0, 0xE0, /* 0xC8 Egrave */ + 0x40, 0x80, 0xE0, 0xC0, 0xE0, /* 0xC9 Eacute */ + 0xE0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCA Ecircumflex */ + 0xA0, 0x00, 0xE0, 0xC0, 0xE0, /* 0xCB Edieresis */ + 0x40, 0x20, 0xE0, 0x40, 0xE0, /* 0xCC Igrave */ + 0x40, 0x80, 0xE0, 0x40, 0xE0, /* 0xCD Iacute */ + 0xE0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCE Icircumflex */ + 0xA0, 0x00, 0xE0, 0x40, 0xE0, /* 0xCF Idieresis */ + 0xC0, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD0 Eth */ + 0xC0, 0x60, 0xA0, 0xE0, 0xA0, /* 0xD1 Ntilde */ + 0x40, 0x20, 0xE0, 0xA0, 0xE0, /* 0xD2 Ograve */ + 0x40, 0x80, 0xE0, 0xA0, 0xE0, /* 0xD3 Oacute */ + 0xE0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD4 Ocircumflex */ + 0xC0, 0x60, 0xE0, 0xA0, 0xE0, /* 0xD5 Otilde */ + 0xA0, 0x00, 0xE0, 0xA0, 0xE0, /* 0xD6 Odieresis */ + 0xA0, 0x40, 0xA0, /* 0xD7 multiply */ + 0x60, 0xA0, 0xE0, 0xA0, 0xC0, /* 0xD8 Oslash */ + 0x80, 0x40, 0xA0, 0xA0, 0xE0, /* 0xD9 Ugrave */ + 0x20, 0x40, 0xA0, 0xA0, 0xE0, /* 0xDA Uacute */ + 0xE0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDB Ucircumflex */ + 0xA0, 0x00, 0xA0, 0xA0, 0xE0, /* 0xDC Udieresis */ + 0x20, 0x40, 0xA0, 0xE0, 0x40, /* 0xDD Yacute */ + 0x80, 0xE0, 0xA0, 0xE0, 0x80, /* 0xDE Thorn */ + 0x60, 0xA0, 0xC0, 0xA0, 0xC0, 0x80, /* 0xDF germandbls */ + 0x40, 0x20, 0x60, 0xA0, 0xE0, /* 0xE0 agrave */ + 0x40, 0x80, 0x60, 0xA0, 0xE0, /* 0xE1 aacute */ + 0xE0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE2 acircumflex */ + 0x60, 0xC0, 0x60, 0xA0, 0xE0, /* 0xE3 atilde */ + 0xA0, 0x00, 0x60, 0xA0, 0xE0, /* 0xE4 adieresis */ + 0x60, 0x60, 0x60, 0xA0, 0xE0, /* 0xE5 aring */ + 0x60, 0xE0, 0xE0, 0xC0, /* 0xE6 ae */ + 0x60, 0x80, 0x60, 0x20, 0x40, /* 0xE7 ccedilla */ + 0x40, 0x20, 0x60, 0xE0, 0x60, /* 0xE8 egrave */ + 0x40, 0x80, 0x60, 0xE0, 0x60, /* 0xE9 eacute */ + 0xE0, 0x00, 0x60, 0xE0, 0x60, /* 0xEA ecircumflex */ + 0xA0, 0x00, 0x60, 0xE0, 0x60, /* 0xEB edieresis */ + 0x80, 0x40, 0x80, 0x80, 0x80, /* 0xEC igrave */ + 0x40, 0x80, 0x40, 0x40, 0x40, /* 0xED iacute */ + 0xE0, 0x00, 0x40, 0x40, 0x40, /* 0xEE icircumflex */ + 0xA0, 0x00, 0x40, 0x40, 0x40, /* 0xEF idieresis */ + 0x60, 0xC0, 0x60, 0xA0, 0x60, /* 0xF0 eth */ + 0xC0, 0x60, 0xC0, 0xA0, 0xA0, /* 0xF1 ntilde */ + 0x40, 0x20, 0x40, 0xA0, 0x40, /* 0xF2 ograve */ + 0x40, 0x80, 0x40, 0xA0, 0x40, /* 0xF3 oacute */ + 0xE0, 0x00, 0x40, 0xA0, 0x40, /* 0xF4 ocircumflex */ + 0xC0, 0x60, 0x40, 0xA0, 0x40, /* 0xF5 otilde */ + 0xA0, 0x00, 0x40, 0xA0, 0x40, /* 0xF6 odieresis */ + 0x40, 0x00, 0xE0, 0x00, 0x40, /* 0xF7 divide */ + 0x60, 0xE0, 0xA0, 0xC0, /* 0xF8 oslash */ + 0x80, 0x40, 0xA0, 0xA0, 0x60, /* 0xF9 ugrave */ + 0x20, 0x40, 0xA0, 0xA0, 0x60, /* 0xFA uacute */ + 0xE0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFB ucircumflex */ + 0xA0, 0x00, 0xA0, 0xA0, 0x60, /* 0xFC udieresis */ + 0x20, 0x40, 0xA0, 0x60, 0x20, 0x40, /* 0xFD yacute */ + 0x80, 0xC0, 0xA0, 0xC0, 0x80, /* 0xFE thorn */ + 0xA0, 0x00, 0xA0, 0x60, 0x20, 0x40, /* 0xFF ydieresis */ + 0x00, /* 0x11D gcircumflex */ + 0x60, 0xC0, 0xE0, 0xC0, 0x60, /* 0x152 OE */ + 0x60, 0xE0, 0xC0, 0xE0, /* 0x153 oe */ + 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x160 Scaron */ + 0xA0, 0x60, 0xC0, 0x60, 0xC0, /* 0x161 scaron */ + 0xA0, 0x00, 0xA0, 0x40, 0x40, /* 0x178 Ydieresis */ + 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17D Zcaron */ + 0xA0, 0xE0, 0x60, 0xC0, 0xE0, /* 0x17E zcaron */ + 0x00, /* 0xEA4 uni0EA4 */ + 0x00, /* 0x13A0 uni13A0 */ + 0x80, /* 0x2022 bullet */ + 0xA0, /* 0x2026 ellipsis */ + 0x60, 0xE0, 0xE0, 0xC0, 0x60, /* 0x20AC Euro */ + 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, /* 0xFFFD uniFFFD */ +#endif /* (TOMTHUMB_USE_EXTENDED) */ + }; + + +/* {offset, width, height, advance cursor, x offset, y offset} */ +const GFXglyph TomThumbGlyphs[] PROGMEM = { + { 0, 8, 1, 2, 0, -5 }, /* 0x20 space */ + { 1, 8, 5, 2, 0, -5 }, /* 0x21 exclam */ + { 6, 8, 2, 4, 0, -5 }, /* 0x22 quotedbl */ + { 8, 8, 5, 4, 0, -5 }, /* 0x23 numbersign */ + { 13, 8, 5, 4, 0, -5 }, /* 0x24 dollar */ + { 18, 8, 5, 4, 0, -5 }, /* 0x25 percent */ + { 23, 8, 5, 4, 0, -5 }, /* 0x26 ampersand */ + { 28, 8, 2, 2, 0, -5 }, /* 0x27 quotesingle */ + { 30, 8, 5, 3, 0, -5 }, /* 0x28 parenleft */ + { 35, 8, 5, 3, 0, -5 }, /* 0x29 parenright */ + { 40, 8, 3, 4, 0, -5 }, /* 0x2A asterisk */ + { 43, 8, 3, 4, 0, -4 }, /* 0x2B plus */ + { 46, 8, 2, 3, 0, -2 }, /* 0x2C comma */ + { 48, 8, 1, 4, 0, -3 }, /* 0x2D hyphen */ + { 49, 8, 1, 2, 0, -1 }, /* 0x2E period */ + { 50, 8, 5, 4, 0, -5 }, /* 0x2F slash */ + { 55, 8, 5, 4, 0, -5 }, /* 0x30 zero */ + { 60, 8, 5, 3, 0, -5 }, /* 0x31 one */ + { 65, 8, 5, 4, 0, -5 }, /* 0x32 two */ + { 70, 8, 5, 4, 0, -5 }, /* 0x33 three */ + { 75, 8, 5, 4, 0, -5 }, /* 0x34 four */ + { 80, 8, 5, 4, 0, -5 }, /* 0x35 five */ + { 85, 8, 5, 4, 0, -5 }, /* 0x36 six */ + { 90, 8, 5, 4, 0, -5 }, /* 0x37 seven */ + { 95, 8, 5, 4, 0, -5 }, /* 0x38 eight */ + { 100, 8, 5, 4, 0, -5 }, /* 0x39 nine */ + { 105, 8, 3, 2, 0, -4 }, /* 0x3A colon */ + { 108, 8, 4, 3, 0, -4 }, /* 0x3B semicolon */ + { 112, 8, 5, 4, 0, -5 }, /* 0x3C less */ + { 117, 8, 3, 4, 0, -4 }, /* 0x3D equal */ + { 120, 8, 5, 4, 0, -5 }, /* 0x3E greater */ + { 125, 8, 5, 4, 0, -5 }, /* 0x3F question */ + { 130, 8, 5, 4, 0, -5 }, /* 0x40 at */ + { 135, 8, 5, 4, 0, -5 }, /* 0x41 A */ + { 140, 8, 5, 4, 0, -5 }, /* 0x42 B */ + { 145, 8, 5, 4, 0, -5 }, /* 0x43 C */ + { 150, 8, 5, 4, 0, -5 }, /* 0x44 D */ + { 155, 8, 5, 4, 0, -5 }, /* 0x45 E */ + { 160, 8, 5, 4, 0, -5 }, /* 0x46 F */ + { 165, 8, 5, 4, 0, -5 }, /* 0x47 G */ + { 170, 8, 5, 4, 0, -5 }, /* 0x48 H */ + { 175, 8, 5, 4, 0, -5 }, /* 0x49 I */ + { 180, 8, 5, 4, 0, -5 }, /* 0x4A J */ + { 185, 8, 5, 4, 0, -5 }, /* 0x4B K */ + { 190, 8, 5, 4, 0, -5 }, /* 0x4C L */ + { 195, 8, 5, 4, 0, -5 }, /* 0x4D M */ + { 200, 8, 5, 4, 0, -5 }, /* 0x4E N */ + { 205, 8, 5, 4, 0, -5 }, /* 0x4F O */ + { 210, 8, 5, 4, 0, -5 }, /* 0x50 P */ + { 215, 8, 5, 4, 0, -5 }, /* 0x51 Q */ + { 220, 8, 5, 4, 0, -5 }, /* 0x52 R */ + { 225, 8, 5, 4, 0, -5 }, /* 0x53 S */ + { 230, 8, 5, 4, 0, -5 }, /* 0x54 T */ + { 235, 8, 5, 4, 0, -5 }, /* 0x55 U */ + { 240, 8, 5, 4, 0, -5 }, /* 0x56 V */ + { 245, 8, 5, 4, 0, -5 }, /* 0x57 W */ + { 250, 8, 5, 4, 0, -5 }, /* 0x58 X */ + { 255, 8, 5, 4, 0, -5 }, /* 0x59 Y */ + { 260, 8, 5, 4, 0, -5 }, /* 0x5A Z */ + { 265, 8, 5, 4, 0, -5 }, /* 0x5B bracketleft */ + { 270, 8, 3, 4, 0, -4 }, /* 0x5C backslash */ + { 273, 8, 5, 4, 0, -5 }, /* 0x5D bracketright */ + { 278, 8, 2, 4, 0, -5 }, /* 0x5E asciicircum */ + { 280, 8, 1, 4, 0, -1 }, /* 0x5F underscore */ + { 281, 8, 2, 3, 0, -5 }, /* 0x60 grave */ + { 283, 8, 4, 4, 0, -4 }, /* 0x61 a */ + { 287, 8, 5, 4, 0, -5 }, /* 0x62 b */ + { 292, 8, 4, 4, 0, -4 }, /* 0x63 c */ + { 296, 8, 5, 4, 0, -5 }, /* 0x64 d */ + { 301, 8, 4, 4, 0, -4 }, /* 0x65 e */ + { 305, 8, 5, 4, 0, -5 }, /* 0x66 f */ + { 310, 8, 5, 4, 0, -4 }, /* 0x67 g */ + { 315, 8, 5, 4, 0, -5 }, /* 0x68 h */ + { 320, 8, 5, 2, 0, -5 }, /* 0x69 i */ + { 325, 8, 6, 4, 0, -5 }, /* 0x6A j */ + { 331, 8, 5, 4, 0, -5 }, /* 0x6B k */ + { 336, 8, 5, 4, 0, -5 }, /* 0x6C l */ + { 341, 8, 4, 4, 0, -4 }, /* 0x6D m */ + { 345, 8, 4, 4, 0, -4 }, /* 0x6E n */ + { 349, 8, 4, 4, 0, -4 }, /* 0x6F o */ + { 353, 8, 5, 4, 0, -4 }, /* 0x70 p */ + { 358, 8, 5, 4, 0, -4 }, /* 0x71 q */ + { 363, 8, 4, 4, 0, -4 }, /* 0x72 r */ + { 367, 8, 4, 4, 0, -4 }, /* 0x73 s */ + { 371, 8, 5, 4, 0, -5 }, /* 0x74 t */ + { 376, 8, 4, 4, 0, -4 }, /* 0x75 u */ + { 380, 8, 4, 4, 0, -4 }, /* 0x76 v */ + { 384, 8, 4, 4, 0, -4 }, /* 0x77 w */ + { 388, 8, 4, 4, 0, -4 }, /* 0x78 x */ + { 392, 8, 5, 4, 0, -4 }, /* 0x79 y */ + { 397, 8, 4, 4, 0, -4 }, /* 0x7A z */ + { 401, 8, 5, 4, 0, -5 }, /* 0x7B braceleft */ + { 406, 8, 5, 2, 0, -5 }, /* 0x7C bar */ + { 411, 8, 5, 4, 0, -5 }, /* 0x7D braceright */ + { 416, 8, 2, 4, 0, -5 }, /* 0x7E asciitilde */ +#if (TOMTHUMB_USE_EXTENDED) + { 418, 8, 5, 2, 0, -5 }, /* 0xA1 exclamdown */ + { 423, 8, 5, 4, 0, -5 }, /* 0xA2 cent */ + { 428, 8, 5, 4, 0, -5 }, /* 0xA3 sterling */ + { 433, 8, 5, 4, 0, -5 }, /* 0xA4 currency */ + { 438, 8, 5, 4, 0, -5 }, /* 0xA5 yen */ + { 443, 8, 5, 2, 0, -5 }, /* 0xA6 brokenbar */ + { 448, 8, 5, 4, 0, -5 }, /* 0xA7 section */ + { 453, 8, 1, 4, 0, -5 }, /* 0xA8 dieresis */ + { 454, 8, 3, 4, 0, -5 }, /* 0xA9 copyright */ + { 457, 8, 5, 4, 0, -5 }, /* 0xAA ordfeminine */ + { 462, 8, 3, 3, 0, -5 }, /* 0xAB guillemotleft */ + { 465, 8, 2, 4, 0, -4 }, /* 0xAC logicalnot */ + { 467, 8, 1, 3, 0, -3 }, /* 0xAD softhyphen */ + { 468, 8, 3, 4, 0, -5 }, /* 0xAE registered */ + { 471, 8, 1, 4, 0, -5 }, /* 0xAF macron */ + { 472, 8, 3, 4, 0, -5 }, /* 0xB0 degree */ + { 475, 8, 5, 4, 0, -5 }, /* 0xB1 plusminus */ + { 480, 8, 3, 4, 0, -5 }, /* 0xB2 twosuperior */ + { 483, 8, 3, 4, 0, -5 }, /* 0xB3 threesuperior */ + { 486, 8, 2, 3, 0, -5 }, /* 0xB4 acute */ + { 488, 8, 5, 4, 0, -5 }, /* 0xB5 mu */ + { 493, 8, 5, 4, 0, -5 }, /* 0xB6 paragraph */ + { 498, 8, 3, 4, 0, -4 }, /* 0xB7 periodcentered */ + { 501, 8, 3, 4, 0, -3 }, /* 0xB8 cedilla */ + { 504, 8, 3, 2, 0, -5 }, /* 0xB9 onesuperior */ + { 507, 8, 5, 4, 0, -5 }, /* 0xBA ordmasculine */ + { 512, 8, 3, 3, 0, -5 }, /* 0xBB guillemotright */ + { 515, 8, 5, 4, 0, -5 }, /* 0xBC onequarter */ + { 520, 8, 5, 4, 0, -5 }, /* 0xBD onehalf */ + { 525, 8, 5, 4, 0, -5 }, /* 0xBE threequarters */ + { 530, 8, 5, 4, 0, -5 }, /* 0xBF questiondown */ + { 535, 8, 5, 4, 0, -5 }, /* 0xC0 Agrave */ + { 540, 8, 5, 4, 0, -5 }, /* 0xC1 Aacute */ + { 545, 8, 5, 4, 0, -5 }, /* 0xC2 Acircumflex */ + { 550, 8, 5, 4, 0, -5 }, /* 0xC3 Atilde */ + { 555, 8, 5, 4, 0, -5 }, /* 0xC4 Adieresis */ + { 560, 8, 5, 4, 0, -5 }, /* 0xC5 Aring */ + { 565, 8, 5, 4, 0, -5 }, /* 0xC6 AE */ + { 570, 8, 6, 4, 0, -5 }, /* 0xC7 Ccedilla */ + { 576, 8, 5, 4, 0, -5 }, /* 0xC8 Egrave */ + { 581, 8, 5, 4, 0, -5 }, /* 0xC9 Eacute */ + { 586, 8, 5, 4, 0, -5 }, /* 0xCA Ecircumflex */ + { 591, 8, 5, 4, 0, -5 }, /* 0xCB Edieresis */ + { 596, 8, 5, 4, 0, -5 }, /* 0xCC Igrave */ + { 601, 8, 5, 4, 0, -5 }, /* 0xCD Iacute */ + { 606, 8, 5, 4, 0, -5 }, /* 0xCE Icircumflex */ + { 611, 8, 5, 4, 0, -5 }, /* 0xCF Idieresis */ + { 616, 8, 5, 4, 0, -5 }, /* 0xD0 Eth */ + { 621, 8, 5, 4, 0, -5 }, /* 0xD1 Ntilde */ + { 626, 8, 5, 4, 0, -5 }, /* 0xD2 Ograve */ + { 631, 8, 5, 4, 0, -5 }, /* 0xD3 Oacute */ + { 636, 8, 5, 4, 0, -5 }, /* 0xD4 Ocircumflex */ + { 641, 8, 5, 4, 0, -5 }, /* 0xD5 Otilde */ + { 646, 8, 5, 4, 0, -5 }, /* 0xD6 Odieresis */ + { 651, 8, 3, 4, 0, -4 }, /* 0xD7 multiply */ + { 654, 8, 5, 4, 0, -5 }, /* 0xD8 Oslash */ + { 659, 8, 5, 4, 0, -5 }, /* 0xD9 Ugrave */ + { 664, 8, 5, 4, 0, -5 }, /* 0xDA Uacute */ + { 669, 8, 5, 4, 0, -5 }, /* 0xDB Ucircumflex */ + { 674, 8, 5, 4, 0, -5 }, /* 0xDC Udieresis */ + { 679, 8, 5, 4, 0, -5 }, /* 0xDD Yacute */ + { 684, 8, 5, 4, 0, -5 }, /* 0xDE Thorn */ + { 689, 8, 6, 4, 0, -5 }, /* 0xDF germandbls */ + { 695, 8, 5, 4, 0, -5 }, /* 0xE0 agrave */ + { 700, 8, 5, 4, 0, -5 }, /* 0xE1 aacute */ + { 705, 8, 5, 4, 0, -5 }, /* 0xE2 acircumflex */ + { 710, 8, 5, 4, 0, -5 }, /* 0xE3 atilde */ + { 715, 8, 5, 4, 0, -5 }, /* 0xE4 adieresis */ + { 720, 8, 5, 4, 0, -5 }, /* 0xE5 aring */ + { 725, 8, 4, 4, 0, -4 }, /* 0xE6 ae */ + { 729, 8, 5, 4, 0, -4 }, /* 0xE7 ccedilla */ + { 734, 8, 5, 4, 0, -5 }, /* 0xE8 egrave */ + { 739, 8, 5, 4, 0, -5 }, /* 0xE9 eacute */ + { 744, 8, 5, 4, 0, -5 }, /* 0xEA ecircumflex */ + { 749, 8, 5, 4, 0, -5 }, /* 0xEB edieresis */ + { 754, 8, 5, 3, 0, -5 }, /* 0xEC igrave */ + { 759, 8, 5, 3, 0, -5 }, /* 0xED iacute */ + { 764, 8, 5, 4, 0, -5 }, /* 0xEE icircumflex */ + { 769, 8, 5, 4, 0, -5 }, /* 0xEF idieresis */ + { 774, 8, 5, 4, 0, -5 }, /* 0xF0 eth */ + { 779, 8, 5, 4, 0, -5 }, /* 0xF1 ntilde */ + { 784, 8, 5, 4, 0, -5 }, /* 0xF2 ograve */ + { 789, 8, 5, 4, 0, -5 }, /* 0xF3 oacute */ + { 794, 8, 5, 4, 0, -5 }, /* 0xF4 ocircumflex */ + { 799, 8, 5, 4, 0, -5 }, /* 0xF5 otilde */ + { 804, 8, 5, 4, 0, -5 }, /* 0xF6 odieresis */ + { 809, 8, 5, 4, 0, -5 }, /* 0xF7 divide */ + { 814, 8, 4, 4, 0, -4 }, /* 0xF8 oslash */ + { 818, 8, 5, 4, 0, -5 }, /* 0xF9 ugrave */ + { 823, 8, 5, 4, 0, -5 }, /* 0xFA uacute */ + { 828, 8, 5, 4, 0, -5 }, /* 0xFB ucircumflex */ + { 833, 8, 5, 4, 0, -5 }, /* 0xFC udieresis */ + { 838, 8, 6, 4, 0, -5 }, /* 0xFD yacute */ + { 844, 8, 5, 4, 0, -4 }, /* 0xFE thorn */ + { 849, 8, 6, 4, 0, -5 }, /* 0xFF ydieresis */ + { 855, 8, 1, 2, 0, -1 }, /* 0x11D gcircumflex */ + { 856, 8, 5, 4, 0, -5 }, /* 0x152 OE */ + { 861, 8, 4, 4, 0, -4 }, /* 0x153 oe */ + { 865, 8, 5, 4, 0, -5 }, /* 0x160 Scaron */ + { 870, 8, 5, 4, 0, -5 }, /* 0x161 scaron */ + { 875, 8, 5, 4, 0, -5 }, /* 0x178 Ydieresis */ + { 880, 8, 5, 4, 0, -5 }, /* 0x17D Zcaron */ + { 885, 8, 5, 4, 0, -5 }, /* 0x17E zcaron */ + { 890, 8, 1, 2, 0, -1 }, /* 0xEA4 uni0EA4 */ + { 891, 8, 1, 2, 0, -1 }, /* 0x13A0 uni13A0 */ + { 892, 8, 1, 2, 0, -3 }, /* 0x2022 bullet */ + { 893, 8, 1, 4, 0, -1 }, /* 0x2026 ellipsis */ + { 894, 8, 5, 4, 0, -5 }, /* 0x20AC Euro */ + { 899, 8, 5, 4, 0, -5 }, /* 0xFFFD uniFFFD */ +#endif /* (TOMTHUMB_USE_EXTENDED) */ +}; + +const GFXfont TomThumb PROGMEM = { + (uint8_t *)TomThumbBitmaps, + (GFXglyph *)TomThumbGlyphs, + 0x20, 0x7E, 6 }; diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/gfxfont.h b/libraries/TFT_eSPI/Fonts/GFXFF/gfxfont.h new file mode 100644 index 0000000..253f50c --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/gfxfont.h @@ -0,0 +1,95 @@ +// Adopted by Bodmer to support TFT_eSPI library. + +// 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_ + +#ifdef LOAD_GFXFF + +typedef struct { // Data stored PER GLYPH + uint32_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 + uint16_t first, last; // ASCII extents + uint8_t yAdvance; // Newline distance (y axis) +} GFXfont; + + // Original Adafruit_GFX "Free Fonts" + #include // TT1 + + #include // FF1 or FM9 + #include // FF2 or FM12 + #include // FF3 or FM18 + #include // FF4 or FM24 + + #include // FF5 or FMO9 + #include // FF6 or FMO12 + #include // FF7 or FMO18 + #include // FF8 or FMO24 + + #include // FF9 or FMB9 + #include // FF10 or FMB12 + #include // FF11 or FMB18 + #include // FF12 or FMB24 + + #include // FF13 or FMBO9 + #include // FF14 or FMBO12 + #include // FF15 or FMBO18 + #include // FF16 or FMBO24 + + // Sans serif fonts + #include // FF17 or FSS9 + #include // FF18 or FSS12 + #include // FF19 or FSS18 + #include // FF20 or FSS24 + + #include // FF21 or FSSO9 + #include // FF22 or FSSO12 + #include // FF23 or FSSO18 + #include // FF24 or FSSO24 + + #include // FF25 or FSSB9 + #include // FF26 or FSSB12 + #include // FF27 or FSSB18 + #include // FF28 or FSSB24 + + #include // FF29 or FSSBO9 + #include // FF30 or FSSBO12 + #include // FF31 or FSSBO18 + #include // FF32 or FSSBO24 + + // Serif fonts + #include // FF33 or FS9 + #include // FF34 or FS12 + #include // FF35 or FS18 + #include // FF36 or FS24 + + #include // FF37 or FSI9 + #include // FF38 or FSI12 + #include // FF39 or FSI18 + #include // FF40 or FSI24 + + #include // FF41 or FSB9 + #include // FF42 or FSB12 + #include // FF43 or FSB18 + #include // FF44 or FSB24 + + #include // FF45 or FSBI9 + #include // FF46 or FSBI12 + #include // FF47 or FSBI18 + #include // FF48 or FSBI24 + +#endif // LOAD_GFXFF + +#endif // _GFXFONT_H_ diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/license.txt b/libraries/TFT_eSPI/Fonts/GFXFF/license.txt new file mode 100644 index 0000000..7b71e95 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/license.txt @@ -0,0 +1,34 @@ +This TFT_eSPI library has been developed from the Adafruit_GFX library: + +https://github.com/adafruit/Adafruit-GFX-Library + +It has been modified extensively to improve rendering speed on +ESP8266 processors. There follows the original library license text. + + +Original text follows: + +Software License Agreement (BSD License) + +Copyright (c) 2012 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/libraries/TFT_eSPI/Fonts/GFXFF/print.txt b/libraries/TFT_eSPI/Fonts/GFXFF/print.txt new file mode 100644 index 0000000..2968036 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/GFXFF/print.txt @@ -0,0 +1,61 @@ +#define TT1 TomThumb + +#define FF1 FreeMono9pt7b +#define FF2 FreeMono12pt7b +#define FF3 FreeMono18pt7b +#define FF4 FreeMono24pt7b + +#define FF5 FreeMonoBold9pt7b +#define FF6 FreeMonoBold12pt7b +#define FF7 FreeMonoBold18pt7b +#define FF8 FreeMonoBold24pt7b + +#define FF9 FreeMonoBoldOblique9pt7b +#define FF10 FreeMonoBoldOblique12pt7b +#define FF11 FreeMonoBoldOblique18pt7b +#define FF12 FreeMonoBoldOblique24pt7b + +#define FF13 FreeMonoOblique9pt7b +#define FF14 FreeMonoOblique12pt7b +#define FF15 FreeMonoOblique18pt7b +#define FF16 FreeMonoOblique24pt7b + +#define FF17 FreeSans9pt7b +#define FF18 FreeSans12pt7b +#define FF19 FreeSans18pt7b +#define FF20 FreeSans24pt7b + +#define FF21 FreeSansBold9pt7b +#define FF22 FreeSansBold12pt7b +#define FF23 FreeSansBold18pt7b +#define FF24 FreeSansBold24pt7b + +#define FF25 FreeSansBoldOblique9pt7b +#define FF26 FreeSansBoldOblique12pt7b +#define FF27 FreeSansBoldOblique18pt7b +#define FF28 FreeSansBoldOblique24pt7b + +#define FF29 FreeSansOblique9pt7b +#define FF30 FreeSansOblique12pt7b +#define FF31 FreeSansOblique18pt7b +#define FF32 FreeSansOblique24pt7b + +#define FF33 FreeSerif9pt7b +#define FF34 FreeSerif12pt7b +#define FF35 FreeSerif18pt7b +#define FF36 FreeSerif24pt7b + +#define FF37 FreeSerifBold9pt7b +#define FF38 FreeSerifBold12pt7b +#define FF39 FreeSerifBold18pt7b +#define FF40 FreeSerifBold24pt7b + +#define FF41 FreeSerifBoldItalic9pt7b +#define FF42 FreeSerifBoldItalic12pt7b +#define FF43 FreeSerifBoldItalic18pt7b +#define FF44 FreeSerifBoldItalic24pt7b + +#define FF45 FreeSerifItalic9pt7b +#define FF46 FreeSerifItalic12pt7b +#define FF47 FreeSerifItalic18pt7b +#define FF48 FreeSerifItalic24pt7b diff --git a/libraries/TFT_eSPI/Fonts/TrueType/Not_yet_supported.txt b/libraries/TFT_eSPI/Fonts/TrueType/Not_yet_supported.txt new file mode 100644 index 0000000..ce0c4e0 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/TrueType/Not_yet_supported.txt @@ -0,0 +1 @@ +TO DO: Add support for converted True Type fonts in an RLE format. \ No newline at end of file diff --git a/libraries/TFT_eSPI/Fonts/glcdfont.c b/libraries/TFT_eSPI/Fonts/glcdfont.c new file mode 100644 index 0000000..95c1c98 --- /dev/null +++ b/libraries/TFT_eSPI/Fonts/glcdfont.c @@ -0,0 +1,267 @@ +// Original Adafruit_GFX 5x7 font + +#ifndef FONT5X7_H +#define FONT5X7_H + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, + 0x00, 0x18, 0x3C, 0x18, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, + 0x00, 0x18, 0x24, 0x18, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, + 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, + 0x40, 0x7F, 0x05, 0x05, 0x07, + 0x40, 0x7F, 0x05, 0x25, 0x3F, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, + 0x14, 0x22, 0x7F, 0x22, 0x14, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, + 0x06, 0x09, 0x7F, 0x01, 0x7F, + 0x00, 0x66, 0x89, 0x95, 0x6A, + 0x60, 0x60, 0x60, 0x60, 0x60, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, + 0x10, 0x20, 0x7E, 0x20, 0x10, + 0x08, 0x08, 0x2A, 0x1C, 0x08, + 0x08, 0x1C, 0x2A, 0x08, 0x08, + 0x1E, 0x10, 0x10, 0x10, 0x10, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, + 0x30, 0x38, 0x3E, 0x38, 0x30, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, + 0x23, 0x13, 0x08, 0x64, 0x62, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x08, 0x07, 0x03, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, + 0x08, 0x08, 0x3E, 0x08, 0x08, + 0x00, 0x80, 0x70, 0x30, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x60, 0x60, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, + 0x00, 0x42, 0x7F, 0x40, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, + 0x21, 0x41, 0x49, 0x4D, 0x33, + 0x18, 0x14, 0x12, 0x7F, 0x10, + 0x27, 0x45, 0x45, 0x45, 0x39, + 0x3C, 0x4A, 0x49, 0x49, 0x31, + 0x41, 0x21, 0x11, 0x09, 0x07, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x46, 0x49, 0x49, 0x29, 0x1E, + 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, + 0x7C, 0x12, 0x11, 0x12, 0x7C, + 0x7F, 0x49, 0x49, 0x49, 0x36, + 0x3E, 0x41, 0x41, 0x41, 0x22, + 0x7F, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x49, 0x49, 0x49, 0x41, + 0x7F, 0x09, 0x09, 0x09, 0x01, + 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, + 0x00, 0x41, 0x7F, 0x41, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, + 0x7F, 0x08, 0x14, 0x22, 0x41, + 0x7F, 0x40, 0x40, 0x40, 0x40, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, + 0x7F, 0x04, 0x08, 0x10, 0x7F, + 0x3E, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x09, 0x09, 0x09, 0x06, + 0x3E, 0x41, 0x51, 0x21, 0x5E, + 0x7F, 0x09, 0x19, 0x29, 0x46, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, + 0x3F, 0x40, 0x40, 0x40, 0x3F, + 0x1F, 0x20, 0x40, 0x20, 0x1F, + 0x3F, 0x40, 0x38, 0x40, 0x3F, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x03, 0x04, 0x78, 0x04, 0x03, + 0x61, 0x59, 0x49, 0x4D, 0x43, + 0x00, 0x7F, 0x41, 0x41, 0x41, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x41, 0x7F, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, + 0x7F, 0x28, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x28, 0x7F, + 0x38, 0x54, 0x54, 0x54, 0x18, + 0x00, 0x08, 0x7E, 0x09, 0x02, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, + 0x7F, 0x08, 0x04, 0x04, 0x78, + 0x00, 0x44, 0x7D, 0x40, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, + 0x7C, 0x08, 0x04, 0x04, 0x78, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xFC, 0x18, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x18, 0xFC, + 0x7C, 0x08, 0x04, 0x04, 0x08, + 0x48, 0x54, 0x54, 0x54, 0x24, + 0x04, 0x04, 0x3F, 0x44, 0x24, + 0x3C, 0x40, 0x40, 0x20, 0x7C, + 0x1C, 0x20, 0x40, 0x20, 0x1C, + 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, + 0x4C, 0x90, 0x90, 0x90, 0x7C, + 0x44, 0x64, 0x54, 0x4C, 0x44, + 0x00, 0x08, 0x36, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, + 0x3C, 0x26, 0x23, 0x26, 0x3C, + 0x1E, 0xA1, 0xA1, 0x61, 0x12, + 0x3A, 0x40, 0x40, 0x20, 0x7A, + 0x38, 0x54, 0x54, 0x55, 0x59, + 0x21, 0x55, 0x55, 0x79, 0x41, + 0x21, 0x54, 0x54, 0x78, 0x41, + 0x21, 0x55, 0x54, 0x78, 0x40, + 0x20, 0x54, 0x55, 0x79, 0x40, + 0x0C, 0x1E, 0x52, 0x72, 0x12, + 0x39, 0x55, 0x55, 0x55, 0x59, + 0x39, 0x54, 0x54, 0x54, 0x59, + 0x39, 0x55, 0x54, 0x54, 0x58, + 0x00, 0x00, 0x45, 0x7C, 0x41, + 0x00, 0x02, 0x45, 0x7D, 0x42, + 0x00, 0x01, 0x45, 0x7C, 0x40, + 0xF0, 0x29, 0x24, 0x29, 0xF0, + 0xF0, 0x28, 0x25, 0x28, 0xF0, + 0x7C, 0x54, 0x55, 0x45, 0x00, + 0x20, 0x54, 0x54, 0x7C, 0x54, + 0x7C, 0x0A, 0x09, 0x7F, 0x49, + 0x32, 0x49, 0x49, 0x49, 0x32, + 0x32, 0x48, 0x48, 0x48, 0x32, + 0x32, 0x4A, 0x48, 0x48, 0x30, + 0x3A, 0x41, 0x41, 0x21, 0x7A, + 0x3A, 0x42, 0x40, 0x20, 0x78, + 0x00, 0x9D, 0xA0, 0xA0, 0x7D, + 0x39, 0x44, 0x44, 0x44, 0x39, + 0x3D, 0x40, 0x40, 0x40, 0x3D, + 0x3C, 0x24, 0xFF, 0x24, 0x24, + 0x48, 0x7E, 0x49, 0x43, 0x66, + 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, + 0xFF, 0x09, 0x29, 0xF6, 0x20, + 0xC0, 0x88, 0x7E, 0x09, 0x03, + 0x20, 0x54, 0x54, 0x79, 0x41, + 0x00, 0x00, 0x44, 0x7D, 0x41, + 0x30, 0x48, 0x48, 0x4A, 0x32, + 0x38, 0x40, 0x40, 0x22, 0x7A, + 0x00, 0x7A, 0x0A, 0x0A, 0x72, + 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, + 0x26, 0x29, 0x29, 0x29, 0x26, + 0x30, 0x48, 0x4D, 0x40, 0x20, + 0x38, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x38, + 0x2F, 0x10, 0xC8, 0xAC, 0xBA, + 0x2F, 0x10, 0x28, 0x34, 0xFA, + 0x00, 0x00, 0x7B, 0x00, 0x00, + 0x08, 0x14, 0x2A, 0x14, 0x22, + 0x22, 0x14, 0x2A, 0x14, 0x08, + 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code + 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block + 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block + 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x10, 0x10, 0x10, 0xFF, 0x00, + 0x14, 0x14, 0x14, 0xFF, 0x00, + 0x10, 0x10, 0xFF, 0x00, 0xFF, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x14, 0x14, 0x14, 0xFC, 0x00, + 0x14, 0x14, 0xF7, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x14, 0x14, 0xF4, 0x04, 0xFC, + 0x14, 0x14, 0x17, 0x10, 0x1F, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0xF0, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x14, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0x10, 0x17, + 0x00, 0x00, 0xFC, 0x04, 0xF4, + 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, + 0x00, 0x00, 0xFF, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xF7, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x17, 0x14, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0xF4, 0x14, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x00, 0x00, 0x1F, 0x10, 0x1F, + 0x00, 0x00, 0x00, 0x1F, 0x14, + 0x00, 0x00, 0x00, 0xFC, 0x14, + 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, + 0x10, 0x10, 0x10, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x10, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x38, 0x44, 0x44, 0x38, 0x44, + 0x7C, 0x2A, 0x2A, 0x3E, 0x14, + 0x7E, 0x02, 0x02, 0x06, 0x06, + 0x02, 0x7E, 0x02, 0x7E, 0x02, + 0x63, 0x55, 0x49, 0x41, 0x63, + 0x38, 0x44, 0x44, 0x3C, 0x04, + 0x40, 0x7E, 0x20, 0x1E, 0x20, + 0x06, 0x02, 0x7E, 0x02, 0x02, + 0x99, 0xA5, 0xE7, 0xA5, 0x99, + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, + 0x4C, 0x72, 0x01, 0x72, 0x4C, + 0x30, 0x4A, 0x4D, 0x4D, 0x30, + 0x30, 0x48, 0x78, 0x48, 0x30, + 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, + 0x7E, 0x01, 0x01, 0x01, 0x7E, + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, + 0x44, 0x44, 0x5F, 0x44, 0x44, + 0x40, 0x51, 0x4A, 0x44, 0x40, + 0x40, 0x44, 0x4A, 0x51, 0x40, + 0x00, 0x00, 0xFF, 0x01, 0x03, + 0xE0, 0x80, 0xFF, 0x00, 0x00, + 0x08, 0x08, 0x6B, 0x6B, 0x08, + 0x36, 0x12, 0x36, 0x24, 0x36, + 0x06, 0x0F, 0x09, 0x0F, 0x06, + 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, + 0x30, 0x40, 0xFF, 0x01, 0x01, + 0x00, 0x1F, 0x01, 0x01, 0x1E, + 0x00, 0x19, 0x1D, 0x17, 0x12, + 0x00, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif // FONT5X7_H diff --git a/libraries/TFT_eSPI/Kconfig b/libraries/TFT_eSPI/Kconfig new file mode 100644 index 0000000..2e21c90 --- /dev/null +++ b/libraries/TFT_eSPI/Kconfig @@ -0,0 +1,407 @@ +menu "TFT_eSPI" + + menu "Hidden menu" + visible if false + + config TFT_eSPI_ESPIDF + bool "Enable Configuration" + default y + endmenu + + choice TFT_DRIVER + prompt "Select TFT driver" + default TFT_ILI9341_DRIVER + help + Driver for the TFT LCD screen + + config TFT_ILI9341_DRIVER + bool "ILI9341 - 1" + help + Generic driver for common displays + config TFT_ILI9341_2_DRIVER + bool "ILI9341 - 2" + help + Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172 + config TFT_ST7735_DRIVER + bool "ST7735" + help + Define additional parameters below for this display + config TFT_ILI9163_DRIVER + bool "ILI9163" + help + Define additional parameters below for this display + config TFT_S6D02A1_DRIVER + bool "S6D02A1" + config TFT_HX8357D_DRIVER + bool "HX8357D" + config TFT_ILI9481_DRIVER + bool "ILI9481" + config TFT_ILI9486_DRIVER + bool "ILI9486" + config TFT_ILI9488_DRIVER + bool "ILI9488" + help + WARNING: Do not connect ILI9488 display SDO to MISO if other devices + share the SPI bus (TFT SDO does NOT tristate when CS is high) + config TFT_ST7789_DRIVER + bool "ST7789 - 1" + help + Full configuration option, define additional parameters below for this display + config TFT_ST7789_2_DRIVER + bool "ST7789 - 2" + help + Minimal configuration option, define additional parameters below for this display + config TFT_R61581_DRIVER + bool "R61581" + config TFT_RM68140_DRIVER + bool "RM68140" + config TFT_ST7796_DRIVER + bool "ST7796" + config TFT_SSD1351_DRIVER + bool "SSD1351" + config TFT_SSD1963_480_DRIVER + bool "SSD1963_480" + config TFT_SSD1963_800_DRIVER + bool "SSD1963_800" + config TFT_SSD1963_800ALT_DRIVER + bool "SSD1963_800ALT" + config TFT_ILI9225_DRIVER + bool "ILI9225" + config TFT_GC9A01_DRIVER + bool "GC9A01" + endchoice + + if TFT_ST7735_DRIVER || TFT_ST7789_DRIVER || TFT_ST7789_2_DRIVER || TFT_ILI9341_DRIVER || TFT_ILI9341_2_DRIVER + choice TFT_COLOR_ORDER + prompt "Define the colour order" + help + Define the colour order IF the blue and red are swapped on your display + + config TFT_RGB_ORDER + bool "RGB" + config TFT_BGR_ORDER + bool "BGR" + endchoice + endif + + config TFT_M5STACK + bool "M5Stack" + depends on TFT_ILI9341_DRIVER || TFT_ILI9341_2_DRIVER + help + Enable if using M5Stack module with integrated ILI9341 + + if TFT_ST7735_DRIVER || TFT_ST7789_DRIVER || TFT_ST7789_2_DRIVER || TFT_ILI9163_DRIVER || TFT_GC9A01_DRIVER + config TFT_WIDTH + int "LCD pixel width in portrait orientation" + default 128 + range 0 1024 + + config TFT_HEIGHT + int "LCD pixel height in portrait orientation" + default 240 + range 0 1024 + endif + + if TFT_ST7735_DRIVER + choice TFT_ST7735_TYPE + prompt "Define the type of display" + help + Try out the different options below if the screen does not display graphics + correctly,e.g. colours wrong, mirror images, or stray pixels at the edges. + + config TFT_ST7735_INITB + bool "INITB" + config TFT_ST7735_GREENTAB + bool "GREENTAB" + config TFT_ST7735_GREENTAB2 + bool "GREENTAB2" + config TFT_ST7735_GREENTAB3 + bool "GREENTAB3" + config TFT_ST7735_GREENTAB128 + bool "GREENTAB128" + help + For 128 x 128 display + config TFT_ST7735_GREENTAB160x80 + bool "GREENTAB160x80" + help + For 160 x 80 display (BGR, inverted, 26 offset) + config TFT_ST7735_REDTAB + bool "REDTAB" + config TFT_ST7735_BLACKTAB + bool "BLACKTAB" + config TFT_ST7735_REDTAB160x80 + bool "REDTAB160x80" + help + For 160 x 80 display with 24 pixel offset + endchoice + endif + + choice TFT_COLOR_INVERSION + prompt "Color inversion correction" + help + If colours are inverted (white shows as black) then try changing this option." + + config TFT_INVERSION_DISABLE + bool "None" + config TFT_INVERSION_ON + bool "On" + config TFT_INVERSION_OFF + bool "Off" + + endchoice + + choice TFT_INTERFACE + prompt "LCD Interface" + default TFT_SPI + help + Communication interface between the microcontroller and the LCD. + config TFT_SPI + bool "SPI" + config TFT_PARALLEL_8_BIT + bool "Parallel (8-bit)" + endchoice + + menu "Display Data pins" + depends on TFT_PARALLEL_8_BIT + config TFT_D0 + int "Data 0 pin" + default -1 + range -1 31 + + config TFT_D1 + int "Data 1 pin" + default -1 + range -1 31 + + config TFT_D2 + int "Data 2 pin" + default -1 + range -1 31 + + config TFT_D3 + int "Data 3 pin" + default -1 + range -1 31 + + config TFT_D4 + int "Data 4 pin" + default -1 + range -1 31 + + config TFT_D5 + int "Data 5 pin" + default -1 + range -1 31 + + config TFT_D6 + int "Data 6 pin" + default -1 + range -1 31 + + config TFT_D7 + int "Data 7 pin" + default -1 + range -1 31 + + config TFT_WR + int "Write strobe pin" + default -1 + range -1 31 + + config TFT_RD + int "Read strobe pin" + default -1 + range -1 33 + endmenu + + menu "Display SPI config" + depends on TFT_SPI + + choice TFT_SPI_PORT + prompt "SPI port" + default TFT_VSPI_PORT + help + The ESP32 has 2 free SPI ports i.e. VSPI (SPI2) and HSPI (SPI3), + the VSPI is the default. If the VSPI port is in use and pins are + not accessible (e.g. TTGO T-Beam) then use the HSPI port for the + TFT display. + config TFT_VSPI_PORT + bool "VSPI (SPI2)" + config TFT_HSPI_PORT + bool "HSPI (SPI3)" + endchoice + + config TFT_MISO + int "TFT MISO pin" + default -1 + range -1 32 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + help + Master In Slave Out pin. + Can be labelled as SDO in some displays + + config TFT_MOSI + int "TFT MOSI pin" + default -1 + range -1 32 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + help + Master Out Slave In pin. + Can be labelled as SDA or SDI in some displays + + config TFT_SCLK + int "TFT Clock pin" + default -1 + range -1 32 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + help + Labelled in some displays as WR + + config TFT_SDA_READ + bool "Use SDA line for reading" + default "n" + help + Some displays support SPI reads via the MISO pin, other displays have a single + bi-directional SDA pin and the library will try to read this via the MOSI line + + config TFT_SPI_FREQUENCY + int "SPI Frequency (Hz)" + default 27000000 + range 1 80000000 + help + Define the SPI clock frequency, this affects the graphics rendering speed. Too + fast and the TFT driver will not keep up and display corruption appears. + With an ILI9341 display 40MHz works OK, 80MHz sometimes fails + With a ST7735 display more than 27MHz may not work (spurious pixels and lines) + With an ILI9163 display 27 MHz works OK. + + config TFT_SPI_READ_FREQ + int "SPI Read Frequency (Hz)" + default 20000000 + range -1 80000000 + help + Optional reduced SPI frequency for reading TFT. + Set to -1 to use the default frequency + + endmenu + + menu "Control Pin configuration" + config TFT_CS + int "TFT Chip Select pin" + default -1 + range -1 33 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + + config TFT_DC + int "TFT Data/Command pin" + default -1 + range -1 31 + help + Labelled as DC or RS (Register Select) in some displays + + config TFT_RST + int "TFT Reset pin" + default -1 + range -1 33 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + + config ENABLE_BL + bool "Enable backlight control" + default y + + if ENABLE_BL + config TFT_BL + int "TFT Backlight pin" + default -1 + range -1 33 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + help + Pin for the backlight control signal + + choice TFT_BACKLIGHT_ON + bool "Pin state to activate backlight" + default TFT_BACKLIGHT_ON_HIGH + help + The backlight will be turned ON when tft.begin() is called, but the library + needs to know if the LEDs are ON with the pin HIGH or LOW. + + config TFT_BACKLIGHT_ON_HIGH + bool "HIGH" + config TFT_BACKLIGHT_ON_LOW + bool "LOW" + endchoice + endif + + config TFT_BACKLIGHT_ON + int + default 1 if TFT_BACKLIGHT_ON_HIGH + default 0 if TFT_BACKLIGHT_ON_LOW + endmenu + + menu "Fonts" + config TFT_LOAD_GLCD + bool "Font 1: Original Adafruit 8 pixel font needs ~1820 bytes in FLASH" + default "y" + + config TFT_LOAD_FONT2 + bool "Font 2: Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters" + default "y" + + config TFT_LOAD_FONT4 + bool "Font 4: Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters" + default "y" + + config TFT_LOAD_FONT6 + bool "Font 6: Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm" + default "y" + + config TFT_LOAD_FONT7 + bool "Font 7: 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:." + default "y" + + config TFT_LOAD_FONT8 + bool "Font 8: Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-." + default "y" + + config TFT_LOAD_GFXFF + bool "FreeFonts: Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts" + default "y" + + config TFT_SMOOTH_FONT + bool "Smooth Fonts" + default "y" + endmenu + + menu "Touch screen configuration" + config ENABLE_TOUCH + bool "Enable Touch" + default n + + if ENABLE_TOUCH + config TOUCH_CS + int "Touch chip select pin" + default -1 + range -1 33 if IDF_TARGET_ESP32 + range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 + + config SPI_TOUCH_FREQUENCY + int "SPI frequency for XPT2046 chip (Hz)" + default 2500000 + range 1 80000000 + endif + endmenu + + menu "Other settings" + config DISABLE_WARNINGS + bool "Disable Library warnings" + default n + endmenu + +endmenu diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.c new file mode 100644 index 0000000..faf3034 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.c @@ -0,0 +1,854 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +// Select the SPI port to use, ESP32 has 2 options +#if !defined (TFT_PARALLEL_8_BIT) + #ifdef CONFIG_IDF_TARGET_ESP32 + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use default VSPI port + SPIClass spi = SPIClass(VSPI); + #endif + #else + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use FSPI port + SPIClass& spi = SPI; + #endif + #endif +#endif + +#ifdef ESP32_DMA + // DMA SPA handle + spi_device_handle_t dmaHAL; + #ifdef CONFIG_IDF_TARGET_ESP32 + #define DMA_CHANNEL 1 + #ifdef USE_HSPI_PORT + spi_host_device_t spi_host = HSPI_HOST; + #elif defined(USE_FSPI_PORT) + spi_host_device_t spi_host = SPI_HOST; + #else // use VSPI port + spi_host_device_t spi_host = VSPI_HOST; + #endif + #else + #ifdef USE_HSPI_PORT + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI3_HOST; // Draws once then freezes + #else // use FSPI port + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI2_HOST; // Draws once then freezes + #endif + #endif +#endif + +#if !defined (TFT_PARALLEL_8_BIT) + // Volatile for register reads: + volatile uint32_t* _spi_cmd = (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)); + volatile uint32_t* _spi_user = (volatile uint32_t*)(SPI_USER_REG(SPI_PORT)); + // Register writes only: + volatile uint32_t* _spi_mosi_dlen = (volatile uint32_t*)(SPI_MOSI_DLEN_REG(SPI_PORT)); + volatile uint32_t* _spi_w = (volatile uint32_t*)(SPI_W0_REG(SPI_PORT)); +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: beginSDA - VSPI port only, FPSI port only for S2 +** Description: Detach MOSI and attach MISO to SDA for reads +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + #else // S2 + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); + #endif + SET_BUS_READ_MODE; +} + +/*************************************************************************************** +** Function name: endSDA - VSPI port only, FPSI port only for S2 +** Description: Attach MOSI to SDA and detach MISO for writes +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); + #else // S2 + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); + #endif + SET_BUS_WRITE_MODE; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Read a byte from ESP32 8-bit data port +***************************************************************************************/ +// Parallel bus MUST be set to input before calling this function! +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0xAA; + +#if defined (TFT_PARALLEL_8_BIT) + RD_L; + uint32_t reg; // Read all GPIO pins 0-31 + reg = gpio_input_get(); // Read three times to allow for bus access time + reg = gpio_input_get(); + reg = gpio_input_get(); // Data should be stable now + RD_H; + + // Check GPIO bits used and build value + b = (((reg>>TFT_D0)&1) << 0); + b |= (((reg>>TFT_D1)&1) << 1); + b |= (((reg>>TFT_D2)&1) << 2); + b |= (((reg>>TFT_D3)&1) << 3); + b |= (((reg>>TFT_D4)&1) << 4); + b |= (((reg>>TFT_D5)&1) << 5); + b |= (((reg>>TFT_D6)&1) << 6); + b |= (((reg>>TFT_D7)&1) << 7); +#endif + + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ + // Arduino generic native function + pinMode(TFT_D0, mode); + pinMode(TFT_D1, mode); + pinMode(TFT_D2, mode); + pinMode(TFT_D3, mode); + pinMode(TFT_D4, mode); + pinMode(TFT_D5, mode); + pinMode(TFT_D6, mode); + pinMode(TFT_D7, mode); +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set ESP32 GPIO pin to input or output (set high) ASAP +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + pinMode(gpio, mode); + digitalWrite(gpio, HIGH); +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (RPI_WRITE_STROBE) && !defined (TFT_PARALLEL_8_BIT) // Code for RPi TFT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or ESP8266 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; + if(len) spi.writePattern(&colorBin[0], 2, 1); len--; + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or ESP8266 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint8_t *data = (uint8_t*)data_in; + + if(_swapBytes) { + while ( len-- ) {tft_Write_16(*data); data++;} + return; + } + + while ( len >=64 ) {spi.writePattern(data, 64, 1); data += 64; len -= 64; } + if (len) spi.writePattern(data, len, 1); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif !defined (SPI_18BIT_DRIVER) && !defined (TFT_PARALLEL_8_BIT) // Most SPI displays +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +/* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + bool empty = true; + volatile uint32_t* spi_w = (volatile uint32_t*)_spi_w; + if (len > 31) + { + *_spi_mosi_dlen = 511; + spi_w[0] = color32; + spi_w[1] = color32; + spi_w[2] = color32; + spi_w[3] = color32; + spi_w[4] = color32; + spi_w[5] = color32; + spi_w[6] = color32; + spi_w[7] = color32; + spi_w[8] = color32; + spi_w[9] = color32; + spi_w[10] = color32; + spi_w[11] = color32; + spi_w[12] = color32; + spi_w[13] = color32; + spi_w[14] = color32; + spi_w[15] = color32; + while(len>31) + { + while ((*_spi_cmd)&SPI_USR); + *_spi_cmd = SPI_USR; + len -= 32; + } + empty = false; + } + + if (len) + { + if(empty) { + for (uint32_t i=0; i <= len; i+=2) *spi_w++ = color32; + } + len = (len << 4) - 1; + while (*_spi_cmd&SPI_USR); + *_spi_mosi_dlen = len; + *_spi_cmd = SPI_USR; + } + while ((*_spi_cmd)&SPI_USR); // Move to later in code to use transmit time usefully? +} +//*/ +//* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + volatile uint32_t* spi_w = _spi_w; + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + uint32_t i = 0; + uint32_t rem = len & 0x1F; + len = len - rem; + + // Start with partial buffer pixels + if (rem) + { + while (*_spi_cmd&SPI_USR); + for (i=0; i < rem; i+=2) *spi_w++ = color32; + *_spi_mosi_dlen = (rem << 4) - 1; + *_spi_cmd = SPI_USR; + if (!len) return; //{while (*_spi_cmd&SPI_USR); return; } + i = i>>1; while(i++<16) *spi_w++ = color32; + } + + while (*_spi_cmd&SPI_USR); + if (!rem) while (i++<16) *spi_w++ = color32; + *_spi_mosi_dlen = 511; + + // End with full buffer to maximise useful time for downstream code + while(len) + { + while (*_spi_cmd&SPI_USR); + *_spi_cmd = SPI_USR; + len -= 32; + } + + // Do not wait here + //while (*_spi_cmd&SPI_USR); +} +//*/ +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint8_t* data = (uint8_t*)data_in; + uint32_t color[16]; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + uint32_t i = 0; + while(i<16) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), color[8]); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), color[9]); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), color[10]); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), color[11]); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), color[12]); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), color[13]); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), color[14]); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), color[15]); + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len > 15) + { + uint32_t i = 0; + while(i<8) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 255); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 16; + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) { + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT)+i, DAT8TO32(data)); data+=4; + } + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + if(_swapBytes) { + pushSwapBytePixels(data_in, len); + return; + } + + uint32_t *data = (uint32_t*)data_in; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), *data++); + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) WRITE_PERI_REG((SPI_W0_REG(SPI_PORT) + i), *data++); + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + // Split out the colours + uint32_t r = (color & 0xF800)>>8; + uint32_t g = (color & 0x07E0)<<5; + uint32_t b = (color & 0x001F)<<19; + // Concatenate 4 pixels into three 32-bit blocks + uint32_t r0 = r<<24 | b | g | r; + uint32_t r1 = r0>>8 | g<<16; + uint32_t r2 = r1>>8 | b<<8; + + if (len > 19) + { + SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(SPI_PORT), SPI_USR_MOSI_DBITLEN, 479, SPI_USR_MOSI_DBITLEN_S); + + while(len>19) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 20; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } + + if (len) + { + SET_PERI_REG_BITS(SPI_MOSI_DLEN_REG(SPI_PORT), SPI_USR_MOSI_DBITLEN, (len * 24) - 1, SPI_USR_MOSI_DBITLEN_S); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + if (len > 8 ) + { + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); + } + + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, hence !_swapBytes + if(!_swapBytes) { while ( len-- ) {tft_Write_16S(*data); data++;} } + else { while ( len-- ) {tft_Write_16(*data); data++;} } +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, so swap byte macro not used here + while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and parallel display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + #if defined (SSD1963_DRIVER) + if ( ((color & 0xF800)>> 8) == ((color & 0x07E0)>> 3) && ((color & 0xF800)>> 8)== ((color & 0x001F)<< 3) ) + #else + if ( (color >> 8) == (color & 0x00FF) ) + #endif + { if (!len) return; + tft_Write_16(color); + #if defined (SSD1963_DRIVER) + while (--len) {WR_L; WR_H; WR_L; WR_H; WR_L; WR_H;} + #else + #ifdef PSEUDO_16_BIT + while (--len) {WR_L; WR_H;} + #else + while (--len) {WR_L; WR_H; WR_L; WR_H;} + #endif + #endif + } + else while (len--) {tft_Write_16(color);} +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and parallel display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + while ( len-- ) {tft_Write_16(*data); data++;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if(_swapBytes) { while ( len-- ) {tft_Write_16(*data); data++; } } + else { while ( len-- ) {tft_Write_16S(*data); data++;} } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (ESP32_DMA) && !defined (TFT_PARALLEL_8_BIT) // DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: dmaBusy +** Description: Check if DMA is busy +***************************************************************************************/ +bool TFT_eSPI::dmaBusy(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return false; + + spi_transaction_t *rtrans; + esp_err_t ret; + uint8_t checks = spiBusyCheck; + for (int i = 0; i < checks; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, 0); + if (ret == ESP_OK) spiBusyCheck--; + } + + //Serial.print("spiBusyCheck=");Serial.println(spiBusyCheck); + if (spiBusyCheck ==0) return false; + return true; +} + + +/*************************************************************************************** +** Function name: dmaWait +** Description: Wait until DMA is over (blocking!) +***************************************************************************************/ +void TFT_eSPI::dmaWait(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return; + spi_transaction_t *rtrans; + esp_err_t ret; + for (int i = 0; i < spiBusyCheck; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, portMAX_DELAY); + assert(ret == ESP_OK); + } + spiBusyCheck = 0; +} + + +/*************************************************************************************** +** Function name: pushPixelsDMA +** Description: Push pixels to TFT (len must be less than 32767) +***************************************************************************************/ +// This will byte swap the original image if setSwapBytes(true) was called by sketch. +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +{ + if ((len == 0) || (!DMA_Enabled)) return; + + dmaWait(); + + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); + } + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = image; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// Fixed const data assumed, will NOT clip or swap bytes +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t const* image) +{ + if ((w == 0) || (h == 0) || (!DMA_Enabled)) return; + + uint32_t len = w*h; + + dmaWait(); + + setAddrWindow(x, y, w, h); + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = image; //Data pointer + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// This will clip and also swap bytes if setSwapBytes(true) was called by sketch +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image, uint16_t* buffer) +{ + if ((x >= _vpW) || (y >= _vpH) || (!DMA_Enabled)) return; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return; + + uint32_t len = dw*dh; + + if (buffer == nullptr) { + buffer = image; + dmaWait(); + } + + // If image is clipped, copy pixels into a contiguous block + if ( (dw != w) || (dh != h) ) { + if(_swapBytes) { + for (int32_t yb = 0; yb < dh; yb++) { + for (int32_t xb = 0; xb < dw; xb++) { + uint32_t src = xb + dx + w * (yb + dy); + (buffer[xb + yb * dw] = image[src] << 8 | image[src] >> 8); + } + } + } + else { + for (int32_t yb = 0; yb < dh; yb++) { + memcpy((uint8_t*) (buffer + yb * dw), (uint8_t*) (image + dx + w * (yb + dy)), dw << 1); + } + } + } + // else, if a buffer pointer has been provided copy whole image to the buffer + else if (buffer != image || _swapBytes) { + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (buffer[i] = image[i] << 8 | image[i] >> 8); + } + else { + memcpy(buffer, image, len*2); + } + } + + if (spiBusyCheck) dmaWait(); // In case we did not wait earlier + + setAddrWindow(x, y, dw, dh); + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = buffer; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// Processor specific DMA initialisation +//////////////////////////////////////////////////////////////////////////////////////// + +// The DMA functions here work with SPI only (not parallel) +/*************************************************************************************** +** Function name: dc_callback +** Description: Toggles DC line during transaction +***************************************************************************************/ +extern "C" void dc_callback(); + +void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) +{ + if ((bool)spi_tx->user) {DC_D;} + else {DC_C;} +} + +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + if (DMA_Enabled) return false; + + esp_err_t ret; + spi_bus_config_t buscfg = { + .mosi_io_num = TFT_MOSI, + .miso_io_num = TFT_MISO, + .sclk_io_num = TFT_SCLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + #ifdef xCONFIG_IDF_TARGET_ESP32S2 + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + #endif + .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size + .flags = 0, + .intr_flags = 0 + }; + + int8_t pin = -1; + if (ctrl_cs) pin = TFT_CS; + + spi_device_interface_config_t devcfg = { + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode = TFT_SPI_MODE, + .duty_cycle_pos = 0, + .cs_ena_pretrans = 0, + .cs_ena_posttrans = 0, + .clock_speed_hz = SPI_FREQUENCY, + .input_delay_ns = 0, + .spics_io_num = pin, + .flags = SPI_DEVICE_NO_DUMMY, //0, + .queue_size = 1, + .pre_cb = 0, //dc_callback, //Callback to handle D/C line + #ifdef CONFIG_IDF_TARGET_ESP32 + .post_cb = 0 + #else + .post_cb = dma_end_callback + #endif + }; + ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); + ESP_ERROR_CHECK(ret); + ret = spi_bus_add_device(spi_host, &devcfg, &dmaHAL); + ESP_ERROR_CHECK(ret); + + DMA_Enabled = true; + spiBusyCheck = 0; + return true; +} + +/*************************************************************************************** +** Function name: deInitDMA +** Description: Disconnect the DMA engine from SPI +***************************************************************************************/ +void TFT_eSPI::deInitDMA(void) +{ + if (!DMA_Enabled) return; + spi_bus_remove_device(dmaHAL); + spi_bus_free(spi_host); + DMA_Enabled = false; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.h new file mode 100644 index 0000000..ad60e3d --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32.h @@ -0,0 +1,591 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +#ifndef _TFT_eSPI_ESP32H_ +#define _TFT_eSPI_ESP32H_ + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x32 + +// Include processor specific header +#include "soc/spi_reg.h" +#include "driver/spi_master.h" +#include "hal/gpio_ll.h" + +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) + #define CONFIG_IDF_TARGET_ESP32 +#endif + +// Fix IDF problems with ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 + // Fix ESP32C3 IDF bug for missing definition + #ifndef REG_SPI_BASE + #define REG_SPI_BASE(i) (DR_REG_SPI1_BASE + (((i)>1) ? (((i)* 0x1000) + 0x20000) : (((~(i)) & 1)* 0x1000 ))) + #endif + + // Fix ESP32C3 IDF bug for name change + #ifndef SPI_MOSI_DLEN_REG + #define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x) + #endif + + // Fix ESP32C3 specific register reference + #define out_w1tc out_w1tc.val + #define out_w1ts out_w1ts.val +#endif + +// SUPPORT_TRANSACTIONS is mandatory for ESP32 so the hal mutex is toggled +#if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS +#endif + +/* +ESP32: +FSPI not defined +HSPI = 2, uses SPI2 +VSPI = 3, uses SPI3 + +ESP32-S2: +FSPI = 1, uses SPI2 +HSPI = 2, uses SPI3 +VSPI not defined + +ESP32 C3: +FSPI = 0, uses SPI2 ???? To be checked +HSPI = 1, uses SPI3 ???? To be checked +VSPI not defined + +For ESP32/S2/C3: +SPI1_HOST = 0 +SPI2_HOST = 1 +SPI3_HOST = 2 +*/ + +// ESP32 specific SPI port selection +#ifdef USE_HSPI_PORT + #ifdef CONFIG_IDF_TARGET_ESP32 + #define SPI_PORT HSPI //HSPI is port 2 on ESP32 + #else + #define SPI_PORT 3 //HSPI is port 3 on ESP32 S2 + #endif +#elif defined(USE_FSPI_PORT) + #define SPI_PORT 2 //FSPI(ESP32 S2) +#else + #ifdef CONFIG_IDF_TARGET_ESP32 + #define SPI_PORT VSPI + #else + #define SPI_PORT 2 //FSPI(ESP32 S2) + #endif +#endif + +#ifdef RPI_DISPLAY_TYPE + #define CMD_BITS (16-1) +#else + #define CMD_BITS (8-1) +#endif + +// Initialise processor specific SPI functions, used by init() +#define INIT_TFT_DATA_BUS // Not used + +// Define a generic flag for 8-bit parallel +#if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility + #if !defined (TFT_PARALLEL_8_BIT) + #define TFT_PARALLEL_8_BIT // Generic parallel flag + #endif +#endif + +// Ensure ESP32 specific flag is defined for 8-bit parallel +#if defined (TFT_PARALLEL_8_BIT) + #if !defined (ESP32_PARALLEL) + #define ESP32_PARALLEL + #endif +#endif + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#if !defined (ESP32_PARALLEL) + #if (TFT_SPI_MODE == SPI_MODE1) || (TFT_SPI_MODE == SPI_MODE2) + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI | SPI_CK_OUT_EDGE + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN | SPI_CK_OUT_EDGE + #else + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN + #endif +#else + // Not applicable to parallel bus + #define SET_BUS_WRITE_MODE + #define SET_BUS_READ_MODE +#endif + +// Code to check if DMA is busy, used by SPI bus transaction transaction and endWrite functions +#if !defined(TFT_PARALLEL_8_BIT) && !defined(SPI_18BIT_DRIVER) + #define ESP32_DMA + // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions + #define DMA_BUSY_CHECK dmaWait() +#else + #define DMA_BUSY_CHECK +#endif + +#if defined(TFT_PARALLEL_8_BIT) + #define SPI_BUSY_CHECK +#else + #define SPI_BUSY_CHECK while (*_spi_cmd&SPI_USR) +#endif + +// If smooth font is used then it is likely SPIFFS will be needed +#ifdef SMOOTH_FONT + // Call up the SPIFFS (SPI FLASH Filing System) for the anti-aliased fonts + #define FS_NO_GLOBALS + #include + #include "SPIFFS.h" // ESP32 only + #define FONT_FS_AVAILABLE +#endif + + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + // TFT_DC, by design, must be in range 0-31 for single register parallel write + #if (TFT_DC >= 0) && (TFT_DC < 32) + #define DC_C GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC- 32)) + #else + #define DC_C + #define DC_D + #endif + #else + #if (TFT_DC >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi displays need a slower DC change + #define DC_C GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)); \ + GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)); \ + GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)) + #else + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)) + #endif + #elif (TFT_DC >= 0) + #if defined (RPI_DISPLAY_TYPE) + #if defined (ILI9486_DRIVER) + // RPi ILI9486 display needs a slower DC change + #define DC_C GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1ts = (1 << TFT_DC) + #else + // Other RPi displays need a slower C->D change + #define DC_C GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1ts = (1 << TFT_DC) + #endif + #else + #define DC_C GPIO.out_w1tc = (1 << TFT_DC)//;GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts = (1 << TFT_DC)//;GPIO.out_w1ts = (1 << TFT_DC) + #endif + #else + #define DC_C + #define DC_D + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define TFT_CS -1 // Keep DMA code happy + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + #if TFT_CS >= 32 + #define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #elif TFT_CS >= 0 + #define CS_L GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts = (1 << TFT_CS) + #else + #define CS_L + #define CS_H + #endif + #else + #if (TFT_CS >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)); \ + GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); \ + GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #else + #define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #endif + #elif (TFT_CS >= 0) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out_w1ts = (1 << TFT_CS); GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1tc = (1 << TFT_CS); GPIO.out_w1ts = (1 << TFT_CS) + #else + #define CS_L GPIO.out_w1tc = (1 << TFT_CS); GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts = (1 << TFT_CS)//;GPIO.out_w1ts = (1 << TFT_CS) + #endif + #else + #define CS_L + #define CS_H + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_WR) + #if (TFT_WR >= 32) + // Note: it will be ~1.25x faster if the TFT_WR pin uses a GPIO pin lower than 32 + #define WR_L GPIO.out1_w1tc.val = (1 << (TFT_WR - 32)) + #define WR_H GPIO.out1_w1ts.val = (1 << (TFT_WR - 32)) + #elif (TFT_WR >= 0) + // TFT_WR, for best performance, should be in range 0-31 for single register parallel write + #define WR_L GPIO.out_w1tc = (1 << TFT_WR) + #define WR_H GPIO.out_w1ts = (1 << TFT_WR) + #else + #define WR_L + #define WR_H + #endif +#else + #define WR_L + #define WR_H +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TOUCH_CS + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else // XPT2046 is slow, so use slower digitalWrite here + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure SPI default pins are assigned if not specified by user or set to -1 +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + + #ifdef USE_HSPI_PORT + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 13 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 13 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 14 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 14 + #endif + + #else // VSPI port + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 23 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 23 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 18 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 18 + #endif + + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if (TFT_MISO == -1) + #undef TFT_MISO + #define TFT_MISO TFT_MOSI + #endif + #endif + + #endif + +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the parallel bus interface chip pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_PARALLEL_8_BIT) + + // Create a bit set lookup table for data bus - wastes 1kbyte of RAM but speeds things up dramatically + // can then use e.g. GPIO.out_w1ts = set_mask(0xFF); to set data bus to 0xFF + #define PARALLEL_INIT_TFT_DATA_BUS \ + for (int32_t c = 0; c<256; c++) \ + { \ + xset_mask[c] = 0; \ + if ( c & 0x01 ) xset_mask[c] |= (1 << TFT_D0); \ + if ( c & 0x02 ) xset_mask[c] |= (1 << TFT_D1); \ + if ( c & 0x04 ) xset_mask[c] |= (1 << TFT_D2); \ + if ( c & 0x08 ) xset_mask[c] |= (1 << TFT_D3); \ + if ( c & 0x10 ) xset_mask[c] |= (1 << TFT_D4); \ + if ( c & 0x20 ) xset_mask[c] |= (1 << TFT_D5); \ + if ( c & 0x40 ) xset_mask[c] |= (1 << TFT_D6); \ + if ( c & 0x80 ) xset_mask[c] |= (1 << TFT_D7); \ + } \ + + // Mask for the 8 data bits to set pin directions + #define GPIO_DIR_MASK ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) + + #if (TFT_WR >= 32) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #elif (TFT_WR >= 0) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) + #else + #define GPIO_OUT_CLR_MASK + #endif + + // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM + #define set_mask(C) xset_mask[C] // 63fps Sprite rendering test 33% faster, graphicstest only 1.8% faster than shifting in real time + + // Real-time shifting alternative to above to save 1KByte RAM, 47 fps Sprite rendering test + /*#define set_mask(C) (((C)&0x80)>>7)<>6)<>5)<>4)<>3)<>2)<>1)<>0)<> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + #ifdef PSEUDO_16_BIT + // One write strobe for both bytes + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + #else + // Write 16 bits to TFT + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + #endif + + #endif + + // Write 32 bits to TFT + #define tft_Write_32(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 0)); WR_H + + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Read pin + #ifdef TFT_RD + #if (TFT_RD >= 32) + #define RD_L GPIO.out1_w1tc.val = (1 << (TFT_RD - 32)) + #define RD_H GPIO.out1_w1ts.val = (1 << (TFT_RD - 32)) + #elif (TFT_RD >= 0) + #define RD_L GPIO.out_w1tc = (1 << TFT_RD) + //#define RD_L digitalWrite(TFT_WR, LOW) + #define RD_H GPIO.out_w1ts = (1 << TFT_RD) + //#define RD_H digitalWrite(TFT_WR, HIGH) + #else + #define RD_L + #define RD_H + #endif + #else + #define TFT_RD -1 + #define RD_L + #define RD_H + #endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi.transfer(C) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ + spi.transfer(((C) & 0x07E0)>>3); \ + spi.transfer(((C) & 0x001F)<<3) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ + spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + spi.transfer(((C) & 0x1F00)>>5) + + // Write 32 bits to TFT + #define tft_Write_32(C) spi.write32(C) + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) + + // Write 16-bit value twice to TFT + #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to an Raspberry Pi TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_DISPLAY_TYPE) + + // ESP32 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) \ + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((C)<<24 | (C), 32); \ + TFT_WRITE_BITS((D)<<24 | (D), 32) + + // Write same value twice + #define tft_Write_32D(C) tft_Write_32C(C,C) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// +#else +/* Old macros + // ESP32 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) \ + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + + // Write same value twice + #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) +//*/ +//* Replacement slimmer macros + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ + *_spi_w = ((C)<<8 | (C)>>8); \ + *_spi_cmd = SPI_USR; + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + + // Write same value twice + #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + +//*/ +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + // Read from display using SPI or software SPI + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + +// Concatenate a byte sequence A,B,C,D to CDAB, P is a uint8_t pointer +#define DAT8TO32(P) ( (uint32_t)P[0]<<8 | P[1] | P[2]<<24 | P[3]<<16 ) + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c new file mode 100644 index 0000000..8c97a5f --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c @@ -0,0 +1,861 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +// Temporarily a separate file to TFT_eSPI_ESP32.c until board package low level API stabilises + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +// Select the SPI port to use, ESP32 has 2 options +#if !defined (TFT_PARALLEL_8_BIT) + #ifdef CONFIG_IDF_TARGET_ESP32 + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use default VSPI port + SPIClass spi = SPIClass(VSPI); + #endif + #else + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use FSPI port + SPIClass& spi = SPI; + #endif + #endif +#endif + +#ifdef ESP32_DMA + // DMA SPA handle + spi_device_handle_t dmaHAL; + #ifdef CONFIG_IDF_TARGET_ESP32 + #define DMA_CHANNEL 1 + #ifdef USE_HSPI_PORT + spi_host_device_t spi_host = HSPI_HOST; + #elif defined(USE_FSPI_PORT) + spi_host_device_t spi_host = SPI_HOST; + #else // use VSPI port + spi_host_device_t spi_host = VSPI_HOST; + #endif + #else + #ifdef USE_HSPI_PORT + #define DMA_CHANNEL 2 + spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #else // use FSPI port + #define DMA_CHANNEL 1 + spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #endif + #endif +#endif + +#if !defined (TFT_PARALLEL_8_BIT) + // Volatile for register reads: + volatile uint32_t* _spi_cmd = (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)); + volatile uint32_t* _spi_user = (volatile uint32_t*)(SPI_USER_REG(SPI_PORT)); + // Register writes only: + volatile uint32_t* _spi_mosi_dlen = (volatile uint32_t*)(SPI_MOSI_DLEN_REG(SPI_PORT)); + volatile uint32_t* _spi_w = (volatile uint32_t*)(SPI_W0_REG(SPI_PORT)); +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); + SET_BUS_READ_MODE; +} + +/*************************************************************************************** +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); + SET_BUS_WRITE_MODE; +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Read a byte from ESP32 8-bit data port +***************************************************************************************/ +// Parallel bus MUST be set to input before calling this function! +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0xAA; + +#if defined (TFT_PARALLEL_8_BIT) + RD_L; + uint32_t reg; // Read all GPIO pins 0-31 + reg = gpio_input_get(); // Read three times to allow for bus access time + reg = gpio_input_get(); + reg = gpio_input_get(); // Data should be stable now + RD_H; + + // Check GPIO bits used and build value + b = (((reg>>TFT_D0)&1) << 0); + b |= (((reg>>TFT_D1)&1) << 1); + b |= (((reg>>TFT_D2)&1) << 2); + b |= (((reg>>TFT_D3)&1) << 3); + b |= (((reg>>TFT_D4)&1) << 4); + b |= (((reg>>TFT_D5)&1) << 5); + b |= (((reg>>TFT_D6)&1) << 6); + b |= (((reg>>TFT_D7)&1) << 7); +#endif + + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ + // Arduino generic native function + pinMode(TFT_D0, mode); + pinMode(TFT_D1, mode); + pinMode(TFT_D2, mode); + pinMode(TFT_D3, mode); + pinMode(TFT_D4, mode); + pinMode(TFT_D5, mode); + pinMode(TFT_D6, mode); + pinMode(TFT_D7, mode); +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set ESP32 GPIO pin to input or output (set high) ASAP +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + pinMode(gpio, mode); + digitalWrite(gpio, HIGH); +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (RPI_WRITE_STROBE) && !defined (TFT_PARALLEL_8_BIT) // Code for RPi TFT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or ESP8266 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; + if(len) spi.writePattern(&colorBin[0], 2, 1); len--; + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or ESP8266 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint8_t *data = (uint8_t*)data_in; + + if(_swapBytes) { + while ( len-- ) {tft_Write_16(*data); data++;} + return; + } + + while ( len >=64 ) {spi.writePattern(data, 64, 1); data += 64; len -= 64; } + if (len) spi.writePattern(data, len, 1); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif !defined (SPI_18BIT_DRIVER) && !defined (TFT_PARALLEL_8_BIT) // Most SPI displays +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +/* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + bool empty = true; + volatile uint32_t* spi_w = (volatile uint32_t*)_spi_w; + if (len > 31) + { + *_spi_mosi_dlen = 511; + spi_w[0] = color32; + spi_w[1] = color32; + spi_w[2] = color32; + spi_w[3] = color32; + spi_w[4] = color32; + spi_w[5] = color32; + spi_w[6] = color32; + spi_w[7] = color32; + spi_w[8] = color32; + spi_w[9] = color32; + spi_w[10] = color32; + spi_w[11] = color32; + spi_w[12] = color32; + spi_w[13] = color32; + spi_w[14] = color32; + spi_w[15] = color32; + while(len>31) + { + while ((*_spi_cmd)&SPI_USR); + *_spi_cmd = SPI_USR; + len -= 32; + } + empty = false; + } + + if (len) + { + if(empty) { + for (uint32_t i=0; i <= len; i+=2) *spi_w++ = color32; + } + len = (len << 4) - 1; + while (*_spi_cmd&SPI_USR); + *_spi_mosi_dlen = len; + *_spi_cmd = SPI_USR; + } + while ((*_spi_cmd)&SPI_USR); // Move to later in code to use transmit time usefully? +} +//*/ +//* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + volatile uint32_t* spi_w = _spi_w; + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + uint32_t i = 0; + uint32_t rem = len & 0x1F; + len = len - rem; + + // Start with partial buffer pixels + if (rem) + { + while (*_spi_cmd&SPI_USR); + for (i=0; i < rem; i+=2) *spi_w++ = color32; + *_spi_mosi_dlen = (rem << 4) - 1; +#if CONFIG_IDF_TARGET_ESP32C3 + *_spi_cmd = SPI_UPDATE; + while (*_spi_cmd & SPI_UPDATE); +#endif + *_spi_cmd = SPI_USR; + if (!len) return; //{while (*_spi_cmd&SPI_USR); return; } + i = i>>1; while(i++<16) *spi_w++ = color32; + } + + while (*_spi_cmd&SPI_USR); + if (!rem) while (i++<16) *spi_w++ = color32; + *_spi_mosi_dlen = 511; + + // End with full buffer to maximise useful time for downstream code + while(len) + { + while (*_spi_cmd&SPI_USR); +#if CONFIG_IDF_TARGET_ESP32C3 + *_spi_cmd = SPI_UPDATE; + while (*_spi_cmd & SPI_UPDATE); +#endif + *_spi_cmd = SPI_USR; + len -= 32; + } + + // Do not wait here + //while (*_spi_cmd&SPI_USR); +} +//*/ +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint8_t* data = (uint8_t*)data_in; + uint32_t color[16]; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + uint32_t i = 0; + while(i<16) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), color[8]); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), color[9]); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), color[10]); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), color[11]); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), color[12]); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), color[13]); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), color[14]); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), color[15]); +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len > 15) + { + uint32_t i = 0; + while(i<8) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 255); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 16; + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) { + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT)+i, DAT8TO32(data)); data+=4; + } +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + if(_swapBytes) { + pushSwapBytePixels(data_in, len); + return; + } + + uint32_t *data = (uint32_t*)data_in; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), *data++); +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) WRITE_PERI_REG((SPI_W0_REG(SPI_PORT) + i), *data++); +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + // Split out the colours + uint32_t r = (color & 0xF800)>>8; + uint32_t g = (color & 0x07E0)<<5; + uint32_t b = (color & 0x001F)<<19; + // Concatenate 4 pixels into three 32-bit blocks + uint32_t r0 = r<<24 | b | g | r; + uint32_t r1 = r0>>8 | g<<16; + uint32_t r2 = r1>>8 | b<<8; + + if (len > 19) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 479); + + while(len>19) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 20; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } + + if (len) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len * 24) - 1); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + if (len > 8 ) + { + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); + } +#if CONFIG_IDF_TARGET_ESP32C3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, hence !_swapBytes + if(!_swapBytes) { while ( len-- ) {tft_Write_16S(*data); data++;} } + else { while ( len-- ) {tft_Write_16(*data); data++;} } +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, so swap byte macro not used here + while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and parallel display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + if ( (color >> 8) == (color & 0x00FF) ) + { if (!len) return; + tft_Write_16(color); + #if defined (SSD1963_DRIVER) + while (--len) {WR_L; WR_H; WR_L; WR_H; WR_L; WR_H;} + #else + #ifdef PSEUDO_16_BIT + while (--len) {WR_L; WR_H;} + #else + while (--len) {WR_L; WR_H; WR_L; WR_H;} + #endif + #endif + } + else while (len--) {tft_Write_16(color);} +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and parallel display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + while ( len-- ) {tft_Write_16(*data); data++;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if(_swapBytes) { while ( len-- ) {tft_Write_16(*data); data++; } } + else { while ( len-- ) {tft_Write_16S(*data); data++;} } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (ESP32_DMA) && !defined (TFT_PARALLEL_8_BIT) // DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: dmaBusy +** Description: Check if DMA is busy +***************************************************************************************/ +bool TFT_eSPI::dmaBusy(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return false; + + spi_transaction_t *rtrans; + esp_err_t ret; + uint8_t checks = spiBusyCheck; + for (int i = 0; i < checks; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, 0); + if (ret == ESP_OK) spiBusyCheck--; + } + + //Serial.print("spiBusyCheck=");Serial.println(spiBusyCheck); + if (spiBusyCheck ==0) return false; + return true; +} + + +/*************************************************************************************** +** Function name: dmaWait +** Description: Wait until DMA is over (blocking!) +***************************************************************************************/ +void TFT_eSPI::dmaWait(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return; + spi_transaction_t *rtrans; + esp_err_t ret; + for (int i = 0; i < spiBusyCheck; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, portMAX_DELAY); + assert(ret == ESP_OK); + } + spiBusyCheck = 0; +} + + +/*************************************************************************************** +** Function name: pushPixelsDMA +** Description: Push pixels to TFT (len must be less than 32767) +***************************************************************************************/ +// This will byte swap the original image if setSwapBytes(true) was called by sketch. +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +{ + if ((len == 0) || (!DMA_Enabled)) return; + + dmaWait(); + + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); + } + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = image; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// Fixed const data assumed, will NOT clip or swap bytes +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t const* image) +{ + if ((w == 0) || (h == 0) || (!DMA_Enabled)) return; + + uint32_t len = w*h; + + dmaWait(); + + setAddrWindow(x, y, w, h); + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = image; //Data pointer + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// This will clip and also swap bytes if setSwapBytes(true) was called by sketch +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image, uint16_t* buffer) +{ + if ((x >= _vpW) || (y >= _vpH) || (!DMA_Enabled)) return; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return; + + uint32_t len = dw*dh; + + if (buffer == nullptr) { + buffer = image; + dmaWait(); + } + + // If image is clipped, copy pixels into a contiguous block + if ( (dw != w) || (dh != h) ) { + if(_swapBytes) { + for (int32_t yb = 0; yb < dh; yb++) { + for (int32_t xb = 0; xb < dw; xb++) { + uint32_t src = xb + dx + w * (yb + dy); + (buffer[xb + yb * dw] = image[src] << 8 | image[src] >> 8); + } + } + } + else { + for (int32_t yb = 0; yb < dh; yb++) { + memcpy((uint8_t*) (buffer + yb * dw), (uint8_t*) (image + dx + w * (yb + dy)), dw << 1); + } + } + } + // else, if a buffer pointer has been provided copy whole image to the buffer + else if (buffer != image || _swapBytes) { + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (buffer[i] = image[i] << 8 | image[i] >> 8); + } + else { + memcpy(buffer, image, len*2); + } + } + + if (spiBusyCheck) dmaWait(); // In case we did not wait earlier + + setAddrWindow(x, y, dw, dh); + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = buffer; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// Processor specific DMA initialisation +//////////////////////////////////////////////////////////////////////////////////////// + +// The DMA functions here work with SPI only (not parallel) +/*************************************************************************************** +** Function name: dc_callback +** Description: Toggles DC line during transaction +***************************************************************************************/ +extern "C" void dc_callback(); + +void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) +{ + if ((bool)spi_tx->user) {DC_D;} + else {DC_C;} +} + +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + if (DMA_Enabled) return false; + + esp_err_t ret; + spi_bus_config_t buscfg = { + .mosi_io_num = TFT_MOSI, + .miso_io_num = TFT_MISO, + .sclk_io_num = TFT_SCLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size + .flags = 0, + .intr_flags = 0 + }; + + int8_t pin = -1; + if (ctrl_cs) pin = TFT_CS; + + spi_device_interface_config_t devcfg = { + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode = TFT_SPI_MODE, + .duty_cycle_pos = 0, + .cs_ena_pretrans = 0, + .cs_ena_posttrans = 0, + .clock_speed_hz = SPI_FREQUENCY, + .input_delay_ns = 0, + .spics_io_num = pin, + .flags = SPI_DEVICE_NO_DUMMY, //0, + .queue_size = 1, + .pre_cb = 0, //dc_callback, //Callback to handle D/C line + .post_cb = 0 + }; + ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); + ESP_ERROR_CHECK(ret); + ret = spi_bus_add_device(spi_host, &devcfg, &dmaHAL); + ESP_ERROR_CHECK(ret); + + DMA_Enabled = true; + spiBusyCheck = 0; + return true; +} + +/*************************************************************************************** +** Function name: deInitDMA +** Description: Disconnect the DMA engine from SPI +***************************************************************************************/ +void TFT_eSPI::deInitDMA(void) +{ + if (!DMA_Enabled) return; + spi_bus_remove_device(dmaHAL); + spi_bus_free(spi_host); + DMA_Enabled = false; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.h new file mode 100644 index 0000000..6fa1858 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.h @@ -0,0 +1,598 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +// Temporarily a separate file to TFT_eSPI_ESP32.h until board package low level API stabilises + +#ifndef _TFT_eSPI_ESP32H_ +#define _TFT_eSPI_ESP32H_ + +#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning >>>>------>> DMA is not supported on the ESP32 C3 (possible future update) +#endif + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x32 + +// Include processor specific header +#include "soc/spi_reg.h" +#include "driver/spi_master.h" +#include "hal/gpio_ll.h" + +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) + #define CONFIG_IDF_TARGET_ESP32 +#endif + +#ifndef VSPI + #define VSPI FSPI +#endif + +// Fix IDF problems with ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 + // Fix ESP32C3 IDF bug for missing definition (VSPI/FSPI only tested at the moment) + #ifndef REG_SPI_BASE + #define REG_SPI_BASE(i) DR_REG_SPI2_BASE + #endif + + // Fix ESP32C3 IDF bug for name change + #ifndef SPI_MOSI_DLEN_REG + #define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x) + #endif +#endif + +// SUPPORT_TRANSACTIONS is mandatory for ESP32 so the hal mutex is toggled +#if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS +#endif + +/* +ESP32: +FSPI not defined +HSPI = 2, uses SPI2 +VSPI = 3, uses SPI3 + +ESP32-S2: +FSPI = 1, uses SPI2 +HSPI = 2, uses SPI3 +VSPI not defined so have made VSPI = HSPI + +ESP32 C3: Only 1 SPI port available +FSPI = 1, uses SPI2 +HSPI = 1, uses SPI2 +VSPI not defined so have made VSPI = HSPI + +For ESP32/S2/C3: +SPI1_HOST = 0 +SPI2_HOST = 1 +SPI3_HOST = 2 +*/ + +// ESP32 specific SPI port selection - only SPI2_HOST available on C3 +#define SPI_PORT SPI2_HOST + +#ifdef RPI_DISPLAY_TYPE + #define CMD_BITS (16-1) +#else + #define CMD_BITS (8-1) +#endif + +// Initialise processor specific SPI functions, used by init() +#define INIT_TFT_DATA_BUS // Not used + +// Define a generic flag for 8-bit parallel +#if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility + #if !defined (TFT_PARALLEL_8_BIT) + #define TFT_PARALLEL_8_BIT // Generic parallel flag + #endif +#endif + +// Ensure ESP32 specific flag is defined for 8-bit parallel +#if defined (TFT_PARALLEL_8_BIT) + #if !defined (ESP32_PARALLEL) + #define ESP32_PARALLEL + #endif +#endif + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#if !defined (ESP32_PARALLEL) + #if (TFT_SPI_MODE == SPI_MODE1) || (TFT_SPI_MODE == SPI_MODE2) + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI | SPI_CK_OUT_EDGE + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN | SPI_CK_OUT_EDGE + #else + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN + #endif +#else + // Not applicable to parallel bus + #define SET_BUS_WRITE_MODE + #define SET_BUS_READ_MODE +#endif + +// Code to check if DMA is busy, used by SPI bus transaction transaction and endWrite functions +#if !defined(TFT_PARALLEL_8_BIT) && !defined(SPI_18BIT_DRIVER) + #define ESP32_DMA + // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions + #define DMA_BUSY_CHECK dmaWait() +#else + #define DMA_BUSY_CHECK +#endif + +#if defined(TFT_PARALLEL_8_BIT) + #define SPI_BUSY_CHECK +#else + #define SPI_BUSY_CHECK while (*_spi_cmd&SPI_USR) +#endif + +// If smooth font is used then it is likely SPIFFS will be needed +#ifdef SMOOTH_FONT + // Call up the SPIFFS (SPI FLASH Filing System) for the anti-aliased fonts + #define FS_NO_GLOBALS + #include + #include "SPIFFS.h" // ESP32 only + #define FONT_FS_AVAILABLE +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + // TFT_DC, by design, must be in range 0-31 for single register parallel write + #if (TFT_DC >= 0) && (TFT_DC < 32) + #define DC_C GPIO.out_w1tc.val = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts.val = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out_w1ts.val = (1 << (TFT_DC- 32)) + #else + #define DC_C + #define DC_D + #endif + #else + #if (TFT_DC >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi displays need a slower DC change + #define DC_C GPIO.out_w1ts.val = (1 << (TFT_DC - 32)); \ + GPIO.out_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out_w1tc.val = (1 << (TFT_DC - 32)); \ + GPIO.out_w1ts.val = (1 << (TFT_DC - 32)) + #else + #define DC_C GPIO.out_w1tc.val = (1 << (TFT_DC - 32))//;GPIO.out_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out_w1ts.val = (1 << (TFT_DC - 32))//;GPIO.out_w1ts.val = (1 << (TFT_DC - 32)) + #endif + #elif (TFT_DC >= 0) + #if defined (RPI_DISPLAY_TYPE) + #if defined (ILI9486_DRIVER) + // RPi ILI9486 display needs a slower DC change + #define DC_C GPIO.out_w1tc.val = (1 << TFT_DC); \ + GPIO.out_w1tc.val = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc.val = (1 << TFT_DC); \ + GPIO.out_w1ts.val = (1 << TFT_DC) + #else + // Other RPi displays need a slower C->D change + #define DC_C GPIO.out_w1tc.val = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc.val = (1 << TFT_DC); \ + GPIO.out_w1ts.val = (1 << TFT_DC) + #endif + #else + #define DC_C GPIO.out_w1tc.val = (1 << TFT_DC)//;GPIO.out_w1tc.val = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts.val = (1 << TFT_DC)//;GPIO.out_w1ts.val = (1 << TFT_DC) + #endif + #else + #define DC_C + #define DC_D + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define TFT_CS -1 // Keep DMA code happy + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + #if TFT_CS >= 32 + #define CS_L GPIO.out_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out_w1ts.val = (1 << (TFT_CS - 32)) + #elif TFT_CS >= 0 + #define CS_L GPIO.out_w1tc.val = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts.val = (1 << TFT_CS) + #else + #define CS_L + #define CS_H + #endif + #else + #if (TFT_CS >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out_w1ts.val = (1 << (TFT_CS - 32)); \ + GPIO.out_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out_w1tc.val = (1 << (TFT_CS - 32)); \ + GPIO.out_w1ts.val = (1 << (TFT_CS - 32)) + #else + #define CS_L GPIO.out_w1tc.val = (1 << (TFT_CS - 32)); GPIO.out_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out_w1ts.val = (1 << (TFT_CS - 32))//;GPIO.out_w1ts.val = (1 << (TFT_CS - 32)) + #endif + #elif (TFT_CS >= 0) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out_w1ts.val = (1 << TFT_CS); GPIO.out_w1tc.val = (1 << TFT_CS) + #define CS_H GPIO.out_w1tc.val = (1 << TFT_CS); GPIO.out_w1ts.val = (1 << TFT_CS) + #else + #define CS_L GPIO.out_w1tc.val = (1 << TFT_CS); GPIO.out_w1tc.val = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts.val = (1 << TFT_CS)//;GPIO.out_w1ts.val = (1 << TFT_CS) + #endif + #else + #define CS_L + #define CS_H + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_WR) + #if (TFT_WR >= 32) + // Note: it will be ~1.25x faster if the TFT_WR pin uses a GPIO pin lower than 32 + #define WR_L GPIO.out_w1tc.val = (1 << (TFT_WR - 32)) + #define WR_H GPIO.out_w1ts.val = (1 << (TFT_WR - 32)) + #elif (TFT_WR >= 0) + // TFT_WR, for best performance, should be in range 0-31 for single register parallel write + #define WR_L GPIO.out_w1tc.val = (1 << TFT_WR) + #define WR_H GPIO.out_w1ts.val = (1 << TFT_WR) + #else + #define WR_L + #define WR_H + #endif +#else + #define WR_L + #define WR_H +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TOUCH_CS + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else // XPT2046 is slow, so use slower digitalWrite here + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure SPI default pins are assigned if not specified by user or set to -1 +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + + #ifdef USE_HSPI_PORT + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 13 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 13 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 14 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 14 + #endif + + #else // VSPI port + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 23 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 23 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 18 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 18 + #endif + + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if (TFT_MISO == -1) + #undef TFT_MISO + #define TFT_MISO TFT_MOSI + #endif + #endif + + #endif + +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the parallel bus interface chip pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_PARALLEL_8_BIT) + + // Create a bit set lookup table for data bus - wastes 1kbyte of RAM but speeds things up dramatically + // can then use e.g. GPIO.out_w1ts.val = set_mask(0xFF); to set data bus to 0xFF + #define PARALLEL_INIT_TFT_DATA_BUS \ + for (int32_t c = 0; c<256; c++) \ + { \ + xset_mask[c] = 0; \ + if ( c & 0x01 ) xset_mask[c] |= (1 << TFT_D0); \ + if ( c & 0x02 ) xset_mask[c] |= (1 << TFT_D1); \ + if ( c & 0x04 ) xset_mask[c] |= (1 << TFT_D2); \ + if ( c & 0x08 ) xset_mask[c] |= (1 << TFT_D3); \ + if ( c & 0x10 ) xset_mask[c] |= (1 << TFT_D4); \ + if ( c & 0x20 ) xset_mask[c] |= (1 << TFT_D5); \ + if ( c & 0x40 ) xset_mask[c] |= (1 << TFT_D6); \ + if ( c & 0x80 ) xset_mask[c] |= (1 << TFT_D7); \ + } \ + + // Mask for the 8 data bits to set pin directions + #define GPIO_DIR_MASK ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) + + #if (TFT_WR >= 32) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #elif (TFT_WR >= 0) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) + #else + #define GPIO_OUT_CLR_MASK + #endif + + // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM + #define set_mask(C) xset_mask[C] // 63fps Sprite rendering test 33% faster, graphicstest only 1.8% faster than shifting in real time + + // Real-time shifting alternative to above to save 1KByte RAM, 47 fps Sprite rendering test + /*#define set_mask(C) (((C)&0x80)>>7)<>6)<>5)<>4)<>3)<>2)<>1)<>0)<> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + #ifdef PSEUDO_16_BIT + // One write strobe for both bytes + #define tft_Write_16(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H + #else + // Write 16 bits to TFT + #define tft_Write_16(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H + #endif + + #endif + + // Write 32 bits to TFT + #define tft_Write_32(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 0)); WR_H + + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Read pin + #ifdef TFT_RD + #if (TFT_RD >= 32) + #define RD_L GPIO.out_w1tc.val = (1 << (TFT_RD - 32)) + #define RD_H GPIO.out_w1ts.val = (1 << (TFT_RD - 32)) + #elif (TFT_RD >= 0) + #define RD_L GPIO.out_w1tc.val = (1 << TFT_RD) + //#define RD_L digitalWrite(TFT_WR, LOW) + #define RD_H GPIO.out_w1ts.val = (1 << TFT_RD) + //#define RD_H digitalWrite(TFT_WR, HIGH) + #else + #define RD_L + #define RD_H + #endif + #else + #define TFT_RD -1 + #define RD_L + #define RD_H + #endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi.transfer(C) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ + spi.transfer(((C) & 0x07E0)>>3); \ + spi.transfer(((C) & 0x001F)<<3) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ + spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + spi.transfer(((C) & 0x1F00)>>5) + + // Write 32 bits to TFT + #define tft_Write_32(C) spi.write32(C) + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) + + // Write 16-bit value twice to TFT + #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to an Raspberry Pi TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_DISPLAY_TYPE) + + // ESP32 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) \ + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((C)<<24 | (C), 32); \ + TFT_WRITE_BITS((D)<<24 | (D), 32) + + // Write same value twice + #define tft_Write_32D(C) tft_Write_32C(C,C) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// +#else +/* Old macros + // ESP32 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) \ + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + + // Write same value twice + #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) +//*/ +//* Replacement slimmer macros + #if !defined(CONFIG_IDF_TARGET_ESP32C3) + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + #else + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + #endif + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #if !defined(CONFIG_IDF_TARGET_ESP32C3) + #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ + *_spi_w = ((C)<<8 | (C)>>8); \ + *_spi_cmd = SPI_USR; + #else + #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ + *_spi_w = ((C)<<8 | (C)>>8); \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; + #endif + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + + // Write same value twice + #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + +//*/ +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + // Read from display using SPI or software SPI + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + +// Concatenate a byte sequence A,B,C,D to CDAB, P is a uint8_t pointer +#define DAT8TO32(P) ( (uint32_t)P[0]<<8 | P[1] | P[2]<<24 | P[3]<<16 ) + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c new file mode 100644 index 0000000..d689e72 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c @@ -0,0 +1,898 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +// Temporarily a separate file to TFT_eSPI_ESP32.c until board package low level API stabilises + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +// Select the SPI port to use, ESP32 has 2 options +#if !defined (TFT_PARALLEL_8_BIT) + #ifdef CONFIG_IDF_TARGET_ESP32 + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use default VSPI port + SPIClass spi = SPIClass(VSPI); + #endif + #else + #ifdef USE_HSPI_PORT + SPIClass spi = SPIClass(HSPI); + #elif defined(USE_FSPI_PORT) + SPIClass spi = SPIClass(FSPI); + #else // use FSPI port + SPIClass& spi = SPI; + #endif + #endif +#endif + +#ifdef ESP32_DMA + // DMA SPA handle + spi_device_handle_t dmaHAL; + #ifdef CONFIG_IDF_TARGET_ESP32 + #define DMA_CHANNEL 1 + #ifdef USE_HSPI_PORT + spi_host_device_t spi_host = HSPI_HOST; + #elif defined(USE_FSPI_PORT) + spi_host_device_t spi_host = SPI_HOST; + #else // use VSPI port + spi_host_device_t spi_host = VSPI_HOST; + #endif + #else + #ifdef USE_HSPI_PORT + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI3_HOST; + #else // use FSPI port + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI2_HOST; + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); + SET_BUS_READ_MODE; +} + +/*************************************************************************************** +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); + SET_BUS_WRITE_MODE; +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Read a byte from ESP32 8-bit data port +***************************************************************************************/ +// Parallel bus MUST be set to input before calling this function! +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0xAA; + +#if defined (TFT_PARALLEL_8_BIT) + RD_L; + b = gpio_get_level((gpio_num_t)TFT_D0); // Read three times to allow for bus access time + b = gpio_get_level((gpio_num_t)TFT_D0); + b = gpio_get_level((gpio_num_t)TFT_D0); // Data should be stable now + + // Check GPIO bits used and build value + b = (gpio_get_level((gpio_num_t)TFT_D0) << 0); + b |= (gpio_get_level((gpio_num_t)TFT_D1) << 1); + b |= (gpio_get_level((gpio_num_t)TFT_D2) << 2); + b |= (gpio_get_level((gpio_num_t)TFT_D3) << 3); + b |= (gpio_get_level((gpio_num_t)TFT_D4) << 4); + b |= (gpio_get_level((gpio_num_t)TFT_D5) << 5); + b |= (gpio_get_level((gpio_num_t)TFT_D6) << 6); + b |= (gpio_get_level((gpio_num_t)TFT_D7) << 7); + RD_H; +#endif + + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ + // Arduino generic native function + pinMode(TFT_D0, mode); + pinMode(TFT_D1, mode); + pinMode(TFT_D2, mode); + pinMode(TFT_D3, mode); + pinMode(TFT_D4, mode); + pinMode(TFT_D5, mode); + pinMode(TFT_D6, mode); + pinMode(TFT_D7, mode); +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set ESP32 GPIO pin to input or output (set high) ASAP +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + pinMode(gpio, mode); + digitalWrite(gpio, HIGH); +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #ifdef TFT_PARALLEL_8_BIT +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (RPI_WRITE_STROBE) && !defined (TFT_PARALLEL_8_BIT) // Code for RPi TFT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or ESP8266 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; + if(len) spi.writePattern(&colorBin[0], 2, 1); len--; + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or ESP8266 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint8_t *data = (uint8_t*)data_in; + + if(_swapBytes) { + while ( len-- ) {tft_Write_16(*data); data++;} + return; + } + + while ( len >=64 ) {spi.writePattern(data, 64, 1); data += 64; len -= 64; } + if (len) spi.writePattern(data, len, 1); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif !defined (SPI_18BIT_DRIVER) && !defined (TFT_PARALLEL_8_BIT) // Most SPI displays +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +/* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + bool empty = true; + volatile uint32_t* spi_w = (volatile uint32_t*)_spi_w; + if (len > 31) + { + *_spi_mosi_dlen = 511; + spi_w[0] = color32; + spi_w[1] = color32; + spi_w[2] = color32; + spi_w[3] = color32; + spi_w[4] = color32; + spi_w[5] = color32; + spi_w[6] = color32; + spi_w[7] = color32; + spi_w[8] = color32; + spi_w[9] = color32; + spi_w[10] = color32; + spi_w[11] = color32; + spi_w[12] = color32; + spi_w[13] = color32; + spi_w[14] = color32; + spi_w[15] = color32; + while(len>31) + { + while ((*_spi_cmd)&SPI_USR); + *_spi_cmd = SPI_USR; + len -= 32; + } + empty = false; + } + + if (len) + { + if(empty) { + for (uint32_t i=0; i <= len; i+=2) *spi_w++ = color32; + } + len = (len << 4) - 1; + while (*_spi_cmd&SPI_USR); + *_spi_mosi_dlen = len; + *_spi_cmd = SPI_USR; + } + while ((*_spi_cmd)&SPI_USR); // Move to later in code to use transmit time usefully? +} +//*/ +//* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + volatile uint32_t* spi_w = _spi_w; + uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); + uint32_t i = 0; + uint32_t rem = len & 0x1F; + len = len - rem; + + // Start with partial buffer pixels + if (rem) + { + while (*_spi_cmd&SPI_USR); + for (i=0; i < rem; i+=2) *spi_w++ = color32; + *_spi_mosi_dlen = (rem << 4) - 1; +#if CONFIG_IDF_TARGET_ESP32S3 + *_spi_cmd = SPI_UPDATE; + while (*_spi_cmd & SPI_UPDATE); +#endif + *_spi_cmd = SPI_USR; + if (!len) return; //{while (*_spi_cmd&SPI_USR); return; } + i = i>>1; while(i++<16) *spi_w++ = color32; + } + + while (*_spi_cmd&SPI_USR); + if (!rem) while (i++<16) *spi_w++ = color32; + *_spi_mosi_dlen = 511; + + // End with full buffer to maximise useful time for downstream code + while(len) + { + while (*_spi_cmd&SPI_USR); +#if CONFIG_IDF_TARGET_ESP32S3 + *_spi_cmd = SPI_UPDATE; + while (*_spi_cmd & SPI_UPDATE); +#endif + *_spi_cmd = SPI_USR; + len -= 32; + } + + // Do not wait here + //while (*_spi_cmd&SPI_USR); +} +//*/ +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint8_t* data = (uint8_t*)data_in; + uint32_t color[16]; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + uint32_t i = 0; + while(i<16) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), color[8]); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), color[9]); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), color[10]); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), color[11]); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), color[12]); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), color[13]); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), color[14]); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), color[15]); +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len > 15) + { + uint32_t i = 0; + while(i<8) + { + color[i++] = DAT8TO32(data); + data+=4; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 255); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), color[0]); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), color[1]); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), color[2]); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), color[3]); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), color[4]); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), color[5]); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), color[6]); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), color[7]); +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 16; + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) { + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT)+i, DAT8TO32(data)); data+=4; + } +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + if(_swapBytes) { + pushSwapBytePixels(data_in, len); + return; + } + + uint32_t *data = (uint32_t*)data_in; + + if (len > 31) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 511); + while(len>31) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), *data++); + WRITE_PERI_REG(SPI_W15_REG(SPI_PORT), *data++); +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 32; + } + } + + if (len) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len << 4) - 1); + for (uint32_t i=0; i <= (len<<1); i+=4) WRITE_PERI_REG((SPI_W0_REG(SPI_PORT) + i), *data++); +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + // Split out the colours + uint32_t r = (color & 0xF800)>>8; + uint32_t g = (color & 0x07E0)<<5; + uint32_t b = (color & 0x001F)<<19; + // Concatenate 4 pixels into three 32-bit blocks + uint32_t r0 = r<<24 | b | g | r; + uint32_t r1 = r0>>8 | g<<16; + uint32_t r2 = r1>>8 | b<<8; + + if (len > 19) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 479); + + while(len>19) + { + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + len -= 20; + } + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } + + if (len) + { + WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), (len * 24) - 1); + WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W1_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W2_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W3_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W4_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W5_REG(SPI_PORT), r2); + if (len > 8 ) + { + WRITE_PERI_REG(SPI_W6_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W7_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W8_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W9_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W10_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W11_REG(SPI_PORT), r2); + WRITE_PERI_REG(SPI_W12_REG(SPI_PORT), r0); + WRITE_PERI_REG(SPI_W13_REG(SPI_PORT), r1); + WRITE_PERI_REG(SPI_W14_REG(SPI_PORT), r2); + } +#if CONFIG_IDF_TARGET_ESP32S3 + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_UPDATE); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_UPDATE); +#endif + SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); + while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + } +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, hence !_swapBytes + if(!_swapBytes) { while ( len-- ) {tft_Write_16S(*data); data++;} } + else { while ( len-- ) {tft_Write_16(*data); data++;} } +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and 3 byte RGB display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, so swap byte macro not used here + while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 and parallel display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + if ( (color >> 8) == (color & 0x00FF) ) + { if (!len) return; + tft_Write_16(color); + #if defined (SSD1963_DRIVER) + while (--len) {WR_L; WR_H; WR_L; WR_H; WR_L; WR_H;} + #else + #ifdef PSEUDO_16_BIT + while (--len) {WR_L; WR_H;} + #else + while (--len) {WR_L; WR_H; WR_L; WR_H;} + #endif + #endif + } + else while (len--) {tft_Write_16(color);} +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 and parallel display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + while ( len-- ) {tft_Write_16(*data); data++;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if(_swapBytes) { while ( len-- ) {tft_Write_16(*data); data++; } } + else { while ( len-- ) {tft_Write_16S(*data); data++;} } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (ESP32_DMA) && !defined (TFT_PARALLEL_8_BIT) // DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: dmaBusy +** Description: Check if DMA is busy +***************************************************************************************/ +bool TFT_eSPI::dmaBusy(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return false; + + spi_transaction_t *rtrans; + esp_err_t ret; + uint8_t checks = spiBusyCheck; + for (int i = 0; i < checks; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, 0); + if (ret == ESP_OK) spiBusyCheck--; + } + + //Serial.print("spiBusyCheck=");Serial.println(spiBusyCheck); + if (spiBusyCheck ==0) return false; + return true; +} + + +/*************************************************************************************** +** Function name: dmaWait +** Description: Wait until DMA is over (blocking!) +***************************************************************************************/ +void TFT_eSPI::dmaWait(void) +{ + if (!DMA_Enabled || !spiBusyCheck) return; + spi_transaction_t *rtrans; + esp_err_t ret; + for (int i = 0; i < spiBusyCheck; ++i) + { + ret = spi_device_get_trans_result(dmaHAL, &rtrans, portMAX_DELAY); + assert(ret == ESP_OK); + } + spiBusyCheck = 0; +} + + +/*************************************************************************************** +** Function name: pushPixelsDMA +** Description: Push pixels to TFT (len must be less than 32767) +***************************************************************************************/ +// This will byte swap the original image if setSwapBytes(true) was called by sketch. +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +{ + if ((len == 0) || (!DMA_Enabled)) return; + + dmaWait(); + + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); + } + + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(image, 0x400); + len -= 0x400; image+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = image; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// Fixed const data assumed, will NOT clip or swap bytes +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t const* image) +{ + if ((w == 0) || (h == 0) || (!DMA_Enabled)) return; + + uint16_t *buffer = (uint16_t*)image; + uint32_t len = w*h; + + dmaWait(); + + setAddrWindow(x, y, w, h); + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = buffer; //Data pointer + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// This will clip and also swap bytes if setSwapBytes(true) was called by sketch +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image, uint16_t* buffer) +{ + if ((x >= _vpW) || (y >= _vpH) || (!DMA_Enabled)) return; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return; + + uint32_t len = dw*dh; + + if (buffer == nullptr) { + buffer = image; + dmaWait(); + } + + // If image is clipped, copy pixels into a contiguous block + if ( (dw != w) || (dh != h) ) { + if(_swapBytes) { + for (int32_t yb = 0; yb < dh; yb++) { + for (int32_t xb = 0; xb < dw; xb++) { + uint32_t src = xb + dx + w * (yb + dy); + (buffer[xb + yb * dw] = image[src] << 8 | image[src] >> 8); + } + } + } + else { + for (int32_t yb = 0; yb < dh; yb++) { + memcpy((uint8_t*) (buffer + yb * dw), (uint8_t*) (image + dx + w * (yb + dy)), dw << 1); + } + } + } + // else, if a buffer pointer has been provided copy whole image to the buffer + else if (buffer != image || _swapBytes) { + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (buffer[i] = image[i] << 8 | image[i] >> 8); + } + else { + memcpy(buffer, image, len*2); + } + } + + if (spiBusyCheck) dmaWait(); // In case we did not wait earlier + + setAddrWindow(x, y, dw, dh); + + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; + + esp_err_t ret; + static spi_transaction_t trans; + + memset(&trans, 0, sizeof(spi_transaction_t)); + + trans.user = (void *)1; + trans.tx_buffer = buffer; //finally send the line data + trans.length = len * 16; //Data length, in bits + trans.flags = 0; //SPI_TRANS_USE_TXDATA flag + + ret = spi_device_queue_trans(dmaHAL, &trans, portMAX_DELAY); + assert(ret == ESP_OK); + + spiBusyCheck++; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// Processor specific DMA initialisation +//////////////////////////////////////////////////////////////////////////////////////// + +// The DMA functions here work with SPI only (not parallel) +/*************************************************************************************** +** Function name: dc_callback +** Description: Toggles DC line during transaction (not used) +***************************************************************************************/ +extern "C" void dc_callback(); + +void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) +{ + if ((bool)spi_tx->user) {DC_D;} + else {DC_C;} +} + +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + if (DMA_Enabled) return false; + + esp_err_t ret; + spi_bus_config_t buscfg = { + .mosi_io_num = TFT_MOSI, + .miso_io_num = TFT_MISO, + .sclk_io_num = TFT_SCLK, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = 65536, // ESP32 S3 max size is 64Kbytes + .flags = 0, + .intr_flags = 0 + }; + + int8_t pin = -1; + if (ctrl_cs) pin = TFT_CS; + + spi_device_interface_config_t devcfg = { + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode = TFT_SPI_MODE, + .duty_cycle_pos = 0, + .cs_ena_pretrans = 0, + .cs_ena_posttrans = 0, + .clock_speed_hz = SPI_FREQUENCY, + .input_delay_ns = 0, + .spics_io_num = pin, + .flags = SPI_DEVICE_NO_DUMMY, //0, + .queue_size = 1, // Not using queues + .pre_cb = 0, //dc_callback, //Callback to handle D/C line (not used) + .post_cb = dma_end_callback //Callback to end transmission + }; + ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); + ESP_ERROR_CHECK(ret); + ret = spi_bus_add_device(spi_host, &devcfg, &dmaHAL); + ESP_ERROR_CHECK(ret); + + DMA_Enabled = true; + spiBusyCheck = 0; + return true; +} + +/*************************************************************************************** +** Function name: deInitDMA +** Description: Disconnect the DMA engine from SPI +***************************************************************************************/ +void TFT_eSPI::deInitDMA(void) +{ + if (!DMA_Enabled) return; + spi_bus_remove_device(dmaHAL); + spi_bus_free(spi_host); + DMA_Enabled = false; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h new file mode 100644 index 0000000..c1a9e10 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h @@ -0,0 +1,612 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP32 processors // + //////////////////////////////////////////////////// + +// Temporarily a separate file to TFT_eSPI_ESP32.h until board package low level API stabilises + +#ifndef _TFT_eSPI_ESP32H_ +#define _TFT_eSPI_ESP32H_ + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x32 + +// Include processor specific header +#include "soc/spi_reg.h" +#include "driver/spi_master.h" +#include "hal/gpio_ll.h" + +#if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) + #define CONFIG_IDF_TARGET_ESP32 +#endif + +#ifndef VSPI + #define VSPI FSPI +#endif + +// Fix IDF problems with ESP32S3 +// Note illogical enumerations: FSPI_HOST=SPI2_HOST=1 HSPI_HOST=SPI3_HOST=2 +#if CONFIG_IDF_TARGET_ESP32S3 + // Fix ESP32C3 IDF bug for missing definition (FSPI only tested at the moment) + #ifndef REG_SPI_BASE // HSPI FSPI/VSPI + #define REG_SPI_BASE(i) (((i)>1) ? (DR_REG_SPI3_BASE) : (DR_REG_SPI2_BASE)) + #endif + + // Fix ESP32S3 IDF bug for name change + #ifndef SPI_MOSI_DLEN_REG + #define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x) + #endif + +#endif + +// SUPPORT_TRANSACTIONS is mandatory for ESP32 so the hal mutex is toggled +#if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS +#endif + +/* +ESP32: +FSPI not defined +HSPI = 2, uses SPI2 +VSPI = 3, uses SPI3 + +ESP32-S2: +FSPI = 1, uses SPI2 +HSPI = 2, uses SPI3 +VSPI not defined + +ESP32 C3: +FSPI = 0, uses SPI2 ???? To be checked +HSPI = 1, uses SPI3 ???? To be checked +VSPI not defined + +For ESP32/S2/C3/S3: +SPI1_HOST = 0 +SPI2_HOST = 1 +SPI3_HOST = 2 +*/ + +// ESP32 specific SPI port selection +#ifdef USE_HSPI_PORT + #ifdef CONFIG_IDF_TARGET_ESP32 + #define SPI_PORT HSPI //HSPI is port 2 on ESP32 + #else + #define SPI_PORT 3 //HSPI is port 3 on ESP32 S2 + #endif +#elif defined(USE_FSPI_PORT) + #define SPI_PORT 2 //FSPI(ESP32 S2) +#else + #ifdef CONFIG_IDF_TARGET_ESP32 + #define SPI_PORT VSPI + #elif CONFIG_IDF_TARGET_ESP32S2 + #define SPI_PORT 2 //FSPI(ESP32 S2) + #elif CONFIG_IDF_TARGET_ESP32S3 + #define SPI_PORT FSPI + #endif +#endif + +#ifdef RPI_DISPLAY_TYPE + #define CMD_BITS (16-1) +#else + #define CMD_BITS (8-1) +#endif + +// Initialise processor specific SPI functions, used by init() +#define INIT_TFT_DATA_BUS // Not used + +// Define a generic flag for 8-bit parallel +#if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility + #if !defined (TFT_PARALLEL_8_BIT) + #define TFT_PARALLEL_8_BIT // Generic parallel flag + #endif +#endif + +// Ensure ESP32 specific flag is defined for 8-bit parallel +#if defined (TFT_PARALLEL_8_BIT) + #if !defined (ESP32_PARALLEL) + #define ESP32_PARALLEL + #endif +#endif + +#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) && defined (ESP32_PARALLEL) + #warning >>>>------>> DMA is not supported in parallel mode +#endif + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#if !defined (ESP32_PARALLEL) + #define _spi_cmd (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)) + #define _spi_user (volatile uint32_t*)(SPI_USER_REG(SPI_PORT)) + #define _spi_mosi_dlen (volatile uint32_t*)(SPI_MOSI_DLEN_REG(SPI_PORT)) + #define _spi_w (volatile uint32_t*)(SPI_W0_REG(SPI_PORT)) + + #if (TFT_SPI_MODE == SPI_MODE1) || (TFT_SPI_MODE == SPI_MODE2) + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI | SPI_CK_OUT_EDGE + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN | SPI_CK_OUT_EDGE + #else + #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI + #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN + #endif +#else + // Not applicable to parallel bus + #define SET_BUS_WRITE_MODE + #define SET_BUS_READ_MODE +#endif + +// Code to check if DMA is busy, used by SPI bus transaction transaction and endWrite functions +#if !defined(TFT_PARALLEL_8_BIT) && !defined(SPI_18BIT_DRIVER) + #define ESP32_DMA + // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions + #define DMA_BUSY_CHECK dmaWait() +#else + #define DMA_BUSY_CHECK +#endif + +#if defined(TFT_PARALLEL_8_BIT) + #define SPI_BUSY_CHECK +#else + #define SPI_BUSY_CHECK while (*_spi_cmd&SPI_USR) +#endif + +// If smooth font is used then it is likely SPIFFS will be needed +#ifdef SMOOTH_FONT + // Call up the SPIFFS (SPI FLASH Filing System) for the anti-aliased fonts + #define FS_NO_GLOBALS + #include + #include "SPIFFS.h" // ESP32 only + #define FONT_FS_AVAILABLE +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + // TFT_DC, by design, must be in range 0-31 for single register parallel write + #if (TFT_DC >= 0) && (TFT_DC < 32) + #define DC_C GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC- 32)) + #else + #define DC_C + #define DC_D + #endif + #else + #if (TFT_DC >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi displays need a slower DC change + #define DC_C GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)); \ + GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)); \ + GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)) + #else + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)) + #endif + #elif (TFT_DC >= 0) + #if defined (RPI_DISPLAY_TYPE) + #if defined (ILI9486_DRIVER) + // RPi ILI9486 display needs a slower DC change + #define DC_C GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1ts = (1 << TFT_DC) + #else + // Other RPi displays need a slower C->D change + #define DC_C GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1tc = (1 << TFT_DC); \ + GPIO.out_w1ts = (1 << TFT_DC) + #endif + #else + #define DC_C GPIO.out_w1tc = (1 << TFT_DC)//;GPIO.out_w1tc = (1 << TFT_DC) + #define DC_D GPIO.out_w1ts = (1 << TFT_DC)//;GPIO.out_w1ts = (1 << TFT_DC) + #endif + #else + #define DC_C + #define DC_D + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define TFT_CS -1 // Keep DMA code happy + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #if defined (TFT_PARALLEL_8_BIT) + #if TFT_CS >= 32 + #define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #elif TFT_CS >= 0 + #define CS_L GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts = (1 << TFT_CS) + #else + #define CS_L + #define CS_H + #endif + #else + #if (TFT_CS >= 32) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)); \ + GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); \ + GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #else + #define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)) + #define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)) + #endif + #elif (TFT_CS >= 0) + #ifdef RPI_DISPLAY_TYPE // RPi display needs a slower CS change + #define CS_L GPIO.out_w1ts = (1 << TFT_CS); GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1tc = (1 << TFT_CS); GPIO.out_w1ts = (1 << TFT_CS) + #else + #define CS_L GPIO.out_w1tc = (1 << TFT_CS); GPIO.out_w1tc = (1 << TFT_CS) + #define CS_H GPIO.out_w1ts = (1 << TFT_CS)//;GPIO.out_w1ts = (1 << TFT_CS) + #endif + #else + #define CS_L + #define CS_H + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_WR) + #if (TFT_WR >= 32) + // Note: it will be ~1.25x faster if the TFT_WR pin uses a GPIO pin lower than 32 + #define WR_L GPIO.out1_w1tc.val = (1 << (TFT_WR - 32)) + #define WR_H GPIO.out1_w1ts.val = (1 << (TFT_WR - 32)) + #elif (TFT_WR >= 0) + // TFT_WR, for best performance, should be in range 0-31 for single register parallel write + #define WR_L GPIO.out_w1tc = (1 << TFT_WR) + #define WR_H GPIO.out_w1ts = (1 << TFT_WR) + #else + #define WR_L + #define WR_H + #endif +#else + #define WR_L + #define WR_H +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TOUCH_CS + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else // XPT2046 is slow, so use slower digitalWrite here + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure SPI default pins are assigned if not specified by user or set to -1 +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + + #ifdef USE_HSPI_PORT + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 13 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 13 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 14 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 14 + #endif + + #else // VSPI port + + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif + + #ifndef TFT_MOSI + #define TFT_MOSI 23 + #endif + #if (TFT_MOSI == -1) + #undef TFT_MOSI + #define TFT_MOSI 23 + #endif + + #ifndef TFT_SCLK + #define TFT_SCLK 18 + #endif + #if (TFT_SCLK == -1) + #undef TFT_SCLK + #define TFT_SCLK 18 + #endif + + #if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if (TFT_MISO == -1) + #undef TFT_MISO + #define TFT_MISO TFT_MOSI + #endif + #endif + + #endif + +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the parallel bus interface chip pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_PARALLEL_8_BIT) + + #if (TFT_D0 >= 32) // If D0 is a high GPIO assume all other data bits are high GPIO + #define MASK_OFFSET 32 + #define GPIO_CLR_REG GPIO.out1_w1tc.val + #define GPIO_SET_REG GPIO.out1_w1ts.val + #else + #define MASK_OFFSET 0 + #define GPIO_CLR_REG GPIO.out_w1tc + #define GPIO_SET_REG GPIO.out_w1ts + #endif + + // Create a bit set lookup table for data bus - wastes 1kbyte of RAM but speeds things up dramatically + // can then use e.g. GPIO.out_w1ts = set_mask(0xFF); to set data bus to 0xFF + #define PARALLEL_INIT_TFT_DATA_BUS \ + for (int32_t c = 0; c<256; c++) \ + { \ + xset_mask[c] = 0; \ + if ( c & 0x01 ) xset_mask[c] |= (1 << (TFT_D0-MASK_OFFSET)); \ + if ( c & 0x02 ) xset_mask[c] |= (1 << (TFT_D1-MASK_OFFSET)); \ + if ( c & 0x04 ) xset_mask[c] |= (1 << (TFT_D2-MASK_OFFSET)); \ + if ( c & 0x08 ) xset_mask[c] |= (1 << (TFT_D3-MASK_OFFSET)); \ + if ( c & 0x10 ) xset_mask[c] |= (1 << (TFT_D4-MASK_OFFSET)); \ + if ( c & 0x20 ) xset_mask[c] |= (1 << (TFT_D5-MASK_OFFSET)); \ + if ( c & 0x40 ) xset_mask[c] |= (1 << (TFT_D6-MASK_OFFSET)); \ + if ( c & 0x80 ) xset_mask[c] |= (1 << (TFT_D7-MASK_OFFSET)); \ + } \ + + // Mask for the 8 data bits to set pin directions + #define GPIO_DIR_MASK ((1 << (TFT_D0-MASK_OFFSET)) | (1 << (TFT_D1-MASK_OFFSET)) | (1 << (TFT_D2-MASK_OFFSET)) | (1 << (TFT_D3-MASK_OFFSET)) | (1 << (TFT_D4-MASK_OFFSET)) | (1 << (TFT_D5-MASK_OFFSET)) | (1 << (TFT_D6-MASK_OFFSET)) | (1 << (TFT_D7-MASK_OFFSET))) + + #if (TFT_WR >= 32) + #if (TFT_D0 >= 32) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << (TFT_WR-32))) + #elif (TFT_D0 >= 0) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #endif + #elif (TFT_WR >= 0) + #if (TFT_D0 >= 32) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #elif (TFT_D0 >= 0) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) + #endif + #else + #define GPIO_OUT_CLR_MASK + #endif + + // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM + #define set_mask(C) xset_mask[C] // 63fps Sprite rendering test 33% faster, graphicstest only 1.8% faster than shifting in real time + + // Real-time shifting alternative to above to save 1KByte RAM, 47 fps Sprite rendering test + /*#define set_mask(C) (((C)&0x80)>>7)<>6)<>5)<>4)<>3)<>2)<>1)<>0)<> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + #ifdef PSEUDO_16_BIT + // One write strobe for both bytes + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + #else + // Write 16 bits to TFT + #define tft_Write_16(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H + #endif + + #endif + + // Write 32 bits to TFT + #define tft_Write_32(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((D) >> 0)); WR_H + + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H + + // Read pin + #ifdef TFT_RD + #if (TFT_RD >= 32) + #define RD_L GPIO.out1_w1tc.val = (1 << (TFT_RD - 32)) + #define RD_H GPIO.out1_w1ts.val = (1 << (TFT_RD - 32)) + #elif (TFT_RD >= 0) + #define RD_L GPIO.out_w1tc = (1 << TFT_RD) + //#define RD_L digitalWrite(TFT_WR, LOW) + #define RD_H GPIO.out_w1ts = (1 << TFT_RD) + //#define RD_H digitalWrite(TFT_WR, HIGH) + #else + #define RD_L + #define RD_H + #endif + #else + #define TFT_RD -1 + #define RD_L + #define RD_H + #endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi.transfer(C) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ + spi.transfer(((C) & 0x07E0)>>3); \ + spi.transfer(((C) & 0x001F)<<3) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ + spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + spi.transfer(((C) & 0x1F00)>>5) + + // Write 32 bits to TFT + #define tft_Write_32(C) spi.write32(C) + + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) + + // Write 16-bit value twice to TFT + #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to an Raspberry Pi TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_DISPLAY_TYPE) + // ESP32-S3 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #define tft_Write_16N(C) tft_Write_16(C) + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((C)<<24 | (C), 32); \ + TFT_WRITE_BITS((D)<<24 | (D), 32) + + // Write same value twice + #define tft_Write_32D(C) tft_Write_32C(C,C) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// +#else + #if !defined(CONFIG_IDF_TARGET_ESP32S3) + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + #else + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); + #endif + // Write 8 bits + #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) + + // Write 16 bits with corrected endianness for 16-bit colours + #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) + + // Future option for transfer without wait + #if !defined(CONFIG_IDF_TARGET_ESP32S3) + #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ + *_spi_w = ((C)<<8 | (C)>>8); \ + *_spi_cmd = SPI_USR; + #else + #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ + *_spi_w = ((C)<<8 | (C)>>8); \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; + #endif + + // Write 16 bits + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + // Write 32 bits + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + // Write two address coordinates + #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + + // Write same value twice + #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) + +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + // Read from display using SPI or software SPI + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + +// Concatenate a byte sequence A,B,C,D to CDAB, P is a uint8_t pointer +#define DAT8TO32(P) ( (uint32_t)P[0]<<8 | P[1] | P[2]<<24 | P[3]<<16 ) + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.c new file mode 100644 index 0000000..b49380a --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.c @@ -0,0 +1,447 @@ + + ////////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP8266 processors // + ////////////////////////////////////////////////////// + +// Select the SPI port to use +// ESP8266 default (FLASH port also available via overlap mode) + SPIClass& spi = SPI; + +// Buffer for SPI transmit byte padding and byte order manipulation +uint8_t spiBuffer[8] = {0,0,0,0,0,0,0,0}; + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: tft_Read_8 +** Description: ESP8266 software SPI to read bidirectional SDA line +***************************************************************************************/ +uint8_t TFT_eSPI::tft_Read_8(void) +{ + uint8_t ret = 0; + uint32_t reg = 0; + + for (uint8_t i = 0; i < 8; i++) { // read results + ret <<= 1; + SCLK_L; + if (digitalRead(TFT_MOSI)) ret |= 1; + SCLK_H; + } + + return ret; +} + +/*************************************************************************************** +** Function name: beginSDA +** Description: Detach SPI from pin to permit software SPI +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + #ifdef TFT_SPI_OVERLAP + // Reads in overlap mode not supported + #else + spi.end(); + #endif +} + +/*************************************************************************************** +** Function name: endSDA +** Description: Attach SPI pins after software SPI +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + #ifdef TFT_SPI_OVERLAP + spi.pins(6, 7, 8, 0); + #else + spi.begin(); + #endif +} +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Parallel bus only - dummy function - not used +***************************************************************************************/ +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0xAA; + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (RPI_WRITE_STROBE) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or ESP8266 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint8_t colorBin[] = { (uint8_t) (color >> 8), (uint8_t) color }; + if(len) spi.writePattern(&colorBin[0], 2, 1); len--; + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or ESP8266 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint8_t *data = (uint8_t*)data_in; + while ( len >=64 ) {spi.writePattern(data, 64, 1); data += 64; len -= 64; } + if (len) spi.writePattern(data, len, 1); +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP32 or ESP8266 RPi TFT +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + uint16_t *data = (uint16_t*)data_in; + while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP8266 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + // Split out the colours + uint8_t r = (color & 0xF800)>>8; + uint8_t g = (color & 0x07E0)>>3; + uint8_t b = (color & 0x001F)<<3; + // Concatenate 4 pixels into three 32-bit blocks + uint32_t r0 = r<<24 | b<<16 | g<<8 | r; + uint32_t r1 = g<<24 | r<<16 | b<<8 | g; + uint32_t r2 = b<<24 | g<<16 | r<<8 | b; + + SPI1W0 = r0; + SPI1W1 = r1; + SPI1W2 = r2; + + if (len > 4) + { + SPI1W3 = r0; + SPI1W4 = r1; + SPI1W5 = r2; + } + if (len > 8) + { + SPI1W6 = r0; + SPI1W7 = r1; + SPI1W8 = r2; + } + if (len > 12) + { + SPI1W9 = r0; + SPI1W10 = r1; + SPI1W11 = r2; + SPI1W12 = r0; + SPI1W13 = r1; + SPI1W14 = r2; + SPI1W15 = r0; + } + + if (len > 20) + { + SPI1U1 = (503 << SPILMOSI); + while(len>20) + { + while(SPI1CMD & SPIBUSY) {} + SPI1CMD |= SPIBUSY; + len -= 21; + } + while(SPI1CMD & SPIBUSY) {} + } + + if (len) + { + len = (len * 24) - 1; + SPI1U1 = (len << SPILMOSI); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + } + +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP8266 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + + // Send groups of 4 concatenated pixels + if (len > 3) { + SPI1U1 = ((4 * 24 - 1) << SPILMOSI); + while (len > 3) { + + uint8_t r[4]; + uint8_t g[4]; + uint8_t b[4]; + + if (!_swapBytes) { + // Split out the colours + for (uint16_t i = 0; i < 4; i++) { + uint16_t col = *data++; + r[i] = (col & 0xF8); + g[i] = (col & 0xE000)>>11 | (col & 0x07)<<5; + b[i] = (col & 0x1F00)>>5; + } + } + else { + for (uint16_t i = 0; i < 4; i++) { + uint16_t col = *data++; + r[i] = (col & 0xF800)>>8; + g[i] = (col & 0x07E0)>>3; + b[i] = (col & 0x001F)<<3; + } + } + uint32_t r0 = r[1]<<24 | b[0]<<16 | g[0]<<8 | r[0]; + uint32_t r1 = g[2]<<24 | r[2]<<16 | b[1]<<8 | g[1]; + uint32_t r2 = b[3]<<24 | g[3]<<16 | r[3]<<8 | b[2]; + + while(SPI1CMD & SPIBUSY) {} + SPI1W0 = r0; + SPI1W1 = r1; + SPI1W2 = r2; + + SPI1CMD |= SPIBUSY; + len -= 4; + } + while(SPI1CMD & SPIBUSY) {} + } + + // ILI9488 write macro is not endianess dependant, hence !_swapBytes + if (!_swapBytes) while ( len-- ) { tft_Write_16S(*data); data++;} + else while ( len-- ) {tft_Write_16(*data); data++;} +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP8266 and 3 byte RGB display +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + // ILI9488 write macro is not endianess dependant, so swap byte macro not used here + while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#else +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP8266 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +//Clear screen test 76.8ms theoretical. 81.5ms TFT_eSPI, 967ms Adafruit_ILI9341 +//Performance 26.15Mbps@26.66MHz, 39.04Mbps@40MHz, 75.4Mbps@80MHz SPI clock +//Efficiency: +// TFT_eSPI 98.06% 97.59% 94.24% +// Adafruit_GFX 19.62% 14.31% 7.94% +// +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ +/* +while (len>1) { tft_Write_32(color<<16 | color); len-=2;} +if (len) tft_Write_16(color); +return; +//*/ + uint16_t color16 = (color >> 8) | (color << 8); + uint32_t color32 = color16 | color16 << 16; +/* + while(len--) { + SPI1U1 = ((16-1) << SPILMOSI) | ((16-1) << SPILMISO); + SPI1W0 = color16; + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + } + return; +//*/ + + SPI1W0 = color32; + SPI1W1 = color32; + SPI1W2 = color32; + SPI1W3 = color32; + if (len > 8) + { + SPI1W4 = color32; + SPI1W5 = color32; + SPI1W6 = color32; + SPI1W7 = color32; + } + if (len > 16) + { + SPI1W8 = color32; + SPI1W9 = color32; + SPI1W10 = color32; + SPI1W11 = color32; + } + if (len > 24) + { + SPI1W12 = color32; + SPI1W13 = color32; + SPI1W14 = color32; + SPI1W15 = color32; + } + if (len > 31) + { + SPI1U1 = (511 << SPILMOSI); + while(len>31) + { +#if (defined (SPI_FREQUENCY) && (SPI_FREQUENCY == 80000000)) + if(SPI1CMD & SPIBUSY) // added to sync with flag change +#endif + while(SPI1CMD & SPIBUSY) {} + SPI1CMD |= SPIBUSY; + len -= 32; + } + while(SPI1CMD & SPIBUSY) {} + } + + if (len) + { + len = (len << 4) - 1; + SPI1U1 = (len << SPILMOSI); + SPI1CMD |= SPIBUSY; + while(SPI1CMD & SPIBUSY) {} + } + +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP8266 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + if(_swapBytes) { + pushSwapBytePixels(data_in, len); + return; + } + + uint16_t *data = (uint16_t*) data_in; + + uint32_t color[8]; + + SPI1U1 = (255 << SPILMOSI) | (255 << SPILMISO); + + + while(len>15) + { + memcpy(color,data,32); + data+=16; + + len -= 16; + + // ESP8266 wait time here at 40MHz SPI is ~5.45us + while(SPI1CMD & SPIBUSY) {} + SPI1W0 = color[0]; + SPI1W1 = color[1]; + SPI1W2 = color[2]; + SPI1W3 = color[3]; + SPI1W4 = color[4]; + SPI1W5 = color[5]; + SPI1W6 = color[6]; + SPI1W7 = color[7]; + SPI1CMD |= SPIBUSY; + } + + if(len) + { + uint32_t bits = (len*16-1); // bits left to shift - 1 + + memcpy(color,data,len<<1); + + while(SPI1CMD & SPIBUSY) {} + SPI1U1 = (bits << SPILMOSI) | (bits << SPILMISO); + SPI1W0 = color[0]; + SPI1W1 = color[1]; + SPI1W2 = color[2]; + SPI1W3 = color[3]; + SPI1W4 = color[4]; + SPI1W5 = color[5]; + SPI1W6 = color[6]; + SPI1W7 = color[7]; + SPI1CMD |= SPIBUSY; + } + + while(SPI1CMD & SPIBUSY) {} + +} + +/*************************************************************************************** +** Function name: pushSwapBytePixels - for ESP8266 +** Description: Write a sequence of pixels with swapped bytes +***************************************************************************************/ +void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ + + uint8_t* data = (uint8_t*)data_in; + //uint16_t* data = (uint16_t*)data_in; + + uint32_t color[8]; + + SPI1U1 = (255 << SPILMOSI) | (255 << SPILMISO); + + while(len>15) + { + uint32_t i = 0; + while(i<8) { color[i++] = DAT8TO32(data); data+=4; } + + len -= 16; + + // ESP8266 wait time here at 40MHz SPI is ~5.45us + while(SPI1CMD & SPIBUSY) {} + SPI1W0 = color[0]; + SPI1W1 = color[1]; + SPI1W2 = color[2]; + SPI1W3 = color[3]; + SPI1W4 = color[4]; + SPI1W5 = color[5]; + SPI1W6 = color[6]; + SPI1W7 = color[7]; + SPI1CMD |= SPIBUSY; + } + + if(len) + { + uint32_t i = 0; + uint32_t bits = (len*16-1); // bits left to shift - 1 + len = (len+1)>>1; + while(len--) { color[i++] = DAT8TO32(data); data+=4; } + + while(SPI1CMD & SPIBUSY) {} + SPI1U1 = (bits << SPILMOSI) | (bits << SPILMISO); + SPI1W0 = color[0]; + SPI1W1 = color[1]; + SPI1W2 = color[2]; + SPI1W3 = color[3]; + SPI1W4 = color[4]; + SPI1W5 = color[5]; + SPI1W6 = color[6]; + SPI1W7 = color[7]; + SPI1CMD |= SPIBUSY; + } + + while(SPI1CMD & SPIBUSY) {} + +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.h new file mode 100644 index 0000000..1aacc1e --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_ESP8266.h @@ -0,0 +1,245 @@ + ////////////////////////////////////////////////////// + // TFT_eSPI driver functions for ESP8266 processors // + ////////////////////////////////////////////////////// + +#ifndef _TFT_eSPI_ESP8266H_ +#define _TFT_eSPI_ESP8266H_ + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x8266 + +// Include processor specific header +// None + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#define SET_BUS_WRITE_MODE SPI1U=SPI1U_WRITE +#define SET_BUS_READ_MODE SPI1U=SPI1U_READ + +// Code to check if DMA is busy, used by SPI bus transaction transaction and endWrite functions +#define DMA_BUSY_CHECK // DMA not available, leave blank + +// Initialise processor specific SPI functions, used by init() +#if (!defined (SUPPORT_TRANSACTIONS) && defined (ARDUINO_ARCH_ESP8266)) + #define INIT_TFT_DATA_BUS \ + spi.setBitOrder(MSBFIRST); \ + spi.setDataMode(TFT_SPI_MODE); \ + spi.setFrequency(SPI_FREQUENCY); + #else + #define INIT_TFT_DATA_BUS +#endif + +// If smooth fonts are enabled the filing system may need to be loaded +#ifdef SMOOTH_FONT + // Call up the SPIFFS FLASH filing system for the anti-aliased fonts + #define FS_NO_GLOBALS + #include + #define FONT_FS_AVAILABLE +#endif + +// Do not allow parallel mode for ESP8266 +#ifdef ESP32_PARALLEL + #undef ESP32_PARALLEL +#endif +#ifdef TFT_PARALLEL_8_BIT + #undef TFT_PARALLEL_8_BIT +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #if (TFT_DC == 16) + #define DC_C digitalWrite(TFT_DC, LOW) + #define DC_D digitalWrite(TFT_DC, HIGH) + #else + #define DC_C GPOC=dcpinmask + #define DC_D GPOS=dcpinmask + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #if (TFT_CS == 16) + #define CS_L digitalWrite(TFT_CS, LOW) + #define CS_H digitalWrite(TFT_CS, HIGH) + #else + #define CS_L GPOC=cspinmask + #define CS_H GPOS=cspinmask + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_WR + #define WR_L GPOC=wrpinmask + #define WR_H GPOS=wrpinmask +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TOUCH_CS + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_MISO is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_MISO + #define TFT_MISO -1 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// ESP8266 specific SPI macros +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SPI_OVERLAP) + #undef TFT_CS + #define SPI1U_WRITE (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD) + #define SPI1U_READ (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD | SPIUDUPLEX) +#else + #define SPI1U_WRITE (SPIUMOSI | SPIUSSE) + #define SPI1U_READ (SPIUMOSI | SPIUSSE | SPIUDUPLEX) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi.transfer(C) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ + spi.transfer(((C) & 0x07E0)>>3); \ + spi.transfer(((C) & 0x001F)<<3) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ + spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + spi.transfer(((C) & 0x1F00)>>5) + + // Write 32 bits to TFT + #define tft_Write_32(C) spi.write32(C) + + // Write two address coordinates + #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) + + // Write same value twice + #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to an Raspberry Pi TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_DISPLAY_TYPE) + // Command is 16 bits + #define CMD_BITS 16 + + // ESP8266 low level SPI writes for 8, 16 and 32-bit values + // to avoid the function call overhead + #define TFT_WRITE_BITS(D, B) \ + SPI1U1 = ((B-1) << SPILMOSI); \ + SPI1W0 = D; \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {} + + #define tft_Write_8(C) TFT_WRITE_BITS((uint16_t)(C)<<8, CMD_BITS) + + #define tft_Write_16(C) TFT_WRITE_BITS((C)>>8 | (C)<<8, 16) + + #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) + + #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) + + #define tft_Write_32C(C,D) SPI1U1 = ((64-1) << SPILMOSI); \ + SPI1W0 = ((C)<<24) | (C); \ + SPI1W1 = ((D)<<24) | (D); \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_32D(C) tft_Write_32C(C,C) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// +#else + // Command is 8 bits + #define CMD_BITS 8 + + #define tft_Write_8(C) \ + SPI1U1 = ((CMD_BITS-1) << SPILMOSI) | ((CMD_BITS-1) << SPILMISO); \ + SPI1W0 = (C)<<(CMD_BITS - 8); \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_16(C) \ + SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \ + SPI1W0 = ((C)<<8 | (C)>>8); \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_16N(C) \ + SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \ + SPI1W0 = ((C)<<8 | (C)>>8); \ + SPI1CMD |= SPIBUSY + + #define tft_Write_16S(C) \ + SPI1U1 = (15 << SPILMOSI) | (15 << SPILMISO); \ + SPI1W0 = C; \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_32(C) \ + SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \ + SPI1W0 = C; \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_32C(C,D) \ + SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \ + SPI1W0 = ((D)>>8 | (D)<<8)<<16 | ((C)>>8 | (C)<<8); \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + + #define tft_Write_32D(C) \ + SPI1U1 = (31 << SPILMOSI) | (31 << SPILMISO); \ + SPI1W0 = ((C)>>8 | (C)<<8)<<16 | ((C)>>8 | (C)<<8); \ + SPI1CMD |= SPIBUSY; \ + while(SPI1CMD & SPIBUSY) {;} + +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) + // Use a bit banged function call for ESP8266 and bi-directional SDA pin + #define TFT_eSPI_ENABLE_8_BIT_READ // Enable tft_Read_8(void); + #define SCLK_L GPOC=sclkpinmask + #define SCLK_H GPOS=sclkpinmask +#else + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + +// Concatenate a byte sequence A,B,C,D to CDAB, P is a uint8_t pointer +#define DAT8TO32(P) ( (uint32_t)P[0]<<8 | P[1] | P[2]<<24 | P[3]<<16 ) + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.c new file mode 100644 index 0000000..1c2287b --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.c @@ -0,0 +1,263 @@ + //////////////////////////////////////////////////// + // TFT_eSPI generic driver functions // + //////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +// Select the SPI port to use +#ifdef TFT_SPI_PORT + SPIClass& spi = TFT_SPI_PORT; +#else + SPIClass& spi = SPI; +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: tft_Read_8 +** Description: Bit bashed SPI to read bidirectional SDA line +***************************************************************************************/ +uint8_t TFT_eSPI::tft_Read_8(void) +{ + uint8_t ret = 0; + + for (uint8_t i = 0; i < 8; i++) { // read results + ret <<= 1; + SCLK_L; + if (digitalRead(TFT_MOSI)) ret |= 1; + SCLK_H; + } + + return ret; +} + +/*************************************************************************************** +** Function name: beginSDA +** Description: Detach SPI from pin to permit software SPI +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + // Release configured SPI port for SDA read + spi.end(); +} + +/*************************************************************************************** +** Function name: endSDA +** Description: Attach SPI pins after software SPI +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + // Configure SPI port ready for next TFT access + spi.begin(); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_PARALLEL_8_BIT) // Code for generic (i.e. any) processor +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for generic processor and parallel display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + while (len>1) {tft_Write_32D(color); len-=2;} + if (len) {tft_Write_16(color);} +} + +/*************************************************************************************** +** Function name: pushPixels - for gereric processor and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if(_swapBytes) { + while (len>1) {tft_Write_16(*data); data++; tft_Write_16(*data); data++; len -=2;} + if (len) {tft_Write_16(*data);} + return; + } + + while (len>1) {tft_Write_16S(*data); data++; tft_Write_16S(*data); data++; len -=2;} + if (len) {tft_Write_16S(*data);} +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ + // mask is unused for generic processor + // Arduino native functions suited well to a generic driver + pinMode(TFT_D0, mode); + pinMode(TFT_D1, mode); + pinMode(TFT_D2, mode); + pinMode(TFT_D3, mode); + pinMode(TFT_D4, mode); + pinMode(TFT_D5, mode); + pinMode(TFT_D6, mode); + pinMode(TFT_D7, mode); + return; +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Faster GPIO pin input/output switch +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + // No fast port based generic approach available +} + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Read a byte - parallel bus only +***************************************************************************************/ +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0; + + busDir(0, INPUT); + digitalWrite(TFT_RD, LOW); + + b |= digitalRead(TFT_D0) << 0; + b |= digitalRead(TFT_D1) << 1; + b |= digitalRead(TFT_D2) << 2; + b |= digitalRead(TFT_D3) << 3; + b |= digitalRead(TFT_D4) << 4; + b |= digitalRead(TFT_D5) << 5; + b |= digitalRead(TFT_D6) << 6; + b |= digitalRead(TFT_D7) << 7; + + digitalWrite(TFT_RD, HIGH); + busDir(0, OUTPUT); + + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or STM32 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + if(len) { tft_Write_16(color); len--; } + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or STM32 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint16_t *data = (uint16_t*)data_in; + + if (_swapBytes) while ( len-- ) {tft_Write_16S(*data); data++;} + else while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for STM32 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + // Split out the colours + uint8_t r = (color & 0xF800)>>8; + uint8_t g = (color & 0x07E0)>>3; + uint8_t b = (color & 0x001F)<<3; + + while ( len-- ) {tft_Write_8(r); tft_Write_8(g); tft_Write_8(b);} +} + +/*************************************************************************************** +** Function name: pushPixels - for STM32 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if (_swapBytes) { + while ( len-- ) { + uint16_t color = *data >> 8 | *data << 8; + tft_Write_8((color & 0xF800)>>8); + tft_Write_8((color & 0x07E0)>>3); + tft_Write_8((color & 0x001F)<<3); + data++; + } + } + else { + while ( len-- ) { + tft_Write_8((*data & 0xF800)>>8); + tft_Write_8((*data & 0x07E0)>>3); + tft_Write_8((*data & 0x001F)<<3); + data++; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#else // Standard SPI 16-bit colour TFT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for STM32 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + while ( len-- ) {tft_Write_16(color);} +} + +/*************************************************************************************** +** Function name: pushPixels - for STM32 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + + if (_swapBytes) while ( len-- ) {tft_Write_16(*data); data++;} + else while ( len-- ) {tft_Write_16S(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +// DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// + +// Placeholder for DMA functions + +/* +Minimal function set to support DMA: + +bool TFT_eSPI::initDMA(void) +void TFT_eSPI::deInitDMA(void) +bool TFT_eSPI::dmaBusy(void) +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image) + +*/ diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.h new file mode 100644 index 0000000..df7981d --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_Generic.h @@ -0,0 +1,188 @@ + //////////////////////////////////////////////////// + // TFT_eSPI generic driver functions // + //////////////////////////////////////////////////// + +// This is a generic driver for Arduino boards, it supports SPI interface displays +// 8-bit parallel interface to TFT is not supported for generic processors + +#ifndef _TFT_eSPI_GENERICH_ +#define _TFT_eSPI_GENERICH_ + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x0000 + +// Include processor specific header +// None + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#define SET_BUS_WRITE_MODE // Not used +#define SET_BUS_READ_MODE // Not used + +// Code to check if DMA is busy, used by SPI bus transaction startWrite and endWrite functions +#define DMA_BUSY_CHECK // Not used so leave blank + +// To be safe, SUPPORT_TRANSACTIONS is assumed mandatory +#if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS +#endif + +// Initialise processor specific SPI functions, used by init() +#define INIT_TFT_DATA_BUS + +// If smooth fonts are enabled the filing system may need to be loaded +#ifdef SMOOTH_FONT + // Call up the filing system for the anti-aliased fonts + //#define FS_NO_GLOBALS + //#include +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #define DC_C digitalWrite(TFT_DC, LOW) + #define DC_D digitalWrite(TFT_DC, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #define CS_L digitalWrite(TFT_CS, LOW) + #define CS_H digitalWrite(TFT_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_RD is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_RD + #define TFT_RD -1 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_WR + #define WR_L digitalWrite(TFT_WR, LOW) + #define WR_H digitalWrite(TFT_WR, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined TOUCH_CS || (TOUCH_CS < 0) + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_MISO is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_MISO + #define TFT_MISO -1 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi.transfer(C) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ + spi.transfer(((C) & 0x07E0)>>3); \ + spi.transfer(((C) & 0x001F)<<3) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ + spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + spi.transfer(((C) & 0x1F00)>>5) + // Write 32 bits to TFT + #define tft_Write_32(C) spi.transfer16((C)>>16); spi.transfer16((uint16_t)(C)) + + // Write two address coordinates + #define tft_Write_32C(C,D) spi.transfer16(C); spi.transfer16(D) + + // Write same value twice + #define tft_Write_32D(C) spi.transfer16(C); spi.transfer16(C) + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to other displays +//////////////////////////////////////////////////////////////////////////////////////// +#else + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers + #define tft_Write_8(C) spi.transfer(C); spi.transfer(C) + #define tft_Write_16(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) + #define tft_Write_16S(C) spi.transfer((uint8_t)((C)>>0));spi.transfer((uint8_t)((C)>>8)) + + #define tft_Write_32(C) \ + tft_Write_16((uint16_t) ((C)>>16)); \ + tft_Write_16((uint16_t) ((C)>>0)) + + #define tft_Write_32C(C,D) \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0); \ + spi.transfer(0); spi.transfer((D)>>8); \ + spi.transfer(0); spi.transfer((D)>>0) + + #define tft_Write_32D(C) \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0); \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0) + + #else + #ifdef __AVR__ // AVR processors do not have 16-bit transfer + #define tft_Write_8(C) {SPDR=(C); while (!(SPSR&_BV(SPIF)));} + #define tft_Write_16(C) tft_Write_8((uint8_t)((C)>>8));tft_Write_8((uint8_t)((C)>>0)) + #define tft_Write_16S(C) tft_Write_8((uint8_t)((C)>>0));tft_Write_8((uint8_t)((C)>>8)) + #else + #define tft_Write_8(C) spi.transfer(C) + #define tft_Write_16(C) spi.transfer16(C) + #define tft_Write_16S(C) spi.transfer16(((C)>>8) | ((C)<<8)) + #endif // AVR + + #define tft_Write_32(C) \ + tft_Write_16((uint16_t) ((C)>>16)); \ + tft_Write_16((uint16_t) ((C)>>0)) + + #define tft_Write_32C(C,D) \ + tft_Write_16((uint16_t) (C)); \ + tft_Write_16((uint16_t) (D)) + + #define tft_Write_32D(C) \ + tft_Write_16((uint16_t) (C)); \ + tft_Write_16((uint16_t) (C)) + #endif // RPI_DISPLAY_TYPE +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) + // Use a bit banged function call for STM32 and bi-directional SDA pin + #define TFT_eSPI_ENABLE_8_BIT_READ // Enable tft_Read_8(void); + #define SCLK_L digitalWrite(TFT_SCLK, LOW) + #define SCLK_H digitalWrite(TFT_SCLK, LOW) +#else + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.c new file mode 100644 index 0000000..e046c7a --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.c @@ -0,0 +1,718 @@ + //////////////////////////////////////////////////// + // TFT_eSPI generic driver functions // + //////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +#if !defined (RP2040_PIO_INTERFACE) // SPI + + // Select the SPI port and board package to use + #ifdef ARDUINO_ARCH_MBED + // Arduino RP2040 board package + MbedSPI spi = MbedSPI(TFT_MISO, TFT_MOSI, TFT_SCLK); + #else + // Community RP2040 board package by Earle Philhower + //SPIClass& spi = SPI; // will use board package default pins + SPIClassRP2040 spi = SPIClassRP2040(SPI_X, TFT_MISO, -1, TFT_SCLK, TFT_MOSI); + #endif + +#else // PIO interface used (8-bit parallel or SPI) + + #ifdef RP2040_PIO_SPI + #if defined (SPI_18BIT_DRIVER) + // SPI PIO code for 18-bit colour transmit + #include "pio_SPI_18bit.pio.h" + #else + // SPI PIO code for 16-bit colour transmit + #include "pio_SPI.pio.h" + #endif + #elif defined (TFT_PARALLEL_8_BIT) + #if defined (SSD1963_DRIVER) + // PIO code for 8-bit parallel interface (18-bit colour) + #include "pio_8bit_parallel_18bpp.pio.h" + #else + // PIO code for 8-bit parallel interface (16-bit colour) + #include "pio_8bit_parallel.pio.h" + #endif + #else // must be TFT_PARALLEL_16_BIT + // PIO code for 16-bit parallel interface (16-bit colour) + #include "pio_16bit_parallel.pio.h" + #endif + + // Board package specific differences + #ifdef ARDUINO_ARCH_MBED + // Not supported at the moment + #error The Arduino RP2040 MBED board package is not supported when PIO is used. Use the community package by Earle Philhower. + #endif + + // Community RP2040 board package by Earle Philhower + PIO tft_pio = pio0; // Code will try both pio's to find a free SM + int8_t pio_sm = 0; // pioinit will claim a free one + // Updated later with the loading offset of the PIO program. + uint32_t program_offset = 0; + + // SM stalled mask + uint32_t pull_stall_mask = 0; + + // SM jump instructions to change SM behaviour + uint32_t pio_instr_jmp8 = 0; + uint32_t pio_instr_fill = 0; + uint32_t pio_instr_addr = 0; + + // SM "set" instructions to control DC control signal + uint32_t pio_instr_set_dc = 0; + uint32_t pio_instr_clr_dc = 0; + +#endif + +#ifdef RP2040_DMA + int32_t dma_tx_channel; + dma_channel_config dma_tx_config; +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (RP2040_PIO_INTERFACE) +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: tft_Read_8 +** Description: Bit bashed SPI to read bidirectional SDA line +***************************************************************************************/ +uint8_t TFT_eSPI::tft_Read_8(void) +{ + uint8_t ret = 0; + + /* + for (uint8_t i = 0; i < 8; i++) { // read results + ret <<= 1; + SCLK_L; + if (digitalRead(TFT_MOSI)) ret |= 1; + SCLK_H; + } + */ + + ret = spi.transfer(0x00); + + return ret; +} + +/*************************************************************************************** +** Function name: beginSDA +** Description: Detach SPI from pin to permit software SPI +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + // Release configured SPI port for SDA read + spi.end(); +} + +/*************************************************************************************** +** Function name: endSDA +** Description: Attach SPI pins after software SPI +***************************************************************************************/ +void TFT_eSPI::end_SDA_Read(void) +{ + // Configure SPI port ready for next TFT access + spi.begin(); +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // #if defined (TFT_SDA_READ) +//////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (RP2040_PIO_INTERFACE) +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef RP2040_PIO_SPI +void pioinit(uint32_t clock_freq) { + + // Find enough free space on one of the PIO's + tft_pio = pio0; + if (!pio_can_add_program(tft_pio, &tft_io_program)) { + tft_pio = pio1; + if (!pio_can_add_program(tft_pio, &tft_io_program)) { + // Serial.println("No room for PIO program!"); + return; + } + } + + pio_sm = pio_claim_unused_sm(tft_pio, false); + + // Load the PIO program + program_offset = pio_add_program(tft_pio, &tft_io_program); + + // Associate pins with the PIO + pio_gpio_init(tft_pio, TFT_DC); + pio_gpio_init(tft_pio, TFT_SCLK); + pio_gpio_init(tft_pio, TFT_MOSI); + + // Configure the pins to be outputs + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_DC, 1, true); + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_SCLK, 1, true); + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_MOSI, 1, true); + + // Configure the state machine + pio_sm_config c = tft_io_program_get_default_config(program_offset); + + sm_config_set_set_pins(&c, TFT_DC, 1); + // Define the single side-set pin + sm_config_set_sideset_pins(&c, TFT_SCLK); + // Define the pin used for data output + sm_config_set_out_pins(&c, TFT_MOSI, 1); + // Set clock divider, frequency is set up to 2% faster than specified, or next division down + uint16_t clock_div = 0.98 + clock_get_hz(clk_sys) / (clock_freq * 2.0); // 2 cycles per bit + sm_config_set_clkdiv(&c, clock_div); + // Make a single 8 words FIFO from the 4 words TX and RX FIFOs + sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); + // The OSR register shifts to the left, sm designed to send MS byte of a colour first, autopull off + sm_config_set_out_shift(&c, false, false, 0); + // Now load the configuration + pio_sm_init(tft_pio, pio_sm, program_offset + tft_io_offset_start_tx, &c); + + // Start the state machine. + pio_sm_set_enabled(tft_pio, pio_sm, true); + + // Create the pull stall bit mask + pull_stall_mask = 1u << (PIO_FDEBUG_TXSTALL_LSB + pio_sm); + + // Create the assembler instruction for the jump to byte send routine + pio_instr_jmp8 = pio_encode_jmp(program_offset + tft_io_offset_start_8); + pio_instr_fill = pio_encode_jmp(program_offset + tft_io_offset_block_fill); + pio_instr_addr = pio_encode_jmp(program_offset + tft_io_offset_set_addr_window); + + pio_instr_set_dc = pio_encode_set((pio_src_dest)0, 1); + pio_instr_clr_dc = pio_encode_set((pio_src_dest)0, 0); +} +#else // 8 or 16-bit parallel +void pioinit(uint16_t clock_div, uint16_t fract_div) { + + // Find enough free space on one of the PIO's + tft_pio = pio0; + if (!pio_can_add_program(tft_pio, &tft_io_program)) { + tft_pio = pio1; + if (!pio_can_add_program(tft_pio, &tft_io_program)) { + // Serial.println("No room for PIO program!"); + return; + } + } + + pio_sm = pio_claim_unused_sm(tft_pio, false); + + #if defined (TFT_PARALLEL_8_BIT) + uint8_t bits = 8; + #else // must be TFT_PARALLEL_16_BIT + uint8_t bits = 16; + #endif + + // Load the PIO program + program_offset = pio_add_program(tft_pio, &tft_io_program); + + // Associate pins with the PIO + pio_gpio_init(tft_pio, TFT_DC); + pio_gpio_init(tft_pio, TFT_WR); + + for (int i = 0; i < bits; i++) { + pio_gpio_init(tft_pio, TFT_D0 + i); + } + + // Configure the pins to be outputs + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_DC, 1, true); + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_WR, 1, true); + pio_sm_set_consecutive_pindirs(tft_pio, pio_sm, TFT_D0, bits, true); + + // Configure the state machine + pio_sm_config c = tft_io_program_get_default_config(program_offset); + // Define the set pin + sm_config_set_set_pins(&c, TFT_DC, 1); + // Define the single side-set pin + sm_config_set_sideset_pins(&c, TFT_WR); + // Define the consecutive pins that are used for data output + sm_config_set_out_pins(&c, TFT_D0, bits); + // Set clock divider and fractional divider + sm_config_set_clkdiv_int_frac(&c, clock_div, fract_div); + // Make a single 8 words FIFO from the 4 words TX and RX FIFOs + sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); + // The OSR register shifts to the left, sm designed to send MS byte of a colour first + sm_config_set_out_shift(&c, false, false, 0); + // Now load the configuration + pio_sm_init(tft_pio, pio_sm, program_offset + tft_io_offset_start_tx, &c); + + // Start the state machine. + pio_sm_set_enabled(tft_pio, pio_sm, true); + + // Create the pull stall bit mask + pull_stall_mask = 1u << (PIO_FDEBUG_TXSTALL_LSB + pio_sm); + + // Create the instructions for the jumps to send routines + pio_instr_jmp8 = pio_encode_jmp(program_offset + tft_io_offset_start_8); + pio_instr_fill = pio_encode_jmp(program_offset + tft_io_offset_block_fill); + pio_instr_addr = pio_encode_jmp(program_offset + tft_io_offset_set_addr_window); + + // Create the instructions to set and clear the DC signal + pio_instr_set_dc = pio_encode_set((pio_src_dest)0, 1); + pio_instr_clr_dc = pio_encode_set((pio_src_dest)0, 0); +} +#endif + +/*************************************************************************************** +** Function name: pushBlock - for generic processor and parallel display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +#ifdef RP2040_PIO_PUSHBLOCK +// PIO handles pixel block fill writes +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) + uint32_t col = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); + if (len) { + WAIT_FOR_STALL; + tft_pio->sm[pio_sm].instr = pio_instr_fill; + + TX_FIFO = col; + TX_FIFO = --len; // Decrement first as PIO sends n+1 + } +#else + if (len) { + WAIT_FOR_STALL; + tft_pio->sm[pio_sm].instr = pio_instr_fill; + + TX_FIFO = color; + TX_FIFO = --len; // Decrement first as PIO sends n+1 + } +#endif +} + +#else +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + while (len > 4) { + // 5 seems to be the optimum for maximum transfer rate + WAIT_FOR_FIFO_FREE(5); + TX_FIFO = color; + TX_FIFO = color; + TX_FIFO = color; + TX_FIFO = color; + TX_FIFO = color; + + len -= 5; + } + + if (len) { + // There could be a maximum of 4 words left to send + WAIT_FOR_FIFO_FREE(4); + while (len--) TX_FIFO = color; + } +} +#endif + +/*************************************************************************************** +** Function name: pushPixels - for generic processor and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) + uint16_t *data = (uint16_t*)data_in; + if (_swapBytes) { + while ( len-- ) { + uint32_t col = *data++; + tft_Write_16(col); + } + } + else { + while ( len-- ) { + uint32_t col = *data++; + tft_Write_16S(col); + } + } +#else + const uint16_t *data = (uint16_t*)data_in; + + // PIO sends MS byte first, so bytes are already swapped on transmit + if(_swapBytes) { + while (len > 4) { + WAIT_FOR_FIFO_FREE(5); + TX_FIFO = data[0]; + TX_FIFO = data[1]; + TX_FIFO = data[2]; + TX_FIFO = data[3]; + TX_FIFO = data[4]; + data += 5; + len -= 5; + } + + if (len) { + WAIT_FOR_FIFO_FREE(4); + while(len--) TX_FIFO = *data++; + } + } + else { + while (len > 4) { + WAIT_FOR_FIFO_FREE(5); + TX_FIFO = data[0] << 8 | data[0] >> 8; + TX_FIFO = data[1] << 8 | data[1] >> 8; + TX_FIFO = data[2] << 8 | data[2] >> 8; + TX_FIFO = data[3] << 8 | data[3] >> 8; + TX_FIFO = data[4] << 8 | data[4] >> 8; + data += 5; + len -= 5; + } + + if (len) { + WAIT_FOR_FIFO_FREE(4); + while(len--) { + TX_FIFO = *data << 8 | *data >> 8; + data++; + } + } + } +#endif +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ + // Avoid warnings + mask = mask; + mode = mode; +/* + // mask is unused for generic processor + // Arduino native functions suited well to a generic driver + pinMode(TFT_D0, mode); + pinMode(TFT_D1, mode); + pinMode(TFT_D2, mode); + pinMode(TFT_D3, mode); + pinMode(TFT_D4, mode); + pinMode(TFT_D5, mode); + pinMode(TFT_D6, mode); + pinMode(TFT_D7, mode); +*/ +} + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Faster GPIO pin input/output switch +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + // Avoid warnings + gpio = gpio; + mode = mode; + +} + +/*************************************************************************************** +** Function name: read byte - supports class functions +** Description: Read a byte - parallel bus only - not supported yet +***************************************************************************************/ +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0; +/* + busDir(0, INPUT); + digitalWrite(TFT_RD, LOW); + + b |= digitalRead(TFT_D0) << 0; + b |= digitalRead(TFT_D1) << 1; + b |= digitalRead(TFT_D2) << 2; + b |= digitalRead(TFT_D3) << 3; + b |= digitalRead(TFT_D4) << 4; + b |= digitalRead(TFT_D5) << 5; + b |= digitalRead(TFT_D6) << 6; + b |= digitalRead(TFT_D7) << 7; + + digitalWrite(TFT_RD, HIGH); + busDir(0, OUTPUT); +*/ + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or RP2040 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + + if(len) { tft_Write_16(color); len--; } + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or RP2040 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint16_t *data = (uint16_t*)data_in; + + if (_swapBytes) while ( len-- ) {tft_Write_16S(*data); data++;} + else while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for RP2040 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint16_t r = (color & 0xF800)>>8; + uint16_t g = (color & 0x07E0)>>3; + uint16_t b = (color & 0x001F)<<3; + + // If more than 32 pixels then change to 16-bit transfers with concatenated pixels + if (len > 32) { + uint32_t rg = r<<8 | g; + uint32_t br = b<<8 | r; + uint32_t gb = g<<8 | b; + // Must wait before changing to 16-bit + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + while ( len > 1 ) { + while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = rg; + while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = br; + while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = gb; + len -= 2; + } + // Must wait before changing back to 8-bit + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + } + + // Mop up the remaining pixels + while ( len-- ) {tft_Write_8N(r);tft_Write_8N(g);tft_Write_8N(b);} +} + +/*************************************************************************************** +** Function name: pushPixels - for RP2040 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + if (_swapBytes) { + while ( len-- ) { + uint32_t col = *data++; + tft_Write_16(col); + } + } + else { + while ( len-- ) { + uint32_t col = *data++; + tft_Write_16S(col); + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#else // Standard SPI 16-bit colour TFT +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for RP2040 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + while(len--) + { + while (!spi_is_writable(SPI_X)){}; + spi_get_hw(SPI_X)->dr = (uint32_t)color; + } +} + +/*************************************************************************************** +** Function name: pushPixels - for RP2040 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + uint16_t *data = (uint16_t*)data_in; + if (_swapBytes) { + while(len--) + { + while (!spi_is_writable(SPI_X)){}; + spi_get_hw(SPI_X)->dr = (uint32_t)(*data++); + } + } + else + { + while(len--) + { + uint16_t color = *data++; + color = color >> 8 | color << 8; + while (!spi_is_writable(SPI_X)){}; + spi_get_hw(SPI_X)->dr = (uint32_t)color; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef RP2040_DMA // DMA functions for 16-bit SPI and 8/16-bit parallel displays +//////////////////////////////////////////////////////////////////////////////////////// +/* +These are created in header file: + uint32_t dma_tx_channel; + dma_channel_config dma_tx_config; +*/ + +/*************************************************************************************** +** Function name: dmaBusy +** Description: Check if DMA is busy +***************************************************************************************/ +bool TFT_eSPI::dmaBusy(void) { + if (!DMA_Enabled) return false; + + if (dma_channel_is_busy(dma_tx_channel)) return true; + +#if !defined (RP2040_PIO_INTERFACE) + // For SPI must also wait for FIFO to flush and reset format + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); +#endif + + return false; +} + +/*************************************************************************************** +** Function name: dmaWait +** Description: Wait until DMA is over (blocking!) +***************************************************************************************/ +void TFT_eSPI::dmaWait(void) +{ + while (dma_channel_is_busy(dma_tx_channel)); + +#if !defined (RP2040_PIO_INTERFACE) + // For SPI must also wait for FIFO to flush and reset format + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); +#endif +} + +/*************************************************************************************** +** Function name: pushPixelsDMA +** Description: Push pixels to TFT +***************************************************************************************/ +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +{ + if ((len == 0) || (!DMA_Enabled)) return; + + dmaWait(); + + channel_config_set_bswap(&dma_tx_config, !_swapBytes); + +#if !defined (RP2040_PIO_INTERFACE) + dma_channel_configure(dma_tx_channel, &dma_tx_config, &spi_get_hw(SPI_X)->dr, (uint16_t*)image, len, true); +#else + dma_channel_configure(dma_tx_channel, &dma_tx_config, &tft_pio->txf[pio_sm], (uint16_t*)image, len, true); +#endif +} + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window +***************************************************************************************/ +// This will clip to the viewport +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image, uint16_t* buffer) +{ + if ((x >= _vpW) || (y >= _vpH) || (!DMA_Enabled)) return; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return; + + uint32_t len = dw*dh; + + if (buffer == nullptr) { + buffer = image; + dmaWait(); + } + + // If image is clipped, copy pixels into a contiguous block + if ( (dw != w) || (dh != h) ) { + for (int32_t yb = 0; yb < dh; yb++) { + memmove((uint8_t*) (buffer + yb * dw), (uint8_t*) (image + dx + w * (yb + dy)), dw << 1); + } + } + // else, if a buffer pointer has been provided copy whole image to the buffer + else if (buffer != image || _swapBytes) { + memcpy(buffer, image, len*2); + } + + dmaWait(); // In case we did not wait earlier + + setAddrWindow(x, y, dw, dh); + + channel_config_set_bswap(&dma_tx_config, !_swapBytes); + +#if !defined (RP2040_PIO_INTERFACE) + dma_channel_configure(dma_tx_channel, &dma_tx_config, &spi_get_hw(SPI_X)->dr, (uint16_t*)buffer, len, true); +#else + dma_channel_configure(dma_tx_channel, &dma_tx_config, &tft_pio->txf[pio_sm], (uint16_t*)buffer, len, true); +#endif +} + +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + if (DMA_Enabled) return false; + + ctrl_cs = ctrl_cs; // stop unused parameter warning + + dma_tx_channel = dma_claim_unused_channel(false); + + if (dma_tx_channel < 0) return false; + + dma_tx_config = dma_channel_get_default_config(dma_tx_channel); + + channel_config_set_transfer_data_size(&dma_tx_config, DMA_SIZE_16); +#if !defined (RP2040_PIO_INTERFACE) + channel_config_set_dreq(&dma_tx_config, spi_get_index(SPI_X) ? DREQ_SPI1_TX : DREQ_SPI0_TX); +#else + channel_config_set_dreq(&dma_tx_config, pio_get_dreq(tft_pio, pio_sm, true)); +#endif + + DMA_Enabled = true; + return true; +} + +/*************************************************************************************** +** Function name: deInitDMA +** Description: Disconnect the DMA engine from SPI +***************************************************************************************/ +void TFT_eSPI::deInitDMA(void) +{ + if (!DMA_Enabled) return; + dma_channel_unclaim(dma_tx_channel); + DMA_Enabled = false; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.h new file mode 100644 index 0000000..f10058f --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_RP2040.h @@ -0,0 +1,499 @@ + //////////////////////////////////////////////////// + // TFT_eSPI generic driver functions // + //////////////////////////////////////////////////// + +// This is a generic driver for Arduino boards, it supports SPI interface displays +// 8-bit parallel interface to TFT is not supported for generic processors + +#ifndef _TFT_eSPI_RP2040H_ +#define _TFT_eSPI_RP2040H_ + +#ifndef ARDUINO_ARCH_MBED + #include + #define FONT_FS_AVAILABLE + #define SPIFFS LittleFS +#endif + +// Required for both the official and community board packages +#include "hardware/dma.h" +#include "hardware/pio.h" +#include "hardware/clocks.h" + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x2040 + +// Transactions always supported +#ifndef SUPPORT_TRANSACTIONS + #define SUPPORT_TRANSACTIONS +#endif + +// Include processor specific header +// None + +#if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RP2040_PIO_SPI) + #define RP2040_PIO_INTERFACE + #define RP2040_PIO_PUSHBLOCK +#endif + +#if !defined (RP2040_PIO_INTERFACE)// SPI + // Use SPI0 as default if not defined + #ifndef TFT_SPI_PORT + #define TFT_SPI_PORT 0 + #endif + + #if (TFT_SPI_PORT == 0) + #define SPI_X spi0 + #else + #define SPI_X spi1 + #endif + + // Processor specific code used by SPI bus transaction begin/end_tft_write functions + #define SET_BUS_WRITE_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)(TFT_SPI_MODE >> 1), (spi_cpha_t)(TFT_SPI_MODE & 0x1), SPI_MSB_FIRST) + #define SET_BUS_READ_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) +#else + // Processor specific code used by SPI bus transaction begin/end_tft_write functions + #define SET_BUS_WRITE_MODE + #define SET_BUS_READ_MODE +#endif + +// Code to check if SPI or DMA is busy, used by SPI bus transaction startWrite and/or endWrite functions +#if !defined(SPI_18BIT_DRIVER) + #define RP2040_DMA + // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions + #define DMA_BUSY_CHECK dmaWait() +#else + #define DMA_BUSY_CHECK +#endif + +// Handle high performance MHS RPi display type +#if defined (MHS_DISPLAY_TYPE) && !defined (RPI_DISPLAY_TYPE) + #define RPI_DISPLAY_TYPE +#endif + +#if !defined (RP2040_PIO_INTERFACE) // SPI + + #if defined (MHS_DISPLAY_TYPE) // High speed RPi TFT type always needs 16-bit transfers + // This swaps to 16-bit mode, used for commands so wait avoids clash with DC timing + #define INIT_TFT_DATA_BUS hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS) + #else + // Initialise processor specific SPI functions, used by init() + #define INIT_TFT_DATA_BUS // Not used + #endif + + // Wait for tx to end, flush rx FIFO, clear rx overrun + #define SPI_BUSY_CHECK while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + while (spi_is_readable(SPI_X)) (void)spi_get_hw(SPI_X)->dr; \ + spi_get_hw(SPI_X)->icr = SPI_SSPICR_RORIC_BITS + + // To be safe, SUPPORT_TRANSACTIONS is assumed mandatory + #if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS + #endif +#else + + // Different controllers have different minimum write cycle periods, so the PIO clock is changed accordingly + // The PIO clock is a division of the CPU clock so scales when the processor is overclocked + // PIO write frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) + // The write cycle periods below assume a 125MHz CPU clock speed + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) + #if defined (RP2040_PIO_CLK_DIV) + #if (RP2040_PIO_CLK_DIV > 0) + #define DIV_UNITS RP2040_PIO_CLK_DIV + #define DIV_FRACT 0 + #else + #define DIV_UNITS 3 + #define DIV_FRACT 0 + #endif + #elif defined (TFT_PARALLEL_16_BIT) + // Different display drivers have different minimum write cycle times + #if defined (HX8357C_DRIVER) || defined (SSD1963_DRIVER) + #define DIV_UNITS 1 // 32ns write cycle time SSD1963, HX8357C (maybe HX8357D?) + #elif defined (ILI9486_DRIVER) || defined (HX8357B_DRIVER) || defined (HX8357D_DRIVER) + #define DIV_UNITS 2 // 64ns write cycle time ILI9486, HX8357D, HX8357B + #else // ILI9481 needs a slower cycle time + #define DIV_UNITS 3 // 96ns write cycle time + #endif + #define DIV_FRACT 0 + #else // 8-bit parallel mode default 64ns write cycle time + #define DIV_UNITS 2 + #define DIV_FRACT 0 // Note: Fractional values done with clock period dithering + #endif + #endif + + // Initialise TFT data bus + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) + #define INIT_TFT_DATA_BUS pioinit(DIV_UNITS, DIV_FRACT); + #elif defined (RP2040_PIO_SPI) + #define INIT_TFT_DATA_BUS pioinit(SPI_FREQUENCY); + #endif + + #define SPI_BUSY_CHECK + + // Set the state machine clock divider (from integer and fractional parts - 16:8) + #define PARALLEL_INIT_TFT_DATA_BUS // Not used + +#endif + + +// If smooth fonts are enabled the filing system may need to be loaded +#if defined (SMOOTH_FONT) && !defined (ARDUINO_ARCH_MBED) + // Call up the filing system for the anti-aliased fonts + //#define FS_NO_GLOBALS + #include +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_DC + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code +#else + #if !defined (RP2040_PIO_INTERFACE)// SPI + //#define DC_C sio_hw->gpio_clr = (1ul << TFT_DC) + //#define DC_D sio_hw->gpio_set = (1ul << TFT_DC) + #if defined (RPI_DISPLAY_TYPE) && !defined (MHS_DISPLAY_TYPE) + #define DC_C digitalWrite(TFT_DC, LOW); + #define DC_D digitalWrite(TFT_DC, HIGH); + #else + #define DC_C sio_hw->gpio_clr = (1ul << TFT_DC) + #define DC_D sio_hw->gpio_set = (1ul << TFT_DC) + #endif + #else + // PIO takes control of TFT_DC + // Must wait for data to flush through before changing DC line + #define DC_C WAIT_FOR_STALL; \ + tft_pio->sm[pio_sm].instr = pio_instr_clr_dc + + #ifndef RM68120_DRIVER + // Flush has happened before this and mode changed back to 16-bit + #define DC_D tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #else + // Need to wait for stall since RM68120 commands are 16-bit + #define DC_D WAIT_FOR_STALL; tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #endif + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_CS + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code +#else + #if !defined (RP2040_PIO_INTERFACE) // SPI + #if defined (RPI_DISPLAY_TYPE) && !defined (MHS_DISPLAY_TYPE) + #define CS_L digitalWrite(TFT_CS, LOW); + #define CS_H digitalWrite(TFT_CS, HIGH); + #else + #define CS_L sio_hw->gpio_clr = (1ul << TFT_CS) + #define CS_H sio_hw->gpio_set = (1ul << TFT_CS) + #endif + #else // PIO interface display + #define CS_L sio_hw->gpio_clr = (1ul << TFT_CS) + #define CS_H WAIT_FOR_STALL; sio_hw->gpio_set = (1ul << TFT_CS) + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_RD is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +// At the moment read is not supported for parallel mode, tie TFT signal high +#ifdef TFT_RD + #if (TFT_RD >= 0) + #define RD_L sio_hw->gpio_clr = (1ul << TFT_RD) + //#define RD_L digitalWrite(TFT_WR, LOW) + #define RD_H sio_hw->gpio_set = (1ul << TFT_RD) + //#define RD_H digitalWrite(TFT_WR, HIGH) + #else + #define RD_L + #define RD_H + #endif +#else + #define TFT_RD -1 + #define RD_L + #define RD_H +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) // SPI + #ifdef TFT_WR + #define WR_L digitalWrite(TFT_WR, LOW) + #define WR_H digitalWrite(TFT_WR, HIGH) + #endif +#else + // The PIO manages the write line +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (RP2040_PIO_INTERFACE)// SPI + #if !defined TOUCH_CS || (TOUCH_CS < 0) + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code + #else + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) + #endif +#else + #ifdef TOUCH_CS + #error Touch screen not supported in parallel or SPI PIO mode, use a separate library. + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_MISO is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +#ifndef TFT_MISO + #define TFT_MISO -1 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (RP2040_PIO_INTERFACE) // SPI + + #if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + // Write 8 bits to TFT + #define tft_Write_8(C) spi_get_hw(SPI_X)->dr = (uint32_t)(C); \ + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + + //#define tft_Write_8(C) spi.transfer(C); + #define tft_Write_8N(B) while (!spi_is_writable(SPI_X)){}; \ + spi_get_hw(SPI_X)->dr = (uint8_t)(B) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16(C) tft_Write_8N(((C) & 0xF800)>>8); \ + tft_Write_8N(((C) & 0x07E0)>>3); \ + tft_Write_8N(((C) & 0x001F)<<3) + + // Convert 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16N(C) tft_Write_8N(((C) & 0xF800)>>8); \ + tft_Write_8N(((C) & 0x07E0)>>3); \ + tft_Write_8N(((C) & 0x001F)<<3) + + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes + #define tft_Write_16S(C) tft_Write_8N((C) & 0xF8); \ + tft_Write_8N(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ + tft_Write_8N(((C) & 0x1F00)>>5) + // Write 32 bits to TFT + #define tft_Write_32(C) tft_Write_8N(C>>24); \ + tft_Write_8N(C>>16); \ + tft_Write_8N(C>>8); \ + tft_Write_8N(C) + + // Write two address coordinates + #define tft_Write_32C(C,D) tft_Write_8N(C>>8); \ + tft_Write_8N(C); \ + tft_Write_8N(D>>8); \ + tft_Write_8N(D) + + // Write same value twice + #define tft_Write_32D(C) tft_Write_8N(C>>8); \ + tft_Write_8N(C); \ + tft_Write_8N(C>>8); \ + tft_Write_8N(C) + + //////////////////////////////////////////////////////////////////////////////////////// + // Macros to write commands/pixel colour data to other displays + //////////////////////////////////////////////////////////////////////////////////////// + #else + #if defined (MHS_DISPLAY_TYPE) // High speed RPi TFT type always needs 16-bit transfers + // This swaps to 16-bit mode, used for commands so wait avoids clash with DC timing + #define tft_Write_8(C) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); \ + spi_get_hw(SPI_X)->dr = (uint32_t)((C) | ((C)<<8)); \ + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + + // Note: the following macros do not wait for the end of transmission + + #define tft_Write_16(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16N(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16S(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C)<<8 | (C)>>8 + + #define tft_Write_32(C) spi_get_hw(SPI_X)->dr = (uint32_t)((C)>>16); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_32C(C,D) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(D) + + #define tft_Write_32D(C) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #elif defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers + #define tft_Write_8(C) spi.transfer(C); spi.transfer(C) + #define tft_Write_16(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) + #define tft_Write_16N(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) + #define tft_Write_16S(C) spi.transfer((uint8_t)((C)>>0));spi.transfer((uint8_t)((C)>>8)) + + #define tft_Write_32(C) \ + tft_Write_16((uint16_t) ((C)>>16)); \ + tft_Write_16((uint16_t) ((C)>>0)) + + #define tft_Write_32C(C,D) \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0); \ + spi.transfer(0); spi.transfer((D)>>8); \ + spi.transfer(0); spi.transfer((D)>>0) + + #define tft_Write_32D(C) \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0); \ + spi.transfer(0); spi.transfer((C)>>8); \ + spi.transfer(0); spi.transfer((C)>>0) + + #elif defined (ILI9225_DRIVER) // Needs gaps between commands + data bytes, so use slower transfer functions + + // Warning: these all end in 8-bit SPI mode! + #define tft_Write_8(C) spi.transfer(C); + + #define tft_Write_16(C) spi.transfer16(C) + + #define tft_Write_16N(C) spi.transfer16(C) + + #define tft_Write_16S(C) spi.transfer16((C)<<8 | (C)>>8) + + #define tft_Write_32(C) spi.transfer16((C)>>16); spi.transfer16(C) + + #define tft_Write_32C(C,D) spi.transfer16(C); spi.transfer16(D) + + #define tft_Write_32D(C) spi.transfer16(C); spi.transfer16(C) + + #else + + // This swaps to 8-bit mode, then back to 16-bit mode + #define tft_Write_8(C) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); \ + spi_get_hw(SPI_X)->dr = (uint32_t)(C); \ + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS) + + // Note: the following macros do not wait for the end of transmission + + #define tft_Write_16(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16N(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16S(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C)<<8 | (C)>>8 + + #define tft_Write_32(C) spi_get_hw(SPI_X)->dr = (uint32_t)((C)>>16); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_32C(C,D) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(D) + + #define tft_Write_32D(C) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #endif // RPI_DISPLAY_TYPE + #endif + +#else // Parallel 8-bit or PIO SPI + + // Wait for the PIO to stall (SM pull request finds no data in TX FIFO) + // This is used to detect when the SM is idle and hence ready for a jump instruction + #define WAIT_FOR_STALL tft_pio->fdebug = pull_stall_mask; while (!(tft_pio->fdebug & pull_stall_mask)) + + // Wait until at least "S" locations free + #define WAIT_FOR_FIFO_FREE(S) while (((tft_pio->flevel >> (pio_sm * 8)) & 0x000F) > (8-S)){} + + // Wait until at least 5 locations free + #define WAIT_FOR_FIFO_5_FREE while ((tft_pio->flevel) & (0x000c << (pio_sm * 8))){} + + // Wait until at least 1 location free + #define WAIT_FOR_FIFO_1_FREE while ((tft_pio->flevel) & (0x0008 << (pio_sm * 8))){} + + // Wait for FIFO to empty (use before swapping to 8 bits) + #define WAIT_FOR_FIFO_EMPTY while(!(tft_pio->fstat & (1u << (PIO_FSTAT_TXEMPTY_LSB + pio_sm)))) + + // The write register of the TX FIFO. + #define TX_FIFO tft_pio->txf[pio_sm] + + // Temporary - to be deleted + #define GPIO_DIR_MASK 0 + + #if defined (SPI_18BIT_DRIVER) || defined (SSD1963_DRIVER) // 18-bit colour (3 bytes) + // This writes 8 bits, then switches back to 16-bit mode automatically + // Have already waited for pio stalled (last data write complete) when DC switched to command mode + // The wait for stall allows DC to be changed immediately afterwards + #define tft_Write_8(C) tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ + TX_FIFO = (C); \ + WAIT_FOR_STALL + + // Used to send last byte for 32-bit macros below since PIO sends 24 bits + #define tft_Write_8L(C) WAIT_FOR_STALL; \ + tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ + TX_FIFO = (C) + + // Note: the following macros do not wait for the end of transmission + + #define tft_Write_16(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = ((((uint32_t)(C) & 0xF800)<<8) | (((C) & 0x07E0)<<5) | (((C) & 0x001F)<<3)) + + #define tft_Write_16N(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = ((((uint32_t)(C) & 0xF800)<<8) | (((C) & 0x07E0)<<5) | (((C) & 0x001F)<<3)) + + #define tft_Write_16S(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = ((((uint32_t)(C) & 0xF8) << 16) | (((C) & 0xE000)>>3) | (((C) & 0x07)<<13) | (((C) & 0x1F00)>>5)) + + #define tft_Write_32(C) WAIT_FOR_FIFO_FREE(2); TX_FIFO = ((C)>>8); WAIT_FOR_STALL; tft_Write_8(C) + + #define tft_Write_32C(C,D) WAIT_FOR_FIFO_FREE(2); TX_FIFO = (((C)<<8) | ((D)>>8)); tft_Write_8L(D) + + #define tft_Write_32D(C) WAIT_FOR_FIFO_FREE(2); TX_FIFO = (((C)<<8) | ((C)>>8)); tft_Write_8L(C) + + #else // PIO interface, SPI or parallel + // This writes 8 bits, then switches back to 16-bit mode automatically + // Have already waited for pio stalled (last data write complete) when DC switched to command mode + // The wait for stall allows DC to be changed immediately afterwards + #if defined (TFT_PARALLEL_8_BIT) || defined (RP2040_PIO_SPI) + #define tft_Write_8(C) tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ + TX_FIFO = (C); \ + WAIT_FOR_STALL + #else // For 16-bit parallel 16 bits are always sent + #define tft_Write_8(C) TX_FIFO = (C); \ + WAIT_FOR_STALL + #endif + + // Note: the following macros do not wait for the end of transmission + + #define tft_Write_16(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = (C) + + #define tft_Write_16N(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = (C) + + #define tft_Write_16S(C) WAIT_FOR_FIFO_FREE(1); TX_FIFO = ((C)<<8) | ((C)>>8) + + #define tft_Write_32(C) WAIT_FOR_FIFO_FREE(2); TX_FIFO = ((C)>>16); TX_FIFO = (C) + + #define tft_Write_32C(C,D) WAIT_FOR_FIFO_FREE(2); TX_FIFO = (C); TX_FIFO = (D) + + #define tft_Write_32D(C) WAIT_FOR_FIFO_FREE(2); TX_FIFO = (C); TX_FIFO = (C) + #endif +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (RP2040_PIO_INTERFACE)// SPI + #if defined (TFT_SDA_READ) + // Use a bit banged function call for STM32 and bi-directional SDA pin + #define TFT_eSPI_ENABLE_8_BIT_READ // Enable tft_Read_8(void); + #define SCLK_L digitalWrite(TFT_SCLK, LOW) + #define SCLK_H digitalWrite(TFT_SCLK, LOW) + #else + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) + #endif +#endif +//////////////////////////////////////////////////////////////////////////////////////// +// Temporary to keep the "Arduino Mbed OS RP2040 Boards" support package happy +//////////////////////////////////////////////////////////////////////////////////////// +#if defined(ARDUINO_ARCH_RP2040) + + #define ltoa itoa + +#endif + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.c b/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.c new file mode 100644 index 0000000..a74dcbc --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.c @@ -0,0 +1,696 @@ + //////////////////////////////////////////////////// + // TFT_eSPI Driver functions for STM32 processors // + //////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////////////////////// + +#if defined (TFT_PARALLEL_8_BIT) + // No globals +#else + // Use STM32 default SPI port + #if !defined (TFT_MOSI) || !defined (TFT_MISO) || !defined (TFT_SCLK) + SPIClass& spi = SPI; + #else + SPIClass spi(TFT_MOSI, TFT_MISO, TFT_SCLK); + #endif + // SPI HAL peripheral handle + SPI_HandleTypeDef spiHal; +#endif + +#ifdef STM32_DMA + // DMA HAL handle + DMA_HandleTypeDef dmaHal; +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) +//////////////////////////////////////////////////////////////////////////////////////// + +/***************************************************************************************############# UNTESTED ################### +** Function name: tft_Read_8 +** Description: STM32 software SPI to read bidirectional SDA line +***************************************************************************************/ +uint8_t TFT_eSPI::tft_Read_8(void) +{ + uint8_t ret = 0; + uint32_t reg = 0; + + for (uint8_t i = 0; i < 8; i++) { // read results + ret <<= 1; + SCLK_L; + if (digitalRead(TFT_MOSI)) ret |= 1; + SCLK_H; + } + + return ret; +} + +/***************************************************************************************############# UNTESTED ################### +** Function name: beginSDA +** Description: Detach SPI from pin to permit software SPI +***************************************************************************************/ +void TFT_eSPI::begin_SDA_Read(void) +{ + // Release configured SPI port for SDA read + spi.end();// Code missing here! <<<<<<<<<<<<< 0.374s + while (len>31) { + #if !defined (SSD1963_DRIVER) + // 32D macro writes 16 bits twice + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=32; + } + + while (len>7) { + #if !defined (SSD1963_DRIVER) + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=8; + } + + while (len--) {tft_Write_16(color);} +} + + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 and parallel display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ + + uint16_t *data = (uint16_t*)data_in; + + if(_swapBytes) { + while (len>1) {tft_Write_16(*data); data++; tft_Write_16(*data); data++; len -=2;} + if (len) {tft_Write_16(*data);} + return; + } + + while (len>1) {tft_Write_16S(*data); data++; tft_Write_16S(*data); data++; len -=2;} + if (len) {tft_Write_16S(*data);} +} + + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set parallel bus to INPUT or OUTPUT +***************************************************************************************/ +void TFT_eSPI::busDir(uint32_t mask, uint8_t mode) +{ +#if defined (STM_PORTA_DATA_BUS) + #if defined (STM32F1xx) + if (mode == OUTPUT) GPIOA->CRL = 0x33333333; + else GPIOA->CRL = 0x88888888; + #else + if (mode == OUTPUT) GPIOA->MODER = (GPIOA->MODER & 0xFFFF0000) | 0x00005555; + else GPIOA->MODER &= 0xFFFF0000; + #endif +#elif defined (STM_PORTB_DATA_BUS) + #if defined (STM32F1xx) + if (mode == OUTPUT) GPIOB->CRL = 0x33333333; + else GPIOB->CRL = 0x88888888; + #else + if (mode == OUTPUT) GPIOB->MODER = (GPIOB->MODER & 0xFFFF0000) | 0x00005555; + else GPIOB->MODER &= 0xFFFF0000; + #endif +#elif defined (STM_PORTC_DATA_BUS) + #if defined (STM32F1xx) + if (mode == OUTPUT) GPIOC->CRL = 0x33333333; + else GPIOC->CRL = 0x88888888; + #else + if (mode == OUTPUT) GPIOC->MODER = (GPIOC->MODER & 0xFFFF0000) | 0x00005555; + else GPIOC->MODER &= 0xFFFF0000; + #endif +#elif defined (STM_PORTD_DATA_BUS) + #if defined (STM32F1xx) + if (mode == OUTPUT) GPIOD->CRL = 0x33333333; + else GPIOD->CRL = 0x88888888; + #else + if (mode == OUTPUT) GPIOD->MODER = (GPIOD->MODER & 0xFFFF0000) | 0x00005555; + else GPIOD->MODER &= 0xFFFF0000; + #endif +#else + if (mode == OUTPUT) { + LL_GPIO_SetPinMode(D0_PIN_PORT, D0_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D1_PIN_PORT, D1_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D2_PIN_PORT, D2_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D3_PIN_PORT, D3_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D4_PIN_PORT, D4_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D5_PIN_PORT, D5_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D6_PIN_PORT, D6_PIN_MASK, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(D7_PIN_PORT, D7_PIN_MASK, LL_GPIO_MODE_OUTPUT); + } + else { + LL_GPIO_SetPinMode(D0_PIN_PORT, D0_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D1_PIN_PORT, D1_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D2_PIN_PORT, D2_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D3_PIN_PORT, D3_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D4_PIN_PORT, D4_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D5_PIN_PORT, D5_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D6_PIN_PORT, D6_PIN_MASK, LL_GPIO_MODE_INPUT); + LL_GPIO_SetPinMode(D7_PIN_PORT, D7_PIN_MASK, LL_GPIO_MODE_INPUT); + } +#endif +} + + +/*************************************************************************************** +** Function name: GPIO direction control - supports class functions +** Description: Set STM32 GPIO pin to input or output (set high) ASAP +***************************************************************************************/ +void TFT_eSPI::gpioMode(uint8_t gpio, uint8_t mode) +{ + PinName pn = digitalPinToPinName(gpio); + // Push-pull output with no pullup + if (mode == OUTPUT) pin_function(pn, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0)); + // Input with pullup + else pin_function(pn, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)); +} + +/***************************************************************************************############# UNTESTED ################### +** Function name: read byte - supports class functions +** Description: Read a byte - parallel bus only +***************************************************************************************/ +uint8_t TFT_eSPI::readByte(void) +{ + uint8_t b = 0; + + RD_L; +#if defined (STM_PORTA_DATA_BUS) + b = GPIOA->IDR; + b = GPIOA->IDR; + b = GPIOA->IDR; + b = (GPIOA->IDR) & 0xFF; +#elif defined (STM_PORTB_DATA_BUS) + b = GPIOB->IDR; + b = GPIOB->IDR; + b = GPIOB->IDR; + b = (GPIOB->IDR) & 0xFF; +#elif defined (STM_PORTC_DATA_BUS) + b = GPIOC->IDR; + b = GPIOC->IDR; + b = GPIOC->IDR; + b = (GPIOC->IDR) & 0xFF; +#elif defined (STM_PORTD_DATA_BUS) + b = GPIOD->IDR; + b = GPIOD->IDR; + b = GPIOD->IDR; + b = (GPIOD->IDR) & 0xFF; +#else + b = RD_TFT_D0 | RD_TFT_D0 | RD_TFT_D0 | RD_TFT_D0; //Delay for bits to settle + + b = RD_TFT_D0 | RD_TFT_D1 | RD_TFT_D2 | RD_TFT_D3; + b |= RD_TFT_D4 | RD_TFT_D5 | RD_TFT_D6 | RD_TFT_D7; +#endif + RD_H; + + return b; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_WRITE_STROBE) // For RPi TFT with write strobe ############# UNTESTED ################### +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for ESP32 or STM32 RPi TFT +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + if(len) { tft_Write_16(color); len--; } + while(len--) {WR_L; WR_H;} +} + +/*************************************************************************************** +** Function name: pushPixels - for ESP32 or STM32 RPi TFT +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint16_t *data = (uint16_t*)data_in; + + if (_swapBytes) while ( len-- ) { tft_Write_16S(*data); data++;} + else while ( len-- ) {tft_Write_16(*data); data++;} +} + +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for STM32 and 3 byte RGB display +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +#define BUF_SIZE 240*3 +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + //uint8_t col[BUF_SIZE]; + // Always using swapped bytes is a peculiarity of this function... + //color = color>>8 | color<<8; + uint8_t r = (color & 0xF800)>>8; // Red + uint8_t g = (color & 0x07E0)>>3; // Green + uint8_t b = (color & 0x001F)<<3; // Blue + + while(len--) { + TX_FIFO = (r); + TX_FIFO = (g); + TX_FIFO = (b); + } + SPI_BUSY_CHECK; +} +/*************************************************************************************** +** Function name: pushPixels - for STM32 and 3 byte RGB display +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint16_t *data = (uint16_t*)data_in; + + if(!_swapBytes) { + while ( len-- ) { + // Split out the colours + TX_FIFO = (*data & 0xF8); // Red + TX_FIFO = (*data & 0xE000)>>11 | (*data & 0x07)<<5; // Green + TX_FIFO = (*data & 0x1F00)>>5; // Blue + data++; + } + } + else { + while ( len-- ) { + // Split out the colours + TX_FIFO = (*data & 0xF800)>>8; // Red + TX_FIFO = (*data & 0x07E0)>>3; // Green + TX_FIFO = (*data & 0x001F)<<3; // Blue + data++; + } + } + SPI_BUSY_CHECK; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#else // Standard SPI 16-bit colour TFT All Tested +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: pushBlock - for STM32 +** Description: Write a block of pixels of the same colour +***************************************************************************************/ +#define BUF_SIZE 480 +/* +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) +{ + uint16_t col[BUF_SIZE]; + // Always using swapped bytes is a peculiarity of this function... + uint16_t swapColor = color>>8 | color<<8; + if (len=BUF_SIZE ) ; + // Send remaining pixels + if (len) HAL_SPI_Transmit(&spiHal, (uint8_t*)col, len<<1, HAL_MAX_DELAY); +} + //*/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + // Loop unrolling improves speed dramatically graphics test 0.634s => 0.374s + while (len>31) { + #if !defined (SSD1963_DRIVER) + // 32D macro writes 16 bits twice + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=32; + } + + while (len>7) { + #if !defined (SSD1963_DRIVER) + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=8; + } + + while (len--) {tft_Write_16(color);} +} + + +/*************************************************************************************** +** Function name: pushPixels - for STM32 +** Description: Write a sequence of pixels +***************************************************************************************/ +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) +{ + uint16_t *data = (uint16_t*)data_in; + + if(_swapBytes) { + while ( len-- ) { + TX_FIFO = (uint8_t)(*data>>8); + TX_FIFO = (uint8_t)(*data); + data++; + } + } + else { + while ( len-- ) { + // Split out the colours + TX_FIFO = (uint8_t)(*data); + TX_FIFO = (uint8_t)(*data>>8); + data++; + } + } + SPI_BUSY_CHECK; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of display interface specific functions +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +#if defined STM32_DMA && !defined (TFT_PARALLEL_8_BIT) // DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************** +** Function name: dmaBusy +** Description: Check if DMA is busy (usefully non-blocking!) +***************************************************************************************/ +// Use while( tft.dmaBusy() ) {Do-something-useful;}" +bool TFT_eSPI::dmaBusy(void) +{ + //return (dmaHal.State == HAL_DMA_STATE_BUSY); // Do not use, SPI may still be busy + return (spiHal.State == HAL_SPI_STATE_BUSY_TX); // Check if SPI Tx is busy +} + + +/*************************************************************************************** +** Function name: dmaWait +** Description: Wait until DMA is over (blocking!) +***************************************************************************************/ +void TFT_eSPI::dmaWait(void) +{ + //return (dmaHal.State == HAL_DMA_STATE_BUSY); // Do not use, SPI may still be busy + while (spiHal.State == HAL_SPI_STATE_BUSY_TX); // Check if SPI Tx is busy +} + + +/*************************************************************************************** +** Function name: pushPixelsDMA +** Description: Push pixels to TFT (len must be less than 32767) +***************************************************************************************/ +// This will byte swap the original image if setSwapBytes(true) was called by sketch. +void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) +{ + if (len == 0) return; + + // Wait for any current DMA transaction to end + while (spiHal.State == HAL_SPI_STATE_BUSY_TX); // Check if SPI Tx is busy + + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); + } + + HAL_SPI_Transmit_DMA(&spiHal, (uint8_t*)image, len << 1); +} + + +/*************************************************************************************** +** Function name: pushImageDMA +** Description: Push image to a window (w*h must be less than 65536) +***************************************************************************************/ +// This will clip and also swap bytes if setSwapBytes(true) was called by sketch +void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* image, uint16_t* buffer) +{ + if ((x >= _vpW) || (y >= _vpH)) return; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return; + + uint32_t len = dw*dh; + + if (buffer == nullptr) { + buffer = image; + while (spiHal.State == HAL_SPI_STATE_BUSY_TX); // Check if SPI Tx is busy + } + + // If image is clipped, copy pixels into a contiguous block + if ( (dw != w) || (dh != h) ) { + if(_swapBytes) { + for (int32_t yb = 0; yb < dh; yb++) { + for (int32_t xb = 0; xb < dw; xb++) { + uint32_t src = xb + dx + w * (yb + dy); + (buffer[xb + yb * dw] = image[src] << 8 | image[src] >> 8); + } + } + } + else { + for (int32_t yb = 0; yb < dh; yb++) { + memcpy((uint8_t*) (buffer + yb * dw), (uint8_t*) (image + dx + w * (yb + dy)), dw << 1); + } + } + } + // else, if a buffer pointer has been provided copy whole image to the buffer + else if (buffer != image || _swapBytes) { + if(_swapBytes) { + for (uint32_t i = 0; i < len; i++) (buffer[i] = image[i] << 8 | image[i] >> 8); + } + else { + memcpy(buffer, image, len*2); + } + } + + setWindow(x, y, x + dw - 1, y + dh - 1); + + // DMA byte count for transmit is only 16 bits maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32767 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + while(len>0x7FFF) { // Transfer 16-bit pixels in blocks if len*2 over 65534 bytes + HAL_SPI_Transmit(&spiHal, (uint8_t*)buffer, 0x800<<1, HAL_MAX_DELAY); + len -= 0x800; buffer+= 0x800; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + // Send remaining pixels using DMA (max 65534 bytes) + HAL_SPI_Transmit_DMA(&spiHal, (uint8_t*)buffer, len << 1); +} + +//////////////////////////////////////////////////////////////////////////////////////// +// Processor specific DMA initialisation +//////////////////////////////////////////////////////////////////////////////////////// + +// The DMA functions here work with SPI only (not parallel) +#if defined (STM32F2xx) || defined (STM32F4xx) || defined (STM32F7xx) +/*************************************************************************************** +** Function name: DMAX_StreamX_IRQHandler +** Description: Override the default HAL stream X interrupt handler +***************************************************************************************/ + #if (TFT_SPI_PORT == 1) + extern "C" void DMA2_Stream3_IRQHandler(); + void DMA2_Stream3_IRQHandler(void) + #elif (TFT_SPI_PORT == 2) + extern "C" void DMA1_Stream4_IRQHandler(); + void DMA1_Stream4_IRQHandler(void) + #elif (TFT_SPI_PORT == 3) + extern "C" void DMA1_Stream5_IRQHandler(); + void DMA1_Stream5_IRQHandler(void) + #endif + { + // Call the default end of buffer handler + HAL_DMA_IRQHandler(&dmaHal); + } + +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +// This initialisation is for STM32F2xx/4xx/7xx processors and may not work on others +// Dual core H7xx series not supported yet, they are different and have a DMA MUX: +// https://electronics.stackexchange.com/questions/379813/configuring-the-dma-request-multiplexer-on-a-stm32h7-mcu +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + ctrl_cs = ctrl_cs; // Not used for STM32, so stop compiler warning + + #if (TFT_SPI_PORT == 1) + __HAL_RCC_DMA2_CLK_ENABLE(); // Enable DMA2 clock + dmaHal.Init.Channel = DMA_CHANNEL_3; // DMA channel 3 is for SPI1 TX + #elif (TFT_SPI_PORT == 2) + __HAL_RCC_DMA1_CLK_ENABLE(); // Enable DMA1 clock + dmaHal.Init.Channel = DMA_CHANNEL_0; // DMA channel 0 is for SPI2 TX + #elif (TFT_SPI_PORT == 3) + __HAL_RCC_DMA1_CLK_ENABLE(); // Enable DMA1 clock + dmaHal.Init.Channel = DMA_CHANNEL_0; // DMA channel 0 is for SPI3 TX + + #endif + + dmaHal.Init.Mode = DMA_NORMAL; //DMA_CIRCULAR; // // Normal = send buffer once + dmaHal.Init.Direction = DMA_MEMORY_TO_PERIPH; // Copy memory to the peripheral + dmaHal.Init.PeriphInc = DMA_PINC_DISABLE; // Don't increment peripheral address + dmaHal.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // Peripheral is byte aligned + dmaHal.Init.MemInc = DMA_MINC_ENABLE; // Increment memory address + dmaHal.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // Memory is byte aligned + + if (HAL_DMA_Init(&dmaHal) != HAL_OK){ // Init DMA with settings + // Insert error message here? + return DMA_Enabled = false; + }; + #if (TFT_SPI_PORT == 1) + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); // Enable DMA end interrupt handler + #elif (TFT_SPI_PORT == 2) + HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn); // Enable DMA end interrupt handler + #elif (TFT_SPI_PORT == 3) + HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); + #endif + + __HAL_LINKDMA(&spiHal, hdmatx, dmaHal); // Attach DMA engine to SPI peripheral + + return DMA_Enabled = true; +} + +#elif defined (STM32F1xx) // Supports "Blue Pill" boards +/*************************************************************************************** +** Function name: DMA1_ChannelX_IRQHandler +** Description: Override the default HAL stream 3 interrupt handler +***************************************************************************************/ + #if (TFT_SPI_PORT == 1) + extern "C" void DMA1_Channel3_IRQHandler(); + void DMA1_Channel3_IRQHandler(void) + #elif (TFT_SPI_PORT == 2) + extern "C" void DMA1_Channel5_IRQHandler(); + void DMA1_Channel5_IRQHandler(void) + #endif + { + // Call the default end of buffer handler + HAL_DMA_IRQHandler(&dmaHal); + } + +//*/ +/*************************************************************************************** +** Function name: initDMA +** Description: Initialise the DMA engine - returns true if init OK +***************************************************************************************/ +bool TFT_eSPI::initDMA(bool ctrl_cs) +{ + ctrl_cs = ctrl_cs; // Not used for STM32, so stop compiler warning + + __HAL_RCC_DMA1_CLK_ENABLE(); // Enable DMA1 clock + + dmaHal.Init.Mode = DMA_NORMAL; //DMA_CIRCULAR; // // Normal = send buffer once + dmaHal.Init.Direction = DMA_MEMORY_TO_PERIPH; // Copy memory to the peripheral + dmaHal.Init.PeriphInc = DMA_PINC_DISABLE; // Don't increment peripheral address + dmaHal.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // Peripheral is byte aligned + dmaHal.Init.MemInc = DMA_MINC_ENABLE; // Increment memory address + dmaHal.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // Memory is byte aligned + dmaHal.Init.Priority = DMA_PRIORITY_LOW; // Added this line - needed ? + + __HAL_LINKDMA(&spiHal, hdmatx, dmaHal); // Attach DMA engine to SPI peripheral + + if (HAL_DMA_Init(&dmaHal) != HAL_OK){ // Init DMA with settings + // Insert error message here? + return DMA_Enabled = false; + }; + + #if (TFT_SPI_PORT == 1) + HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); // Enable DMA end interrupt handler + #elif (TFT_SPI_PORT == 2) + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 1, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); // Enable DMA end interrupt handler + #endif + + return DMA_Enabled = true; +} +#endif // End of STM32F1/2/4/7xx + +/*************************************************************************************** +** Function name: deInitDMA +** Description: Disconnect the DMA engine from SPI +***************************************************************************************/ +void TFT_eSPI::deInitDMA(void) +{ + HAL_DMA_DeInit(&dmaHal); + DMA_Enabled = false; +} + +//////////////////////////////////////////////////////////////////////////////////////// +#endif // End of DMA FUNCTIONS +//////////////////////////////////////////////////////////////////////////////////////// diff --git a/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.h b/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.h new file mode 100644 index 0000000..73a22cb --- /dev/null +++ b/libraries/TFT_eSPI/Processors/TFT_eSPI_STM32.h @@ -0,0 +1,1079 @@ + //////////////////////////////////////////////////// + // TFT_eSPI driver functions for STM32 processors // + //////////////////////////////////////////////////// + +#ifndef _TFT_eSPI_STM32H_ +#define _TFT_eSPI_STM32H_ + +// Processor ID reported by getSetup() +#define PROCESSOR_ID 0x32F + +// Include processor specific header +// None + +// RPi support not tested - Fast RPi not supported + +// Processor specific code used by SPI bus transaction startWrite and endWrite functions +#define SET_BUS_WRITE_MODE // Not used +#define SET_BUS_READ_MODE // Not used + +// SUPPORT_TRANSACTIONS is mandatory for STM32 +#if !defined (SUPPORT_TRANSACTIONS) + #define SUPPORT_TRANSACTIONS +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the parallel bus interface chip pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined(TFT_PARALLEL_8_BIT) + + // The STM32 processors can toggle pins fast, TFTs need setup and hold times + // for writes so here twc can be extended with delays: + // + // 0 1 2 3 4 5 Extra high periods + // TFT_WR ¯|_ _ _ _ _ _ |¯ ¯ ¯ ¯ ¯ ¯ ¯| + // 5 4 3 2 1 0 Extra low periods + // xxxx=======================xxxx + // |<---------- twc --------->| + // |<- tdst ->|<-- tdht -->| + // + // Data is placed bit by bit on bus during period xxxx and TFT_WR driven low + // Period xxxx depends on D0-D7 pin allocations and bit manipulation needed + // Data stable during period === + // Most TFTs can be "overclocked" and run >2x faster than data sheet figures + +//////////////////////////////////////////////////////////////////////////////////////// +// Write strobe timing setup +//////////////////////////////////////////////////////////////////////////////////////// + #if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ST7796_DRIVER) || defined (ILI9486_DRIVER) // WRX twc spec is <=66ns = 15.15MHz + + // Extra write pulse low time (delay for data setup) + #if defined (STM32F1xx) + #define WR_TWRL_0 // Change to WR_TWRL_1 if overclocking processor + #elif defined (STM32F2xx) || defined (STM32F4xx) + #define WR_TWRL_0 // Tested with STM32F446 - 27.6MHz when WR_TWRH_1 defined + //#define WR_TWRL_3 // STM32F446 - 15.6MHz when WR_TWRH_3 defined + #elif defined (STM32F7xx) + #define WR_TWRL_1 //Tested with STM32F767 + #else + #define WR_TWRL_5 + #endif + + // Extra write pulse high time (data hold time, delays next write cycle start) + #if defined (STM32F1xx) + #define WR_TWRH_0 + #elif defined (STM32F2xx) || defined (STM32F4xx) + #define WR_TWRH_0 // Tested with STM32F446 + //#define WR_TWRL_3 + #elif defined (STM32F7xx) + #define WR_TWRH_1 //Tested with STM32F767 + #else + #define WR_TWRH_5 + #endif + + #elif defined (ILI9481_DRIVER) // WRX twc spec is 100ns = 10MHz + + // Extra write pulse low time (delay for data setup) + #if defined (STM32F1xx) + #define WR_TWRL_0 + #elif defined (STM32F2xx) || defined (STM32F4xx) + //#define WR_TWRL_0 // STM32F446 - ~30MHz when WR_TWRH_0 defined + //#define WR_TWRL_1 // STM32F446 - ~25MHz when WR_TWRH_0 defined + #define WR_TWRL_2 // STM32F446 - ~20MHz when WR_TWRH_2 defined + //#define WR_TWRL_3 // STM32F446 - ~16MHz when WR_TWRH_3 defined + //#define WR_TWRL_4 + //#define WR_TWRL_5 // STM32F446 - ~12MHz when WR_TWRH_5 defined + #elif defined (STM32F7xx) + //#define WR_TWRL_0 + //#define WR_TWRL_1 + //#define WR_TWRL_2 + #define WR_TWRL_3 + #else + //#define WR_TWRH_0 // Fastest + //#define WR_TWRH_1 + //#define WR_TWRH_2 + #define WR_TWRH_3 // Slowest + #endif + + // Extra write pulse high time (data hold time, delays next write cycle start) + #if defined (STM32F1xx) + #define WR_TWRH_0 + #elif defined (STM32F2xx) || defined (STM32F4xx) + //#define WR_TWRH_0 + //#define WR_TWRH_1 + #define WR_TWRH_2 + //#define WR_TWRH_3 + #elif defined (STM32F7xx) + //#define WR_TWRH_0 + //#define WR_TWRH_1 + //#define WR_TWRH_2 + #define WR_TWRH_3 + //#define WR_TWRH_4 + //#define WR_TWRH_5 + #else + //#define WR_TWRH_0 // Fastest + //#define WR_TWRH_1 + //#define WR_TWRH_2 + #define WR_TWRH_3 // Slowest + #endif + + #else // Default display slow settings + #if defined (STM32F1xx) + // STM32F1xx series can run at full speed (unless overclocked) + #define WR_TWRL_0 + #define WR_TWRH_0 + #else + // Extra write pulse low time (delay for data setup) + //#define WR_TWRL_0 + //#define WR_TWRL_1 + //#define WR_TWRL_2 + #define WR_TWRL_3 + //#define WR_TWRL_4 + //#define WR_TWRL_5 + + // Extra write pulse high time (data hold time, delays next write cycle start) + //#define WR_TWRH_0 + //#define WR_TWRH_1 + //#define WR_TWRH_2 + //#define WR_TWRH_3 + //#define WR_TWRH_4 + #define WR_TWRH_5 + #endif + #endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// +#else + + // Use SPI1 as default if not defined + #ifndef TFT_SPI_PORT + #define TFT_SPI_PORT 1 + #endif + + #if (TFT_SPI_PORT == 1) + #define SPIX SPI1 + #elif (TFT_SPI_PORT == 2) + #define SPIX SPI2 + #elif (TFT_SPI_PORT == 3) + #define SPIX SPI3 + #elif (TFT_SPI_PORT == 4) + #define SPIX SPI4 + #endif + // Global define is _VARIANT_ARDUINO_STM32_, see board package stm32_def.h for specific variants + #if defined (STM32F2xx) || defined (STM32F4xx) || defined (STM32F7xx) + + #define STM32_DMA // DMA is available with these processors + + #if (TFT_SPI_PORT == 1) + // Initialise processor specific SPI and DMA instances - used by init() + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI1; \ + dmaHal.Instance = DMA2_Stream3 + // The DMA hard-coding for SPI1 is in TFT_eSPI_STM32.c as follows: + // DMA_CHANNEL_3 + // DMA2_Stream3_IRQn and DMA2_Stream3_IRQHandler() + #elif (TFT_SPI_PORT == 2) + // Initialise processor specific SPI and DMA instances - used by init() + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI2; \ + dmaHal.Instance = DMA1_Stream4 + // The DMA hard-coding for SPI2 is in TFT_eSPI_STM32.c as follows: + // DMA_CHANNEL_4 + // DMA1_Stream4_IRQn and DMA1_Stream4_IRQHandler() + #elif (TFT_SPI_PORT == 3) + // Initialise processor specific SPI and DMA instances - used by init() + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI3; \ + dmaHal.Instance = DMA1_Stream5 + // The DMA hard-coding for SPI3 is in TFT_eSPI_STM32.c as follows: + // DMA_CHANNEL_4 + // DMA1_Stream5_IRQn and DMA1_Stream5_IRQHandler() + #endif + + #elif defined (STM32F1xx) + // For Blue Pill and STM32F1xx processors with DMA support + #define STM32_DMA // DMA is available with these processors + #if (TFT_SPI_PORT == 1) + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI1; \ + dmaHal.Instance = DMA1_Channel3 + #elif (TFT_SPI_PORT == 2) + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI2; \ + dmaHal.Instance = DMA1_Channel5 + #endif + #else + // For STM32 processor with no implemented DMA support (yet) + #if (TFT_SPI_PORT == 1) + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI1 + #elif (TFT_SPI_PORT == 2) + #define INIT_TFT_DATA_BUS spiHal.Instance = SPI2 + #endif + #endif + +#endif + +#ifdef STM32_DMA + // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions + #define DMA_BUSY_CHECK { if (DMA_Enabled) while(dmaBusy()); } +#else + #define DMA_BUSY_CHECK +#endif + +// If smooth fonts are enabled the filing system may need to be loaded +#ifdef SMOOTH_FONT + // Call up the filing system for the anti-aliased fonts <<<==== TODO + //#define FS_NO_GLOBALS + //#include +#endif // end of parallel/SPI selection + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the DC (TFT Data/Command or Register Select (RS))pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_DC) || (TFT_DC < 0) + #define DC_C // No macro allocated so it generates no code + #define DC_D // No macro allocated so it generates no code + #undef TFT_DC +#else + // Convert Arduino pin reference Dn or STM pin reference PXn to port and mask + #define DC_PORT digitalPinToPort(TFT_DC) + #define DC_PIN_MASK digitalPinToBitMask(TFT_DC) + // Use bit set reset register + #define DC_C DC_DELAY; DC_PORT->BSRR = DC_PIN_MASK<<16 + #define DC_D DC_DELAY; DC_PORT->BSRR = DC_PIN_MASK +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the CS (TFT chip select) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_CS) || (TFT_CS < 0) + #define CS_L // No macro allocated so it generates no code + #define CS_H // No macro allocated so it generates no code + #undef TFT_CS +#else + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + #define CS_PORT digitalPinToPort(TFT_CS) + #define CS_PIN_MASK digitalPinToBitMask(TFT_CS) + // Use bit set reset register + #define CS_L CS_PORT->BSRR = CS_PIN_MASK<<16 + #define CS_H CS_PORT->BSRR = CS_PIN_MASK +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the RD (TFT Read) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_RD + #if (TFT_RD >= 0) + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + #define RD_PORT digitalPinToPort(TFT_RD) + #define RD_PIN_MASK digitalPinToBitMask(TFT_RD) + // Use bit set reset register + #define RD_L RD_PORT->BSRR = RD_PIN_MASK<<16 + #define RD_H RD_PORT->BSRR = RD_PIN_MASK + #else + #define RD_L + #define RD_H + #endif +#else + #define TFT_RD -1 + #define RD_L + #define RD_H +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the WR (TFT Write) pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TFT_WR + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + #define WR_PORT digitalPinToPort(TFT_WR) + #define WR_PIN_MASK digitalPinToBitMask(TFT_WR) + // Use bit set reset register + #define WR_L WR_PORT->BSRR = WR_PIN_MASK<<16 + #define WR_H WR_PORT->BSRR = WR_PIN_MASK +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the touch screen chip select pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TOUCH_CS) || (TOUCH_CS < 0) + #define T_CS_L // No macro allocated so it generates no code + #define T_CS_H // No macro allocated so it generates no code +#else + // Speed is not important for this signal + #define T_CS_L digitalWrite(TOUCH_CS, LOW) + #define T_CS_H digitalWrite(TOUCH_CS, HIGH) +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Make sure TFT_MISO is defined if not used to avoid an error message +//////////////////////////////////////////////////////////////////////////////////////// +#if !defined (TFT_PARALLEL_8_BIT) + #ifndef TFT_MISO + #define TFT_MISO -1 + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the parallel bus interface chip pin drive code +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_PARALLEL_8_BIT) + + // Mask for the 8 data bits to set pin directions (not used) + #define GPIO_DIR_MASK 0 + + #define PARALLEL_INIT_TFT_DATA_BUS // None + + #define INIT_TFT_DATA_BUS // Setup built into TFT_eSPI.cpp + +//////////////////////////////////////////////////////////////////////////////////////// +// Define the TFT_WR drive cycle timing +//////////////////////////////////////////////////////////////////////////////////////// + // Write low extra setup time + #if defined WR_TWRL_0 + #define WR_TWRL + #elif defined WR_TWRL_1 // 1 extra low period + #define WR_TWRL WR_L + #elif defined WR_TWRL_2 // 2 extra low periods + #define WR_TWRL WR_L; WR_L + #elif defined WR_TWRL_3 // 3 extra low periods + #define WR_TWRL WR_L; WR_L; WR_L + #elif defined WR_TWRL_4 // 4 extra low periods + #define WR_TWRL WR_L; WR_L; WR_L; WR_L + #elif defined WR_TWRL_5 // 5 extra low periods + #define WR_TWRL WR_L; WR_L; WR_L; WR_L; WR_L + #endif + + // Write high extra hold time + #if defined WR_TWRH_0 + #define WR_TWRH WR_H + #elif defined WR_TWRH_1 // 1 extra high period + #define WR_TWRH WR_H; WR_H + #elif defined WR_TWRH_2 // 2 extra high periods + #define WR_TWRH WR_H; WR_H; WR_H + #elif defined WR_TWRH_3 // 3 extra high periods + #define WR_TWRH WR_H; WR_H; WR_H; WR_H + #elif defined WR_TWRH_4 // 4 extra high periods + #define WR_TWRH WR_H; WR_H; WR_H; WR_H; WR_H + #elif defined WR_TWRH_5 // 5 extra high periods + #define WR_TWRH WR_H; WR_H; WR_H; WR_H; WR_H; WR_H + #endif + + #define WR_STB WR_TWRL; WR_TWRH // Rising edge write strobe + +//////////////////////////////////////////////////////////////////////////////////////// +// Nucleo 64: hard-coded pins +//////////////////////////////////////////////////////////////////////////////////////// + #ifdef NUCLEO_64_TFT + + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + #define D0_PIN_NAME digitalPinToPinName(TFT_D0) + #define D1_PIN_NAME digitalPinToPinName(TFT_D1) + #define D2_PIN_NAME digitalPinToPinName(TFT_D2) + #define D3_PIN_NAME digitalPinToPinName(TFT_D3) + #define D4_PIN_NAME digitalPinToPinName(TFT_D4) + #define D5_PIN_NAME digitalPinToPinName(TFT_D5) + #define D6_PIN_NAME digitalPinToPinName(TFT_D6) + #define D7_PIN_NAME digitalPinToPinName(TFT_D7) + + // Pin port bit number 0-15 (not used for Nucleo) + #define D0_PIN_BIT (D0_PIN_NAME & 0xF) + #define D1_PIN_BIT (D1_PIN_NAME & 0xF) + #define D2_PIN_BIT (D2_PIN_NAME & 0xF) + #define D3_PIN_BIT (D3_PIN_NAME & 0xF) + #define D4_PIN_BIT (D4_PIN_NAME & 0xF) + #define D5_PIN_BIT (D5_PIN_NAME & 0xF) + #define D6_PIN_BIT (D6_PIN_NAME & 0xF) + #define D7_PIN_BIT (D7_PIN_NAME & 0xF) + + // Pin port - better than get_GPIO_Port() which seems to be slow... + #define D0_PIN_PORT GPIOA + #define D1_PIN_PORT GPIOC + #define D2_PIN_PORT GPIOA + #define D3_PIN_PORT GPIOB + #define D4_PIN_PORT GPIOB + #define D5_PIN_PORT GPIOB + #define D6_PIN_PORT GPIOB + #define D7_PIN_PORT GPIOA + + // Pin masks for set/clear + #define D0_PIN_MASK (1UL<< 9) // Set/clear mask for PA9 + #define D1_PIN_MASK (1UL<< 7) // Set/clear mask for PC7 + #define D2_PIN_MASK (1UL<<10) // Set/clear mask for PA10 + #define D3_PIN_MASK (1UL<< 3) // Set/clear mask for PB3 + #define D4_PIN_MASK (1UL<< 5) // Set/clear mask for PB5 + #define D5_PIN_MASK (1UL<< 4) // Set/clear mask for PB4 + #define D6_PIN_MASK (1UL<<10) // Set/clear mask for PB10 + #define D7_PIN_MASK (1UL<< 8) // Set/clear mask for PA8 + + // Create bit set/reset mask based on LS byte of value B + #define D0_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)<< 4)&0x10)) + #define D1_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)<< 3)&0x10)) + #define D2_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)<< 2)&0x10)) + #define D3_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)<< 1)&0x10)) + #define D4_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)<< 0)&0x10)) + #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) + #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) + #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) + // Create bit set/reset mask for top byte of 16-bit value B + #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) + #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) + #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) + #define D11_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)>> 7)&0x10)) + #define D12_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)>> 8)&0x10)) + #define D13_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 9)&0x10)) + #define D14_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>>10)&0x10)) + #define D15_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>>11)&0x10)) + + // Write 8 bits to TFT + #define tft_Write_8(C) GPIOA->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(C); \ + GPIOB->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB // Need to slow down strobe + + #if defined (SSD1963_DRIVER) + + // Write 18-bit color to TFT (untested) + #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ + GPIOA->BSRR = D0_BSR_MASK(r6) | D2_BSR_MASK(r6) | D7_BSR_MASK(r6); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(r6); \ + GPIOB->BSRR = D3_BSR_MASK(r6) | D4_BSR_MASK(r6) | D5_BSR_MASK(r6) | D6_BSR_MASK(r6); \ + WR_STB; \ + GPIOA->BSRR = D0_BSR_MASK(g6) | D2_BSR_MASK(g6) | D7_BSR_MASK(g6); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(g6); \ + GPIOB->BSRR = D3_BSR_MASK(g6) | D4_BSR_MASK(g6) | D5_BSR_MASK(g6) | D6_BSR_MASK(g6); \ + WR_STB; \ + GPIOA->BSRR = D0_BSR_MASK(b6) | D2_BSR_MASK(b6) | D7_BSR_MASK(b6); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(b6); \ + GPIOB->BSRR = D3_BSR_MASK(b6) | D4_BSR_MASK(b6) | D5_BSR_MASK(b6) | D6_BSR_MASK(b6); \ + WR_STB // Need to slow down strobe + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + // Write 16 bits to TFT + #define tft_Write_16(C) GPIOA->BSRR = D8_BSR_MASK(C) | D10_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOC->BSRR = D9_BSR_MASK(C); \ + GPIOB->BSRR = D11_BSR_MASK(C) | D12_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB; \ + GPIOA->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(C); \ + GPIOB->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB // Need to slow down strobe + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIOA->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOC->BSRR = D1_BSR_MASK(C); \ + GPIOB->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB; \ + GPIOA->BSRR = D8_BSR_MASK(C) | D10_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOC->BSRR = D9_BSR_MASK(C); \ + GPIOB->BSRR = D11_BSR_MASK(C) | D12_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB + #endif + + #define tft_Write_32(C) tft_Write_16((uint16_t)((C)>>16)); tft_Write_16((uint16_t)(C)) + + #define tft_Write_32C(C,D) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(D)) + + #define tft_Write_32D(C) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(C)) + + // Read a data bit + #define RD_TFT_D0 (((GPIOA->IDR)&(D0_PIN_MASK))>>( 9-0)) // Read pin PA9 + #define RD_TFT_D1 (((GPIOC->IDR)&(D1_PIN_MASK))>>( 7-1)) // Read pin PC7 + #define RD_TFT_D2 (((GPIOA->IDR)&(D2_PIN_MASK))>>(10-2)) // Read pin PA10 + #define RD_TFT_D3 (((GPIOB->IDR)&(D3_PIN_MASK))>>( 3-3)) // Read pin PB3 + #define RD_TFT_D4 (((GPIOB->IDR)&(D4_PIN_MASK))>>( 5-4)) // Read pin PB5 + #define RD_TFT_D5 (((GPIOB->IDR)&(D5_PIN_MASK))<<(-4+5)) // Read pin PB4 + #define RD_TFT_D6 (((GPIOB->IDR)&(D6_PIN_MASK))>>(10-6)) // Read pin PB10 + #define RD_TFT_D7 (((GPIOA->IDR)&(D7_PIN_MASK))>>( 8-7)) // Read pin PA8 + +//////////////////////////////////////////////////////////////////////////////////////// +// Nucleo 144: hard-coded pins +//////////////////////////////////////////////////////////////////////////////////////// + #elif defined (NUCLEO_144_TFT) + + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + // (diagnostic only - not used for Nucleo) + #define D0_PIN_NAME digitalPinToPinName(TFT_D0) + #define D1_PIN_NAME digitalPinToPinName(TFT_D1) + #define D2_PIN_NAME digitalPinToPinName(TFT_D2) + #define D3_PIN_NAME digitalPinToPinName(TFT_D3) + #define D4_PIN_NAME digitalPinToPinName(TFT_D4) + #define D5_PIN_NAME digitalPinToPinName(TFT_D5) + #define D6_PIN_NAME digitalPinToPinName(TFT_D6) + #define D7_PIN_NAME digitalPinToPinName(TFT_D7) + + // Pin port bit number 0-15 (diagnostic only - not used for Nucleo) + #define D0_PIN_BIT (D0_PIN_NAME & 0xF) + #define D1_PIN_BIT (D1_PIN_NAME & 0xF) + #define D2_PIN_BIT (D2_PIN_NAME & 0xF) + #define D3_PIN_BIT (D3_PIN_NAME & 0xF) + #define D4_PIN_BIT (D4_PIN_NAME & 0xF) + #define D5_PIN_BIT (D5_PIN_NAME & 0xF) + #define D6_PIN_BIT (D6_PIN_NAME & 0xF) + #define D7_PIN_BIT (D7_PIN_NAME & 0xF) + + + #if !defined (STM32H7xx) + + // Ports associated with pins - get_GPIO_Port() seems to be slow... + #define D0_PIN_PORT GPIOF + #define D1_PIN_PORT GPIOD + #define D2_PIN_PORT GPIOF + #define D3_PIN_PORT GPIOE + #define D4_PIN_PORT GPIOF + #define D5_PIN_PORT GPIOE + #define D6_PIN_PORT GPIOE + #define D7_PIN_PORT GPIOF + + // Pin masks for set/clear + #define D0_PIN_MASK (1UL<<12) // Set/clear mask for PF12 PF3 + #define D1_PIN_MASK (1UL<<15) // Set/clear mask for PD15 + #define D2_PIN_MASK (1UL<<15) // Set/clear mask for PF15 PG14 + #define D3_PIN_MASK (1UL<<13) // Set/clear mask for PE13 + #define D4_PIN_MASK (1UL<<14) // Set/clear mask for PF14 + #define D5_PIN_MASK (1UL<<11) // Set/clear mask for PE11 + #define D6_PIN_MASK (1UL<< 9) // Set/clear mask for PE9 + #define D7_PIN_MASK (1UL<<13) // Set/clear mask for PF13 PG12 + + // Create bit set/reset mask based on LS byte of value B + #define D0_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)<< 4)&0x10)) + #define D1_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)<< 3)&0x10)) + #define D2_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)<< 2)&0x10)) + #define D3_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)<< 1)&0x10)) + #define D4_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)<< 0)&0x10)) + #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) + #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) + #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) + // Create bit set/reset mask for top byte of 16-bit value B + #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) + #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) + #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) + #define D11_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)>> 7)&0x10)) + #define D12_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)>> 8)&0x10)) + #define D13_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 9)&0x10)) + #define D14_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>>10)&0x10)) + #define D15_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>>11)&0x10)) + + + // Write 8 bits to TFT + #define tft_Write_8(C) GPIOF->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D4_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB + + #if defined (SSD1963_DRIVER) + + // Write 18-bit color to TFT (untested) + #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ + GPIOF->BSRR = D0_BSR_MASK(r6) | D2_BSR_MASK(r6) | D4_BSR_MASK(r6) | D7_BSR_MASK(r6); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(r6); \ + GPIOE->BSRR = D3_BSR_MASK(r6) | D5_BSR_MASK(r6) | D6_BSR_MASK(r6); \ + WR_STB; \ + GPIOF->BSRR = D0_BSR_MASK(g6) | D2_BSR_MASK(g6) | D4_BSR_MASK(g6) | D7_BSR_MASK(g6); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(g6); \ + GPIOE->BSRR = D3_BSR_MASK(g6) | D5_BSR_MASK(g6) | D6_BSR_MASK(g6); \ + WR_STB; \ + GPIOF->BSRR = D0_BSR_MASK(b6) | D2_BSR_MASK(b6) | D4_BSR_MASK(b6) | D7_BSR_MASK(b6); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(b6); \ + GPIOE->BSRR = D3_BSR_MASK(b6) | D5_BSR_MASK(b6) | D6_BSR_MASK(b6); \ + WR_STB // Need to slow down strobe + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + // Write 16 bits to TFT + #define tft_Write_16(C) GPIOF->BSRR = D8_BSR_MASK(C) | D10_BSR_MASK(C) | D12_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D9_BSR_MASK(C); \ + GPIOE->BSRR = D11_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB;\ + GPIOF->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D4_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIOF->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D4_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB; \ + GPIOF->BSRR = D8_BSR_MASK(C) | D10_BSR_MASK(C) | D12_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D9_BSR_MASK(C); \ + GPIOE->BSRR = D11_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB + + #endif + + #define tft_Write_32(C) tft_Write_16((uint16_t)((C)>>16)); tft_Write_16((uint16_t)(C)) + + #define tft_Write_32C(C,D) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(D)) + + #define tft_Write_32D(C) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(C)) + + // Read a data bit + #define RD_TFT_D0 (((GPIOF->IDR)&(D0_PIN_MASK))>>(12-0)) // Read pin PF12 + #define RD_TFT_D1 (((GPIOD->IDR)&(D1_PIN_MASK))>>(15-1)) // Read pin PD15 + #define RD_TFT_D2 (((GPIOF->IDR)&(D2_PIN_MASK))>>(15-2)) // Read pin PF15 + #define RD_TFT_D3 (((GPIOE->IDR)&(D3_PIN_MASK))>>(13-3)) // Read pin PE13 + #define RD_TFT_D4 (((GPIOF->IDR)&(D4_PIN_MASK))>>(14-4)) // Read pin PF14 + #define RD_TFT_D5 (((GPIOE->IDR)&(D5_PIN_MASK))>>(11-5)) // Read pin PE11 + #define RD_TFT_D6 (((GPIOE->IDR)&(D6_PIN_MASK))>>( 9-6)) // Read pin PE9 + #define RD_TFT_D7 (((GPIOF->IDR)&(D7_PIN_MASK))>>(13-7)) // Read pin PF13 + + #else + + // Test setup for STM32H743 - starts to run, slow and then crashes! Board support bug? + + // Ports associated with pins - get_GPIO_Port() seems to be slow... + #define D0_PIN_PORT GPIOF + #define D1_PIN_PORT GPIOD + #define D2_PIN_PORT GPIOG + #define D3_PIN_PORT GPIOE + #define D4_PIN_PORT GPIOE + #define D5_PIN_PORT GPIOE + #define D6_PIN_PORT GPIOE + #define D7_PIN_PORT GPIOG + + // Pin masks for set/clear + #define D0_PIN_MASK (1UL<< 3) // Set/clear mask for PF3 + #define D1_PIN_MASK (1UL<<15) // Set/clear mask for PD15 + #define D2_PIN_MASK (1UL<<14) // Set/clear mask for PG14 + #define D3_PIN_MASK (1UL<<13) // Set/clear mask for PE13 + #define D4_PIN_MASK (1UL<<14) // Set/clear mask for PE14 + #define D5_PIN_MASK (1UL<<11) // Set/clear mask for PE11 + #define D6_PIN_MASK (1UL<< 9) // Set/clear mask for PE9 + #define D7_PIN_MASK (1UL<<12) // Set/clear mask for PG12 + + // Create bit set/reset mask based on LS byte of value B + #define D0_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)<< 4)&0x10)) + #define D1_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)<< 3)&0x10)) + #define D2_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)<< 2)&0x10)) + #define D3_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)<< 1)&0x10)) + #define D4_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)<< 0)&0x10)) + #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) + #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) + #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) + // Create bit set/reset mask for top byte of 16-bit value B + #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) + #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) + #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) + #define D11_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)>> 7)&0x10)) + #define D12_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)>> 8)&0x10)) + #define D13_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 9)&0x10)) + #define D14_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>>10)&0x10)) + #define D15_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>>11)&0x10)) + + + // Write 8 bits to TFT + #define tft_Write_8(C) GPIOF->BSRR = D0_BSR_MASK(C); \ + GPIOG->BSRR = D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB + + // Write 16 bits to TFT + #define tft_Write_16(C) GPIOF->BSRR = D8_BSR_MASK(C); \ + GPIOG->BSRR = D10_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D9_BSR_MASK(C); \ + GPIOE->BSRR = D11_BSR_MASK(C) | D12_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB;\ + GPIOF->BSRR = D0_BSR_MASK(C); \ + GPIOG->BSRR = D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIOF->BSRR = D0_BSR_MASK(C); \ + GPIOG->BSRR = D2_BSR_MASK(C) | D7_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D1_BSR_MASK(C); \ + GPIOE->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ + WR_STB; \ + GPIOF->BSRR = D8_BSR_MASK(C); \ + GPIOG->BSRR = D10_BSR_MASK(C) | D15_BSR_MASK(C); \ + WR_L; \ + GPIOD->BSRR = D9_BSR_MASK(C); \ + GPIOE->BSRR = D11_BSR_MASK(C) | D12_BSR_MASK(C) | D13_BSR_MASK(C) | D14_BSR_MASK(C); \ + WR_STB + + #define tft_Write_32(C) tft_Write_16((uint16_t)((C)>>16)); tft_Write_16((uint16_t)(C)) + + #define tft_Write_32C(C,D) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(D)) + + #define tft_Write_32D(C) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(C)) + + // Read a data bit + #define RD_TFT_D0 (((GPIOF->IDR)&(D0_PIN_MASK))>>( 3-0)) // Read pin PF3 + #define RD_TFT_D1 (((GPIOD->IDR)&(D1_PIN_MASK))>>(15-1)) // Read pin PD15 + #define RD_TFT_D2 (((GPIOG->IDR)&(D2_PIN_MASK))>>(14-2)) // Read pin PG14 + #define RD_TFT_D3 (((GPIOE->IDR)&(D3_PIN_MASK))>>(13-3)) // Read pin PE13 + #define RD_TFT_D4 (((GPIOE->IDR)&(D4_PIN_MASK))>>(14-4)) // Read pin PE14 + #define RD_TFT_D5 (((GPIOE->IDR)&(D5_PIN_MASK))>>(11-5)) // Read pin PE11 + #define RD_TFT_D6 (((GPIOE->IDR)&(D6_PIN_MASK))>>( 9-6)) // Read pin PE9 + #define RD_TFT_D7 (((GPIOG->IDR)&(D7_PIN_MASK))>>(12-7)) // Read pin PG12 + + #endif +//////////////////////////////////////////////////////////////////////////////////////// +// Support for other STM32 boards (not optimised!) +//////////////////////////////////////////////////////////////////////////////////////// + #else + #if defined (STM_PORTA_DATA_BUS) || defined (STM_PORTB_DATA_BUS) || defined (STM_PORTC_DATA_BUS) || defined (STM_PORTD_DATA_BUS) + #if defined (STM_PORTA_DATA_BUS) + #define GPIOX GPIOA + #elif defined (STM_PORTB_DATA_BUS) + #define GPIOX GPIOB + #elif defined (STM_PORTC_DATA_BUS) + #define GPIOX GPIOC + #elif defined (STM_PORTD_DATA_BUS) + #define GPIOX GPIOD + #endif + + // Write 8 bits to TFT + #define tft_Write_8(C) GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C)); WR_L; WR_STB + + #if defined (SSD1963_DRIVER) + + // Write 18-bit color to TFT (untested) + + #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ + GPIOX->BSRR = (0x00FF0000 | (uint8_t)(r6)); WR_L; WR_STB; \ + GPIOX->BSRR = (0x00FF0000 | (uint8_t)(g6)); WR_L; WR_STB; \ + GPIOX->BSRR = (0x00FF0000 | (uint8_t)(b6)); WR_L; WR_STB + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + // Write 16 bits to TFT + #define tft_Write_16(C) GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>8)); WR_L; WR_STB; \ + GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>0)); WR_L; WR_STB + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>0)); WR_L; WR_STB; \ + GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>8)); WR_L; WR_STB + #endif + + #define tft_Write_32(C) tft_Write_16((uint16_t)((C)>>16)); tft_Write_16((uint16_t)(C)) + + #define tft_Write_32C(C,D) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(D)) + + #define tft_Write_32D(C) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(C)) + + // Read a data bit + #define RD_TFT_D0 ((GPIOX->IDR) & 0x01) // Read pin TFT_D0 + #define RD_TFT_D1 ((GPIOX->IDR) & 0x02) // Read pin TFT_D1 + #define RD_TFT_D2 ((GPIOX->IDR) & 0x04) // Read pin TFT_D2 + #define RD_TFT_D3 ((GPIOX->IDR) & 0x08) // Read pin TFT_D3 + #define RD_TFT_D4 ((GPIOX->IDR) & 0x10) // Read pin TFT_D4 + #define RD_TFT_D5 ((GPIOX->IDR) & 0x20) // Read pin TFT_D5 + #define RD_TFT_D6 ((GPIOX->IDR) & 0x40) // Read pin TFT_D6 + #define RD_TFT_D7 ((GPIOX->IDR) & 0x80) // Read pin TFT_D7 + + #else + // This will work with any STM32 to parallel TFT pin mapping but will be slower + + // Convert Arduino pin reference Dx or STM pin reference PXn to port and mask + #define D0_PIN_NAME digitalPinToPinName(TFT_D0) + #define D1_PIN_NAME digitalPinToPinName(TFT_D1) + #define D2_PIN_NAME digitalPinToPinName(TFT_D2) + #define D3_PIN_NAME digitalPinToPinName(TFT_D3) + #define D4_PIN_NAME digitalPinToPinName(TFT_D4) + #define D5_PIN_NAME digitalPinToPinName(TFT_D5) + #define D6_PIN_NAME digitalPinToPinName(TFT_D6) + #define D7_PIN_NAME digitalPinToPinName(TFT_D7) + + // Pin port bit number 0-15 + #define D0_PIN_BIT (D0_PIN_NAME & 0xF) + #define D1_PIN_BIT (D1_PIN_NAME & 0xF) + #define D2_PIN_BIT (D2_PIN_NAME & 0xF) + #define D3_PIN_BIT (D3_PIN_NAME & 0xF) + #define D4_PIN_BIT (D4_PIN_NAME & 0xF) + #define D5_PIN_BIT (D5_PIN_NAME & 0xF) + #define D6_PIN_BIT (D6_PIN_NAME & 0xF) + #define D7_PIN_BIT (D7_PIN_NAME & 0xF) + + // Pin port + #define D0_PIN_PORT digitalPinToPort(TFT_D0) + #define D1_PIN_PORT digitalPinToPort(TFT_D1) + #define D2_PIN_PORT digitalPinToPort(TFT_D2) + #define D3_PIN_PORT digitalPinToPort(TFT_D3) + #define D4_PIN_PORT digitalPinToPort(TFT_D4) + #define D5_PIN_PORT digitalPinToPort(TFT_D5) + #define D6_PIN_PORT digitalPinToPort(TFT_D6) + #define D7_PIN_PORT digitalPinToPort(TFT_D7) + + // Pin masks for set/clear + #define D0_PIN_MASK digitalPinToBitMask(TFT_D0) + #define D1_PIN_MASK digitalPinToBitMask(TFT_D1) + #define D2_PIN_MASK digitalPinToBitMask(TFT_D2) + #define D3_PIN_MASK digitalPinToBitMask(TFT_D3) + #define D4_PIN_MASK digitalPinToBitMask(TFT_D4) + #define D5_PIN_MASK digitalPinToBitMask(TFT_D5) + #define D6_PIN_MASK digitalPinToBitMask(TFT_D6) + #define D7_PIN_MASK digitalPinToBitMask(TFT_D7) + + // Create bit set/reset mask based on LS byte of value B + #define D0_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)<< 4)&0x10)) + #define D1_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)<< 3)&0x10)) + #define D2_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)<< 2)&0x10)) + #define D3_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)<< 1)&0x10)) + #define D4_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)<< 0)&0x10)) + #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) + #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) + #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) + // Create bit set/reset mask for top byte of 16-bit value B + #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) + #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) + #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) + #define D11_BSR_MASK(B) ((D3_PIN_MASK<<16)>>(((B)>> 7)&0x10)) + #define D12_BSR_MASK(B) ((D4_PIN_MASK<<16)>>(((B)>> 8)&0x10)) + #define D13_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 9)&0x10)) + #define D14_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>>10)&0x10)) + #define D15_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>>11)&0x10)) + + + // Write 8 bits to TFT + #define tft_Write_8(C) D0_PIN_PORT->BSRR = D0_BSR_MASK(C); \ + D1_PIN_PORT->BSRR = D1_BSR_MASK(C); \ + D2_PIN_PORT->BSRR = D2_BSR_MASK(C); \ + D3_PIN_PORT->BSRR = D3_BSR_MASK(C); \ + WR_L; \ + D4_PIN_PORT->BSRR = D4_BSR_MASK(C); \ + D5_PIN_PORT->BSRR = D5_BSR_MASK(C); \ + D6_PIN_PORT->BSRR = D6_BSR_MASK(C); \ + D7_PIN_PORT->BSRR = D7_BSR_MASK(C); \ + WR_STB + + #if defined (SSD1963_DRIVER) + + // Write 18-bit color to TFT (untested) + #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ + D0_PIN_PORT->BSRR = D8_BSR_MASK(r6); \ + D1_PIN_PORT->BSRR = D9_BSR_MASK(r6); \ + D2_PIN_PORT->BSRR = D10_BSR_MASK(r6); \ + D3_PIN_PORT->BSRR = D11_BSR_MASK(r6); \ + WR_L; \ + D4_PIN_PORT->BSRR = D12_BSR_MASK(r6); \ + D5_PIN_PORT->BSRR = D13_BSR_MASK(r6); \ + D6_PIN_PORT->BSRR = D14_BSR_MASK(r6); \ + D7_PIN_PORT->BSRR = D15_BSR_MASK(r6); \ + WR_STB;\ + D0_PIN_PORT->BSRR = D8_BSR_MASK(g6); \ + D1_PIN_PORT->BSRR = D9_BSR_MASK(g6); \ + D2_PIN_PORT->BSRR = D10_BSR_MASK(g6); \ + D3_PIN_PORT->BSRR = D11_BSR_MASK(g6); \ + WR_L; \ + D4_PIN_PORT->BSRR = D12_BSR_MASK(g6); \ + D5_PIN_PORT->BSRR = D13_BSR_MASK(g6); \ + D6_PIN_PORT->BSRR = D14_BSR_MASK(g6); \ + D7_PIN_PORT->BSRR = D15_BSR_MASK(g6); \ + WR_STB;\ + D0_PIN_PORT->BSRR = D0_BSR_MASK(b6); \ + D1_PIN_PORT->BSRR = D1_BSR_MASK(b6); \ + D2_PIN_PORT->BSRR = D2_BSR_MASK(b6); \ + D3_PIN_PORT->BSRR = D3_BSR_MASK(b6); \ + WR_L; \ + D4_PIN_PORT->BSRR = D4_BSR_MASK(b6); \ + D5_PIN_PORT->BSRR = D5_BSR_MASK(b6); \ + D6_PIN_PORT->BSRR = D6_BSR_MASK(b6); \ + D7_PIN_PORT->BSRR = D7_BSR_MASK(b6); \ + WR_STB + + // 18-bit color write with swapped bytes + #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) + + #else + + // Write 16 bits to TFT + #define tft_Write_16(C) D0_PIN_PORT->BSRR = D8_BSR_MASK(C); \ + D1_PIN_PORT->BSRR = D9_BSR_MASK(C); \ + D2_PIN_PORT->BSRR = D10_BSR_MASK(C); \ + D3_PIN_PORT->BSRR = D11_BSR_MASK(C); \ + WR_L; \ + D4_PIN_PORT->BSRR = D12_BSR_MASK(C); \ + D5_PIN_PORT->BSRR = D13_BSR_MASK(C); \ + D6_PIN_PORT->BSRR = D14_BSR_MASK(C); \ + D7_PIN_PORT->BSRR = D15_BSR_MASK(C); \ + WR_STB;\ + D0_PIN_PORT->BSRR = D0_BSR_MASK(C); \ + D1_PIN_PORT->BSRR = D1_BSR_MASK(C); \ + D2_PIN_PORT->BSRR = D2_BSR_MASK(C); \ + D3_PIN_PORT->BSRR = D3_BSR_MASK(C); \ + WR_L; \ + D4_PIN_PORT->BSRR = D4_BSR_MASK(C); \ + D5_PIN_PORT->BSRR = D5_BSR_MASK(C); \ + D6_PIN_PORT->BSRR = D6_BSR_MASK(C); \ + D7_PIN_PORT->BSRR = D7_BSR_MASK(C); \ + WR_STB + + // 16-bit write with swapped bytes + #define tft_Write_16S(C) D0_PIN_PORT->BSRR = D0_BSR_MASK(C); \ + D1_PIN_PORT->BSRR = D1_BSR_MASK(C); \ + D2_PIN_PORT->BSRR = D2_BSR_MASK(C); \ + D3_PIN_PORT->BSRR = D3_BSR_MASK(C); \ + WR_L; \ + D4_PIN_PORT->BSRR = D4_BSR_MASK(C); \ + D5_PIN_PORT->BSRR = D5_BSR_MASK(C); \ + D6_PIN_PORT->BSRR = D6_BSR_MASK(C); \ + D7_PIN_PORT->BSRR = D7_BSR_MASK(C); \ + WR_STB; \ + D0_PIN_PORT->BSRR = D8_BSR_MASK(C); \ + D1_PIN_PORT->BSRR = D9_BSR_MASK(C); \ + D2_PIN_PORT->BSRR = D10_BSR_MASK(C); \ + D3_PIN_PORT->BSRR = D11_BSR_MASK(C); \ + WR_L; \ + D4_PIN_PORT->BSRR = D12_BSR_MASK(C); \ + D5_PIN_PORT->BSRR = D13_BSR_MASK(C); \ + D6_PIN_PORT->BSRR = D14_BSR_MASK(C); \ + D7_PIN_PORT->BSRR = D15_BSR_MASK(C); \ + WR_STB + #endif + + #define tft_Write_32(C) tft_Write_16((uint16_t)((C)>>16)); tft_Write_16((uint16_t)(C)) + + #define tft_Write_32C(C,D) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(D)) + + #define tft_Write_32D(C) tft_Write_16((uint16_t)(C)); tft_Write_16((uint16_t)(C)) + + // Read a data bit + #define RD_TFT_D0 ((((D0_PIN_PORT->IDR) >> (D0_PIN_BIT))&1)<<0) // Read pin TFT_D0 + #define RD_TFT_D1 ((((D1_PIN_PORT->IDR) >> (D1_PIN_BIT))&1)<<1) // Read pin TFT_D1 + #define RD_TFT_D2 ((((D2_PIN_PORT->IDR) >> (D2_PIN_BIT))&1)<<2) // Read pin TFT_D2 + #define RD_TFT_D3 ((((D3_PIN_PORT->IDR) >> (D3_PIN_BIT))&1)<<3) // Read pin TFT_D3 + #define RD_TFT_D4 ((((D4_PIN_PORT->IDR) >> (D4_PIN_BIT))&1)<<4) // Read pin TFT_D4 + #define RD_TFT_D5 ((((D5_PIN_PORT->IDR) >> (D5_PIN_BIT))&1)<<5) // Read pin TFT_D5 + #define RD_TFT_D6 ((((D6_PIN_PORT->IDR) >> (D6_PIN_BIT))&1)<<6) // Read pin TFT_D6 + #define RD_TFT_D7 ((((D7_PIN_PORT->IDR) >> (D7_PIN_BIT))&1)<<7) // Read pin TFT_D7 + #endif + #endif +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI ILI948x TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) + + //#define tft_Write_8(C) spi.transfer(C) + #define tft_Write_8(C) TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = ((C) & 0xF800)>>8; TX_FIFO = ((C) & 0x07E0)>>3; TX_FIFO = ((C) & 0x001F)<<3; SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C) & 0xF8; TX_FIFO = ((C) & 0xE000)>>11 | ((C) & 0x07)<<5; TX_FIFO = ((C) & 0x1F00)>>5; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = ((C) & 0xF800)>>8; TX_FIFO = ((C) & 0x07E0)>>3; TX_FIFO = ((C) & 0x001F)<<3 + + #define tft_Write_32(C) \ + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + + #define tft_Write_32C(C,D) \ + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + TX_FIFO = (D)>>8; TX_FIFO = (D); SPI_BUSY_CHECK + + #define tft_Write_32D(C) \ + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to write commands/pixel colour data to a SPI Raspberry Pi TFT +//////////////////////////////////////////////////////////////////////////////////////// +#elif defined (RPI_DISPLAY_TYPE) + + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) + + //#define tft_Write_8(C) spi.transfer(C) + #define tft_Write_8(C) TX_FIFO = (0); TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C); TX_FIFO = (C)>>8; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = (C)>>8; TX_FIFO = (C) + + #define tft_Write_32(C) \ + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + + #define tft_Write_32C(C,D) \ + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); \ + TX_FIFO = (0); TX_FIFO = (D)>>8; TX_FIFO = (0); TX_FIFO = (D); SPI_BUSY_CHECK + + #define tft_Write_32D(C) \ + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); \ + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); SPI_BUSY_CHECK + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros for all other SPI displays +//////////////////////////////////////////////////////////////////////////////////////// + +#else + + //#define DC_DELAY delayMicroseconds(1) // Premature BSY clear Hardware bug? + + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) + + #define tft_Write_8(C) TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C); TX_FIFO = (C)>>8; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = (C)>>8; TX_FIFO = (C) + + #define tft_Write_32(C) \ + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + tft_Write_16((uint16_t) ((C)>>0)) + + #define tft_Write_32C(C,D) \ + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + tft_Write_16((uint16_t) (D)) + + #define tft_Write_32D(C) \ + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + tft_Write_16((uint16_t) (C)) + +#endif + +#ifndef DC_DELAY + //#define DC_DELAY delayMicroseconds(1) // Premature BSY clear hardware bug? + #define DC_DELAY +#endif + +#ifndef tft_Write_16N + #define tft_Write_16N tft_Write_16 +#endif + +//////////////////////////////////////////////////////////////////////////////////////// +// Macros to read from display using SPI or software SPI +//////////////////////////////////////////////////////////////////////////////////////// +#if defined (TFT_SDA_READ) + // Macros to support a bit banged function call for STM32 and bi-directional SDA pin + #define TFT_eSPI_ENABLE_8_BIT_READ // Enable tft_Read_8(); + #define SCLK_L digitalWrite(TFT_SCLK, LOW) + #define SCLK_H digitalWrite(TFT_SCLK, HIGH) +#elif !defined (TFT_PARALLEL_8_BIT) + // Use a SPI read transfer + #define tft_Read_8() spi.transfer(0) +#endif + +#endif // Header end diff --git a/libraries/TFT_eSPI/Processors/pio_16bit_parallel.pio.h b/libraries/TFT_eSPI/Processors/pio_16bit_parallel.pio.h new file mode 100644 index 0000000..655c1b1 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/pio_16bit_parallel.pio.h @@ -0,0 +1,62 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// 16-bit parallel // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 7 +#define tft_io_wrap 20 +#define tft_io_offset_block_fill 0u +#define tft_io_offset_start_8 7u +#define tft_io_offset_start_tx 7u +#define tft_io_offset_set_addr_window 10u + +static const uint16_t tft_io_program_instructions[] = { + 0x98a0, // 0: pull block side 1 + 0xa027, // 1: mov x, osr + 0x80a0, // 2: pull block + 0xa047, // 3: mov y, osr + 0xb8e1, // 4: mov osr, x side 1 + 0x7100, // 5: out pins, 32 side 0 [1] + 0x1884, // 6: jmp y--, 4 side 1 + // .wrap_target + 0x98a0, // 7: pull block side 1 + 0x7100, // 8: out pins, 32 side 0 [1] + 0x1807, // 9: jmp 7 side 1 + 0xf822, // 10: set x, 2 side 1 + 0xe000, // 11: set pins, 0 + 0x80a0, // 12: pull block + 0x7000, // 13: out pins, 32 side 0 + 0x0033, // 14: jmp !x, 19 + 0x98a0, // 15: pull block side 1 + 0xe001, // 16: set pins, 1 + 0x7108, // 17: out pins, 8 side 0 [1] + 0x19f1, // 18: jmp !osre, 17 side 1 [1] + 0x184b, // 19: jmp x--, 11 side 1 + 0xe001, // 20: set pins, 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 21, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI/Processors/pio_8bit_parallel.pio.h b/libraries/TFT_eSPI/Processors/pio_8bit_parallel.pio.h new file mode 100644 index 0000000..b5d6a8c --- /dev/null +++ b/libraries/TFT_eSPI/Processors/pio_8bit_parallel.pio.h @@ -0,0 +1,70 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// 8-bit parallel // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 9 +#define tft_io_wrap 27 + +#define tft_io_offset_block_fill 0u +#define tft_io_offset_start_tx 9u +#define tft_io_offset_start_8 14u +#define tft_io_offset_set_addr_window 17u + +static const uint16_t tft_io_program_instructions[] = { + 0x98a0, // 0: pull block side 1 + 0xa027, // 1: mov x, osr + 0x80a0, // 2: pull block + 0xa047, // 3: mov y, osr + 0xb8e1, // 4: mov osr, x side 1 + 0x7118, // 5: out pins, 24 side 0 [1] + 0xb942, // 6: nop side 1 [1] + 0x7108, // 7: out pins, 8 side 0 [1] + 0x1884, // 8: jmp y--, 4 side 1 + // .wrap_target + 0x98a0, // 9: pull block side 1 + 0x7118, // 10: out pins, 24 side 0 [1] + 0xb942, // 11: nop side 1 [1] + 0x7108, // 12: out pins, 8 side 0 [1] + 0x1809, // 13: jmp 9 side 1 + 0x98a0, // 14: pull block side 1 + 0x7100, // 15: out pins, 32 side 0 [1] + 0x1809, // 16: jmp 9 side 1 + 0xf822, // 17: set x, 2 side 1 + 0xe000, // 18: set pins, 0 + 0x80a0, // 19: pull block + 0x7000, // 20: out pins, 32 side 0 + 0x003a, // 21: jmp !x, 26 + 0x98a0, // 22: pull block side 1 + 0xe001, // 23: set pins, 1 + 0x7108, // 24: out pins, 8 side 0 [1] + 0x19f8, // 25: jmp !osre, 24 side 1 [1] + 0x1852, // 26: jmp x--, 18 side 1 + 0xe001, // 27: set pins, 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 28, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h b/libraries/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h new file mode 100644 index 0000000..b2aaff4 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h @@ -0,0 +1,73 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 11 +#define tft_io_wrap 31 + +#define tft_io_offset_block_fill 0u +#define tft_io_offset_start_tx 11u +#define tft_io_offset_start_8 18u +#define tft_io_offset_set_addr_window 21u + +static const uint16_t tft_io_program_instructions[] = { + 0x98a0, // 0: pull block side 1 + 0xa027, // 1: mov x, osr + 0x80a0, // 2: pull block + 0xa047, // 3: mov y, osr + 0xb8e1, // 4: mov osr, x side 1 + 0x7110, // 5: out pins, 16 side 0 [1] + 0xb942, // 6: nop side 1 [1] + 0x7108, // 7: out pins, 8 side 0 [1] + 0xb942, // 8: nop side 1 [1] + 0x7108, // 9: out pins, 8 side 0 [1] + 0x1884, // 10: jmp y--, 4 side 1 + // .wrap_target + 0x98a0, // 11: pull block side 1 + 0x7110, // 12: out pins, 16 side 0 [1] + 0xb942, // 13: nop side 1 [1] + 0x7108, // 14: out pins, 8 side 0 [1] + 0xb942, // 15: nop side 1 [1] + 0x7108, // 16: out pins, 8 side 0 [1] + 0x180b, // 17: jmp 11 side 1 + 0x98a0, // 18: pull block side 1 + 0x7100, // 19: out pins, 32 side 0 [1] + 0x180b, // 20: jmp 11 side 1 + 0xf822, // 21: set x, 2 side 1 + 0xe000, // 22: set pins, 0 + 0x80a0, // 23: pull block + 0x7000, // 24: out pins, 32 side 0 + 0x003e, // 25: jmp !x, 30 + 0x98a0, // 26: pull block side 1 + 0xe001, // 27: set pins, 1 + 0x7108, // 28: out pins, 8 side 0 [1] + 0x19fc, // 29: jmp !osre, 28 side 1 [1] + 0x1856, // 30: jmp x--, 22 side 1 + 0xe001, // 31: set pins, 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 32, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI/Processors/pio_SPI.pio.h b/libraries/TFT_eSPI/Processors/pio_SPI.pio.h new file mode 100644 index 0000000..0848529 --- /dev/null +++ b/libraries/TFT_eSPI/Processors/pio_SPI.pio.h @@ -0,0 +1,74 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// 8 + 16-bit SPI - no auto colour conversion // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 27 +#define tft_io_wrap 31 + +#define tft_io_offset_start_8 0u +#define tft_io_offset_set_addr_window 3u +#define tft_io_offset_block_fill 17u +#define tft_io_offset_start_tx 27u + +static const uint16_t tft_io_program_instructions[] = { + 0x90a0, // 0: pull block side 0 + 0x6019, // 1: out pins, 25 + 0x181e, // 2: jmp 30 side 1 + 0xf022, // 3: set x, 2 side 0 + 0xe000, // 4: set pins, 0 + 0x90a0, // 5: pull block side 0 + 0x6019, // 6: out pins, 25 + 0xb842, // 7: nop side 1 + 0x7001, // 8: out pins, 1 side 0 + 0x18e8, // 9: jmp !osre, 8 side 1 + 0xf001, // 10: set pins, 1 side 0 + 0x003b, // 11: jmp !x, 27 + 0x80a0, // 12: pull block + 0x7001, // 13: out pins, 1 side 0 + 0x18ed, // 14: jmp !osre, 13 side 1 + 0x1044, // 15: jmp x--, 4 side 0 + 0x001b, // 16: jmp 27 + 0x90a0, // 17: pull block side 0 + 0xa027, // 18: mov x, osr + 0x80a0, // 19: pull block + 0xa047, // 20: mov y, osr + 0xb0e1, // 21: mov osr, x side 0 + 0x7011, // 22: out pins, 17 side 0 + 0xb842, // 23: nop side 1 + 0x7001, // 24: out pins, 1 side 0 + 0x18f8, // 25: jmp !osre, 24 side 1 + 0x1095, // 26: jmp y--, 21 side 0 + // .wrap_target + 0x90a0, // 27: pull block side 0 + 0x7011, // 28: out pins, 17 side 0 + 0xb842, // 29: nop side 1 + 0x7001, // 30: out pins, 1 side 0 + 0x18fe, // 31: jmp !osre, 30 side 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 32, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI/Processors/pio_SPI_18bit.pio.h b/libraries/TFT_eSPI/Processors/pio_SPI_18bit.pio.h new file mode 100644 index 0000000..09bbfeb --- /dev/null +++ b/libraries/TFT_eSPI/Processors/pio_SPI_18bit.pio.h @@ -0,0 +1,74 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// 8 + 18-bit SPI - no auto colour conversion // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 27 +#define tft_io_wrap 31 + +#define tft_io_offset_start_8 0u +#define tft_io_offset_set_addr_window 3u +#define tft_io_offset_block_fill 17u +#define tft_io_offset_start_tx 27u + +static const uint16_t tft_io_program_instructions[] = { + 0x90a0, // 0: pull block side 0 + 0x6019, // 1: out pins, 25 + 0x181e, // 2: jmp 30 side 1 + 0xf022, // 3: set x, 2 side 0 + 0xe000, // 4: set pins, 0 + 0x90a0, // 5: pull block side 0 + 0x6019, // 6: out pins, 25 + 0xb842, // 7: nop side 1 + 0x7001, // 8: out pins, 1 side 0 + 0x18e8, // 9: jmp !osre, 8 side 1 + 0xf001, // 10: set pins, 1 side 0 + 0x003b, // 11: jmp !x, 27 + 0x80a0, // 12: pull block + 0x7001, // 13: out pins, 1 side 0 + 0x18ed, // 14: jmp !osre, 13 side 1 + 0x1044, // 15: jmp x--, 4 side 0 + 0x001b, // 16: jmp 27 + 0x90a0, // 17: pull block side 0 + 0xa027, // 18: mov x, osr + 0x80a0, // 19: pull block + 0xa047, // 20: mov y, osr + 0xb0e1, // 21: mov osr, x side 0 + 0x7009, // 22: out pins, 9 side 0 + 0xb842, // 23: nop side 1 + 0x7001, // 24: out pins, 1 side 0 + 0x18f8, // 25: jmp !osre, 24 side 1 + 0x1095, // 26: jmp y--, 21 side 0 + // .wrap_target + 0x90a0, // 27: pull block side 0 + 0x7009, // 28: out pins, 9 side 0 + 0xb842, // 29: nop side 1 + 0x7001, // 30: out pins, 1 side 0 + 0x18fe, // 31: jmp !osre, 30 side 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 32, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI/README.md b/libraries/TFT_eSPI/README.md new file mode 100644 index 0000000..0c0c15b --- /dev/null +++ b/libraries/TFT_eSPI/README.md @@ -0,0 +1,227 @@ +A ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) facility has been added for Q&A etc. Use the ["Issues"](https://github.com/Bodmer/TFT_eSPI/issues) tab only for problems with the library. Thanks! +# News +1. The Create_font Processing sketch has been updated to automatically create a complete C header file. The automatic opening of the font folder can also be disabled within the Processing sketch. (Thanks to Pierre-Loup Martin). + +2. New board setup files have been added for the Seeed XIAO with round display, LilyGo T-Embed S3, LilyGo_T_QT_Pro_S3, ESP32 S3 Box and ESP32_S3_Box_Lite. The "RPi" interface style boards are now supported with the ESP32 S3. + +3. New functions have been added to draw smooth (antialiased) arcs, circles, and rounded rectangle outlines. New sketches are provided in the "Smooth Graphics" examples folder. Arcs can be drawn with or without anti-aliasing (which will then render faster). The arc ends can be straight or rounded. The arc drawing algorithm uses an optimised fixed point sqrt() function to improve performance on processors that do not have a hardware Floating Point Unit (e.g. RP2040). Here are two demo images, on the left smooth (anti-aliased) arcs with rounded ends, the image to the right is the same resolution (grabbed from the same 240x240 TFT) with the smoothing diasbled (no anti-aliasing): + + ![arcs](https://github.com/Bodmer/Github-images/blob/main/aa_arc_240x240.png) ![pixelated_arcs](https://github.com/Bodmer/Github-images/blob/main/no_aa_arc_240x240.png) + + Here the smooth arcs have been used to create anti-aliased meter gauges on a 320x240 TFT: + + ![arcs](https://github.com/Bodmer/Github-images/blob/main/xarc_meters_320x240.png) + +4. An excellent new compatible library is available which can render TrueType fonts on a TFT screen (or into a sprite). This has been developed by [takkaO](https://github.com/takkaO/OpenFontRender). The library provides access to compact font files, with fully scaleable anti-aliased glyphs. Left, middle and right justified text can also be printed to the screen. I have added TFT_eSPI specific examples to the OpenFontRender library and tested on RP2040 and ESP32 processors, the ESP8266 does not have sufficient RAM due to the glyph render complexity. Here is a demo screen where a single 12kbyte font file binary was used to render fully anti-aliased glyphs of gradually increasing size on a 320x480 TFT screen: + + ![ttf_font_demo](https://i.imgur.com/bKkilIb.png) + +5. New GUI examples have been added for sliders, buttons, graphs and meters. These examples require a new support library here: + + [TFT_eWidget](https://github.com/Bodmer/TFT_eWidget) + +6. Support has been added in v2.4.70 for the RP2040 with 16-bit parallel displays. This has been tested and the screen update performance is very good (4ms to clear 320 x 480 screen with HC8357C). The use of the RP2040 PIO makes it easy to change the write cycle timing for different displays. DMA with 16-bit transfers is also supported. + +7. Support for the ESP32-S2, ESP32-S3 and ESP32-C3 has been added (DMA only on ESP32 S3 at the moment). Tested with v2.0.3 RC1 of the ESP32 board package. Example setups: + + [Setup70_ESP32_S2_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70_ESP32_S2_ILI9341.h) + + [Setup70b_ESP32_S3_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70b_ESP32_S3_ILI9341.h) + + [Setup70c_ESP32_C3_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70c_ESP32_C3_ILI9341.h) + + [Setup70d_ILI9488_S3_Parallel.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70d_ILI9488_S3_Parallel.h) + +8. Smooth fonts can now be rendered direct to the TFT with very little flicker for quickly changing values. This is achieved by a line-by-line and block-by-block update of the glyph area without drawing pixels twice. This is a "breaking" change for some sketches because a new true/false parameter is needed to render the background. The default is false if the parameter is missing, Examples: + + tft.setTextColor(TFT_WHITE, TFT_BLUE, true); + spr.setTextColor(TFT_BLUE, TFT_BLACK, true); + +Note: background rendering for Smooth fonts is also now available when using the print stream e.g. with: tft.println("Hello World"); + +9. New anti-aliased graphics functions to draw lines, wedge shaped lines, circles and rounded rectangles. [Examples are included](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics). Examples have also been added to [display PNG compressed images](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images) (note: requires ~40kbytes RAM). + +10. Users of PowerPoint experienced with running macros may be interested in the [pptm sketch generator here](https://github.com/Bodmer/PowerPoint_to_sketch), this converts graphics and tables drawn in PowerPoint slides into an Arduino sketch that renders the graphics on a 480x320 TFT. This is based on VB macros [created by Kris Kasprzak here](https://github.com/KrisKasprzak/Powerpoint-ILI9341_t3). + +11. The library contains two new functions for rectangles filled with a horizontal or vertical coloured gradient: + + tft.fillRectHGradient(x, y, w, h, color1, color2); + + tft.fillRectVGradient(x, y, w, h, color1, color2); + + ![Gradient](https://i.imgur.com/atR0DmP.png) + +12. The RP2040 8-bit parallel interface uses the PIO. The PIO now manages the "setWindow" and "block fill" actions, releasing the processor for other tasks when areas of the screen are being filled with a colour. The PIO can optionally be used for SPI interface displays if #define RP2040_PIO_SPI is put in the setup file. Touch screens and pixel read operations are not supported when the PIO interface is used. +The RP2040 PIO features only work with [Earle Philhower's board package](https://github.com/earlephilhower/arduino-pico), NOT the Arduino Mbed version. + +The use of PIO for SPI allows the RP2040 to be over-clocked (up to 250MHz works on my boards) in Earle's board package whilst still maintaining high SPI clock rates. + +# TFT_eSPI + +A feature rich Arduino IDE compatible graphics and fonts library for 32-bit processors. The library is targeted at 32-bit processors, it has been performance optimised for RP2040, STM32, ESP8266 and ESP32 types, other 32-bit processors may be used but will use the slower generic Arduino interface calls. The library can be loaded using the Arduino IDE's Library Manager. Direct Memory Access (DMA) can be used with the ESP32, RP2040 and STM32 processors with SPI interface displays to improve rendering performance. DMA with a parallel interface (8 and 16-bit) is only supported with the RP2040. + +The updates for the ESP32 S2/C3/S3 means that the library requires the ESP32 Arduino board package 2.x.x or later. + +The screen controller, interface pins and library configuration settings must be defined inside the library. They can NOT be defined in the Arduino sketch. See the User_Setup_Select.h file for details. This approach has significant advantages, it keeps the examples clean from long configuration options and once the setup is defined any example can be run without modification. PlatformIO users can define these settings on a per project basis within a platformio.ini file, see Docs folder in library. + +Lots of example sketches are provided which demonstrate using the functions in the library. Due to the popularity of the library there are lots of online tutorials for TFT_eSPI that have been created by enthusiastic users. + +Optimised drivers have been tested with the following processors: + +* RP2040, e.g. Raspberry Pi Pico +* ESP32 and ESP32-S2, ESP32-C3, ESP32-S3 +* ESP8266 +* STM32F1xx, STM32F2xx, STM32F4xx, STM32F767 (higher RAM processors recommended) + +The library supports the following interface types for these processors: + +| Processor | 4 wire SPI | 8-bit parallel | 16-bit parallel | DMA support | +|-----------| :---: | :---: | :---: | :---: | +| RP2040 | Yes | Yes | Yes | Yes (all) | +| ESP32 | Yes | Yes | No | Yes (SPI only) | +| ESP32 C3 | Yes | No | No | No | +| ESP32 S2 | Yes | No | No | No | +| ESP32 S3 | Yes | Yes | No | Yes (SPI only) | +| ESP8266 | Yes | No | No | No | +| STM32Fxxx | Yes | Yes | No | Yes (SPI only) | +| Other | Yes | No | No | No | + +For other (generic) processors only SPI interface displays are supported and the slower Arduino SPI library functions are used by the library. Higher clock speed processors such as used for the Teensy 3.x and 4.x boards will still provide a very good performance with the generic Arduino SPI functions. + +4 wire SPI means the display must have SPI interface comaptible signals and a "Data/Command" control signal, this signal line is sometimes labelled DC, RS or A0. + +Due to lack of GPIO pins the 8-bit parallel interface is NOT supported on the ESP8266. 8-bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with the STM32Fxxx Nucleo 64/144 range or the UNO format ESP32 (see below for ESP32). + +Support for the XPT2046 touch screen controller is built into the library and can be used with SPI interface displays. Third party touch support libraries are also available when using a display parallel interface. + +Displays using the following controllers are supported: + +* GC9A01 +* ILI9163 +* ILI9225 +* ILI9341 +* ILI9342 +* ILI9481 (DMA not supported with SPI) +* ILI9486 (DMA not supported with SPI) +* ILI9488 (DMA not supported with SPI) +* HX8357B (16-bit parallel tested with RP2040) +* HX8357C (16-bit parallel tested with RP2040) +* HX8357D +* R61581 +* RM68120 (support files added but untested) +* RM68140 +* S6D02A1 +* SSD1351 +* SSD1963 (this controller only has a parallel interface option) +* ST7735 +* ST7789 +* ST7796 + +ILI9341 and ST7796 SPI based displays are recommended as starting point for experimenting with this library. + +The library supports some TFT displays designed for the Raspberry Pi (RPi) that are based on a ILI9486 or ST7796 driver chip with a 480 x 320 pixel screen. The ILI9486 RPi display must be of the Waveshare design and use a 16-bit serial interface based on the 74HC04, 74HC4040 and 2 x 74HC4094 logic chips. Note that due to design variations between these displays not all RPi displays will work with this library, so purchasing a RPi display of these types solely for use with this library is NOT recommended. + +A "good" RPi display is the [MHS-4.0 inch Display-B type ST7796](http://www.lcdwiki.com/MHS-4.0inch_Display-B) which provides good performance. This has a dedicated controller and can be clocked at up to 80MHz with the ESP32 (125MHz with overclocked RP2040, 55MHz with STM32 and 40MHz with ESP8266). The [MHS-3.5 inch RPi ILI9486](http://www.lcdwiki.com/MHS-3.5inch_RPi_Display) based display is also supported, however the MHS ILI9341 based display of the same type does NOT work with this library. + +Some displays permit the internal TFT screen RAM to be read, a few of the examples use this feature. The TFT_Screen_Capture example allows full screens to be captured and sent to a PC, this is handy to create program documentation. + +The library includes a "Sprite" class, this enables flicker free updates of complex graphics. Direct writes to the TFT with graphics functions are still available, so existing sketches do not need to be changed. + +# Sprites + +A Sprite is notionally an invisible graphics screen that is kept in the processors RAM. Graphics can be drawn into the Sprite just as they can be drawn directly to the screen. Once the Sprite is completed it can be plotted onto the screen in any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. Sprites by default use 16-bit colours, the bit depth can be set to 8 bits (256 colours) , or 1 bit (any 2 colours) to reduce the RAM needed. On an ESP8266 the largest 16-bit colour Sprite that can be created is about 160x128 pixels, this consumes 40Kbytes of RAM. On an ESP32 the workspace RAM is more limited than the datasheet implies so a 16-bit colour Sprite is limited to about 200x200 pixels (~80Kbytes), an 8-bit sprite to 320x240 pixels (~76kbytes). A 1 bit per pixel Sprite requires only 9600 bytes for a full 320 x 240 screen buffer, this is ideal for supporting use with 2 colour bitmap fonts. + +One or more sprites can be created, a sprite can be any pixel width and height, limited only by available RAM. The RAM needed for a 16-bit colour depth Sprite is (2 x width x height) bytes, for a Sprite with 8-bit colour depth the RAM needed is (width x height) bytes. Sprites can be created and deleted dynamically as needed in the sketch, this means RAM can be freed up after the Sprite has been plotted on the screen, more RAM intensive WiFi based code can then be run and normal graphics operations still work. + +Drawing graphics into a sprite is very fast, for those familiar with the Adafruit "graphicstest" example, this whole test completes in 18ms in a 160x128 sprite. Examples of sprite use can be found in the "examples/Sprite" folder. + +Sprites can be plotted to the TFT with one colour being specified as "transparent", see Transparent_Sprite_Demo example. + +If an ESP32 board has SPIRAM (i.e. PSRAM) fitted then Sprites will use the PSRAM memory and large full screen buffer Sprites can be created. Full screen Sprites take longer to render (~45ms for a 320 x 240 16-bit Sprite), so bear that in mind. + +The "Animated_dial" example shows how dials can be created using a rotated Sprite for the needle. To run this example the TFT interface must support reading from the screen RAM (not all do). The dial rim and scale is a jpeg image, created using a paint program. + +![Animated_dial](https://i.imgur.com/S736Rg6.png) + + +# Touch controller support + +The XPT2046 touch screen controller is supported for SPI based displays only. The SPI bus for the touch controller is shared with the TFT and only an additional chip select line is needed. This support will eventually be deprecated when a suitable touch screen library is available. + +The Button class from Adafruit_GFX is incorporated, with the enhancement that the button labels can be in any font. + +# ESP8266 overlap mode + +The library supports SPI overlap on the ESP8266 so the TFT screen can share MOSI, MISO and SCLK pins with the program FLASH, this frees up GPIO pins for other uses. Only one SPI device can be connected to the FLASH pins and the chips select for the TFT must be on pin D3 (GPIO0). + + +# Fonts + +The library contains proportional fonts, different sizes can be enabled/disabled at compile time to optimise the use of FLASH memory. Anti-aliased (smooth) font files in vlw format stored in SPIFFS are supported. Any 16-bit Unicode character can be included and rendered, this means many language specific characters can be rendered to the screen. + +The library is based on the Adafruit GFX and Adafruit driver libraries and the aim is to retain compatibility. Significant additions have been made to the library to boost the speed for the different processors (it is typically 3 to 10 times faster) and to add new features. The new graphics functions include different size proportional fonts and formatting features. There are lots of example sketches to demonstrate the different features and included functions. + +Configuration of the library font selections, pins used to interface with the TFT and other features is made by editing the User_Setup.h file in the library folder, or by selecting your own configuration in the "User_Setup_Selet,h" file. Fonts and features can easily be enabled/disabled by commenting out lines. + + +# Anti-aliased Fonts + +Anti-aliased (smooth) font files in "vlw" format are generated by the free [Processing IDE](https://processing.org/) using a sketch included in the library Tools folder. This sketch with the Processing IDE can be used to generate font files from your computer's font set or any TrueType (.ttf) font, the font file can include **any** combination of 16-bit Unicode characters. This means Greek, Japanese and any other UCS-2 glyphs can be used. Character arrays and Strings in UTF-8 format are supported. + +The .vlw files must be uploaded to the processors FLASH filing system (SPIFFS, LittleFS or SD card) for use. Alternatively the .vlw files can be converted to C arrays (see "Smooth Font -> FLASH_Array" examples) and stored directly in FLASH as part of the compile process. The array based approach is convenient, provides performance improvements and is suitable where: either use of a filing system is undesirable, or the processor type (e.g. STM32) does not support a FLASH based filing system. + +Here is the Adafruit_GFX "FreeSans12pt" bitmap font compared to the same font drawn as anti-aliased: + +![Smooth_font](https://i.imgur.com/gAeDPFY.png) + +The smooth font example displays the following screen: + +![Example](https://i.imgur.com/xJF0Oz7.png) + +It would be possible to compress the vlw font files but the rendering performance to a TFT is still good when storing the font file(s) in SPIFFS, LittleFS or FLASH arrays. + +Here is an example screenshot showing the anti-aliased Hiragana character Unicode block (0x3041 to 0x309F) in 24pt from the Microsoft Yahei font: + +![Hiragana glyphs](https://i.imgur.com/jeXf2st.png) + +Anti-aliased fonts can also be drawn over a gradient background with a callback to fetch the background colour of each pixel. This pixel colour can be set by the gradient algorithm or by reading back the TFT screen memory (if reading the display is supported). + +Anti-aliased fonts cannot be scaled with setTextSize so you need to create a font for each size you need. See examples. + +# 8-bit parallel support + +The common 8-bit "Mcufriend" shields are supported for the STM Nucleo 64/144 boards and ESP32 UNO style board. The STM32 "Blue/Black Pill" boards can also be used with 8-bit parallel displays. + +The ESP32 board I have been using for testing has the following pinout: + +![Example](https://i.imgur.com/bvM6leE.jpg) + +UNO style boards with a Wemos R32(ESP32) label are also available at low cost with the same pinout. + +Unfortunately the typical UNO/mcufriend TFT display board maps LCD_RD, LCD_CS and LCD_RST signals to the ESP32 analogue pins 35, 34 and 36 which are input only. To solve this I linked in the 3 spare pins IO15, IO33 and IO32 by adding wires to the bottom of the board as follows: + +IO15 wired to IO35 + +IO33 wired to IO34 + +IO32 wired to IO36 + +This is an [example setup file](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup14_ILI9341_Parallel.h) with the correct GPIO for this UNO board. + +![Example](https://i.imgur.com/pUZn6lF.jpg) + +If the display board is fitted with a resistance based touch screen then this can be used by performing the modifications described here and the fork of the Adafruit library: +https://github.com/s60sc/Adafruit_TouchScreen + +# Tips +If you load a new copy of TFT_eSPI then it will overwrite your setups if they are kept within the TFT_eSPI folder. One way around this is to create a new folder in your Arduino library folder called "TFT_eSPI_Setups". You then place your custom setup.h files in there. After an upgrade simply edit the User_Setup_Select.h file to point to your custom setup file e.g.: +``` +#include <../TFT_eSPI_Setups/my_custom_setup.h> +``` +You must make sure only one setup file is called. In the custom setup file I add the file path as a commented out first line that can be cut and pasted back into the upgraded User_Setup_Select.h file. The ../ at the start of the path means go up one directory level. Clearly you could use different file paths or directory names as long as it does not clash with another library or folder name. + +You can take this one step further and have your own setup select file and then you only need to replace the Setup.h line reference in User_Setup_Select.h to, for example: +``` +#include <../TFT_eSPI_Setups/my_setup_select.h> +``` +To select a new setup you then edit your own my_setup_select.h file (which will not get overwritten during an upgrade). diff --git a/libraries/TFT_eSPI/README.txt b/libraries/TFT_eSPI/README.txt new file mode 100644 index 0000000..45eb4fb --- /dev/null +++ b/libraries/TFT_eSPI/README.txt @@ -0,0 +1,7 @@ +This is a stand-alone library that contains both graphics functions +and the TFT chip driver library. It supports the ESP8266, ESP32, +STM32 and RP2040 processors with performance optimised code. Other +Arduino IDE compatible boards are also supported but the library +then uses generic functions which will be slower. The library uses +32-bit variables extensively so this will affect performance on 8 +and 16-bit processors. diff --git a/libraries/TFT_eSPI/TFT_Drivers/EPD_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/EPD_Defines.h new file mode 100644 index 0000000..6a6838c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/EPD_Defines.h @@ -0,0 +1,27 @@ +// Null set for ePaper +#define TFT_WIDTH 1000 +#define TFT_HEIGHT 1000 + +#define TFT_INIT_DELAY 0 + +#define TFT_NOP 0x00 +#define TFT_SWRST 0x00 + +#define TFT_CASET 0x00 +#define TFT_PASET 0x00 +#define TFT_RAMWR 0x00 + +#define TFT_RAMRD 0x00 +#define TFT_IDXRD 0x00 + +#define TFT_MADCTL 0x00 +#define TFT_MAD_MY 0x00 +#define TFT_MAD_MX 0x00 +#define TFT_MAD_MV 0x00 +#define TFT_MAD_ML 0x00 +#define TFT_MAD_BGR 0x00 +#define TFT_MAD_MH 0x00 +#define TFT_MAD_RGB 0x00 + +#define TFT_INVOFF 0x00 +#define TFT_INVON 0x00 diff --git a/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Defines.h new file mode 100644 index 0000000..4cb1095 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Defines.h @@ -0,0 +1,40 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 240 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 240 +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 //0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 diff --git a/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Init.h b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Init.h new file mode 100644 index 0000000..947d37d --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Init.h @@ -0,0 +1,232 @@ + +// This is the command sequence that initialises the GC9A01 driver + +{ + writecommand(0xEF); + writecommand(0xEB); + writedata(0x14); + + writecommand(0xFE); + writecommand(0xEF); + + writecommand(0xEB); + writedata(0x14); + + writecommand(0x84); + writedata(0x40); + + writecommand(0x85); + writedata(0xFF); + + writecommand(0x86); + writedata(0xFF); + + writecommand(0x87); + writedata(0xFF); + + writecommand(0x88); + writedata(0x0A); + + writecommand(0x89); + writedata(0x21); + + writecommand(0x8A); + writedata(0x00); + + writecommand(0x8B); + writedata(0x80); + + writecommand(0x8C); + writedata(0x01); + + writecommand(0x8D); + writedata(0x01); + + writecommand(0x8E); + writedata(0xFF); + + writecommand(0x8F); + writedata(0xFF); + + writecommand(0xB6); + writedata(0x00); + writedata(0x20); + + writecommand(0x3A); + writedata(0x05); + + writecommand(0x90); + writedata(0x08); + writedata(0x08); + writedata(0x08); + writedata(0x08); + + writecommand(0xBD); + writedata(0x06); + + writecommand(0xBC); + writedata(0x00); + + writecommand(0xFF); + writedata(0x60); + writedata(0x01); + writedata(0x04); + + writecommand(0xC3); + writedata(0x13); + writecommand(0xC4); + writedata(0x13); + + writecommand(0xC9); + writedata(0x22); + + writecommand(0xBE); + writedata(0x11); + + writecommand(0xE1); + writedata(0x10); + writedata(0x0E); + + writecommand(0xDF); + writedata(0x21); + writedata(0x0c); + writedata(0x02); + + writecommand(0xF0); + writedata(0x45); + writedata(0x09); + writedata(0x08); + writedata(0x08); + writedata(0x26); + writedata(0x2A); + + writecommand(0xF1); + writedata(0x43); + writedata(0x70); + writedata(0x72); + writedata(0x36); + writedata(0x37); + writedata(0x6F); + + writecommand(0xF2); + writedata(0x45); + writedata(0x09); + writedata(0x08); + writedata(0x08); + writedata(0x26); + writedata(0x2A); + + writecommand(0xF3); + writedata(0x43); + writedata(0x70); + writedata(0x72); + writedata(0x36); + writedata(0x37); + writedata(0x6F); + + writecommand(0xED); + writedata(0x1B); + writedata(0x0B); + + writecommand(0xAE); + writedata(0x77); + + writecommand(0xCD); + writedata(0x63); + + writecommand(0x70); + writedata(0x07); + writedata(0x07); + writedata(0x04); + writedata(0x0E); + writedata(0x0F); + writedata(0x09); + writedata(0x07); + writedata(0x08); + writedata(0x03); + + writecommand(0xE8); + writedata(0x34); + + writecommand(0x62); + writedata(0x18); + writedata(0x0D); + writedata(0x71); + writedata(0xED); + writedata(0x70); + writedata(0x70); + writedata(0x18); + writedata(0x0F); + writedata(0x71); + writedata(0xEF); + writedata(0x70); + writedata(0x70); + + writecommand(0x63); + writedata(0x18); + writedata(0x11); + writedata(0x71); + writedata(0xF1); + writedata(0x70); + writedata(0x70); + writedata(0x18); + writedata(0x13); + writedata(0x71); + writedata(0xF3); + writedata(0x70); + writedata(0x70); + + writecommand(0x64); + writedata(0x28); + writedata(0x29); + writedata(0xF1); + writedata(0x01); + writedata(0xF1); + writedata(0x00); + writedata(0x07); + + writecommand(0x66); + writedata(0x3C); + writedata(0x00); + writedata(0xCD); + writedata(0x67); + writedata(0x45); + writedata(0x45); + writedata(0x10); + writedata(0x00); + writedata(0x00); + writedata(0x00); + + writecommand(0x67); + writedata(0x00); + writedata(0x3C); + writedata(0x00); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x54); + writedata(0x10); + writedata(0x32); + writedata(0x98); + + writecommand(0x74); + writedata(0x10); + writedata(0x85); + writedata(0x80); + writedata(0x00); + writedata(0x00); + writedata(0x4E); + writedata(0x00); + + writecommand(0x98); + writedata(0x3e); + writedata(0x07); + + writecommand(0x35); + writecommand(0x21); + + writecommand(0x11); + delay(120); + writecommand(0x29); + delay(20); +} diff --git a/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h new file mode 100644 index 0000000..48724e7 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h @@ -0,0 +1,56 @@ + +// This is the command sequence that rotates the GC9A01 driver coordinate frame + + rotation = m % 4; + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif + break; + case 2: // Inverter portrait + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Defines.h new file mode 100644 index 0000000..d2f3cf9 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Defines.h @@ -0,0 +1,52 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPar.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Init.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Init.h new file mode 100644 index 0000000..7ca937c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Init.h @@ -0,0 +1,76 @@ + +// This is the command sequence that initialises the HX8357B driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure HX8357-B display + writecommand(0x11); + delay(20); + writecommand(0xD0); + writedata(0x07); + writedata(0x42); + writedata(0x18); + + writecommand(0xD1); + writedata(0x00); + writedata(0x07); + writedata(0x10); + + writecommand(0xD2); + writedata(0x01); + writedata(0x02); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x08); + + writecommand(0xC8); + writedata(0x00); + writedata(0x32); + writedata(0x36); + writedata(0x45); + writedata(0x06); + writedata(0x16); + writedata(0x37); + writedata(0x75); + writedata(0x77); + writedata(0x54); + writedata(0x0C); + writedata(0x00); + + writecommand(0x36); + writedata(0x0a); + + writecommand(0x3A); + writedata(0x55); + + writecommand(0x2A); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(0x2B); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(0x29); + + delay(25); + +// End of HX8357B display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Rotation.h new file mode 100644 index 0000000..d3644f8 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357B_Rotation.h @@ -0,0 +1,47 @@ + // This is the command sequence that rotates the HX8357C driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 8; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MX); + _width = _init_width; + _height = _init_height; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV); + _width = _init_height; + _height = _init_width; + break; + case 2: // Inverter portrait + writedata( TFT_MAD_COLOR_ORDER | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + case 4: // Portrait + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 5: // Landscape (Portrait + 90) + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MX); + _width = _init_height; + _height = _init_width; + break; + case 6: // Inverter portrait + writedata( TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 7: // Inverted landscape + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + } + \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Defines.h new file mode 100644 index 0000000..d2f3cf9 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Defines.h @@ -0,0 +1,52 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPar.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Init.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Init.h new file mode 100644 index 0000000..807cadb --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Init.h @@ -0,0 +1,116 @@ + +// This is the command sequence that initialises the HX8357C driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure HX8357C display + + writecommand(0xB9); // Enable extension command + writedata(0xFF); + writedata(0x83); + writedata(0x57); + delay(50); + + writecommand(0xB6); //Set VCOM voltage + writedata(0x2C); //0x52 for HSD 3.0" + + writecommand(0x11); // Sleep off + delay(200); + + writecommand(0x35); // Tearing effect on + writedata(0x00); // Added parameter + + writecommand(0x3A); // Interface pixel format + writedata(0x55); // 16 bits per pixel + + //writecommand(0xCC); // Set panel characteristic + //writedata(0x09); // S960>S1, G1>G480, R-G-B, normally black + + //writecommand(0xB3); // RGB interface + //writedata(0x43); + //writedata(0x00); + //writedata(0x06); + //writedata(0x06); + + writecommand(0xB1); // Power control + writedata(0x00); + writedata(0x15); + writedata(0x0D); + writedata(0x0D); + writedata(0x83); + writedata(0x48); + + + writecommand(0xC0); // Does this do anything? + writedata(0x24); + writedata(0x24); + writedata(0x01); + writedata(0x3C); + writedata(0xC8); + writedata(0x08); + + writecommand(0xB4); // Display cycle + writedata(0x02); + writedata(0x40); + writedata(0x00); + writedata(0x2A); + writedata(0x2A); + writedata(0x0D); + writedata(0x4F); + + writecommand(0xE0); // Gamma curve + writedata(0x00); + writedata(0x15); + writedata(0x1D); + writedata(0x2A); + writedata(0x31); + writedata(0x42); + writedata(0x4C); + writedata(0x53); + writedata(0x45); + writedata(0x40); + writedata(0x3B); + writedata(0x32); + writedata(0x2E); + writedata(0x28); + + writedata(0x24); + writedata(0x03); + writedata(0x00); + writedata(0x15); + writedata(0x1D); + writedata(0x2A); + writedata(0x31); + writedata(0x42); + writedata(0x4C); + writedata(0x53); + writedata(0x45); + writedata(0x40); + writedata(0x3B); + writedata(0x32); + + writedata(0x2E); + writedata(0x28); + writedata(0x24); + writedata(0x03); + writedata(0x00); + writedata(0x01); + + writecommand(0x36); // MADCTL Memory access control + writedata(0x48); + delay(20); + + writecommand(0x21); //Display inversion on + delay(20); + + writecommand(0x29); // Display on + + delay(120); + +// End of HX8357C display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Rotation.h new file mode 100644 index 0000000..d3644f8 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357C_Rotation.h @@ -0,0 +1,47 @@ + // This is the command sequence that rotates the HX8357C driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 8; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MX); + _width = _init_width; + _height = _init_height; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV); + _width = _init_height; + _height = _init_width; + break; + case 2: // Inverter portrait + writedata( TFT_MAD_COLOR_ORDER | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + case 4: // Portrait + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 5: // Landscape (Portrait + 90) + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MX); + _width = _init_height; + _height = _init_width; + break; + case 6: // Inverter portrait + writedata( TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 7: // Inverted landscape + writedata(TFT_MAD_COLOR_ORDER | TFT_MAD_MV | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + } + \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Defines.h new file mode 100644 index 0000000..b3def6c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Defines.h @@ -0,0 +1,96 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPar.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read + + +#define HX8357_NOP 0x00 +#define HX8357_SWRESET 0x01 +#define HX8357_RDDID 0x04 +#define HX8357_RDDST 0x09 + +#define HX8357_RDPOWMODE 0x0A +#define HX8357_RDMADCTL 0x0B +#define HX8357_RDCOLMOD 0x0C +#define HX8357_RDDIM 0x0D +#define HX8357_RDDSDR 0x0F + +#define HX8357_SLPIN 0x10 +#define HX8357_SLPOUT 0x11 + +#define HX8357_INVOFF 0x20 +#define HX8357_INVON 0x21 +#define HX8357_DISPOFF 0x28 +#define HX8357_DISPON 0x29 + +#define HX8357_CASET 0x2A +#define HX8357_PASET 0x2B +#define HX8357_RAMWR 0x2C +#define HX8357_RAMRD 0x2E + +#define HX8357_TEON 0x35 +#define HX8357_TEARLINE 0x44 +#define HX8357_MADCTL 0x36 +#define HX8357_COLMOD 0x3A + +#define HX8357_SETOSC 0xB0 +#define HX8357_SETPWR1 0xB1 +#define HX8357_SETRGB 0xB3 +#define HX8357D_SETCOM 0xB6 + +#define HX8357D_SETCYC 0xB4 +#define HX8357D_SETC 0xB9 + +#define HX8357D_SETSTBA 0xC0 + +#define HX8357_SETPANEL 0xCC + +#define HX8357D_SETGAMMA 0xE0 diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Init.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Init.h new file mode 100644 index 0000000..0e49d3f --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Init.h @@ -0,0 +1,118 @@ + +// This is the command sequence that initialises the HX8357D driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure HX8357D display + + // setextc + writecommand(HX8357D_SETC); + writedata(0xFF); + writedata(0x83); + writedata(0x57); + delay(300); + + // setRGB which also enables SDO + writecommand(HX8357_SETRGB); + writedata(0x80); //enable SDO pin! +// writedata(0x00); //disable SDO pin! + writedata(0x0); + writedata(0x06); + writedata(0x06); + + writecommand(HX8357D_SETCOM); + writedata(0x25); // -1.52V + + writecommand(HX8357_SETOSC); + writedata(0x68); // Normal mode 70Hz, Idle mode 55 Hz + + writecommand(HX8357_SETPANEL); //Set Panel + writedata(0x05); // BGR, Gate direction swapped + + writecommand(HX8357_SETPWR1); + writedata(0x00); // Not deep standby + writedata(0x15); //BT + writedata(0x1C); //VSPR + writedata(0x1C); //VSNR + writedata(0x83); //AP + writedata(0xAA); //FS + + writecommand(HX8357D_SETSTBA); + writedata(0x50); //OPON normal + writedata(0x50); //OPON idle + writedata(0x01); //STBA + writedata(0x3C); //STBA + writedata(0x1E); //STBA + writedata(0x08); //GEN + + writecommand(HX8357D_SETCYC); + writedata(0x02); //NW 0x02 + writedata(0x40); //RTN + writedata(0x00); //DIV + writedata(0x2A); //DUM + writedata(0x2A); //DUM + writedata(0x0D); //GDON + writedata(0x78); //GDOFF + + writecommand(HX8357D_SETGAMMA); + writedata(0x02); + writedata(0x0A); + writedata(0x11); + writedata(0x1d); + writedata(0x23); + writedata(0x35); + writedata(0x41); + writedata(0x4b); + writedata(0x4b); + writedata(0x42); + writedata(0x3A); + writedata(0x27); + writedata(0x1B); + writedata(0x08); + writedata(0x09); + writedata(0x03); + writedata(0x02); + writedata(0x0A); + writedata(0x11); + writedata(0x1d); + writedata(0x23); + writedata(0x35); + writedata(0x41); + writedata(0x4b); + writedata(0x4b); + writedata(0x42); + writedata(0x3A); + writedata(0x27); + writedata(0x1B); + writedata(0x08); + writedata(0x09); + writedata(0x03); + writedata(0x00); + writedata(0x01); + + writecommand(HX8357_COLMOD); + writedata(0x55); // 16-bit + + writecommand(HX8357_MADCTL); + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + writecommand(HX8357_TEON); // TE off + writedata(0x00); + + writecommand(HX8357_TEARLINE); // tear line + writedata(0x00); + writedata(0x02); + + writecommand(HX8357_SLPOUT); //Exit Sleep + delay(150); + + writecommand(HX8357_DISPON); // display on + delay(50); + +// End of HX8357D display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Rotation.h new file mode 100644 index 0000000..f54eaef --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/HX8357D_Rotation.h @@ -0,0 +1,26 @@ + // This is the command sequence that rotates the HX8357D driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Defines.h new file mode 100644 index 0000000..f1c6339 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Defines.h @@ -0,0 +1,65 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 128 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 160 +#endif + +#if (TFT_HEIGHT == 128) && (TFT_WIDTH == 128) + #define CGRAM_OFFSET +#endif + +// Color definitions for backwards compatibility with old sketches +// use colour definitions like TFT_BLACK to make sketches more portable +#define ILI9163_BLACK 0x0000 /* 0, 0, 0 */ +#define ILI9163_NAVY 0x000F /* 0, 0, 128 */ +#define ILI9163_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ILI9163_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ILI9163_MAROON 0x7800 /* 128, 0, 0 */ +#define ILI9163_PURPLE 0x780F /* 128, 0, 128 */ +#define ILI9163_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ILI9163_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ILI9163_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ILI9163_BLUE 0x001F /* 0, 0, 255 */ +#define ILI9163_GREEN 0x07E0 /* 0, 255, 0 */ +#define ILI9163_CYAN 0x07FF /* 0, 255, 255 */ +#define ILI9163_RED 0xF800 /* 255, 0, 0 */ +#define ILI9163_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ILI9163_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ILI9163_WHITE 0xFFFF /* 255, 255, 255 */ +#define ILI9163_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ILI9163_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ILI9163_PINK 0xF81F + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 //0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Init.h new file mode 100644 index 0000000..0f2702c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Init.h @@ -0,0 +1,41 @@ + +// This is the command sequence that initialises the ILI9163 driver +// +// This setup information is in a format accecpted by the commandList() function +// which reduces FLASH space, but on an ESP8266 there is plenty available! +// +// See ILI9341_Setup.h file for an alternative simpler format + +{ + // Initialization commands for ILI9163 screens + static const uint8_t ILI9163_cmds[] PROGMEM = + { + 17, // 17 commands follow + 0x01, 0 + TFT_INIT_DELAY, 120, // Software reset + 0x11, 0 + TFT_INIT_DELAY, 5, // Exit sleep mode + 0x3A, 1, 0x05, // Set pixel format + 0x26, 1, 0x04, // Set Gamma curve 3 + 0xF2, 1, 0x01, // Gamma adjustment enabled + 0xE0, 15, 0x3F, 0x25, 0x1C, 0x1E, 0x20, 0x12, 0x2A, 0x90, + 0x24, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, // Positive Gamma + 0xE1, 15, 0x20, 0x20, 0x20, 0x20, 0x05, 0x00, 0x15,0xA7, + 0x3D, 0x18, 0x25, 0x2A, 0x2B, 0x2B, 0x3A, // Negative Gamma + 0xB1, 2, 0x08, 0x08, // Frame rate control 1 + 0xB4, 1, 0x07, // Display inversion + 0xC0, 2, 0x0A, 0x02, // Power control 1 + 0xC1, 1, 0x02, // Power control 2 + 0xC5, 2, 0x50, 0x5B, // Vcom control 1 + 0xC7, 1, 0x40, // Vcom offset + 0x2A, 4, 0x00, 0x00, 0x00, 0x7F, // Set column address + 0x2B, 4 + TFT_INIT_DELAY, 0x00, 0x00, 0x00, 0x9F, 250, // Set page address + 0x36, 1, 0xC8, // Set address mode + 0x29, 0, // Set display on + }; + + commandList(ILI9163_cmds); + + #ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 0; + #endif +} \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Rotation.h new file mode 100644 index 0000000..3323169 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9163_Rotation.h @@ -0,0 +1,44 @@ + +// This is the command sequence that rotates the ILI9163 driver coordinate frame + + rotation = m % 4; + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + #ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 0; + #endif + break; + case 1: + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + #ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 0; + #endif + break; + case 2: + writedata(TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + #ifdef CGRAM_OFFSET + colstart = 0; + rowstart = 32; + #endif + break; + case 3: + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + #ifdef CGRAM_OFFSET + colstart = 32; + rowstart = 0; + #endif + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Defines.h new file mode 100644 index 0000000..1a083e0 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Defines.h @@ -0,0 +1,84 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 176 +#define TFT_HEIGHT 220 + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x28 + +#define TFT_CASET 0 +#define TFT_PASET 0 + +#define TFT_CASET1 ILI9225_HORIZONTAL_WINDOW_ADDR2 +#define TFT_CASET2 ILI9225_HORIZONTAL_WINDOW_ADDR1 + +#define TFT_PASET1 ILI9225_VERTICAL_WINDOW_ADDR2 +#define TFT_PASET2 ILI9225_VERTICAL_WINDOW_ADDR1 + +#define TFT_RAM_ADDR1 ILI9225_RAM_ADDR_SET1 +#define TFT_RAM_ADDR2 ILI9225_RAM_ADDR_SET2 + +#define TFT_RAMWR ILI9225_GRAM_DATA_REG + +#define TFT_MAD_BGR 0x10 +#define TFT_MAD_RGB 0x00 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif + +// Not used +#define TFT_INVOFF 0x00 +#define TFT_INVON 0x00 +#define TFT_RAMRD 0x00 +#define TFT_IDXRD 0x00 + +/* ILI9225 Registers */ +#define ILI9225_DRIVER_OUTPUT_CTRL 0x01 // Driver Output Control +#define ILI9225_LCD_AC_DRIVING_CTRL 0x02 // LCD AC Driving Control +#define ILI9225_ENTRY_MODE 0x03 // Entry Mode +#define ILI9225_DISP_CTRL1 0x07 // Display Control 1 +#define ILI9225_BLANK_PERIOD_CTRL1 0x08 // Blank Period Control +#define ILI9225_FRAME_CYCLE_CTRL 0x0B // Frame Cycle Control +#define ILI9225_INTERFACE_CTRL 0x0C // Interface Control +#define ILI9225_OSC_CTRL 0x0F // Osc Control +#define ILI9225_POWER_CTRL1 0x10 // Power Control 1 +#define ILI9225_POWER_CTRL2 0x11 // Power Control 2 +#define ILI9225_POWER_CTRL3 0x12 // Power Control 3 +#define ILI9225_POWER_CTRL4 0x13 // Power Control 4 +#define ILI9225_POWER_CTRL5 0x14 // Power Control 5 +#define ILI9225_VCI_RECYCLING 0x15 // VCI Recycling +#define ILI9225_RAM_ADDR_SET1 0x20 // Horizontal GRAM Address Set +#define ILI9225_RAM_ADDR_SET2 0x21 // Vertical GRAM Address Set +#define ILI9225_GRAM_DATA_REG 0x22 // GRAM Data Register +#define ILI9225_GATE_SCAN_CTRL 0x30 // Gate Scan Control Register +#define ILI9225_VERTICAL_SCROLL_CTRL1 0x31 // Vertical Scroll Control 1 Register +#define ILI9225_VERTICAL_SCROLL_CTRL2 0x32 // Vertical Scroll Control 2 Register +#define ILI9225_VERTICAL_SCROLL_CTRL3 0x33 // Vertical Scroll Control 3 Register +#define ILI9225_PARTIAL_DRIVING_POS1 0x34 // Partial Driving Position 1 Register +#define ILI9225_PARTIAL_DRIVING_POS2 0x35 // Partial Driving Position 2 Register +#define ILI9225_HORIZONTAL_WINDOW_ADDR1 0x36 // Horizontal Address Start Position +#define ILI9225_HORIZONTAL_WINDOW_ADDR2 0x37 // Horizontal Address End Position +#define ILI9225_VERTICAL_WINDOW_ADDR1 0x38 // Vertical Address Start Position +#define ILI9225_VERTICAL_WINDOW_ADDR2 0x39 // Vertical Address End Position +#define ILI9225_GAMMA_CTRL1 0x50 // Gamma Control 1 +#define ILI9225_GAMMA_CTRL2 0x51 // Gamma Control 2 +#define ILI9225_GAMMA_CTRL3 0x52 // Gamma Control 3 +#define ILI9225_GAMMA_CTRL4 0x53 // Gamma Control 4 +#define ILI9225_GAMMA_CTRL5 0x54 // Gamma Control 5 +#define ILI9225_GAMMA_CTRL6 0x55 // Gamma Control 6 +#define ILI9225_GAMMA_CTRL7 0x56 // Gamma Control 7 +#define ILI9225_GAMMA_CTRL8 0x57 // Gamma Control 8 +#define ILI9225_GAMMA_CTRL9 0x58 // Gamma Control 9 +#define ILI9225_GAMMA_CTRL10 0x59 // Gamma Control 10 + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x00 // Not used unless commandlist invoked + diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Init.h new file mode 100644 index 0000000..741be43 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Init.h @@ -0,0 +1,105 @@ +// This is the command sequence that initialises the ILI9225 driver + +{ + writecommand(ILI9225_POWER_CTRL1); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_POWER_CTRL2); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_POWER_CTRL3); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_POWER_CTRL4); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_POWER_CTRL5); + writedata(0x00);writedata(0x00); + + delay(40); + + writecommand(ILI9225_POWER_CTRL2); + writedata(0x00);writedata(0x18); + writecommand(ILI9225_POWER_CTRL3); + writedata(0x61);writedata(0x21); + writecommand(ILI9225_POWER_CTRL4); + writedata(0x00);writedata(0x6F); + writecommand(ILI9225_POWER_CTRL5); + writedata(0x49);writedata(0x5F); + writecommand(ILI9225_POWER_CTRL1); + writedata(0x08);writedata(0x00); + + delay(10); + + writecommand(ILI9225_POWER_CTRL2); + writedata(0x10);writedata(0x3B); + + delay(50); + + writecommand(ILI9225_LCD_AC_DRIVING_CTRL); + writedata(0x01);writedata(0x00); + writecommand(ILI9225_DISP_CTRL1); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_BLANK_PERIOD_CTRL1); + writedata(0x08);writedata(0x08); + writecommand(ILI9225_FRAME_CYCLE_CTRL); + writedata(0x11);writedata(0x00); + writecommand(ILI9225_INTERFACE_CTRL); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_OSC_CTRL); + writedata(0x0D);writedata(0x01); + writecommand(ILI9225_VCI_RECYCLING); + writedata(0x00);writedata(0x20); + writecommand(ILI9225_RAM_ADDR_SET1); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_RAM_ADDR_SET2); + writedata(0x00);writedata(0x00); + + writecommand(ILI9225_GATE_SCAN_CTRL); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_VERTICAL_SCROLL_CTRL1); + writedata(0x00);writedata(0xDB); + writecommand(ILI9225_VERTICAL_SCROLL_CTRL2); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_VERTICAL_SCROLL_CTRL3); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_PARTIAL_DRIVING_POS1); + writedata(0x00);writedata(0xDB); + writecommand(ILI9225_PARTIAL_DRIVING_POS2); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_HORIZONTAL_WINDOW_ADDR1); + writedata(0x00);writedata(0xAF); + writecommand(ILI9225_HORIZONTAL_WINDOW_ADDR2); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_VERTICAL_WINDOW_ADDR1); + writedata(0x00);writedata(0xDB); + writecommand(ILI9225_VERTICAL_WINDOW_ADDR2); + writedata(0x00);writedata(0x00); + + /* Set GAMMA curve */ + writecommand(ILI9225_GAMMA_CTRL1); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_GAMMA_CTRL2); + writedata(0x08);writedata(0x08); + writecommand(ILI9225_GAMMA_CTRL3); + writedata(0x08);writedata(0x0A); + writecommand(ILI9225_GAMMA_CTRL4); + writedata(0x00);writedata(0x0A); + writecommand(ILI9225_GAMMA_CTRL5); + writedata(0x0A);writedata(0x08); + writecommand(ILI9225_GAMMA_CTRL6); + writedata(0x08);writedata(0x08); + writecommand(ILI9225_GAMMA_CTRL7); + writedata(0x00);writedata(0x00); + writecommand(ILI9225_GAMMA_CTRL8); + writedata(0x0A);writedata(0x00); + writecommand(ILI9225_GAMMA_CTRL9); + writedata(0x07);writedata(0x10); + writecommand(ILI9225_GAMMA_CTRL10); + writedata(0x07);writedata(0x10); + + writecommand(ILI9225_DISP_CTRL1); + writedata(0x00);writedata(0x12); + + delay(50); + + writecommand(ILI9225_DISP_CTRL1); + writedata(0x10);writedata(0x17); + +} \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Rotation.h new file mode 100644 index 0000000..d7cef9a --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9225_Rotation.h @@ -0,0 +1,39 @@ + +// This is the command sequence that rotates the ILI9225 driver coordinate frame + + rotation = m % 4; // Limit the range of values to 0-3 + + switch (rotation) { + case 0: + writecommand(ILI9225_DRIVER_OUTPUT_CTRL); + writedata(0x01);writedata(0x1C); + writecommand(ILI9225_ENTRY_MODE); + writedata(TFT_MAD_COLOR_ORDER);writedata(0x30); + _width = _init_width; + _height = _init_height; + break; + case 1: + writecommand(ILI9225_DRIVER_OUTPUT_CTRL); + writedata(0x00);writedata(0x1C); + writecommand(ILI9225_ENTRY_MODE); + writedata(TFT_MAD_COLOR_ORDER);writedata(0x38); + _width = _init_height; + _height = _init_width; + break; + case 2: + writecommand(ILI9225_DRIVER_OUTPUT_CTRL); + writedata(0x02);writedata(0x1C); + writecommand(ILI9225_ENTRY_MODE); + writedata(TFT_MAD_COLOR_ORDER);writedata(0x30); + _width = _init_width; + _height = _init_height; + break; + case 3: + writecommand(ILI9225_DRIVER_OUTPUT_CTRL); + writedata(0x03);writedata(0x1C); + writecommand(ILI9225_ENTRY_MODE); + writedata(TFT_MAD_COLOR_ORDER);writedata(0x38); + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h new file mode 100644 index 0000000..94ce1ef --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Defines.h @@ -0,0 +1,143 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults + +#if defined (ILI9341_DRIVER) || defined (ILI9341_2_DRIVER) + #define TFT_WIDTH 240 + #define TFT_HEIGHT 320 +#elif defined (ILI9342_DRIVER) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 +#endif + +// Color definitions for backwards compatibility with old sketches +// use colour definitions like TFT_BLACK to make sketches more portable +#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ +#define ILI9341_NAVY 0x000F /* 0, 0, 128 */ +#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ +#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ +#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ILI9341_BLUE 0x001F /* 0, 0, 255 */ +#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ +#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ +#define ILI9341_RED 0xF800 /* 255, 0, 0 */ +#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ +#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ILI9341_PINK 0xF81F + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif + +// All ILI9341 specific commands some are used by init() +#define ILI9341_NOP 0x00 +#define ILI9341_SWRESET 0x01 +#define ILI9341_RDDID 0x04 +#define ILI9341_RDDST 0x09 + +#define ILI9341_SLPIN 0x10 +#define ILI9341_SLPOUT 0x11 +#define ILI9341_PTLON 0x12 +#define ILI9341_NORON 0x13 + +#define ILI9341_RDMODE 0x0A +#define ILI9341_RDMADCTL 0x0B +#define ILI9341_RDPIXFMT 0x0C +#define ILI9341_RDIMGFMT 0x0A +#define ILI9341_RDSELFDIAG 0x0F + +#define ILI9341_INVOFF 0x20 +#define ILI9341_INVON 0x21 +#define ILI9341_GAMMASET 0x26 +#define ILI9341_DISPOFF 0x28 +#define ILI9341_DISPON 0x29 + +#define ILI9341_CASET 0x2A +#define ILI9341_PASET 0x2B +#define ILI9341_RAMWR 0x2C +#define ILI9341_RAMRD 0x2E + +#define ILI9341_PTLAR 0x30 +#define ILI9341_VSCRDEF 0x33 +#define ILI9341_MADCTL 0x36 +#define ILI9341_VSCRSADD 0x37 +#define ILI9341_PIXFMT 0x3A + +#define ILI9341_WRDISBV 0x51 +#define ILI9341_RDDISBV 0x52 +#define ILI9341_WRCTRLD 0x53 + +#define ILI9341_FRMCTR1 0xB1 +#define ILI9341_FRMCTR2 0xB2 +#define ILI9341_FRMCTR3 0xB3 +#define ILI9341_INVCTR 0xB4 +#define ILI9341_DFUNCTR 0xB6 + +#define ILI9341_PWCTR1 0xC0 +#define ILI9341_PWCTR2 0xC1 +#define ILI9341_PWCTR3 0xC2 +#define ILI9341_PWCTR4 0xC3 +#define ILI9341_PWCTR5 0xC4 +#define ILI9341_VMCTR1 0xC5 +#define ILI9341_VMCTR2 0xC7 + +#define ILI9341_RDID4 0xD3 +#define ILI9341_RDINDEX 0xD9 +#define ILI9341_RDID1 0xDA +#define ILI9341_RDID2 0xDB +#define ILI9341_RDID3 0xDC +#define ILI9341_RDIDX 0xDD // TBC + +#define ILI9341_GMCTRP1 0xE0 +#define ILI9341_GMCTRN1 0xE1 + +#define ILI9341_MADCTL_MY 0x80 +#define ILI9341_MADCTL_MX 0x40 +#define ILI9341_MADCTL_MV 0x20 +#define ILI9341_MADCTL_ML 0x10 +#define ILI9341_MADCTL_RGB 0x00 +#define ILI9341_MADCTL_BGR 0x08 +#define ILI9341_MADCTL_MH 0x04 diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Init.h new file mode 100644 index 0000000..05a5dda --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Init.h @@ -0,0 +1,248 @@ + +// This is the command sequence that initialises the ILI9341 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + +#if defined (ILI9341_DRIVER) || defined (ILI9342_DRIVER) +{ + writecommand(0xEF); + writedata(0x03); + writedata(0x80); + writedata(0x02); + + writecommand(0xCF); + writedata(0x00); + writedata(0XC1); + writedata(0X30); + + writecommand(0xED); + writedata(0x64); + writedata(0x03); + writedata(0X12); + writedata(0X81); + + writecommand(0xE8); + writedata(0x85); + writedata(0x00); + writedata(0x78); + + writecommand(0xCB); + writedata(0x39); + writedata(0x2C); + writedata(0x00); + writedata(0x34); + writedata(0x02); + + writecommand(0xF7); + writedata(0x20); + + writecommand(0xEA); + writedata(0x00); + writedata(0x00); + + writecommand(ILI9341_PWCTR1); //Power control + writedata(0x23); //VRH[5:0] + + writecommand(ILI9341_PWCTR2); //Power control + writedata(0x10); //SAP[2:0];BT[3:0] + + writecommand(ILI9341_VMCTR1); //VCM control + writedata(0x3e); + writedata(0x28); + + writecommand(ILI9341_VMCTR2); //VCM control2 + writedata(0x86); //-- + + writecommand(ILI9341_MADCTL); // Memory Access Control +#ifdef M5STACK + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode) +#else + writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode) +#endif + + writecommand(ILI9341_PIXFMT); + writedata(0x55); + + writecommand(ILI9341_FRMCTR1); + writedata(0x00); + writedata(0x13); // 0x18 79Hz, 0x1B default 70Hz, 0x13 100Hz + + writecommand(ILI9341_DFUNCTR); // Display Function Control + writedata(0x08); + writedata(0x82); + writedata(0x27); + + writecommand(0xF2); // 3Gamma Function Disable + writedata(0x00); + + writecommand(ILI9341_GAMMASET); //Gamma curve selected + writedata(0x01); + + writecommand(ILI9341_GMCTRP1); //Set Gamma + writedata(0x0F); + writedata(0x31); + writedata(0x2B); + writedata(0x0C); + writedata(0x0E); + writedata(0x08); + writedata(0x4E); + writedata(0xF1); + writedata(0x37); + writedata(0x07); + writedata(0x10); + writedata(0x03); + writedata(0x0E); + writedata(0x09); + writedata(0x00); + + writecommand(ILI9341_GMCTRN1); //Set Gamma + writedata(0x00); + writedata(0x0E); + writedata(0x14); + writedata(0x03); + writedata(0x11); + writedata(0x07); + writedata(0x31); + writedata(0xC1); + writedata(0x48); + writedata(0x08); + writedata(0x0F); + writedata(0x0C); + writedata(0x31); + writedata(0x36); + writedata(0x0F); + + writecommand(ILI9341_SLPOUT); //Exit Sleep + + end_tft_write(); + delay(120); + begin_tft_write(); + + writecommand(ILI9341_DISPON); //Display on + +} + +#elif defined (ILI9341_2_DRIVER) // Alternative init sequence, see https://github.com/Bodmer/TFT_eSPI/issues/1172 + +{ +writecommand(0xCF); +writedata(0x00); +writedata(0XC1); +writedata(0X30); + +writecommand(0xED); +writedata(0x64); +writedata(0x03); +writedata(0X12); +writedata(0X81); + +writecommand(0xE8); +writedata(0x85); +writedata(0x00); +writedata(0x78); + +writecommand(0xCB); +writedata(0x39); +writedata(0x2C); +writedata(0x00); +writedata(0x34); +writedata(0x02); + +writecommand(0xF7); +writedata(0x20); + +writecommand(0xEA); +writedata(0x00); +writedata(0x00); + +writecommand(ILI9341_PWCTR1); //Power control +writedata(0x10); //VRH[5:0] + +writecommand(ILI9341_PWCTR2); //Power control +writedata(0x00); //SAP[2:0];BT[3:0] + +writecommand(ILI9341_VMCTR1); //VCM control +writedata(0x30); +writedata(0x30); + +writecommand(ILI9341_VMCTR2); //VCM control2 +writedata(0xB7); //-- + +writecommand(ILI9341_PIXFMT); +writedata(0x55); + +writecommand(0x36); // Memory Access Control +writedata(0x08); // Rotation 0 (portrait mode) + +writecommand(ILI9341_FRMCTR1); +writedata(0x00); +writedata(0x1A); + +writecommand(ILI9341_DFUNCTR); // Display Function Control +writedata(0x08); +writedata(0x82); +writedata(0x27); + +writecommand(0xF2); // 3Gamma Function Disable +writedata(0x00); + +writecommand(0x26); //Gamma curve selected +writedata(0x01); + +writecommand(0xE0); //Set Gamma +writedata(0x0F); +writedata(0x2A); +writedata(0x28); +writedata(0x08); +writedata(0x0E); +writedata(0x08); +writedata(0x54); +writedata(0xA9); +writedata(0x43); +writedata(0x0A); +writedata(0x0F); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0x00); + +writecommand(0XE1); //Set Gamma +writedata(0x00); +writedata(0x15); +writedata(0x17); +writedata(0x07); +writedata(0x11); +writedata(0x06); +writedata(0x2B); +writedata(0x56); +writedata(0x3C); +writedata(0x05); +writedata(0x10); +writedata(0x0F); +writedata(0x3F); +writedata(0x3F); +writedata(0x0F); + +writecommand(0x2B); +writedata(0x00); +writedata(0x00); +writedata(0x01); +writedata(0x3f); + +writecommand(0x2A); +writedata(0x00); +writedata(0x00); +writedata(0x00); +writedata(0xef); + +writecommand(ILI9341_SLPOUT); //Exit Sleep + +end_tft_write(); +delay(120); +begin_tft_write(); + +writecommand(ILI9341_DISPON); //Display on +} +#endif \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Rotation.h new file mode 100644 index 0000000..f31b9df --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9341_Rotation.h @@ -0,0 +1,82 @@ + +// This is the command sequence that rotates the ILI9341 driver coordinate frame + + rotation = m % 8; // Limit the range of values to 0-7 + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: +#ifdef M5STACK + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_width; + _height = _init_height; + break; + case 1: +#ifdef M5STACK + writedata(TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_height; + _height = _init_width; + break; + case 2: +#ifdef M5STACK + writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_width; + _height = _init_height; + break; + case 3: +#ifdef M5STACK + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_height; + _height = _init_width; + break; + // These next rotations are for bottom up BMP drawing + case 4: +#ifdef M5STACK + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_width; + _height = _init_height; + break; + case 5: +#ifdef M5STACK + writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_height; + _height = _init_width; + break; + case 6: +#ifdef M5STACK + writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_COLOR_ORDER); +#endif + _width = _init_width; + _height = _init_height; + break; + case 7: +#ifdef M5STACK + writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); +#else + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); +#endif + _width = _init_height; + _height = _init_width; + break; + + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Defines.h new file mode 100644 index 0000000..bd5fb88 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Defines.h @@ -0,0 +1,42 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Init.h new file mode 100644 index 0000000..a5f19b8 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Init.h @@ -0,0 +1,736 @@ + +// This is the command sequence that initialises the ILI9481 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + +#define ILI9481_INIT_1 // Original default +//#define ILI9481_INIT_2 // CPT29 +//#define ILI9481_INIT_3 // PVI35 +//#define ILI9481_INIT_4 // AUO317 +//#define ILI9481_INIT_5 // CMO35 ***** +//#define ILI9481_INIT_6 // RGB +//#define ILI9481_INIT_7 // From #1774 +//#define ILI9481_INIT_8 // From #1774 + +///////////////////////////////////////////////////////////////////////////////////////// +#ifdef ILI9481_INIT_1 +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x42); + writedata(0x18); + + writecommand(0xD1); + writedata(0x00); + writedata(0x07); + writedata(0x10); + + writecommand(0xD2); + writedata(0x01); + writedata(0x02); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x32); + writedata(0x36); + writedata(0x45); + writedata(0x06); + writedata(0x16); + writedata(0x37); + writedata(0x75); + writedata(0x77); + writedata(0x54); + writedata(0x0C); + writedata(0x00); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// +#elif defined (ILI9481_INIT_2) +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x41); + writedata(0x1D); + + writecommand(0xD1); + writedata(0x00); + writedata(0x2B); + writedata(0x1F); + + writecommand(0xD2); + writedata(0x01); + writedata(0x11); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x14); + writedata(0x33); + writedata(0x10); + writedata(0x00); + writedata(0x16); + writedata(0x44); + writedata(0x36); + writedata(0x77); + writedata(0x00); + writedata(0x0F); + writedata(0x00); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xE4); + writedata(0xA0); + + writecommand(0xF0); + writedata(0x01); + + writecommand(0xF3); + writedata(0x02); + writedata(0x1A); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// +#elif defined (ILI9481_INIT_3) +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x41); + writedata(0x1D); + + writecommand(0xD1); + writedata(0x00); + writedata(0x2B); + writedata(0x1F); + + writecommand(0xD2); + writedata(0x01); + writedata(0x11); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x14); + writedata(0x33); + writedata(0x10); + writedata(0x00); + writedata(0x16); + writedata(0x44); + writedata(0x36); + writedata(0x77); + writedata(0x00); + writedata(0x0F); + writedata(0x00); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xE4); + writedata(0xA0); + + writecommand(0xF0); + writedata(0x01); + + writecommand(0xF3); + writedata(0x40); + writedata(0x0A); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// +#elif defined (ILI9481_INIT_4) +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x40); + writedata(0x1D); + + writecommand(0xD1); + writedata(0x00); + writedata(0x18); + writedata(0x13); + + writecommand(0xD2); + writedata(0x01); + writedata(0x11); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x44); + writedata(0x06); + writedata(0x44); + writedata(0x0A); + writedata(0x08); + writedata(0x17); + writedata(0x33); + writedata(0x77); + writedata(0x44); + writedata(0x08); + writedata(0x0C); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xE4); + writedata(0xA0); + + writecommand(0xF0); + writedata(0x01); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// +#elif defined (ILI9481_INIT_5) +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x41); + writedata(0x1D); + + writecommand(0xD1); + writedata(0x00); + writedata(0x1C); + writedata(0x1F); + + writecommand(0xD2); + writedata(0x01); + writedata(0x11); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC6); + writedata(0x83); + + writecommand(0xC8); + writedata(0x00); + writedata(0x26); + writedata(0x21); + writedata(0x00); + writedata(0x00); + writedata(0x1F); + writedata(0x65); + writedata(0x23); + writedata(0x77); + writedata(0x00); + writedata(0x0F); + writedata(0x00); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xE4); + writedata(0xA0); + + writecommand(0xF0); + writedata(0x01); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// +#elif defined (ILI9481_INIT_6) +// Configure ILI9481 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x41); + writedata(0x1D); + + writecommand(0xD1); + writedata(0x00); + writedata(0x2B); + writedata(0x1F); + + writecommand(0xD2); + writedata(0x01); + writedata(0x11); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + writedata(0x00); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC6); + writedata(0x80); + + writecommand(0xC8); + writedata(0x00); + writedata(0x14); + writedata(0x33); + writedata(0x10); + writedata(0x00); + writedata(0x16); + writedata(0x44); + writedata(0x36); + writedata(0x77); + writedata(0x00); + writedata(0x0F); + writedata(0x00); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xE4); + writedata(0xA0); + + writecommand(0xF0); + writedata(0x08); + + writecommand(0xF3); + writedata(0x40); + writedata(0x0A); + + writecommand(0xF6); + writedata(0x84); + + writecommand(0xF7); + writedata(0x80); + + writecommand(0xB3); + writedata(0x00); + writedata(0x01); + writedata(0x06); + writedata(0x30); + + writecommand(0xB4); + writedata(0x00); + + writecommand(0x0C); + writedata(0x00); + writedata(0x55); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of ILI9481 display configuration +///////////////////////////////////////////////////////////////////////////////////////// + + +// From #1774 +#elif defined (ILI9481_INIT_7) + ///ili9481+cmi3.5ips //效果不好 + //************* Start Initial Sequence **********// + writecommand(0x11); + delay(20); + writecommand(0xD0); + writedata(0x07); + writedata(0x42); + writedata(0x1B); + + writecommand(0xD1); + writedata(0x00); + writedata(0x14); + writedata(0x1B); + + writecommand(0xD2); + writedata(0x01); + writedata(0x12); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x01); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x46); + writedata(0x44); + writedata(0x50); + writedata(0x04); + writedata(0x16); + writedata(0x33); + writedata(0x13); + writedata(0x77); + writedata(0x05); + writedata(0x0F); + writedata(0x00); + + writecommand(0x36); + writedata(0x0A); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(0x22); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(0x2B); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xE0); + delay(120); + writecommand(0x29); + +#elif defined (ILI9481_INIT_8) + + //3.5IPS ILI9481+CMI + writecommand(0x01); //Soft_rese + delay(220); + + writecommand(0x11); + delay(280); + + writecommand(0xd0); //Power_Setting + writedata(0x07);//07 VC[2:0] Sets the ratio factor of Vci to generate the reference voltages Vci1 + writedata(0x44);//41 BT[2:0] Sets the Step up factor and output voltage level from the reference voltages Vci1 + writedata(0x1E);//1f 17 1C VRH[3:0]: Sets the factor to generate VREG1OUT from VCILVL + delay(220); + + writecommand(0xd1); //VCOM Control + writedata(0x00);//00 + writedata(0x0C);//1A VCM [6:0] is used to set factor to generate VCOMH voltage from the reference voltage VREG1OUT 15 09 + writedata(0x1A);//1F VDV[4:0] is used to set the VCOM alternating amplitude in the range of VREG1OUT x 0.70 to VREG1OUT 1F 18 + + writecommand(0xC5); //Frame Rate + writedata(0x03); // 03 02 + + writecommand(0xd2); //Power_Setting for Normal Mode + writedata(0x01); //01 + writedata(0x11); //11 + + writecommand(0xE4); //? + writedata(0xa0); + writecommand(0xf3); + writedata(0x00); + writedata(0x2a); + + //1 OK + writecommand(0xc8); + writedata(0x00); + writedata(0x26); + writedata(0x21); + writedata(0x00); + writedata(0x00); + writedata(0x1f); + writedata(0x65); + writedata(0x23); + writedata(0x77); + writedata(0x00); + writedata(0x0f); + writedata(0x00); + //GAMMA SETTING + + writecommand(0xC0); //Panel Driving Setting + writedata(0x00); //1//00 REV SM GS + writedata(0x3B); //2//NL[5:0]: Sets the number of lines to drive the LCD at an interval of 8 lines. + writedata(0x00); //3//SCN[6:0] + writedata(0x02); //4//PTV: Sets the Vcom output in non-display area drive period + writedata(0x11); //5//NDL: Sets the source output level in non-display area. PTG: Sets the scan mode in non-display area. + + writecommand(0xc6); //Interface Control + writedata(0x83); + //GAMMA SETTING + + writecommand(0xf0); //? + writedata(0x01); + + writecommand(0xE4);//? + writedata(0xa0); + + //////倒装设置 NG + writecommand(0x36); + writedata(0x0A); // 8C:出来两行 CA:出来一个点 + + writecommand(0x3a); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) + writecommand(TFT_INVON); + #endif + + writecommand(0xb4);//Display Mode and Frame Memory Write Mode Setting + writedata(0x02); + writedata(0x00); //? + writedata(0x00); + writedata(0x01); + + delay(280); + + writecommand(0x2a); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); //3F + + writecommand(0x2b); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDf); //DF + + //writecommand(0x21); + writecommand(0x29); + writecommand(0x2c); + +#endif \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Rotation.h new file mode 100644 index 0000000..e80d08e --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9481_Rotation.h @@ -0,0 +1,27 @@ + // This is the command sequence that rotates the ILI9481 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR | TFT_MAD_SS); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MV | TFT_MAD_BGR); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_BGR | TFT_MAD_GS); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MV | TFT_MAD_BGR | TFT_MAD_SS | TFT_MAD_GS); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + } + \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Defines.h new file mode 100644 index 0000000..fcec0b8 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Defines.h @@ -0,0 +1,64 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + +// For Raspberry Pi ILI9486 only with a modified board to add a write strobe: +#if defined (TFT_WR) && defined (RPI_ILI9486_DRIVER) + #define RPI_WRITE_STROBE +#endif + +// Color definitions for backwards compatibility with old sketches +// use colour definitions like TFT_BLACK to make sketches more portable +#define ILI9486_BLACK 0x0000 /* 0, 0, 0 */ +#define ILI9486_NAVY 0x000F /* 0, 0, 128 */ +#define ILI9486_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ILI9486_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ILI9486_MAROON 0x7800 /* 128, 0, 0 */ +#define ILI9486_PURPLE 0x780F /* 128, 0, 128 */ +#define ILI9486_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ILI9486_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ILI9486_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ILI9486_BLUE 0x001F /* 0, 0, 255 */ +#define ILI9486_GREEN 0x07E0 /* 0, 255, 0 */ +#define ILI9486_CYAN 0x07FF /* 0, 255, 255 */ +#define ILI9486_RED 0xF800 /* 255, 0, 0 */ +#define ILI9486_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ILI9486_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ILI9486_WHITE 0xFFFF /* 255, 255, 255 */ +#define ILI9486_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ILI9486_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ILI9486_PINK 0xF81F + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 +#define TFT_MAD_RGB 0x00 diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Init.h new file mode 100644 index 0000000..db0f7aa --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Init.h @@ -0,0 +1,84 @@ + +// This is the command sequence that initialises the ILI9486 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + +{ +// From https://github.com/notro/fbtft/blob/master/fb_ili9486.c + + writecommand(0x01); // SW reset + delay(120); + + writecommand(0x11); // Sleep out, also SW reset + delay(120); + + writecommand(0x3A); + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour interface + #else + writedata(0x66); // 18-bit colour interface + #endif + + writecommand(0xC0); // 1100.0000 Power Control 1 + writedata(0x0E); // 0001.0111 ... VRH1 + writedata(0x0E); // 0001.0101 ... VRH2 + writecommand(0xC1); // 1100.0001 Power Control 2 + writedata(0x41); // 0100.0001 . SAP BT + writedata(0x00); // 0000.0000 ..... VC + writecommand(0xC2); // 1100.0010 Power Control 3 + writedata(0x55); // nb. was 0x44 0101.0101 . DCA1 . DCA0 + + writecommand(0xC5); + writedata(0x00); + writedata(0x00); + writedata(0x00); + writedata(0x00); + + writecommand(0xE0); + writedata(0x0F); + writedata(0x1F); + writedata(0x1C); + writedata(0x0C); + writedata(0x0F); + writedata(0x08); + writedata(0x48); + writedata(0x98); + writedata(0x37); + writedata(0x0A); + writedata(0x13); + writedata(0x04); + writedata(0x11); + writedata(0x0D); + writedata(0x00); + + writecommand(0xE1); + writedata(0x0F); + writedata(0x32); + writedata(0x2E); + writedata(0x0B); + writedata(0x0D); + writedata(0x05); + writedata(0x47); + writedata(0x75); + writedata(0x37); + writedata(0x06); + writedata(0x10); + writedata(0x03); + writedata(0x24); + writedata(0x20); + writedata(0x00); + + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writecommand(TFT_INVOFF); + #else + writecommand(TFT_INVON); + #endif + + writecommand(0x36); + writedata(0x48); + + writecommand(0x29); // display on + delay(150); +} diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Rotation.h new file mode 100644 index 0000000..495d675 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9486_Rotation.h @@ -0,0 +1,47 @@ + // This is the command sequence that rotates the ILI9486 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 8; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR | TFT_MAD_MX); + _width = _init_width; + _height = _init_height; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_BGR | TFT_MAD_MV); + _width = _init_height; + _height = _init_width; + break; + case 2: // Inverter portrait + writedata( TFT_MAD_BGR | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + case 4: // Portrait + writedata(TFT_MAD_BGR | TFT_MAD_MX | TFT_MAD_MY); + _width = _init_width; + _height = _init_height; + break; + case 5: // Landscape (Portrait + 90) + writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MX); + _width = _init_height; + _height = _init_width; + break; + case 6: // Inverter portrait + writedata( TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + break; + case 7: // Inverted landscape + writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MY); + _width = _init_height; + _height = _init_width; + break; + } + diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Defines.h new file mode 100644 index 0000000..bd5fb88 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Defines.h @@ -0,0 +1,42 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Init.h new file mode 100644 index 0000000..c1b20b6 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Init.h @@ -0,0 +1,99 @@ + +// This is the command sequence that initialises the ILI9488 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure ILI9488 display + + writecommand(0xE0); // Positive Gamma Control + writedata(0x00); + writedata(0x03); + writedata(0x09); + writedata(0x08); + writedata(0x16); + writedata(0x0A); + writedata(0x3F); + writedata(0x78); + writedata(0x4C); + writedata(0x09); + writedata(0x0A); + writedata(0x08); + writedata(0x16); + writedata(0x1A); + writedata(0x0F); + + writecommand(0XE1); // Negative Gamma Control + writedata(0x00); + writedata(0x16); + writedata(0x19); + writedata(0x03); + writedata(0x0F); + writedata(0x05); + writedata(0x32); + writedata(0x45); + writedata(0x46); + writedata(0x04); + writedata(0x0E); + writedata(0x0D); + writedata(0x35); + writedata(0x37); + writedata(0x0F); + + writecommand(0XC0); // Power Control 1 + writedata(0x17); + writedata(0x15); + + writecommand(0xC1); // Power Control 2 + writedata(0x41); + + writecommand(0xC5); // VCOM Control + writedata(0x00); + writedata(0x12); + writedata(0x80); + + writecommand(TFT_MADCTL); // Memory Access Control + writedata(0x48); // MX, BGR + + writecommand(0x3A); // Pixel Interface Format +#if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) + writedata(0x55); // 16-bit colour for parallel +#else + writedata(0x66); // 18-bit colour for SPI +#endif + + writecommand(0xB0); // Interface Mode Control + writedata(0x00); + + writecommand(0xB1); // Frame Rate Control + writedata(0xA0); + + writecommand(0xB4); // Display Inversion Control + writedata(0x02); + + writecommand(0xB6); // Display Function Control + writedata(0x02); + writedata(0x02); + writedata(0x3B); + + writecommand(0xB7); // Entry Mode Set + writedata(0xC6); + + writecommand(0xF7); // Adjust Control 3 + writedata(0xA9); + writedata(0x51); + writedata(0x2C); + writedata(0x82); + + writecommand(TFT_SLPOUT); //Exit Sleep +delay(120); + + writecommand(TFT_DISPON); //Display on +delay(25); + +// End of ILI9488 display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Rotation.h new file mode 100644 index 0000000..6ab17bd --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ILI9488_Rotation.h @@ -0,0 +1,27 @@ + // This is the command sequence that rotates the ILI9488 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_MX | TFT_MAD_BGR); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MV | TFT_MAD_BGR); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_MY | TFT_MAD_BGR); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + } + \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/R61581_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/R61581_Defines.h new file mode 100644 index 0000000..bd5fb88 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/R61581_Defines.h @@ -0,0 +1,42 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/R61581_Init.h b/libraries/TFT_eSPI/TFT_Drivers/R61581_Init.h new file mode 100644 index 0000000..1e9adee --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/R61581_Init.h @@ -0,0 +1,80 @@ + +// This is the command sequence that initialises the R61581 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure R61581 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xB0); + writedata(0x00); + + writecommand(0xD0); + writedata(0x07); + writedata(0x42); + writedata(0x18); + + writecommand(0xD1); + writedata(0x00); + writedata(0x07); + writedata(0x10); + + writecommand(0xD2); + writedata(0x01); + writedata(0x02); + + writecommand(0xC0); + writedata(0x12); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x32); + writedata(0x36); + writedata(0x45); + writedata(0x06); + writedata(0x16); + writedata(0x37); + writedata(0x75); + writedata(0x77); + writedata(0x54); + writedata(0x0C); + writedata(0x00); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + writedata(0x55); + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of R61581 display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/R61581_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/R61581_Rotation.h new file mode 100644 index 0000000..4d7dc61 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/R61581_Rotation.h @@ -0,0 +1,27 @@ + // This is the command sequence that rotates the R61581 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR | TFT_MAD_MX); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MV | TFT_MAD_BGR); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_BGR | TFT_MAD_GS); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MV | TFT_MAD_BGR | TFT_MAD_MX | TFT_MAD_GS); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + } + \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68120_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Defines.h new file mode 100644 index 0000000..50ed5a4 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Defines.h @@ -0,0 +1,52 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +// RM68120_DRIVER + +#define TFT_WIDTH 480 +#define TFT_HEIGHT 800 + +//Set driver type common to all TBD initialisation options +#ifndef RM68120_DRIVER + #define RM68120_DRIVER +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x0000 +#define TFT_SWRST 0x0100 + +#define TFT_INVOFF 0x2000 +#define TFT_INVON 0x2100 + +#define TFT_DISPOFF 0x2800 +#define TFT_DISPON 0x2900 + +#define TFT_CASET 0x2A00 +#define TFT_PASET 0x2B00 +#define TFT_RAMWR 0x2C00 + +#define TFT_RAMRD 0x2E00 +#define TFT_IDXRD 0xDD00 // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x3600 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_H_FLIP 0x02 +#define TFT_MAD_V_FLIP 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB +#endif diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68120_Init.h b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Init.h new file mode 100644 index 0000000..5b7e8f4 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Init.h @@ -0,0 +1,269 @@ +// Initialisation for RM68120 + +//ENABLE PAGE 1 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x01); + +//GAMMA SETING RED +writeRegister8(0xD400, 0x00); +writeRegister8(0xD401, 0x00); +writeRegister8(0xD402, 0x1b); +writeRegister8(0xD403, 0x44); +writeRegister8(0xD404, 0x62); +writeRegister8(0xD405, 0x00); +writeRegister8(0xD406, 0x7b); +writeRegister8(0xD407, 0xa1); +writeRegister8(0xD408, 0xc0); +writeRegister8(0xD409, 0xee); +writeRegister8(0xD40A, 0x55); +writeRegister8(0xD40B, 0x10); +writeRegister8(0xD40C, 0x2c); +writeRegister8(0xD40D, 0x43); +writeRegister8(0xD40E, 0x57); +writeRegister8(0xD40F, 0x55); +writeRegister8(0xD410, 0x68); +writeRegister8(0xD411, 0x78); +writeRegister8(0xD412, 0x87); +writeRegister8(0xD413, 0x94); +writeRegister8(0xD414, 0x55); +writeRegister8(0xD415, 0xa0); +writeRegister8(0xD416, 0xac); +writeRegister8(0xD417, 0xb6); +writeRegister8(0xD418, 0xc1); +writeRegister8(0xD419, 0x55); +writeRegister8(0xD41A, 0xcb); +writeRegister8(0xD41B, 0xcd); +writeRegister8(0xD41C, 0xd6); +writeRegister8(0xD41D, 0xdf); +writeRegister8(0xD41E, 0x95); +writeRegister8(0xD41F, 0xe8); +writeRegister8(0xD420, 0xf1); +writeRegister8(0xD421, 0xfa); +writeRegister8(0xD422, 0x02); +writeRegister8(0xD423, 0xaa); +writeRegister8(0xD424, 0x0b); +writeRegister8(0xD425, 0x13); +writeRegister8(0xD426, 0x1d); +writeRegister8(0xD427, 0x26); +writeRegister8(0xD428, 0xaa); +writeRegister8(0xD429, 0x30); +writeRegister8(0xD42A, 0x3c); +writeRegister8(0xD42B, 0x4A); +writeRegister8(0xD42C, 0x63); +writeRegister8(0xD42D, 0xea); +writeRegister8(0xD42E, 0x79); +writeRegister8(0xD42F, 0xa6); +writeRegister8(0xD430, 0xd0); +writeRegister8(0xD431, 0x20); +writeRegister8(0xD432, 0x0f); +writeRegister8(0xD433, 0x8e); +writeRegister8(0xD434, 0xff); + +//GAMMA SETING GREEN +writeRegister8(0xD500, 0x00); +writeRegister8(0xD501, 0x00); +writeRegister8(0xD502, 0x1b); +writeRegister8(0xD503, 0x44); +writeRegister8(0xD504, 0x62); +writeRegister8(0xD505, 0x00); +writeRegister8(0xD506, 0x7b); +writeRegister8(0xD507, 0xa1); +writeRegister8(0xD508, 0xc0); +writeRegister8(0xD509, 0xee); +writeRegister8(0xD50A, 0x55); +writeRegister8(0xD50B, 0x10); +writeRegister8(0xD50C, 0x2c); +writeRegister8(0xD50D, 0x43); +writeRegister8(0xD50E, 0x57); +writeRegister8(0xD50F, 0x55); +writeRegister8(0xD510, 0x68); +writeRegister8(0xD511, 0x78); +writeRegister8(0xD512, 0x87); +writeRegister8(0xD513, 0x94); +writeRegister8(0xD514, 0x55); +writeRegister8(0xD515, 0xa0); +writeRegister8(0xD516, 0xac); +writeRegister8(0xD517, 0xb6); +writeRegister8(0xD518, 0xc1); +writeRegister8(0xD519, 0x55); +writeRegister8(0xD51A, 0xcb); +writeRegister8(0xD51B, 0xcd); +writeRegister8(0xD51C, 0xd6); +writeRegister8(0xD51D, 0xdf); +writeRegister8(0xD51E, 0x95); +writeRegister8(0xD51F, 0xe8); +writeRegister8(0xD520, 0xf1); +writeRegister8(0xD521, 0xfa); +writeRegister8(0xD522, 0x02); +writeRegister8(0xD523, 0xaa); +writeRegister8(0xD524, 0x0b); +writeRegister8(0xD525, 0x13); +writeRegister8(0xD526, 0x1d); +writeRegister8(0xD527, 0x26); +writeRegister8(0xD528, 0xaa); +writeRegister8(0xD529, 0x30); +writeRegister8(0xD52A, 0x3c); +writeRegister8(0xD52B, 0x4a); +writeRegister8(0xD52C, 0x63); +writeRegister8(0xD52D, 0xea); +writeRegister8(0xD52E, 0x79); +writeRegister8(0xD52F, 0xa6); +writeRegister8(0xD530, 0xd0); +writeRegister8(0xD531, 0x20); +writeRegister8(0xD532, 0x0f); +writeRegister8(0xD533, 0x8e); +writeRegister8(0xD534, 0xff); + +//GAMMA SETING BLUE +writeRegister8(0xD600, 0x00); +writeRegister8(0xD601, 0x00); +writeRegister8(0xD602, 0x1b); +writeRegister8(0xD603, 0x44); +writeRegister8(0xD604, 0x62); +writeRegister8(0xD605, 0x00); +writeRegister8(0xD606, 0x7b); +writeRegister8(0xD607, 0xa1); +writeRegister8(0xD608, 0xc0); +writeRegister8(0xD609, 0xee); +writeRegister8(0xD60A, 0x55); +writeRegister8(0xD60B, 0x10); +writeRegister8(0xD60C, 0x2c); +writeRegister8(0xD60D, 0x43); +writeRegister8(0xD60E, 0x57); +writeRegister8(0xD60F, 0x55); +writeRegister8(0xD610, 0x68); +writeRegister8(0xD611, 0x78); +writeRegister8(0xD612, 0x87); +writeRegister8(0xD613, 0x94); +writeRegister8(0xD614, 0x55); +writeRegister8(0xD615, 0xa0); +writeRegister8(0xD616, 0xac); +writeRegister8(0xD617, 0xb6); +writeRegister8(0xD618, 0xc1); +writeRegister8(0xD619, 0x55); +writeRegister8(0xD61A, 0xcb); +writeRegister8(0xD61B, 0xcd); +writeRegister8(0xD61C, 0xd6); +writeRegister8(0xD61D, 0xdf); +writeRegister8(0xD61E, 0x95); +writeRegister8(0xD61F, 0xe8); +writeRegister8(0xD620, 0xf1); +writeRegister8(0xD621, 0xfa); +writeRegister8(0xD622, 0x02); +writeRegister8(0xD623, 0xaa); +writeRegister8(0xD624, 0x0b); +writeRegister8(0xD625, 0x13); +writeRegister8(0xD626, 0x1d); +writeRegister8(0xD627, 0x26); +writeRegister8(0xD628, 0xaa); +writeRegister8(0xD629, 0x30); +writeRegister8(0xD62A, 0x3c); +writeRegister8(0xD62B, 0x4A); +writeRegister8(0xD62C, 0x63); +writeRegister8(0xD62D, 0xea); +writeRegister8(0xD62E, 0x79); +writeRegister8(0xD62F, 0xa6); +writeRegister8(0xD630, 0xd0); +writeRegister8(0xD631, 0x20); +writeRegister8(0xD632, 0x0f); +writeRegister8(0xD633, 0x8e); +writeRegister8(0xD634, 0xff); + +//AVDD VOLTAGE SETTING +writeRegister8(0xB000, 0x05); +writeRegister8(0xB001, 0x05); +writeRegister8(0xB002, 0x05); +//AVEE VOLTAGE SETTING +writeRegister8(0xB100, 0x05); +writeRegister8(0xB101, 0x05); +writeRegister8(0xB102, 0x05); + +//AVDD Boosting +writeRegister8(0xB600, 0x34); +writeRegister8(0xB601, 0x34); +writeRegister8(0xB603, 0x34); +//AVEE Boosting +writeRegister8(0xB700, 0x24); +writeRegister8(0xB701, 0x24); +writeRegister8(0xB702, 0x24); +//VCL Boosting +writeRegister8(0xB800, 0x24); +writeRegister8(0xB801, 0x24); +writeRegister8(0xB802, 0x24); +//VGLX VOLTAGE SETTING +writeRegister8(0xBA00, 0x14); +writeRegister8(0xBA01, 0x14); +writeRegister8(0xBA02, 0x14); +//VCL Boosting +writeRegister8(0xB900, 0x24); +writeRegister8(0xB901, 0x24); +writeRegister8(0xB902, 0x24); +//Gamma Voltage +writeRegister8(0xBc00, 0x00); +writeRegister8(0xBc01, 0xa0);//vgmp=5.0 +writeRegister8(0xBc02, 0x00); +writeRegister8(0xBd00, 0x00); +writeRegister8(0xBd01, 0xa0);//vgmn=5.0 +writeRegister8(0xBd02, 0x00); +//VCOM Setting +writeRegister8(0xBe01, 0x3d);//3 + +//ENABLE PAGE 0 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x00); +//Vivid Color Function Control +writeRegister8(0xB400, 0x10); +//Z-INVERSION +writeRegister8(0xBC00, 0x05); +writeRegister8(0xBC01, 0x05); +writeRegister8(0xBC02, 0x05); +//*************** add on 20111021**********************// +writeRegister8(0xB700, 0x22);//GATE EQ CONTROL +writeRegister8(0xB701, 0x22);//GATE EQ CONTROL +writeRegister8(0xC80B, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80C, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80F, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC810, 0x2A);//DISPLAY TIMING CONTROL +//*************** add on 20111021**********************// +//PWM_ENH_OE =1 +writeRegister8(0xd000, 0x01); +//DM_SEL =1 +writeRegister8(0xb300, 0x10); +//VBPDA=07h +writeRegister8(0xBd02, 0x07); +//VBPDb=07h +writeRegister8(0xBe02, 0x07); +//VBPDc=07h +writeRegister8(0xBf02, 0x07); + +//ENABLE PAGE 2 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x02); +//SDREG0 =0 +writeRegister8(0xc301, 0xa9); +//DS=14 +writeRegister8(0xfe01, 0x94); +//OSC =60h +writeRegister8(0xf600, 0x60); +//TE ON +writeRegister8(0x3500, 0x00); +writeRegister8(0xFFFF, 0xFF); + +//SLEEP OUT +writecommand(0x1100); +delay(100); +//DISPLY ON +writecommand(0x2900); +delay(100); + +writeRegister16(0x3A00, 0x55); +writeRegister8(0x3600, TFT_MAD_COLOR_ORDER); diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h new file mode 100644 index 0000000..492493a --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h @@ -0,0 +1,29 @@ + +// This is the command sequence that rotates the RM68120 driver coordinate frame + + rotation = m % 4; // Limit the range of values to 0-3 + uint8_t reg = 0; + + switch (rotation) { + case 0: + reg = TFT_MAD_COLOR_ORDER; + _width = _init_width; + _height = _init_height; + break; + case 1: + reg = TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER; + _width = _init_height; + _height = _init_width; + break; + case 2: + reg = TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; + _width = _init_width; + _height = _init_height; + break; + case 3: + reg = TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; + _width = _init_height; + _height = _init_width; + break; + } + writeRegister16(TFT_MADCTL, reg); \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68140_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Defines.h new file mode 100644 index 0000000..bd5fb88 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Defines.h @@ -0,0 +1,42 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 320 +#define TFT_HEIGHT 480 + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 + +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68140_Init.h b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Init.h new file mode 100644 index 0000000..cc44719 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Init.h @@ -0,0 +1,77 @@ + +// This is the command sequence that initialises the RM68140 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + + +// Configure RM68140 display + + writecommand(TFT_SLPOUT); + delay(20); + + writecommand(0xD0); + writedata(0x07); + writedata(0x42); + writedata(0x18); + + writecommand(0xD1); + writedata(0x00); + writedata(0x07); + writedata(0x10); + + writecommand(0xD2); + writedata(0x01); + writedata(0x02); + + writecommand(0xC0); + writedata(0x10); + writedata(0x3B); + writedata(0x00); + writedata(0x02); + writedata(0x11); + + writecommand(0xC5); + writedata(0x03); + + writecommand(0xC8); + writedata(0x00); + writedata(0x32); + writedata(0x36); + writedata(0x45); + writedata(0x06); + writedata(0x16); + writedata(0x37); + writedata(0x75); + writedata(0x77); + writedata(0x54); + writedata(0x0C); + writedata(0x00); + + writecommand(TFT_MADCTL); + writedata(0x0A); + + writecommand(0x3A); + writedata(0x55); + + writecommand(TFT_CASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); + + writecommand(TFT_PASET); + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0xDF); + + delay(120); + writecommand(TFT_DISPON); + + delay(25); +// End of RM68140 display configuration + + + diff --git a/libraries/TFT_eSPI/TFT_Drivers/RM68140_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Rotation.h new file mode 100644 index 0000000..2f83d61 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/RM68140_Rotation.h @@ -0,0 +1,44 @@ + // This is the command sequence that rotates the RM68140 driver coordinate frame + + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait + writedata(TFT_MAD_BGR); + writecommand(0xB6); + writedata(0); + writedata(0x22); + writedata(0x3B); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 1: // Landscape (Portrait + 90) + writedata(TFT_MAD_MV | TFT_MAD_BGR); + writecommand(0xB6); + writedata(0); + writedata(0x02); + writedata(0x3B); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + case 2: // Inverter portrait + writedata(TFT_MAD_BGR); + writecommand(0xB6); + writedata(0); + writedata(0x42); + writedata(0x3B); + _width = TFT_WIDTH; + _height = TFT_HEIGHT; + break; + case 3: // Inverted landscape + writedata(TFT_MAD_MV | TFT_MAD_BGR); + writecommand(0xB6); + writedata(0); + writedata(0x62); + writedata(0x3B); + _width = TFT_HEIGHT; + _height = TFT_WIDTH; + break; + } + diff --git a/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Defines.h new file mode 100644 index 0000000..7806eb8 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Defines.h @@ -0,0 +1,58 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#define TFT_WIDTH 128 +#define TFT_HEIGHT 160 + + +// Color definitions for backwards compatibility with old sketches +// use colour definitions like TFT_BLACK to make sketches more portable +#define S6D02A1_BLACK 0x0000 /* 0, 0, 0 */ +#define S6D02A1_NAVY 0x000F /* 0, 0, 128 */ +#define S6D02A1_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define S6D02A1_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define S6D02A1_MAROON 0x7800 /* 128, 0, 0 */ +#define S6D02A1_PURPLE 0x780F /* 128, 0, 128 */ +#define S6D02A1_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define S6D02A1_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define S6D02A1_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define S6D02A1_BLUE 0x001F /* 0, 0, 255 */ +#define S6D02A1_GREEN 0x07E0 /* 0, 255, 0 */ +#define S6D02A1_CYAN 0x07FF /* 0, 255, 255 */ +#define S6D02A1_RED 0xF800 /* 255, 0, 0 */ +#define S6D02A1_MAGENTA 0xF81F /* 255, 0, 255 */ +#define S6D02A1_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define S6D02A1_WHITE 0xFFFF /* 255, 255, 255 */ +#define S6D02A1_ORANGE 0xFD20 /* 255, 165, 0 */ +#define S6D02A1_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define S6D02A1_PINK 0xF81F + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 //0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 diff --git a/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Init.h b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Init.h new file mode 100644 index 0000000..1986c3e --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Init.h @@ -0,0 +1,47 @@ + +// This is the command sequence that initialises the S6D02A1 driver +// +// This setup information is in a format accecpted by the commandList() function +// which reduces FLASH space, but on an ESP8266 there is plenty available! +// +// See ILI9341_Setup.h file for an alternative simpler format + +{ + // Initialization commands for S6D02A1 screens + static const uint8_t S6D02A1_cmds[] PROGMEM = + { + 29, + 0xf0, 2, 0x5a, 0x5a, // Excommand2 + 0xfc, 2, 0x5a, 0x5a, // Excommand3 + 0x26, 1, 0x01, // Gamma set + 0xfa, 15, 0x02, 0x1f, 0x00, 0x10, 0x22, 0x30, 0x38, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3d, 0x02, 0x01, // Positive gamma control + 0xfb, 15, 0x21, 0x00, 0x02, 0x04, 0x07, 0x0a, 0x0b, 0x0c, 0x0c, 0x16, 0x1e, 0x30, 0x3f, 0x01, 0x02, // Negative gamma control + 0xfd, 11, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x1f, // Analog parameter control + 0xf4, 15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, // Power control + 0xf5, 13, 0x00, 0x70, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x66, 0x06, // VCOM control + 0xf6, 11, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x01, 0x00, // Source control + 0xf2, 17, 0x00, 0x01, 0x03, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x08, 0x08, //Display control + 0xf8, 1, 0x11, // Gate control + 0xf7, 4, 0xc8, 0x20, 0x00, 0x00, // Interface control + 0xf3, 2, 0x00, 0x00, // Power sequence control + 0x11, TFT_INIT_DELAY, 50, // Wake + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x01, 50, // Power sequence control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x03, 50, // Power sequence control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x07, 50, // Power sequence control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x0f, 50, // Power sequence control + 0xf4, 15+TFT_INIT_DELAY, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, 50, // Power control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x1f, 50, // Power sequence control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0x7f, 50, // Power sequence control + 0xf3, 2+TFT_INIT_DELAY, 0x00, 0xff, 50, // Power sequence control + 0xfd, 11, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x00, 0x01, 0x00, 0x16, 0x16, // Analog parameter control + 0xf4, 15, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, // Power control + 0x36, 1, 0xC8, // Memory access data control + 0x35, 1, 0x00, // Tearing effect line on + 0x3a, 1+TFT_INIT_DELAY, 0x05, 150, // Interface pixel control + 0x29, 0, // Display on + 0x2c, 0 // Memory write + }; + + commandList(S6D02A1_cmds); + +} diff --git a/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Rotation.h new file mode 100644 index 0000000..7fa6eec --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/S6D02A1_Rotation.h @@ -0,0 +1,28 @@ + +// This is the command sequence that rotates the S6D02A1 driver coordinate frame + + rotation = m % 4; + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + break; + case 1: + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + break; + case 2: + writedata(TFT_MAD_BGR); + _width = _init_width; + _height = _init_height; + break; + case 3: + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Defines.h new file mode 100644 index 0000000..c4b0f6c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Defines.h @@ -0,0 +1,20 @@ +#ifndef TFT_WIDTH + #define TFT_WIDTH 128 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 128 +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST TFT_NOP +#define TFT_CASET 0x15 // SETCOLUMN +#define TFT_PASET 0x75 // SETROW +#define TFT_RAMWR 0x5C // WRITERAM +#define TFT_RAMRD 0x5D // READRAM +#define TFT_IDXRD TFT_NOP +#define TFT_INVOFF 0xA6 // NORMALDISPLAY +#define TFT_INVON 0xA7 // INVERTDISPLAY diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Init.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Init.h new file mode 100644 index 0000000..2b5cff7 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Init.h @@ -0,0 +1,35 @@ +{ + writecommand(0xFD); // COMMANDLOCK + writedata(0x12); + writecommand(0xFD); // COMMANDLOCK + writedata(0xB1); + writecommand(0xAE); // DISPLAYOFF + writecommand(0xB3); // CLOCKDIV + writedata(0xF1); + writecommand(0xCA); // MUXRATIO + writedata(127); + writecommand(0xA2); // DISPLAYOFFSET + writedata(0x00); + writecommand(0xB5); // SETGPIO + writedata(0x00); + writecommand(0xAB); // FUNCTIONSELECT + writedata(0x01); + writecommand(0xB1); // PRECHARGE + writedata(0x32); + writecommand(0xBE); // VCOMH + writedata(0x05); + writecommand(0xA6); // NORMALDISPLAY + writecommand(0xC1); // CONTRASTABC + writedata(0xC8); + writedata(0x80); + writedata(0xC8); + writecommand(0xC7); // CONTRASTMASTER + writedata(0x0F); + writecommand(0xB4); // SETVSL + writedata(0xA0); + writedata(0xB5); + writedata(0x55); + writecommand(0xB6); // PRECHARGE2 + writedata(0x01); + writecommand(0xAF); // DISPLAYON +} diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Rotation.h new file mode 100644 index 0000000..f500f6d --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1351_Rotation.h @@ -0,0 +1,34 @@ + +// This is the command sequence that rotates the SSD1351 driver coordinate frame + + rotation = m % 4; // Limit the range of values to 0-3 + + uint8_t madctl = 0x64; + + switch (rotation) { + case 0: + madctl |= 0x10; + _width = _init_width; + _height = _init_height; + break; + case 1: + madctl |= 0x13; + _width = _init_height; + _height = _init_width; + break; + case 2: + madctl |= 0x02; + _width = _init_width; + _height = _init_height; + break; + case 3: + madctl |= 0x01; + _width = _init_height; + _height = _init_width; + break; + } + + writecommand(0xA0); // SETREMAP + writedata(madctl); + writecommand(0xA1); // STARTLINE + writedata(rotation < 2 ? TFT_HEIGHT : 0); diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Defines.h new file mode 100644 index 0000000..f3ca7d4 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Defines.h @@ -0,0 +1,59 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#if defined (SSD1963_480_DRIVER) + #define TFT_WIDTH 272 + #define TFT_HEIGHT 480 +#elif defined (SSD1963_800_DRIVER) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 800 +#elif defined (SSD1963_800ALT_DRIVER) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 800 +#elif defined (SSD1963_800BD_DRIVER) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 800 +#endif + +//Set driver type common to all initialisation options +#ifndef SSD1963_DRIVER + #define SSD1963_DRIVER +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Init.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Init.h new file mode 100644 index 0000000..87d4ee6 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Init.h @@ -0,0 +1,398 @@ +#if defined (SSD1963_480_DRIVER) + + writecommand(0xE2); //PLL multiplier, set PLL clock to 120M + writedata(0x23); //N=0x36 for 6.5M, 0x23 for 10M crystal + writedata(0x02); + writedata(0x54); + writecommand(0xE0); // PLL enable + writedata(0x01); + + delay(10); + + writecommand(0xE0); + writedata(0x03); + + delay(10); + + writecommand(0x01); // software reset + + delay(100); + + writecommand(0xE6); //PLL setting for PCLK, depends on resolution + writedata(0x01); + writedata(0x1F); + writedata(0xFF); + + writecommand(0xB0); //LCD SPECIFICATION + writedata(0x20); + writedata(0x00); + writedata(0x01); //Set HDP 479 + writedata(0xDF); + writedata(0x01); //Set VDP 271 + writedata(0x0F); + writedata(0x00); + + writecommand(0xB4); //HSYNC + writedata(0x02); //Set HT 531 + writedata(0x13); + writedata(0x00); //Set HPS 8 + writedata(0x08); + writedata(0x2B); //Set HPW 43 + writedata(0x00); //Set LPS 2 + writedata(0x02); + writedata(0x00); + + writecommand(0xB6); //VSYNC + writedata(0x01); //Set VT 288 + writedata(0x20); + writedata(0x00); //Set VPS 4 + writedata(0x04); + writedata(0x0c); //Set VPW 12 + writedata(0x00); //Set FPS 2 + writedata(0x02); + + writecommand(0xBA); + writedata(0x0F); //GPIO[3:0] out 1 + + writecommand(0xB8); + writedata(0x07); //GPIO3=input, GPIO[2:0]=output + writedata(0x01); //GPIO0 normal + + writecommand(0x36); //rotation + writedata(0x21 | TFT_MAD_COLOR_ORDER); + + writecommand(0xF0); //pixel data interface + writedata(0x00); //8-bit bus + + delay(1); + + writecommand(0xB8); + writedata(0x0f); //GPIO is controlled by host GPIO[3:0]=output GPIO[0]=1 LCD ON GPIO[0]=1 LCD OFF + writedata(0x01); //GPIO0 normal + + writecommand(0xBA); + writedata(0x01); //GPIO[0] out 1 --- LCD display on/off control PIN + + writecommand(0x2A); + writedata(0); + writedata(0); + writedata((271 & 0xFF00)>>8); + writedata(271 & 0xFF); + + writecommand(0x2B); + writedata(0); + writedata(0); + writedata((479 & 0xFF00)>>8); + writedata(479 & 0xFF); + + writecommand(0x2C); + + writecommand(0x29); //display on + + writecommand(0xBE); //set PWM for B/L + writedata(0x06); + writedata(0xf0); + writedata(0x01); + writedata(0xf0); + writedata(0x00); + writedata(0x00); + + writecommand(0xd0); + writedata(0x0d); + + writecommand(0x2C); + +#elif defined (SSD1963_800_DRIVER) + + writecommand(0xE2); //PLL multiplier, set PLL clock to 120M + writedata(0x1E); //N=0x36 for 6.5M, 0x23 for 10M crystal + writedata(0x02); + writedata(0x54); + writecommand(0xE0); // PLL enable + writedata(0x01); + + delay(10); + + writecommand(0xE0); + writedata(0x03); + + delay(10); + + writecommand(0x01); // software reset + + delay(100); + + writecommand(0xE6); //PLL setting for PCLK, depends on resolution + writedata(0x03); + writedata(0xFF); + writedata(0xFF); + + writecommand(0xB0); //LCD SPECIFICATION + writedata(0x20); + writedata(0x00); + writedata(0x03); //Set HDP 799 + writedata(0x1F); + writedata(0x01); //Set VDP 479 + writedata(0xDF); + writedata(0x00); + + writecommand(0xB4); //HSYNC + writedata(0x03); //Set HT 928 + writedata(0xA0); + writedata(0x00); //Set HPS 46 + writedata(0x2E); + writedata(0x30); //Set HPW 48 + writedata(0x00); //Set LPS 15 + writedata(0x0F); + writedata(0x00); + + writecommand(0xB6); //VSYNC + writedata(0x02); //Set VT 525 + writedata(0x0D); + writedata(0x00); //Set VPS 16 + writedata(0x10); + writedata(0x10); //Set VPW 16 + writedata(0x00); //Set FPS 8 + writedata(0x08); + + writecommand(0xBA); + writedata(0x0F); //GPIO[3:0] out 1 + + writecommand(0xB8); + writedata(0x07); //GPIO3=input, GPIO[2:0]=output + writedata(0x01); //GPIO0 normal + + writecommand(0x36); //rotation + writedata(0x21 | TFT_MAD_COLOR_ORDER); + + writecommand(0xF0); //pixel data interface + writedata(0x00); //8-bit bus + + delay(1); + + writecommand(0xB8); + writedata(0x0f); //GPIO is controlled by host GPIO[3:0]=output GPIO[0]=1 LCD ON GPIO[0]=1 LCD OFF + writedata(0x01); //GPIO0 normal + + writecommand(0xBA); + writedata(0x01); //GPIO[0] out 1 --- LCD display on/off control PIN + + writecommand(0x2A); + writedata(0); + writedata(0); + writedata((479 & 0xFF00)>>8); + writedata(479 & 0xFF); + + writecommand(0x2B); + writedata(0); + writedata(0); + writedata((799 & 0xFF00)>>8); + writedata(799 & 0xFF); + + writecommand(0x2C); + + writecommand(0x29); //display on + + writecommand(0xBE); //set PWM for B/L + writedata(0x06); + writedata(0xf0); + writedata(0x01); + writedata(0xf0); + writedata(0x00); + writedata(0x00); + + writecommand(0xd0); + writedata(0x0d); + + writecommand(0x2C); + +#elif defined (SSD1963_800ALT_DRIVER) + + writecommand(0xE2); //PLL multiplier, set PLL clock to 120M + writedata(0x23); //N=0x36 for 6.5M, 0x23 for 10M crystal + writedata(0x02); + writedata(0x04); + writecommand(0xE0); // PLL enable + writedata(0x01); + + delay(10); + + writecommand(0xE0); + writedata(0x03); + + delay(10); + + writecommand(0x01); // software reset + + delay(100); + + writecommand(0xE6); //PLL setting for PCLK, depends on resolution + writedata(0x04); + writedata(0x93); + writedata(0xE0); + + writecommand(0xB0); //LCD SPECIFICATION + writedata(0x00); // 0x24 + writedata(0x00); + writedata(0x03); //Set HDP 799 + writedata(0x1F); + writedata(0x01); //Set VDP 479 + writedata(0xDF); + writedata(0x00); + + writecommand(0xB4); //HSYNC + writedata(0x03); //Set HT 928 + writedata(0xA0); + writedata(0x00); //Set HPS 46 + writedata(0x2E); + writedata(0x30); //Set HPW 48 + writedata(0x00); //Set LPS 15 + writedata(0x0F); + writedata(0x00); + + writecommand(0xB6); //VSYNC + writedata(0x02); //Set VT 525 + writedata(0x0D); + writedata(0x00); //Set VPS 16 + writedata(0x10); + writedata(0x10); //Set VPW 16 + writedata(0x00); //Set FPS 8 + writedata(0x08); + + writecommand(0xBA); + writedata(0x05); //GPIO[3:0] out 1 + + writecommand(0xB8); + writedata(0x07); //GPIO3=input, GPIO[2:0]=output + writedata(0x01); //GPIO0 normal + + writecommand(0x36); //rotation + writedata(0x21 | TFT_MAD_COLOR_ORDER); // -- Set rotation + + writecommand(0xF0); //pixel data interface + writedata(0x00); //8-bit bus + + delay(10); + + writecommand(0x2A); + writedata(0); + writedata(0); + writedata((479 & 0xFF00)>>8); + writedata(479 & 0xFF); + + writecommand(0x2B); + writedata(0); + writedata(0); + writedata((799 & 0xFF00)>>8); + writedata(799 & 0xFF); + + writecommand(0x2C); + + writecommand(0x29); //display on + + writecommand(0xBE); //set PWM for B/L + writedata(0x06); + writedata(0xF0); + writedata(0x01); + writedata(0xF0); + writedata(0x00); + writedata(0x00); + + writecommand(0xD0); + writedata(0x0D); + + writecommand(0x2C); + +#elif defined (SSD1963_800BD_DRIVER) // Copied from Buy Display code + + writecommand(0xE2); //PLL multiplier, set PLL clock to 120M + writedata(0x23); //N=0x36 for 6.5M, 0x23 for 10M crystal + writedata(0x02); + writedata(0x54); + + writecommand(0xE0); // PLL enable + writedata(0x01); + + delay(10); + + writecommand(0xE0); + writedata(0x03); + + delay(10); + + writecommand(0x01); // software reset + + delay(100); + + writecommand(0xE6); //PLL setting for PCLK, depends on resolution + writedata(0x03); + writedata(0x33); + writedata(0x33); + + writecommand(0xB0); //LCD SPECIFICATION + writedata(0x20); + writedata(0x00); + writedata(799 >> 8); //Set HDP 799 + writedata(799 & 0xFF); + writedata(479 >> 8); //Set VDP 479 + writedata(479 & 0xFF); + writedata(0x00); + + writecommand(0xB4); //HSYNC + writedata(0x04); //Set HT + writedata(0x1F); + writedata(0x00); //Set HPS + writedata(0xD2); + writedata(0x00); //Set HPW + writedata(0x00); //Set LPS + writedata(0x00); + writedata(0x00); + + writecommand(0xB6); //VSYNC + writedata(0x02); //Set VT + writedata(0x0C); + writedata(0x00); //Set VPS + writedata(0x22); + writedata(0x00); //Set VPW + writedata(0x00); //Set FPS + writedata(0x00); + + writecommand(0xB8); + writedata(0x0F); //GPIO3=input, GPIO[2:0]=output + writedata(0x01); //GPIO0 normal + + writecommand(0xBA); + writedata(0x01); //GPIO[0] out 1 --- LCD display on/off control PIN + + writecommand(0x36); //rotation + writedata(0x21 | TFT_MAD_COLOR_ORDER); //set to rotate + + //writecommand(0x003A); //Set the current pixel format for RGB image data + //writedata(0x0050); //16-bit/pixel + + writecommand(0xF0); //pixel data interface + writedata(0x00); //000 = 8-bit bus, 011 = 16-bit, 110 = 9-bit + + writecommand(0xBC); + writedata(0x40); //contrast value + writedata(0x80); //brightness value + writedata(0x40); //saturation value + writedata(0x01); //Post Processor Enable + + + delay(10); + + writecommand(0x29); //display on + + writecommand(0xBE); //set PWM for B/L + writedata(0x06); + writedata(0x80); + writedata(0x01); + writedata(0xF0); + writedata(0x00); + writedata(0x00); + + writecommand(0xD0); + writedata(0x0D); + +#endif \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Rotation.h new file mode 100644 index 0000000..6e61171 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/SSD1963_Rotation.h @@ -0,0 +1,29 @@ + +// This is the command sequence that rotates the SSD1963 driver coordinate frame + + rotation = m % 4; // Limit the range of values to 0-3 + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: + writedata(0x21 | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 1: + writedata(0x00 | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + case 2: + writedata(0x22 | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 3: + writedata(0x03 | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7735_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Defines.h new file mode 100644 index 0000000..b02ee15 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Defines.h @@ -0,0 +1,179 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 128 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 160 +#endif + + +// Enumerate the different configurations +#define INITR_GREENTAB 0x0 +#define INITR_REDTAB 0x1 +#define INITR_BLACKTAB 0x2 // Display with no offsets +#define INITR_GREENTAB2 0x3 // Use if you get random pixels on two edges of green tab display +#define INITR_GREENTAB3 0x4 // Use if you get random pixels on edge(s) of 128x128 screen +#define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1 +#define INITR_GREENTAB160x80 0x6 // Use if you only get part of 128x128 screen in rotation 0 & 1 +#define INITR_REDTAB160x80 0x7 // Added for https://www.aliexpress.com/item/ShengYang-1pcs-IPS-0-96-inch-7P-SPI-HD-65K-Full-Color-OLED-Module-ST7735-Drive/32918394604.html +#define INITR_ROBOTLCD 0x8 +#define INITB 0xB + + +// Setup the tab color that will be used by the library setRotation() and setup command list +#if defined (ST7735_INITB) + #define TAB_COLOUR INITB + +#elif defined (ST7735_GREENTAB) + #define TAB_COLOUR INITR_GREENTAB + #define CGRAM_OFFSET + +#elif defined (ST7735_GREENTAB2) + #define TAB_COLOUR INITR_GREENTAB2 + #define CGRAM_OFFSET + +#elif defined (ST7735_GREENTAB3) + #define TAB_COLOUR INITR_GREENTAB3 + #define CGRAM_OFFSET + +#elif defined (ST7735_GREENTAB128) + #define TAB_COLOUR INITR_GREENTAB128 + #define CGRAM_OFFSET + +#elif defined (ST7735_GREENTAB160x80) + #define TAB_COLOUR INITR_GREENTAB160x80 + #define CGRAM_OFFSET + +#elif defined (ST7735_ROBOTLCD) + #define TAB_COLOUR INITR_ROBOTLCD + #define CGRAM_OFFSET + +#elif defined (ST7735_REDTAB160x80) + #define TAB_COLOUR INITR_REDTAB160x80 + #define CGRAM_OFFSET + +#elif defined (ST7735_REDTAB) + #define TAB_COLOUR INITR_REDTAB + +#elif defined (ST7735_BLACKTAB) + #define TAB_COLOUR INITR_BLACKTAB + +#else // Make sure it is not undefined + #define TAB_COLOUR INITR_BLACKTAB +#endif + + +// Color definitions for backwards compatibility with old sketches +// use colour definitions like TFT_BLACK to make sketches more portable +#define ST7735_BLACK 0x0000 /* 0, 0, 0 */ +#define ST7735_NAVY 0x000F /* 0, 0, 128 */ +#define ST7735_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ST7735_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ST7735_MAROON 0x7800 /* 128, 0, 0 */ +#define ST7735_PURPLE 0x780F /* 128, 0, 128 */ +#define ST7735_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ST7735_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ST7735_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ST7735_BLUE 0x001F /* 0, 0, 255 */ +#define ST7735_GREEN 0x07E0 /* 0, 255, 0 */ +#define ST7735_CYAN 0x07FF /* 0, 255, 255 */ +#define ST7735_RED 0xF800 /* 255, 0, 0 */ +#define ST7735_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ST7735_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ST7735_WHITE 0xFFFF /* 255, 255, 255 */ +#define ST7735_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ST7735_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ST7735_PINK 0xF81F + + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 //0xDD // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 + +#ifndef TFT_RGB_ORDER + #if defined(ST7735_BLACKTAB) || defined(ST7735_GREENTAB2) || defined(ST7735_INITB) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#endif + +// ST7735 specific commands used in init +#define ST7735_NOP 0x00 +#define ST7735_SWRESET 0x01 +#define ST7735_RDDID 0x04 +#define ST7735_RDDST 0x09 + +#define ST7735_SLPIN 0x10 +#define ST7735_SLPOUT 0x11 +#define ST7735_PTLON 0x12 +#define ST7735_NORON 0x13 + +#define ST7735_INVOFF 0x20 +#define ST7735_INVON 0x21 +#define ST7735_DISPOFF 0x28 +#define ST7735_DISPON 0x29 +#define ST7735_CASET 0x2A +#define ST7735_RASET 0x2B // PASET +#define ST7735_RAMWR 0x2C +#define ST7735_RAMRD 0x2E + +#define ST7735_PTLAR 0x30 +#define ST7735_COLMOD 0x3A +#define ST7735_MADCTL 0x36 + +#define ST7735_FRMCTR1 0xB1 +#define ST7735_FRMCTR2 0xB2 +#define ST7735_FRMCTR3 0xB3 +#define ST7735_INVCTR 0xB4 +#define ST7735_DISSET5 0xB6 + +#define ST7735_PWCTR1 0xC0 +#define ST7735_PWCTR2 0xC1 +#define ST7735_PWCTR3 0xC2 +#define ST7735_PWCTR4 0xC3 +#define ST7735_PWCTR5 0xC4 +#define ST7735_VMCTR1 0xC5 + +#define ST7735_RDID1 0xDA +#define ST7735_RDID2 0xDB +#define ST7735_RDID3 0xDC +#define ST7735_RDID4 0xDD + +#define ST7735_PWCTR6 0xFC + +#define ST7735_GMCTRP1 0xE0 +#define ST7735_GMCTRN1 0xE1 diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7735_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Init.h new file mode 100644 index 0000000..3b525f2 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Init.h @@ -0,0 +1,218 @@ + +// This is the command sequence that initialises the ST7735 driver +// +// This setup information is in a format accepted by the commandList() function +// which reduces FLASH space, but on an ESP8266 there is plenty available! +// +// See ILI9341_Setup.h file for an alternative simpler format + +{ + // Initialization commands for ST7735 screens + static const uint8_t PROGMEM + Bcmd[] = { // Initialization commands for 7735B screens + 18, // 18 commands in list: + ST7735_SWRESET, TFT_INIT_DELAY, // 1: Software reset, no args, w/delay + 50, // 50 ms delay + ST7735_SLPOUT , TFT_INIT_DELAY, // 2: Out of sleep mode, no args, w/delay + 255, // 255 = 500 ms delay + ST7735_COLMOD , 1+TFT_INIT_DELAY, // 3: Set color mode, 1 arg + delay: + 0x05, // 16-bit color + 10, // 10 ms delay + ST7735_FRMCTR1, 3+TFT_INIT_DELAY, // 4: Frame rate control, 3 args + delay: + 0x00, // fastest refresh + 0x06, // 6 lines front porch + 0x03, // 3 lines back porch + 10, // 10 ms delay + ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg: + 0x40 | TFT_MAD_COLOR_ORDER, // Row addr/col addr, bottom to top refresh + ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay: + 0x15, // 1 clk cycle nonoverlap, 2 cycle gate + // rise, 3 cycle osc equalize + 0x02, // Fix on VTL + ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg: + 0x0, // Line inversion + ST7735_PWCTR1 , 2+TFT_INIT_DELAY, // 8: Power control, 2 args + delay: + 0x02, // GVDD = 4.7V + 0x70, // 1.0uA + 10, // 10 ms delay + ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay: + 0x05, // VGH = 14.7V, VGL = -7.35V + ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay: + 0x01, // Opamp current small + 0x02, // Boost frequency + ST7735_VMCTR1 , 2+TFT_INIT_DELAY, // 11: Power control, 2 args + delay: + 0x3C, // VCOMH = 4V + 0x38, // VCOML = -1.1V + 10, // 10 ms delay + ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay: + 0x11, 0x15, + ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay: + 0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what + 0x21, 0x1B, 0x13, 0x19, // these config values represent) + 0x17, 0x15, 0x1E, 0x2B, + 0x04, 0x05, 0x02, 0x0E, + ST7735_GMCTRN1,16+TFT_INIT_DELAY, // 14: Sparkles and rainbows, 16 args + delay: + 0x0B, 0x14, 0x08, 0x1E, // (ditto) + 0x22, 0x1D, 0x18, 0x1E, + 0x1B, 0x1A, 0x24, 0x2B, + 0x06, 0x06, 0x02, 0x0F, + 10, // 10 ms delay + ST7735_CASET , 4 , // 15: Column addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 2 + 0x00, 0x81, // XEND = 129 + ST7735_RASET , 4 , // 16: Row addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 1 + 0x00, 0x81, // XEND = 160 + ST7735_NORON , TFT_INIT_DELAY, // 17: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON , TFT_INIT_DELAY, // 18: Main screen turn on, no args, w/delay + 255 }, // 255 = 500 ms delay + + Rcmd1[] = { // Init for 7735R, part 1 (red or green tab) + 15, // 15 commands in list: + ST7735_SWRESET, TFT_INIT_DELAY, // 1: Software reset, 0 args, w/delay + 150, // 150 ms delay + ST7735_SLPOUT , TFT_INIT_DELAY, // 2: Out of sleep mode, 0 args, w/delay + 255, // 500 ms delay + ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay: + 0x07, // No inversion + ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD + ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, Opamp current small & Medium low + 0x2A, + ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay: + 0x0E, + ST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay + ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg: + 0xC0 | TFT_MAD_COLOR_ORDER, // row addr/col addr, bottom to top refresh + ST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay: + 0x05 }, // 16-bit color + + Rcmd2green[] = { // Init for 7735R, part 2 (green tab only) + 2, // 2 commands in list: + ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 0 + 0x00, 0x7F+0x02, // XEND = 127 + ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x01, // XSTART = 0 + 0x00, 0x9F+0x01 }, // XEND = 159 + + Rcmd2red[] = { // Init for 7735R, part 2 (red tab only) + 2, // 2 commands in list: + ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F, // XEND = 127 + ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x9F }, // XEND = 159 + + // Frame control init for RobotLCD, taken from https://github.com/arduino-libraries/TFT, Adafruit_ST7735.cpp l. 263, commit 61b8a7e + Rcmd3RobotLCD[] = { + 3, + ST7735_FRMCTR1, 2 , // 1: Frame rate ctrl - normal mode, 2 args + 0x0B, 0x14, + ST7735_FRMCTR2, 2 , // 2: Frame rate ctrl - idle mode, 2 args + 0x0B, 0x14, + ST7735_FRMCTR3, 4 , // 3: Frame rate ctrl - partial mode, 4 args + 0x0B, 0x14, + 0x0B, 0x14 }, + + Rcmd3[] = { // Init for 7735R, part 3 (red or green tab) + 4, // 4 commands in list: + ST7735_GMCTRP1, 16 , // 1: 16 args, no delay: + 0x02, 0x1c, 0x07, 0x12, + 0x37, 0x32, 0x29, 0x2d, + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + ST7735_GMCTRN1, 16 , // 2: 16 args, no delay: + 0x03, 0x1d, 0x07, 0x06, + 0x2E, 0x2C, 0x29, 0x2D, + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + ST7735_NORON , TFT_INIT_DELAY, // 3: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON , TFT_INIT_DELAY, // 4: Main screen turn on, no args w/delay + 100 }; // 100 ms delay + + if (tabcolor == INITB) + { + commandList(Bcmd); + } + else + { + commandList(Rcmd1); + + if (tabcolor == INITR_GREENTAB) + { + commandList(Rcmd2green); + colstart = 2; + rowstart = 1; + } + else if (tabcolor == INITR_GREENTAB2) + { + commandList(Rcmd2green); + writecommand(ST7735_MADCTL); + writedata(0xC0 | TFT_MAD_COLOR_ORDER); + colstart = 2; + rowstart = 1; + } + else if (tabcolor == INITR_GREENTAB3) + { + commandList(Rcmd2green); + colstart = 2; + rowstart = 3; + } + else if (tabcolor == INITR_GREENTAB128) + { + commandList(Rcmd2green); + colstart = 0; + rowstart = 32; + } + else if (tabcolor == INITR_GREENTAB160x80) + { + commandList(Rcmd2green); + writecommand(TFT_INVON); + colstart = 26; + rowstart = 1; + } + else if (tabcolor == INITR_ROBOTLCD) + { + commandList(Rcmd2green); + commandList(Rcmd3RobotLCD); + } + else if (tabcolor == INITR_REDTAB160x80) + { + commandList(Rcmd2green); + colstart = 24; + rowstart = 0; + } + else if (tabcolor == INITR_REDTAB) + { + commandList(Rcmd2red); + } + else if (tabcolor == INITR_BLACKTAB) + { + writecommand(ST7735_MADCTL); + writedata(0xC0 | TFT_MAD_COLOR_ORDER); + } + + commandList(Rcmd3); + } +} diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7735_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Rotation.h new file mode 100644 index 0000000..3c17b71 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7735_Rotation.h @@ -0,0 +1,132 @@ + +// This is the command sequence that rotates the ST7735 driver coordinate frame + + rotation = m % 4; // Limit the range of values to 0-3 + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: + if (tabcolor == INITR_BLACKTAB) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + } else if(tabcolor == INITR_GREENTAB2) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + colstart = 2; + rowstart = 1; + } else if(tabcolor == INITR_GREENTAB3) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + colstart = 2; + rowstart = 3; + } else if(tabcolor == INITR_GREENTAB128) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_COLOR_ORDER); + colstart = 0; + rowstart = 32; + } else if(tabcolor == INITR_GREENTAB160x80) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_COLOR_ORDER); + colstart = 26; + rowstart = 1; + } else if(tabcolor == INITR_REDTAB160x80) { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_COLOR_ORDER); + colstart = 24; + rowstart = 0; + } else if(tabcolor == INITB) { + writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); + } else { + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + } + _width = _init_width; + _height = _init_height; + break; + case 1: + if (tabcolor == INITR_BLACKTAB) { + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + } else if(tabcolor == INITR_GREENTAB2) { + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 1; + rowstart = 2; + } else if(tabcolor == INITR_GREENTAB3) { + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 3; + rowstart = 2; + } else if(tabcolor == INITR_GREENTAB128) { + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + colstart = 32; + rowstart = 0; + } else if(tabcolor == INITR_GREENTAB160x80) { + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + colstart = 1; + rowstart = 26; + } else if(tabcolor == INITR_REDTAB160x80) { + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + colstart = 0; + rowstart = 24; + } else if(tabcolor == INITB) { + writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + } else { + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + } + _width = _init_height; + _height = _init_width; + break; + case 2: + if (tabcolor == INITR_BLACKTAB) { + writedata(TFT_MAD_COLOR_ORDER); + } else if(tabcolor == INITR_GREENTAB2) { + writedata(TFT_MAD_COLOR_ORDER); + colstart = 2; + rowstart = 1; + } else if(tabcolor == INITR_GREENTAB3) { + writedata(TFT_MAD_COLOR_ORDER); + colstart = 2; + rowstart = 1; + } else if(tabcolor == INITR_GREENTAB128) { + writedata(TFT_MAD_COLOR_ORDER); + colstart = 0; + rowstart = 0; + } else if(tabcolor == INITR_GREENTAB160x80) { + writedata(TFT_MAD_COLOR_ORDER); + colstart = 26; + rowstart = 1; + } else if(tabcolor == INITR_REDTAB160x80) { + writedata(TFT_MAD_COLOR_ORDER); + colstart = 24; + rowstart = 0; + } else if(tabcolor == INITB) { + writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + } else { + writedata(TFT_MAD_COLOR_ORDER); + } + _width = _init_width; + _height = _init_height; + break; + case 3: + if (tabcolor == INITR_BLACKTAB) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + } else if(tabcolor == INITR_GREENTAB2) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 1; + rowstart = 2; + } else if(tabcolor == INITR_GREENTAB3) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 1; + rowstart = 2; + } else if(tabcolor == INITR_GREENTAB128) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 0; + rowstart = 0; + } else if(tabcolor == INITR_GREENTAB160x80) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 1; + rowstart = 26; + } else if(tabcolor == INITR_REDTAB160x80) { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + colstart = 0; + rowstart = 24; + } else if(tabcolor == INITB) { + writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + } else { + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + } + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h new file mode 100644 index 0000000..917e602 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Defines.h @@ -0,0 +1,178 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 240 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 +#endif + +#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Adafruit 1.44 TFT support +#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 135) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Adafruit 1.69 round corner TFT support +#if (TFT_HEIGHT == 280) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// 1.47" 172x320 Round Rectangle Color IPS TFT Display +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 172) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +#if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 +#define TFT_NORON 0x13 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C +#define TFT_RAMRD 0x2E +#define TFT_MADCTL 0x36 +#define TFT_COLMOD 0x3A + +// Flags for TFT_MADCTL +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #ifdef CGRAM_OFFSET + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #endif +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read + +#define ST_CMD_DELAY 0x80 // special signifier for command lists +#define ST7789_240x240_XSTART 0 +#define ST7789_240x240_YSTART 0 + +// ST7789 specific commands used in init +#define ST7789_NOP 0x00 +#define ST7789_SWRESET 0x01 +#define ST7789_RDDID 0x04 +#define ST7789_RDDST 0x09 + +#define ST7789_RDDPM 0x0A // Read display power mode +#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL +#define ST7789_RDD_COLMOD 0x0C // Read display pixel format +#define ST7789_RDDIM 0x0D // Read display image mode +#define ST7789_RDDSM 0x0E // Read display signal mode +#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V) + +#define ST7789_SLPIN 0x10 +#define ST7789_SLPOUT 0x11 +#define ST7789_PTLON 0x12 +#define ST7789_NORON 0x13 + +#define ST7789_INVOFF 0x20 +#define ST7789_INVON 0x21 +#define ST7789_GAMSET 0x26 // Gamma set +#define ST7789_DISPOFF 0x28 +#define ST7789_DISPON 0x29 +#define ST7789_CASET 0x2A +#define ST7789_RASET 0x2B +#define ST7789_RAMWR 0x2C +#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors +#define ST7789_RAMRD 0x2E + +#define ST7789_PTLAR 0x30 +#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V) +#define ST7789_TEOFF 0x34 // Tearing effect line off +#define ST7789_TEON 0x35 // Tearing effect line on +#define ST7789_MADCTL 0x36 // Memory data access control +#define ST7789_IDMOFF 0x38 // Idle mode off +#define ST7789_IDMON 0x39 // Idle mode on +#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V) +#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V) +#define ST7789_COLMOD 0x3A + +#define ST7789_RAMCTRL 0xB0 // RAM control +#define ST7789_RGBCTRL 0xB1 // RGB control +#define ST7789_PORCTRL 0xB2 // Porch control +#define ST7789_FRCTRL1 0xB3 // Frame rate control +#define ST7789_PARCTRL 0xB5 // Partial mode control +#define ST7789_GCTRL 0xB7 // Gate control +#define ST7789_GTADJ 0xB8 // Gate on timing adjustment +#define ST7789_DGMEN 0xBA // Digital gamma enable +#define ST7789_VCOMS 0xBB // VCOMS setting +#define ST7789_LCMCTRL 0xC0 // LCM control +#define ST7789_IDSET 0xC1 // ID setting +#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable +#define ST7789_VRHS 0xC3 // VRH set +#define ST7789_VDVSET 0xC4 // VDV setting +#define ST7789_VCMOFSET 0xC5 // VCOMS offset set +#define ST7789_FRCTR2 0xC6 // FR Control 2 +#define ST7789_CABCCTRL 0xC7 // CABC control +#define ST7789_REGSEL1 0xC8 // Register value section 1 +#define ST7789_REGSEL2 0xCA // Register value section 2 +#define ST7789_PWMFRSEL 0xCC // PWM frequency selection +#define ST7789_PWCTRL1 0xD0 // Power control 1 +#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789_CMD2EN 0xDF // Command 2 enable +#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control +#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control +#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red +#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue +#define ST7789_GATECTRL 0xE4 // Gate control +#define ST7789_SPI2EN 0xE7 // SPI2 enable +#define ST7789_PWCTRL2 0xE8 // Power control 2 +#define ST7789_EQCTRL 0xE9 // Equalize time control +#define ST7789_PROMCTRL 0xEC // Program control +#define ST7789_PROMEN 0xFA // Program mode enable +#define ST7789_NVMSET 0xFC // NVM setting +#define ST7789_PROMACT 0xFE // Program action + diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Init.h new file mode 100644 index 0000000..3cd9630 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Init.h @@ -0,0 +1,22 @@ + +// This is the command sequence that initialises the ST7789 driver + +// Configure ST7789 display + +{ +static const uint8_t PROGMEM + st7789[] = { + 8, + TFT_SLPOUT, TFT_INIT_DELAY, 255, + TFT_COLMOD, 1+TFT_INIT_DELAY, 0x55, 10, + TFT_MADCTL, 1, 0x00, + TFT_CASET, 4, 0x00, 0x00, 0x00, 0xF0, + TFT_PASET, 4, 0x00, 0x00, 0x00, 0xF0, + TFT_INVON, TFT_INIT_DELAY, 10, + TFT_NORON, TFT_INIT_DELAY, 10, + TFT_DISPON, TFT_INIT_DELAY, 255 + }; + + commandList(st7789); +} +// End of ST7789 display configuration \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Rotation.h new file mode 100644 index 0000000..df5860c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_2_Rotation.h @@ -0,0 +1,140 @@ + // This is the command sequence that rotates the ST7789 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 52; + rowstart = 40; + } + else if(_init_height == 280) + { + colstart = 0; + rowstart = 20; + } + else if(_init_width == 172) + { + colstart = 34; + rowstart = 0; + } + else if(_init_width == 170) + { + colstart = 35; + rowstart = 0; + } + else + { + colstart = 0; + rowstart = 0; + } +#endif + writedata(TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + + case 1: // Landscape (Portrait + 90) +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 40; + rowstart = 53; + } + else if(_init_height == 280) + { + colstart = 20; + rowstart = 0; + } + else if(_init_width == 172) + { + colstart = 0; + rowstart = 34; + } + else if(_init_width == 170) + { + colstart = 0; + rowstart = 35; + } + else + { + colstart = 0; + rowstart = 0; + } +#endif + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + + case 2: // Inverter portrait +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 53; + rowstart = 40; + } + else if(_init_height == 280) + { + colstart = 0; + rowstart = 20; + } + else if(_init_width == 172) + { + colstart = 34; + rowstart = 0; + } + else if(_init_width == 170) + { + colstart = 35; + rowstart = 0; + } + else + { + colstart = 0; + rowstart = 80; + } +#endif + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 40; + rowstart = 52; + } + else if(_init_height == 280) + { + colstart = 20; + rowstart = 0; + } + else if(_init_width == 172) + { + colstart = 0; + rowstart = 34; + } + else if(_init_width == 170) + { + colstart = 0; + rowstart = 35; + } + else + { + colstart = 80; + rowstart = 0; + } +#endif + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Defines.h new file mode 100644 index 0000000..f1b21f3 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Defines.h @@ -0,0 +1,175 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH + #define TFT_WIDTH 240 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 +#endif + +#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Adafruit 1.44 TFT support +#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 135) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Adafruit 1.69 round corner TFT support +#if (TFT_HEIGHT == 280) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// 1.47" 172x320 Round Rectangle Color IPS TFT Display +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 172) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +#if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked + + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 +#define TFT_NORON 0x13 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C +#define TFT_RAMRD 0x2E +#define TFT_MADCTL 0x36 +#define TFT_COLMOD 0x3A + +// Flags for TFT_MADCTL +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_SS 0x02 +#define TFT_MAD_GS 0x01 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #ifdef CGRAM_OFFSET + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #endif +#endif + +#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read + +// ST7789 specific commands used in init +#define ST7789_NOP 0x00 +#define ST7789_SWRESET 0x01 +#define ST7789_RDDID 0x04 +#define ST7789_RDDST 0x09 + +#define ST7789_RDDPM 0x0A // Read display power mode +#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL +#define ST7789_RDD_COLMOD 0x0C // Read display pixel format +#define ST7789_RDDIM 0x0D // Read display image mode +#define ST7789_RDDSM 0x0E // Read display signal mode +#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V) + +#define ST7789_SLPIN 0x10 +#define ST7789_SLPOUT 0x11 +#define ST7789_PTLON 0x12 +#define ST7789_NORON 0x13 + +#define ST7789_INVOFF 0x20 +#define ST7789_INVON 0x21 +#define ST7789_GAMSET 0x26 // Gamma set +#define ST7789_DISPOFF 0x28 +#define ST7789_DISPON 0x29 +#define ST7789_CASET 0x2A +#define ST7789_RASET 0x2B +#define ST7789_RAMWR 0x2C +#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors +#define ST7789_RAMRD 0x2E + +#define ST7789_PTLAR 0x30 +#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V) +#define ST7789_TEOFF 0x34 // Tearing effect line off +#define ST7789_TEON 0x35 // Tearing effect line on +#define ST7789_MADCTL 0x36 // Memory data access control +#define ST7789_VSCRSADD 0x37 // Vertical screoll address +#define ST7789_IDMOFF 0x38 // Idle mode off +#define ST7789_IDMON 0x39 // Idle mode on +#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V) +#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V) +#define ST7789_COLMOD 0x3A + +#define ST7789_RAMCTRL 0xB0 // RAM control +#define ST7789_RGBCTRL 0xB1 // RGB control +#define ST7789_PORCTRL 0xB2 // Porch control +#define ST7789_FRCTRL1 0xB3 // Frame rate control +#define ST7789_PARCTRL 0xB5 // Partial mode control +#define ST7789_GCTRL 0xB7 // Gate control +#define ST7789_GTADJ 0xB8 // Gate on timing adjustment +#define ST7789_DGMEN 0xBA // Digital gamma enable +#define ST7789_VCOMS 0xBB // VCOMS setting +#define ST7789_LCMCTRL 0xC0 // LCM control +#define ST7789_IDSET 0xC1 // ID setting +#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable +#define ST7789_VRHS 0xC3 // VRH set +#define ST7789_VDVSET 0xC4 // VDV setting +#define ST7789_VCMOFSET 0xC5 // VCOMS offset set +#define ST7789_FRCTR2 0xC6 // FR Control 2 +#define ST7789_CABCCTRL 0xC7 // CABC control +#define ST7789_REGSEL1 0xC8 // Register value section 1 +#define ST7789_REGSEL2 0xCA // Register value section 2 +#define ST7789_PWMFRSEL 0xCC // PWM frequency selection +#define ST7789_PWCTRL1 0xD0 // Power control 1 +#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789_CMD2EN 0xDF // Command 2 enable +#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control +#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control +#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red +#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue +#define ST7789_GATECTRL 0xE4 // Gate control +#define ST7789_SPI2EN 0xE7 // SPI2 enable +#define ST7789_PWCTRL2 0xE8 // Power control 2 +#define ST7789_EQCTRL 0xE9 // Equalize time control +#define ST7789_PROMCTRL 0xEC // Program control +#define ST7789_PROMEN 0xFA // Program mode enable +#define ST7789_NVMSET 0xFC // NVM setting +#define ST7789_PROMACT 0xFE // Program action + diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Init.h new file mode 100644 index 0000000..b2ed7eb --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Init.h @@ -0,0 +1,238 @@ + +// This is the command sequence that initialises the ST7789 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + +#ifndef INIT_SEQUENCE_3 +{ + fillScreen(TFT_RED); + writecommand(ST7789_SLPOUT); // Sleep out + delay(120); + + writecommand(ST7789_NORON); // Normal display mode on + + //------------------------------display and color format setting--------------------------------// + writecommand(ST7789_MADCTL); + //writedata(0x00); + writedata(TFT_MAD_COLOR_ORDER); + + // JLX240 display datasheet + writecommand(0xB6); + writedata(0x0A); + writedata(0x82); + + writecommand(ST7789_RAMCTRL); + writedata(0x00); + writedata(0xE0); // 5 to 6-bit conversion: r0 = r5, b0 = b5 + + writecommand(ST7789_COLMOD); + writedata(0x55); + delay(10); + + //--------------------------------ST7789V Frame rate setting----------------------------------// + writecommand(ST7789_PORCTRL); + writedata(0x0c); + writedata(0x0c); + writedata(0x00); + writedata(0x33); + writedata(0x33); + + writecommand(ST7789_GCTRL); // Voltages: VGH / VGL + writedata(0x35); + + //---------------------------------ST7789V Power setting--------------------------------------// + writecommand(ST7789_VCOMS); + writedata(0x28); // JLX240 display datasheet + + writecommand(ST7789_LCMCTRL); + writedata(0x0C); + + writecommand(ST7789_VDVVRHEN); + writedata(0x01); + writedata(0xFF); + + writecommand(ST7789_VRHS); // voltage VRHS + writedata(0x10); + + writecommand(ST7789_VDVSET); + writedata(0x20); + + writecommand(ST7789_FRCTR2); + writedata(0x0f); + + writecommand(ST7789_PWCTRL1); + writedata(0xa4); + writedata(0xa1); + + //--------------------------------ST7789V gamma setting---------------------------------------// + writecommand(ST7789_PVGAMCTRL); + writedata(0xd0); + writedata(0x00); + writedata(0x02); + writedata(0x07); + writedata(0x0a); + writedata(0x28); + writedata(0x32); + writedata(0x44); + writedata(0x42); + writedata(0x06); + writedata(0x0e); + writedata(0x12); + writedata(0x14); + writedata(0x17); + + writecommand(ST7789_NVGAMCTRL); + writedata(0xd0); + writedata(0x00); + writedata(0x02); + writedata(0x07); + writedata(0x0a); + writedata(0x28); + writedata(0x31); + writedata(0x54); + writedata(0x47); + writedata(0x0e); + writedata(0x1c); + writedata(0x17); + writedata(0x1b); + writedata(0x1e); + + writecommand(ST7789_INVON); + + writecommand(ST7789_CASET); // Column address set + writedata(0x00); + writedata(0x00); + writedata(0x00); + writedata(0xEF); // 239 + + writecommand(ST7789_RASET); // Row address set + writedata(0x00); + writedata(0x00); + writedata(0x01); + writedata(0x3F); // 319 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + end_tft_write(); + delay(120); + begin_tft_write(); + + writecommand(ST7789_DISPON); //Display on + delay(120); + +#ifdef TFT_BL + // Turn on the back-light LED + digitalWrite(TFT_BL, HIGH); + pinMode(TFT_BL, OUTPUT); +#endif +} + + +#else +// TTGO ESP32 S3 T-Display +{ + writecommand(ST7789_SLPOUT); // Sleep out + delay(120); + + writecommand(ST7789_NORON); // Normal display mode on + + //------------------------------display and color format setting--------------------------------// + writecommand(ST7789_MADCTL); + writedata(TFT_MAD_COLOR_ORDER); + + // writecommand(ST7789_RAMCTRL); + // writedata(0x00); + // writedata(0xE0); // 5 to 6-bit conversion: r0 = r5, b0 = b5 + + writecommand(ST7789_COLMOD); + writedata(0x55); + delay(10); + + //--------------------------------ST7789V Frame rate setting----------------------------------// + writecommand(ST7789_PORCTRL); + writedata(0x0b); + writedata(0x0b); + writedata(0x00); + writedata(0x33); + writedata(0x33); + + writecommand(ST7789_GCTRL); // Voltages: VGH / VGL + writedata(0x75); + + //---------------------------------ST7789V Power setting--------------------------------------// + writecommand(ST7789_VCOMS); + writedata(0x28); // JLX240 display datasheet + + writecommand(ST7789_LCMCTRL); + writedata(0x2C); + + writecommand(ST7789_VDVVRHEN); + writedata(0x01); + + writecommand(ST7789_VRHS); // voltage VRHS + writedata(0x1F); + + writecommand(ST7789_FRCTR2); + writedata(0x13); + + writecommand(ST7789_PWCTRL1); + writedata(0xa7); + + writecommand(ST7789_PWCTRL1); + writedata(0xa4); + writedata(0xa1); + + writecommand(0xD6); + writedata(0xa1); + + //--------------------------------ST7789V gamma setting---------------------------------------// + writecommand(ST7789_PVGAMCTRL); + writedata(0xf0); + writedata(0x05); + writedata(0x0a); + writedata(0x06); + writedata(0x06); + writedata(0x03); + writedata(0x2b); + writedata(0x32); + writedata(0x43); + writedata(0x36); + writedata(0x11); + writedata(0x10); + writedata(0x2b); + writedata(0x32); + + writecommand(ST7789_NVGAMCTRL); + writedata(0xf0); + writedata(0x08); + writedata(0x0c); + writedata(0x0b); + writedata(0x09); + writedata(0x24); + writedata(0x2b); + writedata(0x22); + writedata(0x43); + writedata(0x38); + writedata(0x15); + writedata(0x16); + writedata(0x2f); + writedata(0x37); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + end_tft_write(); + delay(120); + begin_tft_write(); + + writecommand(ST7789_DISPON); //Display on + delay(120); + +#ifdef TFT_BL + // Turn on the back-light LED + digitalWrite(TFT_BL, HIGH); + pinMode(TFT_BL, OUTPUT); +#endif +} +#endif \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7789_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Rotation.h new file mode 100644 index 0000000..df5860c --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7789_Rotation.h @@ -0,0 +1,140 @@ + // This is the command sequence that rotates the ST7789 driver coordinate frame + + writecommand(TFT_MADCTL); + rotation = m % 4; + switch (rotation) { + case 0: // Portrait +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 52; + rowstart = 40; + } + else if(_init_height == 280) + { + colstart = 0; + rowstart = 20; + } + else if(_init_width == 172) + { + colstart = 34; + rowstart = 0; + } + else if(_init_width == 170) + { + colstart = 35; + rowstart = 0; + } + else + { + colstart = 0; + rowstart = 0; + } +#endif + writedata(TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + + case 1: // Landscape (Portrait + 90) +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 40; + rowstart = 53; + } + else if(_init_height == 280) + { + colstart = 20; + rowstart = 0; + } + else if(_init_width == 172) + { + colstart = 0; + rowstart = 34; + } + else if(_init_width == 170) + { + colstart = 0; + rowstart = 35; + } + else + { + colstart = 0; + rowstart = 0; + } +#endif + writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + + case 2: // Inverter portrait +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 53; + rowstart = 40; + } + else if(_init_height == 280) + { + colstart = 0; + rowstart = 20; + } + else if(_init_width == 172) + { + colstart = 34; + rowstart = 0; + } + else if(_init_width == 170) + { + colstart = 35; + rowstart = 0; + } + else + { + colstart = 0; + rowstart = 80; + } +#endif + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_width; + _height = _init_height; + break; + case 3: // Inverted landscape +#ifdef CGRAM_OFFSET + if (_init_width == 135) + { + colstart = 40; + rowstart = 52; + } + else if(_init_height == 280) + { + colstart = 20; + rowstart = 0; + } + else if(_init_width == 172) + { + colstart = 0; + rowstart = 34; + } + else if(_init_width == 170) + { + colstart = 0; + rowstart = 35; + } + else + { + colstart = 80; + rowstart = 0; + } +#endif + writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + + _width = _init_height; + _height = _init_width; + break; + } diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7796_Defines.h b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Defines.h new file mode 100644 index 0000000..d7009ac --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Defines.h @@ -0,0 +1,107 @@ +// Change the width and height if required (defined in portrait mode) +// or use the constructor to over-ride defaults +#ifndef TFT_WIDTH +#define TFT_WIDTH 320 +#endif + +#ifndef TFT_HEIGHT +#define TFT_HEIGHT 480 +#endif + +// Generic commands used by TFT_eSPI.cpp +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C +#define TFT_RAMRD 0x2E + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 + +#ifdef TFT_RGB_ORDER + #if (TFT_RGB_ORDER == 1) + #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB + #else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR + #endif +#else + #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR +#endif + +// ST7796 specific commands +#define ST7796_NOP 0x00 +#define ST7796_SWRESET 0x01 +#define ST7796_RDDID 0x04 +#define ST7796_RDDST 0x09 + +#define ST7796_SLPIN 0x10 +#define ST7796_SLPOUT 0x11 +#define ST7796_PTLON 0x12 +#define ST7796_NORON 0x13 + +#define ST7796_RDMODE 0x0A +#define ST7796_RDMADCTL 0x0B +#define ST7796_RDPIXFMT 0x0C +#define ST7796_RDIMGFMT 0x0A +#define ST7796_RDSELFDIAG 0x0F + +#define ST7796_INVOFF 0x20 +#define ST7796_INVON 0x21 + +#define ST7796_DISPOFF 0x28 +#define ST7796_DISPON 0x29 + +#define ST7796_CASET 0x2A +#define ST7796_PASET 0x2B +#define ST7796_RAMWR 0x2C +#define ST7796_RAMRD 0x2E + +#define ST7796_PTLAR 0x30 +#define ST7796_VSCRDEF 0x33 +#define ST7796_MADCTL 0x36 +#define ST7796_VSCRSADD 0x37 +#define ST7796_PIXFMT 0x3A + +#define ST7796_WRDISBV 0x51 +#define ST7796_RDDISBV 0x52 +#define ST7796_WRCTRLD 0x53 + +#define ST7796_FRMCTR1 0xB1 +#define ST7796_FRMCTR2 0xB2 +#define ST7796_FRMCTR3 0xB3 +#define ST7796_INVCTR 0xB4 +#define ST7796_DFUNCTR 0xB6 + +#define ST7796_PWCTR1 0xC0 +#define ST7796_PWCTR2 0xC1 +#define ST7796_PWCTR3 0xC2 + +#define ST7796_VMCTR1 0xC5 +#define ST7796_VMCOFF 0xC6 + +#define ST7796_RDID4 0xD3 + +#define ST7796_GMCTRP1 0xE0 +#define ST7796_GMCTRN1 0xE1 + +#define ST7796_MADCTL_MY 0x80 +#define ST7796_MADCTL_MX 0x40 +#define ST7796_MADCTL_MV 0x20 +#define ST7796_MADCTL_ML 0x10 +#define ST7796_MADCTL_RGB 0x00 +#define ST7796_MADCTL_BGR 0x08 +#define ST7796_MADCTL_MH 0x04 diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7796_Init.h b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Init.h new file mode 100644 index 0000000..c1d8421 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Init.h @@ -0,0 +1,107 @@ + +// This is the command sequence that initialises the ST7796 driver +// +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions +// +// See ST7735_Setup.h file for an alternative format + +#define TFT_INIT_DELAY 0 +{ + delay(120); + + writecommand(0x01); //Software reset + delay(120); + + writecommand(0x11); //Sleep exit + delay(120); + + writecommand(0xF0); //Command Set control + writedata(0xC3); //Enable extension command 2 partI + + writecommand(0xF0); //Command Set control + writedata(0x96); //Enable extension command 2 partII + + writecommand(0x36); //Memory Data Access Control MX, MY, RGB mode + writedata(0x48); //X-Mirror, Top-Left to right-Buttom, RGB + + writecommand(0x3A); //Interface Pixel Format + writedata(0x55); //Control interface color format set to 16 + + + writecommand(0xB4); //Column inversion + writedata(0x01); //1-dot inversion + + writecommand(0xB6); //Display Function Control + writedata(0x80); //Bypass + writedata(0x02); //Source Output Scan from S1 to S960, Gate Output scan from G1 to G480, scan cycle=2 + writedata(0x3B); //LCD Drive Line=8*(59+1) + + + writecommand(0xE8); //Display Output Ctrl Adjust + writedata(0x40); + writedata(0x8A); + writedata(0x00); + writedata(0x00); + writedata(0x29); //Source eqaulizing period time= 22.5 us + writedata(0x19); //Timing for "Gate start"=25 (Tclk) + writedata(0xA5); //Timing for "Gate End"=37 (Tclk), Gate driver EQ function ON + writedata(0x33); + + writecommand(0xC1); //Power control2 + writedata(0x06); //VAP(GVDD)=3.85+( vcom+vcom offset), VAN(GVCL)=-3.85+( vcom+vcom offset) + + writecommand(0xC2); //Power control 3 + writedata(0xA7); //Source driving current level=low, Gamma driving current level=High + + writecommand(0xC5); //VCOM Control + writedata(0x18); //VCOM=0.9 + + delay(120); + + //ST7796 Gamma Sequence + writecommand(0xE0); //Gamma"+" + writedata(0xF0); + writedata(0x09); + writedata(0x0b); + writedata(0x06); + writedata(0x04); + writedata(0x15); + writedata(0x2F); + writedata(0x54); + writedata(0x42); + writedata(0x3C); + writedata(0x17); + writedata(0x14); + writedata(0x18); + writedata(0x1B); + + writecommand(0xE1); //Gamma"-" + writedata(0xE0); + writedata(0x09); + writedata(0x0B); + writedata(0x06); + writedata(0x04); + writedata(0x03); + writedata(0x2B); + writedata(0x43); + writedata(0x42); + writedata(0x3B); + writedata(0x16); + writedata(0x14); + writedata(0x17); + writedata(0x1B); + + delay(120); + + writecommand(0xF0); //Command Set control + writedata(0x3C); //Disable extension command 2 partI + + writecommand(0xF0); //Command Set control + writedata(0x69); //Disable extension command 2 partII + + end_tft_write(); + delay(120); + begin_tft_write(); + + writecommand(0x29); //Display on +} \ No newline at end of file diff --git a/libraries/TFT_eSPI/TFT_Drivers/ST7796_Rotation.h b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Rotation.h new file mode 100644 index 0000000..c5f6ad6 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_Drivers/ST7796_Rotation.h @@ -0,0 +1,78 @@ + +// This is the command sequence that rotates the ST7796 driver coordinate frame + + rotation = m % 8; // Limit the range of values to 0-7 + + writecommand(TFT_MADCTL); + switch (rotation) { + case 0: + writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 49; + rowstart = 0; + } +#endif + break; + case 1: + writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 0; + rowstart = 49; + } +#endif + break; + case 2: + writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 49; + rowstart = 0; + } +#endif + break; + case 3: + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 0; + rowstart = 49; + } +#endif + break; + // These next rotations are for bottom up BMP drawing + case 4: + writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 5: + writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + case 6: + writedata(TFT_MAD_COLOR_ORDER); + _width = _init_width; + _height = _init_height; + break; + case 7: + writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); + _width = _init_height; + _height = _init_width; + break; + + } diff --git a/libraries/TFT_eSPI/TFT_config.h b/libraries/TFT_eSPI/TFT_config.h new file mode 100644 index 0000000..a5c7090 --- /dev/null +++ b/libraries/TFT_eSPI/TFT_config.h @@ -0,0 +1,320 @@ + +/////////////////////////////////////////////////////////// +/* Support file for ESP32 IDF use */ +/* See library docs folder */ +/* */ +/* DO NOT EDIT THIS FILE */ +/* */ +/////////////////////////////////////////////////////////// + +/** + * @file TFT_config.h + * @author Ricard Bitriá Ribes (https://github.com/dracir9) + * Created Date: 22-01-2022 + * ----- + * Last Modified: 25-02-2023 + * Modified By: Ricard Bitriá Ribes + * ----- + * @copyright (c) 2022 Ricard Bitriá Ribes + */ + +#ifndef TFT_CONFIG_H +#define TFT_CONFIG_H + +#include "sdkconfig.h" + +/*************************************************************************************** +** Others +***************************************************************************************/ + +#ifdef CONFIG_DISABLE_WARNINGS + #define DISABLE_ALL_LIBRARY_WARNINGS +#endif + +/*************************************************************************************** +** TFT_eSPI Configuration defines +***************************************************************************************/ +// Override defaults +#define USER_SETUP_LOADED + +/*************************************************************************************** +** Section 1: Load TFT driver +***************************************************************************************/ +#if defined (CONFIG_TFT_ILI9341_DRIVER) + #define ILI9341_DRIVER +#elif defined (CONFIG_TFT_ILI9341_2_DRIVER) + #define ILI9341_2_DRIVER +#elif defined (CONFIG_TFT_ST7735_DRIVER) + #define ST7735_DRIVER +#elif defined (CONFIG_TFT_ILI9163_DRIVER) + #define ILI9163_DRIVER +#elif defined (CONFIG_TFT_S6D02A1_DRIVER) + #define S6D02A1_DRIVER +#elif defined (CONFIG_TFT_HX8357D_DRIVER) + #define HX8357D_DRIVER +#elif defined (CONFIG_TFT_ILI9481_DRIVER) + #define ILI9481_DRIVER +#elif defined (CONFIG_TFT_ILI9486_DRIVER) + #define ILI9486_DRIVER +#elif defined (CONFIG_TFT_ILI9488_DRIVER) + #define ILI9488_DRIVER +#elif defined (CONFIG_TFT_ST7789_DRIVER) + #define ST7789_DRIVER +#elif defined (CONFIG_TFT_ST7789_2_DRIVER) + #define ST7789_2_DRIVER +#elif defined (CONFIG_TFT_R61581_DRIVER) + #define R61581_DRIVER +#elif defined (CONFIG_TFT_RM68140_DRIVER) + #define RM68140_DRIVER +#elif defined (CONFIG_TFT_ST7796_DRIVER) + #define ST7796_DRIVER +#elif defined (CONFIG_TFT_SSD1351_DRIVER) + #define SSD1351_DRIVER +#elif defined (CONFIG_TFT_SSD1963_480_DRIVER) + #define SSD1963_480_DRIVER +#elif defined (CONFIG_TFT_SSD1963_800_DRIVER) + #define SSD1963_800_DRIVER +#elif defined (CONFIG_TFT_SSD1963_800ALT_DRIVER) + #define SSD1963_800ALT_DRIVER +#elif defined (CONFIG_TFT_ILI9225_DRIVER) + #define ILI9225_DRIVER +#elif defined (CONFIG_TFT_GC9A01_DRIVER) + #define GC9A01_DRIVER +#endif + +#ifdef CONFIG_TFT_RGB_ORDER + #define TFT_RGB_ORDER TFT_RGB +#endif + +#ifdef CONFIG_TFT_BGR_ORDER + #define TFT_RGB_ORDER TFT_BGR +#endif + +#ifdef CONFIG_TFT_M5STACK + #define M5STACK +#endif + +#ifdef CONFIG_TFT_WIDTH + #define TFT_WIDTH CONFIG_TFT_WIDTH +#endif + +#ifdef CONFIG_TFT_HEIGHT + #define TFT_HEIGHT CONFIG_TFT_HEIGHT +#endif + +#if defined (CONFIG_TFT_ST7735_INITB) + #define ST7735_INITB +#elif defined (CONFIG_TFT_ST7735_GREENTAB) + #define ST7735_GREENTAB +#elif defined (CONFIG_TFT_ST7735_GREENTAB2) + #define ST7735_GREENTAB2 +#elif defined (CONFIG_TFT_ST7735_GREENTAB3) + #define ST7735_GREENTAB3 +#elif defined (CONFIG_TFT_ST7735_GREENTAB128) + #define ST7735_GREENTAB128 +#elif defined (CONFIG_TFT_ST7735_GREENTAB160x80) + #define ST7735_GREENTAB160x80 +#elif defined (CONFIG_TFT_ST7735_REDTAB) + #define ST7735_REDTAB +#elif defined (CONFIG_TFT_ST7735_BLACKTAB) + #define ST7735_BLACKTAB +#elif defined (CONFIG_TFT_ST7735_REDTAB160x80) + #define ST7735_REDTAB160x80 +#endif + +#if defined (CONFIG_TFT_INVERSION_ON) + #define TFT_INVERSION_ON +#elif defined (CONFIG_TFT_INVERSION_OFF) + #define TFT_INVERSION_OFF +#endif + +/*************************************************************************************** +** Section 2: General Pin configuration +***************************************************************************************/ +// General pins +#if CONFIG_TFT_CS == -1 + #error "Invalid Chip Select pin. Check TFT_eSPI configuration" +#else + #define TFT_CS CONFIG_TFT_CS +#endif + +#if CONFIG_TFT_DC == -1 + #error "Invalid Data/Command pin. Check TFT_eSPI configuration" +#else + #define TFT_DC CONFIG_TFT_DC +#endif + +#if CONFIG_TFT_RST == -1 + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning "Invalid Reset pin. Check TFT_eSPI configuration" + #endif +#else + #define TFT_RST CONFIG_TFT_RST +#endif + +// Backlight config +#ifdef CONFIG_ENABLE_BL + #if CONFIG_TFT_BL == -1 + #error "Invalid backlight control pin. Check TFT_eSPI configuration" + #else + #define TFT_BL CONFIG_TFT_BL + #endif + + #define TFT_BACKLIGHT_ON CONFIG_TFT_BACKLIGHT_ON +#endif + + +/*************************************************************************************** +** Section 3: Data bus Pin configuration +***************************************************************************************/ + +// 8 BIT PARALLEL BUS +#ifdef CONFIG_TFT_PARALLEL_8_BIT + + #define TFT_PARALLEL_8_BIT + + #if CONFIG_TFT_D0 == -1 + #error "Invalid Data 0 pin. Check TFT_eSPI configuration" + #else + #define TFT_D0 CONFIG_TFT_D0 + #endif + + #if CONFIG_TFT_D1 == -1 + #error "Invalid Data 1 pin. Check TFT_eSPI configuration" + #else + #define TFT_D1 CONFIG_TFT_D1 + #endif + + #if CONFIG_TFT_D2 == -1 + #error "Invalid Data 2 pin. Check TFT_eSPI configuration" + #else + #define TFT_D2 CONFIG_TFT_D2 + #endif + + #if CONFIG_TFT_D3 == -1 + #error "Invalid Data 3 pin. Check TFT_eSPI configuration" + #else + #define TFT_D3 CONFIG_TFT_D3 + #endif + + #if CONFIG_TFT_D4 == -1 + #error "Invalid Data 4 pin. Check TFT_eSPI configuration" + #else + #define TFT_D4 CONFIG_TFT_D4 + #endif + + #if CONFIG_TFT_D5 == -1 + #error "Invalid Data 5 pin. Check TFT_eSPI configuration" + #else + #define TFT_D5 CONFIG_TFT_D5 + #endif + + #if CONFIG_TFT_D6 == -1 + #error "Invalid Data 6 pin. Check TFT_eSPI configuration" + #else + #define TFT_D6 CONFIG_TFT_D6 + #endif + + #if CONFIG_TFT_D7 == -1 + #error "Invalid Data 7 pin. Check TFT_eSPI configuration" + #else + #define TFT_D7 CONFIG_TFT_D7 + #endif + + #if CONFIG_TFT_WR == -1 + #error "Invalid Write strobe pin. Check TFT_eSPI configuration" + #else + #define TFT_WR CONFIG_TFT_WR + #endif + + #if CONFIG_TFT_RD == -1 + #error "Invalid Read strobe pin. Check TFT_eSPI configuration" + #else + #define TFT_RD CONFIG_TFT_RD + #endif + +// SPI BUS +#else + #if CONFIG_TFT_HSPI_PORT + #define USE_HSPI_PORT + #endif + + #if CONFIG_TFT_MISO != -1 + #define TFT_MISO CONFIG_TFT_MISO + #endif + + #if CONFIG_TFT_MOSI == -1 + #error "Invalid MOSI pin. Check TFT_eSPI configuration" + #else + #define TFT_MOSI CONFIG_TFT_MOSI + #endif + + #if CONFIG_TFT_SCLK == -1 + #error "Invalid Clock pin. Check TFT_eSPI configuration" + #else + #define TFT_SCLK CONFIG_TFT_SCLK + #endif + + #define SPI_FREQUENCY CONFIG_TFT_SPI_FREQUENCY + + #if CONFIG_TFT_SPI_READ_FREQ != -1 + #define SPI_READ_FREQUENCY CONFIG_TFT_SPI_READ_FREQ + #endif + + #ifdef CONFIG_TFT_SDA_READ + #define TFT_SDA_READ + #endif +#endif + + +/*************************************************************************************** +** Section 4: Setup Fonts +***************************************************************************************/ + +#ifdef CONFIG_TFT_LOAD_GLCD + #define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#endif + +#ifdef CONFIG_TFT_LOAD_FONT2 + #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#endif + +#ifdef CONFIG_TFT_LOAD_FONT4 + #define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#endif + +#ifdef CONFIG_TFT_LOAD_FONT6 + #define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#endif + +#ifdef CONFIG_TFT_LOAD_FONT7 + #define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#endif + +#ifdef CONFIG_TFT_LOAD_FONT8 + #define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#endif + +#ifdef CONFIG_TFT_LOAD_GFXFF + #define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#endif + +#if CONFIG_TFT_SMOOTH_FONT + #define SMOOTH_FONT +#endif + +/*************************************************************************************** +** Section 5: Touchscreen configuration +***************************************************************************************/ + +#ifdef CONFIG_ENABLE_TOUCH + #if CONFIG_TOUCH_CS == -1 + #error "Invalid Touch Chip Select pin. Check TFT_eSPI configuration" + #else + #define TOUCH_CS CONFIG_TOUCH_CS + #endif + + #define SPI_TOUCH_FREQUENCY CONFIG_SPI_TOUCH_FREQUENCY +#endif + +#endif // TFT_CONFIG_H diff --git a/libraries/TFT_eSPI/TFT_eSPI.cpp b/libraries/TFT_eSPI/TFT_eSPI.cpp new file mode 100644 index 0000000..d537fae --- /dev/null +++ b/libraries/TFT_eSPI/TFT_eSPI.cpp @@ -0,0 +1,6158 @@ +/*************************************************** + Arduino TFT graphics library targeted at 32-bit + processors such as ESP32, ESP8266 and STM32. + + This is a stand-alone library that contains the + hardware driver, the graphics functions and the + proportional fonts. + + The larger fonts are Run Length Encoded to reduce their + size. + + Created by Bodmer 2/12/16 + Last update by Bodmer 20/03/20 + ****************************************************/ + +#include "TFT_eSPI.h" + +#if defined (ESP32) + #if defined(CONFIG_IDF_TARGET_ESP32S3) + #include "Processors/TFT_eSPI_ESP32_S3.c" // Tested with SPI and 8-bit parallel + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + #include "Processors/TFT_eSPI_ESP32_C3.c" // Tested with SPI (8-bit parallel will probably work too!) + #else + #include "Processors/TFT_eSPI_ESP32.c" + #endif +#elif defined (ARDUINO_ARCH_ESP8266) + #include "Processors/TFT_eSPI_ESP8266.c" +#elif defined (STM32) // (_VARIANT_ARDUINO_STM32_) stm32_def.h + #include "Processors/TFT_eSPI_STM32.c" +#elif defined (ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED) // Raspberry Pi Pico + #include "Processors/TFT_eSPI_RP2040.c" +#else + #include "Processors/TFT_eSPI_Generic.c" +#endif + +#ifndef SPI_BUSY_CHECK + #define SPI_BUSY_CHECK +#endif + +// Clipping macro for pushImage +#define PI_CLIP \ + if (_vpOoB) return; \ + x+= _xDatum; \ + y+= _yDatum; \ + \ + if ((x >= _vpW) || (y >= _vpH)) return; \ + \ + int32_t dx = 0; \ + int32_t dy = 0; \ + int32_t dw = w; \ + int32_t dh = h; \ + \ + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } \ + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } \ + \ + if ((x + dw) > _vpW ) dw = _vpW - x; \ + if ((y + dh) > _vpH ) dh = _vpH - y; \ + \ + if (dw < 1 || dh < 1) return; + +/*************************************************************************************** +** Function name: Legacy - deprecated +** Description: Start/end transaction +***************************************************************************************/ + void TFT_eSPI::spi_begin() {begin_tft_write();} + void TFT_eSPI::spi_end() { end_tft_write();} + void TFT_eSPI::spi_begin_read() {begin_tft_read(); } + void TFT_eSPI::spi_end_read() { end_tft_read(); } + +/*************************************************************************************** +** Function name: begin_tft_write (was called spi_begin) +** Description: Start SPI transaction for writes and select TFT +***************************************************************************************/ +inline void TFT_eSPI::begin_tft_write(void){ + if (locked) { + locked = false; // Flag to show SPI access now unlocked +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, TFT_SPI_MODE)); +#endif + CS_L; + SET_BUS_WRITE_MODE; // Some processors (e.g. ESP32) allow recycling the tx buffer when rx is not used + } +} + +// Non-inlined version to permit override +void TFT_eSPI::begin_nin_write(void){ + if (locked) { + locked = false; // Flag to show SPI access now unlocked +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, TFT_SPI_MODE)); +#endif + CS_L; + SET_BUS_WRITE_MODE; // Some processors (e.g. ESP32) allow recycling the tx buffer when rx is not used + } +} + +/*************************************************************************************** +** Function name: end_tft_write (was called spi_end) +** Description: End transaction for write and deselect TFT +***************************************************************************************/ +inline void TFT_eSPI::end_tft_write(void){ + if(!inTransaction) { // Flag to stop ending transaction during multiple graphics calls + if (!locked) { // Locked when beginTransaction has been called + locked = true; // Flag to show SPI access now locked + SPI_BUSY_CHECK; // Check send complete and clean out unused rx data + CS_H; + SET_BUS_READ_MODE; // In case bus has been configured for tx only +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.endTransaction(); +#endif + } + } +} + +// Non-inlined version to permit override +inline void TFT_eSPI::end_nin_write(void){ + if(!inTransaction) { // Flag to stop ending transaction during multiple graphics calls + if (!locked) { // Locked when beginTransaction has been called + locked = true; // Flag to show SPI access now locked + SPI_BUSY_CHECK; // Check send complete and clean out unused rx data + CS_H; + SET_BUS_READ_MODE; // In case SPI has been configured for tx only +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.endTransaction(); +#endif + } + } +} + +/*************************************************************************************** +** Function name: begin_tft_read (was called spi_begin_read) +** Description: Start transaction for reads and select TFT +***************************************************************************************/ +// Reads require a lower SPI clock rate than writes +inline void TFT_eSPI::begin_tft_read(void){ + DMA_BUSY_CHECK; // Wait for any DMA transfer to complete before changing SPI settings +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + if (locked) { + locked = false; + spi.beginTransaction(SPISettings(SPI_READ_FREQUENCY, MSBFIRST, TFT_SPI_MODE)); + CS_L; + } +#else + #if !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.setFrequency(SPI_READ_FREQUENCY); + #endif + CS_L; +#endif + SET_BUS_READ_MODE; +} + +/*************************************************************************************** +** Function name: end_tft_read (was called spi_end_read) +** Description: End transaction for reads and deselect TFT +***************************************************************************************/ +inline void TFT_eSPI::end_tft_read(void){ +#if defined (SPI_HAS_TRANSACTION) && defined (SUPPORT_TRANSACTIONS) && !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + if(!inTransaction) { + if (!locked) { + locked = true; + CS_H; + spi.endTransaction(); + } + } +#else + #if !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + spi.setFrequency(SPI_FREQUENCY); + #endif + if(!inTransaction) {CS_H;} +#endif + SET_BUS_WRITE_MODE; +} + +/*************************************************************************************** +** Function name: setViewport +** Description: Set the clipping region for the TFT screen +***************************************************************************************/ +void TFT_eSPI::setViewport(int32_t x, int32_t y, int32_t w, int32_t h, bool vpDatum) +{ + // Viewport metrics (not clipped) + _xDatum = x; // Datum x position in screen coordinates + _yDatum = y; // Datum y position in screen coordinates + _xWidth = w; // Viewport width + _yHeight = h; // Viewport height + + // Full size default viewport + _vpDatum = false; // Datum is at top left corner of screen (true = top left of viewport) + _vpOoB = false; // Out of Bounds flag (true is all of viewport is off screen) + _vpX = 0; // Viewport top left corner x coordinate + _vpY = 0; // Viewport top left corner y coordinate + _vpW = width(); // Equivalent of TFT width (Nb: viewport right edge coord + 1) + _vpH = height(); // Equivalent of TFT height (Nb: viewport bottom edge coord + 1) + + // Clip viewport to screen area + if (x<0) { w += x; x = 0; } + if (y<0) { h += y; y = 0; } + if ((x + w) > width() ) { w = width() - x; } + if ((y + h) > height() ) { h = height() - y; } + + //Serial.print(" x=");Serial.print( x);Serial.print(", y=");Serial.print( y); + //Serial.print(", w=");Serial.print(w);Serial.print(", h=");Serial.println(h); + + // Check if viewport is entirely out of bounds + if (w < 1 || h < 1) + { + // Set default values and Out of Bounds flag in case of error + _xDatum = 0; + _yDatum = 0; + _xWidth = width(); + _yHeight = height(); + _vpOoB = true; // Set Out of Bounds flag to inhibit all drawing + return; + } + + if (!vpDatum) + { + _xDatum = 0; // Reset to top left of screen if not using a viewport datum + _yDatum = 0; + _xWidth = width(); + _yHeight = height(); + } + + // Store the clipped screen viewport metrics and datum position + _vpX = x; + _vpY = y; + _vpW = x + w; + _vpH = y + h; + _vpDatum = vpDatum; + + //Serial.print(" _xDatum=");Serial.print( _xDatum);Serial.print(", _yDatum=");Serial.print( _yDatum); + //Serial.print(", _xWidth=");Serial.print(_xWidth);Serial.print(", _yHeight=");Serial.println(_yHeight); + + //Serial.print(" _vpX=");Serial.print( _vpX);Serial.print(", _vpY=");Serial.print( _vpY); + //Serial.print(", _vpW=");Serial.print(_vpW);Serial.print(", _vpH=");Serial.println(_vpH); +} + +/*************************************************************************************** +** Function name: checkViewport +** Description: Check if any part of specified area is visible in viewport +***************************************************************************************/ +// Note: Setting w and h to 1 will check if coordinate x,y is in area +bool TFT_eSPI::checkViewport(int32_t x, int32_t y, int32_t w, int32_t h) +{ + if (_vpOoB) return false; + x+= _xDatum; + y+= _yDatum; + + if ((x >= _vpW) || (y >= _vpH)) return false; + + int32_t dx = 0; + int32_t dy = 0; + int32_t dw = w; + int32_t dh = h; + + if (x < _vpX) { dx = _vpX - x; dw -= dx; x = _vpX; } + if (y < _vpY) { dy = _vpY - y; dh -= dy; y = _vpY; } + + if ((x + dw) > _vpW ) dw = _vpW - x; + if ((y + dh) > _vpH ) dh = _vpH - y; + + if (dw < 1 || dh < 1) return false; + + return true; +} + +/*************************************************************************************** +** Function name: resetViewport +** Description: Reset viewport to whole TFT screen, datum at 0,0 +***************************************************************************************/ +void TFT_eSPI::resetViewport(void) +{ + // Reset viewport to the whole screen (or sprite) area + _vpDatum = false; + _vpOoB = false; + _xDatum = 0; + _yDatum = 0; + _vpX = 0; + _vpY = 0; + _vpW = width(); + _vpH = height(); + _xWidth = width(); + _yHeight = height(); +} + +/*************************************************************************************** +** Function name: getViewportX +** Description: Get x position of the viewport datum +***************************************************************************************/ +int32_t TFT_eSPI::getViewportX(void) +{ + return _xDatum; +} + +/*************************************************************************************** +** Function name: getViewportY +** Description: Get y position of the viewport datum +***************************************************************************************/ +int32_t TFT_eSPI::getViewportY(void) +{ + return _yDatum; +} + +/*************************************************************************************** +** Function name: getViewportWidth +** Description: Get width of the viewport +***************************************************************************************/ +int32_t TFT_eSPI::getViewportWidth(void) +{ + return _xWidth; +} + +/*************************************************************************************** +** Function name: getViewportHeight +** Description: Get height of the viewport +***************************************************************************************/ +int32_t TFT_eSPI::getViewportHeight(void) +{ + return _yHeight; +} + +/*************************************************************************************** +** Function name: getViewportDatum +** Description: Get datum flag of the viewport (true = viewport corner) +***************************************************************************************/ +bool TFT_eSPI::getViewportDatum(void) +{ + return _vpDatum; +} + +/*************************************************************************************** +** Function name: frameViewport +** Description: Draw a frame inside or outside the viewport of width w +***************************************************************************************/ +void TFT_eSPI::frameViewport(uint16_t color, int32_t w) +{ + // Save datum position + bool _dT = _vpDatum; + + // If w is positive the frame is drawn inside the viewport + // a large positive width will clear the screen inside the viewport + if (w>0) + { + // Set vpDatum true to simplify coordinate derivation + _vpDatum = true; + fillRect(0, 0, _vpW - _vpX, w, color); // Top + fillRect(0, w, w, _vpH - _vpY - w - w, color); // Left + fillRect(_xWidth - w, w, w, _yHeight - w - w, color); // Right + fillRect(0, _yHeight - w, _xWidth, w, color); // Bottom + } + else + // If w is negative the frame is drawn outside the viewport + // a large negative width will clear the screen outside the viewport + { + w = -w; + + // Save old values + int32_t _xT = _vpX; _vpX = 0; + int32_t _yT = _vpY; _vpY = 0; + int32_t _wT = _vpW; + int32_t _hT = _vpH; + + // Set vpDatum false so frame can be drawn outside window + _vpDatum = false; // When false the full width and height is accessed + _vpH = height(); + _vpW = width(); + + // Draw frame + fillRect(_xT - w - _xDatum, _yT - w - _yDatum, _wT - _xT + w + w, w, color); // Top + fillRect(_xT - w - _xDatum, _yT - _yDatum, w, _hT - _yT, color); // Left + fillRect(_wT - _xDatum, _yT - _yDatum, w, _hT - _yT, color); // Right + fillRect(_xT - w - _xDatum, _hT - _yDatum, _wT - _xT + w + w, w, color); // Bottom + + // Restore old values + _vpX = _xT; + _vpY = _yT; + _vpW = _wT; + _vpH = _hT; + } + + // Restore vpDatum + _vpDatum = _dT; +} + +/*************************************************************************************** +** Function name: clipAddrWindow +** Description: Clip address window x,y,w,h to screen and viewport +***************************************************************************************/ +bool TFT_eSPI::clipAddrWindow(int32_t *x, int32_t *y, int32_t *w, int32_t *h) +{ + if (_vpOoB) return false; // Area is outside of viewport + + *x+= _xDatum; + *y+= _yDatum; + + if ((*x >= _vpW) || (*y >= _vpH)) return false; // Area is outside of viewport + + // Crop drawing area bounds + if (*x < _vpX) { *w -= _vpX - *x; *x = _vpX; } + if (*y < _vpY) { *h -= _vpY - *y; *y = _vpY; } + + if ((*x + *w) > _vpW ) *w = _vpW - *x; + if ((*y + *h) > _vpH ) *h = _vpH - *y; + + if (*w < 1 || *h < 1) return false; // No area is inside viewport + + return true; // Area is wholly or partially inside viewport +} + +/*************************************************************************************** +** Function name: clipWindow +** Description: Clip window xs,yx,xe,ye to screen and viewport +***************************************************************************************/ +bool TFT_eSPI::clipWindow(int32_t *xs, int32_t *ys, int32_t *xe, int32_t *ye) +{ + if (_vpOoB) return false; // Area is outside of viewport + + *xs+= _xDatum; + *ys+= _yDatum; + *xe+= _xDatum; + *ye+= _yDatum; + + if ((*xs >= _vpW) || (*ys >= _vpH)) return false; // Area is outside of viewport + if ((*xe < _vpX) || (*ye < _vpY)) return false; // Area is outside of viewport + + // Crop drawing area bounds + if (*xs < _vpX) *xs = _vpX; + if (*ys < _vpY) *ys = _vpY; + + if (*xe > _vpW) *xe = _vpW - 1; + if (*ye > _vpH) *ye = _vpH - 1; + + return true; // Area is wholly or partially inside viewport +} + +/*************************************************************************************** +** Function name: TFT_eSPI +** Description: Constructor , we must use hardware SPI pins +***************************************************************************************/ +TFT_eSPI::TFT_eSPI(int16_t w, int16_t h) +{ + _init_width = _width = w; // Set by specific xxxxx_Defines.h file or by users sketch + _init_height = _height = h; // Set by specific xxxxx_Defines.h file or by users sketch + + // Reset the viewport to the whole screen + resetViewport(); + + rotation = 0; + cursor_y = cursor_x = last_cursor_x = bg_cursor_x = 0; + textfont = 1; + textsize = 1; + textcolor = bitmap_fg = 0xFFFF; // White + textbgcolor = bitmap_bg = 0x0000; // Black + padX = 0; // No padding + + _fillbg = false; // Smooth font only at the moment, force text background fill + + isDigits = false; // No bounding box adjustment + textwrapX = true; // Wrap text at end of line when using print stream + textwrapY = false; // Wrap text at bottom of screen when using print stream + textdatum = TL_DATUM; // Top Left text alignment is default + fontsloaded = 0; + + _swapBytes = false; // Do not swap colour bytes by default + + locked = true; // Transaction mutex lock flag to ensure begin/endTranaction pairing + inTransaction = false; // Flag to prevent multiple sequential functions to keep bus access open + lockTransaction = false; // start/endWrite lock flag to allow sketch to keep SPI bus access open + + _booted = true; // Default attributes + _cp437 = false; // Legacy GLCD font bug fix disabled by default + _utf8 = true; // UTF8 decoding enabled + +#if defined (FONT_FS_AVAILABLE) && defined (SMOOTH_FONT) + fs_font = true; // Smooth font filing system or array (fs_font = false) flag +#endif + +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if (psramFound()) _psram_enable = true; // Enable the use of PSRAM (if available) + else +#endif + _psram_enable = false; + + addr_row = 0xFFFF; // drawPixel command length optimiser + addr_col = 0xFFFF; // drawPixel command length optimiser + + _xPivot = 0; + _yPivot = 0; + +// Legacy support for bit GPIO masks + cspinmask = 0; + dcpinmask = 0; + wrpinmask = 0; + sclkpinmask = 0; + +// Flags for which fonts are loaded +#ifdef LOAD_GLCD + fontsloaded = 0x0002; // Bit 1 set +#endif + +#ifdef LOAD_FONT2 + fontsloaded |= 0x0004; // Bit 2 set +#endif + +#ifdef LOAD_FONT4 + fontsloaded |= 0x0010; // Bit 4 set +#endif + +#ifdef LOAD_FONT6 + fontsloaded |= 0x0040; // Bit 6 set +#endif + +#ifdef LOAD_FONT7 + fontsloaded |= 0x0080; // Bit 7 set +#endif + +#ifdef LOAD_FONT8 + fontsloaded |= 0x0100; // Bit 8 set +#endif + +#ifdef LOAD_FONT8N + fontsloaded |= 0x0200; // Bit 9 set +#endif + +#ifdef SMOOTH_FONT + fontsloaded |= 0x8000; // Bit 15 set +#endif +} + +/*************************************************************************************** +** Function name: initBus +** Description: initialise the SPI or parallel bus +***************************************************************************************/ +void TFT_eSPI::initBus(void) { + +#ifdef TFT_CS + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } +#endif + +// Configure chip select for touchscreen controller if present +#ifdef TOUCH_CS + if (TOUCH_CS >= 0) { + pinMode(TOUCH_CS, OUTPUT); + digitalWrite(TOUCH_CS, HIGH); // Chip select high (inactive) + } +#endif + +// In parallel mode and with the RP2040 processor, the TFT_WR line is handled in the PIO +#if defined (TFT_WR) && !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED) + if (TFT_WR >= 0) { + pinMode(TFT_WR, OUTPUT); + digitalWrite(TFT_WR, HIGH); // Set write strobe high (inactive) + } +#endif + +#ifdef TFT_DC + if (TFT_DC >= 0) { + pinMode(TFT_DC, OUTPUT); + digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } +#endif + +#ifdef TFT_RST + if (TFT_RST >= 0) { + pinMode(TFT_RST, OUTPUT); + digitalWrite(TFT_RST, HIGH); // Set high, do not share pin with another SPI device + } +#endif + +#if defined (TFT_PARALLEL_8_BIT) + + // Make sure read is high before we set the bus to output + if (TFT_RD >= 0) { + pinMode(TFT_RD, OUTPUT); + digitalWrite(TFT_RD, HIGH); + } + + #if !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED)// PIO manages pins + // Set TFT data bus lines to output + pinMode(TFT_D0, OUTPUT); digitalWrite(TFT_D0, HIGH); + pinMode(TFT_D1, OUTPUT); digitalWrite(TFT_D1, HIGH); + pinMode(TFT_D2, OUTPUT); digitalWrite(TFT_D2, HIGH); + pinMode(TFT_D3, OUTPUT); digitalWrite(TFT_D3, HIGH); + pinMode(TFT_D4, OUTPUT); digitalWrite(TFT_D4, HIGH); + pinMode(TFT_D5, OUTPUT); digitalWrite(TFT_D5, HIGH); + pinMode(TFT_D6, OUTPUT); digitalWrite(TFT_D6, HIGH); + pinMode(TFT_D7, OUTPUT); digitalWrite(TFT_D7, HIGH); + #endif + + PARALLEL_INIT_TFT_DATA_BUS; + +#endif +} + +/*************************************************************************************** +** Function name: begin +** Description: Included for backwards compatibility +***************************************************************************************/ +void TFT_eSPI::begin(uint8_t tc) +{ + init(tc); +} + + +/*************************************************************************************** +** Function name: init (tc is tab colour for ST7735 displays only) +** Description: Reset, then initialise the TFT display registers +***************************************************************************************/ +void TFT_eSPI::init(uint8_t tc) +{ + if (_booted) + { + initBus(); + +#if !defined (ESP32) && !defined(TFT_PARALLEL_8_BIT) && !defined(ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED) + // Legacy bitmasks for GPIO + #if defined (TFT_CS) && (TFT_CS >= 0) + cspinmask = (uint32_t) digitalPinToBitMask(TFT_CS); + #endif + + #if defined (TFT_DC) && (TFT_DC >= 0) + dcpinmask = (uint32_t) digitalPinToBitMask(TFT_DC); + #endif + + #if defined (TFT_WR) && (TFT_WR >= 0) + wrpinmask = (uint32_t) digitalPinToBitMask(TFT_WR); + #endif + + #if defined (TFT_SCLK) && (TFT_SCLK >= 0) + sclkpinmask = (uint32_t) digitalPinToBitMask(TFT_SCLK); + #endif + + #if defined (TFT_SPI_OVERLAP) && defined (ARDUINO_ARCH_ESP8266) + // Overlap mode SD0=MISO, SD1=MOSI, CLK=SCLK must use D3 as CS + // pins(int8_t sck, int8_t miso, int8_t mosi, int8_t ss); + //spi.pins( 6, 7, 8, 0); + spi.pins(6, 7, 8, 0); + #endif + + spi.begin(); // This will set HMISO to input + +#else + #if !defined(TFT_PARALLEL_8_BIT) && !defined(RP2040_PIO_INTERFACE) + #if defined (TFT_MOSI) && !defined (TFT_SPI_OVERLAP) && !defined(ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED) + spi.begin(TFT_SCLK, TFT_MISO, TFT_MOSI, -1); // This will set MISO to input + #else + spi.begin(); // This will set MISO to input + #endif + #endif +#endif + lockTransaction = false; + inTransaction = false; + locked = true; + + INIT_TFT_DATA_BUS; + + +#if defined (TFT_CS) && !defined(RP2040_PIO_INTERFACE) + // Set to output once again in case MISO is used for CS + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } +#elif defined (ARDUINO_ARCH_ESP8266) && !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_SPI) + spi.setHwCs(1); // Use hardware SS toggling +#endif + + + // Set to output once again in case MISO is used for DC +#if defined (TFT_DC) && !defined(RP2040_PIO_INTERFACE) + if (TFT_DC >= 0) { + pinMode(TFT_DC, OUTPUT); + digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } +#endif + + _booted = false; + end_tft_write(); + } // end of: if just _booted + + // Toggle RST low to reset +#ifdef TFT_RST + #if !defined(RP2040_PIO_INTERFACE) + // Set to output once again in case MISO is used for TFT_RST + if (TFT_RST >= 0) { + pinMode(TFT_RST, OUTPUT); + } + #endif + if (TFT_RST >= 0) { + writecommand(0x00); // Put SPI bus in known state for TFT with CS tied low + digitalWrite(TFT_RST, HIGH); + delay(5); + digitalWrite(TFT_RST, LOW); + delay(20); + digitalWrite(TFT_RST, HIGH); + } + else writecommand(TFT_SWRST); // Software reset +#else + writecommand(TFT_SWRST); // Software reset +#endif + + delay(150); // Wait for reset to complete + + begin_tft_write(); + + tc = tc; // Suppress warning + + // This loads the driver specific initialisation code <<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVERS TO THE LIST HERE <<<<<<<<<<<<<<<<<<<<<<< +#if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9342_DRIVER) + #include "TFT_Drivers/ILI9341_Init.h" + +#elif defined (ST7735_DRIVER) + tabcolor = tc; + #include "TFT_Drivers/ST7735_Init.h" + +#elif defined (ILI9163_DRIVER) + #include "TFT_Drivers/ILI9163_Init.h" + +#elif defined (S6D02A1_DRIVER) + #include "TFT_Drivers/S6D02A1_Init.h" + +#elif defined (ST7796_DRIVER) + #include "TFT_Drivers/ST7796_Init.h" + +#elif defined (ILI9486_DRIVER) + #include "TFT_Drivers/ILI9486_Init.h" + +#elif defined (ILI9481_DRIVER) + #include "TFT_Drivers/ILI9481_Init.h" + +#elif defined (ILI9488_DRIVER) + #include "TFT_Drivers/ILI9488_Init.h" + +#elif defined (HX8357D_DRIVER) + #include "TFT_Drivers/HX8357D_Init.h" + +#elif defined (ST7789_DRIVER) + #include "TFT_Drivers/ST7789_Init.h" + +#elif defined (R61581_DRIVER) + #include "TFT_Drivers/R61581_Init.h" + +#elif defined (RM68140_DRIVER) + #include "TFT_Drivers/RM68140_Init.h" + +#elif defined (ST7789_2_DRIVER) + #include "TFT_Drivers/ST7789_2_Init.h" + +#elif defined (SSD1351_DRIVER) + #include "TFT_Drivers/SSD1351_Init.h" + +#elif defined (SSD1963_DRIVER) + #include "TFT_Drivers/SSD1963_Init.h" + +#elif defined (GC9A01_DRIVER) + #include "TFT_Drivers/GC9A01_Init.h" + +#elif defined (ILI9225_DRIVER) + #include "TFT_Drivers/ILI9225_Init.h" + +#elif defined (RM68120_DRIVER) + #include "TFT_Drivers/RM68120_Init.h" + +#elif defined (HX8357B_DRIVER) + #include "TFT_Drivers/HX8357B_Init.h" + +#elif defined (HX8357C_DRIVER) + #include "TFT_Drivers/HX8357C_Init.h" + +#endif + +#ifdef TFT_INVERSION_ON + writecommand(TFT_INVON); +#endif + +#ifdef TFT_INVERSION_OFF + writecommand(TFT_INVOFF); +#endif + + end_tft_write(); + + setRotation(rotation); + +#if defined (TFT_BL) && defined (TFT_BACKLIGHT_ON) + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); + } +#else + #if defined (TFT_BL) && defined (M5STACK) + // Turn on the back-light LED + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, HIGH); + } + #endif +#endif +} + + +/*************************************************************************************** +** Function name: setRotation +** Description: rotate the screen orientation m = 0-3 or 4-7 for BMP drawing +***************************************************************************************/ +void TFT_eSPI::setRotation(uint8_t m) +{ + + begin_tft_write(); + + // This loads the driver specific rotation code <<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVERS TO THE LIST HERE <<<<<<<<<<<<<<<<<<<<<<< +#if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9342_DRIVER) + #include "TFT_Drivers/ILI9341_Rotation.h" + +#elif defined (ST7735_DRIVER) + #include "TFT_Drivers/ST7735_Rotation.h" + +#elif defined (ILI9163_DRIVER) + #include "TFT_Drivers/ILI9163_Rotation.h" + +#elif defined (S6D02A1_DRIVER) + #include "TFT_Drivers/S6D02A1_Rotation.h" + +#elif defined (ST7796_DRIVER) + #include "TFT_Drivers/ST7796_Rotation.h" + +#elif defined (ILI9486_DRIVER) + #include "TFT_Drivers/ILI9486_Rotation.h" + +#elif defined (ILI9481_DRIVER) + #include "TFT_Drivers/ILI9481_Rotation.h" + +#elif defined (ILI9488_DRIVER) + #include "TFT_Drivers/ILI9488_Rotation.h" + +#elif defined (HX8357D_DRIVER) + #include "TFT_Drivers/HX8357D_Rotation.h" + +#elif defined (ST7789_DRIVER) + #include "TFT_Drivers/ST7789_Rotation.h" + +#elif defined (R61581_DRIVER) + #include "TFT_Drivers/R61581_Rotation.h" + +#elif defined (RM68140_DRIVER) + #include "TFT_Drivers/RM68140_Rotation.h" + +#elif defined (ST7789_2_DRIVER) + #include "TFT_Drivers/ST7789_2_Rotation.h" + +#elif defined (SSD1351_DRIVER) + #include "TFT_Drivers/SSD1351_Rotation.h" + +#elif defined (SSD1963_DRIVER) + #include "TFT_Drivers/SSD1963_Rotation.h" + +#elif defined (GC9A01_DRIVER) + #include "TFT_Drivers/GC9A01_Rotation.h" + +#elif defined (ILI9225_DRIVER) + #include "TFT_Drivers/ILI9225_Rotation.h" + +#elif defined (RM68120_DRIVER) + #include "TFT_Drivers/RM68120_Rotation.h" + +#elif defined (HX8357B_DRIVER) + #include "TFT_Drivers/HX8357B_Rotation.h" + +#elif defined (HX8357C_DRIVER) + #include "TFT_Drivers/HX8357C_Rotation.h" + +#endif + + delayMicroseconds(10); + + end_tft_write(); + + addr_row = 0xFFFF; + addr_col = 0xFFFF; + + // Reset the viewport to the whole screen + resetViewport(); +} + + +/*************************************************************************************** +** Function name: getRotation +** Description: Return the rotation value (as used by setRotation()) +***************************************************************************************/ +uint8_t TFT_eSPI::getRotation(void) +{ + return rotation; +} + + +/*************************************************************************************** +** Function name: setOrigin +** Description: Set graphics origin to position x,y wrt to top left corner +***************************************************************************************/ +//Note: setRotation, setViewport and resetViewport will revert origin to top left +void TFT_eSPI::setOrigin(int32_t x, int32_t y) +{ + _xDatum = x; + _yDatum = y; +} + + +/*************************************************************************************** +** Function name: getOriginX +** Description: Set graphics origin to position x +***************************************************************************************/ +int32_t TFT_eSPI::getOriginX(void) +{ + return _xDatum; +} + + +/*************************************************************************************** +** Function name: getOriginY +** Description: Set graphics origin to position y +***************************************************************************************/ +int32_t TFT_eSPI::getOriginY(void) +{ + return _yDatum; +} + + +/*************************************************************************************** +** Function name: commandList, used for FLASH based lists only (e.g. ST7735) +** Description: Get initialisation commands from FLASH and send to TFT +***************************************************************************************/ +void TFT_eSPI::commandList (const uint8_t *addr) +{ + uint8_t numCommands; + uint8_t numArgs; + uint8_t ms; + + numCommands = pgm_read_byte(addr++); // Number of commands to follow + + while (numCommands--) // For each command... + { + writecommand(pgm_read_byte(addr++)); // Read, issue command + numArgs = pgm_read_byte(addr++); // Number of args to follow + ms = numArgs & TFT_INIT_DELAY; // If high bit set, delay follows args + numArgs &= ~TFT_INIT_DELAY; // Mask out delay bit + + while (numArgs--) // For each argument... + { + writedata(pgm_read_byte(addr++)); // Read, issue argument + } + + if (ms) + { + ms = pgm_read_byte(addr++); // Read post-command delay time (ms) + delay( (ms==255 ? 500 : ms) ); + } + } + +} + + +/*************************************************************************************** +** Function name: spiwrite +** Description: Write 8 bits to SPI port (legacy support only) +***************************************************************************************/ +void TFT_eSPI::spiwrite(uint8_t c) +{ + begin_tft_write(); + tft_Write_8(c); + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: writecommand +** Description: Send an 8-bit command to the TFT +***************************************************************************************/ +#ifndef RM68120_DRIVER +void TFT_eSPI::writecommand(uint8_t c) +{ + begin_tft_write(); + + DC_C; + + tft_Write_8(c); + + DC_D; + + end_tft_write(); +} +#else +void TFT_eSPI::writecommand(uint16_t c) +{ + begin_tft_write(); + + DC_C; + + tft_Write_16(c); + + DC_D; + + end_tft_write(); + +} +void TFT_eSPI::writeRegister8(uint16_t c, uint8_t d) +{ + begin_tft_write(); + + DC_C; + + tft_Write_16(c); + + DC_D; + + tft_Write_8(d); + + end_tft_write(); + +} +void TFT_eSPI::writeRegister16(uint16_t c, uint16_t d) +{ + begin_tft_write(); + + DC_C; + + tft_Write_16(c); + + DC_D; + + tft_Write_16(d); + + end_tft_write(); + +} + +#endif + +/*************************************************************************************** +** Function name: writedata +** Description: Send a 8-bit data value to the TFT +***************************************************************************************/ +void TFT_eSPI::writedata(uint8_t d) +{ + begin_tft_write(); + + DC_D; // Play safe, but should already be in data mode + + tft_Write_8(d); + + CS_L; // Allow more hold time for low VDI rail + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: readcommand8 +** Description: Read a 8-bit data value from an indexed command register +***************************************************************************************/ +uint8_t TFT_eSPI::readcommand8(uint8_t cmd_function, uint8_t index) +{ + uint8_t reg = 0; +#if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) + + writecommand(cmd_function); // Sets DC and CS high + + busDir(GPIO_DIR_MASK, INPUT); + + CS_L; + + // Read nth parameter (assumes caller discards 1st parameter or points index to 2nd) + while(index--) reg = readByte(); + + busDir(GPIO_DIR_MASK, OUTPUT); + + CS_H; + +#else // SPI interface + // Tested with ILI9341 set to Interface II i.e. IM [3:0] = "1101" + begin_tft_read(); + index = 0x10 + (index & 0x0F); + + DC_C; tft_Write_8(0xD9); + DC_D; tft_Write_8(index); + + CS_H; // Some displays seem to need CS to be pulsed here, or is just a delay needed? + CS_L; + + DC_C; tft_Write_8(cmd_function); + DC_D; + reg = tft_Read_8(); + + end_tft_read(); +#endif + return reg; +} + + +/*************************************************************************************** +** Function name: readcommand16 +** Description: Read a 16-bit data value from an indexed command register +***************************************************************************************/ +uint16_t TFT_eSPI::readcommand16(uint8_t cmd_function, uint8_t index) +{ + uint32_t reg; + + reg = (readcommand8(cmd_function, index + 0) << 8); + reg |= (readcommand8(cmd_function, index + 1) << 0); + + return reg; +} + + +/*************************************************************************************** +** Function name: readcommand32 +** Description: Read a 32-bit data value from an indexed command register +***************************************************************************************/ +uint32_t TFT_eSPI::readcommand32(uint8_t cmd_function, uint8_t index) +{ + uint32_t reg; + + reg = ((uint32_t)readcommand8(cmd_function, index + 0) << 24); + reg |= ((uint32_t)readcommand8(cmd_function, index + 1) << 16); + reg |= ((uint32_t)readcommand8(cmd_function, index + 2) << 8); + reg |= ((uint32_t)readcommand8(cmd_function, index + 3) << 0); + + return reg; +} + + +/*************************************************************************************** +** Function name: read pixel (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read 565 pixel colours from a pixel +***************************************************************************************/ +uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0) +{ + if (_vpOoB) return 0; + + x0+= _xDatum; + y0+= _yDatum; + + // Range checking + if ((x0 < _vpX) || (y0 < _vpY) ||(x0 >= _vpW) || (y0 >= _vpH)) return 0; + +#if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) + + if (!inTransaction) { CS_L; } // CS_L can be multi-statement + + readAddrWindow(x0, y0, 1, 1); + + // Set masked pins D0- D7 to input + busDir(GPIO_DIR_MASK, INPUT); + + #if !defined (SSD1963_DRIVER) + // Dummy read to throw away don't care value + readByte(); + #endif + + // Fetch the 16-bit BRG pixel + //uint16_t rgb = (readByte() << 8) | readByte(); + + #if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9488_DRIVER) || defined (SSD1963_DRIVER)// Read 3 bytes + + // Read window pixel 24-bit RGB values and fill in LS bits + uint16_t rgb = ((readByte() & 0xF8) << 8) | ((readByte() & 0xFC) << 3) | (readByte() >> 3); + + if (!inTransaction) { CS_H; } // CS_H can be multi-statement + + // Set masked pins D0- D7 to output + busDir(GPIO_DIR_MASK, OUTPUT); + + return rgb; + + #else // ILI9481 or ILI9486 16-bit read + + // Fetch the 16-bit BRG pixel + uint16_t bgr = (readByte() << 8) | readByte(); + + if (!inTransaction) { CS_H; } // CS_H can be multi-statement + + // Set masked pins D0- D7 to output + busDir(GPIO_DIR_MASK, OUTPUT); + + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) + return bgr; + #else + // Swap Red and Blue (could check MADCTL setting to see if this is needed) + return (bgr>>11) | (bgr<<11) | (bgr & 0x7E0); + #endif + + #endif + +#else // Not TFT_PARALLEL_8_BIT + + // This function can get called during anti-aliased font rendering + // so a transaction may be in progress + bool wasInTransaction = inTransaction; + if (inTransaction) { inTransaction= false; end_tft_write();} + + uint16_t color = 0; + + begin_tft_read(); // Sets CS low + + readAddrWindow(x0, y0, 1, 1); + + #ifdef TFT_SDA_READ + begin_SDA_Read(); + #endif + + // Dummy read to throw away don't care value + tft_Read_8(); + + //#if !defined (ILI9488_DRIVER) + + #if defined (ST7796_DRIVER) + // Read the 2 bytes + color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); + #else + // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8(); + uint8_t g = tft_Read_8(); + uint8_t b = tft_Read_8(); + color = color565(r, g, b); + #endif + +/* + #else + + // The 6 colour bits are in MS 6 bits of each byte, but the ILI9488 needs an extra clock pulse + // so bits appear shifted right 1 bit, so mask the middle 6 bits then shift 1 place left + uint8_t r = (tft_Read_8()&0x7E)<<1; + uint8_t g = (tft_Read_8()&0x7E)<<1; + uint8_t b = (tft_Read_8()&0x7E)<<1; + color = color565(r, g, b); + + #endif +*/ + CS_H; + + #ifdef TFT_SDA_READ + end_SDA_Read(); + #endif + + end_tft_read(); + + // Reinstate the transaction if one was in progress + if(wasInTransaction) { begin_tft_write(); inTransaction = true; } + + return color; + +#endif +} + +void TFT_eSPI::setCallback(getColorCallback getCol) +{ + getColor = getCol; +} + + +/*************************************************************************************** +** Function name: read rectangle (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read 565 pixel colours from a defined area +***************************************************************************************/ +void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) +{ + PI_CLIP ; + +#if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) + + CS_L; + + readAddrWindow(x, y, dw, dh); + + data += dx + dy * w; + + // Set masked pins D0- D7 to input + busDir(GPIO_DIR_MASK, INPUT); + + #if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9488_DRIVER) // Read 3 bytes + // Dummy read to throw away don't care value + readByte(); + + // Fetch the 24-bit RGB value + while (dh--) { + int32_t lw = dw; + uint16_t* line = data; + while (lw--) { + // Assemble the RGB 16-bit colour + uint16_t rgb = ((readByte() & 0xF8) << 8) | ((readByte() & 0xFC) << 3) | (readByte() >> 3); + + // Swapped byte order for compatibility with pushRect() + *line++ = (rgb<<8) | (rgb>>8); + } + data += w; + } + + #elif defined (SSD1963_DRIVER) + // Fetch the 18-bit BRG pixels + while (dh--) { + int32_t lw = dw; + uint16_t* line = data; + while (lw--) { + uint16_t bgr = ((readByte() & 0xF8) >> 3);; // CS_L adds a small delay + bgr |= ((readByte() & 0xFC) << 3); + bgr |= (readByte() << 8); + // Swap Red and Blue (could check MADCTL setting to see if this is needed) + uint16_t rgb = (bgr>>11) | (bgr<<11) | (bgr & 0x7E0); + // Swapped byte order for compatibility with pushRect() + *line++ = (rgb<<8) | (rgb>>8); + } + data += w; + } + + #else // ILI9481 reads as 16 bits + // Dummy read to throw away don't care value + readByte(); + + // Fetch the 16-bit BRG pixels + while (dh--) { + int32_t lw = dw; + uint16_t* line = data; + while (lw--) { + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) + // Read the RGB 16-bit colour + *line++ = readByte() | (readByte() << 8); + #else + // Read the BRG 16-bit colour + uint16_t bgr = (readByte() << 8) | readByte(); + // Swap Red and Blue (could check MADCTL setting to see if this is needed) + uint16_t rgb = (bgr>>11) | (bgr<<11) | (bgr & 0x7E0); + // Swapped byte order for compatibility with pushRect() + *line++ = (rgb<<8) | (rgb>>8); + #endif + } + data += w; + } + #endif + + CS_H; + + // Set masked pins D0- D7 to output + busDir(GPIO_DIR_MASK, OUTPUT); + +#else // SPI interface + + // This function can get called after a begin_tft_write + // so a transaction may be in progress + bool wasInTransaction = inTransaction; + if (inTransaction) { inTransaction= false; end_tft_write();} + + uint16_t color = 0; + + begin_tft_read(); + + readAddrWindow(x, y, dw, dh); + + data += dx + dy * w; + + #ifdef TFT_SDA_READ + begin_SDA_Read(); + #endif + + // Dummy read to throw away don't care value + tft_Read_8(); + + // Read window pixel 24-bit RGB values + while (dh--) { + int32_t lw = dw; + uint16_t* line = data; + while (lw--) { + + #if !defined (ILI9488_DRIVER) + + #if defined (ST7796_DRIVER) + // Read the 2 bytes + color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); + #else + // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8(); + uint8_t g = tft_Read_8(); + uint8_t b = tft_Read_8(); + color = color565(r, g, b); + #endif + + #else + + // The 6 colour bits are in MS 6 bits of each byte but we do not include the extra clock pulse + // so we use a trick and mask the middle 6 bits of the byte, then only shift 1 place left + uint8_t r = (tft_Read_8()&0x7E)<<1; + uint8_t g = (tft_Read_8()&0x7E)<<1; + uint8_t b = (tft_Read_8()&0x7E)<<1; + color = color565(r, g, b); + #endif + + // Swapped colour byte order for compatibility with pushRect() + *line++ = color << 8 | color >> 8; + } + data += w; + } + + //CS_H; + + #ifdef TFT_SDA_READ + end_SDA_Read(); + #endif + + end_tft_read(); + + // Reinstate the transaction if one was in progress + if(wasInTransaction) { begin_tft_write(); inTransaction = true; } +#endif +} + + +/*************************************************************************************** +** Function name: push rectangle +** Description: push 565 pixel colours into a defined area +***************************************************************************************/ +void TFT_eSPI::pushRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) +{ + bool swap = _swapBytes; _swapBytes = false; + pushImage(x, y, w, h, data); + _swapBytes = swap; +} + + +/*************************************************************************************** +** Function name: pushImage +** Description: plot 16-bit colour sprite or image onto TFT +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) +{ + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + + setWindow(x, y, x + dw - 1, y + dh - 1); + + data += dx + dy * w; + + // Check if whole image can be pushed + if (dw == w) pushPixels(data, dw * dh); + else { + // Push line segments to crop image + while (dh--) + { + pushPixels(data, dw); + data += w; + } + } + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: pushImage +** Description: plot 16-bit sprite or image with 1 colour being transparent +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transp) +{ + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + + data += dx + dy * w; + + + uint16_t lineBuf[dw]; // Use buffer to minimise setWindow call count + + // The little endian transp color must be byte swapped if the image is big endian + if (!_swapBytes) transp = transp >> 8 | transp << 8; + + while (dh--) + { + int32_t len = dw; + uint16_t* ptr = data; + int32_t px = x, sx = x; + bool move = true; + uint16_t np = 0; + + while (len--) + { + if (transp != *ptr) + { + if (move) { move = false; sx = px; } + lineBuf[np] = *ptr; + np++; + } + else + { + move = true; + if (np) + { + setWindow(sx, y, sx + np - 1, y); + pushPixels((uint16_t*)lineBuf, np); + np = 0; + } + } + px++; + ptr++; + } + if (np) { setWindow(sx, y, sx + np - 1, y); pushPixels((uint16_t*)lineBuf, np); } + + y++; + data += w; + } + + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: pushImage - for FLASH (PROGMEM) stored images +** Description: plot 16-bit image +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data) +{ + // Requires 32-bit aligned access, so use PROGMEM 16-bit word functions + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + + data += dx + dy * w; + + uint16_t buffer[dw]; + + setWindow(x, y, x + dw - 1, y + dh - 1); + + // Fill and send line buffers to TFT + for (int32_t i = 0; i < dh; i++) { + for (int32_t j = 0; j < dw; j++) { + buffer[j] = pgm_read_word(&data[i * w + j]); + } + pushPixels(buffer, dw); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: pushImage - for FLASH (PROGMEM) stored images +** Description: plot 16-bit image with 1 colour being transparent +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transp) +{ + // Requires 32-bit aligned access, so use PROGMEM 16-bit word functions + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + + data += dx + dy * w; + + + uint16_t lineBuf[dw]; + + // The little endian transp color must be byte swapped if the image is big endian + if (!_swapBytes) transp = transp >> 8 | transp << 8; + + while (dh--) { + int32_t len = dw; + uint16_t* ptr = (uint16_t*)data; + int32_t px = x, sx = x; + bool move = true; + + uint16_t np = 0; + + while (len--) { + uint16_t color = pgm_read_word(ptr); + if (transp != color) { + if (move) { move = false; sx = px; } + lineBuf[np] = color; + np++; + } + else { + move = true; + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushPixels(lineBuf, np); + np = 0; + } + } + px++; + ptr++; + } + if (np) { setWindow(sx, y, sx + np - 1, y); pushPixels(lineBuf, np); } + + y++; + data += w; + } + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: pushImage +** Description: plot 8-bit or 4-bit or 1 bit image or sprite using a line buffer +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap) +{ + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + bool swap = _swapBytes; + + setWindow(x, y, x + dw - 1, y + dh - 1); // Sets CS low and sent RAMWR + + // Line buffer makes plotting faster + uint16_t lineBuf[dw]; + + if (bpp8) + { + _swapBytes = false; + + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table + + _lastColor = -1; // Set to illegal value + + // Used to store last shifted colour + uint8_t msbColor = 0; + uint8_t lsbColor = 0; + + data += dx + dy * w; + while (dh--) { + uint32_t len = dw; + uint8_t* ptr = (uint8_t*)data; + uint8_t* linePtr = (uint8_t*)lineBuf; + + while(len--) { + uint32_t color = pgm_read_byte(ptr++); + + // Shifts are slow so check if colour has changed first + if (color != _lastColor) { + // =====Green===== ===============Red============== + msbColor = (color & 0x1C)>>2 | (color & 0xC0)>>3 | (color & 0xE0); + // =====Green===== =======Blue====== + lsbColor = (color & 0x1C)<<3 | blue[color & 0x03]; + _lastColor = color; + } + + *linePtr++ = msbColor; + *linePtr++ = lsbColor; + } + + pushPixels(lineBuf, dw); + + data += w; + } + _swapBytes = swap; // Restore old value + } + else if (cmap != nullptr) // Must be 4bpp + { + _swapBytes = true; + + w = (w+1) & 0xFFFE; // if this is a sprite, w will already be even; this does no harm. + bool splitFirst = (dx & 0x01) != 0; // split first means we have to push a single px from the left of the sprite / image + + if (splitFirst) { + data += ((dx - 1 + dy * w) >> 1); + } + else { + data += ((dx + dy * w) >> 1); + } + + while (dh--) { + uint32_t len = dw; + uint8_t * ptr = (uint8_t*)data; + uint16_t *linePtr = lineBuf; + uint8_t colors; // two colors in one byte + uint16_t index; + + if (splitFirst) { + colors = pgm_read_byte(ptr); + index = (colors & 0x0F); + *linePtr++ = cmap[index]; + len--; + ptr++; + } + + while (len--) + { + colors = pgm_read_byte(ptr); + index = ((colors & 0xF0) >> 4) & 0x0F; + *linePtr++ = cmap[index]; + + if (len--) + { + index = colors & 0x0F; + *linePtr++ = cmap[index]; + } else { + break; // nothing to do here + } + + ptr++; + } + + pushPixels(lineBuf, dw); + data += (w >> 1); + } + _swapBytes = swap; // Restore old value + } + else // Must be 1bpp + { + _swapBytes = false; + uint8_t * ptr = (uint8_t*)data; + uint32_t ww = (w+7)>>3; // Width of source image line in bytes + for (int32_t yp = dy; yp < dy + dh; yp++) + { + uint8_t* linePtr = (uint8_t*)lineBuf; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t col = (pgm_read_byte(ptr + (xp>>3)) & (0x80 >> (xp & 0x7)) ); + if (col) {*linePtr++ = bitmap_fg>>8; *linePtr++ = (uint8_t) bitmap_fg;} + else {*linePtr++ = bitmap_bg>>8; *linePtr++ = (uint8_t) bitmap_bg;} + } + ptr += ww; + pushPixels(lineBuf, dw); + } + } + + _swapBytes = swap; // Restore old value + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: pushImage +** Description: plot 8-bit or 4-bit or 1 bit image or sprite using a line buffer +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8, uint16_t *cmap) +{ + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + bool swap = _swapBytes; + + setWindow(x, y, x + dw - 1, y + dh - 1); // Sets CS low and sent RAMWR + + // Line buffer makes plotting faster + uint16_t lineBuf[dw]; + + if (bpp8) + { + _swapBytes = false; + + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table + + _lastColor = -1; // Set to illegal value + + // Used to store last shifted colour + uint8_t msbColor = 0; + uint8_t lsbColor = 0; + + data += dx + dy * w; + while (dh--) { + uint32_t len = dw; + uint8_t* ptr = data; + uint8_t* linePtr = (uint8_t*)lineBuf; + + while(len--) { + uint32_t color = *ptr++; + + // Shifts are slow so check if colour has changed first + if (color != _lastColor) { + // =====Green===== ===============Red============== + msbColor = (color & 0x1C)>>2 | (color & 0xC0)>>3 | (color & 0xE0); + // =====Green===== =======Blue====== + lsbColor = (color & 0x1C)<<3 | blue[color & 0x03]; + _lastColor = color; + } + + *linePtr++ = msbColor; + *linePtr++ = lsbColor; + } + + pushPixels(lineBuf, dw); + + data += w; + } + _swapBytes = swap; // Restore old value + } + else if (cmap != nullptr) // Must be 4bpp + { + _swapBytes = true; + + w = (w+1) & 0xFFFE; // if this is a sprite, w will already be even; this does no harm. + bool splitFirst = (dx & 0x01) != 0; // split first means we have to push a single px from the left of the sprite / image + + if (splitFirst) { + data += ((dx - 1 + dy * w) >> 1); + } + else { + data += ((dx + dy * w) >> 1); + } + + while (dh--) { + uint32_t len = dw; + uint8_t * ptr = data; + uint16_t *linePtr = lineBuf; + uint8_t colors; // two colors in one byte + uint16_t index; + + if (splitFirst) { + colors = *ptr; + index = (colors & 0x0F); + *linePtr++ = cmap[index]; + len--; + ptr++; + } + + while (len--) + { + colors = *ptr; + index = ((colors & 0xF0) >> 4) & 0x0F; + *linePtr++ = cmap[index]; + + if (len--) + { + index = colors & 0x0F; + *linePtr++ = cmap[index]; + } else { + break; // nothing to do here + } + + ptr++; + } + + pushPixels(lineBuf, dw); + data += (w >> 1); + } + _swapBytes = swap; // Restore old value + } + else // Must be 1bpp + { + _swapBytes = false; + + uint32_t ww = (w+7)>>3; // Width of source image line in bytes + for (int32_t yp = dy; yp < dy + dh; yp++) + { + uint8_t* linePtr = (uint8_t*)lineBuf; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + uint16_t col = (data[(xp>>3)] & (0x80 >> (xp & 0x7)) ); + if (col) {*linePtr++ = bitmap_fg>>8; *linePtr++ = (uint8_t) bitmap_fg;} + else {*linePtr++ = bitmap_bg>>8; *linePtr++ = (uint8_t) bitmap_bg;} + } + data += ww; + pushPixels(lineBuf, dw); + } + } + + _swapBytes = swap; // Restore old value + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: pushImage +** Description: plot 8 or 4 or 1 bit image or sprite with a transparent colour +***************************************************************************************/ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transp, bool bpp8, uint16_t *cmap) +{ + PI_CLIP; + + begin_tft_write(); + inTransaction = true; + bool swap = _swapBytes; + + + // Line buffer makes plotting faster + uint16_t lineBuf[dw]; + + if (bpp8) { // 8 bits per pixel + _swapBytes = false; + + data += dx + dy * w; + + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table + + _lastColor = -1; // Set to illegal value + + // Used to store last shifted colour + uint8_t msbColor = 0; + uint8_t lsbColor = 0; + + while (dh--) { + int32_t len = dw; + uint8_t* ptr = data; + uint8_t* linePtr = (uint8_t*)lineBuf; + + int32_t px = x, sx = x; + bool move = true; + uint16_t np = 0; + + while (len--) { + if (transp != *ptr) { + if (move) { move = false; sx = px; } + uint8_t color = *ptr; + + // Shifts are slow so check if colour has changed first + if (color != _lastColor) { + // =====Green===== ===============Red============== + msbColor = (color & 0x1C)>>2 | (color & 0xC0)>>3 | (color & 0xE0); + // =====Green===== =======Blue====== + lsbColor = (color & 0x1C)<<3 | blue[color & 0x03]; + _lastColor = color; + } + *linePtr++ = msbColor; + *linePtr++ = lsbColor; + np++; + } + else { + move = true; + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushPixels(lineBuf, np); + linePtr = (uint8_t*)lineBuf; + np = 0; + } + } + px++; + ptr++; + } + + if (np) { setWindow(sx, y, sx + np - 1, y); pushPixels(lineBuf, np); } + y++; + data += w; + } + } + else if (cmap != nullptr) // 4bpp with color map + { + _swapBytes = true; + + w = (w+1) & 0xFFFE; // here we try to recreate iwidth from dwidth. + bool splitFirst = ((dx & 0x01) != 0); + if (splitFirst) { + data += ((dx - 1 + dy * w) >> 1); + } + else { + data += ((dx + dy * w) >> 1); + } + + while (dh--) { + uint32_t len = dw; + uint8_t * ptr = data; + + int32_t px = x, sx = x; + bool move = true; + uint16_t np = 0; + + uint8_t index; // index into cmap. + + if (splitFirst) { + index = (*ptr & 0x0F); // odd = bits 3 .. 0 + if (index != transp) { + move = false; sx = px; + lineBuf[np] = cmap[index]; + np++; + } + px++; ptr++; + len--; + } + + while (len--) + { + uint8_t color = *ptr; + + // find the actual color you care about. There will be two pixels here! + // but we may only want one at the end of the row + uint16_t index = ((color & 0xF0) >> 4) & 0x0F; // high bits are the even numbers + if (index != transp) { + if (move) { + move = false; sx = px; + } + lineBuf[np] = cmap[index]; + np++; // added a pixel + } + else { + move = true; + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushPixels(lineBuf, np); + np = 0; + } + } + px++; + + if (len--) + { + index = color & 0x0F; // the odd number is 3 .. 0 + if (index != transp) { + if (move) { + move = false; sx = px; + } + lineBuf[np] = cmap[index]; + np++; + } + else { + move = true; + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushPixels(lineBuf, np); + np = 0; + } + } + px++; + } + else { + break; // we are done with this row. + } + ptr++; // we only increment ptr once in the loop (deliberate) + } + + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushPixels(lineBuf, np); + np = 0; + } + data += (w>>1); + y++; + } + } + else { // 1 bit per pixel + _swapBytes = false; + + uint32_t ww = (w+7)>>3; // Width of source image line in bytes + uint16_t np = 0; + + for (int32_t yp = dy; yp < dy + dh; yp++) + { + int32_t px = x, sx = x; + bool move = true; + for (int32_t xp = dx; xp < dx + dw; xp++) + { + if (data[(xp>>3)] & (0x80 >> (xp & 0x7))) { + if (move) { + move = false; + sx = px; + } + np++; + } + else { + move = true; + if (np) { + setWindow(sx, y, sx + np - 1, y); + pushBlock(bitmap_fg, np); + np = 0; + } + } + px++; + } + if (np) { setWindow(sx, y, sx + np - 1, y); pushBlock(bitmap_fg, np); np = 0; } + y++; + data += ww; + } + } + _swapBytes = swap; // Restore old value + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: pushMaskedImage +** Description: Render a 16-bit colour image to TFT with a 1bpp mask +***************************************************************************************/ +// Can be used with a 16bpp sprite and a 1bpp sprite for the mask +void TFT_eSPI::pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *img, uint8_t *mask) +{ + if (_vpOoB || w < 1 || h < 1) return; + + // To simplify mask handling the window clipping is done by the pushImage function + // Each mask image line assumed to be padded to an integer number of bytes & padding bits are 0 + + begin_tft_write(); + inTransaction = true; + + uint8_t *mptr = mask; + uint8_t *eptr = mask + ((w + 7) >> 3); + uint16_t *iptr = img; + uint32_t setCount = 0; + + // For each line in the image + while (h--) { + uint32_t xp = 0; + uint32_t clearCount = 0; + uint8_t mbyte= *mptr++; + uint32_t bits = 8; + // Scan through each byte of the bitmap and determine run lengths + do { + setCount = 0; + + //Get run length for clear bits to determine x offset + while ((mbyte & 0x80) == 0x00) { + // Check if remaining bits in byte are clear (reduce shifts) + if (mbyte == 0) { + clearCount += bits; // bits not always 8 here + if (mptr >= eptr) break; // end of line + mbyte = *mptr++; + bits = 8; + continue; + } + mbyte = mbyte << 1; // 0's shifted in + clearCount ++; + if (--bits) continue;; + if (mptr >= eptr) break; + mbyte = *mptr++; + bits = 8; + } + + //Get run length for set bits to determine render width + while ((mbyte & 0x80) == 0x80) { + // Check if all bits are set (reduces shifts) + if (mbyte == 0xFF) { + setCount += bits; + if (mptr >= eptr) break; + mbyte = *mptr++; + //bits = 8; // NR, bits always 8 here unless 1's shifted in + continue; + } + mbyte = mbyte << 1; //or mbyte += mbyte + 1 to shift in 1's + setCount ++; + if (--bits) continue; + if (mptr >= eptr) break; + mbyte = *mptr++; + bits = 8; + } + + // A mask boundary or mask end has been found, so render the pixel line + if (setCount) { + xp += clearCount; + clearCount = 0; + pushImage(x + xp, y, setCount, 1, iptr + xp); // pushImage handles clipping + if (mptr >= eptr) break; + xp += setCount; + } + } while (setCount || mptr < eptr); + + y++; + iptr += w; + eptr += ((w + 7) >> 3); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: setSwapBytes +** Description: Used by 16-bit pushImage() to swap byte order in colours +***************************************************************************************/ +void TFT_eSPI::setSwapBytes(bool swap) +{ + _swapBytes = swap; +} + + +/*************************************************************************************** +** Function name: getSwapBytes +** Description: Return the swap byte order for colours +***************************************************************************************/ +bool TFT_eSPI::getSwapBytes(void) +{ + return _swapBytes; +} + + +/*************************************************************************************** +** Function name: read rectangle (for SPI Interface II i.e. IM [3:0] = "1101") +** Description: Read RGB pixel colours from a defined area +***************************************************************************************/ +// If w and h are 1, then 1 pixel is read, *data array size must be 3 bytes per pixel +void TFT_eSPI::readRectRGB(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data) +{ +#if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) + + uint32_t len = w * h; + uint8_t* buf565 = data + len; + + readRect(x0, y0, w, h, (uint16_t*)buf565); + + while (len--) { + uint16_t pixel565 = (*buf565++)<<8; + pixel565 |= *buf565++; + uint8_t red = (pixel565 & 0xF800) >> 8; red |= red >> 5; + uint8_t green = (pixel565 & 0x07E0) >> 3; green |= green >> 6; + uint8_t blue = (pixel565 & 0x001F) << 3; blue |= blue >> 5; + *data++ = red; + *data++ = green; + *data++ = blue; + } + +#else // Not TFT_PARALLEL_8_BIT + + begin_tft_read(); + + readAddrWindow(x0, y0, w, h); // Sets CS low + + #ifdef TFT_SDA_READ + begin_SDA_Read(); + #endif + + // Dummy read to throw away don't care value + tft_Read_8(); + + // Read window pixel 24-bit RGB values, buffer must be set in sketch to 3 * w * h + uint32_t len = w * h; + while (len--) { + + #if !defined (ILI9488_DRIVER) + + // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte + // as the TFT stores colours as 18 bits + *data++ = tft_Read_8(); + *data++ = tft_Read_8(); + *data++ = tft_Read_8(); + + #else + + // The 6 colour bits are in MS 6 bits of each byte, but the ILI9488 needs an extra clock pulse + // so bits appear shifted right 1 bit, so mask the middle 6 bits then shift 1 place left + *data++ = (tft_Read_8()&0x7E)<<1; + *data++ = (tft_Read_8()&0x7E)<<1; + *data++ = (tft_Read_8()&0x7E)<<1; + + #endif + + } + + CS_H; + + #ifdef TFT_SDA_READ + end_SDA_Read(); + #endif + + end_tft_read(); + +#endif +} + + +/*************************************************************************************** +** Function name: drawCircle +** Description: Draw a circle outline +***************************************************************************************/ +// Optimised midpoint circle algorithm +void TFT_eSPI::drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) +{ + if ( r <= 0 ) return; + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t f = 1 - r; + int32_t ddF_y = -2 * r; + int32_t ddF_x = 1; + int32_t xs = -1; + int32_t xe = 0; + int32_t len = 0; + + bool first = true; + do { + while (f < 0) { + ++xe; + f += (ddF_x += 2); + } + f += (ddF_y += 2); + + if (xe-xs>1) { + if (first) { + len = 2*(xe - xs)-1; + drawFastHLine(x0 - xe, y0 + r, len, color); + drawFastHLine(x0 - xe, y0 - r, len, color); + drawFastVLine(x0 + r, y0 - xe, len, color); + drawFastVLine(x0 - r, y0 - xe, len, color); + first = false; + } + else { + len = xe - xs++; + drawFastHLine(x0 - xe, y0 + r, len, color); + drawFastHLine(x0 - xe, y0 - r, len, color); + drawFastHLine(x0 + xs, y0 - r, len, color); + drawFastHLine(x0 + xs, y0 + r, len, color); + + drawFastVLine(x0 + r, y0 + xs, len, color); + drawFastVLine(x0 + r, y0 - xe, len, color); + drawFastVLine(x0 - r, y0 - xe, len, color); + drawFastVLine(x0 - r, y0 + xs, len, color); + } + } + else { + ++xs; + drawPixel(x0 - xe, y0 + r, color); + drawPixel(x0 - xe, y0 - r, color); + drawPixel(x0 + xs, y0 - r, color); + drawPixel(x0 + xs, y0 + r, color); + + drawPixel(x0 + r, y0 + xs, color); + drawPixel(x0 + r, y0 - xe, color); + drawPixel(x0 - r, y0 - xe, color); + drawPixel(x0 - r, y0 + xs, color); + } + xs = xe; + } while (xe < --r); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawCircleHelper +** Description: Support function for drawRoundRect() +***************************************************************************************/ +void TFT_eSPI::drawCircleHelper( int32_t x0, int32_t y0, int32_t rr, uint8_t cornername, uint32_t color) +{ + if (rr <= 0) return; + int32_t f = 1 - rr; + int32_t ddF_x = 1; + int32_t ddF_y = -2 * rr; + int32_t xe = 0; + int32_t xs = 0; + int32_t len = 0; + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + do + { + while (f < 0) { + ++xe; + f += (ddF_x += 2); + } + f += (ddF_y += 2); + + if (xe-xs==1) { + if (cornername & 0x1) { // left top + drawPixel(x0 - xe, y0 - rr, color); + drawPixel(x0 - rr, y0 - xe, color); + } + if (cornername & 0x2) { // right top + drawPixel(x0 + rr , y0 - xe, color); + drawPixel(x0 + xs + 1, y0 - rr, color); + } + if (cornername & 0x4) { // right bottom + drawPixel(x0 + xs + 1, y0 + rr , color); + drawPixel(x0 + rr, y0 + xs + 1, color); + } + if (cornername & 0x8) { // left bottom + drawPixel(x0 - rr, y0 + xs + 1, color); + drawPixel(x0 - xe, y0 + rr , color); + } + } + else { + len = xe - xs++; + if (cornername & 0x1) { // left top + drawFastHLine(x0 - xe, y0 - rr, len, color); + drawFastVLine(x0 - rr, y0 - xe, len, color); + } + if (cornername & 0x2) { // right top + drawFastVLine(x0 + rr, y0 - xe, len, color); + drawFastHLine(x0 + xs, y0 - rr, len, color); + } + if (cornername & 0x4) { // right bottom + drawFastHLine(x0 + xs, y0 + rr, len, color); + drawFastVLine(x0 + rr, y0 + xs, len, color); + } + if (cornername & 0x8) { // left bottom + drawFastVLine(x0 - rr, y0 + xs, len, color); + drawFastHLine(x0 - xe, y0 + rr, len, color); + } + } + xs = xe; + } while (xe < rr--); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + +/*************************************************************************************** +** Function name: fillCircle +** Description: draw a filled circle +***************************************************************************************/ +// Optimised midpoint circle algorithm, changed to horizontal lines (faster in sprites) +// Improved algorithm avoids repetition of lines +void TFT_eSPI::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) +{ + int32_t x = 0; + int32_t dx = 1; + int32_t dy = r+r; + int32_t p = -(r>>1); + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + drawFastHLine(x0 - r, y0, dy+1, color); + + while(x=0) { + drawFastHLine(x0 - x, y0 + r, dx, color); + drawFastHLine(x0 - x, y0 - r, dx, color); + dy-=2; + p-=dy; + r--; + } + + dx+=2; + p+=dx; + x++; + + drawFastHLine(x0 - r, y0 + x, dy+1, color); + drawFastHLine(x0 - r, y0 - x, dy+1, color); + + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + +/*************************************************************************************** +** Function name: fillCircleHelper +** Description: Support function for fillRoundRect() +***************************************************************************************/ +// Support drawing roundrects, changed to horizontal lines (faster in sprites) +void TFT_eSPI::fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, int32_t delta, uint32_t color) +{ + int32_t f = 1 - r; + int32_t ddF_x = 1; + int32_t ddF_y = -r - r; + int32_t y = 0; + + delta++; + + while (y < r) { + if (f >= 0) { + if (cornername & 0x1) drawFastHLine(x0 - y, y0 + r, y + y + delta, color); + if (cornername & 0x2) drawFastHLine(x0 - y, y0 - r, y + y + delta, color); + r--; + ddF_y += 2; + f += ddF_y; + } + + y++; + ddF_x += 2; + f += ddF_x; + + if (cornername & 0x1) drawFastHLine(x0 - r, y0 + y, r + r + delta, color); + if (cornername & 0x2) drawFastHLine(x0 - r, y0 - y, r + r + delta, color); + } +} + + +/*************************************************************************************** +** Function name: drawEllipse +** Description: Draw a ellipse outline +***************************************************************************************/ +void TFT_eSPI::drawEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) +{ + if (rx<2) return; + if (ry<2) return; + int32_t x, y; + int32_t rx2 = rx * rx; + int32_t ry2 = ry * ry; + int32_t fx2 = 4 * rx2; + int32_t fy2 = 4 * ry2; + int32_t s; + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) { + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + x, y0 - y, color); + if (s >= 0) { + s += fx2 * (1 - y); + y--; + } + s += ry2 * ((4 * x) + 6); + } + + for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) { + // These are ordered to minimise coordinate changes in x or y + // drawPixel can then send fewer bounding box commands + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + x, y0 - y, color); + if (s >= 0) + { + s += fy2 * (1 - x); + x--; + } + s += rx2 * ((4 * y) + 6); + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: fillEllipse +** Description: draw a filled ellipse +***************************************************************************************/ +void TFT_eSPI::fillEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) +{ + if (rx<2) return; + if (ry<2) return; + int32_t x, y; + int32_t rx2 = rx * rx; + int32_t ry2 = ry * ry; + int32_t fx2 = 4 * rx2; + int32_t fy2 = 4 * ry2; + int32_t s; + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) { + drawFastHLine(x0 - x, y0 - y, x + x + 1, color); + drawFastHLine(x0 - x, y0 + y, x + x + 1, color); + + if (s >= 0) { + s += fx2 * (1 - y); + y--; + } + s += ry2 * ((4 * x) + 6); + } + + for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) { + drawFastHLine(x0 - x, y0 - y, x + x + 1, color); + drawFastHLine(x0 - x, y0 + y, x + x + 1, color); + + if (s >= 0) { + s += fy2 * (1 - x); + x--; + } + s += rx2 * ((4 * y) + 6); + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: fillScreen +** Description: Clear the screen to defined colour +***************************************************************************************/ +void TFT_eSPI::fillScreen(uint32_t color) +{ + fillRect(0, 0, _width, _height, color); +} + + +/*************************************************************************************** +** Function name: drawRect +** Description: Draw a rectangle outline +***************************************************************************************/ +// Draw a rectangle +void TFT_eSPI::drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + drawFastHLine(x, y, w, color); + drawFastHLine(x, y + h - 1, w, color); + // Avoid drawing corner pixels twice + drawFastVLine(x, y+1, h-2, color); + drawFastVLine(x + w - 1, y+1, h-2, color); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawRoundRect +** Description: Draw a rounded corner rectangle outline +***************************************************************************************/ +// Draw a rounded rectangle +void TFT_eSPI::drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + // smarter version + drawFastHLine(x + r , y , w - r - r, color); // Top + drawFastHLine(x + r , y + h - 1, w - r - r, color); // Bottom + drawFastVLine(x , y + r , h - r - r, color); // Left + drawFastVLine(x + w - 1, y + r , h - r - r, color); // Right + // draw four corners + drawCircleHelper(x + r , y + r , r, 1, color); + drawCircleHelper(x + w - r - 1, y + r , r, 2, color); + drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); + drawCircleHelper(x + r , y + h - r - 1, r, 8, color); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: fillRoundRect +** Description: Draw a rounded corner filled rectangle +***************************************************************************************/ +// Fill a rounded rectangle, changed to horizontal lines (faster in sprites) +void TFT_eSPI::fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + // smarter version + fillRect(x, y + r, w, h - r - r, color); + + // draw four corners + fillCircleHelper(x + r, y + h - r - 1, r, 1, w - r - r - 1, color); + fillCircleHelper(x + r , y + r, r, 2, w - r - r - 1, color); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawTriangle +** Description: Draw a triangle outline using 3 arbitrary points +***************************************************************************************/ +// Draw a triangle +void TFT_eSPI::drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + drawLine(x0, y0, x1, y1, color); + drawLine(x1, y1, x2, y2, color); + drawLine(x2, y2, x0, y0, color); + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: fillTriangle +** Description: Draw a filled triangle using 3 arbitrary points +***************************************************************************************/ +// Fill a triangle - original Adafruit function works well and code footprint is small +void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) +{ + int32_t a, b, y, last; + + // Sort coordinates by Y order (y2 >= y1 >= y0) + if (y0 > y1) { + transpose(y0, y1); transpose(x0, x1); + } + if (y1 > y2) { + transpose(y2, y1); transpose(x2, x1); + } + if (y0 > y1) { + transpose(y0, y1); transpose(x0, x1); + } + + if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing + a = b = x0; + if (x1 < a) a = x1; + else if (x1 > b) b = x1; + if (x2 < a) a = x2; + else if (x2 > b) b = x2; + drawFastHLine(a, y0, b - a + 1, color); + return; + } + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t + dx01 = x1 - x0, + dy01 = y1 - y0, + dx02 = x2 - x0, + dy02 = y2 - y0, + dx12 = x2 - x1, + dy12 = y2 - y1, + sa = 0, + sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y1 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y0=y1 + // (flat-topped triangle). + if (y1 == y2) last = y1; // Include y1 scanline + else last = y1 - 1; // Skip it + + for (y = y0; y <= last; y++) { + a = x0 + sa / dy01; + b = x0 + sb / dy02; + sa += dx01; + sb += dx02; + + if (a > b) transpose(a, b); + drawFastHLine(a, y, b - a + 1, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y1=y2. + sa = dx12 * (y - y1); + sb = dx02 * (y - y0); + for (; y <= y2; y++) { + a = x1 + sa / dy12; + b = x0 + sb / dy02; + sa += dx12; + sb += dx02; + + if (a > b) transpose(a, b); + drawFastHLine(a, y, b - a + 1, color); + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawBitmap +** Description: Draw an image stored in an array on the TFT +***************************************************************************************/ +void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t i, j, byteWidth = (w + 7) / 8; + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++ ) { + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { + drawPixel(x + i, y + j, color); + } + } + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawBitmap +** Description: Draw an image stored in an array on the TFT +***************************************************************************************/ +void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t i, j, byteWidth = (w + 7) / 8; + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++ ) { + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) + drawPixel(x + i, y + j, fgcolor); + else drawPixel(x + i, y + j, bgcolor); + } + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + +/*************************************************************************************** +** Function name: drawXBitmap +** Description: Draw an image stored in an XBM array onto the TFT +***************************************************************************************/ +void TFT_eSPI::drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t i, j, byteWidth = (w + 7) / 8; + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++ ) { + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (1 << (i & 7))) { + drawPixel(x + i, y + j, color); + } + } + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: drawXBitmap +** Description: Draw an XBM image with foreground and background colors +***************************************************************************************/ +void TFT_eSPI::drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bgcolor) +{ + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + int32_t i, j, byteWidth = (w + 7) / 8; + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++ ) { + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (1 << (i & 7))) + drawPixel(x + i, y + j, color); + else drawPixel(x + i, y + j, bgcolor); + } + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function +} + + +/*************************************************************************************** +** Function name: setCursor +** Description: Set the text cursor x,y position +***************************************************************************************/ +void TFT_eSPI::setCursor(int16_t x, int16_t y) +{ + cursor_x = x; + cursor_y = y; +} + + +/*************************************************************************************** +** Function name: setCursor +** Description: Set the text cursor x,y position and font +***************************************************************************************/ +void TFT_eSPI::setCursor(int16_t x, int16_t y, uint8_t font) +{ + setTextFont(font); + cursor_x = x; + cursor_y = y; +} + + +/*************************************************************************************** +** Function name: getCursorX +** Description: Get the text cursor x position +***************************************************************************************/ +int16_t TFT_eSPI::getCursorX(void) +{ + return cursor_x; +} + +/*************************************************************************************** +** Function name: getCursorY +** Description: Get the text cursor y position +***************************************************************************************/ +int16_t TFT_eSPI::getCursorY(void) +{ + return cursor_y; +} + + +/*************************************************************************************** +** Function name: setTextSize +** Description: Set the text size multiplier +***************************************************************************************/ +void TFT_eSPI::setTextSize(uint8_t s) +{ + if (s>7) s = 7; // Limit the maximum size multiplier so byte variables can be used for rendering + textsize = (s > 0) ? s : 1; // Don't allow font size 0 +} + + +/*************************************************************************************** +** Function name: setTextColor +** Description: Set the font foreground colour (background is transparent) +***************************************************************************************/ +void TFT_eSPI::setTextColor(uint16_t c) +{ + // For 'transparent' background, we'll set the bg + // to the same as fg instead of using a flag + textcolor = textbgcolor = c; +} + + +/*************************************************************************************** +** Function name: setTextColor +** Description: Set the font foreground and background colour +***************************************************************************************/ +// Smooth fonts use the background colour for anti-aliasing and by default the +// background is not filled. If bgfill = true, then a smooth font background fill will +// be used. +void TFT_eSPI::setTextColor(uint16_t c, uint16_t b, bool bgfill) +{ + textcolor = c; + textbgcolor = b; + _fillbg = bgfill; +} + + +/*************************************************************************************** +** Function name: setPivot +** Description: Set the pivot point on the TFT +*************************************************************************************x*/ +void TFT_eSPI::setPivot(int16_t x, int16_t y) +{ + _xPivot = x; + _yPivot = y; +} + + +/*************************************************************************************** +** Function name: getPivotX +** Description: Get the x pivot position +***************************************************************************************/ +int16_t TFT_eSPI::getPivotX(void) +{ + return _xPivot; +} + + +/*************************************************************************************** +** Function name: getPivotY +** Description: Get the y pivot position +***************************************************************************************/ +int16_t TFT_eSPI::getPivotY(void) +{ + return _yPivot; +} + + +/*************************************************************************************** +** Function name: setBitmapColor +** Description: Set the foreground foreground and background colour +***************************************************************************************/ +void TFT_eSPI::setBitmapColor(uint16_t c, uint16_t b) +{ + if (c == b) b = ~c; + bitmap_fg = c; + bitmap_bg = b; +} + + +/*************************************************************************************** +** Function name: setTextWrap +** Description: Define if text should wrap at end of line +***************************************************************************************/ +void TFT_eSPI::setTextWrap(bool wrapX, bool wrapY) +{ + textwrapX = wrapX; + textwrapY = wrapY; +} + + +/*************************************************************************************** +** Function name: setTextDatum +** Description: Set the text position reference datum +***************************************************************************************/ +void TFT_eSPI::setTextDatum(uint8_t d) +{ + textdatum = d; +} + + +/*************************************************************************************** +** Function name: setTextPadding +** Description: Define padding width (aids erasing old text and numbers) +***************************************************************************************/ +void TFT_eSPI::setTextPadding(uint16_t x_width) +{ + padX = x_width; +} + +/*************************************************************************************** +** Function name: setTextPadding +** Description: Define padding width (aids erasing old text and numbers) +***************************************************************************************/ +uint16_t TFT_eSPI::getTextPadding(void) +{ + return padX; +} + +/*************************************************************************************** +** Function name: getTextDatum +** Description: Return the text datum value (as used by setTextDatum()) +***************************************************************************************/ +uint8_t TFT_eSPI::getTextDatum(void) +{ + return textdatum; +} + + +/*************************************************************************************** +** Function name: width +** Description: Return the pixel width of display (per current rotation) +***************************************************************************************/ +// Return the size of the display (per current rotation) +int16_t TFT_eSPI::width(void) +{ + if (_vpDatum) return _xWidth; + return _width; +} + + +/*************************************************************************************** +** Function name: height +** Description: Return the pixel height of display (per current rotation) +***************************************************************************************/ +int16_t TFT_eSPI::height(void) +{ + if (_vpDatum) return _yHeight; + return _height; +} + + +/*************************************************************************************** +** Function name: textWidth +** Description: Return the width in pixels of a string in a given font +***************************************************************************************/ +int16_t TFT_eSPI::textWidth(const String& string) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return textWidth(buffer, textfont); +} + +int16_t TFT_eSPI::textWidth(const String& string, uint8_t font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return textWidth(buffer, font); +} + +int16_t TFT_eSPI::textWidth(const char *string) +{ + return textWidth(string, textfont); +} + +int16_t TFT_eSPI::textWidth(const char *string, uint8_t font) +{ + int32_t str_width = 0; + uint16_t uniCode = 0; + +#ifdef SMOOTH_FONT + if(fontLoaded) { + while (*string) { + uniCode = decodeUTF8(*string++); + if (uniCode) { + if (uniCode == 0x20) str_width += gFont.spaceWidth; + else { + uint16_t gNum = 0; + bool found = getUnicodeIndex(uniCode, &gNum); + if (found) { + if(str_width == 0 && gdX[gNum] < 0) str_width -= gdX[gNum]; + if (*string || isDigits) str_width += gxAdvance[gNum]; + else str_width += (gdX[gNum] + gWidth[gNum]); + } + else str_width += gFont.spaceWidth + 1; + } + } + } + isDigits = false; + return str_width; + } +#endif + + if (font>1 && font<9) { + char *widthtable = (char *)pgm_read_dword( &(fontdata[font].widthtbl ) ) - 32; //subtract the 32 outside the loop + + while (*string) { + uniCode = *(string++); + if (uniCode > 31 && uniCode < 128) + str_width += pgm_read_byte( widthtable + uniCode); // Normally we need to subtract 32 from uniCode + else str_width += pgm_read_byte( widthtable + 32); // Set illegal character = space width + } + + } + else { + +#ifdef LOAD_GFXFF + if(gfxFont) { // New font + while (*string) { + uniCode = decodeUTF8(*string++); + if ((uniCode >= pgm_read_word(&gfxFont->first)) && (uniCode <= pgm_read_word(&gfxFont->last ))) { + uniCode -= pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[uniCode]); + // If this is not the last character or is a digit then use xAdvance + if (*string || isDigits) str_width += pgm_read_byte(&glyph->xAdvance); + // Else use the offset plus width since this can be bigger than xAdvance + else str_width += ((int8_t)pgm_read_byte(&glyph->xOffset) + pgm_read_byte(&glyph->width)); + } + } + } + else +#endif + { +#ifdef LOAD_GLCD + while (*string++) str_width += 6; +#endif + } + } + isDigits = false; + return str_width * textsize; +} + + +/*************************************************************************************** +** Function name: fontsLoaded +** Description: return an encoded 16-bit value showing the fonts loaded +***************************************************************************************/ +// Returns a value showing which fonts are loaded (bit N set = Font N loaded) +uint16_t TFT_eSPI::fontsLoaded(void) +{ + return fontsloaded; +} + + +/*************************************************************************************** +** Function name: fontHeight +** Description: return the height of a font (yAdvance for free fonts) +***************************************************************************************/ +int16_t TFT_eSPI::fontHeight(uint8_t font) +{ + if (font > 8) return 0; + +#ifdef SMOOTH_FONT + if(fontLoaded) return gFont.yAdvance; +#endif + +#ifdef LOAD_GFXFF + if (font==1) { + if(gfxFont) { // New font + return pgm_read_byte(&gfxFont->yAdvance) * textsize; + } + } +#endif + return pgm_read_byte( &fontdata[font].height ) * textsize; +} + +int16_t TFT_eSPI::fontHeight(void) +{ + return fontHeight(textfont); +} + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a single character in the GLCD or GFXFF font +***************************************************************************************/ +void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size) +{ + if (_vpOoB) return; + +#ifdef LOAD_GLCD +//>>>>>>>>>>>>>>>>>> + #ifdef LOAD_GFXFF + if(!gfxFont) { // 'Classic' built-in GLCD font + #endif +//>>>>>>>>>>>>>>>>>> + + int32_t xd = x + _xDatum; + int32_t yd = y + _yDatum; + + if ((xd >= _vpW) || // Clip right + ( yd >= _vpH) || // Clip bottom + ((xd + 6 * size - 1) < _vpX) || // Clip left + ((yd + 8 * size - 1) < _vpY)) // Clip top + return; + + if (c > 255) return; + if (!_cp437 && c > 175) c++; + + bool fillbg = (bg != color); + bool clip = xd < _vpX || xd + 6 * textsize >= _vpW || yd < _vpY || yd + 8 * textsize >= _vpH; + + if ((size==1) && fillbg && !clip) { + uint8_t column[6]; + uint8_t mask = 0x1; + begin_tft_write(); + + setWindow(xd, yd, xd+5, yd+7); + + for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(&font[0] + (c * 5) + i); + column[5] = 0; + + for (int8_t j = 0; j < 8; j++) { + for (int8_t k = 0; k < 5; k++ ) { + if (column[k] & mask) {tft_Write_16(color);} + else {tft_Write_16(bg);} + } + mask <<= 1; + tft_Write_16(bg); + } + + end_tft_write(); + } + else { + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + for (int8_t i = 0; i < 6; i++ ) { + uint8_t line; + if (i == 5) + line = 0x0; + else + line = pgm_read_byte(&font[0] + (c * 5) + i); + + if (size == 1 && !fillbg) { // default size + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) drawPixel(x + i, y + j, color); + line >>= 1; + } + } + else { // big size or clipped + for (int8_t j = 0; j < 8; j++) { + if (line & 0x1) fillRect(x + (i * size), y + (j * size), size, size, color); + else if (fillbg) fillRect(x + i * size, y + j * size, size, size, bg); + line >>= 1; + } + } + } + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function + } + +//>>>>>>>>>>>>>>>>>>>>>>>>>>> + #ifdef LOAD_GFXFF + } else { // Custom font + #endif +//>>>>>>>>>>>>>>>>>>>>>>>>>>> +#endif // LOAD_GLCD + +#ifdef LOAD_GFXFF + // Filter out bad characters not present in font + if ((c >= pgm_read_word(&gfxFont->first)) && (c <= pgm_read_word(&gfxFont->last ))) { + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; +//>>>>>>>>>>>>>>>>>>>>>>>>>>> + + c -= pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c]); + uint8_t *bitmap = (uint8_t *)pgm_read_dword(&gfxFont->bitmap); + + uint32_t bo = pgm_read_word(&glyph->bitmapOffset); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + //xa = pgm_read_byte(&glyph->xAdvance); + int8_t xo = pgm_read_byte(&glyph->xOffset), + yo = pgm_read_byte(&glyph->yOffset); + uint8_t xx, yy, bits=0, bit=0; + int16_t xo16 = 0, yo16 = 0; + + if(size > 1) { + xo16 = xo; + yo16 = yo; + } + + // GFXFF rendering speed up + uint16_t hpc = 0; // Horizontal foreground pixel count + for(yy=0; yy>= 1; + } + // Draw pixels for this line as we are about to increment yy + if (hpc) { + if(size == 1) drawFastHLine(x+xo+xx-hpc, y+yo+yy, hpc, color); + else fillRect(x+(xo16+xx-hpc)*size, y+(yo16+yy)*size, size*hpc, size, color); + hpc=0; + } + } + + inTransaction = lockTransaction; + end_tft_write(); // Does nothing if Sprite class uses this function + } +#endif + +#ifdef LOAD_GLCD + #ifdef LOAD_GFXFF + } // End classic vs custom font + #endif +#else + #ifndef LOAD_GFXFF + // Avoid warnings if fonts are disabled + x = x; + y = y; + color = color; + bg = bg; + size = size; + #endif +#endif + +} + + +/*************************************************************************************** +** Function name: setAddrWindow +** Description: define an area to receive a stream of pixels +***************************************************************************************/ +// Chip select is high at the end of this function +void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t w, int32_t h) +{ + begin_tft_write(); + + setWindow(x0, y0, x0 + w - 1, y0 + h - 1); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: setWindow +** Description: define an area to receive a stream of pixels +***************************************************************************************/ +// Chip select stays low, call begin_tft_write first. Use setAddrWindow() from sketches +void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) +{ + //begin_tft_write(); // Must be called before setWindow + addr_row = 0xFFFF; + addr_col = 0xFFFF; + +#if defined (ILI9225_DRIVER) + if (rotation & 0x01) { transpose(x0, y0); transpose(x1, y1); } + SPI_BUSY_CHECK; + DC_C; tft_Write_8(TFT_CASET1); + DC_D; tft_Write_16(x0); + DC_C; tft_Write_8(TFT_CASET2); + DC_D; tft_Write_16(x1); + + DC_C; tft_Write_8(TFT_PASET1); + DC_D; tft_Write_16(y0); + DC_C; tft_Write_8(TFT_PASET2); + DC_D; tft_Write_16(y1); + + DC_C; tft_Write_8(TFT_RAM_ADDR1); + DC_D; tft_Write_16(x0); + DC_C; tft_Write_8(TFT_RAM_ADDR2); + DC_D; tft_Write_16(y0); + + // write to RAM + DC_C; tft_Write_8(TFT_RAMWR); + DC_D; + // Temporary solution is to include the RP2040 code here + #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined(RP2040_PIO_INTERFACE) + // For ILI9225 and RP2040 the slower Arduino SPI transfer calls were used, so need to swap back to 16-bit mode + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #endif +#elif defined (SSD1351_DRIVER) + if (rotation & 1) { + transpose(x0, y0); + transpose(x1, y1); + } + SPI_BUSY_CHECK; + DC_C; tft_Write_8(TFT_CASET); + DC_D; tft_Write_16(x1 | (x0 << 8)); + DC_C; tft_Write_8(TFT_PASET); + DC_D; tft_Write_16(y1 | (y0 << 8)); + DC_C; tft_Write_8(TFT_RAMWR); + DC_D; +#else + #if defined (SSD1963_DRIVER) + if ((rotation & 0x1) == 0) { transpose(x0, y0); transpose(x1, y1); } + #endif + + #ifdef CGRAM_OFFSET + x0+=colstart; + x1+=colstart; + y0+=rowstart; + y1+=rowstart; + #endif + + // Temporary solution is to include the RP2040 optimised code here + #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) + #if !defined(RP2040_PIO_INTERFACE) + // Use hardware SPI port, this code does not swap from 8 to 16-bit + // to avoid the spi_set_format() call overhead + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + #if !defined (SPI_18BIT_DRIVER) + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #else + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #endif + #endif + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_CASET; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)x0>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)x0; + spi_get_hw(SPI_X)->dr = (uint32_t)x1>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)x1; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_PASET; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)y0>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)y0; + spi_get_hw(SPI_X)->dr = (uint32_t)y1>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)y1; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_RAMWR; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + #if !defined (SPI_18BIT_DRIVER) + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #endif + DC_D; + #elif defined (RM68120_DRIVER) + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x0 >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x0 & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x1 >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x1 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y0 >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y0 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y1 >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y1 & 0xFF); + + DC_C; tft_Write_16(TFT_RAMWR); + DC_D; + #else + // This is for the RP2040 and PIO interface (SPI or parallel) + WAIT_FOR_STALL; + tft_pio->sm[pio_sm].instr = pio_instr_addr; + + TX_FIFO = TFT_CASET; + TX_FIFO = (x0<<16) | x1; + TX_FIFO = TFT_PASET; + TX_FIFO = (y0<<16) | y1; + TX_FIFO = TFT_RAMWR; + #endif + #else + SPI_BUSY_CHECK; + DC_C; tft_Write_8(TFT_CASET); + DC_D; tft_Write_32C(x0, x1); + DC_C; tft_Write_8(TFT_PASET); + DC_D; tft_Write_32C(y0, y1); + DC_C; tft_Write_8(TFT_RAMWR); + DC_D; + #endif // RP2040 SPI +#endif + //end_tft_write(); // Must be called after setWindow +} + +/*************************************************************************************** +** Function name: readAddrWindow +** Description: define an area to read a stream of pixels +***************************************************************************************/ +void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h) +{ + //begin_tft_write(); // Must be called before readAddrWindow or CS set low + + int32_t xe = xs + w - 1; + int32_t ye = ys + h - 1; + + addr_col = 0xFFFF; + addr_row = 0xFFFF; + +#if defined (SSD1963_DRIVER) + if ((rotation & 0x1) == 0) { transpose(xs, ys); transpose(xe, ye); } +#endif + +#ifdef CGRAM_OFFSET + xs += colstart; + xe += colstart; + ys += rowstart; + ye += rowstart; +#endif + + // Temporary solution is to include the RP2040 optimised code here +#if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined(RP2040_PIO_INTERFACE) + // Use hardware SPI port, this code does not swap from 8 to 16-bit + // to avoid the spi_set_format() call overhead + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_CASET; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)xs>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)xs; + spi_get_hw(SPI_X)->dr = (uint32_t)xe>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)xe; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_PASET; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)ys>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)ys; + spi_get_hw(SPI_X)->dr = (uint32_t)ye>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)ye; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_RAMRD; + + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + + // Flush the rx buffer and reset overflow flag + while (spi_is_readable(SPI_X)) (void)spi_get_hw(SPI_X)->dr; + spi_get_hw(SPI_X)->icr = SPI_SSPICR_RORIC_BITS; + +#else + // Column addr set + DC_C; tft_Write_8(TFT_CASET); + DC_D; tft_Write_32C(xs, xe); + + // Row addr set + DC_C; tft_Write_8(TFT_PASET); + DC_D; tft_Write_32C(ys, ye); + + // Read CGRAM command + DC_C; tft_Write_8(TFT_RAMRD); + + DC_D; +#endif // RP2040 SPI + + //end_tft_write(); // Must be called after readAddrWindow or CS set high +} + + +/*************************************************************************************** +** Function name: drawPixel +** Description: push a single pixel at an arbitrary position +***************************************************************************************/ +void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Range checking + if ((x < _vpX) || (y < _vpY) ||(x >= _vpW) || (y >= _vpH)) return; + +#ifdef CGRAM_OFFSET + x+=colstart; + y+=rowstart; +#endif + +#if (defined (MULTI_TFT_SUPPORT) || defined (GC9A01_DRIVER)) && !defined (ILI9225_DRIVER) + addr_row = 0xFFFF; + addr_col = 0xFFFF; +#endif + + begin_tft_write(); + +#if defined (ILI9225_DRIVER) + if (rotation & 0x01) { transpose(x, y); } + SPI_BUSY_CHECK; + + // Set window to full screen to optimise sequential pixel rendering + if (addr_row != 0x9225) { + addr_row = 0x9225; // addr_row used for flag + DC_C; tft_Write_8(TFT_CASET1); + DC_D; tft_Write_16(0); + DC_C; tft_Write_8(TFT_CASET2); + DC_D; tft_Write_16(175); + + DC_C; tft_Write_8(TFT_PASET1); + DC_D; tft_Write_16(0); + DC_C; tft_Write_8(TFT_PASET2); + DC_D; tft_Write_16(219); + } + + // Define pixel coordinate + DC_C; tft_Write_8(TFT_RAM_ADDR1); + DC_D; tft_Write_16(x); + DC_C; tft_Write_8(TFT_RAM_ADDR2); + DC_D; tft_Write_16(y); + + // write to RAM + DC_C; tft_Write_8(TFT_RAMWR); + #if defined(TFT_PARALLEL_8_BIT) || defined(TFT_PARALLEL_16_BIT) || !defined(ESP32) + DC_D; tft_Write_16(color); + #else + DC_D; tft_Write_16N(color); + #endif + +// Temporary solution is to include the RP2040 optimised code here +#elif (defined (ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined (SSD1351_DRIVER) + + #if defined (SSD1963_DRIVER) + if ((rotation & 0x1) == 0) { transpose(x, y); } + #endif + + #if !defined(RP2040_PIO_INTERFACE) + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #else + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); + #endif + + if (addr_col != x) { + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_CASET; + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS){}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)x>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)x; + spi_get_hw(SPI_X)->dr = (uint32_t)x>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)x; + addr_col = x; + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + } + + if (addr_row != y) { + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_PASET; + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + spi_get_hw(SPI_X)->dr = (uint32_t)y>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)y; + spi_get_hw(SPI_X)->dr = (uint32_t)y>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)y; + addr_row = y; + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + } + + DC_C; + spi_get_hw(SPI_X)->dr = (uint32_t)TFT_RAMWR; + + #if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour + uint8_t r = (color & 0xF800)>>8; + uint8_t g = (color & 0x07E0)>>3; + uint8_t b = (color & 0x001F)<<3; + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + tft_Write_8N(r); tft_Write_8N(g); tft_Write_8N(b); + #else + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + DC_D; + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers + spi_get_hw(SPI_X)->dr = (uint32_t)color; + #else + spi_get_hw(SPI_X)->dr = (uint32_t)color>>8; + spi_get_hw(SPI_X)->dr = (uint32_t)color; + #endif + #endif + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + #elif defined (RM68120_DRIVER) + if (addr_col != x) { + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x & 0xFF); + addr_col = x; + } + if (addr_row != y) { + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y & 0xFF); + addr_row = y; + } + DC_C; tft_Write_16(TFT_RAMWR); DC_D; + + TX_FIFO = color; + #else + // This is for the RP2040 and PIO interface (SPI or parallel) + WAIT_FOR_STALL; + tft_pio->sm[pio_sm].instr = pio_instr_addr; + TX_FIFO = TFT_CASET; + TX_FIFO = (x<<16) | x; + TX_FIFO = TFT_PASET; + TX_FIFO = (y<<16) | y; + TX_FIFO = TFT_RAMWR; + //DC set high by PIO + #if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) + TX_FIFO = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); + #else + TX_FIFO = color; + #endif + + #endif + +#else + + #if defined (SSD1963_DRIVER) + if ((rotation & 0x1) == 0) { transpose(x, y); } + #endif + + SPI_BUSY_CHECK; + + #if defined (SSD1351_DRIVER) + if (rotation & 0x1) { transpose(x, y); } + // No need to send x if it has not changed (speeds things up) + if (addr_col != x) { + DC_C; tft_Write_8(TFT_CASET); + DC_D; tft_Write_16(x | (x << 8)); + addr_col = x; + } + + // No need to send y if it has not changed (speeds things up) + if (addr_row != y) { + DC_C; tft_Write_8(TFT_PASET); + DC_D; tft_Write_16(y | (y << 8)); + addr_row = y; + } + #else + // No need to send x if it has not changed (speeds things up) + if (addr_col != x) { + DC_C; tft_Write_8(TFT_CASET); + DC_D; tft_Write_32D(x); + addr_col = x; + } + + // No need to send y if it has not changed (speeds things up) + if (addr_row != y) { + DC_C; tft_Write_8(TFT_PASET); + DC_D; tft_Write_32D(y); + addr_row = y; + } + #endif + + DC_C; tft_Write_8(TFT_RAMWR); + + #if defined(TFT_PARALLEL_8_BIT) || defined(TFT_PARALLEL_16_BIT) || !defined(ESP32) + DC_D; tft_Write_16(color); + #else + DC_D; tft_Write_16N(color); + #endif +#endif + + end_tft_write(); +} + +/*************************************************************************************** +** Function name: pushColor +** Description: push a single pixel +***************************************************************************************/ +void TFT_eSPI::pushColor(uint16_t color) +{ + begin_tft_write(); + + SPI_BUSY_CHECK; + tft_Write_16N(color); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: pushColor +** Description: push a single colour to "len" pixels +***************************************************************************************/ +void TFT_eSPI::pushColor(uint16_t color, uint32_t len) +{ + begin_tft_write(); + + pushBlock(color, len); + + end_tft_write(); +} + +/*************************************************************************************** +** Function name: startWrite +** Description: begin transaction with CS low, MUST later call endWrite +***************************************************************************************/ +void TFT_eSPI::startWrite(void) +{ + begin_tft_write(); + lockTransaction = true; // Lock transaction for all sequentially run sketch functions + inTransaction = true; +} + +/*************************************************************************************** +** Function name: endWrite +** Description: end transaction with CS high +***************************************************************************************/ +void TFT_eSPI::endWrite(void) +{ + lockTransaction = false; // Release sketch induced transaction lock + inTransaction = false; + DMA_BUSY_CHECK; // Safety check - user code should have checked this! + end_tft_write(); // Release SPI bus +} + +/*************************************************************************************** +** Function name: writeColor (use startWrite() and endWrite() before & after) +** Description: raw write of "len" pixels avoiding transaction check +***************************************************************************************/ +void TFT_eSPI::writeColor(uint16_t color, uint32_t len) +{ + pushBlock(color, len); +} + +/*************************************************************************************** +** Function name: pushColors +** Description: push an array of pixels for 16-bit raw image drawing +***************************************************************************************/ +// Assumed that setAddrWindow() has previously been called +// len is number of bytes, not pixels +void TFT_eSPI::pushColors(uint8_t *data, uint32_t len) +{ + begin_tft_write(); + + pushPixels(data, len>>1); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: pushColors +** Description: push an array of pixels, for image drawing +***************************************************************************************/ +void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap) +{ + begin_tft_write(); + if (swap) {swap = _swapBytes; _swapBytes = true; } + + pushPixels(data, len); + + _swapBytes = swap; // Restore old value + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: drawLine +** Description: draw a line between 2 arbitrary points +***************************************************************************************/ +// Bresenham's algorithm - thx Wikipedia - speed enhanced by Bodmer to use +// an efficient FastH/V Line draw routine for line segments of 2 pixels or more +void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) +{ + if (_vpOoB) return; + + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + //x+= _xDatum; // Not added here, added by drawPixel & drawFastXLine + //y+= _yDatum; + + bool steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + transpose(x0, y0); + transpose(x1, y1); + } + + if (x0 > x1) { + transpose(x0, x1); + transpose(y0, y1); + } + + int32_t dx = x1 - x0, dy = abs(y1 - y0);; + + int32_t err = dx >> 1, ystep = -1, xs = x0, dlen = 0; + + if (y0 < y1) ystep = 1; + + // Split into steep and not steep for FastH/V separation + if (steep) { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + if (dlen == 1) drawPixel(y0, xs, color); + else drawFastVLine(y0, xs, dlen, color); + dlen = 0; + y0 += ystep; xs = x0 + 1; + err += dx; + } + } + if (dlen) drawFastVLine(y0, xs, dlen, color); + } + else + { + for (; x0 <= x1; x0++) { + dlen++; + err -= dy; + if (err < 0) { + if (dlen == 1) drawPixel(xs, y0, color); + else drawFastHLine(xs, y0, dlen, color); + dlen = 0; + y0 += ystep; xs = x0 + 1; + err += dx; + } + } + if (dlen) drawFastHLine(xs, y0, dlen, color); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Description: Constants for anti-aliased line drawing on TFT and in Sprites +***************************************************************************************/ +constexpr float PixelAlphaGain = 255.0; +constexpr float LoAlphaTheshold = 1.0/32.0; +constexpr float HiAlphaTheshold = 1.0 - LoAlphaTheshold; +constexpr float deg2rad = 3.14159265359/180.0; + +/*************************************************************************************** +** Function name: drawPixel (alpha blended) +** Description: Draw a pixel blended with the screen or bg pixel colour +***************************************************************************************/ +uint16_t TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color) +{ + if (bg_color == 0x00FFFFFF) bg_color = readPixel(x, y); + color = fastBlend(alpha, color, bg_color); + drawPixel(x, y, color); + return color; +} + + +/*************************************************************************************** +** Function name: drawSmoothArc +** Description: Draw a smooth arc clockwise from 6 o'clock +***************************************************************************************/ +void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds) +// Centre at x,y +// r = arc outer radius, ir = arc inner radius. Inclusive so arc thickness = r - ir + 1 +// Angles in range 0-360 +// Arc foreground colour anti-aliased with background colour at edges +// anti-aliased roundEnd is optional, default is anti-aliased straight end +// Note: rounded ends extend the arc angle so can overlap, user sketch to manage this. +{ + inTransaction = true; + + if (endAngle != startAngle && (startAngle != 0 || endAngle != 360)) + { + float sx = -sinf(startAngle * deg2rad); + float sy = +cosf(startAngle * deg2rad); + float ex = -sinf( endAngle * deg2rad); + float ey = +cosf( endAngle * deg2rad); + + if (roundEnds) + { // Round ends + sx = sx * (r + ir)/2.0 + x; + sy = sy * (r + ir)/2.0 + y; + drawSpot(sx, sy, (r - ir)/2.0, fg_color, bg_color); + + ex = ex * (r + ir)/2.0 + x; + ey = ey * (r + ir)/2.0 + y; + drawSpot(ex, ey, (r - ir)/2.0, fg_color, bg_color); + } + else + { // Square ends + float asx = sx * ir + x; + float asy = sy * ir + y; + float aex = sx * r + x; + float aey = sy * r + y; + drawWedgeLine(asx, asy, aex, aey, 0.3, 0.3, fg_color, bg_color); + + asx = ex * ir + x; + asy = ey * ir + y; + aex = ex * r + x; + aey = ey * r + y; + drawWedgeLine(asx, asy, aex, aey, 0.3, 0.3, fg_color, bg_color); + } + + // Draw arc + drawArc(x, y, r, ir, startAngle, endAngle, fg_color, bg_color); + + } + else // Draw full 360 + { + drawArc(x, y, r, ir, 0, 360, fg_color, bg_color); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: sqrt_fraction (private function) +** Description: Smooth graphics support function for alpha derivation +***************************************************************************************/ +// Compute the fixed point square root of an integer and +// return the 8 MS bits of fractional part. +// Quicker than sqrt() for processors that do not have an FPU (e.g. RP2040) +inline uint8_t TFT_eSPI::sqrt_fraction(uint32_t num) { + if (num > (0x40000000)) return 0; + uint32_t bsh = 0x00004000; + uint32_t fpr = 0; + uint32_t osh = 0; + + // Auto adjust from U8:8 up to U15:16 + while (num>bsh) {bsh <<= 2; osh++;} + + do { + uint32_t bod = bsh + fpr; + if(num >= bod) + { + num -= bod; + fpr = bsh + bod; + } + num <<= 1; + } while(bsh >>= 1); + + return fpr>>osh; +} + +/*************************************************************************************** +** Function name: drawArc +** Description: Draw an arc clockwise from 6 o'clock position +***************************************************************************************/ +// Centre at x,y +// r = arc outer radius, ir = arc inner radius. Inclusive, so arc thickness = r-ir+1 +// Angles MUST be in range 0-360 +// Arc foreground fg_color anti-aliased with background colour along sides +// smooth is optional, default is true, smooth=false means no antialiasing +// Note: Arc ends are not anti-aliased (use drawSmoothArc instead for that) +void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, + uint32_t startAngle, uint32_t endAngle, + uint32_t fg_color, uint32_t bg_color, + bool smooth) +{ + if (endAngle > 360) endAngle = 360; + if (startAngle > 360) startAngle = 360; + if (_vpOoB || startAngle == endAngle) return; + if (r < ir) transpose(r, ir); // Required that r > ir + if (r <= 0 || ir < 0) return; // Invalid r, ir can be zero (circle sector) + + if (endAngle < startAngle) { + // Arc sweeps through 6 o'clock so draw in two parts + if (startAngle < 360) drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color, smooth); + if (endAngle == 0) return; + startAngle = 0; + } + inTransaction = true; + + int32_t xs = 0; // x start position for quadrant scan + uint8_t alpha = 0; // alpha value for blending pixels + + uint32_t r2 = r * r; // Outer arc radius^2 + if (smooth) r++; // Outer AA zone radius + uint32_t r1 = r * r; // Outer AA radius^2 + int16_t w = r - ir; // Width of arc (r - ir + 1) + uint32_t r3 = ir * ir; // Inner arc radius^2 + if (smooth) ir--; // Inner AA zone radius + uint32_t r4 = ir * ir; // Inner AA radius^2 + + // 1 | 2 + // ---¦--- Arc quadrant index + // 0 | 3 + // Fixed point U16.16 slope table for arc start/end in each quadrant + uint32_t startSlope[4] = {0, 0, 0xFFFFFFFF, 0}; + uint32_t endSlope[4] = {0, 0xFFFFFFFF, 0, 0}; + + // Ensure maximum U16.16 slope of arc ends is ~ 0x8000 0000 + constexpr float minDivisor = 1.0f/0x8000; + + // Fill in start slope table and empty quadrants + float fabscos = fabsf(cosf(startAngle * deg2rad)); + float fabssin = fabsf(sinf(startAngle * deg2rad)); + + // U16.16 slope of arc start + uint32_t slope = (fabscos/(fabssin + minDivisor)) * (float)(1UL<<16); + + // Update slope table, add slope for arc start + if (startAngle <= 90) { + startSlope[0] = slope; + } + else if (startAngle <= 180) { + startSlope[1] = slope; + } + else if (startAngle <= 270) { + startSlope[1] = 0xFFFFFFFF; + startSlope[2] = slope; + } + else { + startSlope[1] = 0xFFFFFFFF; + startSlope[2] = 0; + startSlope[3] = slope; + } + + // Fill in end slope table and empty quadrants + fabscos = fabsf(cosf(endAngle * deg2rad)); + fabssin = fabsf(sinf(endAngle * deg2rad)); + + // U16.16 slope of arc end + slope = (uint32_t)((fabscos/(fabssin + minDivisor)) * (float)(1UL<<16)); + + // Work out which quadrants will need to be drawn and add slope for arc end + if (endAngle <= 90) { + endSlope[0] = slope; + endSlope[1] = 0; + startSlope[2] = 0; + } + else if (endAngle <= 180) { + endSlope[1] = slope; + startSlope[2] = 0; + } + else if (endAngle <= 270) { + endSlope[2] = slope; + } + else { + endSlope[3] = slope; + } + + // Scan quadrant + for (int32_t cy = r - 1; cy > 0; cy--) + { + uint32_t len[4] = { 0, 0, 0, 0}; // Pixel run length + int32_t xst[4] = {-1, -1, -1, -1}; // Pixel run x start + uint32_t dy2 = (r - cy) * (r - cy); + + // Find and track arc zone start point + while ((r - xs) * (r - xs) + dy2 >= r1) xs++; + + for (int32_t cx = xs; cx < r; cx++) + { + // Calculate radius^2 + uint32_t hyp = (r - cx) * (r - cx) + dy2; + + // If in outer zone calculate alpha + if (hyp > r2) { + alpha = ~sqrt_fraction(hyp); // Outer AA zone + } + // If within arc fill zone, get line start and lengths for each quadrant + else if (hyp >= r3) { + // Calculate U16.16 slope + slope = ((r - cy) << 16)/(r - cx); + if (slope <= startSlope[0] && slope >= endSlope[0]) { // slope hi -> lo + xst[0] = cx; // Bottom left line end + len[0]++; + } + if (slope >= startSlope[1] && slope <= endSlope[1]) { // slope lo -> hi + xst[1] = cx; // Top left line end + len[1]++; + } + if (slope <= startSlope[2] && slope >= endSlope[2]) { // slope hi -> lo + xst[2] = cx; // Bottom right line start + len[2]++; + } + if (slope <= endSlope[3] && slope >= startSlope[3]) { // slope lo -> hi + xst[3] = cx; // Top right line start + len[3]++; + } + continue; // Next x + } + else { + if (hyp <= r4) break; // Skip inner pixels + alpha = sqrt_fraction(hyp); // Inner AA zone + } + + if (alpha < 16) continue; // Skip low alpha pixels + + // If background is read it must be done in each quadrant + uint16_t pcol = fastBlend(alpha, fg_color, bg_color); + // Check if an AA pixels need to be drawn + slope = ((r - cy)<<16)/(r - cx); + if (slope <= startSlope[0] && slope >= endSlope[0]) // BL + drawPixel(x + cx - r, y - cy + r, pcol); + if (slope >= startSlope[1] && slope <= endSlope[1]) // TL + drawPixel(x + cx - r, y + cy - r, pcol); + if (slope <= startSlope[2] && slope >= endSlope[2]) // TR + drawPixel(x - cx + r, y + cy - r, pcol); + if (slope <= endSlope[3] && slope >= startSlope[3]) // BR + drawPixel(x - cx + r, y - cy + r, pcol); + } + // Add line in inner zone + if (len[0]) drawFastHLine(x + xst[0] - len[0] + 1 - r, y - cy + r, len[0], fg_color); // BL + if (len[1]) drawFastHLine(x + xst[1] - len[1] + 1 - r, y + cy - r, len[1], fg_color); // TL + if (len[2]) drawFastHLine(x - xst[2] + r, y + cy - r, len[2], fg_color); // TR + if (len[3]) drawFastHLine(x - xst[3] + r, y - cy + r, len[3], fg_color); // BR + } + + // Fill in centre lines + if (startAngle == 0 || endAngle == 360) drawFastVLine(x, y + r - w, w, fg_color); // Bottom + if (startAngle <= 90 && endAngle >= 90) drawFastHLine(x - r + 1, y, w, fg_color); // Left + if (startAngle <= 180 && endAngle >= 180) drawFastVLine(x, y - r + 1, w, fg_color); // Top + if (startAngle <= 270 && endAngle >= 270) drawFastHLine(x + r - w, y, w, fg_color); // Right + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: drawSmoothCircle +** Description: Draw a smooth circle +***************************************************************************************/ +// To have effective anti-aliasing the circle will be 3 pixels thick +void TFT_eSPI::drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color) +{ + drawSmoothRoundRect(x-r, y-r, r, r-1, 0, 0, fg_color, bg_color); +} + +/*************************************************************************************** +** Function name: fillSmoothCircle +** Description: Draw a filled anti-aliased circle +***************************************************************************************/ +void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, uint32_t bg_color) +{ + if (r <= 0) return; + + inTransaction = true; + + drawFastHLine(x - r, y, 2 * r + 1, color); + int32_t xs = 1; + int32_t cx = 0; + + int32_t r1 = r * r; + r++; + int32_t r2 = r * r; + + for (int32_t cy = r - 1; cy > 0; cy--) + { + int32_t dy2 = (r - cy) * (r - cy); + for (cx = xs; cx < r; cx++) + { + int32_t hyp2 = (r - cx) * (r - cx) + dy2; + if (hyp2 <= r1) break; + if (hyp2 >= r2) continue; + + uint8_t alpha = ~sqrt_fraction(hyp2); + if (alpha > 246) break; + xs = cx; + if (alpha < 9) continue; + + if (bg_color == 0x00FFFFFF) { + drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); + drawPixel(x - cx + r, y + cy - r, color, alpha, bg_color); + drawPixel(x - cx + r, y - cy + r, color, alpha, bg_color); + drawPixel(x + cx - r, y - cy + r, color, alpha, bg_color); + } + else { + uint16_t pcol = drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); + drawPixel(x - cx + r, y + cy - r, pcol); + drawPixel(x - cx + r, y - cy + r, pcol); + drawPixel(x + cx - r, y - cy + r, pcol); + } + } + drawFastHLine(x + cx - r, y + cy - r, 2 * (r - cx) + 1, color); + drawFastHLine(x + cx - r, y - cy + r, 2 * (r - cx) + 1, color); + } + inTransaction = lockTransaction; + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: drawSmoothRoundRect +** Description: Draw a rounded rectangle +***************************************************************************************/ +// x,y is top left corner of bounding box for a complete rounded rectangle +// r = arc outer corner radius, ir = arc inner radius. Arc thickness = r-ir+1 +// w and h are width and height of the bounding rectangle +// If w and h are < radius (e.g. 0,0) a circle will be drawn with centre at x+r,y+r +// Arc foreground fg_color anti-aliased with background colour at edges +// A subset of corners can be drawn by specifying a quadrants mask. A bit set in the +// mask means draw that quadrant (all are drawn if parameter missing): +// 0x1 | 0x2 +// ---¦--- Arc quadrant mask select bits (as in drawCircleHelper fn) +// 0x8 | 0x4 +void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color, uint8_t quadrants) +{ + if (_vpOoB) return; + if (r < ir) transpose(r, ir); // Required that r > ir + if (r <= 0 || ir < 0) return; // Invalid + + w -= 2*r; + h -= 2*r; + + if (w < 0) w = 0; + if (h < 0) h = 0; + + inTransaction = true; + + x += r; + y += r; + + uint16_t t = r - ir + 1; + int32_t xs = 0; + int32_t cx = 0; + + int32_t r2 = r * r; // Outer arc radius^2 + r++; + int32_t r1 = r * r; // Outer AA zone radius^2 + + int32_t r3 = ir * ir; // Inner arc radius^2 + ir--; + int32_t r4 = ir * ir; // Inner AA zone radius^2 + + uint8_t alpha = 0; + + // Scan top left quadrant x y r ir fg_color bg_color + for (int32_t cy = r - 1; cy > 0; cy--) + { + int32_t len = 0; // Pixel run length + int32_t lxst = 0; // Left side run x start + int32_t rxst = 0; // Right side run x start + int32_t dy2 = (r - cy) * (r - cy); + + // Find and track arc zone start point + while ((r - xs) * (r - xs) + dy2 >= r1) xs++; + + for (cx = xs; cx < r; cx++) + { + // Calculate radius^2 + int32_t hyp = (r - cx) * (r - cx) + dy2; + + // If in outer zone calculate alpha + if (hyp > r2) { + alpha = ~sqrt_fraction(hyp); // Outer AA zone + } + // If within arc fill zone, get line lengths for each quadrant + else if (hyp >= r3) { + rxst = cx; // Right side start + len++; // Line segment length + continue; // Next x + } + else { + if (hyp <= r4) break; // Skip inner pixels + alpha = sqrt_fraction(hyp); // Inner AA zone + } + + if (alpha < 16) continue; // Skip low alpha pixels + + // If background is read it must be done in each quadrant - TODO + uint16_t pcol = fastBlend(alpha, fg_color, bg_color); + if (quadrants & 0x8) drawPixel(x + cx - r, y - cy + r + h, pcol); // BL + if (quadrants & 0x1) drawPixel(x + cx - r, y + cy - r, pcol); // TL + if (quadrants & 0x2) drawPixel(x - cx + r + w, y + cy - r, pcol); // TR + if (quadrants & 0x4) drawPixel(x - cx + r + w, y - cy + r + h, pcol); // BR + } + // Fill arc inner zone in each quadrant + lxst = rxst - len + 1; // Calculate line segment start for left side + if (quadrants & 0x8) drawFastHLine(x + lxst - r, y - cy + r + h, len, fg_color); // BL + if (quadrants & 0x1) drawFastHLine(x + lxst - r, y + cy - r, len, fg_color); // TL + if (quadrants & 0x2) drawFastHLine(x - rxst + r + w, y + cy - r, len, fg_color); // TR + if (quadrants & 0x4) drawFastHLine(x - rxst + r + w, y - cy + r + h, len, fg_color); // BR + } + + // Draw sides + if ((quadrants & 0xC) == 0xC) fillRect(x, y + r - t + h, w + 1, t, fg_color); // Bottom + if ((quadrants & 0x9) == 0x9) fillRect(x - r + 1, y, t, h + 1, fg_color); // Left + if ((quadrants & 0x3) == 0x3) fillRect(x, y - r + 1, w + 1, t, fg_color); // Top + if ((quadrants & 0x6) == 0x6) fillRect(x + r - t + w, y, t, h + 1, fg_color); // Right + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: fillSmoothRoundRect +** Description: Draw a filled anti-aliased rounded corner rectangle +***************************************************************************************/ +void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color, uint32_t bg_color) +{ + inTransaction = true; + + int32_t xs = 0; + int32_t cx = 0; + + // Limit radius to half width or height + if (r < 0) r = 0; + if (r > w/2) r = w/2; + if (r > h/2) r = h/2; + + y += r; + h -= 2*r; + fillRect(x, y, w, h, color); + + h--; + x += r; + w -= 2*r+1; + + int32_t r1 = r * r; + r++; + int32_t r2 = r * r; + + for (int32_t cy = r - 1; cy > 0; cy--) + { + int32_t dy2 = (r - cy) * (r - cy); + for (cx = xs; cx < r; cx++) + { + int32_t hyp2 = (r - cx) * (r - cx) + dy2; + if (hyp2 <= r1) break; + if (hyp2 >= r2) continue; + + uint8_t alpha = ~sqrt_fraction(hyp2); + if (alpha > 246) break; + xs = cx; + if (alpha < 9) continue; + + drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); + drawPixel(x - cx + r + w, y + cy - r, color, alpha, bg_color); + drawPixel(x - cx + r + w, y - cy + r + h, color, alpha, bg_color); + drawPixel(x + cx - r, y - cy + r + h, color, alpha, bg_color); + } + drawFastHLine(x + cx - r, y + cy - r, 2 * (r - cx) + 1 + w, color); + drawFastHLine(x + cx - r, y - cy + r + h, 2 * (r - cx) + 1 + w, color); + } + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: drawSpot - maths intensive, so for small filled circles +** Description: Draw an anti-aliased filled circle at ax,ay with radius r +***************************************************************************************/ +// Coordinates are floating point to achieve sub-pixel positioning +void TFT_eSPI::drawSpot(float ax, float ay, float r, uint32_t fg_color, uint32_t bg_color) +{ + // Filled circle can be created by the wide line function with zero line length + drawWedgeLine( ax, ay, ax, ay, r, r, fg_color, bg_color); +} + +/*************************************************************************************** +** Function name: drawWideLine - background colour specified or pixel read +** Description: draw an anti-aliased line with rounded ends, width wd +***************************************************************************************/ +void TFT_eSPI::drawWideLine(float ax, float ay, float bx, float by, float wd, uint32_t fg_color, uint32_t bg_color) +{ + drawWedgeLine( ax, ay, bx, by, wd/2.0, wd/2.0, fg_color, bg_color); +} + +/*************************************************************************************** +** Function name: drawWedgeLine - background colour specified or pixel read +** Description: draw an anti-aliased line with different width radiused ends +***************************************************************************************/ +void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, float br, uint32_t fg_color, uint32_t bg_color) +{ + if ( (ar < 0.0) || (br < 0.0) )return; + if ( (fabsf(ax - bx) < 0.01f) && (fabsf(ay - by) < 0.01f) ) bx += 0.01f; // Avoid divide by zero + + // Find line bounding box + int32_t x0 = (int32_t)floorf(fminf(ax-ar, bx-br)); + int32_t x1 = (int32_t) ceilf(fmaxf(ax+ar, bx+br)); + int32_t y0 = (int32_t)floorf(fminf(ay-ar, by-br)); + int32_t y1 = (int32_t) ceilf(fmaxf(ay+ar, by+br)); + + if (!clipWindow(&x0, &y0, &x1, &y1)) return; + + // Establish x start and y start + int32_t ys = ay; + if ((ax-ar)>(bx-br)) ys = by; + + float rdt = ar - br; // Radius delta + float alpha = 1.0f; + ar += 0.5; + + uint16_t bg = bg_color; + float xpax, ypay, bax = bx - ax, bay = by - ay; + + begin_nin_write(); + inTransaction = true; + + int32_t xs = x0; + // Scan bounding box from ys down, calculate pixel intensity from distance to line + for (int32_t yp = ys; yp <= y1; yp++) { + bool swin = true; // Flag to start new window area + bool endX = false; // Flag to skip pixels + ypay = yp - ay; + for (int32_t xp = xs; xp <= x1; xp++) { + if (endX) if (alpha <= LoAlphaTheshold) break; // Skip right side + xpax = xp - ax; + alpha = ar - wedgeLineDistance(xpax, ypay, bax, bay, rdt); + if (alpha <= LoAlphaTheshold ) continue; + // Track edge to minimise calculations + if (!endX) { endX = true; xs = xp; } + if (alpha > HiAlphaTheshold) { + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif + continue; + } + //Blend color with background and plot + if (bg_color == 0x00FFFFFF) { + bg = readPixel(xp, yp); swin = true; + } + #ifdef GC9A01_DRIVER + uint16_t pcol = fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + swin = swin; + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif + } + } + + // Reset x start to left side of box + xs = x0; + // Scan bounding box from ys-1 up, calculate pixel intensity from distance to line + for (int32_t yp = ys-1; yp >= y0; yp--) { + bool swin = true; // Flag to start new window area + bool endX = false; // Flag to skip pixels + ypay = yp - ay; + for (int32_t xp = xs; xp <= x1; xp++) { + if (endX) if (alpha <= LoAlphaTheshold) break; // Skip right side of drawn line + xpax = xp - ax; + alpha = ar - wedgeLineDistance(xpax, ypay, bax, bay, rdt); + if (alpha <= LoAlphaTheshold ) continue; + // Track line boundary + if (!endX) { endX = true; xs = xp; } + if (alpha > HiAlphaTheshold) { + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif + continue; + } + //Blend colour with background and plot + if (bg_color == 0x00FFFFFF) { + bg = readPixel(xp, yp); swin = true; + } + #ifdef GC9A01_DRIVER + uint16_t pcol = fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + swin = swin; + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif + } + } + + inTransaction = lockTransaction; + end_nin_write(); +} + + +/*************************************************************************************** +** Function name: lineDistance - private helper function for drawWedgeLine +** Description: returns distance of px,py to closest part of a to b wedge +***************************************************************************************/ +inline float TFT_eSPI::wedgeLineDistance(float xpax, float ypay, float bax, float bay, float dr) +{ + float h = fmaxf(fminf((xpax * bax + ypay * bay) / (bax * bax + bay * bay), 1.0f), 0.0f); + float dx = xpax - bax * h, dy = ypay - bay * h; + return sqrtf(dx * dx + dy * dy) + h * dr; +} + + +/*************************************************************************************** +** Function name: drawFastVLine +** Description: draw a vertical line +***************************************************************************************/ +void TFT_eSPI::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x < _vpX) || (x >= _vpW) || (y >= _vpH)) return; + + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((y + h) > _vpH) h = _vpH - y; + + if (h < 1) return; + + begin_tft_write(); + + setWindow(x, y, x, y + h - 1); + + pushBlock(color, h); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: drawFastHLine +** Description: draw a horizontal line +***************************************************************************************/ +void TFT_eSPI::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((y < _vpY) || (x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + + if ((x + w) > _vpW) w = _vpW - x; + + if (w < 1) return; + + begin_tft_write(); + + setWindow(x, y, x + w - 1, y); + + pushBlock(color, w); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: fillRect +** Description: draw a filled rectangle +***************************************************************************************/ +void TFT_eSPI::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((x + w) > _vpW) w = _vpW - x; + if ((y + h) > _vpH) h = _vpH - y; + + if ((w < 1) || (h < 1)) return; + + //Serial.print(" _xDatum=");Serial.print( _xDatum);Serial.print(", _yDatum=");Serial.print( _yDatum); + //Serial.print(", _xWidth=");Serial.print(_xWidth);Serial.print(", _yHeight=");Serial.println(_yHeight); + + //Serial.print(" _vpX=");Serial.print( _vpX);Serial.print(", _vpY=");Serial.print( _vpY); + //Serial.print(", _vpW=");Serial.print(_vpW);Serial.print(", _vpH=");Serial.println(_vpH); + + //Serial.print(" x=");Serial.print( y);Serial.print(", y=");Serial.print( y); + //Serial.print(", w=");Serial.print(w);Serial.print(", h=");Serial.println(h); + + begin_tft_write(); + + setWindow(x, y, x + w - 1, y + h - 1); + + pushBlock(color, w * h); + + end_tft_write(); +} + + +/*************************************************************************************** +** Function name: fillRectVGradient +** Description: draw a filled rectangle with a vertical colour gradient +***************************************************************************************/ +void TFT_eSPI::fillRectVGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((x + w) > _vpW) w = _vpW - x; + if ((y + h) > _vpH) h = _vpH - y; + + if ((w < 1) || (h < 1)) return; + + begin_nin_write(); + + float delta = -255.0/h; + float alpha = 255.0; + uint32_t color = color1; + + while (h--) { + drawFastHLine(x, y++, w, color); + alpha += delta; + color = fastBlend((uint8_t)alpha, color1, color2); + } + + end_nin_write(); +} + + +/*************************************************************************************** +** Function name: fillRectHGradient +** Description: draw a filled rectangle with a horizontal colour gradient +***************************************************************************************/ +void TFT_eSPI::fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2) +{ + if (_vpOoB) return; + + x+= _xDatum; + y+= _yDatum; + + // Clipping + if ((x >= _vpW) || (y >= _vpH)) return; + + if (x < _vpX) { w += x - _vpX; x = _vpX; } + if (y < _vpY) { h += y - _vpY; y = _vpY; } + + if ((x + w) > _vpW) w = _vpW - x; + if ((y + h) > _vpH) h = _vpH - y; + + if ((w < 1) || (h < 1)) return; + + begin_nin_write(); + + float delta = -255.0/w; + float alpha = 255.0; + uint32_t color = color1; + + while (w--) { + drawFastVLine(x++, y, h, color); + alpha += delta; + color = fastBlend((uint8_t)alpha, color1, color2); + } + + end_nin_write(); +} + + +/*************************************************************************************** +** Function name: color565 +** Description: convert three 8-bit RGB levels to a 16-bit colour value +***************************************************************************************/ +uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b) +{ + return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); +} + + +/*************************************************************************************** +** Function name: color16to8 +** Description: convert 16-bit colour to an 8-bit 332 RGB colour value +***************************************************************************************/ +uint8_t TFT_eSPI::color16to8(uint16_t c) +{ + return ((c & 0xE000)>>8) | ((c & 0x0700)>>6) | ((c & 0x0018)>>3); +} + + +/*************************************************************************************** +** Function name: color8to16 +** Description: convert 8-bit colour to a 16-bit 565 colour value +***************************************************************************************/ +uint16_t TFT_eSPI::color8to16(uint8_t color) +{ + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table + uint16_t color16 = 0; + + // =====Green===== ===============Red============== + color16 = (color & 0x1C)<<6 | (color & 0xC0)<<5 | (color & 0xE0)<<8; + // =====Green===== =======Blue====== + color16 |= (color & 0x1C)<<3 | blue[color & 0x03]; + + return color16; +} + +/*************************************************************************************** +** Function name: color16to24 +** Description: convert 16-bit colour to a 24-bit 888 colour value +***************************************************************************************/ +uint32_t TFT_eSPI::color16to24(uint16_t color565) +{ + uint8_t r = (color565 >> 8) & 0xF8; r |= (r >> 5); + uint8_t g = (color565 >> 3) & 0xFC; g |= (g >> 6); + uint8_t b = (color565 << 3) & 0xF8; b |= (b >> 5); + + return ((uint32_t)r << 16) | ((uint32_t)g << 8) | ((uint32_t)b << 0); +} + +/*************************************************************************************** +** Function name: color24to16 +** Description: convert 24-bit colour to a 16-bit 565 colour value +***************************************************************************************/ +uint32_t TFT_eSPI::color24to16(uint32_t color888) +{ + uint16_t r = (color888 >> 8) & 0xF800; + uint16_t g = (color888 >> 5) & 0x07E0; + uint16_t b = (color888 >> 3) & 0x001F; + + return (r | g | b); +} + +/*************************************************************************************** +** Function name: invertDisplay +** Description: invert the display colours i = 1 invert, i = 0 normal +***************************************************************************************/ +void TFT_eSPI::invertDisplay(bool i) +{ + begin_tft_write(); + // Send the command twice as otherwise it does not always work! + writecommand(i ? TFT_INVON : TFT_INVOFF); + writecommand(i ? TFT_INVON : TFT_INVOFF); + end_tft_write(); +} + + +/************************************************************************** +** Function name: setAttribute +** Description: Sets a control parameter of an attribute +**************************************************************************/ +void TFT_eSPI::setAttribute(uint8_t attr_id, uint8_t param) { + switch (attr_id) { + break; + case CP437_SWITCH: + _cp437 = param; + break; + case UTF8_SWITCH: + _utf8 = param; + decoderState = 0; + break; + case PSRAM_ENABLE: +#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) + if (psramFound()) _psram_enable = param; // Enable the use of PSRAM (if available) + else +#endif + _psram_enable = false; + break; + //case 4: // TBD future feature control + // _tbd = param; + // break; + } +} + + +/************************************************************************** +** Function name: getAttribute +** Description: Get value of an attribute (control parameter) +**************************************************************************/ +uint8_t TFT_eSPI::getAttribute(uint8_t attr_id) { + switch (attr_id) { + case CP437_SWITCH: // ON/OFF control of full CP437 character set + return _cp437; + case UTF8_SWITCH: // ON/OFF control of UTF-8 decoding + return _utf8; + case PSRAM_ENABLE: + return _psram_enable; + //case 3: // TBD future feature control + // return _tbd; + // break; + } + + return false; +} + +/*************************************************************************************** +** Function name: decodeUTF8 +** Description: Serial UTF-8 decoder with fall-back to extended ASCII +*************************************************************************************x*/ +uint16_t TFT_eSPI::decodeUTF8(uint8_t c) +{ + if (!_utf8) return c; + + // 7-bit Unicode Code Point + if ((c & 0x80) == 0x00) { + decoderState = 0; + return c; + } + + if (decoderState == 0) { + // 11-bit Unicode Code Point + if ((c & 0xE0) == 0xC0) { + decoderBuffer = ((c & 0x1F)<<6); + decoderState = 1; + return 0; + } + // 16-bit Unicode Code Point + if ((c & 0xF0) == 0xE0) { + decoderBuffer = ((c & 0x0F)<<12); + decoderState = 2; + return 0; + } + // 21-bit Unicode Code Point not supported so fall-back to extended ASCII + // if ((c & 0xF8) == 0xF0) return c; + } + else { + if (decoderState == 2) { + decoderBuffer |= ((c & 0x3F)<<6); + decoderState--; + return 0; + } + else { + decoderBuffer |= (c & 0x3F); + decoderState = 0; + return decoderBuffer; + } + } + + decoderState = 0; + + return c; // fall-back to extended ASCII +} + + +/*************************************************************************************** +** Function name: decodeUTF8 +** Description: Line buffer UTF-8 decoder with fall-back to extended ASCII +*************************************************************************************x*/ +uint16_t TFT_eSPI::decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining) +{ + uint16_t c = buf[(*index)++]; + //Serial.print("Byte from string = 0x"); Serial.println(c, HEX); + + if (!_utf8) return c; + + // 7-bit Unicode + if ((c & 0x80) == 0x00) return c; + + // 11-bit Unicode + if (((c & 0xE0) == 0xC0) && (remaining > 1)) + return ((c & 0x1F)<<6) | (buf[(*index)++]&0x3F); + + // 16-bit Unicode + if (((c & 0xF0) == 0xE0) && (remaining > 2)) { + c = ((c & 0x0F)<<12) | ((buf[(*index)++]&0x3F)<<6); + return c | ((buf[(*index)++]&0x3F)); + } + + // 21-bit Unicode not supported so fall-back to extended ASCII + // if (((c & 0xF8) == 0xF0) && (remaining > 3)) { + // c = ((c & 0x07) << 18) | ((buf[(*index)++] & 0x03F) << 12); + // c |= ((buf[(*index)++] & 0x3F) << 6); + // return c | ((buf[(*index)++] & 0x3F)); + + return c; // fall-back to extended ASCII +} + + +/*************************************************************************************** +** Function name: alphaBlend +** Description: Blend 16bit foreground and background +*************************************************************************************x*/ +uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc) +{ + // Split out and blend 5-bit red and blue channels + uint32_t rxb = bgc & 0xF81F; + rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; + // Split out and blend 6-bit green channel + uint32_t xgx = bgc & 0x07E0; + xgx += ((fgc & 0x07E0) - xgx) * alpha >> 8; + // Recombine channels + return (rxb & 0xF81F) | (xgx & 0x07E0); +} + +/*************************************************************************************** +** Function name: alphaBlend +** Description: Blend 16bit foreground and background with dither +*************************************************************************************x*/ +uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc, uint8_t dither) +{ + if (dither) { + int16_t alphaDither = (int16_t)alpha - dither + random(2*dither+1); // +/-4 randomised + alpha = (uint8_t)alphaDither; + if (alphaDither < 0) alpha = 0; + if (alphaDither >255) alpha = 255; + } + + return alphaBlend(alpha, fgc, bgc); +} + +/*************************************************************************************** +** Function name: alphaBlend +** Description: Blend 24bit foreground and background with optional dither +*************************************************************************************x*/ +uint32_t TFT_eSPI::alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, uint8_t dither) +{ + + if (dither) { + int16_t alphaDither = (int16_t)alpha - dither + random(2*dither+1); // +/-dither randomised + alpha = (uint8_t)alphaDither; + if (alphaDither < 0) alpha = 0; + if (alphaDither >255) alpha = 255; + } + + uint32_t rxx = bgc & 0xFF0000; + rxx += ((fgc & 0xFF0000) - rxx) * alpha >> 8; + uint32_t xgx = bgc & 0x00FF00; + xgx += ((fgc & 0x00FF00) - xgx) * alpha >> 8; + uint32_t xxb = bgc & 0x0000FF; + xxb += ((fgc & 0x0000FF) - xxb) * alpha >> 8; + return (rxx & 0xFF0000) | (xgx & 0x00FF00) | (xxb & 0x0000FF); +} + +/*************************************************************************************** +** Function name: write +** Description: draw characters piped through serial stream +***************************************************************************************/ +/* // Not all processors support buffered write +#ifndef ARDUINO_ARCH_ESP8266 // Avoid ESP8266 board package bug +size_t TFT_eSPI::write(const uint8_t *buf, size_t len) +{ + inTransaction = true; + + uint8_t *lbuf = (uint8_t *)buf; + while(*lbuf !=0 && len--) write(*lbuf++); + + inTransaction = lockTransaction; + end_tft_write(); + return 1; +} +#endif +*/ +/*************************************************************************************** +** Function name: write +** Description: draw characters piped through serial stream +***************************************************************************************/ +size_t TFT_eSPI::write(uint8_t utf8) +{ + if (_vpOoB) return 1; + + uint16_t uniCode = decodeUTF8(utf8); + + if (!uniCode) return 1; + + if (utf8 == '\r') return 1; + +#ifdef SMOOTH_FONT + if(fontLoaded) { + if (uniCode < 32 && utf8 != '\n') return 1; + + drawGlyph(uniCode); + + return 1; + } +#endif + + if (uniCode == '\n') uniCode+=22; // Make it a valid space character to stop errors + + uint16_t cwidth = 0; + uint16_t cheight = 0; + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + //Serial.print((uint8_t) uniCode); // Debug line sends all printed TFT text to serial port + //Serial.println(uniCode, HEX); // Debug line sends all printed TFT text to serial port + //delay(5); // Debug optional wait for serial port to flush through +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#ifdef LOAD_GFXFF + if(!gfxFont) { +#endif +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +#ifdef LOAD_FONT2 + if (textfont == 2) { + if (uniCode < 32 || uniCode > 127) return 1; + + cwidth = pgm_read_byte(widtbl_f16 + uniCode-32); + cheight = chr_hgt_f16; + // Font 2 is rendered in whole byte widths so we must allow for this + cwidth = (cwidth + 6) / 8; // Width in whole bytes for font 2, should be + 7 but must allow for font width change + cwidth = cwidth * 8; // Width converted back to pixels + } + #ifdef LOAD_RLE + else + #endif +#endif + +#ifdef LOAD_RLE + { + if ((textfont>2) && (textfont<9)) { + if (uniCode < 32 || uniCode > 127) return 1; + // Uses the fontinfo struct array to avoid lots of 'if' or 'switch' statements + cwidth = pgm_read_byte( (uint8_t *)pgm_read_dword( &(fontdata[textfont].widthtbl ) ) + uniCode-32 ); + cheight= pgm_read_byte( &fontdata[textfont].height ); + } + } +#endif + +#ifdef LOAD_GLCD + if (textfont==1) { + cwidth = 6; + cheight = 8; + } +#else + if (textfont==1) return 1; +#endif + + cheight = cheight * textsize; + + if (utf8 == '\n') { + cursor_y += cheight; + cursor_x = 0; + } + else { + if (textwrapX && (cursor_x + cwidth * textsize > width())) { + cursor_y += cheight; + cursor_x = 0; + } + if (textwrapY && (cursor_y >= (int32_t) height())) cursor_y = 0; + cursor_x += drawChar(uniCode, cursor_x, cursor_y, textfont); + } + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#ifdef LOAD_GFXFF + } // Custom GFX font + else { + if(utf8 == '\n') { + cursor_x = 0; + cursor_y += (int16_t)textsize * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } else { + if (uniCode > pgm_read_word(&gfxFont->last )) return 1; + if (uniCode < pgm_read_word(&gfxFont->first)) return 1; + + uint16_t c2 = uniCode - pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + uint8_t w = pgm_read_byte(&glyph->width), + h = pgm_read_byte(&glyph->height); + if((w > 0) && (h > 0)) { // Is there an associated bitmap? + int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); + if(textwrapX && ((cursor_x + textsize * (xo + w)) > width())) { + // Drawing character would go off right edge; wrap to new line + cursor_x = 0; + cursor_y += (int16_t)textsize * (uint8_t)pgm_read_byte(&gfxFont->yAdvance); + } + if (textwrapY && (cursor_y >= (int32_t) height())) cursor_y = 0; + drawChar(cursor_x, cursor_y, uniCode, textcolor, textbgcolor, textsize); + } + cursor_x += pgm_read_byte(&glyph->xAdvance) * (int16_t)textsize; + } + } +#endif // LOAD_GFXFF +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + return 1; +} + + +/*************************************************************************************** +** Function name: drawChar +** Description: draw a Unicode glyph onto the screen +***************************************************************************************/ + // TODO: Rationalise with TFT_eSprite + // Any UTF-8 decoding must be done before calling drawChar() +int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y) +{ + return drawChar(uniCode, x, y, textfont); +} + + // Any UTF-8 decoding must be done before calling drawChar() +int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) +{ + if (_vpOoB || !uniCode) return 0; + + if (font==1) { +#ifdef LOAD_GLCD + #ifndef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + return 6 * textsize; + #endif +#else + #ifndef LOAD_GFXFF + return 0; + #endif +#endif + +#ifdef LOAD_GFXFF + drawChar(x, y, uniCode, textcolor, textbgcolor, textsize); + if(!gfxFont) { // 'Classic' built-in font + #ifdef LOAD_GLCD + return 6 * textsize; + #else + return 0; + #endif + } + else { + if((uniCode >= pgm_read_word(&gfxFont->first)) && (uniCode <= pgm_read_word(&gfxFont->last) )) { + uint16_t c2 = uniCode - pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + return pgm_read_byte(&glyph->xAdvance) * textsize; + } + else { + return 0; + } + } +#endif + } + + if ((font>1) && (font<9) && ((uniCode < 32) || (uniCode > 127))) return 0; + + int32_t width = 0; + int32_t height = 0; + uint32_t flash_address = 0; + uniCode -= 32; + +#ifdef LOAD_FONT2 + if (font == 2) { + flash_address = pgm_read_dword(&chrtbl_f16[uniCode]); + width = pgm_read_byte(widtbl_f16 + uniCode); + height = chr_hgt_f16; + } + #ifdef LOAD_RLE + else + #endif +#endif + +#ifdef LOAD_RLE + { + if ((font>2) && (font<9)) { + flash_address = pgm_read_dword( (const void*)(pgm_read_dword( &(fontdata[font].chartbl ) ) + uniCode*sizeof(void *)) ); + width = pgm_read_byte( (uint8_t *)pgm_read_dword( &(fontdata[font].widthtbl ) ) + uniCode ); + height= pgm_read_byte( &fontdata[font].height ); + } + } +#endif + + int32_t xd = x + _xDatum; + int32_t yd = y + _yDatum; + + if ((xd + width * textsize < _vpX || xd >= _vpW) && (yd + height * textsize < _vpY || yd >= _vpH)) return width * textsize ; + + int32_t w = width; + int32_t pX = 0; + int32_t pY = y; + uint8_t line = 0; + bool clip = xd < _vpX || xd + width * textsize >= _vpW || yd < _vpY || yd + height * textsize >= _vpH; + +#ifdef LOAD_FONT2 // chop out code if we do not need it + if (font == 2) { + w = w + 6; // Should be + 7 but we need to compensate for width increment + w = w / 8; + + if (textcolor == textbgcolor || textsize != 1 || clip) { + //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() + inTransaction = true; + + for (int32_t i = 0; i < height; i++) { + if (textcolor != textbgcolor) fillRect(x, pY, width * textsize, textsize, textbgcolor); + + for (int32_t k = 0; k < w; k++) { + line = pgm_read_byte((uint8_t *)flash_address + w * i + k); + if (line) { + if (textsize == 1) { + pX = x + k * 8; + if (line & 0x80) drawPixel(pX, pY, textcolor); + if (line & 0x40) drawPixel(pX + 1, pY, textcolor); + if (line & 0x20) drawPixel(pX + 2, pY, textcolor); + if (line & 0x10) drawPixel(pX + 3, pY, textcolor); + if (line & 0x08) drawPixel(pX + 4, pY, textcolor); + if (line & 0x04) drawPixel(pX + 5, pY, textcolor); + if (line & 0x02) drawPixel(pX + 6, pY, textcolor); + if (line & 0x01) drawPixel(pX + 7, pY, textcolor); + } + else { + pX = x + k * 8 * textsize; + if (line & 0x80) fillRect(pX, pY, textsize, textsize, textcolor); + if (line & 0x40) fillRect(pX + textsize, pY, textsize, textsize, textcolor); + if (line & 0x20) fillRect(pX + 2 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x10) fillRect(pX + 3 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x08) fillRect(pX + 4 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x04) fillRect(pX + 5 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x02) fillRect(pX + 6 * textsize, pY, textsize, textsize, textcolor); + if (line & 0x01) fillRect(pX + 7 * textsize, pY, textsize, textsize, textcolor); + } + } + } + pY += textsize; + } + + inTransaction = lockTransaction; + end_tft_write(); + } + else { // Faster drawing of characters and background using block write + + begin_tft_write(); + + setWindow(xd, yd, xd + width - 1, yd + height - 1); + + uint8_t mask; + for (int32_t i = 0; i < height; i++) { + pX = width; + for (int32_t k = 0; k < w; k++) { + line = pgm_read_byte((uint8_t *) (flash_address + w * i + k) ); + mask = 0x80; + while (mask && pX) { + if (line & mask) {tft_Write_16(textcolor);} + else {tft_Write_16(textbgcolor);} + pX--; + mask = mask >> 1; + } + } + if (pX) {tft_Write_16(textbgcolor);} + } + + end_tft_write(); + } + } + + #ifdef LOAD_RLE + else + #endif +#endif //FONT2 + +#ifdef LOAD_RLE //674 bytes of code + // Font is not 2 and hence is RLE encoded + { + begin_tft_write(); + inTransaction = true; + + w *= height; // Now w is total number of pixels in the character + if (textcolor == textbgcolor && !clip) { + + int32_t px = 0, py = pY; // To hold character block start and end column and row values + int32_t pc = 0; // Pixel count + uint8_t np = textsize * textsize; // Number of pixels in a drawn pixel + + uint8_t tnp = 0; // Temporary copy of np for while loop + uint8_t ts = textsize - 1; // Temporary copy of textsize + // 16-bit pixel count so maximum font size is equivalent to 180x180 pixels in area + // w is total number of pixels to plot to fill character block + while (pc < w) { + line = pgm_read_byte((uint8_t *)flash_address); + flash_address++; + if (line & 0x80) { + line &= 0x7F; + line++; + if (ts) { + px = xd + textsize * (pc % width); // Keep these px and py calculations outside the loop as they are slow + py = yd + textsize * (pc / width); + } + else { + px = xd + pc % width; // Keep these px and py calculations outside the loop as they are slow + py = yd + pc / width; + } + while (line--) { // In this case the while(line--) is faster + pc++; // This is faster than putting pc+=line before while()? + setWindow(px, py, px + ts, py + ts); + + if (ts) { + tnp = np; + while (tnp--) {tft_Write_16(textcolor);} + } + else {tft_Write_16(textcolor);} + px += textsize; + + if (px >= (xd + width * textsize)) { + px = xd; + py += textsize; + } + } + } + else { + line++; + pc += line; + } + } + } + else { + // Text colour != background and textsize = 1 and character is within viewport area + // so use faster drawing of characters and background using block write + if (textcolor != textbgcolor && textsize == 1 && !clip) + { + setWindow(xd, yd, xd + width - 1, yd + height - 1); + + // Maximum font size is equivalent to 180x180 pixels in area + while (w > 0) { + line = pgm_read_byte((uint8_t *)flash_address++); // 8 bytes smaller when incrementing here + if (line & 0x80) { + line &= 0x7F; + line++; w -= line; + pushBlock(textcolor,line); + } + else { + line++; w -= line; + pushBlock(textbgcolor,line); + } + } + } + else + { + int32_t px = 0, py = 0; // To hold character pixel coords + int32_t tx = 0, ty = 0; // To hold character TFT pixel coords + int32_t pc = 0; // Pixel count + int32_t pl = 0; // Pixel line length + uint16_t pcol = 0; // Pixel color + bool pf = true; // Flag for plotting + while (pc < w) { + line = pgm_read_byte((uint8_t *)flash_address); + flash_address++; + if (line & 0x80) { pcol = textcolor; line &= 0x7F; pf = true;} + else { pcol = textbgcolor; if (textcolor == textbgcolor) pf = false;} + line++; + px = pc % width; + tx = x + textsize * px; + py = pc / width; + ty = y + textsize * py; + + pl = 0; + pc += line; + while (line--) { + pl++; + if ((px+pl) >= width) { + if (pf) fillRect(tx, ty, pl * textsize, textsize, pcol); + pl = 0; + px = 0; + tx = x; + py ++; + ty += textsize; + } + } + if (pl && pf) fillRect(tx, ty, pl * textsize, textsize, pcol); + } + } + } + inTransaction = lockTransaction; + end_tft_write(); + } + // End of RLE font rendering +#endif + +#if !defined (LOAD_FONT2) && !defined (LOAD_RLE) + // Stop warnings + flash_address = flash_address; + w = w; + pX = pX; + pY = pY; + line = line; + clip = clip; +#endif + + return width * textsize; // x + +} + + +/*************************************************************************************** +** Function name: drawString (with or without user defined font) +** Description : draw string with padding if it is defined +***************************************************************************************/ +// Without font number, uses font set by setTextFont() +int16_t TFT_eSPI::drawString(const String& string, int32_t poX, int32_t poY) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawString(buffer, poX, poY, textfont); +} +// With font number +int16_t TFT_eSPI::drawString(const String& string, int32_t poX, int32_t poY, uint8_t font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawString(buffer, poX, poY, font); +} + +// Without font number, uses font set by setTextFont() +int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY) +{ + return drawString(string, poX, poY, textfont); +} + +// With font number. Note: font number is over-ridden if a smooth font is loaded +int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8_t font) +{ + if (font > 8) return 0; + + int16_t sumX = 0; + uint8_t padding = 1, baseline = 0; + uint16_t cwidth = textWidth(string, font); // Find the pixel width of the string in the font + uint16_t cheight = 8 * textsize; + +#ifdef LOAD_GFXFF + #ifdef SMOOTH_FONT + bool freeFont = (font == 1 && gfxFont && !fontLoaded); + #else + bool freeFont = (font == 1 && gfxFont); + #endif + + if (freeFont) { + cheight = glyph_ab * textsize; + poY += cheight; // Adjust for baseline datum of free fonts + baseline = cheight; + padding =101; // Different padding method used for Free Fonts + + // We need to make an adjustment for the bottom of the string (eg 'y' character) + if ((textdatum == BL_DATUM) || (textdatum == BC_DATUM) || (textdatum == BR_DATUM)) { + cheight += glyph_bb * textsize; + } + } +#endif + + + // If it is not font 1 (GLCD or free font) get the baseline and pixel height of the font +#ifdef SMOOTH_FONT + if(fontLoaded) { + baseline = gFont.maxAscent; + cheight = fontHeight(); + } + else +#endif + if (font!=1) { + baseline = pgm_read_byte( &fontdata[font].baseline ) * textsize; + cheight = fontHeight(font); + } + + if (textdatum || padX) { + + switch(textdatum) { + case TC_DATUM: + poX -= cwidth/2; + padding += 1; + break; + case TR_DATUM: + poX -= cwidth; + padding += 2; + break; + case ML_DATUM: + poY -= cheight/2; + //padding += 0; + break; + case MC_DATUM: + poX -= cwidth/2; + poY -= cheight/2; + padding += 1; + break; + case MR_DATUM: + poX -= cwidth; + poY -= cheight/2; + padding += 2; + break; + case BL_DATUM: + poY -= cheight; + //padding += 0; + break; + case BC_DATUM: + poX -= cwidth/2; + poY -= cheight; + padding += 1; + break; + case BR_DATUM: + poX -= cwidth; + poY -= cheight; + padding += 2; + break; + case L_BASELINE: + poY -= baseline; + //padding += 0; + break; + case C_BASELINE: + poX -= cwidth/2; + poY -= baseline; + padding += 1; + break; + case R_BASELINE: + poX -= cwidth; + poY -= baseline; + padding += 2; + break; + } + } + + + int8_t xo = 0; +#ifdef LOAD_GFXFF + if (freeFont && (textcolor!=textbgcolor)) { + cheight = (glyph_ab + glyph_bb) * textsize; + // Get the offset for the first character only to allow for negative offsets + uint16_t c2 = 0; + uint16_t len = strlen(string); + uint16_t n = 0; + + while (n < len && c2 == 0) c2 = decodeUTF8((uint8_t*)string, &n, len - n); + + if((c2 >= pgm_read_word(&gfxFont->first)) && (c2 <= pgm_read_word(&gfxFont->last) )) { + c2 -= pgm_read_word(&gfxFont->first); + GFXglyph *glyph = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c2]); + xo = pgm_read_byte(&glyph->xOffset) * textsize; + // Adjust for negative xOffset + if (xo > 0) xo = 0; + else cwidth -= xo; + // Add 1 pixel of padding all round + //cheight +=2; + //fillRect(poX+xo-1, poY - 1 - glyph_ab * textsize, cwidth+2, cheight, textbgcolor); + fillRect(poX+xo, poY - glyph_ab * textsize, cwidth, cheight, textbgcolor); + } + padding -=100; + } +#endif + + uint16_t len = strlen(string); + uint16_t n = 0; + +#ifdef SMOOTH_FONT + if(fontLoaded) { + setCursor(poX, poY); + + bool fillbg = _fillbg; + // If padding is requested then fill the text background + if (padX && !_fillbg) _fillbg = true; + + while (n < len) { + uint16_t uniCode = decodeUTF8((uint8_t*)string, &n, len - n); + drawGlyph(uniCode); + } + _fillbg = fillbg; // restore state + sumX += cwidth; + //fontFile.close(); + } + else +#endif + { + while (n < len) { + uint16_t uniCode = decodeUTF8((uint8_t*)string, &n, len - n); + sumX += drawChar(uniCode, poX+sumX, poY, font); + } + } + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +// Switch on debugging for the padding areas +//#define PADDING_DEBUG + +#ifndef PADDING_DEBUG +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + if((padX>cwidth) && (textcolor!=textbgcolor)) { + int16_t padXc = poX+cwidth+xo; +#ifdef LOAD_GFXFF + if (freeFont) { + poX +=xo; // Adjust for negative offset start character + poY -= glyph_ab * textsize; + sumX += poX; + } +#endif + switch(padding) { + case 1: + fillRect(padXc,poY,padX-cwidth,cheight, textbgcolor); + break; + case 2: + fillRect(padXc,poY,(padX-cwidth)>>1,cheight, textbgcolor); + padXc = poX - ((padX-cwidth)>>1); + fillRect(padXc,poY,(padX-cwidth)>>1,cheight, textbgcolor); + break; + case 3: + if (padXc>padX) padXc = padX; + fillRect(poX + cwidth - padXc,poY,padXc-cwidth,cheight, textbgcolor); + break; + } + } + + +#else + +//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DEBUG vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +// This is debug code to show text (green box) and blanked (white box) areas +// It shows that the padding areas are being correctly sized and positioned + + if((padX>sumX) && (textcolor!=textbgcolor)) { + int16_t padXc = poX+sumX; // Maximum left side padding +#ifdef LOAD_GFXFF + if ((font == 1) && (gfxFont)) poY -= glyph_ab; +#endif + drawRect(poX,poY,sumX,cheight, TFT_GREEN); + switch(padding) { + case 1: + drawRect(padXc,poY,padX-sumX,cheight, TFT_WHITE); + break; + case 2: + drawRect(padXc,poY,(padX-sumX)>>1, cheight, TFT_WHITE); + padXc = (padX-sumX)>>1; + drawRect(poX - padXc,poY,(padX-sumX)>>1,cheight, TFT_WHITE); + break; + case 3: + if (padXc>padX) padXc = padX; + drawRect(poX + sumX - padXc,poY,padXc-sumX,cheight, TFT_WHITE); + break; + } + } +#endif +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DEBUG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +return sumX; +} + + +/*************************************************************************************** +** Function name: drawCentreString (deprecated, use setTextDatum()) +** Descriptions: draw string centred on dX +***************************************************************************************/ +int16_t TFT_eSPI::drawCentreString(const String& string, int32_t dX, int32_t poY, uint8_t font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawCentreString(buffer, dX, poY, font); +} + +int16_t TFT_eSPI::drawCentreString(const char *string, int32_t dX, int32_t poY, uint8_t font) +{ + uint8_t tempdatum = textdatum; + int32_t sumX = 0; + textdatum = TC_DATUM; + sumX = drawString(string, dX, poY, font); + textdatum = tempdatum; + return sumX; +} + + +/*************************************************************************************** +** Function name: drawRightString (deprecated, use setTextDatum()) +** Descriptions: draw string right justified to dX +***************************************************************************************/ +int16_t TFT_eSPI::drawRightString(const String& string, int32_t dX, int32_t poY, uint8_t font) +{ + int16_t len = string.length() + 2; + char buffer[len]; + string.toCharArray(buffer, len); + return drawRightString(buffer, dX, poY, font); +} + +int16_t TFT_eSPI::drawRightString(const char *string, int32_t dX, int32_t poY, uint8_t font) +{ + uint8_t tempdatum = textdatum; + int16_t sumX = 0; + textdatum = TR_DATUM; + sumX = drawString(string, dX, poY, font); + textdatum = tempdatum; + return sumX; +} + + +/*************************************************************************************** +** Function name: drawNumber +** Description: draw a long integer +***************************************************************************************/ +int16_t TFT_eSPI::drawNumber(long long_num, int32_t poX, int32_t poY) +{ + isDigits = true; // Eliminate jiggle in monospaced fonts + char str[12]; + ltoa(long_num, str, 10); + return drawString(str, poX, poY, textfont); +} + +int16_t TFT_eSPI::drawNumber(long long_num, int32_t poX, int32_t poY, uint8_t font) +{ + isDigits = true; // Eliminate jiggle in monospaced fonts + char str[12]; + ltoa(long_num, str, 10); + return drawString(str, poX, poY, font); +} + + +/*************************************************************************************** +** Function name: drawFloat +** Descriptions: drawFloat, prints 7 non zero digits maximum +***************************************************************************************/ +// Assemble and print a string, this permits alignment relative to a datum +// looks complicated but much more compact and actually faster than using print class +int16_t TFT_eSPI::drawFloat(float floatNumber, uint8_t dp, int32_t poX, int32_t poY) +{ + return drawFloat(floatNumber, dp, poX, poY, textfont); +} + +int16_t TFT_eSPI::drawFloat(float floatNumber, uint8_t dp, int32_t poX, int32_t poY, uint8_t font) +{ + isDigits = true; + char str[14]; // Array to contain decimal string + uint8_t ptr = 0; // Initialise pointer for array + int8_t digits = 1; // Count the digits to avoid array overflow + float rounding = 0.5; // Round up down delta + bool negative = false; + + if (dp > 7) dp = 7; // Limit the size of decimal portion + + // Adjust the rounding value + for (uint8_t i = 0; i < dp; ++i) rounding /= 10.0; + + if (floatNumber < -rounding) { // add sign, avoid adding - sign to 0.0! + str[ptr++] = '-'; // Negative number + str[ptr] = 0; // Put a null in the array as a precaution + digits = 0; // Set digits to 0 to compensate so pointer value can be used later + floatNumber = -floatNumber; // Make positive + negative = true; + } + + floatNumber += rounding; // Round up or down + + if (dp == 0) { + if (negative) floatNumber = -floatNumber; + return drawNumber((long)floatNumber, poX, poY, font); + } + + // For error put ... in string and return (all TFT_eSPI library fonts contain . character) + if (floatNumber >= 2147483647) { + strcpy(str, "..."); + return drawString(str, poX, poY, font); + } + // No chance of overflow from here on + + // Get integer part + uint32_t temp = (uint32_t)floatNumber; + + // Put integer part into array + ltoa(temp, str + ptr, 10); + + // Find out where the null is to get the digit count loaded + while ((uint8_t)str[ptr] != 0) ptr++; // Move the pointer along + digits += ptr; // Count the digits + + str[ptr++] = '.'; // Add decimal point + str[ptr] = '0'; // Add a dummy zero + str[ptr + 1] = 0; // Add a null but don't increment pointer so it can be overwritten + + // Get the decimal portion + floatNumber = floatNumber - temp; + + // Get decimal digits one by one and put in array + // Limit digit count so we don't get a false sense of resolution + uint8_t i = 0; + while ((i < dp) && (digits < 9)) { // while (i < dp) for no limit but array size must be increased + i++; + floatNumber *= 10; // for the next decimal + temp = floatNumber; // get the decimal + ltoa(temp, str + ptr, 10); + ptr++; digits++; // Increment pointer and digits count + floatNumber -= temp; // Remove that digit + } + + // Finally we can plot the string and return pixel length + return drawString(str, poX, poY, font); +} + + +/*************************************************************************************** +** Function name: setFreeFont +** Descriptions: Sets the GFX free font to use +***************************************************************************************/ + +#ifdef LOAD_GFXFF + +void TFT_eSPI::setFreeFont(const GFXfont *f) +{ + if (f == nullptr) { // Fix issue #400 (ESP32 crash) + setTextFont(1); // Use GLCD font + return; + } + + textfont = 1; + gfxFont = (GFXfont *)f; + + glyph_ab = 0; + glyph_bb = 0; + uint16_t numChars = pgm_read_word(&gfxFont->last) - pgm_read_word(&gfxFont->first); + + // Find the biggest above and below baseline offsets + for (uint16_t c = 0; c < numChars; c++) { + GFXglyph *glyph1 = &(((GFXglyph *)pgm_read_dword(&gfxFont->glyph))[c]); + int8_t ab = -pgm_read_byte(&glyph1->yOffset); + if (ab > glyph_ab) glyph_ab = ab; + int8_t bb = pgm_read_byte(&glyph1->height) - ab; + if (bb > glyph_bb) glyph_bb = bb; + } +} + + +/*************************************************************************************** +** Function name: setTextFont +** Description: Set the font for the print stream +***************************************************************************************/ +void TFT_eSPI::setTextFont(uint8_t f) +{ + textfont = (f > 0) ? f : 1; // Don't allow font 0 + textfont = (f > 8) ? 1 : f; // Don't allow font > 8 + gfxFont = NULL; +} + +#else + + +/*************************************************************************************** +** Function name: setFreeFont +** Descriptions: Sets the GFX free font to use +***************************************************************************************/ + +// Alternative to setTextFont() so we don't need two different named functions +void TFT_eSPI::setFreeFont(uint8_t font) +{ + setTextFont(font); +} + + +/*************************************************************************************** +** Function name: setTextFont +** Description: Set the font for the print stream +***************************************************************************************/ +void TFT_eSPI::setTextFont(uint8_t f) +{ + textfont = (f > 0) ? f : 1; // Don't allow font 0 + textfont = (f > 8) ? 1 : f; // Don't allow font > 8 +} +#endif + + +/*************************************************************************************** +** Function name: getSPIinstance +** Description: Get the instance of the SPI class +***************************************************************************************/ +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) +SPIClass& TFT_eSPI::getSPIinstance(void) +{ + return spi; +} +#endif + + +/*************************************************************************************** +** Function name: verifySetupID +** Description: Compare the ID if USER_SETUP_ID defined in user setup file +***************************************************************************************/ +bool TFT_eSPI::verifySetupID(uint32_t id) +{ +#if defined (USER_SETUP_ID) + if (USER_SETUP_ID == id) return true; +#else + id = id; // Avoid warning +#endif + return false; +} + +/*************************************************************************************** +** Function name: getSetup +** Description: Get the setup details for diagnostic and sketch access +***************************************************************************************/ +void TFT_eSPI::getSetup(setup_t &tft_settings) +{ +// tft_settings.version is set in header file + +#if defined (USER_SETUP_INFO) + tft_settings.setup_info = USER_SETUP_INFO; +#else + tft_settings.setup_info = "NA"; +#endif + +#if defined (USER_SETUP_ID) + tft_settings.setup_id = USER_SETUP_ID; +#else + tft_settings.setup_id = 0; +#endif + +#if defined (PROCESSOR_ID) + tft_settings.esp = PROCESSOR_ID; +#else + tft_settings.esp = -1; +#endif + +#if defined (SUPPORT_TRANSACTIONS) + tft_settings.trans = true; +#else + tft_settings.trans = false; +#endif + +#if defined (TFT_PARALLEL_8_BIT) || defined(TFT_PARALLEL_16_BIT) + tft_settings.serial = false; + tft_settings.tft_spi_freq = 0; +#else + tft_settings.serial = true; + tft_settings.tft_spi_freq = SPI_FREQUENCY/100000; + #ifdef SPI_READ_FREQUENCY + tft_settings.tft_rd_freq = SPI_READ_FREQUENCY/100000; + #endif + #ifndef GENERIC_PROCESSOR + #ifdef TFT_SPI_PORT + tft_settings.port = TFT_SPI_PORT; + #else + tft_settings.port = 255; + #endif + #endif + #ifdef RP2040_PIO_SPI + tft_settings.interface = 0x10; + #else + tft_settings.interface = 0x0; + #endif +#endif + +#if defined(TFT_SPI_OVERLAP) + tft_settings.overlap = true; +#else + tft_settings.overlap = false; +#endif + + tft_settings.tft_driver = TFT_DRIVER; + tft_settings.tft_width = _init_width; + tft_settings.tft_height = _init_height; + +#ifdef CGRAM_OFFSET + tft_settings.r0_x_offset = colstart; + tft_settings.r0_y_offset = rowstart; + tft_settings.r1_x_offset = 0; + tft_settings.r1_y_offset = 0; + tft_settings.r2_x_offset = 0; + tft_settings.r2_y_offset = 0; + tft_settings.r3_x_offset = 0; + tft_settings.r3_y_offset = 0; +#else + tft_settings.r0_x_offset = 0; + tft_settings.r0_y_offset = 0; + tft_settings.r1_x_offset = 0; + tft_settings.r1_y_offset = 0; + tft_settings.r2_x_offset = 0; + tft_settings.r2_y_offset = 0; + tft_settings.r3_x_offset = 0; + tft_settings.r3_y_offset = 0; +#endif + +#if defined (TFT_MOSI) + tft_settings.pin_tft_mosi = TFT_MOSI; +#else + tft_settings.pin_tft_mosi = -1; +#endif + +#if defined (TFT_MISO) + tft_settings.pin_tft_miso = TFT_MISO; +#else + tft_settings.pin_tft_miso = -1; +#endif + +#if defined (TFT_SCLK) + tft_settings.pin_tft_clk = TFT_SCLK; +#else + tft_settings.pin_tft_clk = -1; +#endif + +#if defined (TFT_CS) + tft_settings.pin_tft_cs = TFT_CS; +#else + tft_settings.pin_tft_cs = -1; +#endif + +#if defined (TFT_DC) + tft_settings.pin_tft_dc = TFT_DC; +#else + tft_settings.pin_tft_dc = -1; +#endif + +#if defined (TFT_RD) + tft_settings.pin_tft_rd = TFT_RD; +#else + tft_settings.pin_tft_rd = -1; +#endif + +#if defined (TFT_WR) + tft_settings.pin_tft_wr = TFT_WR; +#else + tft_settings.pin_tft_wr = -1; +#endif + +#if defined (TFT_RST) + tft_settings.pin_tft_rst = TFT_RST; +#else + tft_settings.pin_tft_rst = -1; +#endif + +#if defined (TFT_PARALLEL_8_BIT) || defined(TFT_PARALLEL_16_BIT) + tft_settings.pin_tft_d0 = TFT_D0; + tft_settings.pin_tft_d1 = TFT_D1; + tft_settings.pin_tft_d2 = TFT_D2; + tft_settings.pin_tft_d3 = TFT_D3; + tft_settings.pin_tft_d4 = TFT_D4; + tft_settings.pin_tft_d5 = TFT_D5; + tft_settings.pin_tft_d6 = TFT_D6; + tft_settings.pin_tft_d7 = TFT_D7; +#else + tft_settings.pin_tft_d0 = -1; + tft_settings.pin_tft_d1 = -1; + tft_settings.pin_tft_d2 = -1; + tft_settings.pin_tft_d3 = -1; + tft_settings.pin_tft_d4 = -1; + tft_settings.pin_tft_d5 = -1; + tft_settings.pin_tft_d6 = -1; + tft_settings.pin_tft_d7 = -1; +#endif + +#if defined (TFT_BL) + tft_settings.pin_tft_led = TFT_BL; +#endif + +#if defined (TFT_BACKLIGHT_ON) + tft_settings.pin_tft_led_on = TFT_BACKLIGHT_ON; +#endif + +#if defined (TOUCH_CS) + tft_settings.pin_tch_cs = TOUCH_CS; + tft_settings.tch_spi_freq = SPI_TOUCH_FREQUENCY/100000; +#else + tft_settings.pin_tch_cs = -1; + tft_settings.tch_spi_freq = 0; +#endif +} + + +//////////////////////////////////////////////////////////////////////////////////////// +#ifdef TOUCH_CS + #include "Extensions/Touch.cpp" +#endif + +#include "Extensions/Button.cpp" + +#include "Extensions/Sprite.cpp" + +#ifdef SMOOTH_FONT + #include "Extensions/Smooth_font.cpp" +#endif + +#ifdef AA_GRAPHICS + #include "Extensions/AA_graphics.cpp" // Loaded if SMOOTH_FONT is defined by user +#endif +//////////////////////////////////////////////////////////////////////////////////////// + diff --git a/libraries/TFT_eSPI/TFT_eSPI.h b/libraries/TFT_eSPI/TFT_eSPI.h new file mode 100644 index 0000000..8fc86fa --- /dev/null +++ b/libraries/TFT_eSPI/TFT_eSPI.h @@ -0,0 +1,1011 @@ +/*************************************************** + Arduino TFT graphics library targeted at ESP8266 + and ESP32 based boards. + + This is a stand-alone library that contains the + hardware driver, the graphics functions and the + proportional fonts. + + The built-in fonts 4, 6, 7 and 8 are Run Length + Encoded (RLE) to reduce the FLASH footprint. + + Last review/edit by Bodmer: 04/02/22 + ****************************************************/ + +// Stop fonts etc. being loaded multiple times +#ifndef _TFT_eSPIH_ +#define _TFT_eSPIH_ + +#define TFT_ESPI_VERSION "2.5.43" + +// Bit level feature flags +// Bit 0 set: viewport capability +#define TFT_ESPI_FEATURES 1 + +/*************************************************************************************** +** Section 1: Load required header files +***************************************************************************************/ + +//Standard support +#include +#include +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) + #include +#endif +/*************************************************************************************** +** Section 2: Load library and processor specific header files +***************************************************************************************/ +// Include header file that defines the fonts loaded, the TFT drivers +// available and the pins to be used, etc. etc. +#ifdef CONFIG_TFT_eSPI_ESPIDF + #include "TFT_config.h" +#endif + +// New ESP8266 board package uses ARDUINO_ARCH_ESP8266 +// old package defined ESP8266 +#if defined (ESP8266) + #ifndef ARDUINO_ARCH_ESP8266 + #define ARDUINO_ARCH_ESP8266 + #endif +#endif + +// The following lines allow the user setup to be included in the sketch folder, see +// "Sketch_with_tft_setup" generic example. +#if !defined __has_include + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning Compiler does not support __has_include, so sketches cannot define the setup + #endif +#else + #if __has_include() + // Include the sketch setup file + #include + #ifndef USER_SETUP_LOADED + // Prevent loading further setups + #define USER_SETUP_LOADED + #endif + #endif +#endif + +#include + +// Handle FLASH based storage e.g. PROGMEM +#if defined(ARDUINO_ARCH_RP2040) + #undef pgm_read_byte + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) + #undef pgm_read_word + #define pgm_read_word(addr) ({ \ + typeof(addr) _addr = (addr); \ + *(const unsigned short *)(_addr); \ + }) + #undef pgm_read_dword + #define pgm_read_dword(addr) ({ \ + typeof(addr) _addr = (addr); \ + *(const unsigned long *)(_addr); \ + }) +#elif defined(__AVR__) + #include +#elif defined(ARDUINO_ARCH_ESP8266) || defined(ESP32) + #include +#else + #ifndef PROGMEM + #define PROGMEM + #endif +#endif + +// Include the processor specific drivers +#if defined(CONFIG_IDF_TARGET_ESP32S3) + #include "Processors/TFT_eSPI_ESP32_S3.h" +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #include "Processors/TFT_eSPI_ESP32_C3.h" +#elif defined (ESP32) + #include "Processors/TFT_eSPI_ESP32.h" +#elif defined (ARDUINO_ARCH_ESP8266) + #include "Processors/TFT_eSPI_ESP8266.h" +#elif defined (STM32) + #include "Processors/TFT_eSPI_STM32.h" +#elif defined(ARDUINO_ARCH_RP2040) + #include "Processors/TFT_eSPI_RP2040.h" +#else + #include "Processors/TFT_eSPI_Generic.h" + #define GENERIC_PROCESSOR +#endif + +/*************************************************************************************** +** Section 3: Interface setup +***************************************************************************************/ +#ifndef TAB_COLOUR + #define TAB_COLOUR 0 +#endif + +// If the SPI frequency is not defined, set a default +#ifndef SPI_FREQUENCY + #define SPI_FREQUENCY 20000000 +#endif + +// If the SPI read frequency is not defined, set a default +#ifndef SPI_READ_FREQUENCY + #define SPI_READ_FREQUENCY 10000000 +#endif + +// Some ST7789 boards do not work with Mode 0 +#ifndef TFT_SPI_MODE + #if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER) + #define TFT_SPI_MODE SPI_MODE0 + #else + #define TFT_SPI_MODE SPI_MODE0 + #endif +#endif + +// If the XPT2046 SPI frequency is not defined, set a default +#ifndef SPI_TOUCH_FREQUENCY + #define SPI_TOUCH_FREQUENCY 2500000 +#endif + +#ifndef SPI_BUSY_CHECK + #define SPI_BUSY_CHECK +#endif + +// If half duplex SDA mode is defined then MISO pin should be -1 +#ifdef TFT_SDA_READ + #ifdef TFT_MISO + #if TFT_MISO != -1 + #undef TFT_MISO + #define TFT_MISO -1 + #warning TFT_MISO set to -1 + #endif + #endif +#endif + +/*************************************************************************************** +** Section 4: Setup fonts +***************************************************************************************/ +// Use GLCD font in error case where user requests a smooth font file +// that does not exist (this is a temporary fix to stop ESP32 reboot) +#ifdef SMOOTH_FONT + #ifndef LOAD_GLCD + #define LOAD_GLCD + #endif +#endif + +// Only load the fonts defined in User_Setup.h (to save space) +// Set flag so RLE rendering code is optionally compiled +#ifdef LOAD_GLCD + #include +#endif + +#ifdef LOAD_FONT2 + #include +#endif + +#ifdef LOAD_FONT4 + #include + #define LOAD_RLE +#endif + +#ifdef LOAD_FONT6 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_FONT7 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_FONT8 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#elif defined LOAD_FONT8N // Optional narrower version + #define LOAD_FONT8 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_GFXFF + // We can include all the free fonts and they will only be built into + // the sketch if they are used + #include + // Call up any user custom fonts + #include +#endif // #ifdef LOAD_GFXFF + +// Create a null default font in case some fonts not used (to prevent crash) +const uint8_t widtbl_null[1] = {0}; +PROGMEM const uint8_t chr_null[1] = {0}; +PROGMEM const uint8_t* const chrtbl_null[1] = {chr_null}; + +// This is a structure to conveniently hold information on the default fonts +// Stores pointer to font character image address table, width table and height +typedef struct { + const uint8_t *chartbl; + const uint8_t *widthtbl; + uint8_t height; + uint8_t baseline; + } fontinfo; + +// Now fill the structure +const PROGMEM fontinfo fontdata [] = { + #ifdef LOAD_GLCD + { (const uint8_t *)font, widtbl_null, 0, 0 }, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + // GLCD font (Font 1) does not have all parameters + { (const uint8_t *)chrtbl_null, widtbl_null, 8, 7 }, + + #ifdef LOAD_FONT2 + { (const uint8_t *)chrtbl_f16, widtbl_f16, chr_hgt_f16, baseline_f16}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + // Font 3 current unused + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + + #ifdef LOAD_FONT4 + { (const uint8_t *)chrtbl_f32, widtbl_f32, chr_hgt_f32, baseline_f32}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + // Font 5 current unused + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + + #ifdef LOAD_FONT6 + { (const uint8_t *)chrtbl_f64, widtbl_f64, chr_hgt_f64, baseline_f64}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + #ifdef LOAD_FONT7 + { (const uint8_t *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s, baseline_f7s}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + #ifdef LOAD_FONT8 + { (const uint8_t *)chrtbl_f72, widtbl_f72, chr_hgt_f72, baseline_f72} + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 } + #endif +}; + +/*************************************************************************************** +** Section 5: Font datum enumeration +***************************************************************************************/ +//These enumerate the text plotting alignment (reference datum point) +#define TL_DATUM 0 // Top left (default) +#define TC_DATUM 1 // Top centre +#define TR_DATUM 2 // Top right +#define ML_DATUM 3 // Middle left +#define CL_DATUM 3 // Centre left, same as above +#define MC_DATUM 4 // Middle centre +#define CC_DATUM 4 // Centre centre, same as above +#define MR_DATUM 5 // Middle right +#define CR_DATUM 5 // Centre right, same as above +#define BL_DATUM 6 // Bottom left +#define BC_DATUM 7 // Bottom centre +#define BR_DATUM 8 // Bottom right +#define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on) +#define C_BASELINE 10 // Centre character baseline +#define R_BASELINE 11 // Right character baseline + +/*************************************************************************************** +** Section 6: Colour enumeration +***************************************************************************************/ +// Default color definitions +#define TFT_BLACK 0x0000 /* 0, 0, 0 */ +#define TFT_NAVY 0x000F /* 0, 0, 128 */ +#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define TFT_MAROON 0x7800 /* 128, 0, 0 */ +#define TFT_PURPLE 0x780F /* 128, 0, 128 */ +#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define TFT_LIGHTGREY 0xD69A /* 211, 211, 211 */ +#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define TFT_BLUE 0x001F /* 0, 0, 255 */ +#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ +#define TFT_CYAN 0x07FF /* 0, 255, 255 */ +#define TFT_RED 0xF800 /* 255, 0, 0 */ +#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ +#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ +#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ +#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define TFT_PINK 0xFE19 /* 255, 192, 203 */ //Lighter pink, was 0xFC9F +#define TFT_BROWN 0x9A60 /* 150, 75, 0 */ +#define TFT_GOLD 0xFEA0 /* 255, 215, 0 */ +#define TFT_SILVER 0xC618 /* 192, 192, 192 */ +#define TFT_SKYBLUE 0x867D /* 135, 206, 235 */ +#define TFT_VIOLET 0x915C /* 180, 46, 226 */ + +// Next is a special 16-bit colour value that encodes to 8 bits +// and will then decode back to the same 16-bit value. +// Convenient for 8-bit and 16-bit transparent sprites. +#define TFT_TRANSPARENT 0x0120 // This is actually a dark green + +// Default palette for 4-bit colour sprites +static const uint16_t default_4bit_palette[] PROGMEM = { + TFT_BLACK, // 0 ^ + TFT_BROWN, // 1 | + TFT_RED, // 2 | + TFT_ORANGE, // 3 | + TFT_YELLOW, // 4 Colours 0-9 follow the resistor colour code! + TFT_GREEN, // 5 | + TFT_BLUE, // 6 | + TFT_PURPLE, // 7 | + TFT_DARKGREY, // 8 | + TFT_WHITE, // 9 v + TFT_CYAN, // 10 Blue+green mix + TFT_MAGENTA, // 11 Blue+red mix + TFT_MAROON, // 12 Darker red colour + TFT_DARKGREEN,// 13 Darker green colour + TFT_NAVY, // 14 Darker blue colour + TFT_PINK // 15 +}; + +/*************************************************************************************** +** Section 7: Diagnostic support +***************************************************************************************/ +// #define TFT_eSPI_DEBUG // Switch on debug support serial messages (not used yet) +// #define TFT_eSPI_FNx_DEBUG // Switch on debug support for function "x" (not used yet) + +// This structure allows sketches to retrieve the user setup parameters at runtime +// by calling getSetup(), zero impact on code size unless used, mainly for diagnostics +typedef struct +{ +String version = TFT_ESPI_VERSION; +String setup_info; // Setup reference name available to use in a user setup +uint32_t setup_id; // ID available to use in a user setup +int32_t esp; // Processor code +uint8_t trans; // SPI transaction support +uint8_t serial; // Serial (SPI) or parallel +#ifndef GENERIC_PROCESSOR +uint8_t port; // SPI port +#endif +uint8_t overlap; // ESP8266 overlap mode +uint8_t interface; // Interface type + +uint16_t tft_driver; // Hexadecimal code +uint16_t tft_width; // Rotation 0 width and height +uint16_t tft_height; + +uint8_t r0_x_offset; // Display offsets, not all used yet +uint8_t r0_y_offset; +uint8_t r1_x_offset; +uint8_t r1_y_offset; +uint8_t r2_x_offset; +uint8_t r2_y_offset; +uint8_t r3_x_offset; +uint8_t r3_y_offset; + +int8_t pin_tft_mosi; // SPI pins +int8_t pin_tft_miso; +int8_t pin_tft_clk; +int8_t pin_tft_cs; + +int8_t pin_tft_dc; // Control pins +int8_t pin_tft_rd; +int8_t pin_tft_wr; +int8_t pin_tft_rst; + +int8_t pin_tft_d0; // Parallel port pins +int8_t pin_tft_d1; +int8_t pin_tft_d2; +int8_t pin_tft_d3; +int8_t pin_tft_d4; +int8_t pin_tft_d5; +int8_t pin_tft_d6; +int8_t pin_tft_d7; + +int8_t pin_tft_led; +int8_t pin_tft_led_on; + +int8_t pin_tch_cs; // Touch chip select pin + +int16_t tft_spi_freq;// TFT write SPI frequency +int16_t tft_rd_freq; // TFT read SPI frequency +int16_t tch_spi_freq;// Touch controller read/write SPI frequency +} setup_t; + +/*************************************************************************************** +** Section 8: Class member and support functions +***************************************************************************************/ + +// Callback prototype for smooth font pixel colour read +typedef uint16_t (*getColorCallback)(uint16_t x, uint16_t y); + +// Class functions and variables +class TFT_eSPI : public Print { friend class TFT_eSprite; // Sprite class has access to protected members + + //--------------------------------------- public ------------------------------------// + public: + + TFT_eSPI(int16_t _W = TFT_WIDTH, int16_t _H = TFT_HEIGHT); + + // init() and begin() are equivalent, begin() included for backwards compatibility + // Sketch defined tab colour option is for ST7735 displays only + void init(uint8_t tc = TAB_COLOUR), begin(uint8_t tc = TAB_COLOUR); + + // These are virtual so the TFT_eSprite class can override them with sprite specific functions + virtual void drawPixel(int32_t x, int32_t y, uint32_t color), + drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size), + drawLine(int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color), + drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color), + drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color), + fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); + + virtual int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font), + drawChar(uint16_t uniCode, int32_t x, int32_t y), + height(void), + width(void); + + // Read the colour of a pixel at x,y and return value in 565 format + virtual uint16_t readPixel(int32_t x, int32_t y); + + virtual void setWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye); // Note: start + end coordinates + + // Push (aka write pixel) colours to the set window + virtual void pushColor(uint16_t color); + + // These are non-inlined to enable override + virtual void begin_nin_write(); + virtual void end_nin_write(); + + void setRotation(uint8_t r); // Set the display image orientation to 0, 1, 2 or 3 + uint8_t getRotation(void); // Read the current rotation + + // Change the origin position from the default top left + // Note: setRotation, setViewport and resetViewport will revert origin to top left corner of screen/sprite + void setOrigin(int32_t x, int32_t y); + int32_t getOriginX(void); + int32_t getOriginY(void); + + void invertDisplay(bool i); // Tell TFT to invert all displayed colours + + + // The TFT_eSprite class inherits the following functions (not all are useful to Sprite class + void setAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); // Note: start coordinates + width and height + + // Viewport commands, see "Viewport_Demo" sketch + void setViewport(int32_t x, int32_t y, int32_t w, int32_t h, bool vpDatum = true); + bool checkViewport(int32_t x, int32_t y, int32_t w, int32_t h); + int32_t getViewportX(void); + int32_t getViewportY(void); + int32_t getViewportWidth(void); + int32_t getViewportHeight(void); + bool getViewportDatum(void); + void frameViewport(uint16_t color, int32_t w); + void resetViewport(void); + + // Clip input window to viewport bounds, return false if whole area is out of bounds + bool clipAddrWindow(int32_t* x, int32_t* y, int32_t* w, int32_t* h); + // Clip input window area to viewport bounds, return false if whole area is out of bounds + bool clipWindow(int32_t* xs, int32_t* ys, int32_t* xe, int32_t* ye); + + // Push (aka write pixel) colours to the TFT (use setAddrWindow() first) + void pushColor(uint16_t color, uint32_t len), // Deprecated, use pushBlock() + pushColors(uint16_t *data, uint32_t len, bool swap = true), // With byte swap option + pushColors(uint8_t *data, uint32_t len); // Deprecated, use pushPixels() + + // Write a solid block of a single colour + void pushBlock(uint16_t color, uint32_t len); + + // Write a set of pixels stored in memory, use setSwapBytes(true/false) function to correct endianess + void pushPixels(const void * data_in, uint32_t len); + + // Support for half duplex (bi-directional SDA) SPI bus where MOSI must be switched to input + #ifdef TFT_SDA_READ + #if defined (TFT_eSPI_ENABLE_8_BIT_READ) + uint8_t tft_Read_8(void); // Read 8-bit value from TFT command register + #endif + void begin_SDA_Read(void); // Begin a read on a half duplex (bi-directional SDA) SPI bus - sets MOSI to input + void end_SDA_Read(void); // Restore MOSI to output + #endif + + + // Graphics drawing + void fillScreen(uint32_t color), + drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), + drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color), + fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color); + + void fillRectVGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2); + void fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2); + + void drawCircle(int32_t x, int32_t y, int32_t r, uint32_t color), + drawCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, uint32_t color), + fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color), + fillCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, int32_t delta, uint32_t color), + + drawEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), + fillEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), + + // Corner 1 Corner 2 Corner 3 + drawTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color), + fillTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color); + + + // Smooth (anti-aliased) graphics drawing + // Draw a pixel blended with the background pixel colour (bg_color) specified, return blended colour + // If the bg_color is not specified, the background pixel colour will be read from TFT or sprite + uint16_t drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased (smooth) arc between start and end angles. Arc ends are anti-aliased. + // By default the arc is drawn with square ends unless the "roundEnds" parameter is included and set true + // Angle = 0 is at 6 o'clock position, 90 at 9 o'clock etc. The angles must be in range 0-360 or they will be clipped to these limits + // The start angle may be larger than the end angle. Arcs are always drawn clockwise from the start angle. + void drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds = false); + + // As per "drawSmoothArc" except the ends of the arc are NOT anti-aliased, this facilitates dynamic arc length changes with + // arc segments and ensures clean segment joints. + // The sides of the arc are anti-aliased by default. If smoothArc is false sides will NOT be anti-aliased + void drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smoothArc = true); + + // Draw an anti-aliased filled circle at x, y with radius r + // Note: The thickness of line is 3 pixels to reduce the visible "braiding" effect of anti-aliasing narrow lines + // this means the inner anti-alias zone is always at r-1 and the outer zone at r+1 + void drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color); + + // Draw an anti-aliased filled circle at x, y with radius r + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, uint32_t bg_color = 0x00FFFFFF); + + // Draw a rounded rectangle that has a line thickness of r-ir+1 and bounding box defined by x,y and w,h + // The outer corner radius is r, inner corner radius is ir + // The inside and outside of the border are anti-aliased + void drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF, uint8_t quadrants = 0xF); + + // Draw a filled rounded rectangle , corner radius r and bounding box defined by x,y and w,h + void fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color, uint32_t bg_color = 0x00FFFFFF); + + // Draw a small anti-aliased filled circle at ax,ay with radius r (uses drawWideLine) + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawSpot(float ax, float ay, float r, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased wide line from ax,ay to bx,by width wd with radiused ends (radius is wd/2) + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawWideLine(float ax, float ay, float bx, float by, float wd, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased wide line from ax,ay to bx,by with different width at each end aw, bw and with radiused ends + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawWedgeLine(float ax, float ay, float bx, float by, float aw, float bw, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + + // Image rendering + // Swap the byte order for pushImage() and pushPixels() - corrects endianness + void setSwapBytes(bool swap); + bool getSwapBytes(void); + + // Draw bitmap + void drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), + drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor), + drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), + drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor), + setBitmapColor(uint16_t fgcolor, uint16_t bgcolor); // Define the 2 colours for 1bpp sprites + + // Set TFT pivot point (use when rendering rotated sprites) + void setPivot(int16_t x, int16_t y); + int16_t getPivotX(void), // Get pivot x + getPivotY(void); // Get pivot y + + // The next functions can be used as a pair to copy screen blocks (or horizontal/vertical lines) to another location + // Read a block of pixels to a data buffer, buffer is 16-bit and the size must be at least w * h + void readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + // Write a block of pixels to the screen which have been read by readRect() + void pushRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + + // These are used to render images or sprites stored in RAM arrays (used by Sprite class for 16bpp Sprites) + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transparent); + + // These are used to render images stored in FLASH (PROGMEM) + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transparent); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data); + + // These are used by Sprite class pushSprite() member function for 1, 4 and 8 bits per pixel (bpp) colours + // They are not intended to be used with user sketches (but could be) + // Set bpp8 true for 8bpp sprites, false otherwise. The cmap pointer must be specified for 4bpp + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8 = true, uint16_t *cmap = nullptr); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transparent, bool bpp8 = true, uint16_t *cmap = nullptr); + // FLASH version + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap = nullptr); + + // Render a 16-bit colour image with a 1bpp mask + void pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *img, uint8_t *mask); + + // This next function has been used successfully to dump the TFT screen to a PC for documentation purposes + // It reads a screen area and returns the 3 RGB 8-bit colour values of each pixel in the buffer + // Set w and h to 1 to read 1 pixel's colour. The data buffer must be at least w * h * 3 bytes + void readRectRGB(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data); + + + // Text rendering - value returned is the pixel width of the rendered text + int16_t drawNumber(long intNumber, int32_t x, int32_t y, uint8_t font), // Draw integer using specified font number + drawNumber(long intNumber, int32_t x, int32_t y), // Draw integer using current font + + // Decimal is the number of decimal places to render + // Use with setTextDatum() to position values on TFT, and setTextPadding() to blank old displayed values + drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y, uint8_t font), // Draw float using specified font number + drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y), // Draw float using current font + + // Handle char arrays + // Use with setTextDatum() to position string on TFT, and setTextPadding() to blank old displayed strings + drawString(const char *string, int32_t x, int32_t y, uint8_t font), // Draw string using specified font number + drawString(const char *string, int32_t x, int32_t y), // Draw string using current font + drawString(const String& string, int32_t x, int32_t y, uint8_t font),// Draw string using specified font number + drawString(const String& string, int32_t x, int32_t y), // Draw string using current font + + drawCentreString(const char *string, int32_t x, int32_t y, uint8_t font), // Deprecated, use setTextDatum() and drawString() + drawRightString(const char *string, int32_t x, int32_t y, uint8_t font), // Deprecated, use setTextDatum() and drawString() + drawCentreString(const String& string, int32_t x, int32_t y, uint8_t font),// Deprecated, use setTextDatum() and drawString() + drawRightString(const String& string, int32_t x, int32_t y, uint8_t font); // Deprecated, use setTextDatum() and drawString() + + + // Text rendering and font handling support functions + void setCursor(int16_t x, int16_t y), // Set cursor for tft.print() + setCursor(int16_t x, int16_t y, uint8_t font); // Set cursor and font number for tft.print() + + int16_t getCursorX(void), // Read current cursor x position (moves with tft.print()) + getCursorY(void); // Read current cursor y position + + void setTextColor(uint16_t color), // Set character (glyph) color only (background not over-written) + setTextColor(uint16_t fgcolor, uint16_t bgcolor, bool bgfill = false), // Set character (glyph) foreground and background colour, optional background fill for smooth fonts + setTextSize(uint8_t size); // Set character size multiplier (this increases pixel size) + + void setTextWrap(bool wrapX, bool wrapY = false); // Turn on/off wrapping of text in TFT width and/or height + + void setTextDatum(uint8_t datum); // Set text datum position (default is top left), see Section 5 above + uint8_t getTextDatum(void); + + void setTextPadding(uint16_t x_width); // Set text padding (background blanking/over-write) width in pixels + uint16_t getTextPadding(void); // Get text padding + +#ifdef LOAD_GFXFF + void setFreeFont(const GFXfont *f = NULL), // Select the GFX Free Font + setTextFont(uint8_t font); // Set the font number to use in future +#else + void setFreeFont(uint8_t font), // Not used, historical fix to prevent an error + setTextFont(uint8_t font); // Set the font number to use in future +#endif + + int16_t textWidth(const char *string, uint8_t font), // Returns pixel width of string in specified font + textWidth(const char *string), // Returns pixel width of string in current font + textWidth(const String& string, uint8_t font), // As above for String types + textWidth(const String& string), + fontHeight(uint8_t font), // Returns pixel height of specified font + fontHeight(void); // Returns pixel height of current font + + // Used by library and Smooth font class to extract Unicode point codes from a UTF8 encoded string + uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining), + decodeUTF8(uint8_t c); + + // Support function to UTF8 decode and draw characters piped through print stream + size_t write(uint8_t); + // size_t write(const uint8_t *buf, size_t len); + + // Used by Smooth font class to fetch a pixel colour for the anti-aliasing + void setCallback(getColorCallback getCol); + + uint16_t fontsLoaded(void); // Each bit in returned value represents a font type that is loaded - used for debug/error handling only + + + // Low level read/write + void spiwrite(uint8_t); // legacy support only +#ifdef RM68120_DRIVER + void writecommand(uint16_t c); // Send a 16-bit command, function resets DC/RS high ready for data + void writeRegister8(uint16_t c, uint8_t d); // Write 8-bit data data to 16-bit command register + void writeRegister16(uint16_t c, uint16_t d); // Write 16-bit data data to 16-bit command register +#else + void writecommand(uint8_t c); // Send an 8-bit command, function resets DC/RS high ready for data +#endif + void writedata(uint8_t d); // Send data with DC/RS set high + + void commandList(const uint8_t *addr); // Send a initialisation sequence to TFT stored in FLASH + + uint8_t readcommand8( uint8_t cmd_function, uint8_t index = 0); // read 8 bits from TFT + uint16_t readcommand16(uint8_t cmd_function, uint8_t index = 0); // read 16 bits from TFT + uint32_t readcommand32(uint8_t cmd_function, uint8_t index = 0); // read 32 bits from TFT + + + // Colour conversion + // Convert 8-bit red, green and blue to 16 bits + uint16_t color565(uint8_t red, uint8_t green, uint8_t blue); + + // Convert 8-bit colour to 16 bits + uint16_t color8to16(uint8_t color332); + // Convert 16-bit colour to 8 bits + uint8_t color16to8(uint16_t color565); + + // Convert 16-bit colour to/from 24-bit, R+G+B concatenated into LS 24 bits + uint32_t color16to24(uint16_t color565); + uint32_t color24to16(uint32_t color888); + + // Alpha blend 2 colours, see generic "alphaBlend_Test" example + // alpha = 0 = 100% background colour + // alpha = 255 = 100% foreground colour + uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc); + + // 16-bit colour alphaBlend with alpha dither (dither reduces colour banding) + uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc, uint8_t dither); + // 24-bit colour alphaBlend with optional alpha dither + uint32_t alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, uint8_t dither = 0); + + // Direct Memory Access (DMA) support functions + // These can be used for SPI writes when using the ESP32 (original) or STM32 processors. + // DMA also works on a RP2040 processor with PIO based SPI and parallel (8 and 16-bit) interfaces + // Bear in mind DMA will only be of benefit in particular circumstances and can be tricky + // to manage by noobs. The functions have however been designed to be noob friendly and + // avoid a few DMA behaviour "gotchas". + // + // At best you will get a 2x TFT rendering performance improvement when using DMA because + // this library handles the SPI bus so efficiently during normal (non DMA) transfers. The best + // performance improvement scenario is the DMA transfer time is exactly the same as the time it + // takes for the processor to prepare the next image buffer and initiate another DMA transfer. + // + // DMA transfer to the TFT is done while the processor moves on to handle other tasks. Bear + // this in mind and watch out for "gotchas" like the image buffer going out of scope as the + // processor leaves a function or its content being changed while the DMA engine is reading it. + // + // The compiler MAY change the implied scope of a buffer which has been set aside by creating + // an array. For example a buffer defined before a "for-next" loop may get de-allocated when + // the loop ends. To avoid this use, for example, malloc() and free() to take control of when + // the buffer space is available and ensure it is not released until DMA is complete. + // + // Clearly you should not modify a buffer that is being DMA'ed to the TFT until the DMA is over. + // Use the dmaBusy() function to check this. Use tft.startWrite() before invoking DMA so the + // TFT chip select stays low. If you use tft.endWrite() before DMA is complete then the endWrite + // function will wait for the DMA to complete, so this may defeat any DMA performance benefit. + // + + bool initDMA(bool ctrl_cs = false); // Initialise the DMA engine and attach to SPI bus - typically used in setup() + // Parameter "true" enables DMA engine control of TFT chip select (ESP32 only) + // For ESP32 only, TFT reads will not work if parameter is true + void deInitDMA(void); // De-initialise the DMA engine and detach from SPI bus - typically not used + + // Push an image to the TFT using DMA, buffer is optional and grabs (double buffers) a copy of the image + // Use the buffer if the image data will get over-written or destroyed while DMA is in progress + // + // Note 1: If swapping colour bytes is defined, and the double buffer option is NOT used, then the bytes + // in the original image buffer content will be byte swapped by the function before DMA is initiated. + // + // Note 2: If part of the image will be off screen or outside of a set viewport, then the the original + // image buffer content will be altered to a correctly clipped image before DMA is initiated. + // + // The function will wait for the last DMA to complete if it is called while a previous DMA is still + // in progress, this simplifies the sketch and helps avoid "gotchas". + void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* data, uint16_t* buffer = nullptr); + +#if defined (ESP32) // ESP32 only at the moment + // For case where pointer is a const and the image data must not be modified (clipped or byte swapped) + void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t const* data); +#endif + // Push a block of pixels into a window set up using setAddrWindow() + void pushPixelsDMA(uint16_t* image, uint32_t len); + + // Check if the DMA is complete - use while(tft.dmaBusy); for a blocking wait + bool dmaBusy(void); // returns true if DMA is still in progress + void dmaWait(void); // wait until DMA is complete + + bool DMA_Enabled = false; // Flag for DMA enabled state + uint8_t spiBusyCheck = 0; // Number of ESP32 transfer buffers to check + + // Bare metal functions + void startWrite(void); // Begin SPI transaction + void writeColor(uint16_t color, uint32_t len); // Deprecated, use pushBlock() + void endWrite(void); // End SPI transaction + + // Set/get an arbitrary library configuration attribute or option + // Use to switch ON/OFF capabilities such as UTF8 decoding - each attribute has a unique ID + // id = 0: reserved - may be used in future to reset all attributes to a default state + // id = 1: Turn on (a=true) or off (a=false) GLCD cp437 font character error correction + // id = 2: Turn on (a=true) or off (a=false) UTF8 decoding + // id = 3: Enable or disable use of ESP32 PSRAM (if available) + #define CP437_SWITCH 1 + #define UTF8_SWITCH 2 + #define PSRAM_ENABLE 3 + void setAttribute(uint8_t id = 0, uint8_t a = 0); // Set attribute value + uint8_t getAttribute(uint8_t id = 0); // Get attribute value + + // Used for diagnostic sketch to see library setup adopted by compiler, see Section 7 above + void getSetup(setup_t& tft_settings); // Sketch provides the instance to populate + bool verifySetupID(uint32_t id); + + // Global variables +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) + static SPIClass& getSPIinstance(void); // Get SPI class handle +#endif + uint32_t textcolor, textbgcolor; // Text foreground and background colours + + uint32_t bitmap_fg, bitmap_bg; // Bitmap foreground (bit=1) and background (bit=0) colours + + uint8_t textfont, // Current selected font number + textsize, // Current font size multiplier + textdatum, // Text reference datum + rotation; // Display rotation (0-3) + + uint8_t decoderState = 0; // UTF8 decoder state - not for user access + uint16_t decoderBuffer; // Unicode code-point buffer - not for user access + + //--------------------------------------- private ------------------------------------// + private: + // Legacy begin and end prototypes - deprecated TODO: delete + void spi_begin(); + void spi_end(); + + void spi_begin_read(); + void spi_end_read(); + + // New begin and end prototypes + // begin/end a TFT write transaction + // For SPI bus the transmit clock rate is set + inline void begin_tft_write() __attribute__((always_inline)); + inline void end_tft_write() __attribute__((always_inline)); + + // begin/end a TFT read transaction + // For SPI bus: begin lowers SPI clock rate, end reinstates transmit clock rate + inline void begin_tft_read() __attribute__((always_inline)); + inline void end_tft_read() __attribute__((always_inline)); + + // Initialise the data bus GPIO and hardware interfaces + void initBus(void); + + // Temporary library development function TODO: remove need for this + void pushSwapBytePixels(const void* data_in, uint32_t len); + + // Same as setAddrWindow but exits with CGRAM in read mode + void readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); + + // Byte read prototype + uint8_t readByte(void); + + // GPIO parallel bus input/output direction control + void busDir(uint32_t mask, uint8_t mode); + + // Single GPIO input/output direction control + void gpioMode(uint8_t gpio, uint8_t mode); + + // Smooth graphics helper + uint8_t sqrt_fraction(uint32_t num); + + // Helper function: calculate distance of a point from a finite length line between two points + float wedgeLineDistance(float pax, float pay, float bax, float bay, float dr); + + // Display variant settings + uint8_t tabcolor, // ST7735 screen protector "tab" colour (now invalid) + colstart = 0, rowstart = 0; // Screen display area to CGRAM area coordinate offsets + + // Port and pin masks for control signals (ESP826 only) - TODO: remove need for this + volatile uint32_t *dcport, *csport; + uint32_t cspinmask, dcpinmask, wrpinmask, sclkpinmask; + + #if defined(ESP32_PARALLEL) + // Bit masks for ESP32 parallel bus interface + uint32_t xclr_mask, xdir_mask; // Port set/clear and direction control masks + + // Lookup table for ESP32 parallel bus interface uses 1kbyte RAM, + uint32_t xset_mask[256]; // Makes Sprite rendering test 33% faster, for slower macro equivalent + // see commented out #define set_mask(C) within TFT_eSPI_ESP32.h + #endif + + //uint32_t lastColor = 0xFFFF; // Last colour - used to minimise bit shifting overhead + + getColorCallback getColor = nullptr; // Smooth font callback function pointer + + bool locked, inTransaction, lockTransaction; // SPI transaction and mutex lock flags + + //-------------------------------------- protected ----------------------------------// + protected: + + //int32_t win_xe, win_ye; // Window end coords - not needed + + int32_t _init_width, _init_height; // Display w/h as input, used by setRotation() + int32_t _width, _height; // Display w/h as modified by current rotation + int32_t addr_row, addr_col; // Window position - used to minimise window commands + + int16_t _xPivot; // TFT x pivot point coordinate for rotated Sprites + int16_t _yPivot; // TFT x pivot point coordinate for rotated Sprites + + // Viewport variables + int32_t _vpX, _vpY, _vpW, _vpH; // Note: x start, y start, x end + 1, y end + 1 + int32_t _xDatum; + int32_t _yDatum; + int32_t _xWidth; + int32_t _yHeight; + bool _vpDatum; + bool _vpOoB; + + int32_t cursor_x, cursor_y, padX; // Text cursor x,y and padding setting + int32_t bg_cursor_x; // Background fill cursor + int32_t last_cursor_x; // Previous text cursor position when fill used + + uint32_t fontsloaded; // Bit field of fonts loaded + + uint8_t glyph_ab, // Smooth font glyph delta Y (height) above baseline + glyph_bb; // Smooth font glyph delta Y (height) below baseline + + bool isDigits; // adjust bounding box for numbers to reduce visual jiggling + bool textwrapX, textwrapY; // If set, 'wrap' text at right and optionally bottom edge of display + bool _swapBytes; // Swap the byte order for TFT pushImage() + + bool _booted; // init() or begin() has already run once + + // User sketch manages these via set/getAttribute() + bool _cp437; // If set, use correct CP437 charset (default is OFF) + bool _utf8; // If set, use UTF-8 decoder in print stream 'write()' function (default ON) + bool _psram_enable; // Enable PSRAM use for library functions (TBD) and Sprites + + uint32_t _lastColor; // Buffered value of last colour used + + bool _fillbg; // Fill background flag (just for for smooth fonts at the moment) + +#if defined (SSD1963_DRIVER) + uint16_t Cswap; // Swap buffer for SSD1963 + uint8_t r6, g6, b6; // RGB buffer for SSD1963 +#endif + +#ifdef LOAD_GFXFF + GFXfont *gfxFont; +#endif + +/*************************************************************************************** +** Section 9: TFT_eSPI class conditional extensions +***************************************************************************************/ +// Load the Touch extension +#ifdef TOUCH_CS + #if defined (TFT_PARALLEL_8_BIT) || defined (RP2040_PIO_INTERFACE) + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #error >>>>------>> Touch functions not supported in 8/16-bit parallel mode or with RP2040 PIO. + #endif + #else + #include "Extensions/Touch.h" // Loaded if TOUCH_CS is defined by user + #endif +#else + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning >>>>------>> TOUCH_CS pin not defined, TFT_eSPI touch functions will not be available! + #endif +#endif + +// Load the Anti-aliased font extension +#ifdef SMOOTH_FONT + #include "Extensions/Smooth_font.h" // Loaded if SMOOTH_FONT is defined by user +#endif + +}; // End of class TFT_eSPI + +// Swap any type +template static inline void +transpose(T& a, T& b) { T t = a; a = b; b = t; } + +// Fast alphaBlend +template static inline uint16_t +fastBlend(A alpha, F fgc, B bgc) +{ + // Split out and blend 5-bit red and blue channels + uint32_t rxb = bgc & 0xF81F; + rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; + // Split out and blend 6-bit green channel + uint32_t xgx = bgc & 0x07E0; + xgx += ((fgc & 0x07E0) - xgx) * alpha >> 8; + // Recombine channels + return (rxb & 0xF81F) | (xgx & 0x07E0); +} + +/*************************************************************************************** +** Section 10: Additional extension classes +***************************************************************************************/ +// Load the Button Class +#include "Extensions/Button.h" + +// Load the Sprite Class +#include "Extensions/Sprite.h" + +#endif // ends #ifndef _TFT_eSPIH_ diff --git a/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/Create_font.pde b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/Create_font.pde new file mode 100644 index 0000000..1a07c5c --- /dev/null +++ b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/Create_font.pde @@ -0,0 +1,570 @@ +// This is a Processing sketch, see https://processing.org/ to download the IDE + +// Select the font, size and character ranges in the user configuration section +// of this sketch, which starts at line 120. Instructions start at line 50. + + +/* +Software License Agreement (FreeBSD License) + + Copyright (c) 2018 Bodmer (https://github.com/Bodmer) + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of the FreeBSD Project. + */ + +//////////////////////////////////////////////////////////////////////////////////////////////// + +// This is a processing sketch to create font files for the TFT_eSPI library: + +// https://github.com/Bodmer/TFT_eSPI + +// Coded by Bodmer January 2018, updated 10/2/19 +// Version 0.8 + +// >>>>>>>>>>>>>>>>>>>> INSTRUCTIONS <<<<<<<<<<<<<<<<<<<< + +// See comments below in code for specifying the font parameters (point size, +// unicode blocks to include etc.). Ranges of characters (glyphs) and specific +// individual glyphs can be included in the created "*.vlw" font file. + +// Created fonts are saved in the sketches "FontFiles" folder. Press Ctrl+K to +// see that folder location. + +// 16-bit Unicode point codes in the range 0x0000 - 0xFFFF are supported. +// Codes 0-31 are control codes such as "tab" and "carraige return" etc. +// and 32 is a "space", these should NOT be included. + +// The sketch will convert True Type (a .ttf or .otf file) file stored in the +// sketches "Data" folder as well as your computers' system fonts. + +// To maximise rendering performance and the memory consumed only include the characters +// you will use. Characters at the start of the file will render faster than those at +// the end due to the buffering and file seeking overhead. + +// The inclusion of "non-existant" characters in a font may give unpredicatable results +// when rendering with the TFT_eSPI library. The Processing sketch window that pops up +// to show the font characters will print "boxes" (also known as Tofu!) for non existant +// characters. + +// Once created the files must be loaded into the ESP32 or ESP8266 SPIFFS memory +// using the Arduino IDE plugin detailed here: +// https://github.com/esp8266/arduino-esp8266fs-plugin +// https://github.com/me-no-dev/arduino-esp32fs-plugin + +// When the sketch is run it will generate a file called "System_Font_List.txt" in the +// sketch "FontFiles" folder, press Ctrl+K to see it. Open the file in a text editor to +// view it. This list provides the font reference number needed below to locate that +// font on your system. + +// The sketch also lists all the available system fonts to the console, you can increase +// the console line count (in preferences.txt) to stop some fonts scrolling out of view. +// See link in File>Preferences to locate "preferences.txt" file. You must close +// Processing then edit the file lines. If Processing is not closed first then the +// edits will be overwritten by defaults! Edit "preferences.txt" as follows for +// 3000 lines, then save, then run Processing again: + +// console.length=3000; // Line 4 in file +// console.scrollback.lines=3000; // Line 7 in file + + +// Useful links: +/* + + https://en.wikipedia.org/wiki/Unicode_font + + https://www.gnu.org/software/freefont/ + https://www.gnu.org/software/freefont/sources/ + https://www.gnu.org/software/freefont/ranges/ + http://savannah.gnu.org/projects/freefont/ + + http://www.google.com/get/noto/ + + https://github.com/Bodmer/TFT_eSPI + https://github.com/esp8266/arduino-esp8266fs-plugin + https://github.com/me-no-dev/arduino-esp32fs-plugin + + >>>>>>>>>>>>>>>>>>>> END OF INSTRUCTIONS <<<<<<<<<<<<<<<<<<<< */ + + +import java.awt.Desktop; // Required to allow sketch to open file windows + + +//////////////////////////////////////////////////////////////////////////////////////////////// + +// >>>>>>>>>> USER CONFIGURED PARAMETERS START HERE <<<<<<<<<< + +// Use font number or name, -1 for fontNumber means use fontName below, a value >=0 means use system font number from list. +// When the sketch is run it will generate a file called "systemFontList.txt" in the sketch folder, press Ctrl+K to see it. +// Open the "systemFontList.txt" in a text editor to view the font files and reference numbers for your system. + +int fontNumber = -1; // << Use [Number] in brackets from the fonts listed. + +// OR use font name for ttf files placed in the "Data" folder or the font number seen in IDE Console for system fonts +// the font numbers are listed when the sketch is run. +// | 1 2 | Maximum filename size for SPIFFS is 31 including leading / +// 1234567890123456789012345 and added point size and .vlw extension, so max is 25 +String fontName = "Final-Frontier"; // Manually crop the filename length later after creation if needed + // Note: SPIFFS does NOT accept underscore in a filename! +String fontType = ".ttf"; +//String fontType = ".otf"; + + +// Define the font size in points for the TFT_eSPI font file +int fontSize = 28; + +// Font size to use in the Processing sketch display window that pops up (can be different to above) +int displayFontSize = 28; + +// Create a C header (.h file) ready to be used or copied in your sketch folder +boolean createHeaderFile = true; + +// Automaticely open the folder with created files when done +boolean openFolder = true; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Next we specify which unicode blocks from the the Basic Multilingual Plane (BMP) are included in the final font file. // +// Note: The ttf/otf font file MAY NOT contain all possible Unicode characters, refer to the fonts online documentation. // +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static final int[] unicodeBlocks = { + // The list below has been created from the table here: https://en.wikipedia.org/wiki/Unicode_block + // Remove // at start of lines below to include that unicode block, different code ranges can also be specified by + // editing the start and end-of-range values. Multiple lines from the list below can be included, limited only by + // the final font file size! + + // Block range, //Block name, Code points, Assigned characters, Scripts + // First, last, //Range is inclusive of first and last codes + 0x0021, 0x007E, //Basic Latin, 128, 128, Latin (52 characters), Common (76 characters) + //0x0080, 0x00FF, //Latin-1 Supplement, 128, 128, Latin (64 characters), Common (64 characters) + //0x0100, 0x017F, //Latin Extended-A, 128, 128, Latin + //0x0180, 0x024F, //Latin Extended-B, 208, 208, Latin + //0x0250, 0x02AF, //IPA Extensions, 96, 96, Latin + //0x02B0, 0x02FF, //Spacing Modifier Letters, 80, 80, Bopomofo (2 characters), Latin (14 characters), Common (64 characters) + //0x0300, 0x036F, //Combining Diacritical Marks, 112, 112, Inherited + //0x0370, 0x03FF, //Greek and Coptic, 144, 135, Coptic (14 characters), Greek (117 characters), Common (4 characters) + //0x0400, 0x04FF, //Cyrillic, 256, 256, Cyrillic (254 characters), Inherited (2 characters) + //0x0500, 0x052F, //Cyrillic Supplement, 48, 48, Cyrillic + //0x0530, 0x058F, //Armenian, 96, 89, Armenian (88 characters), Common (1 character) + //0x0590, 0x05FF, //Hebrew, 112, 87, Hebrew + //0x0600, 0x06FF, //Arabic, 256, 255, Arabic (237 characters), Common (6 characters), Inherited (12 characters) + //0x0700, 0x074F, //Syriac, 80, 77, Syriac + //0x0750, 0x077F, //Arabic Supplement, 48, 48, Arabic + //0x0780, 0x07BF, //Thaana, 64, 50, Thaana + //0x07C0, 0x07FF, //NKo, 64, 59, Nko + //0x0800, 0x083F, //Samaritan, 64, 61, Samaritan + //0x0840, 0x085F, //Mandaic, 32, 29, Mandaic + //0x0860, 0x086F, //Syriac Supplement, 16, 11, Syriac + //0x08A0, 0x08FF, //Arabic Extended-A, 96, 73, Arabic (72 characters), Common (1 character) + //0x0900, 0x097F, //Devanagari, 128, 128, Devanagari (124 characters), Common (2 characters), Inherited (2 characters) + //0x0980, 0x09FF, //Bengali, 128, 95, Bengali + //0x0A00, 0x0A7F, //Gurmukhi, 128, 79, Gurmukhi + //0x0A80, 0x0AFF, //Gujarati, 128, 91, Gujarati + //0x0B00, 0x0B7F, //Oriya, 128, 90, Oriya + //0x0B80, 0x0BFF, //Tamil, 128, 72, Tamil + //0x0C00, 0x0C7F, //Telugu, 128, 96, Telugu + //0x0C80, 0x0CFF, //Kannada, 128, 88, Kannada + //0x0D00, 0x0D7F, //Malayalam, 128, 117, Malayalam + //0x0D80, 0x0DFF, //Sinhala, 128, 90, Sinhala + //0x0E00, 0x0E7F, //Thai, 128, 87, Thai (86 characters), Common (1 character) + //0x0E80, 0x0EFF, //Lao, 128, 67, Lao + //0x0F00, 0x0FFF, //Tibetan, 256, 211, Tibetan (207 characters), Common (4 characters) + //0x1000, 0x109F, //Myanmar, 160, 160, Myanmar + //0x10A0, 0x10FF, //Georgian, 96, 88, Georgian (87 characters), Common (1 character) + //0x1100, 0x11FF, //Hangul Jamo, 256, 256, Hangul + //0x1200, 0x137F, //Ethiopic, 384, 358, Ethiopic + //0x1380, 0x139F, //Ethiopic Supplement, 32, 26, Ethiopic + //0x13A0, 0x13FF, //Cherokee, 96, 92, Cherokee + //0x1400, 0x167F, //Unified Canadian Aboriginal Syllabics, 640, 640, Canadian Aboriginal + //0x1680, 0x169F, //Ogham, 32, 29, Ogham + //0x16A0, 0x16FF, //Runic, 96, 89, Runic (86 characters), Common (3 characters) + //0x1700, 0x171F, //Tagalog, 32, 20, Tagalog + //0x1720, 0x173F, //Hanunoo, 32, 23, Hanunoo (21 characters), Common (2 characters) + //0x1740, 0x175F, //Buhid, 32, 20, Buhid + //0x1760, 0x177F, //Tagbanwa, 32, 18, Tagbanwa + //0x1780, 0x17FF, //Khmer, 128, 114, Khmer + //0x1800, 0x18AF, //Mongolian, 176, 156, Mongolian (153 characters), Common (3 characters) + //0x18B0, 0x18FF, //Unified Canadian Aboriginal Syllabics Extended, 80, 70, Canadian Aboriginal + //0x1900, 0x194F, //Limbu, 80, 68, Limbu + //0x1950, 0x197F, //Tai Le, 48, 35, Tai Le + //0x1980, 0x19DF, //New Tai Lue, 96, 83, New Tai Lue + //0x19E0, 0x19FF, //Khmer Symbols, 32, 32, Khmer + //0x1A00, 0x1A1F, //Buginese, 32, 30, Buginese + //0x1A20, 0x1AAF, //Tai Tham, 144, 127, Tai Tham + //0x1AB0, 0x1AFF, //Combining Diacritical Marks Extended, 80, 15, Inherited + //0x1B00, 0x1B7F, //Balinese, 128, 121, Balinese + //0x1B80, 0x1BBF, //Sundanese, 64, 64, Sundanese + //0x1BC0, 0x1BFF, //Batak, 64, 56, Batak + //0x1C00, 0x1C4F, //Lepcha, 80, 74, Lepcha + //0x1C50, 0x1C7F, //Ol Chiki, 48, 48, Ol Chiki + //0x1C80, 0x1C8F, //Cyrillic Extended-C, 16, 9, Cyrillic + //0x1CC0, 0x1CCF, //Sundanese Supplement, 16, 8, Sundanese + //0x1CD0, 0x1CFF, //Vedic Extensions, 48, 42, Common (15 characters), Inherited (27 characters) + //0x1D00, 0x1D7F, //Phonetic Extensions, 128, 128, Cyrillic (2 characters), Greek (15 characters), Latin (111 characters) + //0x1D80, 0x1DBF, //Phonetic Extensions Supplement, 64, 64, Greek (1 character), Latin (63 characters) + //0x1DC0, 0x1DFF, //Combining Diacritical Marks Supplement, 64, 63, Inherited + //0x1E00, 0x1EFF, //Latin Extended Additional, 256, 256, Latin + //0x1F00, 0x1FFF, //Greek Extended, 256, 233, Greek + //0x2000, 0x206F, //General Punctuation, 112, 111, Common (109 characters), Inherited (2 characters) + //0x2070, 0x209F, //Superscripts and Subscripts, 48, 42, Latin (15 characters), Common (27 characters) + //0x20A0, 0x20CF, //Currency Symbols, 48, 32, Common + //0x20D0, 0x20FF, //Combining Diacritical Marks for Symbols, 48, 33, Inherited + //0x2100, 0x214F, //Letterlike Symbols, 80, 80, Greek (1 character), Latin (4 characters), Common (75 characters) + //0x2150, 0x218F, //Number Forms, 64, 60, Latin (41 characters), Common (19 characters) + //0x2190, 0x21FF, //Arrows, 112, 112, Common + //0x2200, 0x22FF, //Mathematical Operators, 256, 256, Common + //0x2300, 0x23FF, //Miscellaneous Technical, 256, 256, Common + //0x2400, 0x243F, //Control Pictures, 64, 39, Common + //0x2440, 0x245F, //Optical Character Recognition, 32, 11, Common + //0x2460, 0x24FF, //Enclosed Alphanumerics, 160, 160, Common + //0x2500, 0x257F, //Box Drawing, 128, 128, Common + //0x2580, 0x259F, //Block Elements, 32, 32, Common + //0x25A0, 0x25FF, //Geometric Shapes, 96, 96, Common + //0x2600, 0x26FF, //Miscellaneous Symbols, 256, 256, Common + //0x2700, 0x27BF, //Dingbats, 192, 192, Common + //0x27C0, 0x27EF, //Miscellaneous Mathematical Symbols-A, 48, 48, Common + //0x27F0, 0x27FF, //Supplemental Arrows-A, 16, 16, Common + //0x2800, 0x28FF, //Braille Patterns, 256, 256, Braille + //0x2900, 0x297F, //Supplemental Arrows-B, 128, 128, Common + //0x2980, 0x29FF, //Miscellaneous Mathematical Symbols-B, 128, 128, Common + //0x2A00, 0x2AFF, //Supplemental Mathematical Operators, 256, 256, Common + //0x2B00, 0x2BFF, //Miscellaneous Symbols and Arrows, 256, 207, Common + //0x2C00, 0x2C5F, //Glagolitic, 96, 94, Glagolitic + //0x2C60, 0x2C7F, //Latin Extended-C, 32, 32, Latin + //0x2C80, 0x2CFF, //Coptic, 128, 123, Coptic + //0x2D00, 0x2D2F, //Georgian Supplement, 48, 40, Georgian + //0x2D30, 0x2D7F, //Tifinagh, 80, 59, Tifinagh + //0x2D80, 0x2DDF, //Ethiopic Extended, 96, 79, Ethiopic + //0x2DE0, 0x2DFF, //Cyrillic Extended-A, 32, 32, Cyrillic + //0x2E00, 0x2E7F, //Supplemental Punctuation, 128, 74, Common + //0x2E80, 0x2EFF, //CJK Radicals Supplement, 128, 115, Han + //0x2F00, 0x2FDF, //Kangxi Radicals, 224, 214, Han + //0x2FF0, 0x2FFF, //Ideographic Description Characters, 16, 12, Common + //0x3000, 0x303F, //CJK Symbols and Punctuation, 64, 64, Han (15 characters), Hangul (2 characters), Common (43 characters), Inherited (4 characters) + //0x3040, 0x309F, //Hiragana, 96, 93, Hiragana (89 characters), Common (2 characters), Inherited (2 characters) + //0x30A0, 0x30FF, //Katakana, 96, 96, Katakana (93 characters), Common (3 characters) + //0x3100, 0x312F, //Bopomofo, 48, 42, Bopomofo + //0x3130, 0x318F, //Hangul Compatibility Jamo, 96, 94, Hangul + //0x3190, 0x319F, //Kanbun, 16, 16, Common + //0x31A0, 0x31BF, //Bopomofo Extended, 32, 27, Bopomofo + //0x31C0, 0x31EF, //CJK Strokes, 48, 36, Common + //0x31F0, 0x31FF, //Katakana Phonetic Extensions, 16, 16, Katakana + //0x3200, 0x32FF, //Enclosed CJK Letters and Months, 256, 254, Hangul (62 characters), Katakana (47 characters), Common (145 characters) + //0x3300, 0x33FF, //CJK Compatibility, 256, 256, Katakana (88 characters), Common (168 characters) + //0x3400, 0x4DBF, //CJK Unified Ideographs Extension A, 6,592, 6,582, Han + //0x4DC0, 0x4DFF, //Yijing Hexagram Symbols, 64, 64, Common + //0x4E00, 0x9FFF, //CJK Unified Ideographs, 20,992, 20,971, Han + //0xA000, 0xA48F, //Yi Syllables, 1,168, 1,165, Yi + //0xA490, 0xA4CF, //Yi Radicals, 64, 55, Yi + //0xA4D0, 0xA4FF, //Lisu, 48, 48, Lisu + //0xA500, 0xA63F, //Vai, 320, 300, Vai + //0xA640, 0xA69F, //Cyrillic Extended-B, 96, 96, Cyrillic + //0xA6A0, 0xA6FF, //Bamum, 96, 88, Bamum + //0xA700, 0xA71F, //Modifier Tone Letters, 32, 32, Common + //0xA720, 0xA7FF, //Latin Extended-D, 224, 160, Latin (155 characters), Common (5 characters) + //0xA800, 0xA82F, //Syloti Nagri, 48, 44, Syloti Nagri + //0xA830, 0xA83F, //Common Indic Number Forms, 16, 10, Common + //0xA840, 0xA87F, //Phags-pa, 64, 56, Phags Pa + //0xA880, 0xA8DF, //Saurashtra, 96, 82, Saurashtra + //0xA8E0, 0xA8FF, //Devanagari Extended, 32, 30, Devanagari + //0xA900, 0xA92F, //Kayah Li, 48, 48, Kayah Li (47 characters), Common (1 character) + //0xA930, 0xA95F, //Rejang, 48, 37, Rejang + //0xA960, 0xA97F, //Hangul Jamo Extended-A, 32, 29, Hangul + //0xA980, 0xA9DF, //Javanese, 96, 91, Javanese (90 characters), Common (1 character) + //0xA9E0, 0xA9FF, //Myanmar Extended-B, 32, 31, Myanmar + //0xAA00, 0xAA5F, //Cham, 96, 83, Cham + //0xAA60, 0xAA7F, //Myanmar Extended-A, 32, 32, Myanmar + //0xAA80, 0xAADF, //Tai Viet, 96, 72, Tai Viet + //0xAAE0, 0xAAFF, //Meetei Mayek Extensions, 32, 23, Meetei Mayek + //0xAB00, 0xAB2F, //Ethiopic Extended-A, 48, 32, Ethiopic + //0xAB30, 0xAB6F, //Latin Extended-E, 64, 54, Latin (52 characters), Greek (1 character), Common (1 character) + //0xAB70, 0xABBF, //Cherokee Supplement, 80, 80, Cherokee + //0xABC0, 0xABFF, //Meetei Mayek, 64, 56, Meetei Mayek + //0xAC00, 0xD7AF, //Hangul Syllables, 11,184, 11,172, Hangul + //0xD7B0, 0xD7FF, //Hangul Jamo Extended-B, 80, 72, Hangul + //0xD800, 0xDB7F, //High Surrogates, 896, 0, Unknown + //0xDB80, 0xDBFF, //High Private Use Surrogates, 128, 0, Unknown + //0xDC00, 0xDFFF, //Low Surrogates, 1,024, 0, Unknown + //0xE000, 0xF8FF, //Private Use Area, 6,400, 6,400, Unknown + //0xF900, 0xFAFF, //CJK Compatibility Ideographs, 512, 472, Han + //0xFB00, 0xFB4F, //Alphabetic Presentation Forms, 80, 58, Armenian (5 characters), Hebrew (46 characters), Latin (7 characters) + //0xFB50, 0xFDFF, //Arabic Presentation Forms-A, 688, 611, Arabic (609 characters), Common (2 characters) + //0xFE00, 0xFE0F, //Variation Selectors, 16, 16, Inherited + //0xFE10, 0xFE1F, //Vertical Forms, 16, 10, Common + //0xFE20, 0xFE2F, //Combining Half Marks, 16, 16, Cyrillic (2 characters), Inherited (14 characters) + //0xFE30, 0xFE4F, //CJK Compatibility Forms, 32, 32, Common + //0xFE50, 0xFE6F, //Small Form Variants, 32, 26, Common + //0xFE70, 0xFEFF, //Arabic Presentation Forms-B, 144, 141, Arabic (140 characters), Common (1 character) + //0xFF00, 0xFFEF, //Halfwidth and Fullwidth Forms, 240, 225, Hangul (52 characters), Katakana (55 characters), Latin (52 characters), Common (66 characters) + //0xFFF0, 0xFFFF, //Specials, 16, 5, Common + + //0x0030, 0x0039, //Example custom range (numbers 0-9) + //0x0041, 0x005A, //Example custom range (Upper case A-Z) + //0x0061, 0x007A, //Example custom range (Lower case a-z) +}; + +// Here we specify particular individual Unicodes to be included (appended at end of selected range) +static final int[] specificUnicodes = { + + // Commonly used codes, add or remove // in next line + // 0x00A3, 0x00B0, 0x00B5, 0x03A9, 0x20AC, // £ ° µ Ω € + + // Numbers and characters for showing time, change next line to //* to use +/* + 0x002B, 0x002D, 0x002E, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, // - + . 0 1 2 3 4 + 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x0061, 0x006D, // 5 6 7 8 9 : a m + 0x0070, // p + //*/ + + // More characters for TFT_eSPI test sketches, change next line to //* to use + /* + 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x010C, 0x010D, + 0x010E, 0x010F, 0x0110, 0x0111, 0x0118, 0x0119, 0x011A, 0x011B, + + 0x0131, 0x0139, 0x013A, 0x013D, 0x013E, 0x0141, 0x0142, 0x0143, + 0x0144, 0x0147, 0x0148, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154, + 0x0155, 0x0158, 0x0159, 0x015A, 0x015B, 0x015E, 0x015F, 0x0160, + 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x016E, 0x016F, 0x0170, + 0x0171, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, + 0x0192, + + 0x02C6, 0x02C7, 0x02D8, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD, + 0x03A9, 0x03C0, 0x2013, 0x2014, 0x2018, 0x2019, 0x201A, 0x201C, + 0x201D, 0x201E, 0x2020, 0x2021, 0x2022, 0x2026, 0x2030, 0x2039, + 0x203A, 0x2044, 0x20AC, + + 0x2122, 0x2202, 0x2206, 0x220F, + + 0x2211, 0x221A, 0x221E, 0x222B, 0x2248, 0x2260, 0x2264, 0x2265, + 0x25CA, + + 0xF8FF, 0xFB01, 0xFB02, + //*/ +}; + +// >>>>>>>>>> USER CONFIGURED PARAMETERS END HERE <<<<<<<<<< + +//////////////////////////////////////////////////////////////////////////////////////////////// + +// Variable to hold the inclusive Unicode range (16-bit values only for this sketch) +int firstUnicode = 0; +int lastUnicode = 0; + +PFont myFont; + +PrintWriter logOutput; + +void setup() { + logOutput = createWriter("FontFiles/System_Font_List.txt"); + + size(1000, 800); + + // Print the available fonts to the console as a list: + String[] fontList = PFont.list(); + printArray(fontList); + + // Save font list to file + for (int x = 0; x < fontList.length; x++) + { + logOutput.print("[" + x + "] "); + logOutput.println(fontList[x]); + } + logOutput.flush(); // Writes the remaining data to the file + logOutput.close(); // Finishes the file + + // Set the fontName from the array number or the defined fontName + if (fontNumber >= 0) + { +// fontName = fontList[fontNumber]; + fontType = ""; + } + + char[] charset; + int index = 0, count = 0; + + int blockCount = unicodeBlocks.length; + + for (int i = 0; i < blockCount; i+=2) { + firstUnicode = unicodeBlocks[i]; + lastUnicode = unicodeBlocks[i+1]; + if (lastUnicode < firstUnicode) { + delay(100); + System.err.println("ERROR: Bad Unicode range secified, last < first!"); + System.err.print("first in range = 0x" + hex(firstUnicode, 4)); + System.err.println(", last in range = 0x" + hex(lastUnicode, 4)); + while (true); + } + // calculate the number of characters + count += (lastUnicode - firstUnicode + 1); + } + + count += specificUnicodes.length; + + println(); + println("====================="); + println("Creating font file..."); + println("Unicode blocks included = " + (blockCount/2)); + println("Specific unicodes included = " + specificUnicodes.length); + println("Total number of characters = " + count); + + if (count == 0) { + delay(100); + System.err.println("ERROR: No Unicode range or specific codes have been defined!"); + while (true); + } + + // allocate memory + charset = new char[count]; + + for (int i = 0; i < blockCount; i+=2) { + firstUnicode = unicodeBlocks[i]; + lastUnicode = unicodeBlocks[i+1]; + + // loading the range specified + for (int code = firstUnicode; code <= lastUnicode; code++) { + charset[index] = Character.toChars(code)[0]; + index++; + } + } + + // loading the specific point codes + for (int i = 0; i < specificUnicodes.length; i++) { + charset[index] = Character.toChars(specificUnicodes[i])[0]; + index++; + } + + // Make font smooth (anti-aliased) + boolean smooth = true; + + // Create the font in memory + myFont = createFont(fontName+fontType, displayFontSize, smooth, charset); + + // Print characters to the sketch window + fill(0, 0, 0); + textFont(myFont); + + // Set the left and top margin + int margin = displayFontSize; + translate(margin/2, margin); + + int gapx = displayFontSize*10/8; + int gapy = displayFontSize*10/8; + index = 0; + fill(0); + + textSize(displayFontSize); + + for (int y = 0; y < height-gapy; y += gapy) { + int x = 0; + while (x < width) { + + int unicode = charset[index]; + float cwidth = textWidth((char)unicode) + 2; + if ( (x + cwidth) > (width - gapx) ) break; + + // Draw the glyph to the screen + text(new String(Character.toChars(unicode)), x, y); + + // Move cursor + x += cwidth; + // Increment the counter + index++; + if (index >= count) break; + } + if (index >= count) break; + } + + + // creating font to save as a file + PFont font; + + font = createFont(fontName+fontType, fontSize, smooth, charset); + + println("Created font " + fontName + str(fontSize) + ".vlw"); + + String fontFileName = "FontFiles/" + fontName + str(fontSize) + ".vlw"; + + // creating file + try { + print("Saving to sketch FontFiles folder... "); + + OutputStream output = createOutput(fontFileName); + font.save(output); + output.close(); + + println("OK!"); + + delay(100); + + // Open up the FontFiles folder to access the saved file + String path = sketchPath(); + if(openFolder){ + Desktop.getDesktop().open(new File(path+"/FontFiles")); + } + + System.err.println("All done! Note: Rectangles are displayed for non-existant characters."); + } + catch(IOException e) { + println("Doh! Failed to create the file"); + } + + if(!createHeaderFile) return; + // Now creating header file if the option was specified. + try{ + print("saving header file to FontFile folder..."); + + InputStream input = createInputRaw(fontFileName); + PrintWriter output = createWriter("FontFiles/" + fontName + str(fontSize) + ".h"); + + output.println("#include "); + output.println(); + output.println("const uint8_t " + fontName + str(fontSize) + "[] PROGMEM = {"); + + int i = 0; + int data = input.read(); + while(data != -1){ + output.print("0x"); + output.print(hex(data, 2)); + if(i++ < 15){ + output.print(", "); + } else { + output.println(","); + i = 0; + } + data = input.read(); + } +// font.save(output); + output.println("\n};"); + + output.close(); + input.close(); + + println("C header file created."); + + } catch(IOException e){ + println("Failed to create C header file"); + } +} diff --git a/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h new file mode 100644 index 0000000..b45e623 --- /dev/null +++ b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h @@ -0,0 +1,1588 @@ +#include + +const uint8_t Final-Frontier28[] PROGMEM = { +0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x11, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1D, +0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0D, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x90, 0x90, 0x90, 0x76, 0x44, 0xFF, 0xFF, 0xFF, 0x3C, 0x2E, 0xFF, 0xFF, 0xFF, 0x27, 0x21, +0xFF, 0xFF, 0xFF, 0x1C, 0x14, 0xFF, 0xFF, 0xFF, 0x11, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0xFA, +0xFF, 0xFB, 0x00, 0x00, 0xED, 0xFF, 0xF0, 0x00, 0x00, 0xE0, 0xFF, 0xE4, 0x00, 0x00, 0xD3, 0xFF, +0xD9, 0x00, 0x00, 0xC6, 0xFF, 0xCE, 0x00, 0x00, 0xB9, 0xFF, 0xC3, 0x00, 0x00, 0xAC, 0xFF, 0xB8, +0x00, 0x00, 0x9F, 0xFF, 0xAD, 0x00, 0x00, 0x33, 0x58, 0x38, 0x00, 0x00, 0x1E, 0x4D, 0x1B, 0x00, +0x43, 0xF9, 0xFF, 0xF7, 0x39, 0x86, 0xFF, 0xFF, 0xFF, 0x7A, 0x18, 0xBF, 0xF6, 0xBB, 0x13, 0xFF, +0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, +0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, +0xFF, 0xDD, 0x01, 0x00, 0x00, 0x49, 0xFF, 0xF0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xCE, 0xFF, 0x76, 0x00, 0x00, 0x00, 0xB3, 0xFF, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xF8, 0x15, 0x00, 0x00, 0x1E, 0xFD, 0xFF, 0x2B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xC3, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF7, 0xFF, 0x3C, 0x00, 0x00, 0x06, +0xE9, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0x0B, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x29, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0B, 0xF6, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xE4, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x79, 0x00, 0x00, 0x00, 0xA9, 0xFF, 0x91, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x08, +0xF3, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0xF8, 0xF8, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x0E, 0x00, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3F, 0xFF, 0xFD, 0x17, 0x00, 0x00, 0x1A, 0xFD, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xD2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0xFF, 0x66, 0x00, 0x00, 0x00, 0xC7, 0xFF, 0x7C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFB, 0x14, 0x00, 0x00, 0x1E, +0xFE, 0xFF, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xB9, 0x00, +0x00, 0x00, 0x75, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, +0xFF, 0x63, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xAE, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x19, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x04, +0x00, 0x00, 0x8A, 0xFF, 0xF1, 0x4C, 0x0A, 0x00, 0x00, 0x32, 0x24, 0x00, 0x00, 0x00, 0xC0, 0xFF, +0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xE6, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, 0xFF, 0xD7, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x15, 0xEB, 0xFF, 0xFF, 0xEF, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xF5, 0xFF, 0xFF, 0xFC, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, +0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0xFF, 0xFF, 0xFE, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x02, 0xC8, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, +0x47, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFF, 0xF9, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x13, 0xFF, 0xFF, 0xDB, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x5B, 0xFF, 0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x4C, +0xEC, 0xFF, 0xE4, 0x14, 0x00, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x27, 0x00, +0x23, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x6A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xBC, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x74, 0xCF, 0xF6, 0xF5, 0xCD, 0x71, 0x06, 0x00, 0x00, 0x00, +0x00, 0x1E, 0xDB, 0xFF, 0xFF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x12, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xCA, 0x11, 0x00, 0x00, 0x00, 0x00, 0xBE, 0xFF, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9F, 0xFF, 0xFF, 0xB4, 0x1B, 0x1B, 0xB6, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x4B, 0xFF, 0xF7, +0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xF0, +0x00, 0x00, 0x03, 0xD5, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x1A, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xEE, 0x00, 0x00, 0x68, 0xFF, 0xE8, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xB3, 0x1B, 0x1B, 0xB6, 0xFF, 0xFF, 0x9A, 0x00, 0x0D, 0xE8, 0xFF, +0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC8, 0x0F, 0x00, 0x85, 0xFF, 0xD1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x75, 0xCF, 0xF7, 0xF6, 0xCD, 0x70, 0x05, 0x00, 0x1C, 0xF6, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, +0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x31, 0xFE, 0xFB, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xFF, 0x91, 0x00, 0x01, 0x61, 0xC7, +0xF4, 0xF5, 0xC9, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, +0xEE, 0x12, 0x04, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0xD6, 0xFF, 0x70, 0x00, 0x77, 0xFF, 0xFF, 0xCB, 0x22, 0x23, 0xCD, 0xFF, +0xFF, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xDA, 0x05, 0x00, 0xDC, 0xFF, +0xFF, 0x34, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xE9, +0xFF, 0x4F, 0x00, 0x00, 0xF9, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xF9, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0xDA, 0xFF, 0xFF, 0x33, 0x00, 0x00, +0x35, 0xFF, 0xFF, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xF6, 0xFD, 0x31, 0x00, 0x00, 0x00, +0x74, 0xFF, 0xFF, 0xC9, 0x21, 0x22, 0xCB, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, +0xFF, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x04, +0x00, 0x00, 0x00, 0x00, 0x32, 0xFE, 0xFF, 0xCE, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xC7, +0xF5, 0xF6, 0xC9, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5F, 0xC2, 0xF1, 0xFF, 0xFF, 0xFF, +0xFF, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xB5, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xFF, +0xFF, 0xD2, 0x3A, 0x07, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xE6, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xD3, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xF3, 0xFF, 0xFF, +0xFB, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x21, 0xF1, +0xFF, 0xFF, 0x96, 0x12, 0x00, 0x00, 0x00, 0x26, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, +0x00, 0x93, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x1E, 0x00, 0xDB, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x33, 0x1C, 0x00, 0x0E, +0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xFF, 0xFF, 0x0E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xDE, 0x00, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, +0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, +0x51, 0xFF, 0xFF, 0xD6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xEA, 0xFF, 0xFC, 0x2B, 0x00, +0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xFF, 0xDD, 0x5E, 0x19, 0x04, 0x17, 0x62, 0xE6, 0xFF, 0xFF, +0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8A, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x8E, 0xCF, 0xF0, +0xFB, 0xEB, 0xC3, 0x7C, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, +0xFC, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0xF5, 0x4F, 0x00, 0x00, 0x3A, 0xF9, 0xFF, 0xF3, 0x3B, +0x00, 0x00, 0x07, 0xE1, 0xFF, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xFF, 0x9A, 0x00, 0x00, +0x00, 0x0A, 0xED, 0xFF, 0xF8, 0x17, 0x00, 0x00, 0x00, 0x59, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, +0x00, 0xA1, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xFF, 0xFF, 0x26, 0x00, 0x00, 0x00, +0x00, 0xF3, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, +0x00, 0xF2, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0xFF, 0x2D, 0x00, 0x00, 0x00, +0x00, 0xA2, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0x00, +0x00, 0x0B, 0xF0, 0xFF, 0xFA, 0x19, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0x9D, 0x00, 0x00, +0x00, 0x00, 0x09, 0xE3, 0xFF, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFA, 0xFF, 0xF3, 0x3A, +0x00, 0x00, 0x00, 0x00, 0x65, 0xFF, 0xFF, 0xF5, 0x4F, 0x4D, 0xF4, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x39, 0xF2, 0xFF, 0xFA, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFE, 0xFF, 0xE3, 0x09, +0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF8, 0xFF, 0xEF, +0x0B, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFF, 0xFF, +0xA4, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFF, 0xFF, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, +0xF4, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0xFF, +0xA0, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x19, 0xFA, 0xFF, 0xEE, +0x0A, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x4C, 0xFE, 0xFF, 0xE4, 0x09, +0x00, 0x00, 0x38, 0xF2, 0xFF, 0xFA, 0x3E, 0x00, 0x00, 0x4C, 0xF4, 0xFF, 0xFF, 0x6B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x2A, 0x97, 0x02, 0x41, 0xFF, 0x3F, +0x02, 0x99, 0x28, 0xB4, 0xFF, 0xA2, 0x0A, 0xF4, 0x0A, 0xA4, 0xFF, 0xB2, 0x28, 0x63, 0xA1, 0xE1, +0xFF, 0xE0, 0x9F, 0x62, 0x29, 0x00, 0x00, 0x17, 0xE8, 0xFF, 0xE3, 0x14, 0x00, 0x00, 0x8B, 0xD7, +0xF3, 0x75, 0xF5, 0x74, 0xF2, 0xD5, 0x8A, 0x75, 0xF2, 0x3D, 0x11, 0xFC, 0x10, 0x3D, 0xF3, 0x72, +0x08, 0x33, 0x00, 0x4D, 0xFF, 0x4A, 0x00, 0x34, 0x07, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0x86, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0xF1, 0xFF, 0xFF, 0x8E, 0x27, 0xFF, 0xFF, 0xAC, 0x02, 0x7E, 0xFF, 0xC4, +0x08, 0x00, 0xD5, 0xD9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x59, +0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x37, 0x34, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x89, 0x00, 0x5E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x78, +0xF8, 0xF8, 0x75, 0xF0, 0xFF, 0xFF, 0xEF, 0x67, 0xEA, 0xEA, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2E, 0xF6, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFB, 0xFF, 0x7B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xFF, 0xFF, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, +0xFF, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFD, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6F, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xC2, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, +0xFF, 0xFC, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x29, 0xFF, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xF9, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, +0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xF5, 0x0B, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0xE3, 0xFF, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x50, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0xEA, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9F, 0xFF, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x98, 0x98, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x87, 0xC9, 0xEC, 0xFB, 0xED, +0xCB, 0x89, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7B, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFB, 0x7C, 0x01, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xDE, 0x5D, 0x18, 0x05, 0x19, 0x5F, 0xE0, +0xFF, 0xFF, 0x8A, 0x00, 0x39, 0xFF, 0xFF, 0xDF, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE1, +0xFF, 0xFF, 0x39, 0xA5, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, +0xFF, 0xA4, 0xE3, 0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, +0xE1, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, 0xE2, 0xFF, 0xFF, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xE1, 0xA4, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xA4, 0x38, 0xFF, 0xFF, 0xDD, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x12, 0xDE, 0xFF, 0xFF, 0x39, 0x00, 0x8A, 0xFF, 0xFF, 0xDC, 0x5B, 0x17, 0x04, 0x17, +0x5B, 0xDC, 0xFF, 0xFF, 0x8C, 0x00, 0x00, 0x01, 0x7C, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x21, 0x88, 0xCA, 0xEE, 0xFB, 0xEF, 0xCC, 0x8B, +0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x00, +0x00, 0x00, 0x5E, 0xFE, 0xFF, 0x00, 0x00, 0x4A, 0xFB, 0xFF, 0xFF, 0x00, 0x0F, 0xB9, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x01, 0x56, +0xB0, 0xE3, 0xF8, 0xE7, 0xC2, 0x6A, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x16, 0xC4, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x1D, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, 0x97, 0x28, 0x08, 0x2F, +0xB2, 0xFF, 0xFF, 0xCC, 0x06, 0x00, 0x00, 0x5D, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB4, +0xFF, 0xFF, 0x69, 0x00, 0x00, 0x01, 0xCD, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xFF, 0xFF, +0xC8, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF1, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x28, 0xF4, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0D, 0xD4, 0xFF, 0xFF, 0xE7, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB3, +0xFF, 0xFF, 0xFE, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, +0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0xFF, 0xFF, 0xFF, 0x99, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xF8, 0xFF, 0xFF, 0xBA, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xE8, 0xFF, 0xFF, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0B, 0xCF, 0xFF, 0xFF, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAD, 0xFF, +0xFF, 0xF6, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x19, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x07, 0x69, 0xBD, 0xEB, 0xFB, 0xEA, 0xB3, 0x4A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x01, +0x00, 0x00, 0x00, 0x33, 0xFD, 0xFF, 0x9B, 0x22, 0x0E, 0x52, 0xEA, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x98, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, +0x12, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x84, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x75, +0xFE, 0xFF, 0xF1, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x44, 0xA7, 0xFF, +0xFF, 0xF2, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFB, 0xFF, +0xF7, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xFF, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xFF, 0xFF, 0xDE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0A, 0xCD, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x2B, 0x68, 0xD9, +0xFF, 0xFF, 0x8F, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8C, +0x03, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xF0, 0xD5, 0x9E, 0x38, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xFA, 0xFF, 0xE5, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xD5, 0xFF, 0xFE, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFE, 0xFF, 0xD1, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE1, 0xFF, 0xF7, 0x2B, 0x00, 0x15, 0xDA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0xFF, 0x6D, 0x00, 0x0C, 0xCA, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xB7, 0x01, 0x00, 0xB9, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0xEB, 0xFF, 0xEA, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x66, 0xFF, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x23, 0xF3, 0xFF, 0xD9, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x02, 0xC4, 0xFF, 0xFA, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x31, 0x05, +0x0F, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x00, +0x00, 0x1E, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x27, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x4B, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x08, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x4D, +0x00, 0x00, 0x00, 0x3B, 0x42, 0x00, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xBD, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xD9, 0xFF, 0xFF, 0xFF, 0xFA, 0xE7, 0xB5, 0x5E, 0x04, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x4C, +0xCA, 0xFF, 0xFF, 0xD1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCA, 0xFF, +0xFF, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xC3, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xEE, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0xFF, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xDF, 0xFF, 0xFF, 0x41, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x24, 0x6B, 0xE4, 0xFF, 0xFF, 0x96, 0x00, 0x0C, 0xE6, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x02, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0xED, 0xC8, 0x88, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBA, 0xFF, 0xFF, +0xE5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xD5, 0xFF, 0xFF, 0x4E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0xFF, 0xEB, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xE0, 0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xA0, 0xFF, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xFF, 0xFF, +0xF1, 0x1C, 0x60, 0xDF, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x16, 0xEA, 0xFF, 0xFF, 0x68, 0x1F, +0xF1, 0xFF, 0xFF, 0xFF, 0xAD, 0x0D, 0x00, 0x00, 0xAA, 0xFF, 0xFF, 0xC0, 0x01, 0x45, 0x85, 0xBF, +0xFF, 0xFF, 0xFF, 0xBF, 0x04, 0x3A, 0xFF, 0xFF, 0xFA, 0x26, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xF8, +0xFF, 0xFF, 0x64, 0xA2, 0xFF, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, +0xC2, 0xE3, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xF0, 0xFA, +0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF8, 0xE9, 0xFF, 0xFF, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xE0, 0xAF, 0xFF, 0xFF, 0x46, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xFF, 0xA1, 0x43, 0xFF, 0xFF, 0xCA, 0x07, 0x00, 0x00, +0x00, 0x00, 0x0B, 0xD5, 0xFF, 0xFF, 0x35, 0x00, 0x95, 0xFF, 0xFF, 0xCB, 0x48, 0x0D, 0x09, 0x41, +0xCC, 0xFF, 0xFF, 0x8A, 0x00, 0x00, 0x02, 0x89, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x99, 0xDB, 0xF6, 0xF6, 0xDA, 0x99, 0x2E, 0x00, 0x00, +0x00, 0x00, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x3E, 0xFD, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x4E, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xEE, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x85, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE8, 0xFF, 0xFE, +0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x28, 0xFF, 0xFF, 0xE5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, +0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xEF, 0xFF, 0xFB, 0x1B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x33, 0xFF, 0xFF, 0xD9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, +0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF5, 0xFF, 0xF6, 0x11, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xD5, 0xFF, 0xFF, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0xFF, 0xFF, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xFF, 0xFF, +0xCD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xF4, 0xF5, +0xC9, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA6, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xFF, 0xFF, 0xC2, 0x1F, 0x1F, 0xC4, 0xFF, 0xFF, 0x6C, +0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x2E, 0xFF, 0xFF, 0xD2, 0x00, 0x00, +0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, +0xE5, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, +0xFF, 0xEA, 0x5C, 0x5C, 0xEB, 0xFF, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF3, 0xFF, 0xFF, +0xD8, 0xD8, 0xFF, 0xFF, 0xF6, 0x21, 0x00, 0x00, 0x00, 0x3B, 0xEE, 0xFF, 0xFF, 0xFF, 0xB7, 0xB9, +0xFF, 0xFF, 0xFF, 0xE8, 0x34, 0x00, 0x1B, 0xEA, 0xFF, 0xFF, 0xBB, 0x1F, 0x00, 0x00, 0x25, 0xC2, +0xFF, 0xFF, 0xE6, 0x18, 0x8D, 0xFF, 0xFF, 0xBB, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, +0xFF, 0x8D, 0xDA, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xDC, +0xF8, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF7, 0xE7, 0xFF, +0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xE6, 0xA9, 0xFF, 0xFF, 0x52, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xA6, 0x38, 0xFE, 0xFF, 0xD8, 0x0F, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xD8, 0xFF, 0xFE, 0x36, 0x00, 0x81, 0xFF, 0xFF, 0xD6, 0x4D, 0x0C, 0x0B, +0x4B, 0xD5, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x73, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x8D, 0xD3, 0xF4, 0xF5, 0xD4, 0x8D, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x99, 0xD8, 0xF4, 0xF6, 0xDA, 0x9A, 0x2F, 0x00, 0x00, 0x00, +0x00, 0x04, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x89, 0x02, 0x00, 0x00, 0x9A, +0xFF, 0xFF, 0xC9, 0x41, 0x09, 0x0E, 0x4C, 0xD0, 0xFF, 0xFF, 0x95, 0x00, 0x44, 0xFF, 0xFF, 0xCE, +0x08, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCC, 0xFF, 0xFF, 0x44, 0xAE, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xB0, 0xE7, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xE9, 0xFA, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0B, 0xFF, 0xFF, 0xF9, 0xE9, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, +0xFF, 0xE0, 0xAD, 0xFF, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xFF, 0x9D, +0x3B, 0xFE, 0xFF, 0xFF, 0xAE, 0x2E, 0x00, 0x00, 0x00, 0x22, 0xF8, 0xFF, 0xFF, 0x35, 0x00, 0x74, +0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x69, 0x00, 0xBB, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x4B, 0xD5, +0xFF, 0xFF, 0xC1, 0x02, 0x63, 0xFF, 0xFF, 0xE7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x6D, +0x1F, 0x1A, 0xEF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, +0xFF, 0xFF, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xFF, 0xFF, 0xDE, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xEA, 0xFF, 0xFD, 0x3C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0xD4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xE4, 0xFF, 0xFF, 0xBD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, +0x6D, 0xFB, 0xFA, 0x6B, 0xF0, 0xFF, 0xFF, 0xEF, 0xBB, 0xFF, 0xFF, 0xB7, 0x0C, 0x6B, 0x69, 0x0A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, +0x78, 0xF8, 0xF8, 0x75, 0xF0, 0xFF, 0xFF, 0xEF, 0x67, 0xEA, 0xEA, 0x65, 0x00, 0x00, 0x11, 0x0B, +0x00, 0x00, 0x8A, 0xFE, 0xF9, 0x68, 0x14, 0xFF, 0xFF, 0xFF, 0xEF, 0x03, 0xDA, 0xFF, 0xFF, 0xB5, +0x00, 0x14, 0x70, 0x66, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xF1, 0xFF, 0xFF, 0x84, 0x27, 0xFF, +0xFF, 0xA5, 0x01, 0x7E, 0xFF, 0xC1, 0x06, 0x00, 0xD5, 0xD8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x9E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0xCA, 0xCC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x28, 0xDC, 0xDD, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x97, 0xB0, 0xFF, 0xFF, 0xBC, +0xA1, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC3, 0xB3, 0x2E, +0xAF, 0xFF, 0xFF, 0xB0, 0x31, 0xE5, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, +0xE9, 0xA4, 0x0A, 0x0E, 0xF4, 0xFF, 0xFF, 0xF4, 0x0F, 0x06, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1D, 0xEF, 0xDD, 0x0C, 0x00, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x11, 0xFF, +0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x6F, 0x00, 0x00, 0x63, 0xFD, 0xFF, 0xFF, 0xFE, +0x63, 0x00, 0x00, 0xD4, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFF, 0x24, 0x00, 0x29, 0x14, +0xB9, 0xFF, 0xFF, 0xBA, 0x14, 0x23, 0x00, 0x46, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, +0x05, 0x20, 0xDD, 0x4E, 0x3E, 0xF2, 0xF3, 0x3F, 0x4B, 0xCF, 0x05, 0x0B, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xC2, 0xE3, 0x46, 0xE5, 0xFF, 0xCF, 0x20, 0x95, 0x99, 0x1B, 0xCF, 0xFF, 0xC4, 0x09, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x1D, 0x20, 0x8C, +0xFF, 0xFF, 0xFF, 0xF2, 0xC0, 0x6B, 0x3E, 0x28, 0x0F, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xE4, 0x44, 0x42, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xB1, 0x3A, 0xBE, 0xFF, 0xFF, +0xFF, 0xD7, 0x6C, 0x01, 0x2B, 0x17, 0x10, 0x13, 0x18, 0x85, 0xD3, 0xD2, 0xD3, 0xD1, 0xCD, 0x7A, +0x01, 0xF1, 0xFF, 0xDC, 0xC5, 0xDD, 0xF6, 0x8B, 0x32, 0x09, 0x0A, 0x32, 0x8C, 0xD1, 0x37, 0xC2, +0xEE, 0xC0, 0x52, 0x00, 0x00, 0xEA, 0xD4, 0x8D, 0x29, 0x01, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x76, 0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, 0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, +0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, +0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, +0x66, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, +0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, 0x81, 0xF5, 0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, +0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, 0x8B, 0x11, 0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, +0x00, 0x00, 0x01, 0x20, 0x05, 0x12, 0x00, 0x00, 0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, +0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, 0x47, 0xA3, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, +0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, 0x00, 0x08, 0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, +0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, 0x61, 0x00, 0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, +0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, 0xD3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, +0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, +0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0xF3, 0xD1, 0x84, 0x13, 0x00, +0x00, 0x29, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x31, 0x00, 0x46, 0x07, 0x00, 0x01, 0x1C, +0x88, 0xFF, 0xFF, 0xE3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0x7A, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xFF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, +0xA9, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x6F, 0xFC, 0xFF, 0xFD, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFA, 0xBA, 0x40, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x4D, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFA, 0xFF, 0xF3, 0x2D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC2, 0xF5, 0xB3, +0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x73, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF4, 0xFF, 0xFA, 0x2C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB2, 0xFF, 0xFF, 0xFF, 0xC4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0xE4, 0xFF, 0xFF, 0x8E, 0xFF, 0xFF, 0xED, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, 0xAF, +0x00, 0xAF, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x34, 0xFD, 0xFF, 0xF1, 0x1B, 0x00, 0x24, 0xF9, 0xFF, 0xFF, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xCE, 0xFF, 0xFF, +0x6A, 0x00, 0x00, 0x00, 0x8D, 0xFF, 0xFF, 0xD8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xC6, 0x02, 0x00, 0x00, 0x00, 0x10, 0xEC, 0xFF, +0xFF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xF3, 0xFF, +0xFA, 0x2B, 0x1C, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0x83, 0x04, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, +0xFF, 0xD9, 0x07, 0x1A, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, 0x59, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xE3, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x26, 0xF9, 0xFF, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, +0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, +0xFF, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFC, 0xFF, 0xE8, 0x11, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xE0, 0xFF, 0xFD, 0x37, 0x00, 0x00, 0x00, 0x03, +0xCD, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4F, 0xFF, 0xFF, 0xD0, 0x04, 0x00, 0x00, 0x71, 0xFF, 0xFF, 0xB5, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0x73, 0x00, +0x1C, 0xF3, 0xFF, 0xF4, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x22, 0xF7, 0xFF, 0xF4, 0x1D, 0xB0, 0xFF, 0xFF, 0xC8, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xD2, 0xFF, +0xFF, 0xB0, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF1, 0xCC, 0x85, +0x17, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xEB, 0x32, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x26, +0xA8, 0xFF, 0xFF, 0xDD, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0xEE, 0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0D, 0xF2, 0xF2, 0x55, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xBB, 0xD3, 0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x21, 0xD4, 0xA1, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xEA, 0xFF, 0xE4, 0xA5, 0x36, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x5E, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x4E, 0xB1, 0xA7, 0xAE, 0xD9, 0xFF, 0xFF, 0xFF, 0xFC, 0x32, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF1, 0xFF, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xDD, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xF7, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF6, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0xFF, +0xDA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xFF, +0xFF, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x6D, 0xF4, +0xFF, 0xF6, 0x24, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x4E, 0x00, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, +0xD3, 0x8E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x85, 0xCD, 0xEC, 0xF8, 0xFE, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x16, 0x00, 0x00, 0x00, 0x0F, 0x97, 0xFE, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x00, +0x00, 0x17, 0xD8, 0xFF, 0xFF, 0xC9, 0x64, 0x2A, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x00, 0x00, 0x00, 0x0F, 0xD4, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x97, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFD, +0xFF, 0xE9, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xFF, 0xFF, +0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xFF, 0x33, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x98, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xDC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x82, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF0, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xEE, 0xFF, 0xFF, 0xC4, 0x5C, 0x25, 0x0C, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x33, 0x00, 0x00, 0x00, 0x21, 0xBC, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3A, 0x97, 0xCB, 0xE9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x23, 0x00, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xE6, +0xC1, 0x8B, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1F, 0x53, 0xB2, 0xFF, 0xFF, 0xE7, 0x26, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFE, +0xFF, 0xE4, 0x14, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0x99, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE6, 0xFF, 0xFD, 0x23, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0x76, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3C, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xDF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xED, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x33, 0xFF, 0xFF, 0xD4, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0x9B, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD8, 0xFF, 0xFF, 0x48, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xFF, 0xFF, 0xC7, 0x01, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFD, +0xFF, 0xF5, 0x2F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x1B, +0x4D, 0xB2, 0xFF, 0xFF, 0xF5, 0x41, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x2B, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEE, 0xD2, 0xA0, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x85, 0xCD, 0xEC, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0x16, 0x00, 0x00, 0x00, 0x0F, 0x97, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x17, 0xD8, 0xFF, 0xFF, +0xC9, 0x64, 0x2A, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, +0x0F, 0xD4, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xE9, 0x0E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, +0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0x3B, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x3C, 0x00, 0x00, 0xE9, 0xFF, 0xFF, 0x29, 0xEC, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x09, 0x00, +0x00, 0x00, 0xED, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xFF, 0xFF, 0x79, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x44, 0xFF, 0xFF, 0xDC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF0, 0xFF, 0xFF, +0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x34, 0xEE, 0xFF, 0xFF, 0xC4, 0x5C, 0x25, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x33, 0x00, 0x00, 0x00, 0x21, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, +0x97, 0xCB, 0xE9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x23, 0x00, 0x32, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x41, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x12, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFF, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x36, 0x8D, 0xD2, 0xEF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x61, 0x00, 0x00, 0x00, 0x00, 0x13, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xDE, 0xFF, 0xFF, 0xC0, 0x5C, 0x24, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x44, 0x12, 0x00, 0x00, 0x00, 0x10, 0xD7, 0xFF, 0xFF, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0x8D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFD, +0xFF, 0xE6, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x81, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x10, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x00, 0xC1, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE9, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x14, 0x27, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xED, 0xFF, 0xFF, +0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0xD3, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x98, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0xFF, 0xFF, 0xD9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x79, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x29, 0xF1, 0xFF, +0xFE, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x38, 0xF1, 0xFF, 0xFF, 0xBA, 0x54, 0x20, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x24, 0xC2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9C, 0xCE, 0xEB, 0xFA, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0x41, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x13, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x36, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x41, 0xFF, 0xFF, 0xFF, +0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0xFF, 0x3C, 0x40, 0xFF, +0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, +0xFF, 0xF6, 0x00, 0x18, 0xAE, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xD8, 0x00, +0x71, 0xFF, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0x92, 0x00, 0x0A, 0xE3, 0xFF, +0xF6, 0x6F, 0x17, 0x13, 0x5D, 0xEE, 0xFF, 0xF3, 0x1F, 0x00, 0x00, 0x24, 0xE1, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x49, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x7E, 0xCF, 0xF5, 0xF9, 0xDD, 0x97, +0x22, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, +0xFF, 0xEA, 0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFD, +0xFF, 0xF2, 0x33, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x23, 0xEE, +0xFF, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0xD2, +0xFF, 0xFC, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xA8, +0xFF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x76, +0xFF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x44, +0xFC, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0xA4, 0xFF, 0xF1, 0x79, 0x49, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x7F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x54, 0x79, 0x8D, 0xC2, 0xFC, 0xFF, 0xFF, 0xD3, 0x1A, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xB0, 0xFF, 0xFF, 0xDA, 0x13, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x91, 0xFF, 0xFF, 0xA8, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC1, 0xFF, 0xFF, 0x3A, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xFF, +0xA6, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, +0xFF, 0xEF, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9C, 0xFF, 0xFF, 0x2A, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0xFF, 0xFF, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x71, 0xFF, 0xFF, 0x59, 0x3E, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0x60, 0x3E, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x3A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x12, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, +0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x34, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF9, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xC5, 0xFF, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x8B, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFB, 0xFF, 0xFF, 0xFE, +0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF2, 0xFF, 0xFF, 0xFF, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xCA, +0xD5, 0xFF, 0xFC, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE8, 0xFF, 0xA2, 0xFD, 0xFF, 0xA2, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0x8B, 0x56, 0xFF, 0xFF, 0x99, 0x00, 0x00, 0x00, +0x00, 0x00, 0x68, 0xFF, 0xF9, 0x1C, 0xCC, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xFF, +0xFF, 0x4E, 0x01, 0xD2, 0xFF, 0xF9, 0x1B, 0x00, 0x00, 0x00, 0x03, 0xDC, 0xFF, 0x99, 0x00, 0x89, +0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFE, 0x12, 0x00, 0x52, 0xFF, 0xFF, 0x8E, +0x00, 0x00, 0x00, 0x56, 0xFF, 0xFB, 0x21, 0x00, 0x46, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, +0xAF, 0xFF, 0xD3, 0x00, 0x00, 0x01, 0xCE, 0xFF, 0xF5, 0x14, 0x00, 0x00, 0xCD, 0xFF, 0xA0, 0x00, +0x00, 0x0A, 0xF9, 0xFF, 0xB6, 0x00, 0x00, 0x00, 0x03, 0xF0, 0xFF, 0x95, 0x00, 0x00, 0x00, 0x4E, +0xFF, 0xFF, 0x84, 0x00, 0x45, 0xFF, 0xFD, 0x26, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xF4, 0x06, 0x00, +0x00, 0x3A, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xF0, 0x0E, 0xBC, 0xFF, 0xA7, +0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1A, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xFF, 0xFF, 0xA9, 0xFF, 0xFE, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, +0x84, 0x00, 0x00, 0xC6, 0xFF, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xFF, 0xFF, +0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF3, 0xFF, 0xC9, 0x00, 0x0F, 0xFC, 0xFF, 0x9F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB5, 0xFF, 0xFD, 0x11, 0x52, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, +0xFF, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x53, 0x98, 0xFF, 0xFF, +0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x30, 0xFF, 0xFF, 0x98, 0xDD, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xDD, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x8D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3C, 0xF1, 0xFF, 0xFF, 0x81, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x33, +0xEC, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x2B, 0xE6, 0xFF, 0xFF, 0x7C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x23, 0xE0, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xD9, 0xFF, 0xFF, 0x76, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xD1, 0xFF, 0xFF, 0x74, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x11, 0xC9, 0xFF, 0xFF, 0x71, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB5, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, +0xAB, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x9F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x93, 0xFF, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x3F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x42, 0x8C, 0xC5, 0xE5, 0xF6, 0xF7, 0xE5, 0xC4, 0x8B, 0x41, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9D, 0xFF, 0xFF, +0xFD, 0xAB, 0x58, 0x20, 0x0A, 0x0A, 0x20, 0x58, 0xAC, 0xFE, 0xFF, 0xFF, 0x9D, 0x03, 0x00, 0x00, +0x00, 0x01, 0xA6, 0xFF, 0xFF, 0xD7, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0xDA, 0xFF, 0xFF, 0xA7, 0x02, 0x00, 0x00, 0x6C, 0xFF, 0xFF, 0xD2, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD5, 0xFF, 0xFF, 0x6E, 0x00, 0x17, 0xF3, 0xFF, 0xF9, +0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xFF, +0xF4, 0x17, 0x71, 0xFF, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x71, 0xC1, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xC2, 0xE4, 0xFF, +0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x17, 0xFF, 0xFF, 0xE4, 0xF9, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF8, 0xE5, 0xFF, 0xFF, 0x16, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xE2, +0xC2, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0xFF, 0xFF, 0xBF, 0x72, 0xFF, 0xFF, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x6C, 0x18, 0xF4, 0xFF, 0xF8, +0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xF9, 0xFF, +0xF0, 0x13, 0x00, 0x6D, 0xFF, 0xFF, 0xD0, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xD3, 0xFF, 0xFF, 0x65, 0x00, 0x00, 0x01, 0xA2, 0xFF, 0xFF, 0xD5, 0x2B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xD7, 0xFF, 0xFF, 0x9D, 0x01, 0x00, 0x00, 0x00, +0x01, 0x92, 0xFF, 0xFF, 0xFD, 0xA9, 0x56, 0x1F, 0x09, 0x09, 0x1F, 0x56, 0xAB, 0xFD, 0xFF, 0xFF, +0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x8C, 0xC4, 0xE6, 0xF7, 0xF7, 0xE6, 0xC4, 0x8B, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE2, 0xA2, 0x2F, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0x67, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1D, 0x71, 0xF5, +0xFF, 0xFE, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x6C, 0xFF, 0xFF, 0xB9, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x19, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF6, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xCE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0x3E, 0xDE, 0xFF, 0xFF, 0x68, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x02, 0xBA, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x16, +0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xBF, 0x5A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x8C, 0xC5, 0xE5, 0xF6, 0xF6, 0xE4, +0xC3, 0x88, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xDB, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x9D, 0xFF, 0xFF, 0xFD, 0xAB, 0x58, 0x20, 0x0A, 0x0A, 0x20, 0x58, 0xAC, 0xFE, 0xFF, +0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA7, 0xFF, 0xFF, 0xD7, 0x2E, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x30, 0xDA, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xD2, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD5, 0xFF, 0xFF, 0x54, +0x00, 0x18, 0xF4, 0xFF, 0xF9, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x25, 0xF9, 0xFF, 0xE6, 0x0B, 0x72, 0xFF, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x5D, 0xC2, 0xFF, 0xFF, +0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, +0xFF, 0xFF, 0xB3, 0xE5, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xDD, 0xF9, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0xE5, +0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0xFF, 0xFF, 0xEE, 0xC2, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x70, 0x70, 0x49, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xD5, 0x72, 0xFF, 0xFF, 0x95, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFE, 0xFF, 0xFB, 0x3D, 0x00, 0x94, 0xFF, 0xFF, +0x96, 0x18, 0xF4, 0xFF, 0xF8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, +0xFF, 0xE8, 0x40, 0xF5, 0xFF, 0xFF, 0x42, 0x00, 0x6D, 0xFF, 0xFF, 0xD0, 0x0D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0xB7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xBE, 0x00, 0x00, 0x01, 0xA2, +0xFF, 0xFF, 0xD5, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE1, 0xFF, 0xFF, 0xFF, +0xE9, 0x21, 0x00, 0x00, 0x00, 0x01, 0x92, 0xFF, 0xFF, 0xFD, 0xA9, 0x55, 0x1E, 0x09, 0x07, 0x20, +0x55, 0xAC, 0xFC, 0xFF, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD4, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFA, 0xFF, 0xFD, 0x58, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x8A, 0xC3, 0xE5, 0xF7, 0xFB, 0xEE, 0xD2, 0xA7, 0x68, 0x17, +0x44, 0xF5, 0xFF, 0xFB, 0x4C, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFB, 0xDF, 0x94, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x8B, 0xFF, 0xFF, 0xD8, 0x03, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xFF, +0xFF, 0x49, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x14, 0xF5, 0xFF, 0xBE, 0x1B, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x22, 0xD4, 0xF9, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xEE, 0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7D, 0xFD, 0xDB, 0x2C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0xB2, 0xFF, 0xFF, +0xFF, 0xFF, 0xD4, 0x5F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, +0x5D, 0x70, 0x7C, 0x9C, 0xE3, 0xFF, 0xFF, 0xFF, 0xB6, 0x10, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5B, 0xE7, 0xFF, 0xFF, 0xC4, 0x09, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xD7, +0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0xF0, 0xFF, 0xFC, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFB, 0xFF, 0xE1, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xC7, 0xFF, 0xFF, 0x19, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0x49, 0x3F, 0xFF, 0xFF, +0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xD0, 0xFF, 0xFF, +0x50, 0x00, 0x00, 0x0F, 0x81, 0xCF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x21, 0x00, 0x00, 0x1A, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0xA3, 0xFF, 0xFF, 0x89, +0x17, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, +0x00, 0xEC, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xFF, 0xFF, 0xD6, +0x6F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x95, 0x52, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0xCA, 0x86, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8A, 0xD5, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x6D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x17, 0x57, 0x98, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x5A, 0x9B, +0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0xC9, 0xFF, 0xFF, 0xFF, 0xD5, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x94, 0xFF, 0xFF, +0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0xC3, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xE9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x00, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x3A, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x09, 0x4A, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x46, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xFF, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xFF, +0x40, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x09, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xDA, 0xFF, +0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xD9, 0x00, 0x00, +0x6D, 0xFF, 0xFF, 0xF1, 0x75, 0x2F, 0x0F, 0x03, 0x03, 0x10, 0x30, 0x74, 0xF0, 0xFF, 0xFF, 0x6D, +0x00, 0x00, 0x00, 0x82, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x75, 0xB3, 0xD9, 0xF1, 0xFB, 0xFB, 0xF1, 0xD9, 0xB4, +0x76, 0x1C, 0x00, 0x00, 0x00, 0xB9, 0xFF, 0xFF, 0xEE, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD1, 0xFF, 0xFF, 0xB8, 0x2E, 0xFD, 0xFF, 0xFA, 0x1C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE2, 0xFF, 0xFD, 0x2E, 0x00, +0x9F, 0xFF, 0xFF, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, +0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x1B, 0xF5, 0xFF, 0xFB, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0xEA, 0xFF, 0xF5, 0x1B, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0xA8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, +0x0D, 0xE9, 0xFF, 0xFE, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF4, 0xFF, 0xE8, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x98, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD7, 0xFF, 0xFF, 0x3E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xFB, 0xFF, 0xD6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4E, 0xFF, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0xFF, 0xFF, 0x4D, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x38, 0xFF, +0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xFE, 0xFF, 0xD2, +0x02, 0x00, 0x00, 0xC1, 0xFF, 0xFE, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xA5, 0xFF, 0xFF, 0x5B, 0x00, 0x4D, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0xFF, 0xDD, 0x08, 0xD4, 0xFF, 0xF8, 0x1F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, +0xBF, 0xFF, 0xFF, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0xEC, 0xFF, 0xFF, 0xFF, 0xEC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x6E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xDC, 0xFF, +0xDB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0xFF, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xCA, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xFF, +0xCA, 0x5F, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xFC, +0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0x61, 0x07, 0xEB, +0xFF, 0xDC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xD9, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xFF, 0xEF, 0x09, 0x00, 0x88, 0xFF, 0xFF, 0x46, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFB, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x32, 0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xAF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x99, 0xFF, 0xFF, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x99, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x1D, 0xF9, 0xFF, 0x98, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF3, 0xFF, 0xBC, +0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xDD, +0x03, 0xC6, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x53, 0x00, 0x00, 0x00, +0x00, 0x01, 0xD8, 0xFF, 0xE6, 0x04, 0x00, 0x00, 0x00, 0x19, 0xF7, 0xFF, 0x67, 0x00, 0x4D, 0xFF, +0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0xE5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, +0xFF, 0xFF, 0x54, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xE7, 0x07, 0x00, 0x01, 0xD1, 0xFF, 0xDB, 0x04, +0x00, 0x00, 0x36, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xF3, 0xFF, 0xBD, +0x00, 0x00, 0x16, 0xF5, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x58, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x9D, +0xFF, 0xFC, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x27, 0x00, 0x8B, +0xFF, 0xEF, 0x0E, 0x00, 0x00, 0x00, 0x03, 0xDB, 0xFF, 0xDC, 0x04, 0x0E, 0xF5, 0xFF, 0xAE, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0x8F, 0x13, 0xF4, 0xFF, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0x61, 0x6B, 0xFF, 0xFF, 0x45, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xEE, 0x8F, 0xFF, 0xF6, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0xE3, 0xFF, 0xDC, 0xD3, 0xFF, 0xDA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, +0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0xE4, 0xFF, 0xFF, 0xFB, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEB, 0xFF, 0xFF, +0xF7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, +0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xFE, 0x2B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF1, 0xFF, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x16, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xC2, 0xFF, 0xFF, 0xFF, +0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFE, 0x48, 0x00, 0x00, 0x17, +0xE4, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC3, 0xFF, 0xFF, 0x82, 0x00, +0x00, 0x00, 0x00, 0x38, 0xF9, 0xFF, 0xF8, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xFF, +0xBC, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0xE6, 0x1A, 0x00, 0x00, 0x00, 0x44, +0xFD, 0xFF, 0xE5, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0xCA, 0x08, +0x00, 0x19, 0xE9, 0xFF, 0xFB, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC9, +0xFF, 0xFF, 0xA2, 0x03, 0xC0, 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1C, 0xEA, 0xFF, 0xFF, 0xCA, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFB, 0xFF, 0xFF, 0xFF, 0xDD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xFF, 0xFF, 0xFF, 0x35, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xFF, 0xFF, +0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, +0xFF, 0xFF, 0xD4, 0xFF, 0xFE, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xFE, 0xFF, 0x98, 0x14, 0xE4, 0xFF, 0xF1, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xED, 0xFF, 0xD8, 0x0A, 0x00, 0x3C, 0xFC, 0xFF, 0xD4, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC9, 0xFF, 0xFA, 0x33, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xFF, +0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, +0x01, 0xB8, 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xFF, 0xBF, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x15, 0xE5, 0xFF, 0xFC, 0x41, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xFF, 0xEE, +0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0xFF, 0xEA, 0x1D, 0x00, 0x09, 0xD2, +0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xFF, 0xFF, 0xC9, +0x07, 0x9F, 0xFF, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, +0xFF, 0xFF, 0xFF, 0x9B, 0x41, 0xFB, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8E, 0xFF, 0xFF, 0xFF, 0x4E, 0x00, 0x6E, 0xFF, 0xFF, 0xE2, 0x16, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCF, 0xFF, 0xFF, 0x92, 0x00, 0x00, 0x00, 0x9F, 0xFF, +0xFF, 0xC6, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0xCF, 0x07, 0x00, +0x00, 0x00, 0x07, 0xC9, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, +0xF3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, +0x20, 0xEF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF9, 0xFF, 0xFE, +0x57, 0x00, 0x00, 0x05, 0xC8, 0xFF, 0xFF, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x64, 0xFF, 0xFF, 0xF7, 0x36, 0x00, 0x8C, 0xFF, 0xFF, 0xDA, 0x0C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xE7, 0x67, 0xFE, 0xFF, 0xF8, 0x31, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xC2, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xE2, 0xFF, 0xFF, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x07, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x57, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x9D, 0x00, 0x00, 0x12, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x22, 0xF2, 0xFF, 0xFF, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0xC8, 0xFF, 0xFF, 0xF9, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFD, 0xFF, 0xFF, 0xB6, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xE4, 0xFF, 0xFF, 0xE8, 0x16, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xFF, +0xFE, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, +0xFF, 0xFF, 0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xF7, 0xFF, 0xFF, 0xCC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0xD3, 0xFF, 0xFF, 0xF3, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xA6, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xEC, 0xFF, 0xFF, 0xDE, 0x0E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBD, 0xFF, 0xFF, +0xFB, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, +0xFF, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFB, 0xFF, 0xFF, 0xBE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x44, 0x0D, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x20, 0x25, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x21, 0x25, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x53, 0xD4, 0xFF, +0xF5, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFA, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x23, 0xFF, 0xFF, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xBD, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFD, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xFE, 0xFF, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xC7, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x14, 0xFB, 0xFF, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0xFF, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xF8, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xDA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF4, +0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xE2, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xEE, 0xFF, +0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0xFF, 0xE9, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF7, 0xFF, 0x9E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x98, 0x98, 0x88, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x04, 0xDA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3B, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x3C, 0x04, 0x00, 0xFF, 0xFF, +0xFF, 0x04, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x76, 0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, +0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, 0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, 0x66, 0x95, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, +0x1C, 0x00, 0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, +0x81, 0xF5, 0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, 0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, +0x8B, 0x11, 0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, 0x00, 0x00, 0x01, 0x20, 0x05, 0x12, +0x00, 0x00, 0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, +0x47, 0xA3, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, +0x00, 0x08, 0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, 0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, +0x61, 0x00, 0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, +0xD3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, 0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2D, 0xF5, 0xFF, 0xFF, 0xFF, 0xF9, 0xD9, 0x75, 0x01, 0x00, 0x00, 0x0E, 0xDA, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6D, 0x00, 0x00, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x04, +0x57, 0xFF, 0xFF, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x0A, 0x05, 0xFF, 0xFF, 0xF4, +0x00, 0x00, 0x20, 0xA6, 0xF1, 0xFF, 0xFF, 0x7C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xEA, 0xFF, +0xFF, 0xFF, 0xFF, 0x22, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xA0, 0xFF, 0xFF, 0xF9, 0xA5, 0xA4, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE7, 0xFF, 0xFF, 0x59, 0x00, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xFB, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE7, 0xFF, 0xFF, +0x1C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x9F, 0xFF, 0xFF, 0xA9, 0x1A, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x18, 0x93, 0xDC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x3F, 0x98, 0x98, +0x98, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x24, 0xFE, 0xF3, 0xCF, 0x7F, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x91, 0xFF, 0xFF, +0xFF, 0xFF, 0xE1, 0x2B, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x26, 0x02, 0x20, 0x98, 0xFF, 0xFF, +0xDD, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xFF, 0x74, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, 0xC5, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xEF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xFF, 0xFF, 0xE7, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xB2, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBC, 0xFF, 0xFF, 0x55, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x04, 0x2C, 0xAB, 0xFF, 0xFF, 0xB9, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x0E, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE1, 0xAA, +0x4C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xA4, 0xDD, 0xF5, 0xFF, 0xFF, 0xFF, 0x83, 0x00, +0x0B, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x11, 0x00, 0xB2, 0xFF, 0xFF, 0xCA, 0x4A, +0x10, 0x00, 0x00, 0x40, 0x00, 0x51, 0xFF, 0xFF, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB1, 0xFF, 0xFF, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xFF, 0xFF, 0x15, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xEF, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xFF, 0x4D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xFF, 0xC7, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0C, 0xDC, 0xFF, 0xFF, 0xC0, 0x3F, 0x0A, 0x00, 0x00, 0x04, 0x45, 0x00, 0x26, 0xD9, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x36, 0x00, 0x00, 0x0A, 0x6D, 0xBF, 0xEC, 0xFD, 0xFF, +0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x98, 0x98, 0x98, +0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x9E, 0xD9, 0xF3, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0A, 0xA5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xB0, 0xFF, 0xFF, 0xD1, 0x50, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x51, 0xFF, 0xFF, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xB2, +0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE8, 0xFF, 0xFF, +0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xEC, 0xFF, 0xFF, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xBA, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x59, 0xFF, 0xFF, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x01, 0xB8, 0xFF, 0xFF, 0xBE, 0x3B, 0x08, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x0D, 0xB3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x01, 0x4E, 0xB0, 0xE7, 0xFB, 0xD6, 0x03, 0x42, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, +0x3C, 0x9A, 0xD1, 0xEE, 0xFD, 0xFF, 0xFF, 0xFF, 0xD4, 0x01, 0x00, 0x0F, 0xAF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x00, 0x02, 0xBE, 0xFF, 0xFF, 0xB2, 0x31, 0x06, 0x00, 0xD5, +0xFF, 0xE6, 0x06, 0x00, 0x5B, 0xFF, 0xFF, 0xC9, 0x02, 0x00, 0x00, 0x39, 0xFF, 0xFF, 0x79, 0x00, +0x00, 0xB7, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xF4, 0x11, 0x00, 0x00, 0xE9, 0xFF, +0xFF, 0x1E, 0x00, 0x00, 0x0B, 0xF3, 0xFF, 0x91, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, +0x00, 0x62, 0xFF, 0xFC, 0x20, 0x00, 0x00, 0x00, 0xEE, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0xC5, 0xFF, +0xA9, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xFF, 0x52, 0x00, 0x1D, 0xDB, 0xDC, 0x34, 0x00, 0x00, +0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xCD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, +0xCF, 0xFF, 0xFF, 0xC6, 0x46, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x3F, 0x00, 0x00, 0x19, 0xC7, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3D, 0x00, 0x00, 0x00, 0x04, 0x59, 0xB2, 0xE5, 0xF9, +0xFF, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x73, 0x8E, 0x90, 0x21, 0x00, +0x00, 0x16, 0xC6, 0xFF, 0xFF, 0xFF, 0xE6, 0x04, 0x00, 0x00, 0xA3, 0xFF, 0xFF, 0xE3, 0xBD, 0x85, +0x00, 0x00, 0x00, 0xED, 0xFF, 0xFF, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x6C, 0x00, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x0D, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x8F, 0xCC, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x45, 0x00, +0x04, 0x8F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xA0, 0xFF, +0xFF, 0xD1, 0x4F, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xD4, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xAD, 0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE6, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0xED, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xBF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x65, +0xFF, 0xFF, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0xC8, 0xFF, +0xFF, 0xAC, 0x33, 0x07, 0x03, 0x43, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x16, 0xC4, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x5A, 0xB5, 0xE8, 0xFC, +0xD6, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, +0xFF, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xC1, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2D, 0xC9, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x05, 0x00, 0x00, 0x00, 0x56, +0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE2, 0xB3, 0x5E, 0x02, 0x00, 0x00, 0x3E, 0x90, 0x90, 0x90, 0x3B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xA2, 0xFF, 0xFE, +0xEE, 0xBD, 0x54, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x8E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x4B, 0xED, 0xFF, 0xFF, 0x44, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, +0xFF, 0x46, 0x00, 0x0A, 0x31, 0x0A, 0x00, 0x19, 0xE5, 0xFF, 0xE1, 0x16, 0x45, 0xFF, 0xFF, 0xFF, +0x41, 0x02, 0x87, 0xCA, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x47, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0B, 0x31, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE5, 0xFF, 0xDF, 0x14, 0x00, 0x00, +0x00, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x88, 0xC9, 0x83, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, +0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xEF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xFF, 0xFF, 0xC4, 0x00, 0x00, 0x00, 0x01, 0x2D, 0xD6, 0xFF, 0xFF, +0x67, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x02, 0x00, 0x1A, 0xF5, 0xFE, 0xEE, 0xC1, +0x64, 0x02, 0x00, 0x00, 0x3E, 0x90, 0x90, 0x90, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x65, +0xFF, 0xFF, 0xFF, 0x9F, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x56, 0xF5, 0xFF, 0xEF, +0x56, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0x86, 0xFF, 0xFF, 0xC3, 0x1E, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x2B, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x13, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x50, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x01, 0x18, 0x68, 0xED, 0xFF, 0xFC, 0x4D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xF8, 0xFF, 0xEA, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0xFF, 0x73, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xFF, 0xFF, 0xBE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x11, 0xFF, 0xFF, 0xEA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, +0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0x3E, 0x90, +0x90, 0x90, 0x3E, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x3F, 0xFF, 0xFF, +0xF3, 0xAF, 0xFF, 0xF9, 0xD8, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xDB, 0xA3, 0x3D, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x45, 0xE7, +0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x17, 0x5D, 0xEE, 0xFF, 0xFF, 0x45, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0xFF, 0xAC, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xED, 0x00, 0x00, 0x00, +0x00, 0x19, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, +0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, +0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x46, 0x3F, 0xFF, +0xFF, 0xF3, 0xAF, 0xFF, 0xFE, 0xEC, 0xBA, 0x52, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0x49, +0xEC, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xFF, 0xFF, +0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xE3, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x44, 0x00, +0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x35, 0x9D, 0xDA, 0xF5, 0xF5, 0xDA, +0x9D, 0x33, 0x00, 0x00, 0x00, 0x00, 0x05, 0x96, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x93, 0x04, 0x00, 0x00, 0xA1, 0xFF, 0xFF, 0xD1, 0x48, 0x0B, 0x0C, 0x49, 0xD3, 0xFF, 0xFF, 0x9D, +0x00, 0x4A, 0xFF, 0xFF, 0xD9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xDB, 0xFF, 0xFF, 0x47, 0xB1, +0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xAF, 0xE8, 0xFF, 0xFF, +0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xE7, 0xFA, 0xFF, 0xFF, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0xE9, 0xFF, 0xFF, 0x17, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xE7, 0xB2, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x5C, 0xFF, 0xFF, 0xAF, 0x4D, 0xFF, 0xFF, 0xD7, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xDB, +0xFF, 0xFF, 0x48, 0x00, 0xA7, 0xFF, 0xFF, 0xCF, 0x46, 0x0B, 0x0B, 0x48, 0xD2, 0xFF, 0xFF, 0xA0, +0x00, 0x00, 0x07, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x05, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xA0, 0xDC, 0xF6, 0xF6, 0xDC, 0x9E, 0x36, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xE0, 0xA8, 0x48, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x0D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x05, 0x2D, 0xAE, +0xFF, 0xFF, 0xB7, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBE, 0xFF, 0xFF, +0x54, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xB2, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xE7, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xFF, 0xFF, 0xED, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, +0xFF, 0xBE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x66, 0x00, +0xFF, 0xFF, 0xFF, 0x01, 0x29, 0x01, 0x21, 0x9E, 0xFF, 0xFF, 0xCE, 0x06, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x1D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x25, 0xFE, +0xF4, 0xCC, 0x74, 0x09, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x90, 0xCD, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x40, 0x00, 0x05, 0x92, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xA3, 0xFF, 0xFF, 0xD1, 0x50, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x49, 0xFF, +0xFF, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xAE, 0xFF, 0xFF, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE6, 0xFF, 0xFF, 0x15, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xEC, 0xFF, 0xFF, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0xBA, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x59, 0xFF, 0xFF, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x01, 0xB8, 0xFF, 0xFF, 0xBE, 0x3B, 0x08, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0D, +0xB3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x4E, +0xB0, 0xE7, 0xFB, 0xD6, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xFF, 0x43, 0x3D, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xE2, 0x76, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x32, 0xB6, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x14, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x49, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB4, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, +0x00, 0x4A, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0xC2, 0xFF, +0xB9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x35, 0x00, 0x00, 0xD5, 0xFF, 0xF1, 0x66, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xFF, 0xFF, 0xFF, 0xF7, 0xB4, 0x68, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB0, 0x2F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x7C, 0xC1, 0xFA, 0xFF, 0xFF, 0xFF, 0xFA, 0x61, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0C, 0x52, 0xB0, 0xFF, 0xFF, 0xFD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xD4, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, +0xFF, 0xFD, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xE4, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x16, 0xD2, 0xFF, 0xFF, 0xA0, 0xA0, 0x36, 0x1B, 0xD8, 0xFF, 0xFF, +0xFF, 0xFF, 0xEE, 0x0B, 0x80, 0xA4, 0xFF, 0xFF, 0xFF, 0xB1, 0x86, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x01, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, +0x49, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE5, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xB2, 0xFF, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x53, +0xFF, 0xFF, 0xDD, 0x3B, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xA4, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x63, 0xC4, 0xF0, 0xFF, 0xFF, +0xAA, 0xF2, 0xFF, 0xFF, 0x3D, 0xD6, 0xFF, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, +0xFF, 0xD6, 0x58, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0x56, 0x02, +0xD5, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xD2, 0x01, 0x00, 0x56, 0xFF, 0xFF, +0x3F, 0x00, 0x00, 0x00, 0x34, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x01, 0xD2, 0xFF, 0xBA, 0x00, 0x00, +0x00, 0xAF, 0xFF, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0x36, 0x00, 0x2B, 0xFE, 0xFF, +0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0xD0, 0xFF, 0xB1, 0x00, 0xA4, 0xFF, 0xC8, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0xFF, 0xFE, 0x50, 0xFC, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xCD, 0xFF, 0xF9, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, +0xFF, 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xBE, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xFF, +0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0xFF, 0xFF, 0xD6, 0x57, 0xFF, 0xFF, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xFF, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x56, 0x01, 0xD3, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, +0x00, 0xA3, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xD2, 0x01, 0x00, 0x53, 0xFF, +0xFF, 0x37, 0x00, 0x00, 0x00, 0x1C, 0xFA, 0xFF, 0xFD, 0x24, 0x00, 0x00, 0x00, 0x26, 0xFE, 0xFF, +0x52, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, 0x99, 0x00, +0x00, 0x00, 0x99, 0xFF, 0xCE, 0x01, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFC, 0x1F, 0x00, 0x0D, 0xF0, +0xFF, 0xA6, 0xFF, 0xF8, 0x18, 0x00, 0x15, 0xF7, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, +0xFF, 0x8E, 0x00, 0x73, 0xFF, 0xC8, 0x03, 0xD9, 0xFF, 0x88, 0x00, 0x81, 0xFF, 0xCA, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xF1, 0x12, 0xE2, 0xFF, 0x47, 0x00, 0x59, 0xFF, 0xF0, 0x17, +0xEB, 0xFF, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xC4, 0xFF, 0xC7, 0x00, +0x00, 0x02, 0xD3, 0xFF, 0xCF, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xFF, 0xC1, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x44, 0x00, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xDF, 0xFF, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xFF, 0xDC, 0x15, 0x00, 0x29, +0xEF, 0xFF, 0xE6, 0x17, 0x00, 0x00, 0x00, 0x18, 0xE8, 0xFF, 0xEA, 0x24, 0x00, 0x00, 0x00, 0x42, +0xFA, 0xFF, 0xC4, 0x05, 0x00, 0x03, 0xC0, 0xFF, 0xF4, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, +0xFF, 0xFF, 0x97, 0x00, 0x8A, 0xFF, 0xFB, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, +0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, +0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xED, 0xFF, 0xFF, +0xFF, 0xF9, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xE0, 0xFF, 0xE8, 0x56, 0xF5, +0xFF, 0xEE, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xD0, 0xFF, 0xF6, 0x37, 0x00, 0x4B, 0xFB, +0xFF, 0xDE, 0x16, 0x00, 0x00, 0x00, 0x06, 0xBD, 0xFF, 0xFE, 0x54, 0x00, 0x00, 0x00, 0x62, 0xFF, +0xFF, 0xC9, 0x0A, 0x00, 0x01, 0xA7, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, +0xFF, 0xAF, 0x02, 0x8E, 0xFF, 0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, +0xFF, 0x90, 0xD7, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xD7, 0x5B, +0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0xFF, 0x5A, 0x02, 0xD7, 0xFF, 0xBD, +0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xFF, 0xD8, 0x02, 0x00, 0x5B, 0xFF, 0xFF, 0x3B, 0x00, 0x00, +0x00, 0x27, 0xFD, 0xFF, 0x5B, 0x00, 0x00, 0x02, 0xD7, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0xA0, 0xFF, +0xD9, 0x03, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0x37, 0x00, 0x1E, 0xFA, 0xFF, 0x5D, 0x00, 0x00, +0x00, 0x00, 0x02, 0xD7, 0xFF, 0xB5, 0x00, 0x94, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5B, 0xFF, 0xFF, 0x4A, 0xF7, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD7, 0xFF, +0xF7, 0xFF, 0xDC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFF, 0x60, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE5, 0xFF, 0xDC, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFE, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xAD, 0xFF, 0xDD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFE, +0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xFF, 0xDE, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFE, 0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xAA, 0xFF, 0xDF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xFE, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xFF, 0xFF, +0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x05, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0x38, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0x92, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDF, 0xFF, 0xE2, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xFC, +0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD1, 0xFF, 0xED, 0x16, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x26, 0xF7, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0xC1, 0xFF, 0xF6, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x75, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8C, 0xA9, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x26, 0xDF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x16, 0x7B, 0x00, 0x00, 0x9D, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x79, 0x13, 0x00, 0x00, 0x20, 0xE8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, +0x84, 0x03, 0x2E, 0x2F, 0x03, 0xAF, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x4E, +0x7D, 0x44, 0x4E, 0x80, 0x5B, 0xDE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x6F, 0x2E, +0x88, 0x6F, 0x76, 0x96, 0xD4, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x7A, 0x8A, 0x88, 0x01, +0x00, 0x23, 0xCA, 0x78, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x37, 0xE0, 0x96, 0x3D, 0x5B, +0x77, 0x8C, 0x22, 0xFA, 0x15, 0x00, 0x00, 0x00, 0x00, 0x86, 0x02, 0x84, 0xB7, 0x3E, 0x26, 0x74, +0x82, 0x00, 0xCB, 0x64, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x05, 0x88, 0xE7, 0xE7, 0x8A, 0x05, +0x00, 0x78, 0xB5, 0x00, 0x00, 0x00, 0x16, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x75, 0x27, +0x35, 0xF7, 0x08, 0x00, 0x00, 0x49, 0x42, 0x00, 0x00, 0x00, 0x11, 0xA2, 0xE7, 0x8F, 0xC4, 0x36, +0xF1, 0x41, 0x00, 0x00, 0x7C, 0x14, 0x00, 0x00, 0x34, 0xE2, 0x9A, 0x0B, 0x00, 0x0C, 0xAE, 0xC5, +0x81, 0x00, 0x00, 0x91, 0x00, 0x00, 0x52, 0xF0, 0x61, 0x00, 0x00, 0x00, 0x00, 0x22, 0xF1, 0xB5, +0x00, 0x00, 0x90, 0x00, 0x5E, 0xF0, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x00, +0x00, 0x93, 0x58, 0xF0, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xDC, 0x12, 0x16, +0xBF, 0xF3, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x33, 0x30, 0xFF, +0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2C, 0x48, 0x8D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, +0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x6F, 0xCE, 0x2B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x02, 0x4F, 0xB2, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3C, 0x00, 0x00, 0xC7, 0x36, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x44, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x51, 0x42, 0x11, 0x89, 0x98, 0x1B, 0xD0, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x92, 0x5B, 0x84, 0x0B, 0x0A, 0xAF, 0x7A, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x72, 0x89, +0x04, 0x00, 0x00, 0x54, 0x1C, 0xDE, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x70, 0x17, 0x3B, +0x0B, 0x83, 0x07, 0x8B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x56, 0xC1, 0x1D, 0x5B, 0x35, +0x00, 0x32, 0xBD, 0x00, 0x00, 0x00, 0x12, 0x7A, 0x00, 0x08, 0x4E, 0x86, 0x5F, 0x18, 0x00, 0x00, +0xD4, 0x12, 0x00, 0x00, 0x57, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x0E, 0x00, 0x81, 0x5D, +0x00, 0x00, 0x8B, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xC0, 0xEE, 0x72, 0x3C, 0xA4, 0x00, 0x00, +0x8F, 0x00, 0x00, 0x00, 0x06, 0x90, 0xC9, 0x3E, 0x18, 0xC0, 0x67, 0xD8, 0x00, 0x08, 0x8C, 0x00, +0x00, 0x15, 0xC4, 0x8C, 0x04, 0x00, 0x00, 0x11, 0xD6, 0xD9, 0x22, 0x31, 0x61, 0x00, 0x1F, 0xD8, +0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0x54, 0x59, 0x36, 0x1F, 0xDD, 0x5A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x83, 0x81, 0x28, 0xDB, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0xAE, 0x9A, 0xCB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x85, 0xC2, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2C, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x76, +0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, 0x53, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, 0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, 0x66, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, +0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, +0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, 0x81, 0xF5, +0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, 0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, 0x8B, 0x11, +0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, 0x00, 0x00, 0x01, 0x20, 0x05, 0x12, 0x00, 0x00, +0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, 0x47, 0xA3, +0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, 0x00, 0x08, +0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, 0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, 0x61, 0x00, +0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, 0xD3, 0x81, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, 0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x54, 0x72, 0x65, 0x6B, 0x20, 0x4D, 0x6F, 0x76, 0x69, 0x65, 0x00, 0x0D, 0x46, 0x69, 0x6E, +0x61, 0x6C, 0x46, 0x72, 0x6F, 0x6E, 0x74, 0x69, 0x65, 0x72, 0x01, +}; diff --git a/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf new file mode 100644 index 0000000..823b9a5 Binary files /dev/null and b/libraries/TFT_eSPI/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf differ diff --git a/libraries/TFT_eSPI/Tools/Screenshot_client/Screenshot_client.pde b/libraries/TFT_eSPI/Tools/Screenshot_client/Screenshot_client.pde new file mode 100644 index 0000000..03c9eef --- /dev/null +++ b/libraries/TFT_eSPI/Tools/Screenshot_client/Screenshot_client.pde @@ -0,0 +1,525 @@ +// This is a Processing sketch, see https://processing.org/ to download the IDE + +// The sketch is a client that requests TFT screenshots from an Arduino board. +// The Arduino must call a screenshot server function to respond with pixels. + +// It has been created to work with the TFT_eSPI library here: +// https://github.com/Bodmer/TFT_eSPI + +// The sketch must only be run when the designated serial port is available and enumerated +// otherwise the screenshot window may freeze and that process will need to be terminated +// This is a limitation of the Processing environment and not the sketch. +// If anyone knows how to determine if a serial port is available at start up the PM me +// on (Bodmer) the Arduino forum. + +// The block below contains variables that the user may need to change for a particular setup +// As a minimum set the serial port and baud rate must be defined. The capture window is +// automatically resized for landscape, portrait and different TFT resolutions. + +// Captured images are stored in the sketch folder, use the Processing IDE "Sketch" menu +// option "Show Sketch Folder" or press Ctrl+K + +// Created by: Bodmer 5/3/17 +// Updated by: Bodmer 12/3/17 +// Version: 0.07 + +// MIT licence applies, all text above must be included in derivative works + + +// ########################################################################################### +// # These are the values to change for a particular setup # +// # +int serial_port = 0; // Use enumerated value from list provided when sketch is run # +// # +// On an Arduino Due Programming Port use a baud rate of:115200) # +// On an Arduino Due Native USB Port use a baud rate of any value # +int serial_baud_rate = 921600; // # +// # +// Change the image file type saved here, comment out all but one # +//String image_type = ".jpg"; // # +String image_type = ".png"; // Lossless compression # +//String image_type = ".bmp"; // # +//String image_type = ".tif"; // # +// # +boolean save_border = true; // Save the image with a border # +int border = 5; // Border pixel width # +boolean fade = false; // Fade out image after saving # +// # +int max_images = 100; // Maximum of numbered file images before over-writing files # +// # +int max_allowed = 1000; // Maximum number of save images allowed before a restart # +// # +// # End of the values to change for a particular setup # +// ########################################################################################### + +// These are default values, this sketch obtains the actual values from the Arduino board +int tft_width = 480; // default TFT width (automatic - sent by Arduino) +int tft_height = 480; // default TFT height (automatic - sent by Arduino) +int color_bytes = 2; // 2 for 16-bit, 3 for three RGB bytes (automatic - sent by Arduino) + +import processing.serial.*; + +Serial serial; // Create an instance called serial + +int serialCount = 0; // Count of colour bytes arriving + +// Stage window graded background colours +color bgcolor1 = color(0, 100, 104); // Arduino IDE style background color 1 +color bgcolor2 = color(77, 183, 187); // Arduino IDE style background color 2 +//color bgcolor2 = color(255, 255, 255); // White + +// TFT image frame greyscale value (dark grey) +color frameColor = 42; + +color buttonStopped = color(255, 0, 0); +color buttonRunning = color(128, 204, 206); +color buttonDimmed = color(180, 0, 0); +boolean dimmed = false; +boolean running = true; +boolean mouseClick = false; + +int[] rgb = new int[3]; // Buffer for the colour bytes +int indexRed = 0; // Colour byte index in the array +int indexGreen = 1; +int indexBlue = 2; + +int n = 0; + +int x_offset = (500 - tft_width) /2; // Image offsets in the window +int y_offset = 20; + +int xpos = 0, ypos = 0; // Current pixel position + +int beginTime = 0; +int pixelWaitTime = 1000; // Maximum 1000ms wait for image pixels to arrive +int lastPixelTime = 0; // Time that "image send" command was sent + +int requestTime = 0; +int requestCount = 0; + +int state = 0; // State machine current state + +int progress_bar = 0; // Console progress bar dot count +int pixel_count = 0; // Number of pixels read for 1 screen +float percentage = 0; // Percentage of pixels received + +int saved_image_count = 0; // Stats - number of images processed +int bad_image_count = 0; // Stats - number of images that had lost pixels +String filename = ""; + +int drawLoopCount = 0; // Used for the fade out + +void setup() { + + size(500, 540); // Stage size, can handle 480 pixels wide screen + noStroke(); // No border on the next thing drawn + noSmooth(); // No anti-aliasing to avoid adjacent pixel colour merging + + // Graded background and title + drawWindow(); + + frameRate(2000); // High frame rate so draw() loops fast + + // Print a list of the available serial ports + println("-----------------------"); + println("Available Serial Ports:"); + println("-----------------------"); + printArray(Serial.list()); + println("-----------------------"); + + print("Port currently used: ["); + print(serial_port); + println("]"); + + String portName = Serial.list()[serial_port]; + + serial = new Serial(this, portName, serial_baud_rate); + + state = 99; +} + +void draw() { + + if (mouseClick) buttonClicked(); + + switch(state) { + + case 0: // Init varaibles, send start request + if (running) { + tint(0, 0, 0, 255); + flushBuffer(); + println(""); + print("Ready: "); + + xpos = 0; + ypos = 0; + serialCount = 0; + progress_bar = 0; + pixel_count = 0; + percentage = 0; + drawLoopCount = frameCount; + lastPixelTime = millis() + 1000; + + state = 1; + } else { + if (millis() > beginTime) { + beginTime = millis() + 500; + dimmed = !dimmed; + if (dimmed) drawButton(buttonDimmed); + else drawButton(buttonStopped); + } + } + break; + + case 1: // Console message, give server some time + print("requesting image "); + serial.write("S"); + delay(10); + beginTime = millis(); + requestTime = millis() + 1000; + requestCount = 1; + state = 2; + break; + + case 2: // Get size and set start time for rendering duration report + if (millis() > requestTime) { + requestCount++; + print("*"); + serial.clear(); + serial.write("S"); + if (requestCount > 32) { + requestCount = 0; + System.err.println(" - no response!"); + state = 0; + } + requestTime = millis() + 1000; + } + if ( getSize() == true ) { // Go to next state when we have the size and bits per pixel + getFilename(); + flushBuffer(); // Precaution in case image header size increases in later versions + lastPixelTime = millis() + 1000; + beginTime = millis(); + state = 3; + } + break; + + case 3: // Request pixels and render returned RGB values + state = renderPixels(); // State will change when all pixels are rendered + + // Request more pixels, changing the number requested allows the average transfer rate to be controlled + // The pixel transfer rate is dependant on four things: + // 1. The frame rate defined in this Processing sketch in setup() + // 2. The baud rate of the serial link (~10 bit periods per byte) + // 3. The number of request bytes 'R' sent in the lines below + // 4. The number of pixels sent in a burst by the server sketch (defined via NPIXELS) + + //serial.write("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"); // 32 x NPIXELS more + serial.write("RRRRRRRRRRRRRRRR"); // 16 x NPIXELS more + //serial.write("RRRRRRRR"); // 8 x NPIXELS more + //serial.write("RRRR"); // 4 x NPIXELS more + //serial.write("RR"); // 2 x NPIXELS more + //serial.write("R"); // 1 x NPIXELS more + if (!running) state = 4; + break; + + case 4: // Pixel receive time-out, flush serial buffer + flushBuffer(); + state = 6; + break; + + case 5: // Save the image to the sketch folder (Ctrl+K to access) + saveScreenshot(); + saved_image_count++; + println("Saved image count = " + saved_image_count); + if (bad_image_count > 0) System.err.println(" Bad image count = " + bad_image_count); + drawLoopCount = frameCount; // Reset value ready for counting in step 6 + state = 6; + break; + + case 6: // Fade the old image if enabled + if ( fadedImage() == true ) state = 0; // Go to next state when image has faded + break; + + case 99: // Draw image viewer window + drawWindow(); + delay(50); // Delay here seems to be required for the IDE console to get ready + state = 0; + break; + + default: + println(""); + System.err.println("Error state reached - check sketch!"); + break; + } +} + +void drawWindow() +{ + // Graded background in Arduino colours + for (int i = 0; i < height - 25; i++) { + float inter = map(i, 0, height - 25, 0, 1); + color c = lerpColor(bgcolor1, bgcolor2, inter); + stroke(c); + line(0, i, 500, i); + } + fill(bgcolor2); + rect( 0, height-25, width-1, 24); + textAlign(CENTER); + textSize(20); + fill(0); + text("Bodmer's TFT image viewer", width/2, height-6); + + if (running) drawButton(buttonRunning); + else drawButton(buttonStopped); +} + +void flushBuffer() +{ + //println("Clearing serial pipe after a time-out"); + int clearTime = millis() + 50; + while ( millis() < clearTime ) serial.clear(); +} + +boolean getSize() +{ + if ( serial.available() > 6 ) { + println(); + char code = (char)serial.read(); + if (code == 'W') { + tft_width = serial.read()<<8 | serial.read(); + } + code = (char)serial.read(); + if (code == 'H') { + tft_height = serial.read()<<8 | serial.read(); + } + code = (char)serial.read(); + if (code == 'Y') { + int bits_per_pixel = (char)serial.read(); + if (bits_per_pixel == 24) color_bytes = 3; + else color_bytes = 2; + } + code = (char)serial.read(); + if (code == '?') { + drawWindow(); + + x_offset = (500 - tft_width) /2; + tint(0, 0, 0, 255); + noStroke(); + fill(frameColor); + rect((width - tft_width)/2 - border, y_offset - border, tft_width + 2 * border, tft_height + 2 * border); + return true; + } + } + return false; +} + +void saveScreenshot() +{ + println(); + if (saved_image_count < max_allowed) + { + if (filename == "") filename = "tft_screen_" + (n++); + filename = filename + image_type; + println("Saving image as \"" + filename + "\""); + if (save_border) + { + PImage partialSave = get(x_offset - border, y_offset - border, tft_width + 2*border, tft_height + 2*border); + partialSave.save(filename); + } else { + PImage partialSave = get(x_offset, y_offset, tft_width, tft_height); + partialSave.save(filename); + } + + if (n>=max_images) n = 0; + } + else + { + System.err.println(max_allowed + " saved image count exceeded, restart the sketch"); + } +} + +void getFilename() +{ + int readTime = millis() + 20; + int inByte = 0; + filename = ""; + while ( serial.available() > 0 && millis() < readTime && inByte != '.') + { + inByte = serial.read(); + if (inByte == ' ') inByte = '_'; + if ( unicodeCheck(inByte) ) filename += (char)inByte; + } + + inByte = serial.read(); + if (inByte == '@') filename += "_" + timeCode(); + else if (inByte == '#') filename += "_" + saved_image_count%100; + else if (inByte == '%') filename += "_" + millis(); + else if (inByte != '*') filename = ""; + + inByte = serial.read(); + if (inByte == 'j') image_type =".jpg"; + else if (inByte == 'b') image_type =".bmp"; + else if (inByte == 'p') image_type =".png"; + else if (inByte == 't') image_type =".tif"; +} + +boolean unicodeCheck(int unicode) +{ + if ( unicode >= '0' && unicode <= '9' ) return true; + if ( (unicode >= 'A' && unicode <= 'Z' ) || (unicode >= 'a' && unicode <= 'z')) return true; + if ( unicode == '_' || unicode == '/' ) return true; + return false; +} + +String timeCode() +{ + String timeCode = (int)year() + "_" + (int)month() + "_" + (int)day() + "_"; + timeCode += (int)hour() + "_" + (int)minute() + "_" + (int)second(); + return timeCode; +} + +int renderPixels() +{ + if ( serial.available() > 0 ) { + + // Add the latest byte from the serial port to array: + while (serial.available()>0) + { + rgb[serialCount++] = serial.read(); + + // If we have 3 colour bytes: + if ( serialCount >= color_bytes ) { + serialCount = 0; + pixel_count++; + if (color_bytes == 3) + { + stroke(rgb[indexRed], rgb[indexGreen], rgb[indexBlue], 1000); + } else + { // Can cater for various byte orders + //stroke( (rgb[0] & 0x1F)<<3, (rgb[0] & 0xE0)>>3 | (rgb[1] & 0x07)<<5, (rgb[1] & 0xF8)); + //stroke( (rgb[1] & 0x1F)<<3, (rgb[1] & 0xE0)>>3 | (rgb[0] & 0x07)<<5, (rgb[0] & 0xF8)); + stroke( (rgb[0] & 0xF8), (rgb[1] & 0xE0)>>3 | (rgb[0] & 0x07)<<5, (rgb[1] & 0x1F)<<3); + //stroke( (rgb[1] & 0xF8), (rgb[0] & 0xE0)>>3 | (rgb[1] & 0x07)<<5, (rgb[0] & 0x1F)<<3); + } + // We get some pixel merge aliasing if smooth() is defined, so draw pixel twice + point(xpos + x_offset, ypos + y_offset); + //point(xpos + x_offset, ypos + y_offset); + + lastPixelTime = millis(); + xpos++; + if (xpos >= tft_width) { + xpos = 0; + progressBar(); + ypos++; + if (ypos>=tft_height) { + ypos = 0; + if ((int)percentage <100) { + while (progress_bar++ < 64) print(" "); + percent(100); + } + println("Image fetch time = " + (millis()-beginTime)/1000.0 + " s"); + return 5; + } + } + } + } + } else + { + if (millis() > (lastPixelTime + pixelWaitTime)) + { + println(""); + System.err.println(pixelWaitTime + "ms time-out for pixels exceeded..."); + if (pixel_count > 0) { + bad_image_count++; + System.err.print("Pixels missing = " + (tft_width * tft_height - pixel_count)); + System.err.println(", corrupted image not saved"); + System.err.println("Good image count = " + saved_image_count); + System.err.println(" Bad image count = " + bad_image_count); + } + return 4; + } + } + return 3; +} + +void progressBar() +{ + progress_bar++; + print("."); + if (progress_bar >63) + { + progress_bar = 0; + percentage = 0.5 + 100 * pixel_count/(0.001 + tft_width * tft_height); + percent(percentage); + } +} + +void percent(float percentage) +{ + if (percentage > 100) percentage = 100; + println(" [ " + (int)percentage + "% ]"); + textAlign(LEFT); + textSize(16); + noStroke(); + fill(bgcolor2); + rect(10, height - 25, 70, 20); + fill(0); + text(" [ " + (int)percentage + "% ]", 10, height-8); +} + +boolean fadedImage() +{ + int opacity = frameCount - drawLoopCount; // So we get increasing fade + if (fade) + { + tint(255, opacity); + //image(tft_img, x_offset, y_offset); + noStroke(); + fill(50, 50, 50, opacity); + rect( (width - tft_width)/2, y_offset, tft_width, tft_height); + delay(10); + } + if (opacity > 50) // End fade after 50 cycles + { + return true; + } + return false; +} + +void drawButton(color buttonColor) +{ + stroke(0); + fill(buttonColor); + rect(500 - 100, 540 - 26, 80, 24); + textAlign(CENTER); + textSize(20); + fill(0); + if (running) text(" Pause ", 500 - 60, height-7); + else text(" Run ", 500 - 60, height-7); +} + +void buttonClicked() +{ + mouseClick = false; + if (running) { + running = false; + drawButton(buttonStopped); + System.err.println(""); + System.err.println("Stopped - click 'Run' button: "); + //noStroke(); + //fill(50); + //rect( (width - tft_width)/2, y_offset, tft_width, tft_height); + beginTime = millis() + 500; + dimmed = false; + state = 4; + } else { + running = true; + drawButton(buttonRunning); + } +} + +void mousePressed() { + if (mouseX > (500 - 100) && mouseX < (500 - 20) && mouseY > (540 - 26) && mouseY < (540 - 2)) { + mouseClick = true; + } +} \ No newline at end of file diff --git a/libraries/TFT_eSPI/Tools/bmp2array4bit/README.md b/libraries/TFT_eSPI/Tools/bmp2array4bit/README.md new file mode 100644 index 0000000..02405a9 --- /dev/null +++ b/libraries/TFT_eSPI/Tools/bmp2array4bit/README.md @@ -0,0 +1,26 @@ +## bmp2array4bit + +bmp2array4bit.py reads a bmp file, and creates C (or C++) code that contains two arrays for adding images to four-bit sprites. See [Sprite_image_4bit](../../examples/Sprite/Sprite_image_4bit) for an example. + +It is loosely based on Spark Fun's bmp2array script, https://github.com/sparkfun/BMPtoArray/blob/master/bmp2array.py. The bmp file format is documented in https://en.wikipedia.org/wiki/BMP_file_format. + +You'll need python 3.6 (the original uses Python 2.7) + +`usage: python bmp2array4bit.py [-v] star.bmp [-o myfile.c]` + +Create the bmp file in Gimp (www.gimp.org) from any image as follows: + +* Remove the alpha channel (if it has one) + Layer -> Transparency -> Remove Alpha Channel +* Set the mode to indexed. + Image -> Mode -> Indexed... +* Select Generate optimum palette with 16 colors (max) +* Export the file with a .bmp extension. Do **NOT** select options: + * Run-Length Encoded + * Compatibility Options: "Do not write color space information" + * There are no Advanced Options available with these settings + +(There are other tools that will produce bmp files, and these should work provided you don't use run-length encoding or other advanced features). + +The first array produced is the palette for the image. +The second is the image itself. diff --git a/libraries/TFT_eSPI/Tools/bmp2array4bit/bmp2array4bit.py b/libraries/TFT_eSPI/Tools/bmp2array4bit/bmp2array4bit.py new file mode 100644 index 0000000..3b6d850 --- /dev/null +++ b/libraries/TFT_eSPI/Tools/bmp2array4bit/bmp2array4bit.py @@ -0,0 +1,251 @@ +''' + + This script takes in a bitmap and outputs a text file that is a + byte array used in Arduino files. + + It is loosely based on Spark Fun's bmp2array script. + + You'll need python 3.6 (the original use Python 2.7) + + usage: python fourbitbmp2array.py [-v] star.bmp [-o myfile.c] + + Create the bmp file in Gimp by : + + . Remove the alpha channel (if it has one) Layer -> Transparency -> Remove Alpha Channel + . Set the mode to indexed. Image -> Mode -> Indexed... + . Select Generate optimum palette with 16 colors (max) + . Export the file with a .bmp extension. Options are: + . Run-Length Encoded: not selected + . Compatibility Options: "Do not write color space information" not selected + . There are no Advanced Options available with these settings + + + + +''' + +import sys +import struct +import math +import argparse +import os + +debug = None + +def debugOut(s): + if debug: + print(s) + +# look at arguments +parser = argparse.ArgumentParser(description="Convert bmp file to C array") +parser.add_argument("-v", "--verbose", help="debug output", action="store_true") +parser.add_argument("input", help="input file name") +parser.add_argument("-o", "--output", help="output file name") +args = parser.parse_args() + +if not os.path.exists(args.input): + parser.print_help() + print("The input file {} does not exist".format(args.input)) + sys.exit(1) + +if args.output == None: + output = os.path.basename(args.input).replace(".bmp", ".c") +else: + output = args.output + +debug = args.verbose + +try: + #Open our input file which is defined by the first commandline argument + #then dump it into a list of bytes + infile = open(args.input,"rb") #b is for binary + contents = bytearray(infile.read()) + infile.close() +except: + print("could not read input file {}".format(args.input)) + sys.exit(1) + +# first two bytes should be "BM" +upto = 2 +#Get the size of this image +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +fileSize = struct.unpack("I", bytearray(data)) + +upto += 4 +# four bytes are reserved + +upto += 4 + +debugOut("Size of file: {}".format(fileSize[0])) + +#Get the header offset amount +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +offset = struct.unpack("I", bytearray(data)) + +debugOut("Offset: {}".format(offset[0])) +upto += 4 + +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +headersize = struct.unpack("I", bytearray(data)) +headerLength = headersize[0] +startOfDefinitions = headerLength + upto +debugOut("header size: {}, up to {}, startOfDefinitions {}".format(headersize[0], upto, startOfDefinitions)) +upto += 4 + +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("width: {}".format(t[0])) +width = t[0] + +upto += 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("height: {}".format(t[0])) +height = t[0] + +# 26 +upto += 4 + +data = struct.pack("BB", contents[upto], contents[upto+1]) +t = struct.unpack("H", bytearray(data)) +debugOut("planes: {}".format(t[0])) + +upto = upto + 2 +data = struct.pack("BB", contents[upto], contents[upto+1]) +t = struct.unpack("H", bytearray(data)) +debugOut("bits per pixel: {}".format(t[0])) +bitsPerPixel = t[0] + +upto = upto + 2 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biCompression: {}".format(t[0])) + +upto = upto + 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biSizeImage: {}".format(t[0])) + +upto = upto + 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biXPelsPerMeter: {}".format(t[0])) + +upto = upto + 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biYPelsPerMeter: {}".format(t[0])) + +upto = upto + 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biClrUsed: {}".format(t[0])) +colorsUsed = t + +upto = upto + 4 +data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) +t = struct.unpack("I", bytearray(data)) +debugOut("biClrImportant: {}".format(t[0])) + +upto += 4 + +debugOut("Upto: {} Number of colors used: {} definitions start at: {}".format(upto, colorsUsed[0], startOfDefinitions)) + +#Create color definition array and init the array of color values +colorIndex = [] #(colorsUsed[0]) +for i in range(colorsUsed[0]): + colorIndex.append(0) + +#Assign the colors to the array. upto = 54 +# startOfDefinitions = upto +for i in range(colorsUsed[0]): + upto = startOfDefinitions + (i * 4) + blue = contents[upto] + green = contents[upto + 1] + red = contents[upto + 2] + # ignore the alpha channel. + + # data = struct.pack("BBBB", contents[upto], contents[upto+1], contents[upto+2], contents[upto+3]) + # t = struct.unpack("I", bytearray(data)) + # colorIndex[i] = t[0] + + colorIndex[i] = (((red & 0xf8)<<8) + ((green & 0xfc)<<3)+(blue>>3)) + debugOut("color at index {0} is {1:04x}, (r,g,b,a) = ({2:02x}, {3:02x}, {4:02x}, {5:02x})".format(i, colorIndex[i], red, green, blue, contents[upto+3])) + +#debugOut(the color definitions +# for i in range(colorsUsed[0]): +# print hex(colorIndex[i]) + +# perfect, except upside down. + +#Make a string to hold the output of our script +arraySize = (len(contents) - offset[0]) +outputString = "/* This was generated using a script based on the SparkFun BMPtoArray python script" + '\n' +outputString += " See https://github.com/sparkfun/BMPtoArray for more info */" + '\n\n' +outputString += "static const uint16_t palette[" + str(colorsUsed[0]) + "] = {"; +for i in range(colorsUsed[0]): + # print hexlify(colorIndex[i]) + if i % 4 == 0: + outputString += "\n\t" + outputString += "0x{:04x}, ".format(colorIndex[i]) + +outputString = outputString[:-2] +outputString += "\n};\n\n" +outputString += "// width is " + str(width) + ", height is " + str(height) + "\n" +outputString += "static const uint8_t myGraphic[" + str(arraySize) + "] PROGMEM = {" + '\n' + +if bitsPerPixel != 4: + print("Expected 4 bits per pixel; found {}".format(bitsPerPixel)) + sys.exit(1) + +#Start converting spots to values +#Start at the offset and go to the end of the file +dropLastNumber = True #(width % 4) == 2 or (width % 4) == 1 +paddedWidth = int(math.ceil(bitsPerPixel * width / 32.0) * 4) +debugOut("array range is {} {} len(contents) is {} paddedWidth is {} width is {}".format(offset[0], fileSize[0], len(contents), paddedWidth, width)) + +r = 0 +width = int(width / 2) +#for i in range(offset[0], fileSize[0]): # close but image is upside down. Each row is correct but need to swap columns. +#for i in range(fileSize[0], offset[0], -1): + +for col in range(height-1, -1, -1): + i = 0 + for row in range(width): + colorCode1 = contents[row + col*paddedWidth + offset[0]] + + if r > 0 and r % width == 0: + i = 0 + outputString += '\n\n' + elif (i + 1) % 12 == 0 : + outputString += '\n' + i = 0 + + #debugOut("cell ({0}, {1})".format(row, col) + + r = r + 1 + i = i + 1 + outputString += "0x{:02x}, ".format(colorCode1) + + + +#Once we've reached the end of our input string, pull the last two +#characters off (the last comma and space) since we don't need +#them. Top it off with a closing bracket and a semicolon. +outputString = outputString[:-2] +outputString += "};" + +try: + #Write the output string to our output file + outfile = open(output, "w") + outfile.write(outputString) + outfile.close() +except: + print("could not write output to file {}".format(output)) + sys.exit(1) + +debugOut("{} complete".format(output)) +debugOut("Copy and paste this array into a image.h or other header file") + +if not debug: + print("Completed; the output is in {}".format(output)) diff --git a/libraries/TFT_eSPI/Tools/bmp2array4bit/star.bmp b/libraries/TFT_eSPI/Tools/bmp2array4bit/star.bmp new file mode 100644 index 0000000..21166da Binary files /dev/null and b/libraries/TFT_eSPI/Tools/bmp2array4bit/star.bmp differ diff --git a/libraries/TFT_eSPI/User_Setup.h b/libraries/TFT_eSPI/User_Setup.h new file mode 100644 index 0000000..6a79021 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setup.h @@ -0,0 +1,389 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + +// User defined information reported by "Read_User_Setup" test & diagnostics example +#define USER_SETUP_INFO "User_Setup" + +// Define to disable all #warnings in library (can be put in User_Setup_Select.h) +//#define DISABLE_ALL_LIBRARY_WARNINGS + +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Define STM32 to invoke optimised processor support (only for STM32) +//#define STM32 + +// Defining the STM32 board allows the library to optimise the performance +// for UNO compatible "MCUfriend" style shields +//#define NUCLEO_64_TFT +//#define NUCLEO_144_TFT + +// STM32 8-bit parallel only: +// If STN32 Port A or B pins 0-7 are used for 8-bit parallel data bus bits 0-7 +// then this will improve rendering performance by a factor of ~8x +//#define STM_PORTA_DATA_BUS +//#define STM_PORTB_DATA_BUS + +// Tell the library to use parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT +//#defined TFT_PARALLEL_16_BIT // **** 16-bit parallel ONLY for RP2040 processor **** + +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER // Generic driver for common displays +//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172 +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1351_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER +//#define GC9A01_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below + +// #define M5STACK + +// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 172 // ST7789 172 x 320 +// #define TFT_WIDTH 170 // ST7789 170 x 320 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 +// #define TFT_HEIGHT 240 // GC9A01 240 x 240 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or stray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_ROBOTLCD // For some RobotLCD Arduino shields (128x160, BGR, https://docs.arduino.cc/retired/getting-started-guides/TFT) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + + + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for ESP8266 NodeMCU ESP-12 is : +// +// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT) +// Display LED to NodeMCU pin VIN (or 5V, see below) +// Display SCK to NodeMCU pin D5 +// Display SDI/MOSI to NodeMCU pin D7 +// Display DC (RS/AO)to NodeMCU pin D3 +// Display RESET to NodeMCU pin D4 (or RST, see below) +// Display CS to NodeMCU pin D8 (or GND, see below) +// Display GND to NodeMCU pin GND (0V) +// Display VCC to NodeMCU 5V or 3.3V +// +// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. +// +// The NodeMCU D0 pin can be used for RST +// +// +// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin +// If 5V is not available at a pin you can use 3.3V but backlight brightness +// will be lower. + + +// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ###### + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_MISO PIN_D6 // Automatically assigned with ESP8266 if not defined +#define TFT_MOSI PIN_D7 // Automatically assigned with ESP8266 if not defined +#define TFT_SCLK PIN_D5 // Automatically assigned with ESP8266 if not defined + +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin) + +//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen + +//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only + + +// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ###### + +// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact +// but saves pins for other functions. It is best not to connect MISO as some displays +// do not tristate that line when chip select is high! +// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller +// cannot be connected as well to the same SPI signals. +// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode +// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK +// In ESP8266 overlap mode the following must be defined + +//#define TFT_SPI_OVERLAP + +// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3 +//#define TFT_CS PIN_D3 +//#define TFT_DC PIN_D5 // Data Command control pin +//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ###### + +// For ESP32 Dev board (only tested with ILI9341 display) +// The hardware SPI can be mapped to any pins + +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS 15 // Chip select control pin +//#define TFT_DC 2 // Data Command control pin +//#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +// For ESP32 Dev board (only tested with GC9A01 display) +// The hardware SPI can be mapped to any pins + +//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on. +//#define TFT_SCLK 14 +//#define TFT_CS 5 // Chip select control pin +//#define TFT_DC 27 // Data Command control pin +//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL 22 // LED back-light + +//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen + +//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only + +// For the M5Stack module use these #define lines +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS 14 // Chip select control pin +//#define TFT_DC 27 // Data Command control pin +//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL 32 // LED back-light (required for M5Stack) + +// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### + +// The library supports 8-bit parallel TFTs with the ESP32, the pin +// selection below is compatible with ESP32 boards in UNO format. +// Wemos D32 boards need to be modified, see diagram in Tools folder. +// Only ILI9481 and ILI9341 based displays have been tested! + +// Parallel bus is only supported for the STM32 and ESP32 +// Example below is for ESP32 Parallel interface with UNO displays + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT + +// The ESP32 and TFT the pins used for testing are: +//#define TFT_CS 33 // Chip select control pin (library pulls permanently low +//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +//#define TFT_RST 32 // Reset pin, toggles on startup + +//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +//#define TFT_RD 2 // Read strobe control pin + +//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +//#define TFT_D1 13 // so a single register write sets/clears all bits. +//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect +//#define TFT_D3 25 // TFT screen update performance. +//#define TFT_D4 17 +//#define TFT_D5 16 +//#define TFT_D6 27 +//#define TFT_D7 14 + +// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ###### + +// The TFT can be connected to SPI port 1 or 2 +//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz +//#define TFT_MOSI PA7 +//#define TFT_MISO PA6 +//#define TFT_SCLK PA5 + +//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz +//#define TFT_MOSI PB15 +//#define TFT_MISO PB14 +//#define TFT_SCLK PB13 + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +//#define TFT_CS D5 // Chip select control pin to TFT CS +//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +//#define TFT_RST D7 // Reset pin to TFT RST (or RESET) +// OR alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +/*#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT*/ + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface. +//#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface + +// For RP2040 processor and 8 or 16-bit parallel displays: +// The parallel interface write cycle period is derived from a division of the CPU clock +// speed so scales with the processor clock. This means that the divider ratio may need +// to be increased when overclocking. It may also need to be adjusted dependant on the +// display controller type (ILI94341, HX8357C etc.). If RP2040_PIO_CLK_DIV is not defined +// the library will set default values which may not suit your display. +// The display controller data sheet will specify the minimum write cycle period. The +// controllers often work reliably for shorter periods, however if the period is too short +// the display may not initialise or graphics will become corrupted. +// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) +//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock + +// For the RP2040 processor define the SPI port channel used (default 0 if undefined) +//#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// For the STM32 processor define the SPI port channel used (default 1 if undefined) +//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2 + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz) +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + +// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default. +// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam) +// then uncomment the following line: +//#define USE_HSPI_PORT + +// Comment out the following #define if "SPI Transactions" do not need to be +// supported. When commented out the code size will be smaller and sketches will +// run slightly faster, so leave it commented out unless you need it! + +// Transaction support is needed to work with SD library but not needed with TFT_SdFat +// Transaction support is required if other SPI devices are connected. + +// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex) +// so changing it here has no effect + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setup_Select.h b/libraries/TFT_eSPI/User_Setup_Select.h new file mode 100644 index 0000000..c7fb881 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setup_Select.h @@ -0,0 +1,282 @@ +// This header file contains a list of user setup files and defines which one the +// compiler uses when the IDE performs a Verify/Compile or Upload. +// +// Users can create configurations for different Espressif boards and TFT displays. +// This makes selecting between hardware setups easy by "uncommenting" one line. + +// The advantage of this hardware configuration method is that the examples provided +// with the library should work with different setups immediately without any other +// changes being needed. It also improves the portability of users sketches to other +// hardware configurations and compatible libraries. +// +// Create a shortcut to this file on your desktop to permit quick access for editing. +// Re-compile and upload after making and saving any changes to this file. + +// Customised User_Setup files are stored in the "User_Setups" folder. + +#ifndef USER_SETUP_LOADED // Lets PlatformIO users define settings in + // platformio.ini, see notes in "Tools" folder. + +// Only ONE line below should be uncommented. Add extra lines and files as needed. + +// #include // Default setup is root library folder + +//#include // Setup file for ESP8266 configured for my ILI9341 +//#include // Setup file for ESP8266 configured for my ST7735 +//#include // Setup file for ESP8266 configured for my ILI9163 +//#include // Setup file for ESP8266 configured for my S6D02A1 +//#include // Setup file for ESP8266 configured for my stock RPi TFT +//#include // Setup file for ESP8266 configured for my modified RPi TFT +//#include // Setup file for ESP8266 configured for my ST7735 128x128 display +//#include // Setup file for ESP8266 configured for my ILI9163 128x128 display +//#include // Setup file for ESP8266 configured for my ST7735 +//#include // Setup file for ESP8266 configured for ESP8266 and RPi TFT with touch + +//#include // Setup file configured for ESP32 and RPi TFT with touch +//#include // Setup file for the ESP32 based M5Stack (Basic Core only) +//#include // Setup file for the ESP32 with parallel bus TFT +//#include // Setup file for the ESP32 with parallel bus TFT +//#include // Setup file for ESP8266 configured for HX8357D +//#include // Setup file for the ESP32 with parallel bus TFT +//#include // Setup file for ESP8266 and any Waveshare ePaper display +//#include // Setup file for ESP8266 configured for ST7789 + +//#include // Setup file configured for RM68140 with parallel bus + +//#include // Setup file for ESP8266 and ILI9488 SPI bus TFT +//#include // Setup file for ESP32 and ILI9488 SPI bus TFT + +//#include // Setup file for ESP32 and TTGO T4 version 1.2 +//#include // Setup file for ESP32 and TTGO T4 version 1.3 + +#include // Setup file for ESP32 and TTGO TM ST7789 SPI bus TFT + +//#include // Setup file for DSTIKE/ESP32/ESP8266 configured for ST7789 240 x 240 +//#include // Setup file for ESP32 and TTGO T-Display ST7789V SPI bus TFT +//#include // Setup file for ESP32 and TTGO T-Wristband ST7735 SPI bus TFT + +//#include // ESP32 RPi MHS-4.0 inch Display-B +//#include // ESP8266 RPi MHS-4.0 inch Display-B + +//#include // Setup for Nucleo board +//#include // Setup for Nucleo board and parallel display +//#include // Setup for Nucleo board and parallel display +//#include // Setup for "Blue/Black Pill" + +//#include // Setup for Nucleo board + +//#include // Setup for Nucleo board and parallel display +//#include // Setup for STM32 port A parallel display + +//#include // Setup file configured for ESP32 and RPi ST7796 TFT with touch + +//#include // Setup file for ESP32 and SPI ILI9341 240x320 +//#include // Setup file for ESP8266 & ESP32 configured for my ST7735S 80x160 +//#include // Setup file for ESP32 and TTGO T-CameraPlus ST7789 SPI bus TFT 240x240 +// #include // Setup file for ESP32 and TTGO T-Watch ST7789 SPI bus TFT 240x240 +//#include // Setup file for ESP32 and GC9A01 SPI bus TFT 240x240 + +//#include // Setup file for ESP32 configured for ST7735 128 x 128 animated eyes + +//#include // Setup file for ESP32 and SSD1963 TFT display + +//#include // Setup file for LilyGo LilyPi with ILI9481 display +//#include // Setup file for LilyGo LilyPi with ST7796 display + +// #include // Setup file for RP2040 with SPI ILI9341 +// #include // Setup file for RP2040 with PIO SPI ILI9341 +// #include // Setup file for RP2040 with SPI ILI9341 + +//#include // Setup file for ESP32 S2 with SPI ILI9341 +//#include // Setup file for ESP32 S3 with SPI ILI9341 +//#include // Setup file for ESP32 C3 with SPI ILI9341 +//#include // Setup file for ESP32 S3 with SPI ILI9488 + +//#include // Setup file for ESP32 S2 with ST7789 +//#include // Setup file for ESP32 with ST7789 1.47" 172x320 + +//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9488 +//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9481 +//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9341 +//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9486 +//#include // Setup file for Pico/RP2040 with 8 bit parallel ST7796 + +//#include // Setup file for RP2040 16 bit parallel display +//#include // Setup file for RP2040 16 bit parallel display +//#include // Setup file for RP2040 16 bit parallel display + +// #include // Setup file for ESP8266 and ST7789 135 x 240 TFT + +//#include // Setup file for ESP32 and Lilygo TTV ST7789 SPI bus TFT 135x240 +// #include // Setup file for Lilygo T-Display RP2040 (ST7789 on SPI bus with 135x240 TFT) + +//#include // Setup file for ESP32 and GC9A01 240 x 240 TFT + +//#include // Setup file for ESP32 based WT32_SC01 from Seeed + +//#include // Setup file for ESP32/ESP8266 based SSD1351 128x128 1.5inch OLED display + +// #include // Setup file for ESP32/ESP8266 based ST7789 240X280 1.69inch TFT + +//#include // Setup file for the ESP32 TouchDown based on ILI9488 480 x 320 TFT + +//#include // Setup file for the ESP32 TouchDown S3 based on ILI9488 480 x 320 TFT + +//#include // Template file for a setup + + +//#include // Setup file for Dustin Watts PCB with ILI9488 +//#include // Setup file for Dustin Watts PCB with ST7796 +//#include // Setup file for Dustin Watts Pico PCB with ST7796 +//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with ILI9341 +//#include + +#endif // USER_SETUP_LOADED + + + +///////////////////////////////////////////////////////////////////////////////////// +// // +// DON'T TINKER WITH ANY OF THE FOLLOWING LINES, THESE ADD THE TFT DRIVERS // +// AND ESP8266 PIN DEFINITONS, THEY ARE HERE FOR BODMER'S CONVENIENCE! // +// // +///////////////////////////////////////////////////////////////////////////////////// + + +// Identical looking TFT displays may have a different colour ordering in the 16 bit colour +#define TFT_BGR 0 // Colour order Blue-Green-Red +#define TFT_RGB 1 // Colour order Red-Green-Blue + +// Legacy setup support, RPI_DISPLAY_TYPE replaces RPI_DRIVER +#if defined (RPI_DRIVER) + #if !defined (RPI_DISPLAY_TYPE) + #define RPI_DISPLAY_TYPE + #endif +#endif + +// Legacy setup support, RPI_ILI9486_DRIVER form is deprecated +// Instead define RPI_DISPLAY_TYPE and also define driver (e.g. ILI9486_DRIVER) +#if defined (RPI_ILI9486_DRIVER) + #if !defined (ILI9486_DRIVER) + #define ILI9486_DRIVER + #endif + #if !defined (RPI_DISPLAY_TYPE) + #define RPI_DISPLAY_TYPE + #endif +#endif + +// Invoke 18 bit colour for selected displays +#if !defined (RPI_DISPLAY_TYPE) && !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) && !defined (ESP32_PARALLEL) + #if defined (ILI9481_DRIVER) || defined (ILI9486_DRIVER) || defined (ILI9488_DRIVER) + #define SPI_18BIT_DRIVER + #endif +#endif + +// Load the right driver definition - do not tinker here ! +#if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9342_DRIVER) + #include + #define TFT_DRIVER 0x9341 +#elif defined (ST7735_DRIVER) + #include + #define TFT_DRIVER 0x7735 +#elif defined (ILI9163_DRIVER) + #include + #define TFT_DRIVER 0x9163 +#elif defined (S6D02A1_DRIVER) + #include + #define TFT_DRIVER 0x6D02 +#elif defined (ST7796_DRIVER) + #include "TFT_Drivers/ST7796_Defines.h" + #define TFT_DRIVER 0x7796 +#elif defined (ILI9486_DRIVER) + #include + #define TFT_DRIVER 0x9486 +#elif defined (ILI9481_DRIVER) + #include + #define TFT_DRIVER 0x9481 +#elif defined (ILI9488_DRIVER) + #include + #define TFT_DRIVER 0x9488 +#elif defined (HX8357D_DRIVER) + #include "TFT_Drivers/HX8357D_Defines.h" + #define TFT_DRIVER 0x8357 +#elif defined (EPD_DRIVER) + #include "TFT_Drivers/EPD_Defines.h" + #define TFT_DRIVER 0xE9D +#elif defined (ST7789_DRIVER) + #include "TFT_Drivers/ST7789_Defines.h" + #define TFT_DRIVER 0x7789 +#elif defined (R61581_DRIVER) + #include "TFT_Drivers/R61581_Defines.h" + #define TFT_DRIVER 0x6158 +#elif defined (ST7789_2_DRIVER) + #include "TFT_Drivers/ST7789_2_Defines.h" + #define TFT_DRIVER 0x778B +#elif defined (RM68140_DRIVER) + #include "TFT_Drivers/RM68140_Defines.h" + #define TFT_DRIVER 0x6814 +#elif defined (SSD1351_DRIVER) + #include "TFT_Drivers/SSD1351_Defines.h" + #define TFT_DRIVER 0x1351 +#elif defined (SSD1963_480_DRIVER) + #include "TFT_Drivers/SSD1963_Defines.h" + #define TFT_DRIVER 0x1963 +#elif defined (SSD1963_800_DRIVER) + #include "TFT_Drivers/SSD1963_Defines.h" + #define TFT_DRIVER 0x1963 +#elif defined (SSD1963_800ALT_DRIVER) + #include "TFT_Drivers/SSD1963_Defines.h" + #define TFT_DRIVER 0x1963 +#elif defined (SSD1963_800BD_DRIVER) + #include "TFT_Drivers/SSD1963_Defines.h" + #define TFT_DRIVER 0x1963 +#elif defined (GC9A01_DRIVER) + #include "TFT_Drivers/GC9A01_Defines.h" + #define TFT_DRIVER 0x9A01 +#elif defined (ILI9225_DRIVER) + #include "TFT_Drivers/ILI9225_Defines.h" + #define TFT_DRIVER 0x9225 +#elif defined (RM68120_DRIVER) + #include "TFT_Drivers/RM68120_Defines.h" + #define TFT_DRIVER 0x6812 +#elif defined (HX8357B_DRIVER) + #include "TFT_Drivers/HX8357B_Defines.h" + #define TFT_DRIVER 0x835B +#elif defined (HX8357C_DRIVER) + #include "TFT_Drivers/HX8357C_Defines.h" + #define TFT_DRIVER 0x835C + + // <<<<<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVER HERE + // XYZZY_init.h and XYZZY_rotation.h must also be added in TFT_eSPI.cpp +#elif defined (XYZZY_DRIVER) + #include "TFT_Drivers/XYZZY_Defines.h" + #define TFT_DRIVER 0x0000 +#else + #define TFT_DRIVER 0x0000 +#endif + +// These are the pins for ESP8266 boards +// Name GPIO NodeMCU Function +#define PIN_D0 16 // GPIO16 WAKE +#define PIN_D1 5 // GPIO5 User purpose +#define PIN_D2 4 // GPIO4 User purpose +#define PIN_D3 0 // GPIO0 Low on boot means enter FLASH mode +#define PIN_D4 2 // GPIO2 TXD1 (must be high on boot to go to UART0 FLASH mode) +#define PIN_D5 14 // GPIO14 HSCLK +#define PIN_D6 12 // GPIO12 HMISO +#define PIN_D7 13 // GPIO13 HMOSI RXD2 +#define PIN_D8 15 // GPIO15 HCS TXD0 (must be low on boot to enter UART0 FLASH mode) +#define PIN_D9 3 // RXD0 +#define PIN_D10 1 // TXD0 + +#define PIN_MOSI 8 // SD1 FLASH and overlap mode +#define PIN_MISO 7 // SD0 +#define PIN_SCLK 6 // CLK +#define PIN_HWCS 0 // D3 + +#define PIN_D11 9 // SD2 +#define PIN_D12 10 // SD4 diff --git a/libraries/TFT_eSPI/User_Setups/Setup0_Sprite.h b/libraries/TFT_eSPI/User_Setups/Setup0_Sprite.h new file mode 100644 index 0000000..a769291 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup0_Sprite.h @@ -0,0 +1,47 @@ +// For sprite only functionality (untested) +#define USER_SETUP_ID 0 + +#define TFT_WIDTH 1000 +#define TFT_HEIGHT 1000 + +#define TFT_INIT_DELAY 0 + +#define TFT_NOP 0x00 +#define TFT_SWRST 0x00 + +#define TFT_CASET 0x00 +#define TFT_PASET 0x00 +#define TFT_RAMWR 0x00 + +#define TFT_RAMRD 0x00 +#define TFT_IDXRD 0x00 + +/* +#define TFT_MADCTL 0x00 +#define TFT_MAD_MY 0x00 +#define TFT_MAD_MX 0x00 +#define TFT_MAD_MV 0x00 +#define TFT_MAD_ML 0x00 +#define TFT_MAD_BGR 0x00 +#define TFT_MAD_MH 0x00 +#define TFT_MAD_RGB 0x00 +*/ +#define TFT_INVOFF 0x00 +#define TFT_INVON 0x00 + + +#define TFT_MISO -1 +#define TFT_MOSI -1 +#define TFT_SCLK -1 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup100_RP2040_ILI9488_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup100_RP2040_ILI9488_parallel.h new file mode 100644 index 0000000..dcec30e --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup100_RP2040_ILI9488_parallel.h @@ -0,0 +1,54 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 100 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_8_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9488_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 28 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 22 + + // PIO requires these to be sequentially increasing - do not change + #define TFT_D0 6 + #define TFT_D1 7 + #define TFT_D2 8 + #define TFT_D3 9 + #define TFT_D4 10 + #define TFT_D5 11 + #define TFT_D6 12 + #define TFT_D7 13 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup101_RP2040_ILI9481_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup101_RP2040_ILI9481_parallel.h new file mode 100644 index 0000000..714e5e1 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup101_RP2040_ILI9481_parallel.h @@ -0,0 +1,54 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 101 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_8_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9481_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 28 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 22 + + // PIO requires these to be sequentially increasing - do not change + #define TFT_D0 6 + #define TFT_D1 7 + #define TFT_D2 8 + #define TFT_D3 9 + #define TFT_D4 10 + #define TFT_D5 11 + #define TFT_D6 12 + #define TFT_D7 13 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup102_RP2040_ILI9341_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup102_RP2040_ILI9341_parallel.h new file mode 100644 index 0000000..ce133c8 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup102_RP2040_ILI9341_parallel.h @@ -0,0 +1,54 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 102 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_8_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9341_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 28 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 22 + + // PIO requires these to be sequentially increasing - do not change + #define TFT_D0 6 + #define TFT_D1 7 + #define TFT_D2 8 + #define TFT_D3 9 + #define TFT_D4 10 + #define TFT_D5 11 + #define TFT_D6 12 + #define TFT_D7 13 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup103_RP2040_ILI9486_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup103_RP2040_ILI9486_parallel.h new file mode 100644 index 0000000..34bb702 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup103_RP2040_ILI9486_parallel.h @@ -0,0 +1,54 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 103 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_8_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9486_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 28 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 22 + + // PIO requires these to be sequentially increasing - do not change + #define TFT_D0 6 + #define TFT_D1 7 + #define TFT_D2 8 + #define TFT_D3 9 + #define TFT_D4 10 + #define TFT_D5 11 + #define TFT_D6 12 + #define TFT_D7 13 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup104_RP2040_ST7796_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup104_RP2040_ST7796_parallel.h new file mode 100644 index 0000000..a76e4fc --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup104_RP2040_ST7796_parallel.h @@ -0,0 +1,54 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 104 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_8_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ST7796_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 28 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 22 + + // PIO requires these to be sequentially increasing - do not change + #define TFT_D0 6 + #define TFT_D1 7 + #define TFT_D2 8 + #define TFT_D3 9 + #define TFT_D4 10 + #define TFT_D5 11 + #define TFT_D6 12 + #define TFT_D7 13 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h new file mode 100644 index 0000000..82b506c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h @@ -0,0 +1,60 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 105 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_PARALLEL_16_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ST7796_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +//#define TFT_CS -1 // Do not define, chip select control pin permanently connected to 0V + +// These pins can be moved and are controlled directly by the library software +#define TFT_DC 3 // Data Command control pin +#define TFT_RST 2 // Reset pin + +//#define TFT_RD -1 // Do not define, read pin must be permanently connected to 3V3 +#define TFT_WR 4 + +// PIO requires these to be sequentially increasing GPIO with no gaps +#define TFT_D0 6 +#define TFT_D1 7 +#define TFT_D2 8 +#define TFT_D3 9 +#define TFT_D4 10 +#define TFT_D5 11 +#define TFT_D6 12 +#define TFT_D7 13 +#define TFT_D8 14 +#define TFT_D9 15 +#define TFT_D10 16 +#define TFT_D11 17 +#define TFT_D12 18 +#define TFT_D13 19 +#define TFT_D14 20 +#define TFT_D15 21 + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h new file mode 100644 index 0000000..7273ba3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h @@ -0,0 +1,77 @@ +// This setup is for the RP2040 processor when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 106 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +//#define TFT_PARALLEL_8_BIT +#define TFT_PARALLEL_16_BIT + +// The parallel interface write cycle period is derived from a division of the CPU clock +// speed so scales with the processor clock. This means that the divider ratio may need +// to be increased when overclocking. I may also need to be adjusted dependant on the +// display controller type (ILI94341, HX8357C etc.). If RP2040_PIO_CLK_DIV is not defined +// the library will set default values which may not suit your display. +// The display controller data sheet will specify the minimum write cycle period. The +// controllers often work reliably for shorter periods, however if the period is too short +// the display may not initialise or graphics will become corrupted. +// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) +//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 4 // 96ns write cycle at 125MHz CPU clock + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9481_DRIVER +//#define HX8357B_DRIVER +//#define HX8357C_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +// These pins can be moved and are controlled directly by the library software +#define TFT_RST 18 // Reset pin +#define TFT_CS 19 // Do not define if chip select control pin permanently connected to 0V +//#define TFT_RD -1 // Do not define, read pin must be permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 16 // Write strobe pin + #define TFT_DC 17 // Data Command control pin + + // PIO requires these to be sequentially increasing + #define TFT_D0 0 + #define TFT_D1 1 + #define TFT_D2 2 + #define TFT_D3 3 + #define TFT_D4 4 + #define TFT_D5 5 + #define TFT_D6 6 + #define TFT_D7 7 + #define TFT_D8 8 + #define TFT_D9 9 + #define TFT_D10 10 + #define TFT_D11 11 + #define TFT_D12 12 + #define TFT_D13 13 + #define TFT_D14 14 + #define TFT_D15 15 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h b/libraries/TFT_eSPI/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h new file mode 100644 index 0000000..384dc1c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h @@ -0,0 +1,65 @@ +// This setup is for the RP2040 processor only when used with 8-bit parallel displays +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 107 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Interface +//////////////////////////////////////////////////////////////////////////////////////////// +//#define TFT_PARALLEL_8_BIT +#define TFT_PARALLEL_16_BIT + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ILI9341_DRIVER +//#define ILI9481_DRIVER // Tested +//#define HX8357B_DRIVER // Tested +//#define HX8357C_DRIVER // Tested +//#define SSD1963_800_DRIVER + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 pins used +//////////////////////////////////////////////////////////////////////////////////////////// + +// These pins can be moved and are controlled directly by the library software +#define TFT_RST 18 // Reset pin +#define TFT_CS 19 // Do not define if chip select control pin permanently connected to 0V +//#define TFT_RD -1 // Do not define, read pin must be permanently connected to 3V3 + +// Note: All the following pins are PIO hardware configured and driven + #define TFT_WR 16 // Write strobe pin + #define TFT_DC 17 // Data Command control pin + + // PIO requires these to be sequentially increasing + #define TFT_D0 0 + #define TFT_D1 1 + #define TFT_D2 2 + #define TFT_D3 3 + #define TFT_D4 4 + #define TFT_D5 5 + #define TFT_D6 6 + #define TFT_D7 7 + #define TFT_D8 8 + #define TFT_D9 9 + #define TFT_D10 10 + #define TFT_D11 11 + #define TFT_D12 12 + #define TFT_D13 13 + #define TFT_D14 14 + #define TFT_D15 15 +//*/ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup108_RP2040_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup108_RP2040_ST7735.h new file mode 100644 index 0000000..dc6ac31 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup108_RP2040_ST7735.h @@ -0,0 +1,44 @@ +// This setup is for the Waveshare RP2040-LCD-0.96 board +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 108 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ST7735_DRIVER +#define ST7735_GREENTAB160x80 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display params +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 +#define TFT_INVERSION_ON + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 config and pins +//////////////////////////////////////////////////////////////////////////////////////////// +#define SPI_FREQUENCY 27000000 +#define RP2040_PIO_CLK_DIV 1 +#define TFT_SPI_PORT 1 + +#define TFT_MOSI 11 +#define TFT_SCLK 10 +#define TFT_CS 9 +#define TFT_DC 8 +#define TFT_RST 12 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup10_RPi_touch_ILI9486.h b/libraries/TFT_eSPI/User_Setups/Setup10_RPi_touch_ILI9486.h new file mode 100644 index 0000000..bde50d3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup10_RPi_touch_ILI9486.h @@ -0,0 +1,33 @@ +// For ESP8266 +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 10 + +#define RPI_DISPLAY_TYPE +#define ILI9486_DRIVER + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D2 // Chip select control pin D2 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + +#define TOUCH_CS PIN_D1 // Chip select pin (T_CS) of touch screen + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 16000000 // Some displays will operate at higher frequencies + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup11_RPi_touch_ILI9486.h b/libraries/TFT_eSPI/User_Setups/Setup11_RPi_touch_ILI9486.h new file mode 100644 index 0000000..0c9ff18 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup11_RPi_touch_ILI9486.h @@ -0,0 +1,32 @@ +// For ESP32 +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 11 + +#define RPI_DISPLAY_TYPE +#define ILI9486_DRIVER + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 // Some displays will operate at higher frequencies + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup12_M5Stack_Basic_Core.h b/libraries/TFT_eSPI/User_Setups/Setup12_M5Stack_Basic_Core.h new file mode 100644 index 0000000..ff15fff --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup12_M5Stack_Basic_Core.h @@ -0,0 +1,33 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 12 + +//Setup file for the M5Stack Basic Core + +#define ILI9341_DRIVER + +#define M5STACK + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 14 // Chip select control pin +#define TFT_DC 27 // Data Command control pin +#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +#define TFT_BL 32 // LED back-light + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 27000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 5000000 \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup135_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup135_ST7789.h new file mode 100644 index 0000000..32f778a --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup135_ST7789.h @@ -0,0 +1,57 @@ +// ST7789 135 x 240 display with no chip select line +#define USER_SETUP_ID 135 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 135 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// DSTIKE stepup +//#define TFT_DC 23 +//#define TFT_RST 32 +//#define TFT_MOSI 26 +//#define TFT_SCLK 27 + +// Generic ESP32 setup +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS -1 // Not connected +//#define TFT_DC 2 +//#define TFT_RST 4 // Connect reset to ensure display initialises + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS -1 // Define as not used +#define TFT_DC PIN_D1 // Data Command control pin +//#define TFT_RST PIN_D4 // TFT reset pin (could connect to NodeMCU RST, see next line) +#define TFT_RST -1 // TFT reset pin connect to NodeMCU RST, must also then add 10K pull down to TFT SCK + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup136_LilyGo_TTV.h b/libraries/TFT_eSPI/User_Setups/Setup136_LilyGo_TTV.h new file mode 100644 index 0000000..d5281d5 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup136_LilyGo_TTV.h @@ -0,0 +1,35 @@ +// ST7789 135 x 240 display with no chip select line +#define USER_SETUP_ID 136 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 135 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +// Generic ESP32 setup +//#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 5 +#define TFT_DC 19 +#define TFT_RST 4 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h b/libraries/TFT_eSPI/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h new file mode 100644 index 0000000..725a9ce --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h @@ -0,0 +1,33 @@ +// LilyGo T-Display RP2040 (ST7789 135 x 240 display) +#define USER_SETUP_ID 137 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 135 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +// For LilyGo T-Display RP2040 +#define TFT_CS 5 // Chip Select pin +#define TFT_DC 1 // Data Command control pin +#define TFT_RST 0 // Reset pin +#define TFT_MOSI 3 +#define TFT_SCLK 2 +// Don't uncomment next line if you want PWM control of the backlight in the sketch +//#define TFT_BL 4 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h new file mode 100644 index 0000000..ca3bcfd --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h @@ -0,0 +1,32 @@ +// Pico Explorer Base by Pimoroni (RP2040) (ST7789 on SPI bus with 240x240 TFT) +#define USER_SETUP_ID 138 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +// For Pico Explorer Base (PR2040) +#define TFT_CS 17 // Chip Select pin +#define TFT_DC 16 // Data Command control pin +#define TFT_RST -1 // No Reset pin +#define TFT_MOSI 19 +#define TFT_SCLK 18 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +// #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h new file mode 100644 index 0000000..f8881ea --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 13 + +#define TFT_PARALLEL_8_BIT + + +#define ILI9481_DRIVER + + +// ESP32 pins used for UNO format board +#define TFT_CS 33 // Chip select control pin +#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +#define TFT_RST 32 // Reset pin + +#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +#define TFT_RD 2 + +#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 26 +#define TFT_D3 25 +#define TFT_D4 17 +#define TFT_D5 16 +#define TFT_D6 27 +#define TFT_D7 14 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup14_ILI9341_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup14_ILI9341_Parallel.h new file mode 100644 index 0000000..b8d134e --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup14_ILI9341_Parallel.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 14 + +#define TFT_PARALLEL_8_BIT + + +#define ILI9341_DRIVER + + +// ESP32 pins used for the parallel interface TFT +#define TFT_CS 33 // Chip select control pin +#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +#define TFT_RST 32 // Reset pin + +#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +#define TFT_RD 2 + +#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 26 +#define TFT_D3 25 +#define TFT_D4 17 +#define TFT_D5 16 +#define TFT_D6 27 +#define TFT_D7 14 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup15_HX8357D.h b/libraries/TFT_eSPI/User_Setups/Setup15_HX8357D.h new file mode 100644 index 0000000..bc2fc16 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup15_HX8357D.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 15 + +#define HX8357D_DRIVER + +// If green and blue swapped on display then change the RGB colour order +// Only uncomment ONE of the following options +#define TFT_RGB_ORDER TFT_RGB // Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Blue-Green-RED + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup16_ILI9488_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup16_ILI9488_Parallel.h new file mode 100644 index 0000000..f43f69f --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup16_ILI9488_Parallel.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 16 + +#define ESP32_PARALLEL + + +#define ILI9488_DRIVER + + +// ESP32 pins used +#define TFT_CS 33 // Chip select control pin +#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +#define TFT_RST 32 // Reset pin + +#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +#define TFT_RD 2 + +#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 26 +#define TFT_D3 25 +#define TFT_D4 17 +#define TFT_D5 16 +#define TFT_D6 27 +#define TFT_D7 14 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup17_ePaper.h b/libraries/TFT_eSPI/User_Setups/Setup17_ePaper.h new file mode 100644 index 0000000..5671a15 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup17_ePaper.h @@ -0,0 +1,16 @@ +#define EPD_DRIVER // ePaper driver + +#define TFT_MISO -1 +#define TFT_MOSI -1 +#define TFT_SCLK -1 +#define TFT_RST -1 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup18_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup18_ST7789.h new file mode 100644 index 0000000..ba292de --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup18_ST7789.h @@ -0,0 +1,45 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 18 + +#define ST7789_DRIVER + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + +// For ST7789 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + + +// My ST7789 display has TCT_CS wired permananently low so the pin is not defined here + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +//#define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup19_RM68140_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup19_RM68140_Parallel.h new file mode 100644 index 0000000..3728a7b --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup19_RM68140_Parallel.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 19 + +#define ESP32_PARALLEL + + +#define RM68140_DRIVER + + +// ESP32 pins used for UNO format board +#define TFT_CS 33 // Chip select control pin +#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +#define TFT_RST 32 // Reset pin + +#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +#define TFT_RD 2 + +#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 26 +#define TFT_D3 25 +#define TFT_D4 17 +#define TFT_D5 16 +#define TFT_D6 27 +#define TFT_D7 14 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup1_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup1_ILI9341.h new file mode 100644 index 0000000..1bc3c09 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup1_ILI9341.h @@ -0,0 +1,34 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 1 + +#define ILI9341_DRIVER + + +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup200_GC9A01.h b/libraries/TFT_eSPI/User_Setups/Setup200_GC9A01.h new file mode 100644 index 0000000..aa34c87 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup200_GC9A01.h @@ -0,0 +1,32 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 200 + +#define GC9A01_DRIVER + +// For ESP32 Dev board (only tested with GC9A01 display) +// The hardware SPI can be mapped to any pins + +#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on. +#define TFT_SCLK 14 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 27 // Data Command control pin +#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +#define TFT_BL 22 // LED back-light + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +//#define SPI_FREQUENCY 80000000 +#define SPI_FREQUENCY 27000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 5000000 \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup201_WT32_SC01.h b/libraries/TFT_eSPI/User_Setups/Setup201_WT32_SC01.h new file mode 100644 index 0000000..08f5953 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup201_WT32_SC01.h @@ -0,0 +1,49 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height +#define USER_SETUP_ID 201 + +// User defined setup +#define ST7796_DRIVER + +#define TFT_WIDTH 480 +#define TFT_HEIGHT 320 + +#define TFT_BACKLIGHT_ON HIGH + +#define USE_HSPI_PORT + +#define TFT_MISO 12 +#define TFT_MOSI 13 +#define TFT_SCLK 14 +#define TFT_CS 15 +#define TFT_DC 21 +#define TFT_RST 22 +#define TFT_BL 23 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +// SPI frequency for TFT writes +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h b/libraries/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h new file mode 100644 index 0000000..8cbc4bf --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h @@ -0,0 +1,52 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 202 + +#define SSD1351_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + + +#define SSD1351_1DOT5_INCH_128 // For 128 x 128 display + +// Wiring: +// +-------------+------------+-------------------------------------------------------------------+ +// | Display PCB | TFT_eSPI | Info | +// +-------------+------------+-------------------------------------------------------------------+ +// | GND | GND (0V) | Common | +// | VCC | 5V or 3.3V | Better to power with 5V if display PCB supports it | +// | DIN | TFT_MOSI | SPI data | +// | SCK | TFT_SCLK | SPI clock | +// | DC | TFT_DC | Distinguish between a command or its data | +// | RST | TFT_RST | Hardware reset, can connect to MCU RST pin as well | +// | CS | TFT_CS | Chip select, Set to -1 if for manually use with multiple displays | +// +-------------+------------+-------------------------------------------------------------------+ +#if defined(ESP32) + #define TFT_MOSI 23 + #define TFT_SCLK 18 + #define TFT_DC 2 + #define TFT_RST 4 + #define TFT_CS 15 +#elif defined (ARDUINO_ARCH_ESP8266) +//#define TFT_MOSI PIN_D5 // Can't change +//#define TFT_SCLK PIN_D7 // Can't change + #define TFT_DC PIN_D3 + #define TFT_RST PIN_D4 + #define TFT_CS PIN_D8 +#endif + + +#define LOAD_GLCD // Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts- 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 +//#define SPI_FREQUENCY 40000000 // Works after shielding the wires! diff --git a/libraries/TFT_eSPI/User_Setups/Setup203_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup203_ST7789.h new file mode 100644 index 0000000..b6acf0c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup203_ST7789.h @@ -0,0 +1,57 @@ +// ST7789 240 x 280 display with no chip select line +#define USER_SETUP_ID 203 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 280 + +#define CGRAM_OFFSET // Library will add offsets required + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// DSTIKE stepup +//#define TFT_DC 23 +//#define TFT_RST 32 +//#define TFT_MOSI 26 +//#define TFT_SCLK 27 + +// Generic ESP32 setup +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS -1 // Not connected +//#define TFT_DC 2 +//#define TFT_RST 4 // Connect reset to ensure display initialises + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS -1 // Define as not used +#define TFT_DC PIN_D1 // Data Command control pin +//#define TFT_RST PIN_D4 // TFT reset pin (could connect to NodeMCU RST, see next line) +#define TFT_RST -1 // TFT reset pin connect to NodeMCU RST, must also then add 10K pull down to TFT SCK + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup204_ESP32_TouchDown.h b/libraries/TFT_eSPI/User_Setups/Setup204_ESP32_TouchDown.h new file mode 100644 index 0000000..6d8569d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup204_ESP32_TouchDown.h @@ -0,0 +1,32 @@ +// User Setup for the ESP32 TouchDown V1.0 and V1.1 +// ILI9488 using 4-wire SPI and using an FT6206 touch controller + +#define USER_SETUP_ID 204 + +#define ILI9488_DRIVER + +#define TFT_BL 32 +#define TFT_BACKLIGHT_ON HIGH + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 +#define TFT_DC 2 +#define TFT_RST 4 + +#define TOUCH_CS 21 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup205_ESP32_TouchDown_S3.h b/libraries/TFT_eSPI/User_Setups/Setup205_ESP32_TouchDown_S3.h new file mode 100644 index 0000000..2d7a4a3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup205_ESP32_TouchDown_S3.h @@ -0,0 +1,36 @@ +// User Setup for the ESP32 TouchDown S3 V1.1 +// ILI9488 using 8-bit Parallel and using an FT6206 touch controller + +#define USER_SETUP_ID 205 + +#define ESP32_PARALLEL + +#define ILI9488_DRIVER + +#define TFT_DC 5 +#define TFT_RST 46 + +#define TFT_WR 7 +#define TFT_RD 6 + +#define TFT_D0 21 +#define TFT_D1 14 +#define TFT_D2 13 +#define TFT_D3 12 +#define TFT_D4 11 +#define TFT_D5 10 +#define TFT_D6 9 +#define TFT_D7 8 + +#define TFT_BL 48 +#define TFT_BACKLIGHT_ON HIGH + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h b/libraries/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h new file mode 100644 index 0000000..7a58eca --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h @@ -0,0 +1,47 @@ +// ST7789 using 8-bit Parallel + +#define USER_SETUP_ID 206 + +#define ST7789_DRIVER +#define INIT_SEQUENCE_3 // Using this initialisation sequence improves the display image + +#define CGRAM_OFFSET +#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + +#define TFT_PARALLEL_8_BIT + +#define TFT_WIDTH 170 +#define TFT_HEIGHT 320 + +#define TFT_CS 6 +#define TFT_DC 7 +#define TFT_RST 5 + +#define TFT_WR 8 +#define TFT_RD 9 + +#define TFT_D0 39 +#define TFT_D1 40 +#define TFT_D2 41 +#define TFT_D3 42 +#define TFT_D4 45 +#define TFT_D5 46 +#define TFT_D6 47 +#define TFT_D7 48 + +#define TFT_BL 38 +#define TFT_BACKLIGHT_ON HIGH + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h b/libraries/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h new file mode 100644 index 0000000..8606ef3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h @@ -0,0 +1,48 @@ +// ST7789 240 x 240 display with no chip select line +#define USER_SETUP_ID 207 + +#define ST7789_DRIVER // Configure all registers + +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define CGRAM_OFFSET +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// #define TFT_INVERSION_ON +#define TFT_INVERSION_OFF + +#define TFT_PARALLEL_8_BIT + +// The ESP32 and TFT the pins used for testing are: +#define TFT_CS 6 // Chip select control pin (library pulls permanently low +#define TFT_DC 7 // Data Command control pin +#define TFT_RST -1 // Reset pin, toggles on startup + +#define TFT_WR 8 // Write strobe control pin +#define TFT_RD -1 // Read strobe control pin + +#define TFT_D0 48 // Must use pins in the range 0-31 or alternatively 32-48 +#define TFT_D1 47 // so a single register write sets/clears all bits. +#define TFT_D2 39 // Pins can be randomly assigned, this does not affect +#define TFT_D3 40 // TFT screen update performance. +#define TFT_D4 41 +#define TFT_D5 42 +#define TFT_D6 45 +#define TFT_D7 46 + +#define TFT_BL 38 // LED back-light + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h b/libraries/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h new file mode 100644 index 0000000..1a28a82 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h @@ -0,0 +1,52 @@ +// Config for LilyGo T-Dongle S3 w ESP32 and ST7735 80 x 160 display +#define USER_SETUP_ID 209 + +#define ST7735_DRIVER // Configure all registers + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +//#define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// Generic ESP32 setup +#define TFT_MISO -1 +#define TFT_MOSI 3 +#define TFT_SCLK 5 +#define TFT_CS 4 +#define TFT_DC 2 +#define TFT_RST 1 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 27000000 +//#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup20_ILI9488.h b/libraries/TFT_eSPI/User_Setups/Setup20_ILI9488.h new file mode 100644 index 0000000..dd4badf --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup20_ILI9488.h @@ -0,0 +1,33 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 20 + +#define ILI9488_DRIVER + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 + + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h b/libraries/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h new file mode 100644 index 0000000..d3b815a --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h @@ -0,0 +1,43 @@ +// ST7789 170 x 320 display with no chip select line +#define USER_SETUP_ID 210 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 170 +#define TFT_HEIGHT 320 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF +#define TFT_BACKLIGHT_ON 1 + +#define TFT_BL 15 // LED back-light +#define TFT_MISO -1 // Not connected +#define TFT_MOSI 11 +#define TFT_SCLK 12 +#define TFT_CS 10 +#define TFT_DC 13 +#define TFT_RST 9 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h b/libraries/TFT_eSPI/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h new file mode 100644 index 0000000..3f41df0 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h @@ -0,0 +1,45 @@ +// GC9A01 128 x 128 display with no chip select line +#define USER_SETUP_ID 211 + +#define GC9A01_DRIVER // Configure all registers + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// #define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF +#define TFT_BACKLIGHT_ON 0 +#define CGRAM_OFFSET + + +#define TFT_BL 10 // LED back-light +#define TFT_MISO -1 // Not connected +#define TFT_MOSI 2 +#define TFT_SCLK 3 +#define TFT_CS 5 +#define TFT_DC 6 +#define TFT_RST 1 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup212_LilyGo_T_PicoPro.h b/libraries/TFT_eSPI/User_Setups/Setup212_LilyGo_T_PicoPro.h new file mode 100644 index 0000000..6be1f3b --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup212_LilyGo_T_PicoPro.h @@ -0,0 +1,45 @@ +// ST7796 222 x 480 display with no chip select line +#define USER_SETUP_ID 212 + +#define ST7796_DRIVER // Configure all registers + +#define TFT_WIDTH 222 +#define TFT_HEIGHT 480 + +#define CGRAM_OFFSET // Library will add offsets required + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON + +#define TFT_MISO 4 +#define TFT_MOSI 7 +#define TFT_SCLK 6 +#define TFT_CS 8 +#define TFT_DC 9 +#define TFT_RST 16 +#define TFT_BACKLIGHT_ON 1 +#define TFT_BL 10 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup213_LilyGo_T_Beam_Shield.h b/libraries/TFT_eSPI/User_Setups/Setup213_LilyGo_T_Beam_Shield.h new file mode 100644 index 0000000..d9ebc87 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup213_LilyGo_T_Beam_Shield.h @@ -0,0 +1,36 @@ +// ST7796 222 x 480 display with no chip select line +#define USER_SETUP_ID 213 + +#define ST7796_DRIVER // Configure all registers + +#define TFT_WIDTH 222 +#define TFT_HEIGHT 480 + +#define CGRAM_OFFSET // Library will add offsets required + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON + +#define TFT_MISO -1 +#define TFT_MOSI 14 +#define TFT_SCLK 15 +#define TFT_CS 25 +#define TFT_DC 13 +#define TFT_RST 2 +#define TFT_BL 4 +#define TFT_BACKLIGHT_ON HIGH + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT +#define SPI_FREQUENCY 40000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup21_ILI9488.h b/libraries/TFT_eSPI/User_Setups/Setup21_ILI9488.h new file mode 100644 index 0000000..3d2018b --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup21_ILI9488.h @@ -0,0 +1,35 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 21 + +#define ILI9488_DRIVER + +//#define TFT_INVERSION_OFF + +#define TFT_MISO 19 // (leave TFT SDO disconnected if other SPI devices share MISO) +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 16000000 + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4.h b/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4.h new file mode 100644 index 0000000..760b50d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4.h @@ -0,0 +1,36 @@ +// Setup for the TTGO T4 v1.1 ("Bitcoin Tracker") ESP32 board with 2.2" ILI9341 display +#define USER_SETUP_ID 22 + +// See SetupX_Template.h for all options available + +#define ILI9341_DRIVER + +//#define TFT_BACKLIGHT_ON HIGH // LED control for TTGO T4 v1.3 only +//#define TFT_BL 4 + +#define TFT_MISO 12 +#define TFT_MOSI 23 +#define TFT_SCLK 18 + +#define TFT_CS 27 +#define TFT_DC 26 // pin 32 for TTGO T4 v1.3 +#define TFT_RST 5 + +#define TOUCH_CS -1 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +//#define SPI_FREQUENCY 27000000 + #define SPI_FREQUENCY 40000000 // Maximum for ILI9341 + +#define USE_HSPI_PORT + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V diff --git a/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4_v1.3.h b/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4_v1.3.h new file mode 100644 index 0000000..6658d74 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup22_TTGO_T4_v1.3.h @@ -0,0 +1,34 @@ +// Setup for the TTGO T4 v1.3 ESP32 board with 2.2" ILI9341 display +#define USER_SETUP_ID 99922 + +// See SetupX_Template.h for all options available + +#define ILI9341_DRIVER + +#define TFT_BACKLIGHT_ON HIGH +#define TFT_BL 4 + +#define TFT_MISO 12 +#define TFT_MOSI 23 +#define TFT_SCLK 18 + +#define TFT_CS 27 +#define TFT_DC 32 // pin 26 for TTGO T4 v1.3 +#define TFT_RST 5 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +//#define SPI_FREQUENCY 27000000 + #define SPI_FREQUENCY 40000000 // Maximum for ILI9341 + +#define USE_HSPI_PORT + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V diff --git a/libraries/TFT_eSPI/User_Setups/Setup23_TTGO_TM.h b/libraries/TFT_eSPI/User_Setups/Setup23_TTGO_TM.h new file mode 100644 index 0000000..9cf193d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup23_TTGO_TM.h @@ -0,0 +1,45 @@ +// Setup for the TTGO TM (Music) ESP32 board with 2.4" ST7789V display +#define USER_SETUP_ID 23 + +// See SetupX_Template.h for all options available + +#define ST7789_DRIVER + +#define TFT_SDA_READ // Read from display, it only provides an SDA pin + +// Generic Pico +#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used +#define TFT_MISO 12 // Must be defined even though it is not used +#define TFT_MOSI 11 // Connected to display SDA line +#define TFT_SCLK 10 +#define TFT_CS 9 // Not connected +#define TFT_DC 8 +#define TFT_RST 15 // Connect reset to ensure display initialises +#define TFT_BL 13 // LED back-light + #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +#define TOUCH_CS 16 + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// Black and white swap option +//#define TFT_INVERSION_ON +#define TFT_INVERSION_ON + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 // This display also seems to work reliably at 80MHz +//#define SPI_FREQUENCY 80000000 + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V diff --git a/libraries/TFT_eSPI/User_Setups/Setup24_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup24_ST7789.h new file mode 100644 index 0000000..2acc6c3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup24_ST7789.h @@ -0,0 +1,55 @@ +// ST7789 240 x 240 display with no chip select line +#define USER_SETUP_ID 24 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// DSTIKE stepup +//#define TFT_DC 23 +//#define TFT_RST 32 +//#define TFT_MOSI 26 +//#define TFT_SCLK 27 + +// Generic ESP32 setup +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS -1 // Not connected +//#define TFT_DC 2 +//#define TFT_RST 4 // Connect reset to ensure display initialises + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS -1 // Define as not used +#define TFT_DC PIN_D1 // Data Command control pin +#define TFT_RST PIN_D4 // TFT reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // TFT reset pin connect to NodeMCU RST, must also then add 10K pull down to TFT SCK + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup250_ESP32_S3_Box_Lite.h b/libraries/TFT_eSPI/User_Setups/Setup250_ESP32_S3_Box_Lite.h new file mode 100644 index 0000000..8a211d1 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup250_ESP32_S3_Box_Lite.h @@ -0,0 +1,32 @@ +// Display configuration for ST7789-based ESP32-S3-Box-Lite + +#define USER_SETUP_ID 250 +#define USER_SETUP_INFO "ESP32-S3-BOX-LITE" + +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define TFT_BL 45 +#define TFT_BACKLIGHT_ON LOW + +#define TFT_CS 5 +#define TFT_DC 4 +#define TFT_RST 48 + +#define TFT_MOSI 6 +#define TFT_SCLK 7 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup251_ESP32_S3_Box.h b/libraries/TFT_eSPI/User_Setups/Setup251_ESP32_S3_Box.h new file mode 100644 index 0000000..5458aaf --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup251_ESP32_S3_Box.h @@ -0,0 +1,28 @@ +// Display configuration for ILI9342-based ESP32-S3-Box + +#define USER_SETUP_ID 251 +#define USER_SETUP_INFO "ESP32-S3-BOX" + +#define M5STACK // S3-Box uses the same ILI9342 display, don't remove + +#define ILI9341_DRIVER + +#define TFT_MISO 0 +#define TFT_MOSI 6 +#define TFT_SCLK 7 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 4 // Data Command control pin +#define TFT_RST 48 // Reset pin (could connect to Arduino RESET pin) +#define TFT_BL 45 // LED back-light + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup25_TTGO_T_Display.h b/libraries/TFT_eSPI/User_Setups/Setup25_TTGO_T_Display.h new file mode 100644 index 0000000..455c851 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup25_TTGO_T_Display.h @@ -0,0 +1,40 @@ +// Setup for the TTGO T Display +#define USER_SETUP_ID 25 + +// See SetupX_Template.h for all options available + +#define ST7789_DRIVER +#define TFT_SDA_READ // Display has a bidirectional SDA pin + +#define TFT_WIDTH 135 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +//#define TFT_MISO -1 + +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 5 +#define TFT_DC 16 +#define TFT_RST 23 + +#define TFT_BL 4 // Display backlight control pin + +#define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +//#define SPI_FREQUENCY 27000000 + #define SPI_FREQUENCY 40000000 + + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V diff --git a/libraries/TFT_eSPI/User_Setups/Setup26_TTGO_T_Wristband.h b/libraries/TFT_eSPI/User_Setups/Setup26_TTGO_T_Wristband.h new file mode 100644 index 0000000..3cda1a5 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup26_TTGO_T_Wristband.h @@ -0,0 +1,37 @@ +#define USER_SETUP_ID 26 + +#define ST7735_DRIVER + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + + +#define TFT_RST 26 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V +#define TFT_MISO -1 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 5 +#define TFT_DC 23 +#define TFT_BL 27 // Dispaly backlight control pin + +#define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options + +#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 + +// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS +// #define SPI_FREQUENCY 80000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup27_RPi_ST7796_ESP32.h b/libraries/TFT_eSPI/User_Setups/Setup27_RPi_ST7796_ESP32.h new file mode 100644 index 0000000..ed053a4 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup27_RPi_ST7796_ESP32.h @@ -0,0 +1,102 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! + +#define USER_SETUP_ID 27 + +// ################################################################################## +// +// Section 0. Call up the right driver file and any options for it +// +// ################################################################################## + +// Display type - only define if RPi display +#define RPI_DISPLAY_TYPE + +// Only define one driver +#define ST7796_DRIVER + +// ################################################################################## +// +// Section 1. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// >>>>> EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP <<<<< + +// The ESP32 hardware SPI can be mapped to any pins, these are the recommended default + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen + +// ################################################################################## +// +// Section 2. Not used for ESP32 +// +// ################################################################################## + + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + +// ################################################################################## +// +// Section 4. Not used +// +// ################################################################################## + + +// ################################################################################## +// +// Section 5. Other options +// +// ################################################################################## + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an RPi ST7796 MH4.0 display 80MHz is OK for ESP32, 40MHz maximum for ESP8266 + +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 40000000 + #define SPI_FREQUENCY 80000000 + +// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default. +// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam) +// then uncomment the following line: +//#define USE_HSPI_PORT + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: + #define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup28_RPi_ST7796_ESP8266.h b/libraries/TFT_eSPI/User_Setups/Setup28_RPi_ST7796_ESP8266.h new file mode 100644 index 0000000..e4ba57c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup28_RPi_ST7796_ESP8266.h @@ -0,0 +1,106 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +#define USER_SETUP_ID 28 + +// ################################################################################## +// +// Section 0. Call up the right driver file and any options for it +// +// ################################################################################## + +// Display type - only define if RPi display +#define RPI_DISPLAY_TYPE + +// Only define one driver +#define ST7796_DRIVER + +// ################################################################################## +// +// Section 1. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// >>>> EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP <<<< + +// These are the recommended default + +// Avoid PIN_D8 as this will prevent upload if display pulls the pin high at boot + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D2 // Chip select control pin D2 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + +#define TOUCH_CS PIN_D1 // Chip select pin (T_CS) of touch screen + +// ################################################################################## +// +// Section 2. Not used for ESP32 +// +// ################################################################################## + + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + +// ################################################################################## +// +// Section 4. Not used +// +// ################################################################################## + + +// ################################################################################## +// +// Section 5. Other options +// +// ################################################################################## + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an RPi ST7796 MH4.0 display 80MHz is OK for ESP32, 40MHz maximum for ESP8266 + +// #define SPI_FREQUENCY 20000000 + #define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// Comment out the following #define if "SPI Transactions" do not need to be +// supported. When commented out the code size will be smaller and sketches will +// run slightly faster, so leave it commented out unless you need it! + +// Transaction support is needed to work with SD library but not needed with TFT_SdFat +// Transaction support is required if other SPI devices are connected. + +// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex) +// so changing it here has no effect + +#define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup29_ILI9341_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup29_ILI9341_STM32.h new file mode 100644 index 0000000..61043a9 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup29_ILI9341_STM32.h @@ -0,0 +1,96 @@ + + /////////////////////////////////////////////////// + // Setup for STM32 Nucleo and ILI9341 display // + /////////////////////////////////////////////////// +#define USER_SETUP_ID 29 + +// Last update by Bodmer: 28/11/19 + +// STM32 optimised functions are not yet compatible with STM32H743 processor. +// The STM32H743 does work with the slower generic processor drivers +// +// REMINDER - Nucleo-F743ZI and Nucleo-F743ZI2 have different pin port allocations +// and require appropriate selection in IDE. ^---- Note the extra 2 in part number! + + +// Define STM32 to invoke STM32 optimised driver +#define STM32 + +// Define the TFT display driver +#define ILI9341_DRIVER +//#define ILI9481_DRIVER + +// MOSI and SCK do not need to be defined, connect: +// - Arduino SCK to TFT SCK +// - Arduino MOSI to TFT SDI(may be marked SDA or MOSI) +// Typical Arduino SPI port 1 pins are (SCK=D13, MISO=D12, MOSI=D11) this is port pins PA5, PA6 and PA7 on Nucleo-F767ZI +// SPI port 2 pins are (SCK=D18, MISO=A7, MOSI=D17) this is port pins PB13, PC2 and PB15 on Nucleo-F767ZI + +/* +#define TFT_SPI_PORT 1 // SPI 1 maximum clock rate is 55MHz +#define TFT_MOSI PA7 +#define TFT_MISO PA6 +#define TFT_SCLK PA5 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI D17 +#define TFT_MISO A7 +#define TFT_SCLK D18 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PC2 +#define TFT_SCLK PB13 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PB14 +#define TFT_SCLK PB13 +//*/ + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +// Alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// Chip select for XPT2046 touch controller +#define TOUCH_CS D4 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + + +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. + +#define SPI_FREQUENCY 27000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup29b_ILI9341_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup29b_ILI9341_STM32.h new file mode 100644 index 0000000..fac3846 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup29b_ILI9341_STM32.h @@ -0,0 +1,141 @@ + +#define STM32 + +#define NUCLEO_64_TFT +//#define TFT_INVERSION_OFF + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR + +#define TFT_SPI_PORT 1 // SPI 1 maximum clock rate is 55MHz +#define TFT_MOSI D11 +#define TFT_MISO D12 +#define TFT_SCLK D13 + + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + +#define SPI_FREQUENCY 55000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS + +/* + /////////////////////////////////////////////////// + // Setup for STM32 Nucleo and ILI9341 display // + /////////////////////////////////////////////////// +#define USER_SETUP_ID 29 + +// Last update by Bodmer: 28/11/19 + +// STM32 optimised functions are not yet compatible with STM32H743 processor. +// The STM32H743 does work with the slower generic processor drivers +// +// REMINDER - Nucleo-F743ZI and Nucleo-F743ZI2 have different pin port allocations +// and require appropriate selection in IDE. ^---- Note the extra 2 in part number! + + +// Define STM32 to invoke STM32 optimised driver +#define STM32 + +// Define the TFT display driver +//#define ILI9341_DRIVER +//#define ILI9481_DRIVER +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR +// MOSI and SCK do not need to be defined, connect: +// - Arduino SCK to TFT SCK +// - Arduino MOSI to TFT SDI(may be marked SDA or MOSI) +// Typical Arduino SPI port 1 pins are (SCK=D13, MISO=D12, MOSI=D11) this is port pins PA5, PA6 and PA7 on Nucleo-F767ZI +// SPI port 2 pins are (SCK=D18, MISO=A7, MOSI=D17) this is port pins PB13, PC2 and PB15 on Nucleo-F767ZI + +//* +#define TFT_SPI_PORT 1 // SPI 1 maximum clock rate is 55MHz +#define TFT_MOSI PA7 +#define TFT_MISO PA6 +#define TFT_SCLK PA5 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI D17 +#define TFT_MISO A7 +#define TFT_SCLK D18 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PC2 +#define TFT_SCLK PB13 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PB14 +#define TFT_SCLK PB13 +//*/ + +/* +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +// Alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// Chip select for XPT2046 touch controller +#define TOUCH_CS D4 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + + +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. + +#define SPI_FREQUENCY 27000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS +*/ \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup2_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup2_ST7735.h new file mode 100644 index 0000000..aab711b --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup2_ST7735.h @@ -0,0 +1,45 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 2 + +#define ST7735_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 160 + + +#define ST7735_REDTAB + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup301_BW16_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup301_BW16_ST7735.h new file mode 100644 index 0000000..75ba3fb --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup301_BW16_ST7735.h @@ -0,0 +1,47 @@ +#include "itoa.h" +#include + + +// Setup for BW16 and ST7735 80 x 160 TFT +#define USER_SETUP_ID 301 +// See SetupX_Template.h for all options available + +#define ST7735_DRIVER + + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + + +#define ST7735_GREENTAB160x80 + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// Pin Mappings for BW16 board +#define TFT_MISO 11 +#define TFT_MOSI 12 +#define TFT_SCLK 10 +#define TFT_CS 9 // Chip select control pin +#define TFT_DC 8 // Data Command control pin +#define TFT_RST 6 // Reset pin (could connect to RST pin) + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 +//#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 + diff --git a/libraries/TFT_eSPI/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h b/libraries/TFT_eSPI/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h new file mode 100644 index 0000000..5e3127f --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h @@ -0,0 +1,33 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 302 + +#define GC9A01_DRIVER + +#define TFT_MISO 12 +#define TFT_MOSI 11 +#define TFT_SCLK 10 +#define TFT_CS 9 // Chip select control pin +#define TFT_DC 8 // Data Command control pin +#define TFT_RST 14 // Reset pin (could connect to RST pin) +#define TFT_BL 2 +#define TFT_BACKLIGHT_ON HIGH + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup30_ILI9341_Parallel_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup30_ILI9341_Parallel_STM32.h new file mode 100644 index 0000000..5b1b26d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup30_ILI9341_Parallel_STM32.h @@ -0,0 +1,53 @@ + //////////////////////////////////////////////////// + // Setup for Nucleo 64 or 144 and ILI9341 display // + //////////////////////////////////////////////////// + +#define USER_SETUP_ID 30 + +// See SetupX_Template.h for all options available + +// Define STM32 to invoke optimised processor support +#define STM32 + +// Defining the board allows the library to optimise the performance +// for UNO compatible "MCUfriend" style shields +#define NUCLEO_64_TFT +//#define NUCLEO_144_TFT + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +#define TFT_PARALLEL_8_BIT + +// Define the display driver chip type +#define ILI9341_DRIVER +//#define ILI9481_DRIVER + +// Define the Nucleo 64/144 pins used for the parallel interface TFT +// The pins can be changed here but these are the ones used by the +// common "MCUfriend" shields +#define TFT_CS A3 // Chip select control pin +#define TFT_DC A2 // Data Command control pin +#define TFT_RST A4 // Reset pin + +#define TFT_WR A1 // Write strobe control pin +#define TFT_RD A0 // Read pin + +#define TFT_D0 D8 // 8-bit parallel bus to TFT +#define TFT_D1 D9 +#define TFT_D2 D2 +#define TFT_D3 D3 +#define TFT_D4 D4 +#define TFT_D5 D5 +#define TFT_D6 D6 +#define TFT_D7 D7 + +// Fonts to be available +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup31_ST7796_Parallel_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup31_ST7796_Parallel_STM32.h new file mode 100644 index 0000000..0e26eaa --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup31_ST7796_Parallel_STM32.h @@ -0,0 +1,52 @@ + //////////////////////////////////////////////////// + // Setup for Nucleo 64 or 144 and ILI9341 display // + //////////////////////////////////////////////////// +#define USER_SETUP_ID 31 + +// See SetupX_Template.h for all options available + +// Define STM32 to invoke optimised processor support +#define STM32 + +// Defining the board allows the library to optimise the performance +// for UNO compatible "MCUfriend" style shields +#define NUCLEO_64_TFT +//#define NUCLEO_144_TFT + +// Tell the library to use 8-bit parallel mode(otherwise SPI is assumed) +#define TFT_PARALLEL_8_BIT + +// Define the display driver chip type +#define ST7796_DRIVER +//#define ILI9481_DRIVER + +// Define the Nucleo 64/144 pins used for the parallel interface TFT +// The pins can be changed here but these are the ones used by the +// common "MCUfriend" shields +#define TFT_CS A3 // Chip select control pin +#define TFT_DC A2 // Data Command control pin +#define TFT_RST A4 // Reset pin + +#define TFT_WR A1 // Write strobe control pin +#define TFT_RD A0 // Read pin + +#define TFT_D0 D8 // 8-bit parallel bus to TFT +#define TFT_D1 D9 +#define TFT_D2 D2 +#define TFT_D3 D3 +#define TFT_D4 D4 +#define TFT_D5 D5 +#define TFT_D6 D6 +#define TFT_D7 D7 + +// Fonts to be available +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup32_ILI9341_STM32F103.h b/libraries/TFT_eSPI/User_Setups/Setup32_ILI9341_STM32F103.h new file mode 100644 index 0000000..38a662a --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup32_ILI9341_STM32F103.h @@ -0,0 +1,61 @@ + ////////////////////////////////////////////////////////////// + // Setup for STM32F103 (e.g. Blue Pill) and ILI9341 display // + ////////////////////////////////////////////////////////////// +#define USER_SETUP_ID 32 + +// Last update by Bodmer: 14/1/20 + +// Define STM32 to invoke STM32 optimised driver +#define STM32 + +// Define the TFT display driver +#define ILI9341_DRIVER +//#define ILI9481_DRIVER + +// MOSI and SCK do not need to be defined, connect: +// - Arduino SCK (Blue Pill pin A5) to TFT SCK +// - Arduino MOSI (Blue Pill pin A7) to TFT SDI (may be marked SDA or MOSI) +// - Optional to read TFT: Arduino MISO (Blue Pill pin A6) to TFT SDO (may be marked MISO or may not exist on TFT) +// Note: not all TFT's support reads + +// reminder: Blue Pill SPI pins are SCK=A5, MISO = A6, MOSI=A7 + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS A0 // Chip select control pin to TFT CS +#define TFT_DC A1 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST A2 // Reset pin to TFT RST (or RESET) + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (due to variations in display design) + +#define TOUCH_CS A4 // Connect to T_CS (Touch controller chip select) if XPT2046 is connected to SPI bus + // You may need to wire the touch controller to the processor in addition to the TFT + // For example on some boards the pins are labelled: + // T_IRQ - no connection to processor + // T_DO - connect to processor MISO + // T_DIN - connect to processor MOSI + // T_CS - connect to processor pin specified by TOUCH_CS above + // T_SCK - connect to processor SCK + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + +// Assuming the processor clock is 72MHz: +#define SPI_FREQUENCY 36000000 // 36MHz SPI clock +//#define SPI_FREQUENCY 18000000 // 18MHz SPI clock + +#define SPI_READ_FREQUENCY 12000000 // Reads need a slower SPI clock + +#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow + +// This has no effect, transactions are automatically enabled for STM32 +//#define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup33_RPi_ILI9486_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup33_RPi_ILI9486_STM32.h new file mode 100644 index 0000000..5a1a8c8 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup33_RPi_ILI9486_STM32.h @@ -0,0 +1,67 @@ + /////////////////////////////////////////////////// + // Setup for STM32 Nucleo and ILI9341 display // + /////////////////////////////////////////////////// +#define USER_SETUP_ID 33 + +// Last update by Bodmer: 28/11/19 + +// STM32 optimised functions are not yet compatible with STM32H743 processor. +// The STM32H743 does work with the slower generic processor drivers +// +// REMINDER - Nucleo-F743ZI and Nucleo-F743ZI2 have different pin port allocations +// and require appropriate selection in IDE. ^---- Note the extra 2 in part number! + + +// Define STM32 to invoke STM32 optimised driver (optimised fns only tested on STM32F767 so far) +// so you may need to comment this out +#define STM32 + +// Define the TFT display driver +#define RPI_DISPLAY_TYPE +#define ILI9486_DRIVER + +// MOSI and SCK do not need to be defined, connect: +// - Arduino SCK to TFT SCK +// - Arduino MOSI to TFT SDI(may be marked SDA or MOSI) +// Standard Arduino SPI pins are(SCK=D13, MOSI=D11) this is port pins PA5 and PA7 on Nucleo-F767ZI + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +// Alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// Chip select for XPT2046 touch controller +//#define TOUCH_CS D4 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + + +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. + +#define SPI_FREQUENCY 20000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +//#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +//#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup34_ILI9481_Parallel_STM32.h b/libraries/TFT_eSPI/User_Setups/Setup34_ILI9481_Parallel_STM32.h new file mode 100644 index 0000000..467a001 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup34_ILI9481_Parallel_STM32.h @@ -0,0 +1,51 @@ + //////////////////////////////////////////////////// + // Setup for Nucleo 64 or 144 and ILI9341 display // + //////////////////////////////////////////////////// +#define USER_SETUP_ID 34 +// See SetupX_Template.h for all options available + +// Define STM32 to invoke optimised processor support +#define STM32 + +// Defining the board allows the library to optimise the performance +// for UNO compatible "MCUfriend" style shields +#define NUCLEO_64_TFT +//#define NUCLEO_144_TFT + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +#define TFT_PARALLEL_8_BIT + +// Define the display driver chip type +//#define ILI9341_DRIVER +#define ILI9481_DRIVER + +// Define the Nucleo 64/144 pins used for the parallel interface TFT +// The pins can be changed here but these are the ones used by the +// common "MCUfriend" shields +#define TFT_CS A3 // Chip select control pin +#define TFT_DC A2 // Data Command control pin +#define TFT_RST A4 // Reset pin + +#define TFT_WR A1 // Write strobe control pin +#define TFT_RD A0 // Read pin + +#define TFT_D0 D8 // 8-bit parallel bus to TFT +#define TFT_D1 D9 +#define TFT_D2 D2 +#define TFT_D3 D3 +#define TFT_D4 D4 +#define TFT_D5 D5 +#define TFT_D6 D6 +#define TFT_D7 D7 + +// Fonts to be available +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h b/libraries/TFT_eSPI/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h new file mode 100644 index 0000000..894948c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h @@ -0,0 +1,59 @@ + ////////////////////////////////////////////////////////////// + // Setup for STM32 and ILI9341 display // + ////////////////////////////////////////////////////////////// +#define USER_SETUP_ID 35 +// Last update by Bodmer: 28/3/20 + +// Define STM32 to invoke STM32 optimised driver +#define STM32 + +// Define if Port A (B, C or D) pins 0-7 are used for data bus bits 0-7 +// this will improve rendering performance by a factor of ~8x +#define STM_PORTA_DATA_BUS +//#define STM_PORTB_DATA_BUS // Pins below must re re-allocated to use this option +//#define STM_PORTC_DATA_BUS // Pins below must re re-allocated to use this option +//#define STM_PORTD_DATA_BUS // Pins below must re re-allocated to use this option + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +#define TFT_PARALLEL_8_BIT + +// Define ONE of the the TFT display drivers +#define ILI9341_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER +//#define ST7796_DRIVER + +#define TFT_CS PB7 // Chip select control pin +#define TFT_DC PB8 // Data Command control pin +#define TFT_RST PB0 // Reset pin +#define TFT_WR PB9 // Write strobe control pin +#define TFT_RD PB1 // Read pin + +#define TFT_D0 PA0 // 8-bit Port A parallel bus to TFT +#define TFT_D1 PA1 +#define TFT_D2 PA2 +#define TFT_D3 PA3 +#define TFT_D4 PA4 +#define TFT_D5 PA5 +#define TFT_D6 PA6 +#define TFT_D7 PA7 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + +// Assuming the processor clock is 72MHz: +#define SPI_FREQUENCY 36000000 // 36MHz SPI clock +//#define SPI_FREQUENCY 18000000 // 18MHz SPI clock + +#define SPI_READ_FREQUENCY 12000000 // Reads need a slower SPI clock + +#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow diff --git a/libraries/TFT_eSPI/User_Setups/Setup36_RPi_touch_ST7796.h b/libraries/TFT_eSPI/User_Setups/Setup36_RPi_touch_ST7796.h new file mode 100644 index 0000000..865a347 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup36_RPi_touch_ST7796.h @@ -0,0 +1,32 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 36 + +#define RPI_DISPLAY_TYPE +#define ST7796_DRIVER + + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup3_ILI9163.h b/libraries/TFT_eSPI/User_Setups/Setup3_ILI9163.h new file mode 100644 index 0000000..d228acf --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup3_ILI9163.h @@ -0,0 +1,37 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 3 + +#define ILI9163_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 160 + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup42_ILI9341_ESP32.h b/libraries/TFT_eSPI/User_Setups/Setup42_ILI9341_ESP32.h new file mode 100644 index 0000000..3e5379c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup42_ILI9341_ESP32.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 42 + +#define ILI9341_DRIVER + +#define TFT_MISO 19 // (leave TFT SDO disconnected if other SPI devices share MISO) +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) + +// Optional touch screen chip select +//#define TOUCH_CS 5 // Chip select pin (T_CS) of touch screen + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +// TFT SPI clock frequency +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 16000000 + +// SPI clock frequency for touch controller +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup43_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup43_ST7735.h new file mode 100644 index 0000000..4b8b699 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup43_ST7735.h @@ -0,0 +1,52 @@ +// Setup for ESP32 and ST7735 80 x 160 TFT +#define USER_SETUP_ID 43 +// See SetupX_Template.h for all options available + +#define ST7735_DRIVER + + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + + +#define ST7735_GREENTAB160x80 + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#ifdef ESP32 +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST +#else +// Display GND to NodeMCU pin GND (0V) +// Display VCC to NodeMCU 5V or 3.3V +// Display SCK to NodeMCU pin D5 +// Display SDI/MOSI to NodeMCU pin D7 +// Display BLK to NodeMCU pin VIN +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +#endif + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +//#define SPI_FREQUENCY 20000000 + #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 diff --git a/libraries/TFT_eSPI/User_Setups/Setup44_TTGO_CameraPlus.h b/libraries/TFT_eSPI/User_Setups/Setup44_TTGO_CameraPlus.h new file mode 100644 index 0000000..0786918 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup44_TTGO_CameraPlus.h @@ -0,0 +1,32 @@ +#define USER_SETUP_ID 44 + +#define ST7789_DRIVER + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define TFT_MOSI 19 +#define TFT_MISO 22 +#define TFT_SCLK 21 +#define TFT_CS 12 +#define TFT_DC 15 +#define TFT_RST -1 +#define TFT_BL 2 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 +#define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup45_TTGO_T_Watch.h b/libraries/TFT_eSPI/User_Setups/Setup45_TTGO_T_Watch.h new file mode 100644 index 0000000..9a90105 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup45_TTGO_T_Watch.h @@ -0,0 +1,32 @@ +#define USER_SETUP_ID 45 + +#define ST7789_DRIVER + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define TFT_MISO -1 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 5 +#define TFT_DC 27 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 +#define SPI_FREQUENCY 40000000 +//#define SPI_FREQUENCY 80000000 + + + diff --git a/libraries/TFT_eSPI/User_Setups/Setup46_GC9A01_ESP32.h b/libraries/TFT_eSPI/User_Setups/Setup46_GC9A01_ESP32.h new file mode 100644 index 0000000..3494f6f --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup46_GC9A01_ESP32.h @@ -0,0 +1,29 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 46 + +#define GC9A01_DRIVER + +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 15 // Chip select control pin +#define TFT_DC 2 // Data Command control pin +#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup47_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup47_ST7735.h new file mode 100644 index 0000000..d2e996d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup47_ST7735.h @@ -0,0 +1,52 @@ +// Config for two ST7735 128 x 128 displays for Animated_Eyes example +#define USER_SETUP_ID 47 + +#define ST7735_DRIVER // Configure all registers + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 + #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +//#define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// Generic ESP32 setup +#define TFT_MISO 19 +#define TFT_MOSI 23 +#define TFT_SCLK 18 +//#define TFT_CS 21 // Not defined here, chip select is managed by sketch +#define TFT_DC 2 +#define TFT_RST 4 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 27000000 +//#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup4_S6D02A1.h b/libraries/TFT_eSPI/User_Setups/Setup4_S6D02A1.h new file mode 100644 index 0000000..a8ce0d3 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup4_S6D02A1.h @@ -0,0 +1,33 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 4 + +#define S6D02A1_DRIVER + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup50_SSD1963_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup50_SSD1963_Parallel.h new file mode 100644 index 0000000..d7265d7 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup50_SSD1963_Parallel.h @@ -0,0 +1,95 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +#define USER_SETUP_ID 50 +// ################################################################################## +// +// Section 0. Call up the right driver file and any options for it +// +// ################################################################################## + +// Use ESP32 Parallel interface +#define TFT_PARALLEL_8_BIT + +// Only define one driver, the other ones must be commented out +//#define SSD1963_480_DRIVER // 272 x 480 display +//#define SSD1963_800_DRIVER // 480 x 800 display +//#define SSD1963_800ALT_DRIVER // Alternative 480 x 800 display +#define SSD1963_800BD_DRIVER // 480 x 800 display sourced from https://www.buydisplay.com/7-tft-screen-touch-lcd-display-module-w-ssd1963-controller-board-mcu + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// ################################################################################## +// +// Section 1. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// ESP32 pins used +#define TFT_CS 33 // Chip select control pin +#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +#define TFT_RST 32 // Reset pin + +#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +#define TFT_RD 2 + +#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 26 +#define TFT_D3 25 +#define TFT_D4 17 +#define TFT_D5 16 +#define TFT_D6 27 +#define TFT_D7 14 + +// ################################################################################## +// +// Section 2. Define the way the DC and/or CS lines are driven (ESP8266 only) +// +// ################################################################################## + + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + +// ################################################################################## +// +// Section 4. Not used +// +// ################################################################################## + + +// ################################################################################## +// +// Section 5. Other options +// +// ################################################################################## + + diff --git a/libraries/TFT_eSPI/User_Setups/Setup51_LilyPi_ILI9481.h b/libraries/TFT_eSPI/User_Setups/Setup51_LilyPi_ILI9481.h new file mode 100644 index 0000000..444b671 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup51_LilyPi_ILI9481.h @@ -0,0 +1,27 @@ +#define USER_SETUP_ID 51 + +#define ILI9481_DRIVER + +#define TFT_BL 12 // LED back-light control pin +#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +#define TFT_MISO 23 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 27 // Data Command control pin +#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 26666666 +#define SPI_READ_FREQUENCY 20000000 \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup52_LilyPi_ST7796.h b/libraries/TFT_eSPI/User_Setups/Setup52_LilyPi_ST7796.h new file mode 100644 index 0000000..b6bc8eb --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup52_LilyPi_ST7796.h @@ -0,0 +1,28 @@ +#define USER_SETUP_ID 52 + +#define ST7796_DRIVER + +#define TFT_BL 12 // LED back-light control pin +#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +#define ESP32_DMA +#define TFT_MISO 23 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 27 // Data Command control pin +#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 12000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup5_RPi_ILI9486.h b/libraries/TFT_eSPI/User_Setups/Setup5_RPi_ILI9486.h new file mode 100644 index 0000000..2935158 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup5_RPi_ILI9486.h @@ -0,0 +1,30 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 5 + +#define RPI_ILI9486_DRIVER // 20MHz maximum SPI + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_ILI9341.h new file mode 100644 index 0000000..c795e0e --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_ILI9341.h @@ -0,0 +1,187 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + +#define USER_SETUP_ID 60 +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT + +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or tray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for the RP2040 is : +// +// Display SDO/MISO to RP2040 pin D0 (or leave disconnected if not reading TFT) +// Display LED to RP2040 pin 3V3 or 5V +// Display SCK to RP2040 pin D2 +// Display SDI/MOSI to RP2040 pin D3 +// Display DC (RS/AO)to RP2040 pin D18 (can use another pin if desired) +// Display RESET to RP2040 pin D19 (can use another pin if desired) +// Display CS to RP2040 pin D20 (can use another pin if desired, or GND, see below) +// Display GND to RP2040 pin GND (0V) +// Display VCC to RP2040 5V or 3.3V (5v if display has a 5V to 3.3V regulator fitted) +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. + +// For the Pico use these #define lines +#define TFT_MISO 0 +#define TFT_MOSI 3 +#define TFT_SCLK 2 +#define TFT_CS 20 // Chip select control pin +#define TFT_DC 18 // Data Command control pin +#define TFT_RST 19 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL // LED back-light + +//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For the RP2040 processor define the SPI port channel used, default is 0 +// #define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 32000000 + #define SPI_FREQUENCY 70000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + diff --git a/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_RPI_MHS.h b/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_RPI_MHS.h new file mode 100644 index 0000000..804541c --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup60_RP2040_RPI_MHS.h @@ -0,0 +1,29 @@ +#define USER_SETUP_ID 162 +#define ST7796_DRIVER + +#define MHS_DISPLAY_TYPE +//#define RP2040_PIO_SPI +#define TFT_MISO 16 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 17 // Chip select control pin +#define TFT_DC 20 // Data Command control pin +#define TFT_RST 21 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL // LED back-light + +#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 125000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 \ No newline at end of file diff --git a/libraries/TFT_eSPI/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h b/libraries/TFT_eSPI/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h new file mode 100644 index 0000000..01fd63f --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h @@ -0,0 +1,44 @@ +// Setup file for RP2040 and SPI ILI9341 display using PIO for the display interface +#define USER_SETUP_ID 61 +// The PIO can only be user with Earle Philhower's RP2040 board package: +// https://github.com/earlephilhower/arduino-pico + +// PIO SPI allows high SPI clock rates to be used when the processor is over-clocked. +// PIO SPI is "write only" and the TFT_eSPI touch functions are not supported. +// A touch screen could be used with a third party library on different SPI pins. + +// This invokes the PIO based SPI interface for the RP2040 processor. +#define RP2040_PIO_SPI + +// TFT driver +#define ILI9341_DRIVER + +// Pins - the PIO will control MOSI, SCLK and DC pins +// Any digital GPIO pins may be used +//#define TFT_MISO -1 // MISO is not used or supported +#define TFT_MOSI 11 +#define TFT_SCLK 10 +#define TFT_CS 9 // Chip select control pin +#define TFT_DC 8 // Data Command control pin +#define TFT_RST 15 // Reset pin (could connect to Arduino RESET pin) + +//#define TFT_BL 13 // Optional LED back-light control pin +//#define TFT_BACKLIGHT_ON LOW // Level to turn ON back-light (HIGH or LOW) + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 32000000 +#define SPI_FREQUENCY 62500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h new file mode 100644 index 0000000..0e8a4a9 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h @@ -0,0 +1,198 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + +#define USER_SETUP_ID 62 +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT + +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or tray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for the RP2040 is : +// +// Display SDO/MISO to RP2040 pin D0 (or leave disconnected if not reading TFT) +// Display LED to RP2040 pin 3V3 or 5V +// Display SCK to RP2040 pin D2 +// Display SDI/MOSI to RP2040 pin D3 +// Display DC (RS/AO)to RP2040 pin D18 (can use another pin if desired) +// Display RESET to RP2040 pin D19 (can use another pin if desired) +// Display CS to RP2040 pin D20 (can use another pin if desired, or GND, see below) +// Display GND to RP2040 pin GND (0V) +// Display VCC to RP2040 5V or 3.3V (5v if display has a 5V to 3.3V regulator fitted) +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. + +// The TFT_eSPI library always uses GPIO numbers, this means the following pin designators +// must be used dependant on the RP2040 board package loaded +// For the Arduino Mbed package the GPIO numbers must be used prefixed with p: +#ifdef ARDUINO_ARCH_MBED + #define TFT_MISO p4 // Arduino pin D12 + #define TFT_MOSI p7 // Arduino pin D11 + #define TFT_SCLK p6 // Arduino pin D13 + #define TFT_CS p5 // Arduino pin D10 + #define TFT_DC p20 // Arduino pin D8 + #define TFT_RST p21 // Arduino pin D9 + #define TOUCH_CS p19 // Arduino pin D7 +#else // For Earle Philhower's package the Arduino Dx pin designations must be used: + #define TFT_MISO D12 + #define TFT_MOSI D11 + #define TFT_SCLK D13 + #define TFT_CS D10 // Chip select control pin + #define TFT_DC D8 // Data Command control pin + #define TFT_RST D9 // Reset pin (could connect to Arduino RESET pin) + #define TOUCH_CS D7 +#endif + + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For the RP2040 processor define the SPI port channel used, default is 0 +// #define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +// #define SPI_FREQUENCY 32000000 + #define SPI_FREQUENCY 70000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + diff --git a/libraries/TFT_eSPI/User_Setups/Setup66_Seeed_XIAO_Round.h b/libraries/TFT_eSPI/User_Setups/Setup66_Seeed_XIAO_Round.h new file mode 100644 index 0000000..79df77b --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup66_Seeed_XIAO_Round.h @@ -0,0 +1,29 @@ +#define USER_SETUP_ID 66 + +#define GC9A01_DRIVER // Full configuration option, define additional parameters below for this display + +#define TFT_RGB_ORDER TFT_RGB // Colour order Blue-Green-Red +#define TFT_HEIGHT 240 // GC9A01 240 x 240 + +#define TFT_SCLK D8 +#define TFT_MISO D9 +#define TFT_MOSI D10 +#define TFT_CS D1 // Chip select control pin +#define TFT_DC D3 // Data Command control pin +#define TFT_BL D6 +#define TFT_RST -1 // Reset pin (could connect to RST pin) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +// #define USE_HSPI_PORT diff --git a/libraries/TFT_eSPI/User_Setups/Setup6_RPi_Wr_ILI9486.h b/libraries/TFT_eSPI/User_Setups/Setup6_RPi_Wr_ILI9486.h new file mode 100644 index 0000000..63a9391 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup6_RPi_Wr_ILI9486.h @@ -0,0 +1,32 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 6 + +#define RPI_ILI9486_DRIVER // 20MHz maximum SPI + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + +#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup70_ESP32_S2_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup70_ESP32_S2_ILI9341.h new file mode 100644 index 0000000..6fcad90 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70_ESP32_S2_ILI9341.h @@ -0,0 +1,37 @@ +// Setup for the ESP32 S2 with ILI9341 display +// Note SPI DMA with ESP32 S2 is not currently supported +#define USER_SETUP_ID 70 +// See SetupX_Template.h for all options available +#define ILI9341_DRIVER + + // Typical board default pins +#define TFT_CS 10 // 10 or 34 + +#define TFT_MOSI 11 // 11 or 35 +#define TFT_SCLK 12 // 12 or 36 +#define TFT_MISO 13 // 13 or 37 + +#define TFT_DC 14 +#define TFT_RST 15 + +//#define TOUCH_CS 16 // Optional for touch screen + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port will be used unless the following is defined +#define USE_HSPI_PORT + +//#define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 // Maximum for ILI9341 + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup70b_ESP32_S3_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup70b_ESP32_S3_ILI9341.h new file mode 100644 index 0000000..4576ae9 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70b_ESP32_S3_ILI9341.h @@ -0,0 +1,37 @@ +// Setup for the ESP32 S3 with ILI9341 display +// Note SPI DMA with ESP32 S3 is not currently supported +#define USER_SETUP_ID 70 +// See SetupX_Template.h for all options available +#define ILI9341_DRIVER + + // Typical board default pins - change to match your board +#define TFT_CS 34 // 10 or 34 (FSPI CS0) +#define TFT_MOSI 35 // 11 or 35 (FSPI D) +#define TFT_SCLK 36 // 12 or 36 (FSPI CLK) +#define TFT_MISO 37 // 13 or 37 (FSPI Q) + +// Use pins in range 0-31 +#define TFT_DC 7 +#define TFT_RST 6 + +//#define TOUCH_CS 16 // Optional for touch screen + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI (or VSPI) port (SPI2) used unless following defined. HSPI port is (SPI3) on S3. +//#define USE_HSPI_PORT + +//#define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 // Maximum for ILI9341 + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup70c_ESP32_C3_ILI9341.h b/libraries/TFT_eSPI/User_Setups/Setup70c_ESP32_C3_ILI9341.h new file mode 100644 index 0000000..6223528 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70c_ESP32_C3_ILI9341.h @@ -0,0 +1,56 @@ +// Setup for the ESP32 C3 with ILI9341 display +// Note SPI DMA with ESP32 C3 is not currently supported + +#define USER_SETUP_ID 70 +// See SetupX_Template.h for all options available + +#define ILI9341_DRIVER +//#define ST7796_DRIVER +//#define ILI9488_DRIVER + +// Adafruit qtpy default +//TFT_CS 6 +//TFT_MOSI 7 +//TFT_MISO 8 +//TFT_SCLK 10 + +// Lolin C3 mini default +//TFT_CS 5 +//TFT_MOSI 4 +//TFT_MISO 3 +//TFT_SCLK 2 + +//ESP32 C3 generic default +//TFT_CS 7 +//TFT_MOSI 6 +//TFT_MISO 5 +//TFT_SCLK 4 + + +#define TFT_CS 7 + +#define TFT_MOSI 6 +#define TFT_MISO 5 +#define TFT_SCLK 4 + +#define TFT_DC 8 +#define TFT_RST 10 + +//#define TOUCH_CS 1 // Optional for touch screen + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +//#define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 // Maximum for ILI9341 + +#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup70d_ILI9488_S3_Parallel.h b/libraries/TFT_eSPI/User_Setups/Setup70d_ILI9488_S3_Parallel.h new file mode 100644 index 0000000..66e7c33 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70d_ILI9488_S3_Parallel.h @@ -0,0 +1,36 @@ + +#define USER_SETUP_ID 146 + +#define TFT_PARALLEL_8_BIT + +//#define ILI9341_DRIVER +//#define ST7796_DRIVER +#define ILI9488_DRIVER + +// ESP32 S3 pins used for the parallel interface TFT +#define TFT_CS 9 +#define TFT_DC 8 // Data Command control pin - must use a GPIO in the range 0-31 +#define TFT_RST 34 + +#define TFT_WR 7 // Write strobe control pin - must use a GPIO in the range 0-31 +#define TFT_RD 6 + +#define TFT_D0 12 // Must use GPIO in the range 0-31 for the data bus +#define TFT_D1 13 // so a single register write sets/clears all bits +#define TFT_D2 14 +#define TFT_D3 15 +#define TFT_D4 16 +#define TFT_D5 21 +#define TFT_D6 5 +#define TFT_D7 4 + + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h b/libraries/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h new file mode 100644 index 0000000..f0cc51d --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h @@ -0,0 +1,44 @@ +// Setup for the ESP32 S2 with ST7735 80x160 display +// See SetupX_Template.h for all options available + +#define USER_SETUP_ID 70 + +#define ST7735_DRIVER + +#define TFT_SDA_READ // Display has a bidirectional SDA pin (no MISO) + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +#define ST7735_GREENTAB160x80 +//#define ST7735_REDTAB160x80 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + // Typical board default pins +#define TFT_CS 10 // 10 or 34 + +#define TFT_MOSI 11 // 11 or 35 +#define TFT_SCLK 12 // 12 or 36 + +#define TFT_DC 14 +#define TFT_RST 15 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port must be used for SDA reads. Do not use #define USE_HSPI_PORT + +#define SPI_FREQUENCY 27000000 +#define SPI_READ_FREQUENCY 16000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup70h_ESP32_S3_GC9A01.h b/libraries/TFT_eSPI/User_Setups/Setup70h_ESP32_S3_GC9A01.h new file mode 100644 index 0000000..847a2ee --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup70h_ESP32_S3_GC9A01.h @@ -0,0 +1,31 @@ +// Setup for the ESP32 S3 with GC9A01 display +#define USER_SETUP_ID 70 + +#define GC9A01_DRIVER + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + // Typical board default pins - change to match your board +#define TFT_CS 10 //34 // 10 or 34 (FSPI CS0) +#define TFT_MOSI 11 //35 // 11 or 35 (FSPI D) +#define TFT_SCLK 12 //36 // 12 or 36 (FSPI CLK) +#define TFT_MISO 13 //37 // 13 or 37 (FSPI Q) + +// Use pins in range 0-31 +#define TFT_DC 7 +#define TFT_RST 6 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port (SPI2) used unless following defined +#define USE_HSPI_PORT + +#define SPI_FREQUENCY 80000000 // Maximum for ILI9341 diff --git a/libraries/TFT_eSPI/User_Setups/Setup71_ESP32_S2_ST7789.h b/libraries/TFT_eSPI/User_Setups/Setup71_ESP32_S2_ST7789.h new file mode 100644 index 0000000..0380175 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup71_ESP32_S2_ST7789.h @@ -0,0 +1,29 @@ +// Setup for the ESP32 S2 with ST7789 display +// Note SPI DMA with ESP32 S2 is not currently supported +#define USER_SETUP_ID 71 +// See SetupX_Template.h for all options available + +#define ST7789_DRIVER // Configure all registers + + +#define TFT_CS 34 // 10 or 34 +#define TFT_MOSI 35 // 11 or 35 +#define TFT_SCLK 37 // 12 or 36 +#define TFT_MISO 36 // 13 or 37 + +#define TFT_DC 33 +#define TFT_RST -1 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 + +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup72_ESP32_ST7789_172x320.h b/libraries/TFT_eSPI/User_Setups/Setup72_ESP32_ST7789_172x320.h new file mode 100644 index 0000000..780d60f --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup72_ESP32_ST7789_172x320.h @@ -0,0 +1,31 @@ +// Support for 1.47" 320x172 Round Rectangle Color IPS TFT Display +#define USER_SETUP_ID 71 + +#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display + +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_WIDTH 172 // ST7789 172 x 320 +#define TFT_HEIGHT 320 // ST7789 240 x 320 + +#define TFT_BL 21 // LED back-light control pin +#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + +#define TFT_MOSI 23 +#define TFT_SCLK 18 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 22 // Data Command control pin +#define TFT_RST 17 // Reset pin (could connect to RST pin) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 diff --git a/libraries/TFT_eSPI/User_Setups/Setup7_ST7735_128x128.h b/libraries/TFT_eSPI/User_Setups/Setup7_ST7735_128x128.h new file mode 100644 index 0000000..b083733 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup7_ST7735_128x128.h @@ -0,0 +1,45 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 7 + +#define ST7735_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + + +#define ST7735_GREENTAB128 // For 128 x 128 display + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup8_ILI9163_128x128.h b/libraries/TFT_eSPI/User_Setups/Setup8_ILI9163_128x128.h new file mode 100644 index 0000000..6df7d32 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup8_ILI9163_128x128.h @@ -0,0 +1,36 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 8 + +#define ILI9163_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/Setup9_ST7735_Overlap.h b/libraries/TFT_eSPI/User_Setups/Setup9_ST7735_Overlap.h new file mode 100644 index 0000000..2c7f852 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/Setup9_ST7735_Overlap.h @@ -0,0 +1,56 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 9 + +#define ST7735_DRIVER + + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 160 + + +#define ST7735_REDTAB + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact +// but saves pins for other functions. It is best not to connect MISO as some displays +// do not tristate that line when chip select is high! +// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller +// cannot be connected as well to the same SPI signals. +// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode +// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK +// In ESP8266 overlap mode the following must be defined +#define TFT_SPI_OVERLAP + +// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3 +#define TFT_CS PIN_D3 +#define TFT_DC PIN_D5 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/SetupX_Template.h b/libraries/TFT_eSPI/User_Setups/SetupX_Template.h new file mode 100644 index 0000000..00bf9a5 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/SetupX_Template.h @@ -0,0 +1,366 @@ +// USER DEFINED SETTINGS +// Set driver type, fonts to be loaded, pins used and SPI control method etc. +// +// See the User_Setup_Select.h file if you wish to be able to define multiple +// setups and then easily select which setup file is used by the compiler. +// +// If this file is edited correctly then all the library example sketches should +// run without the need to make any more changes for a particular hardware setup! +// Note that some sketches are designed for a particular TFT pixel width/height + +#define USER_SETUP_ID 0xFFFFFFFF + +// Define to disable all #warnings in library (can be put in User_Setup_Select.h) +//#define DISABLE_ALL_LIBRARY_WARNINGS + +// ################################################################################## +// +// Section 1. Call up the right driver file and any options for it +// +// ################################################################################## + +// Define STM32 to invoke optimised processor support (only for STM32) +//#define STM32 + +// Defining the STM32 board allows the library to optimise the performance +// for UNO compatible "MCUfriend" style shields +//#define NUCLEO_64_TFT +//#define NUCLEO_144_TFT + +// STM32 8-bit parallel only: +// If STN32 Port A or B pins 0-7 are used for 8-bit parallel data bus bits 0-7 +// then this will improve rendering performance by a factor of ~8x +//#define STM_PORTA_DATA_BUS +//#define STM_PORTB_DATA_BUS + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT +//#define TFT_PARALLEL_16_BIT // **** 16-bit parallel ONLY with RP2040 processor **** + +// Display type - only define if RPi display +//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI + +// Only define one driver, the other ones must be commented out +#define ILI9341_DRIVER // Generic driver for common displays +//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172 +//#define ILI9342_DRIVER // Landscape default orientation variant of ILI9341 +//#define ST7735_DRIVER // Define additional parameters below for this display +//#define ILI9163_DRIVER // Define additional parameters below for this display +//#define S6D02A1_DRIVER +//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI +//#define HX8357B_DRIVER +//#define HX8357C_DRIVER +//#define HX8357D_DRIVER +//#define ILI9481_DRIVER +//#define ILI9486_DRIVER +//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high) +//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display +//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display +//#define R61581_DRIVER +//#define RM68120_DRIVER // Untested +//#define RM68140_DRIVER +//#define ST7796_DRIVER +//#define SSD1351_DRIVER +//#define SSD1963_480_DRIVER +//#define SSD1963_800_DRIVER +//#define SSD1963_800ALT_DRIVER +//#define ILI9225_DRIVER +//#define GC9A01_DRIVER + +// Some displays support SPI reads via the MISO pin, other displays have a single +// bi-directional SDA pin and the library will try to read this via the MOSI line. +// To use the SDA line for reading data from the TFT uncomment the following line: + +// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below + +// #define M5STACK + +// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation +// #define TFT_WIDTH 80 +// #define TFT_WIDTH 128 +// #define TFT_WIDTH 172 // ST7789 172 x 320 +// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 +// #define TFT_HEIGHT 160 +// #define TFT_HEIGHT 128 +// #define TFT_HEIGHT 240 // ST7789 240 x 240 +// #define TFT_HEIGHT 320 // ST7789 240 x 320 +// #define TFT_HEIGHT 240 // GC9A01 240 x 240 + +// For ST7735 ONLY, define the type of display, originally this was based on the +// colour of the tab on the screen protector film but this is not always true, so try +// out the different options below if the screen does not display graphics correctly, +// e.g. colours wrong, mirror images, or stray pixels at the edges. +// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this +// this User_Setup file, then rebuild and upload the sketch to the board again: + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +// #define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +// If colours are inverted (white shows as black) then uncomment one of the next +// 2 lines try both options, one of the options should correct the inversion. + +// #define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + +// ################################################################################## +// +// Section 2. Define the pins that are used to interface with the display here +// +// ################################################################################## + +// If a backlight control signal is available then define the TFT_BL pin in Section 2 +// below. The backlight will be turned ON when tft.begin() is called, but the library +// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be +// driven with a PWM signal or turned OFF/ON then this must be handled by the user +// sketch. e.g. with digitalWrite(TFT_BL, LOW); + +// #define TFT_BL 32 // LED back-light control pin +// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW) + + + +// We must use hardware SPI, a minimum of 3 GPIO pins is needed. +// Typical setup for ESP8266 NodeMCU ESP-12 is : +// +// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT) +// Display LED to NodeMCU pin VIN (or 5V, see below) +// Display SCK to NodeMCU pin D5 +// Display SDI/MOSI to NodeMCU pin D7 +// Display DC (RS/AO)to NodeMCU pin D3 +// Display RESET to NodeMCU pin D4 (or RST, see below) +// Display CS to NodeMCU pin D8 (or GND, see below) +// Display GND to NodeMCU pin GND (0V) +// Display VCC to NodeMCU 5V or 3.3V +// +// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin +// +// The DC (Data Command) pin may be labelled AO or RS (Register Select) +// +// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more +// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS +// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin +// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected. +// +// The NodeMCU D0 pin can be used for RST +// +// +// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin +// If 5V is not available at a pin you can use 3.3V but backlight brightness +// will be lower. + + +// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ###### + +// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + +//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin) + +//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen + +//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only + + +// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ###### + +// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact +// but saves pins for other functions. It is best not to connect MISO as some displays +// do not tristate that line when chip select is high! +// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode +// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK +// In ESP8266 overlap mode the following must be defined + +//#define TFT_SPI_OVERLAP + +// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3 +//#define TFT_CS PIN_D3 +//#define TFT_DC PIN_D5 // Data Command control pin +//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + + +// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ###### + +// For ESP32 Dev board (only tested with ILI9341 display) +// The hardware SPI can be mapped to any pins + +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS 15 // Chip select control pin +//#define TFT_DC 2 // Data Command control pin +//#define TFT_RST 4 // Reset pin (could connect to RST pin) +//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST + +// For ESP32 Dev board (only tested with GC9A01 display) +// The hardware SPI can be mapped to any pins + +//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on. +//#define TFT_SCLK 14 +//#define TFT_CS 5 // Chip select control pin +//#define TFT_DC 27 // Data Command control pin +//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL 22 // LED back-light + +//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen + +//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only + +// For the M5Stack module use these #define lines +//#define TFT_MISO 19 +//#define TFT_MOSI 23 +//#define TFT_SCLK 18 +//#define TFT_CS 14 // Chip select control pin +//#define TFT_DC 27 // Data Command control pin +//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL 32 // LED back-light (required for M5Stack) + +// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### + +// The library supports 8-bit parallel TFTs with the ESP32, the pin +// selection below is compatible with ESP32 boards in UNO format. +// Wemos D32 boards need to be modified, see diagram in Tools folder. +// Only ILI9481 and ILI9341 based displays have been tested! + +// Parallel bus is only supported for the STM32 and ESP32 +// Example below is for ESP32 Parallel interface with UNO displays + +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) +//#define TFT_PARALLEL_8_BIT + +// The ESP32 and TFT the pins used for testing are: +//#define TFT_CS 33 // Chip select control pin (library pulls permanently low +//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31 +//#define TFT_RST 32 // Reset pin, toggles on startup + +//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31 +//#define TFT_RD 2 // Read strobe control pin + +//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus +//#define TFT_D1 13 // so a single register write sets/clears all bits. +//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect +//#define TFT_D3 25 // TFT screen update performance. +//#define TFT_D4 17 +//#define TFT_D5 16 +//#define TFT_D6 27 +//#define TFT_D7 14 + +// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ###### + +// The TFT can be connected to SPI port 1 or 2 +//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz +//#define TFT_MOSI PA7 +//#define TFT_MISO PA6 +//#define TFT_SCLK PA5 + +//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz +//#define TFT_MOSI PB15 +//#define TFT_MISO PB14 +//#define TFT_SCLK PB13 + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +//#define TFT_CS D5 // Chip select control pin to TFT CS +//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +//#define TFT_RST D7 // Reset pin to TFT RST (or RESET) +// OR alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// ################################################################################## +// +// Section 3. Define the fonts that are to be used here +// +// ################################################################################## + +// Comment out the #defines below with // to stop that font being loaded +// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not +// normally necessary. If all fonts are loaded the extra FLASH space required is +// about 17Kbytes. To save FLASH space only enable the fonts you need! + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded +// this will save ~20kbytes of FLASH +#define SMOOTH_FONT + + +// ################################################################################## +// +// Section 4. Other options +// +// ################################################################################## + +// For the RP2040 processor define the SPI port channel used (default 0 if undefined) +//#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used + +// For the STM32 processor define the SPI port channel used (default 1 if undefined) +//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2 + +// Define the SPI clock frequency, this affects the graphics rendering speed. Too +// fast and the TFT driver will not keep up and display corruption appears. +// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails +// With a ST7735 display more than 27MHz may not work (spurious pixels and lines) +// With an ILI9163 display 27 MHz works OK. + +// #define SPI_FREQUENCY 1000000 +// #define SPI_FREQUENCY 5000000 +// #define SPI_FREQUENCY 10000000 +// #define SPI_FREQUENCY 20000000 +#define SPI_FREQUENCY 27000000 +// #define SPI_FREQUENCY 40000000 +// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz) +// #define SPI_FREQUENCY 80000000 + +// Optional reduced SPI frequency for reading TFT +#define SPI_READ_FREQUENCY 20000000 + +// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here: +#define SPI_TOUCH_FREQUENCY 2500000 + +// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default. +// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam) +// then uncomment the following line: +//#define USE_HSPI_PORT + +// Comment out the following #define if "SPI Transactions" do not need to be +// supported. When commented out the code size will be smaller and sketches will +// run slightly faster, so leave it commented out unless you need it! + +// Transaction support is needed to work with SD library but not needed with TFT_SdFat +// Transaction support is required if other SPI devices are connected. + +// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex) +// so changing it here has no effect + +// #define SUPPORT_TRANSACTIONS diff --git a/libraries/TFT_eSPI/User_Setups/User_Custom_Fonts.h b/libraries/TFT_eSPI/User_Setups/User_Custom_Fonts.h new file mode 100644 index 0000000..004ac54 --- /dev/null +++ b/libraries/TFT_eSPI/User_Setups/User_Custom_Fonts.h @@ -0,0 +1,41 @@ + +// Custom "Adafruit" compatible font files can be added to the "TFT_eSPI/Fonts/Custom" folder +// Fonts in a suitable format can be created using a Squix blog web based tool here: +/* + https://blog.squix.org/2016/10/font-creator-now-creates-adafruit-gfx-fonts.html +*/ + +// Note: At the time of writing there is a last character code definition bug in the +// Squix font file format so do NOT try and print the tilde (~) symbol (ASCII 0x7E) +// Alternatively look at the end of the font header file and edit: 0x7E to read 0x7D +/* e.g. vvvv + (uint8_t *)Orbitron_Light_32Bitmaps,(GFXglyph *)Orbitron_Light_32Glyphs,0x20, 0x7D, 32}; + ^^^^ +*/ + +// When font files are placed in the Custom folder (TFT_eSPI\Fonts\Custom) then they must +// also be #included here: + +// The CF_OL24 etc. are a shorthand reference, but this is not essential to use the fonts + +#ifdef LOAD_GFXFF + + // New custom font file #includes + #include // CF_OL24 + #include // CF_OL32 + #include // CF_RT24 + #include // CF_S24 + #include // CF_Y32 + +#endif + +// Shorthand references - any coding scheme can be used, here CF_ = Custom Font +// The #defines below MUST be added to sketches to use shorthand references, so +// they are only put here for reference and copy+paste purposes! +/* +#define CF_OL24 &Orbitron_Light_24 +#define CF_OL32 &Orbitron_Light_32 +#define CF_RT24 &Roboto_Thin_24 +#define CF_S24 &Satisfy_24 +#define CF_Y32 &Yellowtail_32 +*/ diff --git a/libraries/TFT_eSPI/docs/ESP-IDF/Using ESP-IDF.txt b/libraries/TFT_eSPI/docs/ESP-IDF/Using ESP-IDF.txt new file mode 100644 index 0000000..a23a651 --- /dev/null +++ b/libraries/TFT_eSPI/docs/ESP-IDF/Using ESP-IDF.txt @@ -0,0 +1,70 @@ +The TFT_eSPI library has been updated by a user (dracir9) in pull request #1770 to enable +use with the ESP-IDF. + +https://github.com/Bodmer/TFT_eSPI/pull/1770 + +The library author (Bodmer) does not use the ESP-IDF so will not be able to provide support! + +There are two ways to configure the library either: + + manually enter the setup in menuconfig + OR + delete the KConfig file, select your LCD/board in the User_Setup_Select.h file, and run "idf.py reconfigure" + +The following menuconfig instructions were posted by dracir9 as part of the pull request #1770: + +https://github.com/Bodmer/TFT_eSPI/pull/1770#issuecomment-1096478997 + +In the above link the instructions include useful hyperlinks. The bare text of the +instructions is included below. + +Steps to use: + + 1. Install ESP-IDF toolchain. The easiest way is to use VS Code and the ESP-IDF extension + which handles most of the work automatically. Make sure to install version V4.4. From + now on I'll assume that VS Code is being used. + + 2. Once ESP-IDF is installed open VS Code and press F1. Type ESP-IDF: New Project. Hit enter. + + 3. Enter your project name, directory and board (if not sure choose ESP32 chip (via ESP-PROG)). + If your board is connected choose serial port. Leave ESP-IDF component directory blank and + press Choose Template. + + 4. In the drop-down choose Extension and select Arduino-as-component. (This is not mandatory. + You can try other templates if you want). This will create a blank project with a simple + main source file in the "main" folder. + + 5. Now we have to add Arduino to your project. You can find the complete documentation here: + https://github.com/espressif/arduino-esp32 + + and here: + https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html + + I'll list two methods that I use most of the time: + + 5.1. Press F1 and type ESP-IDF: Add Arduino ESP32 as ESP-IDF Component. This will + automatically download and install the latest code from the arduino esp-32 repository. + This is the easiest method but as it uses the latest code it may introduce compilation errors. + + 5.2. Go to the Arduino esp-32 repository release page. Choose a version and find its "Assets" + section. Download the source code file into "project directory/components". Extract the + compressed file. This will create a folder called arduino-esp32-2.x.x. Rename it to arduino. + This method is slightly more complex but ensures you choose a stable version. + + 6. Download the TFT_eSPI library into the components folder + + 7. Now open VS Code and load your project folder. Press F1 and type ESP-IDF: SDK Configuration + editor (menuconfig). Alternatively press Ctrl+E, G or press the gear button in the bottom left + corner. + + 8. This will open the project configuration menu. Navigate to the TFT_eSPI section and configure + the library (TFT driver, pins, fonts, etc.). + + 9. Press F1 and type ESP-IDF: Build your project. Alternatively press Ctrl+E, B or click the + build button in the bottom left corner. + + 10. Choose your port by typing ESP-IDF: Select port to use or with the button in the bottom left. + + 11. Upload your code with the lightning button in the bottom toolbar. + + 12. Enjoy! diff --git a/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg b/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg new file mode 100644 index 0000000..1063331 Binary files /dev/null and b/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg differ diff --git a/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg b/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg new file mode 100644 index 0000000..3b10b76 Binary files /dev/null and b/libraries/TFT_eSPI/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg differ diff --git a/libraries/TFT_eSPI/docs/PlatformIO/Configuring options.txt b/libraries/TFT_eSPI/docs/PlatformIO/Configuring options.txt new file mode 100644 index 0000000..26caeac --- /dev/null +++ b/libraries/TFT_eSPI/docs/PlatformIO/Configuring options.txt @@ -0,0 +1,52 @@ +;PlatformIO User notes: + +;It is possible to load settings from the calling program rather than modifying +;the library for each project by modifying the "platformio.ini" file. + +;The User_Setup_Select.h file will not load the user setting header files if +;USER_SETUP_LOADED is defined. + +;Instead of using #define, use the -D prefix, for example: + +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp32dev] +platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream +board = esp32dev +framework = arduino +lib_deps = bodmer/TFT_eSPI@^2.4.31 + +build_flags = + -Os + -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG + -DUSER_SETUP_LOADED=1 + + ; Define the TFT driver, pins etc. here: + -DST7789_DRIVER=1 + -DTFT_WIDTH=128 + -DTFT_HEIGHT=160 + -DTFT_MISO=19 + -DTFT_MOSI=23 + -DTFT_SCLK=18 + -DTFT_CS=5 + -DTFT_DC=19 + -DTFT_RST=4 + ;-DTFT_BL=21 + ;-DTOUCH_CS=22 + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT6=1 + -DLOAD_FONT7=1 + -DLOAD_FONT8=1 + -DLOAD_GFXFF=1 + -DSMOOTH_FONT=1 + -DSPI_FREQUENCY=27000000 diff --git a/libraries/TFT_eSPI/docs/PlatformIO/rp2040.txt b/libraries/TFT_eSPI/docs/PlatformIO/rp2040.txt new file mode 100644 index 0000000..f4208bd --- /dev/null +++ b/libraries/TFT_eSPI/docs/PlatformIO/rp2040.txt @@ -0,0 +1,63 @@ +;PlatformIO User notes: + +;It is possible to load settings from the calling program rather than modifying +;the library for each project by modifying the "platformio.ini" file. + +;The User_Setup_Select.h file will not load the user setting header files if +;USER_SETUP_LOADED is defined. + +;Instead of using #define, use the -D prefix, for example: + +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter, extra scripting +; Upload options: custom port, speed and extra flags +; Library options: dependencies, extra library storages +; +; Please visit documentation for the other options and examples +; http://docs.platformio.org/page/projectconf.html + +[env:pico] +platform = https://github.com/maxgerhardt/platform-raspberrypi.git +board = pico +framework = arduino +board_build.core = earlephilhower +board_build.filesystem_size = 0.5m +lib_deps = bodmer/TFT_eSPI@^2.5.21 +; change microcontroller +board_build.mcu = rp2040 + +; change MCU frequency +board_build.f_cpu = 133000000L + +build_flags = + -Os + -DUSER_SETUP_LOADED=1 + ; Define the TFT driver, pins etc. here: + -DTFT_PARALLEL_8_BIT=1 + -DRM68120_DRIVER=1 + -DRP2040_PIO_CLK_DIV=1 + -DTFT_DC=28 + -DTFT_WR=22 + -DTFT_RST=2 + + -DTFT_D0=6 + -DTFT_D1=7 + -DTFT_D2=8 + -DTFT_D3=9 + -DTFT_D4=10 + -DTFT_D5=11 + -DTFT_D6=12 + -DTFT_D7=13 + + -DTFT_BL=16 + -DTFT_BACKLIGHT_ON=HIGH + + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT6=1 + -DLOAD_FONT7=1 + -DLOAD_FONT8=1 + -DLOAD_GFXFF=1 + -DSMOOTH_FONT=1 diff --git a/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_Connections.png b/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_Connections.png new file mode 100644 index 0000000..4e82b2c Binary files /dev/null and b/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_Connections.png differ diff --git a/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_mod.png b/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_mod.png new file mode 100644 index 0000000..46a2a9e Binary files /dev/null and b/libraries/TFT_eSPI/docs/RPi_TFT_connections/RPi_TFT_mod.png differ diff --git a/libraries/TFT_eSPI/keywords.txt b/libraries/TFT_eSPI/keywords.txt new file mode 100644 index 0000000..21439a9 --- /dev/null +++ b/libraries/TFT_eSPI/keywords.txt @@ -0,0 +1,209 @@ +# TFT_eSPI core library + +TFT_eSPI KEYWORD1 + +begin KEYWORD2 +init KEYWORD2 +drawPixel KEYWORD2 +drawChar KEYWORD2 +drawLine KEYWORD2 +drawFastVLine KEYWORD2 +drawFastHLine KEYWORD2 +fillRect KEYWORD2 +height KEYWORD2 +width KEYWORD2 +readPixel KEYWORD2 +setWindow KEYWORD2 +pushColor KEYWORD2 + +setRotation KEYWORD2 +getRotation KEYWORD2 +setOrigin KEYWORD2 +getOriginX KEYWORD2 +getOriginY KEYWORD2 +invertDisplay KEYWORD2 +setAddrWindow KEYWORD2 + +setViewport KEYWORD2 +checkViewport KEYWORD2 +resetViewport KEYWORD2 +getViewportX KEYWORD2 +getViewportY KEYWORD2 +getViewportWidth KEYWORD2 +getViewportHeight KEYWORD2 +getViewportDatum KEYWORD2 +frameViewport KEYWORD2 +resetViewport KEYWORD2 +clipAddrWindow KEYWORD2 +clipWindow KEYWORD2 +pushColors KEYWORD2 +pushBlock KEYWORD2 +pushPixels KEYWORD2 + +tft_Read_8 KEYWORD2 +begin_SDA_Read KEYWORD2 +end_SDA_Read KEYWORD2 + +fillScreen KEYWORD2 + +drawRect KEYWORD2 +fillRectHGradient KEYWORD2 +fillRectVGradient KEYWORD2 +drawRoundRect KEYWORD2 +fillRoundRect KEYWORD2 + +drawCircle KEYWORD2 +drawCircleHelper KEYWORD2 +fillCircle KEYWORD2 +fillCircleHelper KEYWORD2 +drawEllipse KEYWORD2 +fillEllipse KEYWORD2 +drawTriangle KEYWORD2 +fillTriangle KEYWORD2 + +setSwapBytes KEYWORD2 +getSwapBytes KEYWORD2 + +drawBitmap KEYWORD2 +drawXBitmap KEYWORD2 + +setPivot KEYWORD2 +getPivotX KEYWORD2 +getPivotY KEYWORD2 + +readRect KEYWORD2 +pushRect KEYWORD2 +pushImage KEYWORD2 +pushMaskedImage KEYWORD2 +readRectRGB KEYWORD2 + +drawNumber KEYWORD2 +drawFloat KEYWORD2 +drawString KEYWORD2 +drawCentreString KEYWORD2 +drawRightString KEYWORD2 + +setCursor KEYWORD2 +getCursorX KEYWORD2 +getCursorY KEYWORD2 +setTextColor KEYWORD2 +setTextSize KEYWORD2 +setTextWrap KEYWORD2 +setTextDatum KEYWORD2 +getTextDatum KEYWORD2 +setTextPadding KEYWORD2 +getTextPadding KEYWORD2 +setFreeFont KEYWORD2 +setTextFont KEYWORD2 +textWidth KEYWORD2 +fontHeight KEYWORD2 +decodeUTF8 KEYWORD2 +write KEYWORD2 +setCallback KEYWORD2 +fontsLoaded KEYWORD2 + +spiwrite KEYWORD2 +writecommand KEYWORD2 +writeRegister KEYWORD2 +writedata KEYWORD2 +commandList KEYWORD2 +readcommand8 KEYWORD2 +readcommand16 KEYWORD2 +readcommand32 KEYWORD2 + +color565 KEYWORD2 +color8to16 KEYWORD2 +color16to8 KEYWORD2 +color16to24 KEYWORD2 +color24to16 KEYWORD2 +alphaBlend KEYWORD2 +alphaBlend24 KEYWORD2 + +initDMA KEYWORD2 +deInitDMA KEYWORD2 +pushImageDMA KEYWORD2 +pushPixelsDMA KEYWORD2 +dmaBusy KEYWORD2 +dmaWait KEYWORD2 + +startWrite KEYWORD2 +writeColor KEYWORD2 +endWrite KEYWORD2 + +setAttribute KEYWORD2 +getAttribute KEYWORD2 +getSetup KEYWORD2 +getSPIinstance KEYWORD2 + + +# Touch functions + +getTouchRaw KEYWORD2 +getTouchRawZ KEYWORD2 +convertRawXY KEYWORD2 +getTouch KEYWORD2 +calibrateTouch KEYWORD2 +setTouch KEYWORD2 + +# Smooth (anti-aliased) graphics functions +drawSmoothCircle KEYWORD2 +fillSmoothCircle KEYWORD2 +drawSmoothRoundRect KEYWORD2 +fillSmoothRoundRect KEYWORD2 +drawSmoothArc KEYWORD2 +drawArc KEYWORD2 +drawSpot KEYWORD2 +drawWideLine KEYWORD2 +drawWedgeLine KEYWORD2 + +# Smooth font functions + +loadFont KEYWORD2 +unloadFont KEYWORD2 +getUnicodeIndex KEYWORD2 +showFont KEYWORD2 + + +# Button class + +TFT_eSPI_Button KEYWORD1 + +initButton KEYWORD2 +initButtonUL KEYWORD2 +setLabelDatum KEYWORD2 +drawButton KEYWORD2 +contains KEYWORD2 +press KEYWORD2 +isPressed KEYWORD2 +justPressed KEYWORD2 +justReleased KEYWORD2 + + +# Sprite class + +TFT_eSprite KEYWORD1 + +createSprite KEYWORD2 +getPointer KEYWORD2 +created KEYWORD2 +deleteSprite KEYWORD2 +frameBuffer KEYWORD2 +setColorDepth KEYWORD2 +getColorDepth KEYWORD2 +createPalette KEYWORD2 +setPaletteColor KEYWORD2 +getPaletteColor KEYWORD2 +setBitmapColor KEYWORD2 +fillSprite KEYWORD2 +setScrollRect KEYWORD2 +scroll KEYWORD2 +pushRotated KEYWORD2 +setPivot KEYWORD2 +getPivotX KEYWORD2 +getPivotY KEYWORD2 +getRotatedBounds KEYWORD2 +readPixelValue KEYWORD2 +pushToSprite KEYWORD2 +drawGlyph KEYWORD2 +printToSprite KEYWORD2 +pushSprite KEYWORD2 diff --git a/libraries/TFT_eSPI/library.json b/libraries/TFT_eSPI/library.json new file mode 100644 index 0000000..f590f3e --- /dev/null +++ b/libraries/TFT_eSPI/library.json @@ -0,0 +1,22 @@ +{ + "name": "TFT_eSPI", + "version": "2.5.43", + "keywords": "Arduino, tft, display, ttgo, LilyPi, WT32-SC01, ePaper, display, Pico, RP2040 Nano Connect, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, ST7796, RM68140, SSD1351, SSD1963, ILI9225, HX8357D, GC9A01, R61581", + "description": "A TFT and ePaper (SPI or parallel interface) graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32 processors", + "repository": + { + "type": "git", + "url": "https://github.com/Bodmer/TFT_eSPI" + }, + "authors": + [ + { + "name": "Bodmer", + "email": "bodmer@anola.net", + "maintainer": true + } + ], + "frameworks": "arduino", + "platforms": "raspberrypi, espressif8266, espressif32, ststm32", + "headers": "TFT_eSPI.h" +} diff --git a/libraries/TFT_eSPI/library.properties b/libraries/TFT_eSPI/library.properties new file mode 100644 index 0000000..319d4ec --- /dev/null +++ b/libraries/TFT_eSPI/library.properties @@ -0,0 +1,11 @@ +name=TFT_eSPI +version=2.5.43 +author=Bodmer +maintainer=Bodmer +sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32 +paragraph=Supports TFT displays using drivers (ILI9341 etc.) that operate with hardware SPI or 8/16-bit parallel. +category=Display +url=https://github.com/Bodmer/TFT_eSPI +architectures=* +includes=TFT_eSPI.h + diff --git a/libraries/TFT_eSPI/license.txt b/libraries/TFT_eSPI/license.txt new file mode 100644 index 0000000..e0b40d2 --- /dev/null +++ b/libraries/TFT_eSPI/license.txt @@ -0,0 +1,135 @@ +The original starting point for this library was the Adafruit_ILI9341 +library in January 2015. + +The licence for that library is MIT. + +The first evolution of the library that led to TFT_eSPI is recorded here: + +https://www.instructables.com/id/Arduino-TFT-display-and-font-library/ + +Adafruit_ILI9341 ORIGINAL LIBRARY HEADER: + +vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + This is our library for the Adafruit ILI9341 Breakout and Shield + ----> http://www.adafruit.com/products/1651 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^End^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +Selected functions from the Adafruit_GFX library (as it was in 2015) have +been imported into the TFT_eSPI.cpp file and modified to improve +performance, add features and make them compatible with the ESP8266 and +ESP32. + +The fonts from the Adafruit_GFX and Button functions were added later. +The fonts can be found with the license.txt file in the "Fonts\GFXFF" +folder. + +The Adafruit_GFX functions are covered by the BSD licence. + +Adafruit_GFX ORIGINAL LIBRARY LICENSE: + +vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + +Software License Agreement (BSD License) + +Copyright (c) 2012 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^End^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Due to the evolution of the TFT_eSPI library the original code may no longer +be recognisable, however in most cases the function names can be used as a +reference point since the aim is to retain a level of compatibility with +the popular Adafruit_GFX graphics functions. + +Contributions from other authors are recorded on GitHub: +https://github.com/Bodmer/TFT_eSPI + +The major addition to the original library was the addition of fast +rendering proportional fonts of different sizes as documented here: + +https://www.instructables.com/id/Arduino-TFT-display-and-font-library/ + +The larger fonts are "Run Length Encoded (RLE)", this was done to +reduce the font memory footprint for AVR processors that have limited +FLASH, with the added benefit of a significant improvement in rendering +speed. + +In 2016 the library evolved significantly to support the ESP8266 and then +the ESP32. In 2017 new Touch Screen functions were added and a new Sprite +class called TFT_eSprite to permit "flicker free" screen updates of complex +graphics. + +In 2018 anti-aliased fonts were added along with a Processing font conversion +sketch. + +In 2019 the library was adapted to be able to use it with any 32-bit Arduino +compatible processor. It will run on 8-bit and 16-bit processors but will be +slow due to extensive use of 32-bit variables. + +Many of the example sketches are original work that contain code created +for my own projects. For all the original code the FreeBSD licence applies +and is compatible with the GNU GPL. + +vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +Software License Agreement (FreeBSD License) + +Copyright (c) 2023 Bodmer (https://github.com/Bodmer) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^End^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/libraries/lv_conf.h b/libraries/lv_conf.h new file mode 100644 index 0000000..38683e7 --- /dev/null +++ b/libraries/lv_conf.h @@ -0,0 +1,987 @@ +/** + * @file lv_conf.h + * Configuration file for v9.1.0 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 //0 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +//#define LV_SQUARELINE_MOD__SWIPE 1 //if defined or 1, reverts back to LVGL8.3 swipe-gesture behaviour (LVGL-9.1 abandons swipe too early if it finds/leaves a new object in the swipe-path) + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#define LV_COLOR_DEPTH 16 //16 + +#define LV_COLOR_16_SWAP 0 //(LV_COLOR_16_SWAP is abandoned by LVGL9, but lv_draw_sw_rgb565_swap() is added to display flush function) + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_CLIB //LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (128 * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 30 //33 /*[ms]*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_NONE + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/*The target buffer size for simple layer chunks.*/ +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Use Arm-2D to accelerate the sw render */ + //#define LV_USE_DRAW_ARM2D_SYNC 0 + + /* Enable native helium assembly to be compiled */ + //#define LV_USE_NATIVE_HELIUM_ASM 0 + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif + +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#define LV_USE_DRAW_VGLITE 0 + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +/* Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_DRAW_PXP 0 + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/* Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 + +/* Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 + +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +//#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +//#define LV_VG_LITE_USE_BOX_SHADOW 0 + +/* VG-Lite gradient image maximum cache number. + * NOTE: The memory usage of a single gradient image is 4K bytes. + */ +//#define LV_VG_LITE_GRAD_CACHE_SIZE 32 + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 1 //0 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#define LV_CACHE_DEF_SIZE 0 + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Buffer address alignment*/ + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 //if enabled, might give a warning about an uninitialized length variable in lv_label.c +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_SIMPLE 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER 'A' //'\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "drive/" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*API for LittleFs. */ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*LODEPNG decoder library*/ +#define LV_USE_LODEPNG 0 + +/*PNG decoder(libpng) library*/ +#define LV_USE_LIBPNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_TJPGD 0 + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 1 //0 +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/*RLE decompress library*/ +#define LV_USE_RLE 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*Barcode code library*/ +#define LV_USE_BARCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. + *The higher the value, the more memory will be used.*/ + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*Enable Vector Graphic APIs*/ +#define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#define LV_USE_THORVG_EXTERNAL 0 + +/*Use lvgl built-in LZ4 lib*/ +#define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +#define LV_USE_LZ4_EXTERNAL 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 1 //0 +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 //0 //1 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ +#endif + +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for /dev/dri/card*/ +#define LV_USE_LINUX_DRM 0 + +/*Interface for TFT_eSPI*/ +#define LV_USE_TFT_ESPI 0 //use? + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/* LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 0 //1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*Flex layout demo*/ +#define LV_USE_DEMO_FLEX_LAYOUT 0 + +/*Smart-phone like multi-language demo*/ +#define LV_USE_DEMO_MULTILANG 0 + +/*Widget transformation demo*/ +#define LV_USE_DEMO_TRANSFORM 0 + +/*Demonstrate scroll settings*/ +#define LV_USE_DEMO_SCROLL 0 + +/*Vector graphic demo*/ +#define LV_USE_DEMO_VECTOR_GRAPHIC 0 +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/libraries/lvgl/.typos.toml b/libraries/lvgl/.typos.toml new file mode 100644 index 0000000..4c49470 --- /dev/null +++ b/libraries/lvgl/.typos.toml @@ -0,0 +1,27 @@ +[files] +extend-exclude = [ + ".git/", + "docs/_static/css/fontawesome.min.css", + "docs/README_*", + "src/libs/", +] +ignore-hidden = false + +[default] +extend-ignore-re = [ + "\\bser[^a-z]", + "\\bfle[^a-z]", + '"Lorem ipsum .*"', + "Nam consectetur", + "U\\+[0-9A-F]{4}", + '\{ "[a-z]+", "[^ -~]+" \},', + "`[0-9a-f]{7} `__", + "Rename lv_chart_clear_serie", + "rename LV_ROLLER_MODE_INIFINITE", + "CARD_INFO_SET\\(&img_multilang_avatar_.*\\)", + "ACI\\)", +] + +[default.extend-words] +# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6loca.html +"loca" = "loca" diff --git a/libraries/lvgl/CMakeLists.txt b/libraries/lvgl/CMakeLists.txt new file mode 100644 index 0000000..cf73652 --- /dev/null +++ b/libraries/lvgl/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 3.12.4) + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + +if(NOT ESP_PLATFORM) + project(lvgl LANGUAGES C CXX ASM HOMEPAGE_URL https://github.com/lvgl/lvgl) +endif() + +set(LVGL_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}) + +if(ESP_PLATFORM) + include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/esp.cmake) +elseif(ZEPHYR_BASE) + include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/zephyr.cmake) +elseif(MICROPY_DIR) + include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/micropython.cmake) +else() + include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/custom.cmake) +endif() + +#[[ + unfortunately CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS does not work for global data. + for global data we still need decl specs. + Check out the docs to learn more about the limitations of CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS + https://cmake.org/cmake/help/latest/prop_tgt/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS + + For all compiled sources within the library (i.e. basically all lvgl files) we need to use dllexport. + For all compiled sources from outside the library (i.e. files which include lvgl headers) we need to use dllimport. + We can do this by using CMakes INTERFACE and PRIVATE keyword. + ]] +if (MSVC) + target_compile_definitions(lvgl + INTERFACE LV_ATTRIBUTE_EXTERN_DATA=__declspec\(dllimport\) + PRIVATE LV_ATTRIBUTE_EXTERN_DATA=__declspec\(dllexport\) + ) +endif() \ No newline at end of file diff --git a/libraries/lvgl/CMakePresets.json b/libraries/lvgl/CMakePresets.json new file mode 100644 index 0000000..bd4ff3a --- /dev/null +++ b/libraries/lvgl/CMakePresets.json @@ -0,0 +1,116 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "_base", + "hidden": true, + "cacheVariables": { + "LV_CONF_SKIP": true + } + }, + { + "name": "windows-base", + "inherits": "_base", + "generator": "Visual Studio 17 2022", + "binaryDir": "${sourceDir}/build/${presetName}", + "installDir": "${sourceDir}/build/install/${presetName}", + "cacheVariables": { + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "BUILD_SHARED_LIBS": "ON" + }, + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Windows" + }, + "architecture": { + "value": "x64", + "strategy": "external" + } + }, + { + "name": "linux-base", + "inherits": "_base", + "displayName": "Linux", + "description": "Setup WSL or native linux", + "generator": "Ninja Multi-Config", + "binaryDir": "${sourceDir}/build/${presetName}", + "installDir": "${sourceDir}/build/${presetName}", + "condition": { + "type": "equals", + "lhs": "${hostSystemName}", + "rhs": "Linux" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + }, + "cacheVariables": { + "BUILD_SHARED_LIBS": "ON" + } + } + ], + "buildPresets": [ + { + "name": "_base", + "hidden": true, + "jobs": 12 + }, + { + "name": "windows-base_dbg", + "inherits": "_base", + "displayName": "Debug", + "configurePreset": "windows-base", + "configuration": "Debug" + }, + { + "name": "windows-base_rel", + "inherits": "_base", + "displayName": "Release", + "configurePreset": "windows-base", + "configuration": "Release" + }, + { + "name": "linux-base_dbg", + "inherits": "_base", + "displayName": "Debug", + "configurePreset": "linux-base", + "configuration": "Debug" + }, + { + "name": "linux-base_rel", + "inherits": "_base", + "displayName": "Release", + "configurePreset": "linux-base", + "configuration": "Release" + } + ], + "testPresets": [ + { + "name": "windows-base_dbg", + "displayName": "Debug", + "configurePreset": "windows-base", + "configuration": "Debug" + }, + { + "name": "windows-base_rel", + "displayName": "Release", + "configurePreset": "windows-base", + "configuration": "Release" + }, + { + "name": "linux-base_dbg", + "displayName": "Debug", + "configurePreset": "linux-base", + "configuration": "Debug" + }, + { + "name": "linux-base_rel", + "displayName": "Release", + "configurePreset": "linux-base", + "configuration": "Release" + } + ] +} diff --git a/libraries/lvgl/Kconfig b/libraries/lvgl/Kconfig new file mode 100644 index 0000000..098cdb7 --- /dev/null +++ b/libraries/lvgl/Kconfig @@ -0,0 +1,1628 @@ +# Kconfig file for LVGL v9.1.0 + +menu "LVGL configuration" + + # Define CONFIG_LV_CONF_SKIP so we can use LVGL + # without lv_conf.h file, the lv_conf_internal.h and + # lv_conf_kconfig.h files are used instead. + config LV_CONF_SKIP + bool "Check this to not use custom lv_conf.h" + default y + + config LV_CONF_MINIMAL + bool "LVGL minimal configuration" + + menu "Color Settings" + choice LV_COLOR_DEPTH + prompt "Color depth" + default LV_COLOR_DEPTH_16 + help + Color depth to be used. + + config LV_COLOR_DEPTH_32 + bool "32: XRGB8888" + config LV_COLOR_DEPTH_24 + bool "24: RGB888" + config LV_COLOR_DEPTH_16 + bool "16: RGB565" + config LV_COLOR_DEPTH_8 + bool "8: RGB232" + config LV_COLOR_DEPTH_1 + bool "1: 1 byte per pixel" + endchoice + + config LV_COLOR_DEPTH + int + default 1 if LV_COLOR_DEPTH_1 + default 8 if LV_COLOR_DEPTH_8 + default 16 if LV_COLOR_DEPTH_16 + default 24 if LV_COLOR_DEPTH_24 + default 32 if LV_COLOR_DEPTH_32 + endmenu + + menu "Memory Settings" + choice + prompt "Malloc functions source" + default LV_USE_BUILTIN_MALLOC + + config LV_USE_BUILTIN_MALLOC + bool "LVGL's built in implementation" + + config LV_USE_CLIB_MALLOC + bool "Standard C functions malloc/realloc/free" + + config LV_USE_MICROPYTHON_MALLOC + bool "MicroPython functions malloc/realloc/free" + + config LV_USE_RTTHREAD_MALLOC + bool "RTThread functions malloc/realloc/free" + + config LV_USE_CUSTOM_MALLOC + bool "Implement the functions externally" + + endchoice # "Malloc functions" + + choice + prompt "String functions source" + default LV_USE_BUILTIN_STRING + + config LV_USE_BUILTIN_STRING + bool "LVGL's built in implementation" + + config LV_USE_CLIB_STRING + bool "Standard C functions memcpy/memset/strlen/strcpy" + + config LV_USE_CUSTOM_STRING + bool "Implement the functions externally" + + endchoice # "String functions" + + choice + prompt "Sprintf functions source" + default LV_USE_BUILTIN_SPRINTF + + config LV_USE_BUILTIN_SPRINTF + bool "LVGL's built in implementation" + + config LV_USE_CLIB_SPRINTF + bool "Standard C functions vsnprintf" + + config LV_USE_CUSTOM_SPRINTF + bool "Implement the functions externally" + + endchoice # "Sprintf functions" + + config LV_MEM_SIZE_KILOBYTES + int "Size of the memory used by `lv_malloc()` in kilobytes (>= 2kB)" + default 64 + depends on LV_USE_BUILTIN_MALLOC + + config LV_MEM_POOL_EXPAND_SIZE_KILOBYTES + int "Size of the memory expand for `lv_malloc()` in kilobytes" + default 0 + depends on LV_USE_BUILTIN_MALLOC + + config LV_MEM_ADR + hex "Address for the memory pool instead of allocating it as a normal array" + default 0x0 + depends on LV_USE_BUILTIN_MALLOC + + endmenu + + menu "HAL Settings" + config LV_DEF_REFR_PERIOD + int "Default refresh period (ms)" + default 33 + help + Default display refresh, input device read and animation step period. + + config LV_DPI_DEF + int "Default Dots Per Inch (in px/inch)" + default 130 + help + Used to initialize default sizes such as widgets sized, style paddings. + (Not so important, you can adjust it to modify default sizes and spaces) + endmenu + + menu "Operating System (OS)" + choice LV_USE_OS + prompt "Default operating system to use" + default LV_OS_NONE + + config LV_OS_NONE + bool "0: NONE" + config LV_OS_PTHREAD + bool "1: PTHREAD" + config LV_OS_FREERTOS + bool "2: FREERTOS" + config LV_OS_CMSIS_RTOS2 + bool "3: CMSIS_RTOS2" + config LV_OS_RTTHREAD + bool "4: RTTHREAD" + config LV_OS_WINDOWS + bool "5: WINDOWS" + config LV_OS_CUSTOM + bool "255: CUSTOM" + endchoice + + config LV_USE_OS + int + default 0 if LV_OS_NONE + default 1 if LV_OS_PTHREAD + default 2 if LV_OS_FREERTOS + default 3 if LV_OS_CMSIS_RTOS2 + default 4 if LV_OS_RTTHREAD + default 5 if LV_OS_WINDOWS + default 255 if LV_OS_CUSTOM + + config LV_OS_CUSTOM_INCLUDE + string "Custom OS include header" + default "stdint.h" + depends on LV_OS_CUSTOM + endmenu + + menu "Rendering Configuration" + config LV_DRAW_BUF_STRIDE_ALIGN + int "Buffer stride alignment" + default 1 + help + Align the stride of all layers and images to this bytes. + + config LV_DRAW_BUF_ALIGN + int "Buffer address alignment" + default 4 + help + Align the start address of draw_buf addresses to this bytes. + + config LV_DRAW_LAYER_SIMPLE_BUF_SIZE + int "Optimal size to buffer the widget with opacity" + default 24576 + depends on LV_USE_DRAW_SW + help + If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers and can't be drawn in chunks. + + config LV_USE_DRAW_SW + bool "Enable software rendering" + default y + help + Required to draw anything on the screen. + + config LV_DRAW_SW_DRAW_UNIT_CNT + int "Number of draw units" + default 1 + depends on LV_USE_DRAW_SW + help + > 1 requires an operating system enabled in `LV_USE_OS` + > 1 means multiply threads will render the screen in parallel + + config LV_USE_DRAW_ARM2D_SYNC + bool "Enable Arm's 2D image processing library (Arm-2D) for all Cortex-M processors" + default n + depends on LV_USE_DRAW_SW + help + Must deploy arm-2d library to your project and add include PATH for "arm_2d.h". + + config LV_USE_NATIVE_HELIUM_ASM + bool "Enable native helium assembly" + default y + depends on LV_USE_DRAW_SW + help + Disabling this allows arm2d to work on its own (for testing only) + + config LV_DRAW_SW_COMPLEX + bool "Enable complex draw engine" + default y + depends on LV_USE_DRAW_SW + help + 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only, + 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too. + + config LV_DRAW_SW_SHADOW_CACHE_SIZE + int "Allow buffering some shadow calculation" + depends on LV_DRAW_SW_COMPLEX + default 0 + help + LV_DRAW_SW_SHADOW_CACHE_SIZE is the max shadow size to buffer, where + shadow size is `shadow_width + radius`. + Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost. + + config LV_DRAW_SW_CIRCLE_CACHE_SIZE + int "Set number of maximally cached circle data" + depends on LV_DRAW_SW_COMPLEX + default 4 + help + The circumference of 1/4 circle are saved for anti-aliasing + radius * 4 bytes are used per circle (the most often used + radiuses are saved). + Set to 0 to disable caching. + + choice LV_USE_DRAW_SW_ASM + prompt "Asm mode in sw draw" + default LV_DRAW_SW_ASM_NONE + depends on LV_USE_DRAW_SW + help + ASM mode to be used + + config LV_DRAW_SW_ASM_NONE + bool "0: NONE" + config LV_DRAW_SW_ASM_NEON + bool "1: NEON" + config LV_DRAW_SW_ASM_HELIUM + bool "2: HELIUM" + config LV_DRAW_SW_ASM_CUSTOM + bool "255: CUSTOM" + endchoice + + config LV_USE_DRAW_SW_ASM + int + default 0 if LV_DRAW_SW_ASM_NONE + default 1 if LV_DRAW_SW_ASM_NEON + default 2 if LV_DRAW_SW_ASM_HELIUM + default 255 if LV_DRAW_SW_ASM_CUSTOM + + config LV_DRAW_SW_ASM_CUSTOM_INCLUDE + string "Set the custom asm include file" + default "" + depends on LV_DRAW_SW_ASM_CUSTOM + + config LV_USE_DRAW_VGLITE + bool "Use NXP's VG-Lite GPU on iMX RTxxx platforms" + default n + + config LV_USE_VGLITE_BLIT_SPLIT + bool "Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels" + depends on LV_USE_DRAW_VGLITE + default n + + config LV_USE_VGLITE_DRAW_ASYNC + bool "Enable VGLite draw async" + depends on LV_USE_DRAW_VGLITE && LV_USE_OS > 0 + default y + help + Queue multiple tasks and flash them once to the GPU. + + config LV_USE_VGLITE_ASSERT + bool "Enable VGLite asserts" + default n + depends on LV_USE_DRAW_VGLITE + + config LV_USE_DRAW_PXP + bool "Use NXP's PXP on iMX RTxxx platforms" + default n + + config LV_USE_PXP_ASSERT + bool "Enable PXP asserts" + default n + depends on LV_USE_DRAW_PXP + + config LV_USE_DRAW_DAVE2D + bool "Use Renesas Dave2D on RA platforms" + default n + + config LV_USE_DRAW_SDL + bool "Draw using cached SDL textures" + default n + help + Uses SDL renderer API + + config LV_USE_DRAW_VG_LITE + bool "Use VG-Lite GPU" + + config LV_VG_LITE_USE_GPU_INIT + bool "Enable VG-Lite custom external 'gpu_init()' function" + default n + depends on LV_USE_DRAW_VG_LITE + + config LV_VG_LITE_USE_ASSERT + bool "Enable VG-Lite assert" + default n + depends on LV_USE_DRAW_VG_LITE + + config LV_VG_LITE_FLUSH_MAX_COUNT + int "VG-Lite flush commit trigger threshold" + default 8 + depends on LV_USE_DRAW_VG_LITE + help + GPU will try to batch these many draw tasks + + config LV_VG_LITE_USE_BOX_SHADOW + bool "Enable border to simulate shadow" + default n + depends on LV_USE_DRAW_VG_LITE + help + which usually improves performance, + but does not guarantee the same rendering quality as the software. + + config LV_USE_VECTOR_GRAPHIC + bool "Use Vector Graphic APIs" + default n + help + Enable drawing support vector graphic APIs. + endmenu + + menu "Feature Configuration" + menu "Logging" + config LV_USE_LOG + bool "Enable the log module" + + choice + bool "Default log verbosity" if LV_USE_LOG + default LV_LOG_LEVEL_WARN + help + Specify how important log should be added. + + config LV_LOG_LEVEL_TRACE + bool "A lot of logs to give detailed information" + config LV_LOG_LEVEL_INFO + bool "Log important events" + config LV_LOG_LEVEL_WARN + bool "Log if something unwanted happened but didn't cause a problem" + config LV_LOG_LEVEL_ERROR + bool "Only critical issues, when the system may fail" + config LV_LOG_LEVEL_USER + bool "Only logs added by the user" + config LV_LOG_LEVEL_NONE + bool "Do not log anything" + endchoice + + config LV_LOG_LEVEL + int + default 0 if LV_LOG_LEVEL_TRACE + default 1 if LV_LOG_LEVEL_INFO + default 2 if LV_LOG_LEVEL_WARN + default 3 if LV_LOG_LEVEL_ERROR + default 4 if LV_LOG_LEVEL_USER + default 5 if LV_LOG_LEVEL_NONE + + config LV_LOG_PRINTF + bool "Print the log with 'printf'" if LV_USE_LOG + help + Use printf for log output. + If not set the user needs to register a callback with `lv_log_register_print_cb`. + + config LV_LOG_USE_TIMESTAMP + bool "Enable print timestamp" + default y + depends on LV_USE_LOG + + config LV_LOG_USE_FILE_LINE + bool "Enable print file and line number" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_MEM + bool "Enable/Disable LV_LOG_TRACE in mem module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_TIMER + bool "Enable/Disable LV_LOG_TRACE in timer module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_INDEV + bool "Enable/Disable LV_LOG_TRACE in indev module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_DISP_REFR + bool "Enable/Disable LV_LOG_TRACE in disp refr module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_EVENT + bool "Enable/Disable LV_LOG_TRACE in event module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_OBJ_CREATE + bool "Enable/Disable LV_LOG_TRACE in obj create module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_LAYOUT + bool "Enable/Disable LV_LOG_TRACE in layout module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_ANIM + bool "Enable/Disable LV_LOG_TRACE in anim module" + default y + depends on LV_USE_LOG + + config LV_LOG_TRACE_CACHE + bool "Enable/Disable LV_LOG_TRACE in cache module" + default y + depends on LV_USE_LOG + endmenu + + menu "Asserts" + config LV_USE_ASSERT_NULL + bool "Check if the parameter is NULL. (Very fast, recommended)" + default y if !LV_CONF_MINIMAL + + config LV_USE_ASSERT_MALLOC + bool "Checks if the memory is successfully allocated or no. (Very fast, recommended)" + default y if !LV_CONF_MINIMAL + + config LV_USE_ASSERT_STYLE + bool "Check if the styles are properly initialized. (Very fast, recommended)" + + config LV_USE_ASSERT_MEM_INTEGRITY + bool "Check the integrity of `lv_mem` after critical operations. (Slow)" + + config LV_USE_ASSERT_OBJ + bool "Check NULL, the object's type and existence (e.g. not deleted). (Slow)" + + config LV_ASSERT_HANDLER_INCLUDE + string "Header to include for the custom assert function" + default "assert.h" + help + Add a custom handler when assert happens e.g. to restart the MCU + endmenu + + menu "Debug" + config LV_USE_REFR_DEBUG + bool "Draw random colored rectangles over the redrawn areas" + + config LV_USE_LAYER_DEBUG + bool "Draw a red overlay for ARGB layers and a green overlay for RGB layers" + + config LV_USE_PARALLEL_DRAW_DEBUG + bool "Draw overlays with different colors for each draw_unit's tasks" + help + Also add the index number of the draw unit on white background. + For layers add the index number of the draw unit on black background. + endmenu + + menu "Others" + config LV_ENABLE_GLOBAL_CUSTOM + bool "Enable 'lv_global' customization" + + config LV_GLOBAL_CUSTOM_INCLUDE + string "Header to include for the custom 'lv_global' function" + depends on LV_ENABLE_GLOBAL_CUSTOM + default "lv_global.h" + + config LV_CACHE_DEF_SIZE + int "Default image cache size. 0 to disable caching" + default 0 + depends on LV_USE_DRAW_SW + help + If only the built-in image formats are used there is no real advantage of caching. + (I.e. no new image decoder is added). + + With complex image decoders (e.g. PNG or JPG) caching can + save the continuous open/decode of images. + However the opened images might consume additional RAM. + + config LV_IMAGE_HEADER_CACHE_DEF_CNT + int "Default image header cache count. 0 to disable caching" + default 0 + depends on LV_USE_DRAW_SW + help + If only the built-in image formats are used there is no real advantage of caching. + (I.e. no new image decoder is added). + + With complex image decoders (e.g. PNG or JPG) caching can + save the continuous getting header information of images. + However the records of opened images headers might consume additional RAM. + + config LV_GRADIENT_MAX_STOPS + int "Number of stops allowed per gradient" + default 2 + depends on LV_USE_DRAW_SW + help + Increase this to allow more stops. + This adds (sizeof(lv_color_t) + 1) bytes per additional stop + + config LV_COLOR_MIX_ROUND_OFS + int "Adjust color mix functions rounding" + default 128 if !LV_COLOR_DEPTH_32 + default 0 if LV_COLOR_DEPTH_32 + range 0 254 + help + 0: no adjustment, get the integer part of the result (round down) + 64: round up from x.75 + 128: round up from half + 192: round up from x.25 + 254: round up + + config LV_OBJ_STYLE_CACHE + bool "Use cache to speed up getting object style properties" + default n + help + Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties + + config LV_USE_OBJ_ID + bool "Add id field to obj" + default n + + config LV_USE_OBJ_ID_BUILTIN + bool "Use builtin method to deal with obj ID" + default n + + config LV_USE_OBJ_PROPERTY + bool "Use obj property set/get API" + default n + + config LV_USE_VG_LITE_THORVG + bool "VG-Lite Simulator" + default n + depends on LV_USE_THORVG + help + Use thorvg to simulate VG-Lite hardware behavior, it's useful + for debugging and testing on PC simulator. Enable LV_USE_THORVG, + Either internal ThorVG or external ThorVG library is required. + + config LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + bool "Enable LVGL blend mode support" + default n + depends on LV_USE_VG_LITE_THORVG + + config LV_VG_LITE_THORVG_YUV_SUPPORT + bool "Enable YUV color format support" + default n + depends on LV_USE_VG_LITE_THORVG + + config LV_VG_LITE_THORVG_16PIXELS_ALIGN + bool "Enable 16 pixels alignment" + default y + depends on LV_USE_VG_LITE_THORVG + + config LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + int "Buffer address alignment" + default 64 + depends on LV_USE_VG_LITE_THORVG + + config LV_VG_LITE_THORVG_THREAD_RENDER + bool "Enable multi-thread render" + default n + depends on LV_USE_VG_LITE_THORVG + endmenu + endmenu + + menu "Compiler Settings" + config LV_BIG_ENDIAN_SYSTEM + bool "For big endian systems set to 1" + + config LV_ATTRIBUTE_MEM_ALIGN_SIZE + int "Required alignment size for buffers" + default 1 + + config LV_ATTRIBUTE_FAST_MEM_USE_IRAM + bool "Set IRAM as LV_ATTRIBUTE_FAST_MEM" + help + Set this option to configure IRAM as LV_ATTRIBUTE_FAST_MEM + + config LV_USE_FLOAT + bool "Use float as lv_value_precise_t" + default n + endmenu + + menu "Font Usage" + menu "Enable built-in fonts" + config LV_FONT_MONTSERRAT_8 + bool "Enable Montserrat 8" + config LV_FONT_MONTSERRAT_10 + bool "Enable Montserrat 10" + config LV_FONT_MONTSERRAT_12 + bool "Enable Montserrat 12" + config LV_FONT_MONTSERRAT_14 + bool "Enable Montserrat 14" + default y if !LV_CONF_MINIMAL + config LV_FONT_MONTSERRAT_16 + bool "Enable Montserrat 16" + config LV_FONT_MONTSERRAT_18 + bool "Enable Montserrat 18" + config LV_FONT_MONTSERRAT_20 + bool "Enable Montserrat 20" + config LV_FONT_MONTSERRAT_22 + bool "Enable Montserrat 22" + config LV_FONT_MONTSERRAT_24 + bool "Enable Montserrat 24" + config LV_FONT_MONTSERRAT_26 + bool "Enable Montserrat 26" + config LV_FONT_MONTSERRAT_28 + bool "Enable Montserrat 28" + config LV_FONT_MONTSERRAT_30 + bool "Enable Montserrat 30" + config LV_FONT_MONTSERRAT_32 + bool "Enable Montserrat 32" + config LV_FONT_MONTSERRAT_34 + bool "Enable Montserrat 34" + config LV_FONT_MONTSERRAT_36 + bool "Enable Montserrat 36" + config LV_FONT_MONTSERRAT_38 + bool "Enable Montserrat 38" + config LV_FONT_MONTSERRAT_40 + bool "Enable Montserrat 40" + config LV_FONT_MONTSERRAT_42 + bool "Enable Montserrat 42" + config LV_FONT_MONTSERRAT_44 + bool "Enable Montserrat 44" + config LV_FONT_MONTSERRAT_46 + bool "Enable Montserrat 46" + config LV_FONT_MONTSERRAT_48 + bool "Enable Montserrat 48" + + config LV_FONT_MONTSERRAT_28_COMPRESSED + bool "Enable Montserrat 28 compressed" + config LV_FONT_DEJAVU_16_PERSIAN_HEBREW + bool "Enable Dejavu 16 Persian, Hebrew, Arabic letters" + config LV_FONT_SIMSUN_16_CJK + bool "Enable Simsun 16 CJK" + + config LV_FONT_UNSCII_8 + bool "Enable UNSCII 8 (Perfect monospace font)" + default y if LV_CONF_MINIMAL + config LV_FONT_UNSCII_16 + bool "Enable UNSCII 16 (Perfect monospace font)" + endmenu + + choice LV_FONT_DEFAULT + prompt "Select theme default title font" + default LV_FONT_DEFAULT_MONTSERRAT_14 if !LV_CONF_MINIMAL + default LV_FONT_DEFAULT_UNSCII_8 if LV_CONF_MINIMAL + help + Select theme default title font + + config LV_FONT_DEFAULT_MONTSERRAT_8 + bool "Montserrat 8" + select LV_FONT_MONTSERRAT_8 + config LV_FONT_DEFAULT_MONTSERRAT_12 + bool "Montserrat 12" + select LV_FONT_MONTSERRAT_12 + config LV_FONT_DEFAULT_MONTSERRAT_14 + bool "Montserrat 14" + select LV_FONT_MONTSERRAT_14 + config LV_FONT_DEFAULT_MONTSERRAT_16 + bool "Montserrat 16" + select LV_FONT_MONTSERRAT_16 + config LV_FONT_DEFAULT_MONTSERRAT_18 + bool "Montserrat 18" + select LV_FONT_MONTSERRAT_18 + config LV_FONT_DEFAULT_MONTSERRAT_20 + bool "Montserrat 20" + select LV_FONT_MONTSERRAT_20 + config LV_FONT_DEFAULT_MONTSERRAT_22 + bool "Montserrat 22" + select LV_FONT_MONTSERRAT_22 + config LV_FONT_DEFAULT_MONTSERRAT_24 + bool "Montserrat 24" + select LV_FONT_MONTSERRAT_24 + config LV_FONT_DEFAULT_MONTSERRAT_26 + bool "Montserrat 26" + select LV_FONT_MONTSERRAT_26 + config LV_FONT_DEFAULT_MONTSERRAT_28 + bool "Montserrat 28" + select LV_FONT_MONTSERRAT_28 + config LV_FONT_DEFAULT_MONTSERRAT_30 + bool "Montserrat 30" + select LV_FONT_MONTSERRAT_30 + config LV_FONT_DEFAULT_MONTSERRAT_32 + bool "Montserrat 32" + select LV_FONT_MONTSERRAT_32 + config LV_FONT_DEFAULT_MONTSERRAT_34 + bool "Montserrat 34" + select LV_FONT_MONTSERRAT_34 + config LV_FONT_DEFAULT_MONTSERRAT_36 + bool "Montserrat 36" + select LV_FONT_MONTSERRAT_36 + config LV_FONT_DEFAULT_MONTSERRAT_38 + bool "Montserrat 38" + select LV_FONT_MONTSERRAT_38 + config LV_FONT_DEFAULT_MONTSERRAT_40 + bool "Montserrat 40" + select LV_FONT_MONTSERRAT_40 + config LV_FONT_DEFAULT_MONTSERRAT_42 + bool "Montserrat 42" + select LV_FONT_MONTSERRAT_42 + config LV_FONT_DEFAULT_MONTSERRAT_44 + bool "Montserrat 44" + select LV_FONT_MONTSERRAT_44 + config LV_FONT_DEFAULT_MONTSERRAT_46 + bool "Montserrat 46" + select LV_FONT_MONTSERRAT_46 + config LV_FONT_DEFAULT_MONTSERRAT_48 + bool "Montserrat 48" + select LV_FONT_MONTSERRAT_48 + config LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED + bool "Montserrat 28 compressed" + select LV_FONT_MONTSERRAT_28_COMPRESSED + config LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW + bool "Dejavu 16 Persian, Hebrew, Arabic letters" + select LV_FONT_DEJAVU_16_PERSIAN_HEBREW + config LV_FONT_DEFAULT_SIMSUN_16_CJK + bool "Simsun 16 CJK" + select LV_FONT_SIMSUN_16_CJK + config LV_FONT_DEFAULT_UNSCII_8 + bool "UNSCII 8 (Perfect monospace font)" + select LV_FONT_UNSCII_8 + config LV_FONT_DEFAULT_UNSCII_16 + bool "UNSCII 16 (Perfect monospace font)" + select LV_FONT_UNSCII_16 + endchoice + + config LV_FONT_FMT_TXT_LARGE + bool "Enable it if you have fonts with a lot of characters" + help + The limit depends on the font size, font face and format + but with > 10,000 characters if you see issues probably you + need to enable it. + + config LV_USE_FONT_COMPRESSED + bool "Sets support for compressed fonts" + + config LV_USE_FONT_PLACEHOLDER + bool "Enable drawing placeholders when glyph dsc is not found" + default y + endmenu + + menu "Text Settings" + choice LV_TXT_ENC + prompt "Select a character encoding for strings" + help + Select a character encoding for strings. Your IDE or editor should have the same character encoding. + default LV_TXT_ENC_UTF8 if !LV_CONF_MINIMAL + default LV_TXT_ENC_ASCII if LV_CONF_MINIMAL + + config LV_TXT_ENC_UTF8 + bool "UTF8" + config LV_TXT_ENC_ASCII + bool "ASCII" + endchoice + + config LV_TXT_BREAK_CHARS + string "Can break (wrap) texts on these chars" + default " ,.;:-_)]}" + + config LV_TXT_LINE_BREAK_LONG_LEN + int "Line break long length" + default 0 + help + If a word is at least this long, will break wherever 'prettiest'. + To disable, set to a value <= 0. + + config LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + int "Min num chars before break" + default 3 + depends on LV_TXT_LINE_BREAK_LONG_LEN > 0 + help + Minimum number of characters in a long word to put on a line before a break. + + config LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + int "Min num chars after break" + default 3 + depends on LV_TXT_LINE_BREAK_LONG_LEN > 0 + help + Minimum number of characters in a long word to put on a line after a break + + config LV_USE_BIDI + bool "Support bidirectional texts" + help + Allows mixing Left-to-Right and Right-to-Left texts. + The direction will be processed according to the Unicode Bidirectional Algorithm: + https://www.w3.org/International/articles/inline-bidi-markup/uba-basics + + choice + prompt "Set the default BIDI direction" + default LV_BIDI_DIR_AUTO + depends on LV_USE_BIDI + + config LV_BIDI_DIR_LTR + bool "Left-to-Right" + config LV_BIDI_DIR_RTL + bool "Right-to-Left" + config LV_BIDI_DIR_AUTO + bool "Detect texts base direction" + endchoice + + config LV_USE_ARABIC_PERSIAN_CHARS + bool "Enable Arabic/Persian processing" + help + In these languages characters should be replaced with + an other form based on their position in the text. + endmenu + + menu "Widget Usage" + config LV_WIDGETS_HAS_DEFAULT_VALUE + bool "Widgets has default value" + default y if !LV_CONF_MINIMAL + config LV_USE_ANIMIMG + bool "Anim image" + default y if !LV_CONF_MINIMAL + config LV_USE_ARC + bool "Arc" + default y if !LV_CONF_MINIMAL + config LV_USE_BAR + bool "Bar" + default y if !LV_CONF_MINIMAL + config LV_USE_BUTTON + bool "Button" + default y if !LV_CONF_MINIMAL + config LV_USE_BUTTONMATRIX + bool "Button matrix" + default y if !LV_CONF_MINIMAL + config LV_USE_CALENDAR + bool "Calendar" + default y if !LV_CONF_MINIMAL + config LV_CALENDAR_WEEK_STARTS_MONDAY + bool "Calendar week starts monday" + depends on LV_USE_CALENDAR + config LV_USE_CALENDAR_HEADER_ARROW + bool "Use calendar header arrow" + depends on LV_USE_CALENDAR + default y + config LV_USE_CALENDAR_HEADER_DROPDOWN + bool "Use calendar header dropdown" + depends on LV_USE_CALENDAR + default y + config LV_USE_CANVAS + bool "Canvas. Requires: lv_image" + imply LV_USE_IMAGE + default y if !LV_CONF_MINIMAL + config LV_USE_CHART + bool "Chart" + default y if !LV_CONF_MINIMAL + config LV_USE_CHECKBOX + bool "Check Box" + default y if !LV_CONF_MINIMAL + config LV_USE_DROPDOWN + bool "Drop down list. Requires: lv_label" + imply LV_USE_LABEL + default y if !LV_CONF_MINIMAL + config LV_USE_IMAGE + bool "Image. Requires: lv_label" + imply LV_USE_LABEL + default y if !LV_CONF_MINIMAL + config LV_USE_IMAGEBUTTON + bool "ImageButton" + default y if !LV_CONF_MINIMAL + config LV_USE_KEYBOARD + bool "Keyboard" + default y if !LV_CONF_MINIMAL + config LV_USE_LABEL + bool "Label" + default y if !LV_CONF_MINIMAL + config LV_LABEL_TEXT_SELECTION + bool "Enable selecting text of the label" + depends on LV_USE_LABEL + default y + config LV_LABEL_LONG_TXT_HINT + bool "Store extra some info in labels (12 bytes) to speed up drawing of very long texts" + depends on LV_USE_LABEL + default y + config LV_LABEL_WAIT_CHAR_COUNT + int "The count of wait chart" + depends on LV_USE_LABEL + default 3 + config LV_USE_LED + bool "LED" + default y if !LV_CONF_MINIMAL + config LV_USE_LINE + bool "Line" + default y if !LV_CONF_MINIMAL + config LV_USE_LIST + bool "List" + default y if !LV_CONF_MINIMAL + config LV_USE_MENU + bool "Menu" + default y if !LV_CONF_MINIMAL + config LV_USE_MSGBOX + bool "Msgbox" + default y if !LV_CONF_MINIMAL + config LV_USE_OBSERVER + bool "Observer" + default n + config LV_USE_ROLLER + bool "Roller. Requires: lv_label" + imply LV_USE_LABEL + default y if !LV_CONF_MINIMAL + config LV_USE_SCALE + bool "Scale" + default y if !LV_CONF_MINIMAL + config LV_USE_SLIDER + bool "Slider. Requires: lv_bar" + imply LV_USE_BAR + default y if !LV_CONF_MINIMAL + config LV_USE_SPAN + bool "Span" + default y if !LV_CONF_MINIMAL + config LV_SPAN_SNIPPET_STACK_SIZE + int "Maximum number of span descriptor" + default 64 + depends on LV_USE_SPAN + config LV_USE_SPINBOX + bool "Spinbox" + default y if !LV_CONF_MINIMAL + config LV_USE_SPINNER + bool "Spinner" + default y if !LV_CONF_MINIMAL + config LV_USE_SWITCH + bool "Switch" + default y if !LV_CONF_MINIMAL + config LV_USE_TEXTAREA + bool "Text area. Requires: lv_label" + select LV_USE_LABEL + default y if !LV_CONF_MINIMAL + config LV_TEXTAREA_DEF_PWD_SHOW_TIME + int "Text area def. pwd show time [ms]" + default 1500 + depends on LV_USE_TEXTAREA + config LV_USE_TABLE + bool "Table" + default y if !LV_CONF_MINIMAL + config LV_USE_TABVIEW + bool "Tabview" + default y if !LV_CONF_MINIMAL + config LV_USE_TILEVIEW + bool "Tileview" + default y if !LV_CONF_MINIMAL + config LV_USE_WIN + bool "Win" + default y if !LV_CONF_MINIMAL + endmenu + + menu "Themes" + config LV_USE_THEME_DEFAULT + bool "A simple, impressive and very complete theme" + default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL + config LV_THEME_DEFAULT_DARK + bool "Yes to set dark mode, No to set light mode" + depends on LV_USE_THEME_DEFAULT + config LV_THEME_DEFAULT_GROW + bool "Enable grow on press" + default y + depends on LV_USE_THEME_DEFAULT + config LV_THEME_DEFAULT_TRANSITION_TIME + int "Default transition time in [ms]" + default 80 + depends on LV_USE_THEME_DEFAULT + config LV_USE_THEME_SIMPLE + bool "A very simple theme that is a good starting point for a custom theme" + default y if !LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL + config LV_USE_THEME_MONO + bool "Monochrome theme, suitable for some E-paper & dot matrix displays" + default y if LV_COLOR_DEPTH_1 && !LV_CONF_MINIMAL + endmenu + + menu "Layouts" + config LV_USE_FLEX + bool "A layout similar to Flexbox in CSS" + default y if !LV_CONF_MINIMAL + config LV_USE_GRID + bool "A layout similar to Grid in CSS" + default y if !LV_CONF_MINIMAL + endmenu + + menu "3rd Party Libraries" + config LV_USE_FS_STDIO + bool "File system on top of stdio API" + config LV_FS_STDIO_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65 )" + default 0 + depends on LV_USE_FS_STDIO + config LV_FS_STDIO_PATH + string "Set the working directory" + depends on LV_USE_FS_STDIO + config LV_FS_STDIO_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_STDIO + + config LV_USE_FS_POSIX + bool "File system on top of posix API" + config LV_FS_POSIX_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_POSIX + config LV_FS_POSIX_PATH + string "Set the working directory" + depends on LV_USE_FS_POSIX + config LV_FS_POSIX_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_POSIX + + config LV_USE_FS_WIN32 + bool "File system on top of Win32 API" + config LV_FS_WIN32_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_WIN32 + config LV_FS_WIN32_PATH + string "Set the working directory" + depends on LV_USE_FS_WIN32 + config LV_FS_WIN32_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_WIN32 + + config LV_USE_FS_FATFS + bool "File system on top of FatFS" + config LV_FS_FATFS_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_FATFS + config LV_FS_FATFS_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_FATFS + + config LV_USE_FS_MEMFS + bool "File system on top of memory-mapped API" + config LV_FS_MEMFS_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_MEMFS + + config LV_USE_FS_LITTLEFS + bool "File system on top of littlefs API" + config LV_FS_LITTLEFS_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_LITTLEFS + + config LV_USE_LODEPNG + bool "PNG decoder library" + + config LV_USE_LIBPNG + bool "PNG decoder(libpng) library" + + config LV_USE_BMP + bool "BMP decoder library" + + config LV_USE_TJPGD + bool "TJPGD decoder library" + + config LV_USE_LIBJPEG_TURBO + bool "libjpeg-turbo decoder library" + + config LV_USE_GIF + bool "GIF decoder library" + + config LV_GIF_CACHE_DECODE_DATA + bool "Use extra 16KB RAM to cache decoded data to accerlate" + depends on LV_USE_GIF + + config LV_BIN_DECODER_RAM_LOAD + bool "Decode whole image to RAM for bin decoder" + default n + + config LV_USE_RLE + bool "LVGL's version of RLE compression method" + + config LV_USE_QRCODE + bool "QR code library" + + config LV_USE_BARCODE + bool "Barcode library" + + config LV_USE_FREETYPE + bool "FreeType library" + config LV_FREETYPE_USE_LVGL_PORT + bool "Let FreeType to use LVGL memory and file porting" + default n + depends on LV_USE_FREETYPE + config LV_FREETYPE_CACHE_FT_GLYPH_CNT + int "The maximum number of Glyph in count" + default 256 + depends on LV_USE_FREETYPE + + config LV_USE_TINY_TTF + bool "Enable Tiny TTF decoder" + default n + config LV_TINY_TTF_FILE_SUPPORT + bool "Enable loading Tiny TTF data from files" + default n + depends on LV_USE_TINY_TTF + + config LV_USE_RLOTTIE + bool "Lottie library" + config LV_USE_THORVG + bool "ThorVG library" + choice + prompt "Use ThorVG config" + depends on LV_USE_THORVG + default LV_USE_THORVG_INTERNAL + config LV_USE_THORVG_INTERNAL + bool "Use ThorVG internal" + config LV_USE_THORVG_EXTERNAL + bool "Use ThorVG external" + endchoice + + config LV_USE_LZ4 + bool "Enable LZ4 compress/decompress lib" + choice + prompt "Choose lvgl built-in LZ4 lib or external lib" + depends on LV_USE_LZ4 + default LV_USE_LZ4_INTERNAL + config LV_USE_LZ4_INTERNAL + bool "Use lvgl built-in LZ4 lib" + config LV_USE_LZ4_EXTERNAL + bool "Use external LZ4 library" + endchoice + + config LV_USE_FFMPEG + bool "FFmpeg library" + config LV_FFMPEG_DUMP_FORMAT + bool "Dump format" + depends on LV_USE_FFMPEG + default n + endmenu + + menu "Others" + config LV_USE_SNAPSHOT + bool "Enable API to take snapshot" + default n if !LV_CONF_MINIMAL + + config LV_USE_SYSMON + bool "Enable system monitor component" + default n + + config LV_USE_PERF_MONITOR + bool "Show CPU usage and FPS count" + depends on LV_USE_SYSMON + + choice + prompt "Performance monitor position" + depends on LV_USE_PERF_MONITOR + default LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT + + config LV_PERF_MONITOR_ALIGN_TOP_LEFT + bool "Top left" + config LV_PERF_MONITOR_ALIGN_TOP_MID + bool "Top middle" + config LV_PERF_MONITOR_ALIGN_TOP_RIGHT + bool "Top right" + config LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT + bool "Bottom left" + config LV_PERF_MONITOR_ALIGN_BOTTOM_MID + bool "Bottom middle" + config LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT + bool "Bottom right" + config LV_PERF_MONITOR_ALIGN_LEFT_MID + bool "Left middle" + config LV_PERF_MONITOR_ALIGN_RIGHT_MID + bool "Right middle" + config LV_PERF_MONITOR_ALIGN_CENTER + bool "Center" + endchoice + + config LV_USE_PERF_MONITOR_LOG_MODE + bool "Prints performance data using log" + depends on LV_USE_PERF_MONITOR + default n + + config LV_USE_MEM_MONITOR + bool "Show the used memory and the memory fragmentation" + default n + depends on LV_STDLIB_BUILTIN && LV_USE_SYSMON + + choice + prompt "Memory monitor position" + depends on LV_USE_MEM_MONITOR + default LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT + + config LV_MEM_MONITOR_ALIGN_TOP_LEFT + bool "Top left" + config LV_MEM_MONITOR_ALIGN_TOP_MID + bool "Top middle" + config LV_MEM_MONITOR_ALIGN_TOP_RIGHT + bool "Top right" + config LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT + bool "Bottom left" + config LV_MEM_MONITOR_ALIGN_BOTTOM_MID + bool "Bottom middle" + config LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT + bool "Bottom right" + config LV_MEM_MONITOR_ALIGN_LEFT_MID + bool "Left middle" + config LV_MEM_MONITOR_ALIGN_RIGHT_MID + bool "Right middle" + config LV_MEM_MONITOR_ALIGN_CENTER + bool "Center" + endchoice + + config LV_USE_MONKEY + bool "Enable Monkey test" + default n + + config LV_USE_PROFILER + bool "Runtime performance profiler" + config LV_USE_PROFILER_BUILTIN + bool "Enable the built-in profiler" + depends on LV_USE_PROFILER + default y + config LV_PROFILER_BUILTIN_BUF_SIZE + int "Default profiler trace buffer size in bytes" + depends on LV_USE_PROFILER_BUILTIN + default 16384 + config LV_PROFILER_INCLUDE + string "Header to include for the profiler" + depends on LV_USE_PROFILER + default "lvgl/src/misc/lv_profiler_builtin.h" + + config LV_USE_GRIDNAV + bool "Enable grid navigation" + default n + + config LV_USE_FRAGMENT + bool "Enable lv_obj fragment" + default n + + config LV_USE_IMGFONT + bool "draw image in label or span obj" + default n + + config LV_USE_IME_PINYIN + bool "Enable Pinyin input method" + default n + config LV_IME_PINYIN_USE_K9_MODE + bool "Enable Pinyin input method 9 key input mode" + depends on LV_USE_IME_PINYIN + default n + config LV_IME_PINYIN_K9_CAND_TEXT_NUM + int "Maximum number of candidate panels for 9-key input mode" + depends on LV_IME_PINYIN_USE_K9_MODE + default 3 + config LV_IME_PINYIN_USE_DEFAULT_DICT + bool "Use built-in Thesaurus" + depends on LV_USE_IME_PINYIN + default y + help + If you do not use the default thesaurus, be sure to use lv_ime_pinyin after setting the thesauruss + config LV_IME_PINYIN_CAND_TEXT_NUM + int "Maximum number of candidate panels" + depends on LV_USE_IME_PINYIN + default 6 + help + Set the maximum number of candidate panels that can be displayed. + This needs to be adjusted according to the size of the screen. + + config LV_USE_FILE_EXPLORER + bool "Enable file explorer" + default n + config LV_FILE_EXPLORER_PATH_MAX_LEN + int "Maximum length of path" + depends on LV_USE_FILE_EXPLORER + default 128 + config LV_FILE_EXPLORER_QUICK_ACCESS + bool "Enable quick access bar" + depends on LV_USE_FILE_EXPLORER + default y + help + This can save some memory, but not much. After the quick access bar is created, it can be hidden by clicking the button at the top left corner of the browsing area, which is very useful for small screen devices. + endmenu + + menu "Devices" + config LV_USE_SDL + bool "Use SDL to open window on PC and handle mouse and keyboard" + default n + config LV_SDL_INCLUDE_PATH + string "SDL include path" + depends on LV_USE_SDL + default "SDL2/SDL.h" + + choice + prompt "SDL rendering mode" + depends on LV_USE_SDL + default LV_SDL_RENDER_MODE_DIRECT + help + LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance + + config LV_SDL_RENDER_MODE_PARTIAL + bool "Use the buffer(s) to render the screen is smaller parts" + + config LV_SDL_RENDER_MODE_DIRECT + bool "Only the changed areas will be updated with 2 screen sized buffers" + + config LV_SDL_RENDER_MODE_FULL + bool "Always redraw the whole screen even if only one pixel has been changed with 2 screen sized buffers" + endchoice + + choice + prompt "SDL buffer size" + depends on LV_USE_SDL + default LV_SDL_SINGLE_BUFFER + + config LV_SDL_SINGLE_BUFFER + bool "One screen-sized buffer" + + config LV_SDL_DOUBLE_BUFFER + bool "Two screen-sized buffer" + depends on !LV_SDL_RENDER_MODE_PARTIAL + + config LV_SDL_CUSTOM_BUFFER + bool "Custom-sized buffer" + depends on LV_SDL_RENDER_MODE_PARTIAL + endchoice + + config LV_SDL_BUFFER_COUNT + int + depends on LV_USE_SDL + default 0 if LV_SDL_CUSTOM_BUFFER + default 1 if LV_SDL_SINGLE_BUFFER + default 2 if LV_SDL_DOUBLE_BUFFER + + config LV_SDL_FULLSCREEN + bool "SDL fullscreen" + depends on LV_USE_SDL + default n + config LV_SDL_DIRECT_EXIT + bool "Exit the application when all SDL windows are closed" + depends on LV_USE_SDL + default y + + config LV_USE_X11 + bool "Use X11 window manager to open window on Linux PC and handle mouse and keyboard" + default n + config LV_X11_DOUBLE_BUFFER + bool "Use double buffers for lvgl rendering" + depends on LV_USE_X11 + default y + config LV_X11_DIRECT_EXIT + bool "Exit the application when all X11 windows have been closed" + depends on LV_USE_X11 + default y + choice + prompt "X11 device render mode" + depends on LV_USE_X11 + default LV_X11_RENDER_MODE_PARTIAL + + config LV_X11_RENDER_MODE_PARTIAL + bool "Partial render mode (preferred)" + help + Use the buffer(s) to render the screen is smaller parts. This way the buffers can be smaller then the display to save RAM. + Appr. 1/10 screen size buffer(s) are used. + config LV_X11_RENDER_MODE_DIRECT + bool "Direct render mode" + help + The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. This way the buffer always contain the whole image. Only the changed ares will be updated. + With 2 buffers the buffers' content are kept in sync automatically and in flush_cb only address change is required. + config LV_X11_RENDER_MODE_FULL + bool "Full render mode" + help + Always redraw the whole screen even if only one pixel has been changed. + With 2 buffers in flush_cb only and address change is required. + endchoice + + config LV_USE_LINUX_FBDEV + bool "Use Linux framebuffer device" + default n + config LV_LINUX_FBDEV_BSD + bool "Use BSD flavored framebuffer device" + depends on LV_USE_LINUX_FBDEV + default n + + choice + prompt "Framebuffer device render mode" + depends on LV_USE_LINUX_FBDEV + default LV_LINUX_FBDEV_RENDER_MODE_PARTIAL + + config LV_LINUX_FBDEV_RENDER_MODE_PARTIAL + bool "Partial mode" + help + Use the buffer(s) to render the screen is smaller parts. This way the buffers can be smaller then the display to save RAM. At least 1/10 screen size buffer(s) are recommended. + + config LV_LINUX_FBDEV_RENDER_MODE_DIRECT + bool "Direct mode" + help + The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. This way the buffer always contain the whole image. Only the changed ares will be updated. With 2 buffers the buffers' content are kept in sync automatically and in flush_cb only address change is required. + + config LV_LINUX_FBDEV_RENDER_MODE_FULL + bool "Full mode" + help + Always redraw the whole screen even if only one pixel has been changed. With 2 buffers in flush_cb only and address change is required. + + endchoice + + choice + prompt "Framebuffer size" + depends on LV_USE_LINUX_FBDEV + default LV_LINUX_FBDEV_SINGLE_BUFFER + + config LV_LINUX_FBDEV_SINGLE_BUFFER + bool "One screen-sized buffer" + + config LV_LINUX_FBDEV_DOUBLE_BUFFER + bool "Two screen-sized buffer" + depends on !LV_LINUX_FBDEV_RENDER_MODE_PARTIAL + + config LV_LINUX_FBDEV_CUSTOM_BUFFER + bool "Custom-sized buffer" + depends on LV_LINUX_FBDEV_RENDER_MODE_PARTIAL + + endchoice + + config LV_LINUX_FBDEV_BUFFER_COUNT + int + depends on LV_USE_LINUX_FBDEV + default 0 if LV_LINUX_FBDEV_CUSTOM_BUFFER + default 1 if LV_LINUX_FBDEV_SINGLE_BUFFER + default 2 if LV_LINUX_FBDEV_DOUBLE_BUFFER + + config LV_LINUX_FBDEV_BUFFER_SIZE + int "Custom partial buffer size (in number of rows)" + depends on LV_USE_LINUX_FBDEV && LV_LINUX_FBDEV_CUSTOM_BUFFER + default 60 + + config LV_USE_NUTTX + bool "Use Nuttx to open window and handle touchscreen" + default n + + config LV_USE_NUTTX_LIBUV + bool "Use uv loop to replace default timer loop and other fb/indev timers" + depends on LV_USE_NUTTX + default n + + config LV_USE_NUTTX_CUSTOM_INIT + bool "Use Custom Nuttx init API to open window and handle touchscreen" + depends on LV_USE_NUTTX + default n + + config LV_USE_NUTTX_LCD + bool "Use NuttX LCD device" + depends on LV_USE_NUTTX + default n + + choice + prompt "NuttX LCD buffer size" + depends on LV_USE_NUTTX_LCD + default LV_NUTTX_LCD_SINGLE_BUFFER + + config LV_NUTTX_LCD_SINGLE_BUFFER + bool "One screen-sized buffer" + + config LV_NUTTX_LCD_DOUBLE_BUFFER + bool "Two screen-sized buffer" + + config LV_NUTTX_LCD_CUSTOM_BUFFER + bool "Custom-sized buffer" + + endchoice + + config LV_NUTTX_LCD_BUFFER_COUNT + int + depends on LV_USE_NUTTX_LCD + default 0 if LV_NUTTX_LCD_CUSTOM_BUFFER + default 1 if LV_NUTTX_LCD_SINGLE_BUFFER + default 2 if LV_NUTTX_LCD_DOUBLE_BUFFER + + config LV_NUTTX_LCD_BUFFER_SIZE + int "Custom partial buffer size (in number of rows)" + depends on LV_USE_NUTTX_LCD && LV_NUTTX_LCD_CUSTOM_BUFFER + default 60 + + config LV_USE_NUTTX_TOUCHSCREEN + bool "Use NuttX touchscreen driver" + depends on LV_USE_NUTTX + default n + + config LV_USE_LINUX_DRM + bool "Use Linux DRM device" + default n + + config LV_USE_TFT_ESPI + bool "Use TFT_eSPI driver" + default n + + config LV_USE_EVDEV + bool "Use evdev input driver" + default n + + config LV_USE_LIBINPUT + bool "Use libinput input driver" + default n + + config LV_LIBINPUT_BSD + bool "Use the BSD variant of the libinput input driver" + depends on LV_USE_LIBINPUT + default n + + config LV_LIBINPUT_XKB + bool "Enable full keyboard support via XKB" + depends on LV_USE_LIBINPUT + default n + + config LV_USE_ST7735 + bool "Use ST7735 LCD driver" + default n + + config LV_USE_ST7789 + bool "Use ST7789 LCD driver" + default n + + config LV_USE_ST7796 + bool "Use ST7796 LCD driver" + default n + + config LV_USE_ILI9341 + bool "Use ILI9341 LCD driver" + default n + + config LV_USE_GENERIC_MIPI + bool "Generic MIPI driver" + default y if LV_USE_ST7735 || LV_USE_ST7789 || LV_USE_ST7796 || LV_USE_ILI9341 + + config LV_USE_WINDOWS + bool "Use LVGL Windows backend" + default n + endmenu + + menu "Examples" + config LV_BUILD_EXAMPLES + bool "Enable the examples to be built" + default y if !LV_CONF_MINIMAL + endmenu + + menu "Demos" + config LV_USE_DEMO_WIDGETS + bool "Show some widget" + default n + + config LV_USE_DEMO_KEYPAD_AND_ENCODER + bool "Demonstrate the usage of encoder and keyboard" + default n + + config LV_USE_DEMO_BENCHMARK + bool "Benchmark your system" + default n + depends on LV_FONT_MONTSERRAT_14 && LV_FONT_MONTSERRAT_24 && LV_USE_DEMO_WIDGETS + config LV_USE_DEMO_RENDER + bool "Render test for each primitives. Requires at least 480x272 display" + default n + + config LV_USE_DEMO_SCROLL + bool "Scroll settings test for LVGL" + default n + + config LV_USE_DEMO_STRESS + bool "Stress test for LVGL" + default n + + config LV_USE_DEMO_TRANSFORM + bool "Transform test for LVGL" + default n + depends on LV_FONT_MONTSERRAT_18 + + config LV_USE_DEMO_MUSIC + bool "Music player demo" + default n + config LV_DEMO_MUSIC_SQUARE + bool "Enable Square" + depends on LV_USE_DEMO_MUSIC + default n + config LV_DEMO_MUSIC_LANDSCAPE + bool "Enable Landscape" + depends on LV_USE_DEMO_MUSIC + default n + config LV_DEMO_MUSIC_ROUND + bool "Enable Round" + depends on LV_USE_DEMO_MUSIC + default n + config LV_DEMO_MUSIC_LARGE + bool "Enable Large" + depends on LV_USE_DEMO_MUSIC + default n + config LV_DEMO_MUSIC_AUTO_PLAY + bool "Enable Auto play" + depends on LV_USE_DEMO_MUSIC + default n + + config LV_USE_DEMO_FLEX_LAYOUT + bool "Flex layout previewer" + default n + config LV_USE_DEMO_MULTILANG + bool "multi-language demo" + default n + config LV_USE_DEMO_VECTOR_GRAPHIC + bool "vector graphic demo" + default n + depends on LV_USE_VECTOR_GRAPHIC + endmenu + +endmenu diff --git a/libraries/lvgl/LICENCE.txt b/libraries/lvgl/LICENCE.txt new file mode 100644 index 0000000..f877abb --- /dev/null +++ b/libraries/lvgl/LICENCE.txt @@ -0,0 +1,8 @@ +MIT licence +Copyright (c) 2021 LVGL Kft + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/libraries/lvgl/README.md b/libraries/lvgl/README.md new file mode 100644 index 0000000..17c70f0 --- /dev/null +++ b/libraries/lvgl/README.md @@ -0,0 +1,474 @@ +This LVGL-9.1.0 is modified by SquareLine Team here and there to provide the best experience even with this experimental 9.1 LVGL version, added fixes: + - Bar/Slider widget drawing caused a crash when value was maximum and top_padding was nonzero and right_padding was 0 (`lv_bar.c`, also adding +1 to right_padding in SquareLine Studio export if there's top-padding set.) + - The swipe gesture was improved to not get double value aka 0 velocity from timer based callback when 'EVENT'-mode is set for the indev (as in built-in SDL2 driver). (`lv_indev.c`) + Also a modification can be enabled with `LV_SQUARELINE_MOD__SWIPE` defined and set to 1 in `lv_conf.h`, that brings back old 8.3 swipe-gesture behaviour, i.e. not abandonings wipe process when a new object comes across swipe-path. + - For the Visual Studio board-template with resizable window, some extra window-size setting code was added into `lv_windows_display.c`, so the window is set to guarantee the wished client-size for the exported UI. + + + + +

+ English | 中文 | Português do Brasil | 日本語 +

+ +
+ +

+

+ + 

Light and Versatile Graphics Library


+
+ +   +  +
+
+

+Website | +Docs | +Forum | +Demos | +Services +

+
+ +## :ledger: Overview + +**Mature and Well-known**
+LVGL is the most popular free and open source embedded graphics library to create beautiful UIs for any MCU, MPU and display type. It's supported by industry leading vendors and projects like  Arm, STM32, NXP, Espressif, Nuvoton, Arduino, RT-Thread, Zephyr, NuttX, Adafruit and many more. + +**Feature Rich**
+It has all the features to create modern and beautiful GUIs: 30+ built-in widgets, a powerful style system, web inspired layout managers, and a typography system supporting many languages. To integrate LVGL into your platform, all you need is at least 32kB RAM and 128 kB Flash, a C compiler, a frame buffer, and at least an 1/10 screen sized buffer for rendering. + +**Services**
+Our team is ready to help you with graphics design, UI implementation and consulting services. Contact us if you need some support during the development of your next GUI project. + +## :rocket: Features + +**Free and Portable** + - A fully portable C (C++ compatible) library with no external dependencies. + - Can be compiled to any MCU or MPU, with any (RT)OS. + - Supports monochrome, ePaper, OLED or TFT displays, or even monitors. [Porting Guide](https://docs.lvgl.io/master/porting/project.html) + - Distributed under the MIT license, so you can easily use it in commercial projects too. + - Needs only 32kB RAM and 128 kB Flash, a frame buffer, and at least an 1/10 screen sized buffer for rendering. + - OS, External memory and GPU are supported but not required. + +**Widgets, Styles, Layouts and more** + - 30+ built-in [Widgets](https://docs.lvgl.io/master/widgets/index.html):  Button, Label, Slider, Chart, Keyboard, Meter, Arc, Table and many more. + - Flexible [Style system](https://docs.lvgl.io/master/overview/style.html) with  ~100 style properties to customize any part of the widgets in any state. + - [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) and [Grid](https://docs.lvgl.io/master/layouts/grid.html)-like layouts engines to automatically size and position the widgets in a responsive way. + - Texts are rendered with UTF-8 encoding supporting CJK, Thai, Hindi, Arabic, Persian writing systems. + - Word wrapping, kerning, text scrolling, sub-pixel rendering, Pinyin-IME Chinese input, Emojis in texts. + - Rendering engine supporting animations, anti-aliasing, opacity, smooth scrolling, shadows, image transformation, etc   + - Supports Mouse, Touchpad, Keypad, Keyboard, External buttons, Encoder [Input devices](https://docs.lvgl.io/master/porting/indev.html). + - [Multiple display](https://docs.lvgl.io/master/overview/disp.html#multiple-display-support) support. + +**Binding and Build Support** + - [Micropython Binding](https://blog.lvgl.io/2019-02-20/micropython-bindings) exposes LVGL API + - [PikaScript Binding](https://blog.lvgl.io/2022-08-24/pikascript-and-lvgl) python on MCU lighter and easier. + - No custom build system is used. You can build LVGL as you build the other files of your project. + - Support for Make and [CMake](https://docs.lvgl.io/master/get-started/platforms/cmake.html) is included out of the box. + - [Develop on PC](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) and use the same UI code on embedded hardware. + - Convert the C UI code to HTML file with our [Emscripten port](https://github.com/lvgl/lv_web_emscripten). + +**Docs, Tools, and Services** + - Detailed [Documentation](https://docs.lvgl.io/) with [100+ simple examples](https://docs.lvgl.io/master/index.html) + - [Services](https://lvgl.io/services) such as User interface design, Implementation and Consulting to make UI development simpler and faster. + +## :heart: Sponsor + +If LVGL saved you a lot of time and money or you just had fun using it, consider [Supporting its Development](https://github.com/sponsors/lvgl). + +**How do we spend the donations?**
+Our goal is to provide financial compensation for people who do the most for LVGL. It means not only the maintainers but anyone who implements a great feature should get a payment from the accumulated money. We use the donations to cover our operational costs like servers and related services. + +**How to donate?**
+We use [GitHub Sponsors](https://github.com/sponsors/lvgl) where you can easily send one time or recurring donations. You can also see all of our expenses in a transparent way. + +**How to get paid for your contribution?**
+If someone implements or fixes an issue labeled as [Sponsored](https://github.com/lvgl/lvgl/labels/Sponsored) he or she will get a payment for that work. We estimate the required time, complexity and importance of the issue and set a price accordingly. To jump in just comment on a [Sponsored](https://github.com/lvgl/lvgl/labels/Sponsored) issue saying "Hi, I'd like to deal with it. This is how I'm planning to fix/implement it...". A work is considered ready when it's approved and merged by a maintainer. After that you can submit and expense at [opencollective.com](https://opencollective.com/lvgl) and you will receive the payment in a few days. + +**Organizations supporting LVGL**
+[![Sponsors of LVGL](https://opencollective.com/lvgl/organizations.svg?width=600)](https://opencollective.com/lvgl) + +**Individuals supporting LVGL**
+[![Backers of LVGL](https://opencollective.com/lvgl/individuals.svg?width=600)](https://opencollective.com/lvgl) + +## :package: Packages +LVGL is available as: +- [Arduino library](https://docs.lvgl.io/master/integration/framework/arduino.html) +- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl) +- [Zephyr library](https://docs.lvgl.io/master/integration/os/zephyr.html) +- [ESP-IDF(ESP32) component](https://components.espressif.com/components/lvgl/lvgl) +- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) +- [NuttX library](https://docs.lvgl.io/master/integration/os/nuttx.html) +- [RT-Thread RTOS](https://docs.lvgl.io/master/integration/os/rt-thread.html) +- CMSIS-Pack +- [RIOT OS package](https://doc.riot-os.org/group__pkg__lvgl.html#details) + + +## :robot: Examples + +See some examples of creating widgets, using layouts and applying styles. You will find C and MicroPython code, and links to try out or edit the examples in an online MicroPython editor. + +For more examples check out the [Examples](https://github.com/lvgl/lvgl/tree/master/examples) folder. + + +### Hello world label + +![Simple Hello world label example in LVGL](https://github.com/kisvegabor/test/raw/master/readme_example_1.png) + +
+ C code + +```c +/*Change the active screen's background color*/ +lv_obj_set_style_bg_color(lv_screen_active(), lv_color_hex(0x003a57), LV_PART_MAIN); + +/*Create a white label, set its text and align it to the center*/ +lv_obj_t * label = lv_label_create(lv_screen_active()); +lv_label_set_text(label, "Hello world"); +lv_obj_set_style_text_color(lv_screen_active(), lv_color_hex(0xffffff), LV_PART_MAIN); +lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); +``` +
+ +
+ MicroPython code | Online Simulator + +```python +# Change the active screen's background color +scr = lv.screen_active() +scr.set_style_bg_color(lv.color_hex(0x003a57), lv.PART.MAIN) + +# Create a white label, set its text and align it to the center +label = lv.label(lv.screen_active()) +label.set_text("Hello world") +label.set_style_text_color(lv.color_hex(0xffffff), lv.PART.MAIN) +label.align(lv.ALIGN.CENTER, 0, 0) +``` +
+
+ +### Button with Click Event + +![LVGL button with label example](https://github.com/kisvegabor/test/raw/master/readme_example_2.gif) + +
+ C code + +```c +lv_obj_t * button = lv_button_create(lv_screen_active());                   /*Add a button to the current screen*/ +lv_obj_center(button);                                     /*Set its position*/ +lv_obj_set_size(button, 100, 50);                                  /*Set its size*/ +lv_obj_add_event_cb(button, button_event_cb, LV_EVENT_CLICKED, NULL); /*Assign a callback to the button*/ + +lv_obj_t * label = lv_label_create(button);                        /*Add a label to the button*/ +lv_label_set_text(label, "Button");                             /*Set the labels text*/ +lv_obj_center(label);                                           /*Align the label to the center*/ +... + +void button_event_cb(lv_event_t * e) +{ +  printf("Clicked\n"); +} +``` +
+ +
+ MicroPython code | Online Simulator + +```python +def button_event_cb(e): +  print("Clicked") + +# Create a Button and a Label +button = lv.button(lv.screen_active()) +button.center() +button.set_size(100, 50) +button.add_event_cb(button_event_cb, lv.EVENT.CLICKED, None) + +label = lv.label(button) +label.set_text("Button") +label.center() +``` +
+
+ +### Checkboxes with Layout +![Checkboxes with layout in LVGL](https://github.com/kisvegabor/test/raw/master/readme_example_3.gif) + +
+ C code + +```c + +lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_COLUMN); +lv_obj_set_flex_align(lv_screen_active(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER); + +lv_obj_t * cb; +cb = lv_checkbox_create(lv_screen_active()); +lv_checkbox_set_text(cb, "Apple"); +lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL); + +cb = lv_checkbox_create(lv_screen_active()); +lv_checkbox_set_text(cb, "Banana"); +lv_obj_add_state(cb, LV_STATE_CHECKED); +lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL); + +cb = lv_checkbox_create(lv_screen_active()); +lv_checkbox_set_text(cb, "Lemon"); +lv_obj_add_state(cb, LV_STATE_DISABLED); +lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL); + +cb = lv_checkbox_create(lv_screen_active()); +lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED); +lv_checkbox_set_text(cb, "Melon\nand a new line"); +lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL); +``` + +
+ +
+ MicroPython code | Online Simulator + +```python +def event_handler(e): + code = e.get_code() + obj = e.get_target_obj() + if code == lv.EVENT.VALUE_CHANGED: + txt = obj.get_text() + if obj.get_state() & lv.STATE.CHECKED: + state = "Checked" + else: + state = "Unchecked" + print(txt + ":" + state) + + +lv.screen_active().set_flex_flow(lv.FLEX_FLOW.COLUMN) +lv.screen_active().set_flex_align(lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.START, lv.FLEX_ALIGN.CENTER) + +cb = lv.checkbox(lv.screen_active()) +cb.set_text("Apple") +cb.add_event_cb(event_handler, lv.EVENT.ALL, None) + +cb = lv.checkbox(lv.screen_active()) +cb.set_text("Banana") +cb.add_state(lv.STATE.CHECKED) +cb.add_event_cb(event_handler, lv.EVENT.ALL, None) + +cb = lv.checkbox(lv.screen_active()) +cb.set_text("Lemon") +cb.add_state(lv.STATE.DISABLED) +cb.add_event_cb(event_handler, lv.EVENT.ALL, None) + +cb = lv.checkbox(lv.screen_active()) +cb.add_state(lv.STATE.CHECKED | lv.STATE.DISABLED) +cb.set_text("Melon") +cb.add_event_cb(event_handler, lv.EVENT.ALL, None) +``` + +
+
+ +### Styling a Slider +![Styling a slider with LVGL](https://github.com/kisvegabor/test/raw/master/readme_example_4.gif) + + +
+ C code + +```c +lv_obj_t * slider = lv_slider_create(lv_screen_active()); +lv_slider_set_value(slider, 70, LV_ANIM_OFF); +lv_obj_set_size(slider, 300, 20); +lv_obj_center(slider); + +/*Add local styles to MAIN part (background rectangle)*/ +lv_obj_set_style_bg_color(slider, lv_color_hex(0x0F1215), LV_PART_MAIN); +lv_obj_set_style_bg_opa(slider, 255, LV_PART_MAIN); +lv_obj_set_style_border_color(slider, lv_color_hex(0x333943), LV_PART_MAIN); +lv_obj_set_style_border_width(slider, 5, LV_PART_MAIN); +lv_obj_set_style_pad_all(slider, 5, LV_PART_MAIN); + +/*Create a reusable style sheet for the INDICATOR part*/ +static lv_style_t style_indicator; +lv_style_init(&style_indicator); +lv_style_set_bg_color(&style_indicator, lv_color_hex(0x37B9F5)); +lv_style_set_bg_grad_color(&style_indicator, lv_color_hex(0x1464F0)); +lv_style_set_bg_grad_dir(&style_indicator, LV_GRAD_DIR_HOR); +lv_style_set_shadow_color(&style_indicator, lv_color_hex(0x37B9F5)); +lv_style_set_shadow_width(&style_indicator, 15); +lv_style_set_shadow_spread(&style_indicator, 5); +4 +/*Add the style sheet to the slider's INDICATOR part*/ +lv_obj_add_style(slider, &style_indicator, LV_PART_INDICATOR); + +/*Add the same style to the KNOB part too and locally overwrite some properties*/ +lv_obj_add_style(slider, &style_indicator, LV_PART_KNOB); + +lv_obj_set_style_outline_color(slider, lv_color_hex(0x0096FF), LV_PART_KNOB); +lv_obj_set_style_outline_width(slider, 3, LV_PART_KNOB); +lv_obj_set_style_outline_pad(slider, -5, LV_PART_KNOB); +lv_obj_set_style_shadow_spread(slider, 2, LV_PART_KNOB); +``` + +
+ +
+ MicroPython code | +Online Simulator + + + +```python +# Create a slider and add the style +slider = lv.slider(lv.screen_active()) +slider.set_value(70, lv.ANIM.OFF) +slider.set_size(300, 20) +slider.center() + +# Add local styles to MAIN part (background rectangle) +slider.set_style_bg_color(lv.color_hex(0x0F1215), lv.PART.MAIN) +slider.set_style_bg_opa(255, lv.PART.MAIN) +slider.set_style_border_color(lv.color_hex(0x333943), lv.PART.MAIN) +slider.set_style_border_width(5, lv.PART.MAIN) +slider.set_style_pad_all(5, lv.PART.MAIN) + +# Create a reusable style sheet for the INDICATOR part +style_indicator = lv.style_t() +style_indicator.init() +style_indicator.set_bg_color(lv.color_hex(0x37B9F5)) +style_indicator.set_bg_grad_color(lv.color_hex(0x1464F0)) +style_indicator.set_bg_grad_dir(lv.GRAD_DIR.HOR) +style_indicator.set_shadow_color(lv.color_hex(0x37B9F5)) +style_indicator.set_shadow_width(15) +style_indicator.set_shadow_spread(5) + +# Add the style sheet to the slider's INDICATOR part +slider.add_style(style_indicator, lv.PART.INDICATOR) +slider.add_style(style_indicator, lv.PART.KNOB) + +# Add the same style to the KNOB part too and locally overwrite some properties +slider.set_style_outline_color(lv.color_hex(0x0096FF), lv.PART.KNOB) +slider.set_style_outline_width(3, lv.PART.KNOB) +slider.set_style_outline_pad(-5, lv.PART.KNOB) +slider.set_style_shadow_spread(2, lv.PART.KNOB) +``` +
+
+ +### English, Hebrew (mixed LTR-RTL) and Chinese texts + +![English, Hebrew and Chinese texts with LVGL](https://github.com/kisvegabor/test/raw/master/readme_example_5.png) + +
+ C code + +```c +lv_obj_t * ltr_label = lv_label_create(lv_screen_active()); +lv_label_set_text(ltr_label, "In modern terminology, a microcontroller is similar to a system on a chip (SoC)."); +lv_obj_set_style_text_font(ltr_label, &lv_font_montserrat_16, 0); +lv_obj_set_width(ltr_label, 310); +lv_obj_align(ltr_label, LV_ALIGN_TOP_LEFT, 5, 5); + +lv_obj_t * rtl_label = lv_label_create(lv_screen_active()); +lv_label_set_text(rtl_label,"מעבד, או בשמו המלא יחידת עיבוד מרכזית (באנגלית: CPU - Central Processing Unit)."); +lv_obj_set_style_base_dir(rtl_label, LV_BASE_DIR_RTL, 0); +lv_obj_set_style_text_font(rtl_label, &lv_font_dejavu_16_persian_hebrew, 0); +lv_obj_set_width(rtl_label, 310); +lv_obj_align(rtl_label, LV_ALIGN_LEFT_MID, 5, 0); + +lv_obj_t * cz_label = lv_label_create(lv_screen_active()); +lv_label_set_text(cz_label, + "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。"); +lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0); +lv_obj_set_width(cz_label, 310); +lv_obj_align(cz_label, LV_ALIGN_BOTTOM_LEFT, 5, -5); +``` + +
+ +
+ MicroPython code | Online Simulator + +```python +ltr_label = lv.label(lv.screen_active()) +ltr_label.set_text("In modern terminology, a microcontroller is similar to a system on a chip (SoC).") +ltr_label.set_style_text_font(lv.font_montserrat_16, 0); + +ltr_label.set_width(310) +ltr_label.align(lv.ALIGN.TOP_LEFT, 5, 5) + +rtl_label = lv.label(lv.screen_active()) +rtl_label.set_text("מעבד, או בשמו המלא יחידת עיבוד מרכזית (באנגלית: CPU - Central Processing Unit).") +rtl_label.set_style_base_dir(lv.BASE_DIR.RTL, 0) +rtl_label.set_style_text_font(lv.font_dejavu_16_persian_hebrew, 0) +rtl_label.set_width(310) +rtl_label.align(lv.ALIGN.LEFT_MID, 5, 0) + +font_simsun_16_cjk = lv.font_load("S:../../assets/font/lv_font_simsun_16_cjk.fnt") + +cz_label = lv.label(lv.screen_active()) +cz_label.set_style_text_font(font_simsun_16_cjk, 0) +cz_label.set_text("嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。") +cz_label.set_width(310) +cz_label.align(lv.ALIGN.BOTTOM_LEFT, 5, -5) + +``` +
+ +## :arrow_forward: Get started +This list will guide you to get started with LVGL step-by-step. + +**Get Familiar with LVGL** + + 1. Check the [Online demos](https://lvgl.io/demos) to see LVGL in action (3 minutes) + 2. Read the [Introduction](https://docs.lvgl.io/master/intro/index.html) page of the documentation (5 minutes) + 3. Get familiar with the basics on the [Quick overview](https://docs.lvgl.io/master/get-started/quick-overview.html) page (15 minutes) + +**Start to Use LVGL** + + 4. Set up a [Simulator](https://docs.lvgl.io/master/integration/ide/pc-simulator.html#simulator) (10 minutes) + 5. Try out some [Examples](https://github.com/lvgl/lvgl/tree/master/examples) + 6. Port LVGL to a board. See the [Porting](https://docs.lvgl.io/master/porting/index.html) guide or check the ready to use [Projects](https://github.com/lvgl?q=lv_port_) + +**Become a Pro** + + 7. Read the [Overview](https://docs.lvgl.io/master/overview/index.html) page to get a better understanding of the library (2-3 hours) + 8. Check the documentation of the [Widgets](https://docs.lvgl.io/master/widgets/index.html) to see their features and usage + +**Get Help and Help Others** + + 9. If you have questions go to the [Forum](http://forum.lvgl.io/) + 10. Read the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) guide to see how you can help to improve LVGL (15 minutes) + + +## :handshake: Services +LVGL LLC was established to provide a solid background for LVGL library and to offer several type of services to help you in UI development. With 15+ years of experience in the user interface and graphics industry we can help you the bring your UI to the next level. + +- **Graphics design** Our in-house graphics designers are experts in creating beautiful modern designs which fit to your product and the resources of your hardware. +- **UI implementation** We can also implement your UI based on the design you or we have created. You can be sure that we will make the most out of your hardware and LVGL. If a feature or widget is missing from LVGL, don't worry, we will implement it for you. +- **Consulting and Support** We can support you with consulting as well to avoid pricey and time consuming mistakes during the UI development. +- **Board certification** For companies who are offering development boards, or production ready kits we do board certification which shows how board can run LVGL. + + +Check out our [Demos](https://lvgl.io/demos) as reference. For more information take look at the [Services page](https://lvgl.io/services). + +[Contact us](https://lvgl.io/#contact) and tell how we can help. + + +## :star2: Contributing +LVGL is an open project and contribution is very welcome. There are many ways to contribute from simply speaking about your project, through writing examples, improving the documentation, fixing bugs or even hosting your own project under the LVGL organization. + +For a detailed description of contribution opportunities visit the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) section of the documentation. + +More than 300 people already left their fingerprint in LVGL. Be one them! See you here! :slightly_smiling_face: + + + + + +... and many other. diff --git a/libraries/lvgl/SConscript b/libraries/lvgl/SConscript new file mode 100644 index 0000000..d457d9a --- /dev/null +++ b/libraries/lvgl/SConscript @@ -0,0 +1,11 @@ +# RT-Thread building script for bridge + +import os +from building import * + +objs = [] +cwd = GetCurrentDir() + +objs = objs + SConscript(cwd + '/env_support/rt-thread/SConscript') + +Return('objs') diff --git a/libraries/lvgl/component.mk b/libraries/lvgl/component.mk new file mode 100644 index 0000000..ee6e131 --- /dev/null +++ b/libraries/lvgl/component.mk @@ -0,0 +1,66 @@ +# ESP-IDF component file for make based commands + +COMPONENT_SRCDIRS := . \ + src \ + src/core \ + src/draw \ + src/extra \ + src/font \ + src/hal \ + src/misc \ + src/widgets \ + src/draw/arm2d \ + src/draw/nxp \ + src/draw/sdl \ + src/draw/stm32_dma2d \ + src/draw/sw \ + src/draw/swm342_dma2d \ + src/extra/layouts \ + src/extra/libs \ + src/extra/others \ + src/extra/themes \ + src/extra/widgets \ + src/extra/layouts/flex \ + src/extra/layouts/grid \ + src/extra/libs/bmp \ + src/extra/libs/ffmpeg \ + src/extra/libs/freetype \ + src/extra/libs/fsdrv \ + src/extra/libs/gif \ + src/extra/libs/png \ + src/extra/libs/qrcode \ + src/extra/libs/rlottie \ + src/extra/libs/sjgp \ + src/extra/others/fragment \ + src/extra/others/gridnav \ + src/extra/others/ime \ + src/extra/others/imgfont \ + src/extra/others/monkey \ + src/extra/others/msg \ + src/extra/others/snapshot \ + src/extra/themes/basic \ + src/extra/themes/default \ + src/extra/themes/mono \ + src/extra/widgets/animimg \ + src/extra/widgets/calendar \ + src/extra/widgets/chart \ + src/extra/widgets/colorwheel \ + src/extra/widgets/imgbtn \ + src/extra/widgets/keyboard \ + src/extra/widgets/led \ + src/extra/widgets/list \ + src/extra/widgets/menu \ + src/extra/widgets/meter \ + src/extra/widgets/msgbox \ + src/extra/widgets/span \ + src/extra/widgets/spinbox \ + src/extra/widgets/spinner \ + src/extra/widgets/tabview \ + src/extra/widgets/tileview \ + src/extra/widgets/win + +ifeq ($(CONFIG_LV_USE_THORVG_INTERNAL),y) +COMPONENT_SRCDIRS += src/extra/libs/thorvg +endif + +COMPONENT_ADD_INCLUDEDIRS := $(COMPONENT_SRCDIRS) . diff --git a/libraries/lvgl/demos/.gitkeep b/libraries/lvgl/demos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/libraries/lvgl/env_support/cmake/custom.cmake b/libraries/lvgl/env_support/cmake/custom.cmake new file mode 100644 index 0000000..9800468 --- /dev/null +++ b/libraries/lvgl/env_support/cmake/custom.cmake @@ -0,0 +1,187 @@ +# Option to define LV_LVGL_H_INCLUDE_SIMPLE, default: ON +option(LV_LVGL_H_INCLUDE_SIMPLE + "Use #include \"lvgl.h\" instead of #include \"../../lvgl.h\"" ON) + +# Option to define LV_CONF_INCLUDE_SIMPLE, default: ON +option(LV_CONF_INCLUDE_SIMPLE + "Use #include \"lv_conf.h\" instead of #include \"../../lv_conf.h\"" ON) + +# Option LV_CONF_PATH, which should be the path for lv_conf.h +# If set parent path LV_CONF_DIR is added to includes +if( LV_CONF_PATH ) + get_filename_component(LV_CONF_DIR ${LV_CONF_PATH} DIRECTORY) +endif( LV_CONF_PATH ) + +# Option to build shared libraries (as opposed to static), default: OFF +option(BUILD_SHARED_LIBS "Build shared libraries" OFF) + +# Set sources used for LVGL components +file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c ${LVGL_ROOT_DIR}/src/*.S) +file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c) +file(GLOB_RECURSE DEMO_SOURCES ${LVGL_ROOT_DIR}/demos/*.c) +file(GLOB_RECURSE THORVG_SOURCES ${LVGL_ROOT_DIR}/src/libs/thorvg/*.cpp ${LVGL_ROOT_DIR}/src/others/vg_lite_tvg/*.cpp) + +# Build LVGL library +add_library(lvgl ${SOURCES}) +add_library(lvgl::lvgl ALIAS lvgl) + +target_compile_definitions( + lvgl PUBLIC $<$:LV_LVGL_H_INCLUDE_SIMPLE> + $<$:LV_CONF_INCLUDE_SIMPLE> + $<$:__ASSEMBLY__>) + +# Add definition of LV_CONF_PATH only if needed +if(LV_CONF_PATH) + target_compile_definitions(lvgl PUBLIC LV_CONF_PATH=${LV_CONF_PATH}) +endif() + +# Add definition of LV_CONF_SKIP only if needed +if(LV_CONF_SKIP) + target_compile_definitions(lvgl PUBLIC LV_CONF_SKIP=1) +endif() + +# Include root and optional parent path of LV_CONF_PATH +target_include_directories(lvgl SYSTEM PUBLIC ${LVGL_ROOT_DIR} ${LV_CONF_DIR}) + + +if(NOT LV_CONF_BUILD_DISABLE_THORVG_INTERNAL) + add_library(lvgl_thorvg ${THORVG_SOURCES}) + add_library(lvgl::thorvg ALIAS lvgl_thorvg) + target_include_directories(lvgl_thorvg SYSTEM PUBLIC ${LVGL_ROOT_DIR}/src/libs/thorvg) + target_link_libraries(lvgl_thorvg PUBLIC lvgl) +endif() + +# Build LVGL example library +if(NOT LV_CONF_BUILD_DISABLE_EXAMPLES) + add_library(lvgl_examples ${EXAMPLE_SOURCES}) + add_library(lvgl::examples ALIAS lvgl_examples) + + target_include_directories(lvgl_examples SYSTEM PUBLIC ${LVGL_ROOT_DIR}/examples) + target_link_libraries(lvgl_examples PUBLIC lvgl) +endif() + +# Build LVGL demos library +if(NOT LV_CONF_BUILD_DISABLE_DEMOS) + add_library(lvgl_demos ${DEMO_SOURCES}) + add_library(lvgl::demos ALIAS lvgl_demos) + + target_include_directories(lvgl_demos SYSTEM PUBLIC ${LVGL_ROOT_DIR}/demos) + target_link_libraries(lvgl_demos PUBLIC lvgl) +endif() + +# Lbrary and headers can be installed to system using make install +file(GLOB LVGL_PUBLIC_HEADERS "${CMAKE_SOURCE_DIR}/lv_conf.h" + "${CMAKE_SOURCE_DIR}/lvgl.h") + +if("${LIB_INSTALL_DIR}" STREQUAL "") + set(LIB_INSTALL_DIR "lib") +endif() +if("${RUNTIME_INSTALL_DIR}" STREQUAL "") + set(RUNTIME_INSTALL_DIR "bin") +endif() +if("${INC_INSTALL_DIR}" STREQUAL "") + set(INC_INSTALL_DIR "include/lvgl") +endif() + +#Install headers +install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/" + FILES_MATCHING + PATTERN "*.h") + +# install example headers +if(NOT LV_CONF_BUILD_DISABLE_EXAMPLES) + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/examples" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/" + FILES_MATCHING + PATTERN "*.h") +endif() + +# install demo headers +if(NOT LV_CONF_BUILD_DISABLE_DEMOS) + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/demos" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/" + FILES_MATCHING + PATTERN "*.h") +endif() + + +configure_file("${LVGL_ROOT_DIR}/lvgl.pc.in" lvgl.pc @ONLY) + +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/lvgl.pc" + DESTINATION "${LIB_INSTALL_DIR}/pkgconfig/") + +# Install library +set_target_properties( + lvgl + PROPERTIES OUTPUT_NAME lvgl + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}") + +install( + TARGETS lvgl + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}" + RUNTIME DESTINATION "${RUNTIME_INSTALL_DIR}" + PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}") + + +# Install library thorvg +if(NOT LV_CONF_BUILD_DISABLE_THORVG_INTERNAL) + set_target_properties( + lvgl_thorvg + PROPERTIES OUTPUT_NAME lvgl_thorvg + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}") + + install( + TARGETS lvgl_thorvg + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}" + RUNTIME DESTINATION "${RUNTIME_INSTALL_DIR}" + PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}") +endif() + +# Install library demos +if(NOT LV_CONF_BUILD_DISABLE_DEMOS) + set_target_properties( + lvgl_demos + PROPERTIES OUTPUT_NAME lvgl_demos + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}") + + install( + TARGETS lvgl_demos + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}" + RUNTIME DESTINATION "${RUNTIME_INSTALL_DIR}" + PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}") +endif() + +#install library examples +if(NOT LV_CONF_BUILD_DISABLE_EXAMPLES) + set_target_properties( + lvgl_examples + PROPERTIES OUTPUT_NAME lvgl_examples + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" + PUBLIC_HEADER "${LVGL_PUBLIC_HEADERS}") + + install( + TARGETS lvgl_examples + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}" + RUNTIME DESTINATION "${RUNTIME_INSTALL_DIR}" + PUBLIC_HEADER DESTINATION "${INC_INSTALL_DIR}") +endif() \ No newline at end of file diff --git a/libraries/lvgl/env_support/cmake/esp.cmake b/libraries/lvgl/env_support/cmake/esp.cmake new file mode 100644 index 0000000..19762c0 --- /dev/null +++ b/libraries/lvgl/env_support/cmake/esp.cmake @@ -0,0 +1,54 @@ +file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c ${LVGL_ROOT_DIR}/src/*.cpp) + +idf_build_get_property(LV_MICROPYTHON LV_MICROPYTHON) + +if(LV_MICROPYTHON) + idf_component_register( + SRCS + ${SOURCES} + INCLUDE_DIRS + ${LVGL_ROOT_DIR} + ${LVGL_ROOT_DIR}/src + ${LVGL_ROOT_DIR}/../ + REQUIRES + main) +else() + if(CONFIG_LV_BUILD_EXAMPLES) + file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c) + set_source_files_properties(${EXAMPLE_SOURCES} COMPILE_FLAGS "-Wno-unused-variable -Wno-format") + endif() + + if(CONFIG_LV_USE_DEMO_WIDGETS) + file(GLOB_RECURSE DEMO_WIDGETS_SOURCES ${LVGL_ROOT_DIR}/demos/widgets/*.c) + list(APPEND DEMO_SOURCES ${DEMO_WIDGETS_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER) + file(GLOB_RECURSE DEMO_KEYPAD_AND_ENCODER_SOURCES ${LVGL_ROOT_DIR}/demos/keypad_encoder/*.c) + list(APPEND DEMO_SOURCES ${DEMO_KEYPAD_AND_ENCODER_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_BENCHMARK) + file(GLOB_RECURSE DEMO_BENCHMARK_SOURCES ${LVGL_ROOT_DIR}/demos/benchmark/*.c) + list(APPEND DEMO_SOURCES ${DEMO_BENCHMARK_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_STRESS) + file(GLOB_RECURSE DEMO_STRESS_SOURCES ${LVGL_ROOT_DIR}/demos/stress/*.c) + list(APPEND DEMO_SOURCES ${DEMO_STRESS_SOURCES}) + endif() + if(CONFIG_LV_USE_DEMO_MUSIC) + file(GLOB_RECURSE DEMO_MUSIC_SOURCES ${LVGL_ROOT_DIR}/demos/music/*.c) + list(APPEND DEMO_SOURCES ${DEMO_MUSIC_SOURCES}) + set_source_files_properties(${DEMO_MUSIC_SOURCES} COMPILE_FLAGS "-Wno-format") + endif() + + idf_component_register(SRCS ${SOURCES} ${EXAMPLE_SOURCES} ${DEMO_SOURCES} + INCLUDE_DIRS ${LVGL_ROOT_DIR} ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../ + ${LVGL_ROOT_DIR}/examples ${LVGL_ROOT_DIR}/demos + REQUIRES esp_timer) +endif() + +target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE") + +if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM) + target_compile_definitions(${COMPONENT_LIB} + PUBLIC "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR") +endif() diff --git a/libraries/lvgl/env_support/cmake/micropython.cmake b/libraries/lvgl/env_support/cmake/micropython.cmake new file mode 100644 index 0000000..ad0ec01 --- /dev/null +++ b/libraries/lvgl/env_support/cmake/micropython.cmake @@ -0,0 +1,18 @@ +file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c) +file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c) + +# With micropython, build lvgl as interface library, link chain is: +# lvgl_interface [lvgl] → usermod_lvgl_bindings [lv_bindings] → usermod +# [micropython] → firmware [micropython] +add_library(lvgl_interface INTERFACE) +# ${SOURCES} must NOT be given to add_library directly for some reason (won't be +# built) +target_sources(lvgl_interface INTERFACE ${SOURCES}) +# Micropython builds with -Werror; we need to suppress some warnings, such as: +# +# /home/test/build/lv_micropython/ports/rp2/build-PICO/lv_mp.c:29316:16: error: +# 'lv_style_transition_dsc_t_path_xcb_callback' defined but not used +# [-Werror=unused-function] 29316 | STATIC int32_t +# lv_style_transition_dsc_t_path_xcb_callback(const lv_anim_t * arg0) | +# ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +target_compile_options(lvgl_interface INTERFACE -Wno-unused-function) diff --git a/libraries/lvgl/env_support/cmake/zephyr.cmake b/libraries/lvgl/env_support/cmake/zephyr.cmake new file mode 100644 index 0000000..f9ae517 --- /dev/null +++ b/libraries/lvgl/env_support/cmake/zephyr.cmake @@ -0,0 +1,14 @@ +if(CONFIG_LVGL) + + zephyr_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl) + + target_include_directories(lvgl INTERFACE ${LVGL_ROOT_DIR}) + + zephyr_compile_definitions(LV_CONF_KCONFIG_EXTERNAL_INCLUDE=) + + zephyr_library() + + file(GLOB_RECURSE SOURCES ${LVGL_ROOT_DIR}/src/*.c) + zephyr_library_sources(${SOURCES}) + +endif(CONFIG_LVGL) diff --git a/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.9.1.0.pack b/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.9.1.0.pack new file mode 100644 index 0000000..ff287e0 Binary files /dev/null and b/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.9.1.0.pack differ diff --git a/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc b/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc new file mode 100644 index 0000000..6f42e55 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc @@ -0,0 +1,1937 @@ + + + + + + + LVGL + lvgl + LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. + https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/ + https://github.com/lvgl/lvgl/issues/new/choose + LICENCE.txt + + + + https://github.com/lvgl/lvgl.git + + + + - LVGL 9.1.0 + - See Change Log + + + - LVGL 8.4.0 + - Some minor fixes + + + - LVGL 9.0.0 + - Implements a New Render Architecture that enables parallel processing + - Accelerates SW-Render with NEON and Helium technology for Cortex architectures. + - Adds supports for GPUs: VG-Lite, PXP, Dave2D and etc. + - Adds display drivers + - Adds Demos for benchmarks, render test etc, + - Other fixes + + + + - LVGL 8.3.11 + - Add LittleFS Library to LVGL8 + - Backport Tiny TTF to LVGL8 + - Some minor fixes + + + - LVGL 8.3.10 + - Some minor fixes + + + - LVGL 8.3.10 + - Add snapshot, fragment, imgfont, gridnav, msg and monkey + - Other minor fixes + + + - LVGL 8.3.8 + - Add renesas-ra6m3 gpu adaptation + - Improve performance and add more features for PXP and VGLite + - Minor updates + + + - LVGL 8.3.7 release + - Various fixes + + + - LVGL 8.3.6 release + - Various fixes + + + - LVGL 8.3.5 release + - Use LVGL version as the cmsis-pack version + - Fix GPU support for NXP PXP and NXP VGLite + - Rework stm32 DMA2D support + - Various fixes + + + - LVGL 9.0.0-dev + - The final update for 2022, Happy New Year + + + - LVGL 9.0.0-dev + - Montyly update for November + + + - LVGL 9.0.0-dev + - Montyly update for October + + + - LVGL 9.0.0-dev + - Montyly update for September + - Introduce a new component: File Explorer + - Add support for TTF (Tiny TTF) + - Add GPU Support for GD32F450-IPA + + + - LVGL 9.0.0-dev + - Add the binding for pikascript (an ultra-light-weight python VM) + - Montyly update for August + + + - LVGL 9.0.0-dev + - Renderer refactory + - Update GPU-Arm-2D + - Other updates + + + - LVGL 8.3.0 release + - Apply patch for memory leaking issue + - Apply patch to speed up non normal blend mode + - Add 9-key input mode to pinyin + - Other minor changes + + + - LVGL 8.3.0-dev + - Monthly update for June + - Add Pinyin as input method + - Update benchmark to support RGB565-A8 + - Update support for layers + + + - LVGL 8.3.0-dev + - Monthly update for May + - Update drawing service + - Update GPU support for Arm-2D library + - Update GPU support for NXP PXP/VGLite + - Improving the accuracy of benchmark. + - Add new colour support for RGB565A8 + + + - LVGL 8.3.0-dev + - Monthly update for April + - Add GPU support for SWM341-DMA2D + + + - LVGL 8.3.0-dev + - Monthly update for March + - Add GPU support for Arm-2D library + + + - LVGL 8.3.0-dev + - Monthly update for February + + + - LVGL 8.2.0 + - Enable LV_TICK_CUSTOM when perf_counter is detected. + - Celebrate Spring Festival + + + + + + Cortex-M + SysTick + Performance Analaysis + + + + + + + + + + + + + + Support NEON based processors + + + + + + + + + + + + + Support Helium based processors + + + + + + + + + + + + + + + + + + Require LVGL Essential Service + + + + + Require LVGL Essential Service and Demo Assets + + + + + + Dependency of Benchmark + + + + + + Require Arm-2D Support + + + + + Condition for STM32-DMA2D + + + + + + + + + + + + Condition for SWM341-DMA2D + + + + + + + + + + + + Condition for NXP-PXP + + + + + + + + + + + + Condition for NXP-VGLite + + + + + + + + + + + + Condition for GD32-IPA + + + + + + + + + + + + Condition for Renesas-Dave2D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. + + + The Essential services of LVGL (without extra content) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/*! \brief use lv_config_cmsis.h which will be pre-included */ +#define LV_CONF_SKIP +#define LV_LVGL_H_INCLUDE_SIMPLE 1 + + + + +/*! \brief Enable LVGL */ +#define RTE_GRAPHICS_LVGL + + + + + + Add the display driver for Windows backend + + + + + + + +/* use display driver for Windows backend*/ */ +#define LV_USE_WINDOWS 1 + + + + + + Add the display driver for Linux /dev/dri/card*/ + + + + + +/* use display driver for Linux /dev/dri/card*/ */ +#define LV_USE_LINUX_DRM 1 + + + + + + Add the display driver for Linux /dev/fb + + + + + + +/* use display driver for Linux /dev/fb */ +#define LV_USE_LINUX_FBDEV 1 + + + + + + Add the display driver for TFT_eSPI + + + + + +/* use display driver for TFT_eSPI */ +#define LV_USE_TFT_ESPI 1 + + + + + + Add the display driver for ILI9341 + + + + + +/* use display driver for ILI9341 */ +#define LV_USE_ILI9341 1 + + + + + + Add the display driver for st7735 + + + + + +/* use display driver for st7735 */ +#define LV_USE_ST7735 1 + + + + + + Add the display driver for st7789 + + + + + +/* use display driver for st7789 */ +#define LV_USE_ST7789 1 + + + + + + Add the display driver for st7796 + + + + + +/* use display driver for st7796 */ +#define LV_USE_ST7796 1 + + + + + + Add the support for pthreads + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_PTHREAD + + + + + + + Add the support for FreeRTOS + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_FREERTOS + + + + + + + Add the support for CMSIS-RTOS2 APIs + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_CMSIS_RTOS2 + + + + + + + Add the support for RT-Thread APIs + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_RTTHREAD + + + + + + + Add the support for Windows APIs + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_WINDOWS + + + + + + + Add a user customized (RT)OS support + + + + + + + +/* Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM + */ +#define LV_USE_OS LV_OS_CUSTOM +#define LV_OS_CUSTOM_INCLUDE "lv_os_custom.h" + + + + + + + Porting Templates for display devices. + + + + + + + + Porting Templates for STM32 devices. + + + + + + + + Porting Templates for input devices. + + + + + + + + Porting Templates for the file system. + + + + + + + + An hardware acceleration from Renesas Dave2D + + + + + + + + + + + + + + + +/*! \brief enable Renesas Dave2D */ +#define LV_USE_DRAW_DAVE2D 1 + + + + + + An hardware acceleration from NXP-PXP + + + + + + + + + + + + + +/*! \brief enable NXP PXP */ +#define LV_USE_DRAW_PXP 1 + + + + + + An hardware acceleration from NXP-VGLite + + + + + + + + + + + + + + + + + + + +/*! \brief enable NXP VGLite */ +#define LV_USE_DRAW_VGLITE 1 + + + + + + An hardware acceleration from VG-Lite GPU + + + + + + + + + + + + + + + + + + + + + + + + +/*! \brief enable VG-Lite GPU */ +#define LV_USE_DRAW_VG_LITE 1 + + + + + + Using existing SDL2 APIs for acceleration + + + + + + +/*! \brief enable SDL2 acceleration*/ +#define LV_USE_DRAW_SDL 1 + + + + + + + + + + + Add the Barcode code library + + + + + + + + +/*! \brief enable Barcode support */ +#define LV_USE_BARCODE 1 + + + + + + Add BMP decoder library + + + + + + + +/*! \brief enable BMP support */ +#define LV_USE_BMP 1 + + + + + + + Add FFmpeg library for image decoding and playing videos, an extra librbary is required. + + + + + + + +/*! \brief enable ffmpeg support */ +#define LV_USE_FFMPEG 1 + + + + + + Add FreeType library, an extra librbary is required. + + + + + + + + + + +/*! \brief enable freetype support */ +#define LV_USE_FREETYPE 1 + + + + + + + Add API for FATFS (needs to be added separately). Uses f_open, f_read, etc + + + + + + + +/*! \brief enable FATFS support */ +#define LV_USE_FS_FATFS 1 + + + + + + Add API for memory-mapped file access. + + + + + + + +/*! \brief enable memory-mapped file access */ +#define LV_USE_FS_MEMFS 1 + + + + + + Add API for file access via POSIX + + + + + + + +/*! \brief enable POSIX file access */ +#define LV_USE_FS_POSIX 1 + + + + + + Add API for file access via STDIO + + + + + + + +/*! \brief enable STDIO file access */ +#define LV_USE_FS_STDIO 1 + + + + + + Add API for file access via LittleFs + + + + + + + +/*! \brief enable LittleFs file access */ +#define LV_USE_FS_LITTLEFS 1 + + + + + + + + Add GIF support + + + + + + + + +/*! \brief enable gif support */ +#define LV_USE_GIF 1 + + + + + + Add libjpeg-turbo decoder library + + + + + + + +/*! \brief enable ibjpeg-turbo decoder */ +#define LV_USE_LIBJPEG_TURBO 1 + + + + + + Add PNG decoder(libpng) library + + + + + + + +/*! \brief enable PNG decoder(libpng) library */ +#define LV_USE_LIBPNG 1 + + + + + + Add LODEPNG decoder library + + + + + + + + +/*! \brief enable LODEPNG decoder library */ +#define LV_USE_LODEPNG 1 + + + + + + Add LZ4 compress/decompress lib + + + + + + + +/*! \brief enable LZ4 compress/decompress lib */ +#define LV_USE_LZ4 1 +#define LV_USE_LZ4_INTERNAL 1 +#define LV_USE_LZ4_EXTERNAL 0 + + + + + + Add QR code library + + + + + + + + +/*! \brief enable QR code library */ +#define LV_USE_QRCODE 1 + + + + + + + Add LVGL's version of RLE compression method support + + + + + + +/*! \brief LVGL's version of RLE compression method support */ +#define LV_USE_RLE 1 + + + + + Add Rlottie library, an extra librbary is required. + + + + + + + +/*! \brief enable Rlottie library */ +#define LV_USE_RLOTTIE 1 + + + + + + Add ThorVG (vector graphics library), an extra librbary is required. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/*! \brief enable ThorVG (vector graphics library) */ +#define LV_USE_VECTOR_GRAPHIC 1 +#define LV_USE_THORVG_INTERNAL 1 +#define LV_USE_THORVG_EXTERNAL 0 + + + + + + Add Built-in TTF decoder + + + + + + + + +/*! \brief enable Built-in TTF decoder */ +#define LV_USE_TINY_TTF 1 + + + + + + Add JPG + split JPG decoder library. Split JPG is a custom format optimized for embedded systems. + + + + + + + + +/*! \brief enable JPG + split JPG decoder library. */ +#define LV_USE_TJPGD 1 + + + + + + + Add a file explorer + + + + + + + +/*! \brief enable file explorer support */ +#define LV_USE_FILE_EXPLORER 1 + + + + + + Add the Fragment service + + + + + + + + +/*! \brief enable lv_obj fragment */ +#define LV_USE_FRAGMENT 1 + + + + + + Add the Grid Navigation service + + + + + + + +/*! \brief enable the Grid Navigation support*/ +#define LV_USE_GRIDNAV 1 + + + + + + Add Pinyin input method + + + + + + + +/*! \brief Pinyin input method */ +#define LV_USE_IME_PINYIN 1 + + + + + + Add Support for using images as font in label or span widgets + + + + + + + +/*! \brief Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 1 + + + + + + Add the Monkey test service + + + + + + + +/*! \brief enable Monkey test*/ +#define LV_USE_MONKEY 1 + + + + + + Add the API to take snapshot for object + + + + + + + +/*! \brief enable API to take snapshot for object */ +#define LV_USE_SNAPSHOT 1 + + + + + + Add the official benchmark. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add the official benchmark. + + + + + + + + +/*! \brief enable demo:bencharmk */ +#define LV_USE_DEMO_BENCHMARK 1 + + + + + + Add the Flex layout demo + + + + + + + + + + + + +/*! \brief enable the Flex layout demo */ +#define LV_USE_DEMO_FLEX_LAYOUT 1 + + + + + + Add the demonstrate the usage of encoder and keyboard + + + + + + + + +/*! \brief enable the demonstrate the usage of encoder and keyboard */ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 1 + + + + + + + Add the Smart-phone like multi-language demo. + + + + + + + +/*! \brief enable the Smart-phone like multi-language demo */ +#define LV_USE_DEMO_MULTILANG 1 + + + + + + Add the music player demo + + + + + + + + + + +/*! \brief enable the music player demo */ +#define LV_USE_DEMO_MUSIC 1 + + + + + + Add the demonstration for scroll settings + + + + + + + +/*! \brief enable the demonstration for scroll settings */ +#define LV_USE_DEMO_SCROLL 1 + + + + + + Add the Stress test for LVGL + + + + + + + +/*! \brief enable the Stress test for LVGL */ +#define LV_USE_DEMO_STRESS 1 + + + + + + Add the Widget transformation demo + + + + + + + +/*! \brief enable the Widget transformation demo */ +#define LV_USE_DEMO_TRANSFORM 1 + + + + + + Add the Vector graphic demo + + + + + + + +/*! \brief enable the Vector graphic demo */ +#define LV_USE_DEMO_VECTOR_GRAPHIC 1 + + + + + + Add the demo:widgets + + + + + + + +/*! \brief enable demo:widgets support */ +#define LV_USE_DEMO_WIDGETS 1 + + + + + + Add the Render test for each primitives. Requires at least 480x272 display + + + + + + + + +/*! \brief add Render test for each primitives */ +#define LV_USE_DEMO_RENDER 1 + + + + + + + + + + diff --git a/libraries/lvgl/env_support/cmsis-pack/LVGL.pidx b/libraries/lvgl/env_support/cmsis-pack/LVGL.pidx new file mode 100644 index 0000000..efc91bb --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/LVGL.pidx @@ -0,0 +1,9 @@ + + + LVGL + https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/ + 2024-03-19 + + + + diff --git a/libraries/lvgl/env_support/cmsis-pack/README.md b/libraries/lvgl/env_support/cmsis-pack/README.md new file mode 100644 index 0000000..3e17307 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/README.md @@ -0,0 +1,269 @@ +# How to Create CMSIS-Pack + + + +## STEP 1 Update 'lv_conf_cmsis.h' + +1. Copy the **lv_conf_template.h** to '**cmsis-pack**' directory + +2. Set the macro protector to '1' + +```c +... +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ +... +``` + +remove the misleading guide above this code segment. + +```c +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ +``` + + +3. Add including for '**RTE_Components.h**' + +```c +#ifndef LV_CONF_H +#define LV_CONF_H + +#include "RTE_Components.h" +... +``` +4. Remove macro definitions for + + - LV_USE_DEMO_WIDGETS + + - LV_USE_DEMO_BENCHMARK + + - LV_USE_IME_PINYIN + + - LV_USE_OS + + - LV_USE_FILE_EXPLORER + + - LV_USE_DEMO_WIDGETS + + - LV_USE_DEMO_KEYPAD_AND_ENCODER + + - LV_USE_DEMO_BENCHMARK + + - LV_USE_DEMO_RENDER + + - LV_USE_DEMO_STRESS + + - LV_USE_DEMO_MUSIC + + - LV_USE_DEMO_FLEX_LAYOUT + + - LV_USE_DEMO_MULTILANG + + - LV_USE_DEMO_TRANSFORM + + - LV_USE_DEMO_SCROLL + + - LV_USE_DEMO_VECTOR_GRAPHIC + + - LV_USE_DRAW_VGLITE + + - LV_USE_DRAW_VG_LITE + + - LV_USE_DRAW_PXP + + - LV_USE_DRAW_SDL + + - LV_USE_DRAW_ARM2D + + - LV_USE_SNAPSHOT + + - LV_USE_MONKEY + + - LV_USE_GRIDNAV + + - LV_USE_FRAGMENT + + - LV_USE_IMGFONT + + - LV_USE_LINUX_DRM + + - LV_USE_TFT_ESPI + + - LV_USE_ST7735 + + - LV_USE_ST7789 + + - LV_USE_ST7796 + + - LV_USE_ILI9341 + + + +5. Update `LV_LOG_PRINTF` to `1` and `LV_LOG_LEVEL` to `LV_LOG_LEVEL_USER` + + +6. Set `LV_FONT_MONTSERRAT_12`, `LV_FONT_MONTSERRAT_24` and `LV_FONT_MONTSERRAT_16` to `1` (So Widgets and Benchmark can be compiled correctly, this is for improving the out of box experience.) + + +7. Update macro `LV_ATTRIBUTE_MEM_ALIGN` and `LV_ATTRIBUTE_MEM_ALIGN_SIZE` to force a WORD alignment. +```c +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 +#define LV_DRAW_BUF_STRIDE_ALIGN 4 +#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4))) +``` +Make sure `LV_MEM_SIZE` is no less than `(128*1024U)`. + +8. Remove following macro definitions in the `3rd party libraries` section: + + - \#define LV_USE_FS_STDIO 0 + - \#define LV_USE_FS_POSIX 0 + - \#define LV_USE_FS_WIN32 0 + - \#define LV_USE_FS_FATFS 0 + - #define LV_USE_FS_LITTLEFS 0 + - #define LV_USE_FS_MEMFS 0 + - \#define LV_USE_LODEPNG 0 + - #define LV_USE_LIBPNG 0 + - \#define LV_USE_BMP 0 + - \#define LV_USE_RLE 0 + - #define LV_USE_TJPGD 0 + - #define LV_USE_LIBJPEG_TURBO 0 + - \#define LV_USE_GIF 0 + - \#define LV_USE_BARCODE 0 + - \#define LV_USE_QRCODE 0 + - \#define LV_USE_FREETYPE 0 + - \#define LV_USE_TINY_TTF 0 + - \#define LV_USE_RLOTTIE 0 + - \#define LV_USE_FFMPEG 0 + +9. update the definition of following macros: `LV_USE_VECTOR_GRAPHIC`, `LV_USE_THORVE_INTERNAL` and `LV_USE_THORVE_EXTERNAL` as + + ```c + /*Enable Vector Graphic APIs*/ + #ifndef LV_USE_VECTOR_GRAPHIC + # define LV_USE_VECTOR_GRAPHIC 0 + + /* Enable ThorVG (vector graphics library) from the src/libs folder */ + # define LV_USE_THORVG_INTERNAL 0 + + /* Enable ThorVG by assuming that its installed and linked to the project */ + # define LV_USE_THORVG_EXTERNAL 0 + #endif + ``` + +10. update the definition of following macros: `LV_USE_LZ4`, `LV_USE_LZ4_INTERNAL` and `LV_USE_LZ4_EXTERNAL` as + + ```c + /*Enable LZ4 compress/decompress lib*/ + #ifndef LV_USE_LZ4 + # define LV_USE_LZ4 0 + + /*Use lvgl built-in LZ4 lib*/ + # define LV_USE_LZ4_INTERNAL 0 + + /*Use external LZ4 library*/ + # define LV_USE_LZ4_EXTERNAL 0 + #endif + ``` + + +11. Add the following code to `HAL SETTINGS`: + +```c +/*customize tick-get */ +#if defined(__PERF_COUNTER__) && __PERF_COUNTER__ + #define LV_GLOBAL_INIT(__GLOBAL_PTR) \ + do { \ + lv_global_init((lv_global_t *)(__GLOBAL_PTR)); \ + extern uint32_t perfc_tick_get(void); \ + (__GLOBAL_PTR)->tick_state.tick_get_cb = perfc_tick_get; \ + } while(0) +#endif +``` + + + +12. Replace the macro definition: + +```c +#define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE +``` + +with: + +```c + #if !defined(LV_USE_DRAW_SW_ASM) && defined(RTE_Acceleration_Arm_2D) + /*turn-on helium acceleration when Arm-2D and the Helium-powered device are detected */ + #if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_HELIUM + #define LV_USE_DRAW_ARM2D 1 + #endif + #endif + + #ifndef LV_USE_DRAW_SW_ASM + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + #endif +``` + +13. Update macro `LV_PROFILER_INCLUDE`: + +```c +#define LV_PROFILER_INCLUDE "src/misc/lv_profiler_builtin.h" +``` + + + +14. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'. + + + +## STEP 2 Check, Update and Run the 'gen_pack.sh' + +```sh +if [ `uname -s` = "Linux" ] + then + CMSIS_PACK_PATH="/home/$USER/.arm/Packs/ARM/CMSIS/5.7.0/" + PATH_TO_ADD="$CMSIS_PACK_PATH/CMSIS/Utilities/Linux64/" +else + CMSIS_PACK_PATH="/C/Users/$USER/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" + PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" +fi +[[ ":$PATH:" != *":$PATH_TO_ADD}:"* ]] && PATH="${PATH}:${PATH_TO_ADD}" +echo $PATH_TO_ADD appended to PATH +echo " " +``` + + + +### A. For Windows users + +Update the '**CMSIS_PACK_PATH**' accordingly (Usually just replace the name gabriel with your own windows account name is sufficient.). + +Update the '**PATH_TO_ADD**' to point to the installation folders of **7Zip** and **xmllint**. + +Launch the git-bash and go to the cmsis-pack folder. + +enter the following command: + +```sh +./gen_pack.sh +``` + + + +### B. For Linux Users + +Update '**PATH_TO_ADD**' if necessary. + +go to the **cmsis-pack** folder. + +enter the following command: + +```sh +./gen_pack.sh +``` diff --git a/libraries/lvgl/env_support/cmsis-pack/gen_pack.sh b/libraries/lvgl/env_support/cmsis-pack/gen_pack.sh new file mode 100644 index 0000000..4fab5f2 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/gen_pack.sh @@ -0,0 +1,236 @@ +#!/bin/bash +# Version: 1.1 +# Date: 2022-01-11 +# This bash script generates a CMSIS Software Pack: +# +# Pre-requisites: +# - bash shell (for Windows: install git for Windows) +# - 7z in path (zip archiving utility) +# e.g. Ubuntu: sudo apt-get install p7zip-full p7zip-rar) +# - PackChk in path with execute permission +# (see CMSIS-Pack: CMSIS/Utilities//PackChk) +# - xmllint in path (XML schema validation) +# e.g. Ubuntu: sudo apt-get install libxml2-utils +# Windows: download from https://www.zlatkovic.com/pub/libxml/ + +############### EDIT BELOW ############### +# Extend Path environment variable locally +# +if [ `uname -s` = "Linux" ] + then + CMSIS_PACK_PATH="/home/$USER/.arm/Packs/ARM/CMSIS/5.7.0/" + PATH_TO_ADD="$CMSIS_PACK_PATH/CMSIS/Utilities/Linux64/" +else + CMSIS_PACK_PATH="/C/Users/$USER/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" + PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:/C/Program Files/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" +fi +[[ ":$PATH:" != *":$PATH_TO_ADD}:"* ]] && PATH="${PATH}:${PATH_TO_ADD}" +echo $PATH_TO_ADD appended to PATH +echo " " + +# Pack warehouse directory - destination +PACK_WAREHOUSE=./ + +# Temporary pack build directory +PACK_BUILD=build/ + +# Specify directories included in pack relative to base directory +# All directories: +# PACK_DIRS=`ls -d */` +# Do not include the build directory if it is local +# PACK_DIRS=${PACK_DIRS//$PACK_BUILD/} +# PACK_DIRS=${PACK_DIRS//$PACK_WAREHOUSE/} + +# alternative: specify directory names to be added to pack base directory +PACK_DIRS=" + ../../src + ../../demos + ../../env_support/pikascript +" + + +# Specify file names to be added to pack base directory +PACK_BASE_FILES=" + ../../LICENCE.txt + ../../README.md + ../../lvgl.h + lv_conf_cmsis.h + lv_cmsis_pack.txt +" + +############ DO NOT EDIT BELOW ########### +echo Starting CMSIS-Pack Generation: `date` +# Zip utility check +ZIP=7z +type -a $ZIP +errorlevel=$? +if [ $errorlevel -gt 0 ] + then + echo "Error: No 7zip Utility found" + echo "Action: Add 7zip to your path" + echo " " + exit +fi + +# Pack checking utility check +PACKCHK=PackChk +type -a $PACKCHK +errorlevel=$? +if [ $errorlevel != 0 ] + then + echo "Error: No PackChk Utility found" + echo "Action: Add PackChk to your path" + echo "Hint: Included in CMSIS Pack:" + echo "/ARM/CMSIS//CMSIS/Utilities//" + echo " " + exit +fi +echo " " + +# XML syntax checking utility check +XMLLINT=xmllint +type -a $XMLLINT +errorlevel=$? +if [ $errorlevel != 0 ] + then + echo "Error: No xmllint found" + echo "Action: Add xmllint to your path" + echo " " + exit +fi +echo " " + +# Locate Package Description file +# check whether there is more than one pdsc file +NUM_PDSCS=`ls -1 *.pdsc | wc -l` +PACK_DESCRIPTION_FILE=`ls *.pdsc` +if [ $NUM_PDSCS -lt 1 ] + then + echo "Error: No *.pdsc file found in current directory" + echo " " +elif [ $NUM_PDSCS -gt 1 ] + then + echo "Error: Only one PDSC file allowed in directory structure:" + echo "Found:" + echo "$PACK_DESCRIPTION_FILE" + echo "Action: Delete unused pdsc files" + echo " " + exit +fi + +SAVEIFS=$IFS +IFS=. +set $PACK_DESCRIPTION_FILE +# Pack Vendor +PACK_VENDOR=$1 +# Pack Name +PACK_NAME=$2 +echo Generating Pack Version: for $PACK_VENDOR.$PACK_NAME +echo " " +IFS=$SAVEIFS + +#if $PACK_BUILD directory does not exist, create it. +if [ ! -d $PACK_BUILD ]; then + mkdir -p $PACK_BUILD +fi + +mkdir -p ${PACK_BUILD}/examples +mkdir -p ${PACK_BUILD}/examples/porting + + + +# directories +echo Adding directories to pack: +echo $PACK_DIRS +echo " " +for d in ${PACK_DIRS} +do + cp -r "$d" ${PACK_BUILD} +done + +# files for base directory +echo Adding files to pack: +echo $PACK_BASE_FILES +echo " " +for f in $PACK_BASE_FILES +do + cp -f "$f" $PACK_BUILD/ +done + +# Copy files into build base directory: $PACK_BUILD +# pdsc file is mandatory in base directory: +cp -f ./$PACK_VENDOR.$PACK_NAME.pdsc ${PACK_BUILD} +cp -f ../../examples/porting/* ${PACK_BUILD}/examples/porting +cp -f ./lv_os_custom_c.txt ${PACK_BUILD}/src/osal/lv_os_custom.c +cp -f ./lv_os_custom_h.txt ${PACK_BUILD}/src/osal/lv_os_custom.h + +mv "${PACK_BUILD}/lv_cmsis_pack.txt" "${PACK_BUILD}/lv_cmsis_pack.c" + +# Run Schema Check (for Linux only): +# sudo apt-get install libxml2-utils + +echo Running schema check for $PACK_VENDOR.$PACK_NAME.pdsc +$XMLLINT --noout --schema ${CMSIS_PACK_PATH}/CMSIS/Utilities/PACK.xsd $PACK_BUILD/$PACK_VENDOR.$PACK_NAME.pdsc +errorlevel=$? +if [ $errorlevel -ne 0 ]; then + echo "build aborted: Schema check of $PACK_VENDOR.$PACK_NAME.pdsc against PACK.xsd failed" + echo " " + exit +fi + +# Run Pack Check and generate PackName file with version +$PACKCHK $PACK_BUILD/$PACK_VENDOR.$PACK_NAME.pdsc -n PackName.txt -x M362 +errorlevel=$? +if [ $errorlevel -ne 0 ]; then + echo "build aborted: pack check failed" + echo " " + exit +fi + +PACKNAME=`cat PackName.txt` +rm -rf PackName.txt + +# echo apply patches... +# rm -rf $PACK_BUILD/demos/lv_demos.h +# cp -f ./lv_demos.h $PACK_BUILD/demos/ + +echo delete files... +find $PACK_BUILD/demos/ -type f -name "*.png" -delete +find $PACK_BUILD/demos/ -type f -name "*.gif" -delete +find $PACK_BUILD/demos/ -type f -name "*.gif" -delete +find $PACK_BUILD/demos/ -type f -name "*.ttf" -delete +find $PACK_BUILD/demos/ -type f -name "*.otf" -delete +find $PACK_BUILD/demos/ -type f -name "*.jpg" -delete +find $PACK_BUILD/demos/ -type f -name "*.fnt" -delete + +# Archiving +# $ZIP a $PACKNAME +echo creating pack file $PACKNAME +#if $PACK_WAREHOUSE directory does not exist create it +if [ ! -d $PACK_WAREHOUSE ]; then + mkdir -p $PACK_WAREHOUSE +fi +pushd $PACK_WAREHOUSE +PACK_WAREHOUSE=`pwd` +popd +pushd $PACK_BUILD +"$ZIP" a $PACK_WAREHOUSE/$PACKNAME -tzip +popd +errorlevel=$? +if [ $errorlevel -ne 0 ]; then + echo "build aborted: archiving failed" + exit +fi + +# cp -f ./$PACK_VENDOR.$PACK_NAME.pdsc ${PACK_WAREHOUSE} + + +echo "build of pack succeeded" +# Clean up +echo "cleaning up ..." + +rm -rf $PACK_BUILD + +echo " " + +echo Completed CMSIS-Pack Generation: `date` \ No newline at end of file diff --git a/libraries/lvgl/env_support/cmsis-pack/lv_cmsis_pack.txt b/libraries/lvgl/env_support/cmsis-pack/lv_cmsis_pack.txt new file mode 100644 index 0000000..b7fa415 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/lv_cmsis_pack.txt @@ -0,0 +1,139 @@ +/**************************************************************************** +* Copyright 2022 Gorgon Meducer (Email:embedded_zhuoran@hotmail.com) * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +****************************************************************************/ + +/** + * @file lv_cmsis_pack.c + * + * @brief This file will only be used by cmsis-pack. + */ + +/********************* + * INCLUDES + *********************/ +#include "RTE_Components.h" +#include + +#if defined(__PERF_COUNTER__) && __PERF_COUNTER__ +# include "perf_counter.h" +#endif + +#include +#include +#include "lv_global.h" + +/********************* + * DEFINES + *********************/ +#define state LV_GLOBAL_DEFAULT()->tick_state + + /********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + + /********************** + * STATIC VARIABLES + **********************/ + + /********************** + * MACROS + **********************/ + + /*! \name The macros to identify the compiler */ +/*! @{ */ + +/*! \note for IAR */ +#undef __IS_COMPILER_IAR__ +#if defined(__IAR_SYSTEMS_ICC__) +# define __IS_COMPILER_IAR__ 1 +#endif + +/*! \note for arm compiler 5 */ +#undef __IS_COMPILER_ARM_COMPILER_5__ +#if ((__ARMCC_VERSION >= 5000000) && (__ARMCC_VERSION < 6000000)) +# define __IS_COMPILER_ARM_COMPILER_5__ 1 +#endif +/*! @} */ + +/*! \note for arm compiler 6 */ + +#undef __IS_COMPILER_ARM_COMPILER_6__ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +# define __IS_COMPILER_ARM_COMPILER_6__ 1 +#endif + +#undef __IS_COMPILER_ARM_COMPILER__ +#if defined(__IS_COMPILER_ARM_COMPILER_5__) && __IS_COMPILER_ARM_COMPILER_5__ \ +|| defined(__IS_COMPILER_ARM_COMPILER_6__) && __IS_COMPILER_ARM_COMPILER_6__ + +# define __IS_COMPILER_ARM_COMPILER__ 1 + +#endif + + +#undef __IS_COMPILER_LLVM__ +#if defined(__clang__) && !__IS_COMPILER_ARM_COMPILER_6__ +# define __IS_COMPILER_LLVM__ 1 +#else +/*! \note for gcc */ +# undef __IS_COMPILER_GCC__ +# if defined(__GNUC__) && !( defined(__IS_COMPILER_ARM_COMPILER__) \ + || defined(__IS_COMPILER_LLVM__)) +# define __IS_COMPILER_GCC__ 1 +# endif +/*! @} */ +#endif +/*! @} */ + + + /********************** + * GLOBAL FUNCTIONS + **********************/ + +/* When Arm Compilers using the MicroLib, provide an empty implementation for + * time() which is not included in the MicroLib + */ +#if defined(__IS_COMPILER_ARM_COMPILER__) && __IS_COMPILER_ARM_COMPILER__ +# if defined(__MICROLIB) +__attribute__((weak)) +_ARMABI time_t time(time_t * time) +{ + return (time_t)(-1); +} +# endif + + + +# if defined(__PERF_COUNTER__) && __PERF_COUNTER__ +/** + * Get the elapsed milliseconds since start up from perf_counter + * @return the elapsed milliseconds + */ +uint32_t perfc_tick_get(void) +{ + return (uint32_t)get_system_ms(); +} + +# endif + +#endif + + + diff --git a/libraries/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h b/libraries/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h new file mode 100644 index 0000000..244bcfe --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h @@ -0,0 +1,885 @@ +/** + * @file lv_conf.h + * Configuration file for v9.1.0 + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#if defined(_RTE_) + #include "RTE_Components.h" +#endif + +/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (128 * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*customize tick-get */ +#if defined(__PERF_COUNTER__) && __PERF_COUNTER__ + #define LV_GLOBAL_INIT(__GLOBAL_PTR) \ + do { \ + lv_global_init((lv_global_t *)(__GLOBAL_PTR)); \ + extern uint32_t perfc_tick_get(void); \ + (__GLOBAL_PTR)->tick_state.tick_get_cb = perfc_tick_get; \ + } while(0) +#endif + +/*================= + * OPERATING SYSTEM + *=================*/ + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/*The target buffer size for simple layer chunks.*/ +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Enable native helium assembly to be compiled */ + #define LV_USE_NATIVE_HELIUM_ASM 0 + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #if !defined(LV_USE_DRAW_SW_ASM) && defined(RTE_Acceleration_Arm_2D) + /*turn-on helium acceleration when Arm-2D and the Helium-powered device are detected */ + #if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_HELIUM + #define LV_USE_DRAW_ARM2D_SYNC 1 + #endif + #endif + + #ifndef LV_USE_DRAW_SW_ASM + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + #endif + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#define LV_VG_LITE_USE_BOX_SHADOW 0 + +/* VG-Lite gradient image maximum cache number. + * NOTE: The memory usage of a single gradient image is 4K bytes. + */ +#define LV_VG_LITE_GRAD_CACHE_SIZE 32 + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_USER + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 1 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *Data larger than the size of the cache also can be allocated but + *will be dropped immediately after usage.*/ +#define LV_CACHE_DEF_SIZE 0 + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Buffer address alignment*/ + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 4 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4))) + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 1 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_SIMPLE 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for memory-mapped file access. */ +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*API for LittleFs. */ +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*GIF decoder library*/ +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + + +/*FreeType library*/ +#if LV_USE_FREETYPE + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. + *The higher the value, the more memory will be used.*/ + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + + +/*Enable Vector Graphic APIs*/ +#ifndef LV_USE_VECTOR_GRAPHIC +# define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +# define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +# define LV_USE_THORVG_EXTERNAL 0 +#endif + +/*Enable LZ4 compress/decompress lib*/ +#ifndef LV_USE_LZ4 +/*Use lvgl built-in LZ4 lib*/ +# define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +# define LV_USE_LZ4_EXTERNAL 0 +#endif + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 0 + +#if LV_USE_SYSMON + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ +#endif + +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Music player demo*/ +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_c.txt b/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_c.txt new file mode 100644 index 0000000..87427b2 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_c.txt @@ -0,0 +1,120 @@ +/** + * @file lv_os_custom.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_CUSTOM +#include "../misc/lv_types.h" +#include "../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + LV_UNUSED(thread); + LV_UNUSED(callback); + LV_UNUSED(prio); + LV_UNUSED(stack_size); + LV_UNUSED(user_data); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + LV_UNUSED(thread); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CUSTOM*/ diff --git a/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_h.txt b/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_h.txt new file mode 100644 index 0000000..92e0926 --- /dev/null +++ b/libraries/lvgl/env_support/cmsis-pack/lv_os_custom_h.txt @@ -0,0 +1,43 @@ +/** + * @file lv_os_custom.h + * + */ + +#ifndef LV_OS_CUSTOM_H +#define LV_OS_CUSTOM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_CUSTOM + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef int lv_mutex_t; +typedef int lv_thread_t; +typedef int lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CUSTOM*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_CUSTOM_H*/ diff --git a/libraries/lvgl/env_support/esp/rlottie/0001-changes-to-compile-with-esp-idf.patch b/libraries/lvgl/env_support/esp/rlottie/0001-changes-to-compile-with-esp-idf.patch new file mode 100644 index 0000000..324d5f1 --- /dev/null +++ b/libraries/lvgl/env_support/esp/rlottie/0001-changes-to-compile-with-esp-idf.patch @@ -0,0 +1,90 @@ +From 18083a559734d297838e4cf34a856a4770062319 Mon Sep 17 00:00:00 2001 +From: tvanfossen +Date: Tue, 23 Aug 2022 10:06:53 -0400 +Subject: [PATCH] changes to compile with esp-idf + +--- + CMakeLists.txt | 11 ++++++----- + src/vector/vimageloader.cpp | 23 +++++++++++++---------- + 2 files changed, 19 insertions(+), 15 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 38a9862..ee6d2cd 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -95,10 +95,11 @@ if (NOT APPLE AND NOT WIN32) + ) + endif() + +-if (LOTTIE_MODULE) +- # for dlopen, dlsym and dlclose dependency +- target_link_libraries(rlottie PRIVATE ${CMAKE_DL_LIBS}) +-endif() ++# No Sym links in ESP-IDF ++# if (LOTTIE_MODULE) ++# # for dlopen, dlsym and dlclose dependency ++# target_link_libraries(rlottie PRIVATE ${CMAKE_DL_LIBS}) ++# endif() + + if (NOT LOTTIE_ASAN) + if(APPLE) +@@ -137,7 +138,7 @@ endif (NOT LIB_INSTALL_DIR) + #declare source and include files + add_subdirectory(inc) + add_subdirectory(src) +-add_subdirectory(example) ++# add_subdirectory(example) // We dont need example dir in ESP-IDF + + if (LOTTIE_TEST) + enable_testing() +diff --git a/src/vector/vimageloader.cpp b/src/vector/vimageloader.cpp +index c2446be..3df4c6a 100644 +--- a/src/vector/vimageloader.cpp ++++ b/src/vector/vimageloader.cpp +@@ -6,7 +6,7 @@ + #ifdef _WIN32 + # include + #else +-# include ++// # include //Does not work on ESP-IDF + #endif // _WIN32 + + using lottie_image_load_f = unsigned char *(*)(const char *filename, int *x, +@@ -61,22 +61,25 @@ struct VImageLoader::Impl { + void *dl_handle{nullptr}; + void init() + { +- imageLoad = reinterpret_cast( +- dlsym(dl_handle, "lottie_image_load")); +- imageFree = reinterpret_cast( +- dlsym(dl_handle, "lottie_image_free")); +- imageFromData = reinterpret_cast( +- dlsym(dl_handle, "lottie_image_load_from_data")); ++ // No sym links in ESP-iDF ++ // imageLoad = reinterpret_cast( ++ // dlsym(dl_handle, "lottie_image_load")); ++ // imageFree = reinterpret_cast( ++ // dlsym(dl_handle, "lottie_image_free")); ++ // imageFromData = reinterpret_cast( ++ // dlsym(dl_handle, "lottie_image_load_from_data")); + } + + void moduleFree() + { +- if (dl_handle) dlclose(dl_handle); ++ // if (dl_handle) dlclose(dl_handle); // No sym links in ESP-iDF + } + bool moduleLoad() + { +- dl_handle = dlopen(LOTTIE_IMAGE_MODULE_PLUGIN, RTLD_LAZY); +- return (dl_handle == nullptr); ++ // No sym links in ESP idf ++ // dl_handle = dlopen(LOTTIE_IMAGE_MODULE_PLUGIN, RTLD_LAZY); ++ // return (dl_handle == nullptr); ++ return true + } + # endif // _WIN32 + #else // LOTTIE_IMAGE_MODULE_SUPPORT +-- +2.34.1 + diff --git a/libraries/lvgl/env_support/esp/rlottie/CMakeLists.txt b/libraries/lvgl/env_support/esp/rlottie/CMakeLists.txt new file mode 100644 index 0000000..bb0a59c --- /dev/null +++ b/libraries/lvgl/env_support/esp/rlottie/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.5) + +if (0) +if (LV_USE_RLOTTIE) + +idf_component_register(SRCS ${SOURCES} + INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/rlottie/inc" + ) + +set(LOTTIE_MODULE OFF) +set(LOTTIE_THREAD OFF) +set(BUILD_SHARED_LIBS OFF) +option(BUILD_TESTING OFF) + +function(install) +endfunction() + +function(export) +endfunction() + +add_subdirectory(rlottie) +target_link_libraries(${COMPONENT_LIB} INTERFACE rlottie) +endif() +endif() \ No newline at end of file diff --git a/libraries/lvgl/env_support/pikascript/README.md b/libraries/lvgl/env_support/pikascript/README.md new file mode 100644 index 0000000..ea8b31a --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/README.md @@ -0,0 +1,11 @@ +# PikaScript Binding for LVGL + +[PikaScript](https://github.com/pikasTech/pikascript) is an ultralightweight python engine that can run with 4KB of RAM and 32KB of Flash (such as STM32G030C8 and STM32F103C8), and is very easy to deploy and expand. + +More details to see: [PikaScript and lvgl: Make Python Lighter, Easier and Smarter](https://blog.lvgl.io/2022-08-24/pikascript-and-lvgl) + +The available Python APIs are in the `pika_lvgl.pyi`, and you need copy the `pika_lvgl.pyi` to the root path of pikascript, then `import pika_lvgl` in `main.py`. + +The available simulation project on windows: https://github.com/pikasTech/lv_pikascript + +More document about PikaScript: https://pikadoc.readthedocs.io/en/latest/index.html \ No newline at end of file diff --git a/libraries/lvgl/env_support/pikascript/pika_lv_point_t.c b/libraries/lvgl/env_support/pikascript/pika_lv_point_t.c new file mode 100644 index 0000000..7fe31cb --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lv_point_t.c @@ -0,0 +1,16 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_point_t.h" + +void pika_lvgl_point_t___init__(PikaObj* self) { + lv_point_t lv_point = {0}; + args_setStruct(self->list, "lv_point_struct", lv_point); + obj_setPtr(self, "lv_point", args_getStruct(self->list, "lv_point_struct")); +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lv_timer_t.c b/libraries/lvgl/env_support/pikascript/pika_lv_timer_t.c new file mode 100644 index 0000000..b0b50eb --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lv_timer_t.c @@ -0,0 +1,44 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_lv_timer_t.h" + +PikaEventListener* g_pika_lv_timer_event_listener; + +void __pika_timer_cb(lv_timer_t* timer) { + PikaObj* eventHandleObj = pks_eventLisener_getEventHandleObj( + g_pika_lv_timer_event_listener, (uint32_t)timer); + obj_newDirectObj(eventHandleObj, "timer", New_pika_lvgl_lv_timer_t); + obj_setPtr(obj_getPtr(eventHandleObj, "timer"), "lv_timer", timer); + obj_run(eventHandleObj, "eventCallBack(timer)"); +} + +void pika_lvgl_lv_timer_t_set_period(PikaObj* self, int period) { + lv_timer_t* lv_timer = obj_getPtr(self, "lv_timer"); + lv_timer_set_period(lv_timer, period); +} + +void pika_lvgl_lv_timer_t_set_cb(PikaObj* self, Arg* cb) { + lv_timer_t* lv_timer = obj_getPtr(self, "lv_timer"); + lv_timer_set_cb(lv_timer, __pika_timer_cb); + + obj_setArg(self, "eventCallBack", cb); + /* init event_listener for the first time */ + if (NULL == g_pika_lv_timer_event_listener) { + pks_eventLisener_init(&g_pika_lv_timer_event_listener); + } + pks_eventLicener_registerEvent(g_pika_lv_timer_event_listener, + (uint32_t)lv_timer, self); + +} + +void pika_lvgl_lv_timer_t__delete(PikaObj* self) { + lv_timer_t* lv_timer = obj_getPtr(self, "lv_timer"); + lv_timer_delete(lv_timer); +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lv_wegit.c b/libraries/lvgl/env_support/pikascript/pika_lv_wegit.c new file mode 100644 index 0000000..122347c --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lv_wegit.c @@ -0,0 +1,364 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT +#include "BaseObj.h" +#include "pika_lvgl.h" +#include "pika_lvgl_arc.h" +#include "pika_lvgl_bar.h" +#include "pika_lvgl_btn.h" +#include "pika_lvgl_checkbox.h" +#include "pika_lvgl_dropdown.h" +#include "pika_lvgl_label.h" +#include "pika_lvgl_lv_obj.h" +#include "pika_lvgl_roller.h" +#include "pika_lvgl_slider.h" +#include "pika_lvgl_switch.h" +#include "pika_lvgl_table.h" +#include "pika_lvgl_textarea.h" + +void pika_lvgl_arc___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_arc_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); + obj_setInt(self, "MODE_NORMAL", LV_ARC_MODE_NORMAL); + obj_setInt(self, "MODE_SYMMETRICAL", LV_ARC_MODE_SYMMETRICAL); + obj_setInt(self, "MODE_REVERSE", LV_ARC_MODE_REVERSE); +} + +void pika_lvgl_arc_set_end_angle(PikaObj* self, int angle) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_end_angle(lv_obj, angle); +} + +void pika_lvgl_arc_set_bg_angles(PikaObj* self, int start, int end) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_bg_angles(lv_obj, start, end); +} + +void pika_lvgl_arc_set_angles(PikaObj* self, int start, int end) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_angles(lv_obj, start, end); +} + +int pika_lvgl_arc_get_angle_end(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_angle_end(lv_obj); +} +int pika_lvgl_arc_get_angle_start(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_angle_start(lv_obj); +} +int pika_lvgl_arc_get_bg_angle_end(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_bg_angle_end(lv_obj); +} +int pika_lvgl_arc_get_bg_angle_start(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_bg_angle_start(lv_obj); +} +int pika_lvgl_arc_get_max_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_max_value(lv_obj); +} +int pika_lvgl_arc_get_min_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_min_value(lv_obj); +} +int pika_lvgl_arc_get_mode(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_mode(lv_obj); +} +// int pika_lvgl_arc_get_rotation(PikaObj *self){ +// lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); +// return lv_arc_get_rotation(lv_obj); +// } +int pika_lvgl_arc_get_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_arc_get_value(lv_obj); +} +void pika_lvgl_arc_set_mode(PikaObj *self, int mode){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_mode(lv_obj, mode); +} +void pika_lvgl_arc_set_range(PikaObj *self, int min, int max){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_range(lv_obj, min, max); +} +void pika_lvgl_arc_set_rotation(PikaObj *self, int rotation){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_rotation(lv_obj, rotation); +} +void pika_lvgl_arc_set_start_angle(PikaObj *self, int start){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_start_angle(lv_obj, start); +} +void pika_lvgl_arc_set_value(PikaObj *self, int value){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_value(lv_obj, value); +} +void pika_lvgl_arc_set_bg_end_angle(PikaObj *self, int angle){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_bg_end_angle(lv_obj, angle); +} +void pika_lvgl_arc_set_bg_start_angle(PikaObj *self, int start){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_bg_start_angle(lv_obj, start); +} + +void pika_lvgl_arc_set_change_rate(PikaObj *self, int rate){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_arc_set_change_rate(lv_obj, rate); +} + +void pika_lvgl_bar___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_bar_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_bar_set_value(PikaObj* self, int value, int anim) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_bar_set_value(lv_obj, value, value); +} + +int pika_lvgl_bar_get_max_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_bar_get_max_value(lv_obj); +} +int pika_lvgl_bar_get_min_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_bar_get_min_value(lv_obj); +} +int pika_lvgl_bar_get_mode(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_bar_get_mode(lv_obj); +} +int pika_lvgl_bar_get_start_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_bar_get_start_value(lv_obj); +} +int pika_lvgl_bar_get_value(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_bar_get_value(lv_obj); +} +void pika_lvgl_bar_set_mode(PikaObj *self, int mode){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_bar_set_mode(lv_obj, mode); +} +void pika_lvgl_bar_set_range(PikaObj *self, int min, int max){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_bar_set_range(lv_obj, min, max); +} +void pika_lvgl_bar_set_start_value(PikaObj *self, int start_value, int anim){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_bar_set_start_value(lv_obj, start_value, anim); +} + +void pika_lvgl_btn___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_button_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_checkbox___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_checkbox_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_checkbox_set_text(PikaObj* self, char* txt) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_checkbox_set_text(lv_obj, txt); +} + +void pika_lvgl_checkbox_set_text_static(PikaObj *self, char* txt){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_checkbox_set_text_static(lv_obj, txt); +} + +char* pika_lvgl_checkbox_get_text(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return (char*) lv_checkbox_get_text(lv_obj); +} + +void pika_lvgl_dropdown___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_dropdown_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_dropdown_set_options(PikaObj* self, char* options) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_options(lv_obj, options); +} + +void pika_lvgl_dropdown_add_option(PikaObj *self, char* options, int pos){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_add_option(lv_obj, options, pos); +} +void pika_lvgl_dropdown_clear_options(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_clear_options(lv_obj); +} +void pika_lvgl_dropdown_close(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_close(lv_obj); +} +int pika_lvgl_dropdown_get_dir(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_get_dir(lv_obj); +} +// PikaObj* pika_lvgl_dropdown_get_list(PikaObj *self){ +// lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); +// return obj_getObj(lv_dropdown_get_list(lv_obj)); +// } +int pika_lvgl_dropdown_get_option_count(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_get_option_count(lv_obj); +} +int pika_lvgl_dropdown_get_option_index(PikaObj *self, char* txt){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_get_option_index(lv_obj, txt); +} +char* pika_lvgl_dropdown_get_options(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return (char*) lv_dropdown_get_options(lv_obj); +} +int pika_lvgl_dropdown_get_selected(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_get_selected(lv_obj); +} +int pika_lvgl_dropdown_get_selected_highlight(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_get_selected_highlight(lv_obj); +} + +char* pika_lvgl_dropdown_get_selected_str(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + obj_setBytes(self, "_buff",NULL, 128); + char* _buff = (char*)obj_getBytes(self, "_buff"); + lv_dropdown_get_selected_str(lv_obj, _buff, 128); + return _buff; +} +char* pika_lvgl_dropdown_get_symbol(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return (char*)lv_dropdown_get_symbol(lv_obj); +} +char* pika_lvgl_dropdown_get_text(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return (char*)lv_dropdown_get_text(lv_obj); +} +int pika_lvgl_dropdown_is_open(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_dropdown_is_open(lv_obj); +} +void pika_lvgl_dropdown_open(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_open(lv_obj); +} +void pika_lvgl_dropdown_set_dir(PikaObj *self, int dir){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_dir(lv_obj, dir); +} +void pika_lvgl_dropdown_set_selected(PikaObj *self, int sel_opt){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_selected(lv_obj, sel_opt); +} +void pika_lvgl_dropdown_set_selected_highlight(PikaObj *self, int en){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_selected_highlight(lv_obj, en); +} +void pika_lvgl_dropdown_set_symbol(PikaObj *self, char* symbol){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_symbol(lv_obj, symbol); +} +void pika_lvgl_dropdown_set_text(PikaObj *self, char* txt){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_dropdown_set_text(lv_obj, txt); +} + +void pika_lvgl_label___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_label_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_label_set_long_mode(PikaObj* self, int mode) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_label_set_long_mode(lv_obj, mode); +} + +void pika_lvgl_label_set_recolor(PikaObj* self, int en) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_label_set_recolor(lv_obj, en); +} + +void pika_lvgl_label_set_text(PikaObj* self, char* txt) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_label_set_text(lv_obj, txt); +} + +void pika_lvgl_label_set_style_text_align(PikaObj* self, + int value, + int selector) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_set_style_text_align(lv_obj, value, selector); +} + +void pika_lvgl_roller___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_roller_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_roller_set_options(PikaObj* self, char* options, int mode) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_roller_set_options(lv_obj, options, mode); +} + +void pika_lvgl_roller_set_visible_row_count(PikaObj* self, int row_cnt) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_roller_set_visible_row_count(lv_obj, row_cnt); +} + +void pika_lvgl_slider___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_slider_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_switch___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_switch_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_table___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_table_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_table_set_cell_value(PikaObj* self, + int row, + int col, + char* txt) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_table_set_cell_value(lv_obj, row, col, txt); +} + +void pika_lvgl_textarea___init__(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_textarea_create(lv_parent); + obj_setPtr(self, "lv_obj", lv_obj); +} + +void pika_lvgl_textarea_set_one_line(PikaObj* self, int en) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_textarea_set_one_line(lv_obj, en); +} +#endif \ No newline at end of file diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl.c b/libraries/lvgl/env_support/pikascript/pika_lvgl.c new file mode 100644 index 0000000..70021f7 --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl.c @@ -0,0 +1,199 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT +#include "pika_lvgl.h" +#include "BaseObj.h" +#include "pika_lvgl_ALIGN.h" +#include "pika_lvgl_ANIM.h" +#include "pika_lvgl_EVENT.h" +#include "pika_lvgl_OPA.h" +#include "pika_lvgl_PALETTE.h" +#include "pika_lvgl_STATE.h" +#include "pika_lvgl_arc.h" +#include "pika_lvgl_lv_color_t.h" +#include "pika_lvgl_lv_obj.h" +#include "pika_lvgl_indev_t.h" +#include "pika_lvgl_lv_timer_t.h" + +PikaObj* pika_lv_event_listener_g; + +void pika_lvgl_STATE___init__(PikaObj* self) { + obj_setInt(self, "DEFAULT", LV_STATE_DEFAULT); + obj_setInt(self, "CHECKED", LV_STATE_CHECKED); + obj_setInt(self, "FOCUSED", LV_STATE_FOCUSED); + obj_setInt(self, "FOCUS_KEY", LV_STATE_FOCUS_KEY); + obj_setInt(self, "EDITED", LV_STATE_EDITED); + obj_setInt(self, "HOVERED", LV_STATE_HOVERED); + obj_setInt(self, "PRESSED", LV_STATE_PRESSED); + obj_setInt(self, "SCROLLED", LV_STATE_SCROLLED); + obj_setInt(self, "DISABLED", LV_STATE_DISABLED); + obj_setInt(self, "USER_1", LV_STATE_USER_1); + obj_setInt(self, "USER_2", LV_STATE_USER_2); + obj_setInt(self, "USER_3", LV_STATE_USER_3); + obj_setInt(self, "USER_4", LV_STATE_USER_4); + obj_setInt(self, "ANY", LV_STATE_ANY); +} + +void pika_lvgl_ANIM___init__(PikaObj* self) { + obj_setInt(self, "ON", LV_ANIM_OFF); + obj_setInt(self, "OFF", LV_ANIM_ON); +} + +void pika_lvgl_ALIGN___init__(PikaObj* self) { + obj_setInt(self, "CENTER", LV_ALIGN_CENTER); + obj_setInt(self, "DEFAULT", LV_ALIGN_DEFAULT); + obj_setInt(self, "TOP_LEFT", LV_ALIGN_TOP_LEFT); + obj_setInt(self, "TOP_MID", LV_ALIGN_TOP_MID); + obj_setInt(self, "TOP_RIGHT", LV_ALIGN_TOP_RIGHT); + obj_setInt(self, "BOTTOM_LEFT", LV_ALIGN_BOTTOM_LEFT); + obj_setInt(self, "BOTTOM_MID", LV_ALIGN_BOTTOM_MID); + obj_setInt(self, "BOTTOM_RIGHT", LV_ALIGN_BOTTOM_RIGHT); + obj_setInt(self, "LEFT_MID", LV_ALIGN_LEFT_MID); + obj_setInt(self, "RIGHT_MID", LV_ALIGN_RIGHT_MID); + obj_setInt(self, "OUT_TOP_LEFT", LV_ALIGN_OUT_TOP_LEFT); + obj_setInt(self, "OUT_TOP_MID", LV_ALIGN_OUT_TOP_MID); + obj_setInt(self, "OUT_TOP_RIGHT", LV_ALIGN_OUT_TOP_RIGHT); + obj_setInt(self, "OUT_BOTTOM_LEFT", LV_ALIGN_OUT_BOTTOM_LEFT); + obj_setInt(self, "OUT_BOTTOM_MID", LV_ALIGN_OUT_BOTTOM_MID); + obj_setInt(self, "OUT_BOTTOM_RIGHT", LV_ALIGN_OUT_BOTTOM_RIGHT); + obj_setInt(self, "OUT_LEFT_TOP", LV_ALIGN_OUT_LEFT_TOP); + obj_setInt(self, "OUT_LEFT_MID", LV_ALIGN_OUT_LEFT_MID); + obj_setInt(self, "OUT_LEFT_BOTTOM", LV_ALIGN_OUT_LEFT_BOTTOM); + obj_setInt(self, "OUT_RIGHT_TOP", LV_ALIGN_OUT_RIGHT_TOP); + obj_setInt(self, "OUT_RIGHT_MID", LV_ALIGN_OUT_RIGHT_MID); + obj_setInt(self, "OUT_RIGHT_BOTTOM", LV_ALIGN_OUT_RIGHT_BOTTOM); +} + +void pika_lvgl_EVENT___init__(PikaObj* self) { + obj_setInt(self, "ALL", LV_EVENT_ALL); + obj_setInt(self, "PRESSED", LV_EVENT_PRESSED); + obj_setInt(self, "PRESSING", LV_EVENT_PRESSING); + obj_setInt(self, "PRESS_LOST", LV_EVENT_PRESS_LOST); + obj_setInt(self, "SHORT_CLICKED", LV_EVENT_SHORT_CLICKED); + obj_setInt(self, "LONG_PRESSED", LV_EVENT_LONG_PRESSED); + obj_setInt(self, "LONG_PRESSED_REPEAT", LV_EVENT_LONG_PRESSED_REPEAT); + obj_setInt(self, "CLICKED", LV_EVENT_CLICKED); + obj_setInt(self, "RELEASED", LV_EVENT_RELEASED); + obj_setInt(self, "SCROLL_BEGIN", LV_EVENT_SCROLL_BEGIN); + obj_setInt(self, "SCROLL_END", LV_EVENT_SCROLL_END); + obj_setInt(self, "SCROLL", LV_EVENT_SCROLL); + obj_setInt(self, "GESTURE", LV_EVENT_GESTURE); + obj_setInt(self, "KEY", LV_EVENT_KEY); + obj_setInt(self, "FOCUSED", LV_EVENT_FOCUSED); + obj_setInt(self, "DEFOCUSED", LV_EVENT_DEFOCUSED); + obj_setInt(self, "LEAVE", LV_EVENT_LEAVE); + obj_setInt(self, "HIT_TEST", LV_EVENT_HIT_TEST); + obj_setInt(self, "COVER_CHECK", LV_EVENT_COVER_CHECK); + obj_setInt(self, "REFR_EXT_DRAW_SIZE", LV_EVENT_REFR_EXT_DRAW_SIZE); + obj_setInt(self, "DRAW_MAIN_BEGIN", LV_EVENT_DRAW_MAIN_BEGIN); + obj_setInt(self, "DRAW_MAIN", LV_EVENT_DRAW_MAIN); + obj_setInt(self, "DRAW_MAIN_END", LV_EVENT_DRAW_MAIN_END); + obj_setInt(self, "DRAW_POST_BEGIN", LV_EVENT_DRAW_POST_BEGIN); + obj_setInt(self, "DRAW_POST", LV_EVENT_DRAW_POST); + obj_setInt(self, "DRAW_POST_END", LV_EVENT_DRAW_POST_END); + obj_setInt(self, "DRAW_PART_BEGIN", LV_EVENT_DRAW_PART_BEGIN); + obj_setInt(self, "DRAW_PART_END", LV_EVENT_DRAW_PART_END); + obj_setInt(self, "VALUE_CHANGED", LV_EVENT_VALUE_CHANGED); + obj_setInt(self, "INSERT", LV_EVENT_INSERT); + obj_setInt(self, "REFRESH", LV_EVENT_REFRESH); + obj_setInt(self, "READY", LV_EVENT_READY); + obj_setInt(self, "CANCEL", LV_EVENT_CANCEL); + obj_setInt(self, "DELETE", LV_EVENT_DELETE); + obj_setInt(self, "CHILD_CHANGED", LV_EVENT_CHILD_CHANGED); + obj_setInt(self, "CHILD_CREATED", LV_EVENT_CHILD_CREATED); + obj_setInt(self, "CHILD_DELETED", LV_EVENT_CHILD_DELETED); + obj_setInt(self, "SCREEN_UNLOAD_START", LV_EVENT_SCREEN_UNLOAD_START); + obj_setInt(self, "SCREEN_LOAD_START", LV_EVENT_SCREEN_LOAD_START); + obj_setInt(self, "SCREEN_LOADED", LV_EVENT_SCREEN_LOADED); + obj_setInt(self, "SCREEN_UNLOADED", LV_EVENT_SCREEN_UNLOADED); + obj_setInt(self, "SIZE_CHANGED", LV_EVENT_SIZE_CHANGED); + obj_setInt(self, "STYLE_CHANGED", LV_EVENT_STYLE_CHANGED); + obj_setInt(self, "LAYOUT_CHANGED", LV_EVENT_LAYOUT_CHANGED); + obj_setInt(self, "GET_SELF_SIZE", LV_EVENT_GET_SELF_SIZE); + obj_setInt(self, "PREPROCESS", LV_EVENT_PREPROCESS); +} + +void pika_lvgl_OPA___init__(PikaObj* self) { + obj_setInt(self, "TRANSP", LV_OPA_TRANSP); + obj_setInt(self, "COVER", LV_OPA_COVER); +} + +void pika_lvgl_PALETTE___init__(PikaObj* self) { + obj_setInt(self, "RED", LV_PALETTE_RED); + obj_setInt(self, "PINK", LV_PALETTE_PINK); + obj_setInt(self, "PURPLE", LV_PALETTE_PURPLE); + obj_setInt(self, "DEEP_PURPLE", LV_PALETTE_DEEP_PURPLE); + obj_setInt(self, "INDIGO", LV_PALETTE_INDIGO); + obj_setInt(self, "BLUE", LV_PALETTE_BLUE); + obj_setInt(self, "LIGHT_BLUE", LV_PALETTE_LIGHT_BLUE); + obj_setInt(self, "CYAN", LV_PALETTE_CYAN); + obj_setInt(self, "TEAL", LV_PALETTE_TEAL); + obj_setInt(self, "GREEN", LV_PALETTE_GREEN); + obj_setInt(self, "LIGHT_GREEN", LV_PALETTE_LIGHT_GREEN); + obj_setInt(self, "LIME", LV_PALETTE_LIME); + obj_setInt(self, "YELLOW", LV_PALETTE_YELLOW); + obj_setInt(self, "AMBER", LV_PALETTE_AMBER); + obj_setInt(self, "ORANGE", LV_PALETTE_ORANGE); + obj_setInt(self, "DEEP_ORANGE", LV_PALETTE_DEEP_ORANGE); + obj_setInt(self, "BROWN", LV_PALETTE_BROWN); + obj_setInt(self, "BLUE_GREY", LV_PALETTE_BLUE_GREY); + obj_setInt(self, "GREY", LV_PALETTE_GREY); + obj_setInt(self, "NONE", LV_PALETTE_NONE); +} + +PikaObj* pika_lvgl_screen_active(PikaObj* self) { + PikaObj* new_obj = newNormalObj(New_TinyObj); + lv_obj_t* lv_obj = lv_screen_active(); + obj_setPtr(new_obj, "lv_obj", lv_obj); + return new_obj; +} + +void pika_lvgl___init__(PikaObj* self) { + obj_newDirectObj(self, "lv_event_listener", New_TinyObj); + pika_lv_event_listener_g = obj_getObj(self, "lv_event_listener"); +} + +PikaObj* pika_lvgl_obj(PikaObj* self, PikaObj* parent) { + lv_obj_t* lv_parent = obj_getPtr(parent, "lv_obj"); + lv_obj_t* lv_obj = lv_obj_create(lv_parent); + PikaObj* new_obj = newNormalObj(New_pika_lvgl_lv_obj); + obj_setPtr(new_obj, "lv_obj", lv_obj); + return new_obj; +} + +PikaObj* pika_lvgl_palette_lighten(PikaObj *self, int p, int lvl){ + PikaObj* new_obj = newNormalObj(New_pika_lvgl_lv_color_t); + lv_color_t lv_color = lv_palette_lighten(p, lvl); + args_setStruct(new_obj->list, "lv_color_struct", lv_color); + lv_color_t* plv_color = args_getStruct(new_obj->list, "lv_color_struct"); + obj_setPtr(new_obj, "lv_color", plv_color); + return new_obj; +} + +PikaObj* pika_lvgl_palette_main(PikaObj* self, int p) { + PikaObj* new_obj = newNormalObj(New_pika_lvgl_lv_color_t); + lv_color_t lv_color = lv_palette_main(p); + args_setStruct(new_obj->list, "lv_color_struct", lv_color); + obj_setPtr(new_obj, "lv_color", + args_getStruct(new_obj->list, "lv_color_struct")); + return new_obj; +} + +PikaObj* pika_lvgl_indev_get_active(PikaObj *self){ + PikaObj* new_obj = newNormalObj(New_pika_lvgl_indev_t); + lv_indev_t *lv_indev = lv_indev_active(); + obj_setPtr(new_obj,"lv_indev", lv_indev); + return new_obj; +} + +PikaObj* pika_lvgl_timer_create_basic(PikaObj *self){ + PikaObj* new_obj = newNormalObj(New_pika_lvgl_lv_timer_t); + lv_timer_t *lv_timer = lv_timer_create_basic(); + obj_setPtr(new_obj,"lv_timer", lv_timer); + return new_obj; +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl.pyi b/libraries/lvgl/env_support/pikascript/pika_lvgl.pyi new file mode 100644 index 0000000..7ca54f8 --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl.pyi @@ -0,0 +1,263 @@ +from PikaObj import * + +def __init__(): ... + +class EVENT: + ALL: int + PRESSED: int + PRESSING: int + PRESS_LOST: int + SHORT_CLICKED: int + LONG_PRESSED: int + LONG_PRESSED_REPEAT: int + CLICKED: int + RELEASED: int + SCROLL_BEGIN: int + SCROLL_END: int + SCROLL: int + GESTURE: int + KEY: int + FOCUSED: int + DEFOCUSED: int + LEAVE: int + HIT_TEST: int + COVER_CHECK: int + REFR_EXT_DRAW_SIZE: int + DRAW_MAIN_BEGIN: int + DRAW_MAIN: int + DRAW_MAIN_END: int + DRAW_POST_BEGIN: int + DRAW_POST: int + DRAW_POST_END: int + DRAW_PART_BEGIN: int + DRAW_PART_END: int + VALUE_CHANGED: int + INSERT: int + REFRESH: int + READY: int + CANCEL: int + DELETE: int + CHILD_CHANGED: int + CHILD_CREATED: int + CHILD_DELETED: int + SCREEN_UNLOAD_START: int + SCREEN_LOAD_START: int + SCREEN_LOADED: int + SCREEN_UNLOADED: int + SIZE_CHANGED: int + STYLE_CHANGED: int + LAYOUT_CHANGED: int + GET_SELF_SIZE: int + PREPROCESS: int + def __init__(self): ... + +class ALIGN: + DEFAULT: int + TOP_LEFT: int + TOP_MID: int + TOP_RIGHT: int + BOTTOM_LEFT: int + BOTTOM_MID: int + BOTTOM_RIGHT: int + LEFT_MID: int + RIGHT_MID: int + CENTER: int + OUT_TOP_LEFT: int + OUT_TOP_MID: int + OUT_TOP_RIGHT: int + OUT_BOTTOM_LEFT: int + OUT_BOTTOM_MID: int + OUT_BOTTOM_RIGHT: int + OUT_LEFT_TOP: int + OUT_LEFT_MID: int + OUT_LEFT_BOTTOM: int + OUT_RIGHT_TOP: int + OUT_RIGHT_MID: int + OUT_RIGHT_BOTTOM: int + def __init__(self): ... + +class PALETTE: + RED: int + PINK: int + PURPLE: int + DEEP_PURPLE: int + INDIGO: int + BLUE: int + LIGHT_BLUE: int + CYAN: int + TEAL: int + GREEN: int + LIGHT_GREEN: int + LIME: int + YELLOW: int + AMBER: int + ORANGE: int + DEEP_ORANGE: int + BROWN: int + BLUE_GREY: int + GREY: int + NONE: int + def __init__(self): ... + +class OPA: + TRANSP: int + COVER: int + def __init__(self): ... + +class ANIM: + OFF: int + ON: int + def __init__(self): ... + +class STATE: + def __init__(self): ... + +class lv_event: + def get_code(self) -> int: ... + def get_target(self) -> lv_obj: ... + +class lv_color_t: ... + +class lv_timer_t: + def set_period(period: int): ... + def set_cb(cb: any): ... + def _del(self): ... + +def palette_lighten(p: int, lvl: int) -> lv_color_t: ... +def palette_main(p: int) -> lv_color_t: ... + +class style_t: + def __init__(self): ... + def init(self): ... + def set_radius(self, radius: int): ... + def set_bg_opa(self, opa: int): ... + def set_bg_color(self, color: lv_color_t): ... + def set_outline_width(self, w: int): ... + def set_outline_color(self, color: lv_color_t): ... + def set_outline_pad(self, pad: int): ... + def set_shadow_width(self, w: int): ... + def set_shadow_spread(self, s: int): ... + def set_shadow_color(self, color: lv_color_t): ... + +class lv_obj: + def center(self): ... + def set_size(self, size_x: int, size_y: int): ... + def align(self, align: int, x_ofs: int, y_ofs: int): ... + def set_height(self, h: int): ... + def update_layout(self): ... + def set_width(self, w: int): ... + def add_state(self, state: int): ... + def add_event(self, event_cb: any, filter: int, user_data: pointer): ... + def add_style(self, style: style_t, selector: int): ... + def get_x(self) -> int: ... + def get_y(self) -> int: ... + def set_pos(self, x: int, y: int): ... + +class indev_t: + def get_vect(self, point: point_t): ... + +def obj(parent: lv_obj) -> lv_obj: ... +def indev_get_act() -> indev_t: ... + +class point_t: + def __init__(self): ... + +class arc(lv_obj): + MODE_NORMAL: int + MODE_SYMMETRICAL: int + MODE_REVERSE: int + def __init__(self, parent: lv_obj): ... + def set_start_angle(self, start: int): ... + def set_end_angle(self, angle: int): ... + def set_angles(self, start: int, end: int): ... + def set_bg_start_angle(self, start: int): ... + def set_bg_end_angle(self, angle: int): ... + def set_bg_angles(self, start: int, end: int): ... + def set_rotation(self, rotation: int): ... + def set_mode(self, mode: int): ... + def set_value(self, value: int): ... + def set_range(self, min: int, max: int): ... + def set_change_rate(self, rate: int): ... + def get_angle_start(self) -> int: ... + def get_angle_end(self) -> int: ... + def get_bg_angle_start(self) -> int: ... + def get_bg_angle_end(self) -> int: ... + def get_value(self) -> int: ... + def get_min_value(self) -> int: ... + def get_max_value(self) -> int: ... + def get_mode(self) -> int: ... + # def get_rotation(self) -> int: ... + +class bar(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_value(self, value: int, anim: int): ... + def set_start_value(self, start_value: int, anim: int): ... + def set_range(self, min: int, max: int): ... + def set_mode(self, mode: int): ... + def get_value(self) -> int: ... + def get_start_value(self) -> int: ... + def get_min_value(self) -> int: ... + def get_max_value(self) -> int: ... + def get_mode(self) -> int: ... + +class btn(lv_obj): + def __init__(self, parent: lv_obj): ... + +class checkbox(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_text(self, txt: str): ... + def set_text_static(self, txt: str): ... + def get_text(self) -> str: ... + +class dropdown(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_text(self, txt: str): ... + def set_options(self, options: str): ... + def add_option(self, option: str, pos:int): ... + def clear_options(self): ... + def set_selected(self, sel_opt: int): ... + def set_dir(self, dir: int): ... + def set_symbol(self, symbol: str): ... + def set_selected_highlight(self, en: int): ... + # def get_list(self) -> lv_obj: ... + def get_text(self) -> str: ... + def get_options(self) -> str: ... + def get_selected(self) -> int: ... + def get_option_cnt(self) -> int: ... + def get_selected_str(self) -> str: ... + def get_option_index(self, option: str) -> int: ... + def get_symbol(self) -> str: ... + def get_selected_highlight(self) -> int: ... + def get_dir(self) -> int: ... + def open(self): ... + def close(self): ... + def is_open(self) -> int: ... + +class label(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_text(self, txt: str): ... + def set_long_mode(self, mode: int): ... + def set_recolor(self, en: int): ... + def set_style_text_align(self, value: int, selector: int): ... + +class roller(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_options(self, options: str, mode: int): ... + def set_visible_row_count(self, row_cnt: int): ... + +class slider(lv_obj): + def __init__(self, parent: lv_obj): ... + +class switch(lv_obj): + def __init__(self, parent: lv_obj): ... + +class table(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_cell_value(self, row: int, col: int, txt: str): ... + +class textarea(lv_obj): + def __init__(self, parent: lv_obj): ... + def set_one_line(en: int): ... + +def scr_act() -> lv_obj: ... +def timer_create_basic() -> lv_timer_t: ... diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl_indev_t.c b/libraries/lvgl/env_support/pikascript/pika_lvgl_indev_t.c new file mode 100644 index 0000000..591ee8a --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl_indev_t.c @@ -0,0 +1,18 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_indev_t.h" + +void pika_lvgl_indev_t_get_vect(PikaObj* self, PikaObj* point) { + lv_indev_t* lv_indev = obj_getPtr(self, "lv_indev"); + lv_point_t* lv_point = obj_getPtr(point, "lv_point"); + lv_indev_get_vect(lv_indev, lv_point); + obj_setInt(point, "x", lv_point->x); + obj_setInt(point, "y", lv_point->y); +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_event.c b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_event.c new file mode 100644 index 0000000..575cf16 --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_event.c @@ -0,0 +1,24 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_lv_event.h" + +int pika_lvgl_lv_event_get_code(PikaObj *self){ + lv_event_t *lv_event = obj_getPtr(self, "lv_event"); + return lv_event_get_code(lv_event); +} + +PikaObj *New_pika_lvgl_lv_obj(Args *args); +PikaObj* pika_lvgl_lv_event_get_target(PikaObj *self){ + lv_event_t *lv_event = obj_getPtr(self, "lv_event"); + lv_obj_t* lv_obj = lv_event_get_target(lv_event); + PikaObj* new_obj = newNormalObj(New_pika_lvgl_lv_obj); + obj_setPtr(new_obj, "lv_obj", lv_obj); + return new_obj; +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_obj.c b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_obj.c new file mode 100644 index 0000000..915403b --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_obj.c @@ -0,0 +1,116 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_lv_obj.h" +#include "BaseObj.h" +#include "dataStrs.h" +#include "pika_lvgl.h" +#include "pika_lvgl_arc.h" +#include "pika_lvgl_lv_event.h" + +extern PikaObj* pika_lv_event_listener_g; + +void pika_lvgl_lv_obj_center(PikaObj* self) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_center(lv_obj); +} + +void pika_lvgl_lv_obj_set_size(PikaObj* self, int size_x, int size_y) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_set_size(lv_obj, size_x, size_y); +} + +void pika_lvgl_lv_obj_align(PikaObj* self, int align, int x_ofs, int y_ofs) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_align(lv_obj, align, x_ofs, y_ofs); +} + +void pika_lvgl_lv_obj_set_height(PikaObj* self, int h) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_set_height(lv_obj, h); +} + +void pika_lvgl_lv_obj_update_layout(PikaObj* self) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_update_layout(lv_obj); +} + +void pika_lvgl_lv_obj_set_width(PikaObj* self, int w) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_set_width(lv_obj, w); +} + +void pika_lvgl_lv_obj_add_state(PikaObj* self, int state) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_add_state(lv_obj, state); +} + +PikaObj* eventLisener_getHandler(PikaObj* self, uintptr_t event_id) { + Args buffs = {0}; + char* event_name = + strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id); + PikaObj* event_item = obj_getObj(self, event_name); + PikaObj* event_handler = obj_getPtr(event_item, "handler"); + strsDeinit(&buffs); + return event_handler; +} + +static void __pika_event_cb(lv_event_t* e) { + lv_obj_t* target = lv_event_get_target(e); + PikaObj* event_handler = + eventLisener_getHandler(pika_lv_event_listener_g, (uintptr_t)target); + PikaObj* evt = obj_getObj(event_handler, "_event_evt"); + obj_setPtr(evt, "lv_event", e); + obj_run(event_handler, "_event_cb(_event_evt)"); +} + +void eventLicener_registerEvent(PikaObj* self, + uintptr_t event_id, + PikaObj* event_handler) { + Args buffs = {0}; + char* event_name = + strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id); + obj_newDirectObj(self, event_name, New_TinyObj); + PikaObj* event_item = obj_getObj(self, event_name); + obj_setRef(event_item, "handler", event_handler); + strsDeinit(&buffs); +} + +void pika_lvgl_lv_obj_add_event_cb(PikaObj* self, + Arg* event_cb, + int filter, + void* user_data) { + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_add_event_cb(lv_obj, __pika_event_cb, filter, NULL); + obj_setArg(self, "_event_cb", event_cb); + obj_setPtr(self, "_event_user_data", user_data); + obj_newDirectObj(self, "_event_evt", New_pika_lvgl_lv_event); + eventLicener_registerEvent(pika_lv_event_listener_g, (uintptr_t)lv_obj, self); +} + +void pika_lvgl_lv_obj_add_style(PikaObj *self, PikaObj* style, int selector){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_style_t* lv_style = obj_getPtr(style, "lv_style"); + lv_obj_add_style(lv_obj, lv_style, selector); +} + +int pika_lvgl_lv_obj_get_x(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_obj_get_x(lv_obj); +} + +int pika_lvgl_lv_obj_get_y(PikaObj *self){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + return lv_obj_get_y(lv_obj); +} + +void pika_lvgl_lv_obj_set_pos(PikaObj *self, int x, int y){ + lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj"); + lv_obj_set_pos(lv_obj, x, y); +} +#endif diff --git a/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_style_t.c b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_style_t.c new file mode 100644 index 0000000..4783008 --- /dev/null +++ b/libraries/lvgl/env_support/pikascript/pika_lvgl_lv_style_t.c @@ -0,0 +1,70 @@ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "../../lvgl.h" +#endif + +#ifdef PIKASCRIPT + +#include "pika_lvgl_style_t.h" + +void pika_lvgl_style_t_init(PikaObj* self) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_init(lv_style); +} + +void pika_lvgl_style_t_set_bg_color(PikaObj* self, PikaObj* color) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_color_t* lv_color = obj_getPtr(color, "lv_color"); + lv_style_set_bg_color(lv_style, *lv_color); +} + +void pika_lvgl_style_t_set_bg_opa(PikaObj* self, int opa) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_bg_opa(lv_style, opa); +} + +void pika_lvgl_style_t_set_outline_color(PikaObj* self, PikaObj* color) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_color_t* lv_color = obj_getPtr(color, "lv_color"); + lv_style_set_outline_color(lv_style, *lv_color); +} + +void pika_lvgl_style_t_set_outline_pad(PikaObj* self, int pad) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_outline_pad(lv_style, pad); +} + +void pika_lvgl_style_t_set_outline_width(PikaObj* self, int w) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_outline_width(lv_style, w); +} + +void pika_lvgl_style_t_set_radius(PikaObj* self, int radius) { + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_radius(lv_style, radius); +} + +void pika_lvgl_style_t___init__(PikaObj* self) { + lv_style_t lv_style_stack = {0}; + args_setStruct(self->list, "lv_style_struct", lv_style_stack); + lv_style_t* lv_style = args_getStruct(self->list, "lv_style_struct"); + obj_setPtr(self, "lv_style", lv_style); +} + +void pika_lvgl_style_t_set_shadow_color(PikaObj *self, PikaObj* color){ + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_color_t* lv_color = obj_getPtr(color, "lv_color"); + lv_style_set_shadow_color(lv_style, *lv_color); +} + +void pika_lvgl_style_t_set_shadow_spread(PikaObj *self, int s){ + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_shadow_spread(lv_style, s); +} + +void pika_lvgl_style_t_set_shadow_width(PikaObj *self, int w){ + lv_style_t* lv_style = obj_getPtr(self, "lv_style"); + lv_style_set_shadow_width(lv_style, w); +} +#endif diff --git a/libraries/lvgl/env_support/rt-thread/SConscript b/libraries/lvgl/env_support/rt-thread/SConscript new file mode 100644 index 0000000..56983c0 --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/SConscript @@ -0,0 +1,70 @@ +from building import * +import rtconfig +import os + +src = [] +inc = [] +group = [] + +cwd = GetCurrentDir() # get current dir path + +port_src = Glob('*.c') +port_inc = [cwd] +group = group + DefineGroup('LVGL-port', port_src, depend = ['PKG_USING_LVGL'], CPPPATH = port_inc) + +# check if .h or .hpp files exists +def check_h_hpp_exists(path): + file_dirs = os.listdir(path) + for file_dir in file_dirs: + if os.path.splitext(file_dir)[1] in ['.h', '.hpp']: + return True + return False + +lvgl_cwd = cwd + '/../../' + +lvgl_src_cwd = lvgl_cwd + 'src/' +inc = inc + [lvgl_src_cwd] +src = src + Glob(os.path.join(lvgl_src_cwd,'*.c')) +for root, dirs, files in os.walk(lvgl_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files + if check_h_hpp_exists(current_path): # add .h and .hpp path + inc = inc + [current_path] + + +if GetDepend('PKG_LVGL_USING_EXAMPLES'): + lvgl_src_cwd = lvgl_cwd + 'examples/' + inc = inc + [lvgl_src_cwd] + for root, dirs, files in os.walk(lvgl_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) + if check_h_hpp_exists(current_path): + inc = inc + [current_path] + +if GetDepend('PKG_LVGL_USING_DEMOS'): + lvgl_src_cwd = lvgl_cwd + 'demos/' + inc = inc + [lvgl_src_cwd] + for root, dirs, files in os.walk(lvgl_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) + if check_h_hpp_exists(current_path): + inc = inc + [current_path] + +LOCAL_CFLAGS = '' +if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6 + LOCAL_CFLAGS += ' -std=c99' +elif rtconfig.PLATFORM == 'armcc': # Keil AC5 + LOCAL_CFLAGS += ' --c99 --gnu' + +group = group + DefineGroup('LVGL', src, depend = ['PKG_USING_LVGL'], CPPPATH = inc, LOCAL_CFLAGS = LOCAL_CFLAGS) + +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + group = group + SConscript(os.path.join(d, 'SConscript')) + +Return('group') diff --git a/libraries/lvgl/env_support/rt-thread/lv_rt_thread_conf.h b/libraries/lvgl/env_support/rt-thread/lv_rt_thread_conf.h new file mode 100644 index 0000000..f1697cc --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/lv_rt_thread_conf.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2021-10-15 Meco Man The first version + */ + +#ifndef LV_RT_THREAD_CONF_H +#define LV_RT_THREAD_CONF_H + +#ifdef __RTTHREAD__ + +#define LV_RTTHREAD_INCLUDE +#include LV_RTTHREAD_INCLUDE + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +#ifdef RT_USING_HEAP + #define LV_USE_STDLIB_MALLOC LV_STDLIB_RTTHREAD +#endif + +#define LV_USE_STDLIB_STRING LV_STDLIB_RTTHREAD + +#if LV_USE_FLOAT == 0 + #define LV_USE_STDLIB_SPRINTF LV_STDLIB_RTTHREAD +#endif + +/*================= + * OPERATING SYSTEM + *=================*/ + +#define LV_USE_OS LV_OS_RTTHREAD + +/*------------- + * Asserts + *-----------*/ + +#define LV_ASSERT_HANDLER_INCLUDE LV_RTTHREAD_INCLUDE +#define LV_ASSERT_HANDLER RT_ASSERT(0); + +/*===================== + * COMPILER SETTINGS + *====================*/ + +#ifdef ARCH_CPU_BIG_ENDIAN + #define LV_BIG_ENDIAN_SYSTEM 1 +#else + #define LV_BIG_ENDIAN_SYSTEM 0 +#endif + +#ifdef rt_align /* >= RT-Thread v5.0.0 */ + #define LV_ATTRIBUTE_MEM_ALIGN rt_align(RT_ALIGN_SIZE) +#else + #define LV_ATTRIBUTE_MEM_ALIGN ALIGN(RT_ALIGN_SIZE) +#endif + +/*================== +* EXAMPLES +*==================*/ + +#ifdef PKG_LVGL_USING_EXAMPLES + #define LV_BUILD_EXAMPLES 1 +#endif + +/*--END OF LV_RT_THREAD_CONF_H--*/ + +#endif /*__RTTHREAD__*/ + +#endif /*LV_CONF_H*/ diff --git a/libraries/lvgl/env_support/rt-thread/lv_rt_thread_port.c b/libraries/lvgl/env_support/rt-thread/lv_rt_thread_port.c new file mode 100644 index 0000000..4e49344 --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/lv_rt_thread_port.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man the first version + * 2022-05-10 Meco Man improve rt-thread initialization process + */ + +#ifdef __RTTHREAD__ + +#include +#include + +#define DBG_TAG "LVGL" +#define DBG_LVL DBG_INFO +#include + +#ifndef PKG_LVGL_THREAD_STACK_SIZE + #define PKG_LVGL_THREAD_STACK_SIZE 4096 +#endif /* PKG_LVGL_THREAD_STACK_SIZE */ + +#ifndef PKG_LVGL_THREAD_PRIO + #define PKG_LVGL_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3) +#endif /* PKG_LVGL_THREAD_PRIO */ + +#ifndef PKG_LVGL_DISP_REFR_PERIOD + #define PKG_LVGL_DISP_REFR_PERIOD 33 +#endif /* PKG_LVGL_DISP_REFR_PERIOD */ + +extern void lv_port_disp_init(void); +extern void lv_port_indev_init(void); +extern void lv_user_gui_init(void); + +static struct rt_thread lvgl_thread; + +#ifdef rt_align + rt_align(RT_ALIGN_SIZE) +#else + ALIGN(RT_ALIGN_SIZE) +#endif +static rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE]; + +#if LV_USE_LOG +static void lv_rt_log(const char *buf) +{ + LOG_I(buf); +} +#endif /* LV_USE_LOG */ + +static void lvgl_thread_entry(void *parameter) +{ +#if LV_USE_LOG + lv_log_register_print_cb(lv_rt_log); +#endif /* LV_USE_LOG */ + lv_init(); + lv_port_disp_init(); + lv_port_indev_init(); + lv_user_gui_init(); + + lv_tick_set_cb(&rt_tick_get_millisecond); + + /* handle the tasks of LVGL */ + while(1) + { + lv_task_handler(); + rt_thread_mdelay(PKG_LVGL_DISP_REFR_PERIOD); + } +} + +static int lvgl_thread_init(void) +{ + rt_err_t err; + + err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, + &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); + if(err != RT_EOK) + { + LOG_E("Failed to create LVGL thread"); + return -1; + } + rt_thread_startup(&lvgl_thread); + + return 0; +} +INIT_ENV_EXPORT(lvgl_thread_init); + +#endif /*__RTTHREAD__*/ diff --git a/libraries/lvgl/env_support/rt-thread/squareline/README.md b/libraries/lvgl/env_support/rt-thread/squareline/README.md new file mode 100644 index 0000000..e55796b --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/squareline/README.md @@ -0,0 +1,4 @@ +This folder is for LVGL SquareLine Studio + +SquareLine Studio can automatically put the generated C files into `ui` folder, so that rt-thread will automatically detect them; or, as a user, you can move the generated C files into `ui` folder manually. + diff --git a/libraries/lvgl/env_support/rt-thread/squareline/SConscript b/libraries/lvgl/env_support/rt-thread/squareline/SConscript new file mode 100644 index 0000000..08220b4 --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/squareline/SConscript @@ -0,0 +1,25 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +inc = [cwd] + +# check if .h or .hpp files exists +def check_h_hpp_exists(path): + file_dirs = os.listdir(path) + for file_dir in file_dirs: + if os.path.splitext(file_dir)[1] in ['.h', '.hpp']: + return True + return False + +sls_src_cwd = cwd +for root, dirs, files in os.walk(sls_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files + if check_h_hpp_exists(current_path): # add .h and .hpp path + inc = inc + [current_path] + +group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = inc) + +Return('group') diff --git a/libraries/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c b/libraries/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c new file mode 100644 index 0000000..f08e1f5 --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2022-05-13 Meco Man First version + */ + +#ifdef __RTTHREAD__ + +void lv_user_gui_init(void) +{ + extern void ui_init(void); + ui_init(); +} + +#endif /* __RTTHREAD__ */ diff --git a/libraries/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h b/libraries/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h new file mode 100644 index 0000000..f2d518f --- /dev/null +++ b/libraries/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2022-11-20 Meco Man The first version + */ + +#ifdef __RTTHREAD__ + +#include "../../../../../lvgl.h" /* back to the root folder's lvgl.h */ + +#endif /* __RTTHREAD__ */ diff --git a/libraries/lvgl/env_support/zephyr/module.yml b/libraries/lvgl/env_support/zephyr/module.yml new file mode 100644 index 0000000..eb317c3 --- /dev/null +++ b/libraries/lvgl/env_support/zephyr/module.yml @@ -0,0 +1,2 @@ +build: + cmake: . diff --git a/libraries/lvgl/examples/.gitkeep b/libraries/lvgl/examples/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/libraries/lvgl/idf_component.yml b/libraries/lvgl/idf_component.yml new file mode 100644 index 0000000..3487358 --- /dev/null +++ b/libraries/lvgl/idf_component.yml @@ -0,0 +1,5 @@ +description: LVGL - Light and Versatile Graphics Library +url: https://lvgl.io/ +repository: https://github.com/lvgl/lvgl.git +documentation: https://docs.lvgl.io/ +issues: https://github.com/lvgl/lvgl/issues \ No newline at end of file diff --git a/libraries/lvgl/library.json b/libraries/lvgl/library.json new file mode 100644 index 0000000..53b4d63 --- /dev/null +++ b/libraries/lvgl/library.json @@ -0,0 +1,17 @@ +{ + "name": "lvgl", + "version": "9.1.0", + "keywords": "graphics, gui, embedded, tft, lvgl", + "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", + "repository": { + "type": "git", + "url": "https://github.com/lvgl/lvgl.git" + }, + "build": { + "includeDir": "." + }, + "license": "MIT", + "homepage": "https://lvgl.io", + "frameworks": "*", + "platforms": "*" +} diff --git a/libraries/lvgl/library.properties b/libraries/lvgl/library.properties new file mode 100644 index 0000000..d80cdf7 --- /dev/null +++ b/libraries/lvgl/library.properties @@ -0,0 +1,10 @@ +name=lvgl +version=9.1.0 +author=kisvegabor +maintainer=kisvegabor,embeddedt,pete-pjb +sentence=Full-featured Graphics Library for Embedded Systems +paragraph=Powerful and easy-to-use embedded GUI with many widgets, advanced visual effects (opacity, antialiasing, animations) and low memory requirements (16K RAM, 64K Flash). +category=Display +url=https://lvgl.io +architectures=* +includes=lvgl.h diff --git a/libraries/lvgl/lv_conf_template.h b/libraries/lvgl/lv_conf_template.h new file mode 100644 index 0000000..64dcc9e --- /dev/null +++ b/libraries/lvgl/lv_conf_template.h @@ -0,0 +1,988 @@ +/** + * @file lv_conf.h + * Configuration file for v9.1.0 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 0 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_NONE + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/*The target buffer size for simple layer chunks.*/ +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Use Arm-2D to accelerate the sw render */ + #define LV_USE_DRAW_ARM2D_SYNC 0 + + /* Enable native helium assembly to be compiled */ + #define LV_USE_NATIVE_HELIUM_ASM 0 + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif + +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#define LV_USE_DRAW_VGLITE 0 + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +/* Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_DRAW_PXP 0 + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/* Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 + +/* Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 + +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#define LV_VG_LITE_USE_BOX_SHADOW 0 + +/* VG-Lite gradient image maximum cache number. + * NOTE: The memory usage of a single gradient image is 4K bytes. + */ +#define LV_VG_LITE_GRAD_CACHE_SIZE 32 + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#define LV_CACHE_DEF_SIZE 0 + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Buffer address alignment*/ + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_SIMPLE 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*API for LittleFs. */ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*LODEPNG decoder library*/ +#define LV_USE_LODEPNG 0 + +/*PNG decoder(libpng) library*/ +#define LV_USE_LIBPNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_TJPGD 0 + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/*RLE decompress library*/ +#define LV_USE_RLE 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*Barcode code library*/ +#define LV_USE_BARCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. + *The higher the value, the more memory will be used.*/ + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*Enable Vector Graphic APIs*/ +#define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#define LV_USE_THORVG_EXTERNAL 0 + +/*Use lvgl built-in LZ4 lib*/ +#define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +#define LV_USE_LZ4_EXTERNAL 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 0 +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ +#endif + +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for /dev/dri/card*/ +#define LV_USE_LINUX_DRM 0 + +/*Interface for TFT_eSPI*/ +#define LV_USE_TFT_ESPI 0 + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/* LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*Flex layout demo*/ +#define LV_USE_DEMO_FLEX_LAYOUT 0 + +/*Smart-phone like multi-language demo*/ +#define LV_USE_DEMO_MULTILANG 0 + +/*Widget transformation demo*/ +#define LV_USE_DEMO_TRANSFORM 0 + +/*Demonstrate scroll settings*/ +#define LV_USE_DEMO_SCROLL 0 + +/*Vector graphic demo*/ +#define LV_USE_DEMO_VECTOR_GRAPHIC 0 +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/libraries/lvgl/lvgl.h b/libraries/lvgl/lvgl.h new file mode 100644 index 0000000..ba10357 --- /dev/null +++ b/libraries/lvgl/lvgl.h @@ -0,0 +1,190 @@ +/** + * @file lvgl.h + * Include all LVGL related headers + */ + +#ifndef LVGL_H +#define LVGL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************** + * CURRENT VERSION OF LVGL + ***************************/ +#define LVGL_VERSION_MAJOR 9 +#define LVGL_VERSION_MINOR 1 +#define LVGL_VERSION_PATCH 0 +#define LVGL_VERSION_INFO "" + +/********************* + * INCLUDES + *********************/ +#include "src/lv_init.h" + +#include "src/stdlib/lv_mem.h" +#include "src/stdlib/lv_string.h" +#include "src/stdlib/lv_sprintf.h" + +#include "src/misc/lv_log.h" +#include "src/misc/lv_timer.h" +#include "src/misc/lv_math.h" +#include "src/misc/lv_array.h" +#include "src/misc/lv_async.h" +#include "src/misc/lv_anim_timeline.h" +#include "src/misc/lv_profiler_builtin.h" +#include "src/misc/lv_rb.h" + +#include "src/tick/lv_tick.h" + +#include "src/core/lv_obj.h" +#include "src/core/lv_group.h" +#include "src/indev/lv_indev.h" +#include "src/core/lv_refr.h" +#include "src/display/lv_display.h" + +#include "src/font/lv_font.h" +#include "src/font/lv_binfont_loader.h" +#include "src/font/lv_font_fmt_txt.h" + +#include "src/widgets/animimage/lv_animimage.h" +#include "src/widgets/arc/lv_arc.h" +#include "src/widgets/bar/lv_bar.h" +#include "src/widgets/button/lv_button.h" +#include "src/widgets/buttonmatrix/lv_buttonmatrix.h" +#include "src/widgets/calendar/lv_calendar.h" +#include "src/widgets/canvas/lv_canvas.h" +#include "src/widgets/chart/lv_chart.h" +#include "src/widgets/checkbox/lv_checkbox.h" +#include "src/widgets/dropdown/lv_dropdown.h" +#include "src/widgets/image/lv_image.h" +#include "src/widgets/imagebutton/lv_imagebutton.h" +#include "src/widgets/keyboard/lv_keyboard.h" +#include "src/widgets/label/lv_label.h" +#include "src/widgets/led/lv_led.h" +#include "src/widgets/line/lv_line.h" +#include "src/widgets/list/lv_list.h" +#include "src/widgets/menu/lv_menu.h" +#include "src/widgets/msgbox/lv_msgbox.h" +#include "src/widgets/roller/lv_roller.h" +#include "src/widgets/scale/lv_scale.h" +#include "src/widgets/slider/lv_slider.h" +#include "src/widgets/span/lv_span.h" +#include "src/widgets/spinbox/lv_spinbox.h" +#include "src/widgets/spinner/lv_spinner.h" +#include "src/widgets/switch/lv_switch.h" +#include "src/widgets/table/lv_table.h" +#include "src/widgets/tabview/lv_tabview.h" +#include "src/widgets/textarea/lv_textarea.h" +#include "src/widgets/tileview/lv_tileview.h" +#include "src/widgets/win/lv_win.h" + +#include "src/others/snapshot/lv_snapshot.h" +#include "src/others/sysmon/lv_sysmon.h" +#include "src/others/monkey/lv_monkey.h" +#include "src/others/gridnav/lv_gridnav.h" +#include "src/others/fragment/lv_fragment.h" +#include "src/others/imgfont/lv_imgfont.h" +#include "src/others/observer/lv_observer.h" +#include "src/others/ime/lv_ime_pinyin.h" +#include "src/others/file_explorer/lv_file_explorer.h" + +#include "src/libs/barcode/lv_barcode.h" +#include "src/libs/bin_decoder/lv_bin_decoder.h" +#include "src/libs/bmp/lv_bmp.h" +#include "src/libs/rle/lv_rle.h" +#include "src/libs/fsdrv/lv_fsdrv.h" +#include "src/libs/lodepng/lv_lodepng.h" +#include "src/libs/libpng/lv_libpng.h" +#include "src/libs/gif/lv_gif.h" +#include "src/libs/qrcode/lv_qrcode.h" +#include "src/libs/tjpgd/lv_tjpgd.h" +#include "src/libs/libjpeg_turbo/lv_libjpeg_turbo.h" +#include "src/libs/freetype/lv_freetype.h" +#include "src/libs/rlottie/lv_rlottie.h" +#include "src/libs/ffmpeg/lv_ffmpeg.h" +#include "src/libs/tiny_ttf/lv_tiny_ttf.h" + +#include "src/layouts/lv_layout.h" + +#include "src/draw/lv_draw.h" +#include "src/draw/lv_draw_buf.h" +#include "src/draw/lv_draw_vector.h" + +#include "src/themes/lv_theme.h" + +#include "src/drivers/lv_drivers.h" + +#include "src/lv_api_map_v8.h" +#include "src/lv_api_map_v9_0.h" + +#include "src/core/lv_global.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/** Gives 1 if the x.y.z version is supported in the current version + * Usage: + * + * - Require v6 + * #if LV_VERSION_CHECK(6,0,0) + * new_func_in_v6(); + * #endif + * + * + * - Require at least v5.3 + * #if LV_VERSION_CHECK(5,3,0) + * new_feature_from_v5_3(); + * #endif + * + * + * - Require v5.3.2 bugfixes + * #if LV_VERSION_CHECK(5,3,2) + * bugfix_in_v5_3_2(); + * #endif + * + */ +#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) + +/** + * Wrapper functions for VERSION macros + */ + +static inline int lv_version_major(void) +{ + return LVGL_VERSION_MAJOR; +} + +static inline int lv_version_minor(void) +{ + return LVGL_VERSION_MINOR; +} + +static inline int lv_version_patch(void) +{ + return LVGL_VERSION_PATCH; +} + +static inline const char * lv_version_info(void) +{ + return LVGL_VERSION_INFO; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_H*/ diff --git a/libraries/lvgl/lvgl.mk b/libraries/lvgl/lvgl.mk new file mode 100644 index 0000000..3488a6f --- /dev/null +++ b/libraries/lvgl/lvgl.mk @@ -0,0 +1,12 @@ +LVGL_PATH ?= ${shell pwd}/lvgl + +ASRCS += $(shell find $(LVGL_PATH)/src -type f -name '*.S') +CSRCS += $(shell find $(LVGL_PATH)/src -type f -name '*.c') +CSRCS += $(shell find $(LVGL_PATH)/demos -type f -name '*.c') +CSRCS += $(shell find $(LVGL_PATH)/examples -type f -name '*.c') +CXXEXT := .cpp +CXXSRCS += $(shell find $(LVGL_PATH)/src -type f -name '*${CXXEXT}') + +AFLAGS += "-I$(LVGL_PATH)" +CFLAGS += "-I$(LVGL_PATH)" +CXXFLAGS += "-I$(LVGL_PATH)" diff --git a/libraries/lvgl/lvgl.pc.in b/libraries/lvgl/lvgl.pc.in new file mode 100644 index 0000000..09b3d2b --- /dev/null +++ b/libraries/lvgl/lvgl.pc.in @@ -0,0 +1,10 @@ +prefix="@CMAKE_INSTALL_PREFIX@" +includedir="${prefix}/@INC_INSTALL_DIR@" +libdir=${prefix}/lib + +Name: lvgl +Description: Light and Versatile Graphics Library +URL: https://lvgl.io/ +Version: 9.1.0 +Cflags: -I${includedir} +Libs: -L${libdir} -llvgl diff --git a/libraries/lvgl/src/core/lv_global.h b/libraries/lvgl/src/core/lv_global.h new file mode 100644 index 0000000..3fa568f --- /dev/null +++ b/libraries/lvgl/src/core/lv_global.h @@ -0,0 +1,244 @@ +/** + * @file lv_global.h + * + */ + +#ifndef LV_GLOBAL_H +#define LV_GLOBAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include + +#include "../misc/lv_types.h" +#include "../draw/lv_draw.h" +#if LV_USE_DRAW_SW +#include "../draw/sw/lv_draw_sw.h" +#endif +#include "../misc/lv_anim.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color_op.h" +#include "../misc/lv_ll.h" +#include "../misc/lv_log.h" +#include "../misc/lv_style.h" +#include "../misc/lv_timer.h" +#include "../others/sysmon/lv_sysmon.h" +#include "../stdlib/builtin/lv_tlsf.h" + +#if LV_USE_FONT_COMPRESSED +#include "../font/lv_font_fmt_txt.h" +#endif + +#include "../tick/lv_tick.h" +#include "../layouts/lv_layout.h" + +/********************* + * DEFINES + *********************/ +#define ZERO_MEM_SENTINEL 0xa1b2c3d4 + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_SPAN != 0 +struct _snippet_stack; +#endif + +#if LV_USE_FREETYPE +struct _lv_freetype_context_t; +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN +struct _lv_profiler_builtin_ctx_t; +#endif + +#if LV_USE_NUTTX +struct _lv_nuttx_ctx_t; +#endif + +typedef struct _lv_global_t { + bool inited; + bool deinit_in_progress; /**< Can be used e.g. in the LV_EVENT_DELETE to deinit the drivers too */ + + lv_ll_t disp_ll; + lv_display_t * disp_refresh; + lv_display_t * disp_default; + + lv_ll_t style_trans_ll; + bool style_refresh; + uint32_t style_custom_table_size; + uint32_t style_last_custom_prop_id; + uint8_t * style_custom_prop_flag_lookup_table; + + lv_ll_t group_ll; + lv_group_t * group_default; + + lv_ll_t indev_ll; + lv_indev_t * indev_active; + lv_obj_t * indev_obj_active; + + uint32_t layout_count; + lv_layout_dsc_t * layout_list; + bool layout_update_mutex; + + uint32_t memory_zero; + uint32_t math_rand_seed; + + lv_event_t * event_header; + uint32_t event_last_register_id; + + lv_timer_state_t timer_state; + lv_anim_state_t anim_state; + lv_tick_state_t tick_state; + + lv_draw_buf_handlers_t draw_buf_handlers; + + lv_ll_t img_decoder_ll; + +#if LV_CACHE_DEF_SIZE > 0 + lv_cache_t * img_cache; +#endif + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + lv_cache_t * img_header_cache; +#endif + + lv_draw_global_info_t draw_info; +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + lv_draw_sw_shadow_cache_t sw_shadow_cache; +#endif +#if LV_DRAW_SW_COMPLEX + _lv_draw_sw_mask_radius_circle_dsc_arr_t sw_circle_cache; +#endif + +#if LV_USE_LOG + lv_log_print_g_cb_t custom_log_print_cb; +#endif + +#if LV_USE_LOG && LV_LOG_USE_TIMESTAMP + uint32_t log_last_log_time; +#endif + +#if LV_USE_THEME_SIMPLE + void * theme_simple; +#endif + +#if LV_USE_THEME_DEFAULT + void * theme_default; +#endif + +#if LV_USE_THEME_MONO + void * theme_mono; +#endif + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + lv_tlsf_state_t tlsf_state; +#endif + + lv_ll_t fsdrv_ll; +#if LV_USE_FS_STDIO != '\0' + lv_fs_drv_t stdio_fs_drv; +#endif +#if LV_USE_FS_POSIX + lv_fs_drv_t posix_fs_drv; +#endif + +#if LV_USE_FS_FATFS + lv_fs_drv_t fatfs_fs_drv; +#endif + +#if LV_USE_FS_WIN32 != '\0' + lv_fs_drv_t win32_fs_drv; +#endif + +#if LV_USE_FS_LITTLEFS + lv_fs_drv_t littlefs_fs_drv; +#endif + +#if LV_USE_FREETYPE + struct _lv_freetype_context_t * ft_context; +#endif + +#if LV_USE_TINY_TTF + lv_cache_t * tiny_ttf_cache; +#endif + +#if LV_USE_FONT_COMPRESSED + lv_font_fmt_rle_t font_fmt_rle; +#endif + +#if LV_USE_SPAN != 0 + struct _snippet_stack * span_snippet_stack; +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + struct _lv_profiler_builtin_ctx_t * profiler_context; +#endif + +#if LV_USE_FILE_EXPLORER != 0 + lv_style_t fe_list_button_style; +#endif + +#if LV_USE_SYSMON && LV_USE_PERF_MONITOR + lv_sysmon_backend_data_t sysmon_perf; +#endif + +#if LV_USE_SYSMON && LV_USE_MEM_MONITOR + lv_sysmon_backend_data_t sysmon_mem; +#endif + +#if LV_USE_IME_PINYIN != 0 + size_t ime_cand_len; +#endif + +#if LV_USE_OBJ_ID_BUILTIN + void * objid_array; + uint32_t objid_count; +#endif + +#if LV_USE_NUTTX + struct _lv_nuttx_ctx_t * nuttx_ctx; +#endif + + void * user_data; +} lv_global_t; + +/********************** + * MACROS + **********************/ + +#if LV_ENABLE_GLOBAL_CUSTOM +#include LV_GLOBAL_CUSTOM_INCLUDE + +#ifndef LV_GLOBAL_CUSTOM +#define LV_GLOBAL_CUSTOM() lv_global_default() +#endif +#define LV_GLOBAL_DEFAULT() LV_GLOBAL_CUSTOM() +#else +LV_ATTRIBUTE_EXTERN_DATA extern lv_global_t lv_global; +#define LV_GLOBAL_DEFAULT() (&lv_global) +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_ENABLE_GLOBAL_CUSTOM +/** + * Get the default global object for current thread + * @return pointer to the default global object + */ +lv_global_t * lv_global_default(void); +#endif +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLOBAL_H*/ diff --git a/libraries/lvgl/src/core/lv_group.c b/libraries/lvgl/src/core/lv_group.c new file mode 100644 index 0000000..44b41d8 --- /dev/null +++ b/libraries/lvgl/src/core/lv_group.c @@ -0,0 +1,536 @@ +/** + * @file lv_group.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_group.h" +#include "../core/lv_obj.h" +#include "../core/lv_global.h" +#include "../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ +#define default_group LV_GLOBAL_DEFAULT()->group_default +#define group_ll_p &(LV_GLOBAL_DEFAULT()->group_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)); +static void lv_group_refocus(lv_group_t * g); +static lv_indev_t * get_indev(const lv_group_t * g); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_group_init(void) +{ + _lv_ll_init(group_ll_p, sizeof(lv_group_t)); +} + +void _lv_group_deinit(void) +{ + _lv_ll_clear(group_ll_p); +} + +lv_group_t * lv_group_create(void) +{ + lv_group_t * group = _lv_ll_ins_head(group_ll_p); + LV_ASSERT_MALLOC(group); + if(group == NULL) return NULL; + _lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); + + group->obj_focus = NULL; + group->frozen = 0; + group->focus_cb = NULL; + group->edge_cb = NULL; + group->editing = 0; + group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; + group->wrap = 1; + group->user_data = NULL; + + return group; +} + +void lv_group_delete(lv_group_t * group) +{ + /*Defocus the currently focused object*/ + LV_ASSERT_NULL(group); + if(group->obj_focus != NULL) { + lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + _LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + /*Remove the group from any indev devices */ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_group(indev) == group) { + lv_indev_set_group(indev, NULL); + } + indev = lv_indev_get_next(indev); + } + + /*If the group is the default group, set the default group as NULL*/ + if(group == lv_group_get_default()) lv_group_set_default(NULL); + + _lv_ll_clear(&(group->obj_ll)); + _lv_ll_remove(group_ll_p, group); + lv_free(group); +} + +void lv_group_set_default(lv_group_t * group) +{ + default_group = group; +} + +lv_group_t * lv_group_get_default(void) +{ + return default_group; +} + +void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) +{ + if(group == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Be sure the object is removed from its current group*/ + lv_group_remove_obj(obj); + + /*Do not add the object twice*/ + lv_obj_t ** obj_i; + _LV_LL_READ(&group->obj_ll, obj_i) { + if((*obj_i) == obj) { + LV_LOG_INFO("the object is already added to this group"); + return; + } + } + + /*If the object is already in a group and focused then refocus it*/ + lv_group_t * group_cur = lv_obj_get_group(obj); + if(group_cur) { + if(obj->spec_attr->group_p && *(obj->spec_attr->group_p->obj_focus) == obj) { + lv_group_refocus(group_cur); + + LV_LOG_INFO("changing object's group"); + } + } + + if(obj->spec_attr == NULL) lv_obj_allocate_spec_attr(obj); + obj->spec_attr->group_p = group; + + lv_obj_t ** next = _lv_ll_ins_tail(&group->obj_ll); + LV_ASSERT_MALLOC(next); + if(next == NULL) return; + *next = obj; + + /*If the head and the tail is equal then there is only one object in the linked list. + *In this case automatically activate it*/ + if(_lv_ll_get_head(&group->obj_ll) == next) { + lv_group_refocus(group); + } + + LV_LOG_TRACE("finished"); +} + +void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) +{ + lv_group_t * g1 = lv_obj_get_group(obj1); + lv_group_t * g2 = lv_obj_get_group(obj2); + if(g1 != g2) return; + if(g1 == NULL) return; + + /*Do not add the object twice*/ + lv_obj_t ** obj_i; + _LV_LL_READ(&g1->obj_ll, obj_i) { + if((*obj_i) == obj1)(*obj_i) = obj2; + else if((*obj_i) == obj2)(*obj_i) = obj1; + } + + lv_obj_t * focused = lv_group_get_focused(g1); + if(focused == obj1) lv_group_focus_obj(obj2); + else if(focused == obj2) lv_group_focus_obj(obj1); + +} + +void lv_group_remove_obj(lv_obj_t * obj) +{ + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Focus on the next object*/ + if(g->obj_focus && *g->obj_focus == obj) { + if(g->frozen) g->frozen = 0; + + /*If this is the only object in the group then focus to nothing.*/ + if(_lv_ll_get_head(&g->obj_ll) == g->obj_focus && _lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { + lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + } + /*If there more objects in the group then focus to the next/prev object*/ + else { + lv_group_refocus(g); + } + } + + /*If the focuses object is still the same then it was the only object in the group but it will + *be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with + *zero objects*/ + if(g->obj_focus && *g->obj_focus == obj) { + g->obj_focus = NULL; + } + + /*Search the object and remove it from its group*/ + lv_obj_t ** i; + _LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + _lv_ll_remove(&g->obj_ll, i); + lv_free(i); + if(obj->spec_attr) obj->spec_attr->group_p = NULL; + break; + } + } + LV_LOG_TRACE("finished"); +} + +void lv_group_remove_all_objs(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + /*Defocus the currently focused object*/ + if(group->obj_focus != NULL) { + lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + group->obj_focus = NULL; + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + _LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + _lv_ll_clear(&(group->obj_ll)); +} + +void lv_group_focus_obj(lv_obj_t * obj) +{ + if(obj == NULL) return; + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + if(g->frozen != 0) return; + + /*On defocus edit mode must be leaved*/ + lv_group_set_editing(g, false); + + lv_obj_t ** i; + _LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + if(g->obj_focus != NULL && obj != *g->obj_focus) { /*Do not defocus if the same object needs to be focused again*/ + lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + if(res != LV_RESULT_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + + g->obj_focus = i; + + if(g->obj_focus != NULL) { + if(g->focus_cb) g->focus_cb(g); + lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_FOCUSED, get_indev(g)); + if(res != LV_RESULT_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + break; + } + } +} + +void lv_group_focus_next(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, true); + } +} + +void lv_group_focus_prev(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, false); + } +} + +void lv_group_focus_freeze(lv_group_t * group, bool en) +{ + LV_ASSERT_NULL(group); + + if(en == false) group->frozen = 0; + else group->frozen = 1; +} + +lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c) +{ + LV_ASSERT_NULL(group); + + lv_obj_t * act = lv_group_get_focused(group); + if(act == NULL) return LV_RESULT_OK; + + if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RESULT_OK; + + return lv_obj_send_event(act, LV_EVENT_KEY, &c); +} + +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) +{ + if(group == NULL) return; + + group->focus_cb = focus_cb; +} + +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) +{ + LV_ASSERT_NULL(group); + + group->edge_cb = edge_cb; +} + +void lv_group_set_editing(lv_group_t * group, bool edit) +{ + LV_ASSERT_NULL(group); + uint8_t en_val = edit ? 1 : 0; + + if(en_val == group->editing) return; /*Do not set the same mode again*/ + + group->editing = en_val; + lv_obj_t * focused = lv_group_get_focused(group); + + if(focused) { + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return; + + lv_obj_invalidate(focused); + } +} + +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) +{ + LV_ASSERT_NULL(group); + group->refocus_policy = policy & 0x01; +} + +void lv_group_set_wrap(lv_group_t * group, bool en) +{ + LV_ASSERT_NULL(group); + group->wrap = en ? 1 : 0; +} + +lv_obj_t * lv_group_get_focused(const lv_group_t * group) +{ + if(!group) return NULL; + if(group->obj_focus == NULL) return NULL; + + return *group->obj_focus; +} + +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->focus_cb; +} + +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->edge_cb; +} + +bool lv_group_get_editing(const lv_group_t * group) +{ + if(!group) return false; + return group->editing; +} + +bool lv_group_get_wrap(lv_group_t * group) +{ + if(!group) return false; + return group->wrap; +} + +uint32_t lv_group_get_obj_count(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + return _lv_ll_get_len(&group->obj_ll); +} + +uint32_t lv_group_get_count(void) +{ + return _lv_ll_get_len(group_ll_p); +} + +lv_group_t * lv_group_by_index(uint32_t index) +{ + uint32_t len = 0; + void * node; + + for(node = _lv_ll_get_tail(group_ll_p); node != NULL; node = _lv_ll_get_prev(group_ll_p, node)) { + if(len == index) { + return (lv_group_t *) node; + } + len++; + } + + return NULL; +} +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_group_refocus(lv_group_t * g) +{ + /*Refocus must temporarily allow wrapping to work correctly*/ + uint8_t temp_wrap = g->wrap; + g->wrap = 1; + + if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_NEXT) + lv_group_focus_next(g); + else if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_PREV) + lv_group_focus_prev(g); + /*Restore wrap property*/ + g->wrap = temp_wrap; +} + +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)) +{ + bool focus_changed = false; + if(group->frozen) return focus_changed; + + lv_obj_t ** obj_next = group->obj_focus; + lv_obj_t ** obj_sentinel = NULL; + bool can_move = true; + bool can_begin = true; + + for(;;) { + if(obj_next == NULL) { + if(group->wrap || obj_sentinel == NULL) { + if(!can_begin) return focus_changed; + obj_next = begin(&group->obj_ll); + can_move = false; + can_begin = false; + } + else { + /*Currently focused object is the last/first in the group, keep it that way*/ + return focus_changed; + } + } + + if(obj_sentinel == NULL) { + obj_sentinel = obj_next; + if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/ + } + + if(can_move) { + obj_next = move(&group->obj_ll, obj_next); + + /*Give up if we walked the entire list and haven't found another visible object*/ + if(obj_next == obj_sentinel) return focus_changed; + } + + can_move = true; + + if(obj_next == NULL) continue; + if(lv_obj_get_state(*obj_next) & LV_STATE_DISABLED) continue; + + /*Hidden objects don't receive focus. + *If any parent is hidden, the object is also hidden)*/ + lv_obj_t * parent = *obj_next; + while(parent) { + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) break; + parent = lv_obj_get_parent(parent); + } + + if(parent && lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) continue; + + /*If we got her a good candidate is found*/ + break; + } + + if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's already focused*/ + + if(group->obj_focus) { + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return focus_changed; + lv_obj_invalidate(*group->obj_focus); + } + + group->obj_focus = obj_next; + + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return focus_changed; + + lv_obj_invalidate(*group->obj_focus); + + if(group->focus_cb) group->focus_cb(group); + focus_changed = true; + return focus_changed; +} + +/** + * Find an indev preferably with POINTER type (because it's the most generic) that uses the given group. + * In other words, find an indev, that is related to the given group. + * In the worst case simply return the latest indev + * @param g a group the find in the indevs + * @return the suggested indev + */ +static lv_indev_t * get_indev(const lv_group_t * g) +{ + lv_indev_t * indev_guess = NULL; + lv_indev_t * indev = lv_indev_get_next(NULL); + + while(indev) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + /*Prefer POINTER*/ + if(indev_type == LV_INDEV_TYPE_POINTER) return indev; + if(lv_indev_get_group(indev) == g) { + indev_guess = indev; + } + indev = lv_indev_get_next(indev); + } + + return indev_guess; +} diff --git a/libraries/lvgl/src/core/lv_group.h b/libraries/lvgl/src/core/lv_group.h new file mode 100644 index 0000000..ca60edb --- /dev/null +++ b/libraries/lvgl/src/core/lv_group.h @@ -0,0 +1,275 @@ +/** + * @file lv_group.h + * + */ + +#ifndef LV_GROUP_H +#define LV_GROUP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#include +#include +#include "../misc/lv_types.h" +#include "../misc/lv_ll.h" + +/********************* + * DEFINES + *********************/ +/*Predefined keys to control the focused object via lv_group_send(group, c)*/ +enum _lv_key_t { + LV_KEY_UP = 17, /*0x11*/ + LV_KEY_DOWN = 18, /*0x12*/ + LV_KEY_RIGHT = 19, /*0x13*/ + LV_KEY_LEFT = 20, /*0x14*/ + LV_KEY_ESC = 27, /*0x1B*/ + LV_KEY_DEL = 127, /*0x7F*/ + LV_KEY_BACKSPACE = 8, /*0x08*/ + LV_KEY_ENTER = 10, /*0x0A, '\n'*/ + LV_KEY_NEXT = 9, /*0x09, '\t'*/ + LV_KEY_PREV = 11, /*0x0B, '*/ + LV_KEY_HOME = 2, /*0x02, STX*/ + LV_KEY_END = 3, /*0x03, ETX*/ +}; + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_group_focus_cb_t)(lv_group_t *); +typedef void (*lv_group_edge_cb_t)(lv_group_t *, bool); + +/** + * Groups can be used to logically hold objects so that they can be individually focused. + * They are NOT for laying out objects on a screen (try layouts for that). + */ +struct _lv_group_t { + lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ + lv_obj_t ** obj_focus; /**< The object in focus*/ + + lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ + lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus + targets are available in this direction (to allow edge feedback + like a sound or a scroll bounce) */ + + void * user_data; + + uint8_t frozen : 1; /**< 1: can't focus to new object*/ + uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ + uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on + deletion.*/ + uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end + of list.*/ +}; + +typedef enum { + LV_GROUP_REFOCUS_POLICY_NEXT = 0, + LV_GROUP_REFOCUS_POLICY_PREV = 1 +} lv_group_refocus_policy_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the group module + * @remarks Internal function, do not call directly. + */ +void _lv_group_init(void); + +/** + * Deinit the group module + * @remarks Internal function, do not call directly. + */ +void _lv_group_deinit(void); + +/** + * Create a new object group + * @return pointer to the new object group + */ +lv_group_t * lv_group_create(void); + +/** + * Delete a group object + * @param group pointer to a group + */ +void lv_group_delete(lv_group_t * group); + +/** + * Set a default group. New object are added to this group if it's enabled in their class with `add_to_def_group = true` + * @param group pointer to a group (can be `NULL`) + */ +void lv_group_set_default(lv_group_t * group); + +/** + * Get the default group + * @return pointer to the default group + */ +lv_group_t * lv_group_get_default(void); + +/** + * Add an object to a group + * @param group pointer to a group + * @param obj pointer to an object to add + */ +void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj); + +/** + * Swap 2 object in a group. The object must be in the same group + * @param obj1 pointer to an object + * @param obj2 pointer to an other object + */ +void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2); + +/** + * Remove an object from its group + * @param obj pointer to an object to remove + */ +void lv_group_remove_obj(lv_obj_t * obj); + +/** + * Remove all objects from a group + * @param group pointer to a group + */ +void lv_group_remove_all_objs(lv_group_t * group); + +/** + * Focus on an object (defocus the current) + * @param obj pointer to an object to focus on + */ +void lv_group_focus_obj(lv_obj_t * obj); + +/** + * Focus the next object in a group (defocus the current) + * @param group pointer to a group + */ +void lv_group_focus_next(lv_group_t * group); + +/** + * Focus the previous object in a group (defocus the current) + * @param group pointer to a group + */ +void lv_group_focus_prev(lv_group_t * group); + +/** + * Do not let to change the focus from the current object + * @param group pointer to a group + * @param en true: freeze, false: release freezing (normal mode) + */ +void lv_group_focus_freeze(lv_group_t * group, bool en); + +/** + * Send a control character to the focuses object of a group + * @param group pointer to a group + * @param c a character (use LV_KEY_.. to navigate) + * @return result of focused object in group. + */ +lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c); + +/** + * Set a function for a group which will be called when a new object is focused + * @param group pointer to a group + * @param focus_cb the call back function or NULL if unused + */ +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); + +/** + * Set a function for a group which will be called when a focus edge is reached + * @param group pointer to a group + * @param edge_cb the call back function or NULL if unused + */ +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb); + +/** + * Set whether the next or previous item in a group is focused if the currently focused obj is + * deleted. + * @param group pointer to a group + * @param policy new refocus policy enum + */ +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy); + +/** + * Manually set the current mode (edit or navigate). + * @param group pointer to group + * @param edit true: edit mode; false: navigate mode + */ +void lv_group_set_editing(lv_group_t * group, bool edit); + +/** + * Set whether focus next/prev will allow wrapping from first->last or last->first object. + * @param group pointer to group + * @param en true: wrapping enabled; false: wrapping disabled + */ +void lv_group_set_wrap(lv_group_t * group, bool en); + +/** + * Get the focused object or NULL if there isn't one + * @param group pointer to a group + * @return pointer to the focused object + */ +lv_obj_t * lv_group_get_focused(const lv_group_t * group); + +/** + * Get the focus callback function of a group + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group); + +/** + * Get the edge callback function of a group + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group); + +/** + * Get the current mode (edit or navigate). + * @param group pointer to group + * @return true: edit mode; false: navigate mode + */ +bool lv_group_get_editing(const lv_group_t * group); + +/** + * Get whether focus next/prev will allow wrapping from first->last or last->first object. + * @param group pointer to group + * @param en true: wrapping enabled; false: wrapping disabled + */ +bool lv_group_get_wrap(lv_group_t * group); + +/** + * Get the number of object in the group + * @param group pointer to a group + * @return number of objects in the group + */ +uint32_t lv_group_get_obj_count(lv_group_t * group); + +/** + * Get the number of groups + * @return number of groups + */ +uint32_t lv_group_get_count(void); + +/** + * Get a group by its index + * @return pointer to the group + */ +lv_group_t * lv_group_by_index(uint32_t index); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GROUP_H*/ diff --git a/libraries/lvgl/src/core/lv_obj.c b/libraries/lvgl/src/core/lv_obj.c new file mode 100644 index 0000000..f05b538 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj.c @@ -0,0 +1,873 @@ +/** + * @file lv_obj.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" +#include "lv_refr.h" +#include "lv_group.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../themes/lv_theme.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" +#include "../tick/lv_tick.h" +#include "../stdlib/lv_string.h" +#include +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define LV_OBJ_DEF_WIDTH (LV_DPX(100)) +#define LV_OBJ_DEF_HEIGHT (LV_DPX(50)) +#define STYLE_TRANSITION_MAX 32 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_draw(lv_event_t * e); +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer); +static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc); +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); +static void update_obj_state(lv_obj_t * obj, lv_state_t new_state); +#if LV_USE_OBJ_PROPERTY + static lv_result_t lv_obj_set_any(lv_obj_t *, lv_prop_id_t, const lv_property_t *); + static lv_result_t lv_obj_get_any(const lv_obj_t *, lv_prop_id_t, lv_property_t *); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t properties[] = { + { + .id = LV_PROPERTY_OBJ_PARENT, + .setter = lv_obj_set_parent, + .getter = lv_obj_get_parent, + }, + { + .id = LV_PROPERTY_ID_ANY, + .setter = lv_obj_set_any, + .getter = lv_obj_get_any, + } +}; +#endif + +const lv_obj_class_t lv_obj_class = { + .constructor_cb = lv_obj_constructor, + .destructor_cb = lv_obj_destructor, + .event_cb = lv_obj_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .editable = LV_OBJ_CLASS_EDITABLE_FALSE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, + .instance_size = (sizeof(lv_obj_t)), + .base_class = NULL, + .name = "obj", +#if LV_USE_OBJ_PROPERTY + .prop_index_start = LV_PROPERTY_OBJ_START, + .prop_index_end = LV_PROPERTY_OBJ_END, + .properties = properties, + .properties_count = sizeof(properties) / sizeof(properties[0]), +#endif +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_obj_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/*----------------- + * Attribute set + *----------------*/ + +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + + /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */ + if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); + + obj->flags |= f; + + if(f & LV_OBJ_FLAG_HIDDEN) { + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_group_t * group = lv_obj_get_group(obj); + if(group != NULL) { + lv_group_focus_next(group); + lv_obj_t * next_obj = lv_group_get_focused(group); + if(next_obj != NULL) { + lv_obj_invalidate(next_obj); + } + } + } + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } +} + +void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + + obj->flags &= (~f); + + if(f & LV_OBJ_FLAG_HIDDEN) { + lv_obj_invalidate(obj); + if(lv_obj_is_layout_positioned(obj)) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + } + +} + +void lv_obj_update_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v) +{ + if(v) lv_obj_add_flag(obj, f); + else lv_obj_remove_flag(obj, f); +} + +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state | state; + if(obj->state != new_state) { + + if(new_state & LV_STATE_DISABLED) { + lv_indev_reset(NULL, obj); + } + + update_obj_state(obj, new_state); + } +} + +void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state & (~state); + if(obj->state != new_state) { + update_obj_state(obj, new_state); + } +} + +void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v) +{ + if(v) lv_obj_add_state(obj, state); + else lv_obj_remove_state(obj, state); +} + +/*======================= + * Getter functions + *======================*/ + +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return (obj->flags & f) == f; +} + +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return !!(obj->flags & f); +} + +lv_state_t lv_obj_get_state(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->state; +} + +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return !!(obj->state & state); +} + +lv_group_t * lv_obj_get_group(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr) return obj->spec_attr->group_p; + else return NULL; +} + +/*------------------- + * OTHER FUNCTIONS + *------------------*/ + +void lv_obj_allocate_spec_attr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) { + obj->spec_attr = lv_malloc_zeroed(sizeof(_lv_obj_spec_attr_t)); + LV_ASSERT_MALLOC(obj->spec_attr); + if(obj->spec_attr == NULL) return; + + obj->spec_attr->scroll_dir = LV_DIR_ALL; + obj->spec_attr->scrollbar_mode = LV_SCROLLBAR_MODE_AUTO; + } +} + +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + if(obj == NULL) return false; + return obj->class_p == class_p; +} + +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + const lv_obj_class_t * obj_class = obj->class_p; + while(obj_class) { + if(obj_class == class_p) return true; + obj_class = obj_class->base_class; + } + + return false; +} + +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj) +{ + return obj->class_p; +} + +bool lv_obj_is_valid(const lv_obj_t * obj) +{ + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) return true; + bool found = obj_valid_child(disp->screens[i], obj); + if(found) return true; + } + + disp = lv_display_get_next(disp); + } + + return false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_t * parent = obj->parent; + if(parent) { + int32_t sl = lv_obj_get_scroll_left(parent); + int32_t st = lv_obj_get_scroll_top(parent); + + obj->coords.y1 = parent->coords.y1 + lv_obj_get_style_pad_top(parent, LV_PART_MAIN) - st; + obj->coords.y2 = obj->coords.y1 - 1; + obj->coords.x1 = parent->coords.x1 + lv_obj_get_style_pad_left(parent, LV_PART_MAIN) - sl; + obj->coords.x2 = obj->coords.x1 - 1; + } + + /*Set attributes*/ + obj->flags = LV_OBJ_FLAG_CLICKABLE; + obj->flags |= LV_OBJ_FLAG_SNAPPABLE; + if(parent) obj->flags |= LV_OBJ_FLAG_PRESS_LOCK; + if(parent) obj->flags |= LV_OBJ_FLAG_SCROLL_CHAIN; + obj->flags |= LV_OBJ_FLAG_CLICK_FOCUSABLE; + obj->flags |= LV_OBJ_FLAG_SCROLLABLE; + obj->flags |= LV_OBJ_FLAG_SCROLL_ELASTIC; + obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; + obj->flags |= LV_OBJ_FLAG_SCROLL_WITH_ARROW; + if(parent) obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; + +#if LV_USE_OBJ_ID + lv_obj_assign_id(class_p, obj); +#endif + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + _lv_event_mark_deleted(obj); + + /*Remove all style*/ + lv_obj_enable_style_refresh(false); /*No need to refresh the style because the object will be deleted*/ + lv_obj_remove_style_all(obj); + lv_obj_enable_style_refresh(true); + + /*Remove the animations from this object*/ + lv_anim_delete(obj, NULL); + + /*Delete from the group*/ + lv_group_t * group = lv_obj_get_group(obj); + if(group) lv_group_remove_obj(obj); + + if(obj->spec_attr) { + if(obj->spec_attr->children) { + lv_free(obj->spec_attr->children); + obj->spec_attr->children = NULL; + } + + lv_event_remove_all(&obj->spec_attr->event_list); + + lv_free(obj->spec_attr); + obj->spec_attr = NULL; + } + +#if LV_USE_OBJ_ID + lv_obj_free_id(obj); +#endif +} + +static void lv_obj_draw(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(lv_obj_get_style_clip_corner(obj, LV_PART_MAIN)) { + info->res = LV_COVER_RES_MASKED; + return; + } + + /*Most trivial test. Is the mask fully IN the object? If no it surely doesn't cover it*/ + int32_t r = lv_obj_get_style_radius(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + if(_lv_area_is_in(info->area, &coords, r) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_bg_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_bg_grad_dir(obj, 0) != LV_GRAD_DIR_NONE) { + if(lv_obj_get_style_bg_grad_opa(obj, 0) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + const lv_grad_dsc_t * grad_dsc = lv_obj_get_style_bg_grad(obj, 0); + if(grad_dsc) { + uint32_t i; + for(i = 0; i < grad_dsc->stops_count; i++) { + if(grad_dsc->stops[i].opa < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + } + info->res = LV_COVER_RES_COVER; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_layer_t * layer = lv_event_get_layer(e); + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + /*If the border is drawn later disable loading its properties*/ + if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + draw_dsc.border_post = 1; + } + + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + lv_draw_rect(layer, &draw_dsc, &coords); + } + else if(code == LV_EVENT_DRAW_POST) { + lv_layer_t * layer = lv_event_get_layer(e); + draw_scrollbar(obj, layer); + + /*If the border is drawn later disable loading other properties*/ + if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_opa = LV_OPA_TRANSP; + draw_dsc.bg_image_opa = LV_OPA_TRANSP; + draw_dsc.outline_opa = LV_OPA_TRANSP; + draw_dsc.shadow_opa = LV_OPA_TRANSP; + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + lv_draw_rect(layer, &draw_dsc, &coords); + } + } +} + +static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer) +{ + + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + lv_draw_rect_dsc_t draw_dsc; + lv_result_t sb_res = scrollbar_init_draw_dsc(obj, &draw_dsc); + if(sb_res != LV_RESULT_OK) return; + + if(lv_area_get_size(&hor_area) > 0) { + draw_dsc.base.id1 = 0; + lv_draw_rect(layer, &draw_dsc, &hor_area); + } + if(lv_area_get_size(&ver_area) > 0) { + draw_dsc.base.id1 = 1; + lv_draw_rect(layer, &draw_dsc, &ver_area); + } +} + +/** + * Initialize the draw descriptor for the scrollbar + * @param obj pointer to an object + * @param dsc the draw descriptor to initialize + * @return LV_RESULT_OK: the scrollbar is visible; LV_RESULT_INVALID: the scrollbar is not visible + */ +static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc) +{ + lv_draw_rect_dsc_init(dsc); + dsc->bg_opa = lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR); + if(dsc->bg_opa > LV_OPA_MIN) { + dsc->bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SCROLLBAR); + } + + dsc->border_opa = lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR); + if(dsc->border_opa > LV_OPA_MIN) { + dsc->border_width = lv_obj_get_style_border_width(obj, LV_PART_SCROLLBAR); + if(dsc->border_width > 0) { + dsc->border_color = lv_obj_get_style_border_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->border_opa = LV_OPA_TRANSP; + } + } + + dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_opa > LV_OPA_MIN) { + dsc->shadow_width = lv_obj_get_style_shadow_width(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_width > 0) { + dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, LV_PART_SCROLLBAR); + dsc->shadow_color = lv_obj_get_style_shadow_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->shadow_opa = LV_OPA_TRANSP; + } + } + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_SCROLLBAR); + if(opa < LV_OPA_MAX) { + lv_opa_t v = LV_OPA_MIX2(dsc->bg_opa, opa); + dsc->bg_opa = v; + dsc->border_opa = v; + dsc->shadow_opa = v; + } + + if(dsc->bg_opa != LV_OPA_TRANSP || dsc->border_opa != LV_OPA_TRANSP || dsc->shadow_opa != LV_OPA_TRANSP) { + dsc->radius = lv_obj_get_style_radius(obj, LV_PART_SCROLLBAR); + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} + +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_PRESSED) { + lv_obj_add_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + void * param = lv_event_get_param(e); + /*Go the checked state if enabled*/ + if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED); + else lv_obj_remove_state(obj, LV_STATE_CHECKED); + + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_PRESS_LOST) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(uint32_t i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_KEY) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_obj_add_state(obj, LV_STATE_CHECKED); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_obj_remove_state(obj, LV_STATE_CHECKED); + } + + /*With Enter LV_EVENT_RELEASED will send VALUE_CHANGE event*/ + if(c != LV_KEY_ENTER) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE | LV_OBJ_FLAG_SCROLL_WITH_ARROW) && !lv_obj_is_editable(obj)) { + /*scroll by keypad or encoder*/ + lv_anim_enable_t anim_enable = LV_ANIM_OFF; + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_DOWN) { + /*use scroll_to_x/y functions to enforce scroll limits*/ + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_UP) { + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_RIGHT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) + lv_obj_get_width(obj) / 4, anim_enable); + } + else if(c == LV_KEY_LEFT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) - lv_obj_get_width(obj) / 4, anim_enable); + } + } + } + else if(code == LV_EVENT_FOCUSED) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS)) { + lv_obj_scroll_to_view_recursive(obj, LV_ANIM_ON); + } + + bool editing = false; + editing = lv_group_get_editing(lv_obj_get_group(obj)); + lv_state_t state = LV_STATE_FOCUSED; + + /* Use the indev for then indev handler. + * But if the obj was focused manually it returns NULL so try to + * use the indev from the event*/ + lv_indev_t * indev = lv_indev_active(); + if(indev == NULL) indev = lv_event_get_indev(e); + + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_KEYPAD || indev_type == LV_INDEV_TYPE_ENCODER) state |= LV_STATE_FOCUS_KEY; + if(editing) { + state |= LV_STATE_EDITED; + lv_obj_add_state(obj, state); + } + else { + lv_obj_add_state(obj, state); + lv_obj_remove_state(obj, LV_STATE_EDITED); + } + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + lv_obj_add_state(obj, LV_STATE_SCROLLED); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_obj_remove_state(obj, LV_STATE_SCROLLED); + if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + lv_obj_remove_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED | LV_STATE_FOCUS_KEY); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align) { + lv_obj_mark_layout_as_dirty(obj); + } + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_CHILD_CHANGED) { + int32_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); + int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align || w == LV_SIZE_CONTENT || h == LV_SIZE_CONTENT) { + lv_obj_mark_layout_as_dirty(obj); + } + } + else if(code == LV_EVENT_CHILD_DELETED) { + obj->readjust_scroll_after_layout = 1; + lv_obj_mark_layout_as_dirty(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); + lv_event_set_ext_draw_size(e, d); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { + lv_obj_draw(e); + } + else if(code == LV_EVENT_INDEV_RESET) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + lv_obj_remove_state(obj, LV_STATE_SCROLLED); + } +} + +/** + * Set the state (fully overwrite) of an object. + * If specified in the styles, transition animations will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the new state + */ +static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) +{ + if(obj->state == new_state) return; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t prev_state = obj->state; + + _lv_style_state_cmp_t cmp_res = _lv_obj_style_state_compare(obj, prev_state, new_state); + /*If there is no difference in styles there is nothing else to do*/ + if(cmp_res == _LV_STYLE_STATE_CMP_SAME) { + obj->state = new_state; + return; + } + + /*Invalidate the object in their current state*/ + lv_obj_invalidate(obj); + + obj->state = new_state; + _lv_obj_update_layer_type(obj); + _lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(_lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); + uint32_t tsi = 0; + uint32_t i; + for(i = 0; i < obj->style_cnt && tsi < STYLE_TRANSITION_MAX; i++) { + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(state_act & (~new_state)) continue; /*Skip unrelated styles*/ + if(obj_style->is_trans) continue; + + lv_style_value_t v; + if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) != LV_STYLE_RES_FOUND) continue; + const lv_style_transition_dsc_t * tr = v.ptr; + + /*Add the props to the set if not added yet or added but with smaller weight*/ + uint32_t j; + for(j = 0; tr->props[j] != 0 && tsi < STYLE_TRANSITION_MAX; j++) { + uint32_t t; + for(t = 0; t < tsi; t++) { + lv_style_selector_t selector = ts[t].selector; + lv_state_t state_ts = lv_obj_style_get_selector_state(selector); + lv_part_t part_ts = lv_obj_style_get_selector_part(selector); + if(ts[t].prop == tr->props[j] && part_ts == part_act && state_ts >= state_act) break; + } + + /*If not found add it*/ + if(t == tsi) { + ts[tsi].time = tr->time; + ts[tsi].delay = tr->delay; + ts[tsi].path_cb = tr->path_xcb; + ts[tsi].prop = tr->props[j]; + ts[tsi].user_data = tr->user_data; + ts[tsi].selector = obj_style->selector; + tsi++; + } + } + } + + for(i = 0; i < tsi; i++) { + lv_part_t part_act = lv_obj_style_get_selector_part(ts[i].selector); + _lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); + } + + lv_free(ts); + + if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_REDRAW) { + /*Invalidation is not enough, e.g. layer type needs to be updated too*/ + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + } + else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_LAYOUT) { + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + } + else if(cmp_res == _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { + lv_obj_invalidate(obj); + lv_obj_refresh_ext_draw_size(obj); + } +} + +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find) +{ + /*Check all children of `parent`*/ + uint32_t child_cnt = 0; + if(parent->spec_attr) child_cnt = parent->spec_attr->child_cnt; + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(child == obj_to_find) { + return true; + } + + /*Check the children*/ + bool found = obj_valid_child(child, obj_to_find); + if(found) { + return true; + } + } + return false; +} + +#if LV_USE_OBJ_PROPERTY +static lv_result_t lv_obj_set_any(lv_obj_t * obj, lv_prop_id_t id, const lv_property_t * prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); + if(prop->num) lv_obj_add_flag(obj, flag); + else lv_obj_remove_flag(obj, flag); + return LV_RESULT_OK; + } + else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { + lv_state_t state = 1L << (id - LV_PROPERTY_OBJ_STATE_START); + if(id == LV_PROPERTY_OBJ_STATE_ANY) { + state = LV_STATE_ANY; + } + + if(prop->num) lv_obj_add_state(obj, state); + else lv_obj_remove_state(obj, state); + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} + +static lv_result_t lv_obj_get_any(const lv_obj_t * obj, lv_prop_id_t id, lv_property_t * prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); + prop->id = id; + prop->num = obj->flags & flag; + return LV_RESULT_OK; + } + else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { + prop->id = id; + if(id == LV_PROPERTY_OBJ_STATE_ANY) { + prop->num = obj->state; + } + else { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_STATE_START); + prop->num = obj->state & flag; + } + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} +#endif diff --git a/libraries/lvgl/src/core/lv_obj.h b/libraries/lvgl/src/core/lv_obj.h new file mode 100644 index 0000000..b67684f --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj.h @@ -0,0 +1,470 @@ +/** + * @file lv_obj.h + * + */ + +#ifndef LV_OBJ_H +#define LV_OBJ_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../misc/lv_assert.h" + +#include "lv_obj_tree.h" +#include "lv_obj_pos.h" +#include "lv_obj_scroll.h" +#include "lv_obj_style.h" +#include "lv_obj_draw.h" +#include "lv_obj_class.h" +#include "lv_obj_event.h" +#include "lv_obj_property.h" +#include "lv_group.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Possible states of a widget. + * OR-ed values are possible + */ +enum _lv_state_t { + LV_STATE_DEFAULT = 0x0000, + LV_STATE_CHECKED = 0x0001, + LV_STATE_FOCUSED = 0x0002, + LV_STATE_FOCUS_KEY = 0x0004, + LV_STATE_EDITED = 0x0008, + LV_STATE_HOVERED = 0x0010, + LV_STATE_PRESSED = 0x0020, + LV_STATE_SCROLLED = 0x0040, + LV_STATE_DISABLED = 0x0080, + LV_STATE_USER_1 = 0x1000, + LV_STATE_USER_2 = 0x2000, + LV_STATE_USER_3 = 0x4000, + LV_STATE_USER_4 = 0x8000, + + LV_STATE_ANY = 0xFFFF, /**< Special value can be used in some functions to target all states*/ +}; + +/** + * The possible parts of widgets. + * The parts can be considered as the internal building block of the widgets. + * E.g. slider = background + indicator + knob + * Not all parts are used by every widget + */ + +enum _lv_part_t { + LV_PART_MAIN = 0x000000, /**< A background like rectangle*/ + LV_PART_SCROLLBAR = 0x010000, /**< The scrollbar(s)*/ + LV_PART_INDICATOR = 0x020000, /**< Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox*/ + LV_PART_KNOB = 0x030000, /**< Like handle to grab to adjust the value*/ + LV_PART_SELECTED = 0x040000, /**< Indicate the currently selected option or section*/ + LV_PART_ITEMS = 0x050000, /**< Used if the widget has multiple similar elements (e.g. table cells)*/ + LV_PART_CURSOR = 0x060000, /**< Mark a specific place e.g. for text area's cursor or on a chart*/ + + LV_PART_CUSTOM_FIRST = 0x080000, /**< Extension point for custom widgets*/ + + LV_PART_ANY = 0x0F0000, /**< Special value can be used in some functions to target all parts*/ +}; + +/** + * On/Off features controlling the object's behavior. + * OR-ed values are possible + * + * Note: update obj flags corresponding properties below + * whenever add/remove flags or change bit definition of flags. + */ +typedef enum { + LV_OBJ_FLAG_HIDDEN = (1L << 0), /**< Make the object hidden. (Like it wasn't there at all)*/ + LV_OBJ_FLAG_CLICKABLE = (1L << 1), /**< Make the object clickable by the input devices*/ + LV_OBJ_FLAG_CLICK_FOCUSABLE = (1L << 2), /**< Add focused state to the object when clicked*/ + LV_OBJ_FLAG_CHECKABLE = (1L << 3), /**< Toggle checked state when the object is clicked*/ + LV_OBJ_FLAG_SCROLLABLE = (1L << 4), /**< Make the object scrollable*/ + LV_OBJ_FLAG_SCROLL_ELASTIC = (1L << 5), /**< Allow scrolling inside but with slower speed*/ + LV_OBJ_FLAG_SCROLL_MOMENTUM = (1L << 6), /**< Make the object scroll further when "thrown"*/ + LV_OBJ_FLAG_SCROLL_ONE = (1L << 7), /**< Allow scrolling only one snappable children*/ + LV_OBJ_FLAG_SCROLL_CHAIN_HOR = (1L << 8), /**< Allow propagating the horizontal scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN_VER = (1L << 9), /**< Allow propagating the vertical scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN = (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER), + LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1L << 10), /**< Automatically scroll object to make it visible when focused*/ + LV_OBJ_FLAG_SCROLL_WITH_ARROW = (1L << 11), /**< Allow scrolling the focused object with arrow keys*/ + LV_OBJ_FLAG_SNAPPABLE = (1L << 12), /**< If scroll snap is enabled on the parent it can snap to this object*/ + LV_OBJ_FLAG_PRESS_LOCK = (1L << 13), /**< Keep the object pressed even if the press slid from the object*/ + LV_OBJ_FLAG_EVENT_BUBBLE = (1L << 14), /**< Propagate the events to the parent too*/ + LV_OBJ_FLAG_GESTURE_BUBBLE = (1L << 15), /**< Propagate the gestures to the parent*/ + LV_OBJ_FLAG_ADV_HITTEST = (1L << 16), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners.*/ + LV_OBJ_FLAG_IGNORE_LAYOUT = (1L << 17), /**< Make the object position-able by the layouts*/ + LV_OBJ_FLAG_FLOATING = (1L << 18), /**< Do not scroll the object when the parent scrolls and ignore layout*/ + LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS = (1L << 19), /**< Send `LV_EVENT_DRAW_TASK_ADDED` events*/ + LV_OBJ_FLAG_OVERFLOW_VISIBLE = (1L << 20),/**< Do not clip the children to the parent's ext draw size*/ +#if LV_USE_FLEX + LV_OBJ_FLAG_FLEX_IN_NEW_TRACK = (1L << 21), /**< Start a new flex track on this item*/ +#endif + + LV_OBJ_FLAG_LAYOUT_1 = (1L << 23), /**< Custom flag, free to use by layouts*/ + LV_OBJ_FLAG_LAYOUT_2 = (1L << 24), /**< Custom flag, free to use by layouts*/ + + LV_OBJ_FLAG_WIDGET_1 = (1L << 25), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_WIDGET_2 = (1L << 26), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_USER_1 = (1L << 27), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_2 = (1L << 28), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_3 = (1L << 29), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_4 = (1L << 30), /**< Custom flag, free to use by user*/ +} _lv_obj_flag_t; + +#if LV_USE_OBJ_PROPERTY +enum { + /*OBJ flag properties */ + LV_PROPERTY_ID(OBJ, FLAG_START, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(OBJ, FLAG_HIDDEN, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(OBJ, FLAG_CLICKABLE, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(OBJ, FLAG_CLICK_FOCUSABLE, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(OBJ, FLAG_CHECKABLE, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(OBJ, FLAG_SCROLLABLE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ELASTIC, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_MOMENTUM, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ONE, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_HOR, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_VER, LV_PROPERTY_TYPE_INT, 9), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ON_FOCUS, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_WITH_ARROW, LV_PROPERTY_TYPE_INT, 11), + LV_PROPERTY_ID(OBJ, FLAG_SNAPPABLE, LV_PROPERTY_TYPE_INT, 12), + LV_PROPERTY_ID(OBJ, FLAG_PRESS_LOCK, LV_PROPERTY_TYPE_INT, 13), + LV_PROPERTY_ID(OBJ, FLAG_EVENT_BUBBLE, LV_PROPERTY_TYPE_INT, 14), + LV_PROPERTY_ID(OBJ, FLAG_GESTURE_BUBBLE, LV_PROPERTY_TYPE_INT, 15), + LV_PROPERTY_ID(OBJ, FLAG_ADV_HITTEST, LV_PROPERTY_TYPE_INT, 16), + LV_PROPERTY_ID(OBJ, FLAG_IGNORE_LAYOUT, LV_PROPERTY_TYPE_INT, 17), + LV_PROPERTY_ID(OBJ, FLAG_FLOATING, LV_PROPERTY_TYPE_INT, 18), + LV_PROPERTY_ID(OBJ, FLAG_SEND_DRAW_TASK_EVENTS, LV_PROPERTY_TYPE_INT, 19), + LV_PROPERTY_ID(OBJ, FLAG_OVERFLOW_VISIBLE, LV_PROPERTY_TYPE_INT, 20), + LV_PROPERTY_ID(OBJ, FLAG_FLEX_IN_NEW_TRACK, LV_PROPERTY_TYPE_INT, 21), + LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_1, LV_PROPERTY_TYPE_INT, 23), + LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_2, LV_PROPERTY_TYPE_INT, 24), + LV_PROPERTY_ID(OBJ, FLAG_WIDGET_1, LV_PROPERTY_TYPE_INT, 25), + LV_PROPERTY_ID(OBJ, FLAG_WIDGET_2, LV_PROPERTY_TYPE_INT, 26), + LV_PROPERTY_ID(OBJ, FLAG_USER_1, LV_PROPERTY_TYPE_INT, 27), + LV_PROPERTY_ID(OBJ, FLAG_USER_2, LV_PROPERTY_TYPE_INT, 28), + LV_PROPERTY_ID(OBJ, FLAG_USER_3, LV_PROPERTY_TYPE_INT, 29), + LV_PROPERTY_ID(OBJ, FLAG_USER_4, LV_PROPERTY_TYPE_INT, 30), + LV_PROPERTY_ID(OBJ, FLAG_END, LV_PROPERTY_TYPE_INT, 30), + + LV_PROPERTY_ID(OBJ, STATE_START, LV_PROPERTY_TYPE_INT, 31), + LV_PROPERTY_ID(OBJ, STATE_CHECKED, LV_PROPERTY_TYPE_INT, 31), + LV_PROPERTY_ID(OBJ, STATE_FOCUSED, LV_PROPERTY_TYPE_INT, 32), + LV_PROPERTY_ID(OBJ, STATE_FOCUS_KEY, LV_PROPERTY_TYPE_INT, 33), + LV_PROPERTY_ID(OBJ, STATE_EDITED, LV_PROPERTY_TYPE_INT, 34), + LV_PROPERTY_ID(OBJ, STATE_HOVERED, LV_PROPERTY_TYPE_INT, 35), + LV_PROPERTY_ID(OBJ, STATE_PRESSED, LV_PROPERTY_TYPE_INT, 36), + LV_PROPERTY_ID(OBJ, STATE_SCROLLED, LV_PROPERTY_TYPE_INT, 37), + LV_PROPERTY_ID(OBJ, STATE_DISABLED, LV_PROPERTY_TYPE_INT, 38), + /*not used bit8-bit11*/ + LV_PROPERTY_ID(OBJ, STATE_USER_1, LV_PROPERTY_TYPE_INT, 43), + LV_PROPERTY_ID(OBJ, STATE_USER_2, LV_PROPERTY_TYPE_INT, 44), + LV_PROPERTY_ID(OBJ, STATE_USER_3, LV_PROPERTY_TYPE_INT, 45), + LV_PROPERTY_ID(OBJ, STATE_USER_4, LV_PROPERTY_TYPE_INT, 46), + LV_PROPERTY_ID(OBJ, STATE_ANY, LV_PROPERTY_TYPE_INT, 47), + LV_PROPERTY_ID(OBJ, STATE_END, LV_PROPERTY_TYPE_INT, 47), + + /*OBJ normal properties*/ + LV_PROPERTY_ID(OBJ, PARENT, LV_PROPERTY_TYPE_POINTER, 31), + + LV_PROPERTY_OBJ_END, +}; +#endif + +/** + * Make the base object's class publicly available. + */ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_obj_class; + +/** + * Special, rarely used attributes. + * They are allocated automatically if any elements is set. + */ +typedef struct { + lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ + lv_group_t * group_p; + lv_event_list_t event_list; + + lv_point_t scroll; /**< The current X/Y scroll offset*/ + + int32_t ext_click_pad; /**< Extra click padding in all direction*/ + int32_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ + + uint16_t child_cnt; /**< Number of children*/ + uint16_t scrollbar_mode : 2; /**< How to display scrollbars, see `lv_scrollbar_mode_t`*/ + uint16_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally, see `lv_scroll_snap_t`*/ + uint16_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ + uint16_t scroll_dir : 4; /**< The allowed scroll direction(s), see `lv_dir_t`*/ + uint16_t layer_type : 2; /**< Cache the layer type here. Element of @lv_intermediate_layer_type_t */ +} _lv_obj_spec_attr_t; + +struct _lv_obj_t { + const lv_obj_class_t * class_p; + lv_obj_t * parent; + _lv_obj_spec_attr_t * spec_attr; + _lv_obj_style_t * styles; +#if LV_OBJ_STYLE_CACHE + uint32_t style_main_prop_is_set; + uint32_t style_other_prop_is_set; +#endif + void * user_data; +#if LV_USE_OBJ_ID + void * id; +#endif + lv_area_t coords; + lv_obj_flag_t flags; + lv_state_t state; + uint16_t layout_inv : 1; + uint16_t readjust_scroll_after_layout : 1; + uint16_t scr_layout_inv : 1; + uint16_t skip_trans : 1; + uint16_t style_cnt : 6; + uint16_t h_layout : 1; + uint16_t w_layout : 1; + uint16_t is_deleting : 1; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a base object (a rectangle) + * @param parent pointer to a parent object. If NULL then a screen will be created. + * @return pointer to the new object + */ +lv_obj_t * lv_obj_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set one or more flags + * @param obj pointer to an object + * @param f R-ed values from `lv_obj_flag_t` to set. + */ +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Remove one or more flags + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to set. + */ +void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Set add or remove one or more flags. + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to update. + * @param v true: add the flags; false: remove the flags + */ +void lv_obj_update_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v); + +/** + * Add one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state); + +/** + * Remove one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state); + +/** + * Add or remove one or more states to the object. The other state bits will remain unchanged. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + * @param v true: add the states; false: remove the states + */ +void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v); + +/** + * Set the user_data field of the object + * @param obj pointer to an object + * @param user_data pointer to the new user_data. + */ +static inline void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) +{ + obj->user_data = user_data; +} + +/*======================= + * Getter functions + *======================*/ + +/** + * Check if a given flag or all the given flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: all flags are set; false: not all flags are set + */ +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Check if a given flag or any of the flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: at lest one flag flag is set; false: none of the flags are set + */ +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Get the state of an object + * @param obj pointer to an object + * @return the state (OR-ed values from `lv_state_t`) + */ +lv_state_t lv_obj_get_state(const lv_obj_t * obj); + +/** + * Check if the object is in a given state or not. + * @param obj pointer to an object + * @param state a state or combination of states to check + * @return true: `obj` is in `state`; false: `obj` is not in `state` + */ +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state); + +/** + * Get the group of the object + * @param obj pointer to an object + * @return the pointer to group of the object + */ +lv_group_t * lv_obj_get_group(const lv_obj_t * obj); + +/** + * Get the user_data field of the object + * @param obj pointer to an object + * @return the pointer to the user_data of the object + */ +static inline void * lv_obj_get_user_data(lv_obj_t * obj) +{ + return obj->user_data; +} + +/*======================= + * Other functions + *======================*/ + +/** + * Allocate special data for an object if not allocated yet. + * @param obj pointer to an object + */ +void lv_obj_allocate_spec_attr(lv_obj_t * obj); + +/** + * Check the type of obj. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `class_p` is the `obj` class. + */ +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Check if any object has a given class (type). + * It checks the ancestor classes too. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `obj` has the given class + */ +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Get the class (type) of the object + * @param obj pointer to an object + * @return the class (type) of the object + */ +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj); + +/** + * Check if any object is still "alive". + * @param obj pointer to an object + * @return true: valid + */ +bool lv_obj_is_valid(const lv_obj_t * obj); + +#if LV_USE_OBJ_ID + +/** + * Assign an id to an object if not previously assigned + * Set `LV_USE_OBJ_ID_BUILTIN` to 1 to use builtin method to generate object ID. + * Otherwise, these functions including `lv_obj_[assign|free|stringify]_id` should be implemented externally. + * + * @param class_p the class this obj belongs to. Note obj->class_p is the class currently being constructed. + * @param obj pointer to an object + */ +void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/** + * Free resources allocated by `lv_obj_assign_id` + * @param obj pointer to an object + */ +void lv_obj_free_id(lv_obj_t * obj); + +/** + * Format an object's id into a string. + * @param obj pointer to an object + * @param buf buffer to write the string into + * @param len length of the buffer + */ +const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len); + +#if LV_USE_OBJ_ID_BUILTIN +/** + * Free resources used by builtin ID generator. + */ +void lv_objid_builtin_destroy(void); + +#endif + +#endif /*LV_USE_OBJ_ID*/ + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_OBJ +# define LV_ASSERT_OBJ(obj_p, obj_class) \ + do { \ + LV_ASSERT_MSG(obj_p != NULL, "The object is NULL"); \ + LV_ASSERT_MSG(lv_obj_has_class(obj_p, obj_class) == true, "Incompatible object type."); \ + LV_ASSERT_MSG(lv_obj_is_valid(obj_p) == true, "The object is invalid, deleted or corrupted?"); \ + } while(0) +# else +# define LV_ASSERT_OBJ(obj_p, obj_class) do{}while(0) +#endif + +#if LV_USE_LOG && LV_LOG_TRACE_OBJ_CREATE +# define LV_TRACE_OBJ_CREATE(...) LV_LOG_TRACE(__VA_ARGS__) +#else +# define LV_TRACE_OBJ_CREATE(...) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_class.c b/libraries/lvgl/src/core/lv_obj_class.c new file mode 100644 index 0000000..1d7b932 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_class.c @@ -0,0 +1,194 @@ +/** + * @file lv_obj_class.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../themes/lv_theme.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj); +static uint32_t get_instance_size(const lv_obj_class_t * class_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent) +{ + LV_TRACE_OBJ_CREATE("Creating object with %p class on %p parent", (void *)class_p, (void *)parent); + uint32_t s = get_instance_size(class_p); + lv_obj_t * obj = lv_malloc_zeroed(s); + if(obj == NULL) return NULL; + obj->class_p = class_p; + obj->parent = parent; + + /*Create a screen*/ + if(parent == NULL) { + LV_TRACE_OBJ_CREATE("creating a screen"); + lv_display_t * disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("No display created yet. No place to assign the new screen"); + lv_free(obj); + return NULL; + } + + if(disp->screens == NULL) { + disp->screen_cnt = 0; + } + + disp->screen_cnt++; + disp->screens = lv_realloc(disp->screens, sizeof(lv_obj_t *) * disp->screen_cnt); + disp->screens[disp->screen_cnt - 1] = obj; + + /*Set coordinates to full screen size*/ + obj->coords.x1 = 0; + obj->coords.y1 = 0; + obj->coords.x2 = lv_display_get_horizontal_resolution(NULL) - 1; + obj->coords.y2 = lv_display_get_vertical_resolution(NULL) - 1; + } + /*Create a normal object*/ + else { + LV_TRACE_OBJ_CREATE("creating normal object"); + LV_ASSERT_OBJ(parent, MY_CLASS); + if(parent->spec_attr == NULL) { + lv_obj_allocate_spec_attr(parent); + } + + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_realloc(parent->spec_attr->children, + sizeof(lv_obj_t *) * parent->spec_attr->child_cnt); + parent->spec_attr->children[parent->spec_attr->child_cnt - 1] = obj; + } + + return obj; +} + +void lv_obj_class_init_obj(lv_obj_t * obj) +{ + lv_obj_mark_layout_as_dirty(obj); + lv_obj_enable_style_refresh(false); + + lv_theme_apply(obj); + lv_obj_construct(obj->class_p, obj); + + lv_obj_enable_style_refresh(true); + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + + lv_obj_refresh_self_size(obj); + + lv_group_t * def_group = lv_group_get_default(); + if(def_group && lv_obj_is_group_def(obj)) { + lv_group_add_obj(def_group, obj); + } + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + /*Call the ancestor's event handler to the parent to notify it about the new child. + *Also triggers layout update*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj); + + /*Invalidate the area if not screen created*/ + lv_obj_invalidate(obj); + } +} + +void _lv_obj_destruct(lv_obj_t * obj) +{ + if(obj->class_p->destructor_cb) obj->class_p->destructor_cb(obj->class_p, obj); + + if(obj->class_p->base_class) { + /*Don't let the descendant methods run during destructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Call the base class's destructor too*/ + _lv_obj_destruct(obj); + } +} + +bool lv_obj_is_editable(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which editable is set*/ + while(class_p && class_p->editable == LV_OBJ_CLASS_EDITABLE_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->editable == LV_OBJ_CLASS_EDITABLE_TRUE; +} + +bool lv_obj_is_group_def(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which group_def is set*/ + while(class_p && class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_TRUE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + if(obj->class_p->base_class) { + const lv_obj_class_t * original_class_p = obj->class_p; + + /*Don't let the descendant methods run during constructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Construct the base first*/ + lv_obj_construct(class_p, obj); + + /*Restore the original class*/ + obj->class_p = original_class_p; + } + + if(obj->class_p->constructor_cb) obj->class_p->constructor_cb(class_p, obj); +} + +static uint32_t get_instance_size(const lv_obj_class_t * class_p) +{ + /*Find a base in which instance size is set*/ + const lv_obj_class_t * base = class_p; + while(base && base->instance_size == 0) base = base->base_class; + + if(base == NULL) return 0; /*Never happens: set at least in `lv_obj` class*/ + + return base->instance_size; +} diff --git a/libraries/lvgl/src/core/lv_obj_class.h b/libraries/lvgl/src/core/lv_obj_class.h new file mode 100644 index 0000000..7292292 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_class.h @@ -0,0 +1,106 @@ +/** + * @file lv_obj_class.h + * + */ + +#ifndef LV_OBJ_CLASS_H +#define LV_OBJ_CLASS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" +#include "lv_obj_property.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_OBJ_CLASS_EDITABLE_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_EDITABLE_TRUE, + LV_OBJ_CLASS_EDITABLE_FALSE, +} lv_obj_class_editable_t; + +typedef enum { + LV_OBJ_CLASS_GROUP_DEF_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_GROUP_DEF_TRUE, + LV_OBJ_CLASS_GROUP_DEF_FALSE, +} lv_obj_class_group_def_t; + +typedef enum { + LV_OBJ_CLASS_THEME_INHERITABLE_FALSE, /**< Do not inherit theme from base class. */ + LV_OBJ_CLASS_THEME_INHERITABLE_TRUE, +} lv_obj_class_theme_inheritable_t; + +typedef void (*lv_obj_class_event_cb_t)(lv_obj_class_t * class_p, lv_event_t * e); +/** + * Describe the common methods of every object. + * Similar to a C++ class. + */ +struct _lv_obj_class_t { + const lv_obj_class_t * base_class; + /*class_p is the final class while obj->class_p is the class currently being [de]constructed.*/ + void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + + /*class_p is the class in which event is being processed.*/ + void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e); /**< Widget type specific event function*/ + +#if LV_USE_OBJ_PROPERTY + uint32_t prop_index_start; + uint32_t prop_index_end; + const lv_property_ops_t * properties; + uint32_t properties_count; +#endif + + void * user_data; + const char * name; + int32_t width_def; + int32_t height_def; + uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ + uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ + uint32_t instance_size : 16; + uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an object form a class descriptor + * @param class_p pointer to a class + * @param parent pointer to an object where the new object should be created + * @return pointer to the created object + */ +lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent); + +void lv_obj_class_init_obj(lv_obj_t * obj); + +void _lv_obj_destruct(lv_obj_t * obj); + +bool lv_obj_is_editable(lv_obj_t * obj); + +bool lv_obj_is_group_def(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_CLASS_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_draw.c b/libraries/lvgl/src/core/lv_obj_draw.c new file mode 100644 index 0000000..7587e71 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_draw.c @@ -0,0 +1,324 @@ +/** + * @file lv_obj_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_draw.h" +#include "lv_obj.h" +#include "../display/lv_display.h" +#include "../indev/lv_indev.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc) +{ + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(part != LV_PART_MAIN) { + if(opa <= LV_OPA_MIN) { + draw_dsc->bg_opa = LV_OPA_TRANSP; + draw_dsc->bg_image_opa = LV_OPA_TRANSP; + draw_dsc->border_opa = LV_OPA_TRANSP; + draw_dsc->outline_opa = LV_OPA_TRANSP; + draw_dsc->shadow_opa = LV_OPA_TRANSP; + return; + } + } + + draw_dsc->radius = lv_obj_get_style_radius(obj, part); + + if(draw_dsc->bg_opa != LV_OPA_TRANSP) { + draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); + if(draw_dsc->bg_opa > LV_OPA_MIN) { + draw_dsc->bg_color = lv_obj_get_style_bg_color_filtered(obj, part); + const lv_grad_dsc_t * grad = lv_obj_get_style_bg_grad(obj, part); + if(grad && grad->dir != LV_GRAD_DIR_NONE) { + lv_memcpy(&draw_dsc->bg_grad, grad, sizeof(*grad)); + } + else { + draw_dsc->bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, part); + if(draw_dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + draw_dsc->bg_grad.stops[0].color = lv_obj_get_style_bg_color_filtered(obj, part); + draw_dsc->bg_grad.stops[1].color = lv_obj_get_style_bg_grad_color_filtered(obj, part); + draw_dsc->bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, part); + draw_dsc->bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, part); + draw_dsc->bg_grad.stops[0].opa = lv_obj_get_style_bg_main_opa(obj, part); + draw_dsc->bg_grad.stops[1].opa = lv_obj_get_style_bg_grad_opa(obj, part); + } + } + } + } + + if(draw_dsc->border_opa != LV_OPA_TRANSP) { + draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); + if(draw_dsc->border_width) { + draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); + if(draw_dsc->border_opa > LV_OPA_MIN) { + draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); + draw_dsc->border_color = lv_obj_get_style_border_color_filtered(obj, part); + } + } + } + + if(draw_dsc->outline_opa != LV_OPA_TRANSP) { + draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); + if(draw_dsc->outline_width) { + draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(draw_dsc->outline_opa > LV_OPA_MIN) { + draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); + draw_dsc->outline_color = lv_obj_get_style_outline_color_filtered(obj, part); + } + } + } + + if(draw_dsc->bg_image_opa != LV_OPA_TRANSP) { + draw_dsc->bg_image_src = lv_obj_get_style_bg_image_src(obj, part); + if(draw_dsc->bg_image_src) { + draw_dsc->bg_image_opa = lv_obj_get_style_bg_image_opa(obj, part); + if(draw_dsc->bg_image_opa > LV_OPA_MIN) { + if(lv_image_src_get_type(draw_dsc->bg_image_src) == LV_IMAGE_SRC_SYMBOL) { + draw_dsc->bg_image_symbol_font = lv_obj_get_style_text_font(obj, part); + draw_dsc->bg_image_recolor = lv_obj_get_style_text_color_filtered(obj, part); + } + else { + draw_dsc->bg_image_recolor = lv_obj_get_style_bg_image_recolor_filtered(obj, part); + draw_dsc->bg_image_recolor_opa = lv_obj_get_style_bg_image_recolor_opa(obj, part); + draw_dsc->bg_image_tiled = lv_obj_get_style_bg_image_tiled(obj, part); + } + } + } + } + + if(draw_dsc->shadow_opa) { + draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); + if(draw_dsc->shadow_width) { + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, part); + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_offset_x = lv_obj_get_style_shadow_offset_x(obj, part); + draw_dsc->shadow_offset_y = lv_obj_get_style_shadow_offset_y(obj, part); + draw_dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, part); + draw_dsc->shadow_color = lv_obj_get_style_shadow_color_filtered(obj, part); + } + } + } + } + + if(opa < LV_OPA_MAX) { + draw_dsc->bg_opa = LV_OPA_MIX2(draw_dsc->bg_opa, opa); + draw_dsc->bg_image_opa = LV_OPA_MIX2(draw_dsc->bg_image_opa, opa); + draw_dsc->border_opa = LV_OPA_MIX2(draw_dsc->border_opa, opa); + draw_dsc->shadow_opa = LV_OPA_MIX2(draw_dsc->shadow_opa, opa); + draw_dsc->outline_opa = LV_OPA_MIX2(draw_dsc->outline_opa, opa); + } +} + +void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc) +{ + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) return; + + draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part); + draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); + draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part); + draw_dsc->decor = lv_obj_get_style_text_decor(obj, part); + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); + + draw_dsc->font = lv_obj_get_style_text_font(obj, part); + +#if LV_USE_BIDI + draw_dsc->bidi_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); +#endif + + draw_dsc->align = lv_obj_get_style_text_align(obj, part); +} + +void lv_obj_init_draw_image_dsc(lv_obj_t * obj, uint32_t part, lv_draw_image_dsc_t * draw_dsc) +{ + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_image_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) return; + + draw_dsc->rotation = 0; + draw_dsc->scale_x = LV_SCALE_NONE; + draw_dsc->scale_y = LV_SCALE_NONE; + draw_dsc->pivot.x = lv_area_get_width(&obj->coords) / 2; + draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2; + + draw_dsc->recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part); + draw_dsc->recolor = lv_obj_get_style_image_recolor_filtered(obj, part); + + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +} + +void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc) +{ + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) return; + + draw_dsc->width = lv_obj_get_style_line_width(obj, part); + if(draw_dsc->width == 0) return; + + draw_dsc->color = lv_obj_get_style_line_color_filtered(obj, part); + + draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); + if(draw_dsc->dash_width) { + draw_dsc->dash_gap = lv_obj_get_style_line_dash_gap(obj, part); + } + + draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part); + draw_dsc->round_end = draw_dsc->round_start; + + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); +} + +void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc) +{ + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->width = lv_obj_get_style_arc_width(obj, part); + if(draw_dsc->width == 0) return; + + draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) return; + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) return; + + draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part); + draw_dsc->img_src = lv_obj_get_style_arc_image_src(obj, part); + + draw_dsc->rounded = lv_obj_get_style_arc_rounded(obj, part); +} + +int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, uint32_t part) +{ + int32_t s = 0; + + int32_t sh_width = lv_obj_get_style_shadow_width(obj, part); + if(sh_width) { + lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); + if(sh_opa > LV_OPA_MIN) { + sh_width = sh_width / 2 + 1; /*The blur adds only half width*/ + sh_width += lv_obj_get_style_shadow_spread(obj, part); + int32_t sh_ofs_x = lv_obj_get_style_shadow_offset_x(obj, part); + int32_t sh_ofs_y = lv_obj_get_style_shadow_offset_y(obj, part); + sh_width += LV_MAX(LV_ABS(sh_ofs_x), LV_ABS(sh_ofs_y)); + s = LV_MAX(s, sh_width); + } + } + + int32_t outline_width = lv_obj_get_style_outline_width(obj, part); + if(outline_width) { + lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(outline_opa > LV_OPA_MIN) { + int32_t outline_pad = lv_obj_get_style_outline_pad(obj, part); + s = LV_MAX(s, outline_pad + outline_width); + } + } + + int32_t w = lv_obj_get_style_transform_width(obj, part); + int32_t h = lv_obj_get_style_transform_height(obj, part); + int32_t wh = LV_MAX(w, h); + if(wh > 0) s += wh; + + return s; +} + +void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t s_old = _lv_obj_get_ext_draw_size(obj); + int32_t s_new = 0; + lv_obj_send_event(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new); + + /*Store the result if the special attrs already allocated*/ + if(obj->spec_attr) { + obj->spec_attr->ext_draw_size = s_new; + } + /*Allocate spec. attrs. only if the result is not zero. + *Zero is the default value if the spec. attr. are not defined.*/ + else if(s_new != 0) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_draw_size = s_new; + } + + if(s_new != s_old) lv_obj_invalidate(obj); +} + +int32_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->ext_draw_size; + else return 0; +} + +lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj) +{ + + if(obj->spec_attr) return (lv_layer_type_t)obj->spec_attr->layer_type; + else return LV_LAYER_TYPE_NONE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/core/lv_obj_draw.h b/libraries/lvgl/src/core/lv_obj_draw.h new file mode 100644 index 0000000..ad4f087 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_draw.h @@ -0,0 +1,118 @@ +/** + * @file lv_obj_draw.h + * + */ + +#ifndef LV_OBJ_DRAW_H +#define LV_OBJ_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_LAYER_TYPE_NONE, + LV_LAYER_TYPE_SIMPLE, + LV_LAYER_TYPE_TRANSFORM, +} lv_layer_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized. + * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`. + * @note Only the relevant fields will be set. + * E.g. if `border width == 0` the other border properties won't be evaluated. + */ +void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc); + +/** + * Initialize a label draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized. + * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc_t * draw_dsc); + +/** + * Initialize an image draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_image_dsc(lv_obj_t * obj, uint32_t part, lv_draw_image_dsc_t * draw_dsc); + +/** + * Initialize a line draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t * draw_dsc); + +/** + * Initialize an arc draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc); + +/** + * Get the required extra size (around the object's part) to draw shadow, outline, value etc. + * @param obj pointer to an object + * @param part part of the object + * @return the extra size required around the object + */ +int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, uint32_t part); + +/** + * Send a 'LV_EVENT_REFR_EXT_DRAW_SIZE' Call the ancestor's event handler to the object to refresh the value of the extended draw size. + * The result will be saved in `obj`. + * @param obj pointer to an object + */ +void lv_obj_refresh_ext_draw_size(lv_obj_t * obj); + +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +int32_t _lv_obj_get_ext_draw_size(const lv_obj_t * obj); + +lv_layer_type_t _lv_obj_get_layer_type(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_DRAW_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_event.c b/libraries/lvgl/src/core/lv_obj_event.c new file mode 100644 index 0000000..0553f3d --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_event.c @@ -0,0 +1,414 @@ +/** + * @file lv_obj_event.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t event_send_core(lv_event_t * e); +static bool event_is_bubbled(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_EVENT + #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_EVENT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param) +{ + if(obj == NULL) return LV_RESULT_OK; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_event_t e; + e.current_target = obj; + e.original_target = obj; + e.code = event_code; + e.user_data = NULL; + e.param = param; + e.deleted = 0; + e.stop_bubbling = 0; + e.stop_processing = 0; + + _lv_event_push(&e); + + /*Send the event*/ + lv_result_t res = event_send_core(&e); + + /*Remove this element from the list*/ + _lv_event_pop(&e); + + return res; +} + +lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) +{ + const lv_obj_class_t * base; + if(class_p == NULL) base = ((lv_obj_t *)e->current_target)->class_p; + else base = class_p->base_class; + + /*Find a base in which call the ancestor's event handler_cb if set*/ + while(base && base->event_cb == NULL) base = base->base_class; + + if(base == NULL) return LV_RESULT_OK; + if(base->event_cb == NULL) return LV_RESULT_OK; + + /*Call the actual event callback*/ + e->user_data = NULL; + base->event_cb(base, e); + + lv_result_t res = LV_RESULT_OK; + /*Stop if the object is deleted*/ + if(e->deleted) res = LV_RESULT_INVALID; + + return res; +} + +lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_allocate_spec_attr(obj); + + return lv_event_add(&obj->spec_attr->event_list, event_cb, filter, user_data); +} + +uint32_t lv_obj_get_event_count(lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return 0; + return lv_event_get_count(&obj->spec_attr->event_list); +} + +lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return NULL; + return lv_event_get_dsc(&obj->spec_attr->event_list, index); +} + +bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return false; + return lv_event_remove(&obj->spec_attr->event_list, index); +} + +bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) +{ + LV_ASSERT_NULL(obj); + + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t i; + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); + if(dsc->cb == event_cb) { + lv_obj_remove_event(obj, i); + return true; + } + } + + return false; +} + +bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(dsc); + if(obj->spec_attr == NULL) return false; + return lv_event_remove_dsc(&obj->spec_attr->event_list, dsc); +} + +uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(obj); + + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t removed_count = 0; + int32_t i; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); + if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { + lv_obj_remove_event(obj, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e) +{ + return lv_event_get_current_target(e); +} + +lv_obj_t * lv_event_get_target_obj(lv_event_t * e) +{ + return lv_event_get_target(e); +} + +lv_indev_t * lv_event_get_indev(lv_event_t * e) +{ + + if(e->code == LV_EVENT_PRESSED || + e->code == LV_EVENT_PRESSING || + e->code == LV_EVENT_PRESS_LOST || + e->code == LV_EVENT_SHORT_CLICKED || + e->code == LV_EVENT_LONG_PRESSED || + e->code == LV_EVENT_LONG_PRESSED_REPEAT || + e->code == LV_EVENT_CLICKED || + e->code == LV_EVENT_RELEASED || + e->code == LV_EVENT_SCROLL_BEGIN || + e->code == LV_EVENT_SCROLL_END || + e->code == LV_EVENT_SCROLL || + e->code == LV_EVENT_GESTURE || + e->code == LV_EVENT_KEY || + e->code == LV_EVENT_FOCUSED || + e->code == LV_EVENT_DEFOCUSED || + e->code == LV_EVENT_LEAVE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +lv_layer_t * lv_event_get_layer(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_MAIN || + e->code == LV_EVENT_DRAW_MAIN_BEGIN || + e->code == LV_EVENT_DRAW_MAIN_END || + e->code == LV_EVENT_DRAW_POST || + e->code == LV_EVENT_DRAW_POST_BEGIN || + e->code == LV_EVENT_DRAW_POST_END) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +const lv_area_t * lv_event_get_old_size(lv_event_t * e) +{ + if(e->code == LV_EVENT_SIZE_CHANGED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +uint32_t lv_event_get_key(lv_event_t * e) +{ + if(e->code == LV_EVENT_KEY) { + uint32_t * k = lv_event_get_param(e); + if(k) return *k; + else return 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +int32_t lv_event_get_rotary_diff(lv_event_t * e) +{ + if(e->code == LV_EVENT_ROTARY) { + int32_t * r = lv_event_get_param(e); + if(r) return *r; + else return 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e) +{ + if(e->code == LV_EVENT_SCROLL_BEGIN) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size) +{ + if(e->code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t * cur_size = lv_event_get_param(e); + *cur_size = LV_MAX(*cur_size, size); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +lv_point_t * lv_event_get_self_size_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_GET_SELF_SIZE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_HIT_TEST) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +const lv_area_t * lv_event_get_cover_area(lv_event_t * e) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + return p->area; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + if(res > p->res) p->res = res; /*Save only "stronger" results*/ + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_TASK_ADDED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t event_send_core(lv_event_t * e) +{ + LV_TRACE_EVENT("Sending event %d to %p with %p param", e->code, (void *)e->original_target, e->param); + + /*Call the input device's feedback callback if set*/ + lv_indev_t * indev_act = lv_indev_active(); + if(indev_act) { + if(e->stop_processing) return LV_RESULT_OK; + if(e->deleted) return LV_RESULT_INVALID; + } + + lv_obj_t * target = e->current_target; + lv_result_t res = LV_RESULT_OK; + lv_event_list_t * list = target->spec_attr ? &target->spec_attr->event_list : NULL; + + res = lv_event_send(list, e, true); + if(res != LV_RESULT_OK) return res; + + res = lv_obj_event_base(NULL, e); + if(res != LV_RESULT_OK) return res; + + res = lv_event_send(list, e, false); + if(res != LV_RESULT_OK) return res; + + lv_obj_t * parent = lv_obj_get_parent(e->current_target); + if(parent && event_is_bubbled(e)) { + e->current_target = parent; + res = event_send_core(e); + if(res != LV_RESULT_OK) return res; + } + + return res; +} + +static bool event_is_bubbled(lv_event_t * e) +{ + if(e->stop_bubbling) return false; + + /*Event codes that always bubble*/ + switch(e->code) { + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + return true; + default: + break; + } + + /*Check other codes only if bubbling is enabled*/ + if(lv_obj_has_flag(e->current_target, LV_OBJ_FLAG_EVENT_BUBBLE) == false) return false; + + switch(e->code) { + case LV_EVENT_HIT_TEST: + case LV_EVENT_COVER_CHECK: + case LV_EVENT_REFR_EXT_DRAW_SIZE: + case LV_EVENT_DRAW_MAIN_BEGIN: + case LV_EVENT_DRAW_MAIN: + case LV_EVENT_DRAW_MAIN_END: + case LV_EVENT_DRAW_POST_BEGIN: + case LV_EVENT_DRAW_POST: + case LV_EVENT_DRAW_POST_END: + case LV_EVENT_DRAW_TASK_ADDED: + case LV_EVENT_REFRESH: + case LV_EVENT_DELETE: + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + case LV_EVENT_CHILD_CHANGED: + case LV_EVENT_SIZE_CHANGED: + case LV_EVENT_STYLE_CHANGED: + case LV_EVENT_GET_SELF_SIZE: + return false; + default: + return true; + } +} diff --git a/libraries/lvgl/src/core/lv_obj_event.h b/libraries/lvgl/src/core/lv_obj_event.h new file mode 100644 index 0000000..40a002d --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_event.h @@ -0,0 +1,221 @@ +/** + * @file lv_obj_event.h + * + */ + +#ifndef LV_OBJ_EVENT_H +#define LV_OBJ_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../misc/lv_types.h" +#include "../misc/lv_event.h" +#include "../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. + * `res` should be set like this: + * - If already set to `false` an other event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. + * - If already set `true` and `point` shouldn't be clickable set to `false` + * - If already set to `true` you agree that `point` can click the object leave it as `true` + */ +typedef struct { + const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ + bool res; /**< true: `point` can click the object; false: it cannot*/ +} lv_hit_test_info_t; + +/** Cover check results.*/ +typedef enum { + LV_COVER_RES_COVER = 0, + LV_COVER_RES_NOT_COVER = 1, + LV_COVER_RES_MASKED = 2, +} lv_cover_res_t; + +/** + * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. + * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check + * and `lv_event_set_cover_res(e, res)` to set the result. + */ +typedef struct { + lv_cover_res_t res; + const lv_area_t * area; +} lv_cover_check_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Send an event to the object + * @param obj pointer to an object + * @param event_code the type of the event from `lv_event_t` + * @param param arbitrary data depending on the widget type and the event. (Usually `NULL`) + * @return LV_RESULT_OK: `obj` was not deleted in the event; LV_RESULT_INVALID: `obj` was deleted in the event_code + */ +lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param); + +/** + * Used by the widgets internally to call the ancestor widget types's event handler + * @param class_p pointer to the class of the widget (NOT the ancestor class) + * @param e pointer to the event descriptor + * @return LV_RESULT_OK: the target object was not deleted in the event; LV_RESULT_INVALID: it was deleted in the event_code + */ +lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e); + +/** + * Get the current target of the event. It's the object which event handler being called. + * If the event is not bubbled it's the same as "original" target. + * @param e pointer to the event descriptor + * @return the target of the event_code + */ +lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e); + +/** + * Get the object originally targeted by the event. It's the same even if the event is bubbled. + * @param e pointer to the event descriptor + * @return pointer to the original target of the event_code + */ +lv_obj_t * lv_event_get_target_obj(lv_event_t * e); + +/** + * Add an event handler function for an object. + * Used by the user to react on event which happens with the object. + * An object can have multiple event handler. They will be called in the same order as they were added. + * @param obj pointer to an object + * @param filter an event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be used to receive all the events. + * @param event_cb the new event function + * @param user_data custom data data will be available in `event_cb` + * @return handler to the event. It can be used in `lv_obj_remove_event_dsc`. + */ +lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +uint32_t lv_obj_get_event_count(lv_obj_t * obj); + +lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index); + +bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index); + +bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb); + +bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc); + +/** + * Remove an event_cb with user_data + * @param obj pointer to a obj + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data); + +/** + * Get the input device passed as parameter to indev related events. + * @param e pointer to an event + * @return the indev that triggered the event or NULL if called on a not indev related event + */ +lv_indev_t * lv_event_get_indev(lv_event_t * e); + +/** + * Get the draw context which should be the first parameter of the draw functions. + * Namely: `LV_EVENT_DRAW_MAIN/POST`, `LV_EVENT_DRAW_MAIN/POST_BEGIN`, `LV_EVENT_DRAW_MAIN/POST_END` + * @param e pointer to an event + * @return pointer to a draw context or NULL if called on an unrelated event + */ +lv_layer_t * lv_event_get_layer(lv_event_t * e); + +/** + * Get the old area of the object before its size was changed. Can be used in `LV_EVENT_SIZE_CHANGED` + * @param e pointer to an event + * @return the old absolute area of the object or NULL if called on an unrelated event + */ +const lv_area_t * lv_event_get_old_size(lv_event_t * e); + +/** + * Get the key passed as parameter to an event. Can be used in `LV_EVENT_KEY` + * @param e pointer to an event + * @return the triggering key or NULL if called on an unrelated event + */ +uint32_t lv_event_get_key(lv_event_t * e); + +/** + * Get the signed rotary encoder diff. passed as parameter to an event. Can be used in `LV_EVENT_ROTARY` + * @param e pointer to an event + * @return the triggering key or NULL if called on an unrelated event + */ +int32_t lv_event_get_rotary_diff(lv_event_t * e); + +/** + * Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN` + * @param e pointer to an event + * @return the animation that will scroll the object. (can be modified as required) + */ +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e); + +/** + * Set the new extra draw size. Can be used in `LV_EVENT_REFR_EXT_DRAW_SIZE` + * @param e pointer to an event + * @param size The new extra draw size + */ +void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size); + +/** + * Get a pointer to an `lv_point_t` variable in which the self size should be saved (width in `point->x` and height `point->y`). + * Can be used in `LV_EVENT_GET_SELF_SIZE` + * @param e pointer to an event + * @return pointer to `lv_point_t` or NULL if called on an unrelated event + */ +lv_point_t * lv_event_get_self_size_info(lv_event_t * e); + +/** + * Get a pointer to an `lv_hit_test_info_t` variable in which the hit test result should be saved. Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return pointer to `lv_hit_test_info_t` or NULL if called on an unrelated event + */ +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e); + +/** + * Get a pointer to an area which should be examined whether the object fully covers it or not. + * Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return an area with absolute coordinates to check + */ +const lv_area_t * lv_event_get_cover_area(lv_event_t * e); + +/** + * Set the result of cover checking. Can be used in `LV_EVENT_COVER_CHECK` + * @param e pointer to an event + * @param res an element of ::lv_cover_check_info_t + */ +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res); + +/** + * Get the draw task which was just added. + * Can be used in `LV_EVENT_DRAW_TASK_ADDED event` + * @param e pointer to an event + * @return the added draw task + */ +lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_EVENT_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_id_builtin.c b/libraries/lvgl/src/core/lv_obj_id_builtin.c new file mode 100644 index 0000000..4e1976b --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_id_builtin.c @@ -0,0 +1,108 @@ +/** + * @file lv_obj_id.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_global.h" +#include "../osal/lv_os.h" +#include "../stdlib/lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +typedef struct _class_info_t { + const lv_obj_class_t * class_p; + uint32_t obj_count; +} class_info_t; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_USE_OBJ_ID_BUILTIN + +void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_ASSERT(obj && class_p); + + uint32_t i; + uint32_t id = 0; + lv_global_t * global = LV_GLOBAL_DEFAULT(); + class_info_t * info = NULL; + + if(obj == NULL || class_p == NULL) return; + if(global == NULL) return; + + obj->id = NULL; + + for(i = 0; i < global->objid_count; i ++) { + info = ((class_info_t *)global->objid_array) + i; + if(class_p == info->class_p) break; + } + + /*Resize array*/ + if(i == global->objid_count) { + void * array = lv_realloc(global->objid_array, sizeof(class_info_t) * (global->objid_count + 1)); + LV_ASSERT_MALLOC(array); + if(array == NULL) return; + global->objid_array = array; + global->objid_count ++; + info = ((class_info_t *)global->objid_array) + i; + info->obj_count = 0; + info->class_p = class_p; + } + + id = ++info->obj_count; + + obj->id = (void *)(lv_uintptr_t)id; +} + +void lv_obj_free_id(lv_obj_t * obj) +{ + LV_UNUSED(obj); +} + +const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len) +{ + const char * name; + if(obj == NULL || obj->class_p == NULL) return NULL; + if(buf == NULL) return NULL; + + name = obj->class_p->name; + if(name == NULL) name = "nameless"; + + lv_snprintf(buf, len, "%s%" LV_PRId32 "", name, (uint32_t)(lv_uintptr_t)obj->id); + return buf; +} + +void lv_objid_builtin_destroy(void) +{ + lv_global_t * global = LV_GLOBAL_DEFAULT(); + if(global == NULL) return; + + lv_free(global->objid_array); + global->objid_count = 0; +} + +#endif /*LV_USE_OBJ_ID_BUILTIN*/ diff --git a/libraries/lvgl/src/core/lv_obj_pos.c b/libraries/lvgl/src/core/lv_obj_pos.c new file mode 100644 index 0000000..0e8ecaa --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_pos.c @@ -0,0 +1,1163 @@ +/** + * @file lv_obj_pos.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "lv_refr.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define update_layout_mutex LV_GLOBAL_DEFAULT()->layout_update_mutex + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static int32_t calc_content_width(lv_obj_t * obj); +static int32_t calc_content_height(lv_obj_t * obj); +static void layout_update_core(lv_obj_t * obj); +static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_x(obj, x); + lv_obj_set_y(obj, y); +} + +void lv_obj_set_x(lv_obj_t * obj, int32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_result_t res_x; + lv_style_value_t v_x; + + res_x = lv_obj_get_local_style_prop(obj, LV_STYLE_X, &v_x, 0); + + if((res_x == LV_RESULT_OK && v_x.num != x) || res_x == LV_RESULT_INVALID) { + lv_obj_set_style_x(obj, x, 0); + } +} + +void lv_obj_set_y(lv_obj_t * obj, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_result_t res_y; + lv_style_value_t v_y; + + res_y = lv_obj_get_local_style_prop(obj, LV_STYLE_Y, &v_y, 0); + + if((res_y == LV_RESULT_OK && v_y.num != y) || res_y == LV_RESULT_INVALID) { + lv_obj_set_style_y(obj, y, 0); + } +} + +bool lv_obj_refr_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*If the width or height is set by a layout do not modify them*/ + if(obj->w_layout && obj->h_layout) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + bool w_is_content = false; + bool w_is_pct = false; + + int32_t w; + if(obj->w_layout) { + w = lv_obj_get_width(obj); + } + else { + w = lv_obj_get_style_width(obj, LV_PART_MAIN); + w_is_content = w == LV_SIZE_CONTENT; + w_is_pct = LV_COORD_IS_PCT(w); + int32_t parent_w = lv_obj_get_content_width(parent); + + if(w_is_content) { + w = calc_content_width(obj); + } + else if(w_is_pct) { + /*If parent has content size and the child has pct size + *a circular dependency will occur. To solve it keep child size at zero */ + if(parent->w_layout == 0 && lv_obj_get_style_width(parent, 0) == LV_SIZE_CONTENT) { + w = lv_obj_get_style_space_left(obj, 0) + lv_obj_get_style_space_right(obj, 0); + } + else { + w = (LV_COORD_GET_PCT(w) * parent_w) / 100; + w -= lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); + } + } + + int32_t minw = lv_obj_get_style_min_width(obj, LV_PART_MAIN); + int32_t maxw = lv_obj_get_style_max_width(obj, LV_PART_MAIN); + w = lv_clamp_width(w, minw, maxw, parent_w); + } + + int32_t h; + bool h_is_content = false; + bool h_is_pct = false; + if(obj->h_layout) { + h = lv_obj_get_height(obj); + } + else { + h = lv_obj_get_style_height(obj, LV_PART_MAIN); + h_is_content = h == LV_SIZE_CONTENT; + h_is_pct = LV_COORD_IS_PCT(h); + int32_t parent_h = lv_obj_get_content_height(parent); + + if(h_is_content) { + h = calc_content_height(obj); + } + else if(h_is_pct) { + /*If parent has content size and the child has pct size + *a circular dependency will occur. To solve it keep child size at zero */ + if(parent->h_layout == 0 && lv_obj_get_style_height(parent, 0) == LV_SIZE_CONTENT) { + h = lv_obj_get_style_space_top(obj, 0) + lv_obj_get_style_space_bottom(obj, 0); + } + else { + h = (LV_COORD_GET_PCT(h) * parent_h) / 100; + h -= lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); + } + } + + int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_MAIN); + int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_MAIN); + h = lv_clamp_height(h, minh, maxh, parent_h); + } + + /*Do nothing if the size is not changed*/ + /*It is very important else recursive resizing can occur without size change*/ + if(lv_obj_get_width(obj) == w && lv_obj_get_height(obj) == h) return false; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + bool on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) lv_obj_scrollbar_invalidate(parent); + + /*Set the length and height + *Be sure the content is not scrolled in an invalid position on the new size*/ + obj->coords.y2 = obj->coords.y1 + h - 1; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + obj->coords.x1 = obj->coords.x2 - w + 1; + } + else { + obj->coords.x2 = obj->coords.x1 + w - 1; + } + + /*Call the ancestor's event handler to the object with its new coordinates*/ + lv_obj_send_event(obj, LV_EVENT_SIZE_CHANGED, &ori); + + /*Call the ancestor's event handler to the parent too*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + obj->readjust_scroll_after_layout = 1; + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ + bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); + + lv_obj_refresh_ext_draw_size(obj); + + return true; +} + +void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_width(obj, w); + lv_obj_set_height(obj, h); +} + +void lv_obj_set_width(lv_obj_t * obj, int32_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_result_t res_w; + lv_style_value_t v_w; + + res_w = lv_obj_get_local_style_prop(obj, LV_STYLE_WIDTH, &v_w, 0); + + if((res_w == LV_RESULT_OK && v_w.num != w) || res_w == LV_RESULT_INVALID) { + lv_obj_set_style_width(obj, w, 0); + } +} + +void lv_obj_set_height(lv_obj_t * obj, int32_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_result_t res_h; + lv_style_value_t v_h; + + res_h = lv_obj_get_local_style_prop(obj, LV_STYLE_HEIGHT, &v_h, 0); + + if((res_h == LV_RESULT_OK && v_h.num != h) || res_h == LV_RESULT_INVALID) { + lv_obj_set_style_height(obj, h, 0); + } +} + +void lv_obj_set_content_width(lv_obj_t * obj, int32_t w) +{ + int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + lv_obj_set_width(obj, w + left + right); +} + +void lv_obj_set_content_height(lv_obj_t * obj, int32_t h) +{ + int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + lv_obj_set_height(obj, h + top + bottom); +} + +void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_style_layout(obj, layout, 0); + + lv_obj_mark_layout_as_dirty(obj); +} + +bool lv_obj_is_layout_positioned(const lv_obj_t * obj) +{ + if(lv_obj_has_flag_any(obj, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING)) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + uint32_t layout = lv_obj_get_style_layout(parent, LV_PART_MAIN); + if(layout) return true; + else return false; +} + +void lv_obj_mark_layout_as_dirty(lv_obj_t * obj) +{ + obj->layout_inv = 1; + + /*Mark the screen as dirty too to mark that there is something to do on this screen*/ + lv_obj_t * scr = lv_obj_get_screen(obj); + scr->scr_layout_inv = 1; + + /*Make the display refreshing*/ + lv_display_t * disp = lv_obj_get_display(scr); + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); +} + +void lv_obj_update_layout(const lv_obj_t * obj) +{ + if(update_layout_mutex) { + LV_LOG_TRACE("Already running, returning"); + return; + } + LV_PROFILER_BEGIN; + update_layout_mutex = true; + + lv_obj_t * scr = lv_obj_get_screen(obj); + /*Repeat until there are no more layout invalidations*/ + while(scr->scr_layout_inv) { + LV_LOG_TRACE("Layout update begin"); + scr->scr_layout_inv = 0; + layout_update_core(scr); + LV_LOG_TRACE("Layout update end"); + } + + update_layout_mutex = false; + LV_PROFILER_END; +} + +void lv_obj_set_align(lv_obj_t * obj, lv_align_t align) +{ + lv_obj_set_style_align(obj, align, 0); +} + +void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs) +{ + lv_obj_set_style_align(obj, align, 0); + lv_obj_set_pos(obj, x_ofs, y_ofs); +} + +void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, int32_t y_ofs) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_update_layout(obj); + if(base == NULL) base = lv_obj_get_parent(obj); + + LV_ASSERT_OBJ(base, MY_CLASS); + + int32_t x = 0; + int32_t y = 0; + + lv_obj_t * parent = lv_obj_get_parent(obj); + + LV_ASSERT_OBJ(parent, MY_CLASS); + + int32_t pleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); + int32_t ptop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); + + int32_t bleft = lv_obj_get_style_space_left(base, LV_PART_MAIN); + int32_t btop = lv_obj_get_style_space_top(base, LV_PART_MAIN); + + if(align == LV_ALIGN_DEFAULT) { + if(lv_obj_get_style_base_dir(base, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; + else align = LV_ALIGN_TOP_LEFT; + } + + switch(align) { + case LV_ALIGN_CENTER: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_TOP_LEFT: + x = bleft; + y = btop; + break; + + case LV_ALIGN_TOP_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = btop; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = btop; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_LEFT_MID: + x = bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_obj_get_width(obj); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_obj_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + } + + if(LV_COORD_IS_PCT(x_ofs)) x_ofs = (lv_obj_get_width(base) * LV_COORD_GET_PCT(x_ofs)) / 100; + if(LV_COORD_IS_PCT(y_ofs)) y_ofs = (lv_obj_get_height(base) * LV_COORD_GET_PCT(y_ofs)) / 100; + if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_right(parent) - pleft; + } + else { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_left(parent) - pleft; + } + y += y_ofs + base->coords.y1 - parent->coords.y1 + lv_obj_get_scroll_top(parent) - ptop; + lv_obj_set_style_align(obj, LV_ALIGN_TOP_LEFT, 0); + lv_obj_set_pos(obj, x, y); + +} + +void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_copy(coords, &obj->coords); +} + +int32_t lv_obj_get_x(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t rel_x; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_x = obj->coords.x1 - parent->coords.x1; + rel_x += lv_obj_get_scroll_x(parent); + rel_x -= lv_obj_get_style_space_left(parent, LV_PART_MAIN); + } + else { + rel_x = obj->coords.x1; + } + return rel_x; +} + +int32_t lv_obj_get_x2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_x(obj) + lv_obj_get_width(obj); +} + +int32_t lv_obj_get_y(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t rel_y; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_y = obj->coords.y1 - parent->coords.y1; + rel_y += lv_obj_get_scroll_y(parent); + rel_y -= lv_obj_get_style_space_top(parent, LV_PART_MAIN); + } + else { + rel_y = obj->coords.y1; + } + return rel_y; +} + +int32_t lv_obj_get_y2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_y(obj) + lv_obj_get_height(obj); +} + +int32_t lv_obj_get_x_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_x(obj, LV_PART_MAIN); +} + +int32_t lv_obj_get_y_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_y(obj, LV_PART_MAIN); +} + +int32_t lv_obj_get_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_width(&obj->coords); +} + +int32_t lv_obj_get_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_height(&obj->coords); +} + +int32_t lv_obj_get_content_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + + return lv_obj_get_width(obj) - left - right; +} + +int32_t lv_obj_get_content_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + return lv_obj_get_height(obj) - top - bottom; +} + +void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_get_coords(obj, area); + area->x1 += lv_obj_get_style_space_left(obj, LV_PART_MAIN); + area->x2 -= lv_obj_get_style_space_right(obj, LV_PART_MAIN); + area->y1 += lv_obj_get_style_space_top(obj, LV_PART_MAIN); + area->y2 -= lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + +} + +int32_t lv_obj_get_self_width(const lv_obj_t * obj) +{ + lv_point_t p = {0, LV_COORD_MIN}; + lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.x; +} + +int32_t lv_obj_get_self_height(const lv_obj_t * obj) +{ + lv_point_t p = {LV_COORD_MIN, 0}; + lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.y; +} + +bool lv_obj_refresh_self_size(lv_obj_t * obj) +{ + int32_t w_set = lv_obj_get_style_width(obj, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(obj, LV_PART_MAIN); + if(w_set != LV_SIZE_CONTENT && h_set != LV_SIZE_CONTENT) return false; + + lv_obj_mark_layout_as_dirty(obj); + return true; +} + +void lv_obj_refr_pos(lv_obj_t * obj) +{ + if(lv_obj_is_layout_positioned(obj)) return; + + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t x = lv_obj_get_style_x(obj, LV_PART_MAIN); + int32_t y = lv_obj_get_style_y(obj, LV_PART_MAIN); + + if(parent == NULL) { + lv_obj_move_to(obj, x, y); + return; + } + + /*Handle percentage value*/ + int32_t pw = lv_obj_get_content_width(parent); + int32_t ph = lv_obj_get_content_height(parent); + if(LV_COORD_IS_PCT(x)) x = (pw * LV_COORD_GET_PCT(x)) / 100; + if(LV_COORD_IS_PCT(y)) y = (ph * LV_COORD_GET_PCT(y)) / 100; + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(obj, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + /*Use the translation*/ + x += tr_x; + y += tr_y; + + lv_align_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + + if(align == LV_ALIGN_DEFAULT) { + if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; + else align = LV_ALIGN_TOP_LEFT; + } + + switch(align) { + case LV_ALIGN_TOP_LEFT: + break; + case LV_ALIGN_TOP_MID: + x += pw / 2 - w / 2; + break; + case LV_ALIGN_TOP_RIGHT: + x += pw - w; + break; + case LV_ALIGN_LEFT_MID: + y += ph / 2 - h / 2; + break; + case LV_ALIGN_BOTTOM_LEFT: + y += ph - h; + break; + case LV_ALIGN_BOTTOM_MID: + x += pw / 2 - w / 2; + y += ph - h; + break; + case LV_ALIGN_BOTTOM_RIGHT: + x += pw - w; + y += ph - h; + break; + case LV_ALIGN_RIGHT_MID: + x += pw - w; + y += ph / 2 - h / 2; + break; + case LV_ALIGN_CENTER: + x += pw / 2 - w / 2; + y += ph / 2 - h / 2; + break; + default: + break; + } + + lv_obj_move_to(obj, x, y); +} + +void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y) +{ + /*Convert x and y to absolute coordinates*/ + lv_obj_t * parent = obj->parent; + + if(parent) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_FLOATING)) { + x += parent->coords.x1; + y += parent->coords.y1; + } + else { + x += parent->coords.x1 - lv_obj_get_scroll_x(parent); + y += parent->coords.y1 - lv_obj_get_scroll_y(parent); + } + + x += lv_obj_get_style_space_left(parent, LV_PART_MAIN); + y += lv_obj_get_style_space_top(parent, LV_PART_MAIN); + } + + /*Calculate and set the movement*/ + lv_point_t diff; + diff.x = x - obj->coords.x1; + diff.y = y - obj->coords.y1; + + /*Do nothing if the position is not changed*/ + /*It is very important else recursive positioning can + *occur without position change*/ + if(diff.x == 0 && diff.y == 0) return; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + bool on1 = false; + if(parent) { + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + on1 = _lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) lv_obj_scrollbar_invalidate(parent); + } + + obj->coords.x1 += diff.x; + obj->coords.y1 += diff.y; + obj->coords.x2 += diff.x; + obj->coords.y2 += diff.y; + + lv_obj_move_children_by(obj, diff.x, diff.y, false); + + /*Call the ancestor's event handler to the parent too*/ + if(parent) lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ + if(parent) { + bool on2 = _lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); + } +} + +void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(ignore_floating && lv_obj_has_flag(child, LV_OBJ_FLAG_FLOATING)) continue; + child->coords.x1 += x_diff; + child->coords.y1 += y_diff; + child->coords.x2 += x_diff; + child->coords.y2 += y_diff; + + lv_obj_move_children_by(child, x_diff, y_diff, false); + } +} + +void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags) +{ + lv_obj_transform_point_array(obj, p, 1, flags); +} + +void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, + lv_obj_point_transform_flag_t flags) +{ + if(obj) { + lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM; + bool recursive = flags & LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE; + bool inverse = flags & LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE; + if(inverse) { + if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); + if(do_tranf) transform_point_array(obj, points, count, inverse); + } + else { + if(do_tranf) transform_point_array(obj, points, count, inverse); + if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); + } + } +} + +void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags) +{ + lv_point_t p[4] = { + {area->x1, area->y1}, + {area->x1, area->y2 + 1}, + {area->x2 + 1, area->y1}, + {area->x2 + 1, area->y2 + 1}, + }; + + lv_obj_transform_point_array(obj, p, 4, flags); + + area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); + area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x); + area->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); + area->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y); +} + +void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_display_t * disp = lv_obj_get_display(obj); + if(!lv_display_is_invalidation_enabled(disp)) return; + + lv_area_t area_tmp; + lv_area_copy(&area_tmp, area); + + if(!lv_obj_area_is_visible(obj, &area_tmp)) return; + if(obj->spec_attr && obj->spec_attr->layer_type == LV_LAYER_TYPE_TRANSFORM) { + /*Make the area slightly larger to avoid rounding errors. + *5 is an empirical value*/ + lv_area_increase(&area_tmp, 5, 5); + } + + _lv_inv_area(lv_obj_get_display(obj), &area_tmp); +} + +void lv_obj_invalidate(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + lv_obj_invalidate_area(obj, &obj_coords); +} + +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Invalidate the object only if it belongs to the current or previous or one of the layers'*/ + lv_obj_t * obj_scr = lv_obj_get_screen(obj); + lv_display_t * disp = lv_obj_get_display(obj_scr); + if(obj_scr != lv_display_get_screen_active(disp) && + obj_scr != lv_display_get_screen_prev(disp) && + obj_scr != lv_display_get_layer_bottom(disp) && + obj_scr != lv_display_get_layer_top(disp) && + obj_scr != lv_display_get_layer_sys(disp)) { + return false; + } + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + lv_area_increase(&obj_coords, ext_size, ext_size); + + /*The area is not on the object*/ + if(!_lv_area_intersect(area, area, &obj_coords)) return false; + + lv_obj_get_transformed_area(obj, area, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + + /*Truncate recursively to the parents*/ + lv_obj_t * parent = lv_obj_get_parent(obj); + while(parent != NULL) { + /*If the parent is hidden then the child is hidden and won't be drawn*/ + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Truncate to the parent and if no common parts break*/ + lv_area_t parent_coords = parent->coords; + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + int32_t parent_ext_size = _lv_obj_get_ext_draw_size(parent); + lv_area_increase(&parent_coords, parent_ext_size, parent_ext_size); + } + + lv_obj_get_transformed_area(parent, &parent_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + if(!_lv_area_intersect(area, area, &parent_coords)) return false; + + parent = lv_obj_get_parent(parent); + } + + return true; +} + +bool lv_obj_is_visible(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_t obj_coords; + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + return lv_obj_area_is_visible(obj, &obj_coords); +} + +void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_click_pad = size; +} + +void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area) +{ + lv_area_copy(area, &obj->coords); + if(obj->spec_attr) { + lv_area_increase(area, obj->spec_attr->ext_click_pad, obj->spec_attr->ext_click_pad); + } +} + +bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point) +{ + if(!lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE)) return false; + + lv_area_t a; + lv_obj_get_click_area(obj, &a); + bool res = _lv_area_is_point_on(&a, point, 0); + if(res == false) return false; + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + lv_hit_test_info_t hit_info; + hit_info.point = point; + hit_info.res = true; + lv_obj_send_event(obj, LV_EVENT_HIT_TEST, &hit_info); + return hit_info.res; + } + + return res; +} + +int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width) +{ + if(LV_COORD_IS_PCT(min_width)) min_width = (ref_width * LV_COORD_GET_PCT(min_width)) / 100; + if(LV_COORD_IS_PCT(max_width)) max_width = (ref_width * LV_COORD_GET_PCT(max_width)) / 100; + return LV_CLAMP(min_width, width, max_width); +} + +int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height) +{ + if(LV_COORD_IS_PCT(min_height)) min_height = (ref_height * LV_COORD_GET_PCT(min_height)) / 100; + if(LV_COORD_IS_PCT(max_height)) max_height = (ref_height * LV_COORD_GET_PCT(max_height)) / 100; + return LV_CLAMP(min_height, height, max_height); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t calc_content_width(lv_obj_t * obj) +{ + int32_t scroll_x_tmp = lv_obj_get_scroll_x(obj); + if(obj->spec_attr) obj->spec_attr->scroll.x = 0; + + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + int32_t self_w; + self_w = lv_obj_get_self_width(obj) + space_left + space_right; + + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + /*With RTL find the left most coordinate*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_BOTTOM_RIGHT: + case LV_ALIGN_RIGHT_MID: + /*Normal right aligns. Other are ignored due to possible circular dependencies*/ + child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_x(child, 0) == 0) { + child_res_tmp = lv_area_get_width(&child->coords) + space_right; + child_res_tmp += lv_obj_get_style_margin_left(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; + } + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_left(child, LV_PART_MAIN)); + } + if(child_res != LV_COORD_MIN) { + child_res += space_left; + } + } + /*Else find the right most coordinate*/ + else { + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_LEFT: + case LV_ALIGN_BOTTOM_LEFT: + case LV_ALIGN_LEFT_MID: + /*Normal left aligns.*/ + child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_y(child, 0) == 0) { + child_res_tmp = lv_area_get_width(&child->coords) + space_left; + child_res_tmp += lv_obj_get_style_margin_right(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; + } + + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_right(child, LV_PART_MAIN)); + } + + if(child_res != LV_COORD_MIN) { + child_res += space_right; + } + } + + if(obj->spec_attr) obj->spec_attr->scroll.x = -scroll_x_tmp; + + if(child_res == LV_COORD_MIN) return self_w; + return LV_MAX(child_res, self_w); +} + +static int32_t calc_content_height(lv_obj_t * obj) +{ + int32_t scroll_y_tmp = lv_obj_get_scroll_y(obj); + if(obj->spec_attr) obj->spec_attr->scroll.y = 0; + + int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + int32_t self_h; + self_h = lv_obj_get_self_height(obj) + space_top + space_bottom; + + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, 0); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_TOP_MID: + case LV_ALIGN_TOP_LEFT: + /*Normal top aligns. */ + child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; + break; + default: + /* Consider other cases only if y=0 and use the height of the object. + * With y!=0 circular dependency could occur. */ + if(lv_obj_get_style_y(child, 0) == 0) { + child_res_tmp = lv_area_get_height(&child->coords) + space_top; + child_res_tmp += lv_obj_get_style_margin_top(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; + } + + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN)); + } + + if(obj->spec_attr) obj->spec_attr->scroll.y = -scroll_y_tmp; + + if(child_res == LV_COORD_MIN) return self_h; + return LV_MAX(self_h, child_res + space_bottom); +} + +static void layout_update_core(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + layout_update_core(child); + } + + if(obj->layout_inv) { + obj->layout_inv = 0; + lv_obj_refr_size(obj); + lv_obj_refr_pos(obj); + + if(child_cnt > 0) { + _lv_layout_apply(obj); + } + } + + if(obj->readjust_scroll_after_layout) { + obj->readjust_scroll_after_layout = 0; + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + } +} + +static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv) +{ + int32_t angle = lv_obj_get_style_transform_rotation(obj, 0); + int32_t scale_x = lv_obj_get_style_transform_scale_x_safe(obj, 0); + int32_t scale_y = lv_obj_get_style_transform_scale_y_safe(obj, 0); + if(scale_x == 0) scale_x = 1; + if(scale_y == 0) scale_y = 1; + + if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) return; + + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, 0), + .y = lv_obj_get_style_transform_pivot_y(obj, 0) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + pivot.x = obj->coords.x1 + pivot.x; + pivot.y = obj->coords.y1 + pivot.y; + + if(inv) { + angle = -angle; + scale_x = (256 * 256 + scale_x - 1) / scale_x; + scale_y = (256 * 256 + scale_y - 1) / scale_y; + } + + lv_point_array_transform(p, p_count, angle, scale_x, scale_y, &pivot, !inv); +} diff --git a/libraries/lvgl/src/core/lv_obj_pos.h b/libraries/lvgl/src/core/lv_obj_pos.h new file mode 100644 index 0000000..eafc6f1 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_pos.h @@ -0,0 +1,454 @@ +/** + * @file lv_obj_pos.h + * + */ + +#ifndef LV_OBJ_POS_H +#define LV_OBJ_POS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + /** No flags */ + LV_OBJ_POINT_TRANSFORM_FLAG_NONE = 0x00, + + /** Consider the transformation properties of the parents too */ + LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE = 0x01, + + /** Execute the inverse of the transformation (-angle and 1/zoom) */ + LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE = 0x02, + + /** Both inverse and recursive*/ + LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE = 0x03, +} lv_obj_point_transform_flag_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the position of an object relative to the set alignment. + * @param obj pointer to an object + * @param x new x coordinate + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Set the x coordinate of an object + * @param obj pointer to an object + * @param x new x coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_x(lv_obj_t * obj, int32_t x); + +/** + * Set the y coordinate of an object + * @param obj pointer to an object + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_y(lv_obj_t * obj, int32_t y); + +/** + * Set the size of an object. + * @param obj pointer to an object + * @param w the new width + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h); + +/** + * Recalculate the size of the object + * @param obj pointer to an object + * @return true: the size has been changed + */ +bool lv_obj_refr_size(lv_obj_t * obj); + +/** + * Set the width of an object + * @param obj pointer to an object + * @param w the new width + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_width(lv_obj_t * obj, int32_t w); + +/** + * Set the height of an object + * @param obj pointer to an object + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_height(lv_obj_t * obj, int32_t h); + +/** + * Set the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @param w the width without paddings in pixels + */ +void lv_obj_set_content_width(lv_obj_t * obj, int32_t w); + +/** + * Set the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @param h the height without paddings in pixels + */ +void lv_obj_set_content_height(lv_obj_t * obj, int32_t h); + +/** + * Set a layout for an object + * @param obj pointer to an object + * @param layout pointer to a layout descriptor to set + */ +void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout); + +/** + * Test whether the and object is positioned by a layout or not + * @param obj pointer to an object to test + * @return true: positioned by a layout; false: not positioned by a layout + */ +bool lv_obj_is_layout_positioned(const lv_obj_t * obj); + +/** + * Mark the object for layout update. + * @param obj pointer to an object whose children needs to be updated + */ +void lv_obj_mark_layout_as_dirty(lv_obj_t * obj); + +/** + * Update the layout of an object. + * @param obj pointer to an object whose children needs to be updated + */ +void lv_obj_update_layout(const lv_obj_t * obj); + +/** + * Change the alignment of an object. + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + */ +void lv_obj_set_align(lv_obj_t * obj, lv_align_t align); + +/** + * Change the alignment of an object and set new coordinates. + * Equivalent to: + * lv_obj_set_align(obj, align); + * lv_obj_set_pos(obj, x_ofs, y_ofs); + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + */ +void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs); + +/** + * Align an object to an other object. + * @param obj pointer to an object to align + * @param base pointer to an other object (if NULL `obj`s parent is used). 'obj' will be aligned to it. + * @param align type of alignment (see 'lv_align_t' enum) + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + * @note if the position or size of `base` changes `obj` needs to be aligned manually again + */ +void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, + int32_t y_ofs); + +/** + * Align an object to the center on its parent. + * @param obj pointer to an object to align + * @note if the parent size changes `obj` needs to be aligned manually again + */ +static inline void lv_obj_center(lv_obj_t * obj) +{ + lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); +} + +/** + * Copy the coordinates of an object to an area + * @param obj pointer to an object + * @param coords pointer to an area to store the coordinates + */ +void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords); + +/** + * Get the x coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the left side of its parent plus the parent's left padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the left padding of the parent, and not on the left edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_x(const lv_obj_t * obj); + +/** + * Get the x2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the right side of its parent plus the parent's right padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the right padding of the parent, and not on the right edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_x2(const lv_obj_t * obj); + +/** + * Get the y coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the top side of its parent plus the parent's top padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the top padding of the parent, and not on the top edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_y(const lv_obj_t * obj); + +/** + * Get the y2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the bottom side of its parent plus the parent's bottom padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the bottom padding of the parent, and not on the bottom edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_y2(const lv_obj_t * obj); + +/** + * Get the actually set x coordinate of object, i.e. the offset form the set alignment + * @param obj pointer to an object + * @return the set x coordinate + */ +int32_t lv_obj_get_x_aligned(const lv_obj_t * obj); + +/** + * Get the actually set y coordinate of object, i.e. the offset form the set alignment + * @param obj pointer to an object + * @return the set y coordinate + */ +int32_t lv_obj_get_y_aligned(const lv_obj_t * obj); + +/** + * Get the width of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width in pixels + */ +int32_t lv_obj_get_width(const lv_obj_t * obj); + +/** + * Get the height of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height in pixels + */ +int32_t lv_obj_get_height(const lv_obj_t * obj); + +/** + * Get the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width which still fits into its parent without causing overflow (making the parent scrollable) + */ +int32_t lv_obj_get_content_width(const lv_obj_t * obj); + +/** + * Get the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height which still fits into the parent without causing overflow (making the parent scrollable) + */ +int32_t lv_obj_get_content_height(const lv_obj_t * obj); + +/** + * Get the area reduced by the paddings and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @param area the area which still fits into the parent without causing overflow (making the parent scrollable) + */ +void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area); + +/** + * Get the width occupied by the "parts" of the widget. E.g. the width of all columns of a table. + * @param obj pointer to an objects + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +int32_t lv_obj_get_self_width(const lv_obj_t * obj); + +/** + * Get the height occupied by the "parts" of the widget. E.g. the height of all rows of a table. + * @param obj pointer to an objects + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +int32_t lv_obj_get_self_height(const lv_obj_t * obj); + +/** + * Handle if the size of the internal ("virtual") content of an object has changed. + * @param obj pointer to an object + * @return false: nothing happened; true: refresh happened + */ +bool lv_obj_refresh_self_size(lv_obj_t * obj); + +void lv_obj_refr_pos(lv_obj_t * obj); + +void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y); + +void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating); + +/** + * Transform a point using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param p a point to transform, the result will be written back here too + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags); + +/** + * Transform an array of points using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param points the array of points to transform, the result will be written back here too + * @param count number of points in the array + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, + lv_obj_point_transform_flag_t flags); + +/** + * Transform an area using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param area an area to transform, the result will be written back here too + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags); + +/** + * Mark an area of an object as invalid. + * The area will be truncated to the object's area and marked for redraw. + * @param obj pointer to an object + * @param area the area to redraw + */ +void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area); + +/** + * Mark the object as invalid to redrawn its area + * @param obj pointer to an object + */ +void lv_obj_invalidate(const lv_obj_t * obj); + +/** + * Tell whether an area of an object is visible (even partially) now or not + * @param obj pointer to an object + * @param area the are to check. The visible part of the area will be written back here. + * @return true visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area); + +/** + * Tell whether an object is visible (even partially) now or not + * @param obj pointer to an object + * @return true: visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_is_visible(const lv_obj_t * obj); + +/** + * Set the size of an extended clickable area + * @param obj pointer to an object + * @param size extended clickable area in all 4 directions [px] + */ +void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size); + +/** + * Get the an area where to object can be clicked. + * It's the object's normal area plus the extended click area. + * @param obj pointer to an object + * @param area store the result area here + */ +void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area); + +/** + * Hit-test an object given a particular point in screen space. + * @param obj object to hit-test + * @param point screen-space point (absolute coordinate) + * @return true: if the object is considered under the point + */ +bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point); + +/** + * Clamp a width between min and max width. If the min/max width is in percentage value use the ref_width + * @param width width to clamp + * @param min_width the minimal width + * @param max_width the maximal width + * @param ref_width the reference width used when min/max width is in percentage + * @return the clamped width + */ +int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width); + +/** + * Clamp a height between min and max height. If the min/max height is in percentage value use the ref_height + * @param height height to clamp + * @param min_height the minimal height + * @param max_height the maximal height + * @param ref_height the reference height used when min/max height is in percentage + * @return the clamped height + */ +int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_POS_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_property.c b/libraries/lvgl/src/core/lv_obj_property.c new file mode 100644 index 0000000..20a2d25 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_property.c @@ -0,0 +1,179 @@ +/** + * @file lv_obj_id.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "../stdlib/lv_string.h" +#include "lv_obj_property.h" + +#if LV_USE_OBJ_PROPERTY + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_property_set_int_t)(lv_obj_t *, int32_t); +typedef void (*lv_property_set_pointer_t)(lv_obj_t *, const void *); +typedef void (*lv_property_set_color_t)(lv_obj_t *, lv_color_t); +typedef lv_result_t (*lv_property_setter_t)(lv_obj_t *, lv_prop_id_t, const lv_property_t *); + +typedef int32_t (*lv_property_get_int_t)(const lv_obj_t *); +typedef void * (*lv_property_get_pointer_t)(const lv_obj_t *); +typedef lv_color_t (*lv_property_get_color_t)(const lv_obj_t *); +typedef lv_result_t (*lv_property_getter_t)(const lv_obj_t *, lv_prop_id_t, lv_property_t *); + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value) +{ + LV_ASSERT(obj && value); + + if(value->id == LV_PROPERTY_ID_INVALID) { + LV_LOG_WARN("invalid property id set to %p\n", obj); + return LV_RESULT_INVALID; + } + + if(value->id < LV_PROPERTY_ID_START) { + lv_obj_set_local_style_prop(obj, value->id, value->_style, 0); + return LV_RESULT_OK; + } + + return obj_property(obj, value->id, (lv_property_t *)value, true); +} + +lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count) +{ + for(uint32_t i = 0; i < count; i++) { + lv_result_t result = lv_obj_set_property(obj, &value[i]); + if(result != LV_RESULT_OK) { + return result; + } + } + + return LV_RESULT_OK; +} + +lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id) +{ + lv_result_t result; + lv_property_t value; + + if(id == LV_PROPERTY_ID_INVALID) { + LV_LOG_WARN("invalid property id to get from %p\n", obj); + value.id = 0; + value.num = 0; + return value; + } + + if(id < LV_PROPERTY_ID_START) { + lv_obj_get_local_style_prop(obj, id, &value._style, 0); + value.id = id; + return value; + } + + result = obj_property(obj, id, &value, false); + if(result != LV_RESULT_OK) + value.id = 0; + + return value; +} + +static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set) +{ + const lv_property_ops_t * properties; + const lv_property_ops_t * prop; + + const lv_obj_class_t * clz; + uint32_t index = LV_PROPERTY_ID_INDEX(id); + + for(clz = obj->class_p ; clz; clz = clz->base_class) { + properties = clz->properties; + if(properties == NULL) { + /* try base class*/ + continue; + } + + if(id != LV_PROPERTY_ID_ANY && (index < clz->prop_index_start || index > clz->prop_index_end)) { + /* try base class*/ + continue; + } + + /*Check if there's setter available for this class*/ + for(uint32_t i = 0; i < clz->properties_count; i++) { + prop = &properties[i]; + + /*pass id and value directly to widget's property method*/ + if(prop->id == LV_PROPERTY_ID_ANY) { + value->id = prop->id; + if(set) return ((lv_property_setter_t)prop->setter)(obj, id, value); + else return ((lv_property_getter_t)prop->getter)(obj, id, value); + } + + /*Not this id, check next*/ + if(prop->id != id) + continue; + + /*id matched but we got null pointer to functions*/ + if(set ? prop->setter == NULL : prop->getter == NULL) { + LV_LOG_WARN("null %s provided, id: %d\n", set ? "setter" : "getter", id); + return LV_RESULT_INVALID; + } + + /*Update value id if it's a read*/ + if(!set) value->id = prop->id; + + switch(LV_PROPERTY_ID_TYPE(prop->id)) { + case LV_PROPERTY_TYPE_INT: + if(set)((lv_property_set_int_t)(prop->setter))(obj, value->num); + else value->num = ((lv_property_get_int_t)(prop->getter))(obj); + break; + case LV_PROPERTY_TYPE_POINTER: + case LV_PROPERTY_TYPE_IMGSRC: + if(set)((lv_property_set_pointer_t)(prop->setter))(obj, value->ptr); + else value->ptr = ((lv_property_get_pointer_t)(prop->getter))(obj); + break; + case LV_PROPERTY_TYPE_COLOR: + if(set)((lv_property_set_color_t)prop->setter)(obj, value->color); + else value->color = ((lv_property_get_color_t)(prop->getter))(obj); + break; + default: + LV_LOG_WARN("unknown property id: 0x%08x\n", prop->id); + return LV_RESULT_INVALID; + break; + } + + return LV_RESULT_OK; + } + + /*If no setter found, try base class then*/ + } + + LV_LOG_WARN("unknown property id: 0x%08x\n", id); + return LV_RESULT_INVALID; +} + +#endif /*LV_USE_OBJ_PROPERTY*/ diff --git a/libraries/lvgl/src/core/lv_obj_property.h b/libraries/lvgl/src/core/lv_obj_property.h new file mode 100644 index 0000000..ca3754a --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_property.h @@ -0,0 +1,128 @@ +/** + * @file lv_obj_property.h + * + */ + +#ifndef LV_OBJ_PROPERTY_H +#define LV_OBJ_PROPERTY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" + +#if LV_USE_OBJ_PROPERTY + +/********************* + * DEFINES + *********************/ + +/*All possible property value types*/ +#define LV_PROPERTY_TYPE_INVALID 0 /*Use default 0 as invalid to detect program outliers*/ +#define LV_PROPERTY_TYPE_INT 1 /*int32_t type*/ +#define LV_PROPERTY_TYPE_PRECISE 2 /*lv_value_precise_t, int32_t or float depending on LV_USE_FLOAT*/ +#define LV_PROPERTY_TYPE_COLOR 3 /*ARGB8888 type*/ +#define LV_PROPERTY_TYPE_POINTER 4 /*void * pointer*/ +#define LV_PROPERTY_TYPE_IMGSRC 5 /*Special pointer for image*/ + +/********************** + * TYPEDEFS + **********************/ + +#define LV_PROPERTY_ID(clz, name, type, index) LV_PROPERTY_## clz ##_##name = (LV_PROPERTY_## clz ##_START + (index)) | ((type) << 28) + +#define LV_PROPERTY_ID_TYPE(id) ((id) >> 28) +#define LV_PROPERTY_ID_INDEX(id) ((id) & 0xfffffff) + +/*Set properties from an array of lv_property_t*/ +#define LV_OBJ_SET_PROPERTY_ARRAY(obj, array) lv_obj_set_properties(obj, array, sizeof(array)/sizeof(array[0])) + +/** + * Group of predefined widget ID start value. + */ +enum { + LV_PROPERTY_ID_INVALID = 0, + + /*ID 0 to 0xff are style ID, check lv_style_prop_t*/ + LV_PROPERTY_ID_START = 0x100, /*ID little than 0xff is style ID*/ + + /* lv_obj.c */ + LV_PROPERTY_OBJ_START = 1000, + + /* lv_image.c */ + LV_PROPERTY_IMAGE_START = 1100, + + /*Special ID*/ + LV_PROPERTY_ID_BUILTIN_LAST, /*Use it to extend ID and make sure it's unique and compile time determinant*/ + + LV_PROPERTY_ID_ANY = 0x7ffffffe, /*Special ID used by lvgl to intercept all setter/getter call.*/ +}; + +typedef uint32_t lv_prop_id_t; + +typedef struct { + lv_prop_id_t id; + union { + int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ + const void * ptr; /**< Constant pointers (font, cone text, etc)*/ + lv_color_t color; /**< Colors*/ + lv_value_precise_t precise; /**< float or int for precise value*/ + lv_style_value_t _style; /**< A place holder for style value which is same as property value.*/ + }; +} lv_property_t; + +typedef struct { + lv_prop_id_t id; + + void * setter; + void * getter; +} lv_property_ops_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set widget property value. + * @param obj pointer to an object + * @param id ID of which property + * @param value The property value to set + * @return return LV_RESULT_OK if success + */ +lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value); + +lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count); + +/*===================== + * Getter functions + *====================*/ + +/** + * Read property value from object + * @param obj pointer to an object + * @param id ID of which property + * @param value pointer to a buffer to store the value + * @return ? to be discussed, LV_RESULT_OK or LV_RESULT_INVALID + */ +lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OBJ_PROPERTY*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_PROPERTY_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_scroll.c b/libraries/lvgl/src/core/lv_obj_scroll.c new file mode 100644 index 0000000..1add202 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_scroll.c @@ -0,0 +1,795 @@ +/** + * @file lv_obj_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_scroll.h" +#include "lv_obj.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_scroll.h" +#include "../display/lv_display.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define SCROLL_ANIM_TIME_MIN 200 /*ms*/ +#define SCROLL_ANIM_TIME_MAX 400 /*ms*/ +#define SCROLLBAR_MIN_SIZE (LV_DPX(10)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void scroll_x_anim(void * obj, int32_t v); +static void scroll_y_anim(void * obj, int32_t v); +static void scroll_completed_completed_cb(lv_anim_t * a); +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + + if(obj->spec_attr->scrollbar_mode == mode) return; + obj->spec_attr->scrollbar_mode = mode; + lv_obj_invalidate(obj); +} + +void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir) +{ + lv_obj_allocate_spec_attr(obj); + + if(dir != obj->spec_attr->scroll_dir) { + obj->spec_attr->scroll_dir = dir; + } +} + +void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_x = align; +} + +void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_y = align; +} + +/*===================== + * Getter functions + *====================*/ + +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scrollbar_mode_t) obj->spec_attr->scrollbar_mode; + else return LV_SCROLLBAR_MODE_AUTO; +} + +lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_dir_t) obj->spec_attr->scroll_dir; + else return LV_DIR_ALL; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_x; + else return LV_SCROLL_SNAP_NONE; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_y; + else return LV_SCROLL_SNAP_NONE; +} + +int32_t lv_obj_get_scroll_x(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; +} + +int32_t lv_obj_get_scroll_y(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +int32_t lv_obj_get_scroll_top(lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +int32_t lv_obj_get_scroll_bottom(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_y = child->coords.y2 + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN); + child_res = LV_MAX(child_res, tmp_y); + } + + int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.y2 - space_bottom); + } + + int32_t self_h = lv_obj_get_self_height(obj); + self_h = self_h - (lv_obj_get_height(obj) - space_top - space_bottom); + self_h -= lv_obj_get_scroll_y(obj); + return LV_MAX(child_res, self_h); +} + +int32_t lv_obj_get_scroll_left(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Normally can't scroll the object out on the left. + *So simply use the current scroll position as "left size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; + } + + /*With RTL base direction scrolling the left is normal so find the left most coordinate*/ + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + int32_t child_res = 0; + + uint32_t i; + int32_t x1 = LV_COORD_MAX; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_x = child->coords.x1 - lv_obj_get_style_margin_left(child, LV_PART_MAIN); + x1 = LV_MIN(x1, tmp_x); + } + + if(x1 != LV_COORD_MAX) { + child_res = x1; + child_res = (obj->coords.x1 + space_left) - child_res; + } + else { + child_res = LV_COORD_MIN; + } + + int32_t self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); + self_w += lv_obj_get_scroll_x(obj); + + return LV_MAX(child_res, self_w); +} + +int32_t lv_obj_get_scroll_right(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*With RTL base dir can't scroll to the object out on the right. + *So simply use the current scroll position as "right size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->scroll.x; + } + + /*With other base direction (LTR) scrolling to the right is normal so find the right most coordinate*/ + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_x = child->coords.x2 + lv_obj_get_style_margin_right(child, LV_PART_MAIN); + child_res = LV_MAX(child_res, tmp_x); + } + + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.x2 - space_right); + } + + int32_t self_w; + self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); + self_w -= lv_obj_get_scroll_x(obj); + return LV_MAX(child_res, self_w); +} + +void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end) +{ + lv_anim_t * a; + a = lv_anim_get(obj, scroll_x_anim); + end->x = a ? -a->end_value : lv_obj_get_scroll_x(obj); + + a = lv_anim_get(obj, scroll_y_anim); + end->y = a ? -a->end_value : lv_obj_get_scroll_y(obj); +} + +/*===================== + * Other functions + *====================*/ + +void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + + /*We need to know the final sizes for bound check*/ + lv_obj_update_layout(obj); + + /*Don't let scroll more than naturally possible by the size of the content*/ + int32_t x_current = -lv_obj_get_scroll_x(obj); + int32_t x_bounded = x_current + dx; + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(x_bounded > 0) x_bounded = 0; + if(x_bounded < 0) { + int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded < -scroll_max) x_bounded = -scroll_max; + } + } + else { + if(x_bounded < 0) x_bounded = 0; + if(x_bounded > 0) { + int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded > scroll_max) x_bounded = scroll_max; + } + } + + /*Don't let scroll more than naturally possible by the size of the content*/ + int32_t y_current = -lv_obj_get_scroll_y(obj); + int32_t y_bounded = y_current + dy; + + if(y_bounded > 0) y_bounded = 0; + if(y_bounded < 0) { + int32_t scroll_max = lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + if(scroll_max < 0) scroll_max = 0; + if(y_bounded < -scroll_max) y_bounded = -scroll_max; + } + + dx = x_bounded - x_current; + dy = y_bounded - y_current; + if(dx || dy) { + lv_obj_scroll_by(obj, dx, dy, anim_en); + } +} + +void lv_obj_scroll_by(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + if(anim_en == LV_ANIM_ON) { + lv_display_t * d = lv_obj_get_display(obj); + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_completed_cb(&a, scroll_completed_completed_cb); + + if(dx) { + uint32_t t = lv_anim_speed_clamped((lv_display_get_horizontal_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, + SCROLL_ANIM_TIME_MAX); + lv_anim_set_duration(&a, t); + int32_t sx = lv_obj_get_scroll_x(obj); + lv_anim_set_values(&a, -sx, -sx + dx); + lv_anim_set_exec_cb(&a, scroll_x_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RESULT_OK) return; + lv_anim_start(&a); + } + + if(dy) { + uint32_t t = lv_anim_speed_clamped((lv_display_get_vertical_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, + SCROLL_ANIM_TIME_MAX); + lv_anim_set_duration(&a, t); + int32_t sy = lv_obj_get_scroll_y(obj); + lv_anim_set_values(&a, -sy, -sy + dy); + lv_anim_set_exec_cb(&a, scroll_y_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RESULT_OK) return; + lv_anim_start(&a); + } + } + else { + /*Remove pending animations*/ + lv_anim_delete(obj, scroll_y_anim); + lv_anim_delete(obj, scroll_x_anim); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(res != LV_RESULT_OK) return; + + res = _lv_obj_scroll_by_raw(obj, dx, dy); + if(res != LV_RESULT_OK) return; + + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_END, NULL); + if(res != LV_RESULT_OK) return; + } +} + +void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en) +{ + lv_obj_scroll_to_x(obj, x, anim_en); + lv_obj_scroll_to_y(obj, y, anim_en); +} + +void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en) +{ + lv_anim_delete(obj, scroll_x_anim); + + int32_t scroll_x = lv_obj_get_scroll_x(obj); + int32_t diff = -x + scroll_x; + + lv_obj_scroll_by_bounded(obj, diff, 0, anim_en); +} + +void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en) +{ + lv_anim_delete(obj, scroll_y_anim); + + int32_t scroll_y = lv_obj_get_scroll_y(obj); + int32_t diff = -y + scroll_y; + + lv_obj_scroll_by_bounded(obj, 0, diff, anim_en); +} + +void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + scroll_area_into_view(&obj->coords, obj, &p, anim_en); +} + +void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + lv_obj_t * child = obj; + lv_obj_t * parent = lv_obj_get_parent(child); + while(parent) { + scroll_area_into_view(&obj->coords, child, &p, anim_en); + child = parent; + parent = lv_obj_get_parent(parent); + } +} + +lv_result_t _lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y) +{ + if(x == 0 && y == 0) return LV_RESULT_OK; + + lv_obj_allocate_spec_attr(obj); + + obj->spec_attr->scroll.x += x; + obj->spec_attr->scroll.y += y; + + lv_obj_move_children_by(obj, x, y, true); + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_SCROLL, NULL); + if(res != LV_RESULT_OK) return res; + lv_obj_invalidate(obj); + return LV_RESULT_OK; +} + +bool lv_obj_is_scrolling(const lv_obj_t * obj) +{ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) return true; + indev = lv_indev_get_next(indev); + } + + return false; +} + +void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(obj); + lv_point_t p; + lv_indev_scroll_get_snap_dist(obj, &p); + lv_obj_scroll_by(obj, p.x, p.y, anim_en); +} + +void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * ver_area) +{ + lv_area_set(hor_area, 0, 0, -1, -1); + lv_area_set(ver_area, 0, 0, -1, -1); + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; + + lv_dir_t sm = lv_obj_get_scrollbar_mode(obj); + if(sm == LV_SCROLLBAR_MODE_OFF) return; + + /*If there is no indev scrolling this object but `mode==active` return*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + if(sm == LV_SCROLLBAR_MODE_ACTIVE) { + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) break; + indev = lv_indev_get_next(indev); + } + if(indev == NULL) return; + } + + int32_t st = lv_obj_get_scroll_top(obj); + int32_t sb = lv_obj_get_scroll_bottom(obj); + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + + lv_dir_t dir = lv_obj_get_scroll_dir(obj); + + bool ver_draw = false; + if((dir & LV_DIR_VER) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (st > 0 || sb > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_VER))) { + ver_draw = true; + } + + bool hor_draw = false; + if((dir & LV_DIR_HOR) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (sl > 0 || sr > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_HOR))) { + hor_draw = true; + } + + if(!hor_draw && !ver_draw) return; + + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_SCROLLBAR) == LV_BASE_DIR_RTL; + + int32_t top_space = lv_obj_get_style_pad_top(obj, LV_PART_SCROLLBAR); + int32_t bottom_space = lv_obj_get_style_pad_bottom(obj, LV_PART_SCROLLBAR); + int32_t left_space = lv_obj_get_style_pad_left(obj, LV_PART_SCROLLBAR); + int32_t right_space = lv_obj_get_style_pad_right(obj, LV_PART_SCROLLBAR); + int32_t thickness = lv_obj_get_style_width(obj, LV_PART_SCROLLBAR); + + int32_t obj_h = lv_obj_get_height(obj); + int32_t obj_w = lv_obj_get_width(obj); + + /*Space required for the vertical and horizontal scrollbars*/ + int32_t ver_reg_space = ver_draw ? thickness : 0; + int32_t hor_req_space = hor_draw ? thickness : 0; + int32_t rem; + + if(lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN && + lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR) < LV_OPA_MIN) { + return; + } + + /*Draw vertical scrollbar if the mode is ON or can be scrolled in this direction*/ + int32_t content_h = obj_h + st + sb; + if(ver_draw && content_h) { + ver_area->y1 = obj->coords.y1; + ver_area->y2 = obj->coords.y2; + if(rtl) { + ver_area->x1 = obj->coords.x1 + left_space; + ver_area->x2 = ver_area->x1 + thickness - 1; + } + else { + ver_area->x2 = obj->coords.x2 - right_space; + ver_area->x1 = ver_area->x2 - thickness + 1; + } + + int32_t sb_h = ((obj_h - top_space - bottom_space - hor_req_space) * obj_h) / content_h; + sb_h = LV_MAX(sb_h, SCROLLBAR_MIN_SIZE); + rem = (obj_h - top_space - bottom_space - hor_req_space) - + sb_h; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + int32_t scroll_h = content_h - obj_h; /*The size of the content which can be really scrolled*/ + if(scroll_h <= 0) { + ver_area->y1 = obj->coords.y1 + top_space; + ver_area->y2 = obj->coords.y2 - bottom_space - hor_req_space - 1; + } + else { + int32_t sb_y = (rem * sb) / scroll_h; + sb_y = rem - sb_y; + + ver_area->y1 = obj->coords.y1 + sb_y + top_space; + ver_area->y2 = ver_area->y1 + sb_h - 1; + if(ver_area->y1 < obj->coords.y1 + top_space) { + ver_area->y1 = obj->coords.y1 + top_space; + if(ver_area->y1 + SCROLLBAR_MIN_SIZE > ver_area->y2) { + ver_area->y2 = ver_area->y1 + SCROLLBAR_MIN_SIZE; + } + } + if(ver_area->y2 > obj->coords.y2 - hor_req_space - bottom_space) { + ver_area->y2 = obj->coords.y2 - hor_req_space - bottom_space; + if(ver_area->y2 - SCROLLBAR_MIN_SIZE < ver_area->y1) { + ver_area->y1 = ver_area->y2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + + /*Draw horizontal scrollbar if the mode is ON or can be scrolled in this direction*/ + int32_t content_w = obj_w + sl + sr; + if(hor_draw && content_w) { + hor_area->y2 = obj->coords.y2 - bottom_space; + hor_area->y1 = hor_area->y2 - thickness + 1; + hor_area->x1 = obj->coords.x1; + hor_area->x2 = obj->coords.x2; + + int32_t sb_w = ((obj_w - left_space - right_space - ver_reg_space) * obj_w) / content_w; + sb_w = LV_MAX(sb_w, SCROLLBAR_MIN_SIZE); + rem = (obj_w - left_space - right_space - ver_reg_space) - + sb_w; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + int32_t scroll_w = content_w - obj_w; /*The size of the content which can be really scrolled*/ + if(scroll_w <= 0) { + if(rtl) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space - 1; + hor_area->x2 = obj->coords.x2 - right_space; + } + else { + hor_area->x1 = obj->coords.x1 + left_space; + hor_area->x2 = obj->coords.x2 - right_space - ver_reg_space - 1; + } + } + else { + int32_t sb_x = (rem * sr) / scroll_w; + sb_x = rem - sb_x; + + if(rtl) { + hor_area->x1 = obj->coords.x1 + sb_x + left_space + ver_reg_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space + ver_reg_space) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - right_space) { + hor_area->x2 = obj->coords.x2 - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + else { + hor_area->x1 = obj->coords.x1 + sb_x + left_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space) { + hor_area->x1 = obj->coords.x1 + left_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - ver_reg_space - right_space) { + hor_area->x2 = obj->coords.x2 - ver_reg_space - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + } +} + +void lv_obj_scrollbar_invalidate(lv_obj_t * obj) +{ + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + if(lv_area_get_size(&hor_area) > 0) lv_obj_invalidate_area(obj, &hor_area); + if(lv_area_get_size(&ver_area) > 0) lv_obj_invalidate_area(obj, &ver_area); +} + +void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the bottom side is not remains scrolled in*/ + /*With snapping the content can't be scrolled in*/ + if(lv_obj_get_scroll_snap_y(obj) == LV_SCROLL_SNAP_NONE) { + int32_t st = lv_obj_get_scroll_top(obj); + int32_t sb = lv_obj_get_scroll_bottom(obj); + if(sb < 0 && st > 0) { + sb = LV_MIN(st, -sb); + lv_obj_scroll_by(obj, 0, sb, anim_en); + } + } + + if(lv_obj_get_scroll_snap_x(obj) == LV_SCROLL_SNAP_NONE) { + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + /*Be sure the left side is not remains scrolled in*/ + if(sr < 0 && sl > 0) { + sr = LV_MIN(sl, -sr); + lv_obj_scroll_by(obj, sr, 0, anim_en); + } + } + else { + /*Be sure the right side is not remains scrolled in*/ + if(sl < 0 && sr > 0) { + sr = LV_MIN(sr, -sl); + lv_obj_scroll_by(obj, sl, 0, anim_en); + } + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void scroll_x_anim(void * obj, int32_t v) +{ + _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); +} + +static void scroll_y_anim(void * obj, int32_t v) +{ + _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); +} + +static void scroll_completed_completed_cb(lv_anim_t * a) +{ + lv_obj_send_event(a->var, LV_EVENT_SCROLL_END, NULL); +} + +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en) +{ + lv_obj_t * parent = lv_obj_get_parent(child); + if(!lv_obj_has_flag(parent, LV_OBJ_FLAG_SCROLLABLE)) return; + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(parent); + int32_t snap_goal = 0; + int32_t act = 0; + const lv_area_t * area_tmp; + + int32_t y_scroll = 0; + lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(parent); + if(snap_y != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + int32_t stop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); + int32_t sbottom = lv_obj_get_style_space_bottom(parent, LV_PART_MAIN); + int32_t top_diff = parent->coords.y1 + stop - area_tmp->y1 - scroll_value->y; + int32_t bottom_diff = -(parent->coords.y2 - sbottom - area_tmp->y2 - scroll_value->y); + int32_t parent_h = lv_obj_get_height(parent) - stop - sbottom; + if((top_diff >= 0 && bottom_diff >= 0)) y_scroll = 0; + else if(top_diff > 0) { + y_scroll = top_diff; + /*Do not let scrolling in*/ + int32_t st = lv_obj_get_scroll_top(parent); + if(st - y_scroll < 0) y_scroll = 0; + } + else if(bottom_diff > 0) { + y_scroll = -bottom_diff; + /*Do not let scrolling in*/ + int32_t sb = lv_obj_get_scroll_bottom(parent); + if(sb + y_scroll < 0) y_scroll = 0; + } + + switch(snap_y) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.y1 + stop; + act = area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.y2 - sbottom; + act = area_tmp->y2 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.y1 + stop + parent_h / 2; + act = lv_area_get_height(area_tmp) / 2 + area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + } + + int32_t x_scroll = 0; + lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(parent); + if(snap_x != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + int32_t sleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); + int32_t sright = lv_obj_get_style_space_right(parent, LV_PART_MAIN); + int32_t left_diff = parent->coords.x1 + sleft - area_tmp->x1 - scroll_value->x; + int32_t right_diff = -(parent->coords.x2 - sright - area_tmp->x2 - scroll_value->x); + if((left_diff >= 0 && right_diff >= 0)) x_scroll = 0; + else if(left_diff > 0) { + x_scroll = left_diff; + /*Do not let scrolling in*/ + int32_t sl = lv_obj_get_scroll_left(parent); + if(sl - x_scroll < 0) x_scroll = 0; + } + else if(right_diff > 0) { + x_scroll = -right_diff; + /*Do not let scrolling in*/ + int32_t sr = lv_obj_get_scroll_right(parent); + if(sr + x_scroll < 0) x_scroll = 0; + } + + int32_t parent_w = lv_obj_get_width(parent) - sleft - sright; + switch(snap_x) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.x1 + sleft; + act = area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.x2 - sright; + act = area_tmp->x2 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.x1 + sleft + parent_w / 2; + act = lv_area_get_width(area_tmp) / 2 + area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + } + + /*Remove any pending scroll animations.*/ + bool y_del = lv_anim_delete(parent, scroll_y_anim); + bool x_del = lv_anim_delete(parent, scroll_x_anim); + if(y_del || x_del) { + lv_result_t res; + res = lv_obj_send_event(parent, LV_EVENT_SCROLL_END, NULL); + if(res != LV_RESULT_OK) return; + } + + if((scroll_dir & LV_DIR_LEFT) == 0 && x_scroll < 0) x_scroll = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && x_scroll > 0) x_scroll = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && y_scroll < 0) y_scroll = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && y_scroll > 0) y_scroll = 0; + + scroll_value->x += anim_en == LV_ANIM_OFF ? 0 : x_scroll; + scroll_value->y += anim_en == LV_ANIM_OFF ? 0 : y_scroll; + lv_obj_scroll_by(parent, x_scroll, y_scroll, anim_en); +} diff --git a/libraries/lvgl/src/core/lv_obj_scroll.h b/libraries/lvgl/src/core/lv_obj_scroll.h new file mode 100644 index 0000000..0114a3b --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_scroll.h @@ -0,0 +1,314 @@ +/** + * @file lv_obj_scroll.h + * + */ + +#ifndef LV_OBJ_SCROLL_H +#define LV_OBJ_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +/** Scrollbar modes: shows when should the scrollbars be visible*/ +enum _lv_scrollbar_mode_t { + LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ + LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ + LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when object is being scrolled*/ + LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ +}; + +#ifdef DOXYGEN +typedef _lv_scrollbar_mode_t lv_scrollbar_mode_t; +#else +typedef uint8_t lv_scrollbar_mode_t; +#endif /*DOXYGEN*/ + +/** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ +enum _lv_scroll_snap_t { + LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ + LV_SCROLL_SNAP_START, /**< Align to the left/top*/ + LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ + LV_SCROLL_SNAP_CENTER /**< Align to the center*/ +}; + +#ifdef DOXYGEN +typedef _lv_scroll_snap_t lv_scroll_snap_t; +#else +typedef uint8_t lv_scroll_snap_t; +#endif /*DOXYGEN*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set how the scrollbars should behave. + * @param obj pointer to an object + * @param mode LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE + */ +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode); + +/** + * Set the object in which directions can be scrolled + * @param obj pointer to an object + * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` + */ +void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set where to snap the children when scrolling ends horizontally + * @param obj pointer to an object + * @param align the snap align to set from `lv_scroll_snap_t` + */ +void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align); + +/** + * Set where to snap the children when scrolling ends vertically + * @param obj pointer to an object + * @param align the snap align to set from `lv_scroll_snap_t` + */ +void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current scroll mode (when to hide the scrollbars) + * @param obj pointer to an object + * @return the current scroll mode from `lv_scrollbar_mode_t` + */ +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj); + +/** + * Get the object in which directions can be scrolled + * @param obj pointer to an object + * @param dir the allow scroll directions. An element or OR-ed values of `lv_dir_t` + */ +lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj); + +/** + * Get where to snap the children when scrolling ends horizontally + * @param obj pointer to an object + * @return the current snap align from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj); + +/** + * Get where to snap the children when scrolling ends vertically + * @param obj pointer to an object + * @return the current snap align from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj); + +/** + * Get current X scroll position. + * @param obj pointer to an object + * @return the current scroll position from the left edge. + * If the object is not scrolled return 0 + * If scrolled return > 0 + * If scrolled in (elastic scroll) return < 0 + */ +int32_t lv_obj_get_scroll_x(const lv_obj_t * obj); + +/** + * Get current Y scroll position. + * @param obj pointer to an object + * @return the current scroll position from the top edge. + * If the object is not scrolled return 0 + * If scrolled return > 0 + * If scrolled inside return < 0 + */ +int32_t lv_obj_get_scroll_y(const lv_obj_t * obj); + +/** + * Return the height of the area above the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area above the object in pixels + */ +int32_t lv_obj_get_scroll_top(lv_obj_t * obj); + +/** + * Return the height of the area below the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area below the object in pixels + */ +int32_t lv_obj_get_scroll_bottom(lv_obj_t * obj); + +/** + * Return the width of the area on the left the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area on the left the object in pixels + */ +int32_t lv_obj_get_scroll_left(lv_obj_t * obj); + +/** + * Return the width of the area on the right the object. + * That is the number of pixels the object can be scrolled down. + * Normally positive but can be negative when scrolled inside. + * @param obj pointer to an object + * @return the scrollable area on the right the object in pixels + */ +int32_t lv_obj_get_scroll_right(lv_obj_t * obj); + +/** + * Get the X and Y coordinates where the scrolling will end for this object if a scrolling animation is in progress. + * If no scrolling animation, give the current `x` or `y` scroll position. + * @param obj pointer to an object + * @param end pointer to store the result + */ +void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end); + +/*===================== + * Other functions + *====================*/ + +/** + * Scroll by a given amount of pixels + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note > 0 value means scroll right/bottom (show the more content on the right/bottom) + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en); + +/** + * Scroll by a given amount of pixels. + * `dx` and `dy` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param dx pixels to scroll horizontally + * @param dy pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en); + +/** + * Scroll to a given coordinate on an object. + * `x` and `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en); + +/** + * Scroll to a given X coordinate on an object. + * `x` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en); + +/** + * Scroll to a given Y coordinate on an object + * `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to an object to scroll + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en); + +/** + * Scroll to an object until it becomes visible on its parent + * @param obj pointer to an object to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Scroll to an object until it becomes visible on its parent. + * Do the same on the parent's parent, and so on. + * Therefore the object will be scrolled into view even it has nested scrollable parents + * @param obj pointer to an object to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Low level function to scroll by given x and y coordinates. + * `LV_EVENT_SCROLL` is sent. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @return `LV_RESULT_INVALID`: to object was deleted in `LV_EVENT_SCROLL`; + * `LV_RESULT_OK`: if the object is still valid + */ +lv_result_t _lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Tell whether an object is being scrolled or not at this moment + * @param obj pointer to an object + * @return true: `obj` is being scrolled + */ +bool lv_obj_is_scrolling(const lv_obj_t * obj); + +/** + * Check the children of `obj` and scroll `obj` to fulfill the scroll_snap settings + * @param obj an object whose children needs to checked and snapped + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Get the area of the scrollbars + * @param obj pointer to an object + * @param hor pointer to store the area of the horizontal scrollbar + * @param ver pointer to store the area of the vertical scrollbar + */ +void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor, lv_area_t * ver); + +/** + * Invalidate the area of the scrollbars + * @param obj pointer to an object + */ +void lv_obj_scrollbar_invalidate(lv_obj_t * obj); + +/** + * Checks if the content is scrolled "in" and adjusts it to a normal position. + * @param obj pointer to an object + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_SCROLL_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_style.c b/libraries/lvgl/src/core/lv_obj_style.c new file mode 100644 index 0000000..2273c0e --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_style.c @@ -0,0 +1,1118 @@ +/** + * @file lv_obj_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../misc/lv_color.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define style_refr LV_GLOBAL_DEFAULT()->style_refresh +#define style_trans_ll_p &(LV_GLOBAL_DEFAULT()->style_trans_ll) +#define _style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table +#define STYLE_PROP_SHIFTED(prop) ((uint32_t)1 << ((prop) >> 3)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t * obj; + lv_style_prop_t prop; + lv_style_selector_t selector; + lv_style_value_t start_value; + lv_style_value_t end_value; +} trans_t; + +typedef enum { + CACHE_ZERO = 0, + CACHE_TRUE = 1, + CACHE_UNSET = 2, + CACHE_255 = 3, + CACHE_NEED_CHECK = 4, +} cache_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector); +static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, uint32_t part); +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * v); +static void report_style_change_core(void * style, lv_obj_t * obj); +static void refresh_children_style(lv_obj_t * obj); +static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit); +static void trans_anim_cb(void * _tr, int32_t v); +static void trans_anim_start_cb(lv_anim_t * a); +static void trans_anim_completed_cb(lv_anim_t * a); +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj); +static void full_cache_refresh(lv_obj_t * obj, lv_part_t part); +static void fade_anim_cb(void * obj, int32_t v); +static void fade_in_anim_completed(lv_anim_t * a); +static bool style_has_flag(const lv_style_t * style, uint32_t flag); +static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * value_act); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_obj_style_init(void) +{ + _lv_ll_init(style_trans_ll_p, sizeof(trans_t)); +} + +void _lv_obj_style_deinit(void) +{ + _lv_ll_clear(style_trans_ll_p); + if(_style_custom_prop_flag_lookup_table != NULL) { + lv_free(_style_custom_prop_flag_lookup_table); + _style_custom_prop_flag_lookup_table = NULL; + } +} + +void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) +{ + LV_ASSERT(obj->style_cnt < 63); + + trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); + + lv_part_t part = lv_obj_style_get_selector_part(selector); + + if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + /*Try removing the style first to be sure it won't be added twice*/ + lv_obj_remove_style(obj, style, selector); + + uint32_t i; + /*Go after the transition and local styles*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + if(obj->styles[i].is_local) continue; + break; + } + + /*Now `i` is at the first normal style. Insert the new style before this*/ + + /*Allocate space for the new style and shift the rest of the style to the end*/ + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); + + uint32_t j; + for(j = obj->style_cnt - 1; j > i ; j--) { + obj->styles[j] = obj->styles[j - 1]; + } + + lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + obj->styles[i].style = style; + obj->styles[i].selector = selector; + +#if LV_OBJ_STYLE_CACHE + uint32_t * prop_is_set = part == LV_PART_MAIN ? &obj->style_main_prop_is_set : &obj->style_other_prop_is_set; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(i = 0; props[i].prop_ptr; i++) { + (*prop_is_set) |= STYLE_PROP_SHIFTED(*props[i].prop_ptr); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(i = 0; i < style->prop_cnt; i++) { + (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i]); + } + } +#endif + + lv_obj_refresh_style(obj, selector, LV_STYLE_PROP_ANY); +} + +bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, + lv_style_selector_t selector) +{ + lv_state_t state = lv_obj_style_get_selector_state(selector); + lv_part_t part = lv_obj_style_get_selector_part(selector); + + /*All objects must exist*/ + if(!obj || !old_style || !new_style || (old_style == new_style)) { + return false; + } + + /*Similar to lv_obj_add_style, delete transition*/ + trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); + + bool replaced = false; + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + + /*Skip local styles and transitions*/ + if(obj->styles[i].is_local || obj->styles[i].is_trans) { + continue; + } + + /*Skip non-matching styles*/ + if((state != LV_STATE_ANY && state_act != state) || + (part != LV_PART_ANY && part_act != part) || + (old_style != obj->styles[i].style)) { + continue; + } + + lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + obj->styles[i].style = new_style; + obj->styles[i].selector = selector; + + replaced = true; + /*Don't break and continue replacing other occurrences*/ + } + if(replaced) { + full_cache_refresh(obj, part); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ANY); + } + return replaced; +} + +void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) +{ + lv_state_t state = lv_obj_style_get_selector_state(selector); + lv_part_t part = lv_obj_style_get_selector_part(selector); + lv_style_prop_t prop = LV_STYLE_PROP_ANY; + if(style && style->prop_cnt == 0) prop = LV_STYLE_PROP_INV; + + if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + uint32_t i = 0; + bool deleted = false; + while(i < obj->style_cnt) { + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if((state != LV_STATE_ANY && state_act != state) || + (part != LV_PART_ANY && part_act != part) || + (style != NULL && style != obj->styles[i].style)) { + i++; + continue; + } + + if(obj->styles[i].is_trans) { + trans_delete(obj, part, LV_STYLE_PROP_ANY, NULL); + } + + if(obj->styles[i].is_local || obj->styles[i].is_trans) { + if(obj->styles[i].style) lv_style_reset((lv_style_t *)obj->styles[i].style); + lv_free((lv_style_t *)obj->styles[i].style); + obj->styles[i].style = NULL; + } + + /*Shift the styles after `i` by one*/ + uint32_t j; + for(j = i; j < (uint32_t)obj->style_cnt - 1 ; j++) { + obj->styles[j] = obj->styles[j + 1]; + } + + obj->style_cnt--; + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + + deleted = true; + /*The style from the current `i` index is removed, so `i` points to the next style. + *Therefore it doesn't needs to be incremented*/ + } + + if(deleted && prop != LV_STYLE_PROP_INV) { + full_cache_refresh(obj, part); + lv_obj_refresh_style(obj, part, prop); + } +} + +void lv_obj_remove_style_all(lv_obj_t * obj) +{ + lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); +} + +void lv_obj_report_style_change(lv_style_t * style) +{ + if(!style_refr) return; + lv_display_t * d = lv_display_get_next(NULL); + + while(d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + report_style_change_core(style, d->screens[i]); + } + d = lv_display_get_next(d); + } +} + +void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(!style_refr) return; + + lv_obj_invalidate(obj); + + lv_part_t part = lv_obj_style_get_selector_part(selector); + + bool is_layout_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYOUT_UPDATE); + bool is_ext_draw = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE); + bool is_inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_INHERITABLE); + bool is_layer_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYER_UPDATE); + + if(is_layout_refr) { + if(part == LV_PART_ANY || + part == LV_PART_MAIN || + lv_obj_get_style_height(obj, 0) == LV_SIZE_CONTENT || + lv_obj_get_style_width(obj, 0) == LV_SIZE_CONTENT) { + lv_obj_send_event(obj, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_mark_layout_as_dirty(obj); + } + } + if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY || is_layout_refr)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) lv_obj_mark_layout_as_dirty(parent); + } + + /*Cache the layer type*/ + if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) { + _lv_obj_update_layer_type(obj); + } + + if(prop == LV_STYLE_PROP_ANY || is_ext_draw) { + lv_obj_refresh_ext_draw_size(obj); + } + lv_obj_invalidate(obj); + + if(prop == LV_STYLE_PROP_ANY || (is_inheritable && (is_ext_draw || is_layout_refr))) { + if(part != LV_PART_SCROLLBAR) { + refresh_children_style(obj); + } + } +} + +void lv_obj_enable_style_refresh(bool en) +{ + style_refr = en; +} + +lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop) +{ + LV_ASSERT_NULL(obj) + + lv_style_selector_t selector = part | obj->state; + lv_style_value_t value_act = { .ptr = NULL }; + lv_style_res_t found; + + found = get_selector_style_prop(obj, selector, prop, &value_act); + if(found == LV_STYLE_RES_FOUND) return value_act; + + return lv_style_prop_get_default(prop); +} + +bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) +{ + LV_ASSERT_NULL(obj) + + lv_style_value_t value_act = { .ptr = NULL }; + lv_style_res_t found; + + found = get_selector_style_prop(obj, selector, prop, &value_act); + if(found == LV_STYLE_RES_FOUND) return true; + + return false; +} + +void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector) +{ + lv_style_t * style = get_local_style(obj, selector); + if(selector == LV_PART_MAIN && lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + lv_style_set_prop(style, prop, value); + +#if LV_OBJ_STYLE_CACHE + uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); + if(lv_obj_style_get_selector_part(selector) == LV_PART_MAIN) { + obj->style_main_prop_is_set |= prop_shifted; + } + else { + obj->style_other_prop_is_set |= prop_shifted; + } +#endif + + lv_obj_refresh_style(obj, selector, prop); +} + +lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return lv_style_get_prop(obj->styles[i].style, prop, value); + } + } + + return LV_STYLE_RES_NOT_FOUND; +} + +bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t i; + /*Find the style*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + break; + } + } + + /*The style is not found*/ + if(i == obj->style_cnt) return false; + + lv_result_t res = lv_style_remove_prop((lv_style_t *)obj->styles[i].style, prop); + if(res == LV_RESULT_OK) { + full_cache_refresh(obj, lv_obj_style_get_selector_part(selector)); + lv_obj_refresh_style(obj, selector, prop); + } + + return res; +} + +void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, + const _lv_obj_style_transition_dsc_t * tr_dsc) +{ + trans_t * tr; + + /*Get the previous and current values*/ + obj->skip_trans = 1; + obj->state = prev_state; + lv_style_value_t v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + lv_style_value_t v2 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->skip_trans = 0; + + if(v1.ptr == v2.ptr && v1.num == v2.num && lv_color_eq(v1.color, v2.color)) return; + obj->state = prev_state; + v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + + _lv_obj_style_t * style_trans = get_trans_style(obj, part); + lv_style_set_prop((lv_style_t *)style_trans->style, tr_dsc->prop, v1); /*Be sure `trans_style` has a valid value*/ + + if(tr_dsc->prop == LV_STYLE_RADIUS) { + if(v1.num == LV_RADIUS_CIRCLE || v2.num == LV_RADIUS_CIRCLE) { + int32_t whalf = lv_obj_get_width(obj) / 2; + int32_t hhalf = lv_obj_get_height(obj) / 2; + if(v1.num == LV_RADIUS_CIRCLE) v1.num = LV_MIN(whalf + 1, hhalf + 1); + if(v2.num == LV_RADIUS_CIRCLE) v2.num = LV_MIN(whalf + 1, hhalf + 1); + } + } + + tr = _lv_ll_ins_head(style_trans_ll_p); + LV_ASSERT_MALLOC(tr); + if(tr == NULL) return; + tr->start_value = v1; + tr->end_value = v2; + tr->obj = obj; + tr->prop = tr_dsc->prop; + tr->selector = part; + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, tr); + lv_anim_set_exec_cb(&a, trans_anim_cb); + lv_anim_set_start_cb(&a, trans_anim_start_cb); + lv_anim_set_completed_cb(&a, trans_anim_completed_cb); + lv_anim_set_values(&a, 0x00, 0xFF); + lv_anim_set_duration(&a, tr_dsc->time); + lv_anim_set_delay(&a, tr_dsc->delay); + lv_anim_set_path_cb(&a, tr_dsc->path_cb); + lv_anim_set_early_apply(&a, false); + lv_anim_set_user_data(&a, tr_dsc->user_data); + lv_anim_start(&a); +} + +lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v) +{ + if(obj == NULL) return v; + const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part); + if(f && f->filter_cb) { + lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part); + if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa); + } + return v; +} + +_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) +{ + _lv_style_state_cmp_t res = _LV_STYLE_STATE_CMP_SAME; + + /*Are there any new styles for the new state?*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + /*The style is valid for a state but not the other*/ + bool valid1 = state_act & (~state1) ? false : true; + bool valid2 = state_act & (~state2) ? false : true; + if(valid1 != valid2) { + const lv_style_t * style = obj->styles[i].style; + lv_style_value_t v; + /*If there is layout difference on the main part, return immediately. There is no more serious difference*/ + bool layout_diff = false; + if(lv_style_get_prop(style, LV_STYLE_PAD_TOP, &v))layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_BOTTOM, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_LEFT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_RIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_COLUMN, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_ROW, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_LAYOUT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_X, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_Y, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true; + + if(layout_diff) { + return _LV_STYLE_STATE_CMP_DIFF_LAYOUT; + } + + /*Check for draw pad changes*/ + if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(res == _LV_STYLE_STATE_CMP_SAME) res = _LV_STYLE_STATE_CMP_DIFF_REDRAW; + } + } + + return res; +} + +void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, 0, LV_OPA_COVER); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_completed_cb(&a, fade_in_anim_completed); + lv_anim_set_duration(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, lv_obj_get_style_opa(obj, 0), LV_OPA_TRANSP); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_duration(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt) +{ + lv_text_align_t align = lv_obj_get_style_text_align(obj, part); + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, part); + lv_bidi_calculate_align(&align, &base_dir, txt); + return align; +} + +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) +{ + + lv_opa_t opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + + lv_opa_t opa_final = LV_OPA_COVER; + if(opa_obj < LV_OPA_MAX) { + opa_final = LV_OPA_MIX2(opa_final, opa_obj); + } + + if(part != LV_PART_MAIN) { + part = LV_PART_MAIN; + } + else { + obj = lv_obj_get_parent(obj); + } + + while(obj) { + opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_obj < LV_OPA_MAX) { + opa_final = LV_OPA_MIX2(opa_final, opa_obj); + } + + obj = lv_obj_get_parent(obj); + } + + if(opa_final <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_final >= LV_OPA_MAX) return LV_OPA_COVER; + return opa_final; +} + +void _lv_obj_update_layer_type(lv_obj_t * obj) +{ + lv_layer_type_t layer_type = calculate_layer_type(obj); + if(obj->spec_attr) obj->spec_attr->layer_type = layer_type; + else if(layer_type != LV_LAYER_TYPE_NONE) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->layer_type = layer_type; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the local style of an object for a given part and for a given state. + * If the local style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the local style + */ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return (lv_style_t *)obj->styles[i].style; + } + } + + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + /*Copy only normal styles (not local and transition). + *The new local style will be added as the last local style*/ + if(obj->styles[i - 1].is_local || obj->styles[i - 1].is_trans) break; + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memzero(&obj->styles[i], sizeof(_lv_obj_style_t)); + obj->styles[i].style = lv_malloc(sizeof(lv_style_t)); + lv_style_init((lv_style_t *)obj->styles[i].style); + + obj->styles[i].is_local = 1; + obj->styles[i].selector = selector; + return (lv_style_t *)obj->styles[i].style; +} + +/** + * Get the transition style of an object for a given part and for a given state. + * If the transition style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the transition style + */ +static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == selector) break; + } + + /*Already have a transition style for it*/ + if(i != obj->style_cnt) return &obj->styles[i]; + + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memzero(&obj->styles[0], sizeof(_lv_obj_style_t)); + obj->styles[0].style = lv_malloc(sizeof(lv_style_t)); + lv_style_init((lv_style_t *)obj->styles[0].style); + + obj->styles[0].is_trans = 1; + obj->styles[0].selector = selector; + return &obj->styles[0]; +} + +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * v) +{ + + const uint32_t group = (uint32_t)1 << _lv_style_get_prop_group(prop); + const lv_part_t part = lv_obj_style_get_selector_part(selector); + const lv_state_t state = lv_obj_style_get_selector_state(selector); + const lv_state_t state_inv = ~state; + const bool skip_trans = (const bool) obj->skip_trans; + int32_t weight = -1; + lv_style_res_t found; + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + _lv_obj_style_t * obj_style = &obj->styles[i]; + if(obj_style->is_trans == false) break; + if(skip_trans) continue; + + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + + if(part_act != part) continue; + if((obj_style->style->has_group & group) == 0) continue; + found = lv_style_get_prop_inlined(obj_style->style, prop, v); + if(found == LV_STYLE_RES_FOUND) { + return LV_STYLE_RES_FOUND; + } + } + + for(; i < obj->style_cnt; i++) { + if((obj->styles[i].style->has_group & group) == 0) continue; + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(part_act != part) continue; + + /*Be sure the style not specifies other state than the requested. + *E.g. For HOVER+PRESS object state, HOVER style only is OK, but HOVER+FOCUS style is not*/ + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + if((state_act & state_inv)) continue; + + /*Check only better candidates*/ + if(state_act <= weight) continue; + + found = lv_style_get_prop_inlined(obj_style->style, prop, v); + if(found == LV_STYLE_RES_FOUND) { + if(state_act == state) { + return LV_STYLE_RES_FOUND; + } + weight = state_act; + } + } + + if(weight >= 0) return LV_STYLE_RES_FOUND; + else return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Refresh the style of all children of an object. (Called recursively) + * @param style refresh objects only with this + * @param obj pointer to an object + */ +static void report_style_change_core(void * style, lv_obj_t * obj) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(style == NULL || obj->styles[i].style == style) { + full_cache_refresh(obj, lv_obj_style_get_selector_part(obj->styles[i].selector)); + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + break; + } + } + + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + report_style_change_core(style, obj->spec_attr->children[i]); + } +} + +/** + * Recursively refresh the style of the children. Go deeper until a not NULL style is found + * because the NULL styles are inherited from the parent + * @param obj pointer to an object + */ +static void refresh_children_style(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_invalidate(child); + lv_obj_send_event(child, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_invalidate(child); + + refresh_children_style(child); /*Check children too*/ + } +} + +/** + * Remove the transition from object's part's property. + * - Remove the transition from `_lv_obj_style_trans_ll` and free it + * - Delete pending transitions + * @param obj pointer to an object which transition(s) should be removed + * @param part a part of object or 0xFF to remove from all parts + * @param prop a property or 0xFF to remove all properties + * @param tr_limit delete transitions only "older" than this. `NULL` if not used + */ +static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit) +{ + trans_t * tr; + trans_t * tr_prev; + bool removed = false; + tr = _lv_ll_get_tail(style_trans_ll_p); + while(tr != NULL) { + if(tr == tr_limit) break; + + /*'tr' might be deleted, so get the next object while 'tr' is valid*/ + tr_prev = _lv_ll_get_prev(style_trans_ll_p, tr); + + if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) { + /*Remove any transitioned properties from the trans. style + *to allow changing it by normal styles*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && (part == LV_PART_ANY || obj->styles[i].selector == part)) { + lv_style_remove_prop((lv_style_t *)obj->styles[i].style, tr->prop); + } + } + + /*Free the transition descriptor too*/ + lv_anim_delete(tr, NULL); + _lv_ll_remove(style_trans_ll_p, tr); + lv_free(tr); + removed = true; + + } + tr = tr_prev; + } + return removed; +} + +static void trans_anim_cb(void * _tr, int32_t v) +{ + trans_t * tr = _tr; + lv_obj_t * obj = tr->obj; + + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans == 0 || obj->styles[i].selector != tr->selector) continue; + + lv_style_value_t value_final = {0}; + switch(tr->prop) { + + case LV_STYLE_BORDER_SIDE: + case LV_STYLE_BORDER_POST: + case LV_STYLE_BLEND_MODE: + if(v < 255) value_final.num = tr->start_value.num; + else value_final.num = tr->end_value.num; + break; + case LV_STYLE_TRANSITION: + case LV_STYLE_TEXT_FONT: + if(v < 255) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_COLOR_FILTER_DSC: + if(tr->start_value.ptr == NULL) value_final.ptr = tr->end_value.ptr; + else if(tr->end_value.ptr == NULL) value_final.ptr = tr->start_value.ptr; + else if(v < 128) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_BG_COLOR: + case LV_STYLE_BG_GRAD_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_IMAGE_RECOLOR: + if(v <= 0) value_final.color = tr->start_value.color; + else if(v >= 255) value_final.color = tr->end_value.color; + else value_final.color = lv_color_mix(tr->end_value.color, tr->start_value.color, v); + break; + + default: + if(v == 0) value_final.num = tr->start_value.num; + else if(v == 255) value_final.num = tr->end_value.num; + else value_final.num = tr->start_value.num + ((int32_t)((int32_t)(tr->end_value.num - tr->start_value.num) * v) >> 8); + break; + } + + lv_style_value_t old_value = {0}; + bool refr = true; + if(lv_style_get_prop(obj->styles[i].style, tr->prop, &old_value)) { + if(value_final.ptr == old_value.ptr && lv_color_eq(value_final.color, old_value.color) && + value_final.num == old_value.num) { + refr = false; + } + } + lv_style_set_prop((lv_style_t *)obj->styles[i].style, tr->prop, value_final); + if(refr) lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); + break; + + } + +} + +static void trans_anim_start_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + + lv_part_t part = lv_obj_style_get_selector_part(tr->selector); + tr->start_value = lv_obj_get_style_prop(tr->obj, part, tr->prop); + + /*Init prop to an invalid values to be sure `trans_del` won't delete this added `tr`*/ + lv_style_prop_t prop_tmp = tr->prop; + tr->prop = LV_STYLE_PROP_INV; + + /*Delete the related transitions if any*/ + trans_delete(tr->obj, part, prop_tmp, tr); + + tr->prop = prop_tmp; + + _lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); + lv_style_set_prop((lv_style_t *)style_trans->style, tr->prop, + tr->start_value); /*Be sure `trans_style` has a valid value*/ + +} + +static void trans_anim_completed_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + lv_obj_t * obj = tr->obj; + lv_style_prop_t prop = tr->prop; + + /*Remove the transitioned property from trans. style + *if there no more transitions for this property + *It allows changing it by normal styles*/ + bool running = false; + trans_t * tr_i; + _LV_LL_READ(style_trans_ll_p, tr_i) { + if(tr_i != tr && tr_i->obj == tr->obj && tr_i->selector == tr->selector && tr_i->prop == tr->prop) { + running = true; + break; + } + } + + if(!running) { + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == tr->selector) { + _lv_ll_remove(style_trans_ll_p, tr); + lv_free(tr); + + _lv_obj_style_t * obj_style = &obj->styles[i]; + lv_style_remove_prop((lv_style_t *)obj_style->style, prop); + + if(lv_style_is_empty(obj->styles[i].style)) { + lv_obj_remove_style(obj, (lv_style_t *)obj_style->style, obj_style->selector); + + } + break; + } + } + } +} + +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) +{ + if(lv_obj_get_style_transform_rotation(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_scale_x(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_scale_y(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_skew_x(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_skew_y(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; + if(lv_obj_get_style_bitmap_mask_src(obj, 0) != NULL) return LV_LAYER_TYPE_SIMPLE; + if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; + return LV_LAYER_TYPE_NONE; +} + +static void full_cache_refresh(lv_obj_t * obj, lv_part_t part) +{ +#if LV_OBJ_STYLE_CACHE + uint32_t i; + if(part == LV_PART_MAIN || part == LV_PART_ANY) { + obj->style_main_prop_is_set = 0; + for(i = 0; i < obj->style_cnt; i++) { + if(lv_obj_style_get_selector_part(obj->styles[i].selector) != LV_PART_MAIN) continue; + lv_style_t * style = (lv_style_t *)obj->styles[i].style; + uint32_t j; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(j = 0; props[j].prop_ptr; j++) { + obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(*props[j].prop_ptr); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(j = 0; j < style->prop_cnt; j++) { + obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); + } + } + } + } + if(part != LV_PART_MAIN || part == LV_PART_ANY) { + obj->style_other_prop_is_set = 0; + for(i = 0; i < obj->style_cnt; i++) { + if(lv_obj_style_get_selector_part(obj->styles[i].selector) == LV_PART_MAIN) continue; + lv_style_t * style = (lv_style_t *)obj->styles[i].style; + uint32_t j; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(j = 0; props[j].prop_ptr; j++) { + obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(*props[j].prop_ptr); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(j = 0; j < style->prop_cnt; j++) { + obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); + } + } + } + } +#else + LV_UNUSED(obj); + LV_UNUSED(part); +#endif +} + +static void fade_anim_cb(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void fade_in_anim_completed(lv_anim_t * a) +{ + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); +} + +static bool style_has_flag(const lv_style_t * style, uint32_t flag) +{ + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + uint32_t i; + for(i = 0; props[i].prop_ptr; i++) { + if(lv_style_prop_has_flag(*props[i].prop_ptr, flag)) { + return true; + } + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(lv_style_prop_has_flag(props[i], flag)) { + return true; + } + } + } + return false; +} + +static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * value_act) +{ + lv_style_res_t found; + lv_part_t part = lv_obj_style_get_selector_part(selector); + + /*The happy path*/ +#if LV_OBJ_STYLE_CACHE + const uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); + if((part == LV_PART_MAIN ? obj->style_main_prop_is_set : obj->style_other_prop_is_set) & prop_shifted) +#endif + { + found = get_prop_core(obj, selector, prop, value_act); + if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; + } + + extern const uint8_t _lv_style_builtin_prop_flag_lookup_table[]; + bool inheritable = false; + if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS) { + inheritable = _lv_style_builtin_prop_flag_lookup_table[prop] & LV_STYLE_PROP_FLAG_INHERITABLE; + } + else { + if(_style_custom_prop_flag_lookup_table != NULL) { + inheritable = _style_custom_prop_flag_lookup_table[prop - _LV_STYLE_NUM_BUILT_IN_PROPS] & + LV_STYLE_PROP_FLAG_INHERITABLE; + } + } + + if(inheritable) { + /*If not found, check the `MAIN` style first, if already on the MAIN part go to the parent*/ + if(part != LV_PART_MAIN) part = LV_PART_MAIN; + else obj = obj->parent; + + while(obj) { +#if LV_OBJ_STYLE_CACHE + if(obj->style_main_prop_is_set & prop_shifted) +#endif + { + selector = part | obj->state; + found = get_prop_core(obj, selector, prop, value_act); + if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; + } + /*Check the parent too.*/ + obj = obj->parent; + } + } + else { + /*Get the width and height from the class. + * WIDTH and HEIGHT are not inherited so add them in the `else` to skip checking them for inherited properties */ + if(part == LV_PART_MAIN && (prop == LV_STYLE_WIDTH || prop == LV_STYLE_HEIGHT)) { + const lv_obj_class_t * cls = obj->class_p; + while(cls) { + if(prop == LV_STYLE_WIDTH) { + if(cls->width_def != 0) { + value_act->num = cls->width_def; + return LV_STYLE_RES_FOUND; + } + } + else { + if(cls->height_def != 0) { + value_act->num = cls->height_def; + return LV_STYLE_RES_FOUND; + } + } + cls = cls->base_class; + } + } + } + + return LV_STYLE_RES_NOT_FOUND; +} diff --git a/libraries/lvgl/src/core/lv_obj_style.h b/libraries/lvgl/src/core/lv_obj_style.h new file mode 100644 index 0000000..5663949 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_style.h @@ -0,0 +1,370 @@ +/** + * @file lv_obj_style.h + * + */ + +#ifndef LV_OBJ_STYLE_H +#define LV_OBJ_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../misc/lv_bidi.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Can't include lv_obj.h because it includes this header file*/ + +#ifndef LV_OBJ_H +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef uint32_t lv_part_t; +typedef uint16_t lv_state_t; +/// @endcond + +#endif + +typedef enum { + _LV_STYLE_STATE_CMP_SAME, /*The style properties in the 2 states are identical*/ + _LV_STYLE_STATE_CMP_DIFF_REDRAW, /*The differences can be shown with a simple redraw*/ + _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /*The differences can be shown with a simple redraw*/ + _LV_STYLE_STATE_CMP_DIFF_LAYOUT, /*The differences can be shown with a simple redraw*/ +} _lv_style_state_cmp_t; + +typedef uint32_t lv_style_selector_t; + +typedef struct { + const lv_style_t * style; + uint32_t selector : 24; + uint32_t is_local : 1; + uint32_t is_trans : 1; +} _lv_obj_style_t; + +typedef struct { + uint16_t time; + uint16_t delay; + lv_style_selector_t selector; + lv_style_prop_t prop; + lv_anim_path_cb_t path_cb; + void * user_data; +} _lv_obj_style_transition_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the object related style manager module. + * Called by LVGL in `lv_init()` + */ +void _lv_obj_style_init(void); + +/** + * Deinitialize the object related style manager module. + * Called by LVGL in `lv_deinit()` + */ +void _lv_obj_style_deinit(void); + +/** + * Add a style to an object. + * @param obj pointer to an object + * @param style pointer to a style to add + * @param selector OR-ed value of parts and state to which the style should be added + * @example lv_obj_add_style(btn, &style_btn, 0); //Default button style + * @example lv_obj_add_style(btn, &btn_red, LV_STATE_PRESSED); //Overwrite only some colors to red when pressed + */ +void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); + +/** + * Replaces a style of an object, preserving the order of the style stack (local styles and transitions are ignored). + * @param obj pointer to an object + * @param old_style pointer to a style to replace. + * @param new_style pointer to a style to replace the old style with. + * @param selector OR-ed values of states and a part to replace only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used + * @example lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_ANY | LV_STATE_ANY); //Replace a specific style + * @example lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_MAIN | LV_STATE_PRESSED); //Replace a specific style assigned to the main part when it is pressed + */ +bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, + lv_style_selector_t selector); + +/** + * Remove a style from an object. + * @param obj pointer to an object + * @param style pointer to a style to remove. Can be NULL to check only the selector + * @param selector OR-ed values of states and a part to remove only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used + * @example lv_obj_remove_style(obj, &style, LV_PART_ANY | LV_STATE_ANY); //Remove a specific style + * @example lv_obj_remove_style(obj, NULL, LV_PART_MAIN | LV_STATE_ANY); //Remove all styles from the main part + * @example lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); //Remove all styles + */ +void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); + +/** + * Remove all styles from an object + * @param obj pointer to an object + */ +void lv_obj_remove_style_all(lv_obj_t * obj); + +/** + * Notify all object if a style is modified + * @param style pointer to a style. Only the objects with this style will be notified + * (NULL to notify all objects) + */ +void lv_obj_report_style_change(lv_style_t * style); + +/** + * Notify an object and its children about its style is modified. + * @param obj pointer to an object + * @param part the part whose style was changed. E.g. `LV_PART_ANY`, `LV_PART_MAIN` + * @param prop `LV_STYLE_PROP_ANY` or an `LV_STYLE_...` property. + * It is used to optimize what needs to be refreshed. + * `LV_STYLE_PROP_INV` to perform only a style cache update + */ +void lv_obj_refresh_style(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Enable or disable automatic style refreshing when a new style is added/removed to/from an object + * or any other style change happens. + * @param en true: enable refreshing; false: disable refreshing + */ +void lv_obj_enable_style_refresh(bool en); + +/** + * Get the value of a style property. The current state of the object will be considered. + * Inherited properties will be inherited. + * If a property is not set a default value will be returned. + * @param obj pointer to an object + * @param part a part from which the property should be get + * @param prop the property to get + * @return the value of the property. + * Should be read from the correct field of the `lv_style_value_t` according to the type of the property. + */ +lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Check if an object has a specified style property for a given style selector. + * @param obj pointer to an object + * @param selector the style selector to be checked, defining the scope of the style to be examined. + * @param prop the property to be checked. + * @return true if the object has the specified selector and property, false otherwise. + */ +bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop); + +/** + * Set local style property on an object's part and state. + * @param obj pointer to an object + * @param prop the property + * @param value value of the property. The correct element should be set according to the type of the property + * @param selector OR-ed value of parts and state for which the style should be set + */ +void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector); + +lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector); + +/** + * Remove a local style property from a part of an object with a given state. + * @param obj pointer to an object + * @param prop a style property to remove. + * @param selector OR-ed value of parts and state for which the style should be removed + * @return true the property was found and removed; false: the property was not found + */ +bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector); + +/** + * Used internally for color filtering + */ +lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v); + +/** + * Used internally to create a style transition + * @param obj + * @param part + * @param prev_state + * @param new_state + * @param tr + */ +void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, + lv_state_t new_state, const _lv_obj_style_transition_dsc_t * tr); + +/** + * Used internally to compare the appearance of an object in 2 states + * @param obj + * @param state1 + * @param state2 + * @return + */ +_lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2); + +/** + * Fade in an an object and all its children. + * @param obj the object to fade in + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay); + +/** + * Fade out an an object and all its children. + * @param obj the object to fade out + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay); + +static inline lv_state_t lv_obj_style_get_selector_state(lv_style_selector_t selector) +{ + return selector & 0xFFFF; +} + +static inline lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector) +{ + return selector & 0xFF0000; +} + +#include "lv_obj_style_gen.h" + +static inline void lv_obj_set_style_pad_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_left(obj, value, selector); + lv_obj_set_style_margin_right(obj, value, selector); + lv_obj_set_style_margin_top(obj, value, selector); + lv_obj_set_style_margin_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_left(obj, value, selector); + lv_obj_set_style_margin_right(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_top(obj, value, selector); + lv_obj_set_style_margin_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_row(obj, value, selector); + lv_obj_set_style_pad_column(obj, value, selector); +} + +static inline void lv_obj_set_style_size(lv_obj_t * obj, int32_t width, int32_t height, + lv_style_selector_t selector) +{ + lv_obj_set_style_width(obj, width, selector); + lv_obj_set_style_height(obj, height, selector); +} + +static inline void lv_obj_set_style_transform_scale(lv_obj_t * obj, int32_t value, + lv_style_selector_t selector) +{ + lv_obj_set_style_transform_scale_x(obj, value, selector); + lv_obj_set_style_transform_scale_y(obj, value, selector); +} + +static inline int32_t lv_obj_get_style_space_left(const lv_obj_t * obj, uint32_t part) +{ + int32_t padding = lv_obj_get_style_pad_left(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_LEFT) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_right(const lv_obj_t * obj, uint32_t part) +{ + int32_t padding = lv_obj_get_style_pad_right(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_RIGHT) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_top(const lv_obj_t * obj, uint32_t part) +{ + int32_t padding = lv_obj_get_style_pad_top(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_TOP) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_bottom(const lv_obj_t * obj, uint32_t part) +{ + int32_t padding = lv_obj_get_style_pad_bottom(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_BOTTOM) ? padding + border_width : padding; +} + +lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt); + +static inline int32_t lv_obj_get_style_transform_scale_x_safe(const lv_obj_t * obj, uint32_t part) +{ + int16_t zoom = lv_obj_get_style_transform_scale_x(obj, part); + return zoom != 0 ? zoom : 1; +} + +static inline int32_t lv_obj_get_style_transform_scale_y_safe(const lv_obj_t * obj, uint32_t part) +{ + int16_t zoom = lv_obj_get_style_transform_scale_y(obj, part); + return zoom != 0 ? zoom : 1; +} + +/** + * Get the `opa` style property from all parents and multiply and `>> 8` them. + * @param obj the object whose opacity should be get + * @param part the part whose opacity should be get. Non-MAIN parts will consider the `opa` of the MAIN part too + * @return the final opacity considering the parents' opacity too + */ +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part); + +/** + * Update the layer type of a widget bayed on its current styles. + * The result will be stored in `obj->spec_attr->layer_type` + * @param obj the object whose layer should be updated + */ +void _lv_obj_update_layer_type(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_STYLE_H*/ diff --git a/libraries/lvgl/src/core/lv_obj_style_gen.c b/libraries/lvgl/src/core/lv_obj_style_gen.c new file mode 100644 index 0000000..f9b21e8 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_style_gen.c @@ -0,0 +1,897 @@ + +/* + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#include "lv_obj.h" + + +void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_WIDTH, v, selector); +} + +void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_WIDTH, v, selector); +} + +void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_WIDTH, v, selector); +} + +void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_HEIGHT, v, selector); +} + +void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_HEIGHT, v, selector); +} + +void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_HEIGHT, v, selector); +} + +void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LENGTH, v, selector); +} + +void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_X, v, selector); +} + +void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_Y, v, selector); +} + +void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ALIGN, v, selector); +} + +void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_WIDTH, v, selector); +} + +void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_HEIGHT, v, selector); +} + +void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_X, v, selector); +} + +void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_Y, v, selector); +} + +void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_X, v, selector); +} + +void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_Y, v, selector); +} + +void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ROTATION, v, selector); +} + +void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_X, v, selector); +} + +void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_Y, v, selector); +} + +void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_X, v, selector); +} + +void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_Y, v, selector); +} + +void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_TOP, v, selector); +} + +void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_BOTTOM, v, selector); +} + +void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_LEFT, v, selector); +} + +void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_RIGHT, v, selector); +} + +void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_ROW, v, selector); +} + +void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_COLUMN, v, selector); +} + +void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_TOP, v, selector); +} + +void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_BOTTOM, v, selector); +} + +void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_LEFT, v, selector); +} + +void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_RIGHT, v, selector); +} + +void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR, v, selector); +} + +void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR, v, selector); +} + +void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_DIR, v, selector); +} + +void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_STOP, v, selector); +} + +void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_STOP, v, selector); +} + +void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); +} + +void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_SRC, v, selector); +} + +void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_OPA, v, selector); +} + +void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR, v, selector); +} + +void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_TILED, v, selector); +} + +void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR, v, selector); +} + +void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_OPA, v, selector); +} + +void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_WIDTH, v, selector); +} + +void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_SIDE, v, selector); +} + +void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_POST, v, selector); +} + +void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_WIDTH, v, selector); +} + +void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR, v, selector); +} + +void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_OPA, v, selector); +} + +void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_PAD, v, selector); +} + +void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_WIDTH, v, selector); +} + +void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_X, v, selector); +} + +void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_Y, v, selector); +} + +void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_SPREAD, v, selector); +} + +void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR, v, selector); +} + +void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OPA, v, selector); +} + +void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_OPA, v, selector); +} + +void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR, v, selector); +} + +void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_GAP, v, selector); +} + +void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_ROUNDED, v, selector); +} + +void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR, v, selector); +} + +void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_OPA, v, selector); +} + +void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_WIDTH, v, selector); +} + +void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_ROUNDED, v, selector); +} + +void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR, v, selector); +} + +void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_OPA, v, selector); +} + +void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_IMAGE_SRC, v, selector); +} + +void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR, v, selector); +} + +void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OPA, v, selector); +} + +void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_FONT, v, selector); +} + +void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LETTER_SPACE, v, selector); +} + +void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LINE_SPACE, v, selector); +} + +void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_DECOR, v, selector); +} + +void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_ALIGN, v, selector); +} + +void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RADIUS, v, selector); +} + +void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_CLIP_CORNER, v, selector); +} + +void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); +} + +void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); +} + +void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_DSC, v, selector); +} + +void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_OPA, v, selector); +} + +void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM, v, selector); +} + +void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_DURATION, v, selector); +} + +void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSITION, v, selector); +} + +void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLEND_MODE, v, selector); +} + +void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LAYOUT, v, selector); +} + +void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BASE_DIR, v, selector); +} + +void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const lv_image_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BITMAP_MASK_SRC, v, selector); +} + +void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ROTARY_SENSITIVITY, v, selector); +} +#if LV_USE_FLEX + +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_FLOW, v, selector); +} + +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_MAIN_PLACE, v, selector); +} + +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_CROSS_PLACE, v, selector); +} + +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_TRACK_PLACE, v, selector); +} + +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_GROW, v, selector); +} +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID + +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v, selector); +} + +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_DSC_ARRAY, v, selector); +} + +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_X_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_SPAN, v, selector); +} + +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_Y_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_SPAN, v, selector); +} +#endif /*LV_USE_GRID*/ + diff --git a/libraries/lvgl/src/core/lv_obj_style_gen.h b/libraries/lvgl/src/core/lv_obj_style_gen.h new file mode 100644 index 0000000..c3bd107 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_style_gen.h @@ -0,0 +1,868 @@ + +/* + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#ifndef LV_OBJ_STYLE_GEN_H +#define LV_OBJ_STYLE_GEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" +#include "../core/lv_obj_style.h" + +static inline int32_t lv_obj_get_style_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_min_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_max_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_height(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_HEIGHT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_min_height(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_HEIGHT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_max_height(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_HEIGHT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_length(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LENGTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_Y); + return (int32_t)v.num; +} + +static inline lv_align_t lv_obj_get_style_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ALIGN); + return (lv_align_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_height(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_HEIGHT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_translate_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_translate_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_Y); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_scale_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_scale_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_Y); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_rotation(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_ROTATION); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_pivot_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_pivot_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_Y); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_skew_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_transform_skew_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_Y); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_top(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_TOP); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_bottom(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_BOTTOM); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_left(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_LEFT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_right(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_RIGHT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_row(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_ROW); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_pad_column(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_COLUMN); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_margin_top(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_TOP); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_margin_bottom(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_BOTTOM); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_margin_left(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_LEFT); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_margin_right(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_RIGHT); + return (int32_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_bg_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_grad_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR)); + return v.color; +} + +static inline lv_grad_dir_t lv_obj_get_style_bg_grad_dir(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_DIR); + return (lv_grad_dir_t)v.num; +} + +static inline int32_t lv_obj_get_style_bg_main_stop(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_STOP); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_bg_grad_stop(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_STOP); + return (int32_t)v.num; +} + +static inline lv_opa_t lv_obj_get_style_bg_main_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_opa_t lv_obj_get_style_bg_grad_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); + return (const lv_grad_dsc_t *)v.ptr; +} + +static inline const void * lv_obj_get_style_bg_image_src(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_SRC); + return (const void *)v.ptr; +} + +static inline lv_opa_t lv_obj_get_style_bg_image_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_bg_image_recolor(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_bg_image_recolor_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +static inline bool lv_obj_get_style_bg_image_tiled(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_TILED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_border_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_border_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_border_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_OPA); + return (lv_opa_t)v.num; +} + +static inline int32_t lv_obj_get_style_border_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_WIDTH); + return (int32_t)v.num; +} + +static inline lv_border_side_t lv_obj_get_style_border_side(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_SIDE); + return (lv_border_side_t)v.num; +} + +static inline bool lv_obj_get_style_border_post(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_POST); + return (bool)v.num; +} + +static inline int32_t lv_obj_get_style_outline_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_WIDTH); + return (int32_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_outline_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_outline_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_outline_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_OPA); + return (lv_opa_t)v.num; +} + +static inline int32_t lv_obj_get_style_outline_pad(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_PAD); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_shadow_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_shadow_offset_x(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_X); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_shadow_offset_y(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_Y); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_shadow_spread(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_SPREAD); + return (int32_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_shadow_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_shadow_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_opa_t lv_obj_get_style_image_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_color_t lv_obj_get_style_image_recolor(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_image_recolor_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +static inline int32_t lv_obj_get_style_line_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_line_dash_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_WIDTH); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_line_dash_gap(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_GAP); + return (int32_t)v.num; +} + +static inline bool lv_obj_get_style_line_rounded(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_ROUNDED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_line_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_line_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_line_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_OPA); + return (lv_opa_t)v.num; +} + +static inline int32_t lv_obj_get_style_arc_width(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_WIDTH); + return (int32_t)v.num; +} + +static inline bool lv_obj_get_style_arc_rounded(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_ROUNDED); + return (bool)v.num; +} + +static inline lv_color_t lv_obj_get_style_arc_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_arc_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_arc_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_OPA); + return (lv_opa_t)v.num; +} + +static inline const void * lv_obj_get_style_arc_image_src(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_IMAGE_SRC); + return (const void *)v.ptr; +} + +static inline lv_color_t lv_obj_get_style_text_color(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR); + return v.color; +} + +static inline lv_color_t lv_obj_get_style_text_color_filtered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); + return v.color; +} + +static inline lv_opa_t lv_obj_get_style_text_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_font_t * lv_obj_get_style_text_font(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_FONT); + return (const lv_font_t *)v.ptr; +} + +static inline int32_t lv_obj_get_style_text_letter_space(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LETTER_SPACE); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_text_line_space(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LINE_SPACE); + return (int32_t)v.num; +} + +static inline lv_text_decor_t lv_obj_get_style_text_decor(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_DECOR); + return (lv_text_decor_t)v.num; +} + +static inline lv_text_align_t lv_obj_get_style_text_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_ALIGN); + return (lv_text_align_t)v.num; +} + +static inline int32_t lv_obj_get_style_radius(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RADIUS); + return (int32_t)v.num; +} + +static inline bool lv_obj_get_style_clip_corner(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_CLIP_CORNER); + return (bool)v.num; +} + +static inline lv_opa_t lv_obj_get_style_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA); + return (lv_opa_t)v.num; +} + +static inline lv_opa_t lv_obj_get_style_opa_layered(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA_LAYERED); + return (lv_opa_t)v.num; +} + +static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); + return (const lv_color_filter_dsc_t *)v.ptr; +} + +static inline lv_opa_t lv_obj_get_style_color_filter_opa(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_OPA); + return (lv_opa_t)v.num; +} + +static inline const lv_anim_t * lv_obj_get_style_anim(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM); + return (const lv_anim_t *)v.ptr; +} + +static inline uint32_t lv_obj_get_style_anim_duration(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_DURATION); + return (uint32_t)v.num; +} + +static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSITION); + return (const lv_style_transition_dsc_t *)v.ptr; +} + +static inline lv_blend_mode_t lv_obj_get_style_blend_mode(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLEND_MODE); + return (lv_blend_mode_t)v.num; +} + +static inline uint16_t lv_obj_get_style_layout(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LAYOUT); + return (uint16_t)v.num; +} + +static inline lv_base_dir_t lv_obj_get_style_base_dir(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BASE_DIR); + return (lv_base_dir_t)v.num; +} + +static inline const lv_image_dsc_t * lv_obj_get_style_bitmap_mask_src(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BITMAP_MASK_SRC); + return (const lv_image_dsc_t *)v.ptr; +} + +static inline uint32_t lv_obj_get_style_rotary_sensitivity(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ROTARY_SENSITIVITY); + return (uint32_t)v.num; +} + +#if LV_USE_FLEX +static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW); + return (lv_flex_flow_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_MAIN_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_CROSS_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline lv_flex_align_t lv_obj_get_style_flex_track_place(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_TRACK_PLACE); + return (lv_flex_align_t)v.num; +} + +static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_GROW); + return (uint8_t)v.num; +} + +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID +static inline const int32_t * lv_obj_get_style_grid_column_dsc_array(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_DSC_ARRAY); + return (const int32_t *)v.ptr; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_column_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline const int32_t * lv_obj_get_style_grid_row_dsc_array(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_DSC_ARRAY); + return (const int32_t *)v.ptr; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_row_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline int32_t lv_obj_get_style_grid_cell_column_pos(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_POS); + return (int32_t)v.num; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_cell_x_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_X_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline int32_t lv_obj_get_style_grid_cell_column_span(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_SPAN); + return (int32_t)v.num; +} + +static inline int32_t lv_obj_get_style_grid_cell_row_pos(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_POS); + return (int32_t)v.num; +} + +static inline lv_grid_align_t lv_obj_get_style_grid_cell_y_align(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_Y_ALIGN); + return (lv_grid_align_t)v.num; +} + +static inline int32_t lv_obj_get_style_grid_cell_row_span(const lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_SPAN); + return (int32_t)v.num; +} + +#endif /*LV_USE_GRID*/ + +void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); +void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector); +void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); +void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector); +void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector); +void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector); +void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); +void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); +void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector); +void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector); +void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector); +void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const lv_image_dsc_t * value, lv_style_selector_t selector); +void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); +#if LV_USE_FLEX +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector); +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); +#endif /*LV_USE_GRID*/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_OBJ_STYLE_GEN_H */ diff --git a/libraries/lvgl/src/core/lv_obj_tree.c b/libraries/lvgl/src/core/lv_obj_tree.c new file mode 100644 index 0000000..5b8fd42 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_tree.c @@ -0,0 +1,659 @@ +/** + * @file lv_obj_tree.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_obj.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_async.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) + +#define OBJ_DUMP_STRING_LEN 128 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_delete_async_cb(void * obj); +static void obj_delete_core(lv_obj_t * obj); +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data); +static lv_obj_tree_walk_res_t dump_tree_core(lv_obj_t * obj, int32_t depth); +static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_delete(lv_obj_t * obj) +{ + if(obj->is_deleting) + return; + + LV_LOG_TRACE("begin (delete %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_invalidate(obj); + + lv_obj_t * par = lv_obj_get_parent(obj); + + lv_display_t * disp = NULL; + bool act_screen_del = false; + if(par == NULL) { + disp = lv_obj_get_display(obj); + if(!disp) return; /*Shouldn't happen*/ + if(disp->act_scr == obj) act_screen_del = true; + } + + obj_delete_core(obj); + + /*Call the ancestor's event handler to the parent to notify it about the child delete*/ + if(par && !par->is_deleting) { + lv_obj_scrollbar_invalidate(par); + lv_obj_send_event(par, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_send_event(par, LV_EVENT_CHILD_DELETED, NULL); + } + + /*Handle if the active screen was deleted*/ + if(act_screen_del) { + LV_LOG_WARN("the active screen was deleted"); + disp->act_scr = NULL; + } + + LV_ASSERT_MEM_INTEGRITY(); + LV_LOG_TRACE("finished (delete %p)", (void *)obj); +} + +void lv_obj_clean(lv_obj_t * obj) +{ + LV_LOG_TRACE("begin (clean %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + uint32_t cnt = lv_obj_get_child_count(obj); + lv_obj_t * child = lv_obj_get_first_not_deleting_child(obj); + while(child) { + obj_delete_core(child); + child = lv_obj_get_first_not_deleting_child(obj); + } + /*Just to remove scroll animations if any*/ + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); + if(obj->spec_attr) { + obj->spec_attr->scroll.x = 0; + obj->spec_attr->scroll.y = 0; + } + + if(lv_obj_get_child_count(obj) < cnt) { + lv_obj_send_event(obj, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_send_event(obj, LV_EVENT_CHILD_DELETED, NULL); + } + + LV_ASSERT_MEM_INTEGRITY(); + + LV_LOG_TRACE("finished (clean %p)", (void *)obj); +} + +void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, NULL); + lv_anim_set_duration(&a, 1); + lv_anim_set_delay(&a, delay_ms); + lv_anim_set_completed_cb(&a, lv_obj_delete_anim_completed_cb); + lv_anim_start(&a); +} + +void lv_obj_delete_anim_completed_cb(lv_anim_t * a) +{ + lv_obj_delete(a->var); +} + +void lv_obj_delete_async(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_async_call(lv_obj_delete_async_cb, obj); +} + +void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_OBJ(parent, MY_CLASS); + + if(obj->parent == NULL) { + LV_LOG_WARN("Can't set the parent of a screen"); + return; + } + + if(parent == NULL) { + LV_LOG_WARN("Can't set parent == NULL to an object"); + return; + } + + lv_obj_invalidate(obj); + + lv_obj_allocate_spec_attr(parent); + + lv_obj_t * old_parent = obj->parent; + /*Remove the object from the old parent's child list*/ + int32_t i; + for(i = lv_obj_get_index(obj); i <= (int32_t)lv_obj_get_child_count(old_parent) - 2; i++) { + old_parent->spec_attr->children[i] = old_parent->spec_attr->children[i + 1]; + } + old_parent->spec_attr->child_cnt--; + if(old_parent->spec_attr->child_cnt) { + old_parent->spec_attr->children = lv_realloc(old_parent->spec_attr->children, + old_parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + } + else { + lv_free(old_parent->spec_attr->children); + old_parent->spec_attr->children = NULL; + } + + /*Add the child to the new parent as the last (newest child)*/ + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_realloc(parent->spec_attr->children, + parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + parent->spec_attr->children[lv_obj_get_child_count(parent) - 1] = obj; + + obj->parent = parent; + + /*Notify the original parent because one of its children is lost*/ + lv_obj_scrollbar_invalidate(old_parent); + lv_obj_send_event(old_parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(old_parent, LV_EVENT_CHILD_DELETED, NULL); + + /*Notify the new parent about the child*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, NULL); + + lv_obj_mark_layout_as_dirty(obj); + + lv_obj_invalidate(obj); +} + +void lv_obj_move_to_index(lv_obj_t * obj, int32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /* Check parent validity */ + lv_obj_t * parent = lv_obj_get_parent(obj); + if(!parent) { + LV_LOG_WARN("parent is NULL"); + return; + } + + const uint32_t parent_child_count = lv_obj_get_child_count(parent); + /* old_index only can be 0 or greater, this point can not be reached if the parent is not null */ + const int32_t old_index = lv_obj_get_index(obj); + LV_ASSERT(0 <= old_index); + + if(index < 0) { + index += parent_child_count; + } + + /* Index was negative and the absolute value is greater than parent child count */ + if((index < 0) + /* Index is same or bigger than parent child count */ + || (index >= (int32_t) parent_child_count) + /* If both previous and new index are the same */ + || (index == old_index)) { + + return; + } + + int32_t i = old_index; + if(index < old_index) { + while(i > index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i - 1]; + i--; + } + } + else { + while(i < index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i + 1]; + i++; + } + } + + parent->spec_attr->children[index] = obj; + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_invalidate(parent); +} + +void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2) +{ + LV_ASSERT_OBJ(obj1, MY_CLASS); + LV_ASSERT_OBJ(obj2, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj1); + lv_obj_t * parent2 = lv_obj_get_parent(obj2); + + uint_fast32_t index1 = lv_obj_get_index(obj1); + uint_fast32_t index2 = lv_obj_get_index(obj2); + + lv_obj_send_event(parent2, LV_EVENT_CHILD_DELETED, obj2); + lv_obj_send_event(parent, LV_EVENT_CHILD_DELETED, obj1); + + parent->spec_attr->children[index1] = obj2; + obj2->parent = parent; + + parent2->spec_attr->children[index2] = obj1; + obj1->parent = parent2; + + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj2); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj2); + lv_obj_send_event(parent2, LV_EVENT_CHILD_CHANGED, obj1); + lv_obj_send_event(parent2, LV_EVENT_CHILD_CREATED, obj1); + + lv_obj_invalidate(parent); + + if(parent != parent2) { + lv_obj_invalidate(parent2); + } + lv_group_swap_obj(obj1, obj2); +} + +lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * par = obj; + const lv_obj_t * act_par; + + do { + act_par = par; + par = lv_obj_get_parent(act_par); + } while(par != NULL); + + return (lv_obj_t *)act_par; +} + +lv_display_t * lv_obj_get_display(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * scr; + + if(obj->parent == NULL) scr = obj; /*`obj` is a screen*/ + else scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ + + lv_display_t * d; + lv_ll_t * disp_head = disp_ll_p; + _LV_LL_READ(disp_head, d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + if(d->screens[i] == scr) return d; + } + } + + LV_LOG_WARN("No screen found"); + return NULL; +} + +lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) +{ + if(obj == NULL) return NULL; + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->parent; +} + +lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + uint32_t idu; + if(idx < 0) { + idx = obj->spec_attr->child_cnt + idx; + if(idx < 0) return NULL; + idu = (uint32_t) idx; + } + else { + idu = idx; + } + + if(idu >= obj->spec_attr->child_cnt) return NULL; + else return obj->spec_attr->children[idx]; +} + +lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + int32_t i; + int32_t cnt = (int32_t)obj->spec_attr->child_cnt; + if(idx >= 0) { + for(i = 0; i < cnt; i++) { + if(obj->spec_attr->children[i]->class_p == class_p) { + if(idx == 0) return obj->spec_attr->children[i]; + else idx--; + } + } + } + else { + idx++; /*-1 means the first child*/ + for(i = cnt - 1; i >= 0; i--) { + if(obj->spec_attr->children[i]->class_p == class_p) { + if(idx == 0) return obj->spec_attr->children[i]; + else idx++; + } + } + } + return NULL; +} + +lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx) +{ + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t sibling_idx = (int32_t)lv_obj_get_index(obj) + idx; + if(sibling_idx < 0) return NULL; + + return lv_obj_get_child(parent, sibling_idx); +} + +lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t sibling_idx = (int32_t)lv_obj_get_index_by_type(obj, class_p) + idx; + if(sibling_idx < 0) return NULL; + + return lv_obj_get_child(parent, sibling_idx); +} + +uint32_t lv_obj_get_child_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->child_cnt; +} + +uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return 0; + + uint32_t i; + uint32_t cnt = 0; + for(i = 0; i < obj->spec_attr->child_cnt; i++) { + if(obj->spec_attr->children[i]->class_p == class_p) cnt++; + } + return cnt; +} + +int32_t lv_obj_get_index(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return -1; + + int32_t i = 0; + for(i = 0; i < parent->spec_attr->child_cnt; i++) { + if(parent->spec_attr->children[i] == obj) return i; + } + + /*Shouldn't reach this point*/ + LV_ASSERT(0); + return -1; +} + +int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return 0xFFFFFFFF; + + uint32_t i = 0; + uint32_t idx = 0; + for(i = 0; i < parent->spec_attr->child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(child->class_p == class_p) { + if(child == obj) return idx; + idx++; + } + } + + /*Can happen if there was no children with the given type*/ + return -1; +} + +void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + walk_core(start_obj, cb, user_data); +} + +void lv_obj_dump_tree(lv_obj_t * start_obj) +{ + if(start_obj == NULL) { + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + dump_tree_core(disp->screens[i], 0); + } + disp = lv_display_get_next(disp); + } + } + else { + dump_tree_core(start_obj, 0); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_delete_async_cb(void * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_delete(obj); +} + +static void obj_indev_reset(lv_indev_t * indev, lv_obj_t * obj) +{ + /*Wait for release to avoid accidentally triggering other obj to be clicked*/ + lv_indev_wait_release(indev); + + /*Reset the input device*/ + lv_indev_reset(indev, obj); +} + +static void obj_delete_core(lv_obj_t * obj) +{ + if(obj->is_deleting) + return; + + obj->is_deleting = true; + + /*Let the user free the resources used in `LV_EVENT_DELETE`*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); + if(res == LV_RESULT_INVALID) { + obj->is_deleting = false; + return; + } + + /*Clean registered event_cb*/ + if(obj->spec_attr) lv_event_remove_all(&(obj->spec_attr->event_list)); + + /*Recursively delete the children*/ + lv_obj_t * child = lv_obj_get_child(obj, 0); + while(child) { + obj_delete_core(child); + child = lv_obj_get_child(obj, 0); + } + + lv_group_t * group = lv_obj_get_group(obj); + + /*Reset all input devices if the object to delete is used*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + if(indev->pointer.act_obj == obj || indev->pointer.last_obj == obj || indev->pointer.scroll_obj == obj) { + obj_indev_reset(indev, obj); + } + if(indev->pointer.last_pressed == obj) { + indev->pointer.last_pressed = NULL; + } + } + + if(indev->group == group && obj == lv_indev_get_active_obj()) { + obj_indev_reset(indev, obj); + } + indev = lv_indev_get_next(indev); + } + + /*Delete all pending async del-s*/ + lv_result_t async_cancel_res = LV_RESULT_OK; + while(async_cancel_res == LV_RESULT_OK) { + async_cancel_res = lv_async_call_cancel(lv_obj_delete_async_cb, obj); + } + + /*All children deleted. Now clean up the object specific data*/ + _lv_obj_destruct(obj); + + /*Remove the screen for the screen list*/ + if(obj->parent == NULL) { + lv_display_t * disp = lv_obj_get_display(obj); + uint32_t i; + /*Find the screen in the list*/ + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) break; + } + + uint32_t id = i; + for(i = id; i < disp->screen_cnt - 1; i++) { + disp->screens[i] = disp->screens[i + 1]; + } + disp->screen_cnt--; + disp->screens = lv_realloc(disp->screens, disp->screen_cnt * sizeof(lv_obj_t *)); + } + /*Remove the object from the child list of its parent*/ + else { + int32_t id = lv_obj_get_index(obj); + uint16_t i; + for(i = id; i < obj->parent->spec_attr->child_cnt - 1; i++) { + obj->parent->spec_attr->children[i] = obj->parent->spec_attr->children[i + 1]; + } + obj->parent->spec_attr->child_cnt--; + obj->parent->spec_attr->children = lv_realloc(obj->parent->spec_attr->children, + obj->parent->spec_attr->child_cnt * sizeof(lv_obj_t *)); + } + + /*Free the object itself*/ + lv_free(obj); +} + +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + lv_obj_tree_walk_res_t res = LV_OBJ_TREE_WALK_NEXT; + + if(obj == NULL) { + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + walk_core(disp->screens[i], cb, user_data); + } + disp = lv_display_get_next(disp); + } + return LV_OBJ_TREE_WALK_END; /*The value doesn't matter as it wasn't called recursively*/ + } + + res = cb(obj, user_data); + + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + + if(res != LV_OBJ_TREE_WALK_SKIP_CHILDREN) { + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(obj); i++) { + res = walk_core(lv_obj_get_child(obj, i), cb, user_data); + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + } + } + return LV_OBJ_TREE_WALK_NEXT; +} + +static lv_obj_tree_walk_res_t dump_tree_core(lv_obj_t * obj, int32_t depth) +{ + lv_obj_tree_walk_res_t res; + +#if LV_USE_LOG + const char * id; + +#if LV_USE_OBJ_ID + char buf[OBJ_DUMP_STRING_LEN]; + id = lv_obj_stringify_id(obj, buf, sizeof(buf)); + if(id == NULL) id = "obj0"; +#else + id = "obj0"; +#endif + + /*id of `obj0` is an invalid id for builtin id*/ + LV_LOG_USER("parent:%p, obj:%p, id:%s;", (void *)(obj ? obj->parent : NULL), (void *)obj, id); +#endif /*LV_USE_LOG*/ + + if(obj && obj->spec_attr && obj->spec_attr->child_cnt) { + for(uint32_t i = 0; i < obj->spec_attr->child_cnt; i++) { + res = dump_tree_core(lv_obj_get_child(obj, i), depth + 1); + if(res == LV_OBJ_TREE_WALK_END) + break; + } + return LV_OBJ_TREE_WALK_NEXT; + } + else { + return LV_OBJ_TREE_WALK_END; + } +} + +static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + int32_t i; + int32_t cnt = (int32_t)obj->spec_attr->child_cnt; + for(i = 0; i < cnt; i++) { + if(!obj->spec_attr->children[i]->is_deleting) { + return obj->spec_attr->children[i]; + } + } + + return NULL; +} diff --git a/libraries/lvgl/src/core/lv_obj_tree.h b/libraries/lvgl/src/core/lv_obj_tree.h new file mode 100644 index 0000000..c500c79 --- /dev/null +++ b/libraries/lvgl/src/core/lv_obj_tree.h @@ -0,0 +1,239 @@ +/** + * @file struct _lv_obj_tree.h + * + */ + +#ifndef LV_OBJ_TREE_H +#define LV_OBJ_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../misc/lv_types.h" +#include "../misc/lv_anim.h" +#include "../display/lv_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_OBJ_TREE_WALK_NEXT, + LV_OBJ_TREE_WALK_SKIP_CHILDREN, + LV_OBJ_TREE_WALK_END, +} lv_obj_tree_walk_res_t; + +typedef lv_obj_tree_walk_res_t (*lv_obj_tree_walk_cb_t)(lv_obj_t *, void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Delete an object and all of its children. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETED` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_delete(lv_obj_t * obj); + +/** + * Delete all children of an object. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETED` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_clean(lv_obj_t * obj); + +/** + * Delete an object after some delay + * @param obj pointer to an object + * @param delay_ms time to wait before delete in milliseconds + */ +void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms); + +/** + * A function to be easily used in animation ready callback to delete an object when the animation is ready + * @param a pointer to the animation + */ +void lv_obj_delete_anim_completed_cb(lv_anim_t * a); + +/** + * Helper function for asynchronously deleting objects. + * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). + * @param obj object to delete + * @see lv_async_call + */ +void lv_obj_delete_async(lv_obj_t * obj); + +/** + * Move the parent of an object. The relative coordinates will be kept. + * + * @param obj pointer to an object whose parent needs to be changed + * @param parent pointer to the new parent + */ +void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent); + +/** + * Swap the positions of two objects. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj1 pointer to the first object + * @param obj2 pointer to the second object + */ +void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2); + +/** + * moves the object to the given index in its parent. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj pointer to the object to be moved. + * @param index new index in parent. -1 to count from the back + * @note to move to the background: lv_obj_move_to_index(obj, 0) + * @note to move forward (up): lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1) + */ +void lv_obj_move_to_index(lv_obj_t * obj, int32_t index); + +/** + * Get the screen of an object + * @param obj pointer to an object + * @return pointer to the object's screen + */ +lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj); + +/** + * Get the display of the object + * @param obj pointer to an object + * @return pointer to the object's display + */ +lv_display_t * lv_obj_get_display(const lv_obj_t * obj); + +/** + * Get the parent of an object + * @param obj pointer to an object + * @return the parent of the object. (NULL if `obj` was a screen) + */ +lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj); + +/** + * Get the child of an object by the child's index. + * @param obj pointer to an object whose child should be get + * @param idx the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return pointer to the child or NULL if the index was invalid + */ +lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx); + +/** + * Get the child of an object by the child's index. Consider the children only with a given type. + * @param obj pointer to an object whose child should be get + * @param idx the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @param class_p the type of the children to check + * @return pointer to the child or NULL if the index was invalid + */ +lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, + const lv_obj_class_t * class_p); + +/** + * Return a sibling of an object + * @param obj pointer to an object whose sibling should be get + * @param idx 0: `obj` itself + * -1: the first older sibling + * -2: the next older sibling + * 1: the first younger sibling + * 2: the next younger sibling + * etc + * @return pointer to the requested sibling or NULL if there is no such sibling + */ +lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx); + +/** + * Return a sibling of an object. Consider the siblings only with a given type. + * @param obj pointer to an object whose sibling should be get + * @param idx 0: `obj` itself + * -1: the first older sibling + * -2: the next older sibling + * 1: the first younger sibling + * 2: the next younger sibling + * etc + * @param class_p the type of the children to check + * @return pointer to the requested sibling or NULL if there is no such sibling + */ +lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, + const lv_obj_class_t * class_p); + +/** + * Get the number of children + * @param obj pointer to an object + * @return the number of children + */ +uint32_t lv_obj_get_child_count(const lv_obj_t * obj); + +/** + * Get the number of children having a given type. + * @param obj pointer to an object + * @param class_p the type of the children to check + * @return the number of children + */ + +uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Get the index of a child. + * @param obj pointer to an object + * @return the child index of the object. + * E.g. 0: the oldest (firstly created child). + * (-1 if child could not be found or no parent exists) + */ +int32_t lv_obj_get_index(const lv_obj_t * obj); + +/** + * Get the index of a child. Consider the children only with a given type. + * @param obj pointer to an object + * @param class_p the type of the children to check + * @return the child index of the object. + * E.g. 0: the oldest (firstly created child with the given class). + * (-1 if child could not be found or no parent exists) + */ +int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Iterate through all children of any object. + * @param start_obj start integrating from this object + * @param cb call this callback on the objects + * @param user_data pointer to any user related data (will be passed to `cb`) + */ +void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data); + +/** + * Iterate through all children of any object and print their ID. + * @param start_obj start integrating from this object + */ +void lv_obj_dump_tree(lv_obj_t * start_ob); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_TREE_H*/ diff --git a/libraries/lvgl/src/core/lv_refr.c b/libraries/lvgl/src/core/lv_refr.c new file mode 100644 index 0000000..fbd1c8a --- /dev/null +++ b/libraries/lvgl/src/core/lv_refr.c @@ -0,0 +1,1092 @@ +/** + * @file lv_refr.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_refr.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../tick/lv_tick.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_math.h" +#include "../misc/lv_profiler.h" +#include "../draw/lv_draw.h" +#include "../font/lv_font_fmt_txt.h" +#include "../stdlib/lv_string.h" +#include "lv_global.h" + +/********************* + * DEFINES + *********************/ + +/*Display being refreshed*/ +#define disp_refr LV_GLOBAL_DEFAULT()->disp_refresh + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_refr_join_area(void); +static void refr_invalid_areas(void); +static void refr_sync_areas(void); +static void refr_area(const lv_area_t * area_p); +static void refr_area_part(lv_layer_t * layer); +static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); +static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj); +static void refr_obj(lv_layer_t * layer, lv_obj_t * obj); +static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h); +static void draw_buf_flush(lv_display_t * disp); +static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void wait_for_flushing(lv_display_t * disp); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_DISP_REFR + #define LV_TRACE_REFR(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_REFR(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void _lv_refr_init(void) +{ +} + +void _lv_refr_deinit(void) +{ +} + +void lv_refr_now(lv_display_t * disp) +{ + lv_anim_refr_now(); + + if(disp) { + if(disp->refr_timer) _lv_display_refr_timer(disp->refr_timer); + } + else { + lv_display_t * d; + d = lv_display_get_next(NULL); + while(d) { + if(d->refr_timer) _lv_display_refr_timer(d->refr_timer); + d = lv_display_get_next(d); + } + } +} + +void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) +{ + lv_area_t clip_area_ori = layer->_clip_area; + lv_area_t clip_coords_for_obj; + + /*Truncate the clip area to `obj size + ext size` area*/ + lv_area_t obj_coords_ext; + lv_obj_get_coords(obj, &obj_coords_ext); + int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); + + if(!_lv_area_intersect(&clip_coords_for_obj, &clip_area_ori, &obj_coords_ext)) return; + /*If the object is visible on the current clip area*/ + layer->_clip_area = clip_coords_for_obj; + + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_END, layer); +#if LV_USE_REFR_DEBUG + lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF)); + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_color = debug_color; + draw_dsc.bg_opa = LV_OPA_20; + draw_dsc.border_width = 1; + draw_dsc.border_opa = LV_OPA_30; + draw_dsc.border_color = debug_color; + lv_draw_rect(layer, &draw_dsc, &obj_coords_ext); +#endif + + const lv_area_t * obj_coords; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + obj_coords = &obj_coords_ext; + } + else { + obj_coords = &obj->coords; + } + lv_area_t clip_coords_for_children; + bool refr_children = true; + if(!_lv_area_intersect(&clip_coords_for_children, &clip_area_ori, obj_coords)) { + refr_children = false; + } + + if(refr_children) { + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + if(child_cnt == 0) { + /*If the object was visible on the clip area call the post draw events too*/ + layer->_clip_area = clip_coords_for_obj; + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + } + else { + layer->_clip_area = clip_coords_for_children; + bool clip_corner = lv_obj_get_style_clip_corner(obj, LV_PART_MAIN); + + int32_t radius = 0; + if(clip_corner) { + radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + if(radius == 0) clip_corner = false; + } + + if(clip_corner == false) { + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + refr_obj(layer, child); + } + + /*If the object was visible on the clip area call the post draw events too*/ + layer->_clip_area = clip_coords_for_obj; + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + } + else { + lv_layer_t * layer_children; + lv_draw_mask_rect_dsc_t mask_draw_dsc; + lv_draw_mask_rect_dsc_init(&mask_draw_dsc); + mask_draw_dsc.radius = radius; + mask_draw_dsc.area = obj->coords; + + lv_draw_image_dsc_t img_draw_dsc; + lv_draw_image_dsc_init(&img_draw_dsc); + + int32_t short_side = LV_MIN(lv_area_get_width(&obj->coords), lv_area_get_height(&obj->coords)); + int32_t rout = LV_MIN(radius, short_side >> 1); + + lv_area_t bottom = obj->coords; + bottom.y1 = bottom.y2 - rout + 1; + if(_lv_area_intersect(&bottom, &bottom, &clip_area_ori)) { + layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &bottom); + + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + refr_obj(layer_children, child); + } + + /*If all the children are redrawn send 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); + + lv_draw_mask_rect(layer_children, &mask_draw_dsc); + + img_draw_dsc.src = layer_children; + lv_draw_layer(layer, &img_draw_dsc, &bottom); + } + + lv_area_t top = obj->coords; + top.y2 = top.y1 + rout - 1; + if(_lv_area_intersect(&top, &top, &clip_area_ori)) { + layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &top); + + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + refr_obj(layer_children, child); + } + + /*If all the children are redrawn send 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); + + lv_draw_mask_rect(layer_children, &mask_draw_dsc); + + img_draw_dsc.src = layer_children; + lv_draw_layer(layer, &img_draw_dsc, &top); + + } + + lv_area_t mid = obj->coords; + mid.y1 += rout; + mid.y2 -= rout; + if(_lv_area_intersect(&mid, &mid, &clip_area_ori)) { + layer->_clip_area = mid; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + refr_obj(layer, child); + } + + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + + } + + } + } + } + + layer->_clip_area = clip_area_ori; +} + +void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return; + if(!lv_display_is_invalidation_enabled(disp)) return; + + LV_ASSERT_MSG(!disp->rendering_in_progress, "Invalidate area is not allowed during rendering."); + + /*Clear the invalidate buffer if the parameter is NULL*/ + if(area_p == NULL) { + disp->inv_p = 0; + return; + } + + lv_area_t scr_area; + scr_area.x1 = 0; + scr_area.y1 = 0; + scr_area.x2 = lv_display_get_horizontal_resolution(disp) - 1; + scr_area.y2 = lv_display_get_vertical_resolution(disp) - 1; + + lv_area_t com_area; + bool suc; + + suc = _lv_area_intersect(&com_area, area_p, &scr_area); + if(suc == false) return; /*Out of the screen*/ + + /*If there were at least 1 invalid area in full refresh mode, redraw the whole screen*/ + if(disp->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { + disp->inv_areas[0] = scr_area; + disp->inv_p = 1; + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); + return; + } + + lv_result_t res = lv_display_send_event(disp, LV_EVENT_INVALIDATE_AREA, &com_area); + if(res != LV_RESULT_OK) return; + + /*Save only if this area is not in one of the saved areas*/ + uint16_t i; + for(i = 0; i < disp->inv_p; i++) { + if(_lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return; + } + + /*Save the area*/ + lv_area_t * tmp_area_p = &com_area; + if(disp->inv_p >= LV_INV_BUF_SIZE) { /*If no place for the area add the screen*/ + disp->inv_p = 0; + tmp_area_p = &scr_area; + } + lv_area_copy(&disp->inv_areas[disp->inv_p], tmp_area_p); + disp->inv_p++; + + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); +} + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_display_t * _lv_refr_get_disp_refreshing(void) +{ + return disp_refr; +} + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +void _lv_refr_set_disp_refreshing(lv_display_t * disp) +{ + disp_refr = disp; +} + +void _lv_display_refr_timer(lv_timer_t * tmr) +{ + LV_PROFILER_BEGIN; + LV_TRACE_REFR("begin"); + + if(tmr) { + disp_refr = tmr->user_data; + /* Ensure the timer does not run again automatically. + * This is done before refreshing in case refreshing invalidates something else. + * However if the performance monitor is enabled keep the timer running to count the FPS.*/ +#if !(defined(LV_USE_PERF_MONITOR) && LV_USE_PERF_MONITOR) + lv_timer_pause(tmr); +#endif + } + else { + disp_refr = lv_display_get_default(); + } + + if(disp_refr == NULL) { + LV_LOG_WARN("No display registered"); + return; + } + + lv_draw_buf_t * buf_act = disp_refr->buf_act; + if(!(buf_act && buf_act->data && buf_act->data_size)) { + LV_LOG_WARN("No draw buffer"); + return; + } + + lv_display_send_event(disp_refr, LV_EVENT_REFR_START, NULL); + + /*Refresh the screen's layout if required*/ + LV_PROFILER_BEGIN_TAG("layout"); + lv_obj_update_layout(disp_refr->act_scr); + if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr); + + lv_obj_update_layout(disp_refr->bottom_layer); + lv_obj_update_layout(disp_refr->top_layer); + lv_obj_update_layout(disp_refr->sys_layer); + LV_PROFILER_END_TAG("layout"); + + /*Do nothing if there is no active screen*/ + if(disp_refr->act_scr == NULL) { + disp_refr->inv_p = 0; + LV_LOG_WARN("there is no active screen"); + goto refr_finish; + } + + lv_refr_join_area(); + refr_sync_areas(); + refr_invalid_areas(); + + if(disp_refr->inv_p == 0) goto refr_finish; + + /*If refresh happened ...*/ + lv_display_send_event(disp_refr, LV_EVENT_RENDER_READY, NULL); + + if(!lv_display_is_double_buffered(disp_refr) || + disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT) goto refr_clean_up; + + /*With double buffered direct mode synchronize the rendered areas to the other buffer*/ + /*We need to wait for ready here to not mess up the active screen*/ + wait_for_flushing(disp_refr); + + uint32_t i; + for(i = 0; i < disp_refr->inv_p; i++) { + if(disp_refr->inv_area_joined[i]) + continue; + + lv_area_t * sync_area = _lv_ll_ins_tail(&disp_refr->sync_areas); + *sync_area = disp_refr->inv_areas[i]; + } + +refr_clean_up: + lv_memzero(disp_refr->inv_areas, sizeof(disp_refr->inv_areas)); + lv_memzero(disp_refr->inv_area_joined, sizeof(disp_refr->inv_area_joined)); + disp_refr->inv_p = 0; + +refr_finish: + +#if LV_DRAW_SW_COMPLEX == 1 + _lv_draw_sw_mask_cleanup(); +#endif + + lv_display_send_event(disp_refr, LV_EVENT_REFR_READY, NULL); + + LV_TRACE_REFR("finished"); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Join the areas which has got common parts + */ +static void lv_refr_join_area(void) +{ + LV_PROFILER_BEGIN; + uint32_t join_from; + uint32_t join_in; + lv_area_t joined_area; + for(join_in = 0; join_in < disp_refr->inv_p; join_in++) { + if(disp_refr->inv_area_joined[join_in] != 0) continue; + + /*Check all areas to join them in 'join_in'*/ + for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { + /*Handle only unjoined areas and ignore itself*/ + if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) { + continue; + } + + /*Check if the areas are on each other*/ + if(_lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { + continue; + } + + _lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); + + /*Join two area only if the joined area size is smaller*/ + if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + + lv_area_get_size(&disp_refr->inv_areas[join_from]))) { + lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area); + + /*Mark 'join_form' is joined into 'join_in'*/ + disp_refr->inv_area_joined[join_from] = 1; + } + } + } + LV_PROFILER_END; +} + +/** + * Refresh the sync areas + */ +static void refr_sync_areas(void) +{ + /*Do not sync if not direct or double buffered*/ + if(disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT) return; + + /*Do not sync if not double buffered*/ + if(!lv_display_is_double_buffered(disp_refr)) return; + + /*Do not sync if no sync areas*/ + if(_lv_ll_is_empty(&disp_refr->sync_areas)) return; + + LV_PROFILER_BEGIN; + /*With double buffered direct mode synchronize the rendered areas to the other buffer*/ + /*We need to wait for ready here to not mess up the active screen*/ + wait_for_flushing(disp_refr); + + /*The buffers are already swapped. + *So the active buffer is the off screen buffer where LVGL will render*/ + lv_draw_buf_t * off_screen = disp_refr->buf_act; + lv_draw_buf_t * on_screen = disp_refr->buf_act == disp_refr->buf_1 ? disp_refr->buf_2 : disp_refr->buf_1; + + uint32_t hor_res = lv_display_get_horizontal_resolution(disp_refr); + uint32_t ver_res = lv_display_get_vertical_resolution(disp_refr); + + /*Iterate through invalidated areas to see if sync area should be copied*/ + uint16_t i; + int8_t j; + lv_area_t res[4] = {0}; + int8_t res_c; + lv_area_t * sync_area, * new_area, * next_area; + for(i = 0; i < disp_refr->inv_p; i++) { + /*Skip joined areas*/ + if(disp_refr->inv_area_joined[i]) continue; + + /*Iterate over sync areas*/ + sync_area = _lv_ll_get_head(&disp_refr->sync_areas); + while(sync_area != NULL) { + /*Get next sync area*/ + next_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area); + + /*Remove intersect of redraw area from sync area and get remaining areas*/ + res_c = _lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); + + /*New sub areas created after removing intersect*/ + if(res_c != -1) { + /*Replace old sync area with new areas*/ + for(j = 0; j < res_c; j++) { + new_area = _lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); + *new_area = res[j]; + } + _lv_ll_remove(&disp_refr->sync_areas, sync_area); + lv_free(sync_area); + } + + /*Move on to next sync area*/ + sync_area = next_area; + } + } + + lv_area_t disp_area = {0, 0, (int32_t)hor_res - 1, (int32_t)ver_res - 1}; + /*Copy sync areas (if any remaining)*/ + for(sync_area = _lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; + sync_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { + /** + * @todo Resize SDL window will trigger crash because of sync_area is larger than disp_area + */ + _lv_area_intersect(sync_area, sync_area, &disp_area); + lv_draw_buf_copy(off_screen, sync_area, on_screen, sync_area); + } + + /*Clear sync areas*/ + _lv_ll_clear(&disp_refr->sync_areas); + LV_PROFILER_END; +} + +/** + * Refresh the joined areas + */ +static void refr_invalid_areas(void) +{ + if(disp_refr->inv_p == 0) return; + LV_PROFILER_BEGIN; + + /*Find the last area which will be drawn*/ + int32_t i; + int32_t last_i = 0; + for(i = disp_refr->inv_p - 1; i >= 0; i--) { + if(disp_refr->inv_area_joined[i] == 0) { + last_i = i; + break; + } + } + + /*Notify the display driven rendering has started*/ + lv_display_send_event(disp_refr, LV_EVENT_RENDER_START, NULL); + + disp_refr->last_area = 0; + disp_refr->last_part = 0; + disp_refr->rendering_in_progress = true; + + for(i = 0; i < (int32_t)disp_refr->inv_p; i++) { + /*Refresh the unjoined areas*/ + if(disp_refr->inv_area_joined[i] == 0) { + + if(i == last_i) disp_refr->last_area = 1; + disp_refr->last_part = 0; + refr_area(&disp_refr->inv_areas[i]); + } + } + + disp_refr->rendering_in_progress = false; + LV_PROFILER_END; +} + +/** + * Reshape the draw buffer if required + * @param layer pointer to a layer which will be drawn + */ +static void layer_reshape_draw_buf(lv_layer_t * layer) +{ + LV_ASSERT(lv_draw_buf_reshape( + layer->draw_buf, + layer->color_format, + lv_area_get_width(&layer->buf_area), + lv_area_get_height(&layer->buf_area), + 0) + != NULL); +} + +/** + * Refresh an area if there is Virtual Display Buffer + * @param area_p pointer to an area to refresh + */ +static void refr_area(const lv_area_t * area_p) +{ + LV_PROFILER_BEGIN; + lv_layer_t * layer = disp_refr->layer_head; + layer->draw_buf = disp_refr->buf_act; + + /*With full refresh just redraw directly into the buffer*/ + /*In direct mode draw directly on the absolute coordinates of the buffer*/ + if(disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_PARTIAL) { + layer->buf_area.x1 = 0; + layer->buf_area.y1 = 0; + layer->buf_area.x2 = lv_display_get_horizontal_resolution(disp_refr) - 1; + layer->buf_area.y2 = lv_display_get_vertical_resolution(disp_refr) - 1; + layer_reshape_draw_buf(layer); + lv_area_t disp_area; + lv_area_set(&disp_area, 0, 0, lv_display_get_horizontal_resolution(disp_refr) - 1, + lv_display_get_vertical_resolution(disp_refr) - 1); + + if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { + disp_refr->last_part = 1; + layer->_clip_area = disp_area; + refr_area_part(layer); + } + else if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + disp_refr->last_part = disp_refr->last_area; + layer->_clip_area = *area_p; + refr_area_part(layer); + } + LV_PROFILER_END; + return; + } + + /*Normal refresh: draw the area in parts*/ + /*Calculate the max row num*/ + int32_t w = lv_area_get_width(area_p); + int32_t h = lv_area_get_height(area_p); + int32_t y2 = area_p->y2 >= lv_display_get_vertical_resolution(disp_refr) ? + lv_display_get_vertical_resolution(disp_refr) - 1 : area_p->y2; + + int32_t max_row = get_max_row(disp_refr, w, h); + + int32_t row; + int32_t row_last = 0; + lv_area_t sub_area; + for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.x1 = area_p->x1; + sub_area.x2 = area_p->x2; + sub_area.y1 = row; + sub_area.y2 = row + max_row - 1; + layer->draw_buf = disp_refr->buf_act; + layer->buf_area = sub_area; + layer->_clip_area = sub_area; + layer_reshape_draw_buf(layer); + if(sub_area.y2 > y2) sub_area.y2 = y2; + row_last = sub_area.y2; + if(y2 == row_last) disp_refr->last_part = 1; + refr_area_part(layer); + } + + /*If the last y coordinates are not handled yet ...*/ + if(y2 != row_last) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.x1 = area_p->x1; + sub_area.x2 = area_p->x2; + sub_area.y1 = row; + sub_area.y2 = y2; + layer->draw_buf = disp_refr->buf_act; + layer->buf_area = sub_area; + layer->_clip_area = sub_area; + layer_reshape_draw_buf(layer); + disp_refr->last_part = 1; + refr_area_part(layer); + } + LV_PROFILER_END; +} + +static void refr_area_part(lv_layer_t * layer) +{ + LV_PROFILER_BEGIN; + disp_refr->refreshed_area = layer->_clip_area; + + /* In single buffered mode wait here until the buffer is freed. + * Else we would draw into the buffer while it's still being transferred to the display*/ + if(!lv_display_is_double_buffered(disp_refr)) { + wait_for_flushing(disp_refr); + } + /*If the screen is transparent initialize it when the flushing is ready*/ + if(lv_color_format_has_alpha(disp_refr->color_format)) { + lv_area_t a = disp_refr->refreshed_area; + if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + /*The area always starts at 0;0*/ + lv_area_move(&a, -disp_refr->refreshed_area.x1, -disp_refr->refreshed_area.y1); + } + + lv_draw_buf_clear(layer->draw_buf, &a); + } + + lv_obj_t * top_act_scr = NULL; + lv_obj_t * top_prev_scr = NULL; + + /*Get the most top object which is not covered by others*/ + top_act_scr = lv_refr_get_top_obj(&layer->_clip_area, lv_display_get_screen_active(disp_refr)); + if(disp_refr->prev_scr) { + top_prev_scr = lv_refr_get_top_obj(&layer->_clip_area, disp_refr->prev_scr); + } + + /*Draw a bottom layer background if there is no top object*/ + if(top_act_scr == NULL && top_prev_scr == NULL) { + refr_obj_and_children(layer, lv_display_get_layer_bottom(disp_refr)); + } + + if(disp_refr->draw_prev_over_act) { + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(layer, top_act_scr); + + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(layer, top_prev_scr); + } + } + else { + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(layer, top_prev_scr); + } + + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(layer, top_act_scr); + } + + /*Also refresh top and sys layer unconditionally*/ + refr_obj_and_children(layer, lv_display_get_layer_top(disp_refr)); + refr_obj_and_children(layer, lv_display_get_layer_sys(disp_refr)); + + draw_buf_flush(disp_refr); + LV_PROFILER_END; +} + +/** + * Search the most top object which fully covers an area + * @param area_p pointer to an area + * @param obj the first object to start the searching (typically a screen) + * @return + */ +static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) +{ + lv_obj_t * found_p = NULL; + + if(_lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + if(_lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; + + /*If this object is fully cover the draw area then check the children too*/ + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = area_p; + lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_MASKED) return NULL; + + int32_t i; + int32_t child_cnt = lv_obj_get_child_count(obj); + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_refr_get_top_obj(area_p, child); + + /*If a children is ok then break*/ + if(found_p != NULL) { + break; + } + } + + /*If no better children use this object*/ + if(found_p == NULL && info.res == LV_COVER_RES_COVER) { + found_p = obj; + } + + return found_p; +} + +/** + * Make the refreshing from an object. Draw all its children and the youngers too. + * @param top_p pointer to an objects. Start the drawing from it. + * @param mask_p pointer to an area, the objects will be drawn only here + */ +static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj) +{ + /*Normally always will be a top_obj (at least the screen) + *but in special cases (e.g. if the screen has alpha) it won't. + *In this case use the screen directly*/ + if(top_obj == NULL) top_obj = lv_display_get_screen_active(disp_refr); + if(top_obj == NULL) return; /*Shouldn't happen*/ + + LV_PROFILER_BEGIN; + /*Refresh the top object and its children*/ + refr_obj(layer, top_obj); + + /*Draw the 'younger' sibling objects because they can be on top_obj*/ + lv_obj_t * parent; + lv_obj_t * border_p = top_obj; + + parent = lv_obj_get_parent(top_obj); + + /*Do until not reach the screen*/ + while(parent != NULL) { + bool go = false; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(parent); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(!go) { + if(child == border_p) go = true; + } + else { + /*Refresh the objects*/ + refr_obj(layer, child); + } + } + + /*Call the post draw draw function of the parents of the to object*/ + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_BEGIN, (void *)layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST, (void *)layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_END, (void *)layer); + + /*The new border will be the last parents, + *so the 'younger' brothers of parent will be refreshed*/ + border_p = parent; + /*Go a level deeper*/ + parent = lv_obj_get_parent(parent); + } + LV_PROFILER_END; +} + +static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type, + lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out) +{ + int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + lv_obj_get_coords(obj, obj_draw_size_out); + lv_area_increase(obj_draw_size_out, ext_draw_size, ext_draw_size); + + if(layer_type == LV_LAYER_TYPE_TRANSFORM) { + /*Get the transformed area and clip it to the current clip area. + *This area needs to be updated on the screen.*/ + lv_area_t clip_coords_for_obj; + lv_area_t tranf_coords = *obj_draw_size_out; + lv_obj_get_transformed_area(obj, &tranf_coords, LV_OBJ_POINT_TRANSFORM_FLAG_NONE); + if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) { + return LV_RESULT_INVALID; + } + + /*Transform back (inverse) the transformed area. + *It will tell which area of the non-transformed widget needs to be redrawn + *in order to cover transformed area after transformation.*/ + lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj; + lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); + if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) { + return LV_RESULT_INVALID; + } + + *layer_area_out = inverse_clip_coords_for_obj; + lv_area_increase(layer_area_out, 5, 5); /*To avoid rounding error*/ + } + else if(layer_type == LV_LAYER_TYPE_SIMPLE) { + lv_area_t clip_coords_for_obj; + if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) { + return LV_RESULT_INVALID; + } + *layer_area_out = clip_coords_for_obj; + } + else { + LV_LOG_WARN("Unhandled layer type"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +static bool alpha_test_area_on_obj(lv_obj_t * obj, const lv_area_t * area) +{ + /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/ + /*If the layer area is not fully on the object, it can't fully cover it*/ + if(!_lv_area_is_on(area, &obj->coords)) return true; + + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = area; + lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_COVER) return false; + else return true; +} + +void refr_obj(lv_layer_t * layer, lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return; + + lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj); + if(layer_type == LV_LAYER_TYPE_NONE) { + lv_obj_redraw(layer, obj); + } + else { + lv_opa_t opa = lv_obj_get_style_opa_layered(obj, 0); + if(opa < LV_OPA_MIN) return; + + lv_area_t layer_area_full; + lv_area_t obj_draw_size; + lv_result_t res = layer_get_area(layer, obj, layer_type, &layer_area_full, &obj_draw_size); + if(res != LV_RESULT_OK) return; + + /*Simple layers can be subdivied into smaller layers*/ + uint32_t max_rgb_row_height = lv_area_get_height(&layer_area_full); + uint32_t max_argb_row_height = lv_area_get_height(&layer_area_full); + if(layer_type == LV_LAYER_TYPE_SIMPLE) { + int32_t w = lv_area_get_width(&layer_area_full); + uint8_t px_size = lv_color_format_get_size(disp_refr->color_format); + max_rgb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / px_size; + max_argb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / sizeof(lv_color32_t); + } + + lv_area_t layer_area_act; + layer_area_act.x1 = layer_area_full.x1; + layer_area_act.x2 = layer_area_full.x2; + layer_area_act.y1 = layer_area_full.y1; + layer_area_act.y2 = layer_area_full.y1; + + while(layer_area_act.y2 < layer_area_full.y2) { + /* Test with an RGB layer size (which is larger than the ARGB layer size) + * If it really doesn't need alpha use it. Else switch to the ARGB size*/ + layer_area_act.y2 = layer_area_act.y1 + max_rgb_row_height - 1; + if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; + bool area_need_alpha = alpha_test_area_on_obj(obj, &layer_area_act); + if(area_need_alpha) { + layer_area_act.y2 = layer_area_act.y1 + max_argb_row_height - 1; + if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; + } + + lv_layer_t * new_layer = lv_draw_layer_create(layer, + area_need_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE, &layer_area_act); + lv_obj_redraw(new_layer, obj); + + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, 0), + .y = lv_obj_get_style_transform_pivot_y(obj, 0) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.pivot.x = obj->coords.x1 + pivot.x - new_layer->buf_area.x1; + layer_draw_dsc.pivot.y = obj->coords.y1 + pivot.y - new_layer->buf_area.y1; + + layer_draw_dsc.opa = opa; + layer_draw_dsc.rotation = lv_obj_get_style_transform_rotation(obj, 0); + while(layer_draw_dsc.rotation > 3600) layer_draw_dsc.rotation -= 3600; + while(layer_draw_dsc.rotation < 0) layer_draw_dsc.rotation += 3600; + layer_draw_dsc.scale_x = lv_obj_get_style_transform_scale_x(obj, 0); + layer_draw_dsc.scale_y = lv_obj_get_style_transform_scale_y(obj, 0); + layer_draw_dsc.skew_x = lv_obj_get_style_transform_skew_x(obj, 0); + layer_draw_dsc.skew_y = lv_obj_get_style_transform_skew_y(obj, 0); + layer_draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0); + layer_draw_dsc.antialias = disp_refr->antialiasing; + layer_draw_dsc.bitmap_mask_src = lv_obj_get_style_bitmap_mask_src(obj, 0); + layer_draw_dsc.original_area = obj_draw_size; + layer_draw_dsc.src = new_layer; + + lv_draw_layer(layer, &layer_draw_dsc, &layer_area_act); + + layer_area_act.y1 = layer_area_act.y2 + 1; + } + } +} + +static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h) +{ + bool has_alpha = lv_color_format_has_alpha(disp->color_format); + lv_color_format_t cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : disp->color_format; + uint32_t stride = lv_draw_buf_width_to_stride(area_w, cf); + int32_t max_row = (uint32_t)disp->buf_act->data_size / stride; + + if(max_row > area_h) max_row = area_h; + + /*Round down the lines of draw_buf if rounding is added*/ + lv_area_t tmp; + tmp.x1 = 0; + tmp.x2 = 0; + tmp.y1 = 0; + + int32_t h_tmp = max_row; + do { + tmp.y2 = h_tmp - 1; + lv_display_send_event(disp_refr, LV_EVENT_INVALIDATE_AREA, &tmp); + + /*If this height fits into `max_row` then fine*/ + if(lv_area_get_height(&tmp) <= max_row) break; + + /*Decrement the height of the area until it fits into `max_row` after rounding*/ + h_tmp--; + } while(h_tmp > 0); + + if(h_tmp <= 0) { + LV_LOG_WARN("Can't set draw_buf height using the round function. (Wrong round_cb or too " + "small draw_buf)"); + return 0; + } + else { + max_row = tmp.y2 + 1; + } + + return max_row; +} + +/** + * Flush the content of the draw buffer + */ +static void draw_buf_flush(lv_display_t * disp) +{ + /*Flush the rendered content to the display*/ + lv_layer_t * layer = disp->layer_head; + + while(layer->draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch(); + } + + /* In double buffered mode wait until the other buffer is freed + * and driver is ready to receive the new buffer. + * If we need to wait here it means that the content of one buffer is being sent to display + * and other buffer already contains the new rendered image. */ + if(lv_display_is_double_buffered(disp)) { + wait_for_flushing(disp_refr); + } + + disp->flushing = 1; + + if(disp->last_area && disp->last_part) disp->flushing_last = 1; + else disp->flushing_last = 0; + + bool flushing_last = disp->flushing_last; + + if(disp->flush_cb) { + call_flush_cb(disp, &disp->refreshed_area, layer->draw_buf->data); + } + /*If there are 2 buffers swap them. With direct mode swap only on the last area*/ + if(lv_display_is_double_buffered(disp) && (disp->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT || flushing_last)) { + if(disp->buf_act == disp->buf_1) { + disp->buf_act = disp->buf_2; + } + else { + disp->buf_act = disp->buf_1; + } + } +} + +static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_PROFILER_BEGIN; + LV_TRACE_REFR("Calling flush_cb on (%d;%d)(%d;%d) area with %p image pointer", + (int)area->x1, (int)area->y1, (int)area->x2, (int)area->y2, (void *)px_map); + + lv_area_t offset_area = { + .x1 = area->x1 + disp->offset_x, + .y1 = area->y1 + disp->offset_y, + .x2 = area->x2 + disp->offset_x, + .y2 = area->y2 + disp->offset_y + }; + + lv_display_send_event(disp, LV_EVENT_FLUSH_START, &offset_area); + disp->flush_cb(disp, &offset_area, px_map); + lv_display_send_event(disp, LV_EVENT_FLUSH_FINISH, &offset_area); + + LV_PROFILER_END; +} + +static void wait_for_flushing(lv_display_t * disp) +{ + LV_PROFILER_BEGIN; + LV_LOG_TRACE("begin"); + + lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_START, NULL); + + if(disp->flush_wait_cb) { + disp->flush_wait_cb(disp); + } + else { + while(disp->flushing); + } + disp->flushing_last = 0; + + lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_FINISH, NULL); + + LV_LOG_TRACE("end"); + LV_PROFILER_END; +} diff --git a/libraries/lvgl/src/core/lv_refr.h b/libraries/lvgl/src/core/lv_refr.h new file mode 100644 index 0000000..537b9ee --- /dev/null +++ b/libraries/lvgl/src/core/lv_refr.h @@ -0,0 +1,104 @@ +/** + * @file lv_refr.h + * + */ + +#ifndef LV_REFR_H +#define LV_REFR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../display/lv_display.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void _lv_refr_init(void); + +/** + * Deinitialize the screen refresh subsystem + */ +void _lv_refr_deinit(void); + +/** + * Redraw the invalidated areas now. + * Normally the redrawing is periodically executed in `lv_timer_handler` but a long blocking process + * can prevent the call of `lv_timer_handler`. In this case if the GUI is updated in the process + * (e.g. progress bar) this function can be called when the screen should be updated. + * @param disp pointer to display to refresh. NULL to refresh all displays. + */ +void lv_refr_now(lv_display_t * disp); + +/** + * Redrawn on object and all its children using the passed draw context + * @param layer pointer to a layer where to draw. + * @param obj the start object from the redraw should start + */ +void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj); + +/** + * Invalidate an area on display to redraw it + * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) + * @param disp pointer to display where the area should be invalidated (NULL can be used if there is + * only one display) + */ +void _lv_inv_area(lv_display_t * disp, const lv_area_t * area_p); + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_display_t * _lv_refr_get_disp_refreshing(void); + +/** + * Set the display which is being refreshed + * @param disp the display being refreshed + */ +void _lv_refr_set_disp_refreshing(lv_display_t * disp); + +/** + * Called periodically to handle the refreshing + * @param timer pointer to the timer itself + */ +void _lv_display_refr_timer(lv_timer_t * timer); + +/********************** + * STATIC FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_REFR_H*/ diff --git a/libraries/lvgl/src/display/lv_display.c b/libraries/lvgl/src/display/lv_display.c new file mode 100644 index 0000000..2e839f4 --- /dev/null +++ b/libraries/lvgl/src/display/lv_display.c @@ -0,0 +1,1058 @@ +/** + * @file lv_disp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_display.h" +#include "../misc/lv_math.h" +#include "../core/lv_refr.h" +#include "../display/lv_display_private.h" +#include "../stdlib/lv_string.h" +#include "../themes/lv_theme.h" +#include "../core/lv_global.h" + +#if LV_USE_DRAW_SW + #include "../draw/sw/lv_draw_sw.h" +#endif + +/********************* + * DEFINES + *********************/ +#define disp_def LV_GLOBAL_DEFAULT()->disp_default +#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data); +static void update_resolution(lv_display_t * disp); +static void scr_load_internal(lv_obj_t * scr); +static void scr_load_anim_start(lv_anim_t * a); +static void opa_scale_anim(void * obj, int32_t v); +static void set_x_anim(void * obj, int32_t v); +static void set_y_anim(void * obj, int32_t v); +static void scr_anim_completed(lv_anim_t * a); +static bool is_out_anim(lv_screen_load_anim_t a); +static void disp_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res) +{ + lv_display_t * disp = _lv_ll_ins_head(disp_ll_p); + LV_ASSERT_MALLOC(disp); + if(!disp) return NULL; + + lv_memzero(disp, sizeof(lv_display_t)); + + disp->hor_res = hor_res; + disp->ver_res = ver_res; + disp->physical_hor_res = -1; + disp->physical_ver_res = -1; + disp->offset_x = 0; + disp->offset_y = 0; + disp->antialiasing = LV_COLOR_DEPTH > 8 ? 1 : 0; + disp->dpi = LV_DPI_DEF; + disp->color_format = LV_COLOR_FORMAT_NATIVE; + + disp->layer_head = lv_malloc_zeroed(sizeof(lv_layer_t)); + LV_ASSERT_MALLOC(disp->layer_head); + if(disp->layer_head == NULL) return NULL; + + if(disp->layer_init) disp->layer_init(disp, disp->layer_head); + disp->layer_head->buf_area.x1 = 0; + disp->layer_head->buf_area.y1 = 0; + disp->layer_head->buf_area.x2 = hor_res - 1; + disp->layer_head->buf_area.y2 = ver_res - 1; + disp->layer_head->color_format = disp->color_format; + + disp->inv_en_cnt = 1; + disp->last_activity_time = lv_tick_get(); + + _lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); + + lv_display_t * disp_def_tmp = disp_def; + disp_def = disp; /*Temporarily change the default screen to create the default screens on the + new display*/ + /*Create a refresh timer*/ + disp->refr_timer = lv_timer_create(_lv_display_refr_timer, LV_DEF_REFR_PERIOD, disp); + LV_ASSERT_MALLOC(disp->refr_timer); + if(disp->refr_timer == NULL) { + lv_free(disp); + return NULL; + } + +#if LV_USE_THEME_DEFAULT + if(lv_theme_default_is_inited() == false) { + disp->theme = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), + LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); + } + else { + disp->theme = lv_theme_default_get(); + } +#elif LV_USE_THEME_SIMPLE + if(lv_theme_simple_is_inited() == false) { + disp->theme = lv_theme_simple_init(disp); + } + else { + disp->theme = lv_theme_simple_get(); + } +#endif + + disp->bottom_layer = lv_obj_create(NULL); /*Create bottom layer on the display*/ + disp->act_scr = lv_obj_create(NULL); /*Create a default screen on the display*/ + disp->top_layer = lv_obj_create(NULL); /*Create top layer on the display*/ + disp->sys_layer = lv_obj_create(NULL); /*Create sys layer on the display*/ + lv_obj_remove_style_all(disp->bottom_layer); + lv_obj_remove_style_all(disp->top_layer); + lv_obj_remove_style_all(disp->sys_layer); + lv_obj_remove_flag(disp->top_layer, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(disp->sys_layer, LV_OBJ_FLAG_CLICKABLE); + + lv_obj_set_scrollbar_mode(disp->bottom_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->top_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->sys_layer, LV_SCROLLBAR_MODE_OFF); + + lv_obj_invalidate(disp->act_scr); + + disp_def = disp_def_tmp; /*Revert the default display*/ + if(disp_def == NULL) disp_def = disp; /*Initialize the default display*/ + + lv_display_add_event_cb(disp, disp_event_cb, LV_EVENT_REFR_REQUEST, NULL); + + lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ + + return disp; +} + +void lv_display_delete(lv_display_t * disp) +{ + bool was_default = false; + if(disp == lv_display_get_default()) was_default = true; + + lv_display_send_event(disp, LV_EVENT_DELETE, NULL); + lv_event_remove_all(&(disp->event_list)); + + /*Detach the input devices*/ + lv_indev_t * indev; + indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_display(indev) == disp) { + lv_indev_set_display(indev, NULL); + } + indev = lv_indev_get_next(indev); + } + + /* Delete screen and other obj */ + if(disp->sys_layer) { + lv_obj_delete(disp->sys_layer); + disp->sys_layer = NULL; + } + if(disp->top_layer) { + lv_obj_delete(disp->top_layer); + disp->top_layer = NULL; + } + + if(disp->bottom_layer) { + lv_obj_delete(disp->bottom_layer); + disp->bottom_layer = NULL; + } + + disp->act_scr = NULL; + + while(disp->screen_cnt != 0) { + /*Delete the screenst*/ + lv_obj_delete(disp->screens[0]); + } + + _lv_ll_clear(&disp->sync_areas); + _lv_ll_remove(disp_ll_p, disp); + if(disp->refr_timer) lv_timer_delete(disp->refr_timer); + + if(disp->layer_deinit) disp->layer_deinit(disp, disp->layer_head); + lv_free(disp->layer_head); + + lv_free(disp); + + if(was_default) lv_display_set_default(_lv_ll_get_head(disp_ll_p)); +} + +void lv_display_set_default(lv_display_t * disp) +{ + disp_def = disp; +} + +lv_display_t * lv_display_get_default(void) +{ + return disp_def; +} + +lv_display_t * lv_display_get_next(lv_display_t * disp) +{ + if(disp == NULL) + return _lv_ll_get_head(disp_ll_p); + else + return _lv_ll_get_next(disp_ll_p, disp); +} + +/*--------------------- + * RESOLUTION + *--------------------*/ + +void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + if(disp->hor_res == hor_res && disp->ver_res == ver_res) return; + + disp->hor_res = hor_res; + disp->ver_res = ver_res; + + update_resolution(disp); +} + +void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->physical_hor_res = hor_res; + disp->physical_ver_res = ver_res; + + lv_obj_invalidate(disp->sys_layer); + +} + +void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->offset_x = x; + disp->offset_y = y; + + lv_obj_invalidate(disp->sys_layer); + +} + +void lv_display_set_dpi(lv_display_t * disp, int32_t dpi) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->dpi = dpi; +} + +int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->ver_res; + default: + return disp->hor_res; + } + } +} + +int32_t lv_display_get_vertical_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->hor_res; + default: + return disp->ver_res; + } + } +} + +int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + default: + return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + } + } +} + +int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + default: + return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + } + } +} + +int32_t lv_display_get_offset_x(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + return disp->offset_y; + case LV_DISPLAY_ROTATION_180: + return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_x; + case LV_DISPLAY_ROTATION_270: + return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_y; + default: + return disp->offset_x; + } + } +} + +int32_t lv_display_get_offset_y(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + return disp->offset_x; + case LV_DISPLAY_ROTATION_180: + return lv_display_get_physical_vertical_resolution(disp) - disp->offset_y; + case LV_DISPLAY_ROTATION_270: + return lv_display_get_physical_vertical_resolution(disp) - disp->offset_x; + default: + return disp->offset_y; + } + } +} + +int32_t lv_display_get_dpi(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_DPI_DEF; /*Do not return 0 because it might be a divider*/ + return disp->dpi; +} + +/*--------------------- + * BUFFERING + *--------------------*/ + +void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->buf_1 = buf1; + disp->buf_2 = buf2; + disp->buf_act = disp->buf_1; +} + +void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + lv_display_render_mode_t render_mode) +{ + LV_ASSERT_MSG(buf1 != NULL, "Null buffer"); + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t w = lv_display_get_horizontal_resolution(disp); + uint32_t h = lv_display_get_vertical_resolution(disp); + + LV_ASSERT_MSG(w != 0 && h != 0, "display resolution is 0"); + + /* buf1 or buf2 is not aligned according to LV_DRAW_BUF_ALIGN */ + LV_ASSERT_FORMAT_MSG(buf1 == lv_draw_buf_align(buf1, cf), "buf1 is not aligned: %p", buf1); + LV_ASSERT_FORMAT_MSG(buf2 == NULL || buf2 == lv_draw_buf_align(buf2, cf), "buf2 is not aligned: %p", buf2); + + uint32_t stride = lv_draw_buf_width_to_stride(w, cf); + if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + /* for partial mode, we calculate the height based on the buf_size and stride */ + h = buf_size / stride; + LV_ASSERT_MSG(h != 0, "the buffer is too small"); + } + else { + LV_ASSERT_FORMAT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)", + render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT"); + } + + lv_draw_buf_init(&disp->_static_buf1, w, h, cf, stride, buf1, buf_size); + lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size); + lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL); + lv_display_set_render_mode(disp, render_mode); +} + +void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + disp->render_mode = render_mode; +} + +void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->flush_cb = flush_cb; +} + +void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->flush_wait_cb = wait_cb; +} + +void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->color_format = color_format; + disp->layer_head->color_format = color_format; + + lv_display_send_event(disp, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); +} + +lv_color_format_t lv_display_get_color_format(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_COLOR_FORMAT_UNKNOWN; + + return disp->color_format; +} + +void lv_display_set_antialiasing(lv_display_t * disp, bool en) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->antialiasing = en; +} + +bool lv_display_get_antialiasing(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return false; + + return disp->antialiasing; +} + +LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp) +{ + disp->flushing = 0; +} + +LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp) +{ + return disp->flushing_last; +} + +bool lv_display_is_double_buffered(lv_display_t * disp) +{ + return disp->buf_2 != NULL; +} + +/*--------------------- + * SCREENS + *--------------------*/ + +lv_obj_t * lv_display_get_screen_active(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its active screen"); + return NULL; + } + + return disp->act_scr; +} + +lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its previous screen"); + return NULL; + } + + return disp->prev_scr; +} + +lv_obj_t * lv_display_get_layer_top(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_top: no display registered to get its top layer"); + return NULL; + } + + return disp->top_layer; +} + +lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_sys: no display registered to get its sys. layer"); + return NULL; + } + + return disp->sys_layer; +} + +lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_bottom: no display registered to get its bottom layer"); + return NULL; + } + + return disp->bottom_layer; +} + +void lv_screen_load(struct _lv_obj_t * scr) +{ + lv_screen_load_anim(scr, LV_SCR_LOAD_ANIM_NONE, 0, 0, false); +} + +void lv_screen_load_anim(lv_obj_t * new_scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, + bool auto_del) +{ + lv_display_t * d = lv_obj_get_display(new_scr); + lv_obj_t * act_scr = lv_screen_active(); + + if(act_scr == new_scr || d->scr_to_load == new_scr) { + return; + } + + /*If another screen load animation is in progress + *make target screen loaded immediately. */ + if(d->scr_to_load && act_scr != d->scr_to_load) { + lv_anim_delete(d->scr_to_load, NULL); + lv_obj_set_pos(d->scr_to_load, 0, 0); + lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0); + + if(d->del_prev) { + lv_obj_delete(act_scr); + } + act_scr = lv_screen_active(); /*Active screen changed.*/ + + scr_load_internal(d->scr_to_load); + } + + d->scr_to_load = new_scr; + + if(d->prev_scr && d->del_prev) { + lv_obj_delete(d->prev_scr); + d->prev_scr = NULL; + } + + d->draw_prev_over_act = is_out_anim(anim_type); + d->del_prev = auto_del; + + /*Be sure there is no other animation on the screens*/ + lv_anim_delete(new_scr, NULL); + if(act_scr) lv_anim_delete(act_scr, NULL); + + /*Be sure both screens are in a normal position*/ + lv_obj_set_pos(new_scr, 0, 0); + if(act_scr) lv_obj_set_pos(act_scr, 0, 0); + lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); + if(act_scr) lv_obj_remove_local_style_prop(act_scr, LV_STYLE_OPA, 0); + + /*Shortcut for immediate load*/ + if(time == 0 && delay == 0) { + scr_load_internal(new_scr); + if(auto_del && act_scr) lv_obj_delete(act_scr); + return; + } + + lv_anim_t a_new; + lv_anim_init(&a_new); + lv_anim_set_var(&a_new, new_scr); + lv_anim_set_start_cb(&a_new, scr_load_anim_start); + lv_anim_set_completed_cb(&a_new, scr_anim_completed); + lv_anim_set_duration(&a_new, time); + lv_anim_set_delay(&a_new, delay); + + lv_anim_t a_old; + lv_anim_init(&a_old); + lv_anim_set_var(&a_old, act_scr); + lv_anim_set_duration(&a_old, time); + lv_anim_set_delay(&a_old, delay); + + switch(anim_type) { + case LV_SCR_LOAD_ANIM_NONE: + /*Create a dummy animation to apply the delay*/ + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, 0, 0); + break; + case LV_SCR_LOAD_ANIM_OVER_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); + break; + case LV_SCR_LOAD_ANIM_OVER_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); + break; + case LV_SCR_LOAD_ANIM_MOVE_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_MOVE_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_FADE_IN: + lv_anim_set_exec_cb(&a_new, opa_scale_anim); + lv_anim_set_values(&a_new, LV_OPA_TRANSP, LV_OPA_COVER); + break; + case LV_SCR_LOAD_ANIM_FADE_OUT: + lv_anim_set_exec_cb(&a_old, opa_scale_anim); + lv_anim_set_values(&a_old, LV_OPA_COVER, LV_OPA_TRANSP); + break; + case LV_SCR_LOAD_ANIM_OUT_LEFT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_RIGHT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_TOP: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); + break; + case LV_SCR_LOAD_ANIM_OUT_BOTTOM: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); + break; + } + + if(act_scr) lv_obj_send_event(act_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); + + lv_anim_start(&a_new); + if(act_scr) lv_anim_start(&a_old); +} + +/*--------------------- + * OTHERS + *--------------------*/ + +void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_NULL(disp); + + lv_event_add(&disp->event_list, event_cb, filter, user_data); +} + +uint32_t lv_display_get_event_count(lv_display_t * disp) +{ + LV_ASSERT_NULL(disp); + return lv_event_get_count(&disp->event_list); +} + +lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index) +{ + LV_ASSERT_NULL(disp); + return lv_event_get_dsc(&disp->event_list, index); + +} + +bool lv_display_delete_event(lv_display_t * disp, uint32_t index) +{ + LV_ASSERT_NULL(disp); + + return lv_event_remove(&disp->event_list, index); +} + +uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(disp); + + uint32_t event_cnt = lv_display_get_event_count(disp); + uint32_t removed_count = 0; + int32_t i; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_display_get_event_dsc(disp, i); + if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { + lv_display_delete_event(disp, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param) +{ + + lv_event_t e; + lv_memzero(&e, sizeof(e)); + e.code = code; + e.current_target = disp; + e.original_target = disp; + e.param = param; + lv_result_t res; + res = lv_event_send(&disp->event_list, &e, true); + if(res != LV_RESULT_OK) return res; + + res = lv_event_send(&disp->event_list, &e, false); + if(res != LV_RESULT_OK) return res; + + return res; +} + +void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->rotation = rotation; + update_resolution(disp); +} + +lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_DISPLAY_ROTATION_0; + return disp->rotation; +} + +void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->theme = th; + + if(disp->screen_cnt == 4 && + lv_obj_get_child_count(disp->screens[0]) == 0 && + lv_obj_get_child_count(disp->screens[1]) == 0 && + lv_obj_get_child_count(disp->screens[2]) == 0) { + lv_theme_apply(disp->screens[0]); + } +} + +lv_theme_t * lv_display_get_theme(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + return disp->theme; +} + +uint32_t lv_display_get_inactive_time(const lv_display_t * disp) +{ + if(disp) return lv_tick_elaps(disp->last_activity_time); + + lv_display_t * d; + uint32_t t = UINT32_MAX; + d = lv_display_get_next(NULL); + while(d) { + uint32_t elaps = lv_tick_elaps(d->last_activity_time); + t = LV_MIN(t, elaps); + d = lv_display_get_next(d); + } + + return t; +} + +void lv_display_trigger_activity(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_display_trigger_activity: no display registered"); + return; + } + + disp->last_activity_time = lv_tick_get(); +} + +void lv_display_enable_invalidation(lv_display_t * disp, bool en) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->inv_en_cnt += en ? 1 : -1; +} + +bool lv_display_is_invalidation_enabled(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return false; + } + + return (disp->inv_en_cnt > 0); +} + +lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + + return disp->refr_timer; +} + +void lv_display_delete_refr_timer(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp || !disp->refr_timer) return; + + lv_timer_delete(disp->refr_timer); + disp->refr_timer = NULL; +} + +void lv_display_set_user_data(lv_display_t * disp, void * user_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return; + disp->user_data = user_data; +} + +void lv_display_set_driver_data(lv_display_t * disp, void * driver_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return; + + disp->driver_data = driver_data; +} + +void * lv_display_get_user_data(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + return disp->user_data; +} + +void * lv_display_get_driver_data(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + + return disp->driver_data; +} + +lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + return disp->buf_act; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void update_resolution(lv_display_t * disp) +{ + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + lv_area_t prev_coords; + lv_obj_get_coords(disp->sys_layer, &prev_coords); + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + lv_area_set_width(&disp->screens[i]->coords, hor_res); + lv_area_set_height(&disp->screens[i]->coords, ver_res); + lv_obj_send_event(disp->screens[i], LV_EVENT_SIZE_CHANGED, &prev_coords); + } + + lv_area_set_width(&disp->top_layer->coords, hor_res); + lv_area_set_height(&disp->top_layer->coords, ver_res); + lv_obj_send_event(disp->top_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_area_set_width(&disp->sys_layer->coords, hor_res); + lv_area_set_height(&disp->sys_layer->coords, ver_res); + lv_obj_send_event(disp->sys_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_area_set_width(&disp->bottom_layer->coords, hor_res); + lv_area_set_height(&disp->bottom_layer->coords, ver_res); + lv_obj_send_event(disp->bottom_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_memzero(disp->inv_areas, sizeof(disp->inv_areas)); + lv_memzero(disp->inv_area_joined, sizeof(disp->inv_area_joined)); + disp->inv_p = 0; + lv_obj_invalidate(disp->sys_layer); + + lv_obj_tree_walk(NULL, invalidate_layout_cb, NULL); + + lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); +} + +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data) +{ + LV_UNUSED(user_data); + lv_obj_mark_layout_as_dirty(obj); + return LV_OBJ_TREE_WALK_NEXT; +} + +static void scr_load_internal(lv_obj_t * scr) +{ + /*scr must not be NULL, but d->act_scr might be*/ + LV_ASSERT_NULL(scr); + if(scr == NULL) return; + + lv_display_t * d = lv_obj_get_display(scr); + if(!d) return; /*Shouldn't happen, just to be sure*/ + + lv_obj_t * old_scr = d->act_scr; + + if(old_scr) lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); + lv_obj_send_event(scr, LV_EVENT_SCREEN_LOAD_START, NULL); + + d->act_scr = scr; + d->scr_to_load = NULL; + + lv_obj_send_event(scr, LV_EVENT_SCREEN_LOADED, NULL); + if(old_scr) lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL); + + lv_obj_invalidate(scr); +} + +static void scr_load_anim_start(lv_anim_t * a) +{ + lv_display_t * d = lv_obj_get_display(a->var); + + d->prev_scr = lv_screen_active(); + d->act_scr = a->var; + + lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOAD_START, NULL); +} + +static void opa_scale_anim(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void set_x_anim(void * obj, int32_t v) +{ + lv_obj_set_x(obj, v); +} + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +static void scr_anim_completed(lv_anim_t * a) +{ + lv_display_t * d = lv_obj_get_display(a->var); + + lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOADED, NULL); + lv_obj_send_event(d->prev_scr, LV_EVENT_SCREEN_UNLOADED, NULL); + + if(d->prev_scr && d->del_prev) lv_obj_delete(d->prev_scr); + d->prev_scr = NULL; + d->draw_prev_over_act = false; + d->scr_to_load = NULL; + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); + lv_obj_invalidate(d->act_scr); +} + +static bool is_out_anim(lv_screen_load_anim_t anim_type) +{ + return anim_type == LV_SCR_LOAD_ANIM_FADE_OUT || + anim_type == LV_SCR_LOAD_ANIM_OUT_LEFT || + anim_type == LV_SCR_LOAD_ANIM_OUT_RIGHT || + anim_type == LV_SCR_LOAD_ANIM_OUT_TOP || + anim_type == LV_SCR_LOAD_ANIM_OUT_BOTTOM; +} + +static void disp_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_display_t * disp = lv_event_get_target(e); + switch(code) { + case LV_EVENT_REFR_REQUEST: + if(disp->refr_timer) lv_timer_resume(disp->refr_timer); + break; + + default: + break; + } +} diff --git a/libraries/lvgl/src/display/lv_display.h b/libraries/lvgl/src/display/lv_display.h new file mode 100644 index 0000000..c3ce147 --- /dev/null +++ b/libraries/lvgl/src/display/lv_display.h @@ -0,0 +1,602 @@ +/** + * @file lv_disp.h + * + */ + +#ifndef LV_DISPLAY_H +#define LV_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_event.h" +#include "../misc/lv_color.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_ATTRIBUTE_FLUSH_READY +#define LV_ATTRIBUTE_FLUSH_READY +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DISPLAY_ROTATION_0 = 0, + LV_DISPLAY_ROTATION_90, + LV_DISPLAY_ROTATION_180, + LV_DISPLAY_ROTATION_270 +} lv_display_rotation_t; + +typedef enum { + /** + * Use the buffer(s) to render the screen is smaller parts. + * This way the buffers can be smaller then the display to save RAM. At least 1/10 screen size buffer(s) are recommended. + */ + LV_DISPLAY_RENDER_MODE_PARTIAL, + + /** + * The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. + * This way the buffer always contain the whole image. Only the changed ares will be updated. + * With 2 buffers the buffers' content are kept in sync automatically and in flush_cb only address change is required. + */ + LV_DISPLAY_RENDER_MODE_DIRECT, + + /** + * Always redraw the whole screen even if only one pixel has been changed. + * With 2 buffers in flush_cb only and address change is required. + */ + LV_DISPLAY_RENDER_MODE_FULL, +} lv_display_render_mode_t; + +typedef enum { + LV_SCR_LOAD_ANIM_NONE, + LV_SCR_LOAD_ANIM_OVER_LEFT, + LV_SCR_LOAD_ANIM_OVER_RIGHT, + LV_SCR_LOAD_ANIM_OVER_TOP, + LV_SCR_LOAD_ANIM_OVER_BOTTOM, + LV_SCR_LOAD_ANIM_MOVE_LEFT, + LV_SCR_LOAD_ANIM_MOVE_RIGHT, + LV_SCR_LOAD_ANIM_MOVE_TOP, + LV_SCR_LOAD_ANIM_MOVE_BOTTOM, + LV_SCR_LOAD_ANIM_FADE_IN, + LV_SCR_LOAD_ANIM_FADE_ON = LV_SCR_LOAD_ANIM_FADE_IN, /*For backward compatibility*/ + LV_SCR_LOAD_ANIM_FADE_OUT, + LV_SCR_LOAD_ANIM_OUT_LEFT, + LV_SCR_LOAD_ANIM_OUT_RIGHT, + LV_SCR_LOAD_ANIM_OUT_TOP, + LV_SCR_LOAD_ANIM_OUT_BOTTOM, +} lv_screen_load_anim_t; + +typedef void (*lv_display_flush_cb_t)(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +typedef void (*lv_display_flush_wait_cb_t)(lv_display_t * disp); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new display with the given resolution + * @param hor_res horizontal resolution in pixels + * @param ver_res vertical resolution in pixels + * @return pointer to a display object or `NULL` on error + */ +lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res); + +/** + * Remove a display + * @param disp pointer to display + */ +void lv_display_delete(lv_display_t * disp); + +/** + * Set a default display. The new screens will be created on it by default. + * @param disp pointer to a display + */ +void lv_display_set_default(lv_display_t * disp); + +/** + * Get the default display + * @return pointer to the default display + */ +lv_display_t * lv_display_get_default(void); + +/** + * Get the next display. + * @param disp pointer to the current display. NULL to initialize. + * @return the next display or NULL if no more. Gives the first display when the parameter is NULL. + */ +lv_display_t * lv_display_get_next(lv_display_t * disp); + +/*--------------------- + * RESOLUTION + *--------------------*/ + +/** + * Sets the resolution of a display. `LV_EVENT_RESOLUTION_CHANGED` event will be sent. + * Here the native resolution of the device should be set. If the display will be rotated later with + * `lv_display_set_rotation` LVGL will swap the hor. and ver. resolution automatically. + * @param disp pointer to a display + * @param hor_res the new horizontal resolution + * @param ver_res the new vertical resolution + */ +void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); + +/** + * It's not mandatory to use the whole display for LVGL, however in some cases physical resolution is important. + * For example the touchpad still sees whole resolution and the values needs to be converted + * to the active LVGL display area. + * @param disp pointer to a display + * @param hor_res the new physical horizontal resolution, or -1 to assume it's the same as the normal hor. res. + * @param ver_res the new physical vertical resolution, or -1 to assume it's the same as the normal hor. res. + */ +void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); + +/** + * If physical resolution is not the same as the normal resolution + * the offset of the active display area can be set here. + * @param disp pointer to a display + * @param x X offset + * @param y Y offset + */ +void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y); + +/** + * Set the rotation of this display. LVGL will swap the horizontal and vertical resolutions internally. + * @param disp pointer to a display (NULL to use the default display) + * @param rotation `LV_DISPLAY_ROTATION_0/90/180/270` + */ +void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation); + +/** + * Set the DPI (dot per inch) of the display. + * dpi = sqrt(hor_res^2 + ver_res^2) / diagonal" + * @param disp pointer to a display + * @param dpi the new DPI + */ +void lv_display_set_dpi(lv_display_t * disp, int32_t dpi); + +/** + * Get the horizontal resolution of a display. + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal resolution of the display. + */ +int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp); + +/** + * Get the vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the vertical resolution of the display + */ +int32_t lv_display_get_vertical_resolution(const lv_display_t * disp); + +/** + * Get the physical horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the physical horizontal resolution of the display + */ +int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp); + +/** + * Get the physical vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the physical vertical resolution of the display + */ +int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp); + +/** + * Get the horizontal offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the physical display + */ +int32_t lv_display_get_offset_x(const lv_display_t * disp); + +/** + * Get the vertical offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the physical display + */ +int32_t lv_display_get_offset_y(const lv_display_t * disp); + +/** + * Get the current rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @return the current rotation + */ +lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp); + +/** + * Get the DPI of the display + * @param disp pointer to a display (NULL to use the default display) + * @return dpi of the display + */ +int32_t lv_display_get_dpi(const lv_display_t * disp); + +/*--------------------- + * BUFFERING + *--------------------*/ + +/** + * Set the buffers for a display, similarly to `lv_display_set_draw_buffers`, but accept the raw buffer pointers. + * @param disp pointer to a display + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + * @param buf_size buffer size in byte + * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL + */ +void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + lv_display_render_mode_t render_mode); + +/** + * Set the buffers for a display, accept a draw buffer pointer. + * Normally use `lv_display_set_buffers` is enough for most cases. + * Use this function when an existing lv_draw_buf_t is available. + * @param disp pointer to a display + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + */ +void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2); + +/** + * Set display render mode + * @param disp pointer to a display + * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL + */ +void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode); + +/** + * Set the flush callback which will be called to copy the rendered image to the display. + * @param disp pointer to a display + * @param flush_cb the flush callback (`px_map` contains the rendered image as raw pixel map and it should be copied to `area` on the display) + */ +void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb); + +/** + * Set a callback to be used while LVGL is waiting flushing to be finished. + * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. + * If not set the `disp->flushing` flag is used which can be cleared with `lv_display_flush_ready()` + * @param disp pointer to a display + * @param wait_cb a callback to call while LVGL is waiting for flush ready. + * If NULL `lv_display_flush_ready()` can be used to signal that flushing is ready. + */ +void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb); + +/** + * Set the color format of the display. + * @param disp pointer to a display + * @param color_format Possible values are + * - LV_COLOR_FORMAT_RGB565 + * - LV_COLOR_FORMAT_RGB888 + * - LV_COLOR_FORMAT_XRGB888 + * - LV_COLOR_FORMAT_ARGB888 + *@note To change the endianness of the rendered image in case of RGB565 format + * (i.e. swap the 2 bytes) call `lv_draw_sw_rgb565_swap` in the flush_cb + */ +void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format); + +/** + * Get the color format of the display + * @param disp pointer to a display + * @return the color format + */ +lv_color_format_t lv_display_get_color_format(lv_display_t * disp); + +/** + * Enable anti-aliasing for the render engine + * @param disp pointer to a display + * @param en true/false + */ +void lv_display_set_antialiasing(lv_display_t * disp, bool en); + +/** + * Get if anti-aliasing is enabled for a display or not + * @param disp pointer to a display (NULL to use the default display) + * @return true/false + */ +bool lv_display_get_antialiasing(lv_display_t * disp); + +//! @cond Doxygen_Suppress + +/** + * Call from the display driver when the flushing is finished + * @param disp pointer to display whose `flush_cb` was called + */ +LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp); + +/** + * Tell if it's the last area of the refreshing process. + * Can be called from `flush_cb` to execute some special display refreshing if needed when all areas area flushed. + * @param disp pointer to display + * @return true: it's the last area to flush; + * false: there are other areas too which will be refreshed soon + */ +LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp); + +//! @endcond + +bool lv_display_is_double_buffered(lv_display_t * disp); + +/*--------------------- + * SCREENS + *--------------------*/ + +/** + * Return a pointer to the active screen on a display + * @param disp pointer to display which active screen should be get. + * (NULL to use the default screen) + * @return pointer to the active screen object (loaded by 'lv_screen_load()') + */ +lv_obj_t * lv_display_get_screen_active(lv_display_t * disp); + +/** + * Return with a pointer to the previous screen. Only used during screen transitions. + * @param disp pointer to display which previous screen should be get. + * (NULL to use the default screen) + * @return pointer to the previous screen object or NULL if not used now + */ +lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp); + +/** + * Return the top layer. The top layer is the same on all screens and it is above the normal screen layer. + * @param disp pointer to display which top layer should be get. (NULL to use the default screen) + * @return pointer to the top layer object + */ +lv_obj_t * lv_display_get_layer_top(lv_display_t * disp); + +/** + * Return the sys. layer. The system layer is the same on all screen and it is above the normal screen and the top layer. + * @param disp pointer to display which sys. layer should be retrieved. (NULL to use the default screen) + * @return pointer to the sys layer object + */ +lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp); + +/** + * Return the bottom layer. The bottom layer is the same on all screen and it is under the normal screen layer. + * It's visible only if the the screen is transparent. + * @param disp pointer to display (NULL to use the default screen) + * @return pointer to the bottom layer object + */ +lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp); + +/** + * Load a screen on the default display + * @param scr pointer to a screen + */ +void lv_screen_load(struct _lv_obj_t * scr); + +/** + * Switch screen with animation + * @param scr pointer to the new screen to load + * @param anim_type type of the animation from `lv_screen_load_anim_t`, e.g. `LV_SCR_LOAD_ANIM_MOVE_LEFT` + * @param time time of the animation + * @param delay delay before the transition + * @param auto_del true: automatically delete the old screen + */ +void lv_screen_load_anim(lv_obj_t * scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, + bool auto_del); + +/** + * Get the active screen of the default display + * @return pointer to the active screen + */ +static inline lv_obj_t * lv_screen_active(void) +{ + return lv_display_get_screen_active(lv_display_get_default()); +} + +/** + * Get the top layer of the default display + * @return pointer to the top layer + */ +static inline lv_obj_t * lv_layer_top(void) +{ + return lv_display_get_layer_top(lv_display_get_default()); +} + +/** + * Get the system layer of the default display + * @return pointer to the sys layer + */ +static inline lv_obj_t * lv_layer_sys(void) +{ + return lv_display_get_layer_sys(lv_display_get_default()); +} + +/** + * Get the bottom layer of the default display + * @return pointer to the bottom layer + */ +static inline lv_obj_t * lv_layer_bottom(void) +{ + return lv_display_get_layer_bottom(lv_display_get_default()); +} + +/*--------------------- + * OTHERS + *--------------------*/ + +/** + * Add an event handler to the display + * @param disp pointer to a display + * @param event_cb an event callback + * @param filter event code to react or `LV_EVENT_ALL` + * @param user_data optional user_data + */ +void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the number of event attached to a display + * @param disp pointer to a display + * @return number of events + */ +uint32_t lv_display_get_event_count(lv_display_t * disp); + +/** + * Get an event descriptor for an event + * @param disp pointer to a display + * @param index the index of the event + * @return the event descriptor + */ +lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index); + +/** + * Remove an event + * @param disp pointer to a display + * @param index the index of the event to remove + * @return true: and event was removed; false: no event was removed + */ +bool lv_display_delete_event(lv_display_t * disp, uint32_t index); + +/** + * Remove an event_cb with user_data + * @param disp pointer to a display + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data); + +/** + * Send an event to a display + * @param disp pointer to a display + * @param code an event code. LV_EVENT_... + * @param param optional param + * @return LV_RESULT_OK: disp wasn't deleted in the event. + */ +lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param); + +/** + * Set the theme of a display. If there are no user created widgets yet the screens' theme will be updated + * @param disp pointer to a display + * @param th pointer to a theme + */ +void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th); + +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_display_get_theme(lv_display_t * disp); + +/** + * Get elapsed time since last user activity on a display (e.g. click) + * @param disp pointer to a display (NULL to get the overall smallest inactivity) + * @return elapsed ticks (milliseconds) since the last activity + */ +uint32_t lv_display_get_inactive_time(const lv_display_t * disp); + +/** + * Manually trigger an activity on a display + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_display_trigger_activity(lv_display_t * disp); + +/** + * Temporarily enable and disable the invalidation of the display. + * @param disp pointer to a display (NULL to use the default display) + * @param en true: enable invalidation; false: invalidation + */ +void lv_display_enable_invalidation(lv_display_t * disp, bool en); + +/** + * Get display invalidation is enabled. + * @param disp pointer to a display (NULL to use the default display) + * @return return true if invalidation is enabled + */ +bool lv_display_is_invalidation_enabled(lv_display_t * disp); + +/** + * Get a pointer to the screen refresher timer to + * modify its parameters with `lv_timer_...` functions. + * @param disp pointer to a display + * @return pointer to the display refresher timer. (NULL on error) + */ +lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp); + +/** + * Delete screen refresher timer + * @param disp pointer to a display + */ +void lv_display_delete_refr_timer(lv_display_t * disp); + +void lv_display_set_user_data(lv_display_t * disp, void * user_data); +void lv_display_set_driver_data(lv_display_t * disp, void * driver_data); +void * lv_display_get_user_data(lv_display_t * disp); +void * lv_display_get_driver_data(lv_display_t * disp); +lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + +/*------------------------------------------------ + * To improve backward compatibility + * Recommended only if you have one display + *------------------------------------------------*/ + +#ifndef LV_HOR_RES +/** + * The horizontal resolution of the currently active display. + */ +#define LV_HOR_RES lv_display_get_horizontal_resolution(lv_display_get_default()) +#endif + +#ifndef LV_VER_RES +/** + * The vertical resolution of the currently active display. + */ +#define LV_VER_RES lv_display_get_vertical_resolution(lv_display_get_default()) +#endif + +/** + * Same as Android's DIP. (Different name is chosen to avoid mistype between LV_DPI and LV_DIP) + * 1 dip is 1 px on a 160 DPI screen + * 1 dip is 2 px on a 320 DPI screen + * https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp + */ +#define _LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ +#define LV_DPX(n) _LV_DPX_CALC(lv_display_get_dpi(NULL), n) + +/** + * Scale the given number of pixels (a distance or size) relative to a 160 DPI display + * considering the DPI of the default display. + * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the + * DPI of the display. + * @param n the number of pixels to scale + * @return `n x current_dpi/160` + */ +static inline int32_t lv_dpx(int32_t n) +{ + return LV_DPX(n); +} + +/** + * Scale the given number of pixels (a distance or size) relative to a 160 DPI display + * considering the DPI of the given display. + * It ensures that e.g. `lv_dpx(100)` will have the same physical size regardless to the + * DPI of the display. + * @param disp a display whose dpi should be considered + * @param n the number of pixels to scale + * @return `n x current_dpi/160` + */ +static inline int32_t lv_display_dpx(const lv_display_t * disp, int32_t n) +{ + return _LV_DPX_CALC(lv_display_get_dpi(disp), n); +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DISPLAY_H*/ diff --git a/libraries/lvgl/src/display/lv_display_private.h b/libraries/lvgl/src/display/lv_display_private.h new file mode 100644 index 0000000..c7d2569 --- /dev/null +++ b/libraries/lvgl/src/display/lv_display_private.h @@ -0,0 +1,165 @@ +/** + * @file lv_display_private.h + * + */ + +#ifndef LV_DISPLAY_PRIVATE_H +#define LV_DISPLAY_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../core/lv_obj.h" +#include "../draw/lv_draw.h" +#include "lv_display.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_INV_BUF_SIZE +#define LV_INV_BUF_SIZE 32 /*Buffer size for invalid areas*/ +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_display_t { + + /*--------------------- + * Resolution + *--------------------*/ + + /** Horizontal resolution.*/ + int32_t hor_res; + + /** Vertical resolution.*/ + int32_t ver_res; + + /** Horizontal resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + int32_t physical_hor_res; + + /** Vertical resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + int32_t physical_ver_res; + + /** Horizontal offset from the full / physical display. Set to 0 for fullscreen mode.*/ + int32_t offset_x; + + /** Vertical offset from the full / physical display. Set to 0 for fullscreen mode.*/ + int32_t offset_y; + + uint32_t dpi; /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/ + + /*--------------------- + * Buffering + *--------------------*/ + lv_draw_buf_t * buf_1; + lv_draw_buf_t * buf_2; + + /** Internal, used by the library*/ + lv_draw_buf_t * buf_act; + + /** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_display_flush_ready()' has to be + * called when finished*/ + lv_display_flush_cb_t flush_cb; + + /** + * Used to wait while flushing is ready. + * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. + * If not set `flushing` flag is used which can be cleared with `lv_display_flush_ready()`*/ + lv_display_flush_wait_cb_t flush_wait_cb; + + /*1: flushing is in progress. (It can't be a bit field because when it's cleared from IRQ Read-Modify-Write issue might occur)*/ + volatile int flushing; + + /*1: It was the last chunk to flush. (It can't be a bit field because when it's cleared from IRQ Read-Modify-Write issue might occur)*/ + volatile int flushing_last; + volatile uint32_t last_area : 1; /*1: the last area is being rendered*/ + volatile uint32_t last_part : 1; /*1: the last part of the current area is being rendered*/ + + lv_display_render_mode_t render_mode; + uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/ + + /** 1: The current screen rendering is in progress*/ + uint32_t rendering_in_progress : 1; + + lv_color_format_t color_format; + + /** Invalidated (marked to redraw) areas*/ + lv_area_t inv_areas[LV_INV_BUF_SIZE]; + uint8_t inv_area_joined[LV_INV_BUF_SIZE]; + uint32_t inv_p; + int32_t inv_en_cnt; + + /** Double buffer sync areas (redrawn during last refresh) */ + lv_ll_t sync_areas; + + lv_draw_buf_t _static_buf1; /*Used when user pass in a raw buffer as display draw buffer*/ + lv_draw_buf_t _static_buf2; + /*--------------------- + * Layer + *--------------------*/ + lv_layer_t * layer_head; + void (*layer_init)(lv_display_t * disp, lv_layer_t * layer); + void (*layer_deinit)(lv_display_t * disp, lv_layer_t * layer); + + /*--------------------- + * Screens + *--------------------*/ + + /** Screens of the display*/ + lv_obj_t ** screens; /**< Array of screen objects.*/ + lv_obj_t * act_scr; /**< Currently active screen on this display*/ + lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations*/ + lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_screen_load_anim*/ + lv_obj_t * bottom_layer; /**< @see lv_display_get_layer_bottom*/ + lv_obj_t * top_layer; /**< @see lv_display_get_layer_top*/ + lv_obj_t * sys_layer; /**< @see lv_display_get_layer_sys*/ + uint32_t screen_cnt; + uint8_t draw_prev_over_act : 1;/** 1: Draw previous screen over active screen*/ + uint8_t del_prev : 1; /** 1: Automatically delete the previous screen when the screen load animation is ready*/ + + /*--------------------- + * Others + *--------------------*/ + + void * driver_data; /**< Custom user data*/ + + void * user_data; /**< Custom user data*/ + + lv_event_list_t event_list; + + uint32_t sw_rotate : 1; /**< 1: use software rotation (slower)*/ + uint32_t rotation : 2; /**< Element of @lv_display_rotation_t*/ + + /**< The theme assigned to the screen*/ + lv_theme_t * theme; + + /** A timer which periodically checks the dirty areas and refreshes them*/ + lv_timer_t * refr_timer; + + /*Miscellaneous data*/ + uint32_t last_activity_time; /**< Last time when there was activity on this display*/ + + /** The area being refreshed*/ + lv_area_t refreshed_area; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DISPLAY_PRIVATE_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw.c b/libraries/lvgl/src/draw/lv_draw.c new file mode 100644 index 0000000..c73585e --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw.c @@ -0,0 +1,424 @@ +/** + * @file lv_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "sw/lv_draw_sw.h" +#include "../display/lv_display_private.h" +#include "../core/lv_global.h" +#include "../core/lv_refr.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check); + +static inline uint32_t get_layer_size_kb(uint32_t size_byte) +{ + return size_byte < 1024 ? 1 : size_byte >> 10; +} +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_init(void) +{ +#if LV_USE_OS + lv_thread_sync_init(&_draw_info.sync); +#endif +} + +void lv_draw_deinit(void) +{ +#if LV_USE_OS + lv_thread_sync_delete(&_draw_info.sync); +#endif + + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + lv_draw_unit_t * cur_unit = u; + u = u->next; + + if(cur_unit->delete_cb) cur_unit->delete_cb(cur_unit); + lv_free(cur_unit); + } + _draw_info.unit_head = NULL; +} + +void * lv_draw_create_unit(size_t size) +{ + lv_draw_unit_t * new_unit = lv_malloc_zeroed(size); + + new_unit->next = _draw_info.unit_head; + _draw_info.unit_head = new_unit; + + return new_unit; +} + +lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords) +{ + LV_PROFILER_BEGIN; + lv_draw_task_t * new_task = lv_malloc_zeroed(sizeof(lv_draw_task_t)); + + new_task->area = *coords; + new_task->_real_area = *coords; + new_task->clip_area = layer->_clip_area; + new_task->state = LV_DRAW_TASK_STATE_QUEUED; + + /*Find the tail*/ + if(layer->draw_task_head == NULL) { + layer->draw_task_head = new_task; + } + else { + lv_draw_task_t * tail = layer->draw_task_head; + while(tail->next) tail = tail->next; + + tail->next = new_task; + } + + LV_PROFILER_END; + return new_task; +} + +void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t) +{ + LV_PROFILER_BEGIN; + lv_draw_dsc_base_t * base_dsc = t->draw_dsc; + base_dsc->layer = layer; + + lv_draw_global_info_t * info = &_draw_info; + + /*Send LV_EVENT_DRAW_TASK_ADDED and dispatch only on the "main" draw_task + *and not on the draw tasks added in the event. + *Sending LV_EVENT_DRAW_TASK_ADDED events might cause recursive event sends and besides + *dispatching might remove the "main" draw task while it's still being used in the event*/ + + if(info->task_running == false) { + if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { + info->task_running = true; + lv_obj_send_event(base_dsc->obj, LV_EVENT_DRAW_TASK_ADDED, t); + info->task_running = false; + } + + /*Let the draw units set their preference score*/ + t->preference_score = 100; + t->preferred_draw_unit_id = 0; + lv_draw_unit_t * u = info->unit_head; + while(u) { + if(u->evaluate_cb) u->evaluate_cb(u, t); + u = u->next; + } + + lv_draw_dispatch(); + } + else { + /*Let the draw units set their preference score*/ + t->preference_score = 100; + t->preferred_draw_unit_id = 0; + lv_draw_unit_t * u = info->unit_head; + while(u) { + if(u->evaluate_cb) u->evaluate_cb(u, t); + u = u->next; + } + } + LV_PROFILER_END; +} + +void lv_draw_dispatch(void) +{ + LV_PROFILER_BEGIN; + bool render_running = false; + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + lv_layer_t * layer = disp->layer_head; + while(layer) { + if(lv_draw_dispatch_layer(disp, layer)) + render_running = true; + layer = layer->next; + } + if(!render_running) { + lv_draw_dispatch_request(); + } + disp = lv_display_get_next(disp); + } + LV_PROFILER_END; +} + +bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer) +{ + LV_PROFILER_BEGIN; + /*Remove the finished tasks first*/ + lv_draw_task_t * t_prev = NULL; + lv_draw_task_t * t = layer->draw_task_head; + while(t) { + lv_draw_task_t * t_next = t->next; + if(t->state == LV_DRAW_TASK_STATE_READY) { + if(t_prev) t_prev->next = t->next; /*Remove by it by assigning the next task to the previous*/ + else layer->draw_task_head = t_next; /*If it was the head, set the next as head*/ + + /*If it was layer drawing free the layer too*/ + if(t->type == LV_DRAW_TASK_TYPE_LAYER) { + lv_draw_image_dsc_t * draw_image_dsc = t->draw_dsc; + lv_layer_t * layer_drawn = (lv_layer_t *)draw_image_dsc->src; + + if(layer_drawn->draw_buf) { + int32_t h = lv_area_get_height(&layer_drawn->buf_area); + int32_t w = lv_area_get_width(&layer_drawn->buf_area); + uint32_t layer_size_byte = h * lv_draw_buf_width_to_stride(w, layer_drawn->color_format); + + _draw_info.used_memory_for_layers_kb -= get_layer_size_kb(layer_size_byte); + LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb); + lv_draw_buf_destroy(layer_drawn->draw_buf); + layer_drawn->draw_buf = NULL; + } + + /*Remove the layer from the display's*/ + if(disp) { + lv_layer_t * l2 = disp->layer_head; + while(l2) { + if(l2->next == layer_drawn) { + l2->next = layer_drawn->next; + break; + } + l2 = l2->next; + } + + if(disp->layer_deinit) disp->layer_deinit(disp, layer_drawn); + lv_free(layer_drawn); + } + } + lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t); + if(draw_label_dsc && draw_label_dsc->text_local) { + lv_free((void *)draw_label_dsc->text); + draw_label_dsc->text = NULL; + } + + lv_free(t->draw_dsc); + lv_free(t); + } + else { + t_prev = t; + } + t = t_next; + } + + bool render_running = false; + + /*This layer is ready, enable blending its buffer*/ + if(layer->parent && layer->all_tasks_added && layer->draw_task_head == NULL) { + /*Find a draw task with TYPE_LAYER in the layer where the src is this layer*/ + lv_draw_task_t * t_src = layer->parent->draw_task_head; + while(t_src) { + if(t_src->type == LV_DRAW_TASK_TYPE_LAYER && t_src->state == LV_DRAW_TASK_STATE_WAITING) { + lv_draw_image_dsc_t * draw_dsc = t_src->draw_dsc; + if(draw_dsc->src == layer) { + t_src->state = LV_DRAW_TASK_STATE_QUEUED; + lv_draw_dispatch_request(); + break; + } + } + t_src = t_src->next; + } + } + /*Assign draw tasks to the draw_units*/ + else { + /*Find a draw unit which is not busy and can take at least one task*/ + /*Let all draw units to pick draw tasks*/ + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + int32_t taken_cnt = u->dispatch_cb(u, layer); + if(taken_cnt >= 0) render_running = true; + u = u->next; + } + } + + LV_PROFILER_END; + return render_running; +} + +void lv_draw_dispatch_wait_for_request(void) +{ +#if LV_USE_OS + lv_thread_sync_wait(&_draw_info.sync); +#else + while(!_draw_info.dispatch_req); + _draw_info.dispatch_req = 0; +#endif +} + +void lv_draw_dispatch_request(void) +{ +#if LV_USE_OS + lv_thread_sync_signal(&_draw_info.sync); +#else + _draw_info.dispatch_req = 1; +#endif +} + +lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id) +{ + LV_PROFILER_BEGIN; + /*If the first task is screen sized, there cannot be independent areas*/ + if(layer->draw_task_head) { + int32_t hor_res = lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()); + int32_t ver_res = lv_display_get_vertical_resolution(_lv_refr_get_disp_refreshing()); + lv_draw_task_t * t = layer->draw_task_head; + if(t->state != LV_DRAW_TASK_STATE_QUEUED && + t->area.x1 <= 0 && t->area.x2 >= hor_res - 1 && + t->area.y1 <= 0 && t->area.y2 >= ver_res - 1) { + LV_PROFILER_END; + return NULL; + } + } + + lv_draw_task_t * t = t_prev ? t_prev->next : layer->draw_task_head; + while(t) { + /*Find a queued and independent task*/ + if(t->state == LV_DRAW_TASK_STATE_QUEUED && + (t->preferred_draw_unit_id == LV_DRAW_UNIT_ID_ANY || t->preferred_draw_unit_id == draw_unit_id) && + is_independent(layer, t)) { + LV_PROFILER_END; + return t; + } + t = t->next; + } + + LV_PROFILER_END; + return NULL; +} + +uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check) +{ + if(t_check == NULL) return 0; + if(t_check->next == NULL) return 0; + + LV_PROFILER_BEGIN; + uint32_t cnt = 0; + + lv_draw_task_t * t = t_check->next; + while(t) { + if((t->state == LV_DRAW_TASK_STATE_QUEUED || t->state == LV_DRAW_TASK_STATE_WAITING) && + _lv_area_is_on(&t_check->area, &t->area)) { + cnt++; + } + + t = t->next; + } + LV_PROFILER_END; + return cnt; +} + +lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area) +{ + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_layer_t * new_layer = lv_malloc_zeroed(sizeof(lv_layer_t)); + LV_ASSERT_MALLOC(new_layer); + if(new_layer == NULL) return NULL; + + new_layer->parent = parent_layer; + new_layer->_clip_area = *area; + new_layer->buf_area = *area; + new_layer->color_format = color_format; + + if(disp->layer_head) { + lv_layer_t * tail = disp->layer_head; + while(tail->next) tail = tail->next; + tail->next = new_layer; + } + else { + disp->layer_head = new_layer; + } + + return new_layer; +} + +void * lv_draw_layer_alloc_buf(lv_layer_t * layer) +{ + /*If the buffer of the layer is already allocated return it*/ + if(layer->draw_buf != NULL) { + return layer->draw_buf->data; + } + + /*If the buffer of the layer is not allocated yet, allocate it now*/ + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + uint32_t layer_size_byte = h * lv_draw_buf_width_to_stride(w, layer->color_format); + + layer->draw_buf = lv_draw_buf_create(w, h, layer->color_format, 0); + + if(layer->draw_buf == NULL) { + LV_LOG_WARN("Allocating layer buffer failed. Try later"); + return NULL; + } + + _draw_info.used_memory_for_layers_kb += get_layer_size_kb(layer_size_byte); + LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb); + + if(lv_color_format_has_alpha(layer->color_format)) { + lv_draw_buf_clear(layer->draw_buf, NULL); + } + + return layer->draw_buf->data; +} + +void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y) +{ + return lv_draw_buf_goto_xy(layer->draw_buf, x, y); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Check if there are older draw task overlapping the area of `t_check` + * @param layer the draw ctx to search in + * @param t_check check this task if it overlaps with the older ones + * @return true: `t_check` is not overlapping with older tasks so it's independent + */ +static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check) +{ + LV_PROFILER_BEGIN; + lv_draw_task_t * t = layer->draw_task_head; + + /*If t_check is outside of the older tasks then it's independent*/ + while(t && t != t_check) { + if(t->state != LV_DRAW_TASK_STATE_READY) { + lv_area_t a; + if(_lv_area_intersect(&a, &t->_real_area, &t_check->_real_area)) { + LV_PROFILER_END; + return false; + } + } + t = t->next; + } + LV_PROFILER_END; + + return true; +} diff --git a/libraries/lvgl/src/draw/lv_draw.h b/libraries/lvgl/src/draw/lv_draw.h new file mode 100644 index 0000000..0672bc5 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw.h @@ -0,0 +1,330 @@ +/** + * @file lv_draw.h + * + */ + +#ifndef LV_DRAW_H +#define LV_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" +#include "../misc/lv_text.h" +#include "../misc/lv_profiler.h" +#include "lv_image_decoder.h" +#include "../osal/lv_os.h" +#include "lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ +#define LV_DRAW_UNIT_ID_ANY 0 + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DRAW_TASK_TYPE_FILL, + LV_DRAW_TASK_TYPE_BORDER, + LV_DRAW_TASK_TYPE_BOX_SHADOW, + LV_DRAW_TASK_TYPE_LABEL, + LV_DRAW_TASK_TYPE_IMAGE, + LV_DRAW_TASK_TYPE_LAYER, + LV_DRAW_TASK_TYPE_LINE, + LV_DRAW_TASK_TYPE_ARC, + LV_DRAW_TASK_TYPE_TRIANGLE, + LV_DRAW_TASK_TYPE_MASK_RECTANGLE, + LV_DRAW_TASK_TYPE_MASK_BITMAP, + LV_DRAW_TASK_TYPE_VECTOR, +} lv_draw_task_type_t; + +typedef enum { + LV_DRAW_TASK_STATE_WAITING, /*Waiting for something to be finished. E.g. rendering a layer*/ + LV_DRAW_TASK_STATE_QUEUED, + LV_DRAW_TASK_STATE_IN_PROGRESS, + LV_DRAW_TASK_STATE_READY, +} lv_draw_task_state_t; + +struct _lv_draw_task_t { + lv_draw_task_t * next; + + lv_draw_task_type_t type; + + /** + * The area where to draw + */ + lv_area_t area; + + /** + * The real draw area. E.g. for shadow, outline, or transformed images it's different from `area` + */ + lv_area_t _real_area; + + /** The original area which is updated*/ + lv_area_t clip_area_original; + + /** + * The clip area of the layer is saved here when the draw task is created. + * As the clip area of the layer can be changed as new draw tasks are added its current value needs to be saved. + * Therefore during drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. + */ + lv_area_t clip_area; + + volatile int state; /*int instead of lv_draw_task_state_t to be sure its atomic*/ + + void * draw_dsc; + + /** + * The ID of the draw_unit which should take this task + */ + uint8_t preferred_draw_unit_id; + + /** + * Set to which extent `preferred_draw_unit_id` is good at this task. + * 80: means 20% better (faster) than software rendering + * 100: the default value + * 110: means 10% worse (slower) than software rendering + */ + uint8_t preference_score; + +}; + +typedef struct { + void * user_data; +} lv_draw_mask_t; + +struct _lv_draw_unit_t { + lv_draw_unit_t * next; + + /** + * The target_layer on which drawing should happen + */ + lv_layer_t * target_layer; + + const lv_area_t * clip_area; + + /** + * Called to try to assign a draw task to itself. + * `lv_draw_get_next_available_task` can be used to get an independent draw task. + * A draw task should be assign only if the draw unit can draw it too + * @param draw_unit pointer to the draw unit + * @param layer pointer to a layer on which the draw task should be drawn + * @return >=0: The number of taken draw task: + * 0 means the task has not yet been completed. + * 1 means a new task has been accepted. + * -1: The draw unit wanted to work on a task but couldn't do that + * due to some errors (e.g. out of memory). + * It signals that LVGL should call the dispatcher later again + * to let draw unit try to start the rendering again. + */ + int32_t (*dispatch_cb)(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + + /** + * + * @param draw_unit + * @param task + * @return + */ + int32_t (*evaluate_cb)(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + + /** + * Called to delete draw unit. + * @param draw_unit + * @return + */ + int32_t (*delete_cb)(lv_draw_unit_t * draw_unit); +}; + +struct _lv_layer_t { + + /** Target draw buffer of the layer*/ + lv_draw_buf_t * draw_buf; + + /** The absolute coordinates of the buffer */ + lv_area_t buf_area; + + /** The color format of the layer. LV_COLOR_FORMAT_... */ + lv_color_format_t color_format; + + /** + * NEVER USE IT DRAW UNITS. USED INTERNALLY DURING DRAW TASK CREATION. + * The current clip area with absolute coordinates, always the same or smaller than `buf_area` + * Can be set before new draw tasks are added to indicate the clip area of the draw tasks. + * Therefore `lv_draw_add_task()` always saves it in the new draw task to know the clip area when the draw task was added. + * During drawing the draw units also sees the saved clip_area and should use it during drawing. + * During drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. + */ + lv_area_t _clip_area; + + /** Linked list of draw tasks */ + lv_draw_task_t * draw_task_head; + + lv_layer_t * parent; + lv_layer_t * next; + bool all_tasks_added; + void * user_data; +}; + +typedef struct { + lv_obj_t * obj; + uint32_t part; + uint32_t id1; + uint32_t id2; + lv_layer_t * layer; + size_t dsc_size; + void * user_data; +} lv_draw_dsc_base_t; + +typedef struct { + lv_draw_unit_t * unit_head; + uint32_t used_memory_for_layers_kb; +#if LV_USE_OS + lv_thread_sync_t sync; +#else + int dispatch_req; +#endif + lv_mutex_t circle_cache_mutex; + bool task_running; +} lv_draw_global_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Used internally to initialize the drawing module + */ +void lv_draw_init(void); + +/** + * Deinitialize the drawing module + */ +void lv_draw_deinit(void); + +/** + * Allocate a new draw unit with the given size and appends it to the list of draw units + * @param size the size to allocate. E.g. `sizeof(my_draw_unit_t)`, + * where the first element of `my_draw_unit_t` is `lv_draw_unit_t`. + */ +void * lv_draw_create_unit(size_t size); + +/** + * Add an empty draw task to the draw task list of a layer. + * @param layer pointer to a layer + * @param coords the coordinates of the draw task + * @return the created draw task which needs to be + * further configured e.g. by added a draw descriptor + */ +lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords); + +/** + * Needs to be called when a draw task is created and configured. + * It will send an event about the new draw task to the widget + * and assign it to a draw unit. + * @param layer pointer to a layer + * @param t poinr to a draw task + */ +void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t); + +/** + * Try dispatching draw tasks to draw units + */ +void lv_draw_dispatch(void); + +/** + * Used internally to try dispatching draw tasks of a specific layer + * @param disp pointer to a display on which the dispatching was requested + * @param layer pointer to a layer + * @return at least one draw task is being rendered (maybe it was taken earlier) + */ +bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer); + +/** + * Wait for a new dispatch request. + * It's blocking if `LV_USE_OS == 0` else it yields + */ +void lv_draw_dispatch_wait_for_request(void); + +/** + * When a draw unit finished a draw task it needs to request dispatching + * to let LVGL assign a new draw task to it + */ +void lv_draw_dispatch_request(void); + +/** + * Find and available draw task + * @param layer the draw ctx to search in + * @param t_prev continue searching from this task + * @param draw_unit_id check the task where `preferred_draw_unit_id` equals this value or `LV_DRAW_UNIT_ID_ANY` + * @return tan available draw task or NULL if there is no any + */ +lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id); + +/** + * Tell how many draw task are waiting to be drawn on the area of `t_check`. + * It can be used to determine if a GPU shall combine many draw tasks in to one or not. + * If a lot of tasks are waiting for the current ones it makes sense to draw them one-by-one + * to not block the dependent tasks' rendering + * @param t_check the task whose dependent tasks shall be counted + * @return number of tasks depending on `t_check` + */ +uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check); + +/** + * Create a new layer on a parent layer + * @param parent_layer the parent layer to which the layer will be merged when it's rendered + * @param color_format the color format of the layer + * @param area the areas of the layer (absolute coordinates) + * @return the new target_layer or NULL on error + */ +lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area); + +/** + * Try to allocate a buffer for the layer. + * @param layer pointer to a layer + * @return pointer to the allocated aligned buffer or NULL on failure + */ +void * lv_draw_layer_alloc_buf(lv_layer_t * layer); + +/** + * Got to a pixel at X and Y coordinate on a layer + * @param layer pointer to a layer + * @param x the target X coordinate + * @param y the target X coordinate + * @return `buf` offset to point to the given X and Y coordinate + */ +void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * POST INCLUDES + *********************/ +#include "lv_draw_rect.h" +#include "lv_draw_label.h" +#include "lv_draw_image.h" +#include "lv_draw_arc.h" +#include "lv_draw_line.h" +#include "lv_draw_triangle.h" +#include "lv_draw_mask.h" + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_arc.c b/libraries/lvgl/src/draw/lv_draw_arc.c new file mode 100644 index 0000000..634c042 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_arc.c @@ -0,0 +1,172 @@ +/** + * @file lv_draw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "lv_draw_arc.h" +#include "../core/lv_obj_event.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_arc_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); +} + +lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_ARC ? (lv_draw_arc_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->start_angle == dsc->end_angle) return; + + LV_PROFILER_BEGIN; + lv_area_t a; + a.x1 = dsc->center.x - dsc->radius; + a.y1 = dsc->center.y - dsc->radius; + a.x2 = dsc->center.x + dsc->radius - 1; + a.y2 = dsc->center.y + dsc->radius - 1; + lv_draw_task_t * t = lv_draw_add_task(layer, &a); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_ARC; + + lv_draw_finalize_task_creation(layer, t); + + LV_PROFILER_END; +} + +void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, + lv_value_precise_t end_angle, + int32_t w, bool rounded, lv_area_t * area) +{ + int32_t rout = radius; + int32_t start_angle_int = (int32_t) start_angle; + int32_t end_angle_int = (int32_t) end_angle; + + /*Special case: full arc invalidation */ + if(end_angle_int == start_angle_int + 360) { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + return; + } + + if(start_angle_int > 360) start_angle_int -= 360; + if(end_angle_int > 360) end_angle_int -= 360; + + int32_t rin = radius - w; + int32_t extra_area = rounded ? w / 2 + 1 : 0; + uint8_t start_quarter = start_angle_int / 90; + uint8_t end_quarter = end_angle_int / 90; + + /*360 deg still counts as quarter 3 (360 / 90 would be 4)*/ + if(start_quarter == 4) start_quarter = 3; + if(end_quarter == 4) end_quarter = 3; + + if(start_quarter == end_quarter && start_angle_int <= end_angle_int) { + if(start_quarter == 0) { + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 1) { + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 2) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + } + else if(start_quarter == 0 && end_quarter == 1) { + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((LV_MIN(lv_trigo_sin(end_angle_int), + lv_trigo_sin(start_angle_int)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + rout + extra_area; + } + else if(start_quarter == 1 && end_quarter == 2) { + area->x1 = x - rout - extra_area; + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((LV_MAX(lv_trigo_sin(start_angle_int + 90), + lv_trigo_sin(end_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 2 && end_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y - rout - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + (LV_MAX(lv_trigo_sin(end_angle_int) * rin, + lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3 && end_quarter == 0) { + area->x1 = x + ((LV_MIN(lv_trigo_sin(end_angle_int + 90), + lv_trigo_sin(start_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + rout + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + } + else { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/draw/lv_draw_arc.h b/libraries/lvgl/src/draw/lv_draw_arc.h new file mode 100644 index 0000000..726bd68 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_arc.h @@ -0,0 +1,90 @@ +/** + * @file lv_draw_arc.h + * + */ + +#ifndef LV_DRAW_ARC_H +#define LV_DRAW_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + lv_color_t color; + int32_t width; + lv_value_precise_t start_angle; + lv_value_precise_t end_angle; + lv_point_t center; + uint16_t radius; + const void * img_src; + lv_opa_t opa; + uint8_t rounded : 1; +} lv_draw_arc_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an arc draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc); + +/** + * Try to get an arc draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_ARC + */ +lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task); + +/** + * Create an arc draw task. + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + */ +void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc); + +/** + * Get an area the should be invalidated when the arcs angle changed between start_angle and end_ange + * @param x the x coordinate of the center of the arc + * @param y the y coordinate of the center of the arc + * @param radius the radius of the arc + * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) + * @param end_angle the end angle of the arc + * @param w width of the arc + * @param rounded true: the arc is rounded + * @param area store the area to invalidate here + */ +void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, + lv_value_precise_t end_angle, + int32_t w, bool rounded, lv_area_t * area); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_ARC_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_buf.c b/libraries/lvgl/src/draw/lv_draw_buf.c new file mode 100644 index 0000000..bd7f740 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_buf.c @@ -0,0 +1,523 @@ +/** + * @file lv_draw_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "lv_draw_buf.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define handlers LV_GLOBAL_DEFAULT()->draw_buf_handlers + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * buf_malloc(size_t size, lv_color_format_t color_format); +static void buf_free(void * buf); +static void * buf_align(void * buf, lv_color_format_t color_format); +static void * draw_buf_malloc(size_t size_bytes, lv_color_format_t color_format); +static void draw_buf_free(void * buf); +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format); +static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_draw_buf_init_handlers(void) +{ + lv_memzero(&handlers, sizeof(lv_draw_buf_handlers_t)); + handlers.buf_malloc_cb = buf_malloc; + handlers.buf_free_cb = buf_free; + handlers.align_pointer_cb = buf_align; + handlers.invalidate_cache_cb = NULL; + handlers.width_to_stride_cb = width_to_stride; +} + +lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void) +{ + return &handlers; +} + +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + if(handlers.width_to_stride_cb) return handlers.width_to_stride_cb(w, color_format); + else return 0; +} + +void * lv_draw_buf_align(void * data, lv_color_format_t color_format) +{ + if(handlers.align_pointer_cb) return handlers.align_pointer_cb(data, color_format); + else return NULL; +} + +void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + if(handlers.invalidate_cache_cb) { + LV_ASSERT_NULL(draw_buf); + const lv_image_header_t * header = &draw_buf->header; + lv_area_t full; + if(area == NULL) { + full = (lv_area_t) { + 0, 0, header->w - 1, header->h - 1 + }; + area = &full; + } + handlers.invalidate_cache_cb(draw_buf, area); + } +} + +void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) +{ + LV_ASSERT_NULL(draw_buf); + if(a && lv_area_get_width(a) < 0) return; + if(a && lv_area_get_height(a) < 0) return; + + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + + if(a == NULL) { + lv_memzero(draw_buf->data, header->h * stride); + } + else { + uint8_t * bufc; + uint32_t line_length; + int32_t start_y, end_y; + uint8_t px_size = lv_color_format_get_size(header->cf); + bufc = lv_draw_buf_goto_xy(draw_buf, a->x1, a->y1); + line_length = lv_area_get_width(a) * px_size; + start_y = a->y1; + end_y = a->y2; + for(; start_y <= end_y; start_y++) { + lv_memzero(bufc, line_length); + bufc += stride; + } + } +} + +void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area) +{ + uint8_t * dest_bufc; + uint8_t * src_bufc; + int32_t line_width; + + /*Source and dest color format must be same. Color conversion is not supported yet.*/ + LV_ASSERT_FORMAT_MSG(dest->header.cf == src->header.cf, "Color format mismatch: %d != %d", + dest->header.cf, src->header.cf); + + if(dest_area == NULL) line_width = dest->header.w; + else line_width = lv_area_get_width(dest_area); + + /* For indexed image, copy the palette if we are copying full image area*/ + if(dest_area == NULL || src_area == NULL) { + if(LV_COLOR_FORMAT_IS_INDEXED(dest->header.cf)) { + lv_memcpy(dest->data, src->data, LV_COLOR_INDEXED_PALETTE_SIZE(dest->header.cf) * sizeof(lv_color32_t)); + } + } + + /*Check source and dest area have same width*/ + if((src_area == NULL && line_width != src->header.w) || \ + (src_area != NULL && line_width != lv_area_get_width(src_area))) { + LV_ASSERT_MSG(0, "Source and destination areas have different width"); + return; + } + + if(src_area) src_bufc = lv_draw_buf_goto_xy(src, src_area->x1, src_area->y1); + else src_bufc = lv_draw_buf_goto_xy(src, 0, 0); + + if(dest_area) dest_bufc = lv_draw_buf_goto_xy(dest, dest_area->x1, dest_area->y1); + else dest_bufc = lv_draw_buf_goto_xy(dest, 0, 0); + + int32_t start_y, end_y; + if(dest_area) { + start_y = dest_area->y1; + end_y = dest_area->y2; + } + else { + start_y = 0; + end_y = dest->header.h - 1; + } + + uint32_t dest_stride = dest->header.stride; + uint32_t src_stride = src->header.stride; + uint32_t line_bytes = (line_width * lv_color_format_get_bpp(dest->header.cf) + 7) >> 3; + + for(; start_y <= end_y; start_y++) { + lv_memcpy(dest_bufc, src_bufc, line_bytes); + dest_bufc += dest_stride; + src_bufc += src_stride; + } +} + +lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, + void * data, uint32_t data_size) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return LV_RESULT_INVALID; + + lv_memzero(draw_buf, sizeof(lv_draw_buf_t)); + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + if(stride * h > data_size) { + LV_LOG_WARN("Data size too small, required: %" LV_PRId32 ", provided: %" LV_PRId32, stride * h, + data_size); + return LV_RESULT_INVALID; + } + + lv_image_header_t * header = &draw_buf->header; + header->w = w; + header->h = h; + header->cf = cf; + header->stride = stride; + header->flags = 0; + header->magic = LV_IMAGE_HEADER_MAGIC; + + draw_buf->data = lv_draw_buf_align(data, cf); + draw_buf->unaligned_data = data; + draw_buf->data_size = data_size; + if(draw_buf->data != draw_buf->unaligned_data) { + LV_LOG_WARN("Data is not aligned, ignored"); + } + return LV_RESULT_OK; +} + +lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) +{ + lv_draw_buf_t * draw_buf = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); + LV_ASSERT_MALLOC(draw_buf); + if(draw_buf == NULL) return NULL; + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); + + void * buf = draw_buf_malloc(size, cf); + /*Do not assert here as LVGL or the app might just want to try creating a draw_buf*/ + if(buf == NULL) { + LV_LOG_WARN("No memory: %"LV_PRIu32"x%"LV_PRIu32", cf: %d, stride: %"LV_PRIu32", %"LV_PRIu32"Byte, ", + w, h, cf, stride, size); + lv_free(draw_buf); + return NULL; + } + + draw_buf->header.w = w; + draw_buf->header.h = h; + draw_buf->header.cf = cf; + draw_buf->header.flags = LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED; + draw_buf->header.stride = stride; + draw_buf->header.magic = LV_IMAGE_HEADER_MAGIC; + draw_buf->data = lv_draw_buf_align(buf, cf); + draw_buf->unaligned_data = buf; + draw_buf->data_size = size; + return draw_buf; +} + +lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf) +{ + const lv_image_header_t * header = &draw_buf->header; + lv_draw_buf_t * new_buf = lv_draw_buf_create(header->w, header->h, header->cf, header->stride); + if(new_buf == NULL) return NULL; + + new_buf->header.flags = draw_buf->header.flags; + new_buf->header.flags |= LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED; + + /*Choose the smaller size to copy*/ + uint32_t size = LV_MIN(draw_buf->data_size, new_buf->data_size); + + /*Copy image data*/ + lv_memcpy(new_buf->data, draw_buf->data, size); + return new_buf; +} + +lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, + uint32_t stride) +{ + if(draw_buf == NULL) return NULL; + + /*If color format is unknown, keep using the original color format.*/ + if(cf == LV_COLOR_FORMAT_UNKNOWN) cf = draw_buf->header.cf; + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); + + if(size > draw_buf->data_size) { + LV_LOG_TRACE("Draw buf too small for new shape"); + return NULL; + } + + draw_buf->header.cf = cf; + draw_buf->header.w = w; + draw_buf->header.h = h; + draw_buf->header.stride = stride; + + return draw_buf; +} + +void lv_draw_buf_destroy(lv_draw_buf_t * buf) +{ + LV_ASSERT_NULL(buf); + if(buf == NULL) return; + + if(buf->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + draw_buf_free(buf->unaligned_data); + lv_free(buf); + } + else { + LV_LOG_ERROR("draw buffer is not allocated, ignored"); + } +} + +void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y) +{ + LV_ASSERT_NULL(buf); + if(buf == NULL) return NULL; + + uint8_t * data = buf->data; + + /*Skip palette*/ + data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t); + data += buf->header.stride * y; + + if(x == 0) return data; + + return data + x * lv_color_format_get_size(buf->header.cf); +} + +lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride) +{ + LV_ASSERT_NULL(src); + LV_ASSERT_NULL(src->data); + if(src == NULL) return LV_RESULT_INVALID; + if(src->data == NULL) return LV_RESULT_INVALID; + + const lv_image_header_t * header = &src->header; + uint32_t w = header->w; + uint32_t h = header->h; + + /*Use global stride*/ + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, header->cf); + + /*Check if stride already match*/ + if(header->stride == stride) return LV_RESULT_OK; + + /*Calculate the minimal stride allowed from bpp*/ + uint32_t bpp = lv_color_format_get_bpp(header->cf); + uint32_t min_stride = (w * bpp + 7) >> 3; + if(stride < min_stride) { + LV_LOG_WARN("New stride is too small. min: %" LV_PRId32, min_stride); + return LV_RESULT_INVALID; + } + + /*Check if buffer has enough space. */ + uint32_t new_size = _calculate_draw_buf_size(w, h, header->cf, stride); + if(new_size > src->data_size) { + return LV_RESULT_INVALID; + } + + uint32_t offset = LV_COLOR_INDEXED_PALETTE_SIZE(header->cf) * 4; + + if(stride > header->stride) { + /*Copy from the last line to the first*/ + uint8_t * src_data = src->data + offset + header->stride * (h - 1); + uint8_t * dst_data = src->data + offset + stride * (h - 1); + for(uint32_t y = 0; y < h; y++) { + lv_memmove(dst_data, src_data, min_stride); + src_data -= header->stride; + dst_data -= stride; + } + } + else { + /*Copy from the first line to the last*/ + uint8_t * src_data = src->data + offset; + uint8_t * dst_data = src->data + offset; + for(uint32_t y = 0; y < h; y++) { + lv_memmove(dst_data, src_data, min_stride); + src_data += header->stride; + dst_data += stride; + } + } + + src->header.stride = stride; + + return LV_RESULT_OK; +} + +lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return LV_RESULT_INVALID; + + if(draw_buf->header.flags & LV_IMAGE_FLAGS_PREMULTIPLIED) return LV_RESULT_INVALID; + if((draw_buf->header.flags & LV_IMAGE_FLAGS_MODIFIABLE) == 0) { + LV_LOG_WARN("draw buf is not modifiable: 0x%04x", draw_buf->header.flags); + return LV_RESULT_INVALID; + } + + /*Premultiply color with alpha, do case by case by judging color format*/ + lv_color_format_t cf = draw_buf->header.cf; + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + int size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); + lv_color32_t * palette = (lv_color32_t *)draw_buf->data; + for(int i = 0; i < size; i++) { + lv_color_premultiply(&palette[i]); + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8888) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint8_t * line = (uint8_t *)draw_buf->data; + for(uint32_t y = 0; y < h; y++) { + lv_color32_t * pixel = (lv_color32_t *)line; + for(uint32_t x = 0; x < w; x++) { + lv_color_premultiply(pixel); + pixel++; + } + line += stride; + } + } + else if(cf == LV_COLOR_FORMAT_RGB565A8) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint32_t alpha_stride = stride / 2; + uint8_t * line = (uint8_t *)draw_buf->data; + lv_opa_t * alpha = (lv_opa_t *)(line + stride * h); + for(uint32_t y = 0; y < h; y++) { + lv_color16_t * pixel = (lv_color16_t *)line; + for(uint32_t x = 0; x < w; x++) { + lv_color16_premultiply(pixel, alpha[x]); + pixel++; + } + line += stride; + alpha += alpha_stride; + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8565) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint8_t * line = (uint8_t *)draw_buf->data; + for(uint32_t y = 0; y < h; y++) { + uint8_t * pixel = line; + for(uint32_t x = 0; x < w; x++) { + uint8_t alpha = pixel[2]; + lv_color16_premultiply((lv_color16_t *)pixel, alpha); + pixel += 3; + } + line += stride; + } + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + /*Pass*/ + } + else { + LV_LOG_WARN("draw buf has no alpha, cf: %d", cf); + } + + draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; + + return LV_RESULT_OK; +} + +void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return; + + if(!LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { + LV_LOG_WARN("Not indexed color format"); + return; + } + + uint8_t * buf = (uint8_t *)draw_buf->data; + lv_memcpy(&buf[index * sizeof(color)], &color, sizeof(color)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * buf_malloc(size_t size_bytes, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + /*Allocate larger memory to be sure it can be aligned as needed*/ + size_bytes += LV_DRAW_BUF_ALIGN - 1; + return lv_malloc(size_bytes); +} + +static void buf_free(void * buf) +{ + lv_free(buf); +} + +static void * buf_align(void * buf, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + uint8_t * buf_u8 = buf; + if(buf_u8) { + buf_u8 += LV_DRAW_BUF_ALIGN - 1; + buf_u8 = (uint8_t *)((lv_uintptr_t) buf_u8 & ~(LV_DRAW_BUF_ALIGN - 1)); + } + return buf_u8; +} + +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + uint32_t width_byte; + width_byte = w * lv_color_format_get_bpp(color_format); + width_byte = (width_byte + 7) >> 3; /*Round up*/ + return (width_byte + LV_DRAW_BUF_STRIDE_ALIGN - 1) & ~(LV_DRAW_BUF_STRIDE_ALIGN - 1); +} + +static void * draw_buf_malloc(size_t size_bytes, lv_color_format_t color_format) +{ + if(handlers.buf_malloc_cb) return handlers.buf_malloc_cb(size_bytes, color_format); + else return NULL; +} + +static void draw_buf_free(void * buf) +{ + if(handlers.buf_free_cb) handlers.buf_free_cb(buf); +} + +/** + * For given width, height, color format, and stride, calculate the size needed for a new draw buffer. + */ +static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) +{ + uint32_t size; + + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + size = stride * h; + if(cf == LV_COLOR_FORMAT_RGB565A8) { + size += (stride / 2) * h; /*A8 mask*/ + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + /*@todo we have to include palette right before image data*/ + size += LV_COLOR_INDEXED_PALETTE_SIZE(cf) * 4; + } + + return size; +} diff --git a/libraries/lvgl/src/draw/lv_draw_buf.h b/libraries/lvgl/src/draw/lv_draw_buf.h new file mode 100644 index 0000000..499285b --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_buf.h @@ -0,0 +1,301 @@ +/** + * @file lv_draw_buf.h + * + */ + +#ifndef LV_DRAW_BUF_H +#define LV_DRAW_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../stdlib/lv_string.h" +#include "lv_image_dsc.h" + +/********************* + * DEFINES + *********************/ + +/*Use this value to let LVGL calculate stride automatically*/ +#define LV_STRIDE_AUTO 0 +LV_EXPORT_CONST_INT(LV_STRIDE_AUTO); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_image_header_t header; + uint32_t data_size; /*Total buf size in bytes*/ + uint8_t * data; + void * unaligned_data; /*Unaligned address of `data`, used internally by lvgl*/ +} lv_draw_buf_t; + +/** + * Stride alignment for draw buffers. + * It may vary between different color formats and hardware. + * Refine it to suit your needs. + */ + +#define _LV_DRAW_BUF_STRIDE(w, cf) \ + ((((w) * LV_COLOR_FORMAT_GET_BPP(cf) + 7) / 8 + (LV_DRAW_BUF_STRIDE_ALIGN) - 1) & ~((LV_DRAW_BUF_STRIDE_ALIGN) - 1)) + +#define _LV_DRAW_BUF_SIZE(w, h, cf) \ + (_LV_DRAW_BUF_STRIDE(w, cf) * (h)) + +/** + * Define a static draw buffer with the given width, height, and color format. + * Stride alignment is set to LV_DRAW_BUF_STRIDE_ALIGN. + */ +#define LV_DRAW_BUF_DEFINE(name, _w, _h, _cf) \ + static uint8_t buf_##name[_LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \ + static lv_draw_buf_t name = { \ + .header = { \ + .magic = LV_IMAGE_HEADER_MAGIC, \ + .cf = (_cf), \ + .flags = LV_IMAGE_FLAGS_MODIFIABLE, \ + .w = (_w), \ + .h = (_h), \ + .stride = _LV_DRAW_BUF_STRIDE(_w, _cf), \ + .reserved_2 = 0, \ + }, \ + .data_size = sizeof(buf_##name), \ + .data = buf_##name, \ + .unaligned_data = buf_##name, \ + } + +typedef void * (*lv_draw_buf_malloc_cb)(size_t size, lv_color_format_t color_format); + +typedef void (*lv_draw_buf_free_cb)(void * draw_buf); + +typedef void * (*lv_draw_buf_align_cb)(void * buf, lv_color_format_t color_format); + +typedef void (*lv_draw_buf_invalidate_cache_cb)(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +typedef uint32_t (*lv_draw_buf_width_to_stride_cb)(uint32_t w, lv_color_format_t color_format); + +typedef struct { + lv_draw_buf_malloc_cb buf_malloc_cb; + lv_draw_buf_free_cb buf_free_cb; + lv_draw_buf_align_cb align_pointer_cb; + lv_draw_buf_invalidate_cache_cb invalidate_cache_cb; + lv_draw_buf_width_to_stride_cb width_to_stride_cb; +} lv_draw_buf_handlers_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called internally to initialize the draw_buf_handlers in lv_global + */ +void _lv_draw_buf_init_handlers(void); + +/** + * Get the struct which holds the callbacks for draw buf management. + * Custom callback can be set on the returned value + * @return pointer to the struct of handlers + */ +lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void); + +/** + * Align the address of a buffer. The buffer needs to be large enough for the real data after alignment + * @param buf the data to align + * @param color_format the color format of the buffer + * @return the aligned buffer + */ +void * lv_draw_buf_align(void * buf, lv_color_format_t color_format); + +/** + * Invalidate the cache of the buffer + * @param draw_buf the draw buffer needs to be invalidated + * @param area the area to invalidate in the buffer, + * use NULL to invalidate the whole draw buffer address range + */ +void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/** + * Calculate the stride in bytes based on a width and color format + * @param w the width in pixels + * @param color_format the color format + * @return the stride in bytes + */ +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format); + +/** + * Clear an area on the buffer + * @param draw_buf pointer to draw buffer + * @param a the area to clear, or NULL to clear the whole buffer + */ +void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a); + +/** + * Copy an area from a buffer to an other + * @param dest pointer to the destination draw buffer + * @param dest_area the area to copy from the destination buffer, if NULL, use the whole buffer + * @param src pointer to the source draw buffer + * @param src_area the area to copy from the destination buffer, if NULL, use the whole buffer + * @note `dest_area` and `src_area` should have the same width and height + * @note `dest` and `src` should have same color format. Color converting is not supported fow now. + */ +void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area); + +/** + * Note: Eventually, lv_draw_buf_malloc/free will be kept as private. + * For now, we use `create` to distinguish with malloc. + * + * Create an draw buf by allocating struct for `lv_draw_buf_t` and allocating a buffer for it + * that meets specified requirements. + * + * @param w the buffer width in pixels + * @param h the buffer height in pixels + * @param cf the color format for image + * @param stride the stride in bytes for image. Use 0 for automatic calculation based on + * w, cf, and global stride alignment configuration. + */ +lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); + +/** + * Initialize a draw buf with the given buffer and parameters. + * @param draw_buf the draw buf to initialize + * @param w the buffer width in pixels + * @param h the buffer height in pixels + * @param cf the color format + * @param stride the stride in bytes. Use 0 for automatic calculation + * @param data the buffer used for drawing. Unaligned `data` will be aligned internally + * @param data_size the size of the buffer in bytes + * @return return LV_RESULT_OK on success, LV_RESULT_INVALID otherwise + */ +lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, + void * data, uint32_t data_size); + +/** + * Duplicate a draw buf with same image size, stride and color format. Copy the image data too. + * @param draw_buf the draw buf to duplicate + * @return the duplicated draw buf on success, NULL if failed + */ +lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf); + +/** + * Keep using the existing memory, reshape the draw buffer to the given width and height. + * Return NULL if data_size is smaller than the required size. + * @param draw_buf pointer to a draw buffer + * @param cf the new color format, use 0 or LV_COLOR_FORMAT_UNKNOWN to keep using the original color format. + * @param w the new width in pixels + * @param h the new height in pixels + * @param stride the stride in bytes for image. Use 0 for automatic calculation. + */ +lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, + uint32_t stride); + +/** + * Destroy a draw buf by free the actual buffer if it's marked as LV_IMAGE_FLAGS_ALLOCATED in header. + * Then free the lv_draw_buf_t struct. + */ +void lv_draw_buf_destroy(lv_draw_buf_t * buf); + +/** + * Return pointer to the buffer at the given coordinates + */ +void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y); + +/** + * Adjust the stride of a draw buf in place. + * @param src pointer to a draw buffer + * @param stride the new stride in bytes for image. Use LV_STRIDE_AUTO for automatic calculation. + * @return LV_RESULT_OK: success or LV_RESULT_INVALID: failed + */ +lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride); + +/** + * Premultiply draw buffer color with alpha channel. + * If it's already premultiplied, return directly. + * Only color formats with alpha channel will be processed. + * + * @return LV_RESULT_OK: premultiply success + */ +lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf); + +static inline bool lv_draw_buf_has_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + return draw_buf->header.flags & flag; +} + +static inline void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags |= flag; +} + +static inline void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags &= ~flag; +} + +/** + * As of now, draw buf share same definition as `lv_image_dsc_t`. + * And is interchangeable with `lv_image_dsc_t`. + */ + +static inline void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img) +{ + lv_memcpy(buf, img, sizeof(lv_image_dsc_t)); + buf->unaligned_data = buf->data; +} + +static inline void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img) +{ + lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t)); +} + +/** + * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` + * @param draw_buf pointer to an image descriptor + * @param index the palette color to set: + * - for `LV_COLOR_FORMAT_I1`: 0..1 + * - for `LV_COLOR_FORMAT_I2`: 0..3 + * - for `LV_COLOR_FORMAT_I4`: 0..15 + * - for `LV_COLOR_FORMAT_I8`: 0..255 + * @param color the color to set in lv_color32_t format + */ +void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color); + +/** + * @deprecated Use lv_draw_buf_set_palette instead. + */ +static inline void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead."); + lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c); +} + +/** + * @deprecated Use lv_draw_buffer_create/destroy instead. + * Free the data pointer and dsc struct of an image. + */ +static inline void lv_image_buf_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead."); + if(dsc != NULL) { + if(dsc->data != NULL) + lv_free((void *)dsc->data); + + lv_free((void *)dsc); + } +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_BUF_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_image.c b/libraries/lvgl/src/draw/lv_draw_image.c new file mode 100644 index 0000000..941b631 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_image.c @@ -0,0 +1,295 @@ +/** + * @file lv_draw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_image.h" +#include "../display/lv_display.h" +#include "../misc/lv_log.h" +#include "../misc/lv_math.h" +#include "../core/lv_refr.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void img_decode_and_draw(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, + const lv_area_t * img_area, const lv_area_t * clipped_img_area, + lv_draw_image_core_cb draw_core_cb); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_image_dsc_t)); + dsc->recolor = lv_color_black(); + dsc->opa = LV_OPA_COVER; + dsc->scale_x = LV_SCALE_NONE; + dsc->scale_y = LV_SCALE_NONE; + dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; + dsc->original_area.x2 = LV_COORD_MIN; /*Indicate invalid area by default by setting a negative size*/ + dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); +} + +lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_IMAGE ? (lv_draw_image_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + lv_draw_task_t * t = lv_draw_add_task(layer, coords); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_LAYER; + t->state = LV_DRAW_TASK_STATE_WAITING; + + _lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&t->_real_area, coords->x1, coords->y1); + + lv_layer_t * layer_to_draw = (lv_layer_t *)dsc->src; + layer_to_draw->all_tasks_added = true; + + lv_draw_finalize_task_creation(layer, t); +} + +void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->src == NULL) { + LV_LOG_WARN("Image draw: src is NULL"); + return; + } + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_BEGIN; + + lv_draw_image_dsc_t * new_image_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(new_image_dsc, dsc, sizeof(*dsc)); + lv_result_t res = lv_image_decoder_get_info(new_image_dsc->src, &new_image_dsc->header); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Couldn't get info about the image"); + lv_free(new_image_dsc); + return; + } + + lv_draw_task_t * t = lv_draw_add_task(layer, coords); + t->draw_dsc = new_image_dsc; + t->type = LV_DRAW_TASK_TYPE_IMAGE; + + _lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&t->_real_area, coords->x1, coords->y1); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_END; +} + +lv_image_src_t lv_image_src_get_type(const void * src) +{ + if(src == NULL) return LV_IMAGE_SRC_UNKNOWN; + const uint8_t * u8_p = src; + + /*The first byte shows the type of the image source*/ + if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { + return LV_IMAGE_SRC_FILE; /*If it's an ASCII character then it's file name*/ + } + else if(u8_p[0] >= 0x80) { + return LV_IMAGE_SRC_SYMBOL; /*Symbols begins after 0x7F*/ + } + else { + return LV_IMAGE_SRC_VARIABLE; /*`lv_image_dsc_t` is draw to the first byte < 0x20*/ + } +} + +void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) +{ + if(draw_core_cb == NULL) { + LV_LOG_WARN("draw_core_cb is NULL"); + return; + } + + lv_area_t draw_area; + lv_area_copy(&draw_area, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_image_buf_get_transformed_area(&draw_area, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + draw_area.x1 += coords->x1; + draw_area.y1 += coords->y1; + draw_area.x2 += coords->x1; + draw_area.y2 += coords->y1; + } + + lv_area_t clipped_img_area; + if(!_lv_area_intersect(&clipped_img_area, &draw_area, draw_unit->clip_area)) { + return; + } + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + img_decode_and_draw(draw_unit, draw_dsc, &decoder_dsc, NULL, coords, &clipped_img_area, draw_core_cb); + + lv_image_decoder_close(&decoder_dsc); +} + +void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb) +{ + if(draw_core_cb == NULL) { + LV_LOG_WARN("draw_core_cb is NULL"); + return; + } + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + int32_t img_w = draw_dsc->header.w; + int32_t img_h = draw_dsc->header.h; + + lv_area_t tile_area = *coords; + lv_area_set_width(&tile_area, img_w); + lv_area_set_height(&tile_area, img_h); + + int32_t tile_x_start = tile_area.x1; + + lv_area_t relative_decoded_area = { + .x1 = LV_COORD_MIN, + .y1 = LV_COORD_MIN, + .x2 = LV_COORD_MIN, + .y2 = LV_COORD_MIN, + }; + + while(tile_area.y1 <= draw_unit->clip_area->y2) { + while(tile_area.x1 <= draw_unit->clip_area->x2) { + + lv_area_t clipped_img_area; + if(_lv_area_intersect(&clipped_img_area, &tile_area, draw_unit->clip_area)) { + img_decode_and_draw(draw_unit, draw_dsc, &decoder_dsc, &relative_decoded_area, &tile_area, &clipped_img_area, + draw_core_cb); + } + + tile_area.x1 += img_w; + tile_area.x2 += img_w; + } + + tile_area.y1 += img_h; + tile_area.y2 += img_h; + tile_area.x1 = tile_x_start; + tile_area.x2 = tile_x_start + img_w - 1; + } + + lv_image_decoder_close(&decoder_dsc); +} + +void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot) +{ + if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) { + res->x1 = 0; + res->y1 = 0; + res->x2 = w - 1; + res->y2 = h - 1; + return; + } + + lv_point_t p[4] = { + {0, 0}, + {w, 0}, + {0, h}, + {w, h}, + }; + lv_point_transform(&p[0], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[1], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[2], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[3], angle, scale_x, scale_y, pivot, true); + res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); + res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) - 1; + res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); + res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) - 1; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_decode_and_draw(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, + const lv_area_t * img_area, const lv_area_t * clipped_img_area, + lv_draw_image_core_cb draw_core_cb) +{ + lv_draw_image_sup_t sup; + sup.alpha_color = draw_dsc->recolor; + sup.palette = decoder_dsc->palette; + sup.palette_size = decoder_dsc->palette_size; + + /*The whole image is available, just draw it*/ + if(decoder_dsc->decoded && (relative_decoded_area == NULL || relative_decoded_area->x1 == LV_COORD_MIN)) { + draw_core_cb(draw_unit, draw_dsc, decoder_dsc, &sup, img_area, clipped_img_area); + } + /*Draw in smaller pieces*/ + else { + lv_area_t relative_full_area_to_decode = *clipped_img_area; + lv_area_move(&relative_full_area_to_decode, -img_area->x1, -img_area->y1); + lv_area_t tmp; + if(relative_decoded_area == NULL) relative_decoded_area = &tmp; + relative_decoded_area->x1 = LV_COORD_MIN; + relative_decoded_area->y1 = LV_COORD_MIN; + relative_decoded_area->x2 = LV_COORD_MIN; + relative_decoded_area->y2 = LV_COORD_MIN; + lv_result_t res = LV_RESULT_OK; + + while(res == LV_RESULT_OK) { + res = lv_image_decoder_get_area(decoder_dsc, &relative_full_area_to_decode, relative_decoded_area); + + lv_area_t absolute_decoded_area = *relative_decoded_area; + lv_area_move(&absolute_decoded_area, img_area->x1, img_area->y1); + if(res == LV_RESULT_OK) { + /*Limit draw area to the current decoded area and draw the image*/ + lv_area_t clipped_img_area_sub; + if(_lv_area_intersect(&clipped_img_area_sub, clipped_img_area, &absolute_decoded_area)) { + draw_core_cb(draw_unit, draw_dsc, decoder_dsc, &sup, + &absolute_decoded_area, &clipped_img_area_sub); + } + } + } + } +} diff --git a/libraries/lvgl/src/draw/lv_draw_image.h b/libraries/lvgl/src/draw/lv_draw_image.h new file mode 100644 index 0000000..a6a9be5 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_image.h @@ -0,0 +1,163 @@ +/** + * @file lv_draw_img.h + * + */ + +#ifndef LV_DRAW_IMAGE_H +#define LV_DRAW_IMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_image_decoder.h" +#include "lv_draw_buf.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color_t alpha_color; + const lv_color32_t * palette; + uint32_t palette_size : 9; +} lv_draw_image_sup_t; + +typedef struct _lv_draw_image_dsc_t { + lv_draw_dsc_base_t base; + + const void * src; + lv_image_header_t header; + + int32_t rotation; + int32_t scale_x; + int32_t scale_y; + int32_t skew_x; + int32_t skew_y; + lv_point_t pivot; + + lv_color_t recolor; + lv_opa_t recolor_opa; + + lv_opa_t opa; + lv_blend_mode_t blend_mode : 4; + + uint16_t antialias : 1; + uint16_t tile : 1; + lv_draw_image_sup_t * sup; + + /** Might be used to indicate the original size of the image if only a small portion is rendered now. + * Used when a part of a layer is rendered to show the total layer size*/ + lv_area_t original_area; + const lv_image_dsc_t * bitmap_mask_src; +} lv_draw_image_dsc_t; + +/** + * PErform the actual rendering of a decoded image + * @param draw_unit pointer to a draw unit + * @param draw_dsc the draw descriptor of the image + * @param decoder_dsc pointer to the decoded image's descriptor + * @param sup supplementary data + * @param img_coords the absolute coordinates of the image + * @param clipped_img_area the absolute clip coordinates + */ +typedef void (*lv_draw_image_core_cb)(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an image draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc); + +/** + * Try to get an image draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_IMAGE + */ +lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task); + +/** + * Create an image draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor + * @param coords the coordinates of the image + */ +void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +/** + * Create a draw task to blend a layer to an other layer + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor + * @param coords the coordinates of the layer + */ +void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +/** + * Get the type of an image source + * @param src pointer to an image source: + * - pointer to an 'lv_image_t' variable (image stored internally and compiled into the code) + * - a path to a file (e.g. "S:/folder/image.bin") + * - or a symbol (e.g. LV_SYMBOL_CLOSE) + * @return type of the image source LV_IMAGE_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN + */ +lv_image_src_t lv_image_src_get_type(const void * src); + +/** + * Can be used by draw units to handle the decoding and + * prepare everything for the actual image rendering + * @param draw_unit pointer to a draw unit + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + */ +void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); + +/** + * Can be used by draw units for TILED images to handle the decoding and + * prepare everything for the actual image rendering + * @param draw_unit pointer to a draw unit + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + */ +void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb); + +/** + * Get the area of a rectangle if its rotated and scaled + * @param res store the coordinates here + * @param w width of the rectangle to transform + * @param h height of the rectangle to transform + * @param angle angle of rotation + * @param scale_x zoom in x direction, (256 no zoom) + * @param scale_y zoom in y direction, (256 no zoom) + * @param pivot x,y pivot coordinates of rotation + */ +void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_IMAGE_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_label.c b/libraries/lvgl/src/draw/lv_draw_label.c new file mode 100644 index 0000000..515fbc4 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_label.c @@ -0,0 +1,439 @@ +/** + * @file lv_draw_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "lv_draw_label.h" +#include "../misc/lv_math.h" +#include "../core/lv_obj_event.h" +#include "../misc/lv_bidi.h" +#include "../misc/lv_assert.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define LABEL_RECOLOR_PAR_LENGTH 6 +#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_label_dsc_t)); + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->font = LV_FONT_DEFAULT; + dsc->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_color = lv_color_black(); + dsc->sel_bg_color = lv_palette_main(LV_PALETTE_BLUE); + dsc->bidi_dir = LV_BASE_DIR_LTR; + dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); +} + +lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_LABEL ? (lv_draw_label_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_glyph_dsc_t)); +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->text == NULL || dsc->text[0] == '\0') return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + + LV_PROFILER_BEGIN; + lv_draw_task_t * t = lv_draw_add_task(layer, coords); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_LABEL; + + /*The text is stored in a local variable so malloc memory for it*/ + if(dsc->text_local) { + lv_draw_label_dsc_t * new_dsc = t->draw_dsc; + new_dsc->text = lv_strdup(dsc->text); + } + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_END; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, + const lv_point_t * point, uint32_t unicode_letter) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + + if(_lv_text_is_marker(unicode_letter)) return; + + LV_PROFILER_BEGIN; + + lv_font_glyph_dsc_t g; + lv_font_get_glyph_dsc(dsc->font, &g, unicode_letter, 0); + + lv_area_t a; + a.x1 = point->x; + a.y1 = point->y; + a.x2 = a.x1 + g.adv_w; + a.y2 = a.y1 + lv_font_get_line_height(g.resolved_font ? g.resolved_font : dsc->font); + + /*lv_draw_label needs UTF8 text so convert the Unicode character to an UTF8 string */ + uint32_t letter_buf[2]; + letter_buf[0] = _lv_text_unicode_to_encoded(unicode_letter); + letter_buf[1] = '\0'; + + const char * letter_buf_char = (const char *)letter_buf; + +#if LV_BIG_ENDIAN_SYSTEM + while(*letter_buf_char == 0) ++letter_buf_char; +#endif + + dsc->text = letter_buf_char; + dsc->text_local = 1; + + lv_draw_label(layer, dsc, &a); + LV_PROFILER_END; +} + +void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, + lv_draw_glyph_cb_t cb) +{ + const lv_font_t * font = dsc->font; + int32_t w; + + lv_area_t clipped_area; + bool clip_ok = _lv_area_intersect(&clipped_area, coords, draw_unit->clip_area); + if(!clip_ok) return; + + lv_text_align_t align = dsc->align; + lv_base_dir_t base_dir = dsc->bidi_dir; + + lv_bidi_calculate_align(&align, &base_dir, dsc->text); + + if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { + /*Normally use the label's width as width*/ + w = lv_area_get_width(coords); + } + else { + /*If EXPAND is enabled then not limit the text's width to the object's width*/ + lv_point_t p; + lv_text_get_size(&p, dsc->text, dsc->font, dsc->letter_space, dsc->line_space, LV_COORD_MAX, + dsc->flag); + w = p.x; + } + + int32_t line_height_font = lv_font_get_line_height(font); + int32_t line_height = line_height_font + dsc->line_space; + + /*Init variables for the first line*/ + int32_t line_width = 0; + lv_point_t pos; + lv_point_set(&pos, coords->x1, coords->y1); + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + x_ofs = dsc->ofs_x; + y_ofs = dsc->ofs_y; + pos.y += y_ofs; + + uint32_t line_start = 0; + int32_t last_line_start = -1; + + /*Check the hint to use the cached info*/ + if(dsc->hint && y_ofs == 0 && coords->y1 < 0) { + /*If the label changed too much recalculate the hint.*/ + if(LV_ABS(dsc->hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { + dsc->hint->line_start = -1; + } + last_line_start = dsc->hint->line_start; + } + + /*Use the hint if it's valid*/ + if(dsc->hint && last_line_start >= 0) { + line_start = last_line_start; + pos.y += dsc->hint->y; + } + + uint32_t line_end = line_start + _lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, + dsc->flag); + + /*Go the first visible line*/ + while(pos.y + line_height_font < draw_unit->clip_area->y1) { + /*Go to next line*/ + line_start = line_end; + line_end += _lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + pos.y += line_height; + + /*Save at the threshold coordinate*/ + if(dsc->hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && dsc->hint->line_start < 0) { + dsc->hint->line_start = line_start; + dsc->hint->y = pos.y - coords->y1; + dsc->hint->coord_y = coords->y1; + } + + if(dsc->text[line_start] == '\0') return; + } + + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + pos.x += lv_area_get_width(coords) - line_width; + } + + uint32_t sel_start = dsc->sel_start; + uint32_t sel_end = dsc->sel_end; + if(sel_start > sel_end) { + uint32_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + + lv_area_t bg_coords; + lv_draw_glyph_dsc_t draw_letter_dsc; + lv_draw_glyph_dsc_init(&draw_letter_dsc); + draw_letter_dsc.opa = dsc->opa; + draw_letter_dsc.bg_coords = &bg_coords; + draw_letter_dsc.color = dsc->color; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.opa = dsc->opa; + int32_t underline_width = font->underline_thickness ? font->underline_thickness : 1; + int32_t line_start_x; + uint32_t i; + int32_t letter_w; + + /*Write out all lines*/ + while(dsc->text[line_start] != '\0') { + pos.x += x_ofs; + line_start_x = pos.x; + + /*Write all letter of a line*/ + i = 0; +#if LV_USE_BIDI + char * bidi_txt = lv_malloc(line_end - line_start + 1); + LV_ASSERT_MALLOC(bidi_txt); + _lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); +#else + const char * bidi_txt = dsc->text + line_start; +#endif + + while(i < line_end - line_start) { + uint32_t logical_char_pos = 0; + if(sel_start != 0xFFFF && sel_end != 0xFFFF) { +#if LV_USE_BIDI + logical_char_pos = _lv_text_encoded_get_char_id(dsc->text, line_start); + uint32_t t = _lv_text_encoded_get_char_id(bidi_txt, i); + logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); +#else + logical_char_pos = _lv_text_encoded_get_char_id(dsc->text, line_start + i); +#endif + } + + uint32_t letter; + uint32_t letter_next; + _lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + /*Always set the bg_coordinates for placeholder drawing*/ + bg_coords.x1 = pos.x; + bg_coords.y1 = pos.y; + bg_coords.x2 = pos.x + letter_w - 1; + bg_coords.y2 = pos.y + line_height - 1; + + if(i >= line_end - line_start) { + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + font->line_height - font->base_line - font->underline_position; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + cb(draw_unit, NULL, &fill_dsc, &fill_area); + } + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + (font->line_height - font->base_line) * 2 / 3 + font->underline_thickness / 2; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + cb(draw_unit, NULL, &fill_dsc, &fill_area); + } + } + + if(sel_start != 0xFFFF && sel_end != 0xFFFF && logical_char_pos >= sel_start && logical_char_pos < sel_end) { + draw_letter_dsc.color = dsc->sel_color; + fill_dsc.color = dsc->sel_bg_color; + cb(draw_unit, NULL, &fill_dsc, &bg_coords); + } + else { + draw_letter_dsc.color = dsc->color; + } + + draw_letter(draw_unit, &draw_letter_dsc, &pos, font, letter, cb); + + if(letter_w > 0) { + pos.x += letter_w + dsc->letter_space; + } + } + +#if LV_USE_BIDI + lv_free(bidi_txt); + bidi_txt = NULL; +#endif + /*Go to next line*/ + line_start = line_end; + line_end += _lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + + pos.x = coords->x1; + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + pos.x += lv_area_get_width(coords) - line_width; + } + + /*Go the next line position*/ + pos.y += line_height; + + if(pos.y > draw_unit->clip_area->y2) break; + } + + if(draw_letter_dsc._draw_buf) lv_draw_buf_destroy(draw_letter_dsc._draw_buf); + + LV_ASSERT_MEM_INTEGRITY(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb) +{ + lv_font_glyph_dsc_t g; + + if(_lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/ + return; + + LV_PROFILER_BEGIN; + bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) { + LV_PROFILER_END; + return; + } + + lv_area_t letter_coords; + letter_coords.x1 = pos->x + g.ofs_x; + letter_coords.x2 = letter_coords.x1 + g.box_w - 1; + letter_coords.y1 = pos->y + (font->line_height - font->base_line) - g.box_h - g.ofs_y; + letter_coords.y2 = letter_coords.y1 + g.box_h - 1; + + /*If the letter is completely out of mask don't draw it*/ + if(_lv_area_is_out(&letter_coords, draw_unit->clip_area, 0) && + _lv_area_is_out(dsc->bg_coords, draw_unit->clip_area, 0)) { + LV_PROFILER_END; + return; + } + + if(g.resolved_font) { + lv_draw_buf_t * draw_buf = NULL; + if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) { + /*Only check draw buf for bitmap glyph*/ + draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + if(dsc->_draw_buf) lv_draw_buf_destroy(dsc->_draw_buf); + + uint32_t h = g.box_h; + if(h * g.box_w < 64) h *= 2; /*Alloc a slightly larger buffer*/ + draw_buf = lv_draw_buf_create(g.box_w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + LV_ASSERT_MALLOC(draw_buf); + draw_buf->header.h = g.box_h; + dsc->_draw_buf = draw_buf; + } + } + + dsc->glyph_data = (void *)lv_font_get_glyph_bitmap(&g, letter, draw_buf); + dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE; + } + else { + dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + } + + dsc->letter_coords = &letter_coords; + dsc->g = &g; + cb(draw_unit, dsc, NULL, NULL); + + if(g.resolved_font && font->release_glyph) { + font->release_glyph(font, &g); + } + LV_PROFILER_END; +} diff --git a/libraries/lvgl/src/draw/lv_draw_label.h b/libraries/lvgl/src/draw/lv_draw_label.h new file mode 100644 index 0000000..f0b9628 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_label.h @@ -0,0 +1,167 @@ +/** + * @file lv_draw_label.h + * + */ + +#ifndef LV_DRAW_LABEL_H +#define LV_DRAW_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_bidi.h" +#include "../misc/lv_text.h" +#include "../misc/lv_color.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ +#define LV_DRAW_LABEL_NO_TXT_SEL (0xFFFF) + +/********************** + * TYPEDEFS + **********************/ + +/** Store some info to speed up drawing of very large texts + * It takes a lot of time to get the first visible character because + * all the previous characters needs to be checked to calculate the positions. + * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. + * Therefore the calculations can start from here.*/ +typedef struct _lv_draw_label_hint_t { + /** Index of the line at `y` coordinate*/ + int32_t line_start; + + /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ + int32_t y; + + /** The 'y1' coordinate of the label when the hint was saved. + * Used to invalidate the hint if the label has moved too much.*/ + int32_t coord_y; +} lv_draw_label_hint_t; + +typedef struct { + lv_draw_dsc_base_t base; + + const char * text; + const lv_font_t * font; + uint32_t sel_start; + uint32_t sel_end; + lv_color_t color; + lv_color_t sel_color; + lv_color_t sel_bg_color; + int32_t line_space; + int32_t letter_space; + int32_t ofs_x; + int32_t ofs_y; + lv_opa_t opa; + lv_base_dir_t bidi_dir; + lv_text_align_t align; + lv_text_flag_t flag; + lv_text_decor_t decor : 3; + lv_blend_mode_t blend_mode : 3; + /** + * < 1: malloc buffer and copy `text` there. + * 0: `text` is const and it's pointer will be valid during rendering.*/ + uint8_t text_local : 1; + lv_draw_label_hint_t * hint; +} lv_draw_label_dsc_t; + +typedef struct { + void * glyph_data; /*Depends on `format` field, it could be image source or draw buf of bitmap or vector data.*/ + lv_font_glyph_format_t format; + const lv_area_t * letter_coords; + const lv_area_t * bg_coords; + const lv_font_glyph_dsc_t * g; + lv_color_t color; + lv_opa_t opa; + lv_draw_buf_t * _draw_buf; /*a shared draw buf for get_bitmap, do not use it directly, use glyph_data instead*/ +} lv_draw_glyph_dsc_t; + +/** + * Passed as a parameter to `lv_draw_label_iterate_characters` to + * draw the characters one by one + * @param draw_unit pointer to a draw unit + * @param dsc pointer to `lv_draw_glyph_dsc_t` to describe the character to draw + * if NULL don't draw character + * @param fill_dsc pointer to a fill descriptor to draw a background for the character or + * underline or strike through + * if NULL do not fill anything + * @param fill_area the area to fill + * if NULL do not fill anything + */ +typedef void(*lv_draw_glyph_cb_t)(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, lv_draw_fill_dsc_t * fill_dsc, + const lv_area_t * fill_area); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a label draw descriptor + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); + +/** + * Try to get a label draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LABEL + */ +lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task); + +/** + * Initialize a glyph draw descriptor. + * Used internally. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc); + +/** + * Crate a draw task to render a text + * @param layer pointer to a layer + * @param dsc pointer to draw descriptor + * @param coords coordinates of the character + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +/** + * Crate a draw task to render a single character + * @param layer pointer to a layer + * @param dsc pointer to draw descriptor + * @param point position of the label + * @param unicode_letter the letter to draw + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, + const lv_point_t * point, uint32_t unicode_letter); + +/** + * Should be used during rendering the characters to get the position and other + * parameters of the characters + * @param draw_unit pointer to a draw unit + * @param dsc pointer to draw descriptor + * @param coords coordinates of the label + * @param cb a callback to call to draw each glyphs one by one + */ +void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, lv_draw_glyph_cb_t cb); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LABEL_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_line.c b/libraries/lvgl/src/draw/lv_draw_line.c new file mode 100644 index 0000000..f906699 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_line.c @@ -0,0 +1,72 @@ +/** + * @file lv_draw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "../core/lv_refr.h" +#include "../misc/lv_math.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_line_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); +} + +lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_LINE ? (lv_draw_line_dsc_t *)task->draw_dsc : NULL; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc) +{ + LV_PROFILER_BEGIN; + lv_area_t a; + a.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width; + a.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width; + a.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width; + a.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width; + + lv_draw_task_t * t = lv_draw_add_task(layer, &a); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_LINE; + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/draw/lv_draw_line.h b/libraries/lvgl/src/draw/lv_draw_line.h new file mode 100644 index 0000000..f070d0f --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_line.h @@ -0,0 +1,76 @@ +/** + * @file lv_draw_line.h + * + */ + +#ifndef LV_DRAW_LINE_H +#define LV_DRAW_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_dsc_base_t base; + + lv_point_precise_t p1; + lv_point_precise_t p2; + lv_color_t color; + int32_t width; + int32_t dash_width; + int32_t dash_gap; + lv_opa_t opa; + lv_blend_mode_t blend_mode : 2; + uint8_t round_start : 1; + uint8_t round_end : 1; + uint8_t raw_end : 1; /*Do not bother with perpendicular line ending if it's not visible for any reason*/ +} lv_draw_line_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a line draw descriptor + * @param dsc pointer to a draw descriptor + */ +void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); + +/** + * Try to get a line draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LINE + */ +lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task); + +/** + * Create a line draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LINE_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_mask.c b/libraries/lvgl/src/draw/lv_draw_mask.c new file mode 100644 index 0000000..ed1ff2b --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_mask.c @@ -0,0 +1,80 @@ +/** + * @file lv_draw_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_draw_mask.h" +#include "../core/lv_refr.h" +#include "../misc/lv_math.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_mask_rect_dsc_t)); +} + +lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_MASK_RECTANGLE ? (lv_draw_mask_rect_dsc_t *)task->draw_dsc : NULL; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc) +{ + if(!lv_color_format_has_alpha(layer->color_format)) { + LV_LOG_WARN("Only layers with alpha channel can be masked"); + return; + } + LV_PROFILER_BEGIN; + + lv_draw_task_t * t = lv_draw_add_task(layer, &layer->buf_area); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_MASK_RECTANGLE; + + lv_draw_dsc_base_t * base_dsc = t->draw_dsc; + base_dsc->layer = layer; + + if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { + /*Disable sending LV_EVENT_DRAW_TASK_ADDED first to avoid triggering recursive + *event calls due draw task adds in the event*/ + lv_obj_remove_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_send_event(dsc->base.obj, LV_EVENT_DRAW_TASK_ADDED, t); + lv_obj_add_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + } + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/draw/lv_draw_mask.h b/libraries/lvgl/src/draw/lv_draw_mask.h new file mode 100644 index 0000000..6357647 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_mask.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_mask_rect.h + * + */ + +#ifndef LV_DRAW_MASK_RECT_H +#define LV_DRAW_MASK_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_dsc_base_t base; + + lv_area_t area; + int32_t radius; +} lv_draw_mask_rect_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle mask draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc); + +/** + * Try to get a rectangle mask draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_MASK_RECTANGLE + */ +lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task); + +/** + * Create a draw task to mask a rectangle from the buffer + * @param layer pointer to a layer + * @param dsc pointer to a draw descriptor + */ +void lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_MASK_RECT_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_rect.c b/libraries/lvgl/src/draw/lv_draw_rect.c new file mode 100644 index 0000000..574d78a --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_rect.c @@ -0,0 +1,297 @@ +/** + * @file lv_draw_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "lv_draw_rect.h" +#include "../misc/lv_assert.h" +#include "../core/lv_obj_event.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_rect_dsc_t)); + dsc->bg_color = lv_color_white(); + dsc->bg_grad.stops[0].color = lv_color_white(); + dsc->bg_grad.stops[1].color = lv_color_black(); + dsc->bg_grad.stops[1].frac = 0xFF; + dsc->bg_grad.stops_count = 2; + dsc->border_color = lv_color_black(); + dsc->shadow_color = lv_color_black(); + dsc->bg_image_symbol_font = LV_FONT_DEFAULT; + dsc->bg_opa = LV_OPA_COVER; + dsc->bg_image_opa = LV_OPA_COVER; + dsc->outline_opa = LV_OPA_COVER; + dsc->border_opa = LV_OPA_COVER; + dsc->shadow_opa = LV_OPA_COVER; + dsc->border_side = LV_BORDER_SIDE_FULL; +} + +void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); +} + +lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_FILL ? (lv_draw_fill_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->side = LV_BORDER_SIDE_FULL; + dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); +} + +lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_BORDER ? (lv_draw_border_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); +} + +lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_BOX_SHADOW ? (lv_draw_box_shadow_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + + LV_PROFILER_BEGIN; + bool has_shadow; + bool has_fill; + bool has_border; + bool has_outline; + bool has_bg_img; + + if(dsc->shadow_width == 0 || + dsc->shadow_opa <= LV_OPA_MIN || + (dsc->shadow_width == 1 && dsc->shadow_spread <= 0 && + dsc->shadow_offset_x == 0 && dsc->shadow_offset_y == 0)) { + has_shadow = false; + } + else { + has_shadow = true; + } + + if(dsc->bg_opa <= LV_OPA_MIN) has_fill = false; + else has_fill = true; + + if(dsc->bg_image_opa <= LV_OPA_MIN || dsc->bg_image_src == NULL) has_bg_img = false; + else has_bg_img = true; + + if(dsc->border_opa <= LV_OPA_MIN || dsc->border_width == 0 || dsc->border_post == true) has_border = false; + else has_border = true; + + if(dsc->outline_opa <= LV_OPA_MIN || dsc->outline_width == 0) has_outline = false; + else has_outline = true; + + bool bg_cover = true; + if(dsc->bg_opa < LV_OPA_COVER) bg_cover = false; + else if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + uint32_t s; + for(s = 0; s < dsc->bg_grad.stops_count; s++) { + if(dsc->bg_grad.stops[s].opa != LV_OPA_COVER) { + bg_cover = false; + break; + } + } + } + + lv_draw_task_t * t; + + /*Shadow*/ + if(has_shadow) { + /*Check whether the shadow is visible*/ + t = lv_draw_add_task(layer, coords); + lv_draw_box_shadow_dsc_t * shadow_dsc = lv_malloc(sizeof(lv_draw_box_shadow_dsc_t)); + t->draw_dsc = shadow_dsc; + lv_area_increase(&t->_real_area, dsc->shadow_spread, dsc->shadow_spread); + lv_area_increase(&t->_real_area, dsc->shadow_width, dsc->shadow_width); + lv_area_move(&t->_real_area, dsc->shadow_offset_x, dsc->shadow_offset_y); + shadow_dsc->base = dsc->base; + shadow_dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); + shadow_dsc->radius = dsc->radius; + shadow_dsc->color = dsc->shadow_color; + shadow_dsc->width = dsc->shadow_width; + shadow_dsc->spread = dsc->shadow_spread; + shadow_dsc->opa = dsc->shadow_opa; + shadow_dsc->ofs_x = dsc->shadow_offset_x; + shadow_dsc->ofs_y = dsc->shadow_offset_y; + shadow_dsc->bg_cover = bg_cover; + t->type = LV_DRAW_TASK_TYPE_BOX_SHADOW; + lv_draw_finalize_task_creation(layer, t); + } + + /*Background*/ + if(has_fill) { + lv_area_t bg_coords = *coords; + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= LV_OPA_MAX && dsc->radius != 0) { + bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + + t = lv_draw_add_task(layer, &bg_coords); + lv_draw_fill_dsc_t * bg_dsc = lv_malloc(sizeof(lv_draw_fill_dsc_t)); + lv_draw_fill_dsc_init(bg_dsc); + t->draw_dsc = bg_dsc; + bg_dsc->base = dsc->base; + bg_dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); + bg_dsc->radius = dsc->radius; + bg_dsc->color = dsc->bg_color; + bg_dsc->grad = dsc->bg_grad; + bg_dsc->opa = dsc->bg_opa; + t->type = LV_DRAW_TASK_TYPE_FILL; + + lv_draw_finalize_task_creation(layer, t); + } + + /*Background image*/ + if(has_bg_img) { + lv_image_src_t src_type = lv_image_src_get_type(dsc->bg_image_src); + lv_result_t res = LV_RESULT_OK; + lv_image_header_t header; + if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { + res = lv_image_decoder_get_info(dsc->bg_image_src, &header); + } + else if(src_type == LV_IMAGE_SRC_UNKNOWN) { + res = LV_RESULT_INVALID; + } + else { + lv_memzero(&header, sizeof(header)); + } + + if(res == LV_RESULT_OK) { + if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { + + if(dsc->bg_image_tiled) { + t = lv_draw_add_task(layer, coords); + } + else { + lv_area_t a = {0, 0, header.w - 1, header.h - 1}; + lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); + t = lv_draw_add_task(layer, &a); + } + + lv_draw_image_dsc_t * bg_image_dsc = lv_malloc(sizeof(lv_draw_image_dsc_t)); + lv_draw_image_dsc_init(bg_image_dsc); + t->draw_dsc = bg_image_dsc; + bg_image_dsc->base = dsc->base; + bg_image_dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); + bg_image_dsc->src = dsc->bg_image_src; + bg_image_dsc->opa = dsc->bg_image_opa; + bg_image_dsc->recolor = dsc->bg_image_recolor; + bg_image_dsc->recolor_opa = dsc->bg_image_recolor_opa; + bg_image_dsc->tile = dsc->bg_image_tiled; + bg_image_dsc->header = header; + t->type = LV_DRAW_TASK_TYPE_IMAGE; + lv_draw_finalize_task_creation(layer, t); + } + else { + lv_point_t s; + lv_text_get_size(&s, dsc->bg_image_src, dsc->bg_image_symbol_font, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_area_t a = {0, 0, s.x - 1, s.y - 1}; + lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); + t = lv_draw_add_task(layer, &a); + + lv_draw_label_dsc_t * bg_label_dsc = lv_malloc(sizeof(lv_draw_label_dsc_t)); + lv_draw_label_dsc_init(bg_label_dsc); + t->draw_dsc = bg_label_dsc; + bg_label_dsc->base = dsc->base; + bg_label_dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); + bg_label_dsc->color = dsc->bg_image_recolor; + bg_label_dsc->font = dsc->bg_image_symbol_font; + bg_label_dsc->text = dsc->bg_image_src; + t->type = LV_DRAW_TASK_TYPE_LABEL; + lv_draw_finalize_task_creation(layer, t); + } + } + } + + /*Border*/ + if(has_border) { + t = lv_draw_add_task(layer, coords); + lv_draw_border_dsc_t * border_dsc = lv_malloc(sizeof(lv_draw_border_dsc_t)); + t->draw_dsc = border_dsc; + border_dsc->base = dsc->base; + border_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); + border_dsc->radius = dsc->radius; + border_dsc->color = dsc->border_color; + border_dsc->opa = dsc->border_opa; + border_dsc->width = dsc->border_width; + border_dsc->side = dsc->border_side; + t->type = LV_DRAW_TASK_TYPE_BORDER; + lv_draw_finalize_task_creation(layer, t); + } + + /*Outline*/ + if(has_outline) { + lv_area_t outline_coords = *coords; + lv_area_increase(&outline_coords, dsc->outline_width + dsc->outline_pad, dsc->outline_width + dsc->outline_pad); + t = lv_draw_add_task(layer, &outline_coords); + lv_draw_border_dsc_t * outline_dsc = lv_malloc(sizeof(lv_draw_border_dsc_t)); + t->draw_dsc = outline_dsc; + lv_area_increase(&t->_real_area, dsc->outline_width, dsc->outline_width); + lv_area_increase(&t->_real_area, dsc->outline_pad, dsc->outline_pad); + outline_dsc->base = dsc->base; + outline_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); + outline_dsc->radius = dsc->radius == LV_RADIUS_CIRCLE ? LV_RADIUS_CIRCLE : dsc->radius + dsc->outline_width + + dsc->outline_pad; + outline_dsc->color = dsc->outline_color; + outline_dsc->opa = dsc->outline_opa; + outline_dsc->width = dsc->outline_width; + outline_dsc->side = LV_BORDER_SIDE_FULL; + t->type = LV_DRAW_TASK_TYPE_BORDER; + lv_draw_finalize_task_creation(layer, t); + } + + LV_ASSERT_MEM_INTEGRITY(); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/draw/lv_draw_rect.h b/libraries/lvgl/src/draw/lv_draw_rect.h new file mode 100644 index 0000000..6fe3a82 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_rect.h @@ -0,0 +1,174 @@ +/** + * @file lv_draw_rect.h + * + */ + +#ifndef LV_DRAW_RECT_H +#define LV_DRAW_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" +#include "sw/lv_draw_sw_gradient.h" + +/********************* + * DEFINES + *********************/ +#define LV_RADIUS_CIRCLE 0x7FFF /**< A very big radius to always draw as circle*/ +LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + int32_t radius; + + /*Background*/ + lv_opa_t bg_opa; + lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/ + lv_grad_dsc_t bg_grad; + + /*Background img*/ + const void * bg_image_src; + const void * bg_image_symbol_font; + lv_color_t bg_image_recolor; + lv_opa_t bg_image_opa; + lv_opa_t bg_image_recolor_opa; + uint8_t bg_image_tiled; + + /*Border*/ + lv_color_t border_color; + int32_t border_width; + lv_opa_t border_opa; + lv_border_side_t border_side : 5; + uint8_t border_post : 1; /*The border will be drawn later*/ + + /*Outline*/ + lv_color_t outline_color; + int32_t outline_width; + int32_t outline_pad; + lv_opa_t outline_opa; + + /*Shadow*/ + lv_color_t shadow_color; + int32_t shadow_width; + int32_t shadow_offset_x; + int32_t shadow_offset_y; + int32_t shadow_spread; + lv_opa_t shadow_opa; +} lv_draw_rect_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + int32_t radius; + + lv_opa_t opa; + lv_color_t color; + lv_grad_dsc_t grad; +} lv_draw_fill_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + int32_t radius; + + lv_color_t color; + int32_t width; + lv_opa_t opa; + lv_border_side_t side : 5; + +} lv_draw_border_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + int32_t radius; + + lv_color_t color; + int32_t width; + int32_t spread; + int32_t ofs_x; + int32_t ofs_y; + lv_opa_t opa; + uint8_t bg_cover : 1; +} lv_draw_box_shadow_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); + +/** + * Initialize a fill draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc); + +/** + * Try to get a fill draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_FILL + */ +lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task); + +/** + * Initialize a border draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc); + +/** + * Try to get a border draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BORDER + */ +lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task); + +/** + * Initialize a box shadow draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc); + +/** + * Try to get a box shadow draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BOX_SHADOW + */ +lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task); + +/** + * The rectangle is a wrapper for fill, border, bg. image and box shadow. + * Internally fill, border, image and box shadow draw tasks will be created. + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + * @param coords the coordinates of the rectangle + */ +void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_RECT_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_triangle.c b/libraries/lvgl/src/draw/lv_draw_triangle.c new file mode 100644 index 0000000..ae18968 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_triangle.c @@ -0,0 +1,78 @@ +/** + * @file lv_draw_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" +#include "lv_draw_triangle.h" +#include "../misc/lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc) +{ + LV_PROFILER_BEGIN; + lv_memzero(dsc, sizeof(lv_draw_triangle_dsc_t)); + dsc->bg_color = lv_color_white(); + dsc->bg_grad.stops[0].color = lv_color_white(); + dsc->bg_grad.stops[1].color = lv_color_black(); + dsc->bg_grad.stops[1].frac = 0xFF; + dsc->bg_grad.stops_count = 2; + dsc->bg_opa = LV_OPA_COVER; + LV_PROFILER_END; +} + +lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_TRIANGLE ? (lv_draw_triangle_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * dsc) +{ + LV_PROFILER_BEGIN; + lv_area_t a; + a.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + a.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + a.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + a.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + lv_draw_task_t * t = lv_draw_add_task(layer, &a); + + t->draw_dsc = lv_malloc(sizeof(*dsc)); + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + t->type = LV_DRAW_TASK_TYPE_TRIANGLE; + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/draw/lv_draw_triangle.h b/libraries/lvgl/src/draw/lv_draw_triangle.h new file mode 100644 index 0000000..b825e53 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_triangle.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_triangle.h + * + */ + +#ifndef LV_DRAW_TRIANGLE_H +#define LV_DRAW_TRIANGLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_dsc_base_t base; + + lv_opa_t bg_opa; + lv_color_t bg_color; + lv_grad_dsc_t bg_grad; + + lv_point_precise_t p[3]; +} lv_draw_triangle_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a triangle draw descriptor + * @param dsc pointer to a draw descriptor + */ +void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * draw_dsc); + +/** + * Try to get a triangle draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_TRIANGLE + */ +lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task); + +/** + * Create a triangle draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized `lv_draw_triangle_dsc_t` variable + */ +void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * draw_dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRIANGLE_H*/ diff --git a/libraries/lvgl/src/draw/lv_draw_vector.c b/libraries/lvgl/src/draw/lv_draw_vector.c new file mode 100644 index 0000000..5b8d66e --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_vector.c @@ -0,0 +1,893 @@ +/** +* @file lv_draw_vector.c + * + */ + +/********************* +* INCLUDES + *********************/ +#include "lv_draw_vector.h" + +#if LV_USE_VECTOR_GRAPHIC + +#include "../misc/lv_ll.h" +#include "../stdlib/lv_string.h" +#include +#include +#include + +#define MATH_PI 3.14159265358979323846f +#define MATH_HALF_PI 1.57079632679489661923f + +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f + +#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) +#define MATH_DEGRESS(rad) ((rad) * RAD_TO_DEG) + +/********************* +* DEFINES + *********************/ + +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +#define CHECK_AND_RESIZE_PATH_CONTAINER(P, N) \ + do { \ + if ((lv_array_size(&(P)->ops) + (N)) > lv_array_capacity(&(P)->ops)) { \ + lv_array_resize(&(P)->ops, ((P)->ops.capacity << 1)); \ + } \ + if ((lv_array_size(&(P)->points) + (N)) > lv_array_capacity(&(P)->points)) { \ + lv_array_resize(&(P)->points, ((P)->points.capacity << 1)); \ + } \ + } while(0) + +/********************** +* TYPEDEFS + **********************/ + +typedef struct { + lv_vector_path_t * path; + lv_vector_draw_dsc_t dsc; +} _lv_vector_draw_task; + +/********************** +* STATIC PROTOTYPES + **********************/ + +static bool _is_identity_or_translation(const lv_matrix_t * matrix) +{ + return (matrix->m[0][0] == 1.0f && + matrix->m[0][1] == 0.0f && + matrix->m[1][0] == 0.0f && + matrix->m[1][1] == 1.0f && + matrix->m[2][0] == 0.0f && + matrix->m[2][1] == 0.0f && + matrix->m[2][2] == 1.0f); +} + +static void _multiply_matrix(lv_matrix_t * matrix, const lv_matrix_t * mul) +{ + /*TODO: use NEON to optimize this function on ARM architecture.*/ + lv_matrix_t tmp; + + for(int y = 0; y < 3; y++) { + for(int x = 0; x < 3; x++) { + tmp.m[y][x] = (matrix->m[y][0] * mul->m[0][x]) + + (matrix->m[y][1] * mul->m[1][x]) + + (matrix->m[y][2] * mul->m[2][x]); + } + } + + lv_memcpy(matrix, &tmp, sizeof(lv_matrix_t)); +} + +static void _copy_draw_dsc(lv_vector_draw_dsc_t * dst, const lv_vector_draw_dsc_t * src) +{ + dst->fill_dsc.style = src->fill_dsc.style; + dst->fill_dsc.color = src->fill_dsc.color; + dst->fill_dsc.opa = src->fill_dsc.opa; + dst->fill_dsc.fill_rule = src->fill_dsc.fill_rule; + dst->fill_dsc.gradient.style = src->fill_dsc.gradient.style; + dst->fill_dsc.gradient.cx = src->fill_dsc.gradient.cx; + dst->fill_dsc.gradient.cy = src->fill_dsc.gradient.cy; + dst->fill_dsc.gradient.cr = src->fill_dsc.gradient.cr; + dst->fill_dsc.gradient.spread = src->fill_dsc.gradient.spread; + lv_memcpy(&(dst->fill_dsc.gradient.grad), &(src->fill_dsc.gradient.grad), sizeof(lv_grad_dsc_t)); + lv_memcpy(&(dst->fill_dsc.img_dsc), &(src->fill_dsc.img_dsc), sizeof(lv_draw_image_dsc_t)); + lv_memcpy(&(dst->fill_dsc.matrix), &(src->fill_dsc.matrix), sizeof(lv_matrix_t)); + + dst->stroke_dsc.style = src->stroke_dsc.style; + dst->stroke_dsc.color = src->stroke_dsc.color; + dst->stroke_dsc.opa = src->stroke_dsc.opa; + dst->stroke_dsc.width = src->stroke_dsc.width; + dst->stroke_dsc.cap = src->stroke_dsc.cap; + dst->stroke_dsc.join = src->stroke_dsc.join; + dst->stroke_dsc.miter_limit = src->stroke_dsc.miter_limit; + lv_array_copy(&(dst->stroke_dsc.dash_pattern), &(src->stroke_dsc.dash_pattern)); + dst->stroke_dsc.gradient.style = src->stroke_dsc.gradient.style; + dst->stroke_dsc.gradient.cx = src->stroke_dsc.gradient.cx; + dst->stroke_dsc.gradient.cy = src->stroke_dsc.gradient.cy; + dst->stroke_dsc.gradient.cr = src->stroke_dsc.gradient.cr; + dst->stroke_dsc.gradient.spread = src->fill_dsc.gradient.spread; + lv_memcpy(&(dst->stroke_dsc.gradient.grad), &(src->stroke_dsc.gradient.grad), sizeof(lv_grad_dsc_t)); + lv_memcpy(&(dst->stroke_dsc.matrix), &(src->stroke_dsc.matrix), sizeof(lv_matrix_t)); + + dst->blend_mode = src->blend_mode; + lv_memcpy(&(dst->matrix), &(src->matrix), sizeof(lv_matrix_t)); + lv_area_copy(&(dst->scissor_area), &(src->scissor_area)); +} +/********************** +* GLOBAL FUNCTIONS + **********************/ + +/* matrix functions */ +void lv_matrix_identity(lv_matrix_t * matrix) +{ + matrix->m[0][0] = 1.0f; + matrix->m[0][1] = 0.0f; + matrix->m[0][2] = 0.0f; + matrix->m[1][0] = 0.0f; + matrix->m[1][1] = 1.0f; + matrix->m[1][2] = 0.0f; + matrix->m[2][0] = 0.0f; + matrix->m[2][1] = 0.0f; + matrix->m[2][2] = 1.0f; +} + +void lv_matrix_translate(lv_matrix_t * matrix, float dx, float dy) +{ + if(_is_identity_or_translation(matrix)) { + /*optimization for matrix translation.*/ + matrix->m[0][2] += dx; + matrix->m[1][2] += dy; + return; + } + + lv_matrix_t tlm = {{ + {1.0f, 0.0f, dx}, + {0.0f, 1.0f, dy}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &tlm); +} + +void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y) +{ + lv_matrix_t scm = {{ + {scale_x, 0.0f, 0.0f}, + {0.0f, scale_y, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &scm); +} + +void lv_matrix_rotate(lv_matrix_t * matrix, float degree) +{ + float radian = degree / 180.0f * (float)M_PI; + float cos_r = cosf(radian); + float sin_r = sinf(radian); + + lv_matrix_t rtm = {{ + {cos_r, -sin_r, 0.0f}, + {sin_r, cos_r, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &rtm); +} + +void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y) +{ + float rskew_x = skew_x / 180.0f * (float)M_PI; + float rskew_y = skew_y / 180.0f * (float)M_PI; + float tan_x = tanf(rskew_x); + float tan_y = tanf(rskew_y); + + lv_matrix_t skm = {{ + {1.0f, tan_x, 0.0f}, + {tan_y, 1.0f, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &skm); +} + +void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * m) +{ + _multiply_matrix(matrix, m); +} + +void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point) +{ + float x = point->x; + float y = point->y; + + point->x = x * matrix->m[0][0] + y * matrix->m[1][0] + matrix->m[0][2]; + point->y = x * matrix->m[0][1] + y * matrix->m[1][1] + matrix->m[1][2]; +} + +void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path) +{ + lv_fpoint_t * pt = lv_array_front(&path->points); + uint32_t size = lv_array_size(&path->points); + for(uint32_t i = 0; i < size; i++) { + lv_matrix_transform_point(matrix, &pt[i]); + } +} + +/* path functions */ +lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality) +{ + lv_vector_path_t * path = lv_malloc(sizeof(lv_vector_path_t)); + LV_ASSERT_MALLOC(path); + lv_memzero(path, sizeof(lv_vector_path_t)); + path->quality = quality; + lv_array_init(&path->ops, 8, sizeof(uint8_t)); + lv_array_init(&path->points, 8, sizeof(lv_fpoint_t)); + return path; +} + +void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path) +{ + target_path->quality = path->quality; + lv_array_copy(&target_path->ops, &path->ops); + lv_array_copy(&target_path->points, &path->points); +} + +void lv_vector_path_clear(lv_vector_path_t * path) +{ + lv_array_clear(&path->ops); + lv_array_clear(&path->points); +} + +void lv_vector_path_delete(lv_vector_path_t * path) +{ + lv_array_deinit(&path->ops); + lv_array_deinit(&path->points); + lv_free(path); +} + +void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p) +{ + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + uint8_t op = LV_VECTOR_PATH_OP_MOVE_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p); +} + +void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + uint8_t op = LV_VECTOR_PATH_OP_LINE_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p); +} + +void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 2); + + uint8_t op = LV_VECTOR_PATH_OP_QUAD_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p1); + lv_array_push_back(&path->points, p2); +} + +void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, + const lv_fpoint_t * p3) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 3); + + uint8_t op = LV_VECTOR_PATH_OP_CUBIC_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p1); + lv_array_push_back(&path->points, p2); + lv_array_push_back(&path->points, p3); +} + +void lv_vector_path_close(lv_vector_path_t * path) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + uint8_t op = LV_VECTOR_PATH_OP_CLOSE; + lv_array_push_back(&path->ops, &op); +} + +void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(area); + + uint32_t len = lv_array_size(&path->points); + if(len == 0) { + lv_memzero(area, sizeof(lv_area_t)); + return; + } + + lv_fpoint_t * p = lv_array_front(&path->points); + float x1 = p[0].x; + float x2 = p[0].x; + float y1 = p[0].y; + float y2 = p[0].y; + + for(uint32_t i = 1; i < len; i++) { + if(p[i].x < x1) x1 = p[i].x; + if(p[i].y < y1) y1 = p[i].y; + if(p[i].x > x2) x2 = p[i].x; + if(p[i].y > y2) y2 = p[i].y; + } + + area->x1 = (int32_t)x1; + area->y1 = (int32_t)y1; + area->x2 = (int32_t)x2; + area->y2 = (int32_t)y2; +} + +void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry) +{ + float x = rect->x1; + float y = rect->y1; + float w = (float)lv_area_get_width(rect); + float h = (float)lv_area_get_height(rect); + + float hw = w * 0.5f; + float hh = h * 0.5f; + + if(rx > hw) rx = hw; + if(ry > hh) ry = hh; + + if(rx == 0 && ry == 0) { + lv_fpoint_t pt = {x, y}; + lv_vector_path_move_to(path, &pt); + pt.x += w; + lv_vector_path_line_to(path, &pt); + pt.y += h; + lv_vector_path_line_to(path, &pt); + pt.x -= w; + lv_vector_path_line_to(path, &pt); + lv_vector_path_close(path); + } + else if(rx == hw && ry == hh) { + lv_fpoint_t pt = {x + w * 0.5f, y + h * 0.5f}; + lv_vector_path_append_circle(path, &pt, rx, ry); + } + else { + float hrx = rx * 0.5f; + float hry = ry * 0.5f; + lv_fpoint_t pt, pt2, pt3; + + pt.x = x + rx; + pt.y = y; + lv_vector_path_move_to(path, &pt); + + pt.x = x + w - rx; + pt.y = y; + lv_vector_path_line_to(path, &pt); + + pt.x = x + w - rx + hrx; + pt.y = y; + pt2.x = x + w; + pt2.y = y + ry - hry; + pt3.x = x + w; + pt3.y = y + ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x + w; + pt.y = y + h - ry; + lv_vector_path_line_to(path, &pt); + + pt.x = x + w; + pt.y = y + h - ry + hry; + pt2.x = x + w - rx + hrx; + pt2.y = y + h; + pt3.x = x + w - rx; + pt3.y = y + h; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x + rx; + pt.y = y + h; + lv_vector_path_line_to(path, &pt); + + pt.x = x + rx - hrx; + pt.y = y + h; + pt2.x = x; + pt2.y = y + h - ry + hry; + pt3.x = x; + pt3.y = y + h - ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x; + pt.y = y + ry; + lv_vector_path_line_to(path, &pt); + + pt.x = x; + pt.y = y + ry - hry; + pt2.x = x + rx - hrx; + pt2.y = y; + pt3.x = x + rx; + pt3.y = y; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + lv_vector_path_close(path); + } +} + +void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry) +{ + float krx = rx * 0.552284f; + float kry = ry * 0.552284f; + float cx = c->x; + float cy = c->y; + + lv_fpoint_t pt, pt2, pt3; + pt.x = cx; + pt.y = cy - ry; + lv_vector_path_move_to(path, &pt); + + pt.x = cx + krx; + pt.y = cy - ry; + pt2.x = cx + rx; + pt2.y = cy - kry; + pt3.x = cx + rx; + pt3.y = cy; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx + rx; + pt.y = cy + kry; + pt2.x = cx + krx; + pt2.y = cy + ry; + pt3.x = cx; + pt3.y = cy + ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx - krx; + pt.y = cy + ry; + pt2.x = cx - rx; + pt2.y = cy + kry; + pt3.x = cx - rx; + pt3.y = cy; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx - rx; + pt.y = cy - kry; + pt2.x = cx - krx; + pt2.y = cy - ry; + pt3.x = cx; + pt3.y = cy - ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + lv_vector_path_close(path); +} + +/** + * Add a arc to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param radius the radius for arc + * @param start_angle the start angle for arc + * @param sweep the sweep angle for arc, could be negative + * @param pie true: draw a pie, false: draw a arc + */ +void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, + float sweep, bool pie) +{ + float cx = c->x; + float cy = c->y; + + /* just circle */ + if(sweep >= 360.0f || sweep <= -360.0f) { + lv_vector_path_append_circle(path, c, radius, radius); + return; + } + + start_angle = MATH_RADIANS(start_angle); + sweep = MATH_RADIANS(sweep); + + int n_curves = (int)ceil(fabsf(sweep / MATH_HALF_PI)); + float sweep_sign = sweep < 0 ? -1.f : 1.f; + float fract = fmodf(sweep, MATH_HALF_PI); + fract = (fabsf(fract) < FLT_EPSILON) ? MATH_HALF_PI * sweep_sign : fract; + + /* Start from here */ + lv_fpoint_t start = { + .x = radius * cosf(start_angle), + .y = radius * sinf(start_angle), + }; + + if(pie) { + lv_vector_path_move_to(path, &(lv_fpoint_t) { + cx, cy + }); + lv_vector_path_line_to(path, &(lv_fpoint_t) { + start.x + cx, start.y + cy + }); + } + + for(int i = 0; i < n_curves; ++i) { + float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); + float end_x = radius * cosf(end_angle); + float end_y = radius * sinf(end_angle); + + /* variables needed to calculate bezier control points */ + + /** get bezier control points using article: + * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + */ + float ax = start.x; + float ay = start.y; + float bx = end_x; + float by = end_y; + float q1 = ax * ax + ay * ay; + float q2 = ax * bx + ay * by + q1; + float k2 = (4.0f / 3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + /* Next start point is the current end point */ + start.x = end_x; + start.y = end_y; + + end_x += cx; + end_y += cy; + + lv_fpoint_t ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; + lv_fpoint_t ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; + lv_fpoint_t end = {end_x, end_y}; + lv_vector_path_cubic_to(path, &ctrl1, &ctrl2, &end); + start_angle = end_angle; + } + + if(pie) { + lv_vector_path_close(path); + } +} + +void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath) +{ + uint32_t ops_size = lv_array_size(&path->ops); + uint32_t nops_size = lv_array_size(&subpath->ops); + uint32_t point_size = lv_array_size(&path->points); + uint32_t npoint_size = lv_array_size(&subpath->points); + + lv_array_concat(&path->ops, &subpath->ops); + path->ops.size = ops_size + nops_size; + + lv_array_concat(&path->points, &subpath->points); + path->points.size = point_size + npoint_size; +} + +/* draw dsc functions */ + +lv_vector_dsc_t * lv_vector_dsc_create(lv_layer_t * layer) +{ + lv_vector_dsc_t * dsc = lv_malloc(sizeof(lv_vector_dsc_t)); + LV_ASSERT_MALLOC(dsc); + lv_memzero(dsc, sizeof(lv_vector_dsc_t)); + + dsc->layer = layer; + + lv_vector_fill_dsc_t * fill_dsc = &(dsc->current_dsc.fill_dsc); + fill_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + fill_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + fill_dsc->opa = LV_OPA_COVER; + fill_dsc->fill_rule = LV_VECTOR_FILL_NONZERO; + lv_matrix_identity(&(fill_dsc->matrix)); /*identity matrix*/ + + lv_vector_stroke_dsc_t * stroke_dsc = &(dsc->current_dsc.stroke_dsc); + stroke_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + stroke_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + stroke_dsc->opa = LV_OPA_0; /*default no stroke*/ + stroke_dsc->width = 1.0f; + stroke_dsc->cap = LV_VECTOR_STROKE_CAP_BUTT; + stroke_dsc->join = LV_VECTOR_STROKE_JOIN_MITER; + stroke_dsc->miter_limit = 4.0f; + lv_matrix_identity(&(stroke_dsc->matrix)); /*identity matrix*/ + + dsc->current_dsc.blend_mode = LV_VECTOR_BLEND_SRC_OVER; + dsc->current_dsc.scissor_area = layer->_clip_area; + lv_matrix_identity(&(dsc->current_dsc.matrix)); /*identity matrix*/ + dsc->tasks.task_list = NULL; + return dsc; +} + +void lv_vector_dsc_delete(lv_vector_dsc_t * dsc) +{ + if(dsc->tasks.task_list) { + lv_ll_t * task_list = dsc->tasks.task_list; + _lv_vector_for_each_destroy_tasks(task_list, NULL, NULL); + dsc->tasks.task_list = NULL; + } + lv_array_deinit(&(dsc->current_dsc.stroke_dsc.dash_pattern)); + lv_free(dsc); +} + +void lv_vector_dsc_set_blend_mode(lv_vector_dsc_t * dsc, lv_vector_blend_t blend) +{ + dsc->current_dsc.blend_mode = blend; +} + +void lv_vector_dsc_set_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->current_dsc.matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_vector_dsc_set_fill_color(lv_vector_dsc_t * dsc, lv_color_t color) +{ + dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->current_dsc.fill_dsc.color = lv_color_to_32(color, 0xFF); +} + +void lv_vector_dsc_set_fill_color32(lv_vector_dsc_t * dsc, lv_color32_t color) +{ + dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->current_dsc.fill_dsc.color = color; +} + +void lv_vector_dsc_set_fill_opa(lv_vector_dsc_t * dsc, lv_opa_t opa) +{ + dsc->current_dsc.fill_dsc.opa = opa; +} + +void lv_vector_dsc_set_fill_rule(lv_vector_dsc_t * dsc, lv_vector_fill_t rule) +{ + dsc->current_dsc.fill_dsc.fill_rule = rule; +} + +void lv_vector_dsc_set_fill_image(lv_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc) +{ + dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_PATTERN; + lv_memcpy(&(dsc->current_dsc.fill_dsc.img_dsc), img_dsc, sizeof(lv_draw_image_dsc_t)); +} + +void lv_vector_dsc_set_fill_linear_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, + lv_vector_gradient_spread_t spread) +{ + dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->current_dsc.fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + dsc->current_dsc.fill_dsc.gradient.spread = spread; + lv_memcpy(&(dsc->current_dsc.fill_dsc.gradient.grad), grad, sizeof(lv_grad_dsc_t)); +} + +void lv_vector_dsc_set_fill_radial_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, float cx, float cy, + float radius, lv_vector_gradient_spread_t spread) +{ + dsc->current_dsc.fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->current_dsc.fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + dsc->current_dsc.fill_dsc.gradient.cx = cx; + dsc->current_dsc.fill_dsc.gradient.cy = cy; + dsc->current_dsc.fill_dsc.gradient.cr = radius; + dsc->current_dsc.fill_dsc.gradient.spread = spread; + lv_memcpy(&(dsc->current_dsc.fill_dsc.gradient.grad), grad, sizeof(lv_grad_dsc_t)); +} + +void lv_vector_dsc_set_fill_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->current_dsc.fill_dsc.matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_vector_dsc_set_stroke_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->current_dsc.stroke_dsc.matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_vector_dsc_set_stroke_color32(lv_vector_dsc_t * dsc, lv_color32_t color) +{ + dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->current_dsc.stroke_dsc.color = color; +} + +void lv_vector_dsc_set_stroke_color(lv_vector_dsc_t * dsc, lv_color_t color) +{ + dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->current_dsc.stroke_dsc.color = lv_color_to_32(color, 0xFF); +} + +void lv_vector_dsc_set_stroke_opa(lv_vector_dsc_t * dsc, lv_opa_t opa) +{ + dsc->current_dsc.stroke_dsc.opa = opa; +} + +void lv_vector_dsc_set_stroke_width(lv_vector_dsc_t * dsc, float width) +{ + dsc->current_dsc.stroke_dsc.width = width; +} + +void lv_vector_dsc_set_stroke_dash(lv_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count) +{ + lv_array_t * dash_array = &(dsc->current_dsc.stroke_dsc.dash_pattern); + if(dash_pattern) { + lv_array_clear(dash_array); + if(lv_array_capacity(dash_array) == 0) { + lv_array_init(dash_array, dash_count, sizeof(float)); + } + else { + lv_array_resize(dash_array, dash_count); + } + for(uint16_t i = 0; i < dash_count; i++) { + lv_array_push_back(dash_array, &dash_pattern[i]); + } + } + else { /*clear dash*/ + lv_array_clear(dash_array); + } +} + +void lv_vector_dsc_set_stroke_cap(lv_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap) +{ + dsc->current_dsc.stroke_dsc.cap = cap; +} + +void lv_vector_dsc_set_stroke_join(lv_vector_dsc_t * dsc, lv_vector_stroke_join_t join) +{ + dsc->current_dsc.stroke_dsc.join = join; +} + +void lv_vector_dsc_set_stroke_miter_limit(lv_vector_dsc_t * dsc, uint16_t miter_limit) +{ + dsc->current_dsc.stroke_dsc.miter_limit = miter_limit; +} + +void lv_vector_dsc_set_stroke_linear_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, + lv_vector_gradient_spread_t spread) +{ + dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->current_dsc.stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + dsc->current_dsc.stroke_dsc.gradient.spread = spread; + lv_memcpy(&(dsc->current_dsc.stroke_dsc.gradient.grad), grad, sizeof(lv_grad_dsc_t)); +} + +void lv_vector_dsc_set_stroke_radial_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, float cx, float cy, + float radius, lv_vector_gradient_spread_t spread) +{ + dsc->current_dsc.stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->current_dsc.stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + dsc->current_dsc.stroke_dsc.gradient.cx = cx; + dsc->current_dsc.stroke_dsc.gradient.cy = cy; + dsc->current_dsc.stroke_dsc.gradient.cr = radius; + dsc->current_dsc.stroke_dsc.gradient.spread = spread; + lv_memcpy(&(dsc->current_dsc.stroke_dsc.gradient.grad), grad, sizeof(lv_grad_dsc_t)); +} + +/* draw functions */ +void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path) +{ + lv_area_t rect; + if(!_lv_area_intersect(&rect, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { + return; + } + + if(dsc->current_dsc.fill_dsc.opa == 0 + && dsc->current_dsc.stroke_dsc.opa == 0) { + return; + } + + if(!dsc->tasks.task_list) { + dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); + LV_ASSERT_MALLOC(dsc->tasks.task_list); + _lv_ll_init(dsc->tasks.task_list, sizeof(_lv_vector_draw_task)); + } + + _lv_vector_draw_task * new_task = (_lv_vector_draw_task *)_lv_ll_ins_tail(dsc->tasks.task_list); + lv_memset(new_task, 0, sizeof(_lv_vector_draw_task)); + + new_task->path = lv_vector_path_create(0); + + _copy_draw_dsc(&(new_task->dsc), &(dsc->current_dsc)); + lv_vector_path_copy(new_task->path, path); + new_task->dsc.scissor_area = rect; +} + +void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect) +{ + lv_area_t r; + if(!_lv_area_intersect(&r, &(dsc->layer->_clip_area), &(dsc->current_dsc.scissor_area))) { + return; + } + + if(!dsc->tasks.task_list) { + dsc->tasks.task_list = lv_malloc(sizeof(lv_ll_t)); + LV_ASSERT_MALLOC(dsc->tasks.task_list); + _lv_ll_init(dsc->tasks.task_list, sizeof(_lv_vector_draw_task)); + } + + _lv_vector_draw_task * new_task = (_lv_vector_draw_task *)_lv_ll_ins_tail(dsc->tasks.task_list); + lv_memset(new_task, 0, sizeof(_lv_vector_draw_task)); + + new_task->dsc.fill_dsc.color = dsc->current_dsc.fill_dsc.color; + new_task->dsc.fill_dsc.opa = dsc->current_dsc.fill_dsc.opa; + lv_area_copy(&(new_task->dsc.scissor_area), rect); +} + +void lv_draw_vector(lv_vector_dsc_t * dsc) +{ + if(!dsc->tasks.task_list) { + return; + } + + lv_layer_t * layer = dsc->layer; + + lv_draw_task_t * t = lv_draw_add_task(layer, &(layer->_clip_area)); + t->type = LV_DRAW_TASK_TYPE_VECTOR; + t->draw_dsc = lv_malloc(sizeof(lv_draw_vector_task_dsc_t)); + lv_memcpy(t->draw_dsc, &(dsc->tasks), sizeof(lv_draw_vector_task_dsc_t)); + lv_draw_finalize_task_creation(layer, t); + dsc->tasks.task_list = NULL; +} + +/* draw dsc transform */ +void lv_vector_dsc_identity(lv_vector_dsc_t * dsc) +{ + lv_matrix_identity(&(dsc->current_dsc.matrix)); /*identity matrix*/ +} + +void lv_vector_dsc_scale(lv_vector_dsc_t * dsc, float scale_x, float scale_y) +{ + lv_matrix_scale(&(dsc->current_dsc.matrix), scale_x, scale_y); +} + +void lv_vector_dsc_rotate(lv_vector_dsc_t * dsc, float degree) +{ + lv_matrix_rotate(&(dsc->current_dsc.matrix), degree); +} + +void lv_vector_dsc_translate(lv_vector_dsc_t * dsc, float tx, float ty) +{ + lv_matrix_translate(&(dsc->current_dsc.matrix), tx, ty); +} + +void lv_vector_dsc_skew(lv_vector_dsc_t * dsc, float skew_x, float skew_y) +{ + lv_matrix_skew(&(dsc->current_dsc.matrix), skew_x, skew_y); +} + +void _lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data) +{ + _lv_vector_draw_task * task = _lv_ll_get_head(task_list); + _lv_vector_draw_task * next_task = NULL; + + while(task != NULL) { + next_task = _lv_ll_get_next(task_list, task); + _lv_ll_remove(task_list, task); + + if(cb) { + cb(data, task->path, &(task->dsc)); + } + + if(task->path) { + lv_vector_path_delete(task->path); + } + lv_array_deinit(&(task->dsc.stroke_dsc.dash_pattern)); + + lv_free(task); + task = next_task; + } + lv_free(task_list); +} +#endif /* LV_USE_VECTOR_GRAPHIC */ diff --git a/libraries/lvgl/src/draw/lv_draw_vector.h b/libraries/lvgl/src/draw/lv_draw_vector.h new file mode 100644 index 0000000..675359d --- /dev/null +++ b/libraries/lvgl/src/draw/lv_draw_vector.h @@ -0,0 +1,571 @@ +/** + * @file lv_draw_vector.h + * + */ + +#ifndef LV_DRAW_VECTOR_H +#define LV_DRAW_VECTOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_array.h" + +#if LV_USE_VECTOR_GRAPHIC + +/********************** + * TYPEDEFS + **********************/ +enum { + LV_VECTOR_FILL_NONZERO = 0, + LV_VECTOR_FILL_EVENODD, +}; +typedef uint8_t lv_vector_fill_t; + +enum { + LV_VECTOR_STROKE_CAP_BUTT = 0, + LV_VECTOR_STROKE_CAP_SQUARE, + LV_VECTOR_STROKE_CAP_ROUND, +}; +typedef uint8_t lv_vector_stroke_cap_t; + +enum { + LV_VECTOR_STROKE_JOIN_MITER = 0, + LV_VECTOR_STROKE_JOIN_BEVEL, + LV_VECTOR_STROKE_JOIN_ROUND, +}; +typedef uint8_t lv_vector_stroke_join_t; + +enum { + LV_VECTOR_PATH_QUALITY_MEDIUM = 0, /* default*/ + LV_VECTOR_PATH_QUALITY_HIGH, + LV_VECTOR_PATH_QUALITY_LOW, +}; +typedef uint8_t lv_vector_path_quality_t; + +enum { + LV_VECTOR_BLEND_SRC_OVER = 0, + LV_VECTOR_BLEND_SRC_IN, + LV_VECTOR_BLEND_DST_OVER, + LV_VECTOR_BLEND_DST_IN, + LV_VECTOR_BLEND_SCREEN, + LV_VECTOR_BLEND_MULTIPLY, + LV_VECTOR_BLEND_NONE, + LV_VECTOR_BLEND_ADDITIVE, + LV_VECTOR_BLEND_SUBTRACTIVE, +}; +typedef uint8_t lv_vector_blend_t; + +enum { + LV_VECTOR_PATH_OP_MOVE_TO = 0, + LV_VECTOR_PATH_OP_LINE_TO, + LV_VECTOR_PATH_OP_QUAD_TO, + LV_VECTOR_PATH_OP_CUBIC_TO, + LV_VECTOR_PATH_OP_CLOSE, +}; +typedef uint8_t lv_vector_path_op_t; + +enum { + LV_VECTOR_DRAW_STYLE_SOLID = 0, + LV_VECTOR_DRAW_STYLE_PATTERN, + LV_VECTOR_DRAW_STYLE_GRADIENT, +}; +typedef uint8_t lv_vector_draw_style_t; + +enum { + LV_VECTOR_GRADIENT_SPREAD_PAD = 0, + LV_VECTOR_GRADIENT_SPREAD_REPEAT, + LV_VECTOR_GRADIENT_SPREAD_REFLECT, +}; +typedef uint8_t lv_vector_gradient_spread_t; + +enum { + LV_VECTOR_GRADIENT_STYLE_LINEAR = 0, + LV_VECTOR_GRADIENT_STYLE_RADIAL, +}; +typedef uint8_t lv_vector_gradient_style_t; + +typedef struct { + float x; + float y; +} lv_fpoint_t; + +typedef struct { + float m[3][3]; +} lv_matrix_t; + +typedef struct { + lv_vector_path_quality_t quality; + lv_array_t ops; + lv_array_t points; +} lv_vector_path_t; + +typedef struct { + lv_vector_gradient_style_t style; + lv_grad_dsc_t grad; + float cx; + float cy; + float cr; + lv_vector_gradient_spread_t spread; +} lv_vector_gradient_t; + +typedef struct { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + lv_vector_fill_t fill_rule; + lv_draw_image_dsc_t img_dsc; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +} lv_vector_fill_dsc_t; + +typedef struct { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + float width; + lv_array_t dash_pattern; + lv_vector_stroke_cap_t cap; + lv_vector_stroke_join_t join; + uint16_t miter_limit; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +} lv_vector_stroke_dsc_t; + +typedef struct { + lv_vector_fill_dsc_t fill_dsc; + lv_vector_stroke_dsc_t stroke_dsc; + lv_matrix_t matrix; + lv_vector_blend_t blend_mode; + lv_area_t scissor_area; +} lv_vector_draw_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + lv_ll_t * task_list; /*draw task list.*/ +} lv_draw_vector_task_dsc_t; + +typedef struct { + lv_layer_t * layer; + lv_vector_draw_dsc_t current_dsc; + /* private data */ + lv_draw_vector_task_dsc_t tasks; +} lv_vector_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set matrix to identity matrix + * @param matrix pointer to a matrix + */ +void lv_matrix_identity(lv_matrix_t * matrix); + +/** + * Translate the matrix to new position + * @param matrix pointer to a matrix + * @param tx the amount of translate in x direction + * @param tx the amount of translate in y direction + */ +void lv_matrix_translate(lv_matrix_t * matrix, float tx, float ty); + +/** + * Change the scale factor of the matrix + * @param matrix pointer to a matrix + * @param scale_x the scale factor for the X direction + * @param scale_y the scale factor for the Y direction + */ +void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y); + +/** + * Rotate the matrix with origin + * @param matrix pointer to a matrix + * @param degree angle to rotate + */ +void lv_matrix_rotate(lv_matrix_t * matrix, float degree); + +/** + * Change the skew factor of the matrix + * @param matrix pointer to a matrix + * @param skew_x the skew factor for x direction + * @param skew_y the skew factor for y direction + */ +void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y); + +/** + * Multiply two matrix and store the result to the first one + * @param matrix pointer to a matrix + * @param matrix2 pointer to another matrix + */ +void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * matrix2); + +/** + * Transform the coordinates of a point using given matrix + * @param matrix pointer to a matrix + * @param point pointer to a point + */ +void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point); + +/** + * Transform all the coordinates of a path using given matrix + * @param matrix pointer to a matrix + * @param path pointer to a path + */ +void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path); + +/** + * Create a vector graphic path object + * @param quality the quality hint of path + * @return pointer to the created path object + */ +lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality); + +/** + * Copy a path data to another + * @param target_path pointer to a path + * @param path pointer to source path + */ +void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path); + +/** + * Clear path data + * @param path pointer to a path + */ +void lv_vector_path_clear(lv_vector_path_t * path); + +/** + * Delete the graphic path object + * @param path pointer to a path + */ +void lv_vector_path_delete(lv_vector_path_t * path); + +/** + * Begin a new sub path and set a point to path + * @param path pointer to a path + * @param p pointer to a `lv_fpoint_t` variable + */ +void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p); + +/** + * Add a line to the path from last point to the point + * @param path pointer to a path + * @param p pointer to a `lv_fpoint_t` variable + */ +void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p); + +/** + * Add a quadratic bezier line to the path from last point to the point + * @param path pointer to a path + * @param p1 pointer to a `lv_fpoint_t` variable for control point + * @param p2 pointer to a `lv_fpoint_t` variable for end point + */ +void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2); + +/** + * Add a cubic bezier line to the path from last point to the point + * @param path pointer to a path + * @param p1 pointer to a `lv_fpoint_t` variable for first control point + * @param p2 pointer to a `lv_fpoint_t` variable for second control point + * @param p3 pointer to a `lv_fpoint_t` variable for end point + */ +void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, + const lv_fpoint_t * p3); + +/** + * Close the sub path + * @param path pointer to a path + */ +void lv_vector_path_close(lv_vector_path_t * path); + +/** + * Get the bounding box of a path + * @param path pointer to a path + * @param area pointer to a `lv_area_t` variable for bounding box + */ +void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area); + +/** + * Add a rectangle to the path + * @param path pointer to a path + * @param rect pointer to a `lv_area_t` variable + * @param rx the horizontal radius for rounded rectangle + * @param ry the vertical radius for rounded rectangle + */ +void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry); + +/** + * Add a circle to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param rx the horizontal radius for circle + * @param ry the vertical radius for circle + */ +void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry); + +/** + * Add a arc to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param radius the radius for arc + * @param start_angle the start angle for arc + * @param sweep the sweep angle for arc, could be negative + * @param pie true: draw a pie, false: draw a arc + */ +void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, + float sweep, bool pie); + +/** + * Add an sub path to the path + * @param path pointer to a path + * @param subpath pointer to another path which will be added + */ +void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath); + +/** + * Create a vector graphic descriptor + * @param layer pointer to a layer + * @return pointer to the created descriptor + */ +lv_vector_dsc_t * lv_vector_dsc_create(lv_layer_t * layer); + +/** + * Delete the vector graphic descriptor + * @param dsc pointer to a vector graphic descriptor + */ +void lv_vector_dsc_delete(lv_vector_dsc_t * dsc); + +/** + * Set a matrix to current transformation matrix + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_vector_dsc_set_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set blend mode for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param blend the blend mode to be set in `lv_vector_blend_t` + */ +void lv_vector_dsc_set_blend_mode(lv_vector_dsc_t * dsc, lv_vector_blend_t blend); + +/** + * Set fill color for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color32_t format + */ +void lv_vector_dsc_set_fill_color32(lv_vector_dsc_t * dsc, lv_color32_t color); + +/** + * Set fill color for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color_t format + */ +void lv_vector_dsc_set_fill_color(lv_vector_dsc_t * dsc, lv_color_t color); + +/** + * Set fill opacity for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param opa the opacity to be set in lv_opa_t format + */ +void lv_vector_dsc_set_fill_opa(lv_vector_dsc_t * dsc, lv_opa_t opa); + +/** + * Set fill rule for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param rule the fill rule to be set in lv_vector_fill_t format + */ +void lv_vector_dsc_set_fill_rule(lv_vector_dsc_t * dsc, lv_vector_fill_t rule); + +/** + * Set fill image for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param img_dsc pointer to a `lv_draw_image_dsc_t` variable + */ +void lv_vector_dsc_set_fill_image(lv_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc); + +/** + * Set fill linear gradient for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param grad pointer to a `lv_grad_dsc_t` variable + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_vector_dsc_set_fill_linear_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, + lv_vector_gradient_spread_t spread); + +/** + * Set fill radial gradient for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param grad pointer to a `lv_grad_dsc_t` variable + * @param cx the x for center of the circle + * @param cy the y for center of the circle + * @param radius the radius for circle + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_vector_dsc_set_fill_radial_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, float cx, float cy, + float radius, lv_vector_gradient_spread_t spread); + +/** + * Set a matrix to current fill transformation matrix + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_vector_dsc_set_fill_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set stroke color for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color32_t format + */ +void lv_vector_dsc_set_stroke_color32(lv_vector_dsc_t * dsc, lv_color32_t color); + +/** + * Set stroke color for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color_t format + */ +void lv_vector_dsc_set_stroke_color(lv_vector_dsc_t * dsc, lv_color_t color); + +/** + * Set stroke opacity for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param opa the opacity to be set in lv_opa_t format + */ +void lv_vector_dsc_set_stroke_opa(lv_vector_dsc_t * dsc, lv_opa_t opa); + +/** + * Set stroke line width for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param width the stroke line width + */ +void lv_vector_dsc_set_stroke_width(lv_vector_dsc_t * dsc, float width); + +/** + * Set stroke line dash pattern for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param dash_pattern an array of values that specify the segments of dash line + * @param dash_count the length of dash pattern array + */ +void lv_vector_dsc_set_stroke_dash(lv_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count); + +/** + * Set stroke line cap style for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param cap the line cap to be set in lv_vector_stroke_cap_t format + */ +void lv_vector_dsc_set_stroke_cap(lv_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap); + +/** + * Set stroke line join style for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param join the line join to be set in lv_vector_stroke_join_t format + */ +void lv_vector_dsc_set_stroke_join(lv_vector_dsc_t * dsc, lv_vector_stroke_join_t join); + +/** + * Set stroke miter limit for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param miter_limit the stroke miter_limit + */ +void lv_vector_dsc_set_stroke_miter_limit(lv_vector_dsc_t * dsc, uint16_t miter_limit); + +/** + * Set stroke linear gradient for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param grad pointer to a `lv_grad_dsc_t` variable + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_vector_dsc_set_stroke_linear_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, + lv_vector_gradient_spread_t spread); +/** + * Set stroke radial gradient for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param grad pointer to a `lv_grad_dsc_t` variable + * @param cx the x for center of the circle + * @param cy the y for center of the circle + * @param radius the radius for circle + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_vector_dsc_set_stroke_radial_gradient(lv_vector_dsc_t * dsc, const lv_grad_dsc_t * grad, float cx, float cy, + float radius, lv_vector_gradient_spread_t spread); +/** + * Set a matrix to current stroke transformation matrix + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_vector_dsc_set_stroke_transform(lv_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set current transformation matrix to identity matrix + * @param dsc pointer to a vector graphic descriptor + */ +void lv_vector_dsc_identity(lv_vector_dsc_t * dsc); + +/** + * Change the scale factor of current transformation matrix + * @param dsc pointer to a vector graphic descriptor + * @param scale_x the scale factor for the X direction + * @param scale_y the scale factor for the Y direction + */ +void lv_vector_dsc_scale(lv_vector_dsc_t * dsc, float scale_x, float scale_y); + +/** + * Rotate current transformation matrix with origin + * @param dsc pointer to a vector graphic descriptor + * @param degree angle to rotate + */ +void lv_vector_dsc_rotate(lv_vector_dsc_t * dsc, float degree); + +/** + * Translate current transformation matrix to new position + * @param dsc pointer to a vector graphic descriptor + * @param tx the amount of translate in x direction + * @param tx the amount of translate in y direction + */ +void lv_vector_dsc_translate(lv_vector_dsc_t * dsc, float tx, float ty); + +/** + * Change the skew factor of current transformation matrix + * @param dsc pointer to a vector graphic descriptor + * @param skew_x the skew factor for x direction + * @param skew_y the skew factor for y direction + */ +void lv_vector_dsc_skew(lv_vector_dsc_t * dsc, float skew_x, float skew_y); + +/** + * Add a graphic path to the draw list + * @param dsc pointer to a vector graphic descriptor + * @param path pointer to a path + */ +void lv_vector_dsc_add_path(lv_vector_dsc_t * dsc, const lv_vector_path_t * path); + +/** + * Clear a rectangle area use current fill color + * @param dsc pointer to a vector graphic descriptor + * @param rect the area to clear in the buffer + */ +void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect); + +/** + * Draw all the vector graphic paths + * @param dsc pointer to a vector graphic descriptor + */ +void lv_draw_vector(lv_vector_dsc_t * dsc); + +/* Traverser for task list */ +typedef void (*vector_draw_task_cb)(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc); + +void _lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data); + +#endif /* LV_USE_VECTOR_GRAPHIC */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DRAW_VECTOR_H */ diff --git a/libraries/lvgl/src/draw/lv_image_decoder.c b/libraries/lvgl/src/draw/lv_image_decoder.c new file mode 100644 index 0000000..c1d5855 --- /dev/null +++ b/libraries/lvgl/src/draw/lv_image_decoder.c @@ -0,0 +1,470 @@ +/** + * @file lv_image_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_image_decoder.h" +#include "../misc/lv_assert.h" +#include "../draw/lv_draw_image.h" +#include "../misc/lv_ll.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define img_decoder_ll_p &(LV_GLOBAL_DEFAULT()->img_decoder_ll) +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t img_width_to_stride(lv_image_header_t * header); + +/** + * Get the header info of an image source, and return the a pointer to the decoder that can open it. + * @param src The image source (e.g. a filename or a pointer to a C array) + * @param header The header of the image + * @return The decoder that can open the image source or NULL if not found (or can't open it). + */ +static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_header_t * header); + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 +static lv_cache_compare_res_t image_decoder_header_cache_compare_cb(const lv_image_header_cache_data_t * lhs, + const lv_image_header_cache_data_t * rhs); +static void image_decoder_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data); +#endif + +#if LV_CACHE_DEF_SIZE > 0 +static lv_cache_compare_res_t image_decoder_cache_compare_cb(const lv_image_cache_data_t * lhs, + const lv_image_cache_data_t * rhs); +static void image_decoder_cache_free_cb(lv_image_cache_data_t * entry, void * user_data); + +static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc); +#endif +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the image decoder module + */ +void _lv_image_decoder_init(void) +{ + _lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); + +#if LV_CACHE_DEF_SIZE > 0 + img_cache_p = lv_cache_create(&lv_cache_class_lru_rb_size, + sizeof(lv_image_cache_data_t), LV_CACHE_DEF_SIZE, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)image_decoder_cache_compare_cb, + .create_cb = NULL, + .free_cb = (lv_cache_free_cb_t)image_decoder_cache_free_cb, + }); + +#endif + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + img_header_cache_p = lv_cache_create(&lv_cache_class_lru_rb_count, + sizeof(lv_image_header_cache_data_t), LV_IMAGE_HEADER_CACHE_DEF_CNT, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)image_decoder_header_cache_compare_cb, + .create_cb = NULL, + .free_cb = (lv_cache_free_cb_t)image_decoder_header_cache_free_cb + }); +#endif +} + +/** + * Deinitialize the image decoder module + */ +void _lv_image_decoder_deinit(void) +{ +#if LV_CACHE_DEF_SIZE > 0 + lv_cache_destroy(img_cache_p, NULL); +#endif + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + lv_cache_destroy(img_header_cache_p, NULL); +#endif + _lv_ll_clear(img_decoder_ll_p); +} + +lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header) +{ + lv_image_decoder_t * decoder = image_decoder_get_info(src, header); + if(decoder == NULL) return LV_RESULT_INVALID; + + return LV_RESULT_OK; +} + +lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args) +{ + lv_memzero(dsc, sizeof(lv_image_decoder_dsc_t)); + + if(src == NULL) return LV_RESULT_INVALID; + dsc->src = src; + dsc->src_type = lv_image_src_get_type(src); + +#if LV_CACHE_DEF_SIZE > 0 + dsc->cache = img_cache_p; + /*Try cache first, unless we are told to ignore cache.*/ + if(!(args && args->no_cache)) { + /* + * Check the cache first + * If the image is found in the cache, just return it.*/ + if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK; + } +#endif + + /*Find the decoder that can open the image source, and get the header info in the same time.*/ + dsc->decoder = image_decoder_get_info(src, &dsc->header); + if(dsc->decoder == NULL) return LV_RESULT_INVALID; + + /*Make a copy of args*/ + dsc->args = args ? *args : (lv_image_decoder_args_t) { + .stride_align = LV_DRAW_BUF_STRIDE_ALIGN != 1, + .premultiply = false, + .no_cache = false, + .use_indexed = false, + }; + + /* + * We assume that if a decoder can get the info, it can open the image. + * If decoder open failed, free the source and return error. + * If decoder open succeed, add the image to cache if enabled. + * */ + lv_result_t res = dsc->decoder->open_cb(dsc->decoder, dsc); + + return res; +} + +lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, + lv_area_t * decoded_area) +{ + lv_result_t res = LV_RESULT_INVALID; + if(dsc->decoder->get_area_cb) res = dsc->decoder->get_area_cb(dsc->decoder, dsc, full_area, decoded_area); + + return res; +} + +void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc) +{ + if(dsc->decoder) { + if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc); + } +} + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_image_decoder_t * lv_image_decoder_create(void) +{ + lv_image_decoder_t * decoder; + decoder = _lv_ll_ins_head(img_decoder_ll_p); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) return NULL; + + lv_memzero(decoder, sizeof(lv_image_decoder_t)); + + return decoder; +} + +void lv_image_decoder_delete(lv_image_decoder_t * decoder) +{ + _lv_ll_remove(img_decoder_ll_p, decoder); + lv_free(decoder); +} + +lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder) +{ + if(decoder == NULL) + return _lv_ll_get_head(img_decoder_ll_p); + else + return _lv_ll_get_next(img_decoder_ll_p, decoder); +} + +void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb) +{ + decoder->info_cb = info_cb; +} + +void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb) +{ + decoder->open_cb = open_cb; +} + +void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t get_area_cb) +{ + decoder->get_area_cb = get_area_cb; +} + +void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb) +{ + decoder->close_cb = close_cb; +} + +void lv_image_decoder_set_cache_free_cb(lv_image_decoder_t * decoder, lv_cache_free_cb_t cache_free_cb) +{ + decoder->cache_free_cb = cache_free_cb; +} + +#if LV_CACHE_DEF_SIZE > 0 +lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, + lv_image_cache_data_t * search_key, + const lv_draw_buf_t * decoded, void * user_data) +{ + lv_cache_entry_t * cache_entry = lv_cache_add(img_cache_p, search_key, NULL); + if(cache_entry == NULL) { + return NULL; + } + + lv_image_cache_data_t * cached_data; + cached_data = lv_cache_entry_get_data(cache_entry); + + /*Set the cache entry to decoder data*/ + cached_data->decoded = decoded; + if(cached_data->src_type == LV_IMAGE_SRC_FILE) { + cached_data->src = lv_strdup(cached_data->src); + } + cached_data->user_data = user_data; /*Need to free data on cache invalidate instead of decoder_close*/ + cached_data->decoder = decoder; + + return cache_entry; +} +#endif + +lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded) +{ + if(decoded == NULL) return NULL; /*No need to adjust*/ + + lv_image_decoder_args_t * args = &dsc->args; + if(args->stride_align && decoded->header.cf != LV_COLOR_FORMAT_RGB565A8) { + uint32_t stride_expect = lv_draw_buf_width_to_stride(decoded->header.w, decoded->header.cf); + if(decoded->header.stride != stride_expect) { + LV_LOG_TRACE("Stride mismatch"); + lv_result_t res = lv_draw_buf_adjust_stride(decoded, stride_expect); + if(res != LV_RESULT_OK) { + lv_draw_buf_t * aligned = lv_draw_buf_create(decoded->header.w, decoded->header.h, decoded->header.cf, stride_expect); + if(aligned == NULL) { + LV_LOG_ERROR("No memory for Stride adjust."); + return NULL; + } + + lv_draw_buf_copy(aligned, NULL, decoded, NULL); + decoded = aligned; + } + } + } + + /*Premultiply alpha channel*/ + if(args->premultiply + && !LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoded->header.cf) + && lv_color_format_has_alpha(decoded->header.cf) + && !lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_PREMULTIPLIED) /*Hasn't done yet*/ + ) { + LV_LOG_TRACE("Alpha premultiply."); + if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_MODIFIABLE)) { + /*Do it directly*/ + lv_draw_buf_premultiply(decoded); + } + else { + decoded = lv_draw_buf_dup(decoded); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for premulitplying."); + return NULL; + } + + lv_draw_buf_premultiply(decoded); + } + } + + return decoded; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_header_t * header) +{ + lv_memzero(header, sizeof(lv_image_header_t)); + + if(src == NULL) return NULL; + + lv_image_src_t src_type = lv_image_src_get_type(src); + if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + if(img_dsc->data == NULL) return NULL; + } + + lv_image_decoder_t * decoder; + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + if(src_type == LV_IMAGE_SRC_FILE) { + lv_image_header_cache_data_t search_key; + search_key.src_type = src_type; + search_key.src = src; + + lv_cache_entry_t * entry = lv_cache_acquire(img_header_cache_p, &search_key, NULL); + + if(entry) { + lv_image_header_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + *header = cached_data->header; + decoder = cached_data->decoder; + lv_cache_release(img_header_cache_p, entry, NULL); + return decoder; + } + } +#endif + + _LV_LL_READ(img_decoder_ll_p, decoder) { + /*Info and Open callbacks are required*/ + if(decoder->info_cb && decoder->open_cb) { + lv_result_t res = decoder->info_cb(decoder, src, header); + if(res == LV_RESULT_OK) { + if(header->stride == 0) { + LV_LOG_INFO("Image decoder didn't set stride. Calculate it from width."); + header->stride = img_width_to_stride(header); + } + break; + } + } + } + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + if(src_type == LV_IMAGE_SRC_FILE && decoder) { + lv_cache_entry_t * entry; + lv_image_header_cache_data_t search_key; + search_key.src_type = src_type; + search_key.src = lv_strdup(src); + search_key.decoder = decoder; + search_key.header = *header; + entry = lv_cache_add(img_header_cache_p, &search_key, NULL); + + if(entry == NULL) { + if(src_type == LV_IMAGE_SRC_FILE) lv_free((void *)search_key.src); + return NULL; + } + + lv_cache_release(img_header_cache_p, entry, NULL); + } +#endif + + return decoder; +} + +static uint32_t img_width_to_stride(lv_image_header_t * header) +{ + if(header->cf == LV_COLOR_FORMAT_RGB565A8) { + return header->w * 2; + } + else { + return ((uint32_t)header->w * lv_color_format_get_bpp(header->cf) + 7) >> 3; + } +} + +#if LV_CACHE_DEF_SIZE > 0 || LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 +inline static lv_cache_compare_res_t image_decoder_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type, + const void * rhs_src, lv_image_src_t rhs_src_type) +{ + if(lhs_src_type == rhs_src_type) { + if(lhs_src_type == LV_IMAGE_SRC_FILE) { + int32_t cmp_res = lv_strcmp(lhs_src, rhs_src); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + } + else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) { + if(lhs_src != rhs_src) { + return lhs_src > rhs_src ? 1 : -1; + } + } + return 0; + } + return lhs_src_type > rhs_src_type ? 1 : -1; +} +#endif + +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 +static lv_cache_compare_res_t image_decoder_header_cache_compare_cb( + const lv_image_header_cache_data_t * lhs, + const lv_image_header_cache_data_t * rhs) +{ + return image_decoder_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); +} + +static void image_decoder_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data) +{ + LV_UNUSED(user_data); /*Unused*/ + + if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); +} +#endif + +#if LV_CACHE_DEF_SIZE > 0 +static lv_cache_compare_res_t image_decoder_cache_compare_cb( + const lv_image_cache_data_t * lhs, + const lv_image_cache_data_t * rhs) +{ + return image_decoder_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); +} + +static void image_decoder_cache_free_cb(lv_image_cache_data_t * entry, void * user_data) +{ + const lv_image_decoder_t * decoder = entry->decoder; + if(decoder == NULL) return; /* Why ? */ + + if(decoder->cache_free_cb) { + /* Decoder wants to free the cache by itself. */ + decoder->cache_free_cb(entry, user_data); + } + else { + /* Destroy the decoded draw buffer if necessary. */ + lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded; + if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) { + lv_draw_buf_destroy(decoded); + } + + /*Free the duplicated file name*/ + if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); + } +} + +static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc) +{ + lv_cache_t * cache = dsc->cache; + + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + + lv_cache_entry_t * entry = lv_cache_acquire(cache, &search_key, NULL); + + if(entry) { + lv_image_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + dsc->decoded = cached_data->decoded; + dsc->decoder = (lv_image_decoder_t *)cached_data->decoder; + dsc->cache_entry = entry; /*Save the cache to release it in decoder_close*/ + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; +} +#endif diff --git a/libraries/lvgl/src/draw/lv_image_decoder.h b/libraries/lvgl/src/draw/lv_image_decoder.h new file mode 100644 index 0000000..d446eac --- /dev/null +++ b/libraries/lvgl/src/draw/lv_image_decoder.h @@ -0,0 +1,315 @@ +/** + * @file lv_image_decoder.h + * + */ + +#ifndef LV_IMAGE_DECODER_H +#define LV_IMAGE_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include "lv_draw_buf.h" +#include "../misc/lv_fs.h" +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" +#include "../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Source of image.*/ +enum _lv_image_src_t { + LV_IMAGE_SRC_VARIABLE, /** Binary/C variable*/ + LV_IMAGE_SRC_FILE, /** File in filesystem*/ + LV_IMAGE_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ + LV_IMAGE_SRC_UNKNOWN, /** Unknown source*/ +}; + +#ifdef DOXYGEN +typedef _lv_image_src_t lv_image_src_t; +#else +typedef uint8_t lv_image_src_t; +#endif /*DOXYGEN*/ + +/*Decoder function definitions*/ +struct _lv_image_decoder_dsc_t; +typedef struct _lv_image_decoder_dsc_t lv_image_decoder_dsc_t; + +/** + * Image decoder args. + * It determines how to decoder an image, e.g. whether to premultiply the alpha or not. + * It should be passed to lv_img_decoder_open() function. If NULL is provided, default + * args are used. + * + * Default args: + * all field are zero or false. + */ +typedef struct _lv_image_decoder_args_t { + bool stride_align; /*Whether stride should be aligned*/ + bool premultiply; /*Whether image should be premultiplied or not after decoding*/ + bool no_cache; /*When set, decoded image won't be put to cache, and decoder open will also ignore cache.*/ + bool use_indexed; /*Decoded indexed image as is. Convert to ARGB8888 if false.*/ +} lv_image_decoder_args_t; + +/** + * Get info from an image and store in the `header` + * @param src the image source. Can be a pointer to a C array or a file name (Use + * `lv_image_src_get_type` to determine the type) + * @param header store the info here + * @return LV_RESULT_OK: info written correctly; LV_RESULT_INVALID: failed + */ +typedef lv_result_t (*lv_image_decoder_info_f_t)(lv_image_decoder_t * decoder, const void * src, + lv_image_header_t * header); + +/** + * Open an image for decoding. Prepare it as it is required to read it later + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. + */ +typedef lv_result_t (*lv_image_decoder_open_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/** + * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. + * Required only if the "open" function can't return with the whole decoded pixel array. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param x start x coordinate + * @param y start y coordinate + * @param len number of pixels to decode + * @param buf a buffer to store the decoded pixels + * @return LV_RESULT_OK: ok; LV_RESULT_INVALID: failed + */ +typedef lv_result_t (*lv_image_decoder_get_area_cb_t)(lv_image_decoder_t * decoder, + lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +typedef void (*lv_image_decoder_close_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +struct _lv_image_decoder_t { + lv_image_decoder_info_f_t info_cb; + lv_image_decoder_open_f_t open_cb; + lv_image_decoder_get_area_cb_t get_area_cb; + lv_image_decoder_close_f_t close_cb; + + lv_cache_free_cb_t cache_free_cb; + void * user_data; +}; + +typedef struct _lv_image_decoder_cache_data_t { + lv_cache_slot_size_t slot; + + const void * src; + lv_image_src_t src_type; + + const lv_draw_buf_t * decoded; + const lv_image_decoder_t * decoder; + void * user_data; +} lv_image_cache_data_t; + +typedef struct _lv_image_decoder_header_cache_data_t { + const void * src; + lv_image_src_t src_type; + + lv_image_header_t header; + lv_image_decoder_t * decoder; +} lv_image_header_cache_data_t; + +/**Describe an image decoding session. Stores data about the decoding*/ +struct _lv_image_decoder_dsc_t { + /**The decoder which was able to open the image source*/ + lv_image_decoder_t * decoder; + + /*A copy of parameters of how this image is decoded*/ + lv_image_decoder_args_t args; + + /**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/ + const void * src; + + /**Type of the source: file or variable. Can be set in `open` function if required*/ + lv_image_src_t src_type; + + /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ + lv_image_header_t header; + + /** Pointer to a draw buffer where the image's data (pixels) are stored in a decoded, plain format. + * MUST be set in `open` or `get_area_cb`function*/ + const lv_draw_buf_t * decoded; /*A draw buffer to described decoded image.*/ + + const lv_color32_t * palette; + uint32_t palette_size; + + /** How much time did it take to open the image. [ms] + * If not set `lv_image_cache` will measure and set the time to open*/ + uint32_t time_to_open; + + /**A text to display instead of the image when the image can't be opened. + * Can be set in `open` function or set NULL.*/ + const char * error_msg; + + lv_cache_t * cache; + + /**Point to cache entry information*/ + lv_cache_entry_t * cache_entry; + + /**Store any custom data here is required*/ + void * user_data; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the image decoder module + */ +void _lv_image_decoder_init(void); + +/** + * Deinitialize the image decoder module + */ +void _lv_image_decoder_deinit(void); + +/** + * Get information about an image. + * Try the created image decoder one by one. Once one is able to get info that info will be used. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) + * 2) Variable: Pointer to an `lv_image_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param header the image info will be stored here + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: wasn't able to get info about the image + */ +lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header); + +/** + * Open an image. + * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` + * @param dsc describes a decoding session. Simply a pointer to an `lv_image_decoder_dsc_t` variable. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) + * 2) Variable: Pointer to an `lv_image_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param color The color of the image with `LV_COLOR_FORMAT_ALPHA_...` + * @param args args about how the image should be opened. + * @return LV_RESULT_OK: opened the image. `dsc->decoded` and `dsc->header` are set. + * LV_RESULT_INVALID: none of the registered image decoders were able to open the image. + */ +lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args); + +/** + * Decode an area of the opened image + * @param dsc image decoder descriptor + * @param full_area start X coordinate (from left) + * @param decoded_area start Y coordinate (from top) + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: an error occurred + */ +lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, + lv_area_t * decoded_area); + +/** + * Close a decoding session + * @param dsc pointer to `lv_image_decoder_dsc_t` used in `lv_image_decoder_open` + */ +void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc); + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_image_decoder_t * lv_image_decoder_create(void); + +/** + * Delete an image decoder + * @param decoder pointer to an image decoder + */ +void lv_image_decoder_delete(lv_image_decoder_t * decoder); + +/** + * Get the next image decoder in the linked list of image decoders + * @param decoder pointer to an image decoder or NULL to get the first one + * @return the next image decoder or NULL if no more image decoder exists + */ +lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder); + +/** + * Set a callback to get information about the image + * @param decoder pointer to an image decoder + * @param info_cb a function to collect info about an image (fill an `lv_image_header_t` struct) + */ +void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb); + +/** + * Set a callback to open an image + * @param decoder pointer to an image decoder + * @param open_cb a function to open an image + */ +void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb); + +/** + * Set a callback to a decoded line of an image + * @param decoder pointer to an image decoder + * @param read_line_cb a function to read a line of an image + */ +void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t read_line_cb); + +/** + * Set a callback to close a decoding session. E.g. close files and free other resources. + * @param decoder pointer to an image decoder + * @param close_cb a function to close a decoding session + */ +void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb); + +/** + * Set a custom method to free cache data. + * Normally this is not needed. If the custom decoder allocates additional memory other than dsc->decoded + * draw buffer, then you need to register your own method to free it. By default the cache entry is free'ed + * in `image_decoder_cache_free_cb`. + * + * @param decoder pointer to the image decoder + * @param cache_free_cb the custom callback to free cache data. Refer to `image_decoder_cache_free_cb`. + */ +void lv_image_decoder_set_cache_free_cb(lv_image_decoder_t * decoder, lv_cache_free_cb_t cache_free_cb); + +#if LV_CACHE_DEF_SIZE > 0 +lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, + lv_image_cache_data_t * search_key, + const lv_draw_buf_t * decoded, void * user_data); +#endif + +/** + * Check the decoded image, make any modification if decoder `args` requires. + * @note A new draw buf will be allocated if provided `decoded` is not modifiable or stride mismatch etc. + * @param dsc pointer to a decoder descriptor + * @param decoded pointer to a decoded image to post process to meet dsc->args requirement. + * @return post processed draw buffer, when it differs with `decoded`, it's newly allocated. + */ +lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_DECODER_H*/ diff --git a/libraries/lvgl/src/draw/lv_image_dsc.h b/libraries/lvgl/src/draw/lv_image_dsc.h new file mode 100644 index 0000000..68c123e --- /dev/null +++ b/libraries/lvgl/src/draw/lv_image_dsc.h @@ -0,0 +1,141 @@ +/** + * @file lv_image_dsc.h + * + */ + +#ifndef LV_IMAGE_BUF_H +#define LV_IMAGE_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/** Magic number for lvgl image, 9 means lvgl version 9 + * It must not be a valid ASCII character nor larger than 0x80. See `lv_image_src_get_type`. + */ +#define LV_IMAGE_HEADER_MAGIC (0x19) +LV_EXPORT_CONST_INT(LV_IMAGE_HEADER_MAGIC); + +/********************** + * TYPEDEFS + **********************/ + +typedef enum _lv_image_flags_t { + /** + * For RGB map of the image data, mark if it's pre-multiplied with alpha. + * For indexed image, this bit indicated palette data is pre-multiplied with alpha. + */ + LV_IMAGE_FLAGS_PREMULTIPLIED = 0x0001, + /** + * The image data is compressed, so decoder needs to decode image firstly. + * If this flag is set, the whole image will be decompressed upon decode, and + * `get_area_cb` won't be necessary. + */ + LV_IMAGE_FLAGS_COMPRESSED = 0x0008, + + /*Below flags are applicable only for draw buffer header.*/ + + /** + * The image is allocated from heap, thus should be freed after use. + */ + LV_IMAGE_FLAGS_ALLOCATED = 0x0010, + + /** + * If the image data is malloced and can be processed in place. + * In image decoder post processing, this flag means we modify it in-place. + */ + LV_IMAGE_FLAGS_MODIFIABLE = 0x0020, + + /** + * Flags reserved for user, lvgl won't use these bits. + */ + LV_IMAGE_FLAGS_USER1 = 0x0100, + LV_IMAGE_FLAGS_USER2 = 0x0200, + LV_IMAGE_FLAGS_USER3 = 0x0400, + LV_IMAGE_FLAGS_USER4 = 0x0800, + LV_IMAGE_FLAGS_USER5 = 0x1000, + LV_IMAGE_FLAGS_USER6 = 0x2000, + LV_IMAGE_FLAGS_USER7 = 0x4000, + LV_IMAGE_FLAGS_USER8 = 0x8000, +} lv_image_flags_t; + +typedef enum { + LV_IMAGE_COMPRESS_NONE = 0, + LV_IMAGE_COMPRESS_RLE, /*LVGL custom RLE compression*/ + LV_IMAGE_COMPRESS_LZ4, +} lv_image_compress_t; + +#if LV_BIG_ENDIAN_SYSTEM +typedef struct { + uint32_t reserved_2: 16; /*Reserved to be used later*/ + uint32_t stride: 16; /*Number of bytes in a row*/ + uint32_t h: 16; + uint32_t w: 16; + uint32_t flags: 16; /*Image flags, see `lv_image_flags_t`*/ + uint32_t cf : 8; /*Color format: See `lv_color_format_t`*/ + uint32_t magic: 8; /*Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ +} lv_image_header_t; +#else +typedef struct { + uint32_t magic: 8; /*Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ + uint32_t cf : 8; /*Color format: See `lv_color_format_t`*/ + uint32_t flags: 16; /*Image flags, see `lv_image_flags_t`*/ + + uint32_t w: 16; + uint32_t h: 16; + uint32_t stride: 16; /*Number of bytes in a row*/ + uint32_t reserved_2: 16; /*Reserved to be used later*/ +} lv_image_header_t; +#endif + +typedef struct { + void * buf; + uint32_t stride; /*Number of bytes in a row*/ +} lv_yuv_plane_t; + +typedef union { + lv_yuv_plane_t yuv; /*packed format*/ + struct { + lv_yuv_plane_t y; + lv_yuv_plane_t u; + lv_yuv_plane_t v; + } planar; /*planar format with 3 plane*/ + struct { + lv_yuv_plane_t y; + lv_yuv_plane_t uv; + } semi_planar; /*planar format with 2 plane*/ +} lv_yuv_buf_t; + +/** + * Struct to describe a constant image resource. + * It's similar to lv_draw_buf_t, but the data is constant. + */ +typedef struct { + lv_image_header_t header; /**< A header describing the basics of the image*/ + uint32_t data_size; /**< Size of the image in bytes*/ + const uint8_t * data; /**< Pointer to the data of the image*/ + const void * reserved; /**< A reserved field to make it has same size as lv_draw_buf_t*/ +} lv_image_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_BUF_H*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c new file mode 100644 index 0000000..12b37de --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c @@ -0,0 +1,110 @@ +/** + * @file lv_draw_buf_pxp.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +#include "lvgl_support.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_pxp_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + + handlers->invalidate_cache_cb = _invalidate_cache; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + + if(area->y1 == 0) { + uint16_t size = stride * lv_area_get_height(area); + + /* Invalidate full buffer. */ + DCACHE_CleanInvalidateByRange((uint32_t)draw_buf->data, size); + return; + } + + const uint8_t * buf_u8 = draw_buf->data; + /* ARM require a 32 byte aligned address. */ + uint8_t align_bytes = 32; + uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); + + uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; + uint16_t offset_x = 0; + + if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { + uint16_t shift_x = area->x1 - (area->x1 % align_pixels); + + offset_x = area->x1 - shift_x; + buf_u8 += (shift_x * bits_per_pixel) / 8; + } + + if(area->y1) { + uint16_t shift_y = area->y1; + + buf_u8 += shift_y * stride; + } + + /* Area to clear can start from a different offset in buffer. + * Invalidate the area line by line. + */ + uint16_t line_pixels = offset_x + lv_area_get_width(area); + uint16_t line_size = (line_pixels * bits_per_pixel) / 8; + uint16_t area_height = lv_area_get_height(area); + + for(uint16_t y = 0; y < area_height; y++) { + const void * line_addr = buf_u8 + y * stride; + + DCACHE_CleanInvalidateByRange((uint32_t)line_addr, line_size); + } +} + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c new file mode 100644 index 0000000..b8fd14c --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c @@ -0,0 +1,485 @@ +/** + * @file lv_draw_pxp.c + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_PXP 3 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* + * Evaluate a task and set the score and preferred PXP unit. + * Return 1 if task is preferred, 0 otherwise (task is not supported). + */ +static int32_t _pxp_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +/* + * Dispatch a task to the PXP unit. + * Return 1 if task was dispatched, 0 otherwise (task not supported). + */ +static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +/* + * Delete the PXP draw unit. + */ +static int32_t _pxp_delete(lv_draw_unit_t * draw_unit); + +#if LV_USE_OS + static void _pxp_render_thread_cb(void * ptr); +#endif + +static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u); + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_init(void) +{ + lv_draw_buf_pxp_init_handlers(); + + lv_draw_pxp_unit_t * draw_pxp_unit = lv_draw_create_unit(sizeof(lv_draw_pxp_unit_t)); + draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate; + draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch; + draw_pxp_unit->base_unit.delete_cb = _pxp_delete; + + lv_pxp_init(); + +#if LV_USE_OS + lv_thread_init(&draw_pxp_unit->thread, LV_THREAD_PRIO_HIGH, _pxp_render_thread_cb, 2 * 1024, draw_pxp_unit); +#endif +} + +void lv_draw_pxp_deinit(void) +{ + lv_pxp_deinit(); +} + +void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, + int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, + lv_color_format_t cf) +{ + lv_pxp_reset(); + + /* convert rotation angle */ + pxp_rotate_degree_t pxp_rotation; + switch(rotation) { + case LV_DISPLAY_ROTATION_0: + pxp_rotation = kPXP_Rotate0; + break; + case LV_DISPLAY_ROTATION_90: + pxp_rotation = kPXP_Rotate90; + break; + case LV_DISPLAY_ROTATION_180: + pxp_rotation = kPXP_Rotate180; + break; + case LV_DISPLAY_ROTATION_270: + pxp_rotation = kPXP_Rotate270; + break; + default: + pxp_rotation = kPXP_Rotate0; + break; + } + PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_rotation, kPXP_FlipDisable); + + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(cf), + .bufferAddr = (uint32_t)src_buf, + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_width - 1U, src_height - 1U); + PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)dest_buf, + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = src_width, + .height = src_height + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline bool _pxp_src_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static inline bool _pxp_dest_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static bool _pxp_draw_img_supported(const lv_draw_image_dsc_t * draw_dsc) +{ + const lv_image_dsc_t * img_dsc = draw_dsc->src; + + bool has_recolor = (draw_dsc->recolor_opa > LV_OPA_MIN); + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); + + /* Recolor and transformation are not supported at the same time. */ + if(has_recolor && has_transform) + return false; + + bool has_opa = (draw_dsc->opa < (lv_opa_t)LV_OPA_MAX); + bool src_has_alpha = (img_dsc->header.cf == LV_COLOR_FORMAT_ARGB8888); + + /* + * Recolor or transformation for images w/ opa or alpha channel can't + * be obtained in a single PXP configuration. Two steps are required. + */ + if((has_recolor || has_transform) && (has_opa || src_has_alpha)) + return false; + + /* PXP can only rotate at 90x angles. */ + if(draw_dsc->rotation % 900) + return false; + + /* + * PXP is set to process 16x16 blocks to optimize the system for memory + * bandwidth and image processing time. + * The output engine essentially truncates any output pixels after the + * desired number of pixels has been written. + * When rotating a source image and the output is not divisible by the block + * size, the incorrect pixels could be truncated and the final output image + * can look shifted. + * + * No combination of rotate with flip, scaling or decimation is possible + * if buffer is unaligned. + */ + if(has_transform && (img_dsc->header.w % 16 || img_dsc->header.h % 16)) + return false; + + return true; +} + +static int32_t _pxp_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + + const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; + + if(!_pxp_dest_cf_supported(draw_dsc_base->layer->color_format)) + return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { + const lv_draw_fill_dsc_t * draw_dsc = (lv_draw_fill_dsc_t *) t->draw_dsc; + + /* Most simple case: just a plain rectangle (no radius, no gradient). */ + if((draw_dsc->radius != 0) || (draw_dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_LAYER: { + const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + if(!_pxp_src_cf_supported(layer_to_draw->color_format)) + return 0; + + if(!_pxp_draw_img_supported(draw_dsc)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + const lv_image_dsc_t * img_dsc = draw_dsc->src; + + if((!_pxp_src_cf_supported(img_dsc->header.cf)) || + (!pxp_buf_aligned(img_dsc->data, img_dsc->header.stride))) + return 0; + + if(!_pxp_draw_img_supported(draw_dsc)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + default: + return 0; + } + + return 0; +} + +static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(draw_pxp_unit->task_act) + return 0; + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_PXP); + + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_PXP) + return -1; + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) + return -1; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_pxp_unit->base_unit.target_layer = layer; + draw_pxp_unit->base_unit.clip_area = &t->clip_area; + draw_pxp_unit->task_act = t; + +#if LV_USE_OS + /* Let the render thread work. */ + if(draw_pxp_unit->inited) + lv_thread_sync_signal(&draw_pxp_unit->sync); +#else + _pxp_execute_drawing(draw_pxp_unit); + + draw_pxp_unit->task_act->state = LV_DRAW_TASK_STATE_READY; + draw_pxp_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static int32_t _pxp_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_OS + lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; + + LV_LOG_INFO("Cancel PXP draw thread."); + draw_pxp_unit->exit_status = true; + + if(draw_pxp_unit->inited) + lv_thread_sync_signal(&draw_pxp_unit->sync); + + lv_result_t res = lv_thread_delete(&draw_pxp_unit->thread); + + return res; +#else + LV_UNUSED(draw_unit); + + return 0; +#endif +} + +static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; + lv_layer_t * layer = draw_unit->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &t->area, draw_unit->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /* Make area relative to the buffer */ + lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); + + /* Invalidate only the drawing area */ + lv_draw_buf_invalidate_cache(draw_buf, &draw_area); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_pxp_fill(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_pxp_img(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_pxp_layer(draw_unit, t->draw_dsc, &t->area); + break; + default: + break; + } + +#if LV_USE_PARALLEL_DRAW_DEBUG + /*Layers manage it for themselves*/ + if(t->type != LV_DRAW_TASK_TYPE_LAYER) { + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) + return; + + int32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != (lv_draw_unit_t *)u) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.border_color = rect_dsc.bg_color; + rect_dsc.bg_opa = LV_OPA_10; + rect_dsc.border_opa = LV_OPA_80; + rect_dsc.border_width = 1; + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.y1 = draw_area.y1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y1 + txt_size.y - 1; + + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_black(); + label_dsc.text = buf; + lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); + } +#endif +} + +#if LV_USE_OS +static void _pxp_render_thread_cb(void * ptr) +{ + lv_draw_pxp_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(u->task_act == NULL) { + if(u->exit_status) + break; + + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("Ready to exit PXP draw thread."); + break; + } + + _pxp_execute_drawing(u); + + /* Signal the ready state to dispatcher. */ + u->task_act->state = LV_DRAW_TASK_STATE_READY; + + /* Cleanup. */ + u->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("Exit PXP draw thread."); +} +#endif + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h new file mode 100644 index 0000000..d5e98d7 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h @@ -0,0 +1,70 @@ +/** + * @file lv_draw_pxp.h + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_DRAW_PXP_H +#define LV_DRAW_PXP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_PXP +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_draw_sw_unit_t lv_draw_pxp_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_buf_pxp_init_handlers(void); + +void lv_draw_pxp_init(void); + +void lv_draw_pxp_deinit(void); + +void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, + int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, + lv_color_format_t cf); + +void lv_draw_pxp_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_pxp_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_DRAW_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PXP_H*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c new file mode 100644 index 0000000..60873ed --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c @@ -0,0 +1,147 @@ +/** + * @file lv_draw_pxp_fill.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_unit->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + _pxp_fill(draw_buf->data, &blend_area, draw_buf->header.stride, draw_buf->header.cf, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc) +{ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + lv_pxp_reset(); + + uint8_t px_size = lv_color_format_get_size(dest_cf); + + /*OUT buffer configure*/ + pxp_output_buffer_config_t outputConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + px_size * dest_area->x1), + .buffer1Addr = (uint32_t)NULL, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + + PXP_SetOutputBufferConfig(PXP_ID, &outputConfig); + + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { + /*Simple color fill without opacity - AS disabled*/ + PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + } + else { + /*Fill with opacity - AS used as source (same as OUT)*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(dest_cf), + .bufferAddr = outputConfig.buffer0Addr, + .pitchBytes = outputConfig.pitchBytes + }; + + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + } + + /*Disable PS, use as color generator*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->color)); + + /** + * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff). + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorNoAlpha, + .srcColorMode = kPXP_PorterDuffColorNoAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = (dsc->opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = dsc->opa, + .srcGlobalAlpha = dsc->opa, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight /*don't care*/ + }; + + PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); + + lv_pxp_run(); +} + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c new file mode 100644 index 0000000..9e52056 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c @@ -0,0 +1,365 @@ +/** + * @file lv_draw_pxp_img.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* Blit w/ recolor for images w/o opa and alpha channel */ +static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); + +/* Blit w/ transformation for images w/o opa and alpha channel */ +static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); + +/* Blit simple w/ opa and alpha channel */ +static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + const lv_image_dsc_t * img_dsc = dsc->src; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_unit->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t blend_area; + bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + if(has_transform) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + const uint8_t * src_buf = img_dsc->data; + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - layer->buf_area.x1); + src_area.y1 = blend_area.y1 - (coords->y1 - layer->buf_area.y1); + src_area.x2 = src_area.x1 + lv_area_get_width(coords) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1; + int32_t src_stride = img_dsc->header.stride; + lv_color_format_t src_cf = img_dsc->header.cf; + + uint8_t * dest_buf = draw_buf->data; + int32_t dest_stride = draw_buf->header.stride; + lv_color_format_t dest_cf = draw_buf->header.cf; + bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN); + + if(has_recolor && !has_transform) + _pxp_blit_recolor(dest_buf, &blend_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, dsc); + else if(has_transform) + _pxp_blit_transform(dest_buf, &blend_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, dsc); + else + _pxp_blit(dest_buf, &blend_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, dsc->opa); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) +{ + + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + + bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(src_cf), + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); + + /*Disable PS, use as color generator*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->recolor)); + + /*Output buffer*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + /** + * Configure Porter-Duff blending. + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorWithAlpha, + .srcColorMode = kPXP_PorterDuffColorWithAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = src_has_alpha ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = dsc->recolor_opa, + .srcGlobalAlpha = 0xff, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight + }; + PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); + + lv_pxp_run(); +} + +static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) +{ + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + lv_point_t pivot = dsc->pivot; + /*The offsets are now relative to the transformation result with pivot ULC*/ + int32_t piv_offset_x = 0; + int32_t piv_offset_y = 0; + + int32_t trim_x = 0; + int32_t trim_y = 0; + + bool has_rotation = (dsc->rotation != 0); + bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + if(has_rotation) { + /*Convert rotation angle and calculate offsets caused by pivot*/ + pxp_rotate_degree_t pxp_angle; + switch(dsc->rotation) { + case 0: + pxp_angle = kPXP_Rotate0; + piv_offset_x = 0; + piv_offset_y = 0; + break; + case 900: + pxp_angle = kPXP_Rotate90; + piv_offset_x = pivot.x + pivot.y - src_h; + piv_offset_y = pivot.y - pivot.x; + break; + case 1800: + pxp_angle = kPXP_Rotate180; + piv_offset_x = 2 * pivot.x - src_w; + piv_offset_y = 2 * pivot.y - src_h; + break; + case 2700: + pxp_angle = kPXP_Rotate270; + piv_offset_x = pivot.x - pivot.y; + piv_offset_y = pivot.x + pivot.y - src_w; + break; + default: + pxp_angle = kPXP_Rotate0; + piv_offset_x = 0; + piv_offset_y = 0; + } + /*PS buffer rotation and decimation does not function at the same time*/ + PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); + } + + if(has_scale) { + float fp_scale_x = (float)dsc->scale_x / LV_SCALE_NONE; + float fp_scale_y = (float)dsc->scale_y / LV_SCALE_NONE; + int32_t int_scale_x = (int32_t)fp_scale_x; + int32_t int_scale_y = (int32_t)fp_scale_y; + + /*Any scale_factor in (k, k + 1] will result in a trim equal to k*/ + trim_x = (fp_scale_x == int_scale_x) ? int_scale_x - 1 : int_scale_x; + trim_y = (fp_scale_y == int_scale_y) ? int_scale_y - 1 : int_scale_y; + + dest_w = src_w * fp_scale_x + trim_x; + dest_h = src_h * fp_scale_y + trim_y; + + /*Final pivot offset = scale_factor * rotation_pivot_offset + scaling_pivot_offset*/ + piv_offset_x = floor(fp_scale_x * piv_offset_x) - floor((fp_scale_x - 1) * pivot.x); + piv_offset_y = floor(fp_scale_y * piv_offset_y) - floor((fp_scale_y - 1) * pivot.y); + } + + /*PS buffer - source image*/ + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = pxp_get_ps_px_format(src_cf), + .swapByte = false, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .bufferAddrU = 0, + .bufferAddrV = 0, + .pitchBytes = src_stride + }; + PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - trim_x - 1U, dest_h - trim_y - 1U); + + if(has_scale) + PXP_SetProcessSurfaceScaler(PXP_ID, src_w, src_h, dest_w, dest_h); + + /*AS disabled */ + PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + /*Output buffer*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * (dest_area->y1 + piv_offset_y) + dest_px_size * (dest_area->x1 + piv_offset_x)), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w - trim_x, + .height = dest_h - trim_y + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa) +{ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + + bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + pxp_as_blend_config_t asBlendConfig = { + .alpha = opa, + .invertAlpha = false, + .alphaMode = kPXP_AlphaRop, + .ropMode = kPXP_RopMergeAs + }; + + if(opa >= (lv_opa_t)LV_OPA_MAX && !src_has_alpha) { + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + } + else { + /*PS must be enabled to fetch background pixels. + PS and OUT buffers are the same, blend will be done in-place*/ + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = pxp_get_ps_px_format(dest_cf), + .swapByte = false, + .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .bufferAddrU = 0U, + .bufferAddrV = 0U, + .pitchBytes = dest_stride + }; + + if(opa >= (lv_opa_t)LV_OPA_MAX) + asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaEmbedded : kPXP_AlphaOverride; + else + asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaMultiply : kPXP_AlphaOverride; + + PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + } + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(src_cf), + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); + PXP_SetAlphaSurfaceBlendConfig(PXP_ID, &asBlendConfig); + PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c new file mode 100644 index 0000000..28245f9 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c @@ -0,0 +1,156 @@ +/** + * @file lv_draw_pxp_layer.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_DRAW_PXP + +#include "../../../stdlib/lv_string.h" +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf; + + /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + * In this case just return. + */ + if(draw_buf == NULL) + return; + + const lv_area_t area_to_draw = { + .x1 = 0, + .y1 = 0, + .x2 = draw_buf->header.w - 1, + .y2 = draw_buf->header.h - 1 + }; + lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = draw_buf; + lv_draw_pxp_img(draw_unit, &new_draw_dsc, coords); + +#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG + lv_area_t area_rot; + lv_area_copy(&area_rot, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + area_rot.x1 += coords->x1; + area_rot.y1 += coords->y1; + area_rot.x2 += coords->x1; + area_rot.y2 += coords->y1; + } + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; +#endif + +#if LV_USE_LAYER_DEBUG + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); + fill_dsc.opa = LV_OPA_20; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = fill_dsc.color; + border_dsc.opa = LV_OPA_60; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + +#endif + +#if LV_USE_PARALLEL_DRAW_DEBUG + uint32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != draw_unit) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_rect_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_100; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y2; + txt_area.y1 = draw_area.y2 - txt_size.y + 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_black(); + lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.text = buf; + lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); +#endif +} + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c new file mode 100644 index 0000000..f1d7962 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c @@ -0,0 +1,91 @@ +/** + * @file lv_pxp_cfg.c + * + */ + +/** + * Copyright 2020-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_cfg.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_osa.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static pxp_cfg_t * _pxp_cfg; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_pxp_init(void) +{ + _pxp_cfg = pxp_get_default_cfg(); + + PXP_Init(PXP_ID); + + PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + + PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + + _pxp_cfg->pxp_interrupt_init(); +} + +void lv_pxp_deinit(void) +{ + _pxp_cfg->pxp_interrupt_deinit(); + PXP_DisableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + PXP_Deinit(PXP_ID); +} + +void lv_pxp_reset(void) +{ + PXP_ResetControl(PXP_ID); + + PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ +} + +void lv_pxp_run(void) +{ + _pxp_cfg->pxp_run(); + _pxp_cfg->pxp_wait(); +} + +void lv_pxp_wait(void) +{ + _pxp_cfg->pxp_wait(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h new file mode 100644 index 0000000..b487e7f --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h @@ -0,0 +1,102 @@ +/** + * @file lv_pxp_cfg.h + * + */ + +/** + * Copyright 2020-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_CFG_H +#define LV_PXP_CFG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_PXP +#include "fsl_cache.h" +#include "fsl_pxp.h" + +#include "../../../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/** PXP module instance to use*/ +#define PXP_ID PXP + +/** PXP interrupt line ID*/ +#define PXP_IRQ_ID PXP_IRQn + +/********************** + * TYPEDEFS + **********************/ + +/** + * NXP PXP device configuration. + */ +typedef struct { + /** Callback for PXP interrupt initialization*/ + void (*pxp_interrupt_init)(void); + + /** Callback for PXP interrupt de-initialization*/ + void (*pxp_interrupt_deinit)(void); + + /** Callback for PXP start*/ + void (*pxp_run)(void); + + /** Callback for waiting of PXP completion*/ + void (*pxp_wait)(void); +} pxp_cfg_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Reset and initialize PXP device. This function should be called as a part + * of display init sequence. + */ +void lv_pxp_init(void); + +/** + * Disable PXP device. Should be called during display deinit sequence. + */ +void lv_pxp_deinit(void); + +/** + * Reset PXP device. + */ +void lv_pxp_reset(void); + +/** + * Clear cache and start PXP. + */ +void lv_pxp_run(void); + +/** + * Wait for PXP completion. + */ +void lv_pxp_wait(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_CFG_H*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c new file mode 100644 index 0000000..539cefe --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c @@ -0,0 +1,165 @@ +/** + * @file lv_pxp_osa.c + * + */ + +/** + * Copyright 2020, 2022-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_osa.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_utils.h" +#include "../../../misc/lv_log.h" +#include "fsl_pxp.h" + +#if defined(SDK_OS_FREE_RTOS) + #include "FreeRTOS.h" + #include "semphr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * PXP interrupt initialization. + */ +static void _pxp_interrupt_init(void); + +/** + * PXP interrupt de-initialization. + */ +static void _pxp_interrupt_deinit(void); + +/** + * Start the PXP job. + */ +static void _pxp_run(void); + +/** + * Wait for PXP completion. + */ +static void _pxp_wait(void); + +/********************** + * STATIC VARIABLES + **********************/ + +#if defined(SDK_OS_FREE_RTOS) + static SemaphoreHandle_t xPXPIdleSemaphore; +#endif +static volatile bool ucPXPIdle; + +static pxp_cfg_t _pxp_default_cfg = { + .pxp_interrupt_init = _pxp_interrupt_init, + .pxp_interrupt_deinit = _pxp_interrupt_deinit, + .pxp_run = _pxp_run, + .pxp_wait = _pxp_wait, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void PXP_IRQHandler(void) +{ +#if defined(SDK_OS_FREE_RTOS) + BaseType_t xHigherPriorityTaskWoken = pdFALSE; +#endif + + if(kPXP_CompleteFlag & PXP_GetStatusFlags(PXP_ID)) { + PXP_ClearStatusFlags(PXP_ID, kPXP_CompleteFlag); +#if defined(SDK_OS_FREE_RTOS) + xSemaphoreGiveFromISR(xPXPIdleSemaphore, &xHigherPriorityTaskWoken); + + /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch + should be performed to ensure the interrupt returns directly to the highest + priority task. The macro used for this purpose is dependent on the port in + use and may be called portEND_SWITCHING_ISR(). */ + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +#else + ucPXPIdle = true; +#endif + } +} + +pxp_cfg_t * pxp_get_default_cfg(void) +{ + return &_pxp_default_cfg; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _pxp_interrupt_init(void) +{ +#if defined(SDK_OS_FREE_RTOS) + xPXPIdleSemaphore = xSemaphoreCreateBinary(); + PXP_ASSERT_MSG(xPXPIdleSemaphore, "xSemaphoreCreateBinary failed!"); + + NVIC_SetPriority(PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); +#endif + ucPXPIdle = true; + + NVIC_EnableIRQ(PXP_IRQ_ID); +} + +static void _pxp_interrupt_deinit(void) +{ + NVIC_DisableIRQ(PXP_IRQ_ID); +#if defined(SDK_OS_FREE_RTOS) + vSemaphoreDelete(xPXPIdleSemaphore); +#endif +} + +/** + * Function to start PXP job. + */ +static void _pxp_run(void) +{ + ucPXPIdle = false; + + PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + PXP_Start(PXP_ID); +} + +/** + * Function to wait for PXP completion. + */ +static void _pxp_wait(void) +{ +#if defined(SDK_OS_FREE_RTOS) + /* Return if PXP was never started, otherwise the semaphore will lock forever. */ + if(ucPXPIdle == true) + return; + + if(xSemaphoreTake(xPXPIdleSemaphore, portMAX_DELAY) == pdTRUE) + ucPXPIdle = true; +#else + while(ucPXPIdle == false) { + } +#endif +} + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h new file mode 100644 index 0000000..3714290 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h @@ -0,0 +1,60 @@ +/** + * @file lv_pxp_osa.h + * + */ + +/** + * Copyright 2020, 2022-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_OSA_H +#define LV_PXP_OSA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * PXP device interrupt handler. Used to check PXP task completion status. + */ +void PXP_IRQHandler(void); + +/** + * Get the PXP default configuration. + */ +pxp_cfg_t * pxp_get_default_cfg(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_OSA_H*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c new file mode 100644 index 0000000..3940a68 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c @@ -0,0 +1,145 @@ +/** + * @file lv_pxp_utils.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_utils.h" + +#if LV_USE_DRAW_PXP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf) +{ + pxp_output_pixel_format_t out_px_format = kPXP_OutputPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + out_px_format = kPXP_OutputPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + out_px_format = kPXP_OutputPixelFormatRGB888P; + break; + case LV_COLOR_FORMAT_ARGB8888: + out_px_format = kPXP_OutputPixelFormatARGB8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + out_px_format = kPXP_OutputPixelFormatRGB888; + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return out_px_format; +} + +pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf) +{ + pxp_as_pixel_format_t as_px_format = kPXP_AsPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + as_px_format = kPXP_AsPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + case LV_COLOR_FORMAT_ARGB8888: + as_px_format = kPXP_AsPixelFormatARGB8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + as_px_format = kPXP_AsPixelFormatRGB888; + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return as_px_format; +} + +pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf) +{ + pxp_ps_pixel_format_t ps_px_format = kPXP_PsPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + ps_px_format = kPXP_PsPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + case LV_COLOR_FORMAT_ARGB8888: +#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + ps_px_format = kPXP_PsPixelFormatARGB8888; +#else + PXP_ASSERT_MSG(false, "Unsupported color format."); +#endif + break; + case LV_COLOR_FORMAT_XRGB8888: +#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + ps_px_format = kPXP_PsPixelFormatARGB8888; +#else + ps_px_format = kPXP_PsPixelFormatRGB888; +#endif + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return ps_px_format; +} + +bool pxp_buf_aligned(const void * buf, uint32_t stride) +{ + /* Test for pointer alignment */ + if((uintptr_t)buf % 64) + return false; + + /* Test for invalid stride (no stride alignment required) */ + if(stride == 0) + return false; + + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ diff --git a/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h new file mode 100644 index 0000000..a1f0a16 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h @@ -0,0 +1,80 @@ +/** + * @file lv_pxp_utils.h + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_UTILS_H +#define LV_PXP_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_PXP +#include "fsl_pxp.h" +#include "../../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_PXP_ASSERT +#define PXP_ASSERT(expr) LV_ASSERT(expr) +#else +#define PXP_ASSERT(expr) +#endif + +#define PXP_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR(msg); \ + PXP_ASSERT(false); \ + } \ + } while(0) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf); + +pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf); + +pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf); + +bool pxp_buf_aligned(const void * buf, uint32_t stride); + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_UTILS_H*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c new file mode 100644 index 0000000..dafb015 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c @@ -0,0 +1,152 @@ +/** + * @file lv_draw_buf_vglite.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" + +#include "lvgl_support.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * _buf_malloc(size_t size_bytes, lv_color_format_t cf); + +static void * _buf_align(void * buf, lv_color_format_t cf); + +static void _invalidate_cache(const void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area); + +static uint32_t _width_to_stride(uint32_t w, lv_color_format_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_vglite_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + + handlers->buf_malloc_cb = _buf_malloc; + handlers->align_pointer_cb = _buf_align; + handlers->invalidate_cache_cb = _invalidate_cache; + handlers->width_to_stride_cb = _width_to_stride; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * _buf_malloc(size_t size_bytes, lv_color_format_t cf) +{ + uint8_t align_bytes = vglite_get_alignment(cf); + + /*Allocate larger memory to be sure it can be aligned as needed*/ + size_bytes += align_bytes - 1; + + return lv_malloc(size_bytes); +} + +static void * _buf_align(void * buf, lv_color_format_t cf) +{ + uint8_t align_bytes = vglite_get_alignment(cf); + + uint8_t * buf_u8 = buf; + if(buf_u8) { + buf_u8 += align_bytes - 1; + buf_u8 = (uint8_t *)((lv_uintptr_t)buf_u8 & ~(align_bytes - 1)); + } + + return buf_u8; +} + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + + if(area->y1 == 0) { + uint16_t size = stride * lv_area_get_height(area); + + /* Invalidate full buffer. */ + DEMO_CleanInvalidateCacheByAddr((void *)buf, size); + return; + } + + const uint8_t * buf_u8 = buf; + /* ARM require a 32 byte aligned address. */ + uint8_t align_bytes = 32; + uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); + + uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; + uint16_t offset_x = 0; + + if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { + uint16_t shift_x = area->x1 - (area->x1 % align_pixels); + + offset_x = area->x1 - shift_x; + buf_u8 += (shift_x * bits_per_pixel) / 8; + } + + if(area->y1) { + uint16_t shift_y = area->y1; + + buf_u8 += shift_y * stride; + } + + /* Area to clear can start from a different offset in buffer. + * Invalidate the area line by line. + */ + uint16_t line_pixels = offset_x + lv_area_get_width(area); + uint16_t line_size = (line_pixels * bits_per_pixel) / 8; + uint16_t area_height = lv_area_get_height(area); + + for(uint16_t y = 0; y < area_height; y++) { + const void * line_addr = buf_u8 + y * stride; + + DEMO_CleanInvalidateCacheByAddr((void *)line_addr, line_size); + } +} + +static uint32_t _width_to_stride(uint32_t w, lv_color_format_t cf) +{ + uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); + uint32_t width_bits = (w * bits_per_pixel + 7) & ~7; + uint32_t width_bytes = width_bits / 8; + uint8_t align_bytes = vglite_get_alignment(cf); + + return (width_bytes + align_bytes - 1) & ~(align_bytes - 1); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c new file mode 100644 index 0000000..d4c9517 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c @@ -0,0 +1,548 @@ +/** + * @file lv_draw_vglite.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" + +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_VGLITE 2 + +#if LV_USE_VGLITE_DRAW_ASYNC + #define VGLITE_TASK_BUF_SIZE 10 +#endif + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_VGLITE_DRAW_ASYNC +/** + * Structure of pending vglite draw task + */ +typedef struct _vglite_draw_task_t { + lv_draw_task_t * task; + bool flushed; +} vglite_draw_tasks_t; +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* + * Evaluate a task and set the score and preferred VGLite draw unit. + * Return 1 if task is preferred, 0 otherwise (task is not supported). + */ +static int32_t _vglite_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +/* + * Dispatch (assign) a task to VGLite draw unit (itself). + * Return 1 if task was dispatched, 0 otherwise (task not supported). + */ +static int32_t _vglite_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +/* + * Delete the VGLite draw unit. + */ +static int32_t _vglite_delete(lv_draw_unit_t * draw_unit); + +#if LV_USE_OS + static void _vglite_render_thread_cb(void * ptr); +#endif + +static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +#if LV_USE_VGLITE_DRAW_ASYNC + /* + * Circular buffer to hold the queued and the flushed tasks. + * Two indexes, _head and _tail, are used to signal the beginning + * and the end of the valid tasks that are pending. + */ + static vglite_draw_tasks_t _draw_task_buf[VGLITE_TASK_BUF_SIZE]; + static volatile int _head = 0; + static volatile int _tail = 0; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_init(void) +{ + lv_draw_buf_vglite_init_handlers(); + + lv_draw_vglite_unit_t * draw_vglite_unit = lv_draw_create_unit(sizeof(lv_draw_vglite_unit_t)); + draw_vglite_unit->base_unit.evaluate_cb = _vglite_evaluate; + draw_vglite_unit->base_unit.dispatch_cb = _vglite_dispatch; + draw_vglite_unit->base_unit.delete_cb = _vglite_delete; + +#if LV_USE_OS + lv_thread_init(&draw_vglite_unit->thread, LV_THREAD_PRIO_HIGH, _vglite_render_thread_cb, 2 * 1024, draw_vglite_unit); +#endif +} + +void lv_draw_vglite_deinit(void) +{ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline bool _vglite_src_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { +#if CHIPID == 0x255 || CHIPID == 0x555 + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: +#endif + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_RGB565: +#if CHIPID == 0x555 + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_RGB888: +#endif + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static inline bool _vglite_dest_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_A8: +#if CHIPID == 0x255 || CHIPID == 0x555 + case LV_COLOR_FORMAT_L8: +#endif + case LV_COLOR_FORMAT_RGB565: +#if CHIPTID == 0x555 + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_RGB888: +#endif + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static int32_t _vglite_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + + const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; + + if(!_vglite_dest_cf_supported(draw_dsc_base->layer->color_format)) + return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + if(t->preference_score > 80) { + t->preference_score = 80; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + + case LV_DRAW_TASK_TYPE_LINE: + case LV_DRAW_TASK_TYPE_ARC: + case LV_DRAW_TASK_TYPE_TRIANGLE: + if(t->preference_score > 90) { + t->preference_score = 90; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + + case LV_DRAW_TASK_TYPE_LABEL: + if(t->preference_score > 95) { + t->preference_score = 95; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + + case LV_DRAW_TASK_TYPE_BORDER: { + const lv_draw_border_dsc_t * draw_dsc = (lv_draw_border_dsc_t *) t->draw_dsc; + + if(draw_dsc->side != (lv_border_side_t)LV_BORDER_SIDE_FULL) + return 0; + + if(t->preference_score > 90) { + t->preference_score = 90; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_LAYER: { + const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + +#if LV_USE_VGLITE_BLIT_SPLIT + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); +#endif + if(!_vglite_src_cf_supported(layer_to_draw->color_format) +#if LV_USE_VGLITE_BLIT_SPLIT + || has_transform +#endif + ) + return 0; + + if(t->preference_score > 80) { + t->preference_score = 80; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + const lv_image_dsc_t * img_dsc = draw_dsc->src; + +#if LV_USE_VGLITE_BLIT_SPLIT + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); +#endif + + if((!_vglite_src_cf_supported(img_dsc->header.cf)) +#if LV_USE_VGLITE_BLIT_SPLIT + || has_transform +#endif + || (!vglite_buf_aligned(img_dsc->data, img_dsc->header.stride, img_dsc->header.cf)) + ) + return 0; + + if(t->preference_score > 80) { + t->preference_score = 80; + t->preferred_draw_unit_id = DRAW_UNIT_ID_VGLITE; + } + return 1; + } + default: + return 0; + } + + return 0; +} + +static int32_t _vglite_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_vglite_unit_t * draw_vglite_unit = (lv_draw_vglite_unit_t *) draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(draw_vglite_unit->task_act) + return 0; + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_VGLITE); + + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_VGLITE) + return -1; + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) + return -1; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_vglite_unit->base_unit.target_layer = layer; + draw_vglite_unit->base_unit.clip_area = &t->clip_area; + draw_vglite_unit->task_act = t; + +#if LV_USE_OS + /* Let the render thread work. */ + if(draw_vglite_unit->inited) + lv_thread_sync_signal(&draw_vglite_unit->sync); +#else + _vglite_execute_drawing(draw_vglite_unit); + + draw_vglite_unit->task_act->state = LV_DRAW_TASK_STATE_READY; + draw_vglite_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static int32_t _vglite_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_OS + lv_draw_vglite_unit_t * draw_vglite_unit = (lv_draw_vglite_unit_t *) draw_unit; + + LV_LOG_INFO("Cancel VGLite draw thread."); + draw_vglite_unit->exit_status = true; + + if(draw_vglite_unit->inited) + lv_thread_sync_signal(&draw_vglite_unit->sync); + + lv_result_t res = lv_thread_delete(&draw_vglite_unit->thread); + + return res; +#else + LV_UNUSED(draw_unit); + + return 0; +#endif +} + +static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; + lv_layer_t * layer = draw_unit->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + /* Set target buffer */ + vglite_set_dest_buf(draw_buf->data, draw_buf->header.w, draw_buf->header.h, draw_buf->header.stride, + draw_buf->header.cf); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t draw_area; + lv_area_copy(&draw_area, &t->area); + lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); + + if(!_lv_area_intersect(&draw_area, &draw_area, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + /* Invalidate the drawing area */ + lv_draw_buf_invalidate_cache(draw_buf, &draw_area); + + /* Set scissor area, excluding the split blit case */ +#if LV_USE_VGLITE_BLIT_SPLIT + if(t->type != LV_DRAW_TASK_TYPE_IMAGE || t->type != LV_DRAW_TASK_TYPE_LAYER) +#endif + vglite_set_scissor(&clip_area); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_vglite_label(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_vglite_fill(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_vglite_border(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_vglite_img(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_vglite_arc(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_vglite_line(draw_unit, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_vglite_layer(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_vglite_triangle(draw_unit, t->draw_dsc); + break; + default: + break; + } + + /* Disable scissor */ + vglite_set_scissor(&layer->buf_area); + +#if LV_USE_PARALLEL_DRAW_DEBUG + /*Layers manage it for themselves*/ + if(t->type != LV_DRAW_TASK_TYPE_LAYER) { + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) + return; + + int32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != (lv_draw_unit_t *)u) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.border_color = rect_dsc.bg_color; + rect_dsc.bg_opa = LV_OPA_10; + rect_dsc.border_opa = LV_OPA_80; + rect_dsc.border_width = 1; + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.y1 = draw_area.y1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y1 + txt_size.y - 1; + + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_black(); + label_dsc.text = buf; + lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); + } +#endif +} + +#if LV_USE_VGLITE_DRAW_ASYNC +static inline void _vglite_queue_task(lv_draw_task_t * task_act) +{ + _draw_task_buf[_tail].task = task_act; + _draw_task_buf[_tail].flushed = false; + _tail = (_tail + 1) % VGLITE_TASK_BUF_SIZE; +} + +static inline void _vglite_signal_task_ready(lv_draw_task_t * task_act) +{ + if(vglite_cmd_buf_is_flushed()) { + int end = (_head < _tail) ? _tail : _tail + VGLITE_TASK_BUF_SIZE; + + for(int i = _head; i < end; i++) { + /* Previous flushed tasks are ready now. */ + if(_draw_task_buf[i % VGLITE_TASK_BUF_SIZE].flushed) { + lv_draw_task_t * task = _draw_task_buf[i % VGLITE_TASK_BUF_SIZE].task; + + /* Signal the ready state to dispatcher. */ + task->state = LV_DRAW_TASK_STATE_READY; + _head = (_head + 1) % VGLITE_TASK_BUF_SIZE; + /* No need to cleanup the tasks in buffer as we advance with the _head. */ + } + else { + /* Those tasks have been flushed now. */ + _draw_task_buf[i % VGLITE_TASK_BUF_SIZE].flushed = true; + } + } + } + + if(task_act) + VGLITE_ASSERT_MSG(_tail != _head, "VGLite task buffer full."); +} +#endif + +#if LV_USE_OS +static void _vglite_render_thread_cb(void * ptr) +{ + lv_draw_vglite_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(u->task_act == NULL +#if LV_USE_VGLITE_DRAW_ASYNC + /* + * Wait for sync if _draw_task_buf is empty. + * The thread will have to run as much as there are pending tasks. + */ + && _head == _tail +#endif + ) { + if(u->exit_status) + break; + + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("Ready to exit VGLite draw thread."); + break; + } + + if(u->task_act) { +#if LV_USE_VGLITE_DRAW_ASYNC + _vglite_queue_task((void *)u->task_act); +#endif + _vglite_execute_drawing(u); + } +#if LV_USE_VGLITE_DRAW_ASYNC + else { + /* + * Update the flush status for last pending tasks. + * vg_lite_flush() will early return if there is nothing to submit. + */ + vglite_run(); + } +#endif +#if LV_USE_VGLITE_DRAW_ASYNC + _vglite_signal_task_ready((void *)u->task_act); +#else + /* Signal the ready state to dispatcher. */ + u->task_act->state = LV_DRAW_TASK_STATE_READY; +#endif + /* Cleanup. */ + u->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("Exit VGLite draw thread."); +} +#endif + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h new file mode 100644 index 0000000..fe3cdfb --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h @@ -0,0 +1,79 @@ +/** + * @file lv_draw_vglite.h + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_DRAW_VGLITE_H +#define LV_DRAW_VGLITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_VGLITE +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_draw_sw_unit_t lv_draw_vglite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_buf_vglite_init_handlers(void); + +void lv_draw_vglite_init(void); + +void lv_draw_vglite_deinit(void); + +void lv_draw_vglite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vglite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vglite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vglite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_vglite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_vglite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_DRAW_VGLITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_H*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c new file mode 100644 index 0000000..6b0d4fe --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c @@ -0,0 +1,686 @@ +/** + * @file lv_draw_vglite_arc.c + * + */ + +/** + * Copyright 2021-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_path.h" +#include "lv_vglite_utils.h" + +#include "../../../stdlib/lv_string.h" +#include + +/********************* + * DEFINES + *********************/ + +#define T_FRACTION 16384.0f + +#define DICHOTO_ITER 5 + +static const uint16_t TperDegree[90] = { + 0, 174, 348, 522, 697, 873, 1049, 1226, 1403, 1581, + 1759, 1938, 2117, 2297, 2477, 2658, 2839, 3020, 3202, 3384, + 3567, 3749, 3933, 4116, 4300, 4484, 4668, 4852, 5037, 5222, + 5407, 5592, 5777, 5962, 6148, 6334, 6519, 6705, 6891, 7077, + 7264, 7450, 7636, 7822, 8008, 8193, 8378, 8564, 8750, 8936, + 9122, 9309, 9495, 9681, 9867, 10052, 10238, 10424, 10609, 10794, + 10979, 11164, 11349, 11534, 11718, 11902, 12086, 12270, 12453, 12637, + 12819, 13002, 13184, 13366, 13547, 13728, 13909, 14089, 14269, 14448, + 14627, 14805, 14983, 15160, 15337, 15513, 15689, 15864, 16038, 16212 +}; + +/********************** + * TYPEDEFS + **********************/ + +/* intermediate arc params */ +typedef struct _vg_arc { + int32_t angle; /* angle <90deg */ + int32_t quarter; /* 0-3 counter-clockwise */ + int32_t rad; /* radius */ + int32_t p0x; /* point P0 */ + int32_t p0y; + int32_t p1x; /* point P1 */ + int32_t p1y; + int32_t p2x; /* point P2 */ + int32_t p2y; + int32_t p3x; /* point P3 */ + int32_t p3y; +} vg_arc; + +typedef struct _cubic_cont_pt { + float p0; + float p1; + float p2; + float p3; +} cubic_cont_pt; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Draw arc shape with effects + * + * @param[in] center Arc center with relative coordinates + * @param[in] clip_area Clip area with relative coordinates to dest buff + * @param[in] dsc Arc description structure (width, rounded ending, opacity) + * + */ +static void _vglite_draw_arc(const lv_point_t * center, const lv_area_t * clip_area, + const lv_draw_arc_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords) +{ + LV_UNUSED(coords); + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->start_angle == dsc->end_angle) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_point_t center = {dsc->center.x - layer->buf_area.x1, dsc->center.y - layer->buf_area.y1}; + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + _vglite_draw_arc(¢er, &clip_area, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _copy_arc(vg_arc * dst, vg_arc * src) +{ + dst->quarter = src->quarter; + dst->rad = src->rad; + dst->angle = src->angle; + dst->p0x = src->p0x; + dst->p1x = src->p1x; + dst->p2x = src->p2x; + dst->p3x = src->p3x; + dst->p0y = src->p0y; + dst->p1y = src->p1y; + dst->p2y = src->p2y; + dst->p3y = src->p3y; +} + +/** + * Rotate the point according given rotation angle rotation center is 0,0 + */ +static void _rotate_point(int32_t angle, int32_t * x, int32_t * y) +{ + int32_t ori_x = *x; + int32_t ori_y = *y; + int16_t alpha = (int16_t)angle; + *x = ((lv_trigo_cos(alpha) * ori_x) / LV_TRIGO_SIN_MAX) - ((lv_trigo_sin(alpha) * ori_y) / LV_TRIGO_SIN_MAX); + *y = ((lv_trigo_sin(alpha) * ori_x) / LV_TRIGO_SIN_MAX) + ((lv_trigo_cos(alpha) * ori_y) / LV_TRIGO_SIN_MAX); +} + +/** + * Set full arc control points depending on quarter. + * Control points match the best approximation of a circle. + * Arc Quarter position is: + * Q2 | Q3 + * ---+--- + * Q1 | Q0 + */ +static void _set_full_arc(vg_arc * fullarc) +{ + /* the tangent length for the bezier circle approx */ + float tang = ((float)fullarc->rad) * BEZIER_OPTIM_CIRCLE; + switch(fullarc->quarter) { + case 0: + /* first quarter */ + fullarc->p0x = fullarc->rad; + fullarc->p0y = 0; + fullarc->p1x = fullarc->rad; + fullarc->p1y = (int32_t)tang; + fullarc->p2x = (int32_t)tang; + fullarc->p2y = fullarc->rad; + fullarc->p3x = 0; + fullarc->p3y = fullarc->rad; + break; + case 1: + /* second quarter */ + fullarc->p0x = 0; + fullarc->p0y = fullarc->rad; + fullarc->p1x = 0 - (int32_t)tang; + fullarc->p1y = fullarc->rad; + fullarc->p2x = 0 - fullarc->rad; + fullarc->p2y = (int32_t)tang; + fullarc->p3x = 0 - fullarc->rad; + fullarc->p3y = 0; + break; + case 2: + /* third quarter */ + fullarc->p0x = 0 - fullarc->rad; + fullarc->p0y = 0; + fullarc->p1x = 0 - fullarc->rad; + fullarc->p1y = 0 - (int32_t)tang; + fullarc->p2x = 0 - (int32_t)tang; + fullarc->p2y = 0 - fullarc->rad; + fullarc->p3x = 0; + fullarc->p3y = 0 - fullarc->rad; + break; + case 3: + /* fourth quarter */ + fullarc->p0x = 0; + fullarc->p0y = 0 - fullarc->rad; + fullarc->p1x = (int32_t)tang; + fullarc->p1y = 0 - fullarc->rad; + fullarc->p2x = fullarc->rad; + fullarc->p2y = 0 - (int32_t)tang; + fullarc->p3x = fullarc->rad; + fullarc->p3y = 0; + break; + default: + VGLITE_ASSERT_MSG(false, "Invalid arc quarter."); + break; + } +} + +/** + * Linear interpolation between two points 'a' and 'b' + * 't' parameter is the proportion ratio expressed in range [0 ; T_FRACTION ] + */ +static inline float _lerp(float coord_a, float coord_b, uint16_t t) +{ + float tf = (float)t; + return ((T_FRACTION - tf) * coord_a + tf * coord_b) / T_FRACTION; +} + +/** + * Computes a point of bezier curve given 't' param + */ +static inline float _comp_bezier_point(float t, cubic_cont_pt cp) +{ + float t_sq = t * t; + float inv_t_sq = (1.0f - t) * (1.0f - t); + float apt = (1.0f - t) * inv_t_sq * cp.p0 + 3.0f * inv_t_sq * t * cp.p1 + 3.0f * (1.0f - t) * t_sq * cp.p2 + t * t_sq * + cp.p3; + return apt; +} + +/** + * Find parameter 't' in curve at point 'pt' + * proceed by dichotomy on only 1 dimension, + * works only if the curve is monotonic + * bezier curve is defined by control points [p0 p1 p2 p3] + * 'dec' tells if curve is decreasing (true) or increasing (false) + */ +static uint16_t _get_bez_t_from_pos(float pt, cubic_cont_pt cp, bool dec) +{ + /* initialize dichotomy with boundary 't' values */ + float t_low = 0.0f; + float t_mid = 0.5f; + float t_hig = 1.0f; + float a_pt; + /* dichotomy loop */ + for(int i = 0; i < DICHOTO_ITER; i++) { + a_pt = _comp_bezier_point(t_mid, cp); + /* check mid-point position on bezier curve versus targeted point */ + if((a_pt > pt) != dec) { + t_hig = t_mid; + } + else { + t_low = t_mid; + } + /* define new 't' param for mid-point */ + t_mid = (t_low + t_hig) / 2.0f; + } + /* return parameter 't' in integer range [0 ; T_FRACTION] */ + return (uint16_t)floorf(t_mid * T_FRACTION + 0.5f); +} + +/** + * Gives relative coords of the control points + * for the sub-arc starting at angle with given angle span + */ +static void _get_subarc_control_points(vg_arc * arc, int32_t span) +{ + vg_arc fullarc = {0}; + fullarc.angle = arc->angle; + fullarc.quarter = arc->quarter; + fullarc.rad = arc->rad; + _set_full_arc(&fullarc); + + /* special case of full arc */ + if(arc->angle == 90) { + _copy_arc(arc, &fullarc); + return; + } + + /* compute 1st arc using the geometric construction of curve */ + uint16_t t2 = TperDegree[arc->angle + span]; + + /* lerp for A */ + float a2x = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t2); + float a2y = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t2); + /* lerp for B */ + float b2x = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t2); + float b2y = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t2); + /* lerp for C */ + float c2x = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t2); + float c2y = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t2); + + /* lerp for D */ + float d2x = _lerp(a2x, b2x, t2); + float d2y = _lerp(a2y, b2y, t2); + /* lerp for E */ + float e2x = _lerp(b2x, c2x, t2); + float e2y = _lerp(b2y, c2y, t2); + + float pt2x = _lerp(d2x, e2x, t2); + float pt2y = _lerp(d2y, e2y, t2); + + /* compute sub-arc using the geometric construction of curve */ + uint16_t t1 = TperDegree[arc->angle]; + + /* lerp for A */ + float a1x = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t1); + float a1y = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t1); + /* lerp for B */ + float b1x = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t1); + float b1y = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t1); + /* lerp for C */ + float c1x = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t1); + float c1y = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t1); + + /* lerp for D */ + float d1x = _lerp(a1x, b1x, t1); + float d1y = _lerp(a1y, b1y, t1); + /* lerp for E */ + float e1x = _lerp(b1x, c1x, t1); + float e1y = _lerp(b1y, c1y, t1); + + float pt1x = _lerp(d1x, e1x, t1); + float pt1y = _lerp(d1y, e1y, t1); + + /* find the 't3' parameter for point P(t1) on the sub-arc [P0 A2 D2 P(t2)] using dichotomy + * use position of x axis only */ + uint16_t t3; + t3 = _get_bez_t_from_pos(pt1x, + (cubic_cont_pt) { + .p0 = ((float)fullarc.p0x), .p1 = a2x, .p2 = d2x, .p3 = pt2x + }, + (bool)(pt2x < (float)fullarc.p0x)); + + /* lerp for B */ + float b3x = _lerp(a2x, d2x, t3); + float b3y = _lerp(a2y, d2y, t3); + /* lerp for C */ + float c3x = _lerp(d2x, pt2x, t3); + float c3y = _lerp(d2y, pt2y, t3); + + /* lerp for E */ + float e3x = _lerp(b3x, c3x, t3); + float e3y = _lerp(b3y, c3y, t3); + + arc->p0x = (int32_t)floorf(0.5f + pt1x); + arc->p0y = (int32_t)floorf(0.5f + pt1y); + arc->p1x = (int32_t)floorf(0.5f + e3x); + arc->p1y = (int32_t)floorf(0.5f + e3y); + arc->p2x = (int32_t)floorf(0.5f + c3x); + arc->p2y = (int32_t)floorf(0.5f + c3y); + arc->p3x = (int32_t)floorf(0.5f + pt2x); + arc->p3y = (int32_t)floorf(0.5f + pt2y); +} + +/** + * Gives relative coords of the control points + */ +static void _get_arc_control_points(vg_arc * arc, bool start) +{ + vg_arc fullarc = {0}; + fullarc.angle = arc->angle; + fullarc.quarter = arc->quarter; + fullarc.rad = arc->rad; + _set_full_arc(&fullarc); + + /* special case of full arc */ + if(arc->angle == 90) { + _copy_arc(arc, &fullarc); + return; + } + + /* compute sub-arc using the geometric construction of curve */ + uint16_t t = TperDegree[arc->angle]; + /* lerp for A */ + float ax = _lerp((float)fullarc.p0x, (float)fullarc.p1x, t); + float ay = _lerp((float)fullarc.p0y, (float)fullarc.p1y, t); + /* lerp for B */ + float bx = _lerp((float)fullarc.p1x, (float)fullarc.p2x, t); + float by = _lerp((float)fullarc.p1y, (float)fullarc.p2y, t); + /* lerp for C */ + float cx = _lerp((float)fullarc.p2x, (float)fullarc.p3x, t); + float cy = _lerp((float)fullarc.p2y, (float)fullarc.p3y, t); + + /* lerp for D */ + float dx = _lerp(ax, bx, t); + float dy = _lerp(ay, by, t); + /* lerp for E */ + float ex = _lerp(bx, cx, t); + float ey = _lerp(by, cy, t); + + /* sub-arc's control points are tangents of DeCasteljau's algorithm */ + if(start) { + arc->p0x = (int32_t)floorf(0.5f + _lerp(dx, ex, t)); + arc->p0y = (int32_t)floorf(0.5f + _lerp(dy, ey, t)); + arc->p1x = (int32_t)floorf(0.5f + ex); + arc->p1y = (int32_t)floorf(0.5f + ey); + arc->p2x = (int32_t)floorf(0.5f + cx); + arc->p2y = (int32_t)floorf(0.5f + cy); + arc->p3x = fullarc.p3x; + arc->p3y = fullarc.p3y; + } + else { + arc->p0x = fullarc.p0x; + arc->p0y = fullarc.p0y; + arc->p1x = (int32_t)floorf(0.5f + ax); + arc->p1y = (int32_t)floorf(0.5f + ay); + arc->p2x = (int32_t)floorf(0.5f + dx); + arc->p2y = (int32_t)floorf(0.5f + dy); + arc->p3x = (int32_t)floorf(0.5f + _lerp(dx, ex, t)); + arc->p3y = (int32_t)floorf(0.5f + _lerp(dy, ey, t)); + } +} + +/** + * Add the arc control points into the path data for vglite, + * taking into account the real center of the arc (translation). + * arc_path: (in/out) the path data array for vglite + * pidx: (in/out) index of last element added in arc_path + * q_arc: (in) the arc data containing control points + * center: (in) the center of the circle in draw coordinates + * cw: (in) true if arc is clockwise + */ +static void _add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, const lv_point_t * center, bool cw) +{ + /* assumes first control point already in array arc_path[] */ + int idx = *pidx; + if(cw) { +#if BEZIER_DBG_CONTROL_POINTS + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; +#else + arc_path[idx++] = VLC_OP_CUBIC; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; +#endif + } + else { /* reverse points order when counter-clockwise */ +#if BEZIER_DBG_CONTROL_POINTS + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = VLC_OP_LINE; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; +#else + arc_path[idx++] = VLC_OP_CUBIC; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; +#endif + } + /* update index i n path array*/ + *pidx = idx; +} + +static void _add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, + int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw) +{ + /* set number of arcs to draw */ + vg_arc q_arc; + int32_t start_arc_angle = start_angle % 90; + int32_t end_arc_angle = end_angle % 90; + int32_t inv_start_arc_angle = (start_arc_angle > 0) ? (90 - start_arc_angle) : 0; + int32_t nbarc = (end_angle - start_angle - inv_start_arc_angle - end_arc_angle) / 90; + q_arc.rad = radius; + + /* handle special case of start & end point in the same quarter */ + if(((start_angle / 90) == (end_angle / 90)) && (nbarc <= 0)) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + _get_subarc_control_points(&q_arc, end_arc_angle - start_arc_angle); + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + return; + } + + if(cw) { + /* partial starting arc */ + if(start_arc_angle > 0) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, true); + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* full arcs */ + for(int32_t q = 0; q < nbarc ; q++) { + q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; + q_arc.angle = 90; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* partial ending arc */ + if(end_arc_angle > 0) { + q_arc.quarter = (end_angle / 90) % 4; + q_arc.angle = end_arc_angle; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, false); + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + + } + else { /* counter clockwise */ + + /* partial ending arc */ + if(end_arc_angle > 0) { + q_arc.quarter = (end_angle / 90) % 4; + q_arc.angle = end_arc_angle; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, false); + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* full arcs */ + for(int32_t q = nbarc - 1; q >= 0; q--) { + q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4; + q_arc.angle = 90; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, true); /* 2nd parameter 'start' ignored */ + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + /* partial starting arc */ + if(start_arc_angle > 0) { + q_arc.quarter = (start_angle / 90) % 4; + q_arc.angle = start_arc_angle; + /* get cubic points relative to center */ + _get_arc_control_points(&q_arc, true); + /* put cubic points in arc_path */ + _add_split_arc_path(arc_path, pidx, &q_arc, center, cw); + } + } +} + +static void _vglite_draw_arc(const lv_point_t * center, const lv_area_t * clip_area, + const lv_draw_arc_dsc_t * dsc) +{ + vg_lite_path_t path; + uint16_t start_angle = dsc->start_angle; + uint16_t end_angle = dsc->end_angle; + + /* be sure end_angle > start_angle */ + if(end_angle < start_angle) + end_angle += 360; + + bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false; + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + + int32_t arc_path[ARC_PATH_DATA_MAX_SIZE]; + lv_memzero(arc_path, sizeof(arc_path)); + + /*** Init path ***/ + int32_t width = dsc->width; /* inner arc radius = outer arc radius - width */ + uint16_t radius = dsc->radius; + + if(width > radius) + width = radius; + + int pidx = 0; + int32_t cp_x, cp_y; /* control point coords */ + + /* first control point of curve */ + cp_x = radius; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_MOVE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + + /* draw 1-5 outer quarters */ + _add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, center, true); + + if(donut) { + /* close outer circle */ + cp_x = radius; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + /* start inner circle */ + cp_x = radius - width; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_MOVE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + + } + else if(dsc->rounded != 0U) { /* 1st rounded arc ending */ + cp_x = radius - width / 2; + cp_y = 0; + _rotate_point(end_angle, &cp_x, &cp_y); + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; + _add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180), + &round_center, true); + + } + else { /* 1st flat ending */ + cp_x = radius - width; + cp_y = 0; + _rotate_point(end_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + } + + /* draw 1-5 inner quarters */ + _add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, center, false); + + /* last control point of curve */ + if(donut) { /* close the loop */ + cp_x = radius - width; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + + } + else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */ + cp_x = radius - width / 2; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; + _add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360), + &round_center, true); + + } + else { /* 2nd flat ending */ + cp_x = radius; + cp_y = 0; + _rotate_point(start_angle, &cp_x, &cp_y); + arc_path[pidx++] = VLC_OP_LINE; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; + } + + arc_path[pidx++] = VLC_OP_END; + + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*** Draw arc ***/ + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_border.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_border.c new file mode 100644 index 0000000..eb8c93b --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_border.c @@ -0,0 +1,150 @@ +/** + * @file lv_draw_vglite_border.c + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_path.h" +#include "lv_vglite_utils.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Draw rectangle border/outline shape with effects (rounded corners, opacity) + * + * @param[in] coords Coordinates of the rectangle border/outline (relative to dest buff) + * @param[in] clip_area Clip area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle border/outline + * + */ +static void _vglite_draw_border(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_border_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->side == (lv_border_side_t)LV_BORDER_SIDE_NONE) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t inward_coords; + int32_t width = dsc->width; + + /* Move border inwards to align with software rendered border */ + inward_coords.x1 = coords->x1 + ceil(width / 2.0f); + inward_coords.x2 = coords->x2 - floor(width / 2.0f); + inward_coords.y1 = coords->y1 + ceil(width / 2.0f); + inward_coords.y2 = coords->y2 - floor(width / 2.0f); + + lv_area_move(&inward_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + _vglite_draw_border(&inward_coords, &clip_area, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _vglite_draw_border(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_border_dsc_t * dsc) +{ + int32_t radius = dsc->radius; + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + + if(radius < 0) + return; + + int32_t border_half = (int32_t)floor(dsc->width / 2.0f); + if(radius > border_half) + radius = radius - border_half; + + vg_lite_cap_style_t cap_style = (radius) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (radius) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + /*** Init path ***/ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = radius > 0 ? VG_LITE_HIGH : VG_LITE_MEDIUM; + + vg_lite_path_t path; + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + int32_t line_width = dsc->width; + + /*** Draw border ***/ + VGLITE_CHECK_ERROR(vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH)); + + VGLITE_CHECK_ERROR(vg_lite_set_stroke(&path, cap_style, join_style, line_width, 8, NULL, 0, 0, vgcol)); + + VGLITE_CHECK_ERROR(vg_lite_update_stroke(&path)); + + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_fill.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_fill.c new file mode 100644 index 0000000..bf06685 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_fill.c @@ -0,0 +1,237 @@ +/** + * @file lv_draw_vglite_fill.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_path.h" +#include "lv_vglite_utils.h" + +#include "../../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Fill area, with optional opacity. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dsc Description of the area to fill (color, opa) + * + */ +static void _vglite_fill(const lv_area_t * dest_area, const lv_draw_fill_dsc_t * dsc); + +/** + * Draw rectangle background with effects (rounded corners, gradient) + * + * @param[in] coords Coordinates of the rectangle background (relative to dest buff) + * @param[in] clip_area Clip area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle background + * + */ +static void _vglite_draw_rect(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_fill_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t relative_coords; + lv_area_copy(&relative_coords, coords); + lv_area_move(&relative_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &relative_coords, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + /* + * Most simple case: just a plain rectangle (no radius, no gradient) + */ + if((dsc->radius == 0) && (dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) + _vglite_fill(&clipped_coords, dsc); + else + _vglite_draw_rect(&relative_coords, &clip_area, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _vglite_fill(const lv_area_t * dest_area, const lv_draw_fill_dsc_t * dsc) +{ + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ + vg_lite_rectangle_t rect = { + .x = dest_area->x1, + .y = dest_area->y1, + .width = lv_area_get_width(dest_area), + .height = lv_area_get_height(dest_area) + }; + + VGLITE_CHECK_ERROR(vg_lite_clear(vgbuf, &rect, vgcol)); + + vglite_run(); + } + else { /*fill with transparency*/ + + vg_lite_path_t path; + int32_t path_data[] = { /*VG rectangular path*/ + VLC_OP_MOVE, dest_area->x1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y1, + VLC_OP_END + }; + + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_MEDIUM, sizeof(path_data), path_data, + (vg_lite_float_t) dest_area->x1, (vg_lite_float_t) dest_area->y1, + ((vg_lite_float_t) dest_area->x2) + 1.0f, ((vg_lite_float_t) dest_area->y2) + 1.0f)); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*Draw rectangle*/ + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); + } +} + +static void _vglite_draw_rect(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_fill_dsc_t * dsc) +{ + int32_t width = lv_area_get_width(coords); + int32_t height = lv_area_get_height(coords); + int32_t radius = dsc->radius; + lv_opa_t opa = dsc->opa; + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + + if(dsc->radius < 0) + return; + + /*** Init path ***/ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_MEDIUM; + + vg_lite_path_t path; + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*** Init Color ***/ + lv_color32_t col32 = lv_color_to_32(dsc->color, opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_linear_gradient_t gradient; + bool has_gradient = (dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE); + + /*** Init Gradient ***/ + if(has_gradient) { + vg_lite_matrix_t * grad_matrix; + + vg_lite_uint32_t colors[LV_GRADIENT_MAX_STOPS]; + vg_lite_uint32_t stops[LV_GRADIENT_MAX_STOPS]; + lv_color32_t col32[LV_GRADIENT_MAX_STOPS]; + + /* Gradient setup */ + vg_lite_uint32_t cnt = LV_MAX(dsc->grad.stops_count, LV_GRADIENT_MAX_STOPS); + lv_opa_t opa; + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = dsc->grad.stops[i].frac; + + opa = LV_OPA_MIX2(dsc->grad.stops[i].opa, dsc->opa); + + col32[i] = lv_color_to_32(dsc->grad.stops[i].color, opa); + colors[i] = vglite_get_color(col32[i], true); + } + + lv_memzero(&gradient, sizeof(vg_lite_linear_gradient_t)); + + VGLITE_CHECK_ERROR(vg_lite_init_grad(&gradient)); + + VGLITE_CHECK_ERROR(vg_lite_set_grad(&gradient, cnt, colors, stops)); + + VGLITE_CHECK_ERROR(vg_lite_update_grad(&gradient)); + + grad_matrix = vg_lite_get_grad_matrix(&gradient); + vg_lite_identity(grad_matrix); + vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); + + if(dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { + vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); + vg_lite_rotate(90.0f, grad_matrix); + } + else { /*LV_GRAD_DIR_HOR*/ + vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); + } + + VGLITE_CHECK_ERROR(vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, + VG_LITE_BLEND_SRC_OVER)); + } + else { + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); + } + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); + + if(has_gradient) + VGLITE_CHECK_ERROR(vg_lite_clear_grad(&gradient)); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c new file mode 100644 index 0000000..b7ee056 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c @@ -0,0 +1,441 @@ +/** + * @file lv_draw_vglite_blend.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_matrix.h" +#include "lv_vglite_utils.h" +#include "lv_vglite_path.h" + +#include "../../../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_VGLITE_BLIT_SPLIT +/** +* BLIT split threshold - BLITs with width or height higher than this value will +* be done in multiple steps. Value must be multiple of stride alignment in px. +* For most color formats the alignment is 16px (except the index formats). +*/ +#define VGLITE_BLIT_SPLIT_THR 352 + +/* Enable for logging debug traces. */ +#define VGLITE_LOG_TRACE 0 + +#if VGLITE_LOG_TRACE +#define VGLITE_TRACE(fmt, ...) \ + do { \ + LV_LOG(fmt, ##__VA_ARGS__); \ + } while (0) +#else +#define VGLITE_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif +#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_USE_VGLITE_BLIT_SPLIT +/** + * Move buffer pointer as close as possible to area, but with respect to alignment requirements. + * + * @param[in] buf Buffer address pointer + * @param[in] area Area with relative coordinates to the buffer + * @param[in] stride Stride of buffer in bytes + * @param[in] cf Color format of buffer + */ +static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stride, lv_color_format_t cf); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param dest_buf Destination buffer + * @param[in] dest_area Destination area with relative coordinates to dest buffer + * @param[in] dest_stride Stride of destination buffer in bytes + * @param[in] dest_cf Color format of destination buffer + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates to src buffer + * @param[in] src_stride Stride of source buffer in bytes + * @param[in] src_cf Color format of source buffer + * @param[in] dsc Image descriptor + * + */ +static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t dest_stride, lv_color_format_t dest_cf, + const void * src_buf, lv_area_t * src_area, uint32_t src_stride, lv_color_format_t src_cf, + const lv_draw_image_dsc_t * dsc); +#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ + +/** + * VGlite blit - fill a path with an image pattern + * + * + * @param[in] dest_area Destination area with relative coordinates to dest buffer + * @param[in] clip_area Clip area with relative coordinates to dest buff + * @param[in] coords Coordinates of the image (relative to dest buff) + * @param[in] dsc Image descriptor + * + */ +static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords, + const lv_draw_image_dsc_t * dsc); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with or without effects. + * + * @param[in] src_area Source area with relative coordinates to src buffer + * @param[in] dsc Image descriptor + * + */ +static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t * dsc); + +static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + const lv_image_dsc_t * img_dsc = dsc->src; + + lv_area_t relative_coords; + lv_area_copy(&relative_coords, coords); + lv_area_move(&relative_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t blend_area; + bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + if(has_transform) + lv_area_copy(&blend_area, &relative_coords); + else if(!_lv_area_intersect(&blend_area, &relative_coords, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + const void * src_buf = img_dsc->data; + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - layer->buf_area.x1); + src_area.y1 = blend_area.y1 - (coords->y1 - layer->buf_area.y1); + src_area.x2 = img_dsc->header.w - 1; + src_area.y2 = img_dsc->header.h - 1; + + lv_color_format_t src_cf = img_dsc->header.cf; + uint32_t src_stride = img_dsc->header.stride; + + /* Set src_vgbuf structure. */ + vglite_set_src_buf(src_buf, img_dsc->header.w, img_dsc->header.h, src_stride, src_cf); + +#if LV_USE_VGLITE_BLIT_SPLIT + void * dest_buf = layer->draw_buf->data; + uint32_t dest_stride = layer->draw_buf->header.stride; + lv_color_format_t dest_cf = layer->draw_buf->header.cf; + + if(!has_transform) + _vglite_blit_split(dest_buf, &blend_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, dsc); +#else + vglite_set_transformation_matrix(&blend_area, dsc); + bool is_tiled = dsc->tile; + if(is_tiled) + _vglite_draw_pattern(&clip_area, &relative_coords, dsc); + else + _vglite_blit(&src_area, dsc); +#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t * dsc) +{ + vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); + vg_lite_buffer_t * src_vgbuf = vglite_get_src_buf(); + + vg_lite_rectangle_t rect = { + .x = (vg_lite_int32_t)src_area->x1, + .y = (vg_lite_int32_t)src_area->y1, + .width = (vg_lite_int32_t)lv_area_get_width(src_area), + .height = (vg_lite_int32_t)lv_area_get_height(src_area) + }; + + src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + + vg_lite_color_t vgcol = _vglite_recolor(dsc); + + vg_lite_matrix_t * vgmatrix = vglite_get_matrix(); + vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); + + VGLITE_CHECK_ERROR(vg_lite_blit_rect(dst_vgbuf, src_vgbuf, &rect, vgmatrix, vgblend, vgcol, VG_LITE_FILTER_POINT)); + + vglite_run(); +} + +#if LV_USE_VGLITE_BLIT_SPLIT +static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stride, lv_color_format_t cf) +{ + uint8_t ** buf_u8 = (uint8_t **)buf; + uint8_t align_bytes = vglite_get_alignment(cf); + uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); + + uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; + + if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { + uint16_t shift_x = area->x1 - (area->x1 % align_pixels); + + area->x1 -= shift_x; + area->x2 -= shift_x; + *buf_u8 += (shift_x * bits_per_pixel) / 8; + } + + if(area->y1) { + uint16_t shift_y = area->y1; + + area->y1 -= shift_y; + area->y2 -= shift_y; + *buf_u8 += shift_y * stride; + } +} + +static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t dest_stride, lv_color_format_t dest_cf, + const void * src_buf, lv_area_t * src_area, uint32_t src_stride, lv_color_format_t src_cf, + const lv_draw_image_dsc_t * dsc) +{ + VGLITE_TRACE("Blit " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + /* Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible */ + _move_buf_close_to_area((void **)&src_buf, src_area, src_stride, src_cf); + _move_buf_close_to_area(&dest_buf, dest_area, dest_stride, dest_cf); + + /* Set clip area */ + vglite_set_scissor(dest_area); + + /* If we're in limit, do a single BLIT */ + if((src_area->x2 < VGLITE_BLIT_SPLIT_THR) && + (src_area->y2 < VGLITE_BLIT_SPLIT_THR)) { + + /* Set new dest_vgbuf and src_vgbuf memory addresses */ + vglite_set_dest_buf_ptr(dest_buf); + vglite_set_src_buf_ptr(src_buf); + + vglite_set_transformation_matrix(dest_area, dsc); + _vglite_blit(src_area, dsc); + + VGLITE_TRACE("Single " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + return; + }; + + /* Split the BLIT into multiple tiles */ + VGLITE_TRACE("Split " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + int32_t width = LV_MIN(lv_area_get_width(src_area), lv_area_get_width(dest_area)); + int32_t height = LV_MIN(lv_area_get_height(src_area), lv_area_get_height(dest_area)); + + /* Number of tiles needed */ + uint8_t total_tiles_x = (src_area->x1 + width + VGLITE_BLIT_SPLIT_THR - 1) / + VGLITE_BLIT_SPLIT_THR; + uint8_t total_tiles_y = (src_area->y1 + height + VGLITE_BLIT_SPLIT_THR - 1) / + VGLITE_BLIT_SPLIT_THR; + + uint16_t shift_src_x = src_area->x1; + uint16_t shift_dest_x = dest_area->x1; + + VGLITE_TRACE("X shift: src: %d, dst: %d", shift_src_x, shift_dest_x); + + uint8_t * tile_dest_buf; + lv_area_t tile_dest_area; + const uint8_t * tile_src_buf; + lv_area_t tile_src_area; + + for(uint8_t y = 0; y < total_tiles_y; y++) { + /* y1 always start from 0 */ + tile_src_area.y1 = 0; + + /* Calculate y2 coordinates */ + if(y < total_tiles_y - 1) + tile_src_area.y2 = VGLITE_BLIT_SPLIT_THR - 1; + else + tile_src_area.y2 = height - y * VGLITE_BLIT_SPLIT_THR - 1; + + /* No vertical shift, dest y is always in sync with src y */ + tile_dest_area.y1 = tile_src_area.y1; + tile_dest_area.y2 = tile_src_area.y2; + + /* Advance start pointer for every tile, except the first column (y = 0) */ + tile_src_buf = (uint8_t *)src_buf + y * VGLITE_BLIT_SPLIT_THR * src_stride; + tile_dest_buf = (uint8_t *)dest_buf + y * VGLITE_BLIT_SPLIT_THR * dest_stride; + + for(uint8_t x = 0; x < total_tiles_x; x++) { + /* x1 always start from the same shift */ + tile_src_area.x1 = shift_src_x; + tile_dest_area.x1 = shift_dest_x; + if(x > 0) { + /* Advance start pointer for every tile, except the first raw (x = 0) */ + tile_src_buf += VGLITE_BLIT_SPLIT_THR * lv_color_format_get_bpp(src_cf) / 8; + tile_dest_buf += VGLITE_BLIT_SPLIT_THR * lv_color_format_get_bpp(dest_cf) / 8; + } + + /* Calculate x2 coordinates */ + if(x < total_tiles_x - 1) + tile_src_area.x2 = VGLITE_BLIT_SPLIT_THR - 1; + else + tile_src_area.x2 = width - x * VGLITE_BLIT_SPLIT_THR - 1; + + tile_dest_area.x2 = tile_src_area.x2; + + /* Shift x2 coordinates */ + tile_src_area.x2 += shift_src_x; + tile_dest_area.x2 += shift_dest_x; + + /* Set new dest_vgbuf and src_vgbuf memory addresses */ + vglite_set_dest_buf_ptr(tile_dest_buf); + vglite_set_src_buf_ptr(tile_src_buf); + + vglite_set_transformation_matrix(&tile_dest_area, dsc); + _vglite_blit(&tile_src_area, dsc); + + VGLITE_TRACE("Tile [%d, %d] " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + x, y, + tile_src_area.x1, tile_src_area.y1, tile_src_area.x2, tile_src_area.y2, + tile_dest_area.x1, tile_dest_area.y1, tile_dest_area.x2, tile_dest_area.y2, + lv_area_get_width(&tile_src_area), lv_area_get_height(&tile_src_area), + lv_area_get_width(&tile_dest_area), lv_area_get_height(&tile_dest_area), + (uintptr_t)tile_src_buf, (uintptr_t)tile_dest_buf); + } + } +} +#endif /*LV_USE_VGLITE_BLIT_SPLIT*/ + +static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords, + const lv_draw_image_dsc_t * dsc) +{ + /* Target buffer */ + vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); + + /* Path to draw */ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + vglite_create_rect_path_data(path_data, &path_data_size, 0, coords); + vg_lite_quality_t path_quality = VG_LITE_MEDIUM; + + vg_lite_path_t path; + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + /* Path Matrix */ + vg_lite_matrix_t path_matrix; + vg_lite_identity(&path_matrix); + + /* Pattern Image */ + vg_lite_buffer_t * src_vgbuf = vglite_get_src_buf(); + src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + + /* Pattern matrix */ + vg_lite_matrix_t * vgmatrix = vglite_get_matrix(); + + /* Blend mode */ + vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); + + vg_lite_color_t vgcol = _vglite_recolor(dsc); + + /* Filter */ + bool has_trasform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + vg_lite_filter_t filter = has_trasform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT; + + /* Draw Pattern */ + VGLITE_CHECK_ERROR(vg_lite_draw_pattern(dst_vgbuf, &path, VG_LITE_FILL_NON_ZERO, &path_matrix, + src_vgbuf, vgmatrix, vgblend, VG_LITE_PATTERN_REPEAT, + 0, vgcol, filter)); +} + +static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc) +{ + lv_color_t color; + lv_opa_t opa; + + bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN); + if(has_recolor) { + color = dsc->recolor; + opa = LV_OPA_MIX2(dsc->recolor_opa, dsc->opa); + } + else { + color.red = 0xFF; + color.green = 0xFF; + color.blue = 0xFF; + opa = dsc->opa; + } + + lv_color32_t col32 = lv_color_to_32(color, opa); + + return vglite_get_color(col32, false); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c new file mode 100644 index 0000000..9c9dbe4 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c @@ -0,0 +1,192 @@ +/** + * @file lv_draw_vglite_label.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_matrix.h" +#include "lv_vglite_utils.h" + +#include "../../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +/** + * Draw letter (character bitmap blend) with optional color and opacity + * + * @param[in] mask_area Mask area with relative coordinates of source buffer + * @param[in] color Color + * @param[in] opa Opacity + * + */ +static void _vglite_draw_letter(const lv_area_t * mask_area, lv_color_t color, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_label_iterate_characters(draw_unit, dsc, coords, _draw_vglite_letter); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + + case LV_FONT_GLYPH_FORMAT_NONE: { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + break; + case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: { + /*Do not draw transparent things*/ + if(glyph_draw_dsc->opa <= LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area)) + return; + lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1); + + const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + const void * mask_buf = draw_buf->data; + + uint32_t mask_width = lv_area_get_width(glyph_draw_dsc->letter_coords); + uint32_t mask_height = lv_area_get_height(glyph_draw_dsc->letter_coords); + uint32_t mask_stride = draw_buf->header.stride; + + lv_area_t mask_area; + mask_area.x1 = blend_area.x1 - (glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1); + mask_area.y1 = blend_area.y1 - (glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1); + mask_area.x2 = mask_width - 1; + mask_area.y2 = mask_height - 1; + + if(!vglite_buf_aligned(mask_buf, mask_stride, LV_COLOR_FORMAT_A8)) { + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); + } + else { + /* Set src_vgbuf structure. */ + vglite_set_src_buf(mask_buf, mask_width, mask_height, mask_stride, LV_COLOR_FORMAT_A8); + + /* Set vgmatrix. */ + vglite_set_translation_matrix(&blend_area); + + lv_draw_buf_invalidate_cache(draw_buf, &mask_area); + + _vglite_draw_letter(&mask_area, glyph_draw_dsc->color, glyph_draw_dsc->opa); + } + } + break; + case LV_FONT_GLYPH_FORMAT_IMAGE: { +#if LV_USE_IMGFONT + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_ZOOM_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + lv_draw_vglite_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + break; + default: + break; + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_vglite_fill(draw_unit, fill_draw_dsc, fill_area); + } +} + +static void _vglite_draw_letter(const lv_area_t * mask_area, lv_color_t color, lv_opa_t opa) +{ + vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf(); + vg_lite_buffer_t * mask_vgbuf = vglite_get_src_buf(); + + mask_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + mask_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + + vg_lite_rectangle_t rect = { + .x = (vg_lite_int32_t)mask_area->x1, + .y = (vg_lite_int32_t)mask_area->y1, + .width = (vg_lite_int32_t)lv_area_get_width(mask_area), + .height = (vg_lite_int32_t)lv_area_get_height(mask_area) + }; + + lv_color32_t col32 = lv_color_to_32(color, opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_matrix_t * vgmatrix = vglite_get_matrix(); + + /*Blit with font color as paint color*/ + VGLITE_CHECK_ERROR(vg_lite_blit_rect(dst_vgbuf, mask_vgbuf, &rect, vgmatrix, VG_LITE_BLEND_SRC_OVER, vgcol, + VG_LITE_FILTER_POINT)); + + vglite_run(); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c new file mode 100644 index 0000000..65283d0 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c @@ -0,0 +1,159 @@ +/** + * @file lv_draw_vglite_layer.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE + +#include "../../../stdlib/lv_string.h" +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf; + + /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + * In this case just return. + */ + if(draw_buf == NULL) + return; + + const lv_area_t area_to_draw = { + .x1 = 0, + .y1 = 0, + .x2 = draw_buf->header.w - 1, + .y2 = draw_buf->header.h - 1 + }; + lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = draw_buf; + lv_draw_vglite_img(draw_unit, &new_draw_dsc, coords); + +#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG + lv_area_t area_rot; + lv_area_copy(&area_rot, coords); + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); + + if(has_transform) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + area_rot.x1 += coords->x1; + area_rot.y1 += coords->y1; + area_rot.x2 += coords->x1; + area_rot.y2 += coords->y1; + } + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; +#endif + +#if LV_USE_LAYER_DEBUG + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); + fill_dsc.opa = LV_OPA_20; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = fill_dsc.color; + border_dsc.opa = LV_OPA_60; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + +#endif + +#if LV_USE_PARALLEL_DRAW_DEBUG + uint32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != draw_unit) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_rect_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_100; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y2; + txt_area.y1 = draw_area.y2 - txt_size.y + 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_black(); + lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.text = buf; + lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); +#endif +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c new file mode 100644 index 0000000..d458375 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c @@ -0,0 +1,145 @@ +/** + * @file lv_draw_vglite_line.c + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Draw line shape with effects + * + * @param[in] point1 Starting point with relative coordinates + * @param[in] point2 Ending point with relative coordinates + * @param[in] clip_area Clip area with relative coordinates to dest buff + * @param[in] dsc Line description structure (width, rounded ending, opacity, ...) + * + */ +static void _vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) + return; + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t clip_area; + clip_area.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_area.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_area.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_area.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + if(!_lv_area_intersect(&clip_area, &clip_area, draw_unit->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_point_t point1 = {dsc->p1.x - layer->buf_area.x1, dsc->p1.y - layer->buf_area.y1}; + lv_point_t point2 = {dsc->p2.x - layer->buf_area.x1, dsc->p2.y - layer->buf_area.y1}; + + _vglite_draw_line(&point1, &point2, &clip_area, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc) +{ + vg_lite_path_t path; + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + bool is_dashed = (dsc->dash_width && dsc->dash_gap); + + vg_lite_float_t stroke_dash_pattern[2] = {0, 0}; + uint32_t stroke_dash_count = 0; + vg_lite_float_t stroke_dash_phase = 0; + if(is_dashed) { + stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width; + stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap; + stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t); + stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2; + } + + vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode); + + /*** Init path ***/ + int32_t width = dsc->width; + + int32_t line_path[] = { /*VG line path*/ + VLC_OP_MOVE, point1->x, point1->y, + VLC_OP_LINE, point2->x, point2->y, + VLC_OP_END + }; + + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*** Draw line ***/ + VGLITE_CHECK_ERROR(vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH)); + + VGLITE_CHECK_ERROR(vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count, + stroke_dash_phase, vgcol)); + + VGLITE_CHECK_ERROR(vg_lite_update_stroke(&path)); + + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vgblend, vgcol)); + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_triangle.c b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_triangle.c new file mode 100644 index 0000000..0de169d --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_draw_vglite_triangle.c @@ -0,0 +1,179 @@ +/** + * @file lv_draw_vglite_triangle.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" +#include "lv_vglite_path.h" +#include "lv_vglite_utils.h" + +#include "../../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Draw triangle shape with effects (opacity, gradient) + * + * @param[in] coords Coordinates of the triangle (relative to dest buff) + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Description of the triangle + * + */ +static void _vglite_draw_triangle(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_triangle_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) +{ + if(dsc->bg_opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t coords; + coords.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + coords.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + lv_area_move(&coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &coords, &clip_area)) + return; /* Fully clipped, nothing to do */ + + _vglite_draw_triangle(&coords, &clip_area, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _vglite_draw_triangle(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_triangle_dsc_t * dsc) +{ + vg_lite_buffer_t * vgbuf = vglite_get_dest_buf(); + + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + uint32_t width = tri_area.x2 - tri_area.x1; + uint32_t height = tri_area.y2 - tri_area.y1; + + /* Init path */ + int32_t triangle_path[] = { /*VG line path*/ + VLC_OP_MOVE, dsc->p[0].x, dsc->p[0].y, + VLC_OP_LINE, dsc->p[1].x, dsc->p[1].y, + VLC_OP_LINE, dsc->p[2].x, dsc->p[2].y, + VLC_OP_LINE, dsc->p[0].x, dsc->p[0].y, + VLC_OP_END + }; + + vg_lite_path_t path; + VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(triangle_path), triangle_path, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f)); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /* Init Color */ + lv_color32_t col32 = lv_color_to_32(dsc->bg_color, dsc->bg_opa); + vg_lite_color_t vgcol = vglite_get_color(col32, false); + + vg_lite_linear_gradient_t gradient; + bool has_gradient = (dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE); + + /* Init Gradient*/ + if(has_gradient) { + vg_lite_matrix_t * grad_matrix; + + vg_lite_uint32_t colors[LV_GRADIENT_MAX_STOPS]; + vg_lite_uint32_t stops[LV_GRADIENT_MAX_STOPS]; + lv_color32_t col32[LV_GRADIENT_MAX_STOPS]; + + /* Gradient Setup */ + vg_lite_uint32_t cnt = LV_MAX(dsc->bg_grad.stops_count, LV_GRADIENT_MAX_STOPS); + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = dsc->bg_grad.stops[i].frac; + + col32[i] = lv_color_to_32(dsc->bg_grad.stops[i].color, dsc->bg_grad.stops[i].opa); + colors[i] = vglite_get_color(col32[i], true); + } + + lv_memzero(&gradient, sizeof(vg_lite_linear_gradient_t)); + + VGLITE_CHECK_ERROR(vg_lite_init_grad(&gradient)); + + VGLITE_CHECK_ERROR(vg_lite_set_grad(&gradient, cnt, colors, stops)); + + VGLITE_CHECK_ERROR(vg_lite_update_grad(&gradient)); + + grad_matrix = vg_lite_get_grad_matrix(&gradient); + vg_lite_identity(grad_matrix); + vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); + + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { + vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); + vg_lite_rotate(90.0f, grad_matrix); + } + else { /*LV_GRAD_DIR_HOR*/ + vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); + } + + VGLITE_CHECK_ERROR(vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, + VG_LITE_BLEND_SRC_OVER)); + } + else { + VGLITE_CHECK_ERROR(vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol)); + } + + vglite_run(); + + VGLITE_CHECK_ERROR(vg_lite_clear_path(&path)); + + if(has_gradient) + VGLITE_CHECK_ERROR(vg_lite_clear_grad(&gradient)); +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c new file mode 100644 index 0000000..a72c8e5 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c @@ -0,0 +1,116 @@ +/** + * @file lv_vglite_buf.c + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_buf.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_utils.h" + +#include "../../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void _set_vgbuf_ptr(vg_lite_buffer_t * vgbuf, void * buf); + +/********************** + * STATIC VARIABLES + **********************/ + +static vg_lite_buffer_t _dest_vgbuf; +static vg_lite_buffer_t _src_vgbuf; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +vg_lite_buffer_t * vglite_get_dest_buf(void) +{ + return &_dest_vgbuf; +} + +vg_lite_buffer_t * vglite_get_src_buf(void) +{ + return &_src_vgbuf; +} + +void vglite_set_dest_buf_ptr(void * buf) +{ + _set_vgbuf_ptr(&_dest_vgbuf, buf); +} + +void vglite_set_src_buf_ptr(const void * buf) +{ + _set_vgbuf_ptr(&_src_vgbuf, (void *)buf); +} + +void vglite_set_dest_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf) +{ + vglite_set_buf(&_dest_vgbuf, (void *)buf, width, height, stride, cf); +} + +void vglite_set_src_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf) +{ + vglite_set_buf(&_src_vgbuf, (void *)buf, width, height, stride, cf); +} + +void vglite_set_buf(vg_lite_buffer_t * vgbuf, void * buf, + uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf) +{ + vg_lite_buffer_format_t vgformat = vglite_get_buf_format(cf); + + vgbuf->format = vgformat; + vgbuf->tiled = VG_LITE_LINEAR; + vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; + + vgbuf->width = (int32_t)width; + vgbuf->height = (int32_t)height; + vgbuf->stride = (int32_t)stride; + + lv_memzero(&vgbuf->yuv, sizeof(vgbuf->yuv)); + + vgbuf->memory = buf; + vgbuf->address = (uint32_t)vgbuf->memory; + vgbuf->handle = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void _set_vgbuf_ptr(vg_lite_buffer_t * vgbuf, void * buf) +{ + vgbuf->memory = buf; + vgbuf->address = (uint32_t)vgbuf->memory; +} + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h new file mode 100644 index 0000000..3ef4347 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h @@ -0,0 +1,124 @@ +/** + * @file lv_vglite_buf.h + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_VGLITE_BUF_H +#define LV_VGLITE_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_VGLITE +#include "../../sw/lv_draw_sw.h" + +#include "vg_lite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get vglite destination buffer pointer. + * + * @retval The vglite destination buffer + * + */ +vg_lite_buffer_t * vglite_get_dest_buf(void); + +/** + * Get vglite source buffer pointer. + * + * @retval The vglite source buffer + * + */ +vg_lite_buffer_t * vglite_get_src_buf(void); + +/** + * Set vglite destination buffer address only. + * + * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) + * + */ +void vglite_set_dest_buf_ptr(void * buf); + +/** + * Set vglite source buffer address only. + * + * @param[in] buf Source buffer address + * + */ +void vglite_set_src_buf_ptr(const void * buf); + +/** + * Set vglite destination buffer. + * + * @param[in] buf Destination buffer address + * @param[in] width Destination buffer width + * @param[in] height Destination buffer height + * @param[in] stride Destination buffer stride in bytes + * @param[in] cf Destination buffer color format + * + */ +void vglite_set_dest_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf); + +/** + * Set vglite source buffer. + * + * @param[in] buf Source buffer address + * @param[in] width Source buffer width + * @param[in] height Source buffer height + * @param[in] stride Source buffer stride in bytes + * @param[in] cf Source buffer color format + * + */ +void vglite_set_src_buf(const void * buf, uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf); + +/** + * Set vglite buffer. + * + * @param[in] vgbuf Address of the VGLite buffer object + * @param[in] buf Address of the memory for the VGLite buffer + * @param[in] width Buffer width + * @param[in] height Buffer height + * @param[in] stride Buffer stride in bytes + * @param[in] cf Buffer color format + * + */ +void vglite_set_buf(vg_lite_buffer_t * vgbuf, void * buf, + uint32_t width, uint32_t height, uint32_t stride, + lv_color_format_t cf); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_BUF_H*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c new file mode 100644 index 0000000..0594b53 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c @@ -0,0 +1,81 @@ +/** + * @file lv_vglite_matrix.c + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_matrix.h" + +#if LV_USE_DRAW_VGLITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static vg_lite_matrix_t _vgmatrix; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +vg_lite_matrix_t * vglite_get_matrix(void) +{ + return &_vgmatrix; +} + +void vglite_set_translation_matrix(const lv_area_t * dest_area) +{ + vg_lite_identity(&_vgmatrix); + vg_lite_translate((vg_lite_float_t)dest_area->x1, (vg_lite_float_t)dest_area->y1, &_vgmatrix); +} + +void vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_image_dsc_t * dsc) +{ + vglite_set_translation_matrix(dest_area); + + bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + bool has_rotation = (dsc->rotation != 0); + + if(has_scale || has_rotation) { + vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &_vgmatrix); + if(has_rotation) + vg_lite_rotate(dsc->rotation / 10.0f, &_vgmatrix); /* angle is 1/10 degree */ + if(has_scale) { + vg_lite_float_t scale_x = 1.0f * dsc->scale_x / LV_SCALE_NONE; + vg_lite_float_t scale_y = 1.0f * dsc->scale_y / LV_SCALE_NONE; + vg_lite_scale(scale_x, scale_y, &_vgmatrix); + } + vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &_vgmatrix); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.h b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.h new file mode 100644 index 0000000..832cd86 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.h @@ -0,0 +1,78 @@ +/** + * @file lv_vglite_matrix.h + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_VGLITE_MATRIX_H +#define LV_VGLITE_MATRIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_VGLITE +#include "../../sw/lv_draw_sw.h" + +#include "vg_lite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +vg_lite_matrix_t * vglite_get_matrix(void); + +/** + * Creates matrix that translates to origin of given destination area. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * + */ +void vglite_set_translation_matrix(const lv_area_t * dest_area); + +/** + * Creates matrix that translates to origin of given destination area with transformation (scale or rotate). + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dsc Image descriptor + * + */ +void vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_MATRIX_H*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.c b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.c new file mode 100644 index 0000000..6f8b759 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.c @@ -0,0 +1,217 @@ +/** + * @file lv_vglite_path.c + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_path.h" + +#if LV_USE_DRAW_VGLITE +#include "vg_lite.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + int32_t radius, + const lv_area_t * coords) +{ + int32_t rect_width = lv_area_get_width(coords); + int32_t rect_height = lv_area_get_height(coords); + + /* Get the final radius. Can't be larger than the half of the shortest side */ + int32_t shortest_side = LV_MIN(rect_width, rect_height); + int32_t final_radius = LV_MIN(radius, shortest_side / 2); + + /* Path data element index */ + uint8_t pidx = 0; + + if((radius == (int32_t)LV_RADIUS_CIRCLE) && (rect_width == rect_height)) { + + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Circle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top-right arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-right arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-left arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Top-left arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else if(radius > 0) { + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 - final_radius + 1; /*Extended for VGLite*/ + path_data[pidx++] = coords->y1; + + /* Top-right corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ + path_data[pidx++] = coords->y2 - final_radius + 1; /*Extended for VGLite*/ + + /* Bottom-right corner*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ + + /* Bottom-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1 + final_radius; + + /* Top-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else { + /* Non-rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ + path_data[pidx++] = coords->y1; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; /*Extended for VGLite*/ + path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y2 + 1; /*Extended for VGLite*/ + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + + /* Resulting path size */ + *path_data_size = pidx * sizeof(int32_t); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.h b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.h new file mode 100644 index 0000000..f38593a --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_path.h @@ -0,0 +1,97 @@ +/** + * @file lv_vglite_path.h + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_VGLITE_PATH_H +#define LV_VGLITE_PATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_VGLITE +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/* The optimal Bezier control point offset for radial unit + * see: https://spencermortensen.com/articles/bezier-circle/ + **/ +#define BEZIER_OPTIM_CIRCLE 0.551915024494f + +/* Draw lines for control points of Bezier curves */ +#define BEZIER_DBG_CONTROL_POINTS 0 + +/* Path data sizes for different elements */ +#define CUBIC_PATH_DATA_SIZE 7 /* 1 opcode, 6 arguments */ +#define LINE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define MOVE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define END_PATH_DATA_SIZE 1 /* 1 opcode, 0 arguments */ +/* Maximum possible rectangle path size + * is in the rounded rectangle case: + * - 1 move for the path start + * - 4 cubics for the corners + * - 4 lines for the sides + * - 1 end for the path end */ +#define RECT_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE) + +/* Maximum possible arc path size + * is in the rounded arc case: + * - 1 move for the path start + * - 16 cubics for the arc (5 inner, 5 outer) and corners (3 per corner) + * - 1 end for the path end */ +#define ARC_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 16 * CUBIC_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE) +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Generates path data for rectangle drawing. + * + * @param[in/out] path The path data to initialize + * @param[in/out] path_size The resulting size of the created path data + * @param[in] dsc The style descriptor for the rectangle to be drawn + * @param[in] coords The coordinates of the rectangle to be drawn + * + */ +void vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + int32_t radius, + const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_PATH_H*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c new file mode 100644 index 0000000..7e923ce --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c @@ -0,0 +1,285 @@ +/** + * @file lv_vglite_utils.c + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_utils.h" + +#if LV_USE_DRAW_VGLITE +#include "lv_vglite_buf.h" + +#include "../../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_VGLITE_DRAW_ASYNC + static volatile bool _cmd_buf_flushed = false; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +const char * vglite_error_to_string(vg_lite_error_t error) +{ + switch(error) { + ENUM_TO_STRING(VG_LITE_SUCCESS); + ENUM_TO_STRING(VG_LITE_INVALID_ARGUMENT); + ENUM_TO_STRING(VG_LITE_OUT_OF_MEMORY); + ENUM_TO_STRING(VG_LITE_NO_CONTEXT); + ENUM_TO_STRING(VG_LITE_TIMEOUT); + ENUM_TO_STRING(VG_LITE_OUT_OF_RESOURCES); + ENUM_TO_STRING(VG_LITE_GENERIC_IO); + ENUM_TO_STRING(VG_LITE_NOT_SUPPORT); + ENUM_TO_STRING(VG_LITE_ALREADY_EXISTS); + ENUM_TO_STRING(VG_LITE_NOT_ALIGNED); + ENUM_TO_STRING(VG_LITE_FLEXA_TIME_OUT); + ENUM_TO_STRING(VG_LITE_FLEXA_HANDSHAKE_FAIL); + default: + break; + } + + return "VG_LITE_UKNOWN_ERROR"; +} + +#if LV_USE_VGLITE_DRAW_ASYNC +bool vglite_cmd_buf_is_flushed(void) +{ + return _cmd_buf_flushed; +} +#endif + +void vglite_run(void) +{ +#if LV_USE_VGLITE_DRAW_ASYNC + vg_lite_uint32_t gpu_idle = 0; + + VGLITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&gpu_idle)); + + if(!gpu_idle) { + _cmd_buf_flushed = false; + + return; + } +#endif + + /* + * If LV_USE_VGLITE_DRAW_ASYNC is enabled, simply flush the command buffer and the + * vglite draw thread will signal asynchronous the dispatcher for completed tasks. + * Without draw async, process the tasks and signal them as complete one by one. + */ +#if LV_USE_VGLITE_DRAW_ASYNC + VGLITE_CHECK_ERROR(vg_lite_flush()); + _cmd_buf_flushed = true; +#else + VGLITE_CHECK_ERROR(vg_lite_finish()); +#endif +} + +vg_lite_color_t vglite_get_color(lv_color32_t lv_col32, bool gradient) +{ + vg_lite_color_t vg_col32; + + /* Pre-multiply alpha */ + lv_col32.red = LV_UDIV255(lv_col32.red * lv_col32.alpha); + lv_col32.green = LV_UDIV255(lv_col32.green * lv_col32.alpha); + lv_col32.blue = LV_UDIV255(lv_col32.blue * lv_col32.alpha); + + if(!gradient) + /* The color is in ABGR8888 format with red channel in the lower 8 bits. */ + vg_col32 = ((vg_lite_color_t)lv_col32.alpha << 24) | ((vg_lite_color_t)lv_col32.blue << 16) | + ((vg_lite_color_t)lv_col32.green << 8) | (vg_lite_color_t)lv_col32.red; + else + /* The gradient color is in ARGB8888 format with blue channel in the lower 8 bits. */ + vg_col32 = ((vg_lite_color_t)lv_col32.alpha << 24) | ((vg_lite_color_t)lv_col32.red << 16) | + ((vg_lite_color_t)lv_col32.green << 8) | (vg_lite_color_t)lv_col32.blue; + + return vg_col32; +} + +vg_lite_blend_t vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode) +{ + vg_lite_blend_t vg_blend_mode = VG_LITE_BLEND_NONE; + + if(vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT)) { + switch(lv_blend_mode) { + case LV_BLEND_MODE_NORMAL: + vg_blend_mode = VG_LITE_BLEND_NORMAL_LVGL; + break; + case LV_BLEND_MODE_ADDITIVE: + vg_blend_mode = VG_LITE_BLEND_ADDITIVE_LVGL; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + vg_blend_mode = VG_LITE_BLEND_SUBTRACT_LVGL; + break; + case LV_BLEND_MODE_MULTIPLY: + vg_blend_mode = VG_LITE_BLEND_MULTIPLY_LVGL; + break; + default: + VGLITE_ASSERT_MSG(false, "Unsupported blend mode."); + break; + } + } + else { + switch(lv_blend_mode) { + case LV_BLEND_MODE_NORMAL: + vg_blend_mode = VG_LITE_BLEND_SRC_OVER; + break; + case LV_BLEND_MODE_ADDITIVE: + vg_blend_mode = VG_LITE_BLEND_ADDITIVE; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + vg_blend_mode = VG_LITE_BLEND_SUBTRACT; + break; + case LV_BLEND_MODE_MULTIPLY: + vg_blend_mode = VG_LITE_BLEND_MULTIPLY; + break; + default: + VGLITE_ASSERT_MSG(false, "Unsupported blend mode."); + break; + } + } + + return vg_blend_mode; +} + +vg_lite_buffer_format_t vglite_get_buf_format(lv_color_format_t cf) +{ + vg_lite_buffer_format_t vg_buffer_format = VG_LITE_BGR565; + + switch(cf) { + case LV_COLOR_FORMAT_L8: + vg_buffer_format = VG_LITE_L8; + break; + case LV_COLOR_FORMAT_A8: + vg_buffer_format = VG_LITE_A8; + break; + case LV_COLOR_FORMAT_I1: + vg_buffer_format = VG_LITE_INDEX_1; + break; + case LV_COLOR_FORMAT_I2: + vg_buffer_format = VG_LITE_INDEX_2; + break; + case LV_COLOR_FORMAT_I4: + vg_buffer_format = VG_LITE_INDEX_4; + break; + case LV_COLOR_FORMAT_I8: + vg_buffer_format = VG_LITE_INDEX_8; + break; + case LV_COLOR_FORMAT_RGB565: + vg_buffer_format = VG_LITE_BGR565; + break; + case LV_COLOR_FORMAT_RGB565A8: + vg_buffer_format = VG_LITE_ABGR8565; + break; + case LV_COLOR_FORMAT_RGB888: + vg_buffer_format = VG_LITE_BGR888; + break; + case LV_COLOR_FORMAT_ARGB8888: + vg_buffer_format = VG_LITE_BGRA8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + vg_buffer_format = VG_LITE_BGRX8888; + break; + + default: + VGLITE_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return vg_buffer_format; +} + +uint8_t vglite_get_alignment(lv_color_format_t cf) +{ + uint8_t align_bytes = LV_COLOR_DEPTH / 8 * 16; /*16 pixels*/ + + switch(cf) { + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + /* + * VGLite alignment require 8 bytes. + * But ARM clean and invalidate cache needs 32 bytes address alignment. + */ + align_bytes = 32; + break; + case LV_COLOR_FORMAT_I8: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + /* + * VGLite alignment require 16 bytes. + * But ARM clean and invalidate cache needs 32 bytes address alignment. + */ + align_bytes = 32; + break; + case LV_COLOR_FORMAT_RGB565: + align_bytes = 32; + break; + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_RGB888: + align_bytes = 48; + break; + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + align_bytes = 64; + break; + + default: + VGLITE_ASSERT_MSG(false, "Unsupported buffer format."); + break; + } + + return align_bytes; +} + +bool vglite_buf_aligned(const void * buf, uint32_t stride, lv_color_format_t cf) +{ + uint8_t align_bytes = vglite_get_alignment(cf); + + /* No alignment requirement for destination buffer when using mode VG_LITE_LINEAR */ + + /* Test for pointer alignment */ + if((uintptr_t)buf % align_bytes) + return false; + + /* Test for stride alignment */ + if(stride == 0 || stride % align_bytes) + return false; + + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VGLITE*/ diff --git a/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h new file mode 100644 index 0000000..8142762 --- /dev/null +++ b/libraries/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h @@ -0,0 +1,171 @@ +/** + * @file lv_vglite_utils.h + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_VGLITE_UTILS_H +#define LV_VGLITE_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_VGLITE +#include "../../sw/lv_draw_sw.h" + +#include "vg_lite.h" +#include "vg_lite_options.h" + +/********************* + * DEFINES + *********************/ + +#define ENUM_TO_STRING(e) \ + case (e): \ + return #e + +#if LV_USE_VGLITE_ASSERT +#define VGLITE_ASSERT(expr) LV_ASSERT(expr) +#else +#define VGLITE_ASSERT(expr) +#endif + +#define VGLITE_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR(msg); \ + VGLITE_ASSERT(false); \ + } \ + } while(0) + +#define VGLITE_CHECK_ERROR(function) \ + do { \ + vg_lite_error_t error = function; \ + if(error != VG_LITE_SUCCESS) { \ + LV_LOG_ERROR("Execute '" #function "' error(%d): %s", \ + (int)error, vglite_error_to_string(error)); \ + VGLITE_ASSERT(false); \ + } \ + } while (0) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Set the clipping box. + * + * @param[in] clip_area Clip area with relative coordinates of destination buffer + * + */ +static inline void vglite_set_scissor(const lv_area_t * clip_area); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +const char * vglite_error_to_string(vg_lite_error_t error); + +#if LV_USE_VGLITE_DRAW_ASYNC +/** + * Get VG-Lite command buffer flushed status. + * + */ +bool vglite_cmd_buf_is_flushed(void); +#endif + +/** + * Flush command to VG-Lite. + * + */ +void vglite_run(void); + +/** + * Get vglite color. Premultiplies (if not hw already) and swizzles the given + * LVGL 32bit color to obtain vglite color. + * + * @param[in] lv_col32 The initial LVGL 32bit color + * @param[in] gradient True for gradient color + * + * @retval The vglite 32-bit color value: + * + */ +vg_lite_color_t vglite_get_color(lv_color32_t lv_col32, bool gradient); + +/** + * Get vglite blend mode. + * + * @param[in] lv_blend_mode The LVGL blend mode + * + * @retval The vglite blend mode + * + */ +vg_lite_blend_t vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode); + +/** + * Get vglite buffer format. + * + * @param[in] cf Color format + * + * @retval The vglite buffer format + * + */ +vg_lite_buffer_format_t vglite_get_buf_format(lv_color_format_t cf); + +/** + * Get vglite buffer alignment. + * + * @param[in] cf Color format + * + * @retval Alignment requirement in bytes + * + */ +uint8_t vglite_get_alignment(lv_color_format_t cf); + +/** + * Check memory and stride alignment. + * + * @param[in] buf Buffer address + * @param[in] stride Stride of buffer in bytes + * @param[in] cf Color format - to calculate the expected alignment + * + * @retval true Alignment OK + * + */ +bool vglite_buf_aligned(const void * buf, uint32_t stride, lv_color_format_t cf); + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void vglite_set_scissor(const lv_area_t * clip_area) +{ + vg_lite_set_scissor(clip_area->x1, clip_area->y1, clip_area->x2 + 1, clip_area->y2 + 1); +} + +#endif /*LV_USE_DRAW_VGLITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_UTILS_H*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c new file mode 100644 index 0000000..1d5a796 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c @@ -0,0 +1,635 @@ +/** + * @file lv_draw_dave2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_DAVE2D 4 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_OS + static void _dave2d_render_thread_cb(void * ptr); +#endif + +static void execute_drawing(lv_draw_dave2d_unit_t * u); + +#if defined(RENESAS_CORTEX_M85) + #if (BSP_CFG_DCACHE_ENABLED) + static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + #endif +#endif + +static int32_t _dave2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static d2_s32 lv_dave2d_init(void); + +static void lv_draw_buf_dave2d_init_handlers(void); + +void dave2d_execute_dlist_and_flush(void); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +d2_device * _d2_handle; +d2_renderbuffer * _renderbuffer; +d2_renderbuffer * _blit_renderbuffer; + +lv_ll_t _ll_Dave2D_Tasks; + +#if LV_USE_OS + lv_mutex_t xd2Semaphore; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dave2d_init(void) +{ + d2_s32 result = D2_OK; + + lv_draw_buf_dave2d_init_handlers(); + + lv_draw_dave2d_unit_t * draw_dave2d_unit = lv_draw_create_unit(sizeof(lv_draw_dave2d_unit_t)); + draw_dave2d_unit->base_unit.dispatch_cb = lv_draw_dave2d_dispatch; + draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate; + draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D; + + result = lv_dave2d_init(); + if(D2_OK != result) { + __BKPT(0); + } + +#if LV_USE_OS + lv_result_t res; + res = lv_mutex_init(&xd2Semaphore); + if(LV_RESULT_OK != res) { + __BKPT(0); + } + + draw_dave2d_unit->pd2Mutex = &xd2Semaphore; +#endif + + draw_dave2d_unit->d2_handle = _d2_handle; + draw_dave2d_unit->renderbuffer = _renderbuffer; + _lv_ll_init(&_ll_Dave2D_Tasks, 4); + +#if LV_USE_OS + lv_thread_init(&draw_dave2d_unit->thread, LV_THREAD_PRIO_HIGH, _dave2d_render_thread_cb, 8 * 1024, draw_dave2d_unit); +#endif + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_draw_buf_dave2d_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + +#if defined(RENESAS_CORTEX_M85) +#if (BSP_CFG_DCACHE_ENABLED) + handlers->invalidate_cache_cb = _dave2d_buf_invalidate_cache_cb; +#endif +#endif +} + +#if defined(RENESAS_CORTEX_M85) +#if (BSP_CFG_DCACHE_ENABLED) +static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + + uint8_t * address = draw_buf->data; + int32_t i = 0; + uint32_t bytes_per_pixel = lv_color_format_get_size(cf); + int32_t width = lv_area_get_width(area); + int32_t lines = lv_area_get_height(area); + int32_t bytes_to_flush_per_line = (int32_t)width * (int32_t)bytes_per_pixel; + + /* Stride is in bytes, not pixels */ + address = address + (area->x1 * (int32_t)bytes_per_pixel) + (stride * (uint32_t)area->y1); + + for(i = 0; i < lines; i++) { + SCB_CleanInvalidateDCache_by_Addr(address, bytes_to_flush_per_line); + address += stride; + } +} +#endif +#endif + +/** + * @todo + * LVGL needs to use hardware acceleration for buf_copy and do not affect GPU rendering. + */ +#if 0 +static void _dave2d_buf_copy(void * dest_buf, uint32_t dest_w, uint32_t dest_h, const lv_area_t * dest_area, + void * src_buf, uint32_t src_w, uint32_t src_h, const lv_area_t * src_area, lv_color_format_t color_format) +{ + d2_s32 result; + +#if LV_USE_OS + lv_result_t status; + + status = lv_mutex_lock(&xd2Semaphore); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + d2_u32 src_blend_mode = d2_getblendmodesrc(_d2_handle); + d2_u32 dst_blend_mode = d2_getblendmodedst(_d2_handle); + + result = d2_selectrenderbuffer(_d2_handle, _blit_renderbuffer); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero); + if(D2_OK != result) { + __BKPT(0); + } + + // Generate render operations + result = d2_framebuffer(_d2_handle, (uint16_t *)dest_buf, DISPLAY_HSIZE_INPUT0, DISPLAY_BUFFER_STRIDE_PIXELS_INPUT0, + DISPLAY_VSIZE_INPUT0, lv_draw_dave2d_cf_fb_get()); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_cliprect(_d2_handle, (d2_border)dest_area->x1, (d2_border)dest_area->y1, (d2_border)dest_area->x2, + (d2_border)dest_area->y2); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_setblitsrc(_d2_handle, (void *) src_buf, (d2_s32)src_w, (d2_s32)src_w, (d2_s32)src_h, + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(color_format)); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_blitcopy(_d2_handle, (d2_s32)src_w, (d2_s32)src_h, (d2_blitpos)src_area->x1, (d2_blitpos)src_area->y1, + D2_FIX4(dest_w), D2_FIX4(dest_h), + D2_FIX4(dest_area->x1), D2_FIX4(dest_area->y1), 0); + if(D2_OK != result) { + __BKPT(0); + } + + // Execute render operations + result = d2_executerenderbuffer(_d2_handle, _blit_renderbuffer, 0); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_flushframe(_d2_handle); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_setblendmode(_d2_handle, src_blend_mode, dst_blend_mode); + if(D2_OK != result) { + __BKPT(0); + } + +#if LV_USE_OS + status = lv_mutex_unlock(&xd2Semaphore); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +} +#endif + +#define USE_D2 (1) + +static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + int32_t ret = 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { +#if USE_D2 + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + if(dsc->grad.dir == LV_GRAD_DIR_NONE + || ((dsc->grad.dir != LV_GRAD_DIR_NONE) + && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) + && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) + && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { + + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; + + } + else +#endif + { + __NOP(); + } + ret = 0; + break; + } + case LV_DRAW_TASK_TYPE_LAYER: { + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_IMAGE: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_BORDER: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_BOX_SHADOW: { + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_LABEL: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_LINE: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_ARC: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_TRIANGLE: { +#if USE_D2 + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + if(dsc->grad.dir == LV_GRAD_DIR_NONE + || ((dsc->grad.dir != LV_GRAD_DIR_NONE) + && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) + && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) + && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; + } + else { + } +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: { +#if 0//USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_MASK_BITMAP: { + ret = 0; + break; + } + + default: + ret = 0; + break; + } + + return ret; +} + +#define DAVE2D_REFERRING_WATERMARK 10 + +static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_dave2d_unit_t * draw_dave2d_unit = (lv_draw_dave2d_unit_t *) draw_unit; +#if (0 == D2_RENDER_EACH_OPERATION) + static uint32_t ref_count = 0; +#endif + + /*Return immediately if it's busy with draw task*/ + if(draw_dave2d_unit->task_act) return 0; + + lv_draw_task_t * t = NULL; + t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_DAVE2D); + + /* Return 0 is no selection, some tasks can be supported by other units. */ + if(t == NULL) { +#if (0 == D2_RENDER_EACH_OPERATION) + if(false == _lv_ll_is_empty(&_ll_Dave2D_Tasks)) { + ref_count = 0; + dave2d_execute_dlist_and_flush(); + } +#endif + return 0; + } + + if(t->preferred_draw_unit_id != DRAW_UNIT_ID_DAVE2D) { + return 0; + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) { + return -1; + } + +#if (0 == D2_RENDER_EACH_OPERATION) + ref_count += lv_draw_get_dependent_count(t); + + if(DAVE2D_REFERRING_WATERMARK < ref_count) { + ref_count = 0; + dave2d_execute_dlist_and_flush(); + } + + lv_draw_task_t ** p_new_list_entry; + p_new_list_entry = _lv_ll_ins_tail(&_ll_Dave2D_Tasks); + *p_new_list_entry = t; +#endif + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_dave2d_unit->base_unit.target_layer = layer; + draw_dave2d_unit->base_unit.clip_area = &t->clip_area; + draw_dave2d_unit->task_act = t; + +#if LV_USE_OS + /*Let the render thread work*/ + lv_thread_sync_signal(&draw_dave2d_unit->sync); +#else + execute_drawing(draw_dave2d_unit); +#if (D2_RENDER_EACH_OPERATION) + draw_dave2d_unit->task_act->state = LV_DRAW_TASK_STATE_READY; +#endif + draw_dave2d_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + +#endif + return 1; +} + +#if LV_USE_OS +static void _dave2d_render_thread_cb(void * ptr) +{ + lv_draw_dave2d_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + + while(1) { + while(u->task_act == NULL) { + lv_thread_sync_wait(&u->sync); + } + + execute_drawing(u); + + /*Cleanup*/ +#if (D2_RENDER_EACH_OPERATION) + u->task_act->state = LV_DRAW_TASK_STATE_READY; +#endif + u->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + } +} +#endif + +static void execute_drawing(lv_draw_dave2d_unit_t * u) +{ + /*Render the draw task*/ + lv_draw_task_t * t = u->task_act; + lv_layer_t * layer = u->base_unit.target_layer; + +#if defined(RENESAS_CORTEX_M85) +#if (BSP_CFG_DCACHE_ENABLED) + lv_area_t clipped_area; + int32_t x; + int32_t y; + + _lv_area_intersect(&clipped_area, &t->area, u->base_unit.clip_area); + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&clipped_area, x, y); + + /* Invalidate cache */ + lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area); +#endif +#endif + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_dave2d_fill(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_dave2d_border(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + //lv_draw_dave2d_box_shadow(u, t->draw_dsc, &t->area); + break; +#if 0 + case LV_DRAW_TASK_TYPE_BG_IMG: + //lv_draw_dave2d_bg_image(u, t->draw_dsc, &t->area); + break; +#endif + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_dave2d_label(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_dave2d_image(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_dave2d_line(u, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_dave2d_arc(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_dave2d_triangle(u, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + //lv_draw_dave2d_layer(u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + //lv_draw_dave2d_mask_rect(u, t->draw_dsc, &t->area); + break; + default: + break; + } + +} + +static d2_s32 lv_dave2d_init(void) +{ + d2_s32 result = D2_OK; + + if(_d2_handle != NULL) { + return D2_NOMEMORY; + } + + _d2_handle = d2_opendevice(0); + if(_d2_handle == NULL) { + return D2_NOMEMORY; + } + + /* bind the hardware */ + result = d2_inithw(_d2_handle, 0); + if(result != D2_OK) { + LV_LOG_ERROR("Could NOT d2_inithw\n"); + d2_closedevice(_d2_handle); + return result; + } + + // + // Set various D2 parameters + // + result = d2_setblendmode(_d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); + result = d2_setalphamode(_d2_handle, d2_am_constant); + result = d2_setalpha(_d2_handle, UINT8_MAX); + result = d2_setantialiasing(_d2_handle, 1); + result = d2_setlinecap(_d2_handle, d2_lc_butt); + result = d2_setlinejoin(_d2_handle, d2_lj_miter); + + /* set blocksize for default displaylist */ + result = d2_setdlistblocksize(_d2_handle, 25); + if(D2_OK != result) { + LV_LOG_ERROR("Could NOT d2_setdlistblocksize\n"); + d2_closedevice(_d2_handle); + return result; + } + + _blit_renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); + if(!_blit_renderbuffer) { + LV_LOG_ERROR("NO renderbuffer\n"); + d2_closedevice(_d2_handle); + + return D2_NOMEMORY; + } + + _renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); + if(!_renderbuffer) { + LV_LOG_ERROR("NO renderbuffer\n"); + d2_closedevice(_d2_handle); + + return D2_NOMEMORY; + } + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + if(D2_OK != result) { + LV_LOG_ERROR("Could NOT d2_selectrenderbuffer\n"); + d2_closedevice(_d2_handle); + } + + return result; +} + +void dave2d_execute_dlist_and_flush(void) +{ +#if LV_USE_OS + lv_result_t status; + + status = lv_mutex_lock(&xd2Semaphore); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + d2_s32 result; + lv_draw_task_t ** p_list_entry; + lv_draw_task_t * p_list_entry1; + + // Execute render operations + result = d2_executerenderbuffer(_d2_handle, _renderbuffer, 0); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_flushframe(_d2_handle); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + if(D2_OK != result) { + __BKPT(0); + } + + while(false == _lv_ll_is_empty(&_ll_Dave2D_Tasks)) { + p_list_entry = _lv_ll_get_tail(&_ll_Dave2D_Tasks); + p_list_entry1 = *p_list_entry; + p_list_entry1->state = LV_DRAW_TASK_STATE_READY; + _lv_ll_remove(&_ll_Dave2D_Tasks, p_list_entry); + lv_free(p_list_entry); + } + +#if LV_USE_OS + status = lv_mutex_unlock(&xd2Semaphore); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h new file mode 100644 index 0000000..0058518 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h @@ -0,0 +1,91 @@ +#ifndef LV_DRAW_DAVE2D_H +#define LV_DRAW_DAVE2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" +#if LV_USE_DRAW_DAVE2D +#include "../../lv_draw.h" +#include "hal_data.h" +#include "lv_draw_dave2d_utils.h" + +/********************* + * DEFINES + *********************/ + +#define D2_RENDER_EACH_OPERATION (1) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; +#endif + uint32_t idx; + d2_device * d2_handle; + d2_renderbuffer * renderbuffer; +#if LV_USE_OS + lv_mutex_t * pd2Mutex; +#endif +} lv_draw_dave2d_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_dave2d_init(void); + +void lv_draw_dave2d_image(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_border(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_box_shadow(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_label(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_line(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_dave2d_layer(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_triangle(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_dave2d_mask_rect(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_transform(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_DAVE2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c new file mode 100644 index 0000000..c703bbe --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c @@ -0,0 +1,194 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + + uint32_t flags = 0; + int32_t sin_start; + int32_t cos_start; + int32_t sin_end; + int32_t cos_end; + d2_s32 result; + lv_area_t clipped_area; + lv_area_t buffer_area; + lv_point_t arc_centre; + int32_t x; + int32_t y; + + if(!_lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + buffer_area = u->base_unit.target_layer->buf_area; + + arc_centre = dsc->center; + arc_centre.x = arc_centre.x - buffer_area.x1; + arc_centre.y = arc_centre.y - buffer_area.y1; + + lv_area_move(&clipped_area, x, y); + lv_area_move(&buffer_area, x, y); + + // + // If both angles are equal (e.g. 0 and 0 or 180 and 180) nothing has to be done + // + if(dsc->start_angle == dsc->end_angle) { + return; // Nothing to do, no angle - no arc + } + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + + // + // Generate render operations + // + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_setalpha(u->d2_handle, dsc->opa); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + + result = d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + if(D2_OK != result) { + __BKPT(0); + } + + if(360 <= LV_ABS(dsc->start_angle - dsc->end_angle)) { + d2_rendercircle(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), + (d2_width) D2_FIX4(dsc->width)); + } + else { //An ARC, not a full circle + // + // If the difference between both is larger than 180 degrees we must use the concave flag + // + /** Set d2_wf_concave flag if the pie object to draw is concave shape. */ + if((LV_ABS(dsc->start_angle - dsc->end_angle) > 180) || ((dsc->end_angle < dsc->start_angle) && + (LV_ABS(dsc->start_angle - (dsc->end_angle + 360)) > 180))) { + flags = d2_wf_concave; + } + else { + flags = 0; + } + + sin_start = lv_trigo_sin((int16_t)dsc->start_angle); + cos_start = lv_trigo_cos((int16_t)dsc->start_angle); + + sin_end = lv_trigo_sin((int16_t)dsc->end_angle); + cos_end = lv_trigo_cos((int16_t)dsc->end_angle); + + bool draw_arc; + lv_area_t arc_area; + lv_area_t clip_arc; + lv_point_t start_point; + lv_point_t end_point; + + start_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_start) >> LV_TRIGO_SHIFT); + start_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_start) >> LV_TRIGO_SHIFT); + + end_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_end) >> LV_TRIGO_SHIFT); + end_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_end) >> LV_TRIGO_SHIFT); + + arc_area.x1 = LV_MIN3(start_point.x, end_point.x, arc_centre.x); + arc_area.y1 = LV_MIN3(start_point.y, end_point.y, arc_centre.y); + + arc_area.x2 = LV_MAX3(start_point.x, end_point.x, arc_centre.x); + arc_area.y2 = LV_MAX3(start_point.y, end_point.y, arc_centre.y); + + /* 0 degrees */ + if((dsc->end_angle < dsc->start_angle) || ((dsc->start_angle < 360) && (dsc->end_angle > 360))) { + arc_area.x2 = arc_centre.x + dsc->radius; + } + + /* 90 degrees */ + if(((dsc->end_angle > 90) && (dsc->start_angle < 90)) || ((dsc->start_angle < 90) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.y2 = arc_centre.y + dsc->radius; + } + + /* 180 degrees */ + if(((dsc->end_angle > 180) && (dsc->start_angle < 180)) || ((dsc->start_angle < 180) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.x1 = arc_centre.x - dsc->radius; + } + + /* 270 degrees */ + if(((dsc->end_angle > 270) && (dsc->start_angle < 270)) || ((dsc->start_angle < 270) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.y1 = arc_centre.y - dsc->radius; + } + + draw_arc = _lv_area_intersect(&clip_arc, &arc_area, &clipped_area); + + if(draw_arc) { + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), + (d2_width) D2_FIX4(dsc->width), + -(d2_s32)(sin_start << 1), + (d2_s32)(cos_start << 1), + (d2_s32)(sin_end << 1), + -(d2_s32)(cos_end << 1), + flags); + if(D2_OK != result) { + __BKPT(0); + } + + if(dsc->rounded) { + lv_point_t start_coord; + lv_point_t end_coord; + + start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT); + start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT); + + /** Render a circle. */ + d2_rendercircle(u->d2_handle, + (d2_point) D2_FIX4((uint16_t)(start_coord.x)), + (d2_point) D2_FIX4((uint16_t)(start_coord.y)), + (d2_width) D2_FIX4(dsc->width / 2), 0); + + end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT); + end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT); + + /** Render a circle. */ + d2_rendercircle(u->d2_handle, + (d2_point) D2_FIX4((uint16_t)(end_coord.x)), + (d2_point) D2_FIX4((uint16_t)(end_coord.y)), + (d2_width) D2_FIX4(dsc->width / 2), 0); + } + } + } + + // + // Execute render operations + // + +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c new file mode 100644 index 0000000..7076333 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c @@ -0,0 +1,433 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * outer_area, + const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); + +static void dave2d_draw_border_simple(lv_draw_dave2d_unit_t * draw_unit, const lv_area_t * outer_area, + const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa); + +void lv_draw_dave2d_border(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->side == LV_BORDER_SIDE_NONE) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); + area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); + area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); + area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); + + int32_t rin = rout - dsc->width; + if(rin < 0) rin = 0; + + if(rout == 0 && rin == 0) { + dave2d_draw_border_simple(draw_unit, coords, &area_inner, dsc->color, dsc->opa); + } + else { + dave2d_draw_border_complex(draw_unit, coords, &area_inner, rout, rin, dsc->color, dsc->opa); + } + +} + +static void dave2d_draw_border_simple(lv_draw_dave2d_unit_t * u, const lv_area_t * outer_area, + const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa) + +{ + + lv_area_t clip_area; + lv_area_t local_outer_area; + lv_area_t local_inner_area; + int32_t x; + int32_t y; + bool is_common; + + is_common = _lv_area_intersect(&clip_area, outer_area, u->base_unit.clip_area); + if(!is_common) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + local_outer_area = *outer_area; + local_inner_area = *inner_area; + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&clip_area, x, y); + lv_area_move(&local_outer_area, x, y); + lv_area_move(&local_inner_area, x, y); + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + // + // Generate render operations + // + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); + d2_setalpha(u->d2_handle, opa); + d2_cliprect(u->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, + (d2_border)clip_area.y2); + + lv_area_t a; + + bool top_side = local_outer_area.y1 <= local_inner_area.y1; + bool bottom_side = local_outer_area.y2 >= local_inner_area.y2; + bool left_side = local_outer_area.x1 <= local_inner_area.x1; + bool right_side = local_outer_area.x2 >= local_inner_area.x2; + + /*Top*/ + a.x1 = local_outer_area.x1; + a.x2 = local_outer_area.x2; + a.y1 = local_outer_area.y1; + a.y2 = local_inner_area.y1 - 1; + if(top_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Bottom*/ + a.y1 = local_inner_area.y2 + 1; + a.y2 = local_outer_area.y2; + if(bottom_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Left*/ + a.x1 = local_outer_area.x1; + a.x2 = local_inner_area.x1 - 1; + a.y1 = (top_side) ? local_inner_area.y1 : local_outer_area.y1; + a.y2 = (bottom_side) ? local_inner_area.y2 : local_outer_area.y2; + if(left_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Right*/ + a.x1 = local_inner_area.x2 + 1; + a.x2 = local_outer_area.x2; + if(right_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_t * orig_outer_area, + const lv_area_t * orig_inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) +{ +#if LV_DRAW_SW_COMPLEX + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `coords`*/ + lv_area_t draw_area; + lv_area_t outer_area; + lv_area_t inner_area; + int32_t x; + int32_t y; + d2_s32 result; + d2_u32 flags = 0; + + outer_area = *orig_outer_area; + inner_area = *orig_inner_area; + + if(!_lv_area_intersect(&draw_area, &outer_area, u->base_unit.clip_area)) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&outer_area, x, y); + lv_area_move(&inner_area, x, y); + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + // + // Generate render operations + // + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); + d2_setalpha(u->d2_handle, opa); + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + lv_area_t blend_area; + /*Calculate the x and y coordinates where the straight parts area are */ + lv_area_t core_area; + core_area.x1 = LV_MAX(outer_area.x1 + rout, inner_area.x1); + core_area.x2 = LV_MIN(outer_area.x2 - rout, inner_area.x2); + core_area.y1 = LV_MAX(outer_area.y1 + rout, inner_area.y1); + core_area.y2 = LV_MIN(outer_area.y2 - rout, inner_area.y2); + + bool top_side = outer_area.y1 <= inner_area.y1; + bool bottom_side = outer_area.y2 >= inner_area.y2; + + /*No masks*/ + bool left_side = outer_area.x1 <= inner_area.x1; + bool right_side = outer_area.x2 >= inner_area.x2; + + /*Draw the straight lines first */ + if(top_side) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = outer_area.y1; + blend_area.y2 = inner_area.y1 - 1; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(bottom_side) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = inner_area.y2 + 1; + blend_area.y2 = outer_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(left_side) { + blend_area.x1 = outer_area.x1; + blend_area.x2 = inner_area.x1 - 1; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(right_side) { + blend_area.x1 = inner_area.x2 + 1; + blend_area.x2 = outer_area.x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + /*Draw the corners*/ + int32_t blend_w; + /*Left corners*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); + + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + d2_s32 aa; + aa = d2_getantialiasing(u->d2_handle); + d2_setantialiasing(u->d2_handle, 0); //Don't blend with the background according to coverage value + + if(left_side || top_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x1 - rout; + arc_area.y1 = core_area.y1 - rout; + arc_area.x2 = core_area.x1; + arc_area.y2 = core_area.y1; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x1), + (d2_point) D2_FIX4(core_area.y1), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16(0), // 180 Degrees + (d2_s32) D2_FIX16((int16_t) -1), + (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees + (d2_s32) D2_FIX16(0), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + } + + if(left_side || bottom_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x1 - rout; + arc_area.y1 = core_area.y2; + arc_area.x2 = core_area.x1; + arc_area.y2 = core_area.y2 + rout; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x1), + (d2_point) D2_FIX4(core_area.y2), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16((int16_t) -1), //90 degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0), //180 degrees + (d2_s32) D2_FIX16(1), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + } + + /*Right corners*/ + blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ + blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); + + blend_area.x2 = draw_area.x2; + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + if(right_side || top_side) { + + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x2; + arc_area.y1 = core_area.y1 - rout; + arc_area.x2 = core_area.x2 + rout; + arc_area.y2 = core_area.y1; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x2), + (d2_point) D2_FIX4(core_area.y1), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(-1), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + } + + if(right_side || bottom_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x2; + arc_area.y1 = core_area.y2; + arc_area.x2 = core_area.x2 + rout; + arc_area.y2 = core_area.y2 + rout; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x2), + (d2_point) D2_FIX4(core_area.y2), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(1), + (d2_s32) D2_FIX16(1),// 90 degrees + (d2_s32) D2_FIX16(0), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + } + } + d2_setantialiasing(u->d2_handle, aa); //restore original setting + } + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c new file mode 100644 index 0000000..3f95991 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c @@ -0,0 +1,328 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +void lv_draw_dave2d_fill(lv_draw_dave2d_unit_t * u, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + lv_area_t draw_area; + lv_area_t coordinates; + bool is_common; + int32_t x; + int32_t y; + d2_u8 current_alpha_mode = 0; + d2_s32 result; + d2_u32 flags = 0; + + lv_point_t arc_centre; + + is_common = _lv_area_intersect(&draw_area, coords, u->base_unit.clip_area); + if(!is_common) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + lv_area_copy(&coordinates, coords); + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&coordinates, x, y); + + // + // Generate render operations + // +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + if(LV_GRAD_DIR_NONE != dsc->grad.dir) { + float a1; + float a2; + + float y1; + float y2; + + float y3; + float y0; + int16_t y0_i ; + int16_t y3_i ; + + if(LV_GRAD_DIR_VER == dsc->grad.dir) { + a1 = dsc->grad.stops[0].opa; + a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; + + y1 = (float)LV_MIN(coordinates.y1, coordinates.y2); + y2 = (float)LV_MAX(coordinates.y1, coordinates.y2); + + if(a1 < a2) { + /* TODO */ + __BKPT(0); + y0 = 0.0f;//silence the compiler warning + y3 = 0.0f; + + } + else { + y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 + y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + y0_i = (int16_t)y0; + y3_i = (int16_t)y3; + + d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(y0_i), (d2_point)D2_FIX4(0), + (d2_point)D2_FIX4((y3_i - y0_i))); + } + else if(LV_GRAD_DIR_HOR == dsc->grad.dir) { + /* TODO */ + __BKPT(0); + + float x1; + float x2; + + float x3; + float x0; + int16_t x0_i ; + int16_t x3_i ; + + a1 = dsc->grad.stops[0].opa; + a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; + + x1 = (float)LV_MIN(coordinates.x1, coordinates.x2); + x2 = (float)LV_MAX(coordinates.x1, coordinates.x2); + + if(a1 < a2) { + /* TODO */ + __BKPT(0); + x0 = 0.0f;//silence the compiler warning + x3 = 0.0f; + + } + else { + x0 = x2 - ((x2 - x1) / (a2 - a1) * (a2)); //point where alpha is 0 + x3 = x1 + ((x2 - x1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + x0_i = (int16_t)x0; + x3_i = (int16_t)x3; + + d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(x0_i), (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(x3_i - x0_i), + (d2_point)D2_FIX4((0))); + } + + current_alpha_mode = d2_getalphamode(u->d2_handle); + d2_setfillmode(u->d2_handle, d2_fm_color); + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->grad.stops[0].color)); + d2_setalphamode(u->d2_handle, d2_am_gradient1); + } + else { + d2_setfillmode(u->d2_handle, d2_fm_color); //default + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + d2_setalpha(u->d2_handle, dsc->opa); + } + + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + if(dsc->radius == 0) { + + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(coordinates.x1), + (d2_point)D2_FIX4(coordinates.y1), + (d2_point)D2_FIX4(lv_area_get_width(&coordinates)), + (d2_point)D2_FIX4(lv_area_get_height(&coordinates))); + } + else { + /*Get the real radius. Can't be larger than the half of the shortest side */ + int32_t coords_bg_w = lv_area_get_width(&coordinates); + int32_t coords_bg_h = lv_area_get_height(&coordinates); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t radius = LV_MIN(dsc->radius, short_side >> 1); + + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y1 + radius; + + if(((2 * radius) == coords_bg_w) && ((2 * radius) == coords_bg_h)) { + result = d2_rendercircle(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0)); + if(D2_OK != result) { + __BKPT(0); + } + } + else { + + lv_area_t arc_area; + lv_area_t clip_arc; + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y1 + radius; + + arc_area.x1 = coordinates.x1; + arc_area.y1 = coordinates.y1; + arc_area.x2 = coordinates.x1 + radius; + arc_area.y2 = coordinates.y1 + radius; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + // d2_renderwedge internally changes the clip rectangle, only draw it if it is in side the current clip rectangle + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16(0), // 180 Degrees + (d2_s32) D2_FIX16((int16_t) -1), + (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees + (d2_s32) D2_FIX16(0), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + arc_centre.x = coordinates.x2 - radius; + arc_centre.y = coordinates.y1 + radius; + + arc_area.x1 = coordinates.x2 - radius; + arc_area.y1 = coordinates.y1; + arc_area.x2 = coordinates.x2; + arc_area.y2 = coordinates.y1 + radius; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(-1), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + arc_centre.x = coordinates.x2 - radius; + arc_centre.y = coordinates.y2 - radius; + + arc_area.x1 = coordinates.x2 - radius; + arc_area.y1 = coordinates.y2 - radius; + arc_area.x2 = coordinates.x2; + arc_area.y2 = coordinates.y2; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(1), + (d2_s32) D2_FIX16(1),// 90 degrees + (d2_s32) D2_FIX16(0), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y2 - radius; + + arc_area.x1 = coordinates.x1; + arc_area.y1 = coordinates.y2 - radius; + arc_area.x2 = coordinates.x1 + radius; + arc_area.y2 = coordinates.y2; + + if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16((int16_t) -1), //90 degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0), //180 degrees + (d2_s32) D2_FIX16(1), + flags); + if(D2_OK != result) { + __BKPT(0); + } + } + + /* reset the clip rectangle */ + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x1 + radius), + (d2_width)D2_FIX4(coordinates.y1), + (d2_width)D2_FIX4(lv_area_get_width(&coordinates) - (2 * radius)), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates))); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x1), + (d2_width)D2_FIX4(coordinates.y1 + radius), + (d2_width)D2_FIX4(radius), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); + if(D2_OK != result) { + __BKPT(0); + } + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x2 - radius), + (d2_width)D2_FIX4(coordinates.y1 + radius), + (d2_width)D2_FIX4(radius), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); + if(D2_OK != result) { + __BKPT(0); + } + } + } + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + + if(LV_GRAD_DIR_NONE != dsc->grad.dir) { + d2_setalphamode(u->d2_handle, current_alpha_mode); + d2_setfillmode(u->d2_handle, d2_fm_color); //default + } + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c new file mode 100644 index 0000000..7c55b6d --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c @@ -0,0 +1,331 @@ +/** + * @file lv_draw_dave2d_image.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void img_draw_core(lv_draw_unit_t * u_base, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dave2d_image(lv_draw_dave2d_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + _lv_draw_image_normal_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); + } + else { + _lv_draw_image_tiled_helper((lv_draw_unit_t *)draw_unit, draw_dsc, coords, img_draw_core); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_draw_core(lv_draw_unit_t * u_base, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)u_base; + + (void)sup; //remove warning about unused parameter + + bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE ? true : false; + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + const lv_image_header_t * header = &decoded->header; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + lv_area_t buffer_area; + lv_area_t draw_area; + lv_area_t clipped_area; + int32_t x; + int32_t y; + d2_u8 a_texture_op = d2_to_one; + d2_u8 r_texture_op = d2_to_copy; + d2_u8 g_texture_op = d2_to_copy; + d2_u8 b_texture_op = d2_to_copy; + d2_u8 current_fill_mode; + d2_u32 src_blend_mode; + d2_u32 dst_blend_mode; + void * p_intermediate_buf = NULL; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + buffer_area = u->base_unit.target_layer->buf_area; + draw_area = *img_coords; + clipped_area = *clipped_img_area; + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&buffer_area, x, y); + lv_area_move(&clipped_area, x, y); + + /* Generate render operations*/ +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + + current_fill_mode = d2_getfillmode(u->d2_handle); + a_texture_op = d2_gettextureoperationa(u->d2_handle); + r_texture_op = d2_gettextureoperationr(u->d2_handle); + g_texture_op = d2_gettextureoperationg(u->d2_handle); + b_texture_op = d2_gettextureoperationb(u->d2_handle); + src_blend_mode = d2_getblendmodesrc(u->d2_handle); + dst_blend_mode = d2_getblendmodedst(u->d2_handle); + +#if defined(RENESAS_CORTEX_M85) +#if (BSP_CFG_DCACHE_ENABLED) + d1_cacheblockflush(u->d2_handle, 0, src_buf, + img_stride * header->h); //Stride is in bytes, not pixels/texels +#endif +#endif + + if(LV_COLOR_FORMAT_RGB565A8 == cf) { + + lv_point_t p1[4] = { //Points in clockwise order + {0, 0}, + {header->w - 1, 0}, + {header->w - 1, header->h - 1}, + {0, header->h - 1}, + }; + + d2_s32 dxu1 = D2_FIX16(1); + d2_s32 dxv1 = D2_FIX16(0); + d2_s32 dyu1 = D2_FIX16(0); + d2_s32 dyv1 = D2_FIX16(1); + + uint32_t size = header->h * (header->w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888)); + p_intermediate_buf = lv_malloc(size); + + d2_framebuffer(u->d2_handle, + p_intermediate_buf, + (d2_s32)header->w, + (d2_u32)header->w, + (d2_u32)header->h, + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_ARGB8888)); + + d2_cliprect(u->d2_handle, (d2_border)0, (d2_border)0, (d2_border)header->w - 1, + (d2_border)header->h - 1); + + d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); + + d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); + + d2_settexturemapping(u->d2_handle, D2_FIX4(p1[0].x), D2_FIX4(p1[0].y), D2_FIX16(0), D2_FIX16(0), dxu1, dxv1, dyu1, + dyv1); + d2_settexturemode(u->d2_handle, d2_tm_filter); + d2_setfillmode(u->d2_handle, d2_fm_texture); + + d2_settexture(u->d2_handle, (void *)src_buf, + (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_RGB565)); + + d2_setblendmode(u->d2_handle, d2_bm_one, d2_bm_zero); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p1[0].x), + (d2_point)D2_FIX4(p1[0].y), + (d2_point)D2_FIX4(p1[1].x), + (d2_point)D2_FIX4(p1[1].y), + (d2_point)D2_FIX4(p1[2].x), + (d2_point)D2_FIX4(p1[2].y), + (d2_point)D2_FIX4(p1[3].x), + (d2_point)D2_FIX4(p1[3].y), + 0); + + d2_setblendmode(u->d2_handle, d2_bm_zero, d2_bm_one); //Keep the RGB data in the intermediate buffer + + d2_setalphablendmode(u->d2_handle, d2_bm_one, d2_bm_zero); //Write SRC alpha, i.e. A8 data + + d2_settextureoperation(u->d2_handle, d2_to_copy, d2_to_copy, d2_to_copy, d2_to_copy); + + d2_settexture(u->d2_handle, (void *)(src_buf + header->h * (header->w * lv_color_format_get_size( + LV_COLOR_FORMAT_RGB565))), + (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_A8)); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p1[0].x), + (d2_point)D2_FIX4(p1[0].y), + (d2_point)D2_FIX4(p1[1].x), + (d2_point)D2_FIX4(p1[1].y), + (d2_point)D2_FIX4(p1[2].x), + (d2_point)D2_FIX4(p1[2].y), + (d2_point)D2_FIX4(p1[3].x), + (d2_point)D2_FIX4(p1[3].y), + 0); + + cf = LV_COLOR_FORMAT_ARGB8888; + src_buf = p_intermediate_buf; + img_stride = header->w * lv_color_format_get_size(cf); + + } + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); + + if(LV_COLOR_FORMAT_RGB565 == cf) { + d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); + } + else { //Formats with an alpha channel, + d2_settextureoperation(u->d2_handle, d2_to_copy, d2_to_copy, d2_to_copy, d2_to_copy); + } + + if(LV_BLEND_MODE_NORMAL == draw_dsc->blend_mode) { /**< Simply mix according to the opacity value*/ + d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); //direct linear blend + } + else if(LV_BLEND_MODE_ADDITIVE == draw_dsc->blend_mode) { /**< Add the respective color channels*/ + /* TODO */ + d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one); //Additive blending + } + else if(LV_BLEND_MODE_SUBTRACTIVE == draw_dsc->blend_mode) { /**< Subtract the foreground from the background*/ + /* TODO */ + __NOP(); + } + else { //LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ + /* TODO */ + __NOP(); + } + + lv_point_t p[4] = { //Points in clockwise order + {0, 0}, + {header->w - 1, 0}, + {header->w - 1, header->h - 1}, + {0, header->h - 1}, + }; + + d2_settexture(u->d2_handle, (void *)src_buf, + (d2_s32)(img_stride / lv_color_format_get_size(cf)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(cf)); + + d2_settexturemode(u->d2_handle, d2_tm_filter); + d2_setfillmode(u->d2_handle, d2_fm_texture); + + d2_s32 dxu = D2_FIX16(1); + d2_s32 dxv = D2_FIX16(0); + d2_s32 dyu = D2_FIX16(0); + d2_s32 dyv = D2_FIX16(1); + + if(transformed) { + lv_point_transform(&p[0], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[1], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[2], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[3], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + + int32_t angle_limited = draw_dsc->rotation; + if(angle_limited > 3600) angle_limited -= 3600; + if(angle_limited < 0) angle_limited += 3600; + + int32_t angle_low = angle_limited / 10; + + if(0 != angle_low) { + /* LV_TRIGO_SHIFT is 15, so only need to shift by 1 to get 16:16 fixed point */ + dxv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low)); + dxu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low)); + dyv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low + 90)); + dyu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low + 90)); + } + + if(LV_SCALE_NONE != draw_dsc->scale_x) { + dxu = (dxu * LV_SCALE_NONE) / draw_dsc->scale_x; + dxv = (dxv * LV_SCALE_NONE) / draw_dsc->scale_x; + } + if(LV_SCALE_NONE != draw_dsc->scale_y) { + dyu = (dyu * LV_SCALE_NONE) / draw_dsc->scale_y; + dyv = (dyv * LV_SCALE_NONE) / draw_dsc->scale_y; + } + } + + p[0].x += draw_area.x1; + p[0].y += draw_area.y1; + p[1].x += draw_area.x1; + p[1].y += draw_area.y1; + p[2].x += draw_area.x1; + p[2].y += draw_area.y1; + p[3].x += draw_area.x1; + p[3].y += draw_area.y1; + + d2_settexturemapping(u->d2_handle, D2_FIX4(p[0].x), D2_FIX4(p[0].y), D2_FIX16(0), D2_FIX16(0), dxu, dxv, dyu, dyv); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p[0].x), + (d2_point)D2_FIX4(p[0].y), + (d2_point)D2_FIX4(p[1].x), + (d2_point)D2_FIX4(p[1].y), + (d2_point)D2_FIX4(p[2].x), + (d2_point)D2_FIX4(p[2].y), + (d2_point)D2_FIX4(p[3].x), + (d2_point)D2_FIX4(p[3].y), + 0); + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + + d2_setfillmode(u->d2_handle, current_fill_mode); + d2_settextureoperation(u->d2_handle, a_texture_op, r_texture_op, g_texture_op, b_texture_op); + d2_setblendmode(u->d2_handle, src_blend_mode, dst_blend_mode); + + if(NULL != p_intermediate_buf) { + lv_free(p_intermediate_buf); + } + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +} + +#endif //LV_USE_DRAW_DAVE2D diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c new file mode 100644 index 0000000..b36b2cf --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c @@ -0,0 +1,164 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static lv_draw_dave2d_unit_t * unit = NULL; + +void lv_draw_dave2d_label(lv_draw_dave2d_unit_t * u, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + unit = u; + + lv_draw_label_iterate_characters(&u->base_unit, dsc, coords, lv_draw_dave2d_draw_letter_cb); + +} + +static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + + d2_u8 current_fillmode; + lv_area_t clip_area; + lv_area_t letter_coords; + + int32_t x; + int32_t y; + + letter_coords = *glyph_draw_dsc->letter_coords; + + bool is_common; + is_common = _lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, u->clip_area); + if(!is_common) return; + + x = 0 - unit->base_unit.target_layer->buf_area.x1; + y = 0 - unit->base_unit.target_layer->buf_area.y1; + + lv_area_move(&clip_area, x, y); + lv_area_move(&letter_coords, x, y); + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(unit->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(unit->d2_handle, unit->renderbuffer); +#endif + + // + // Generate render operations + // + + d2_framebuffer_from_layer(unit->d2_handle, unit->base_unit.target_layer); + + current_fillmode = d2_getfillmode(unit->d2_handle); + + d2_cliprect(unit->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, + (d2_border)clip_area.y2); + + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_NONE: { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords); + lv_draw_dave2d_border(unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + break; + case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: { + lv_area_t mask_area = letter_coords; + mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; + // lv_draw_sw_blend_dsc_t blend_dsc; + // lv_memzero(&blend_dsc, sizeof(blend_dsc)); + // blend_dsc.color = glyph_draw_dsc->color; + // blend_dsc.opa = glyph_draw_dsc->opa; + // blend_dsc.mask_buf = glyph_draw_dsc->glyph_data; + // blend_dsc.mask_area = &mask_area; + // blend_dsc.blend_area = glyph_draw_dsc->letter_coords; + // blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + //lv_draw_sw_blend(u, &blend_dsc); + + lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + +#if defined(RENESAS_CORTEX_M85) +#if (BSP_CFG_DCACHE_ENABLED) + d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size); +#endif +#endif + d2_settexture(unit->d2_handle, (void *)draw_buf->data, + (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8), + lv_area_get_width(&letter_coords), lv_area_get_height(&letter_coords), d2_mode_alpha8); + d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0); + d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0); + d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0); + d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0); + + d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply); + + d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0), + D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1)); + + d2_settexturemode(unit->d2_handle, d2_tm_filter); + + d2_setfillmode(unit->d2_handle, d2_fm_texture); + + d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1), + (d2_point)D2_FIX4(letter_coords.y1), + (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)), + (d2_point)D2_FIX4(lv_area_get_height(&letter_coords))); + + d2_setfillmode(unit->d2_handle, current_fillmode); + } + break; + case LV_FONT_GLYPH_FORMAT_IMAGE: { +#if LV_USE_IMGFONT + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.rotation = 0; + img_dsc.scale_x = LV_SCALE_NONE; + img_dsc.scale_y = LV_SCALE_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + //lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + break; + default: + break; + } + } + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(unit->d2_handle, unit->renderbuffer, 0); + d2_flushframe(unit->d2_handle); +#endif + + if(fill_draw_dsc && fill_area) { + //lv_draw_sw_fill(u, fill_draw_dsc, fill_area); + lv_draw_dave2d_fill(unit, fill_draw_dsc, fill_area); + } + +#if LV_USE_OS + status = lv_mutex_unlock(unit->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c new file mode 100644 index 0000000..b23aa8b --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c @@ -0,0 +1,97 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +void lv_draw_dave2d_line(lv_draw_dave2d_unit_t * u, const lv_draw_line_dsc_t * dsc) +{ + + lv_area_t clip_line; + d2_u32 mode; + d2_s32 result; + lv_area_t buffer_area; + uint32_t res; + lv_value_precise_t p1_x; + lv_value_precise_t p1_y; + lv_value_precise_t p2_x; + lv_value_precise_t p2_y; + int32_t x; + int32_t y; + + clip_line.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_line.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_line.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_line.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + bool is_common; + is_common = _lv_area_intersect(&clip_line, &clip_line, u->base_unit.clip_area); + if(!is_common) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + buffer_area = u->base_unit.target_layer->buf_area; + p1_x = dsc->p1.x - buffer_area.x1; + p1_y = dsc->p1.y - buffer_area.y1; + p2_x = dsc->p2.x - buffer_area.x1; + p2_y = dsc->p2.y - buffer_area.y1; + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&clip_line, x, y); + lv_area_move(&buffer_area, x, y); + + bool dashed = dsc->dash_gap && dsc->dash_width; + + if(dashed) { + /* TODO */ + __BKPT(0); + } + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + // + // Generate render operations + // + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + + d2_setalpha(u->d2_handle, dsc->opa); + + d2_cliprect(u->d2_handle, clip_line.x1, clip_line.y1, clip_line.x2, clip_line.y2); + + if((dsc->round_end == 1) || (dsc->round_start == 1)) { + mode = d2_lc_round; + } + else { + mode = d2_lc_butt; // lines end directly at endpoints + } + + d2_setlinecap(u->d2_handle, mode); + + d2_renderline(u->d2_handle, D2_FIX4(p1_x), D2_FIX4(p1_y), D2_FIX4(p2_x), + D2_FIX4(p2_y), D2_FIX4(dsc->width), d2_le_exclude_none); + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c new file mode 100644 index 0000000..928da56 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c @@ -0,0 +1,59 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +void lv_draw_dave2d_mask_rect(lv_draw_dave2d_unit_t * u, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) +{ + lv_area_t clipped_area; + lv_area_t coordinates; + int32_t x; + int32_t y; + + if(!_lv_area_intersect(&clipped_area, coords, u->base_unit.clip_area)) return; + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + coordinates = *coords; + + lv_area_move(&clipped_area, x, y); + lv_area_move(&coordinates, x, y); + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + +#ifdef D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_renderbox(u->d2_handle, + (d2_point) D2_FIX4(coordinates.x1), + (d2_point) D2_FIX4(coordinates.y1), + (d2_width) D2_FIX4(lv_area_get_width(&coordinates)), + (d2_width) D2_FIX4(lv_area_get_height(&coordinates))); + + // + // Execute render operations + // +#ifdef D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif +} +#endif //LV_USE_DRAW_DAVE2D diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c new file mode 100644 index 0000000..ad21b9c --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c @@ -0,0 +1,179 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +void lv_draw_dave2d_triangle(lv_draw_dave2d_unit_t * u, const lv_draw_triangle_dsc_t * dsc) +{ + lv_area_t clipped_area; + d2_u32 flags = 0; + d2_u8 current_alpha_mode = 0; + int32_t x; + int32_t y; + + lv_area_t tri_area; + tri_area.x1 = LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + if(!_lv_area_intersect(&clipped_area, &tri_area, u->base_unit.clip_area)) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } +#endif + + x = 0 - u->base_unit.target_layer->buf_area.x1; + y = 0 - u->base_unit.target_layer->buf_area.y1; + + lv_area_move(&clipped_area, x, y); + +#if D2_RENDER_EACH_OPERATION + d2_selectrenderbuffer(u->d2_handle, u->renderbuffer); +#endif + + lv_point_precise_t p[3]; + p[0] = dsc->p[0]; + p[1] = dsc->p[1]; + p[2] = dsc->p[2]; + + /*Order the points like this: + * [0]: top + * [1]: right bottom + * [2]: left bottom */ + + if(dsc->p[0].y <= dsc->p[1].y && dsc->p[0].y <= dsc->p[2].y) { + p[0] = dsc->p[0]; + if(dsc->p[1].x < dsc->p[2].x) { + p[2] = dsc->p[1]; + p[1] = dsc->p[2]; + } + else { + p[2] = dsc->p[2]; + p[1] = dsc->p[1]; + } + } + else if(dsc->p[1].y <= dsc->p[0].y && dsc->p[1].y <= dsc->p[2].y) { + p[0] = dsc->p[1]; + if(dsc->p[0].x < dsc->p[2].x) { + p[2] = dsc->p[0]; + p[1] = dsc->p[2]; + } + else { + p[2] = dsc->p[2]; + p[1] = dsc->p[0]; + } + } + else { + p[0] = dsc->p[2]; + if(dsc->p[0].x < dsc->p[1].x) { + p[2] = dsc->p[0]; + p[1] = dsc->p[1]; + } + else { + p[2] = dsc->p[1]; + p[1] = dsc->p[0]; + } + } + + p[0].x -= u->base_unit.target_layer->buf_area.x1; + p[1].x -= u->base_unit.target_layer->buf_area.x1; + p[2].x -= u->base_unit.target_layer->buf_area.x1; + + p[0].y -= u->base_unit.target_layer->buf_area.y1; + p[1].y -= u->base_unit.target_layer->buf_area.y1; + p[2].y -= u->base_unit.target_layer->buf_area.y1; + + p[1].y -= 1; + p[2].y -= 1; + + current_alpha_mode = d2_getalphamode(u->d2_handle); + + if(LV_GRAD_DIR_NONE != dsc->bg_grad.dir) { + float a1; + float a2; + + float y1; + float y2; + + float y3; + float y0; + int32_t y0_i ; + int32_t y3_i ; + + if(LV_GRAD_DIR_VER == dsc->bg_grad.dir) { + a1 = dsc->bg_grad.stops[0].opa; + a2 = dsc->bg_grad.stops[dsc->bg_grad.stops_count - 1].opa; + + y1 = LV_MIN3(p[0].y, p[1].y, p[2].y); + y2 = LV_MAX3(p[0].y, p[1].y, p[2].y); + + if(a1 < a2) { + /* TODO */ + __BKPT(0); + y0 = 0.0f;//silence the compiler warning + y3 = 0.0f; + + } + else { + y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 + y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + y0_i = (int16_t)y0; + y3_i = (int16_t)y3; + + d2_setalphagradient(u->d2_handle, 0, D2_FIX4(0), D2_FIX4(y0_i), D2_FIX4(0), D2_FIX4((y3_i - y0_i))); + } + else if(LV_GRAD_DIR_HOR == dsc->bg_grad.dir) { + /* TODO */ + __BKPT(0); + } + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->bg_grad.stops[0].color)); + d2_setalphamode(u->d2_handle, d2_am_gradient1); + } + else { + d2_setalpha(u->d2_handle, dsc->bg_opa); + d2_setalphamode(u->d2_handle, d2_am_constant); + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->bg_color)); + + } + + d2_framebuffer_from_layer(u->d2_handle, u->base_unit.target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_rendertri(u->d2_handle, + (d2_point) D2_FIX4(p[0].x), + (d2_point) D2_FIX4(p[0].y), + (d2_point) D2_FIX4(p[1].x), + (d2_point) D2_FIX4(p[1].y), + (d2_point) D2_FIX4(p[2].x), + (d2_point) D2_FIX4(p[2].y), + flags); + + // + // Execute render operations + // +#if D2_RENDER_EACH_OPERATION + d2_executerenderbuffer(u->d2_handle, u->renderbuffer, 0); + d2_flushframe(u->d2_handle); +#endif + + d2_setalphamode(u->d2_handle, current_alpha_mode); + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + if(LV_RESULT_OK != status) { + __BKPT(0); + } + +#endif + +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c new file mode 100644 index 0000000..c62a194 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c @@ -0,0 +1,140 @@ +/** + * @file lv_draw_dave2d_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" + +#if LV_USE_DRAW_DAVE2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color) +{ + uint8_t alpha, red, green, blue; + + alpha = 0x00; + red = color.red ; + green = color.green ; + blue = color.blue; + /*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ + switch(LV_COLOR_DEPTH) { + case(8): + __BKPT(0); + break; + case(16): + break; + case(24): + break; + case(32): + break; + + default: + break; + } + + return (alpha) << 24UL + | (red) << 16UL + | (green) << 8UL + | (blue) << 0UL; +} + +d2_s32 lv_draw_dave2d_cf_fb_get(void) +{ + d2_s32 d2_fb_mode = 0; + switch(g_display0_cfg.input->format) { + case DISPLAY_IN_FORMAT_16BITS_RGB565: ///< RGB565, 16 bits + d2_fb_mode = d2_mode_rgb565; + break; + case DISPLAY_IN_FORMAT_32BITS_ARGB8888: ///< ARGB8888, 32 bits + d2_fb_mode = d2_mode_argb8888; + break; + case DISPLAY_IN_FORMAT_32BITS_RGB888: ///< RGB888, 32 bits + d2_fb_mode = d2_mode_rgb888; + break; + case DISPLAY_IN_FORMAT_16BITS_ARGB4444: ///< ARGB4444, 16 bits + d2_fb_mode = d2_mode_argb4444; + break; + case DISPLAY_IN_FORMAT_16BITS_ARGB1555: ///< ARGB1555, 16 bits + case DISPLAY_IN_FORMAT_CLUT8 : ///< CLUT8 + case DISPLAY_IN_FORMAT_CLUT4 : ///< CLUT4 + case DISPLAY_IN_FORMAT_CLUT1 : ///< CLUT1 + //Not supported as a FB format by Dave2D + break; + + default: + break; + } + + return d2_fb_mode; +} + +d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format) +{ + d2_u32 d2_lvgl_mode = 0; + + switch(colour_format) { + case(LV_COLOR_FORMAT_A8): + d2_lvgl_mode = d2_mode_alpha8; //? + break; + case(LV_COLOR_FORMAT_RGB565): + d2_lvgl_mode = d2_mode_rgb565; + break; + case(LV_COLOR_FORMAT_RGB888): + d2_lvgl_mode = d2_mode_argb8888; //? + break; + case(LV_COLOR_FORMAT_ARGB8888): + d2_lvgl_mode = d2_mode_argb8888; + break; + + default: + __BKPT(0); + break; + + } + return d2_lvgl_mode; +} + +void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer) +{ + lv_draw_buf_t * draw_buf = layer->draw_buf; + lv_area_t buffer_area = layer->buf_area; + lv_area_move(&buffer_area, -layer->buf_area.x1, -layer->buf_area.y1); + + d2_framebuffer(handle, draw_buf->data, + (d2_s32) draw_buf->header.stride / lv_color_format_get_size(layer->color_format), + (d2_u32)lv_area_get_width(&buffer_area), + (d2_u32)lv_area_get_height(&buffer_area), + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(layer->color_format)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h new file mode 100644 index 0000000..67c5102 --- /dev/null +++ b/libraries/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_dave2d_utils.h + * + */ + +#ifndef LV_DRAW_DAVE2D_UTILS_H +#define LV_DRAW_DAVE2D_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color); + +d2_s32 lv_draw_dave2d_cf_fb_get(void); + +d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format); + +void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_DAVE2D_UTILS_H*/ diff --git a/libraries/lvgl/src/draw/sdl/lv_draw_sdl.c b/libraries/lvgl/src/draw/sdl/lv_draw_sdl.c new file mode 100644 index 0000000..cbb555d --- /dev/null +++ b/libraries/lvgl/src/draw/sdl/lv_draw_sdl.c @@ -0,0 +1,400 @@ +/** + * @file lv_draw_sdl.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#if LV_USE_DRAW_SDL +#include LV_SDL_INCLUDE_PATH +#include + +#include "lv_draw_sdl.h" +#include "../../core/lv_refr.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../drivers/sdl/lv_sdl_window.h" + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_SDL 100 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_dsc_base_t * draw_dsc; + int32_t w; + int32_t h; + SDL_Texture * texture; +} cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void execute_drawing(lv_draw_sdl_unit_t * u); + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ +static uint8_t sdl_render_buf[2048 * 1024 * 4]; + +/********************** + * STATIC VARIABLES + **********************/ +static SDL_Texture * layer_get_texture(lv_layer_t * layer); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +static bool sdl_texture_cache_create_cb(cache_data_t * cached_data, void * user_data) +{ + return draw_to_texture((lv_draw_sdl_unit_t *)user_data, cached_data); +} + +static void sdl_texture_cache_free_cb(cache_data_t * cached_data, void * user_data) +{ + LV_UNUSED(user_data); + + lv_free(cached_data->draw_dsc); + SDL_DestroyTexture(cached_data->texture); + cached_data->draw_dsc = NULL; + cached_data->texture = NULL; +} + +static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * lhs, const cache_data_t * rhs) +{ + if(lhs == rhs) return 0; + + if(lhs->w != rhs->w) { + return lhs->w > rhs->w ? 1 : -1; + } + if(lhs->h != rhs->h) { + return lhs->h > rhs->h ? 1 : -1; + } + + uint32_t lhs_dsc_size = lhs->draw_dsc->dsc_size; + uint32_t rhs_dsc_size = rhs->draw_dsc->dsc_size; + + if(lhs_dsc_size != rhs_dsc_size) { + return lhs_dsc_size > rhs_dsc_size ? 1 : -1; + } + + int cmp_res = memcmp(lhs->draw_dsc, rhs->draw_dsc, lhs->draw_dsc->dsc_size); + + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +void lv_draw_sdl_init(void) +{ + lv_draw_sdl_unit_t * draw_sdl_unit = lv_draw_create_unit(sizeof(lv_draw_sdl_unit_t)); + draw_sdl_unit->base_unit.dispatch_cb = dispatch; + draw_sdl_unit->base_unit.evaluate_cb = evaluate; + draw_sdl_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, + sizeof(cache_data_t), 128, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)sdl_texture_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)sdl_texture_cache_free_cb, + }); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_sdl_unit_t * draw_sdl_unit = (lv_draw_sdl_unit_t *) draw_unit; + + /*Return immediately if it's busy with a draw task*/ + if(draw_sdl_unit->task_act) return 0; + + lv_draw_task_t * t = NULL; + t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_SDL); + if(t == NULL) return -1; + + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + SDL_Texture * texture = layer_get_texture(layer); + if(layer != disp->layer_head && texture == NULL) { + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) return -1; + + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + layer->user_data = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_TARGET, w, h); + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_sdl_unit->base_unit.target_layer = layer; + draw_sdl_unit->base_unit.clip_area = &t->clip_area; + draw_sdl_unit->task_act = t; + + execute_drawing(draw_sdl_unit); + + draw_sdl_unit->task_act->state = LV_DRAW_TASK_STATE_READY; + draw_sdl_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + return 1; +} + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + if(((lv_draw_dsc_base_t *)task->draw_dsc)->user_data == NULL) { + task->preference_score = 0; + task->preferred_draw_unit_id = DRAW_UNIT_ID_SDL; + } + return 0; +} + +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) +{ + lv_draw_task_t * task = u->task_act; + + lv_layer_t dest_layer; + lv_memzero(&dest_layer, sizeof(dest_layer)); + lv_draw_buf_t draw_buf; + dest_layer.draw_buf = &draw_buf; + lv_draw_buf_init(dest_layer.draw_buf, lv_area_get_width(&task->area), lv_area_get_height(&task->area), + LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, sdl_render_buf, sizeof(sdl_render_buf)); + dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; + dest_layer.buf_area = task->area; + dest_layer._clip_area = task->area; + lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100); + + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + + SDL_Texture * texture = NULL; + switch(task->type) { + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * fill_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_color = fill_dsc->color; + rect_dsc.bg_grad = fill_dsc->grad; + rect_dsc.radius = fill_dsc->radius; + rect_dsc.bg_opa = fill_dsc->opa; + + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_BORDER: { + lv_draw_border_dsc_t * border_dsc = task->draw_dsc;; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_opa = LV_OPA_TRANSP; + rect_dsc.radius = border_dsc->radius; + rect_dsc.border_color = border_dsc->color; + rect_dsc.border_opa = border_dsc->opa; + rect_dsc.border_side = border_dsc->side; + rect_dsc.border_width = border_dsc->width; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } + case LV_DRAW_TASK_TYPE_LABEL: { + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_memcpy(&label_dsc, task->draw_dsc, sizeof(label_dsc)); + label_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_label(&dest_layer, &label_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * image_dsc = task->draw_dsc; + const char * path = image_dsc->src; + SDL_Surface * surface = IMG_Load(&path[2]); + if(surface == NULL) { + fprintf(stderr, "could not load image: %s\n", IMG_GetError()); + return false; + } + + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + texture = SDL_CreateTextureFromSurface(renderer, surface); + break; + } + default: + return false; + } + + while(dest_layer.draw_task_head) { + lv_draw_dispatch_layer(disp, &dest_layer); + if(dest_layer.draw_task_head) { + lv_draw_dispatch_wait_for_request(); + } + } + + SDL_Rect rect; + rect.x = dest_layer.buf_area.x1; + rect.y = dest_layer.buf_area.y1; + rect.w = lv_area_get_width(&dest_layer.buf_area); + rect.h = lv_area_get_height(&dest_layer.buf_area); + + if(texture == NULL) { + texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STATIC, rect.w, rect.h); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_UpdateTexture(texture, NULL, sdl_render_buf, rect.w * 4); + } + else { + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + } + + lv_draw_dsc_base_t * base_dsc = task->draw_dsc; + + data->draw_dsc = lv_malloc(base_dsc->dsc_size); + lv_memcpy((void *)data->draw_dsc, base_dsc, base_dsc->dsc_size); + data->w = lv_area_get_width(&task->area); + data->h = lv_area_get_height(&task->area); + data->texture = texture; + + return true; +} + +static void blend_texture_layer(lv_draw_sdl_unit_t * u) +{ + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + + SDL_Rect clip_rect; + clip_rect.x = u->base_unit.clip_area->x1; + clip_rect.y = u->base_unit.clip_area->y1; + clip_rect.w = lv_area_get_width(u->base_unit.clip_area); + clip_rect.h = lv_area_get_height(u->base_unit.clip_area); + + lv_draw_task_t * t = u->task_act; + SDL_Rect rect; + rect.x = t->area.x1; + rect.y = t->area.y1; + rect.w = lv_area_get_width(&t->area); + rect.h = lv_area_get_height(&t->area); + + lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; + lv_layer_t * src_layer = (lv_layer_t *)draw_dsc->src; + SDL_Texture * src_texture = layer_get_texture(src_layer); + + SDL_SetTextureAlphaMod(src_texture, draw_dsc->opa); + SDL_SetTextureBlendMode(src_texture, SDL_BLENDMODE_BLEND); + SDL_SetRenderTarget(renderer, layer_get_texture(u->base_unit.target_layer)); + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderCopy(renderer, src_texture, NULL, &rect); + SDL_DestroyTexture(src_texture); + SDL_RenderSetClipRect(renderer, NULL); +} + +static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) +{ + + lv_draw_task_t * t = u->task_act; + + cache_data_t data_to_find; + data_to_find.draw_dsc = (lv_draw_dsc_base_t *)t->draw_dsc; + + data_to_find.w = lv_area_get_width(&t->area); + data_to_find.h = lv_area_get_height(&t->area); + data_to_find.texture = NULL; + + /*user_data stores the renderer to differentiate it from SW rendered tasks. + *However the cached texture is independent from the renderer so use NULL user_data*/ + void * user_data_saved = data_to_find.draw_dsc->user_data; + data_to_find.draw_dsc->user_data = NULL; + + lv_cache_entry_t * entry_cached = lv_cache_acquire_or_create(u->texture_cache, &data_to_find, u); + if(!entry_cached) { + return; + } + + data_to_find.draw_dsc->user_data = user_data_saved; + + cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); + SDL_Texture * texture = data_cached->texture; + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + + lv_layer_t * dest_layer = u->base_unit.target_layer; + SDL_Rect clip_rect; + clip_rect.x = u->base_unit.clip_area->x1 - dest_layer->buf_area.x1; + clip_rect.y = u->base_unit.clip_area->y1 - dest_layer->buf_area.y1; + clip_rect.w = lv_area_get_width(u->base_unit.clip_area); + clip_rect.h = lv_area_get_height(u->base_unit.clip_area); + + SDL_Rect rect; + + SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer)); + + lv_draw_image_dsc_t * draw_dsc = lv_draw_task_get_image_dsc(t); + if(draw_dsc) { + lv_area_t image_area; + image_area.x1 = 0; + image_area.y1 = 0; + image_area.x2 = draw_dsc->header.w - 1; + image_area.y2 = draw_dsc->header.h - 1; + + lv_area_move(&image_area, t->area.x1 - dest_layer->buf_area.x1, t->area.y1 - dest_layer->buf_area.y1); + rect.x = image_area.x1; + rect.y = image_area.y1; + rect.w = lv_area_get_width(&image_area); + rect.h = lv_area_get_height(&image_area); + + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderCopy(renderer, texture, NULL, &rect); + } + else { + rect.x = t->area.x1 - dest_layer->buf_area.x1; + rect.y = t->area.y1 - dest_layer->buf_area.y1; + rect.w = lv_area_get_width(&t->area); + rect.h = lv_area_get_height(&t->area); + + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderCopy(renderer, texture, NULL, &rect); + } + + SDL_RenderSetClipRect(renderer, NULL); + + lv_cache_release(u->texture_cache, entry_cached, u); +} + +static void execute_drawing(lv_draw_sdl_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + + if(t->type == LV_DRAW_TASK_TYPE_BOX_SHADOW) return; + if(t->type == LV_DRAW_TASK_TYPE_LINE) return; + if(t->type == LV_DRAW_TASK_TYPE_TRIANGLE) return; + + if(t->type == LV_DRAW_TASK_TYPE_LAYER) { + blend_texture_layer(u); + } + else { + draw_from_cached_texture(u); + } +} + +static SDL_Texture * layer_get_texture(lv_layer_t * layer) +{ + return layer->user_data; +} + +#endif /*LV_USE_DRAW_SDL*/ diff --git a/libraries/lvgl/src/draw/sdl/lv_draw_sdl.h b/libraries/lvgl/src/draw/sdl/lv_draw_sdl.h new file mode 100644 index 0000000..b394ecc --- /dev/null +++ b/libraries/lvgl/src/draw/sdl/lv_draw_sdl.h @@ -0,0 +1,90 @@ +/** + * @file lv_draw_sdl.h + * + */ + +#ifndef LV_DRAW_SDL_H +#define LV_DRAW_SDL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" + +#if LV_USE_DRAW_SDL + +#include "../../misc/cache/lv_cache.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../display/lv_display.h" +#include "../../osal/lv_os.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + uint32_t texture_cache_data_type; + lv_cache_t * texture_cache; +} lv_draw_sdl_unit_t; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE +typedef struct { + uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; + int32_t cache_size; + int32_t cache_r; +} lv_draw_sw_shadow_cache_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sdl_init(void); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_sdl_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_sdl_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); + +void lv_draw_sdl_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_sdl_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_H*/ diff --git a/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h b/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h new file mode 100644 index 0000000..3f16382 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h @@ -0,0 +1,588 @@ +/** + * @file lv_draw_sw_arm2d.h + * + */ + +#ifndef LV_DRAW_SW_ARM2D_H +#define LV_DRAW_SW_ARM2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* *INDENT-OFF* */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_ARM2D_SYNC + +#define __ARM_2D_IMPL__ +#include "arm_2d.h" +#include "__arm_2d_impl.h" + +#if defined(__IS_COMPILER_ARM_COMPILER_5__) +#pragma diag_suppress 174,177,188,68,513,144,1296 +#elif defined(__IS_COMPILER_IAR__) +#pragma diag_suppress=Pa093 +#elif defined(__IS_COMPILER_GCC__) +#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +#endif + +/********************* + * DEFINES + *********************/ +#ifndef LV_DRAW_SW_RGB565_SWAP + #define LV_DRAW_SW_RGB565_SWAP(__buf_ptr, __buf_size_px) \ + _lv_draw_sw_rgb565_swap_helium((__buf_ptr), (__buf_size_px)) +#endif + +#ifndef LV_DRAW_SW_IMAGE + #define LV_DRAW_SW_IMAGE(__transformed, \ + __cf, \ + __src_buf, \ + __img_coords, \ + __src_stride, \ + __blend_area, \ + __draw_unit, \ + __draw_dsc) \ + _lv_draw_sw_image_helium( (__transformed), \ + (__cf), \ + (uint8_t *)(__src_buf), \ + (__img_coords), \ + (__src_stride), \ + (__blend_area), \ + (__draw_unit), \ + (__draw_dsc)) +#endif + +#ifndef LV_DRAW_SW_RGB565_RECOLOR + #define LV_DRAW_SW_RGB565_RECOLOR(__src_buf, __blend_area, __color, __opa) \ + _lv_draw_sw_image_recolor_rgb565( (__src_buf), \ + &(__blend_area), \ + (__color), \ + (__opa)) +#endif + +#ifndef LV_DRAW_SW_RGB888_RECOLOR + #define LV_DRAW_SW_RGB888_RECOLOR( __src_buf, \ + __blend_area, \ + __color, \ + __opa, \ + __cf) \ + _lv_draw_sw_image_recolor_rgb888( (__src_buf), \ + &(__blend_area), \ + (__color), \ + (__opa), \ + (__cf)) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +extern void arm_2d_helper_swap_rgb16(uint16_t * phwBuffer, uint32_t wCount); + +/********************** + * MACROS + **********************/ + +#define __RECOLOUR_BEGIN() \ + do { \ + lv_color_t *rgb_tmp_buf = NULL; \ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ + if(LV_COLOR_FORMAT_RGB565 == des_cf) { \ + rgb_tmp_buf \ + = lv_malloc(src_w * src_h * sizeof(uint16_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolor, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy( rgb_tmp_buf, \ + src_buf, \ + src_w * src_h * sizeof(uint16_t)); \ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-color */ \ + __arm_2d_impl_rgb565_colour_filling_with_opacity( \ + (uint16_t *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + lv_color_to_u16(draw_dsc->recolor), \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { \ + rgb_tmp_buf \ + = lv_malloc(src_w * src_h * sizeof(uint32_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolor, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy( rgb_tmp_buf, \ + src_buf, \ + src_w * src_h * sizeof(uint32_t)); \ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-color */ \ + __arm_2d_impl_cccn888_colour_filling_with_opacity( \ + (uint32_t *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + lv_color_to_u32(draw_dsc->recolor), \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + } \ + do { + +#define __RECOLOUR_END() \ + } while(0); \ + if (NULL != rgb_tmp_buf) { \ + lv_free(rgb_tmp_buf); \ + } \ + } while(0); + +static inline lv_result_t _lv_draw_sw_rgb565_swap_helium(void * buf, uint32_t buf_size_px) +{ + arm_2d_helper_swap_rgb16((uint16_t *)buf, buf_size_px); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_draw_sw_image_helium( + bool is_transform, + lv_color_format_t src_cf, + const uint8_t *src_buf, + const lv_area_t * coords, + int32_t src_stride, + const lv_area_t * des_area, + lv_draw_unit_t * draw_unit, + const lv_draw_image_dsc_t * draw_dsc) +{ + lv_result_t result = LV_RESULT_INVALID; + lv_layer_t * layer = draw_unit->target_layer; + lv_color_format_t des_cf = layer->color_format; + static bool arm_2d_initialized = false; + + if (!arm_2d_initialized) { + arm_2d_initialized = true; + arm_2d_init(); + } + + do { + if (!is_transform) { + break; + } + if(draw_dsc->scale_x != draw_dsc->scale_y) { + break; + } + /* filter the unsupported colour format combination */ + if((LV_COLOR_FORMAT_RGB565 == des_cf) + && !( (LV_COLOR_FORMAT_RGB565 == src_cf) + || (LV_COLOR_FORMAT_RGB565A8 == src_cf))) { + break; + } + #if 0 /* a temporary patch */ + if((LV_COLOR_FORMAT_XRGB8888 == des_cf) + && !( (LV_COLOR_FORMAT_ARGB8888 == src_cf) + || (LV_COLOR_FORMAT_XRGB8888 == src_cf))) { + break; + } + #else + if((LV_COLOR_FORMAT_XRGB8888 == des_cf) + || (LV_COLOR_FORMAT_RGB888 == des_cf) + || (LV_COLOR_FORMAT_ARGB8888 == des_cf)) { + break; + } + #endif + + /* ------------- prepare parameters for arm-2d APIs - BEGIN --------- */ + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, des_area, draw_unit->clip_area)) { + break; + } + + int32_t src_w = lv_area_get_width(coords); + int32_t src_h = lv_area_get_height(coords); + + arm_2d_size_t src_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + +// arm_2d_size_t des_size; + +// do{ +// int32_t des_w = lv_area_get_width(&blend_area); +// int32_t des_h = lv_area_get_height(&blend_area); + +// LV_ASSERT(des_w <= INT16_MAX); +// LV_ASSERT(des_h <= INT16_MAX); + +// des_size.iWidth = (int16_t)des_w; +// des_size.iHeight = (int16_t)des_h; +// } while(0); +// +// arm_2d_size_t copy_size = { +// .iWidth = MIN(des_size.iWidth, src_size.iWidth), +// .iHeight = MIN(des_size.iHeight, src_size.iHeight), +// }; +// +// int32_t des_stride = lv_draw_buf_width_to_stride( +// lv_area_get_width(&layer->buf_area), +// des_cf); +// uint8_t *des_buf_moved = (uint8_t *)lv_draw_layer_go_to_xy( +// layer, +// blend_area.x1 - layer->buf_area.x1, +// blend_area.y1 - layer->buf_area.y1); + uint8_t *des_buf = (uint8_t *)lv_draw_layer_go_to_xy(layer, 0, 0); + uint8_t opa = draw_dsc->opa; + + /* ------------- prepare parameters for arm-2d APIs - END ----------- */ + __RECOLOUR_BEGIN() + + static arm_2d_tile_t target_tile_origin; + static arm_2d_tile_t target_tile; + arm_2d_region_t clip_region; + static arm_2d_region_t target_region; + + target_region = (arm_2d_region_t) { + .tLocation = { + .iX = (int16_t)(coords->x1 - draw_unit->clip_area->x1), + .iY = (int16_t)(coords->y1 - draw_unit->clip_area->y1), + }, + .tSize = src_size, + }; + + target_tile_origin = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = (int16_t)lv_area_get_width(&layer->buf_area), + .iHeight = (int16_t)lv_area_get_height(&layer->buf_area), + }, + }, + .tInfo = { + .bIsRoot = true, + }, + .phwBuffer = (uint16_t *)des_buf, + }; + + clip_region = (arm_2d_region_t) { + .tLocation = { + .iX = (int16_t)(draw_unit->clip_area->x1 - layer->buf_area.x1), + .iY = (int16_t)(draw_unit->clip_area->y1 - layer->buf_area.y1), + }, + .tSize = { + .iWidth = (int16_t)lv_area_get_width(draw_unit->clip_area), + .iHeight = (int16_t)lv_area_get_height(draw_unit->clip_area), + }, + }; + + arm_2d_tile_generate_child(&target_tile_origin, + &clip_region, + &target_tile, + false); + + static arm_2d_tile_t source_tile; + + source_tile = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }, + }, + .tInfo = { + .bIsRoot = true, + }, + .pchBuffer = (uint8_t *)src_buf, + }; + + static arm_2d_location_t source_center, target_center; + source_center.iX = draw_dsc->pivot.x; + source_center.iY = draw_dsc->pivot.y; + target_center = target_region.tLocation; + target_center.iX += draw_dsc->pivot.x; + target_center.iY += draw_dsc->pivot.y; + + if(LV_COLOR_FORMAT_A8 == src_cf) { + + source_tile.tInfo.bHasEnforcedColour = true; + source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + + if(LV_COLOR_FORMAT_RGB565 == des_cf) { + + arm_2d_rgb565_fill_colour_with_mask_opacity_and_transform( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + lv_color_to_u16(draw_dsc->recolor), + opa, + &target_center + ); + + } + else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { + arm_2d_cccn888_fill_colour_with_mask_opacity_and_transform( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + lv_color_to_int(draw_dsc->recolor), + opa, + &target_center + ); + } + else { + break; + } + + } + else if(LV_COLOR_FORMAT_RGB565A8 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); + + /* mask_buf = src_buf + src_stride * src_w / header->w * src_h; */ + const uint8_t *mask_buf = src_buf + src_stride * src_h; + int32_t mask_stride = src_stride / 2; + + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + mask_tile.pchBuffer = (uint8_t *)mask_buf; + + if(opa >= LV_OPA_MAX) { + arm_2d_rgb565_tile_transform_with_src_mask( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center + ); + } + else { + arm_2d_rgb565_tile_transform_with_src_mask_and_opacity( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + + } + else if(LV_COLOR_FORMAT_RGB565 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); + + if(opa >= LV_OPA_MAX) { + #if ARM_2D_VERSION >= 10106 + arm_2d_rgb565_tile_transform_only( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center); + #else + + arm_2dp_rgb565_tile_transform_only_prepare( + NULL, + &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + (float)(draw_dsc->scale_x / 256.0f)); + + arm_2dp_tile_transform(NULL, + &target_tile, + NULL, + &target_center); + #endif + } + else { + arm_2d_rgb565_tile_transform_only_with_opacity( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + + } + #if 0 /* a temporary patch */ + else if(LV_COLOR_FORMAT_ARGB8888 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_XRGB8888 == des_cf); + + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; + mask_tile.pchBuffer = (uint8_t *)src_buf + 3; + + if(opa >= LV_OPA_MAX) { + arm_2d_cccn888_tile_transform_with_src_mask( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center + ); + } + else { + arm_2d_cccn888_tile_transform_with_src_mask_and_opacity( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + + } + else if(LV_COLOR_FORMAT_XRGB8888 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_XRGB8888 == des_cf); + + if(opa >= LV_OPA_MAX) { + arm_2d_cccn888_tile_transform_only( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center + ); + } + else { + arm_2d_cccn888_tile_transform_only_with_opacity( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + + } + #endif + else { + break; + } + + result = LV_RESULT_OK; + + __RECOLOUR_END() + } while(0); + + return result; +} + +static inline lv_result_t _lv_draw_sw_image_recolor_rgb565( + const uint8_t *src_buf, + const lv_area_t * blend_area, + lv_color_t color, + lv_opa_t opa) +{ + int32_t src_w = lv_area_get_width(blend_area); + int32_t src_h = lv_area_get_height(blend_area); + + arm_2d_size_t copy_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + + __arm_2d_impl_rgb565_colour_filling_with_opacity( + (uint16_t *)src_buf, + src_w, + ©_size, + lv_color_to_u16(color), + opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_draw_sw_image_recolor_rgb888( + const uint8_t *src_buf, + const lv_area_t * blend_area, + lv_color_t color, + lv_opa_t opa, + lv_color_format_t src_cf) +{ + if(LV_COLOR_FORMAT_XRGB8888 != src_cf) { + return LV_RESULT_INVALID; + } + + int32_t src_w = lv_area_get_width(blend_area); + int32_t src_h = lv_area_get_height(blend_area); + + arm_2d_size_t copy_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + + __arm_2d_impl_cccn888_colour_filling_with_opacity( + (uint32_t *)src_buf, + src_w, + ©_size, + lv_color_to_u32(color), + opa); + + return LV_RESULT_OK; +} + +#endif /* LV_USE_DRAW_ARM2D_SYNC */ + +/* *INDENT-ON* */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_ARM2D_H */ diff --git a/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h b/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h new file mode 100644 index 0000000..c35a06e --- /dev/null +++ b/libraries/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h @@ -0,0 +1,60 @@ +/** + * @file lv_draw_sw_helium.h + * + */ + +#ifndef LV_DRAW_SW_HELIUM_H +#define LV_DRAW_SW_HELIUM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* *INDENT-OFF* */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +/* detect whether helium is available based on arm compilers' standard */ +#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + +#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************* + * POST INCLUDES + *********************/ +/* use arm-2d as the default helium acceleration */ +#include "lv_draw_sw_arm2d.h" + +#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_HELIUM_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h b/libraries/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h new file mode 100644 index 0000000..5640bde --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h @@ -0,0 +1,1060 @@ +/** + * @file lv_blend_arm2d.h + * + */ + +#ifndef LV_BLEND_ARM2D_H +#define LV_BLEND_ARM2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" + +#if LV_USE_DRAW_ARM2D_SYNC + +#define __ARM_2D_IMPL__ +#include "arm_2d.h" +#include "__arm_2d_impl.h" + +#if defined(__IS_COMPILER_ARM_COMPILER_5__) +#pragma diag_suppress 174,177,188,68,513,144,1296 +#elif defined(__IS_COMPILER_IAR__) +#pragma diag_suppress=Pa093 +#elif defined(__IS_COMPILER_GCC__) +#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +#endif +/********************* + * DEFINES + *********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ + _lv_color_blend_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ + _lv_color_blend_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ + _lv_color_blend_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline lv_result_t _lv_color_blend_to_rgb565_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb16_colour_filling((uint16_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u16(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_with_opacity((uint16_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u16(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_mask((uint16_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u16(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_mask_opacity((uint16_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u16(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb16_copy((uint16_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb565_tile_copy_opacity((uint16_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb565_src_msk_copy((uint16_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + __arm_2d_impl_gray8_colour_filling_with_opacity((uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + 0x00, + 255 - dsc->opa); + + __arm_2d_impl_rgb565_src_msk_copy((uint16_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_tile_copy_opacity(tmp_buf, + des_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_gray8_colour_filling_with_opacity((uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + 0x00, + 255 - dsc->opa); + + __arm_2d_impl_rgb565_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_src_chn_msk_copy(tmp_buf, + des_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + uint8_t * tmp_msk = (uint8_t *)lv_malloc(des_stride * dsc->dest_h); + if(NULL == tmp_msk) { + lv_free(tmp_buf); + return LV_RESULT_INVALID; + } + + /* get rgb565 */ + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + lv_memzero(tmp_msk, des_stride * dsc->dest_h); + + /* get mask */ + __arm_2d_impl_gray8_colour_filling_channel_mask_opacity(tmp_msk, + des_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + 0xFF, + dsc->opa); + + __arm_2d_impl_rgb565_src_msk_copy(tmp_buf, + des_stride, + tmp_msk, + des_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_msk); + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + uint8_t * tmp_msk = (uint8_t *)lv_malloc(des_stride * dsc->dest_h); + if(NULL == tmp_msk) { + lv_free(tmp_buf); + return LV_RESULT_INVALID; + } + + /* get rgb565 */ + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + lv_memzero(tmp_msk, des_stride * dsc->dest_h); + + /* get mask */ + __arm_2d_impl_gray8_colour_filling_channel_mask(tmp_msk, + des_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + 0xFF); + + __arm_2d_impl_rgb565_masks_copy(tmp_buf, + des_stride, + tmp_msk, + des_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + &draw_size); + + lv_free(tmp_msk); + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + uint8_t * tmp_msk = (uint8_t *)lv_malloc(des_stride * dsc->dest_h); + if(NULL == tmp_msk) { + lv_free(tmp_buf); + return LV_RESULT_INVALID; + } + + /* get rgb565 */ + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + lv_memzero(tmp_msk, des_stride * dsc->dest_h); + + /* get mask */ + __arm_2d_impl_gray8_colour_filling_channel_mask_opacity(tmp_msk, + des_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + 0xFF, + dsc->opa); + + __arm_2d_impl_rgb565_masks_copy(tmp_buf, + des_stride, + tmp_msk, + des_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + &draw_size); + + lv_free(tmp_msk); + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb888_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_rgb32_colour_filling((uint32_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u32(dsc->color)); + return LV_RESULT_OK; + +} + +static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_with_opacity((uint32_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u32(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_mask((uint32_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u32(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_mask_opacity((uint32_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u32(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; + +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + /* get rgb565 */ + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_cccn888_tile_copy_opacity(tmp_buf, + des_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_cccn888_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_gray8_colour_filling_with_opacity((uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + 0x00, + 255 - dsc->opa); + + __arm_2d_impl_cccn888_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_rgb32_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_tile_copy_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_src_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_gray8_colour_filling_with_opacity((uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + 0x00, + 255 - dsc->opa); + + __arm_2d_impl_cccn888_src_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_src_chn_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint8_t * tmp_msk = (uint8_t *)lv_malloc(des_stride * dsc->dest_h); + if(NULL == tmp_msk) { + return LV_RESULT_INVALID; + } + + lv_memzero(tmp_msk, des_stride * dsc->dest_h); + + /* get mask */ + __arm_2d_impl_gray8_colour_filling_channel_mask_opacity(tmp_msk, + des_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + 0xFF, + dsc->opa); + + __arm_2d_impl_cccn888_src_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + tmp_msk, + des_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_msk); + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_src_chn_msk_des_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_gray8_colour_filling_with_opacity((uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + 0x00, + 255 - dsc->opa); + + __arm_2d_impl_cccn888_src_chn_msk_des_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)((uintptr_t)(dsc->src_buf) + 3), + src_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + &draw_size); + + return LV_RESULT_OK; +} + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_ARM2D_SYNC */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_ARM2D_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S b/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S new file mode 100644 index 0000000..ec054e8 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S @@ -0,0 +1,473 @@ +/** + * @file lv_blend_helium.S + * + */ + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif + +#include "lv_blend_helium.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM + +.data +reciprocal: +.byte 0xFF, 0xE2, 0xCC, 0xB9, 0xAA, 0x9C, 0x91, 0x88 + +.text +.syntax unified +.altmacro +.p2align 2 + +TMP .req r0 +DST_ADDR .req r1 +DST_W .req r2 +DST_H .req r3 +DST_STRIDE .req r4 +SRC_ADDR .req r5 +SRC_STRIDE .req r6 +MASK_ADDR .req r7 +MASK_STRIDE .req r8 +H .req r9 +OPA .req r10 +RCP .req r11 +S_B .qn q0 +S_G .qn q1 +S_R .qn q2 +S_A .qn q3 +D_B .qn q4 +D_G .qn q5 +D_R .qn q6 +D_A .qn q7 +N .qn q0 +V .qn q1 +R .qn q2 +L .qn q4 + +.macro conv_888_to_565 reg + vsri.8 reg&_R, reg&_G, #5 + vshr.u8 reg&_G, reg&_G, #2 + vshr.u8 reg&_B, reg&_B, #3 + vsli.8 reg&_B, reg&_G, #5 +.endm + +@ 16bpp is stored on R & B +.macro ldst op, bpp, mem, reg, areg, cvt, alt_index, wb +.if bpp == 0 +.if (reg == S) || (wb&1) @ exclude reg == D and ! + ldr TMP, [mem&_ADDR] + vdup.8 reg&_B, TMP + lsr TMP, #8 + vdup.8 reg&_G, TMP + lsr TMP, #8 + vdup.8 reg&_R, TMP +.if cvt && (wb&1) + conv_888_to_565 reg +.endif +.endif +.elseif bpp == 8 + v&op&rb.8 reg&_A, [mem&_ADDR], #16 +.elseif bpp == 16 +.if cvt && (op == st) + conv_888_to_565 reg +.endif +.if alt_index + v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A] +.else + v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A] +.endif +.if cvt && (op == ld) + vshl.u8 reg&_G, reg&_R, #5 + vsri.u8 reg&_G, reg&_B, #3 + vshl.u8 reg&_B, reg&_B, #3 + vsri.u8 reg&_R, reg&_R, #5 + vsri.u8 reg&_G, reg&_G, #6 + vsri.u8 reg&_B, reg&_B, #5 +.endif +.if wb&0 + add mem&_ADDR, #31 +.else + sub mem&_ADDR, #1 +.endif +.elseif bpp >= 24 +.if alt_index || (bpp >= 31) + v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_G, [mem&_ADDR, areg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A] +.else + v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_G, [mem&_ADDR, reg&_A] + add mem&_ADDR, #1 + v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A] +.endif +.if (bpp == 32) || (bpp == 31) && (op == st) + add mem&_ADDR, #1 + v&op&rb.8 reg&_A, [mem&_ADDR, areg&_A] +.endif +.if wb&0 + .if bpp == 24 + add mem&_ADDR, #46 + .elseif (bpp == 32) || (bpp == 31) && (op == st) + add mem&_ADDR, #61 + .else + add mem&_ADDR, #62 + .endif +.else + .if (bpp == 32) || (bpp == 31) && (op == st) + sub mem&_ADDR, #3 + .else + sub mem&_ADDR, #2 + .endif +.endif +.endif +.endm + +.macro load_index bpp, reg, areg +.if bpp > 0 + mov TMP, #0 +.endif +.if bpp == 8 + vidup.u8 reg&_A, TMP, #1 +.elseif bpp == 16 + vidup.u8 reg&_A, TMP, #2 +.elseif bpp == 24 + vidup.u8 reg&_A, TMP, #1 + mov TMP, #3 + vmul.i8 reg&_A, reg&_A, TMP +.elseif bpp >= 31 + vidup.u8 areg&_A, TMP, #4 +.endif +.endm + +.macro init src_bpp, dst_bpp, mask, opa + ldr DST_ADDR, [r0, #4] + ldr DST_W, [r0, #8] + ldr DST_H, [r0, #12] + ldr DST_STRIDE, [r0, #16] + ldr SRC_ADDR, [r0, #20] +.if src_bpp > 0 + ldr SRC_STRIDE, [r0, #24] +.endif +.if mask + ldr MASK_ADDR, [r0, #28] + ldr MASK_STRIDE, [r0, #32] +.endif +.if opa + ldr OPA, [r0] +.else + mov OPA, #0xFF +.endif + add TMP, DST_W, #0xF + bic TMP, TMP, #0xF +.if dst_bpp == 32 + ldr RCP, =(reciprocal - 8) +.endif + +.if dst_bpp == 16 + sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 +.elseif dst_bpp == 24 + sub DST_STRIDE, DST_STRIDE, TMP + sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 +.elseif dst_bpp >= 31 + sub DST_STRIDE, DST_STRIDE, TMP, lsl #2 +.endif +.if mask + sub MASK_STRIDE, MASK_STRIDE, TMP +.endif +.if src_bpp == 0 + .if mask || opa + ldst ld, src_bpp, SRC, S, D, 0, 0 + vmov.u8 S_A, #0xFF + .else + ldst ld, src_bpp, SRC, D, S, (dst_bpp == 16), 0 + vmov.u8 D_A, #0xFF + .endif +.else + .if src_bpp == 16 + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 + .elseif src_bpp == 24 + sub SRC_STRIDE, SRC_STRIDE, TMP + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 + .elseif src_bpp >= 31 + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2 + .endif +.endif +.if (src_bpp < 32) && (mask == 0) && (opa == 0) + .if (src_bpp == 31) || (dst_bpp < 31) + load_index src_bpp, S, S + .endif + .if (dst_bpp < 31) && (dst_bpp != src_bpp) + load_index dst_bpp, D, D + .else + load_index dst_bpp, S, S + vmov.u8 D_A, #0xFF + .endif +.endif +.endm + +.macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss + vmulh.u8 Qd, Qn, Qm + vqshl.u8 Qd, Qd, #1 +.endm + +.macro premult mem, alpha + vrmulh.u8 mem&_B, mem&_B, alpha + vrmulh.u8 mem&_G, mem&_G, alpha + vrmulh.u8 mem&_R, mem&_R, alpha +.endm + +.macro blend src_bpp, dst_bpp, mask, opa, mode +.if (mask == 0) && (opa == 2) && (dst_bpp < 32) + vhadd.u8 D_B, D_B, S_B + vhadd.u8 D_G, D_G, S_G + vhadd.u8 D_R, D_R, S_R +.else +.if dst_bpp < 32 + vmvn D_A, S_A + premult S, S_A + premult D, D_A +.else + vpush {d0-d5} + vmvn N, S_A + vmvn D_A, D_A + vrmulh.u8 D_A, N, D_A + vmvn D_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha) + vclz.i8 N, D_A @ n = clz(D_A) + vshl.u8 V, D_A, N @ v = D_A << n + vshl.u8 S_A, S_A, N + vshr.u8 N, V, #4 @ N is used as tmp from now on + vldrb.u8 R, [RCP, N] @ r = reciprocal[(v >> 4) - 8] + vrmulh.u8 N, V, R @ r = newton(v,r) + vmvn N, N @ = vqrdmulh.u8(vmvn(vrmulh(v, r)), r) + vqrdmulh_u8 R, N, R @ but vqrdmulh does not support u8, so we implement one + vrmulh.u8 N, V, R @ and do it twice + vmvn N, N + vqrdmulh_u8 R, N, R + vqrdmulh_u8 S_A, S_A, R @ S_A' = S_A * 255 / D_A = vrdmulh(S_A << n, r) + vpop {d0-d5} + premult S, S_A + vmvn S_A, S_A + premult D, S_A +.endif + vqadd.u8 D_B, D_B, S_B + vqadd.u8 D_G, D_G, S_G + vqadd.u8 D_R, D_R, S_R +.endif +.if dst_bpp == 31 + vmov.u8 D_A, #0xFF +.endif +.endm + +.macro blend_line src_bpp, dst_bpp, mask, opa, mode + wlstp.8 lr, DST_W, 1f +2: +.if (src_bpp < 32) && (mask == 0) && (opa == 0) +@ no blend +@ dst index: db < 31 ? (db == sb ? S : D) : S +@ src index: sb < 31 && db >= 31 ? D(reload) : S + .if (src_bpp < 31) && (dst_bpp >= 31) + load_index src_bpp, D, D + .endif + .if src_bpp == 0 + ldst st, dst_bpp, DST, D, S, 0, 0, ! + .elseif (src_bpp == dst_bpp) || (src_bpp == 31) && (dst_bpp == 32) + .if dst_bpp < 31 + .if src_bpp < 31 + ldst ld, src_bpp, SRC, D, S, 0, 1, ! + .else + ldst ld, src_bpp, SRC, D, S, 0, 0, ! + .endif + ldst st, dst_bpp, DST, D, S, 0, 1, ! + .else + ldst ld, src_bpp, SRC, D, S, 0, 0, ! + ldst st, dst_bpp, DST, D, S, 0, 0, ! + .endif + .else + .if (dst_bpp < 31) && (src_bpp < 31) + ldst ld, src_bpp, SRC, D, S, 1, 1, ! + .else + ldst ld, src_bpp, SRC, D, S, 1, 0, ! + .endif + .if (src_bpp < 31) && (dst_bpp >= 31) + vmov.u8 D_A, #0xFF + .endif + ldst st, dst_bpp, DST, D, S, 1, 0, ! + .endif +.elseif src_bpp < 32 +@ no src_a + load_index src_bpp, S, D + ldst ld, src_bpp, SRC, S, D, 1, 0, ! + load_index dst_bpp, D, S + ldst ld, dst_bpp, DST, D, S, 1, 0 + .if mask + ldst ld, 8, MASK, S, D, 1, 0, ! + .if opa == 2 + vshr.u8 S_A, S_A, #1 + .elseif opa == 1 + .if dst_bpp == 32 + vpush {d14-d15} + .endif + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .if dst_bpp == 32 + vpop {d14-d15} + .endif + .endif + .elseif opa == 1 + vdup.8 S_A, OPA + .endif + blend src_bpp, dst_bpp, mask, opa, mode + .if (dst_bpp == 32) || mask || (opa == 1) + load_index dst_bpp, D, S + .endif + ldst st, dst_bpp, DST, D, S, 1, 0, ! +.else +@ src_a (+mask) (+opa) + load_index dst_bpp, D, S + ldst ld, dst_bpp, DST, D, S, 1, 0 + .if dst_bpp == 32 + vpush {d14-d15} + .endif + load_index src_bpp, S, D + ldst ld, src_bpp, SRC, S, D, 1, 0, ! + .if mask == 0 + .if opa + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .endif + .else + ldst ld, 8, MASK, D, S, 1, 0, ! + vrmulh.u8 S_A, S_A, D_A + .if opa + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .endif + .endif + .if dst_bpp == 32 + vpop {d14-d15} + .endif + blend src_bpp, dst_bpp, mask, opa, mode + load_index dst_bpp, D, S + ldst st, dst_bpp, DST, D, S, 1, 0, ! +.endif + letp lr, 2b +1: +.endm + +.macro enter + push {r4-r11, lr} + vpush {d8-d15} +.endm + +.macro exit + vpop {d8-d15} + pop {r4-r11, pc} +.endm + +.macro preload mem, bpp +.if bpp >= 31 + pld [mem&_ADDR, DST_W, lsl #2] +.elseif bpp == 24 + add TMP, DST_W, DST_W, lsl #1 + pld [mem&_ADDR, TMP] +.elseif bpp == 16 + pld [mem&_ADDR, DST_W, lsl #1] +.elseif bpp == 8 + pld [mem&_ADDR, DST_W] +.endif +.endm + +.macro next src_bpp, mask + add DST_ADDR, DST_ADDR, DST_STRIDE +.if src_bpp > 0 + add SRC_ADDR, SRC_ADDR, SRC_STRIDE +.endif +.if mask + add MASK_ADDR, MASK_ADDR, MASK_STRIDE +.endif +.endm + +.macro blender src_bpp, dst_bpp, mask, opa, mode + enter + init src_bpp, dst_bpp, mask, opa + movs H, DST_H + beq 0f + preload SRC, src_bpp +.if mask || opa || (src_bpp == 32) + preload DST, dst_bpp +.endif +.if opa && (src_bpp < 32) && (dst_bpp < 32) +4: +@ 50% OPA can be accelerated (OPA == 0x7F/0x80) + add TMP, OPA, #1 + tst TMP, #0x7E + bne 3f + blend_line src_bpp, dst_bpp, mask, 2, mode + next src_bpp, mask + subs H, #1 + bne 4b + b 0f +.endif +3: + blend_line src_bpp, dst_bpp, mask, opa, mode + next src_bpp, mask + subs H, #1 + bne 3b +0: + exit +.ltorg +.endm + +.macro export name, src_bpp, dst_bpp, mask, opa, mode +.thumb_func +.func name +.global name +name&: + blender src_bpp, dst_bpp, mask, opa, mode +.endfunc +.endm + +.macro export_set src, dst, src_bpp, dst_bpp, mode +.if src == color + export lv_&src&_blend_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode + export lv_&src&_blend_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode + export lv_&src&_blend_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode + export lv_&src&_blend_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode +.else + export lv_&src&_blend_&mode&_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode + export lv_&src&_blend_&mode&_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode + export lv_&src&_blend_&mode&_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode + export lv_&src&_blend_&mode&_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode +.endif +.endm + +export_set color, rgb565, 0, 16, normal +export_set rgb565, rgb565, 16, 16, normal +export_set rgb888, rgb565, 24, 16, normal +export_set xrgb8888, rgb565, 31, 16, normal +export_set argb8888, rgb565, 32, 16, normal +export_set color, rgb888, 0, 24, normal +export_set rgb565, rgb888, 16, 24, normal +export_set rgb888, rgb888, 24, 24, normal +export_set xrgb8888, rgb888, 31, 24, normal +export_set argb8888, rgb888, 32, 24, normal +export_set color, xrgb8888, 0, 31, normal +export_set rgb565, xrgb8888, 16, 31, normal +export_set rgb888, xrgb8888, 24, 31, normal +export_set xrgb8888, xrgb8888, 31, 31, normal +export_set argb8888, xrgb8888, 32, 31, normal +export_set color, argb8888, 0, 32, normal +export_set rgb565, argb8888, 16, 32, normal +export_set rgb888, argb8888, 24, 32, normal +export_set xrgb8888, argb8888, 31, 32, normal +export_set argb8888, argb8888, 32, 32, normal + +#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM*/ diff --git a/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h b/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h new file mode 100644 index 0000000..f8964e9 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h @@ -0,0 +1,1313 @@ +/** + * @file lv_blend_helium.h + * + */ + +#ifndef LV_BLEND_HELIUM_H +#define LV_BLEND_HELIUM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if defined(_RTE_) +#include "Pre_Include_Global.h" +#include "lv_conf_cmsis.h" +#endif + +#include "../../../../lv_conf_internal.h" + +/* detect whether helium is available based on arm compilers' standard */ +#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + +#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#endif + +#if !defined(__ASSEMBLY__) + +/* Use arm2d functions if present */ +#include "../arm2d/lv_blend_arm2d.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_NATIVE_HELIUM_ASM + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ + _lv_color_blend_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ + _lv_color_blend_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ + _lv_color_blend_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ + _lv_color_blend_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_color_blend_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_color_blend_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t opa; + void * dst_buf; + uint32_t dst_w; + uint32_t dst_h; + uint32_t dst_stride; + const void * src_buf; + uint32_t src_stride; + const lv_opa_t * mask_buf; + uint32_t mask_stride; +} asm_dsc_t; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +extern void lv_color_blend_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + lv_color_blend_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + lv_color_blend_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_helium(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_helium(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + lv_color_blend_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + lv_color_blend_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +#endif /* LV_USE_NATIVE_HELIUM_ASM */ + +#endif /* !defined(__ASSEMBLY__) */ + +#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_HELIUM_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c new file mode 100644 index 0000000..9ceee3b --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c @@ -0,0 +1,156 @@ +/** + * @file lv_draw_sw_blend.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#include "lv_draw_sw_blend_to_rgb565.h" +#include "lv_draw_sw_blend_to_argb8888.h" +#include "lv_draw_sw_blend_to_rgb888.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * blend_dsc) +{ + /*Do not draw transparent things*/ + if(blend_dsc->opa <= LV_OPA_MIN) return; + if(blend_dsc->mask_buf && blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_TRANSP) return; + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, blend_dsc->blend_area, draw_unit->clip_area)) return; + + LV_PROFILER_BEGIN; + lv_layer_t * layer = draw_unit->target_layer; + uint32_t layer_stride_byte = lv_draw_buf_width_to_stride(lv_area_get_width(&layer->buf_area), layer->color_format); + + if(blend_dsc->src_buf == NULL) { + _lv_draw_sw_blend_fill_dsc_t fill_dsc; + fill_dsc.dest_w = lv_area_get_width(&blend_area); + fill_dsc.dest_h = lv_area_get_height(&blend_area); + fill_dsc.dest_stride = layer_stride_byte; + fill_dsc.opa = blend_dsc->opa; + fill_dsc.color = blend_dsc->color; + + if(blend_dsc->mask_buf == NULL) fill_dsc.mask_buf = NULL; + else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) fill_dsc.mask_buf = NULL; + else fill_dsc.mask_buf = blend_dsc->mask_buf; + + fill_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, + blend_area.y1 - layer->buf_area.y1); + + if(fill_dsc.mask_buf) { + fill_dsc.mask_stride = blend_dsc->mask_stride == 0 ? lv_area_get_width(blend_dsc->mask_area) : blend_dsc->mask_stride; + fill_dsc.mask_buf += fill_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + + (blend_area.x1 - blend_dsc->mask_area->x1); + } + + switch(layer->color_format) { + case LV_COLOR_FORMAT_RGB565: + lv_draw_sw_blend_color_to_rgb565(&fill_dsc); + break; + case LV_COLOR_FORMAT_ARGB8888: + lv_draw_sw_blend_color_to_argb8888(&fill_dsc); + break; + case LV_COLOR_FORMAT_RGB888: + lv_draw_sw_blend_color_to_rgb888(&fill_dsc, 3); + break; + case LV_COLOR_FORMAT_XRGB8888: + lv_draw_sw_blend_color_to_rgb888(&fill_dsc, 4); + break; + default: + break; + } + } + else { + if(!_lv_area_intersect(&blend_area, &blend_area, blend_dsc->src_area)) { + LV_PROFILER_END; + return; + } + + if(blend_dsc->mask_area && !_lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) { + LV_PROFILER_END; + return; + } + + _lv_draw_sw_blend_image_dsc_t image_dsc; + image_dsc.dest_w = lv_area_get_width(&blend_area); + image_dsc.dest_h = lv_area_get_height(&blend_area); + image_dsc.dest_stride = layer_stride_byte; + + image_dsc.opa = blend_dsc->opa; + image_dsc.blend_mode = blend_dsc->blend_mode; + image_dsc.src_stride = blend_dsc->src_stride; + image_dsc.src_color_format = blend_dsc->src_color_format; + + const uint8_t * src_buf = blend_dsc->src_buf; + uint32_t src_px_size = lv_color_format_get_size(blend_dsc->src_color_format); + src_buf += image_dsc.src_stride * (blend_area.y1 - blend_dsc->src_area->y1); + src_buf += (blend_area.x1 - blend_dsc->src_area->x1) * src_px_size; + image_dsc.src_buf = src_buf; + + if(blend_dsc->mask_buf == NULL) image_dsc.mask_buf = NULL; + else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) image_dsc.mask_buf = NULL; + else image_dsc.mask_buf = blend_dsc->mask_buf; + + if(image_dsc.mask_buf) { + image_dsc.mask_buf = blend_dsc->mask_buf; + image_dsc.mask_stride = blend_dsc->mask_stride ? blend_dsc->mask_stride : lv_area_get_width(blend_dsc->mask_area); + image_dsc.mask_buf += image_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + + (blend_area.x1 - blend_dsc->mask_area->x1); + } + + image_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, + blend_area.y1 - layer->buf_area.y1); + + switch(layer->color_format) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565A8: + lv_draw_sw_blend_image_to_rgb565(&image_dsc); + break; + case LV_COLOR_FORMAT_ARGB8888: + lv_draw_sw_blend_image_to_argb8888(&image_dsc); + break; + case LV_COLOR_FORMAT_RGB888: + lv_draw_sw_blend_image_to_rgb888(&image_dsc, 3); + break; + case LV_COLOR_FORMAT_XRGB8888: + lv_draw_sw_blend_image_to_rgb888(&image_dsc, 4); + break; + default: + break; + } + } + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h new file mode 100644 index 0000000..c1b1edc --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h @@ -0,0 +1,93 @@ +/** + * @file lv_draw_sw_blend.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_H +#define LV_DRAW_SW_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw_mask.h" +#if LV_USE_DRAW_SW + +#include "../../../misc/lv_color.h" +#include "../../../misc/lv_area.h" +#include "../../../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `layer->buf` + * will be clipped to `layer->clip_area` */ + const void * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ + uint32_t src_stride; + lv_color_format_t src_color_format; + const lv_area_t * src_area; + lv_opa_t opa; /**< The overall opacity*/ + lv_color_t color; /**< Fill color*/ + const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ + lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ + const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ + int32_t mask_stride; + lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ +} lv_draw_sw_blend_dsc_t; + +typedef struct { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + lv_color_t color; + lv_opa_t opa; +} _lv_draw_sw_blend_fill_dsc_t; + +typedef struct { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + const void * src_buf; + int32_t src_stride; + lv_color_format_t src_color_format; + lv_opa_t opa; + lv_blend_mode_t blend_mode; +} _lv_draw_sw_blend_image_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call the blend function of the `layer`. + * @param draw_unit pointer to a draw unit + * @param dsc pointer to an initialized blend descriptor + */ +void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c new file mode 100644 index 0000000..c78c10c --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c @@ -0,0 +1,656 @@ +/** + * @file lv_draw_sw_blend.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_argb8888.h" +#if LV_USE_DRAW_SW + +#include "lv_draw_sw_blend.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color32_t fg_saved; + lv_color32_t bg_saved; + lv_color32_t res_saved; + lv_opa_t res_alpha_saved; + lv_opa_t ratio_saved; +} lv_color_mix_alpha_cache_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + +static inline lv_color32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache); + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w - 16; x += 16) { + dest_buf[x + 0] = color32; + dest_buf[x + 1] = color32; + dest_buf[x + 2] = color32; + dest_buf[x + 3] = color32; + + dest_buf[x + 4] = color32; + dest_buf[x + 5] = color32; + dest_buf[x + 6] = color32; + dest_buf[x + 7] = color32; + + dest_buf[x + 8] = color32; + dest_buf[x + 9] = color32; + dest_buf[x + 10] = color32; + dest_buf[x + 11] = color32; + + dest_buf[x + 12] = color32; + dest_buf[x + 13] = color32; + dest_buf[x + 14] = color32; + dest_buf[x + 15] = color32; + } + for(; x < w; x ++) { + dest_buf[x] = color32; + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + lv_color32_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, 0xff); + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask[x]; + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask[x], opa); + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(color_argb); + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL) { + lv_result_t accelerated; + if(opa >= LV_OPA_MAX) { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc); + } + else { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc); + } + if(LV_RESULT_INVALID == accelerated) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask_buf[x]; + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + src_argb.red = (src_buf_c16[x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t dest_x; + int32_t src_x; + int32_t y; + + LV_UNUSED(color_argb); + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size)) { + if(src_px_size == 4) { + uint32_t line_in_bytes = w * 4; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_c32, src_buf, line_in_bytes); + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else if(src_px_size == 3) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 3) { + dest_buf_c32[dest_x].red = src_buf[src_x + 2]; + dest_buf_c32[dest_x].green = src_buf[src_x + 1]; + dest_buf_c32[dest_x].blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x].alpha = 0xff; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size)) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = mask_buf[dest_x]; + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = (opa * mask_buf[dest_x]) >> 8; + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf[src_x + 2]; + src_argb.green = src_buf[src_x + 1]; + src_argb.blue = src_buf[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_c32[x] = lv_color_32_32_mix(src_buf_c32[x], dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +static inline lv_color32_t LV_ATTRIBUTE_FAST_MEM lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache) +{ + /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ + if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { + return fg; + } + /*Transparent foreground: use the Background*/ + else if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + /*Opaque background: use simple mix*/ + else if(bg.alpha == 255) { + return lv_color_mix32(fg, bg); + } + /*Both colors have alpha. Expensive calculation need to be applied*/ + else { + /*Save the parameters and the result. If they will be asked again don't compute again*/ + + /*Update the ratio and the result alpha value if the input alpha values change*/ + if(bg.alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { + /*Info: + * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ + cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); + LV_ASSERT(cache->ratio_saved != 0); + cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; + } + + if(!lv_color32_eq(bg, cache->bg_saved) || !lv_color32_eq(fg, cache->fg_saved)) { + cache->fg_saved = fg; + cache->bg_saved = bg; + fg.alpha = cache->ratio_saved; + cache->res_saved = lv_color_mix32(fg, bg); + cache->res_saved.alpha = cache->res_alpha_saved; + } + + return cache->res_saved; + } +} + +void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) +{ + lv_memzero(&cache->fg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->bg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->res_saved, sizeof(lv_color32_t)); + cache->res_alpha_saved = 255; + cache->ratio_saved = 255; +} + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) +{ + lv_color32_t res; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res.red = LV_MIN(dest->red + src.red, 255); + res.green = LV_MIN(dest->green + src.green, 255); + res.blue = LV_MIN(dest->blue + src.blue, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res.red = LV_MAX(dest->red - src.red, 0); + res.green = LV_MAX(dest->green - src.green, 0); + res.blue = LV_MAX(dest->blue - src.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res.red = (dest->red * src.red) >> 8; + res.green = (dest->green * src.green) >> 8; + res.blue = (dest->blue * src.blue) >> 8; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + res.alpha = src.alpha; + *dest = lv_color_32_32_mix(res, *dest, cache); +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h new file mode 100644 index 0000000..cfd4316 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_argb8888.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_ARGB8888_H +#define LV_DRAW_SW_BLEND_ARGB8888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_ARGB8888_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c new file mode 100644 index 0000000..84c1939 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c @@ -0,0 +1,666 @@ +/** + * @file lv_draw_sw_blend_to_rgb565.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb565.h" +#if LV_USE_DRAW_SW + +#include "lv_draw_sw_blend.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Fill an area with a color. + * Supports normal fill, fill with opacity, fill with mask, and fill with mask and opacity. + * dest_buf and color have native color depth. (RGB565, RGB888, XRGB8888) + * The background (dest_buf) cannot have alpha channel + * @param dest_buf + * @param dest_area + * @param dest_stride + * @param color + * @param opa + * @param mask + * @param mask_stride + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t color16 = lv_color_to_u16(dsc->color); + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(color16); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + LV_UNUSED(dest_buf_u16); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + uint16_t * dest_end_final = dest_buf_u16 + w; + uint32_t * dest_end_mid = (uint32_t *)((uint16_t *) dest_buf_u16 + ((w - 1) & ~(0xF))); + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = color16; + dest_buf_u16++; + } + + uint32_t c32 = (uint32_t)color16 + ((uint32_t)color16 << 16); + uint32_t * dest32 = (uint32_t *)dest_buf_u16; + while(dest32 < dest_end_mid) { + dest32[0] = c32; + dest32[1] = c32; + dest32[2] = c32; + dest32[3] = c32; + dest32[4] = c32; + dest32[5] = c32; + dest32[6] = c32; + dest32[7] = c32; + dest32 += 8; + } + + dest_buf_u16 = (uint16_t *)dest32; + + while(dest_buf_u16 < dest_end_final) { + *dest_buf_u16 = color16; + dest_buf_u16++; + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + dest_buf_u16 -= w; + } + } + + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc)) { + uint32_t last_dest32_color = dest_buf_u16[0] + 1; /*Set to value which is not equal to the first pixel*/ + uint32_t last_res32_color = 0; + + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = lv_color_16_16_mix(color16, dest_buf_u16[0], opa); + x = 1; + } + + for(; x < w - 2; x += 2) { + if(dest_buf_u16[x] != dest_buf_u16[x + 1]) { + dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); + dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], opa); + } + else { + volatile uint32_t * dest32 = (uint32_t *)&dest_buf_u16[x]; + if(last_dest32_color == *dest32) { + *dest32 = last_res32_color; + } + else { + last_dest32_color = *dest32; + + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); + dest_buf_u16[x + 1] = dest_buf_u16[x]; + + last_res32_color = *dest32; + } + } + } + + for(; x < w ; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + } + + } + + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)(mask) & 0x1) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); + x++; + } + + for(; x <= w - 2; x += 2) { + uint16_t mask16 = *((uint16_t *)&mask[x]); + if(mask16 == 0xFFFF) { + dest_buf_u16[x + 0] = color16; + dest_buf_u16[x + 1] = color16; + } + else if(mask16 != 0) { + dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], mask[x + 0]); + dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], mask[x + 1]); + } + } + + for(; x < w ; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + + } + /*Masked with opacity*/ + else if(mask && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], LV_OPA_MIX2(mask[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], mask_buf[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_color16_t * src_buf_c16 = (lv_color16_t *) src_buf_u16; + for(x = 0; x < w; x++) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + res = (LV_MIN(dest_buf_c16[x].red + src_buf_c16[x].red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_buf_c16[x].green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_buf_c16[x].blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + res = (LV_MAX(dest_buf_c16[x].red - src_buf_c16[x].red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_buf_c16[x].green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_buf_c16[x].blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + res = ((dest_buf_c16[x].red * src_buf_c16[x].red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_buf_c16[x].green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_buf_c16[x].blue) >> 5; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x]); + else dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = ((src_buf_u8[src_x + 2] & 0xF8) << 8) + + ((src_buf_u8[src_x + 1] & 0xFC) << 3) + + ((src_buf_u8[src_x + 0] & 0xF8) >> 3); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], mask_buf[dest_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(src_buf_u8[src_x + 3], + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_u8[src_x + 3])); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3])); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1[2] >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1[1] >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1[0] >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h new file mode 100644 index 0000000..c7482f9 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_rgb565.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_RGB565_H +#define LV_DRAW_SW_BLEND_RGB565_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_RGB565_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c new file mode 100644 index 0000000..84e087f --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c @@ -0,0 +1,609 @@ +/** + * @file lv_draw_sw_blend_to_rgb888.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb888.h" +#if LV_USE_DRAW_SW + +#include "lv_draw_sw_blend.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t dest_px_size, + uint32_t src_px_size); + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, + lv_blend_mode_t mode); +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dest_px_size)) { + if(dest_px_size == 3) { + uint8_t * dest_buf_u8 = dsc->dest_buf; + uint8_t * dest_buf_ori = dsc->dest_buf; + w *= dest_px_size; + + for(x = 0; x < w; x += 3) { + dest_buf_u8[x + 0] = dsc->color.blue; + dest_buf_u8[x + 1] = dsc->color.green; + dest_buf_u8[x + 2] = dsc->color.red; + } + + dest_buf_u8 += dest_stride; + + for(y = 1; y < h; y++) { + lv_memcpy(dest_buf_u8, dest_buf_ori, w); + dest_buf_u8 += dest_stride; + } + } + if(dest_px_size == 4) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf_u32 = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x <= w - 16; x += 16) { + dest_buf_u32[x + 0] = color32; + dest_buf_u32[x + 1] = color32; + dest_buf_u32[x + 2] = color32; + dest_buf_u32[x + 3] = color32; + + dest_buf_u32[x + 4] = color32; + dest_buf_u32[x + 5] = color32; + dest_buf_u32[x + 6] = color32; + dest_buf_u32[x + 7] = color32; + + dest_buf_u32[x + 8] = color32; + dest_buf_u32[x + 9] = color32; + dest_buf_u32[x + 10] = color32; + dest_buf_u32[x + 11] = color32; + + dest_buf_u32[x + 12] = color32; + dest_buf_u32[x + 13] = color32; + dest_buf_u32[x + 14] = color32; + dest_buf_u32[x + 15] = color32; + } + for(; x < w; x ++) { + dest_buf_u32[x] = color32; + } + + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + } + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x += dest_px_size) { + lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], opa); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + + for(y = 0; y < h; y++) { + uint32_t mask_x; + for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { + lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], mask[mask_x]); + } + dest_buf += dest_stride; + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + + for(y = 0; y < h; y++) { + uint32_t mask_x; + for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { + lv_color_24_24_mix((const uint8_t *) &color32, &dest_buf[x], LV_OPA_MIX2(opa, mask[mask_x])); + } + dest_buf += dest_stride; + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc, dest_px_size); + break; + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, dest_px_size, 3); + break; + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, dest_px_size, 4); + break; + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc, dest_px_size); + break; + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t src_x; + int32_t dest_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + dest_buf_u8[dest_x + 2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + dest_buf_u8[dest_x + 1] = (src_buf_c16[src_x].green * 1037) >> 8; + dest_buf_u8[dest_x + 0] = (src_buf_c16[src_x].blue * 2106) >> 8; + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x += dest_px_size) { + src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, + uint32_t src_px_size) +{ + int32_t w = dsc->dest_w * dest_px_size; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size, src_px_size)) { + if(src_px_size == dest_px_size) { + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf, src_buf, w); + dest_buf += dest_stride; + src_buf += src_stride; + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + dest_buf[dest_x + 0] = src_buf[src_x + 0]; + dest_buf[dest_x + 1] = src_buf[src_x + 1]; + dest_buf[dest_x + 2] = src_buf[src_x + 2]; + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], opa); + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], mask_buf[mask_x]); + } + dest_buf += dest_stride; + src_buf += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], LV_OPA_MIX2(opa, mask_buf[mask_x])); + } + dest_buf += dest_stride; + src_buf += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + src_argb.red = src_buf[src_x + 2]; + src_argb.green = src_buf[src_x + 1]; + src_argb.blue = src_buf[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf += src_stride; + } + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], src_buf_c32[src_x].alpha); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], LV_OPA_MIX2(src_buf_c32[src_x].alpha, opa)); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], + LV_OPA_MIX2(src_buf_c32[src_x].alpha, mask_buf[src_x])); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], + LV_OPA_MIX3(src_buf_c32[src_x].alpha, mask_buf[src_x], opa)); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x ++) { + src_argb = src_buf_c32[src_x]; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_argb.alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_argb.alpha, mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) +{ + uint8_t res[3] = {0, 0, 0}; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res[0] = LV_MIN(dest[0] + src.blue, 255); + res[1] = LV_MIN(dest[1] + src.green, 255); + res[2] = LV_MIN(dest[2] + src.red, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res[0] = LV_MAX(dest[0] - src.blue, 0); + res[1] = LV_MAX(dest[1] - src.green, 0); + res[2] = LV_MAX(dest[2] - src.red, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res[0] = (dest[0] * src.blue) >> 8; + res[1] = (dest[1] * src.green) >> 8; + res[2] = (dest[2] * src.red) >> 8; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + lv_color_24_24_mix(res, dest, src.alpha); +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)((uint32_t)src[0] * mix + dest[0] * mix_inv) >> 8; + dest[1] = (uint32_t)((uint32_t)src[1] * mix + dest[1] * mix_inv) >> 8; + dest[2] = (uint32_t)((uint32_t)src[2] * mix + dest[2] * mix_inv) >> 8; + } +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif diff --git a/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h new file mode 100644 index 0000000..a97a58b --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h @@ -0,0 +1,47 @@ +/** + * @file lv_draw_sw_blend_rgb888.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_RGB888_H +#define LV_DRAW_SW_BLEND_RGB888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_RGB888_H*/ diff --git a/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S b/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S new file mode 100644 index 0000000..61577e2 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S @@ -0,0 +1,684 @@ +/** + * @file lv_blend_neon.S + * + */ + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif + +#include "lv_blend_neon.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +.text +.fpu neon +.arch armv7a +.syntax unified +.altmacro +.p2align 2 + +@ d0 ~ d3 : src B,G,R,A +@ d4 ~ d7 : dst B,G,R,A +@ q8 : src RGB565 raw +@ q9 : dst RGB565 raw +@ q10 ~ q12: pre-multiplied src +@ d26~29 : temp +@ d30 : mask +@ d31 : opa + +FG_MASK .req r0 +BG_MASK .req r1 +DST_ADDR .req r2 +DST_W .req r3 +DST_H .req r4 +DST_STRIDE .req r5 +SRC_ADDR .req r6 +SRC_STRIDE .req r7 +MASK_ADDR .req r8 +MASK_STRIDE .req r9 +W .req r10 +H .req r11 +S_8888_L .qn q0 +S_8888_H .qn q1 +D_8888_L .qn q2 +D_8888_H .qn q3 + S_B .dn d0 + S_G .dn d1 + S_R .dn d2 + S_A .dn d3 + D_B .dn d4 + D_G .dn d5 + D_R .dn d6 + D_A .dn d7 +S_565 .qn q8 +D_565 .qn q9 + S_565_L .dn d16 + S_565_H .dn d17 + D_565_L .dn d18 + D_565_H .dn d19 +PREMULT_B .qn q10 +PREMULT_G .qn q11 +PREMULT_R .qn q12 +TMP_Q0 .qn q13 + TMP_D0 .dn d26 + TMP_D1 .dn d27 +TMP_Q1 .qn q14 + TMP_D2 .dn d28 + TMP_D3 .dn d29 + M_A .dn d30 + OPA .dn d31 + +.macro convert reg, bpp, intlv +.if bpp >= 31 + .if intlv + vzip.8 reg&_B, reg&_R @ BRBRBRBR GGGGGGGG BRBRBRBR AAAAAAAA + vzip.8 reg&_G, reg&_A @ BRBRBRBR GAGAGAGA BRBRBRBR GAGAGAGA + vzip.8 reg&_R, reg&_A @ BRBRBRBR GAGAGAGA BGRABGRA BGRABGRA + vzip.8 reg&_B, reg&_G @ BGRABGRA BGRABGRA BGRABGRA BGRABGRA + .else + vuzp.8 reg&_B, reg&_G @ BRBRBRBR GAGAGAGA BGRABGRA BGRABGRA + vuzp.8 reg&_R, reg&_A @ BRBRBRBR GAGAGAGA BRBRBRBR GAGAGAGA + vuzp.8 reg&_G, reg&_A @ BRBRBRBR GGGGGGGG BRBRBRBR AAAAAAAA + vuzp.8 reg&_B, reg&_R @ BBBBBBBB GGGGGGGG RRRRRRRR AAAAAAAA + .endif +.elseif bpp == 24 + .if intlv @ for init only (same B,G,R for all channel) + vzip.8 reg&_B, reg&_G @ BGBGBGBG BGBGBGBG RRRRRRRR + vzip.16 reg&_B, reg&_R @ BGRRBGRR BGBGBGBG BGRRBGRR + vsli.64 reg&_8888_L, reg&_8888_L, #24 @ BGRBGRRB BGBBGBGB + vsli.64 reg&_B, reg&_G, #48 @ BGRBGRBG + vsri.64 reg&_R, reg&_B, #8 @ GRBGRBGR + vsri.64 reg&_G, reg&_R, #8 @ RBGRBGRB + .endif +.elseif bpp == 16 + .if intlv + vshll.u8 reg&_565, reg&_R, #8 @ RRRrrRRR 00000000 + vshll.u8 TMP_Q0, reg&_G, #8 @ GGGgggGG 00000000 + vshll.u8 TMP_Q1, reg&_B, #8 @ BBBbbBBB 00000000 + vsri.16 reg&_565, TMP_Q0, #5 @ RRRrrGGG gggGG000 + vsri.16 reg&_565, TMP_Q1, #11 @ RRRrrGGG gggBBBbb + .else + vshr.u8 TMP_Q0, reg&_565, #3 @ 000RRRrr 000gggBB + vshrn.i16 reg&_G, reg&_565, #5 @ rrGGGggg + vshrn.i16 reg&_R, TMP_Q0, #5 @ RRRrr000 + vshl.i8 reg&_G, reg&_G, #2 @ GGGggg00 + vshl.i16 TMP_Q1, reg&_565, #3 @ rrGGGggg BBBbb000 + vsri.8 reg&_R, reg&_R, #5 @ RRRrrRRR + vmovn.i16 reg&_B, TMP_Q1 @ BBBbb000 + vsri.8 reg&_G, reg&_G, #6 @ GGGgggGG + vsri.8 reg&_B, reg&_B, #5 @ BBBbbBBB + .endif +.endif +.endm + +.macro ldst op, bpp, len, mem, reg, cvt, wb +.if bpp >= 31 + .if len == 8 + .if cvt + v&op&4.8 {reg&_B, reg&_G, reg&_R, reg&_A}, [mem&_ADDR]&wb + .else + v&op&1.32 {reg&_8888_L, reg&_8888_H}, [mem&_ADDR]&wb + .endif + .else + .if (op == st) && cvt + convert reg, bpp, 1 + .endif + .if len == 7 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! + v&op&1.32 {reg&_R}, [mem&_ADDR]! + v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! + .elseif len == 6 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! + v&op&1.32 {reg&_R}, [mem&_ADDR]! + .elseif len == 5 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! + v&op&1.32 {reg&_R[0]}, [mem&_ADDR]! + .elseif len == 4 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]&wb + .elseif len == 3 + v&op&1.32 {reg&_B}, [mem&_ADDR]! + v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! + .elseif len == 2 + v&op&1.32 {reg&_B}, [mem&_ADDR]&wb + .elseif len == 1 + v&op&1.32 {reg&_B[0]}, [mem&_ADDR]&wb + .else + .error "[32bpp]len should be 1~8" + .endif + .if (op == ld) && cvt + convert reg, bpp, 0 + .endif + .if (wb&1) && (len != 4) && (len != 2) && (len != 1) + sub mem&_ADDR, #4*len + .endif + .endif +.elseif bpp == 24 + .if len == 8 + .if cvt + v&op&3.8 {reg&_B, reg&_G, reg&_R}, [mem&_ADDR]&wb + .else + v&op&1.8 {reg&_B, reg&_G, reg&_R}, [mem&_ADDR]&wb + .endif + .elseif (len < 8) && (len > 0) + .if cvt + v&op&3.8 {reg&_B[0], reg&_G[0], reg&_R[0]}, [mem&_ADDR]! + .if len > 1 + v&op&3.8 {reg&_B[1], reg&_G[1], reg&_R[1]}, [mem&_ADDR]! + .endif + .if len > 2 + v&op&3.8 {reg&_B[2], reg&_G[2], reg&_R[2]}, [mem&_ADDR]! + .endif + .if len > 3 + v&op&3.8 {reg&_B[3], reg&_G[3], reg&_R[3]}, [mem&_ADDR]! + .endif + .if len > 4 + v&op&3.8 {reg&_B[4], reg&_G[4], reg&_R[4]}, [mem&_ADDR]! + .endif + .if len > 5 + v&op&3.8 {reg&_B[5], reg&_G[5], reg&_R[5]}, [mem&_ADDR]! + .endif + .if len > 6 + v&op&3.8 {reg&_B[6], reg&_G[6], reg&_R[6]}, [mem&_ADDR]! + .endif + .if wb&1 + sub mem&_ADDR, #3*len + .endif + .else + .if len == 7 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! + v&op&1.32 {reg&_R[0]}, [mem&_ADDR]! + v&op&1.8 {reg&_R[4]}, [mem&_ADDR]! + .elseif len == 6 + v&op&1.32 {reg&_8888_L}, [mem&_ADDR]! + v&op&1.16 {reg&_R[0]}, [mem&_ADDR]! + .elseif len == 5 + v&op&1.32 {reg&_B}, [mem&_ADDR]! + v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_G[2]}, [mem&_ADDR]! + v&op&1.8 {reg&_G[6]}, [mem&_ADDR]! + .elseif len == 4 + v&op&1.32 {reg&_B}, [mem&_ADDR]! + v&op&1.32 {reg&_G[0]}, [mem&_ADDR]! + .elseif len == 3 + v&op&1.32 {reg&_B}, [mem&_ADDR]! + v&op&1.8 {reg&_G[0]}, [mem&_ADDR]! + .elseif len == 2 + v&op&1.32 {reg&_B[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_B[2]}, [mem&_ADDR]! + .elseif len == 1 + v&op&1.16 {reg&_B[0]}, [mem&_ADDR]! + v&op&1.8 {reg&_B[2]}, [mem&_ADDR]! + .endif + .if wb&1 + sub mem&_ADDR, #3*len + .endif + .endif + .else + .error "[24bpp]len should be 1~8" + .endif +.elseif bpp == 16 + .if (op == st) && cvt + convert reg, bpp, 1 + .endif + .if len == 8 + v&op&1.16 {reg&_565}, [mem&_ADDR]&wb + .elseif len == 7 + v&op&1.16 {reg&_565_L}, [mem&_ADDR]! + v&op&1.32 {reg&_565_H[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_565_H[2]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #14 + .endif + .elseif len == 6 + v&op&1.16 {reg&_565_L}, [mem&_ADDR]! + v&op&1.32 {reg&_565_H[0]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #12 + .endif + .elseif len == 5 + v&op&1.16 {reg&_565_L}, [mem&_ADDR]! + v&op&1.16 {reg&_565_H[0]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #10 + .endif + .elseif len == 4 + v&op&1.16 {reg&_565_L}, [mem&_ADDR]&wb + .elseif len == 3 + v&op&1.32 {reg&_565_L[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_565_L[2]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #6 + .endif + .elseif len == 2 + v&op&1.32 {reg&_565_L[0]}, [mem&_ADDR]&wb + .elseif len == 1 + v&op&1.16 {reg&_565_L[0]}, [mem&_ADDR]&wb + .else + .error "[16bpp]len should be 1~8" + .endif + .if (op == ld) && cvt + convert reg, bpp, 0 + .endif +.elseif bpp == 8 + .if len == 8 + v&op&1.8 {reg&_A}, [mem&_ADDR]&wb + .elseif len == 7 + v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_A[2]}, [mem&_ADDR]! + v&op&1.8 {reg&_A[6]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #7 + .endif + .elseif len == 6 + v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! + v&op&1.16 {reg&_A[2]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #6 + .endif + .elseif len == 5 + v&op&1.32 {reg&_A[0]}, [mem&_ADDR]! + v&op&1.8 {reg&_A[4]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #5 + .endif + .elseif len == 4 + v&op&1.32 {reg&_A[0]}, [mem&_ADDR]&wb + .elseif len == 3 + v&op&1.16 {reg&_A[0]}, [mem&_ADDR]! + v&op&1.8 {reg&_A[2]}, [mem&_ADDR]! + .if wb&1 + sub mem&_ADDR, #3 + .endif + .elseif len == 2 + v&op&1.16 {reg&_A[0]}, [mem&_ADDR]&wb + .elseif len == 1 + v&op&1.8 {reg&_A[0]}, [mem&_ADDR]&wb + .else + .error "[8bpp]len should be 1~8" + .endif +.elseif (bpp == 0) && wb&1 + .if len == 8 + v&op&3.8 {reg&_B[], reg&_G[], reg&_R[]}, [mem&_ADDR] + .else + .error "[color]len should be 8" + .endif +.endif +.if (op == ld) && cvt && (bpp > 8) && (bpp < 32) + vmov.u8 reg&_A, #0xFF +.endif +.endm + +.macro premult alpha + vmull.u8 PREMULT_B, S_B, alpha + vmull.u8 PREMULT_G, S_G, alpha + vmull.u8 PREMULT_R, S_R, alpha +.endm + +.macro init src_bpp, dst_bpp, mask, opa + ldr DST_ADDR, [r0, #4] + ldr DST_W, [r0, #8] + ldr DST_H, [r0, #12] + ldr DST_STRIDE, [r0, #16] + ldr SRC_ADDR, [r0, #20] +.if src_bpp > 0 + ldr SRC_STRIDE, [r0, #24] +.endif +.if mask + ldr MASK_ADDR, [r0, #28] + ldr MASK_STRIDE, [r0, #32] + sub MASK_STRIDE, MASK_STRIDE, DST_W +.endif +.if opa + vld1.8 {OPA[]}, [r0] +.else + vmov.u8 OPA, #0xFF +.endif + + vmvn D_A, OPA +.if dst_bpp == 16 + sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1 +.elseif dst_bpp == 24 + sub DST_STRIDE, DST_STRIDE, DST_W + sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1 +.elseif dst_bpp >= 31 + sub DST_STRIDE, DST_STRIDE, DST_W, lsl #2 +.endif +.if src_bpp == 0 + .if mask || opa + ldst ld, src_bpp, 8, SRC, S, 1 + vmov.u8 S_A, #0xFF + premult OPA + .else + ldst ld, src_bpp, 8, SRC, D, 1 + vmov.u8 D_A, #0xFF + convert D, dst_bpp, 1 + .endif +.else +.if src_bpp == 16 + sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1 +.elseif src_bpp == 24 + sub SRC_STRIDE, SRC_STRIDE, DST_W + sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1 +.elseif src_bpp >= 31 + sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #2 +.endif +.endif + mvn FG_MASK, #0 + mvn BG_MASK, #0 +.endm + +@ input: M_A = 255 - fg.alpha +.macro calc_alpha len + vmov.u8 TMP_D0, #0xFD + vmvn D_A, D_A + vcge.u8 TMP_D1, S_A, TMP_D0 @ if (fg.alpha >= LV_OPA_MAX + vcge.u8 TMP_D2, D_A, TMP_D0 @ || bg.alpha <= LV_OPA_MIN) + vorr TMP_D2, TMP_D1 + vcge.u8 TMP_D3, M_A, TMP_D0 @ elseif (fg.alpha <= LV_OPA_MIN) + vmvn TMP_Q1, TMP_Q1 + vshrn.i16 TMP_D0, TMP_Q1, #4 + vmov FG_MASK, BG_MASK, TMP_D0 + cbz FG_MASK, 99f @ return fg; + vmull.u8 TMP_Q0, M_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha) + vqrshrn.u16 M_A, TMP_Q0, #8 + vbif M_A, D_A, TMP_D3 @ insert original D_A when fg.alpha <= LV_OPA_MIN + vmvn D_A, M_A + cbz BG_MASK, 99f @ return bg; + vmov.u8 TMP_D2, #0xFF + vmovl.u8 TMP_Q0, D_A + .if len > 4 + vmovl.u16 S_565, TMP_D1 + .endif + vmovl.u16 TMP_Q0, TMP_D0 + vmull.u8 TMP_Q1, S_A, TMP_D2 + vcvt.f32.u32 TMP_Q0, TMP_Q0 + .if len > 4 + vmovl.u16 D_565, TMP_D3 + vcvt.f32.u32 S_565, S_565 + .endif + vmovl.u16 TMP_Q1, TMP_D2 + vrecpe.f32 TMP_Q0, TMP_Q0 + vcvt.f32.u32 TMP_Q1, TMP_Q1 + .if len > 4 + vcvt.f32.u32 D_565, D_565 + vrecpe.f32 S_565, S_565 + .endif + vmul.f32 TMP_Q0, TMP_Q0, TMP_Q1 + .if len > 4 + vmul.f32 S_565, S_565, D_565 + .endif + vcvt.u32.f32 TMP_Q0, TMP_Q0 + .if len > 4 + vcvt.u32.f32 S_565, S_565 + .endif + vmovn.u32 TMP_D0, TMP_Q0 + .if len > 4 + vmovn.u32 TMP_D1, S_565 + .endif + vmovn.u16 TMP_D0, TMP_Q0 + premult TMP_D0 + vmvn M_A, TMP_D0 +99: +.endm + +.macro blend mode, dst_bpp +.if dst_bpp == 32 + vmov TMP_D0, FG_MASK, BG_MASK + vmovl.s8 TMP_Q0, TMP_D0 + vsli.8 TMP_Q0, TMP_Q0, #4 + cbz FG_MASK, 98f +.endif +.if mode == normal +.if dst_bpp == 32 + cbz BG_MASK, 97f + mvns BG_MASK, BG_MASK + beq 96f + vmov S_565_L, D_B + vmov S_565_H, D_G + vmov D_565_L, D_R +.endif +96: + vmlal.u8 PREMULT_B, D_B, M_A + vmlal.u8 PREMULT_G, D_G, M_A + vmlal.u8 PREMULT_R, D_R, M_A + vqrshrn.u16 D_B, PREMULT_B, #8 + vqrshrn.u16 D_G, PREMULT_G, #8 + vqrshrn.u16 D_R, PREMULT_R, #8 +.if dst_bpp == 32 + beq 97f + vbif D_B, S_565_L, TMP_D1 + vbif D_G, S_565_H, TMP_D1 + vbif D_R, D_565_L, TMP_D1 +97: + mvns FG_MASK, FG_MASK + beq 99f +.endif +.else + .error "blend mode is unsupported" +.endif +.if dst_bpp == 32 +98: + vbif D_B, S_B, TMP_D0 + vbif D_G, S_G, TMP_D0 + vbif D_R, S_R, TMP_D0 + vbif D_A, S_A, TMP_D0 +99: +.endif +.endm + +.macro process len, src_bpp, dst_bpp, mask, opa, mode +.if (src_bpp < 32) && (mask == 0) && (opa == 0) +@ no blend + .if src_bpp == 0 || src_bpp == dst_bpp + ldst ld, src_bpp, len, SRC, D, 0, ! + ldst st, dst_bpp, len, DST, D, 0, ! + .else + ldst ld, src_bpp, len, SRC, D, 1, ! + ldst st, dst_bpp, len, DST, D, 1, ! + .endif +.elseif src_bpp < 32 +@ no src_a + .if src_bpp > 0 + ldst ld, src_bpp, len, SRC, S, 1, ! + .endif + ldst ld, dst_bpp, len, DST, D, 1 + .if mask + ldst ld, 8, len, MASK, S, 1, ! + .if opa + vmull.u8 TMP_Q0, S_A, OPA + vqrshrn.u16 S_A, TMP_Q0, #8 + .endif + vmvn M_A, S_A + .if dst_bpp < 32 + premult S_A + .else + calc_alpha len + .endif + .else + vmvn M_A, OPA + .if dst_bpp < 32 + premult OPA + .else + vmov S_A, OPA + calc_alpha len + .endif + .endif + blend mode, dst_bpp + ldst st, dst_bpp, len, DST, D, 1, ! +.else +@ src_a (+mask) (+opa) + ldst ld, src_bpp, len, SRC, S, 1, ! + ldst ld, dst_bpp, len, DST, D, 1 + .if mask == 0 + .if opa + vmull.u8 TMP_Q0, S_A, OPA + vqrshrn.u16 S_A, TMP_Q0, #8 + .endif + .else + ldst ld, 8, len, MASK, M, 1, ! + vmull.u8 TMP_Q0, S_A, M_A + vqrshrn.u16 S_A, TMP_Q0, #8 + .if opa + vmull.u8 TMP_Q0, S_A, OPA + vqrshrn.u16 S_A, TMP_Q0, #8 + .endif + .endif + vmvn M_A, S_A + .if dst_bpp < 32 + premult S_A + .else + calc_alpha len + .endif + blend mode, dst_bpp + ldst st, dst_bpp, len, DST, D, 1, ! +.endif +.endm + +.macro tail src_bpp, dst_bpp, mask, opa, mode + tst DST_W, #4 + beq 3f + tst DST_W, #2 + beq 5f + tst DST_W, #1 + beq 6f + process 7, src_bpp, dst_bpp, mask, opa, mode + b 0f +6: + process 6, src_bpp, dst_bpp, mask, opa, mode + b 0f +5: + tst DST_W, #1 + beq 4f + process 5, src_bpp, dst_bpp, mask, opa, mode + b 0f +4: + process 4, src_bpp, dst_bpp, mask, opa, mode + b 0f +3: + tst DST_W, #2 + beq 1f + tst DST_W, #1 + beq 2f + process 3, src_bpp, dst_bpp, mask, opa, mode + b 0f +2: + process 2, src_bpp, dst_bpp, mask, opa, mode + b 0f +1: + process 1, src_bpp, dst_bpp, mask, opa, mode +0: +.endm + +.macro next src_bpp, mask + add DST_ADDR, DST_ADDR, DST_STRIDE +.if src_bpp + add SRC_ADDR, SRC_ADDR, SRC_STRIDE +.endif +.if mask + add MASK_ADDR, MASK_ADDR, MASK_STRIDE +.endif +.endm + +.macro enter + push {r4-r11, lr} +.endm + +.macro exit + pop {r4-r11, pc} +.endm + +.macro preload mem, bpp +.if bpp >= 31 + pld [mem&_ADDR, DST_W, lsl #2] +.elseif bpp == 24 + add W, DST_W, DST_W, lsl #1 + pld [mem&_ADDR, W] +.elseif bpp == 16 + pld [mem&_ADDR, DST_W, lsl #1] +.elseif bpp == 8 + pld [mem&_ADDR, DST_W] +.endif +.endm + +.macro blender src_bpp, dst_bpp, mask, opa, mode + enter + init src_bpp, dst_bpp, mask, opa + movs H, DST_H + beq 0f + preload SRC, src_bpp +.if mask || opa || (src_bpp == 32) + preload DST, dst_bpp +.endif + subs W, DST_W, #8 + blt 7f +9: + process 8, src_bpp, dst_bpp, mask, opa, mode + subs W, W, #8 + bge 9b + tst DST_W, #7 + beq 8f + tail src_bpp, dst_bpp, mask, opa, mode +8: + next src_bpp, mask + preload SRC, src_bpp +.if mask || opa || (src_bpp == 32) + preload DST, dst_bpp +.endif + sub W, DST_W, #8 + subs H, H, #1 + bgt 9b + exit +7: + tail src_bpp, dst_bpp, mask, opa, mode + next src_bpp, mask + subs H, H, #1 + bgt 7b + exit +.endm + +.macro export name, src_bpp, dst_bpp, mask, opa, mode +.thumb_func +.func name +.global name +name&: + blender src_bpp, dst_bpp, mask, opa, mode +.endfunc +.endm + +.macro export_set src, dst, src_bpp, dst_bpp, mode +.if src == color + export lv_&src&_blend_to_&dst&_neon, src_bpp, dst_bpp, 0, 0, mode + export lv_&src&_blend_to_&dst&_with_opa_neon, src_bpp, dst_bpp, 0, 1, mode + export lv_&src&_blend_to_&dst&_with_mask_neon, src_bpp, dst_bpp, 1, 0, mode + export lv_&src&_blend_to_&dst&_mix_mask_opa_neon, src_bpp, dst_bpp, 1, 1, mode +.else + export lv_&src&_blend_&mode&_to_&dst&_neon, src_bpp, dst_bpp, 0, 0, mode + export lv_&src&_blend_&mode&_to_&dst&_with_opa_neon, src_bpp, dst_bpp, 0, 1, mode + export lv_&src&_blend_&mode&_to_&dst&_with_mask_neon, src_bpp, dst_bpp, 1, 0, mode + export lv_&src&_blend_&mode&_to_&dst&_mix_mask_opa_neon, src_bpp, dst_bpp, 1, 1, mode +.endif +.endm + +export_set color, rgb565, 0, 16, normal +export_set rgb565, rgb565, 16, 16, normal +export_set rgb888, rgb565, 24, 16, normal +export_set xrgb8888, rgb565, 31, 16, normal +export_set argb8888, rgb565, 32, 16, normal +export_set color, rgb888, 0, 24, normal +export_set rgb565, rgb888, 16, 24, normal +export_set rgb888, rgb888, 24, 24, normal +export_set xrgb8888, rgb888, 31, 24, normal +export_set argb8888, rgb888, 32, 24, normal +export_set color, xrgb8888, 0, 31, normal +export_set rgb565, xrgb8888, 16, 31, normal +export_set rgb888, xrgb8888, 24, 31, normal +export_set xrgb8888, xrgb8888, 31, 31, normal +export_set argb8888, xrgb8888, 32, 31, normal +export_set color, argb8888, 0, 32, normal +export_set rgb565, argb8888, 16, 32, normal +export_set rgb888, argb8888, 24, 32, normal +export_set xrgb8888, argb8888, 31, 32, normal +export_set argb8888, argb8888, 32, 32, normal + +#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON*/ diff --git a/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h b/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h new file mode 100644 index 0000000..fbe7ea9 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h @@ -0,0 +1,1295 @@ +/** + * @file lv_blend_neon.h + * + */ + +#ifndef LV_BLEND_NEON_H +#define LV_BLEND_NEON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" + +#ifdef LV_DRAW_SW_NEON_CUSTOM_INCLUDE +#include LV_DRAW_SW_NEON_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +#if !defined(__ASSEMBLY__) + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ + _lv_color_blend_to_rgb565_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ + _lv_color_blend_to_rgb565_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ + _lv_color_blend_to_rgb565_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_color_blend_to_rgb565_mix_mask_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_with_mask_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_color_blend_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_neon(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ + _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ + _lv_color_blend_to_argb8888_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_color_blend_to_argb8888_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_color_blend_to_argb8888_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_color_blend_to_argb8888_mix_mask_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ + _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(dsc) +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t opa; + void * dst_buf; + uint32_t dst_w; + uint32_t dst_h; + uint32_t dst_stride; + const void * src_buf; + uint32_t src_stride; + const lv_opa_t * mask_buf; + uint32_t mask_stride; +} asm_dsc_t; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +extern void lv_color_blend_to_rgb565_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + lv_color_blend_to_rgb565_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + lv_color_blend_to_rgb565_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_rgb565_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_rgb565_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_rgb565_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_rgb565_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_rgb565_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_rgb565_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_neon(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_neon(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_with_opa_neon(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_with_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_with_mask_neon(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_with_mask_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_color_blend_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_color_blend_to_rgb888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_color_blend_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_neon(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_neon(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_neon(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_neon(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_neon(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_with_opa_neon(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_with_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_with_mask_neon(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_with_mask_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + lv_color_blend_to_argb8888_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + lv_color_blend_to_argb8888_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_argb8888_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_color_blend_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_color_blend_to_argb8888_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_argb8888_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_rgb565_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); + } + else { + lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_argb8888_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_with_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + lv_argb8888_blend_normal_to_argb8888_with_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_with_mask_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_argb8888_with_mask_neon(&asm_dsc); + return LV_RESULT_OK; +} + +extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(asm_dsc_t * dsc); +static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neon(&asm_dsc); + return LV_RESULT_OK; +} + +#endif /* !defined(__ASSEMBLY__) */ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_NEON_H*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw.c b/libraries/lvgl/src/draw/sw/lv_draw_sw.c new file mode 100644 index 0000000..4ced5d1 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw.c @@ -0,0 +1,628 @@ +/** + * @file lv_draw_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#if LV_USE_DRAW_SW + +#include "../../core/lv_refr.h" +#include "lv_draw_sw.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + #if LV_USE_THORVG_EXTERNAL + #include + #else + #include "../../libs/thorvg/thorvg_capi.h" + #endif +#endif + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "arm2d/lv_draw_sw_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_SW 1 + +#ifndef LV_DRAW_SW_RGB565_SWAP + #define LV_DRAW_SW_RGB565_SWAP(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_ARGB8888 + #define LV_DRAW_SW_ROTATE90_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_ARGB8888 + #define LV_DRAW_SW_ROTATE180_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_ARGB8888 + #define LV_DRAW_SW_ROTATE270_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_RGB888 + #define LV_DRAW_SW_ROTATE90_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_RGB888 + #define LV_DRAW_SW_ROTATE180_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_RGB888 + #define LV_DRAW_SW_ROTATE270_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_RGB565 + #define LV_DRAW_SW_ROTATE90_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_RGB565 + #define LV_DRAW_SW_ROTATE180_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_RGB565 + #define LV_DRAW_SW_ROTATE270_RGB565(...) LV_RESULT_INVALID +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_OS + static void render_thread_cb(void * ptr); +#endif + +static void execute_drawing(lv_draw_sw_unit_t * u); + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit); + +static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride); +static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride); +static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t srcWidth, int32_t srcHeight, int32_t srcStride, + int32_t dstStride); +static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t srcStride, + int32_t dstStride); +static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride); +static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride); + +/********************** + * STATIC VARIABLES + **********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_init(void) +{ + +#if LV_DRAW_SW_COMPLEX == 1 + lv_draw_sw_mask_init(); +#endif + + uint32_t i; + for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { + lv_draw_sw_unit_t * draw_sw_unit = lv_draw_create_unit(sizeof(lv_draw_sw_unit_t)); + draw_sw_unit->base_unit.dispatch_cb = dispatch; + draw_sw_unit->base_unit.evaluate_cb = evaluate; + draw_sw_unit->idx = i; + draw_sw_unit->base_unit.delete_cb = LV_USE_OS ? lv_draw_sw_delete : NULL; + +#if LV_USE_OS + lv_thread_init(&draw_sw_unit->thread, LV_THREAD_PRIO_HIGH, render_thread_cb, 8 * 1024, draw_sw_unit); +#endif + } + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + tvg_engine_init(TVG_ENGINE_SW, 0); +#endif +} + +void lv_draw_sw_deinit(void) +{ +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + tvg_engine_term(TVG_ENGINE_SW); +#endif + +#if LV_DRAW_SW_COMPLEX == 1 + lv_draw_sw_mask_deinit(); +#endif +} + +static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_OS + lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; + + LV_LOG_INFO("cancel software rendering thread"); + draw_sw_unit->exit_status = true; + + if(draw_sw_unit->inited) { + lv_thread_sync_signal(&draw_sw_unit->sync); + } + + return lv_thread_delete(&draw_sw_unit->thread); +#else + LV_UNUSED(draw_unit); + return 0; +#endif +} + +void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) +{ + if(LV_DRAW_SW_RGB565_SWAP(buf, buf_size_px) == LV_RESULT_OK) return; + + uint32_t u32_cnt = buf_size_px / 2; + uint16_t * buf16 = buf; + uint32_t * buf32 = buf; + + while(u32_cnt >= 8) { + buf32[0] = ((buf32[0] & 0xff00ff00) >> 8) | ((buf32[0] & 0x00ff00ff) << 8); + buf32[1] = ((buf32[1] & 0xff00ff00) >> 8) | ((buf32[1] & 0x00ff00ff) << 8); + buf32[2] = ((buf32[2] & 0xff00ff00) >> 8) | ((buf32[2] & 0x00ff00ff) << 8); + buf32[3] = ((buf32[3] & 0xff00ff00) >> 8) | ((buf32[3] & 0x00ff00ff) << 8); + buf32[4] = ((buf32[4] & 0xff00ff00) >> 8) | ((buf32[4] & 0x00ff00ff) << 8); + buf32[5] = ((buf32[5] & 0xff00ff00) >> 8) | ((buf32[5] & 0x00ff00ff) << 8); + buf32[6] = ((buf32[6] & 0xff00ff00) >> 8) | ((buf32[6] & 0x00ff00ff) << 8); + buf32[7] = ((buf32[7] & 0xff00ff00) >> 8) | ((buf32[7] & 0x00ff00ff) << 8); + buf32 += 8; + u32_cnt -= 8; + } + + while(u32_cnt) { + *buf32 = ((*buf32 & 0xff00ff00) >> 8) | ((*buf32 & 0x00ff00ff) << 8); + buf32++; + u32_cnt--; + } + + if(buf_size_px & 0x1) { + uint32_t e = buf_size_px - 1; + buf16[e] = ((buf16[e] & 0xff00) >> 8) | ((buf16[e] & 0x00ff) << 8); + } + +} + +void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_sride, + int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format) +{ + uint32_t px_bpp = lv_color_format_get_bpp(color_format); + if(rotation == LV_DISPLAY_ROTATION_90) { + if(px_bpp == 16) rotate90_rgb565(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 24) rotate90_rgb888(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 32) rotate90_argb8888(src, dest, src_width, src_height, src_sride, dest_stride); + } + else if(rotation == LV_DISPLAY_ROTATION_180) { + if(px_bpp == 16) rotate180_rgb565(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 24) rotate180_rgb888(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 32) rotate180_argb8888(src, dest, src_width, src_height, src_sride, dest_stride); + } + else if(rotation == LV_DISPLAY_ROTATION_270) { + if(px_bpp == 16) rotate270_rgb565(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 24) rotate270_rgb888(src, dest, src_width, src_height, src_sride, dest_stride); + if(px_bpp == 32) rotate270_argb8888(src, dest, src_width, src_height, src_sride, dest_stride); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static inline void execute_drawing_unit(lv_draw_sw_unit_t * u) +{ + execute_drawing(u); + + u->task_act->state = LV_DRAW_TASK_STATE_READY; + u->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); +} + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + switch(task->type) { + case LV_DRAW_TASK_TYPE_IMAGE: + case LV_DRAW_TASK_TYPE_LAYER: { + lv_draw_image_dsc_t * draw_dsc = task->draw_dsc; + + /* not support skew */ + if(draw_dsc->skew_x != 0 || draw_dsc->skew_y != 0) { + return 0; + } + + bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE ? true : false; + + bool masked = draw_dsc->bitmap_mask_src != NULL; + if(masked && transformed) return 0; + + lv_color_format_t cf = draw_dsc->header.cf; + if(masked && (cf == LV_COLOR_FORMAT_A8 || cf == LV_COLOR_FORMAT_RGB565A8)) { + return 0; + } + } + break; + default: + break; + } + + if(task->preference_score >= 100) { + task->preference_score = 100; + task->preferred_draw_unit_id = DRAW_UNIT_ID_SW; + } + + return 0; +} + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + LV_PROFILER_BEGIN; + lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; + + /*Return immediately if it's busy with draw task*/ + if(draw_sw_unit->task_act) { + LV_PROFILER_END; + return 0; + } + + lv_draw_task_t * t = NULL; + t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_SW); + if(t == NULL) { + LV_PROFILER_END; + return -1; + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) { + LV_PROFILER_END; + return -1; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_sw_unit->base_unit.target_layer = layer; + draw_sw_unit->base_unit.clip_area = &t->clip_area; + draw_sw_unit->task_act = t; + +#if LV_USE_OS + /*Let the render thread work*/ + if(draw_sw_unit->inited) lv_thread_sync_signal(&draw_sw_unit->sync); +#else + execute_drawing_unit(draw_sw_unit); +#endif + LV_PROFILER_END; + return 1; +} + +#if LV_USE_OS +static void render_thread_cb(void * ptr) +{ + lv_draw_sw_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + while(u->task_act == NULL) { + if(u->exit_status) { + break; + } + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("ready to exit software rendering thread"); + break; + } + + execute_drawing_unit(u); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("exit software rendering thread"); +} +#endif + +static void execute_drawing(lv_draw_sw_unit_t * u) +{ + LV_PROFILER_BEGIN; + /*Render the draw task*/ + lv_draw_task_t * t = u->task_act; + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_sw_fill((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_sw_border((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + lv_draw_sw_box_shadow((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_sw_label((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_sw_image((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_sw_arc((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_sw_line((lv_draw_unit_t *)u, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_sw_triangle((lv_draw_unit_t *)u, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_sw_layer((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + lv_draw_sw_mask_rect((lv_draw_unit_t *)u, t->draw_dsc, &t->area); + break; +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_sw_vector((lv_draw_unit_t *)u, t->draw_dsc); + break; +#endif + default: + break; + } + +#if LV_USE_PARALLEL_DRAW_DEBUG + /*Layers manage it for themselves*/ + if(t->type != LV_DRAW_TASK_TYPE_LAYER) { + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &t->area, u->base_unit.clip_area)) return; + + int32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != (lv_draw_unit_t *)u) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_palette_main(idx % _LV_PALETTE_LAST); + rect_dsc.border_color = rect_dsc.bg_color; + rect_dsc.bg_opa = LV_OPA_10; + rect_dsc.border_opa = LV_OPA_80; + rect_dsc.border_width = 1; + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.y1 = draw_area.y1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y1 + txt_size.y - 1; + + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_black(); + label_dsc.text = buf; + lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); + } +#endif + LV_PROFILER_END; +} + +static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + srcStride /= sizeof(uint32_t); + dstStride /= sizeof(uint32_t); + + for(int32_t x = 0; x < srcWidth; ++x) { + int32_t dstIndex = x * dstStride; + int32_t srcIndex = x; + for(int32_t y = 0; y < srcHeight; ++y) { + dst[dstIndex + (srcHeight - y - 1)] = src[srcIndex]; + srcIndex += srcStride; + } + } +} + +static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + LV_UNUSED(dest_stride); + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + src_stride /= sizeof(uint32_t); + + for(int32_t y = 0; y < height; ++y) { + int32_t dstIndex = (height - y - 1) * src_stride; + int32_t srcIndex = y * src_stride; + for(int32_t x = 0; x < width; ++x) { + dst[dstIndex + width - x - 1] = src[srcIndex + x]; + } + } +} + +static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + srcStride /= sizeof(uint32_t); + dstStride /= sizeof(uint32_t); + + for(int32_t x = 0; x < srcWidth; ++x) { + int32_t dstIndex = (srcWidth - x - 1); + int32_t srcIndex = x; + for(int32_t y = 0; y < srcHeight; ++y) { + dst[dstIndex * dstStride + y] = src[srcIndex]; + srcIndex += srcStride; + } + } +} + +static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t srcWidth, int32_t srcHeight, int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + for(int32_t x = 0; x < srcWidth; ++x) { + for(int32_t y = 0; y < srcHeight; ++y) { + int32_t srcIndex = y * srcStride + x * 3; + int32_t dstIndex = (srcWidth - x - 1) * dstStride + y * 3; + dst[dstIndex] = src[srcIndex]; /*Red*/ + dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ + dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ + } + } +} + +static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + for(int32_t y = 0; y < height; ++y) { + for(int32_t x = 0; x < width; ++x) { + int32_t srcIndex = y * src_stride + x * 3; + int32_t dstIndex = (height - y - 1) * dest_stride + (width - x - 1) * 3; + dst[dstIndex] = src[srcIndex]; + dst[dstIndex + 1] = src[srcIndex + 1]; + dst[dstIndex + 2] = src[srcIndex + 2]; + } + } +} + +static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + for(int32_t x = 0; x < width; ++x) { + for(int32_t y = 0; y < height; ++y) { + int32_t srcIndex = y * srcStride + x * 3; + int32_t dstIndex = x * dstStride + (height - y - 1) * 3; + dst[dstIndex] = src[srcIndex]; /*Red*/ + dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ + dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ + } + } +} + +static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + srcStride /= sizeof(uint16_t); + dstStride /= sizeof(uint16_t); + + for(int32_t x = 0; x < srcWidth; ++x) { + int32_t dstIndex = x * dstStride; + int32_t srcIndex = x; + for(int32_t y = 0; y < srcHeight; ++y) { + dst[dstIndex + (srcHeight - y - 1)] = src[srcIndex]; + srcIndex += srcStride; + } + } +} + +static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + src_stride /= sizeof(uint16_t); + dest_stride /= sizeof(uint16_t); + + for(int32_t y = 0; y < height; ++y) { + int32_t dstIndex = (height - y - 1) * dest_stride; + int32_t srcIndex = y * src_stride; + for(int32_t x = 0; x < width; ++x) { + dst[dstIndex + width - x - 1] = src[srcIndex + x]; + } + } +} + +static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, + int32_t srcStride, + int32_t dstStride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { + return ; + } + + srcStride /= sizeof(uint16_t); + dstStride /= sizeof(uint16_t); + + for(int32_t x = 0; x < srcWidth; ++x) { + int32_t dstIndex = (srcWidth - x - 1); + int32_t srcIndex = x; + for(int32_t y = 0; y < srcHeight; ++y) { + dst[dstIndex * dstStride + y] = src[srcIndex]; + srcIndex += srcStride; + } + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw.h b/libraries/lvgl/src/draw/sw/lv_draw_sw.h new file mode 100644 index 0000000..23f1c58 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw.h @@ -0,0 +1,212 @@ +/** + * @file lv_draw_sw.h + * + */ + +#ifndef LV_DRAW_SW_H +#define LV_DRAW_SW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../display/lv_display.h" +#include "../../osal/lv_os.h" + +#include "../../draw/lv_draw_vector.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; + volatile bool inited; + volatile bool exit_status; +#endif + uint32_t idx; +} lv_draw_sw_unit_t; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE +typedef struct { + uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; + int32_t cache_size; + int32_t cache_r; +} lv_draw_sw_shadow_cache_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the SW renderer. Called in internally. + * It creates as many SW renderers as defined in LV_DRAW_SW_DRAW_UNIT_CNT + */ +void lv_draw_sw_init(void); + +/** + * Deinitialize the SW renderers + */ +void lv_draw_sw_deinit(void); + +/** + * Fill an area using SW render. Handle gradient and radius. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle + */ +void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw border with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle + */ +void lv_draw_sw_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw box shadow with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle for which the box shadow should be drawn + */ +void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw an image with SW render. It handles image decoding, tiling, transformations, and recoloring. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the image + */ +void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +/** + * Draw a label with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the label + */ +void lv_draw_sw_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw an arc with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the arc + */ +void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw a line with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + */ +void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +/** + * Blend a layer with SW render + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the layer + */ +void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); + +/** + * Draw a triangle with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + */ +void lv_draw_sw_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +/** + * Mask out a rectangle with radius from a current layer + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + * @param coords the coordinates of the mask + */ +void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords); + +/** + * Used internally to get a transformed are of an image + * @param draw_unit pointer to a draw unit + * @param dest_area the area to calculate, i.e. get this area from the transformed image + * @param src_buf the source buffer + * @param src_w source buffer width in pixels + * @param src_h source buffer height in pixels + * @param src_stride source buffer stride in bytes + * @param dsc the draw descriptor + * @param sup supplementary data + * @param cf color format of the source buffer + * @param dest_buf the destination buffer + */ +void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG +/** + * Draw vector graphics with SW render. + * @param draw_unit pointer to a draw unit + * @param dsc the draw descriptor + */ +void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc); +#endif + +/** + * Swap the upper and lower byte of an RGB565 buffer. + * Might be required if a 8bit parallel port or an SPI port send the bytes in the wrong order. + * The bytes will be swapped in place. + * @param buf_size_px number of pixels in the buffer + */ +void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px); + +/** + * Rotate a buffer into an other buffer + * @param src the source buffer + * @param dest the destination buffer + * @param src_width source width in pixels + * @param src_height source height in pixels + * @param src_sride source stride in bytes (number of bytes in a row) + * @param dest_stride destination stride in bytes (number of bytes in a row) + * @param rotation LV_DISPLAY_ROTATION_0/90/180/270 + * @param color_format LV_COLOR_FORMAT_RGB565/RGB888/XRGB8888/ARGB8888 + */ +void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_sride, + int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#include "blend/lv_draw_sw_blend.h" + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_H*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_arc.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_arc.c new file mode 100644 index 0000000..5a205c1 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_arc.c @@ -0,0 +1,285 @@ +/** + * @file lv_draw_sw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW +#if LV_DRAW_SW_COMPLEX + +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw.h" + +static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, + lv_opa_t * mask_buf, int32_t width); +static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area); + +/********************* + * DEFINES + *********************/ +#define SPLIT_RADIUS_LIMIT 10 /*With radius greater than this the arc will drawn in quarters. A quarter is drawn only if there is arc in it*/ +#define SPLIT_ANGLE_GAP_LIMIT 60 /*With small gaps in the arc don't bother with splitting because there is nothing to skip.*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ +#if LV_DRAW_SW_COMPLEX + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->start_angle == dsc->end_angle) return; + + int32_t width = dsc->width; + if(width > dsc->radius) width = dsc->radius; + + lv_area_t area_out = *coords; + lv_area_t clipped_area; + if(!_lv_area_intersect(&clipped_area, &area_out, draw_unit->clip_area)) return; + + /*Draw a full ring*/ + if(dsc->img_src == NULL && + (dsc->start_angle + 360 == dsc->end_angle || dsc->start_angle == dsc->end_angle + 360)) { + lv_draw_border_dsc_t cir_dsc; + lv_draw_border_dsc_init(&cir_dsc); + cir_dsc.opa = dsc->opa; + cir_dsc.color = dsc->color; + cir_dsc.width = width; + cir_dsc.radius = LV_RADIUS_CIRCLE; + cir_dsc.side = LV_BORDER_SIDE_FULL; + lv_draw_sw_border(draw_unit, &cir_dsc, &area_out); + return; + } + + lv_area_t area_in; + lv_area_copy(&area_in, &area_out); + area_in.x1 += dsc->width; + area_in.y1 += dsc->width; + area_in.x2 -= dsc->width; + area_in.y2 -= dsc->width; + + int32_t start_angle = (int32_t)dsc->start_angle; + int32_t end_angle = (int32_t)dsc->end_angle; + while(start_angle >= 360) start_angle -= 360; + while(end_angle >= 360) end_angle -= 360; + + void * mask_list[4] = {0}; + /*Create an angle mask*/ + lv_draw_sw_mask_angle_param_t mask_angle_param; + lv_draw_sw_mask_angle_init(&mask_angle_param, dsc->center.x, dsc->center.y, start_angle, end_angle); + mask_list[0] = &mask_angle_param; + + /*Create an outer mask*/ + lv_draw_sw_mask_radius_param_t mask_out_param; + lv_draw_sw_mask_radius_init(&mask_out_param, &area_out, LV_RADIUS_CIRCLE, false); + mask_list[1] = &mask_out_param; + + /*Create inner the mask*/ + lv_draw_sw_mask_radius_param_t mask_in_param; + bool mask_in_param_valid = false; + if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) { + lv_draw_sw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true); + mask_list[2] = &mask_in_param; + mask_in_param_valid = true; + } + + int32_t blend_h = lv_area_get_height(&clipped_area); + int32_t blend_w = lv_area_get_width(&clipped_area); + int32_t h; + lv_opa_t * mask_buf = lv_malloc(blend_w); + + lv_area_t blend_area = clipped_area; + lv_area_t img_area; + lv_draw_sw_blend_dsc_t blend_dsc = {0}; + blend_dsc.mask_buf = mask_buf; + blend_dsc.opa = dsc->opa; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + lv_image_decoder_dsc_t decoder_dsc; + if(dsc->img_src == NULL) { + blend_dsc.color = dsc->color; + } + else { + lv_image_decoder_open(&decoder_dsc, dsc->img_src, NULL); + img_area.x1 = 0; + img_area.y1 = 0; + img_area.x2 = decoder_dsc.decoded->header.w - 1; + img_area.y2 = decoder_dsc.decoded->header.h - 1; + int32_t ofs = decoder_dsc.decoded->header.w / 2; + lv_area_move(&img_area, dsc->center.x - ofs, dsc->center.y - ofs); + blend_dsc.src_area = &img_area; + blend_dsc.src_buf = decoder_dsc.decoded->data; + blend_dsc.src_color_format = decoder_dsc.decoded->header.cf; + blend_dsc.src_stride = decoder_dsc.decoded->header.stride; + } + + lv_opa_t * circle_mask = NULL; + lv_area_t round_area_1; + lv_area_t round_area_2; + if(dsc->rounded) { + circle_mask = lv_malloc(width * width); + lv_memset(circle_mask, 0xff, width * width); + lv_area_t circle_area = {0, 0, width - 1, width - 1}; + lv_draw_sw_mask_radius_param_t circle_mask_param; + lv_draw_sw_mask_radius_init(&circle_mask_param, &circle_area, width / 2, false); + void * circle_mask_list[2] = {&circle_mask_param, NULL}; + + lv_opa_t * circle_mask_tmp = circle_mask; + for(h = 0; h < width; h++) { + lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(circle_mask_list, circle_mask_tmp, 0, h, width); + if(res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(circle_mask_tmp, width); + } + + circle_mask_tmp += width; + } + get_rounded_area(start_angle, dsc->radius, width, &round_area_1); + lv_area_move(&round_area_1, dsc->center.x, dsc->center.y); + get_rounded_area(end_angle, dsc->radius, width, &round_area_2); + lv_area_move(&round_area_2, dsc->center.x, dsc->center.y); + + } + + blend_area.y2 = blend_area.y1; + for(h = 0; h < blend_h; h++) { + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, blend_area.y1, blend_w); + + if(dsc->rounded) { + if(blend_area.y1 >= round_area_1.y1 && blend_area.y1 <= round_area_1.y2) { + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(mask_buf, blend_w); + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + add_circle(circle_mask, &blend_area, &round_area_1, mask_buf, width); + } + if(blend_area.y1 >= round_area_2.y1 && blend_area.y1 <= round_area_2.y2) { + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(mask_buf, blend_w); + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + add_circle(circle_mask, &blend_area, &round_area_2, mask_buf, width); + } + } + + lv_draw_sw_blend(draw_unit, &blend_dsc); + + blend_area.y1 ++; + blend_area.y2 ++; + } + + lv_draw_sw_mask_free_param(&mask_angle_param); + lv_draw_sw_mask_free_param(&mask_out_param); + if(mask_in_param_valid) { + lv_draw_sw_mask_free_param(&mask_in_param); + } + + lv_free(mask_buf); + if(dsc->img_src) lv_image_decoder_close(&decoder_dsc); + if(circle_mask) lv_free(circle_mask); +#else + LV_LOG_WARN("Can't draw arc with LV_DRAW_SW_COMPLEX == 0"); + LV_UNUSED(center); + LV_UNUSED(radius); + LV_UNUSED(start_angle); + LV_UNUSED(end_angle); + LV_UNUSED(layer); + LV_UNUSED(dsc); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, + lv_opa_t * mask_buf, int32_t width) +{ + lv_area_t circle_common_area; + if(_lv_area_intersect(&circle_common_area, circle_area, blend_area)) { + const lv_opa_t * circle_mask_tmp = circle_mask + width * (circle_common_area.y1 - circle_area->y1); + circle_mask_tmp += circle_common_area.x1 - circle_area->x1; + + lv_opa_t * mask_buf_tmp = mask_buf + circle_common_area.x1 - blend_area->x1; + + uint32_t x; + uint32_t w = lv_area_get_width(&circle_common_area); + for(x = 0; x < w; x++) { + uint32_t res = mask_buf_tmp[x] + circle_mask_tmp[x]; + mask_buf_tmp[x] = res > 255 ? 255 : res; + } + } + +} + +static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area) +{ + int32_t thick_half = thickness / 2; + uint8_t thick_corr = (thickness & 0x01) ? 0 : 1; + + int32_t cir_x; + int32_t cir_y; + + cir_x = ((radius - thick_half) * lv_trigo_cos(angle)) >> (LV_TRIGO_SHIFT - 8); + cir_y = ((radius - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - 8); + + /*The center of the pixel need to be calculated so apply 1/2 px offset*/ + if(cir_x > 0) { + cir_x = (cir_x - 128) >> 8; + res_area->x1 = cir_x - thick_half + thick_corr; + res_area->x2 = cir_x + thick_half; + } + else { + cir_x = (cir_x + 128) >> 8; + res_area->x1 = cir_x - thick_half; + res_area->x2 = cir_x + thick_half - thick_corr; + } + + if(cir_y > 0) { + cir_y = (cir_y - 128) >> 8; + res_area->y1 = cir_y - thick_half + thick_corr; + res_area->y2 = cir_y + thick_half; + } + else { + cir_y = (cir_y + 128) >> 8; + res_area->y1 = cir_y - thick_half; + res_area->y2 = cir_y + thick_half - thick_corr; + } +} + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + LV_UNUSED(coords); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_border.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_border.c new file mode 100644 index 0000000..c7f1191 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_border.c @@ -0,0 +1,332 @@ +/** + * @file lv_draw_sw_border.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "blend/lv_draw_sw_blend.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ +#define SPLIT_LIMIT 50 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void draw_border_complex(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); + +static void draw_border_simple(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->side == LV_BORDER_SIDE_NONE) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); + area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); + area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); + area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); + + int32_t rin = rout - dsc->width; + if(rin < 0) rin = 0; + + if(rout == 0 && rin == 0) { + draw_border_simple(draw_unit, coords, &area_inner, dsc->color, dsc->opa); + } + else { + draw_border_complex(draw_unit, coords, &area_inner, rout, rin, dsc->color, dsc->opa); + } + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +void draw_border_complex(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) +{ +#if LV_DRAW_SW_COMPLEX + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `coords`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, outer_area, draw_unit->clip_area)) return; + int32_t draw_area_w = lv_area_get_width(&draw_area); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + lv_opa_t * mask_buf = lv_malloc(draw_area_w); + blend_dsc.mask_buf = mask_buf; + + void * mask_list[3] = {0}; + + /*Create mask for the inner mask*/ + lv_draw_sw_mask_radius_param_t mask_rin_param; + lv_draw_sw_mask_radius_init(&mask_rin_param, inner_area, rin, true); + mask_list[0] = &mask_rin_param; + + /*Create mask for the outer area*/ + lv_draw_sw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_sw_mask_radius_init(&mask_rout_param, outer_area, rout, false); + mask_list[1] = &mask_rout_param; + } + + int32_t h; + lv_area_t blend_area; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.color = color; + blend_dsc.opa = opa; + + /*Calculate the x and y coordinates where the straight parts area is*/ + lv_area_t core_area; + core_area.x1 = LV_MAX(outer_area->x1 + rout, inner_area->x1); + core_area.x2 = LV_MIN(outer_area->x2 - rout, inner_area->x2); + core_area.y1 = LV_MAX(outer_area->y1 + rout, inner_area->y1); + core_area.y2 = LV_MIN(outer_area->y2 - rout, inner_area->y2); + int32_t core_w = lv_area_get_width(&core_area); + + bool top_side = outer_area->y1 <= inner_area->y1; + bool bottom_side = outer_area->y2 >= inner_area->y2; + + /*No masks*/ + bool left_side = outer_area->x1 <= inner_area->x1; + bool right_side = outer_area->x2 >= inner_area->x2; + + bool split_hor = true; + if(left_side && right_side && top_side && bottom_side && + core_w < SPLIT_LIMIT) { + split_hor = false; + } + + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + /*Draw the straight lines first if they are long enough*/ + if(top_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = outer_area->y1; + blend_area.y2 = inner_area->y1 - 1; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + if(bottom_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = inner_area->y2 + 1; + blend_area.y2 = outer_area->y2; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + /*If the border is very thick and the vertical sides overlap horizontally draw a single rectangle*/ + if(inner_area->x1 >= inner_area->x2 && left_side && right_side) { + blend_area.x1 = outer_area->x1; + blend_area.x2 = outer_area->x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + else { + if(left_side) { + blend_area.x1 = outer_area->x1; + blend_area.x2 = inner_area->x1 - 1; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + if(right_side) { + blend_area.x1 = inner_area->x2 + 1; + blend_area.x2 = outer_area->x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + + /*Draw the corners*/ + int32_t blend_w; + + /*Left and right corner together if they are close to each other*/ + if(!split_hor) { + /*Calculate the top corner and mirror it to the bottom*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = draw_area.x2; + int32_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1); + for(h = 0; h < max_h; h++) { + int32_t top_y = outer_area->y1 + h; + int32_t bottom_y = outer_area->y2 - h; + if(top_y < draw_area.y1 && bottom_y > draw_area.y2) continue; /*This line is clipped now*/ + + lv_memset(mask_buf, 0xff, draw_area_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, draw_area_w); + + if(top_y >= draw_area.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + if(bottom_y <= draw_area.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + else { + /*Left corners*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); + blend_w = lv_area_get_width(&blend_area); + if(blend_w > 0) { + if(left_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + + if(left_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + + /*Right corners*/ + blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ + blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); + + blend_area.x2 = draw_area.x2; + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + if(right_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + + if(right_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + } + + lv_draw_sw_mask_free_param(&mask_rin_param); + if(rout > 0) lv_draw_sw_mask_free_param(&mask_rout_param); + lv_free(mask_buf); + +#endif /*LV_DRAW_SW_COMPLEX*/ +} +static void draw_border_simple(lv_draw_unit_t * draw_unit, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa) +{ + lv_area_t a; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.blend_area = &a; + blend_dsc.color = color; + blend_dsc.opa = opa; + + bool top_side = outer_area->y1 <= inner_area->y1; + bool bottom_side = outer_area->y2 >= inner_area->y2; + bool left_side = outer_area->x1 <= inner_area->x1; + bool right_side = outer_area->x2 >= inner_area->x2; + + /*Top*/ + a.x1 = outer_area->x1; + a.x2 = outer_area->x2; + a.y1 = outer_area->y1; + a.y2 = inner_area->y1 - 1; + if(top_side) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + /*Bottom*/ + a.y1 = inner_area->y2 + 1; + a.y2 = outer_area->y2; + if(bottom_side) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + /*Left*/ + a.x1 = outer_area->x1; + a.x2 = inner_area->x1 - 1; + a.y1 = (top_side) ? inner_area->y1 : outer_area->y1; + a.y2 = (bottom_side) ? inner_area->y2 : outer_area->y2; + if(left_side) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + /*Right*/ + a.x1 = inner_area->x2 + 1; + a.x2 = outer_area->x2; + if(right_side) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c new file mode 100644 index 0000000..67b9332 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c @@ -0,0 +1,740 @@ +/** + * @file lv_draw_sw_box_shadow.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_COMPLEX + +#include "blend/lv_draw_sw_blend.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_math.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ +#define SHADOW_UPSCALE_SHIFT 6 +#define SHADOW_ENHANCE 1 + +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + #define shadow_cache LV_GLOBAL_DEFAULT()->sw_shadow_cache +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t s, + int32_t r); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; + core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; + core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; + core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; + + lv_opa_t opa = dsc->opa; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; + + /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ + lv_area_t bg_area; + lv_area_copy(&bg_area, coords); + lv_area_increase(&bg_area, -1, -1); + + /*Get the clamped radius*/ + int32_t r_bg = dsc->radius; + int32_t short_side = LV_MIN(lv_area_get_width(&bg_area), lv_area_get_height(&bg_area)); + if(r_bg > short_side >> 1) r_bg = short_side >> 1; + + /*Get the clamped radius*/ + int32_t r_sh = dsc->radius; + short_side = LV_MIN(lv_area_get_width(&core_area), lv_area_get_height(&core_area)); + if(r_sh > short_side >> 1) r_sh = short_side >> 1; + + /*Get how many pixels are affected by the blur on the corners*/ + int32_t corner_size = dsc->width + r_sh; + + lv_opa_t * sh_buf; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE + lv_draw_sw_shadow_cache_t * cache = &shadow_cache; + if(cache->cache_size == corner_size && cache->cache_r == r_sh) { + /*Use the cache if available*/ + sh_buf = lv_malloc(corner_size * corner_size); + lv_memcpy(sh_buf, cache->cache, corner_size * corner_size); + } + else { + /*A larger buffer is required for calculation*/ + sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); + + /*Cache the corner if it fits into the cache size*/ + if((uint32_t)corner_size * corner_size < sizeof(cache->cache)) { + lv_memcpy(cache->cache, sh_buf, corner_size * corner_size); + cache->cache_size = corner_size; + cache->cache_r = r_sh; + } + } +#else + sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); +#endif /*LV_DRAW_SW_SHADOW_CACHE_SIZE*/ + + /*Skip a lot of masking if the background will cover the shadow that would be masked out*/ + bool simple = dsc->bg_cover; + + /*Create a radius mask to clip remove shadow on the bg area*/ + + lv_draw_sw_mask_radius_param_t mask_rout_param; + void * masks[2] = {0}; + if(!simple) { + lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_area, r_bg, true); + masks[0] = &mask_rout_param; + } + + lv_opa_t * mask_buf = lv_malloc(lv_area_get_width(&shadow_area)); + lv_area_t blend_area; + lv_area_t clip_area_sub; + lv_opa_t * sh_buf_tmp; + int32_t y; + bool simple_sub; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_buf = mask_buf; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + int32_t w_half = shadow_area.x1 + lv_area_get_width(&shadow_area) / 2; + int32_t h_half = shadow_area.y1 + lv_area_get_height(&shadow_area) / 2; + + /*Draw the corners if they are on the current clip area and not fully covered by the bg*/ + + /*Top right corner*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other top corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - shadow_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom right corner. + *Almost the same as top right just read the lines of `sh_buf` from then end*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Top side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : LV_OPA_MIX2(sh_buf_tmp[0], dsc->opa); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + sh_buf_tmp += corner_size; + } + } + } + blend_dsc.opa = dsc->opa; /*Restore*/ + + /*Bottom side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + if(w > 0) { + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : (sh_buf_tmp[0] * dsc->opa) >> 8; + lv_draw_sw_blend(draw_unit, &blend_dsc); + + } + sh_buf_tmp += corner_size; + } + } + } + + blend_dsc.opa = dsc->opa; /*Restore*/ + + /*Right side*/ + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.x2 = shadow_area.x2; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + + /*Mirror the shadow corner buffer horizontally*/ + sh_buf_tmp = sh_buf ; + for(y = 0; y < corner_size; y++) { + int32_t x; + lv_opa_t * start = sh_buf_tmp; + lv_opa_t * end = sh_buf_tmp + corner_size - 1; + for(x = 0; x < corner_size / 2; x++) { + lv_opa_t tmp = *start; + *start = *end; + *end = tmp; + + start++; + end--; + } + sh_buf_tmp += corner_size; + } + + /*Left side*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + + /*Top left corner*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other corners*/ + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + + lv_draw_sw_blend(draw_unit, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom left corner. + *Almost the same as bottom right just read the lines of `sh_buf` from then end*/ + blend_area.x1 = shadow_area.x1 ; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && _lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Draw the center rectangle.*/ + blend_area.x1 = shadow_area.x1 + corner_size ; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_dsc.mask_buf = mask_buf; + + if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_unit->clip_area) && + !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + lv_memset(mask_buf, 0xff, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + } + + if(!simple) { + lv_draw_sw_mask_free_param(&mask_rout_param); + } + lv_free(sh_buf); + lv_free(mask_buf); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Calculate a blurred corner + * @param coords Coordinates of the shadow + * @param sh_buf a buffer to store the result. Its size should be `(sw + r)^2 * 2` + * @param sw shadow width + * @param r radius + */ +static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t sw, + int32_t r) +{ + int32_t sw_ori = sw; + int32_t size = sw_ori + r; + + lv_area_t sh_area; + lv_area_copy(&sh_area, coords); + sh_area.x2 = sw / 2 + r - 1 - ((sw & 1) ? 0 : 1); + sh_area.y1 = sw / 2 + 1; + + sh_area.x1 = sh_area.x2 - lv_area_get_width(coords); + sh_area.y2 = sh_area.y1 + lv_area_get_height(coords); + + lv_draw_sw_mask_radius_param_t mask_param; + lv_draw_sw_mask_radius_init(&mask_param, &sh_area, r, false); + +#if SHADOW_ENHANCE + /*Set half shadow width width because blur will be repeated*/ + if(sw_ori == 1) sw = 1; + else sw = sw_ori >> 1; +#endif /*SHADOW_ENHANCE*/ + + int32_t y; + lv_opa_t * mask_line = lv_malloc(size); + uint16_t * sh_ups_tmp_buf = (uint16_t *)sh_buf; + for(y = 0; y < size; y++) { + lv_memset(mask_line, 0xff, size); + lv_draw_sw_mask_res_t mask_res = mask_param.dsc.cb(mask_line, 0, y, size, &mask_param); + if(mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(sh_ups_tmp_buf, size * sizeof(sh_ups_tmp_buf[0])); + } + else { + int32_t i; + sh_ups_tmp_buf[0] = (mask_line[0] << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 1; i < size; i++) { + if(mask_line[i] == mask_line[i - 1]) sh_ups_tmp_buf[i] = sh_ups_tmp_buf[i - 1]; + else sh_ups_tmp_buf[i] = (mask_line[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + } + + sh_ups_tmp_buf += size; + } + lv_free(mask_line); + + lv_draw_sw_mask_free_param(&mask_param); + + if(sw == 1) { + int32_t i; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(i = 0; i < size * size; i++) { + res_buf[i] = (sh_buf[i] >> SHADOW_UPSCALE_SHIFT); + } + return; + } + + shadow_blur_corner(size, sw, sh_buf); + +#if SHADOW_ENHANCE == 0 + /*The result is required in lv_opa_t not uint16_t*/ + uint32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = sh_buf[x]; + } +#else + sw += sw_ori & 1; + if(sw > 1) { + uint32_t i; + uint32_t max_v_div = (LV_OPA_COVER << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_buf[i] == 0) continue; + else if(sh_buf[i] == LV_OPA_COVER) sh_buf[i] = max_v_div; + else sh_buf[i] = (sh_buf[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + + shadow_blur_corner(size, sw, sh_buf); + } + int32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = (lv_opa_t) sh_buf[x]; + } +#endif + +} + +static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf) +{ + int32_t s_left = sw >> 1; + int32_t s_right = (sw >> 1); + if((sw & 1) == 0) s_left--; + + /*Horizontal blur*/ + uint16_t * sh_ups_blur_buf = lv_malloc(size * sizeof(uint16_t)); + + int32_t x; + int32_t y; + + uint16_t * sh_ups_tmp_buf = sh_ups_buf; + + for(y = 0; y < size; y++) { + int32_t v = sh_ups_tmp_buf[size - 1] * sw; + for(x = size - 1; x >= 0; x--) { + sh_ups_blur_buf[x] = v; + + /*Forget the right pixel*/ + uint32_t right_val = 0; + if(x + s_right < size) right_val = sh_ups_tmp_buf[x + s_right]; + v -= right_val; + + /*Add the left pixel*/ + uint32_t left_val; + if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0]; + else left_val = sh_ups_tmp_buf[x - s_left - 1]; + v += left_val; + } + lv_memcpy(sh_ups_tmp_buf, sh_ups_blur_buf, size * sizeof(uint16_t)); + sh_ups_tmp_buf += size; + } + + /*Vertical blur*/ + uint32_t i; + uint32_t max_v = LV_OPA_COVER << SHADOW_UPSCALE_SHIFT; + uint32_t max_v_div = max_v / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_ups_buf[i] == 0) continue; + else if(sh_ups_buf[i] == max_v) sh_ups_buf[i] = max_v_div; + else sh_ups_buf[i] = sh_ups_buf[i] / sw; + } + + for(x = 0; x < size; x++) { + sh_ups_tmp_buf = &sh_ups_buf[x]; + int32_t v = sh_ups_tmp_buf[0] * sw; + for(y = 0; y < size ; y++, sh_ups_tmp_buf += size) { + sh_ups_blur_buf[y] = v < 0 ? 0 : (v >> SHADOW_UPSCALE_SHIFT); + + /*Forget the top pixel*/ + uint32_t top_val; + if(y - s_right <= 0) top_val = sh_ups_tmp_buf[0]; + else top_val = sh_ups_buf[(y - s_right) * size + x]; + v -= top_val; + + /*Add the bottom pixel*/ + uint32_t bottom_val; + if(y + s_left + 1 < size) bottom_val = sh_ups_buf[(y + s_left + 1) * size + x]; + else bottom_val = sh_ups_buf[(size - 1) * size + x]; + v += bottom_val; + } + + /*Write back the result into `sh_ups_buf`*/ + sh_ups_tmp_buf = &sh_ups_buf[x]; + for(y = 0; y < size; y++, sh_ups_tmp_buf += size) { + (*sh_ups_tmp_buf) = sh_ups_blur_buf[y]; + } + } + + lv_free(sh_ups_blur_buf); +} + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + LV_UNUSED(coords); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ + +#endif /*LV_DRAW_USE_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_fill.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_fill.c new file mode 100644 index 0000000..027f304 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_fill.c @@ -0,0 +1,224 @@ +/** + * @file lv_draw_sw_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "blend/lv_draw_sw_blend.h" +#include "lv_draw_sw_gradient.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_unit->clip_area)) return; + + lv_grad_dir_t grad_dir = dsc->grad.dir; + lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->color : dsc->grad.stops[0].color; + + lv_draw_sw_blend_dsc_t blend_dsc = {0}; + blend_dsc.color = bg_color; + + /*Most simple case: just a plain rectangle*/ + if(dsc->radius == 0 && (grad_dir == LV_GRAD_DIR_NONE)) { + blend_dsc.blend_area = &bg_coords; + blend_dsc.opa = dsc->opa; + lv_draw_sw_blend(draw_unit, &blend_dsc); + return; + } + + /*Complex case: there is gradient, mask, or radius*/ +#if LV_DRAW_SW_COMPLEX == 0 + LV_LOG_WARN("Can't draw complex rectangle because LV_DRAW_SW_COMPLEX = 0"); +#else + lv_opa_t opa = dsc->opa >= LV_OPA_MAX ? LV_OPA_COVER : dsc->opa; + + /*Get the real radius. Can't be larger than the half of the shortest side */ + int32_t coords_bg_w = lv_area_get_width(&bg_coords); + int32_t coords_bg_h = lv_area_get_height(&bg_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t rout = LV_MIN(dsc->radius, short_side >> 1); + + /*Add a radius mask if there is a radius*/ + int32_t clipped_w = lv_area_get_width(&clipped_coords); + lv_opa_t * mask_buf = NULL; + lv_draw_sw_mask_radius_param_t mask_rout_param; + void * mask_list[2] = {NULL, NULL}; + if(rout > 0) { + mask_buf = lv_malloc(clipped_w); + lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_coords, rout, false); + mask_list[0] = &mask_rout_param; + } + + int32_t h; + + lv_area_t blend_area; + blend_area.x1 = clipped_coords.x1; + blend_area.x2 = clipped_coords.x2; + + blend_dsc.mask_buf = mask_buf; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.opa = LV_OPA_COVER; + + /*Get gradient if appropriate*/ + lv_grad_t * grad = lv_gradient_get(&dsc->grad, coords_bg_w, coords_bg_h); + lv_opa_t * grad_opa_map = NULL; + if(grad && grad_dir == LV_GRAD_DIR_HOR) { + blend_dsc.src_area = &blend_area; + blend_dsc.src_buf = grad->color_map + clipped_coords.x1 - bg_coords.x1; + bool transp = false; + uint32_t s; + for(s = 0; s < dsc->grad.stops_count; s++) { + if(dsc->grad.stops[s].opa != LV_OPA_COVER) { + transp = true; + break; + } + } + + if(transp) grad_opa_map = grad->opa_map + clipped_coords.x1 - bg_coords.x1; + + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; + } + + /* Draw the top of the rectangle line by line and mirror it to the bottom. */ + for(h = 0; h < rout; h++) { + int32_t top_y = bg_coords.y1 + h; + int32_t bottom_y = bg_coords.y2 - h; + if(top_y < clipped_coords.y1 && bottom_y > clipped_coords.y2) continue; /*This line is clipped now*/ + + /* Initialize the mask to opa instead of 0xFF and blend with LV_OPA_COVER. + * It saves calculating the final opa in lv_draw_sw_blend*/ + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, clipped_w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + + bool hor_grad_processed = false; + if(top_y >= clipped_coords.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + + if(grad_dir == LV_GRAD_DIR_VER) { + blend_dsc.color = grad->color_map[top_y - bg_coords.y1]; + blend_dsc.opa = grad->opa_map[top_y - bg_coords.y1]; + } + else if(grad_dir == LV_GRAD_DIR_HOR) { + hor_grad_processed = true; + if(grad_opa_map) { + int32_t i; + for(i = 0; i < clipped_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; + } + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + if(bottom_y <= clipped_coords.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + + if(grad_dir == LV_GRAD_DIR_VER) { + blend_dsc.color = grad->color_map[bottom_y - bg_coords.y1]; + blend_dsc.opa = grad->opa_map[bottom_y - bg_coords.y1]; + } + else if(hor_grad_processed == false && grad_dir == LV_GRAD_DIR_HOR) { + if(grad_opa_map) { + int32_t i; + for(i = 0; i < clipped_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; + } + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + + /* Draw the center of the rectangle.*/ + + /*If no gradient, the center is a simple rectangle*/ + if(grad_dir == LV_GRAD_DIR_NONE) { + blend_area.y1 = bg_coords.y1 + rout; + blend_area.y2 = bg_coords.y2 - rout; + blend_dsc.opa = opa; + blend_dsc.mask_buf = NULL; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + /*With gradient draw line by line*/ + else { + blend_dsc.opa = opa; + if(grad_dir == LV_GRAD_DIR_VER) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else if(grad_dir == LV_GRAD_DIR_HOR) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.mask_buf = grad_opa_map; + } + + int32_t h_end = bg_coords.y2 - rout; + for(h = bg_coords.y1 + rout; h <= h_end; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + if(grad_dir == LV_GRAD_DIR_VER) { + blend_dsc.color = grad->color_map[h - bg_coords.y1]; + if(opa >= LV_OPA_MAX) blend_dsc.opa = grad->opa_map[h - bg_coords.y1]; + else blend_dsc.opa = LV_OPA_MIX2(grad->opa_map[h - bg_coords.y1], opa); + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + } + + if(mask_buf) { + lv_free(mask_buf); + lv_draw_sw_mask_free_param(&mask_rout_param); + } + if(grad) { + lv_gradient_cleanup(grad); + } + +#endif +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.c new file mode 100644 index 0000000..2e85564 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.c @@ -0,0 +1,140 @@ +/** + * @file lv_draw_sw_gradient.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_gradient.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_types.h" +#include "../../osal/lv_os.h" + +/********************* + * DEFINES + *********************/ +#define GRAD_CM(r,g,b) lv_color_make(r,g,b) +#define GRAD_CONV(t, x) t = x + +#undef ALIGN +#if defined(LV_ARCH_64) + #define ALIGN(X) (((X) + 7) & ~7) +#else + #define ALIGN(X) (((X) + 3) & ~3) +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +typedef lv_result_t (*op_cache_t)(lv_grad_t * c, void * ctx); +static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h); + +/********************** + * STATIC VARIABLE + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h) +{ + int32_t size = g->dir == LV_GRAD_DIR_HOR ? w : h; + + size_t req_size = ALIGN(sizeof(lv_grad_t)) + ALIGN(size * sizeof(lv_color_t)) + ALIGN(size * sizeof(lv_opa_t)); + lv_grad_t * item = lv_malloc(req_size); + LV_ASSERT_MALLOC(item); + if(item == NULL) return NULL; + + uint8_t * p = (uint8_t *)item; + item->color_map = (lv_color_t *)(p + ALIGN(sizeof(*item))); + item->opa_map = (lv_opa_t *)(p + ALIGN(sizeof(*item)) + ALIGN(size * sizeof(lv_color_t))); + item->size = size; + return item; +} + +/********************** + * FUNCTIONS + **********************/ + +lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, int32_t w, int32_t h) +{ + /* No gradient, no cache */ + if(g->dir == LV_GRAD_DIR_NONE) return NULL; + + /* Step 1: Search cache for the given key */ + lv_grad_t * item = allocate_item(g, w, h); + if(item == NULL) { + LV_LOG_WARN("Failed to allocate item for the gradient"); + return item; + } + + /* Step 3: Fill it with the gradient, as expected */ + uint32_t i; + for(i = 0; i < item->size; i++) { + lv_gradient_color_calculate(g, item->size, i, &item->color_map[i], &item->opa_map[i]); + } + return item; +} + +void LV_ATTRIBUTE_FAST_MEM lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, + int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out) +{ + lv_grad_color_t tmp; + /*Clip out-of-bounds first*/ + int32_t min = (dsc->stops[0].frac * range) >> 8; + if(frac <= min) { + GRAD_CONV(tmp, dsc->stops[0].color); + *color_out = tmp; + *opa_out = dsc->stops[0].opa; + return; + } + + int32_t max = (dsc->stops[dsc->stops_count - 1].frac * range) >> 8; + if(frac >= max) { + GRAD_CONV(tmp, dsc->stops[dsc->stops_count - 1].color); + *color_out = tmp; + *opa_out = dsc->stops[dsc->stops_count - 1].opa; + return; + } + + /*Find the 2 closest stop now*/ + int32_t d = 0; + int32_t found_i = 0; + for(uint8_t i = 1; i < dsc->stops_count; i++) { + int32_t cur = (dsc->stops[i].frac * range) >> 8; + if(frac <= cur) { + found_i = i; + break; + } + } + + LV_ASSERT(found_i != 0); + + lv_color_t one, two; + one = dsc->stops[found_i - 1].color; + two = dsc->stops[found_i].color; + min = (dsc->stops[found_i - 1].frac * range) >> 8; + max = (dsc->stops[found_i].frac * range) >> 8; + d = max - min; + + /*Then interpolate*/ + frac -= min; + lv_opa_t mix = (frac * 255) / d; + lv_opa_t imix = 255 - mix; + + *color_out = GRAD_CM(LV_UDIV255(two.red * mix + one.red * imix), + LV_UDIV255(two.green * mix + one.green * imix), + LV_UDIV255(two.blue * mix + one.blue * imix)); + + *opa_out = LV_UDIV255(dsc->stops[found_i].opa * mix + dsc->stops[found_i - 1].opa * imix); +} + +void lv_gradient_cleanup(lv_grad_t * grad) +{ + lv_free(grad); +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.h b/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.h new file mode 100644 index 0000000..09bb377 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_gradient.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_sw_gradient.h + * + */ + +#ifndef LV_DRAW_SW_GRADIENT_H +#define LV_DRAW_SW_GRADIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../misc/lv_style.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ +#if LV_GRADIENT_MAX_STOPS < 2 +#error LVGL needs at least 2 stops for gradients. Please increase the LV_GRADIENT_MAX_STOPS +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef lv_color_t lv_grad_color_t; + +typedef struct _lv_gradient_cache_t { + lv_color_t * color_map; + lv_opa_t * opa_map; + uint32_t size; +} lv_grad_t; + +/********************** + * PROTOTYPES + **********************/ +/** Compute the color in the given gradient and fraction + * Gradient are specified in a virtual [0-255] range, so this function scales the virtual range to the given range + * @param dsc The gradient descriptor to use + * @param range The range to use in computation. + * @param frac The current part used in the range. frac is in [0; range] + */ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, + int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out); + +/** Get a gradient cache from the given parameters */ +lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * gradient, int32_t w, int32_t h); + +/** + * Clean up the gradient item after it was get with `lv_grad_get_from_cache`. + * @param grad pointer to a gradient + */ +void lv_gradient_cleanup(lv_grad_t * grad); + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_GRADIENT_H*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_img.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_img.c new file mode 100644 index 0000000..2f6dcf3 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_img.c @@ -0,0 +1,423 @@ +/** + * @file lv_draw_sw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../display/lv_display.h" +#include "../../display/lv_display_private.h" +#include "../../misc/lv_log.h" +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "arm2d/lv_draw_sw_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +#define MAX_BUF_SIZE (uint32_t) (4 * lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()) * lv_color_format_get_size(lv_display_get_color_format(_lv_refr_get_disp_refreshing()))) + +#ifndef LV_DRAW_SW_IMAGE + #define LV_DRAW_SW_IMAGE(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_RECOLOR + #define LV_DRAW_SW_RGB565_RECOLOR(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_RECOLOR + #define LV_DRAW_SW_RGB888_RECOLOR(...) LV_RESULT_INVALID +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * STATIC VARIABLES + **********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer_to_draw->draw_buf == NULL) return; + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer_to_draw->draw_buf; + lv_draw_sw_image(draw_unit, &new_draw_dsc, coords); +#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG + lv_area_t area_rot; + lv_area_copy(&area_rot, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + area_rot.x1 += coords->x1; + area_rot.y1 += coords->y1; + area_rot.x2 += coords->x1; + area_rot.y2 += coords->y1; + } + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return; +#endif + +#if LV_USE_LAYER_DEBUG + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); + fill_dsc.opa = LV_OPA_20; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = fill_dsc.color; + border_dsc.opa = LV_OPA_60; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + +#endif + +#if LV_USE_PARALLEL_DRAW_DEBUG + uint32_t idx = 0; + lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head; + while(draw_unit_tmp != draw_unit) { + draw_unit_tmp = draw_unit_tmp->next; + idx++; + } + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_rect_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % _LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_100; + border_dsc.width = 2; + lv_draw_sw_border(draw_unit, &border_dsc, &area_rot); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y2; + txt_area.y1 = draw_area.y2 - txt_size.y + 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_black(); + lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.text = buf; + lv_draw_sw_label(draw_unit, &label_dsc, &txt_area); +#endif +} + +void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + _lv_draw_image_normal_helper(draw_unit, draw_dsc, coords, img_draw_core); + } + else { + _lv_draw_image_tiled_helper(draw_unit, draw_dsc, coords, img_draw_core); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE ? true : false; + + bool masked = draw_dsc->bitmap_mask_src != NULL; + + lv_draw_sw_blend_dsc_t blend_dsc; + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + const lv_image_header_t * header = &decoded->header; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.src_stride = img_stride; + + if(!transformed && !masked && cf == LV_COLOR_FORMAT_A8) { + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, img_coords, draw_unit->clip_area)) return; + + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_area = img_coords; + blend_dsc.mask_stride = img_stride; + blend_dsc.src_buf = NULL; + blend_dsc.color = draw_dsc->recolor; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + + blend_dsc.blend_area = img_coords; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + else if(!transformed && !masked && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa <= LV_OPA_MIN) { + int32_t src_h = lv_area_get_height(img_coords); + int32_t src_w = lv_area_get_width(img_coords); + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_buf += img_stride * src_w / header->w * src_h; + /** + * Note, for RGB565A8, lacking of stride parameter, we always use + * always half of RGB map stride as alpha map stride. The image should + * be generated in this way too. + */ + blend_dsc.mask_stride = img_stride / 2; + blend_dsc.blend_area = img_coords; + blend_dsc.mask_area = img_coords; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + /*The simplest case just copy the pixels into the draw_buf. Blending will convert the colors if needed*/ + else if(!transformed && !masked && draw_dsc->recolor_opa <= LV_OPA_MIN) { + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.blend_area = img_coords; + blend_dsc.src_color_format = cf; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + /*Handle masked RGB565, RGB888, XRGB888, or ARGB8888 images*/ + else if(!transformed && masked && draw_dsc->recolor_opa <= LV_OPA_MIN) { + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.blend_area = img_coords; + blend_dsc.src_color_format = cf; + blend_dsc.mask_buf = draw_dsc->bitmap_mask_src->data; + blend_dsc.mask_stride = draw_dsc->bitmap_mask_src->header.stride; + + const lv_area_t * original_area; + if(lv_area_get_width(&draw_dsc->original_area) < 0) original_area = img_coords; + else original_area = &draw_dsc->original_area; + + lv_area_t a = {0, 0, draw_dsc->bitmap_mask_src->header.w - 1, draw_dsc->bitmap_mask_src->header.h - 1}; + lv_area_align(original_area, &a, LV_ALIGN_CENTER, 0, 0); + blend_dsc.mask_area = &a; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + /* check whether it is possible to accelerate the operation in synchronouse mode */ + else if(LV_RESULT_INVALID == LV_DRAW_SW_IMAGE(transformed, /* whether require transform */ + cf, /* image format */ + src_buf, /* image buffer */ + img_coords, /* src_h, src_w, src_x1, src_y1 */ + img_stride, /* image stride */ + clipped_img_area, /* blend area */ + draw_unit, /* target buffer, buffer width, buffer height, buffer stride */ + draw_dsc)) { /* opa, recolour_opa and colour */ + /*In the other cases every pixel need to be checked one-by-one*/ + + lv_area_t blend_area = *clipped_img_area; + blend_dsc.blend_area = &blend_area; + + int32_t src_w = lv_area_get_width(img_coords); + int32_t src_h = lv_area_get_height(img_coords); + int32_t blend_w = lv_area_get_width(&blend_area); + int32_t blend_h = lv_area_get_height(&blend_area); + + lv_color_format_t cf_final = cf; + if(transformed) { + if(cf == LV_COLOR_FORMAT_RGB888 || cf == LV_COLOR_FORMAT_XRGB8888) cf_final = LV_COLOR_FORMAT_ARGB8888; + else if(cf == LV_COLOR_FORMAT_RGB565) cf_final = LV_COLOR_FORMAT_RGB565A8; + } + + uint8_t * tmp_buf; + uint32_t px_size = lv_color_format_get_size(cf_final); + int32_t buf_h; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + uint32_t buf_stride = blend_w * 3; + buf_h = MAX_BUF_SIZE / buf_stride; + if(buf_h > blend_h) buf_h = blend_h; + tmp_buf = lv_malloc(buf_stride * buf_h); + } + else { + uint32_t buf_stride = blend_w * lv_color_format_get_size(cf_final); + buf_h = MAX_BUF_SIZE / buf_stride; + if(buf_h > blend_h) buf_h = blend_h; + tmp_buf = lv_malloc(buf_stride * buf_h); + } + LV_ASSERT_MALLOC(tmp_buf); + + blend_dsc.src_buf = tmp_buf; + blend_dsc.src_color_format = cf_final; + int32_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1 + buf_h - 1; + + blend_dsc.src_area = &blend_area; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + /*RGB565A8 images will blended as RGB565 + mask + *Therefore the stride can be different. */ + blend_dsc.src_stride = blend_w * 2; + blend_dsc.mask_buf = tmp_buf + blend_w * 2 * buf_h; + blend_dsc.mask_stride = blend_w; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + } + else if(cf_final == LV_COLOR_FORMAT_A8) { + blend_dsc.mask_buf = blend_dsc.src_buf; + blend_dsc.mask_stride = blend_w; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.color = draw_dsc->recolor; + blend_dsc.src_buf = NULL; + } + else { + blend_dsc.src_stride = blend_w * lv_color_format_get_size(cf_final); + } + + while(blend_area.y1 <= y_last) { + /*Apply transformations if any or separate the channels*/ + lv_area_t relative_area; + lv_area_copy(&relative_area, &blend_area); + lv_area_move(&relative_area, -img_coords->x1, -img_coords->y1); + if(transformed) { + lv_draw_sw_transform(draw_unit, &relative_area, src_buf, src_w, src_h, img_stride, + draw_dsc, sup, cf, tmp_buf); + } + else if(draw_dsc->recolor_opa >= LV_OPA_MIN) { + int32_t h = lv_area_get_height(&relative_area); + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + uint32_t stride_px = img_stride / 2; + const uint8_t * rgb_src_buf = src_buf + stride_px * 2 * relative_area.y1 + relative_area.x1 * 2; + const uint8_t * a_src_buf = src_buf + stride_px * 2 * src_h + stride_px * relative_area.y1 + + relative_area.x1; + uint8_t * rgb_dest_buf = tmp_buf; + uint8_t * a_dest_buf = (uint8_t *)blend_dsc.mask_buf; + int32_t i; + for(i = 0; i < h; i++) { + lv_memcpy(rgb_dest_buf, rgb_src_buf, blend_w * 2); + lv_memcpy(a_dest_buf, a_src_buf, blend_w); + rgb_src_buf += stride_px * 2; + a_src_buf += stride_px; + rgb_dest_buf += blend_w * 2; + a_dest_buf += blend_w; + } + } + else if(cf_final != LV_COLOR_FORMAT_A8) { + const uint8_t * src_buf_tmp = src_buf + img_stride * relative_area.y1 + relative_area.x1 * px_size; + uint8_t * dest_buf_tmp = tmp_buf; + int32_t i; + for(i = 0; i < h; i++) { + lv_memcpy(dest_buf_tmp, src_buf_tmp, blend_w * px_size); + dest_buf_tmp += blend_w * px_size; + src_buf_tmp += img_stride; + } + } + } + + /*Apply recolor*/ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + lv_color_t color = draw_dsc->recolor; + lv_opa_t mix = draw_dsc->recolor_opa; + lv_opa_t mix_inv = 255 - mix; + if(cf_final == LV_COLOR_FORMAT_RGB565A8 || cf_final == LV_COLOR_FORMAT_RGB565) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_RECOLOR(tmp_buf, blend_area, color, mix)) { + uint16_t c_mult[3]; + c_mult[0] = (color.blue >> 3) * mix; + c_mult[1] = (color.green >> 2) * mix; + c_mult[2] = (color.red >> 3) * mix; + uint16_t * buf16 = (uint16_t *)tmp_buf; + int32_t i; + int32_t size = lv_area_get_size(&blend_area); + for(i = 0; i < size; i++) { + buf16[i] = (((c_mult[2] + ((buf16[i] >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + (((c_mult[1] + ((buf16[i] >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + ((c_mult[0] + (buf16[i] & 0x1F) * mix_inv) >> 8); + } + } + } + else if(cf_final != LV_COLOR_FORMAT_A8) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_RECOLOR(tmp_buf, blend_area, color, mix, cf_final)) { + uint32_t size = lv_area_get_size(&blend_area); + uint32_t i; + uint16_t c_mult[3]; + c_mult[0] = color.blue * mix; + c_mult[1] = color.green * mix; + c_mult[2] = color.red * mix; + uint8_t * tmp_buf_2 = tmp_buf; + for(i = 0; i < size * px_size; i += px_size) { + tmp_buf_2[i + 0] = (c_mult[0] + (tmp_buf_2[i + 0] * mix_inv)) >> 8; + tmp_buf_2[i + 1] = (c_mult[1] + (tmp_buf_2[i + 1] * mix_inv)) >> 8; + tmp_buf_2[i + 2] = (c_mult[2] + (tmp_buf_2[i + 2] * mix_inv)) >> 8; + } + } + } + } + + /*Blend*/ + lv_draw_sw_blend(draw_unit, &blend_dsc); + + /*Go to the next area*/ + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1 + buf_h - 1; + if(blend_area.y2 > y_last) { + blend_area.y2 = y_last; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + blend_dsc.mask_buf = tmp_buf + blend_w * 2 * lv_area_get_height(&blend_area); + } + } + } + + lv_free(tmp_buf); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_letter.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_letter.c new file mode 100644 index 0000000..74d862e --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_letter.c @@ -0,0 +1,126 @@ +/** + * @file lv_draw_sw_letter.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../display/lv_display.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../../font/lv_font.h" +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_BEGIN; + lv_draw_label_iterate_characters(draw_unit, dsc, coords, draw_letter_cb); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_NONE: { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_sw_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + break; + case LV_FONT_GLYPH_FORMAT_A1: + case LV_FONT_GLYPH_FORMAT_A2: + case LV_FONT_GLYPH_FORMAT_A4: + case LV_FONT_GLYPH_FORMAT_A8: { + lv_area_t mask_area = *glyph_draw_dsc->letter_coords; + mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = glyph_draw_dsc->color; + blend_dsc.opa = glyph_draw_dsc->opa; + lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + blend_dsc.mask_buf = draw_buf->data; + blend_dsc.mask_area = &mask_area; + blend_dsc.mask_stride = draw_buf->header.stride; + blend_dsc.blend_area = glyph_draw_dsc->letter_coords; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + break; + case LV_FONT_GLYPH_FORMAT_IMAGE: { +#if LV_USE_IMGFONT + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.rotation = 0; + img_dsc.scale_x = LV_SCALE_NONE; + img_dsc.scale_y = LV_SCALE_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + break; + default: + break; + } + + } + + if(fill_draw_dsc && fill_area) { + lv_draw_sw_fill(draw_unit, fill_draw_dsc, fill_area); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_line.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_line.c new file mode 100644 index 0000000..aa5bd62 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_line.c @@ -0,0 +1,403 @@ +/** + * @file lv_draw_sw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_math.h" +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) return; + if(dsc->opa <= LV_OPA_MIN) return; + + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) return; + + lv_area_t clip_line; + clip_line.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_line.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_line.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_line.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + bool is_common; + is_common = _lv_area_intersect(&clip_line, &clip_line, draw_unit->clip_area); + if(!is_common) return; + + LV_PROFILER_BEGIN; + if(dsc->p1.y == dsc->p2.y) draw_line_hor(draw_unit, dsc); + else if(dsc->p1.x == dsc->p2.x) draw_line_ver(draw_unit, dsc); + else draw_line_skew(draw_unit, dsc); + + if(dsc->round_end || dsc->round_start) { + lv_draw_fill_dsc_t cir_dsc; + lv_draw_fill_dsc_init(&cir_dsc); + cir_dsc.color = dsc->color; + cir_dsc.radius = LV_RADIUS_CIRCLE; + cir_dsc.opa = dsc->opa; + + int32_t r = (dsc->width >> 1); + int32_t r_corr = (dsc->width & 1) ? 0 : 1; + lv_area_t cir_area; + + if(dsc->round_start) { + cir_area.x1 = (int32_t)dsc->p1.x - r; + cir_area.y1 = (int32_t)dsc->p1.y - r; + cir_area.x2 = (int32_t)dsc->p1.x + r - r_corr; + cir_area.y2 = (int32_t)dsc->p1.y + r - r_corr ; + lv_draw_sw_fill(draw_unit, &cir_dsc, &cir_area); + } + + if(dsc->round_end) { + cir_area.x1 = (int32_t)dsc->p2.x - r; + cir_area.y1 = (int32_t)dsc->p2.y - r; + cir_area.x2 = (int32_t)dsc->p2.x + r - r_corr; + cir_area.y2 = (int32_t)dsc->p2.y + r - r_corr ; + lv_draw_sw_fill(draw_unit, &cir_dsc, &cir_area); + } + } + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x); + blend_area.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) - 1; + blend_area.y1 = (int32_t)dsc->p1.y - w_half1; + blend_area.y2 = (int32_t)dsc->p1.y + w_half0; + + bool is_common; + is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(!dashed) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } +#if LV_DRAW_SW_COMPLEX + /*If there other mask apply it*/ + else { + + int32_t blend_area_w = lv_area_get_width(&blend_area); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + int32_t dash_start = blend_area.x1 % (dsc->dash_gap + dsc->dash_width); + + lv_opa_t * mask_buf = lv_malloc(blend_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset(mask_buf, 0xff, blend_area_w); + + int32_t dash_cnt = dash_start; + int32_t i; + for(i = 0; i < blend_area_w; i++, dash_cnt++) { + if(dash_cnt <= dsc->dash_width) { + int16_t diff = dsc->dash_width - dash_cnt; + i += diff; + dash_cnt += diff; + } + else if(dash_cnt > dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + else { + mask_buf[i] = 0x00; + } + + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + + lv_draw_sw_blend(draw_unit, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_free(mask_buf); + } +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = (int32_t)dsc->p1.x - w_half1; + blend_area.x2 = (int32_t)dsc->p1.x + w_half0; + blend_area.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y); + blend_area.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) - 1; + + bool is_common; + is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(!dashed) { + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + +#if LV_DRAW_SW_COMPLEX + /*If there other mask apply it*/ + else { + int32_t draw_area_w = lv_area_get_width(&blend_area); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + lv_opa_t * mask_buf = lv_malloc(draw_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + int32_t dash_start = (blend_area.y1) % (dsc->dash_gap + dsc->dash_width); + + int32_t dash_cnt = dash_start; + + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset(mask_buf, 0xff, draw_area_w); + + if(dash_cnt > dsc->dash_width) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + dash_cnt ++; + + lv_draw_sw_blend(draw_unit, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_free(mask_buf); + } +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ +#if LV_DRAW_SW_COMPLEX + /*Keep the great y in p1*/ + lv_point_t p1; + lv_point_t p2; + if(dsc->p1.y < dsc->p2.y) { + p1 = lv_point_from_precise(&dsc->p1); + p2 = lv_point_from_precise(&dsc->p2); + } + else { + p1 = lv_point_from_precise(&dsc->p2); + p2 = lv_point_from_precise(&dsc->p1); + } + + int32_t xdiff = p2.x - p1.x; + int32_t ydiff = p2.y - p1.y; + bool flat = LV_ABS(xdiff) > LV_ABS(ydiff); + + static const uint8_t wcorr[] = { + 128, 128, 128, 129, 129, 130, 130, 131, + 132, 133, 134, 135, 137, 138, 140, 141, + 143, 145, 147, 149, 151, 153, 155, 158, + 160, 162, 165, 167, 170, 173, 175, 178, + 181, + }; + + int32_t w = dsc->width; + int32_t wcorr_i = 0; + if(flat) wcorr_i = (LV_ABS(ydiff) << 5) / LV_ABS(xdiff); + else wcorr_i = (LV_ABS(xdiff) << 5) / LV_ABS(ydiff); + + w = (w * wcorr[wcorr_i] + 63) >> 7; /*+ 63 for rounding*/ + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = LV_MIN(p1.x, p2.x) - w; + blend_area.x2 = LV_MAX(p1.x, p2.x) + w; + blend_area.y1 = LV_MIN(p1.y, p2.y) - w; + blend_area.y2 = LV_MAX(p1.y, p2.y) + w; + + /*Get the union of `coords` and `clip`*/ + /*`clip` is already truncated to the `draw_buf` size + *in 'lv_refr_area' function*/ + bool is_common = _lv_area_intersect(&blend_area, &blend_area, draw_unit->clip_area); + if(is_common == false) return; + + lv_draw_sw_mask_line_param_t mask_left_param; + lv_draw_sw_mask_line_param_t mask_right_param; + lv_draw_sw_mask_line_param_t mask_top_param; + lv_draw_sw_mask_line_param_t mask_bottom_param; + + void * masks[5] = {&mask_left_param, & mask_right_param, NULL, NULL, NULL}; + + if(flat) { + if(xdiff > 0) { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + else { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + } + else { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x + w_half1, p1.y, p2.x + w_half1, p2.y, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x - w_half0, p1.y, p2.x - w_half0, p2.y, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + + } + + /*Use the normal vector for the endings*/ + + if(!dsc->raw_end) { + lv_draw_sw_mask_line_points_init(&mask_top_param, p1.x, p1.y, p1.x - ydiff, p1.y + xdiff, + LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM); + lv_draw_sw_mask_line_points_init(&mask_bottom_param, p2.x, p2.y, p2.x - ydiff, p2.y + xdiff, + LV_DRAW_SW_MASK_LINE_SIDE_TOP); + masks[2] = &mask_top_param; + masks[3] = &mask_bottom_param; + } + + /*The real draw area is around the line. + *It's easy to calculate with steep lines, but the area can be very wide with very flat lines. + *So deal with it only with steep lines.*/ + int32_t draw_area_w = lv_area_get_width(&blend_area); + + /*Draw the background line by line*/ + int32_t h; + uint32_t hor_res = (uint32_t)lv_display_get_horizontal_resolution(_lv_refr_get_disp_refreshing()); + size_t mask_buf_size = LV_MIN(lv_area_get_size(&blend_area), hor_res); + lv_opa_t * mask_buf = lv_malloc(mask_buf_size); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + uint32_t mask_p = 0; + lv_memset(mask_buf, 0xff, mask_buf_size); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + + /*Fill the first row with 'color'*/ + for(h = blend_area.y1; h <= y2; h++) { + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, &mask_buf[mask_p], blend_area.x1, h, draw_area_w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[mask_p], draw_area_w); + } + + mask_p += draw_area_w; + if((uint32_t) mask_p + draw_area_w < mask_buf_size) { + blend_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_unit, &blend_dsc); + + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1; + mask_p = 0; + lv_memset(mask_buf, 0xff, mask_buf_size); + } + } + + /*Flush the last part*/ + if(blend_area.y1 != blend_area.y2) { + blend_area.y2--; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + lv_free(mask_buf); + + lv_draw_sw_mask_free_param(&mask_left_param); + lv_draw_sw_mask_free_param(&mask_right_param); + if(!dsc->raw_end) { + lv_draw_sw_mask_free_param(&mask_top_param); + lv_draw_sw_mask_free_param(&mask_bottom_param); + } +#else + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + LV_LOG_WARN("Can't draw skewed line with LV_DRAW_SW_COMPLEX == 0"); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.c new file mode 100644 index 0000000..7c44197 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.c @@ -0,0 +1,1235 @@ +/** + * @file lv_draw_sw_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" + +#if LV_DRAW_SW_COMPLEX +#include "lv_draw_sw_mask.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_assert.h" +#include "../../osal/lv_os.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define CIRCLE_CACHE_LIFE_MAX 1000 +#define CIRCLE_CACHE_AGING(life, r) life = LV_MIN(life + (r < 16 ? 1 : (r >> 4)), 1000) +#define circle_cache_mutex LV_GLOBAL_DEFAULT()->draw_info.circle_cache_mutex +#define _circle_cache LV_GLOBAL_DEFAULT()->sw_circle_cache + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_line_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_radius_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_angle_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_fade_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_map_param_t * param); + +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p); + +static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius); +static bool circ_cont(lv_point_t * c); +static void circ_next(lv_point_t * c, int32_t * tmp); +static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius); +static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, + int32_t * x_start); +static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_mask_init(void) +{ + lv_mutex_init(&circle_cache_mutex); +} + +void lv_draw_sw_mask_deinit(void) +{ + lv_mutex_delete(&circle_cache_mutex); +} + +lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len) +{ + bool changed = false; + _lv_draw_sw_mask_common_dsc_t * dsc; + + uint32_t i; + for(i = 0; masks[i]; i++) { + dsc = masks[i]; + lv_draw_sw_mask_res_t res = LV_DRAW_SW_MASK_RES_FULL_COVER; + res = dsc->cb(mask_buf, abs_x, abs_y, len, masks[i]); + if(res == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res == LV_DRAW_SW_MASK_RES_CHANGED) changed = true; + } + + return changed ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; +} + +void lv_draw_sw_mask_free_param(void * p) +{ + lv_mutex_lock(&circle_cache_mutex); + _lv_draw_sw_mask_common_dsc_t * pdsc = p; + if(pdsc->type == LV_DRAW_SW_MASK_TYPE_RADIUS) { + lv_draw_sw_mask_radius_param_t * radius_p = (lv_draw_sw_mask_radius_param_t *) p; + if(radius_p->circle) { + if(radius_p->circle->life < 0) { + lv_free(radius_p->circle->cir_opa); + lv_free(radius_p->circle); + } + else { + radius_p->circle->used_cnt--; + } + } + } + + lv_mutex_unlock(&circle_cache_mutex); +} + +void _lv_draw_sw_mask_cleanup(void) +{ + uint8_t i; + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].buf) { + lv_free(_circle_cache[i].buf); + } + lv_memzero(&(_circle_cache[i]), sizeof(_circle_cache[i])); + } +} + +void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, + int32_t p2x, + int32_t p2y, lv_draw_sw_mask_line_side_t side) +{ + lv_memzero(param, sizeof(lv_draw_sw_mask_line_param_t)); + + if(p1y == p2y && side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { + p1y--; + p2y--; + } + + if(p1y > p2y) { + int32_t t; + t = p2x; + p2x = p1x; + p1x = t; + + t = p2y; + p2y = p1y; + p1y = t; + } + + lv_point_set(¶m->cfg.p1, p1x, p1y); + lv_point_set(¶m->cfg.p2, p2x, p2y); + param->cfg.side = side; + + lv_point_set(¶m->origo, p1x, p1y); + param->flat = (LV_ABS(p2x - p1x) > LV_ABS(p2y - p1y)) ? 1 : 0; + param->yx_steep = 0; + param->xy_steep = 0; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_line; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_LINE; + + int32_t dx = p2x - p1x; + int32_t dy = p2y - p1y; + + if(param->flat) { + /*Normalize the steep. Delta x should be relative to delta x = 1024*/ + int32_t m; + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize y (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + param->steep = param->yx_steep; + } + else { + /*Normalize the steep. Delta y should be relative to delta x = 1024*/ + int32_t m; + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + param->steep = param->xy_steep; + } + + if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) param->inv = 0; + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) param->inv = 1; + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP) { + if(param->steep > 0) param->inv = 1; + else param->inv = 0; + } + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { + if(param->steep > 0) param->inv = 0; + else param->inv = 1; + } + + param->spx = param->steep >> 2; + if(param->steep < 0) param->spx = -param->spx; +} + +void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t py, int16_t angle, + lv_draw_sw_mask_line_side_t side) +{ + /*Find an optimal degree. + *lv_mask_line_points_init will swap the points to keep the smaller y in p1 + *Theoretically a line with `angle` or `angle+180` is the same only the points are swapped + *Find the degree which keeps the origo in place*/ + if(angle > 180) angle -= 180; /*> 180 will swap the origo*/ + + int32_t p2x; + int32_t p2y; + + p2x = (lv_trigo_sin(angle + 90) >> 5) + p1x; + p2y = (lv_trigo_sin(angle) >> 5) + py; + + lv_draw_sw_mask_line_points_init(param, p1x, py, p2x, p2y, side); +} + +void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle) +{ + lv_draw_sw_mask_line_side_t start_side; + lv_draw_sw_mask_line_side_t end_side; + + /*Constrain the input angles*/ + if(start_angle < 0) + start_angle = 0; + else if(start_angle > 359) + start_angle = 359; + + if(end_angle < 0) + end_angle = 0; + else if(end_angle > 359) + end_angle = 359; + + if(end_angle < start_angle) { + param->delta_deg = 360 - start_angle + end_angle; + } + else { + param->delta_deg = LV_ABS(end_angle - start_angle); + } + + param->cfg.start_angle = start_angle; + param->cfg.end_angle = end_angle; + lv_point_set(¶m->cfg.vertex_p, vertex_x, vertex_y); + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_angle; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_ANGLE; + + LV_ASSERT_MSG(start_angle >= 0 && start_angle <= 360, "Unexpected start angle"); + + if(start_angle >= 0 && start_angle < 180) { + start_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; + } + else + start_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + LV_ASSERT_MSG(end_angle >= 0 && start_angle <= 360, "Unexpected end angle"); + + if(end_angle >= 0 && end_angle < 180) { + end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; + } + else if(end_angle >= 180 && end_angle < 360) { + end_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; + } + else + end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + lv_draw_sw_mask_line_angle_init(¶m->start_line, vertex_x, vertex_y, start_angle, start_side); + lv_draw_sw_mask_line_angle_init(¶m->end_line, vertex_x, vertex_y, end_angle, end_side); +} + +void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, + bool inv) +{ + int32_t w = lv_area_get_width(rect); + int32_t h = lv_area_get_height(rect); + int32_t short_side = LV_MIN(w, h); + if(radius > short_side >> 1) radius = short_side >> 1; + if(radius < 0) radius = 0; + + lv_area_copy(¶m->cfg.rect, rect); + param->cfg.radius = radius; + param->cfg.outer = inv ? 1 : 0; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_radius; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_RADIUS; + + if(radius == 0) { + param->circle = NULL; + return; + } + + lv_mutex_lock(&circle_cache_mutex); + + uint32_t i; + + /*Try to reuse a circle cache entry*/ + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].radius == radius) { + _circle_cache[i].used_cnt++; + CIRCLE_CACHE_AGING(_circle_cache[i].life, radius); + param->circle = &(_circle_cache[i]); + lv_mutex_unlock(&circle_cache_mutex); + return; + } + } + + /*If not cached use the free entry with lowest life*/ + _lv_draw_sw_mask_radius_circle_dsc_t * entry = NULL; + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].used_cnt == 0) { + if(!entry) entry = &(_circle_cache[i]); + else if(_circle_cache[i].life < entry->life) entry = &(_circle_cache[i]); + } + } + + /*There is no unused entry. Allocate one temporarily*/ + if(!entry) { + entry = lv_malloc_zeroed(sizeof(_lv_draw_sw_mask_radius_circle_dsc_t)); + LV_ASSERT_MALLOC(entry); + entry->life = -1; + } + else { + entry->used_cnt++; + entry->life = 0; + CIRCLE_CACHE_AGING(entry->life, radius); + } + + param->circle = entry; + + circ_calc_aa4(param->circle, radius); + lv_mutex_unlock(&circle_cache_mutex); + +} + +void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + int32_t y_top, + lv_opa_t opa_bottom, int32_t y_bottom) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.opa_top = opa_top; + param->cfg.opa_bottom = opa_bottom; + param->cfg.y_top = y_top; + param->cfg.y_bottom = y_bottom; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_fade; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_FADE; +} + +void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.map = map; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_map; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_MAP; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + /*Make to points relative to the vertex*/ + abs_y -= p->origo.y; + abs_x -= p->origo.x; + + /*Handle special cases*/ + if(p->steep == 0) { + /*Horizontal*/ + if(p->flat) { + /*Non sense: Can't be on the right/left of a horizontal line*/ + if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT || + p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP && abs_y < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM && abs_y > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + /*Vertical*/ + else { + /*Non sense: Can't be on the top/bottom of a vertical line*/ + if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP || + p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT && abs_x > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) { + if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else { + int32_t k = - abs_x; + if(k < 0) return LV_DRAW_SW_MASK_RES_TRANSP; + if(k >= 0 && k < len) lv_memzero(&mask_buf[k], len - k); + return LV_DRAW_SW_MASK_RES_CHANGED; + } + } + else { + if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else { + int32_t k = - abs_x; + if(k < 0) k = 0; + if(k >= len) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k >= 0 && k < len) lv_memzero(&mask_buf[0], k); + return LV_DRAW_SW_MASK_RES_CHANGED; + } + } + } + } + + lv_draw_sw_mask_res_t res; + if(p->flat) { + res = line_mask_flat(mask_buf, abs_x, abs_y, len, p); + } + else { + res = line_mask_steep(mask_buf, abs_x, abs_y, len, p); + } + + return res; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + + int32_t y_at_x; + y_at_x = (int32_t)((int32_t)p->yx_steep * abs_x) >> 10; + + if(p->yx_steep > 0) { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + } + else { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + y_at_x = (int32_t)((int32_t)p->yx_steep * (abs_x + len)) >> 10; + if(p->yx_steep > 0) { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + } + else { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + } + + int32_t xe; + if(p->yx_steep > 0) xe = ((abs_y * 256) * p->xy_steep) >> 10; + else xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + int32_t px_h; + if(xef == 0) px_h = 255; + else px_h = 255 - (((255 - xef) * p->spx) >> 8); + int32_t k = xei - abs_x; + lv_opa_t m; + + if(xef) { + if(k >= 0 && k < len) { + m = 255 - (((255 - xef) * (255 - px_h)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + } + + while(px_h > p->spx) { + if(k >= 0 && k < len) { + m = px_h - (p->spx >> 1); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + px_h -= p->spx; + k++; + if(k >= len) break; + } + + if(k < len && k >= 0) { + int32_t x_inters = (px_h * p->xy_steep) >> 10; + m = (x_inters * px_h) >> 9; + if(p->yx_steep < 0) m = 255 - m; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + if(p->inv) { + k = xei - abs_x; + if(k > len) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k >= 0) { + lv_memzero(&mask_buf[0], k); + } + } + else { + k++; + if(k < 0) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k <= len) { + lv_memzero(&mask_buf[k], len - k); + } + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + int32_t k; + int32_t x_at_y; + /*At the beginning of the mask if the limit line is greater than the mask's y. + *Then the mask is in the "wrong" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * abs_y) >> 10; + if(p->xy_steep > 0) x_at_y++; + if(x_at_y < abs_x) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * (abs_y)) >> 10; + if(x_at_y > abs_x + len) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + + /*X start*/ + int32_t xs = ((abs_y * 256) * p->xy_steep) >> 10; + int32_t xsi = xs >> 8; + int32_t xsf = xs & 0xFF; + + /*X end*/ + int32_t xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + lv_opa_t m; + + k = xsi - abs_x; + if(xsi != xei && (p->xy_steep < 0 && xsf == 0)) { + xsf = 0xFF; + xsi = xei; + k--; + } + + if(xsi == xei) { + if(k >= 0 && k < len) { + m = (xsf + xef) >> 1; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k >= len) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k >= 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k > 0) lv_memzero(&mask_buf[k], len - k); + } + + } + else { + int32_t y_inters; + if(p->xy_steep < 0) { + y_inters = (xsf * (-p->yx_steep)) >> 10; + if(k >= 0 && k < len) { + m = (y_inters * xsf) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k--; + + int32_t x_inters = ((255 - y_inters) * (-p->xy_steep)) >> 10; + + if(k >= 0 && k < len) { + m = 255 - (((255 - y_inters) * x_inters) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k += 2; + + if(p->inv) { + k = xsi - abs_x - 1; + + if(k > len) k = len; + else if(k > 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(k >= 0) lv_memzero(&mask_buf[k], len - k); + } + + } + else { + y_inters = ((255 - xsf) * p->yx_steep) >> 10; + if(k >= 0 && k < len) { + m = 255 - ((y_inters * (255 - xsf)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k++; + + int32_t x_inters = ((255 - y_inters) * p->xy_steep) >> 10; + if(k >= 0 && k < len) { + m = ((255 - y_inters) * x_inters) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k > len) return LV_DRAW_SW_MASK_RES_TRANSP; + if(k >= 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k > 0) lv_memzero(&mask_buf[k], len - k); + } + } + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_angle_param_t * p) +{ + int32_t rel_y = abs_y - p->cfg.vertex_p.y; + int32_t rel_x = abs_x - p->cfg.vertex_p.x; + + if(p->cfg.start_angle < 180 && p->cfg.end_angle < 180 && + p->cfg.start_angle != 0 && p->cfg.end_angle != 0 && + p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y < p->cfg.vertex_p.y) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, &p->start_line); + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, &p->end_line); + if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(p->cfg.start_angle > 180 && p->cfg.end_angle > 180 && p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y > p->cfg.vertex_p.y) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, (lv_draw_sw_mask_line_param_t *)&p->end_line); + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, (lv_draw_sw_mask_line_param_t *)&p->start_line); + if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + if(p->cfg.start_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + else res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else if(p->cfg.start_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + else res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else if((p->cfg.start_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.start_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else { + res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->start_line); + } + + if(p->cfg.end_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + else res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else if(p->cfg.end_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + else res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else if((p->cfg.end_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.end_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else { + res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->end_line); + } + + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP || res2 == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_SW_MASK_RES_UNKNOWN && res2 == LV_DRAW_SW_MASK_RES_UNKNOWN) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_SW_MASK_RES_FULL_COVER && + res2 == LV_DRAW_SW_MASK_RES_FULL_COVER) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_radius_param_t * p) +{ + bool outer = p->cfg.outer; + int32_t radius = p->cfg.radius; + lv_area_t rect; + lv_area_copy(&rect, &p->cfg.rect); + + if(outer == false) { + if((abs_y < rect.y1 || abs_y > rect.y2)) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + else { + if(abs_y < rect.y1 || abs_y > rect.y2) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + + if((abs_x >= rect.x1 + radius && abs_x + len <= rect.x2 - radius) || + (abs_y >= rect.y1 + radius && abs_y <= rect.y2 - radius)) { + if(outer == false) { + /*Remove the edges*/ + int32_t last = rect.x1 - abs_x; + if(last > len) return LV_DRAW_SW_MASK_RES_TRANSP; + if(last >= 0) { + lv_memzero(&mask_buf[0], last); + } + + int32_t first = rect.x2 - abs_x + 1; + if(first <= 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(first < len) { + lv_memzero(&mask_buf[first], len - first); + } + if(last == 0 && first == len) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + int32_t first = rect.x1 - abs_x; + if(first < 0) first = 0; + if(first <= len) { + int32_t last = rect.x2 - abs_x - first + 1; + if(first + last > len) last = len - first; + if(last >= 0) { + lv_memzero(&mask_buf[first], last); + } + } + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + + int32_t k = rect.x1 - abs_x; /*First relevant coordinate on the of the mask*/ + int32_t w = lv_area_get_width(&rect); + int32_t h = lv_area_get_height(&rect); + abs_x -= rect.x1; + abs_y -= rect.y1; + + int32_t aa_len; + int32_t x_start; + int32_t cir_y; + if(abs_y < radius) { + cir_y = radius - abs_y - 1; + } + else { + cir_y = abs_y - (h - radius); + } + lv_opa_t * aa_opa = get_next_line(p->circle, cir_y, &aa_len, &x_start); + int32_t cir_x_right = k + w - radius + x_start; + int32_t cir_x_left = k + radius - x_start - 1; + int32_t i; + + if(outer == false) { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = aa_opa[aa_len - i - 1]; + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + /*Clean the right side*/ + cir_x_right = LV_CLAMP(0, cir_x_right + i, len); + lv_memzero(&mask_buf[cir_x_right], len - cir_x_right); + + /*Clean the left side*/ + cir_x_left = LV_CLAMP(0, cir_x_left - aa_len + 1, len); + lv_memzero(&mask_buf[0], cir_x_left); + } + else { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = 255 - (aa_opa[aa_len - 1 - i]); + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + int32_t clr_start = LV_CLAMP(0, cir_x_left + 1, len); + int32_t clr_len = LV_CLAMP(0, cir_x_right - clr_start, len - clr_start); + lv_memzero(&mask_buf[clr_start], clr_len); + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_fade_param_t * p) +{ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + + int32_t i; + + if(abs_y <= p->cfg.y_top) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_top); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(abs_y >= p->cfg.y_bottom) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_bottom); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + /*Calculate the opa proportionally*/ + int16_t opa_diff = p->cfg.opa_bottom - p->cfg.opa_top; + int32_t y_diff = p->cfg.y_bottom - p->cfg.y_top + 1; + lv_opa_t opa_act = LV_OPA_MIX2(abs_y - p->cfg.y_top, opa_diff) / y_diff; + opa_act += p->cfg.opa_top; + + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], opa_act); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_map_param_t * p) +{ + /*Handle out of the mask cases*/ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + + /*Got to the current row in the map*/ + const lv_opa_t * map_tmp = p->cfg.map; + map_tmp += (abs_y - p->cfg.coords.y1) * lv_area_get_width(&p->cfg.coords); + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + else { + map_tmp += (abs_x - p->cfg.coords.x1); + } + + int32_t i; + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], map_tmp[i]); + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +/** + * Initialize the circle drawing + * @param c pointer to a point. The coordinates will be calculated here + * @param tmp point to a variable. It will store temporary data + * @param radius radius of the circle + */ +static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius) +{ + c->x = radius; + c->y = 0; + *tmp = 1 - radius; +} + +/** + * Test the circle drawing is ready or not + * @param c same as in circ_init + * @return true if the circle is not ready yet + */ +static bool circ_cont(lv_point_t * c) +{ + return c->y <= c->x; +} + +/** + * Get the next point from the circle + * @param c same as in circ_init. The next point stored here. + * @param tmp same as in circ_init. + */ +static void circ_next(lv_point_t * c, int32_t * tmp) +{ + + if(*tmp <= 0) { + (*tmp) += 2 * c->y + 3; /*Change in decision criterion for y -> y+1*/ + } + else { + (*tmp) += 2 * (c->y - c->x) + 5; /*Change for y -> y+1, x -> x-1*/ + c->x--; + } + c->y++; +} + +static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius) +{ + if(radius == 0) return; + c->radius = radius; + + /*Allocate buffers*/ + if(c->buf) lv_free(c->buf); + + c->buf = lv_malloc(radius * 6 + 6); /*Use uint16_t for opa_start_on_y and x_start_on_y*/ + LV_ASSERT_MALLOC(c->buf); + c->cir_opa = c->buf; + c->opa_start_on_y = (uint16_t *)(c->buf + 2 * radius + 2); + c->x_start_on_y = (uint16_t *)(c->buf + 4 * radius + 4); + + /*Special case, handle manually*/ + if(radius == 1) { + c->cir_opa[0] = 180; + c->opa_start_on_y[0] = 0; + c->opa_start_on_y[1] = 1; + c->x_start_on_y[0] = 0; + return; + } + + const size_t cir_xy_size = (radius + 1) * 2 * 2 * sizeof(int32_t); + int32_t * cir_x = lv_malloc_zeroed(cir_xy_size); + int32_t * cir_y = &cir_x[(radius + 1) * 2]; + + uint32_t y_8th_cnt = 0; + lv_point_t cp; + int32_t tmp; + circ_init(&cp, &tmp, radius * 4); /*Upscale by 4*/ + int32_t i; + + uint32_t x_int[4]; + uint32_t x_fract[4]; + int32_t cir_size = 0; + x_int[0] = cp.x >> 2; + x_fract[0] = 0; + + /*Calculate an 1/8 circle*/ + while(circ_cont(&cp)) { + /*Calculate 4 point of the circle */ + for(i = 0; i < 4; i++) { + circ_next(&cp, &tmp); + if(circ_cont(&cp) == false) break; + x_int[i] = cp.x >> 2; + x_fract[i] = cp.x & 0x3; + } + if(i != 4) break; + + /*All lines on the same x when downscaled*/ + if(x_int[0] == x_int[3]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2] + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Second line on new x when downscaled*/ + else if(x_int[0] != x_int[1]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 1 * 4 + x_fract[1] + x_fract[2] + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Third line on new x when downscaled*/ + else if(x_int[0] != x_int[2]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 2 * 4 + x_fract[2] + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Forth line on new x when downscaled*/ + else { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 3 * 4 + x_fract[3];; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + y_8th_cnt++; + } + + /*The point on the 1/8 circle is special, calculate it manually*/ + int32_t mid = radius * 723; + int32_t mid_int = mid >> 10; + if(cir_x[cir_size - 1] != mid_int || cir_y[cir_size - 1] != mid_int) { + int32_t tmp_val = mid - (mid_int << 10); + if(tmp_val <= 512) { + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + } + else { + tmp_val = 1024 - tmp_val; + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + tmp_val = 15 - tmp_val; + } + + cir_x[cir_size] = mid_int; + cir_y[cir_size] = mid_int; + c->cir_opa[cir_size] = tmp_val; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + /*Build the second octet by mirroring the first*/ + for(i = cir_size - 2; i >= 0; i--, cir_size++) { + cir_x[cir_size] = cir_y[i]; + cir_y[cir_size] = cir_x[i]; + c->cir_opa[cir_size] = c->cir_opa[i]; + } + + int32_t y = 0; + i = 0; + c->opa_start_on_y[0] = 0; + while(i < cir_size) { + c->opa_start_on_y[y] = i; + c->x_start_on_y[y] = cir_x[i]; + for(; cir_y[i] == y && i < (int32_t)cir_size; i++) { + c->x_start_on_y[y] = LV_MIN(c->x_start_on_y[y], cir_x[i]); + } + y++; + } + + lv_free(cir_x); +} + +static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, + int32_t * x_start) +{ + *len = c->opa_start_on_y[y + 1] - c->opa_start_on_y[y]; + *x_start = c->x_start_on_y[y]; + return &c->cir_opa[c->opa_start_on_y[y]]; +} + +static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +{ + if(mask_new >= LV_OPA_MAX) return mask_act; + if(mask_new <= LV_OPA_MIN) return 0; + + return LV_UDIV255(mask_act * mask_new); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.h b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.h new file mode 100644 index 0000000..6529037 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask.h @@ -0,0 +1,305 @@ +/** + * @file lv_draw_sw_mask.h + * + */ + +#ifndef LV_DRAW_SW_MASK_H +#define LV_DRAW_SW_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define LV_MASK_ID_INV (-1) +#if LV_DRAW_SW_COMPLEX +# define _LV_MASK_MAX_NUM 16 +#else +# define _LV_MASK_MAX_NUM 1 +#endif + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_DRAW_SW_MASK_RES_TRANSP, + LV_DRAW_SW_MASK_RES_FULL_COVER, + LV_DRAW_SW_MASK_RES_CHANGED, + LV_DRAW_SW_MASK_RES_UNKNOWN +}; + +typedef uint8_t lv_draw_sw_mask_res_t; + +#if LV_DRAW_SW_COMPLEX + +enum { + LV_DRAW_SW_MASK_TYPE_LINE, + LV_DRAW_SW_MASK_TYPE_ANGLE, + LV_DRAW_SW_MASK_TYPE_RADIUS, + LV_DRAW_SW_MASK_TYPE_FADE, + LV_DRAW_SW_MASK_TYPE_MAP, +}; + +typedef uint8_t lv_draw_sw_mask_type_t; + +enum { + LV_DRAW_SW_MASK_LINE_SIDE_LEFT = 0, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT, + LV_DRAW_SW_MASK_LINE_SIDE_TOP, + LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM, +}; + +/** + * A common callback type for every mask type. + * Used internally by the library. + */ +typedef lv_draw_sw_mask_res_t (*lv_draw_sw_mask_xcb_t)(lv_opa_t * mask_buf, int32_t abs_x, int32_t abs_y, + int32_t len, + void * p); + +typedef uint8_t lv_draw_sw_mask_line_side_t; + +typedef struct { + lv_draw_sw_mask_xcb_t cb; + lv_draw_sw_mask_type_t type; +} _lv_draw_sw_mask_common_dsc_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_sw_mask_common_dsc_t dsc; + + struct { + /*First point*/ + lv_point_t p1; + + /*Second point*/ + lv_point_t p2; + + /*Which side to keep?*/ + lv_draw_sw_mask_line_side_t side : 2; + } cfg; + + /*A point of the line*/ + lv_point_t origo; + + /*X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/ + int32_t xy_steep; + + /*Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/ + int32_t yx_steep; + + /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines*/ + int32_t steep; + + /*Steepness in 1 px in 0..255 range. Used only by flat lines.*/ + int32_t spx; + + /*1: It's a flat line? (Near to horizontal)*/ + uint8_t flat : 1; + + /*Invert the mask. The default is: Keep the left part. + *It is used to select left/right/top/bottom*/ + uint8_t inv: 1; +} lv_draw_sw_mask_line_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_point_t vertex_p; + int32_t start_angle; + int32_t end_angle; + } cfg; + + lv_draw_sw_mask_line_param_t start_line; + lv_draw_sw_mask_line_param_t end_line; + uint16_t delta_deg; +} lv_draw_sw_mask_angle_param_t; + +typedef struct { + uint8_t * buf; + lv_opa_t * cir_opa; /*Opacity of values on the circumference of an 1/4 circle*/ + uint16_t * x_start_on_y; /*The x coordinate of the circle for each y value*/ + uint16_t * opa_start_on_y; /*The index of `cir_opa` for each y value*/ + int32_t life; /*How many times the entry way used*/ + uint32_t used_cnt; /*Like a semaphore to count the referencing masks*/ + int32_t radius; /*The radius of the entry*/ +} _lv_draw_sw_mask_radius_circle_dsc_t; + +typedef _lv_draw_sw_mask_radius_circle_dsc_t _lv_draw_sw_mask_radius_circle_dsc_arr_t[LV_DRAW_SW_CIRCLE_CACHE_SIZE]; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t rect; + int32_t radius; + /*Invert the mask. 0: Keep the pixels inside.*/ + uint8_t outer: 1; + } cfg; + + _lv_draw_sw_mask_radius_circle_dsc_t * circle; +} lv_draw_sw_mask_radius_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + _lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + int32_t y_top; + int32_t y_bottom; + lv_opa_t opa_top; + lv_opa_t opa_bottom; + } cfg; + +} lv_draw_sw_mask_fade_param_t; + +typedef struct _lv_draw_sw_mask_map_param_t { + /*The first element must be the common descriptor*/ + _lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + const lv_opa_t * map; + } cfg; +} lv_draw_sw_mask_map_param_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sw_mask_init(void); + +void lv_draw_sw_mask_deinit(void); + +//! @cond Doxygen_Suppress + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routines. + * @param masks the masks list to apply, must be ended with NULL pointer in array. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, + int32_t abs_x, + int32_t abs_y, + int32_t len); + +//! @endcond + +/** + * Free the data from the parameter. + * It's called inside `lv_draw_sw_mask_remove_id` and `lv_draw_sw_mask_remove_custom` + * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add` + * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom` + * @param p pointer to a mask parameter + */ +void lv_draw_sw_mask_free_param(void * p); + +/** + * Called by LVGL the rendering of a screen is ready to clean up + * the temporal (cache) data of the masks + */ +void _lv_draw_sw_mask_cleanup(void); + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, + int32_t p2x, + int32_t p2y, lv_draw_sw_mask_line_side_t side); + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordinate of a point of the line + * @param py X coordinate of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t py, int16_t angle, + lv_draw_sw_mask_line_side_t side); + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle); + +/** + * Initialize a fade mask. + * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle + */ +void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, + bool inv); + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + int32_t y_top, + lv_opa_t opa_bottom, int32_t y_bottom); + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map); + +#endif /*LV_DRAW_SW_COMPLEX*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_MASK_H*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c new file mode 100644 index 0000000..919758c --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c @@ -0,0 +1,132 @@ +/** + * @file lv_draw_sw_mask_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#if LV_USE_DRAW_SW +#if LV_DRAW_SW_COMPLEX + +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "lv_draw_sw.h" +#include "lv_draw_sw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(coords); + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { + return; + } + + lv_layer_t * target_layer = draw_unit->target_layer; + lv_area_t * buf_area = &target_layer->buf_area; + lv_area_t clear_area; + + void * draw_buf = target_layer->draw_buf; + + /*Clear the top part*/ + lv_area_set(&clear_area, draw_unit->clip_area->x1, draw_unit->clip_area->y1, draw_unit->clip_area->x2, + dsc->area.y1 - 1); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the bottom part*/ + lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y2 + 1, draw_unit->clip_area->x2, + draw_unit->clip_area->y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the left part*/ + lv_area_set(&clear_area, draw_unit->clip_area->x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the right part*/ + lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, draw_unit->clip_area->x2, dsc->area.y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + lv_draw_sw_mask_radius_param_t param; + lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false); + + void * masks[2] = {0}; + masks[0] = ¶m; + + uint32_t area_w = lv_area_get_width(&draw_area); + lv_opa_t * mask_buf = lv_malloc(area_w); + + int32_t y; + for(y = draw_area.y1; y <= draw_area.y2; y++) { + lv_memset(mask_buf, 0xff, area_w); + lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); + if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue; + + lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - buf_area->x1, + y - buf_area->y1); + + if(res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(c32_buf, area_w * sizeof(lv_color32_t)); + } + else { + uint32_t i; + for(i = 0; i < area_w; i++) { + if(mask_buf[i] != LV_OPA_COVER) { + c32_buf[i].alpha = LV_OPA_MIX2(c32_buf[i].alpha, mask_buf[i]); + } + } + } + } + + lv_free(mask_buf); + lv_draw_sw_mask_free_param(¶m); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + LV_UNUSED(coords); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_transform.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_transform.c new file mode 100644 index 0000000..71fadd7 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_transform.c @@ -0,0 +1,640 @@ +/** + * @file lv_draw_sw_transform.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + int32_t x_in; + int32_t y_in; + int32_t x_out; + int32_t y_out; + int32_t sinma; + int32_t cosma; + int32_t scale_x; + int32_t scale_y; + int32_t angle; + int32_t pivot_x_256; + int32_t pivot_y_256; + lv_point_t pivot; +} point_transform_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +/** + * Transform a point with 1/256 precision (the output coordinates are upscaled by 256) + * @param t pointer to n initialized `point_transform_dsc_t` structure + * @param xin X coordinate to rotate + * @param yin Y coordinate to rotate + * @param xout upscaled, transformed X + * @param yout upscaled, transformed Y + */ +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout); + +static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size); + +static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa); + +static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); + +static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * abuf, bool aa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t src_cf, void * dest_buf) +{ + LV_UNUSED(draw_unit); + LV_UNUSED(sup); + + point_transform_dsc_t tr_dsc; + tr_dsc.angle = -draw_dsc->rotation; + tr_dsc.scale_x = draw_dsc->scale_x; + tr_dsc.scale_y = draw_dsc->scale_y; + tr_dsc.pivot = draw_dsc->pivot; + + int32_t angle_low = tr_dsc.angle / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = tr_dsc.angle - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256; + tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256; + + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + int32_t dest_stride_a8 = dest_w; + int32_t dest_stride; + if(src_cf == LV_COLOR_FORMAT_RGB888) { + dest_stride = dest_w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888); + } + else if(src_cf == LV_COLOR_FORMAT_RGB565A8) { + dest_stride = dest_w * 2; + } + else { + dest_stride = dest_w * lv_color_format_get_size(src_cf); + } + + uint8_t * alpha_buf; + if(src_cf == LV_COLOR_FORMAT_RGB565 || src_cf == LV_COLOR_FORMAT_RGB565A8) { + alpha_buf = dest_buf; + alpha_buf += dest_stride * dest_h; + } + else { + alpha_buf = NULL; + } + + bool aa = (bool) draw_dsc->antialias; + bool is_rotated = draw_dsc->rotation; + + int32_t xs_ups = 0, ys_ups = 0, ys_ups_start = 0, ys_step_256_original = 0; + int32_t xs_step_256 = 0, ys_step_256 = 0; + + /*If scaled only make some simplification to avoid rounding errors. + *For example if there is a 100x100 image zoomed to 300% + *The destination area in X will be x1=0; x2=299 + *When the step is calculated below it will think that stepping + *1/3 pixels on the original image will result in 300% zoom. + *However this way the last pixel will be on the 99.67 coordinate. + *As it's larger than 99.5 LVGL will start to mix the next coordinate + *which is out of the image, so will make the pixel more transparent. + *To avoid it in case of scale only limit the coordinates to the 0..297 range, + *that is to 0..(src_w-1)*zoom */ + if(is_rotated == false) { + int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; + + int32_t x_max = (((src_w - 1 - draw_dsc->pivot.x) * draw_dsc->scale_x) >> 8) + draw_dsc->pivot.x; + int32_t y_max = (((src_h - 1 - draw_dsc->pivot.y) * draw_dsc->scale_y) >> 8) + draw_dsc->pivot.y; + + lv_area_t dest_area_limited; + dest_area_limited.x1 = dest_area->x1 > x_max ? x_max : dest_area->x1; + dest_area_limited.x2 = dest_area->x2 > x_max ? x_max : dest_area->x2; + dest_area_limited.y1 = dest_area->y1 > y_max ? y_max : dest_area->y1; + dest_area_limited.y2 = dest_area->y2 > y_max ? y_max : dest_area->y2; + + transform_point_upscaled(&tr_dsc, dest_area_limited.x1, dest_area_limited.y1, &xs1_ups, &ys1_ups); + transform_point_upscaled(&tr_dsc, dest_area_limited.x2, dest_area_limited.y2, &xs2_ups, &ys2_ups); + + int32_t xs_diff = xs2_ups - xs1_ups; + int32_t ys_diff = ys2_ups - ys1_ups; + xs_step_256 = 0; + ys_step_256_original = 0; + if(dest_w > 1) { + xs_step_256 = (256 * xs_diff) / (dest_w - 1); + } + if(dest_h > 1) { + ys_step_256_original = (256 * ys_diff) / (dest_h - 1); + } + + xs_ups = xs1_ups + 0x80; + ys_ups_start = ys1_ups + 0x80; + } + + int32_t y; + for(y = 0; y < dest_h; y++) { + if(is_rotated == false) { + ys_ups = ys_ups_start + ((ys_step_256_original * y) >> 8); + ys_step_256 = 0; + } + else { + int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; + transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups); + transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups); + + int32_t xs_diff = xs2_ups - xs1_ups; + int32_t ys_diff = ys2_ups - ys1_ups; + xs_step_256 = 0; + ys_step_256 = 0; + if(dest_w > 1) { + xs_step_256 = (256 * xs_diff) / (dest_w - 1); + ys_step_256 = (256 * ys_diff) / (dest_w - 1); + } + + xs_ups = xs1_ups + 0x80; + ys_ups = ys1_ups + 0x80; + } + + switch(src_cf) { + case LV_COLOR_FORMAT_XRGB8888: + transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, + 4); + break; + case LV_COLOR_FORMAT_RGB888: + transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, + 3); + break; + case LV_COLOR_FORMAT_A8: + transform_a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa); + break; + case LV_COLOR_FORMAT_ARGB8888: + transform_argb8888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, + aa); + break; + case LV_COLOR_FORMAT_RGB565: + transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, + alpha_buf, false, aa); + break; + case LV_COLOR_FORMAT_RGB565A8: + transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + (uint16_t *)dest_buf, + alpha_buf, true, aa); + break; + default: + break; + } + + dest_buf = (uint8_t *)dest_buf + dest_stride; + if(alpha_buf) alpha_buf += dest_stride_a8; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + dest_c32[x].alpha = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const uint8_t * src_u8 = &src[ys_int * src_stride + xs_int * px_size]; + + dest_c32[x].red = src_u8[2]; + dest_c32[x].green = src_u8[1]; + dest_c32[x].blue = src_u8[0]; + dest_c32[x].alpha = 0xff; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + const uint8_t * px_hor_u8 = src_u8 + (int32_t)(x_next * px_size); + lv_color32_t px_hor; + px_hor.red = px_hor_u8[2]; + px_hor.green = px_hor_u8[1]; + px_hor.blue = px_hor_u8[0]; + px_hor.alpha = 0xff; + + const uint8_t * px_ver_u8 = src_u8 + (int32_t)(y_next * src_stride); + lv_color32_t px_ver; + px_ver.red = px_ver_u8[2]; + px_ver.green = px_ver_u8[1]; + px_ver.blue = px_ver_u8[0]; + px_ver.alpha = 0xff; + + if(!lv_color32_eq(dest_c32[x], px_ver)) { + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(!lv_color32_eq(dest_c32[x], px_hor)) { + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a = 0xff; + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x].alpha = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x].alpha = (a * (0xFF - ys_fract)) >> 8; + } + } + } +} + +static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + ((uint32_t *)dest_buf)[x] = 0x00000000; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4); + + dest_c32[x] = src_c32[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_color32_t px_hor = src_c32[x_next]; + lv_color32_t px_ver = *(const lv_color32_t *)((uint8_t *)src_c32 + y_next * src_stride); + + if(px_ver.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - ys_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_ver)) { + dest_c32[x].alpha = ((px_ver.alpha * ys_fract) + (dest_c32[x].alpha * (0xFF - ys_fract))) >> 8; + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(px_hor.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - xs_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_hor)) { + dest_c32[x].alpha = ((px_hor.alpha * xs_fract) + (dest_c32[x].alpha * (0xFF - xs_fract))) >> 8; + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + } + /*Partially out of the image*/ + else { + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - xs_fract)) >> 7; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - ys_fract)) >> 7; + } + } + } +} + +static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + const lv_opa_t * src_alpha = src + src_stride * src_h; + + /*Must be signed type, because we would use negative array index calculated from stride*/ + int32_t alpha_stride = src_stride / 2; /*alpha map stride is always half of RGB map stride*/ + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint16_t * src_tmp_u16 = (const uint16_t *)(src + (ys_int * src_stride) + xs_int * 2); + cbuf[x] = src_tmp_u16[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + uint16_t px_hor = src_tmp_u16[x_next]; + uint16_t px_ver = *(const uint16_t *)((uint8_t *)src_tmp_u16 + (y_next * src_stride)); + + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + abuf[x] = src_alpha_tmp[0]; + + lv_opa_t a_hor = src_alpha_tmp[x_next]; + lv_opa_t a_ver = src_alpha_tmp[y_next * alpha_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + + if(abuf[x] == 0x00) continue; + } + else { + abuf[x] = 0xff; + } + + if(cbuf[x] != px_ver || cbuf[x] != px_hor) { + uint16_t v = lv_color_16_16_mix(px_ver, cbuf[x], ys_fract); + uint16_t h = lv_color_16_16_mix(px_hor, cbuf[x], xs_fract); + cbuf[x] = lv_color_16_16_mix(h, v, LV_OPA_50); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a; + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + a = src_alpha_tmp[0]; + } + else { + a = 0xff; + } + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (a * (0xFF - ys_fract)) >> 8; + } + else { + abuf[x] = a; + } + } + } +} + +static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * abuf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint8_t * src_tmp = src; + src_tmp += ys_int * src_stride + xs_int; + abuf[x] = src_tmp[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_opa_t a_ver = src_tmp[x_next]; + lv_opa_t a_hor = src_tmp[y_next * src_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + } + else { + /*Partially out of the image*/ + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (src_tmp[0] * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (src_tmp[0] * (0xFF - ys_fract)) >> 8; + } + } + } +} + +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout) +{ + if(t->angle == 0 && t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { + *xout = xin * 256; + *yout = yin * 256; + return; + } + + xin -= t->pivot.x; + yin -= t->pivot.y; + + if(t->angle == 0) { + *xout = ((int32_t)(xin * 256 * 256 / t->scale_x)) + (t->pivot_x_256); + *yout = ((int32_t)(yin * 256 * 256 / t->scale_y)) + (t->pivot_y_256); + } + else if(t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { + *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256); + *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256); + } + else { + *xout = (((t->cosma * xin - t->sinma * yin) * 256 / t->scale_x) >> 2) + (t->pivot_x_256); + *yout = (((t->sinma * xin + t->cosma * yin) * 256 / t->scale_y) >> 2) + (t->pivot_y_256); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_triangle.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_triangle.c new file mode 100644 index 0000000..311325b --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_triangle.c @@ -0,0 +1,197 @@ +/** + * @file lv_draw_sw_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_triangle.h" +#include "lv_draw_sw_gradient.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) +{ +#if LV_DRAW_SW_COMPLEX + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + bool is_common; + lv_area_t draw_area; + is_common = _lv_area_intersect(&draw_area, &tri_area, draw_unit->clip_area); + if(!is_common) return; + + lv_point_t p[3]; + /*If there is a vertical side use it as p[0] and p[1]*/ + if(dsc->p[0].x == dsc->p[1].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + } + else if(dsc->p[0].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[1]); + } + else if(dsc->p[1].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[1]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[0]); + } + else { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + + /*Set the smallest y as p[0]*/ + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + if(p[0].y > p[2].y) lv_point_swap(&p[0], &p[2]); + + /*Set the greatest y as p[1]*/ + if(p[1].y < p[2].y) lv_point_swap(&p[1], &p[2]); + } + + /*Be sure p[0] is on the top*/ + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + + /*If right == true p[2] is on the right side of the p[0] p[1] line*/ + bool right = ((p[1].x - p[0].x) * (p[2].y - p[0].y) - (p[1].y - p[0].y) * (p[2].x - p[0].x)) < 0; + + void * masks[4] = {0}; + lv_draw_sw_mask_line_param_t mask_left; + lv_draw_sw_mask_line_param_t mask_right; + lv_draw_sw_mask_line_param_t mask_bottom; + + lv_draw_sw_mask_line_points_init(&mask_left, p[0].x, p[0].y, + p[1].x, p[1].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_RIGHT : LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + + lv_draw_sw_mask_line_points_init(&mask_right, p[0].x, p[0].y, + p[2].x, p[2].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + + if(p[1].y == p[2].y) { + lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, + p[2].x, p[2].y, LV_DRAW_SW_MASK_LINE_SIDE_TOP); + } + else { + lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, + p[2].x, p[2].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + + masks[0] = &mask_left; + masks[1] = &mask_right; + masks[2] = &mask_bottom; + int32_t area_w = lv_area_get_width(&draw_area); + lv_opa_t * mask_buf = lv_malloc(area_w); + + lv_area_t blend_area = draw_area; + blend_area.y2 = blend_area.y1; + lv_draw_sw_blend_dsc_t blend_dsc; + blend_dsc.color = dsc->bg_color; + blend_dsc.opa = dsc->bg_opa; + blend_dsc.mask_buf = mask_buf; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.blend_mode = LV_BLEND_MODE_NORMAL; + blend_dsc.src_buf = NULL; + + lv_grad_dir_t grad_dir = dsc->bg_grad.dir; + + lv_grad_t * grad = lv_gradient_get(&dsc->bg_grad, lv_area_get_width(&tri_area), lv_area_get_height(&tri_area)); + lv_opa_t * grad_opa_map = NULL; + if(grad && grad_dir == LV_GRAD_DIR_HOR) { + blend_dsc.src_area = &blend_area; + blend_dsc.src_buf = grad->color_map + draw_area.x1 - tri_area.x1; + grad_opa_map = grad->opa_map + draw_area.x1 - tri_area.x1; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; + } + + int32_t y; + for(y = draw_area.y1; y <= draw_area.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + lv_memset(mask_buf, 0xff, area_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); + if(grad_dir == LV_GRAD_DIR_VER) { + blend_dsc.color = grad->color_map[y - tri_area.y1]; + blend_dsc.opa = grad->opa_map[y - tri_area.y1]; + if(dsc->bg_opa < LV_OPA_MAX) blend_dsc.opa = LV_OPA_MIX2(blend_dsc.opa, dsc->bg_opa); + } + else if(grad_dir == LV_GRAD_DIR_HOR) { + if(grad_opa_map) { + int32_t i; + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_CHANGED) { + blend_dsc.mask_buf = mask_buf; + for(i = 0; i < area_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = LV_OPA_MIX2(mask_buf[i], grad_opa_map[i]); + } + } + else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) { + blend_dsc.mask_buf = grad_opa_map; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + continue; + } + } + } + lv_draw_sw_blend(draw_unit, &blend_dsc); + } + + lv_free(mask_buf); + lv_draw_sw_mask_free_param(&mask_bottom); + lv_draw_sw_mask_free_param(&mask_left); + lv_draw_sw_mask_free_param(&mask_right); + + if(grad) { + lv_gradient_cleanup(grad); + } + +#else + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + LV_LOG_WARN("Can't draw triangles with LV_DRAW_SW_COMPLEX == 0"); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/sw/lv_draw_sw_vector.c b/libraries/lvgl/src/draw/sw/lv_draw_sw_vector.c new file mode 100644 index 0000000..8a4bca9 --- /dev/null +++ b/libraries/lvgl/src/draw/sw/lv_draw_sw_vector.c @@ -0,0 +1,465 @@ +/** + * @file lv_draw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG +#if LV_USE_THORVG_EXTERNAL + #include +#else + #include "../../libs/thorvg/thorvg_capi.h" +#endif +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + float x; + float y; + float w; + float h; +} _tvg_rect; + +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; +} _tvg_color; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +static void _lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) +{ + rect->x = area->x1; + rect->y = area->y1; + rect->w = lv_area_get_width(area); + rect->h = lv_area_get_height(area); +} + +static void _lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_t opa) +{ + color->r = c->red; + color->g = c->green; + color->b = c->blue; + color->a = LV_OPA_MIX2(c->alpha, opa); +} + +static void _lv_matrix_to_tvg(Tvg_Matrix * tm, const lv_matrix_t * m) +{ + tm->e11 = m->m[0][0]; + tm->e12 = m->m[0][1]; + tm->e13 = m->m[0][2]; + tm->e21 = m->m[1][0]; + tm->e22 = m->m[1][1]; + tm->e23 = m->m[1][2]; + tm->e31 = m->m[2][0]; + tm->e32 = m->m[2][1]; + tm->e33 = m->m[2][2]; +} + +static void _set_paint_matrix(Tvg_Paint * obj, const Tvg_Matrix * m) +{ + tvg_paint_set_transform(obj, m); +} + +static void _set_paint_shape(Tvg_Paint * obj, const lv_vector_path_t * p) +{ + uint32_t pidx = 0; + lv_vector_path_op_t * op = lv_array_front(&p->ops); + uint32_t size = lv_array_size(&p->ops); + for(uint32_t i = 0; i < size; i++) { + switch(op[i]) { + case LV_VECTOR_PATH_OP_MOVE_TO: { + lv_fpoint_t * pt = lv_array_at(&p->points, pidx); + tvg_shape_move_to(obj, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_LINE_TO: { + lv_fpoint_t * pt = lv_array_at(&p->points, pidx); + tvg_shape_line_to(obj, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_QUAD_TO: { + lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); + lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); + + lv_fpoint_t * last_pt = lv_array_at(&p->points, pidx - 1); + + lv_fpoint_t cp[2]; + cp[0].x = (last_pt->x + 2 * pt1->x) * (1.0f / 3.0f); + cp[0].y = (last_pt->y + 2 * pt1->y) * (1.0f / 3.0f); + cp[1].x = (pt2->x + 2 * pt1->x) * (1.0f / 3.0f); + cp[1].y = (pt2->y + 2 * pt1->y) * (1.0f / 3.0f); + + tvg_shape_cubic_to(obj, cp[0].x, cp[0].y, cp[1].x, cp[1].y, pt2->x, pt2->y); + pidx += 2; + } + break; + case LV_VECTOR_PATH_OP_CUBIC_TO: { + lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); + lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); + lv_fpoint_t * pt3 = lv_array_at(&p->points, pidx + 2); + + tvg_shape_cubic_to(obj, pt1->x, pt1->y, pt2->x, pt2->y, pt3->x, pt3->y); + pidx += 3; + } + break; + case LV_VECTOR_PATH_OP_CLOSE: { + tvg_shape_close(obj); + } + break; + } + } +} + +static Tvg_Stroke_Cap _lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) +{ + switch(cap) { + case LV_VECTOR_STROKE_CAP_SQUARE: + return TVG_STROKE_CAP_SQUARE; + case LV_VECTOR_STROKE_CAP_ROUND: + return TVG_STROKE_CAP_ROUND; + case LV_VECTOR_STROKE_CAP_BUTT: + return TVG_STROKE_CAP_BUTT; + default: + return TVG_STROKE_CAP_SQUARE; + } +} + +static Tvg_Stroke_Join _lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) +{ + switch(join) { + case LV_VECTOR_STROKE_JOIN_BEVEL: + return TVG_STROKE_JOIN_BEVEL; + case LV_VECTOR_STROKE_JOIN_ROUND: + return TVG_STROKE_JOIN_ROUND; + case LV_VECTOR_STROKE_JOIN_MITER: + return TVG_STROKE_JOIN_MITER; + default: + return TVG_STROKE_JOIN_BEVEL; + } +} + +static Tvg_Stroke_Fill _lv_spread_to_tvg(lv_vector_gradient_spread_t sp) +{ + switch(sp) { + case LV_VECTOR_GRADIENT_SPREAD_PAD: + return TVG_STROKE_FILL_PAD; + case LV_VECTOR_GRADIENT_SPREAD_REPEAT: + return TVG_STROKE_FILL_REPEAT; + case LV_VECTOR_GRADIENT_SPREAD_REFLECT: + return TVG_STROKE_FILL_REFLECT; + default: + return TVG_STROKE_FILL_PAD; + } +} + +static void _setup_gradient(Tvg_Gradient * gradient, const lv_vector_gradient_t * grad, + const lv_matrix_t * matrix) +{ + const lv_grad_dsc_t * g = &grad->grad; + Tvg_Color_Stop * stops = (Tvg_Color_Stop *)lv_malloc(sizeof(Tvg_Color_Stop) * g->stops_count); + for(uint8_t i = 0; i < g->stops_count; i++) { + const lv_gradient_stop_t * s = &(g->stops[i]); + + stops[i].offset = s->frac / 255.0f; + stops[i].r = s->color.red; + stops[i].g = s->color.green; + stops[i].b = s->color.blue; + stops[i].a = s->opa; + } + + tvg_gradient_set_color_stops(gradient, stops, g->stops_count); + tvg_gradient_set_spread(gradient, _lv_spread_to_tvg(grad->spread)); + Tvg_Matrix mtx; + _lv_matrix_to_tvg(&mtx, matrix); + tvg_gradient_set_transform(gradient, &mtx); + lv_free(stops); +} + +static void _set_paint_stroke_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) +{ + float x, y, w, h; + tvg_paint_get_bounds(obj, &x, &y, &w, &h, false); + + Tvg_Gradient * grad = NULL; + if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + grad = tvg_radial_gradient_new(); + tvg_radial_gradient_set(grad, g->cx + x, g->cy + y, g->cr); + _setup_gradient(grad, g, m); + tvg_shape_set_stroke_radial_gradient(obj, grad); + } + else { + grad = tvg_linear_gradient_new(); + + if(g->grad.dir == LV_GRAD_DIR_VER) { + tvg_linear_gradient_set(grad, x, y, x, y + h); + } + else { + tvg_linear_gradient_set(grad, x, y, x + w, y); + } + + _setup_gradient(grad, g, m); + tvg_shape_set_stroke_linear_gradient(obj, grad); + } +} + +static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * dsc) +{ + if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { + _tvg_color c; + _lv_color_to_tvg(&c, &dsc->color, dsc->opa); + tvg_shape_set_stroke_color(obj, c.r, c.g, c.b, c.a); + } + else { /*gradient*/ + _set_paint_stroke_gradient(obj, &dsc->gradient, &dsc->matrix); + } + + tvg_shape_set_stroke_width(obj, dsc->width); + tvg_shape_set_stroke_miterlimit(obj, dsc->miter_limit); + tvg_shape_set_stroke_cap(obj, _lv_stroke_cap_to_tvg(dsc->cap)); + tvg_shape_set_stroke_join(obj, _lv_stroke_join_to_tvg(dsc->join)); + + if(!lv_array_is_empty(&dsc->dash_pattern)) { + float * dash_array = lv_array_front(&dsc->dash_pattern); + tvg_shape_set_stroke_dash(obj, dash_array, dsc->dash_pattern.size); + } +} + +static Tvg_Fill_Rule _lv_fill_rule_to_tvg(lv_vector_fill_t rule) +{ + switch(rule) { + case LV_VECTOR_FILL_NONZERO: + return TVG_FILL_RULE_WINDING; + case LV_VECTOR_FILL_EVENODD: + return TVG_FILL_RULE_EVEN_ODD; + default: + return TVG_FILL_RULE_WINDING; + } +} + +static void _set_paint_fill_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) +{ + float x, y, w, h; + tvg_paint_get_bounds(obj, &x, &y, &w, &h, false); + + Tvg_Gradient * grad = NULL; + if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + grad = tvg_radial_gradient_new(); + tvg_radial_gradient_set(grad, g->cx + x, g->cy + y, g->cr); + _setup_gradient(grad, g, m); + tvg_shape_set_radial_gradient(obj, grad); + } + else { + grad = tvg_linear_gradient_new(); + + if(g->grad.dir == LV_GRAD_DIR_VER) { + tvg_linear_gradient_set(grad, x, y, x, y + h); + } + else { + tvg_linear_gradient_set(grad, x, y, x + w, y); + } + + _setup_gradient(grad, g, m); + tvg_shape_set_linear_gradient(obj, grad); + } +} + +static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_draw_image_dsc_t * p, + const lv_matrix_t * m) +{ + lv_image_decoder_dsc_t decoder_dsc; + lv_image_decoder_args_t args = { 0 }; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, p->src, &args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + if(!decoder_dsc.decoded) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("Image not ready"); + return; + } + + const uint8_t * src_buf = decoder_dsc.decoded->data; + const lv_image_header_t * header = &decoder_dsc.decoded->header; + lv_color_format_t cf = header->cf; + + if(cf != LV_COLOR_FORMAT_ARGB8888) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("Not support image format"); + return; + } + + Tvg_Paint * img = tvg_picture_new(); + tvg_picture_load_raw(img, (uint32_t *)src_buf, header->w, header->h, true); + Tvg_Paint * clip_path = tvg_paint_duplicate(obj); + tvg_paint_set_composite_method(img, clip_path, TVG_COMPOSITE_METHOD_CLIP_PATH); + tvg_paint_set_opacity(img, p->opa); + + Tvg_Matrix mtx; + _lv_matrix_to_tvg(&mtx, m); + tvg_paint_set_transform(img, &mtx); + tvg_canvas_push(canvas, img); + lv_image_decoder_close(&decoder_dsc); +} + +static void _set_paint_fill(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_vector_fill_dsc_t * dsc, + const lv_matrix_t * matrix) +{ + tvg_shape_set_fill_rule(obj, _lv_fill_rule_to_tvg(dsc->fill_rule)); + + if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { + _tvg_color c; + _lv_color_to_tvg(&c, &dsc->color, dsc->opa); + tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); + } + else if(dsc->style == LV_VECTOR_DRAW_STYLE_PATTERN) { + float x, y, w, h; + tvg_paint_get_bounds(obj, &x, &y, &w, &h, false); + + lv_matrix_t imx; + lv_memcpy(&imx, matrix, sizeof(lv_matrix_t)); + lv_matrix_translate(&imx, x, y); + lv_matrix_multiply(&imx, &dsc->matrix); + _set_paint_fill_pattern(obj, canvas, &dsc->img_dsc, &imx); + } + else if(dsc->style == LV_VECTOR_DRAW_STYLE_GRADIENT) { + _set_paint_fill_gradient(obj, &dsc->gradient, &dsc->matrix); + } +} + +static Tvg_Blend_Method _lv_blend_to_tvg(lv_vector_blend_t blend) +{ + switch(blend) { + case LV_VECTOR_BLEND_SRC_OVER: + return TVG_BLEND_METHOD_NORMAL; + case LV_VECTOR_BLEND_SCREEN: + return TVG_BLEND_METHOD_SCREEN; + case LV_VECTOR_BLEND_MULTIPLY: + return TVG_BLEND_METHOD_MULTIPLY; + case LV_VECTOR_BLEND_NONE: + return TVG_BLEND_METHOD_SRCOVER; + case LV_VECTOR_BLEND_ADDITIVE: + return TVG_BLEND_METHOD_ADD; + case LV_VECTOR_BLEND_SRC_IN: + case LV_VECTOR_BLEND_DST_OVER: + case LV_VECTOR_BLEND_DST_IN: + case LV_VECTOR_BLEND_SUBTRACTIVE: + /*not support yet.*/ + default: + return TVG_BLEND_METHOD_NORMAL; + } +} + +static void _set_paint_blend_mode(Tvg_Paint * obj, lv_vector_blend_t blend) +{ + tvg_paint_set_blend_method(obj, _lv_blend_to_tvg(blend)); +} + +static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc) +{ + Tvg_Canvas * canvas = (Tvg_Canvas *)ctx; + + Tvg_Paint * obj = tvg_shape_new(); + + if(!path) { /*clear*/ + _tvg_rect rc; + _lv_area_to_tvg(&rc, &dsc->scissor_area); + + _tvg_color c; + _lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa); + + Tvg_Matrix mtx = { + 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f, + }; + _set_paint_matrix(obj, &mtx); + tvg_shape_append_rect(obj, rc.x, rc.y, rc.w, rc.h, 0, 0); + tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); + } + else { + Tvg_Matrix mtx; + _lv_matrix_to_tvg(&mtx, &dsc->matrix); + _set_paint_matrix(obj, &mtx); + + _set_paint_shape(obj, path); + + _set_paint_fill(obj, canvas, &dsc->fill_dsc, &dsc->matrix); + _set_paint_stroke(obj, &dsc->stroke_dsc); + _set_paint_blend_mode(obj, dsc->blend_mode); + } + + tvg_canvas_push(canvas, obj); +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc) +{ + LV_UNUSED(draw_unit); + + if(dsc->task_list == NULL) + return; + + lv_layer_t * layer = dsc->base.layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + if(draw_buf == NULL) + return; + + lv_color_format_t cf = draw_buf->header.cf; + + if(cf != LV_COLOR_FORMAT_ARGB8888 && \ + cf != LV_COLOR_FORMAT_XRGB8888) { + LV_LOG_ERROR("unsupported layer color: %d", cf); + return; + } + + void * buf = draw_buf->data; + int32_t width = lv_area_get_width(&layer->buf_area); + int32_t height = lv_area_get_height(&layer->buf_area); + uint32_t stride = draw_buf->header.stride; + Tvg_Canvas * canvas = tvg_swcanvas_create(); + tvg_swcanvas_set_target(canvas, buf, stride / 4, width, height, TVG_COLORSPACE_ARGB8888); + + lv_ll_t * task_list = dsc->task_list; + _lv_vector_for_each_destroy_tasks(task_list, _task_draw_cb, canvas); + + if(tvg_canvas_draw(canvas) == TVG_RESULT_SUCCESS) { + tvg_canvas_sync(canvas); + } + + tvg_canvas_destroy(canvas); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c new file mode 100644 index 0000000..65b085c --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c @@ -0,0 +1,57 @@ +/** + * @file lv_draw_buf_vg_lite.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_vg_lite_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->width_to_stride_cb = width_to_stride; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + return lv_vg_lite_width_to_stride(w, lv_vg_lite_vg_fmt(color_format)); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c new file mode 100644 index 0000000..e461550 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c @@ -0,0 +1,253 @@ +/** + * @file lv_vg_lite_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../lv_draw.h" +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_grad.h" +#include "lv_vg_lite_pending.h" + +/********************* + * DEFINES + *********************/ + +#define VG_LITE_DRAW_UNIT_ID 2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static int32_t draw_delete(lv_draw_unit_t * draw_unit); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_init(void) +{ +#if LV_VG_LITE_USE_GPU_INIT + extern void gpu_init(void); + static bool inited = false; + if(!inited) { + gpu_init(); + inited = true; + } +#endif + + lv_vg_lite_dump_info(); + + lv_draw_buf_vg_lite_init_handlers(); + + lv_draw_vg_lite_unit_t * unit = lv_draw_create_unit(sizeof(lv_draw_vg_lite_unit_t)); + unit->base_unit.dispatch_cb = draw_dispatch; + unit->base_unit.evaluate_cb = draw_evaluate; + unit->base_unit.delete_cb = draw_delete; + + lv_vg_lite_image_dsc_init(unit); + lv_vg_lite_grad_init(unit); + lv_vg_lite_path_init(unit); + lv_vg_lite_decoder_init(); +} + +void lv_draw_vg_lite_deinit(void) +{ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool check_image_is_supported(const lv_draw_image_dsc_t * dsc) +{ + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(dsc->src, &header); + if(res != LV_RESULT_OK) { + LV_LOG_TRACE("get image info failed"); + return false; + } + + return lv_vg_lite_is_src_cf_supported(header.cf); +} + +static void draw_execute(lv_draw_vg_lite_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; + + lv_layer_t * layer = u->base_unit.target_layer; + + lv_vg_lite_buffer_from_draw_buf(&u->target_buffer, layer->draw_buf); + + /* VG-Lite will output premultiplied image, set the flag correspondingly. */ + lv_draw_buf_set_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + + vg_lite_identity(&u->global_matrix); + vg_lite_translate(-layer->buf_area.x1, -layer->buf_area.y1, &u->global_matrix); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_vg_lite_label(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_vg_lite_fill(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_vg_lite_border(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + lv_draw_vg_lite_box_shadow(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_vg_lite_img(draw_unit, t->draw_dsc, &t->area, false); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_vg_lite_arc(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_vg_lite_line(draw_unit, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_vg_lite_layer(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_vg_lite_triangle(draw_unit, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + lv_draw_vg_lite_mask_rect(draw_unit, t->draw_dsc, &t->area); + break; +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_vg_lite_vector(draw_unit, t->draw_dsc); + break; +#endif + default: + break; + } + + lv_vg_lite_flush(u); +} + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(u->task_act) { + return 0; + } + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, VG_LITE_DRAW_UNIT_ID); + + /* Return 0 is no selection, some tasks can be supported by other units. */ + if(!t || t->preferred_draw_unit_id != VG_LITE_DRAW_UNIT_ID) { + lv_vg_lite_finish(u); + return -1; + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(!buf) { + return -1; + } + + /* Return if target buffer format is not supported. */ + if(!lv_vg_lite_is_dest_cf_supported(layer->draw_buf->header.cf)) { + return -1; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + u->base_unit.target_layer = layer; + u->base_unit.clip_area = &t->clip_area; + u->task_act = t; + + draw_execute(u); + + u->task_act->state = LV_DRAW_TASK_STATE_READY; + u->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + return 1; +} + +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + switch(task->type) { + case LV_DRAW_TASK_TYPE_LABEL: + case LV_DRAW_TASK_TYPE_FILL: + case LV_DRAW_TASK_TYPE_BORDER: +#if LV_VG_LITE_USE_BOX_SHADOW + case LV_DRAW_TASK_TYPE_BOX_SHADOW: +#endif + case LV_DRAW_TASK_TYPE_LAYER: + case LV_DRAW_TASK_TYPE_LINE: + case LV_DRAW_TASK_TYPE_ARC: + case LV_DRAW_TASK_TYPE_TRIANGLE: + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: +#endif + break; + + case LV_DRAW_TASK_TYPE_IMAGE: { + if(!check_image_is_supported(task->draw_dsc)) { + return 0; + } + } + break; + + default: + /*The draw unit is not able to draw this task. */ + return 0; + } + + /* The draw unit is able to draw this task. */ + task->preference_score = 80; + task->preferred_draw_unit_id = VG_LITE_DRAW_UNIT_ID; + return 1; +} + +static int32_t draw_delete(lv_draw_unit_t * draw_unit) +{ + lv_draw_vg_lite_unit_t * unit = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_vg_lite_image_dsc_deinit(unit); + lv_vg_lite_grad_deinit(unit); + lv_vg_lite_path_deinit(unit); + lv_vg_lite_decoder_deinit(); + return 1; +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h new file mode 100644 index 0000000..8b5cb3b --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h @@ -0,0 +1,84 @@ +/** + * @file lv_vg_lite_draw.h + * + */ + +#ifndef LV_VG_LITE_DRAW_H +#define LV_VG_LITE_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../lv_draw.h" +#include "../../draw/lv_draw_vector.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_buf_vg_lite_init_handlers(void); + +void lv_draw_vg_lite_init(void); + +void lv_draw_vg_lite_deinit(void); + +void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, bool no_cache); + +void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords); + +#if LV_USE_VECTOR_GRAPHIC +void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_DRAW_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c new file mode 100644 index 0000000..74e63bb --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c @@ -0,0 +1,217 @@ +/** + * @file lv_draw_vg_lite_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include + +/********************* + * DEFINES + *********************/ + +#define PI 3.1415926535897932384626433832795f +#define TWO_PI 6.283185307179586476925286766559f +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f +#define radians(deg) ((deg) * DEG_TO_RAD) +#define degrees(rad) ((rad) * RAD_TO_DEG) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width <= 0) + return; + if(dsc->start_angle == dsc->end_angle) + return; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + float start_angle = dsc->start_angle; + float end_angle = dsc->end_angle; + float sweep_angle = end_angle - start_angle; + + while(sweep_angle < 0) { + sweep_angle += 360; + } + + while(sweep_angle > 360) { + sweep_angle -= 360; + } + + /*If the angles are the same then there is nothing to draw*/ + if(math_zero(sweep_angle)) { + return; + } + + LV_PROFILER_BEGIN; + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, VG_LITE_HIGH); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + + float radius_out = dsc->radius; + float radius_in = dsc->radius - dsc->width; + float half_width = dsc->width * 0.5f; + float radius_center = radius_out - half_width; + float cx = dsc->center.x; + float cy = dsc->center.y; + + vg_lite_fill_t fill = VG_LITE_FILL_NON_ZERO; + + if(math_equal(sweep_angle, 360)) { + lv_vg_lite_path_append_circle(path, cx, cy, radius_out, radius_out); + lv_vg_lite_path_append_circle(path, cx, cy, radius_in, radius_in); + fill = VG_LITE_FILL_EVEN_ODD; + } + else { + /* radius_out start point */ + float start_angle_rad = MATH_RADIANS(start_angle); + float start_x = radius_out * MATH_COSF(start_angle_rad) + cx; + float start_y = radius_out * MATH_SINF(start_angle_rad) + cy; + + /* radius_in start point */ + float end_angle_rad = MATH_RADIANS(end_angle); + float end_x = radius_in * MATH_COSF(end_angle_rad) + cx; + float end_y = radius_in * MATH_SINF(end_angle_rad) + cy; + + lv_vg_lite_path_move_to(path, start_x, start_y); + + /* radius_out arc */ + lv_vg_lite_path_append_arc(path, + cx, cy, + radius_out, + start_angle, + sweep_angle, + false); + + /* line to radius_in */ + lv_vg_lite_path_line_to(path, end_x, end_y); + + /* radius_in arc */ + lv_vg_lite_path_append_arc(path, + cx, cy, + radius_in, + end_angle, + -sweep_angle, + false); + + /* close arc */ + lv_vg_lite_path_close(path); + + /* draw round */ + if(dsc->rounded && half_width > 0) { + float rcx1 = cx + radius_center * MATH_COSF(end_angle_rad); + float rcy1 = cy + radius_center * MATH_SINF(end_angle_rad); + lv_vg_lite_path_append_circle(path, rcx1, rcy1, half_width, half_width); + + float rcx2 = cx + radius_center * MATH_COSF(start_angle_rad); + float rcy2 = cy + radius_center * MATH_SINF(start_angle_rad); + lv_vg_lite_path_append_circle(path, rcx2, rcy2, half_width, half_width); + } + } + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + + vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_lite_path, + fill, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + + if(dsc->img_src) { + vg_lite_buffer_t src_buf; + lv_image_decoder_dsc_t decoder_dsc; + if(lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->img_src, false)) { + vg_lite_matrix_t path_matrix; + vg_lite_identity(&path_matrix); + lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix); + + /* move image to center */ + vg_lite_translate(cx - radius_out, cy - radius_out, &matrix); + + LV_VG_LITE_ASSERT_MATRIX(&path_matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( + &u->target_buffer, + vg_lite_path, + fill, + &path_matrix, + &src_buf, + &matrix, + VG_LITE_BLEND_SRC_OVER, + VG_LITE_PATTERN_COLOR, + 0, + color, + VG_LITE_FILTER_BI_LINEAR)); + LV_PROFILER_END_TAG("vg_lite_draw_pattern"); + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + } + } + + lv_vg_lite_path_drop(u, path); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c new file mode 100644 index 0000000..f60b72f --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c @@ -0,0 +1,121 @@ +/** + * @file lv_draw_vg_lite_border.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->side == LV_BORDER_SIDE_NONE) + return; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_BEGIN; + + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + float r_out = dsc->radius; + if(dsc->radius) { + float r_short = LV_MIN(w, h) / 2.0f; + r_out = LV_MIN(r_out, r_short); + } + + int32_t border_w = dsc->width; + float r_in = LV_MAX(0, r_out - border_w); + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + + /* outer rect */ + lv_vg_lite_path_append_rect(path, + coords->x1, coords->y1, + w, h, + r_out, r_out); + + /* inner rect */ + lv_vg_lite_path_append_rect(path, + coords->x1 + border_w, coords->y1 + border_w, + w - border_w * 2, h - border_w * 2, + r_in, r_in); + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + + vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + + lv_vg_lite_path_drop(u, path); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c new file mode 100644 index 0000000..e5cc008 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c @@ -0,0 +1,100 @@ +/** + * @file lv_draw_vg_lite_box_shadow.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords) +{ + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; + core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; + core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; + core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; + + lv_opa_t opa = dsc->opa; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return; + + LV_PROFILER_BEGIN; + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.width = 3; + border_dsc.color = dsc->color; + border_dsc.radius = dsc->radius; + + lv_area_move(&draw_area, dsc->ofs_x, dsc->ofs_y); + draw_area = core_area; + int32_t half_w = dsc->width / 2; + + for(int32_t w = 0; w < half_w; w++) { + border_dsc.opa = lv_map(w, 0, half_w, dsc->opa / 4, LV_OPA_0); + border_dsc.radius++; + lv_area_increase(&draw_area, 1, 1); + lv_draw_vg_lite_border(draw_unit, &border_dsc, &draw_area); + + /* fill center */ + if(dsc->ofs_x || dsc->ofs_y) { + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.radius = dsc->radius; + fill_dsc.opa = dsc->opa; + fill_dsc.color = dsc->color; + lv_draw_vg_lite_fill(draw_unit, &fill_dsc, &core_area); + } + } + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c new file mode 100644 index 0000000..ea52815 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c @@ -0,0 +1,122 @@ +/** + * @file lv_draw_vg_lite_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_grad.h" + +/********************* + * DEFINES + *********************/ + +#if LV_GRADIENT_MAX_STOPS > VLC_MAX_GRADIENT_STOPS + #error "LV_GRADIENT_MAX_STOPS must be equal or less than VLC_MAX_GRADIENT_STOPS" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) { + return; + } + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, coords, draw_unit->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_BEGIN; + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + float r = dsc->radius; + if(dsc->radius) { + float r_short = LV_MIN(w, h) / 2.0f; + r = LV_MIN(r, r_short); + } + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + lv_vg_lite_path_append_rect(path, coords->x1, coords->y1, w, h, r, r); + lv_vg_lite_path_end(path); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + if(dsc->grad.dir != LV_GRAD_DIR_NONE) { + vg_lite_matrix_t grad_matrix; + lv_vg_lite_grad_area_to_matrix(&grad_matrix, coords, dsc->grad.dir); + lv_vg_lite_draw_linear_grad( + u, + &u->target_buffer, + vg_lite_path, + &dsc->grad, + &grad_matrix, + &matrix, + VG_LITE_FILL_EVEN_ODD, + VG_LITE_BLEND_SRC_OVER); + } + else { /* normal fill */ + vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + } + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c new file mode 100644 index 0000000..10b217b --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c @@ -0,0 +1,169 @@ +/** + * @file lv_draw_vg_lite_img.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, bool no_cache) +{ + if(dsc->opa <= LV_OPA_MIN) { + return; + } + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + /* The coordinates passed in by coords are not transformed, + * so the transformed area needs to be calculated once. + */ + lv_area_t image_tf_area; + _lv_image_buf_get_transformed_area( + &image_tf_area, + lv_area_get_width(coords), + lv_area_get_height(coords), + dsc->rotation, + dsc->scale_x, + dsc->scale_y, + &dsc->pivot); + lv_area_move(&image_tf_area, coords->x1, coords->y1); + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &image_tf_area, draw_unit->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_BEGIN; + + vg_lite_buffer_t src_buf; + lv_image_decoder_dsc_t decoder_dsc; + if(!lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->src, no_cache)) { + LV_PROFILER_END; + return; + } + + vg_lite_color_t color = 0; + if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoder_dsc.decoded->header.cf) || dsc->recolor_opa > LV_OPA_MIN) { + /* alpha image and image recolor */ + src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + color = lv_vg_lite_color(dsc->recolor, LV_OPA_MIX2(dsc->opa, dsc->recolor_opa), true); + } + else if(dsc->opa < LV_OPA_MAX) { + /* normal image opa */ + src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + lv_memset(&color, dsc->opa, sizeof(color)); + } + + bool has_trasform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + vg_lite_filter_t filter = has_trasform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT; + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + lv_vg_lite_image_matrix(&matrix, coords->x1, coords->y1, dsc); + + LV_VG_LITE_ASSERT_SRC_BUFFER(&src_buf); + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + + /* If clipping is not required, blit directly */ + if(_lv_area_is_in(&image_tf_area, draw_unit->clip_area, false)) { + /* The image area is the coordinates relative to the image itself */ + lv_area_t src_area = *coords; + lv_area_move(&src_area, -coords->x1, -coords->y1); + + /* rect is used to crop the pixel-aligned padding area */ + vg_lite_rectangle_t rect; + lv_vg_lite_rect(&rect, &src_area); + + LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect"); + LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect( + &u->target_buffer, + &src_buf, + &rect, + &matrix, + lv_vg_lite_blend_mode(dsc->blend_mode), + color, + filter)); + LV_PROFILER_END_TAG("vg_lite_blit_rect"); + } + else { + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_append_rect( + path, + clip_area.x1, clip_area.y1, + lv_area_get_width(&clip_area), lv_area_get_height(&clip_area), + 0, 0); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + lv_vg_lite_path_end(path); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + + vg_lite_matrix_t path_matrix; + vg_lite_identity(&path_matrix); + lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &path_matrix, + &src_buf, + &matrix, + lv_vg_lite_blend_mode(dsc->blend_mode), + VG_LITE_PATTERN_COLOR, + 0, + color, + filter)); + LV_PROFILER_END_TAG("vg_lite_draw_pattern"); + + lv_vg_lite_path_drop(u, path); + } + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c new file mode 100644 index 0000000..6c422ae --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c @@ -0,0 +1,361 @@ +/** + * @file lv_draw_vg_lite_label.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#include "../../lvgl.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" +#include "lv_draw_vg_lite_type.h" + +/********************* + * DEFINES + *********************/ + +#define PATH_QUALITY VG_LITE_HIGH +#define PATH_DATA_COORD_FORMAT VG_LITE_S16 +#define FT_F26DOT6_SHIFT 6 + +/** After converting the font reference size, it is also necessary to scale the 26dot6 data + * in the path to the real physical size + */ +#define FT_F26DOT6_TO_PATH_SCALE(x) (LV_FREETYPE_F26DOT6_TO_FLOAT(x) / (1 << FT_F26DOT6_SHIFT)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc); + +#if LV_USE_FREETYPE + static void freetype_outline_event_cb(lv_event_t * e); + static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc); +#endif /* LV_USE_FREETYPE */ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_BEGIN; + +#if LV_USE_FREETYPE + static bool is_init = false; + if(!is_init) { + lv_freetype_outline_add_event(freetype_outline_event_cb, LV_EVENT_ALL, draw_unit); + is_init = true; + } +#endif /* LV_USE_FREETYPE */ + + lv_draw_label_iterate_characters(draw_unit, dsc, coords, draw_letter_cb); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_A1: + case LV_FONT_GLYPH_FORMAT_A2: + case LV_FONT_GLYPH_FORMAT_A4: + case LV_FONT_GLYPH_FORMAT_A8: { + draw_letter_bitmap(u, glyph_draw_dsc); + } + break; + +#if LV_USE_FREETYPE + case LV_FONT_GLYPH_FORMAT_VECTOR: { + if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) { + draw_letter_outline(u, glyph_draw_dsc); + } + } + break; +#endif /* LV_USE_FREETYPE */ + + case LV_FONT_GLYPH_FORMAT_IMAGE: { + lv_draw_image_dsc_t image_dsc; + lv_draw_image_dsc_init(&image_dsc); + image_dsc.opa = glyph_draw_dsc->opa; + image_dsc.src = glyph_draw_dsc->glyph_data; + lv_draw_vg_lite_img(draw_unit, &image_dsc, glyph_draw_dsc->letter_coords, false); + } + break; + +#if LV_USE_FONT_PLACEHOLDER + case LV_FONT_GLYPH_FORMAT_NONE: { + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_vg_lite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); + } + break; +#endif /* LV_USE_FONT_PLACEHOLDER */ + + default: + break; + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_vg_lite_fill(draw_unit, fill_draw_dsc, fill_area); + } +} + +static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc) +{ + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, u->base_unit.clip_area, dsc->letter_coords)) { + return; + } + + LV_PROFILER_BEGIN; + + lv_area_t image_area = *dsc->letter_coords; + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + vg_lite_translate(image_area.x1, image_area.y1, &matrix); + + vg_lite_buffer_t src_buf; + lv_draw_buf_t * draw_buf = dsc->glyph_data; + lv_vg_lite_buffer_from_draw_buf(&src_buf, draw_buf); + + vg_lite_color_t color; + color = lv_vg_lite_color(dsc->color, dsc->opa, true); + + LV_VG_LITE_ASSERT_SRC_BUFFER(&src_buf); + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + + /* If clipping is not required, blit directly */ + if(_lv_area_is_in(&image_area, u->base_unit.clip_area, false)) { + /* The image area is the coordinates relative to the image itself */ + lv_area_t src_area = image_area; + lv_area_move(&src_area, -image_area.x1, -image_area.y1); + + /* rect is used to crop the pixel-aligned padding area */ + vg_lite_rectangle_t rect; + lv_vg_lite_rect(&rect, &src_area); + LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect"); + LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect( + &u->target_buffer, + &src_buf, + &rect, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color, + VG_LITE_FILTER_LINEAR)); + LV_PROFILER_END_TAG("vg_lite_blit_rect"); + } + else { + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16); + lv_vg_lite_path_append_rect( + path, + clip_area.x1, clip_area.y1, + lv_area_get_width(&clip_area), lv_area_get_height(&clip_area), + 0, 0); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + lv_vg_lite_path_end(path); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + + vg_lite_matrix_t path_matrix; + vg_lite_identity(&path_matrix); + lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &path_matrix, + &src_buf, + &matrix, + VG_LITE_BLEND_SRC_OVER, + VG_LITE_PATTERN_COLOR, + color, + color, + VG_LITE_FILTER_LINEAR)); + LV_PROFILER_END_TAG("vg_lite_draw_pattern"); + + lv_vg_lite_path_drop(u, path); + } + + /* TODO: The temporary buffer of the built-in font is reused. + * You need to wait for the GPU to finish using the buffer before releasing it. + * Later, use the font cache for management to improve efficiency. + */ + lv_vg_lite_finish(u); + LV_PROFILER_END; +} + +#if LV_USE_FREETYPE + +static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_dsc_t * dsc) +{ + /* get clip area */ + lv_area_t path_clip_area; + if(!_lv_area_intersect(&path_clip_area, u->base_unit.clip_area, dsc->letter_coords)) { + return; + } + + LV_PROFILER_BEGIN; + + /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */ + path_clip_area.x2++; + path_clip_area.y2++; + + lv_vg_lite_path_t * outline = (lv_vg_lite_path_t *)dsc->glyph_data; + lv_point_t pos = {dsc->letter_coords->x1, dsc->letter_coords->y1}; + + /* calc convert matrix */ + float scale = FT_F26DOT6_TO_PATH_SCALE(lv_freetype_outline_get_scale(dsc->g->resolved_font)); + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /* convert to vg-lite coordinate */ + vg_lite_translate(pos.x - dsc->g->ofs_x, pos.y + dsc->g->box_h + dsc->g->ofs_y, &matrix); + + /* scale size */ + vg_lite_scale(scale, scale, &matrix); + + /* Cartesian coordinates to LCD coordinates */ + lv_vg_lite_matrix_flip_y(&matrix); + + /* calc inverse matrix */ + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { + LV_LOG_ERROR("no inverse matrix"); + LV_PROFILER_END; + return; + } + + lv_point_precise_t p1 = { path_clip_area.x1, path_clip_area.y1 }; + lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1); + + lv_point_precise_t p2 = { path_clip_area.x2, path_clip_area.y2 }; + lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2); + + /* Since the font uses Cartesian coordinates, the y coordinates need to be reversed */ + lv_vg_lite_path_set_bonding_box(outline, p1_res.x, p2_res.y, p2_res.x, p1_res.y); + + /* Move to the position relative to the first address of the buffer */ + lv_layer_t * layer = u->base_unit.target_layer; + vg_lite_translate(-layer->buf_area.x1 / scale, layer->buf_area.y1 / scale, &matrix); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(outline); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, vg_lite_path, VG_LITE_FILL_NON_ZERO, + &matrix, VG_LITE_BLEND_SRC_OVER, lv_vg_lite_color(dsc->color, dsc->opa, true))); + LV_PROFILER_END_TAG("vg_lite_draw"); + + /* Flush in time to avoid accumulation of drawing commands */ + lv_vg_lite_flush(u); + + LV_PROFILER_END; +} + +static void vg_lite_outline_push(const lv_freetype_outline_event_param_t * param) +{ + LV_PROFILER_BEGIN; + lv_vg_lite_path_t * outline = param->outline; + LV_ASSERT_NULL(outline); + + lv_freetype_outline_type_t type = param->type; + switch(type) { + case LV_FREETYPE_OUTLINE_END: + lv_vg_lite_path_end(outline); + break; + case LV_FREETYPE_OUTLINE_MOVE_TO: + lv_vg_lite_path_move_to(outline, param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_LINE_TO: + lv_vg_lite_path_line_to(outline, param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_CUBIC_TO: + lv_vg_lite_path_cubic_to(outline, param->control1.x, param->control1.y, + param->control2.x, param->control2.y, + param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_CONIC_TO: + lv_vg_lite_path_quad_to(outline, param->control1.x, param->control1.y, + param->to.x, param->to.y); + break; + default: + LV_LOG_ERROR("unknown point type: %d", type); + LV_ASSERT(false); + break; + } + LV_PROFILER_END; +} + +static void freetype_outline_event_cb(lv_event_t * e) +{ + LV_PROFILER_BEGIN; + lv_event_code_t code = lv_event_get_code(e); + lv_freetype_outline_event_param_t * param = lv_event_get_param(e); + switch(code) { + case LV_EVENT_CREATE: + param->outline = lv_vg_lite_path_create(PATH_DATA_COORD_FORMAT); + lv_vg_lite_path_set_quality(param->outline, PATH_QUALITY); + break; + case LV_EVENT_DELETE: + lv_vg_lite_path_destroy(param->outline); + break; + case LV_EVENT_INSERT: + vg_lite_outline_push(param); + break; + default: + LV_LOG_WARN("unknown event code: %d", code); + break; + } + LV_PROFILER_END; +} + +#endif /* LV_USE_FREETYPE */ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c new file mode 100644 index 0000000..f79f418 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c @@ -0,0 +1,74 @@ +/** + * @file lv_draw_vg_lite_layer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "lv_draw_vg_lite_type.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + lv_layer_t * layer = (lv_layer_t *)draw_dsc->src; + struct _lv_draw_vg_lite_unit_t * u = (struct _lv_draw_vg_lite_unit_t *)draw_unit; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer->draw_buf == NULL) + return; + + LV_PROFILER_BEGIN; + + /* The GPU output should already be premultiplied RGB */ + if(!lv_draw_buf_has_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) { + LV_LOG_WARN("Non-premultiplied layer buffer for GPU to draw."); + } + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer->draw_buf; + lv_draw_vg_lite_img(draw_unit, &new_draw_dsc, coords, true); + + /* Wait for the GPU drawing to complete here, + * otherwise it may cause the drawing to fail. */ + lv_vg_lite_finish(u); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c new file mode 100644 index 0000000..f986950 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c @@ -0,0 +1,218 @@ +/** + * @file lv_draw_vg_lite_line.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +#define SQ(x) ((x) * (x)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + + float p1_x = dsc->p1.x; + float p1_y = dsc->p1.y; + float p2_x = dsc->p2.x; + float p2_y = dsc->p2.y; + + if(p1_x == p2_x && p1_y == p2_y) + return; + + float half_w = dsc->width * 0.5f; + + lv_area_t rel_clip_area; + rel_clip_area.x1 = (int32_t)(LV_MIN(p1_x, p2_x) - half_w); + rel_clip_area.x2 = (int32_t)(LV_MAX(p1_x, p2_x) + half_w); + rel_clip_area.y1 = (int32_t)(LV_MIN(p1_y, p2_y) - half_w); + rel_clip_area.y2 = (int32_t)(LV_MAX(p1_y, p2_y) + half_w); + + if(!_lv_area_intersect(&rel_clip_area, &rel_clip_area, draw_unit->clip_area)) { + return; /*Fully clipped, nothing to do*/ + } + + LV_PROFILER_BEGIN; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + int32_t dash_width = dsc->dash_width; + int32_t dash_gap = dsc->dash_gap; + int32_t dash_l = dash_width + dash_gap; + + float dx = p2_x - p1_x; + float dy = p2_y - p1_y; + float inv_dl = math_fast_inv_sqrtf(SQ(dx) + SQ(dy)); + float w_dx = dsc->width * dy * inv_dl; + float w_dy = dsc->width * dx * inv_dl; + float w2_dx = w_dx / 2; + float w2_dy = w_dy / 2; + + int32_t ndash = 0; + if(dash_width && dash_l * inv_dl < 1.0f) { + ndash = (int32_t)((1.0f / inv_dl + dash_l - 1) / dash_l); + } + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, VG_LITE_MEDIUM); + lv_vg_lite_path_set_bonding_box_area(path, &rel_clip_area); + + /* head point */ + float head_start_x = p1_x + w2_dx; + float head_start_y = p1_y - w2_dy; + float head_end_x = p1_x - w2_dx; + float head_end_y = p1_y + w2_dy; + + /* tail point */ + float tail_start_x = p2_x - w2_dx; + float tail_start_y = p2_y + w2_dy; + float tail_end_x = p2_x + w2_dx; + float tail_end_y = p2_y - w2_dy; + + /* + head_start tail_end + *-----------------* + /| |\ + / | | \ + arc_c *( *p1 p2* )* arc_c + \ | | / + \| |/ + *-----------------* + head_end tail_start + */ + + /* move to start point */ + lv_vg_lite_path_move_to(path, head_start_x, head_start_y); + + /* draw line head */ + if(dsc->round_start) { + float arc_cx = p1_x - w2_dy; + float arc_cy = p1_y - w2_dx; + + /* start 90deg arc */ + lv_vg_lite_path_append_arc_right_angle(path, + head_start_x, head_start_y, + p1_x, p1_y, + arc_cx, arc_cy); + + /* end 90deg arc */ + lv_vg_lite_path_append_arc_right_angle(path, + arc_cx, arc_cy, + p1_x, p1_y, + head_end_x, head_end_y); + } + else { + lv_vg_lite_path_line_to(path, head_end_x, head_end_y); + } + + /* draw line body */ + lv_vg_lite_path_line_to(path, tail_start_x, tail_start_y); + + /* draw line tail */ + if(dsc->round_end) { + float arc_cx = p2_x + w2_dy; + float arc_cy = p2_y + w2_dx; + lv_vg_lite_path_append_arc_right_angle(path, + tail_start_x, tail_start_y, + p2_x, p2_y, + arc_cx, arc_cy); + lv_vg_lite_path_append_arc_right_angle(path, + arc_cx, arc_cy, + p2_x, p2_y, + tail_end_x, tail_end_y); + } + else { + lv_vg_lite_path_line_to(path, tail_end_x, tail_end_y); + } + + /* close draw line body */ + lv_vg_lite_path_line_to(path, head_start_x, head_start_y); + + for(int32_t i = 0; i < ndash; i++) { + float start_x = p1_x - w2_dx + dx * (i * dash_l + dash_width) * inv_dl; + float start_y = p1_y + w2_dy + dy * (i * dash_l + dash_width) * inv_dl; + + lv_vg_lite_path_move_to(path, start_x, start_y); + lv_vg_lite_path_line_to(path, + p1_x + w2_dx + dx * (i * dash_l + dash_width) * inv_dl, + p1_y - w2_dy + dy * (i * dash_l + dash_width) * inv_dl); + lv_vg_lite_path_line_to(path, + p1_x + w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y - w2_dy + dy * (i + 1) * dash_l * inv_dl); + lv_vg_lite_path_line_to(path, + p1_x - w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y + w2_dy + dy * (i + 1) * dash_l * inv_dl); + lv_vg_lite_path_line_to(path, start_x, start_y); + } + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + + vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c new file mode 100644 index 0000000..a7cbda0 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c @@ -0,0 +1,98 @@ +/** + * @file lv_draw_vg_lite_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "lv_draw_vg_lite_type.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + LV_UNUSED(coords); + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, &dsc->area, draw_unit->clip_area)) { + return; + } + + LV_PROFILER_BEGIN; + + lv_draw_sw_mask_radius_param_t param; + lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false); + + void * masks[2] = {0}; + masks[0] = ¶m; + + uint32_t area_w = lv_area_get_width(&draw_area); + lv_opa_t * mask_buf = lv_malloc(area_w); + + int32_t y; + for(y = draw_area.y1; y <= draw_area.y2; y++) { + lv_memset(mask_buf, 0xff, area_w); + lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); + if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue; + + lv_layer_t * target_layer = draw_unit->target_layer; + lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - target_layer->buf_area.x1, + y - target_layer->buf_area.y1); + + if(res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(c32_buf, area_w * sizeof(lv_color32_t)); + } + else { + uint32_t i; + for(i = 0; i < area_w; i++) { + if(mask_buf[i] != LV_OPA_COVER) { + c32_buf[i].alpha = LV_OPA_MIX2(c32_buf[i].alpha, mask_buf[i]); + } + + /*Pre-multiply the alpha*/ + lv_color_premultiply(&c32_buf[i]); + } + } + } + + lv_free(mask_buf); + lv_draw_sw_mask_free_param(¶m); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c new file mode 100644 index 0000000..868f23a --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c @@ -0,0 +1,115 @@ +/** + * @file lv_draw_vg_lite_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_grad.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) +{ + if(dsc->bg_opa <= LV_OPA_MIN) return; + + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + bool is_common; + lv_area_t clip_area; + is_common = _lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area); + if(!is_common) return; + + LV_PROFILER_BEGIN; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_bonding_box_area(path, &clip_area); + lv_vg_lite_path_move_to(path, dsc->p[0].x, dsc->p[0].y); + lv_vg_lite_path_line_to(path, dsc->p[1].x, dsc->p[1].y); + lv_vg_lite_path_line_to(path, dsc->p[2].x, dsc->p[2].y); + lv_vg_lite_path_close(path); + lv_vg_lite_path_end(path); + + vg_lite_path_t * vg_lite_path = lv_vg_lite_path_get_path(path); + + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + LV_VG_LITE_ASSERT_PATH(vg_lite_path); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + vg_lite_matrix_t grad_matrix; + lv_vg_lite_grad_area_to_matrix(&grad_matrix, &tri_area, dsc->bg_grad.dir); + lv_vg_lite_draw_linear_grad( + u, + &u->target_buffer, + vg_lite_path, + &dsc->bg_grad, + &grad_matrix, + &matrix, + VG_LITE_FILL_EVEN_ODD, + VG_LITE_BLEND_SRC_OVER); + } + else { /* normal fill */ + vg_lite_color_t color = lv_vg_lite_color(dsc->bg_color, dsc->bg_opa, true); + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_lite_path, + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + } + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h new file mode 100644 index 0000000..3609f92 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h @@ -0,0 +1,67 @@ +/** + * @file lv_draw_vg_lite_type.h + * + */ + +#ifndef LV_DRAW_VG_LITE_TYPE_H +#define LV_DRAW_VG_LITE_TYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../lv_draw.h" +#include "../../misc/lv_array.h" + +#if LV_USE_VG_LITE_THORVG +#include "../../others/vg_lite_tvg/vg_lite.h" +#else +#include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_pending_t; + +struct _lv_draw_vg_lite_unit_t { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + struct _lv_vg_lite_pending_t * image_dsc_pending; + lv_cache_t * grad_cache; + struct _lv_vg_lite_pending_t * grad_pending; + uint16_t flush_count; + vg_lite_buffer_t target_buffer; + vg_lite_matrix_t global_matrix; + struct _lv_vg_lite_path_t * global_path; + bool path_in_use; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_DRAW_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c new file mode 100644 index 0000000..0485c0b --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c @@ -0,0 +1,476 @@ +/** + * @file lv_draw_vg_lite_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_grad.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc); +static void lv_matrix_to_vg(vg_lite_matrix_t * desy, const lv_matrix_t * src); +static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src); +static void lv_path_opa_to_vg(lv_vg_lite_path_t * dest, const lv_vector_draw_dsc_t * dsc); +static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc); +static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend); +static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule); +static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread); +static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap); +static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc_t * dsc) +{ + if(dsc->task_list == NULL) + return; + + lv_layer_t * layer = dsc->base.layer; + if(layer->draw_buf == NULL) + return; + + LV_PROFILER_BEGIN; + _lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, draw_unit); + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_color_t lv_color32_to_vg(lv_color32_t color, lv_opa_t opa) +{ + uint8_t a = LV_OPA_MIX2(color.alpha, opa); + if(a < LV_OPA_MAX) { + color.red = LV_UDIV255(color.red * opa); + color.green = LV_UDIV255(color.green * opa); + color.blue = LV_UDIV255(color.blue * opa); + } + return (uint32_t)a << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; +} + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc) +{ + LV_PROFILER_BEGIN; + lv_draw_vg_lite_unit_t * u = ctx; + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + + /* clear area */ + if(!path) { + /* clear color needs to ignore fill_dsc.opa */ + vg_lite_color_t c = lv_color32_to_vg(dsc->fill_dsc.color, LV_OPA_COVER); + vg_lite_rectangle_t rect; + lv_vg_lite_rect(&rect, &dsc->scissor_area); + LV_PROFILER_BEGIN_TAG("vg_lite_clear"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear(&u->target_buffer, &rect, c)); + LV_PROFILER_END_TAG("vg_lite_clear"); + LV_PROFILER_END; + return; + } + + /* convert color */ + vg_lite_color_t vg_color = lv_color32_to_vg(dsc->fill_dsc.color, dsc->fill_dsc.opa); + + /* transform matrix */ + vg_lite_matrix_t matrix; + lv_matrix_to_vg(&matrix, &dsc->matrix); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + /* convert path */ + lv_vg_lite_path_t * lv_vg_path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_path_to_vg(lv_vg_path, path); + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(lv_vg_path); + LV_VG_LITE_ASSERT_PATH(vg_path); + + /* convert path type */ + lv_path_opa_to_vg(lv_vg_path, dsc); + + /* convert blend mode and fill rule */ + vg_lite_blend_t blend = lv_blend_to_vg(dsc->blend_mode); + vg_lite_fill_t fill = lv_fill_to_vg(dsc->fill_dsc.fill_rule); + + /* convert stroke style */ + lv_stroke_to_vg(lv_vg_path, &dsc->stroke_dsc); + + /* get path bounds */ + float min_x, min_y, max_x, max_y; + lv_vg_lite_path_get_bonding_box(lv_vg_path, &min_x, &min_y, &max_x, &max_y); + + if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { + /* set scissor area */ + lv_vg_lite_set_scissor_area(&dsc->scissor_area); + } + else { + /* calc inverse matrix */ + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { + LV_LOG_ERROR("no inverse matrix"); + LV_PROFILER_END; + return; + } + + /* Reverse the clip area on the source */ + lv_point_precise_t p1 = { dsc->scissor_area.x1, dsc->scissor_area.y1 }; + lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1); + + /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */ + lv_point_precise_t p2 = { dsc->scissor_area.x2 + 1, dsc->scissor_area.y2 + 1 }; + lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2); + + lv_vg_lite_path_set_bonding_box(lv_vg_path, p1_res.x, p1_res.y, p2_res.x, p2_res.y); + } + + switch(dsc->fill_dsc.style) { + case LV_VECTOR_DRAW_STYLE_SOLID: { + /* normal draw shape */ + LV_PROFILER_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + &u->target_buffer, + vg_path, + fill, + &matrix, + blend, + vg_color)); + LV_PROFILER_END_TAG("vg_lite_draw"); + } + break; + case LV_VECTOR_DRAW_STYLE_PATTERN: { + /* draw image */ + vg_lite_buffer_t image_buffer; + lv_image_decoder_dsc_t decoder_dsc; + if(lv_vg_lite_buffer_open_image(&image_buffer, &decoder_dsc, dsc->fill_dsc.img_dsc.src, false)) { + /* Calculate pattern matrix. Should start from path bond box, and also apply fill matrix. */ + lv_matrix_t m = dsc->matrix; + lv_matrix_translate(&m, min_x, min_y); + lv_matrix_multiply(&m, &dsc->fill_dsc.matrix); + + vg_lite_matrix_t pattern_matrix; + lv_matrix_to_vg(&pattern_matrix, &m); + + vg_lite_color_t recolor = lv_vg_lite_color(dsc->fill_dsc.img_dsc.recolor, dsc->fill_dsc.img_dsc.recolor_opa, true); + + LV_VG_LITE_ASSERT_MATRIX(&pattern_matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( + &u->target_buffer, + vg_path, + fill, + &matrix, + &image_buffer, + &pattern_matrix, + blend, + VG_LITE_PATTERN_COLOR, + recolor, + vg_color, + VG_LITE_FILTER_BI_LINEAR)); + LV_PROFILER_END_TAG("vg_lite_draw_pattern"); + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + } + } + break; + case LV_VECTOR_DRAW_STYLE_GRADIENT: { + /* draw gradient */ + lv_vector_gradient_style_t style = dsc->fill_dsc.gradient.style; + vg_lite_gradient_spreadmode_t spreadmode = lv_spread_to_vg(dsc->fill_dsc.gradient.spread); + LV_UNUSED(spreadmode); + + if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) { + vg_lite_matrix_t grad_matrix, fill_matrix; + lv_area_t grad_area; + lv_area_set(&grad_area, (int32_t)min_x, (int32_t)min_y, (int32_t)max_x, (int32_t)max_y); + lv_vg_lite_grad_area_to_matrix(&grad_matrix, &grad_area, LV_GRAD_DIR_HOR); + + lv_matrix_to_vg(&fill_matrix, &dsc->fill_dsc.matrix); + lv_vg_lite_matrix_multiply(&grad_matrix, &matrix); + lv_vg_lite_matrix_multiply(&grad_matrix, &fill_matrix); + + lv_vg_lite_draw_linear_grad( + u, + &u->target_buffer, + vg_path, + &dsc->fill_dsc.gradient.grad, + &grad_matrix, + &matrix, + fill, + blend); + } + else if(style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + if(vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) { + /* TODO: radial gradient */ + } + else { + LV_LOG_WARN("radial gradient is not supported"); + } + } + } + break; + default: + LV_LOG_WARN("unknown style: %d", dsc->fill_dsc.style); + break; + } + + /* Flush in time to avoid accumulation of drawing commands */ + lv_vg_lite_flush(u); + + /* drop path */ + lv_vg_lite_path_drop(u, lv_vg_path); + + if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { + /* disable scissor */ + lv_vg_lite_disable_scissor(); + } + + LV_PROFILER_END; +} + +static void lv_matrix_to_vg(vg_lite_matrix_t * dest, const lv_matrix_t * src) +{ + lv_memcpy(dest, src, sizeof(lv_matrix_t)); +} + +static vg_lite_quality_t lv_quality_to_vg(lv_vector_path_quality_t quality) +{ + switch(quality) { + case LV_VECTOR_PATH_QUALITY_LOW: + return VG_LITE_LOW; + case LV_VECTOR_PATH_QUALITY_MEDIUM: + return VG_LITE_MEDIUM; + case LV_VECTOR_PATH_QUALITY_HIGH: + return VG_LITE_HIGH; + default: + return VG_LITE_MEDIUM; + } +} + +static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src) +{ + LV_PROFILER_BEGIN; + lv_vg_lite_path_set_quality(dest, lv_quality_to_vg(src->quality)); + + /* init bounds */ + float min_x = __FLT_MAX__; + float min_y = __FLT_MAX__; + float max_x = __FLT_MIN__; + float max_y = __FLT_MIN__; + +#define CMP_BOUNDS(point) \ + do { \ + if((point)->x < min_x) min_x = (point)->x; \ + if((point)->y < min_y) min_y = (point)->y; \ + if((point)->x > max_x) max_x = (point)->x; \ + if((point)->y > max_y) max_y = (point)->y; \ + } while(0) + + uint32_t pidx = 0; + lv_vector_path_op_t * op = lv_array_front(&src->ops); + uint32_t size = lv_array_size(&src->ops); + for(uint32_t i = 0; i < size; i++) { + switch(op[i]) { + case LV_VECTOR_PATH_OP_MOVE_TO: { + const lv_fpoint_t * pt = lv_array_at(&src->points, pidx); + CMP_BOUNDS(pt); + lv_vg_lite_path_move_to(dest, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_LINE_TO: { + const lv_fpoint_t * pt = lv_array_at(&src->points, pidx); + CMP_BOUNDS(pt); + lv_vg_lite_path_line_to(dest, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_QUAD_TO: { + const lv_fpoint_t * pt1 = lv_array_at(&src->points, pidx); + const lv_fpoint_t * pt2 = lv_array_at(&src->points, pidx + 1); + CMP_BOUNDS(pt1); + CMP_BOUNDS(pt2); + lv_vg_lite_path_quad_to(dest, pt1->x, pt1->y, pt2->x, pt2->y); + pidx += 2; + } + break; + case LV_VECTOR_PATH_OP_CUBIC_TO: { + const lv_fpoint_t * pt1 = lv_array_at(&src->points, pidx); + const lv_fpoint_t * pt2 = lv_array_at(&src->points, pidx + 1); + const lv_fpoint_t * pt3 = lv_array_at(&src->points, pidx + 2); + CMP_BOUNDS(pt1); + CMP_BOUNDS(pt2); + CMP_BOUNDS(pt3); + lv_vg_lite_path_cubic_to(dest, pt1->x, pt1->y, pt2->x, pt2->y, pt3->x, pt3->y); + pidx += 3; + } + break; + case LV_VECTOR_PATH_OP_CLOSE: { + lv_vg_lite_path_close(dest); + } + break; + } + } + + lv_vg_lite_path_end(dest); + lv_vg_lite_path_set_bonding_box(dest, min_x, min_y, max_x, max_y); + LV_PROFILER_END; +} + +static void lv_path_opa_to_vg(lv_vg_lite_path_t * dest, const lv_vector_draw_dsc_t * dsc) +{ + vg_lite_path_type_t path_type = VG_LITE_DRAW_ZERO; + lv_opa_t fill_opa = dsc->fill_dsc.opa; + lv_opa_t stroke_opa = dsc->stroke_dsc.opa; + + if(fill_opa > LV_OPA_0 && stroke_opa > LV_OPA_0) { + path_type = VG_LITE_DRAW_FILL_STROKE_PATH; + } + else if(fill_opa == LV_OPA_0 && stroke_opa > LV_OPA_0) { + path_type = VG_LITE_DRAW_STROKE_PATH; + } + else if(fill_opa > LV_OPA_0) { + path_type = VG_LITE_DRAW_FILL_PATH; + } + + LV_VG_LITE_CHECK_ERROR(vg_lite_set_path_type(lv_vg_lite_path_get_path(dest), path_type)); +} + +static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc) +{ + LV_ASSERT_NULL(dest); + LV_ASSERT_NULL(dsc); + + /* if stroke opa is 0, no need to set stroke */ + if(dsc->opa == LV_OPA_0) { + return; + } + + vg_lite_path_t * path = lv_vg_lite_path_get_path(dest); + + LV_VG_LITE_CHECK_ERROR( + vg_lite_set_stroke( + path, + lv_stroke_cap_to_vg(dsc->cap), + lv_stroke_join_to_vg(dsc->join), + dsc->width, + dsc->miter_limit, + lv_array_front(&dsc->dash_pattern), + dsc->dash_pattern.size, + dsc->width / 2, + lv_color32_to_vg(dsc->color, dsc->opa)) + ); + + LV_VG_LITE_CHECK_ERROR(vg_lite_update_stroke(path)); +} + +static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend) +{ + switch(blend) { + case LV_VECTOR_BLEND_SRC_OVER: + return VG_LITE_BLEND_SRC_OVER; + case LV_VECTOR_BLEND_SCREEN: + return VG_LITE_BLEND_SCREEN; + case LV_VECTOR_BLEND_MULTIPLY: + return VG_LITE_BLEND_MULTIPLY; + case LV_VECTOR_BLEND_NONE: + return VG_LITE_BLEND_NONE; + case LV_VECTOR_BLEND_ADDITIVE: + return VG_LITE_BLEND_ADDITIVE; + case LV_VECTOR_BLEND_SRC_IN: + return VG_LITE_BLEND_SRC_IN; + case LV_VECTOR_BLEND_DST_OVER: + return VG_LITE_BLEND_DST_OVER; + case LV_VECTOR_BLEND_DST_IN: + return VG_LITE_BLEND_DST_IN; + case LV_VECTOR_BLEND_SUBTRACTIVE: + return VG_LITE_BLEND_SUBTRACT; + default: + return VG_LITE_BLEND_SRC_OVER; + } +} + +static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule) +{ + switch(fill_rule) { + case LV_VECTOR_FILL_NONZERO: + return VG_LITE_FILL_NON_ZERO; + case LV_VECTOR_FILL_EVENODD: + return VG_LITE_FILL_EVEN_ODD; + default: + return VG_LITE_FILL_NON_ZERO; + } +} + +static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread) +{ + switch(spread) { + case LV_VECTOR_GRADIENT_SPREAD_PAD: + return VG_LITE_GRADIENT_SPREAD_PAD; + case LV_VECTOR_GRADIENT_SPREAD_REPEAT: + return VG_LITE_GRADIENT_SPREAD_REPEAT; + case LV_VECTOR_GRADIENT_SPREAD_REFLECT: + return VG_LITE_GRADIENT_SPREAD_REFLECT; + default: + return VG_LITE_GRADIENT_SPREAD_FILL; + } +} + +static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap) +{ + switch(cap) { + case LV_VECTOR_STROKE_CAP_SQUARE: + return VG_LITE_CAP_SQUARE; + case LV_VECTOR_STROKE_CAP_ROUND: + return VG_LITE_CAP_ROUND; + case LV_VECTOR_STROKE_CAP_BUTT: + return VG_LITE_CAP_BUTT; + default: + return VG_LITE_CAP_SQUARE; + } +} + +static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join) +{ + switch(join) { + case LV_VECTOR_STROKE_JOIN_BEVEL: + return VG_LITE_JOIN_BEVEL; + case LV_VECTOR_STROKE_JOIN_ROUND: + return VG_LITE_JOIN_ROUND; + case LV_VECTOR_STROKE_JOIN_MITER: + return VG_LITE_JOIN_MITER; + default: + return VG_LITE_JOIN_BEVEL; + } +} + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c new file mode 100644 index 0000000..a0f0523 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c @@ -0,0 +1,428 @@ +/** + * @file lv_vg_lite_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_decoder.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/* VG_LITE_INDEX1, 2, and 4 require endian flipping + bit flipping, + * so for simplicity, they are uniformly converted to I8 for display. + */ +#define DEST_IMG_FORMAT LV_COLOR_FORMAT_I8 + +/* Since the palette and index image are next to each other, + * the palette size needs to be aligned to ensure that the image is aligned. + */ +#define DEST_IMG_OFFSET \ + LV_VG_LITE_ALIGN(LV_COLOR_INDEXED_PALETTE_SIZE(DEST_IMG_FORMAT) * sizeof(lv_color32_t), LV_DRAW_BUF_ALIGN) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_buf_t yuv; /*A draw buffer struct for yuv variable image*/ +} decoder_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_decoder_init(void) +{ + lv_image_decoder_t * decoder = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(decoder, decoder_info); + lv_image_decoder_set_open_cb(decoder, decoder_open); + lv_image_decoder_set_close_cb(decoder, decoder_close); + lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/ +} + +void lv_vg_lite_decoder_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size) +{ + while(px_size--) { + lv_color_premultiply(img_data); + img_data++; + } +} + +static uint32_t image_stride(const lv_image_header_t * header) +{ + /* use stride in header */ + if(header->stride) { + return header->stride; + } + + /* guess stride */ + uint32_t ori_stride = header->w * lv_color_format_get_bpp(header->cf); + ori_stride = (ori_stride + 7) >> 3; /*Round up*/ + return ori_stride; +} + +static void image_decode_to_index8_line(uint8_t * dest, const uint8_t * src, int32_t w_px, + lv_color_format_t color_format) +{ + uint8_t px_size; + uint16_t mask; + + int8_t shift = 0; + switch(color_format) { + case LV_COLOR_FORMAT_I1: + px_size = 1; + shift = 7; + break; + case LV_COLOR_FORMAT_I2: + px_size = 2; + shift = 6; + break; + case LV_COLOR_FORMAT_I4: + px_size = 4; + shift = 4; + break; + case LV_COLOR_FORMAT_I8: + lv_memcpy(dest, src, w_px); + return; + default: + LV_ASSERT_FORMAT_MSG(false, "Unsupported color format: %d", color_format); + return; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + for(int32_t i = 0; i < w_px; i++) { + uint8_t val_act = (*src >> shift) & mask; + dest[i] = val_act; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + src++; + } + } +} + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + lv_result_t res = lv_bin_decoder_info(decoder, src, header); + if(res != LV_RESULT_OK) { + return res; + } + + if(LV_COLOR_FORMAT_IS_YUV(header->cf)) { + return LV_RESULT_OK; + } + + if(LV_COLOR_FORMAT_IS_INDEXED(header->cf)) { + header->cf = DEST_IMG_FORMAT; + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; +} + +static lv_result_t decoder_open_variable(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_draw_buf_t src_img_buf; + lv_draw_buf_from_image(&src_img_buf, dsc->src); + + /* Since dsc->header.cf is uniformly set to I8, + * the original format is obtained from src for conversion. + */ + lv_color_format_t src_cf = src_img_buf.header.cf; + + int32_t width = dsc->header.w; + int32_t height = dsc->header.h; + + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + const uint8_t * image_data = ((lv_image_dsc_t *)dsc->src)->data; + uint32_t image_data_size = ((lv_image_dsc_t *)dsc->src)->data_size; + + /* if is YUV format, no need to copy */ + if(LV_COLOR_FORMAT_IS_YUV(src_cf)) { + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data == NULL) { + decoder_data = lv_malloc_zeroed(sizeof(decoder_data_t)); + LV_ASSERT_MALLOC(decoder_data); + } + lv_draw_buf_t * draw_buf = &decoder_data->yuv; + uint32_t stride = lv_draw_buf_width_to_stride(width, src_cf); + lv_draw_buf_init(draw_buf, width, height, src_cf, stride, (void *)image_data, image_data_size); + + /* Use alloced bit to indicate we should not free the memory */ + draw_buf->header.flags &= ~LV_IMAGE_FLAGS_ALLOCATED; + + /* Do not add this kind of image to cache, since its life is managed by user. */ + dsc->args.no_cache = true; + + dsc->decoded = draw_buf; + return LV_RESULT_OK; + } + + /* create draw buf */ + lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + return LV_RESULT_INVALID; + } + dsc->decoded = draw_buf; + + uint32_t src_stride = image_stride(&src_img_buf.header); + uint32_t dest_stride = draw_buf->header.stride; + + const uint8_t * src = image_data; + uint8_t * dest = draw_buf->data; + + /* index format only */ + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_cf); + LV_ASSERT(palette_size > 0); + + uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t); + + /* copy palette */ + lv_memcpy(dest, src, palette_size_bytes); + + if(!dsc->args.premultiply) { + /* pre-multiply palette */ + image_color32_pre_mul((lv_color32_t *)dest, palette_size); + draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; + } + + /* move to index image map */ + src += palette_size_bytes; + dest += DEST_IMG_OFFSET; + + /* copy index image */ + for(int32_t y = 0; y < height; y++) { + image_decode_to_index8_line(dest, src, width, src_cf); + src += src_stride; + dest += dest_stride; + } + + /* invalidate D-Cache */ + lv_draw_buf_invalidate_cache(draw_buf, NULL); + LV_LOG_INFO("image %p (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p, cf: %d) decode finish", + image_data, width, height, draw_buf->data, src_cf); + + return LV_RESULT_OK; +} + +static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + uint32_t width = dsc->header.w; + uint32_t height = dsc->header.h; + const char * path = dsc->src; + uint8_t * src_temp = NULL; + + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("open %s failed", path); + return LV_RESULT_INVALID; + } + + /* get real src header */ + lv_image_header_t src_header; + uint32_t header_br = 0; + res = lv_fs_read(&file, &src_header, sizeof(src_header), &header_br); + if(res != LV_FS_RES_OK || header_br != sizeof(src_header)) { + LV_LOG_ERROR("read %s lv_image_header_t failed", path); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + /* get stride */ + uint32_t src_stride = image_stride(&src_header); + uint32_t dest_stride = draw_buf->header.stride; + + dsc->decoded = draw_buf; + uint8_t * dest = draw_buf->data; + + /* index format only */ + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_header.cf); + if(palette_size == 0) { + LV_LOG_ERROR("file %s invalid palette size: %" LV_PRIu32, path, palette_size); + goto failed; + } + + uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t); + + /* read palette */ + uint32_t palette_br = 0; + res = lv_fs_read(&file, dest, palette_size_bytes, &palette_br); + if(res != LV_FS_RES_OK || palette_br != palette_size_bytes) { + LV_LOG_ERROR("read %s (palette: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed", + path, palette_size_bytes, palette_br); + goto failed; + } + + if(dsc->args.premultiply) { + /* pre-multiply palette */ + image_color32_pre_mul((lv_color32_t *)dest, palette_size); + draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED; + } + + src_temp = lv_malloc(src_stride); + if(src_temp == NULL) { + LV_LOG_ERROR("malloc src_temp failed"); + goto failed; + } + + /* move to index image map */ + dest += DEST_IMG_OFFSET; + + for(uint32_t y = 0; y < height; y++) { + uint32_t br = 0; + res = lv_fs_read(&file, src_temp, src_stride, &br); + if(res != LV_FS_RES_OK || br != src_stride) { + LV_LOG_ERROR("read %s (y: %" LV_PRIu32 ", src_stride: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed", + path, y, src_stride, br); + goto failed; + } + + /* convert to index8 */ + image_decode_to_index8_line(dest, src_temp, width, src_header.cf); + dest += dest_stride; + } + + lv_free(src_temp); + + lv_fs_close(&file); + + /* invalidate D-Cache */ + lv_draw_buf_invalidate_cache(draw_buf, NULL); + + LV_LOG_INFO("image %s (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p cf: %d) decode finish", + path, width, height, draw_buf->data, src_header.cf); + return LV_RESULT_OK; + +failed: + if(src_temp) { + lv_free(src_temp); + } + lv_fs_close(&file); + lv_draw_buf_destroy(draw_buf); + dsc->decoded = NULL; + + return LV_RESULT_INVALID; +} + +static void decoder_draw_buf_free(lv_draw_buf_t * draw_buf) +{ + if((draw_buf->header.flags & LV_IMAGE_FLAGS_ALLOCATED) == 0) { + /* This must be the yuv variable image. */ + return; + } + + lv_draw_buf_destroy(draw_buf); +} + +/** + * Decode an image using the vg_lite gpu. + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + lv_result_t res = LV_RESULT_INVALID; + + switch(dsc->src_type) { + case LV_IMAGE_SRC_VARIABLE: + res = decoder_open_variable(decoder, dsc); + break; + case LV_IMAGE_SRC_FILE: + res = decoder_open_file(decoder, dsc); + break; + default: + break; + } + + if(dsc->args.no_cache) return res; + +#if LV_CACHE_DEF_SIZE > 0 + if(res == LV_RESULT_OK) { + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = dsc->decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, NULL); + + if(entry == NULL) { + decoder_draw_buf_free((lv_draw_buf_t *)dsc->decoded); + dsc->decoded = NULL; + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + } +#endif + + return res; +} + +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || LV_CACHE_DEF_SIZE == 0) + decoder_draw_buf_free((lv_draw_buf_t *)dsc->decoded); + else + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); + + if(decoder->user_data) free(decoder->user_data); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h new file mode 100644 index 0000000..9bab540 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h @@ -0,0 +1,47 @@ +/** + * @file lv_vg_lite_decoder.h + * + */ + +#ifndef LV_VG_LITE_DECODER_H +#define LV_VG_LITE_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_image_decoder.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vg_lite_decoder_init(void); + +void lv_vg_lite_decoder_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_DECODER_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c new file mode 100644 index 0000000..5268671 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c @@ -0,0 +1,255 @@ +/** + * @file lv_vg_lite_grad.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_grad.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_pending.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + vg_lite_linear_gradient_t vg_grad; + lv_grad_dsc_t lv_grad; +} grad_item_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u, + const lv_grad_dsc_t * grad); + +static bool grad_create_cb(grad_item_t * item, void * user_data); +static void grad_free_cb(grad_item_t * item, void * user_data); +static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs); +static void grad_cache_release_cb(void * entry, void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)grad_compare_cb, + .create_cb = (lv_cache_create_cb_t)grad_create_cb, + .free_cb = (lv_cache_free_cb_t)grad_free_cb, + }; + + u->grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(grad_item_t), LV_VG_LITE_GRAD_CACHE_SIZE, ops); + LV_ASSERT_NULL(u->grad_cache); + + u->grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4); + lv_vg_lite_pending_set_free_cb(u->grad_pending, grad_cache_release_cb, u->grad_cache); +} + +void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + lv_vg_lite_pending_destroy(u->grad_pending); + lv_cache_destroy(u->grad_cache, NULL); +} + +void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir) +{ + LV_ASSERT_NULL(grad_matrix); + LV_ASSERT_NULL(area); + + vg_lite_identity(grad_matrix); + vg_lite_translate(area->x1, area->y1, grad_matrix); + + switch(dir) { + case LV_GRAD_DIR_VER: + vg_lite_scale(1, lv_area_get_height(area) / 256.0f, grad_matrix); + vg_lite_rotate(90, grad_matrix); + break; + + case LV_GRAD_DIR_HOR: + vg_lite_scale(lv_area_get_width(area) / 256.0f, 1, grad_matrix); + break; + + default: + break; + } +} + +void lv_vg_lite_draw_linear_grad( + struct _lv_draw_vg_lite_unit_t * u, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_grad_dsc_t * grad, + const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend) +{ + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(grad); + LV_ASSERT_NULL(grad_matrix); + LV_ASSERT_NULL(matrix); + + LV_PROFILER_BEGIN; + + vg_lite_linear_gradient_t * gradient = lv_vg_lite_linear_grad_get(u, grad); + LV_ASSERT_NULL(gradient); + if(!gradient) { + LV_LOG_ERROR("Failed to get linear gradient"); + LV_PROFILER_END; + return; + } + + vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(gradient); + LV_ASSERT_NULL(grad_mat_p); + *grad_mat_p = *grad_matrix; + + LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); + LV_VG_LITE_ASSERT_SRC_BUFFER(&gradient->image); + LV_VG_LITE_ASSERT_PATH(path); + LV_VG_LITE_ASSERT_MATRIX(grad_mat_p); + LV_VG_LITE_ASSERT_MATRIX(matrix); + + LV_PROFILER_BEGIN_TAG("vg_lite_draw_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_grad( + buffer, + path, + fill, + (vg_lite_matrix_t *)matrix, + gradient, + blend)); + LV_PROFILER_END_TAG("vg_lite_draw_grad"); + + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u, + const lv_grad_dsc_t * grad) +{ + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(grad); + + grad_item_t search_key; + lv_memzero(&search_key, sizeof(grad_item_t)); + search_key.lv_grad = *grad; + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->grad_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + /* check if the cache is full */ + size_t free_size = lv_cache_get_free_size(u->grad_cache, NULL); + if(free_size == 0) { + LV_LOG_INFO("grad cache is full, release all pending cache entries"); + lv_vg_lite_finish(u); + } + + cache_node_entry = lv_cache_acquire_or_create(u->grad_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("grad cache creating failed"); + return NULL; + } + } + + /* Add the new entry to the pending list */ + lv_vg_lite_pending_add(u->grad_pending, &cache_node_entry); + + grad_item_t * item = lv_cache_entry_get_data(cache_node_entry); + return &item->vg_grad; +} + +static bool grad_create_cb(grad_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + + LV_PROFILER_BEGIN; + + vg_lite_error_t err = vg_lite_init_grad(&item->vg_grad); + if(err != VG_LITE_SUCCESS) { + LV_PROFILER_END; + LV_LOG_ERROR("init grad error(%d): %s", (int)err, lv_vg_lite_error_string(err)); + return false; + } + + vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; + vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; + + /* Gradient setup */ + uint8_t cnt = item->lv_grad.stops_count; + LV_ASSERT(cnt < VLC_MAX_GRADIENT_STOPS); + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = item->lv_grad.stops[i].frac; + const lv_color_t * c = &item->lv_grad.stops[i].color; + lv_opa_t opa = item->lv_grad.stops[i].opa; + + /* lvgl color -> gradient color */ + lv_color_t grad_color = lv_color_make(c->blue, c->green, c->red); + colors[i] = lv_vg_lite_color(grad_color, opa, true); + } + + LV_VG_LITE_CHECK_ERROR(vg_lite_set_grad(&item->vg_grad, cnt, colors, stops)); + + LV_PROFILER_BEGIN_TAG("vg_lite_update_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_update_grad(&item->vg_grad)); + LV_PROFILER_END_TAG("vg_lite_update_grad"); + + LV_PROFILER_END; + return true; +} + +static void grad_free_cb(grad_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg_grad)); +} + +static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs) +{ + if(lhs->lv_grad.stops_count != rhs->lv_grad.stops_count) { + return lhs->lv_grad.stops_count > rhs->lv_grad.stops_count ? 1 : -1; + } + + int cmp_res = memcmp(lhs->lv_grad.stops, rhs->lv_grad.stops, + sizeof(lv_gradient_stop_t) * lhs->lv_grad.stops_count); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static void grad_cache_release_cb(void * entry, void * user_data) +{ + lv_cache_entry_t ** entry_p = entry; + lv_cache_t * cache = user_data; + lv_cache_release(cache, *entry_p, NULL); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h new file mode 100644 index 0000000..d709ade --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h @@ -0,0 +1,63 @@ +/** + * @file lv_vg_lite_grad.h + * + */ + +#ifndef LV_VG_LITE_GRAD_H +#define LV_VG_LITE_GRAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u); + +void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u); + +void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir); + +void lv_vg_lite_draw_linear_grad( + struct _lv_draw_vg_lite_unit_t * u, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_grad_dsc_t * grad, + const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend); + +void lv_vg_lite_linear_grad_release_all(struct _lv_draw_vg_lite_unit_t * u); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_GRAD_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.c new file mode 100644 index 0000000..08b180b --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.c @@ -0,0 +1,60 @@ +/** + * @file lv_vg_lite_math.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_math.h" + +#if LV_USE_DRAW_VG_LITE + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +float math_fast_inv_sqrtf(float number) +{ + int32_t i; + float x2, y; + const float threehalfs = 1.5f; + + x2 = number * 0.5f; + y = number; + i = *(int32_t *)&y; /* evil floating point bit level hacking */ + i = 0x5f3759df - (i >> 1); /* what the fuck? */ + y = *(float *)&i; + y = y * (threehalfs - (x2 * y * y)); /* 1st iteration */ + + return y; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.h new file mode 100644 index 0000000..5607333 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_math.h @@ -0,0 +1,75 @@ +/** + * @file lv_vg_lite_math.h + * + */ + +#ifndef LV_VG_LITE_MATH_H +#define LV_VG_LITE_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define MATH_PI 3.14159265358979323846f +#define MATH_HALF_PI 1.57079632679489661923f +#define MATH_TWO_PI 6.28318530717958647692f +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f + +#define MATH_TANF(x) tanf(x) +#define MATH_SINF(x) sinf(x) +#define MATH_COSF(x) cosf(x) +#define MATH_ASINF(x) asinf(x) +#define MATH_FABSF(x) fabsf(x) +#define MATH_SQRTF(x) sqrtf(x) + +#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) +#define MATH_DEGRESS(rad) ((rad) * RAD_TO_DEG) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline bool math_zero(float a) +{ + return (MATH_FABSF(a) < FLT_EPSILON); +} + +static inline bool math_equal(float a, float b) +{ + return math_zero(a - b); +} + +float math_fast_inv_sqrtf(float number); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_MATH_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.c new file mode 100644 index 0000000..3efe507 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.c @@ -0,0 +1,596 @@ +/** + * @file lv_vg_lite_path.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_path.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" +#include + +/********************* + * DEFINES + *********************/ + +#define PATH_KAPPA 0.552284f + +/* Magic number from https://spencermortensen.com/articles/bezier-circle/ */ +#define PATH_ARC_MAGIC 0.55191502449351f + +#define SIGN(x) (math_zero(x) ? 0 : ((x) > 0 ? 1 : -1)) + +#define VLC_OP_ARG_LEN(OP, LEN) \ + case VLC_OP_##OP: \ + return (LEN) + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_path_t { + vg_lite_path_t base; + size_t mem_size; + uint8_t format_len; +}; + +typedef struct { + float min_x; + float min_y; + float max_x; + float max_y; +} lv_vg_lite_path_bounds_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_path_init(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + unit->global_path = lv_vg_lite_path_create(VG_LITE_FP32); + unit->path_in_use = false; +} + +void lv_vg_lite_path_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT(!unit->path_in_use); + lv_vg_lite_path_destroy(unit->global_path); + unit->global_path = NULL; +} + +lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format) +{ + LV_PROFILER_BEGIN; + lv_vg_lite_path_t * path = lv_malloc_zeroed(sizeof(lv_vg_lite_path_t)); + LV_ASSERT_MALLOC(path); + path->format_len = lv_vg_lite_path_format_len(data_format); + LV_ASSERT(vg_lite_init_path( + &path->base, + data_format, + VG_LITE_MEDIUM, + 0, + NULL, + 0, 0, 0, 0) + == VG_LITE_SUCCESS); + LV_PROFILER_END; + return path; +} + +void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path) +{ + LV_PROFILER_BEGIN; + LV_ASSERT_NULL(path); + if(path->base.path != NULL) { + lv_free(path->base.path); + path->base.path = NULL; + + /* clear remaining path data */ + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_path(&path->base)); + } + lv_free(path); + LV_PROFILER_END; +} + +lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(unit->global_path); + LV_ASSERT(!unit->path_in_use); + lv_vg_lite_path_reset(unit->global_path, data_format); + unit->path_in_use = true; + return unit->global_path; +} + +void lv_vg_lite_path_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(path); + LV_ASSERT(unit->global_path == path); + LV_ASSERT(unit->path_in_use); + unit->path_in_use = false; +} + +void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format) +{ + LV_ASSERT_NULL(path); + path->base.path_length = 0; + path->base.format = data_format; + path->base.quality = VG_LITE_MEDIUM; + path->base.path_type = VG_LITE_DRAW_ZERO; + path->format_len = lv_vg_lite_path_format_len(data_format); +} + +vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + return &path->base; +} + +void lv_vg_lite_path_set_bonding_box(lv_vg_lite_path_t * path, + float min_x, float min_y, + float max_x, float max_y) +{ + LV_ASSERT_NULL(path); + path->base.bounding_box[0] = min_x; + path->base.bounding_box[1] = min_y; + path->base.bounding_box[2] = max_x; + path->base.bounding_box[3] = max_y; +} + +void lv_vg_lite_path_set_bonding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(area); + lv_vg_lite_path_set_bonding_box(path, area->x1, area->y1, area->x2 + 1, area->y2 + 1); +} + +void lv_vg_lite_path_get_bonding_box(lv_vg_lite_path_t * path, + float * min_x, float * min_y, + float * max_x, float * max_y) +{ + LV_ASSERT_NULL(path); + if(min_x) *min_x = path->base.bounding_box[0]; + if(min_y) *min_y = path->base.bounding_box[1]; + if(max_x) *max_x = path->base.bounding_box[2]; + if(max_y) *max_y = path->base.bounding_box[3]; +} + +static void path_bounds_iter_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) +{ + LV_UNUSED(op_code); + + if(len == 0) { + return; + } + + typedef struct { + float x; + float y; + } point_t; + + const int pt_len = sizeof(point_t) / sizeof(float); + + LV_ASSERT(len % pt_len == 0); + + const point_t * pt = (point_t *)data; + len /= pt_len; + + lv_vg_lite_path_bounds_t * bounds = user_data; + + for(uint32_t i = 0; i < len; i++) { + if(pt[i].x < bounds->min_x) bounds->min_x = pt[i].x; + if(pt[i].y < bounds->min_y) bounds->min_y = pt[i].y; + if(pt[i].x > bounds->max_x) bounds->max_x = pt[i].x; + if(pt[i].y > bounds->max_y) bounds->max_y = pt[i].y; + } +} + +bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + + if(!path->format_len) { + return false; + } + + LV_PROFILER_BEGIN; + + lv_vg_lite_path_bounds_t bounds; + + /* init bounds */ + bounds.min_x = __FLT_MAX__; + bounds.min_y = __FLT_MAX__; + bounds.max_x = __FLT_MIN__; + bounds.max_y = __FLT_MIN__; + + /* calc bounds */ + lv_vg_lite_path_for_each_data(lv_vg_lite_path_get_path(path), path_bounds_iter_cb, &bounds); + + /* set bounds */ + lv_vg_lite_path_set_bonding_box(path, bounds.min_x, bounds.min_y, bounds.max_x, bounds.max_y); + + LV_PROFILER_END; + + return true; +} + +void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality) +{ + LV_ASSERT_NULL(path); + path->base.quality = quality; +} + +static void lv_vg_lite_path_append_data(lv_vg_lite_path_t * path, const void * data, size_t len) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(data); + + if(path->base.path_length + len > path->mem_size) { + if(path->mem_size == 0) { + path->mem_size = len; + } + else { + path->mem_size *= 2; + } + path->base.path = lv_realloc(path->base.path, path->mem_size); + LV_ASSERT_MALLOC(path->base.path); + } + + lv_memcpy((uint8_t *)path->base.path + path->base.path_length, data, len); + path->base.path_length += len; +} + +static void lv_vg_lite_path_append_op(lv_vg_lite_path_t * path, uint32_t op) +{ + lv_vg_lite_path_append_data(path, &op, path->format_len); +} + +static void lv_vg_lite_path_append_point(lv_vg_lite_path_t * path, float x, float y) +{ + if(path->base.format == VG_LITE_FP32) { + lv_vg_lite_path_append_data(path, &x, sizeof(x)); + lv_vg_lite_path_append_data(path, &y, sizeof(y)); + return; + } + + int32_t ix = (int32_t)(x); + int32_t iy = (int32_t)(y); + lv_vg_lite_path_append_data(path, &ix, path->format_len); + lv_vg_lite_path_append_data(path, &iy, path->format_len); +} + +void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_MOVE); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_LINE); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, + float cx, float cy, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_QUAD); + lv_vg_lite_path_append_point(path, cx, cy); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, + float cx1, float cy1, + float cx2, float cy2, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_CUBIC); + lv_vg_lite_path_append_point(path, cx1, cy1); + lv_vg_lite_path_append_point(path, cx2, cy2); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_close(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_CLOSE); +} + +void lv_vg_lite_path_end(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_append_op(path, VLC_OP_END); +} + +void lv_vg_lite_path_append_rect( + lv_vg_lite_path_t * path, + float x, float y, + float w, float h, + float rx, float ry) +{ + LV_PROFILER_BEGIN; + const float half_w = w * 0.5f; + const float half_h = h * 0.5f; + + /*clamping cornerRadius by minimum size*/ + if(rx > half_w) + rx = half_w; + if(ry > half_h) + ry = half_h; + + /*rectangle*/ + if(rx == 0 && ry == 0) { + lv_vg_lite_path_move_to(path, x, y); + lv_vg_lite_path_line_to(path, x + w, y); + lv_vg_lite_path_line_to(path, x + w, y + h); + lv_vg_lite_path_line_to(path, x, y + h); + lv_vg_lite_path_close(path); + LV_PROFILER_END; + return; + } + + /*circle*/ + if(math_equal(rx, half_w) && math_equal(ry, half_h)) { + lv_vg_lite_path_append_circle(path, x + (w * 0.5f), y + (h * 0.5f), rx, ry); + LV_PROFILER_END; + return; + } + + /*rounded rectangle*/ + float hrx = rx * 0.5f; + float hry = ry * 0.5f; + lv_vg_lite_path_move_to(path, x + rx, y); + lv_vg_lite_path_line_to(path, x + w - rx, y); + lv_vg_lite_path_cubic_to(path, x + w - rx + hrx, y, x + w, y + ry - hry, x + w, y + ry); + lv_vg_lite_path_line_to(path, x + w, y + h - ry); + lv_vg_lite_path_cubic_to(path, x + w, y + h - ry + hry, x + w - rx + hrx, y + h, x + w - rx, y + h); + lv_vg_lite_path_line_to(path, x + rx, y + h); + lv_vg_lite_path_cubic_to(path, x + rx - hrx, y + h, x, y + h - ry + hry, x, y + h - ry); + lv_vg_lite_path_line_to(path, x, y + ry); + lv_vg_lite_path_cubic_to(path, x, y + ry - hry, x + rx - hrx, y, x + rx, y); + lv_vg_lite_path_close(path); + LV_PROFILER_END; +} + +void lv_vg_lite_path_append_circle( + lv_vg_lite_path_t * path, + float cx, float cy, + float rx, float ry) +{ + LV_PROFILER_BEGIN; + /* https://learn.microsoft.com/zh-cn/xamarin/xamarin-forms/user-interface/graphics/skiasharp/curves/beziers */ + float rx_kappa = rx * PATH_KAPPA; + float ry_kappa = ry * PATH_KAPPA; + + lv_vg_lite_path_move_to(path, cx, cy - ry); + lv_vg_lite_path_cubic_to(path, cx + rx_kappa, cy - ry, cx + rx, cy - ry_kappa, cx + rx, cy); + lv_vg_lite_path_cubic_to(path, cx + rx, cy + ry_kappa, cx + rx_kappa, cy + ry, cx, cy + ry); + lv_vg_lite_path_cubic_to(path, cx - rx_kappa, cy + ry, cx - rx, cy + ry_kappa, cx - rx, cy); + lv_vg_lite_path_cubic_to(path, cx - rx, cy - ry_kappa, cx - rx_kappa, cy - ry, cx, cy - ry); + lv_vg_lite_path_close(path); + LV_PROFILER_END; +} + +void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y) +{ + LV_PROFILER_BEGIN; + float dx1 = center_x - start_x; + float dy1 = center_y - start_y; + float dx2 = end_x - center_x; + float dy2 = end_y - center_y; + + float c = SIGN(dx1 * dy2 - dx2 * dy1) * PATH_ARC_MAGIC; + + lv_vg_lite_path_cubic_to(path, + start_x - c * dy1, start_y + c * dx1, + end_x - c * dy2, end_y + c * dx2, + end_x, end_y); + LV_PROFILER_END; +} + +void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie) +{ + LV_PROFILER_BEGIN; + /* just circle */ + if(sweep >= 360.0f || sweep <= -360.0f) { + lv_vg_lite_path_append_circle(path, cx, cy, radius, radius); + LV_PROFILER_END; + return; + } + + start_angle = MATH_RADIANS(start_angle); + sweep = MATH_RADIANS(sweep); + + int n_curves = (int)ceil(MATH_FABSF(sweep / MATH_HALF_PI)); + float sweep_sign = sweep < 0 ? -1.f : 1.f; + float fract = fmodf(sweep, MATH_HALF_PI); + fract = (math_zero(fract)) ? MATH_HALF_PI * sweep_sign : fract; + + /* Start from here */ + float start_x = radius * MATH_COSF(start_angle); + float start_y = radius * MATH_SINF(start_angle); + + if(pie) { + lv_vg_lite_path_move_to(path, cx, cy); + lv_vg_lite_path_line_to(path, start_x + cx, start_y + cy); + } + + for(int i = 0; i < n_curves; ++i) { + float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); + float end_x = radius * MATH_COSF(end_angle); + float end_y = radius * MATH_SINF(end_angle); + + /* variables needed to calculate bezier control points */ + + /** get bezier control points using article: + * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + */ + float ax = start_x; + float ay = start_y; + float bx = end_x; + float by = end_y; + float q1 = ax * ax + ay * ay; + float q2 = ax * bx + ay * by + q1; + float k2 = (4.0f / 3.0f) * ((MATH_SQRTF(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + /* Next start point is the current end point */ + start_x = end_x; + start_y = end_y; + + end_x += cx; + end_y += cy; + + float ctrl1_x = ax - k2 * ay + cx; + float ctrl1_y = ay + k2 * ax + cy; + float ctrl2_x = bx + k2 * by + cx; + float ctrl2_y = by - k2 * bx + cy; + + lv_vg_lite_path_cubic_to(path, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, end_x, end_y); + start_angle = end_angle; + } + + if(pie) { + lv_vg_lite_path_close(path); + } + + LV_PROFILER_END; +} + +uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ARG_LEN(END, 0); + VLC_OP_ARG_LEN(CLOSE, 0); + VLC_OP_ARG_LEN(MOVE, 2); + VLC_OP_ARG_LEN(MOVE_REL, 2); + VLC_OP_ARG_LEN(LINE, 2); + VLC_OP_ARG_LEN(LINE_REL, 2); + VLC_OP_ARG_LEN(QUAD, 4); + VLC_OP_ARG_LEN(QUAD_REL, 4); + VLC_OP_ARG_LEN(CUBIC, 6); + VLC_OP_ARG_LEN(CUBIC_REL, 6); + VLC_OP_ARG_LEN(SCCWARC, 5); + VLC_OP_ARG_LEN(SCCWARC_REL, 5); + VLC_OP_ARG_LEN(SCWARC, 5); + VLC_OP_ARG_LEN(SCWARC_REL, 5); + VLC_OP_ARG_LEN(LCCWARC, 5); + VLC_OP_ARG_LEN(LCCWARC_REL, 5); + VLC_OP_ARG_LEN(LCWARC, 5); + VLC_OP_ARG_LEN(LCWARC_REL, 5); + default: + break; + } + + LV_LOG_ERROR("UNKNOW_VLC_OP: 0x%x", vlc_op); + LV_ASSERT(false); + return 0; +} + +uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return 1; + case VG_LITE_S16: + return 2; + case VG_LITE_S32: + return 4; + case VG_LITE_FP32: + return 4; + default: + break; + } + + LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); + LV_ASSERT(false); + return 0; +} + +void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(cb); + + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + uint8_t * cur = path->path; + uint8_t * end = cur + path->path_length; + float tmp_data[8]; + + while(cur < end) { + /* get op code */ + uint8_t op_code = VLC_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); + + /* skip op code */ + cur += fmt_len; + + /* print arguments */ + for(uint8_t i = 0; i < arg_len; i++) { + switch(path->format) { + case VG_LITE_S8: + tmp_data[i] = *((int8_t *)cur); + break; + case VG_LITE_S16: + tmp_data[i] = *((int16_t *)cur); + break; + case VG_LITE_S32: + tmp_data[i] = *((int32_t *)cur); + break; + case VG_LITE_FP32: + tmp_data[i] = *((float *)cur); + break; + default: + LV_LOG_ERROR("UNKNOW_FORMAT(%d)", path->format); + LV_ASSERT(false); + break; + } + + cur += fmt_len; + } + + cb(user_data, op_code, tmp_data, arg_len); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.h new file mode 100644 index 0000000..c7172e6 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_path.h @@ -0,0 +1,124 @@ +/** + * @file lv_vg_lite_path.h + * + */ + +#ifndef LV_VG_LITE_PATH_H +#define LV_VG_LITE_PATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_utils.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +typedef struct _lv_vg_lite_path_t lv_vg_lite_path_t; +typedef struct _lv_draw_vg_lite_unit_t lv_draw_vg_lite_unit_t; + +typedef void (*lv_vg_lite_path_iter_cb_t)(void * user_data, uint8_t op_code, const float * data, uint32_t len); + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vg_lite_path_init(lv_draw_vg_lite_unit_t * unit); + +void lv_vg_lite_path_deinit(lv_draw_vg_lite_unit_t * unit); + +lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format); + +void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path); + +lv_vg_lite_path_t * lv_vg_lite_path_get(lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format); + +void lv_vg_lite_path_drop(lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path); + +void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format); + +void lv_vg_lite_path_set_bonding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area); + +void lv_vg_lite_path_set_bonding_box(lv_vg_lite_path_t * path, + float min_x, float min_y, + float max_x, float max_y); + +void lv_vg_lite_path_get_bonding_box(lv_vg_lite_path_t * path, + float * min_x, float * min_y, + float * max_x, float * max_y); + +bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality); + +vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, + float x, float y); + +void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, + float x, float y); + +void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, + float cx, float cy, + float x, float y); + +void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, + float cx1, float cy1, + float cx2, float cy2, + float x, float y); + +void lv_vg_lite_path_close(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_end(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_append_rect(lv_vg_lite_path_t * path, + float x, float y, + float w, float h, + float rx, float ry); + +void lv_vg_lite_path_append_circle(lv_vg_lite_path_t * path, + float cx, float cy, + float rx, float ry); + +void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y); + +void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie); + +uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op); + +uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format); + +void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_PATH_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c new file mode 100644 index 0000000..0444172 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c @@ -0,0 +1,99 @@ +/** + * @file lv_vg_lite_pending.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_pending.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_pending_t { + lv_array_t objs; + lv_vg_lite_pending_free_cb_t free_cb; + void * user_data; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default) +{ + lv_vg_lite_pending_t * pending = lv_malloc_zeroed(sizeof(lv_vg_lite_pending_t)); + LV_ASSERT_MALLOC(pending); + lv_array_init(&pending->objs, capacity_default, obj_size); + return pending; +} + +void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + lv_vg_lite_pending_remove_all(pending); + lv_array_deinit(&pending->objs); + lv_memzero(pending, sizeof(lv_vg_lite_pending_t)); + lv_free(pending); +} + +void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, + void * user_data) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(free_cb); + pending->free_cb = free_cb; + pending->user_data = user_data; +} + +void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(obj); + lv_array_push_back(&pending->objs, obj); +} + +void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(pending->free_cb); + + uint32_t size = lv_array_size(&pending->objs); + if(size == 0) { + return; + } + + /* remove all the pending objects */ + for(uint32_t i = 0; i < size; i++) { + pending->free_cb(lv_array_at(&pending->objs, i), pending->user_data); + } + + lv_array_clear(&pending->objs); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h new file mode 100644 index 0000000..8def9dc --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h @@ -0,0 +1,83 @@ +/** + * @file lv_vg_lite_pending.h + * + */ + +#ifndef LV_VG_LITE_PENDING_H +#define LV_VG_LITE_PENDING_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_vg_lite_pending_t lv_vg_lite_pending_t; + +typedef void (*lv_vg_lite_pending_free_cb_t)(void * obj, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a pending list + * @param obj_size the size of the objects in the list + * @param capacity_default the default capacity of the list + * @return a pointer to the pending list + */ +lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default); + +/** + * Destroy a pending list + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending); + +/** + * Set a free callback for the pending list + * @param pending pointer to the pending list + * @param free_cb the free callback + * @param user_data user data to pass to the free callback + */ +void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, + void * user_data); + +/** + * Add an object to the pending list + * @param pending pointer to the pending list + * @param obj pointer to the object to add + */ +void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj); + +/** + * Remove all objects from the pending list + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_PENDING_H*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c new file mode 100644 index 0000000..cb212fb --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c @@ -0,0 +1,1085 @@ +/** + * @file vg_lite_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_utils.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_grad.h" +#include "lv_draw_vg_lite_type.h" +#include + +/********************* + * DEFINES + *********************/ + +#define ENUM_TO_STRING(e) \ + case (e): \ + return #e + +#define VG_LITE_ENUM_TO_STRING(e) \ + case (VG_LITE_##e): \ + return #e + +#define VLC_OP_ENUM_TO_STRING(e) \ + case (VLC_OP_##e): \ + return #e + +#define FEATURE_ENUM_TO_STRING(e) \ + case (gcFEATURE_BIT_VG_##e): \ + return #e + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void image_dsc_free_cb(void * dsc, void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_dump_info(void) +{ + char name[64]; + vg_lite_uint32_t chip_id; + vg_lite_uint32_t chip_rev; + vg_lite_uint32_t cid; + vg_lite_get_product_info(name, &chip_id, &chip_rev); + vg_lite_get_register(0x30, &cid); + LV_LOG_USER("Product Info: %s" + " | Chip ID: 0x%" LV_PRIx32 + " | Revision: 0x%" LV_PRIx32 + " | CID: 0x%" LV_PRIx32, + name, (uint32_t)chip_id, (uint32_t)chip_rev, (uint32_t)cid); + + vg_lite_info_t info; + vg_lite_get_info(&info); + LV_LOG_USER("VGLite API version: 0x%" LV_PRIx32, (uint32_t)info.api_version); + LV_LOG_USER("VGLite API header version: 0x%" LV_PRIx32, (uint32_t)info.header_version); + LV_LOG_USER("VGLite release version: 0x%" LV_PRIx32, (uint32_t)info.release_version); + + for(int feature = 0; feature < gcFEATURE_COUNT; feature++) { + vg_lite_uint32_t ret = vg_lite_query_feature((vg_lite_feature_t)feature); + LV_UNUSED(ret); + LV_LOG_USER("Feature-%d: %s\t - %s", + feature, lv_vg_lite_feature_string((vg_lite_feature_t)feature), + ret ? "YES" : "NO"); + } + + vg_lite_uint32_t mem_avail = 0; + vg_lite_get_mem_size(&mem_avail); + LV_LOG_USER("Memory Avaliable: %" LV_PRId32 " Bytes", (uint32_t)mem_avail); +} + +const char * lv_vg_lite_error_string(vg_lite_error_t error) +{ + switch(error) { + VG_LITE_ENUM_TO_STRING(SUCCESS); + VG_LITE_ENUM_TO_STRING(INVALID_ARGUMENT); + VG_LITE_ENUM_TO_STRING(OUT_OF_MEMORY); + VG_LITE_ENUM_TO_STRING(NO_CONTEXT); + VG_LITE_ENUM_TO_STRING(TIMEOUT); + VG_LITE_ENUM_TO_STRING(OUT_OF_RESOURCES); + VG_LITE_ENUM_TO_STRING(GENERIC_IO); + VG_LITE_ENUM_TO_STRING(NOT_SUPPORT); + VG_LITE_ENUM_TO_STRING(ALREADY_EXISTS); + VG_LITE_ENUM_TO_STRING(NOT_ALIGNED); + VG_LITE_ENUM_TO_STRING(FLEXA_TIME_OUT); + VG_LITE_ENUM_TO_STRING(FLEXA_HANDSHAKE_FAIL); + default: + break; + } + return "UNKNOW_ERROR"; +} + +const char * lv_vg_lite_feature_string(vg_lite_feature_t feature) +{ + switch(feature) { + FEATURE_ENUM_TO_STRING(IM_INDEX_FORMAT); + FEATURE_ENUM_TO_STRING(SCISSOR); + FEATURE_ENUM_TO_STRING(BORDER_CULLING); + FEATURE_ENUM_TO_STRING(RGBA2_FORMAT); + FEATURE_ENUM_TO_STRING(QUALITY_8X); + FEATURE_ENUM_TO_STRING(IM_FASTCLAER); + FEATURE_ENUM_TO_STRING(RADIAL_GRADIENT); + FEATURE_ENUM_TO_STRING(GLOBAL_ALPHA); + FEATURE_ENUM_TO_STRING(RGBA8_ETC2_EAC); + FEATURE_ENUM_TO_STRING(COLOR_KEY); + FEATURE_ENUM_TO_STRING(DOUBLE_IMAGE); + FEATURE_ENUM_TO_STRING(YUV_OUTPUT); + FEATURE_ENUM_TO_STRING(FLEXA); + FEATURE_ENUM_TO_STRING(24BIT); + FEATURE_ENUM_TO_STRING(DITHER); + FEATURE_ENUM_TO_STRING(USE_DST); + FEATURE_ENUM_TO_STRING(PE_CLEAR); + FEATURE_ENUM_TO_STRING(IM_INPUT); + FEATURE_ENUM_TO_STRING(DEC_COMPRESS); + FEATURE_ENUM_TO_STRING(LINEAR_GRADIENT_EXT); + FEATURE_ENUM_TO_STRING(MASK); + FEATURE_ENUM_TO_STRING(MIRROR); + FEATURE_ENUM_TO_STRING(GAMMA); + FEATURE_ENUM_TO_STRING(NEW_BLEND_MODE); + FEATURE_ENUM_TO_STRING(STENCIL); + FEATURE_ENUM_TO_STRING(SRC_PREMULTIPLIED); /*! Valid only if FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY is 0 */ + FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY); /*! HW multiplier can accept either premultiplied or not */ + FEATURE_ENUM_TO_STRING(COLOR_TRANSFORMATION); + FEATURE_ENUM_TO_STRING(LVGL_SUPPORT); + FEATURE_ENUM_TO_STRING(INDEX_ENDIAN); + FEATURE_ENUM_TO_STRING(24BIT_PLANAR); + FEATURE_ENUM_TO_STRING(PIXEL_MATRIX); + FEATURE_ENUM_TO_STRING(NEW_IMAGE_INDEX); + FEATURE_ENUM_TO_STRING(PARALLEL_PATHS); + FEATURE_ENUM_TO_STRING(STRIPE_MODE); + FEATURE_ENUM_TO_STRING(IM_DEC_INPUT); + FEATURE_ENUM_TO_STRING(GAUSSIAN_BLUR); + FEATURE_ENUM_TO_STRING(RECTANGLE_TILED_OUT); + FEATURE_ENUM_TO_STRING(TESSELLATION_TILED_OUT); + FEATURE_ENUM_TO_STRING(IM_REPEAT_REFLECT); + FEATURE_ENUM_TO_STRING(YUY2_INPUT); + FEATURE_ENUM_TO_STRING(YUV_INPUT); + FEATURE_ENUM_TO_STRING(YUV_TILED_INPUT); + FEATURE_ENUM_TO_STRING(AYUV_INPUT); + FEATURE_ENUM_TO_STRING(16PIXELS_ALIGN); + default: + break; + } + return "UNKNOW_FEATURE"; +} + +const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format) +{ + switch(format) { + VG_LITE_ENUM_TO_STRING(RGBA8888); + VG_LITE_ENUM_TO_STRING(BGRA8888); + VG_LITE_ENUM_TO_STRING(RGBX8888); + VG_LITE_ENUM_TO_STRING(BGRX8888); + VG_LITE_ENUM_TO_STRING(RGB565); + VG_LITE_ENUM_TO_STRING(BGR565); + VG_LITE_ENUM_TO_STRING(RGBA4444); + VG_LITE_ENUM_TO_STRING(BGRA4444); + VG_LITE_ENUM_TO_STRING(BGRA5551); + VG_LITE_ENUM_TO_STRING(A4); + VG_LITE_ENUM_TO_STRING(A8); + VG_LITE_ENUM_TO_STRING(L8); + VG_LITE_ENUM_TO_STRING(YUYV); + VG_LITE_ENUM_TO_STRING(YUY2); + VG_LITE_ENUM_TO_STRING(NV12); + VG_LITE_ENUM_TO_STRING(ANV12); + VG_LITE_ENUM_TO_STRING(AYUY2); + VG_LITE_ENUM_TO_STRING(YV12); + VG_LITE_ENUM_TO_STRING(YV24); + VG_LITE_ENUM_TO_STRING(YV16); + VG_LITE_ENUM_TO_STRING(NV16); + VG_LITE_ENUM_TO_STRING(YUY2_TILED); + VG_LITE_ENUM_TO_STRING(NV12_TILED); + VG_LITE_ENUM_TO_STRING(ANV12_TILED); + VG_LITE_ENUM_TO_STRING(AYUY2_TILED); + VG_LITE_ENUM_TO_STRING(INDEX_1); + VG_LITE_ENUM_TO_STRING(INDEX_2); + VG_LITE_ENUM_TO_STRING(INDEX_4); + VG_LITE_ENUM_TO_STRING(INDEX_8); + VG_LITE_ENUM_TO_STRING(RGBA2222); + VG_LITE_ENUM_TO_STRING(BGRA2222); + VG_LITE_ENUM_TO_STRING(ABGR2222); + VG_LITE_ENUM_TO_STRING(ARGB2222); + VG_LITE_ENUM_TO_STRING(ABGR4444); + VG_LITE_ENUM_TO_STRING(ARGB4444); + VG_LITE_ENUM_TO_STRING(ABGR8888); + VG_LITE_ENUM_TO_STRING(ARGB8888); + VG_LITE_ENUM_TO_STRING(ABGR1555); + VG_LITE_ENUM_TO_STRING(RGBA5551); + VG_LITE_ENUM_TO_STRING(ARGB1555); + VG_LITE_ENUM_TO_STRING(XBGR8888); + VG_LITE_ENUM_TO_STRING(XRGB8888); + VG_LITE_ENUM_TO_STRING(RGBA8888_ETC2_EAC); + VG_LITE_ENUM_TO_STRING(RGB888); + VG_LITE_ENUM_TO_STRING(BGR888); + VG_LITE_ENUM_TO_STRING(ABGR8565); + VG_LITE_ENUM_TO_STRING(BGRA5658); + VG_LITE_ENUM_TO_STRING(ARGB8565); + VG_LITE_ENUM_TO_STRING(RGBA5658); + default: + break; + } + return "UNKNOW_BUFFER_FORMAT"; +} + +const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ENUM_TO_STRING(END); + VLC_OP_ENUM_TO_STRING(CLOSE); + VLC_OP_ENUM_TO_STRING(MOVE); + VLC_OP_ENUM_TO_STRING(MOVE_REL); + VLC_OP_ENUM_TO_STRING(LINE); + VLC_OP_ENUM_TO_STRING(LINE_REL); + VLC_OP_ENUM_TO_STRING(QUAD); + VLC_OP_ENUM_TO_STRING(QUAD_REL); + VLC_OP_ENUM_TO_STRING(CUBIC); + VLC_OP_ENUM_TO_STRING(CUBIC_REL); + + VLC_OP_ENUM_TO_STRING(SCCWARC); + VLC_OP_ENUM_TO_STRING(SCCWARC_REL); + VLC_OP_ENUM_TO_STRING(SCWARC); + VLC_OP_ENUM_TO_STRING(SCWARC_REL); + VLC_OP_ENUM_TO_STRING(LCCWARC); + VLC_OP_ENUM_TO_STRING(LCCWARC_REL); + VLC_OP_ENUM_TO_STRING(LCWARC); + VLC_OP_ENUM_TO_STRING(LCWARC_REL); + default: + break; + } + return "UNKNOW_VLC_OP"; +} + +static void path_data_print_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) +{ + LV_UNUSED(user_data); + + LV_LOG("%s, ", lv_vg_lite_vlc_op_string(op_code)); + for(uint32_t i = 0; i < len; i++) { + LV_LOG("%0.2f, ", data[i]); + } + LV_LOG("\n"); +} + +void lv_vg_lite_path_dump_info(const vg_lite_path_t * path) +{ + LV_ASSERT(path != NULL); + LV_ASSERT(path->path != NULL); + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + size_t len = path->path_length / fmt_len; + + LV_ASSERT(len > 0); + + LV_LOG_USER("address: %p", path->path); + LV_LOG_USER("length: %d", (int)len); + LV_LOG_USER("bonding box: (%0.2f, %0.2f) - (%0.2f, %0.2f)", + path->bounding_box[0], path->bounding_box[1], + path->bounding_box[2], path->bounding_box[3]); + LV_LOG_USER("format: %d", (int)path->format); + LV_LOG_USER("quality: %d", (int)path->quality); + + lv_vg_lite_path_for_each_data(path, path_data_print_cb, NULL); +} + +void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer) +{ + LV_LOG_USER("memory: %p", (buffer)->memory); + LV_LOG_USER("address: 0x%08x", (int)(buffer)->address); + LV_LOG_USER("size: W%d x H%d", (int)((buffer)->width), (int)((buffer)->height)); + LV_LOG_USER("stride: %d", (int)((buffer)->stride)); + LV_LOG_USER("format: %d (%s)", + (int)((buffer)->format), + lv_vg_lite_buffer_format_string((buffer)->format)); + LV_LOG_USER("tiled: %d", (int)((buffer)->tiled)); +} + +void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix) +{ + for(int i = 0; i < 3; i++) { + LV_LOG_USER("| %f, %f, %f |", + (matrix)->m[i][0], (matrix)->m[i][1], (matrix)->m[i][2]); + } +} + +bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + return true; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; + + default: + break; + } + + return false; +} + +bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + return true; + + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: + return vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT) ? true : false; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; + + case LV_COLOR_FORMAT_NV12: + return vg_lite_query_feature(gcFEATURE_BIT_VG_YUV_INPUT) ? true : false; + + default: + break; + } + + return false; +} + +vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A4: + return VG_LITE_A4; + + case LV_COLOR_FORMAT_A8: + return VG_LITE_A8; + + case LV_COLOR_FORMAT_L8: + return VG_LITE_L8; + + case LV_COLOR_FORMAT_I1: + return VG_LITE_INDEX_1; + + case LV_COLOR_FORMAT_I2: + return VG_LITE_INDEX_2; + + case LV_COLOR_FORMAT_I4: + return VG_LITE_INDEX_4; + + case LV_COLOR_FORMAT_I8: + return VG_LITE_INDEX_8; + + case LV_COLOR_FORMAT_RGB565: + return VG_LITE_BGR565; + + case LV_COLOR_FORMAT_ARGB8565: + return VG_LITE_BGRA5658; + + case LV_COLOR_FORMAT_RGB888: + return VG_LITE_BGR888; + + case LV_COLOR_FORMAT_ARGB8888: + return VG_LITE_BGRA8888; + + case LV_COLOR_FORMAT_XRGB8888: + return VG_LITE_BGRX8888; + + case LV_COLOR_FORMAT_NV12: + return VG_LITE_NV12; + + default: + LV_LOG_ERROR("unsupport color format: %d", cf); + break; + } + + LV_ASSERT(false); + return 0; +} + +void lv_vg_lite_buffer_format_bytes( + vg_lite_buffer_format_t format, + uint32_t * mul, + uint32_t * div, + uint32_t * bytes_align) +{ + /* Get the bpp information of a color format. */ + *mul = *div = 1; + *bytes_align = 4; + switch(format) { + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + case VG_LITE_A4: + *div = 2; + break; + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + /* AYUY2 buffer memory = YUY2 + alpha. */ + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + *mul = 2; + break; + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + *mul = 4; + break; + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + *mul = 1; + break; + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + *mul = 4; + break; + case VG_LITE_INDEX_1: + *div = 8; + *bytes_align = 8; + break; + case VG_LITE_INDEX_2: + *div = 4; + *bytes_align = 8; + break; + case VG_LITE_INDEX_4: + *div = 2; + *bytes_align = 8; + break; + case VG_LITE_INDEX_8: + *bytes_align = 1; + break; + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + *mul = 1; + break; + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + *mul = 3; + break; + default: + LV_LOG_ERROR("unsupport color format: 0x%" PRIx32, (uint32_t)format); + LV_ASSERT(false); + break; + } +} + +uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format) +{ + w = lv_vg_lite_width_align(w); + + uint32_t mul, div, align; + lv_vg_lite_buffer_format_bytes(color_format, &mul, &div, &align); + return LV_VG_LITE_ALIGN((w * mul / div), align); +} + +uint32_t lv_vg_lite_width_align(uint32_t w) +{ + if(lv_vg_lite_16px_align()) { + w = LV_VG_LITE_ALIGN(w, 16); + } + + return w; +} + +void lv_vg_lite_buffer_init( + vg_lite_buffer_t * buffer, + const void * ptr, + int32_t width, + int32_t height, + vg_lite_buffer_format_t format, + bool tiled) +{ + uint32_t mul; + uint32_t div; + uint32_t align; + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(ptr); + + lv_memzero(buffer, sizeof(vg_lite_buffer_t)); + + buffer->format = format; + if(tiled || format == VG_LITE_RGBA8888_ETC2_EAC) { + buffer->tiled = VG_LITE_TILED; + } + else { + buffer->tiled = VG_LITE_LINEAR; + } + buffer->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + buffer->transparency_mode = VG_LITE_IMAGE_OPAQUE; + buffer->width = width; + buffer->height = height; + lv_vg_lite_buffer_format_bytes(buffer->format, &mul, &div, &align); + buffer->stride = LV_VG_LITE_ALIGN((buffer->width * mul / div), align); + + if(format == VG_LITE_NV12) { + lv_yuv_buf_t * frame_p = (lv_yuv_buf_t *)ptr; + buffer->memory = (void *)frame_p->semi_planar.y.buf; + buffer->address = (uintptr_t)frame_p->semi_planar.y.buf; + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + buffer->yuv.alpha_stride = buffer->stride; + buffer->yuv.uv_height = buffer->height / 2; + buffer->yuv.uv_memory = (void *)frame_p->semi_planar.uv.buf; + buffer->yuv.uv_planar = (uint32_t)(uintptr_t)frame_p->semi_planar.uv.buf; + buffer->yuv.uv_stride = frame_p->semi_planar.uv.stride; + } + else { + buffer->memory = (void *)ptr; + buffer->address = (uintptr_t)ptr; + } +} + +void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(draw_buf); + + const uint8_t * ptr = draw_buf->data; + int32_t width = draw_buf->header.w; + int32_t height = draw_buf->header.h; + vg_lite_buffer_format_t format = lv_vg_lite_vg_fmt(draw_buf->header.cf); + + if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { + uint32_t palette_size_bytes = LV_COLOR_INDEXED_PALETTE_SIZE(draw_buf->header.cf) * sizeof(uint32_t); + + /* Skip palette */ + ptr += LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN); + } + + width = lv_vg_lite_width_align(width); + + lv_vg_lite_buffer_init(buffer, ptr, width, height, format, false); + + /* Alpha image need to be multiplied by color */ + if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(draw_buf->header.cf)) { + buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + } +} + +void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc) +{ + LV_ASSERT_NULL(matrix); + LV_ASSERT_NULL(dsc); + + int32_t rotation = dsc->rotation; + int32_t scale_x = dsc->scale_x; + int32_t scale_y = dsc->scale_y; + + vg_lite_translate(x, y, matrix); + + if(rotation != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + lv_point_t pivot = dsc->pivot; + vg_lite_translate(pivot.x, pivot.y, matrix); + + if(rotation != 0) { + vg_lite_rotate(rotation * 0.1f, matrix); + } + + if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + vg_lite_scale( + (vg_lite_float_t)scale_x / LV_SCALE_NONE, + (vg_lite_float_t)scale_y / LV_SCALE_NONE, + matrix); + } + + vg_lite_translate(-pivot.x, -pivot.y, matrix); + } +} + +bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, + bool no_cache) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(decoder_dsc); + LV_ASSERT_NULL(src); + + lv_image_decoder_args_t args; + lv_memzero(&args, sizeof(lv_image_decoder_args_t)); + args.premultiply = !lv_vg_lite_support_blend_normal(); + args.stride_align = true; + args.use_indexed = true; + args.no_cache = no_cache; + + lv_result_t res = lv_image_decoder_open(decoder_dsc, src, &args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return false; + } + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + if(decoded == NULL || decoded->data == NULL) { + lv_image_decoder_close(decoder_dsc); + LV_LOG_ERROR("image data is NULL"); + return false; + } + + if(!lv_vg_lite_is_src_cf_supported(decoded->header.cf)) { + LV_LOG_ERROR("unsupported color format: %d", decoded->header.cf); + lv_image_decoder_close(decoder_dsc); + return false; + } + + if(LV_COLOR_FORMAT_IS_INDEXED(decoded->header.cf)) { + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(decoded->header.cf); + LV_PROFILER_BEGIN_TAG("vg_lite_set_CLUT"); + LV_VG_LITE_CHECK_ERROR(vg_lite_set_CLUT(palette_size, (vg_lite_uint32_t *)decoded->data)); + LV_PROFILER_END_TAG("vg_lite_set_CLUT"); + } + + lv_vg_lite_buffer_from_draw_buf(buffer, decoded); + return true; +} + +void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit) +{ + unit->image_dsc_pending = lv_vg_lite_pending_create(sizeof(lv_image_decoder_dsc_t), 4); + lv_vg_lite_pending_set_free_cb(unit->image_dsc_pending, image_dsc_free_cb, NULL); +} + +void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + lv_vg_lite_pending_destroy(unit->image_dsc_pending); + unit->image_dsc_pending = NULL; +} + +void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area) +{ + rect->x = area->x1; + rect->y = area->y1; + rect->width = lv_area_get_width(area); + rect->height = lv_area_get_height(area); +} + +uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format) +{ + uint32_t size = 0; + switch(format) { + case VG_LITE_INDEX_1: + size = 1 << 1; + break; + case VG_LITE_INDEX_2: + size = 1 << 2; + break; + case VG_LITE_INDEX_4: + size = 1 << 4; + break; + case VG_LITE_INDEX_8: + size = 1 << 8; + break; + default: + break; + } + return size; +} + +vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul) +{ + if(pre_mul && opa < LV_OPA_MAX) { + color.red = LV_UDIV255(color.red * opa); + color.green = LV_UDIV255(color.green * opa); + color.blue = LV_UDIV255(color.blue * opa); + } + return (uint32_t)opa << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; +} + +vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode) +{ + if(lv_vg_lite_support_blend_normal()) { + switch(blend_mode) { + case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ + return VG_LITE_BLEND_NORMAL_LVGL; + + case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ + return VG_LITE_BLEND_ADDITIVE_LVGL; + + case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ + return VG_LITE_BLEND_SUBTRACT_LVGL; + + case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ + return VG_LITE_BLEND_MULTIPLY_LVGL; + + default: + return VG_LITE_BLEND_NONE; + } + } + + switch(blend_mode) { + case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ + return VG_LITE_BLEND_SRC_OVER; + + case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ + return VG_LITE_BLEND_ADDITIVE; + + case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ + return VG_LITE_BLEND_SUBTRACT; + + case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ + return VG_LITE_BLEND_MULTIPLY; + + default: + return VG_LITE_BLEND_NONE; + } +} + +bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src) +{ + uint32_t mul; + uint32_t div; + uint32_t align; + int32_t stride; + + if(!buffer) { + LV_LOG_ERROR("buffer is NULL"); + return false; + } + + if(buffer->width < 1) { + LV_LOG_ERROR("buffer width(%d) < 1", (int)buffer->width); + return false; + } + + if(buffer->height < 1) { + LV_LOG_ERROR("buffer height(%d) < 1", (int)buffer->height); + return false; + } + + if(buffer->stride < 1) { + LV_LOG_ERROR("buffer stride(%d) < 1", (int)buffer->stride); + return false; + } + + if(!(buffer->tiled == VG_LITE_LINEAR || buffer->tiled == VG_LITE_TILED)) { + LV_LOG_ERROR("buffer tiled(%d) is invalid", (int)buffer->tiled); + return false; + } + + if(buffer->memory == NULL) { + LV_LOG_ERROR("buffer memory is NULL"); + return false; + } + + if((uint32_t)(uintptr_t)buffer->memory != buffer->address) { + LV_LOG_ERROR("buffer memory(%p) != address(%p)", + buffer->memory, (void *)(uintptr_t)buffer->address); + return false; + } + + if(is_src && buffer->width != (vg_lite_int32_t)lv_vg_lite_width_align(buffer->width)) { + LV_LOG_ERROR("buffer width(%d) is not aligned", (int)buffer->width); + return false; + } + + if(!LV_VG_LITE_IS_ALIGNED(buffer->memory, LV_DRAW_BUF_ALIGN)) { + LV_LOG_ERROR("buffer address(%p) is not aligned to %d", buffer->memory, LV_DRAW_BUF_ALIGN); + return false; + } + + lv_vg_lite_buffer_format_bytes(buffer->format, &mul, &div, &align); + stride = LV_VG_LITE_ALIGN((buffer->width * mul / div), align); + + if(buffer->stride != stride) { + LV_LOG_ERROR("buffer stride(%d) != %d", (int)buffer->stride, (int)stride); + return false; + } + + switch(buffer->image_mode) { + case VG_LITE_ZERO: + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_MULTIPLY_IMAGE_MODE: + case VG_LITE_STENCIL_MODE: + case VG_LITE_NONE_IMAGE_MODE: + case VG_LITE_RECOLOR_MODE: + break; + default: + LV_LOG_ERROR("buffer image_mode(%d) is invalid", (int)buffer->image_mode); + return false; + } + + switch(buffer->transparency_mode) { + case VG_LITE_IMAGE_OPAQUE: + case VG_LITE_IMAGE_TRANSPARENT: + break; + default: + LV_LOG_ERROR("buffer transparency_mode(%d) is invalid", + (int)buffer->transparency_mode); + return false; + } + + return true; +} + +bool lv_vg_lite_path_check(const vg_lite_path_t * path) +{ + if(path == NULL) { + LV_LOG_ERROR("path is NULL"); + return false; + } + + if(path->path == NULL) { + LV_LOG_ERROR("path->path is NULL"); + return false; + } + + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + if(!fmt_len) { + LV_LOG_ERROR("path format(%d) is invalid", (int)path->format); + return false; + } + + size_t len = path->path_length / fmt_len; + + if(len < 1) { + LV_LOG_ERROR("path length(%d) error", (int)path->path_length); + return false; + } + + const uint8_t * cur = path->path; + const uint8_t * end = cur + path->path_length; + + while(cur < end) { + /* get op code */ + uint8_t op_code = VLC_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); + + /* get next op code */ + cur += (fmt_len * (1 + arg_len)) ; + + /* break if end */ + if(op_code == VLC_OP_END) { + break; + } + } + + if(cur != end) { + LV_LOG_ERROR("path length(%d) error", (int)path->path_length); + return false; + } + + uint8_t end_op_code = VLC_GET_OP_CODE(end - fmt_len); + if(end_op_code != VLC_OP_END) { + LV_LOG_ERROR("%d (%s) -> is NOT VLC_OP_END", end_op_code, lv_vg_lite_vlc_op_string(end_op_code)); + return false; + } + + return true; +} + +bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix) +{ + if(matrix == NULL) { + LV_LOG_ERROR("matrix is NULL"); + return false; + } + + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, matrix)) { + LV_LOG_ERROR("matrix is not invertible"); + lv_vg_lite_matrix_dump_info(matrix); + return false; + } + + return true; +} + +bool lv_vg_lite_support_blend_normal(void) +{ + return vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT); +} + +bool lv_vg_lite_16px_align(void) +{ + return vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN); +} + +void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + vg_lite_float_t (*m)[3] = matrix->m; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (m[row][0] * mult->m[0][column]) + + (m[row][1] * mult->m[1][column]) + + (m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ + lv_memcpy(matrix, &temp, sizeof(temp)); +} + +void lv_vg_lite_matrix_flip_y(vg_lite_matrix_t * matrix) +{ + matrix->m[1][1] = -matrix->m[1][1]; +} + +bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) +{ + vg_lite_float_t det00, det01, det02; + vg_lite_float_t d; + bool is_affine; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->m[0][0] = 1.0f; + result->m[0][1] = 0.0f; + result->m[0][2] = 0.0f; + result->m[1][0] = 0.0f; + result->m[1][1] = 1.0f; + result->m[1][2] = 0.0f; + result->m[2][0] = 0.0f; + result->m[2][1] = 0.0f; + result->m[2][2] = 1.0f; + + /* Success. */ + return true; + } + + const vg_lite_float_t (*m)[3] = matrix->m; + + det00 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + det01 = m[2][0] * m[1][2] - m[1][0] * m[2][2]; + det02 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + /* Compute determinant. */ + d = m[0][0] * det00 + m[0][1] * det01 + m[0][2] * det02; + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return false; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + is_affine = (m[2][0] == 0.0f) && (m[2][1] == 0.0f) && (m[2][2] == 1.0f); + + result->m[0][0] = d * det00; + result->m[0][1] = d * ((m[2][1] * m[0][2]) - (m[0][1] * m[2][2])); + result->m[0][2] = d * ((m[0][1] * m[1][2]) - (m[1][1] * m[0][2])); + result->m[1][0] = d * det01; + result->m[1][1] = d * ((m[0][0] * m[2][2]) - (m[2][0] * m[0][2])); + result->m[1][2] = d * ((m[1][0] * m[0][2]) - (m[0][0] * m[1][2])); + result->m[2][0] = is_affine ? 0.0f : d * det02; + result->m[2][1] = is_affine ? 0.0f : d * ((m[2][0] * m[0][1]) - (m[0][0] * m[2][1])); + result->m[2][2] = is_affine ? 1.0f : d * ((m[0][0] * m[1][1]) - (m[1][0] * m[0][1])); + + /* Success. */ + return true; +} + +lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point) +{ + lv_point_precise_t p; + const vg_lite_float_t (*m)[3] = matrix->m; + p.x = (lv_value_precise_t)(point->x * m[0][0] + point->y * m[0][1] + m[0][2]); + p.y = (lv_value_precise_t)(point->x * m[1][0] + point->y * m[1][1] + m[1][2]); + return p; +} + +void lv_vg_lite_set_scissor_area(const lv_area_t * area) +{ + LV_VG_LITE_CHECK_ERROR(vg_lite_enable_scissor()); + LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor( + area->x1, + area->y1, + lv_area_get_width(area), + lv_area_get_height(area))); +} + +void lv_vg_lite_disable_scissor(void) +{ + LV_VG_LITE_CHECK_ERROR(vg_lite_disable_scissor()); +} + +void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_BEGIN; + + u->flush_count++; + +#if LV_VG_LITE_FLUSH_MAX_COUNT + if(u->flush_count < LV_VG_LITE_FLUSH_MAX_COUNT) { + /* Do not flush too often */ + LV_PROFILER_END; + return; + } +#else + vg_lite_uint32_t is_gpu_idle = 0; + LV_VG_LITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&is_gpu_idle)); + if(!is_gpu_idle) { + /* Do not flush if GPU is busy */ + LV_PROFILER_END; + return; + } +#endif + + LV_VG_LITE_CHECK_ERROR(vg_lite_flush()); + u->flush_count = 0; + LV_PROFILER_END; +} + +void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_BEGIN; + + LV_VG_LITE_CHECK_ERROR(vg_lite_finish()); + + /* Clear all gradient caches reference */ + lv_vg_lite_pending_remove_all(u->grad_pending); + + /* Clear image decoder dsc reference */ + lv_vg_lite_pending_remove_all(u->image_dsc_pending); + u->flush_count = 0; + LV_PROFILER_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void image_dsc_free_cb(void * dsc, void * user_data) +{ + LV_UNUSED(user_data); + lv_image_decoder_close(dsc); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h new file mode 100644 index 0000000..c50d600 --- /dev/null +++ b/libraries/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h @@ -0,0 +1,185 @@ +/** + * @file lv_vg_lite_utils.h + * + */ + +#ifndef LV_VG_LITE_UTILS_H +#define LV_VG_LITE_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../../misc/lv_profiler.h" + +#include +#if LV_USE_VG_LITE_THORVG +#include "../../others/vg_lite_tvg/vg_lite.h" +#else +#include +#endif + +/********************* + * DEFINES + *********************/ + +#define LV_VG_LITE_IS_ERROR(err) (err > 0) + +#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr)) + +#if LV_VG_LITE_USE_ASSERT +#define LV_VG_LITE_ASSERT(expr) LV_ASSERT(expr) +#else +#define LV_VG_LITE_ASSERT(expr) +#endif + +#define LV_VG_LITE_CHECK_ERROR(expr) \ + do { \ + vg_lite_error_t error = expr; \ + if (LV_VG_LITE_IS_ERROR(error)) { \ + LV_LOG_ERROR("Execute '" #expr "' error(%d): %s", \ + (int)error, lv_vg_lite_error_string(error)); \ + LV_VG_LITE_ASSERT(false); \ + } \ + } while (0) + +#define LV_VG_LITE_ASSERT_PATH(path) LV_VG_LITE_ASSERT(lv_vg_lite_path_check(path)) +#define LV_VG_LITE_ASSERT_SRC_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, true)) +#define LV_VG_LITE_ASSERT_DEST_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, false)) +#define LV_VG_LITE_ASSERT_MATRIX(matrix) LV_VG_LITE_ASSERT(lv_vg_lite_matrix_check(matrix)) + +#define LV_VG_LITE_ALIGN(number, align_bytes) \ + (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) + +#define LV_VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) + +#define LV_VG_LITE_IS_INDEX_FMT(fmt) \ + ((fmt) == VG_LITE_INDEX_1 \ + || (fmt) == VG_LITE_INDEX_2 \ + || (fmt) == VG_LITE_INDEX_4 \ + || (fmt) == VG_LITE_INDEX_8) + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/* Print info */ + +void lv_vg_lite_dump_info(void); + +const char * lv_vg_lite_error_string(vg_lite_error_t error); + +const char * lv_vg_lite_feature_string(vg_lite_feature_t feature); + +const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format); + +const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op); + +void lv_vg_lite_path_dump_info(const vg_lite_path_t * path); + +void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer); + +void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix); + +bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf); + +bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf); + +/* Converter */ + +vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf); + +void lv_vg_lite_buffer_format_bytes( + vg_lite_buffer_format_t format, + uint32_t * mul, + uint32_t * div, + uint32_t * bytes_align); + +uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format); + +uint32_t lv_vg_lite_width_align(uint32_t w); + +void lv_vg_lite_buffer_init( + vg_lite_buffer_t * buffer, + const void * ptr, + int32_t width, + int32_t height, + vg_lite_buffer_format_t format, + bool tiled); + +void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf); + +void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); + +void lv_vg_lite_image_dec_init(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); + +bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, + bool no_cache); + +void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit); + +void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit); + +vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode); + +uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format); + +vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul); + +void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area); + +/* Param checker */ + +bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src); + +bool lv_vg_lite_path_check(const vg_lite_path_t * path); + +bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix); + +/* Wrapper */ + +bool lv_vg_lite_support_blend_normal(void); + +bool lv_vg_lite_16px_align(void); + +void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult); + +void lv_vg_lite_matrix_flip_y(vg_lite_matrix_t * matrix); + +bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix); + +lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point); + +void lv_vg_lite_set_scissor_area(const lv_area_t * area); + +void lv_vg_lite_disable_scissor(void); + +void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u); + +void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*VG_LITE_UTILS_H*/ diff --git a/libraries/lvgl/src/drivers/README.md b/libraries/lvgl/src/drivers/README.md new file mode 100644 index 0000000..f755a3a --- /dev/null +++ b/libraries/lvgl/src/drivers/README.md @@ -0,0 +1 @@ +High level drivers for display controllers, frame buffers, etc \ No newline at end of file diff --git a/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.c b/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.c new file mode 100644 index 0000000..faa2212 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.c @@ -0,0 +1,835 @@ +/** + * @file lv_linux_drm.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_linux_drm.h" +#if LV_USE_LINUX_DRM + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_DEPTH == 32 + #define DRM_FOURCC DRM_FORMAT_XRGB8888 +#elif LV_COLOR_DEPTH == 16 + #define DRM_FOURCC DRM_FORMAT_RGB565 +#else + #error LV_COLOR_DEPTH not supported +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t handle; + uint32_t pitch; + uint32_t offset; + unsigned long int size; + uint8_t * map; + uint32_t fb_handle; +} drm_buffer_t; + +typedef struct { + int fd; + uint32_t conn_id, enc_id, crtc_id, plane_id, crtc_idx; + uint32_t width, height; + uint32_t mmWidth, mmHeight; + uint32_t fourcc; + drmModeModeInfo mode; + uint32_t blob_id; + drmModeCrtc * saved_crtc; + drmModeAtomicReq * req; + drmEventContext drm_event_ctx; + drmModePlane * plane; + drmModeCrtc * crtc; + drmModeConnector * conn; + uint32_t count_plane_props; + uint32_t count_crtc_props; + uint32_t count_conn_props; + drmModePropertyPtr plane_props[128]; + drmModePropertyPtr crtc_props[128]; + drmModePropertyPtr conn_props[128]; + drm_buffer_t drm_bufs[2]; /*DUMB buffers*/ +} drm_dev_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name); +static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name); +static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name); +static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, + void * user_data); +static int drm_get_plane_props(drm_dev_t * drm_dev); +static int drm_get_crtc_props(drm_dev_t * drm_dev); +static int drm_get_conn_props(drm_dev_t * drm_dev); +static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf); +static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, + uint32_t crtc_idx); +static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id); +static int drm_open(const char * path); +static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc); +static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf); +static int drm_setup_buffers(drm_dev_t * drm_dev); +static void drm_flush_wait(lv_display_t * drm_dev); +static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#ifndef DIV_ROUND_UP + #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_linux_drm_create(void) +{ + drm_dev_t * drm_dev = lv_malloc_zeroed(sizeof(drm_dev_t)); + LV_ASSERT_MALLOC(drm_dev); + if(drm_dev == NULL) return NULL; + + lv_display_t * disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(drm_dev); + return NULL; + } + drm_dev->fd = -1; + lv_display_set_driver_data(disp, drm_dev); + lv_display_set_flush_wait_cb(disp, drm_flush_wait); + lv_display_set_flush_cb(disp, drm_flush); + + return disp; +} + +void lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id) +{ + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + int ret; + + ret = drm_setup(drm_dev, file, connector_id, DRM_FOURCC); + if(ret) { + close(drm_dev->fd); + drm_dev->fd = -1; + return; + } + + ret = drm_setup_buffers(drm_dev); + if(ret) { + LV_LOG_ERROR("DRM buffer allocation failed"); + close(drm_dev->fd); + drm_dev->fd = -1; + return; + } + + LV_LOG_INFO("DRM subsystem and buffer mapped successfully"); + + int32_t hor_res = drm_dev->width; + int32_t ver_res = drm_dev->height; + int32_t width = drm_dev->mmWidth; + + size_t buf_size = LV_MIN(drm_dev->drm_bufs[1].size, drm_dev->drm_bufs[0].size); + lv_display_set_buffers(disp, drm_dev->drm_bufs[1].map, drm_dev->drm_bufs[0].map, buf_size, + LV_DISPLAY_RENDER_MODE_DIRECT); + lv_display_set_resolution(disp, hor_res, ver_res); + + if(width) { + lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 25400, width * 1000)); + } + + LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", + hor_res, ver_res, lv_display_get_dpi(disp)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find plane property: %s", name); + + for(i = 0; i < drm_dev->count_plane_props; ++i) + if(!lv_strcmp(drm_dev->plane_props[i]->name, name)) + return drm_dev->plane_props[i]->prop_id; + + LV_LOG_TRACE("Unknown plane property: %s", name); + + return 0; +} + +static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find crtc property: %s", name); + + for(i = 0; i < drm_dev->count_crtc_props; ++i) + if(!lv_strcmp(drm_dev->crtc_props[i]->name, name)) + return drm_dev->crtc_props[i]->prop_id; + + LV_LOG_TRACE("Unknown crtc property: %s", name); + + return 0; +} + +static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find conn property: %s", name); + + for(i = 0; i < drm_dev->count_conn_props; ++i) + if(!lv_strcmp(drm_dev->conn_props[i]->name, name)) + return drm_dev->conn_props[i]->prop_id; + + LV_LOG_TRACE("Unknown conn property: %s", name); + + return 0; +} + +static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, + void * user_data) +{ + LV_UNUSED(fd); + LV_UNUSED(sequence); + LV_UNUSED(tv_sec); + LV_UNUSED(tv_usec); + LV_LOG_TRACE("flip"); + drm_dev_t * drm_dev = user_data; + if(drm_dev->req) { + drmModeAtomicFree(drm_dev->req); + drm_dev->req = NULL; + } +} + +static int drm_get_plane_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->plane_id, + DRM_MODE_OBJECT_PLANE); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u plane props", props->count_props); + drm_dev->count_plane_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->plane_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added plane prop %u:%s", drm_dev->plane_props[i]->prop_id, drm_dev->plane_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_get_crtc_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->crtc_id, + DRM_MODE_OBJECT_CRTC); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u crtc props", props->count_props); + drm_dev->count_crtc_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->crtc_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added crtc prop %u:%s", drm_dev->crtc_props[i]->prop_id, drm_dev->crtc_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_get_conn_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->conn_id, + DRM_MODE_OBJECT_CONNECTOR); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u connector props", props->count_props); + drm_dev->count_conn_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->conn_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added connector prop %u:%s", drm_dev->conn_props[i]->prop_id, drm_dev->conn_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_plane_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find plane prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->plane_id, get_plane_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_crtc_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find crtc prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->crtc_id, get_crtc_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_conn_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find conn prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->conn_id, get_conn_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf) +{ + int ret; + static int first = 1; + uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK; + + drm_dev->req = drmModeAtomicAlloc(); + + /* On first Atomic commit, do a modeset */ + if(first) { + drm_add_conn_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); + + drm_add_crtc_property(drm_dev, "MODE_ID", drm_dev->blob_id); + drm_add_crtc_property(drm_dev, "ACTIVE", 1); + + flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; + + first = 0; + } + + drm_add_plane_property(drm_dev, "FB_ID", buf->fb_handle); + drm_add_plane_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); + drm_add_plane_property(drm_dev, "SRC_X", 0); + drm_add_plane_property(drm_dev, "SRC_Y", 0); + drm_add_plane_property(drm_dev, "SRC_W", drm_dev->width << 16); + drm_add_plane_property(drm_dev, "SRC_H", drm_dev->height << 16); + drm_add_plane_property(drm_dev, "CRTC_X", 0); + drm_add_plane_property(drm_dev, "CRTC_Y", 0); + drm_add_plane_property(drm_dev, "CRTC_W", drm_dev->width); + drm_add_plane_property(drm_dev, "CRTC_H", drm_dev->height); + + ret = drmModeAtomicCommit(drm_dev->fd, drm_dev->req, flags, drm_dev); + if(ret) { + LV_LOG_ERROR("drmModeAtomicCommit failed: %s (%d)", strerror(errno), errno); + drmModeAtomicFree(drm_dev->req); + return ret; + } + + return 0; +} + +static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, + uint32_t crtc_idx) +{ + LV_UNUSED(crtc_id); + drmModePlaneResPtr planes; + drmModePlanePtr plane; + unsigned int i; + unsigned int j; + int ret = 0; + unsigned int format = fourcc; + + planes = drmModeGetPlaneResources(drm_dev->fd); + if(!planes) { + LV_LOG_ERROR("drmModeGetPlaneResources failed"); + return -1; + } + + LV_LOG_TRACE("drm: found planes %u", planes->count_planes); + + for(i = 0; i < planes->count_planes; ++i) { + plane = drmModeGetPlane(drm_dev->fd, planes->planes[i]); + if(!plane) { + LV_LOG_ERROR("drmModeGetPlane failed: %s", strerror(errno)); + break; + } + + if(!(plane->possible_crtcs & (1 << crtc_idx))) { + drmModeFreePlane(plane); + continue; + } + + for(j = 0; j < plane->count_formats; ++j) { + if(plane->formats[j] == format) + break; + } + + if(j == plane->count_formats) { + drmModeFreePlane(plane); + continue; + } + + *plane_id = plane->plane_id; + drmModeFreePlane(plane); + + LV_LOG_TRACE("found plane %d", *plane_id); + + break; + } + + if(i == planes->count_planes) + ret = -1; + + drmModeFreePlaneResources(planes); + + return ret; +} + +static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id) +{ + drmModeConnector * conn = NULL; + drmModeEncoder * enc = NULL; + drmModeRes * res; + int i; + + if((res = drmModeGetResources(drm_dev->fd)) == NULL) { + LV_LOG_ERROR("drmModeGetResources() failed"); + return -1; + } + + if(res->count_crtcs <= 0) { + LV_LOG_ERROR("no Crtcs"); + goto free_res; + } + + /* find all available connectors */ + for(i = 0; i < res->count_connectors; i++) { + conn = drmModeGetConnector(drm_dev->fd, res->connectors[i]); + if(!conn) + continue; + + if(connector_id >= 0 && conn->connector_id != connector_id) { + drmModeFreeConnector(conn); + continue; + } + + if(conn->connection == DRM_MODE_CONNECTED) { + LV_LOG_TRACE("drm: connector %d: connected", conn->connector_id); + } + else if(conn->connection == DRM_MODE_DISCONNECTED) { + LV_LOG_TRACE("drm: connector %d: disconnected", conn->connector_id); + } + else if(conn->connection == DRM_MODE_UNKNOWNCONNECTION) { + LV_LOG_TRACE("drm: connector %d: unknownconnection", conn->connector_id); + } + else { + LV_LOG_TRACE("drm: connector %d: unknown", conn->connector_id); + } + + if(conn->connection == DRM_MODE_CONNECTED && conn->count_modes > 0) + break; + + drmModeFreeConnector(conn); + conn = NULL; + }; + + if(!conn) { + LV_LOG_ERROR("suitable connector not found"); + goto free_res; + } + + drm_dev->conn_id = conn->connector_id; + LV_LOG_TRACE("conn_id: %d", drm_dev->conn_id); + drm_dev->mmWidth = conn->mmWidth; + drm_dev->mmHeight = conn->mmHeight; + + lv_memcpy(&drm_dev->mode, &conn->modes[0], sizeof(drmModeModeInfo)); + + if(drmModeCreatePropertyBlob(drm_dev->fd, &drm_dev->mode, sizeof(drm_dev->mode), + &drm_dev->blob_id)) { + LV_LOG_ERROR("error creating mode blob"); + goto free_res; + } + + drm_dev->width = conn->modes[0].hdisplay; + drm_dev->height = conn->modes[0].vdisplay; + + for(i = 0 ; i < res->count_encoders; i++) { + enc = drmModeGetEncoder(drm_dev->fd, res->encoders[i]); + if(!enc) + continue; + + LV_LOG_TRACE("enc%d enc_id %d conn enc_id %d", i, enc->encoder_id, conn->encoder_id); + + if(enc->encoder_id == conn->encoder_id) + break; + + drmModeFreeEncoder(enc); + enc = NULL; + } + + if(enc) { + drm_dev->enc_id = enc->encoder_id; + LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); + drm_dev->crtc_id = enc->crtc_id; + LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); + drmModeFreeEncoder(enc); + } + else { + /* Encoder hasn't been associated yet, look it up */ + for(i = 0; i < conn->count_encoders; i++) { + int crtc, crtc_id = -1; + + enc = drmModeGetEncoder(drm_dev->fd, conn->encoders[i]); + if(!enc) + continue; + + for(crtc = 0 ; crtc < res->count_crtcs; crtc++) { + uint32_t crtc_mask = 1 << crtc; + + crtc_id = res->crtcs[crtc]; + + LV_LOG_TRACE("enc_id %d crtc%d id %d mask %x possible %x", enc->encoder_id, crtc, crtc_id, crtc_mask, + enc->possible_crtcs); + + if(enc->possible_crtcs & crtc_mask) + break; + } + + if(crtc_id > 0) { + drm_dev->enc_id = enc->encoder_id; + LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); + drm_dev->crtc_id = crtc_id; + LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); + break; + } + + drmModeFreeEncoder(enc); + enc = NULL; + } + + if(!enc) { + LV_LOG_ERROR("suitable encoder not found"); + goto free_res; + } + + drmModeFreeEncoder(enc); + } + + drm_dev->crtc_idx = UINT32_MAX; + + for(i = 0; i < res->count_crtcs; ++i) { + if(drm_dev->crtc_id == res->crtcs[i]) { + drm_dev->crtc_idx = i; + break; + } + } + + if(drm_dev->crtc_idx == UINT32_MAX) { + LV_LOG_ERROR("drm: CRTC not found"); + goto free_res; + } + + LV_LOG_TRACE("crtc_idx: %d", drm_dev->crtc_idx); + + return 0; + +free_res: + drmModeFreeResources(res); + + return -1; +} + +static int drm_open(const char * path) +{ + int fd, flags; + uint64_t has_dumb; + int ret; + + fd = open(path, O_RDWR); + if(fd < 0) { + LV_LOG_ERROR("cannot open \"%s\"", path); + return -1; + } + + /* set FD_CLOEXEC flag */ + if((flags = fcntl(fd, F_GETFD)) < 0 || + fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { + LV_LOG_ERROR("fcntl FD_CLOEXEC failed"); + goto err; + } + + /* check capability */ + ret = drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &has_dumb); + if(ret < 0 || has_dumb == 0) { + LV_LOG_ERROR("drmGetCap DRM_CAP_DUMB_BUFFER failed or \"%s\" doesn't have dumb " + "buffer", path); + goto err; + } + + return fd; +err: + close(fd); + return -1; +} + +static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc) +{ + int ret; + + drm_dev->fd = drm_open(device_path); + if(drm_dev->fd < 0) + return -1; + + ret = drmSetClientCap(drm_dev->fd, DRM_CLIENT_CAP_ATOMIC, 1); + if(ret) { + LV_LOG_ERROR("No atomic modesetting support: %s", strerror(errno)); + goto err; + } + + ret = drm_find_connector(drm_dev, connector_id); + if(ret) { + LV_LOG_ERROR("available drm devices not found"); + goto err; + } + + ret = find_plane(drm_dev, fourcc, &drm_dev->plane_id, drm_dev->crtc_id, drm_dev->crtc_idx); + if(ret) { + LV_LOG_ERROR("Cannot find plane"); + goto err; + } + + drm_dev->plane = drmModeGetPlane(drm_dev->fd, drm_dev->plane_id); + if(!drm_dev->plane) { + LV_LOG_ERROR("Cannot get plane"); + goto err; + } + + drm_dev->crtc = drmModeGetCrtc(drm_dev->fd, drm_dev->crtc_id); + if(!drm_dev->crtc) { + LV_LOG_ERROR("Cannot get crtc"); + goto err; + } + + drm_dev->conn = drmModeGetConnector(drm_dev->fd, drm_dev->conn_id); + if(!drm_dev->conn) { + LV_LOG_ERROR("Cannot get connector"); + goto err; + } + + ret = drm_get_plane_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get plane props"); + goto err; + } + + ret = drm_get_crtc_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get crtc props"); + goto err; + } + + ret = drm_get_conn_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get connector props"); + goto err; + } + + drm_dev->drm_event_ctx.version = DRM_EVENT_CONTEXT_VERSION; + drm_dev->drm_event_ctx.page_flip_handler = page_flip_handler; + drm_dev->fourcc = fourcc; + + LV_LOG_INFO("drm: Found plane_id: %u connector_id: %d crtc_id: %d", + drm_dev->plane_id, drm_dev->conn_id, drm_dev->crtc_id); + + LV_LOG_INFO("drm: %dx%d (%dmm X% dmm) pixel format %c%c%c%c", + drm_dev->width, drm_dev->height, drm_dev->mmWidth, drm_dev->mmHeight, + (fourcc >> 0) & 0xff, (fourcc >> 8) & 0xff, (fourcc >> 16) & 0xff, (fourcc >> 24) & 0xff); + + return 0; + +err: + close(drm_dev->fd); + return -1; +} + +static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf) +{ + struct drm_mode_create_dumb creq; + struct drm_mode_map_dumb mreq; + uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0}; + int ret; + + /* create dumb buffer */ + lv_memzero(&creq, sizeof(creq)); + creq.width = drm_dev->width; + creq.height = drm_dev->height; + creq.bpp = LV_COLOR_DEPTH; + ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq); + if(ret < 0) { + LV_LOG_ERROR("DRM_IOCTL_MODE_CREATE_DUMB fail"); + return -1; + } + + buf->handle = creq.handle; + buf->pitch = creq.pitch; + buf->size = creq.size; + + /* prepare buffer for memory mapping */ + lv_memzero(&mreq, sizeof(mreq)); + mreq.handle = creq.handle; + ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq); + if(ret) { + LV_LOG_ERROR("DRM_IOCTL_MODE_MAP_DUMB fail"); + return -1; + } + + buf->offset = mreq.offset; + LV_LOG_INFO("size %lu pitch %u offset %u", buf->size, buf->pitch, buf->offset); + + /* perform actual memory mapping */ + buf->map = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_dev->fd, mreq.offset); + if(buf->map == MAP_FAILED) { + LV_LOG_ERROR("mmap fail"); + return -1; + } + + /* clear the framebuffer to 0 (= full transparency in ARGB8888) */ + lv_memzero(buf->map, creq.size); + + /* create framebuffer object for the dumb-buffer */ + handles[0] = creq.handle; + pitches[0] = creq.pitch; + offsets[0] = 0; + ret = drmModeAddFB2(drm_dev->fd, drm_dev->width, drm_dev->height, drm_dev->fourcc, + handles, pitches, offsets, &buf->fb_handle, 0); + if(ret) { + LV_LOG_ERROR("drmModeAddFB fail"); + return -1; + } + + return 0; +} + +static int drm_setup_buffers(drm_dev_t * drm_dev) +{ + int ret; + + /*Allocate DUMB buffers*/ + ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[0]); + if(ret) + return ret; + + ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[1]); + if(ret) + return ret; + + return 0; +} + +static void drm_flush_wait(lv_display_t * disp) +{ + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + + struct pollfd pfd; + pfd.fd = drm_dev->fd; + pfd.events = POLLIN; + + while(drm_dev->req) { + int ret; + do { + ret = poll(&pfd, 1, -1); + } while(ret == -1 && errno == EINTR); + + if(ret > 0) + drmHandleEvent(drm_dev->fd, &drm_dev->drm_event_ctx); + else { + LV_LOG_ERROR("poll failed: %s", strerror(errno)); + return; + } + } +} + +static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + if(!lv_display_flush_is_last(disp)) return; + + LV_UNUSED(area); + LV_UNUSED(px_map); + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + + for(int idx = 0; idx < 2; idx++) { + if(drm_dev->drm_bufs[idx].map == px_map) { + /*Request buffer swap*/ + if(drm_dmabuf_set_plane(drm_dev, &drm_dev->drm_bufs[idx])) { + LV_LOG_ERROR("Flush fail"); + return; + } + else + LV_LOG_TRACE("Flush done"); + } + } +} + +#endif /*LV_USE_LINUX_DRM*/ diff --git a/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.h b/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.h new file mode 100644 index 0000000..a75d195 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/drm/lv_linux_drm.h @@ -0,0 +1,46 @@ +/** + * @file lv_linux_drm_h + * + */ + +#ifndef LV_LINUX_DRM_H +#define LV_LINUX_DRM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_LINUX_DRM + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_linux_drm_create(void); + +void lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINUX_DRM */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LINUX_DRM_H */ diff --git a/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.c b/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.c new file mode 100644 index 0000000..cf529a2 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.c @@ -0,0 +1,304 @@ +/** + * @file lv_linux_fbdev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_linux_fbdev.h" +#if LV_USE_LINUX_FBDEV + +#include +#include +#include +#include +#include +#include +#include +#include + +#if LV_LINUX_FBDEV_BSD + #include + #include + #include +#else + #include +#endif /* LV_LINUX_FBDEV_BSD */ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct bsd_fb_var_info { + uint32_t xoffset; + uint32_t yoffset; + uint32_t xres; + uint32_t yres; + int bits_per_pixel; +}; + +struct bsd_fb_fix_info { + long int line_length; + long int smem_len; +}; + +typedef struct { + const char * devname; + lv_color_format_t color_format; +#if LV_LINUX_FBDEV_BSD + struct bsd_fb_var_info vinfo; + struct bsd_fb_fix_info finfo; +#else + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; +#endif /* LV_LINUX_FBDEV_BSD */ + char * fbp; + long int screensize; + int fbfd; + bool force_refresh; +} lv_linux_fb_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static uint32_t tick_get_cb(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#if LV_LINUX_FBDEV_BSD + #define FBIOBLANK FBIO_BLANK +#endif /* LV_LINUX_FBDEV_BSD */ + +#ifndef DIV_ROUND_UP + #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_linux_fbdev_create(void) +{ + static bool inited = false; + if(!inited) { + lv_tick_set_cb(tick_get_cb); + inited = true; + } + + lv_linux_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_linux_fb_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + dsc->fbfd = -1; + lv_display_set_driver_data(disp, dsc); + lv_display_set_flush_cb(disp, flush_cb); + + return disp; +} + +void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file) +{ + char * devname = lv_malloc(lv_strlen(file) + 1); + LV_ASSERT_MALLOC(devname); + if(devname == NULL) return; + lv_strcpy(devname, file); + + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + dsc->devname = devname; + + if(dsc->fbfd > 0) close(dsc->fbfd); + + /* Open the file for reading and writing*/ + dsc->fbfd = open(dsc->devname, O_RDWR); + if(dsc->fbfd == -1) { + perror("Error: cannot open framebuffer device"); + return; + } + LV_LOG_INFO("The framebuffer device was opened successfully"); + + /* Make sure that the display is on.*/ + if(ioctl(dsc->fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { + perror("ioctl(FBIOBLANK)"); + /* Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.*/ + } + +#if LV_LINUX_FBDEV_BSD + struct fbtype fb; + unsigned line_length; + + /*Get fb type*/ + if(ioctl(dsc->fbfd, FBIOGTYPE, &fb) != 0) { + perror("ioctl(FBIOGTYPE)"); + return; + } + + /*Get screen width*/ + if(ioctl(dsc->fbfd, FBIO_GETLINEWIDTH, &line_length) != 0) { + perror("ioctl(FBIO_GETLINEWIDTH)"); + return; + } + + dsc->vinfo.xres = (unsigned) fb.fb_width; + dsc->vinfo.yres = (unsigned) fb.fb_height; + dsc->vinfo.bits_per_pixel = fb.fb_depth; + dsc->vinfo.xoffset = 0; + dsc->vinfo.yoffset = 0; + dsc->finfo.line_length = line_length; + dsc->finfo.smem_len = dsc->finfo.line_length * dsc->vinfo.yres; +#else /* LV_LINUX_FBDEV_BSD */ + + /* Get fixed screen information*/ + if(ioctl(dsc->fbfd, FBIOGET_FSCREENINFO, &dsc->finfo) == -1) { + perror("Error reading fixed information"); + return; + } + + /* Get variable screen information*/ + if(ioctl(dsc->fbfd, FBIOGET_VSCREENINFO, &dsc->vinfo) == -1) { + perror("Error reading variable information"); + return; + } +#endif /* LV_LINUX_FBDEV_BSD */ + + LV_LOG_INFO("%dx%d, %dbpp", dsc->vinfo.xres, dsc->vinfo.yres, dsc->vinfo.bits_per_pixel); + + /* Figure out the size of the screen in bytes*/ + dsc->screensize = dsc->finfo.smem_len;/*finfo.line_length * vinfo.yres;*/ + + /* Map the device to memory*/ + dsc->fbp = (char *)mmap(0, dsc->screensize, PROT_READ | PROT_WRITE, MAP_SHARED, dsc->fbfd, 0); + if((intptr_t)dsc->fbp == -1) { + perror("Error: failed to map framebuffer device to memory"); + return; + } + + /* Don't initialise the memory to retain what's currently displayed / avoid clearing the screen. + * This is important for applications that only draw to a subsection of the full framebuffer.*/ + + LV_LOG_INFO("The framebuffer device was mapped to memory successfully"); + + switch(dsc->vinfo.bits_per_pixel) { + case 16: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565); + break; + case 24: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB888); + break; + case 32: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_XRGB8888); + break; + default: + LV_LOG_WARN("Not supported color format (%d bits)", dsc->vinfo.bits_per_pixel); + return; + } + + int32_t hor_res = dsc->vinfo.xres; + int32_t ver_res = dsc->vinfo.yres; + int32_t width = dsc->vinfo.width; + uint32_t draw_buf_size = hor_res * (dsc->vinfo.bits_per_pixel >> 3); + if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + draw_buf_size *= LV_LINUX_FBDEV_BUFFER_SIZE; + } + else { + draw_buf_size *= ver_res; + } + + uint8_t * draw_buf = NULL; + uint8_t * draw_buf_2 = NULL; + draw_buf = malloc(draw_buf_size); + + if(LV_LINUX_FBDEV_BUFFER_COUNT == 2) { + draw_buf_2 = malloc(draw_buf_size); + } + + lv_display_set_buffers(disp, draw_buf, draw_buf_2, draw_buf_size, LV_LINUX_FBDEV_RENDER_MODE); + lv_display_set_resolution(disp, hor_res, ver_res); + + if(width > 0) { + lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 254, width * 10)); + } + + LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", + hor_res, ver_res, lv_display_get_dpi(disp)); +} + +void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled) +{ + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + dsc->force_refresh = enabled; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + + if(dsc->fbp == NULL || + area->x2 < 0 || area->y2 < 0 || + area->x1 > (int32_t)dsc->vinfo.xres - 1 || area->y1 > (int32_t)dsc->vinfo.yres - 1) { + lv_display_flush_ready(disp); + return; + } + + int32_t w = lv_area_get_width(area); + uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); + uint32_t color_pos = (area->x1 + dsc->vinfo.xoffset) * px_size + area->y1 * dsc->finfo.line_length; + uint32_t fb_pos = color_pos + dsc->vinfo.yoffset * dsc->finfo.line_length; + + uint8_t * fbp = (uint8_t *)dsc->fbp; + int32_t y; + if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_DIRECT) { + for(y = area->y1; y <= area->y2; y++) { + lv_memcpy(&fbp[fb_pos], &color_p[color_pos], w * px_size); + fb_pos += dsc->finfo.line_length; + color_pos += dsc->finfo.line_length; + } + } + else { + for(y = area->y1; y <= area->y2; y++) { + lv_memcpy(&fbp[fb_pos], color_p, w * px_size); + fb_pos += dsc->finfo.line_length; + color_p += w * px_size; + } + } + + if(dsc->force_refresh) { + dsc->vinfo.activate |= FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + if(ioctl(dsc->fbfd, FBIOPUT_VSCREENINFO, &(dsc->vinfo)) == -1) { + perror("Error setting var screen info"); + } + } + + lv_display_flush_ready(disp); +} + +static uint32_t tick_get_cb(void) +{ + struct timeval tv_now; + gettimeofday(&tv_now, NULL); + uint64_t time_ms; + time_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000; + return time_ms; +} + +#endif /*LV_USE_LINUX_FBDEV*/ diff --git a/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.h b/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.h new file mode 100644 index 0000000..c14e973 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/fb/lv_linux_fbdev.h @@ -0,0 +1,52 @@ +/** + * @file lv_linux_fb_dev_h + * + */ + +#ifndef LV_LINUX_FB_DEV_H +#define LV_LINUX_FB_DEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_LINUX_FBDEV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_linux_fbdev_create(void); + +void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file); + +/** + * Force the display to be refreshed on every change. + * Expected to be used with LV_DISPLAY_RENDER_MODE_DIRECT or LV_DISPLAY_RENDER_MODE_FULL. + */ +void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINUX_FBDEV */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LINUX_FB_DEV_H */ diff --git a/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.c b/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.c new file mode 100644 index 0000000..a6b2acf --- /dev/null +++ b/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.c @@ -0,0 +1,117 @@ +/** + * @file lv_ili9341.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ili9341.h" + +#if LV_USE_ILI9341 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 /* Frame Rate Control (In Normal Mode/Full Colors) */ +#define CMD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle Mode/8 colors) */ +#define CMD_FRMCTR3 0xB3 /* Frame Rate control (In Partial Mode/Full Colors) */ +#define CMD_INVCTR 0xB4 /* Display Inversion Control */ +#define CMD_DFUNCTR 0xB6 /* Display Function Control */ +#define CMD_PWCTR1 0xC0 /* Power Control 1 */ +#define CMD_PWCTR2 0xC1 /* Power Control 2 */ +#define CMD_VMCTR1 0xC5 /* VCOM Control 1 */ +#define CMD_VMCTR2 0xC7 /* VCOM Control 2 */ +#define CMD_PWCTRA 0xCB /* Power Control A */ +#define CMD_PWCTRB 0xCF /* Power Control B */ +#define CMD_GMCTRP1 0xE0 /* Positive Gamma Correction */ +#define CMD_GMCTRN1 0xE1 /* Negative Gamma Correction */ +#define CMD_DTCTRA 0xE8 /* Driver timing control A */ +#define CMD_DTCTRB 0xEA /* Driver timing control B */ +#define CMD_PONSEQ 0xED /* Power On Sequence */ +#define CMD_RDINDEX 0xD9 /* ili9341 */ +#define CMD_IDXRD 0xDD /* ILI9341 only, indexed control register read */ +#define CMD_ENA3G 0xF2 /* Enable 3 Gamma control */ +#define CMD_IFCTR 0xF6 /* Interface Control */ +#define CMD_PRCTR 0xF7 /* Pump ratio control */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX ILI9341 driver */ +static const uint8_t init_cmd_list[] = { + CMD_PWCTRB, 3, 0x00, 0xC1, 0x30, + CMD_PONSEQ, 4, 0x64, 0x03, 0x12, 0x81, + CMD_DTCTRA, 3, 0x85, 0x00, 0x78, + CMD_PWCTRA, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + CMD_PRCTR, 1, 0x20, + CMD_DTCTRB, 2, 0x00, 0x00, + CMD_PWCTR1, 1, 0x23, + CMD_PWCTR2, 1, 0x10, + CMD_VMCTR1, 2, 0x3e, 0x28, + CMD_VMCTR2, 1, 0x86, + CMD_FRMCTR1, 2, 0x00, 0x13, + CMD_DFUNCTR, 2, 0x0A, 0xA2, + CMD_IFCTR, 3, 0x09, 0x30, 0x00, + CMD_ENA3G, 1, 0x00, + LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, + CMD_GMCTRP1, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, + CMD_GMCTRN1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_ili9341_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ILI9341*/ diff --git a/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.h b/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.h new file mode 100644 index 0000000..c93fcba --- /dev/null +++ b/libraries/lvgl/src/drivers/display/ili9341/lv_ili9341.h @@ -0,0 +1,93 @@ +/* + * lv_ili9341.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ILI9341_H +#define LV_ILI9341_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ILI9341 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_ili9341_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_ili9341_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ILI9341 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_ili9341_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_ILI9341*/ + +#endif /* LV_ILI9341_H */ diff --git a/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c b/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c new file mode 100644 index 0000000..46bcf1b --- /dev/null +++ b/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c @@ -0,0 +1,340 @@ +/** + * @file lv_lcd_generic_mipi.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_lcd_generic_mipi.h" + +#if LV_USE_GENERIC_MIPI + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); +static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); +static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags); +static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y); +static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap); +static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot); +static void res_chg_event_cb(lv_event_t * e); +static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + return NULL; + } + + lv_lcd_generic_mipi_driver_t * drv = (lv_lcd_generic_mipi_driver_t *)lv_malloc(sizeof(lv_lcd_generic_mipi_driver_t)); + if(drv == NULL) { + lv_display_delete(disp); + return NULL; + } + + /* init driver struct */ + drv->disp = disp; + drv->send_cmd = send_cmd_cb; + drv->send_color = send_color_cb; + lv_display_set_driver_data(disp, (void *)drv); + + /* init controller */ + init(drv, flags); + + /* register resolution change callback (NOTE: this handles screen rotation as well) */ + lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + + /* register flush callback */ + lv_display_set_flush_cb(disp, flush_cb); + + return disp; +} + +void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + drv->x_gap = x; + drv->y_gap = y; +} + +void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + send_cmd(drv, invert ? LV_LCD_CMD_ENTER_INVERT_MODE : LV_LCD_CMD_EXIT_INVERT_MODE, NULL, 0); +} + +void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_RGB_ORDER); + if(bgr) { + mad |= LV_LCD_BIT_RGB_ORDER__BGR; + } + drv->madctl_reg = mad; + drv->mirror_x = mirror_x; + drv->mirror_y = mirror_y; + drv->swap_xy = swap_xy; + set_rotation(drv, lv_display_get_rotation(disp)); /* update screen */ +} + +void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + send_cmd(drv, LV_LCD_CMD_SET_GAMMA_CURVE, (uint8_t[]) { + gamma, + }, 1); +} + +void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + while(1) { + uint8_t cmd = *cmd_list++; + uint8_t num = *cmd_list++; + if(cmd == LV_LCD_CMD_DELAY_MS) { + if(num == LV_LCD_CMD_EOF) /* end of list */ + break; + else { /* delay in 10 ms units*/ + lv_delay_ms((uint32_t)(num) * 10); + } + } + else { + drv->send_cmd(drv->disp, &cmd, 1, cmd_list, num); + cmd_list += num; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Helper function to call the user-supplied 'send_cmd' function + * @param drv LCD driver object + * @param cmd command byte + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) +{ + uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ + drv->send_cmd(drv->disp, &cmdbuf, 1, param, param_size); +} + +/** + * Helper function to call the user-supplied 'send_color' function + * @param drv LCD driver object + * @param cmd command byte + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) +{ + uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ + drv->send_color(drv->disp, &cmdbuf, 1, param, param_size); +} + +/** + * Initialize LCD driver after a hard reset + * @param drv LCD driver object + */ +static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags) +{ + drv->x_gap = 0; + drv->y_gap = 0; + + /* init color mode and RGB order */ + drv->madctl_reg = flags & LV_LCD_FLAG_BGR ? LV_LCD_BIT_RGB_ORDER__BGR : LV_LCD_BIT_RGB_ORDER__RGB; + drv->colmod_reg = flags & LV_LCD_FLAG_RGB666 ? LV_LCD_PIXEL_FORMAT_RGB666 : LV_LCD_PIXEL_FORMAT_RGB565; + + /* init orientation */ + drv->mirror_x = flags & LV_LCD_FLAG_MIRROR_X; + drv->mirror_y = flags & LV_LCD_FLAG_MIRROR_Y; + drv->swap_xy = false; + /* update madctl_reg */ + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, drv->mirror_x, drv->mirror_y); + + /* enter sleep mode first */ + send_cmd(drv, LV_LCD_CMD_ENTER_SLEEP_MODE, NULL, 0); + lv_delay_ms(10); + + /* perform software reset */ + send_cmd(drv, LV_LCD_CMD_SOFT_RESET, NULL, 0); + lv_delay_ms(200); + + /* LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first */ + send_cmd(drv, LV_LCD_CMD_EXIT_SLEEP_MODE, NULL, 0); + lv_delay_ms(300); + + send_cmd(drv, LV_LCD_CMD_ENTER_NORMAL_MODE, NULL, 0); + + send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { + drv->madctl_reg, + }, 1); + send_cmd(drv, LV_LCD_CMD_SET_PIXEL_FORMAT, (uint8_t[]) { + drv->colmod_reg, + }, 1); + send_cmd(drv, LV_LCD_CMD_SET_DISPLAY_ON, NULL, 0); +} + +/** + * Set readout directions (used for rotating the display) + * @param drv LCD driver object + * @param mirror_x false: normal, true: mirrored + * @param mirror_y false: normal, true: mirrored + */ +static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y) +{ + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_COLUMN_ADDRESS_ORDER | LV_LCD_MASK_PAGE_ADDRESS_ORDER); + if(mirror_x) { + mad |= LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL; + } + if(mirror_y) { + mad |= LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT; + } + drv->madctl_reg = mad; +} + +/** + * Swap horizontal and vertical readout (used for rotating the display) + * @param drv LCD driver object + * @param swap false: normal, true: swapped + */ +static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap) +{ + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_PAGE_COLUMN_ORDER); + if(swap) { + mad |= LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE; + } + drv->madctl_reg = mad; +} + +/** + * Flush display buffer to the LCD + * @param disp display object + * @param hor_res horizontal resolution + * @param area area stored in the buffer + * @param px_map buffer containing pixel data + * @note transfers pixel data to the LCD controller using the callbacks 'send_cmd' and 'send_color', which were + * passed to the 'lv_st7789_create()' function + */ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + + int32_t x_start = area->x1; + int32_t x_end = area->x2 + 1; + int32_t y_start = area->y1; + int32_t y_end = area->y2 + 1; + + LV_ASSERT((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + + x_start += drv->x_gap; + x_end += drv->x_gap; + y_start += drv->y_gap; + y_end += drv->y_gap; + + /* define an area of frame memory where MCU can access */ + send_cmd(drv, LV_LCD_CMD_SET_COLUMN_ADDRESS, (uint8_t[]) { + (x_start >> 8) & 0xFF, + x_start & 0xFF, + ((x_end - 1) >> 8) & 0xFF, + (x_end - 1) & 0xFF, + }, 4); + send_cmd(drv, LV_LCD_CMD_SET_PAGE_ADDRESS, (uint8_t[]) { + (y_start >> 8) & 0xFF, + y_start & 0xFF, + ((y_end - 1) >> 8) & 0xFF, + (y_end - 1) & 0xFF, + }, 4); + /* transfer frame buffer */ + size_t len = (x_end - x_start) * (y_end - y_start) * lv_color_format_get_size(lv_display_get_color_format(disp)); + send_color(drv, LV_LCD_CMD_WRITE_MEMORY_START, px_map, len); +} + +/** + * Set rotation taking into account the current mirror and swap settings + * @param drv LCD driver object + * @param rot rotation + */ +static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot) +{ + switch(rot) { + case LV_DISPLAY_ROTATION_0: + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, drv->mirror_x, drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_90: + set_swap_xy(drv, !drv->swap_xy); + set_mirror(drv, !drv->mirror_x, drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_180: + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, !drv->mirror_x, !drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_270: + set_swap_xy(drv, !drv->swap_xy); + set_mirror(drv, drv->mirror_x, !drv->mirror_y); + break; + } + send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { + drv->madctl_reg + }, 1); +} + +/** + * Handle LV_EVENT_RESOLUTION_CHANGED event (handles both resolution and rotation change) + * @param e LV_EVENT_RESOLUTION_CHANGED event + */ +static void res_chg_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_current_target(e); + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + + uint16_t hor_res = lv_display_get_horizontal_resolution(disp); + uint16_t ver_res = lv_display_get_vertical_resolution(disp); + lv_display_rotation_t rot = lv_display_get_rotation(disp); + + /* TODO: implement resolution change */ + LV_UNUSED(hor_res); + LV_UNUSED(ver_res); + + /* handle rotation */ + set_rotation(drv, rot); +} + +static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp) +{ + return (lv_lcd_generic_mipi_driver_t *)lv_display_get_driver_data(disp); +} + +#endif /*LV_USE_GENERIC_MIPI*/ diff --git a/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h b/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h new file mode 100644 index 0000000..ae5c0ef --- /dev/null +++ b/libraries/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h @@ -0,0 +1,241 @@ +/* + * lv_lcd_generic_mipi.h + * + * Generic driver for controllers adhering to the MIPI DBI/DCS specification + * + * Works with: + * + * ST7735 + * ST7789 + * ST7796 + * ILI9341 + * ILI9488 (NOTE: in SPI mode ILI9488 only supports RGB666 mode, which is currently not supported) + * + * any probably many more + * + */ + +#ifndef LV_LCD_GENERIC_MIPI_H +#define LV_LCD_GENERIC_MIPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_GENERIC_MIPI + +/********************* + * DEFINES + *********************/ + +/* MIPI DCS (Display Command Set) v1.02.00 User Command Set */ +#define LV_LCD_CMD_NOP 0x00 /* No Operation */ +#define LV_LCD_CMD_SOFT_RESET 0x01 /* Software Reset */ +#define LV_LCD_CMD_GET_POWER_MODE 0x0A /* Get the current power mode */ +#define LV_LCD_CMD_GET_ADDRESS_MODE 0x0B /* Get the data order for transfers from the Host to the display module and from the frame memory to the display device */ +#define LV_LCD_CMD_GET_PIXEL_FORMAT 0x0C /* Get the current pixel format */ +#define LV_LCD_CMD_GET_DISPLAY_MODE 0x0D /* Get the current display mode from the peripheral */ +#define LV_LCD_CMD_GET_SIGNAL_MODE 0x0E /* Get display module signaling mode */ +#define LV_LCD_CMD_GET_DIAGNOSTIC_RESULT 0x0F /* Get Peripheral Self-Diagnostic Result */ +#define LV_LCD_CMD_ENTER_SLEEP_MODE 0x10 /* Power for the display panel is off */ +#define LV_LCD_CMD_EXIT_SLEEP_MODE 0x11 /* Power for the display panel is on */ +#define LV_LCD_CMD_ENTER_PARTIAL_MODE 0x12 /* Part of the display area is used for image display */ +#define LV_LCD_CMD_ENTER_NORMAL_MODE 0x13 /* The whole display area is used for image display */ +#define LV_LCD_CMD_EXIT_INVERT_MODE 0x20 /* Displayed image colors are not inverted */ +#define LV_LCD_CMD_ENTER_INVERT_MODE 0x21 /* Displayed image colors are inverted */ +#define LV_LCD_CMD_SET_GAMMA_CURVE 0x26 /* Selects the gamma curve used by the display device */ +#define LV_LCD_CMD_SET_DISPLAY_OFF 0x28 /* Blanks the display device */ +#define LV_LCD_CMD_SET_DISPLAY_ON 0x29 /* Show the image on the display device */ +#define LV_LCD_CMD_SET_COLUMN_ADDRESS 0x2A /* Set the column extent */ +#define LV_LCD_CMD_SET_PAGE_ADDRESS 0x2B /* Set the page extent */ +#define LV_LCD_CMD_WRITE_MEMORY_START 0x2C /* Transfer image data from the Host Processor to the peripheral starting at the location provided by set_column_address and set_page_address */ +#define LV_LCD_CMD_READ_MEMORY_START 0x2E /* Transfer image data from the peripheral to the Host Processor interface starting at the location provided by set_column_address and set_page_address */ +#define LV_LCD_CMD_SET_PARTIAL_ROWS 0x30 /* Defines the number of rows in the partial display area on the display device */ +#define LV_LCD_CMD_SET_PARTIAL_COLUMNS 0x31 /* Defines the number of columns in the partial display area on the display device */ +#define LV_LCD_CMD_SET_SCROLL_AREA 0x33 /* Defines the vertical scrolling and fixed area on display device */ +#define LV_LCD_CMD_SET_TEAR_OFF 0x34 /* Synchronization information is not sent from the display module to the host processor */ +#define LV_LCD_CMD_SET_TEAR_ON 0x35 /* Synchronization information is sent from the display module to the host processor at the start of VFP */ +#define LV_LCD_CMD_SET_ADDRESS_MODE 0x36 /* Set the data order for transfers from the Host to the display module and from the frame memory to the display device */ +#define LV_LCD_CMD_SET_SCROLL_START 0x37 /* Defines the vertical scrolling starting point */ +#define LV_LCD_CMD_EXIT_IDLE_MODE 0x38 /* Full color depth is used on the display panel */ +#define LV_LCD_CMD_ENTER_IDLE_MODE 0x39 /* Reduced color depth is used on the display panel */ +#define LV_LCD_CMD_SET_PIXEL_FORMAT 0x3A /* Defines how many bits per pixel are used in the interface */ +#define LV_LCD_CMD_WRITE_MEMORY_CONTINUE 0x3C /* Transfer image information from the Host Processor interface to the peripheral from the last written location */ +#define LV_LCD_CMD_READ_MEMORY_CONTINUE 0x3E /* Read image data from the peripheral continuing after the last read_memory_continue or read_memory_start */ +#define LV_LCD_CMD_SET_TEAR_SCANLINE 0x44 /* Synchronization information is sent from the display module to the host processor when the display device refresh reaches the provided scanline */ +#define LV_LCD_CMD_GET_SCANLINE 0x45 /* Get the current scanline */ +#define LV_LCD_CMD_READ_DDB_CONTINUE 0xA8 /* Continue reading the DDB from the last read location */ +#define LV_LCD_CMD_READ_DDB_START 0xA1 /* Read the DDB from the provided location */ + +/* address mode flag masks */ +#define LV_LCD_MASK_FLIP_VERTICAL (1 << 0) /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ +#define LV_LCD_MASK_FLIP_HORIZONTAL (1 << 1) /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ +#define LV_LCD_MASK_DATA_LATCH_DATA_ORDER (1 << 2) /* Display Data Latch Order */ +#define LV_LCD_MASK_RGB_ORDER (1 << 3) /* RGB/BGR Order */ +#define LV_LCD_MASK_LINE_ADDRESS_ORDER (1 << 4) /* Line Address Order */ +#define LV_LCD_MASK_PAGE_COLUMN_ORDER (1 << 5) /* Page/Column Order */ +#define LV_LCD_MASK_COLUMN_ADDRESS_ORDER (1 << 6) /* Column Address Order */ +#define LV_LCD_MASK_PAGE_ADDRESS_ORDER (1 << 7) /* Page Address Order */ + +#define LV_LCD_BIT_FLIP_VERTICAL__NOT_FLIPPED 0 +#define LV_LCD_BIT_FLIP_VERTICAL__FLIPPED LV_LCD_MASK_FLIP_VERTICAL /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ +#define LV_LCD_BIT_FLIP_HORIZONTAL__NOT_FLIPPED 0 +#define LV_LCD_BIT_FLIP_HORIZONTAL__FLIPPED LV_LCD_MASK_FLIP_HORIZONTAL /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ +#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__LTOR 0 /* Display Data Latch Order: LCD Refresh Left to Right */ +#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__RTOL LV_LCD_MASK_DATA_LATCH_DATA_ORDER /* Display Data Latch Order: LCD Refresh Right to Left */ +#define LV_LCD_BIT_RGB_ORDER__RGB 0 /* RGB/BGR Order: RGB */ +#define LV_LCD_BIT_RGB_ORDER__BGR LV_LCD_MASK_RGB_ORDER /* RGB/BGR Order: BGR */ +#define LV_LCD_BIT_LINE_ADDRESS_ORDER__TTOB 0 /* Line Address Order: LCD Refresh Top to Bottom */ +#define LV_LCD_BIT_LINE_ADDRESS_ORDER__BTOT LV_LCD_MASK_LINE_ADDRESS_ORDER /* Line Address Order: LCD Refresh Bottom to Top */ +#define LV_LCD_BIT_PAGE_COLUMN_ORDER__NORMAL 0 /* Page/Column Order: Normal Mode */ +#define LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE LV_LCD_MASK_PAGE_COLUMN_ORDER /* Page/Column Order: Reverse Mode */ +#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__LTOR 0 /* Column Address Order: Left to Right */ +#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL LV_LCD_MASK_COLUMN_ADDRESS_ORDER /* Column Address Order: Right to Left */ +#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__TTOB 0 /* Page Address Order: Top to Bottom */ +#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT LV_LCD_MASK_PAGE_ADDRESS_ORDER /* Page Address Order: Bottom to Top */ + +/* predefined gamma curves */ +#define LV_LCD_GAMMA_2_2 0x01 /* 2.2 */ +#define LV_LCD_GAMMA_1_8 0x02 /* 1.8 */ +#define LV_LCD_GAMMA_2_5 0x04 /* 2.5 */ +#define LV_LCD_GAMMA_1_0 0x08 /* 1.0 */ + +/* common pixel formats */ +#define LV_LCD_PIXEL_FORMAT_RGB565 0x55 /* bus: 16 bits, pixel: 16 bits */ +#define LV_LCD_PIXEL_FORMAT_RGB666 0x66 /* bus: 18 bits, pixel: 18 bits */ + +/* flags for lv_lcd_xxx_create() */ +#define LV_LCD_FLAG_NONE 0x00000000UL +#define LV_LCD_FLAG_MIRROR_X 0x00000001UL +#define LV_LCD_FLAG_MIRROR_Y 0x00000002UL +#define LV_LCD_FLAG_BGR 0x00000008UL +#define LV_LCD_FLAG_RGB666 0x00000010UL + +/* command list */ +#define LV_LCD_CMD_DELAY_MS 0xff +#define LV_LCD_CMD_EOF 0xff + +/********************** + * TYPEDEFS + **********************/ + +/** + * Configuration flags for lv_lcd_xxx_create() + * + */ +typedef uint32_t lv_lcd_flag_t; + +/** + * Prototype of a platform-dependent callback to transfer commands and data to the LCD controller. + * @param disp display object + * @param cmd command buffer (can handle 16 bit commands as well) + * @param cmd_size number of bytes of the command + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +typedef void (*lv_lcd_send_cmd_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, const uint8_t * param, + size_t param_size); + +/** + * Prototype of a platform-dependent callback to transfer pixel data to the LCD controller. + * @param disp display object + * @param cmd command buffer (can handle 16 bit commands as well) + * @param cmd_size number of bytes of the command + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +typedef void (*lv_lcd_send_color_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, uint8_t * param, + size_t param_size); + +/** + * Generic MIPI compatible LCD driver + */ +typedef struct { + lv_display_t * disp; /* the associated LVGL display object */ + lv_lcd_send_cmd_cb_t send_cmd; /* platform-specific implementation to send a command to the LCD controller */ + lv_lcd_send_color_cb_t send_color; /* platform-specific implementation to send pixel data to the LCD controller */ + uint16_t x_gap; /* x offset of the (0,0) pixel in VRAM */ + uint16_t y_gap; /* y offset of the (0,0) pixel in VRAM */ + uint8_t madctl_reg; /* current value of MADCTL register */ + uint8_t colmod_reg; /* current value of COLMOD register */ + bool mirror_x; + bool mirror_y; + bool swap_xy; +} lv_lcd_generic_mipi_driver_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a MIPI DCS compatible LCD display + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert); + +/** + * Set address mode + * @param disp display object + * @param mirror_x horizontal mirror (false: normal, true: mirrored) + * @param mirror_y vertical mirror (false: normal, true: mirrored) + * @param swap_xy swap axes (false: normal, true: swap) + * @param bgr RGB/BGR order (false: RGB, true: BGR) + */ +void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_GENERIC_MIPI*/ + +#endif /* LV_LCD_GENERIC_MIPI_H */ diff --git a/libraries/lvgl/src/drivers/display/st7735/lv_st7735.c b/libraries/lvgl/src/drivers/display/st7735/lv_st7735.c new file mode 100644 index 0000000..6b5e62d --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7735/lv_st7735.c @@ -0,0 +1,113 @@ +/** + * @file lv_st7735.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7735.h" + +#if LV_USE_ST7735 + +/********************* + * DEFINES + *********************/ + +#define CMD_GAMSET 0x26 + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DISSET5 0xB6 + +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR1 0xC5 +#define CMD_VMOFCTR 0xC7 + +#define CMD_NVFCTR1 0xD9 + +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 + +#define CMD_PWCTR6 0xFC + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands for buydisplay.com ER-TFTM018-3 */ +static const uint8_t init_cmd_list[] = { + 0xB1, 3, 0x05, 0x3C, 0x3C, + 0xB2, 3, 0x05, 0x3C, 0x3C, + 0xB3, 6, 0x05, 0x3C, 0x3C, 0x05, 0x3C, 0x3C, + 0xB4, 1, 0x03, + 0xC0, 3, 0x28, 0x08, 0x04, + 0xC1, 1, 0XC0, + 0xC2, 2, 0x0D, 0x00, + 0xC3, 2, 0x8D, 0x2A, + 0xC4, 2, 0x8D, 0xEE, + 0xC5, 1, 0x10, + 0xE0, 16, 0x04, 0x22, 0x07, 0x0A, 0x2E, 0x30, 0x25, 0x2A, 0x28, 0x26, 0x2E, 0x3A, 0x00, 0x01, 0x03, 0x13, + 0xE1, 16, 0x04, 0x16, 0x06, 0x0D, 0x2D, 0x26, 0x23, 0x27, 0x27, 0x25, 0x2D, 0x3B, 0x00, 0x01, 0x04, 0x13, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7735_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7735*/ diff --git a/libraries/lvgl/src/drivers/display/st7735/lv_st7735.h b/libraries/lvgl/src/drivers/display/st7735/lv_st7735.h new file mode 100644 index 0000000..062cfe3 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7735/lv_st7735.h @@ -0,0 +1,93 @@ +/* + * lv_st7735.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7735_H +#define LV_ST7735_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7735 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7735_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7735_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7735 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7735_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ST7735*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_ST7735_H */ diff --git a/libraries/lvgl/src/drivers/display/st7789/lv_st7789.c b/libraries/lvgl/src/drivers/display/st7789/lv_st7789.c new file mode 100644 index 0000000..76d08bf --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7789/lv_st7789.c @@ -0,0 +1,116 @@ +/** + * @file lv_st7789.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7789.h" + +#if LV_USE_ST7789 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DFUNCTR 0xB6 +#define CMD_ETMOD 0xB7 +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR 0xC5 +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 +#define CMD_DOCA 0xE8 +#define CMD_CSCON 0xF0 + +#define CMD_RAMCTRL 0xB0 +#define CMD_PORCTRL 0xB2 /* Porch control */ +#define CMD_GCTRL 0xB7 /* Gate control */ +#define CMD_VCOMS 0xBB /* VCOMS setting */ +#define CMD_LCMCTRL 0xC0 /* LCM control */ +#define CMD_VDVVRHEN 0xC2 /* VDV and VRH command enable */ +#define CMD_VRHS 0xC3 /* VRH set */ +#define CMD_VDVSET 0xC4 /* VDV setting */ +#define CMD_FRCTR2 0xC6 /* FR Control 2 */ +#define CMD_PWCTRL1 0xD0 /* Power control 1 */ +#define CMD_PVGAMCTRL 0xE0 /* Positive Gamma Correction */ +#define CMD_NVGAMCTRL 0xE1 /* Negative Gamma Correction */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX ST7789 driver */ +static const uint8_t init_cmd_list[] = { + CMD_GCTRL, 1, 0x44, /* GCTRL -- panel dependent */ + CMD_VCOMS, 1, 0x24, /* VCOMS -- panel dependent */ + CMD_VRHS, 1, 0x13, /* VRHS - panel dependent */ + CMD_PWCTRL1, 2, 0xa4, 0xa1, + CMD_RAMCTRL, 2, 0x00, 0xC0, /* controls mapping of RGB565 to RGB666 */ + CMD_PVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0e, 0x12, 0x14, 0x17, + CMD_NVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x31, 0x54, 0x47, 0x0e, 0x1c, 0x17, 0x1b, 0x1e, + LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7789_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7789*/ diff --git a/libraries/lvgl/src/drivers/display/st7789/lv_st7789.h b/libraries/lvgl/src/drivers/display/st7789/lv_st7789.h new file mode 100644 index 0000000..5cd3019 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7789/lv_st7789.h @@ -0,0 +1,93 @@ +/* + * lv_st7789.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7789_H +#define LV_ST7789_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7789 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7789_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7789_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7789 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7789_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_ST7789*/ + +#endif //LV_ST7789_H diff --git a/libraries/lvgl/src/drivers/display/st7796/lv_st7796.c b/libraries/lvgl/src/drivers/display/st7796/lv_st7796.c new file mode 100644 index 0000000..985b39f --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7796/lv_st7796.c @@ -0,0 +1,121 @@ +/** + * @file lv_st7796.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7796.h" + +#if LV_USE_ST7796 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DFUNCTR 0xB6 +#define CMD_ETMOD 0xB7 +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR 0xC5 +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 +#define CMD_DOCA 0xE8 +#define CMD_CSCON 0xF0 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX */ +static const uint8_t init_cmd_list[] = { + CMD_CSCON, 1, 0xC3, /* Enable extension command 2 partI */ + CMD_CSCON, 1, 0x96, /* Enable extension command 2 partII */ + CMD_INVCTR, 1, 0x01, /* 1-dot inversion */ + CMD_DFUNCTR, 3, 0x80, /* Display Function Control: Bypass */ + 0x22, /* Source Output Scan from S1 to S960, Gate Output scan from G1 to G480, scan cycle = 2 */ + 0x3B, /* LCD Drive Line = 8 * (59 + 1) */ + CMD_DOCA, 8, 0x40, 0x8A, 0x00, 0x00, + 0x29, /* Source equalizing period time = 22.5 us */ + 0x19, /* Timing for "Gate start" = 25 (Tclk) */ + 0xA5, /* Timing for "Gate End" = 37 (Tclk), Gate driver EQ function ON */ + 0x33, + CMD_PWCTR2, 1, 0x06, /* Power control2: VAP(GVDD) = 3.85 + (vcom + vcom offset), VAN(GVCL) = -3.85 + (vcom + vcom offset) */ + CMD_PWCTR3, 1, 0xA7, /* Power control 3: Source driving current level = low, Gamma driving current level = High */ + CMD_VMCTR, 1, 0x18, /* VCOM Control: VCOM = 0.9 */ + LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ + CMD_GMCTRP1, 14, /* Gamma */ + 0xF0, 0x09, 0x0B, 0x06, 0x04, 0x15, 0x2F, + 0x54, 0x42, 0x3C, 0x17, 0x14, 0x18, 0x1B, + CMD_GMCTRN1, 14, + 0xE0, 0x09, 0x0B, 0x06, 0x04, 0x03, 0x2B, + 0x43, 0x42, 0x3B, 0x16, 0x14, 0x17, 0x1B, + LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ + CMD_CSCON, 1, 0x3C, /* Disable extension command 2 partI */ + CMD_CSCON, 1, 0x69, /* Disable extension command 2 partII */ + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7796_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + /* NOTE: the generic method is not supported on ST7796, TODO: implement gamma tables */ + LV_UNUSED(disp); + LV_UNUSED(gamma); +} + +void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7796*/ diff --git a/libraries/lvgl/src/drivers/display/st7796/lv_st7796.h b/libraries/lvgl/src/drivers/display/st7796/lv_st7796.h new file mode 100644 index 0000000..c34dfe6 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/st7796/lv_st7796.h @@ -0,0 +1,93 @@ +/* + * lv_st7796.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7796_H +#define LV_ST7796_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7796 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7796_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7796_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7796 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7796_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_ST7796*/ + +#endif /* LV_ST7796_H */ diff --git a/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp b/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp new file mode 100644 index 0000000..64e3ee6 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp @@ -0,0 +1,83 @@ +/** + * @file lv_tft_espi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tft_espi.h" +#if LV_USE_TFT_ESPI + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + TFT_eSPI * tft; +} lv_tft_espi_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes) +{ + lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_malloc_zeroed(sizeof(lv_tft_espi_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + + dsc->tft = new TFT_eSPI(hor_res, ver_res); + dsc->tft->begin(); /* TFT init */ + dsc->tft->setRotation(3); /* Landscape orientation, flipped */ + lv_display_set_driver_data(disp, (void *)dsc); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_buffers(disp, (void *)buf, NULL, buf_size_bytes, LV_DISPLAY_RENDER_MODE_PARTIAL); + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_display_get_driver_data(disp); + + uint32_t w = (area->x2 - area->x1 + 1); + uint32_t h = (area->y2 - area->y1 + 1); + + dsc->tft->startWrite(); + dsc->tft->setAddrWindow(area->x1, area->y1, w, h); + dsc->tft->pushColors((uint16_t *)px_map, w * h, true); + dsc->tft->endWrite(); + + lv_display_flush_ready(disp); + +} + +#endif /*LV_USE_TFT_ESPI*/ diff --git a/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h b/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h new file mode 100644 index 0000000..1010575 --- /dev/null +++ b/libraries/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h @@ -0,0 +1,43 @@ +/** + * @file lv_linux_fb_dev_h + * + */ + +#ifndef LV_TFT_ESPI_H +#define LV_TFT_ESPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../display/lv_display.h" + +#if LV_USE_TFT_ESPI + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TFT_ESPI */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_TFT_ESPI_H */ diff --git a/libraries/lvgl/src/drivers/evdev/lv_evdev.c b/libraries/lvgl/src/drivers/evdev/lv_evdev.c new file mode 100644 index 0000000..010ad42 --- /dev/null +++ b/libraries/lvgl/src/drivers/evdev/lv_evdev.c @@ -0,0 +1,223 @@ +/** + * @file lv_evdev.c + * + */ + +/********************** + * INCLUDES + **********************/ +#include "lv_evdev.h" +#if LV_USE_EVDEV + +#include +#include +#include +#include /*To detect BSD*/ +#ifdef BSD + #include +#else + #include +#endif /*BSD*/ +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../../display/lv_display.h" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /*Device*/ + int fd; + /*Config*/ + bool swap_axes; + int min_x; + int min_y; + int max_x; + int max_y; + /*State*/ + int root_x; + int root_y; + int key; + lv_indev_state_t state; +} lv_evdev_t; + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int _evdev_process_key(uint16_t code) +{ + switch(code) { + case KEY_UP: + return LV_KEY_UP; + case KEY_DOWN: + return LV_KEY_DOWN; + case KEY_RIGHT: + return LV_KEY_RIGHT; + case KEY_LEFT: + return LV_KEY_LEFT; + case KEY_ESC: + return LV_KEY_ESC; + case KEY_DELETE: + return LV_KEY_DEL; + case KEY_BACKSPACE: + return LV_KEY_BACKSPACE; + case KEY_ENTER: + return LV_KEY_ENTER; + case KEY_NEXT: + case KEY_TAB: + return LV_KEY_NEXT; + case KEY_PREVIOUS: + return LV_KEY_PREV; + case KEY_HOME: + return LV_KEY_HOME; + case KEY_END: + return LV_KEY_END; + default: + return 0; + } +} + +static int _evdev_calibrate(int v, int in_min, int in_max, int out_min, int out_max) +{ + if(in_min != in_max) v = (v - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + return LV_CLAMP(out_min, v, out_max); +} + +static lv_point_t _evdev_process_pointer(lv_indev_t * indev, int x, int y) +{ + lv_display_t * disp = lv_indev_get_display(indev); + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + int swapped_x = dsc->swap_axes ? y : x; + int swapped_y = dsc->swap_axes ? x : y; + + int offset_x = lv_display_get_offset_x(disp); + int offset_y = lv_display_get_offset_y(disp); + int width = lv_display_get_horizontal_resolution(disp); + int height = lv_display_get_vertical_resolution(disp); + + lv_point_t p; + p.x = _evdev_calibrate(swapped_x, dsc->min_x, dsc->max_x, offset_x, offset_x + width - 1); + p.y = _evdev_calibrate(swapped_y, dsc->min_y, dsc->max_y, offset_y, offset_y + height - 1); + return p; +} + +static void _evdev_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + /*Update dsc with buffered events*/ + struct input_event in = { 0 }; + while(read(dsc->fd, &in, sizeof(in)) > 0) { + if(in.type == EV_REL) { + if(in.code == REL_X) dsc->root_x += in.value; + else if(in.code == REL_Y) dsc->root_y += in.value; + } + else if(in.type == EV_ABS) { + if(in.code == ABS_X || in.code == ABS_MT_POSITION_X) dsc->root_x = in.value; + else if(in.code == ABS_Y || in.code == ABS_MT_POSITION_Y) dsc->root_y = in.value; + else if(in.code == ABS_MT_TRACKING_ID) { + if(in.value == -1) dsc->state = LV_INDEV_STATE_RELEASED; + else if(in.value == 0) dsc->state = LV_INDEV_STATE_PRESSED; + } + } + else if(in.type == EV_KEY) { + if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) { + if(in.value == 0) dsc->state = LV_INDEV_STATE_RELEASED; + else if(in.value == 1) dsc->state = LV_INDEV_STATE_PRESSED; + } + else { + dsc->key = _evdev_process_key(in.code); + if(dsc->key) { + dsc->state = in.value ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->continue_reading = true; /*Keep following events in buffer for now*/ + break; + } + } + } + } + + /*Process and store in data*/ + switch(lv_indev_get_type(indev)) { + case LV_INDEV_TYPE_KEYPAD: + data->state = dsc->state; + data->key = dsc->key; + break; + case LV_INDEV_TYPE_POINTER: + data->state = dsc->state; + data->point = _evdev_process_pointer(indev, dsc->root_x, dsc->root_y); + break; + default: + break; + } +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path) +{ + lv_evdev_t * dsc = lv_malloc_zeroed(sizeof(lv_evdev_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + dsc->fd = open(dev_path, O_RDONLY | O_NOCTTY | O_CLOEXEC); + if(dsc->fd < 0) { + LV_LOG_ERROR("open failed: %s", strerror(errno)); + goto err_after_malloc; + } + + if(fcntl(dsc->fd, F_SETFL, O_NONBLOCK) < 0) { + LV_LOG_ERROR("fcntl failed: %s", strerror(errno)); + goto err_after_open; + } + + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) goto err_after_open; + lv_indev_set_type(indev, indev_type); + lv_indev_set_read_cb(indev, _evdev_read); + lv_indev_set_driver_data(indev, dsc); + return indev; + +err_after_open: + close(dsc->fd); +err_after_malloc: + lv_free(dsc); + return NULL; +} + +void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + dsc->swap_axes = swap_axes; +} + +void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + dsc->min_x = min_x; + dsc->min_y = min_y; + dsc->max_x = max_x; + dsc->max_y = max_y; +} + +void lv_evdev_delete(lv_indev_t * indev) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + close(dsc->fd); + lv_free(dsc); + + lv_indev_delete(indev); +} + +#endif /*LV_USE_EVDEV*/ diff --git a/libraries/lvgl/src/drivers/evdev/lv_evdev.h b/libraries/lvgl/src/drivers/evdev/lv_evdev.h new file mode 100644 index 0000000..95ab154 --- /dev/null +++ b/libraries/lvgl/src/drivers/evdev/lv_evdev.h @@ -0,0 +1,64 @@ +/** + * @file lv_evdev.h + * + */ + +#ifndef LV_EVDEV_H +#define LV_EVDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_EVDEV + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create evdev input device. + * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD + * @param dev_path device path, e.g., /dev/input/event0 + * @return pointer to input device or NULL if opening failed + */ +lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path); + +/** + * Set whether coordinates of pointer device should be swapped. Defaults to + * false. + * @param indev evdev input device + * @param swap_axes whether to swap x and y axes + */ +void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes); + +/** + * Configure a coordinate transformation for pointer devices. Applied after + * axis swap, if any. Defaults to apply no transformation. + * @param indev evdev input device + * @param min_x pointer coordinate mapped to min x of display + * @param min_y pointer coordinate mapped to min y of display + * @param max_x pointer coordinate mapped to max x of display + * @param max_y pointer coordinate mapped to max y of display + */ +void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y); + +/** + * Remove evdev input device. + * @param indev evdev input device to close and free + */ +void lv_evdev_delete(lv_indev_t * indev); + +#endif /*LV_USE_EVDEV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVDEV_H*/ diff --git a/libraries/lvgl/src/drivers/libinput/lv_libinput.c b/libraries/lvgl/src/drivers/libinput/lv_libinput.c new file mode 100644 index 0000000..f207fa4 --- /dev/null +++ b/libraries/lvgl/src/drivers/libinput/lv_libinput.c @@ -0,0 +1,670 @@ +/** + * @file lv_libinput.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_libinput.h" + +#if LV_USE_LIBINPUT + +#include "../../display/lv_display_private.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LV_LIBINPUT_BSD + #include +#else + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct lv_libinput_device { + lv_libinput_capability capabilities; + char * path; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool _rescan_devices(void); +static bool _add_scanned_device(char * path, lv_libinput_capability capabilities); +static void _reset_scanned_devices(void); + +static void * _poll_thread(void * data); + +lv_libinput_event_t * _get_event(lv_libinput_t * state); +bool _event_pending(lv_libinput_t * state); +lv_libinput_event_t * _create_event(lv_libinput_t * state); + +static void _read(lv_indev_t * indev, lv_indev_data_t * data); +static void _read_pointer(lv_libinput_t * state, struct libinput_event * event); +static void _read_keypad(lv_libinput_t * state, struct libinput_event * event); + +static int _open_restricted(const char * path, int flags, void * user_data); +static void _close_restricted(int fd, void * user_data); + +static void _delete(lv_libinput_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct lv_libinput_device * devices = NULL; +static size_t num_devices = 0; + +static const int timeout = 100; // ms +static const nfds_t nfds = 1; + +static const struct libinput_interface interface = { + .open_restricted = _open_restricted, + .close_restricted = _close_restricted, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device) +{ + lv_libinput_capability capability = LV_LIBINPUT_CAPABILITY_NONE; + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD) + && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) { + capability |= LV_LIBINPUT_CAPABILITY_KEYBOARD; + } + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { + capability |= LV_LIBINPUT_CAPABILITY_POINTER; + } + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { + capability |= LV_LIBINPUT_CAPABILITY_TOUCH; + } + return capability; +} + +char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan) +{ + char * path = NULL; + lv_libinput_find_devs(capabilities, &path, 1, force_rescan); + return path; +} + +size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan) +{ + if((!devices || force_rescan) && !_rescan_devices()) { + return 0; + } + + size_t num_found = 0; + + for(size_t i = 0; i < num_devices && num_found < count; ++i) { + if(devices[i].capabilities & capabilities) { + found[num_found] = devices[i].path; + num_found++; + } + } + + return num_found; +} + +lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path) +{ + lv_libinput_t * dsc = lv_malloc_zeroed(sizeof(lv_libinput_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + dsc->libinput_context = libinput_path_create_context(&interface, NULL); + if(!dsc->libinput_context) { + LV_LOG_ERROR("libinput_path_create_context failed: %s", strerror(errno)); + _delete(dsc); + return NULL; + } + + dsc->libinput_device = libinput_path_add_device(dsc->libinput_context, dev_path); + if(!dsc->libinput_device) { + _delete(dsc); + return NULL; + } + + dsc->libinput_device = libinput_device_ref(dsc->libinput_device); + if(!dsc->libinput_device) { + _delete(dsc); + return NULL; + } + + dsc->fd = libinput_get_fd(dsc->libinput_context); + + /* Prepare poll */ + dsc->fds[0].fd = dsc->fd; + dsc->fds[0].events = POLLIN; + dsc->fds[0].revents = 0; + +#if LV_LIBINPUT_XKB + struct xkb_rule_names names = LV_LIBINPUT_XKB_KEY_MAP; + lv_xkb_init(&(dsc->xkb), names); +#endif /* LV_LIBINPUT_XKB */ + + /* Create indev */ + lv_indev_t * indev = lv_indev_create(); + if(!indev) { + _delete(dsc); + return NULL; + } + lv_indev_set_type(indev, indev_type); + lv_indev_set_read_cb(indev, _read); + lv_indev_set_driver_data(indev, dsc); + + /* Set up thread & lock */ + pthread_mutex_init(&dsc->event_lock, NULL); + pthread_create(&dsc->worker_thread, NULL, _poll_thread, dsc); + + return indev; +} + +void lv_libinput_delete(lv_indev_t * indev) +{ + _delete(lv_indev_get_driver_data(indev)); + lv_indev_delete(indev); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * rescan all attached evdev devices and store capable ones into the static devices array for quick later filtering + * @return true if the operation succeeded + */ +static bool _rescan_devices(void) +{ + _reset_scanned_devices(); + + DIR * dir; + struct dirent * ent; + if(!(dir = opendir("/dev/input"))) { + perror("unable to open directory /dev/input"); + return false; + } + + struct libinput * context = libinput_path_create_context(&interface, NULL); + + while((ent = readdir(dir))) { + if(strncmp(ent->d_name, "event", 5) != 0) { + continue; + } + + /* 11 characters for /dev/input/ + length of name + 1 NUL terminator */ + char * path = malloc((11 + strlen(ent->d_name) + 1) * sizeof(char)); + if(!path) { + perror("could not allocate memory for device node path"); + libinput_unref(context); + _reset_scanned_devices(); + return false; + } + strcpy(path, "/dev/input/"); + strcat(path, ent->d_name); + + struct libinput_device * device = libinput_path_add_device(context, path); + if(!device) { + perror("unable to add device to libinput context"); + free(path); + continue; + } + + /* The device pointer is guaranteed to be valid until the next libinput_dispatch. Since we're not dispatching events + * as part of this function, we don't have to increase its reference count to keep it alive. + * https://wayland.freedesktop.org/libinput/doc/latest/api/group__base.html#gaa797496f0150b482a4e01376bd33a47b */ + + lv_libinput_capability capabilities = lv_libinput_query_capability(device); + + libinput_path_remove_device(device); + + if(capabilities == LV_LIBINPUT_CAPABILITY_NONE) { + free(path); + continue; + } + + if(!_add_scanned_device(path, capabilities)) { + free(path); + libinput_unref(context); + _reset_scanned_devices(); + return false; + } + } + + libinput_unref(context); + return true; +} + +/** + * add a new scanned device to the static devices array, growing its size when necessary + * @param path device file path + * @param capabilities device input capabilities + * @return true if the operation succeeded + */ +static bool _add_scanned_device(char * path, lv_libinput_capability capabilities) +{ + /* Double array size every 2^n elements */ + if((num_devices & (num_devices + 1)) == 0) { + struct lv_libinput_device * tmp = realloc(devices, (2 * num_devices + 1) * sizeof(struct lv_libinput_device)); + if(!tmp) { + perror("could not reallocate memory for devices array"); + return false; + } + devices = tmp; + } + + devices[num_devices].path = path; + devices[num_devices].capabilities = capabilities; + num_devices++; + + return true; +} + +/** + * reset the array of scanned devices and free any dynamically allocated memory + */ +static void _reset_scanned_devices(void) +{ + if(!devices) { + return; + } + + for(size_t i = 0; i < num_devices; ++i) { + free(devices[i].path); + } + free(devices); + + devices = NULL; + num_devices = 0; +} + +static void * _poll_thread(void * data) +{ + lv_libinput_t * dsc = (lv_libinput_t *)data; + struct libinput_event * event; + int rc = 0; + + LV_LOG_INFO("libinput: poll worker started"); + + while(true) { + rc = poll(dsc->fds, nfds, timeout); + switch(rc) { + case -1: + perror(NULL); + __attribute__((fallthrough)); + case 0: + if(dsc->deinit) { + dsc->deinit = false; /* Signal that we're done */ + return NULL; + } + continue; + default: + break; + } + libinput_dispatch(dsc->libinput_context); + pthread_mutex_lock(&dsc->event_lock); + while((event = libinput_get_event(dsc->libinput_context)) != NULL) { + _read_pointer(dsc, event); + _read_keypad(dsc, event); + libinput_event_destroy(event); + } + pthread_mutex_unlock(&dsc->event_lock); + LV_LOG_INFO("libinput: event read"); + } + + return NULL; +} + +lv_libinput_event_t * _get_event(lv_libinput_t * dsc) +{ + if(dsc->start == dsc->end) { + return NULL; + } + + lv_libinput_event_t * evt = &dsc->points[dsc->start]; + + if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) + dsc->start = 0; + + return evt; +} + +bool _event_pending(lv_libinput_t * dsc) +{ + return dsc->start != dsc->end; +} + +lv_libinput_event_t * _create_event(lv_libinput_t * dsc) +{ + lv_libinput_event_t * evt = &dsc->points[dsc->end]; + + if(++dsc->end == LV_LIBINPUT_MAX_EVENTS) + dsc->end = 0; + + /* We have overflowed the buffer, start overwriting + * old events. + */ + if(dsc->end == dsc->start) { + LV_LOG_INFO("libinput: overflowed event buffer!"); + if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) + dsc->start = 0; + } + + memset(evt, 0, sizeof(lv_libinput_event_t)); + + return evt; +} + +static void _read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_libinput_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + pthread_mutex_lock(&dsc->event_lock); + + lv_libinput_event_t * evt = _get_event(dsc); + + if(!evt) + evt = &dsc->last_event; /* indev expects us to report the most recent state */ + + data->point = evt->point; + data->state = evt->pressed; + data->key = evt->key_val; + data->continue_reading = _event_pending(dsc); + + dsc->last_event = *evt; /* Remember the last event for the next call */ + + pthread_mutex_unlock(&dsc->event_lock); + + if(evt) + LV_LOG_TRACE("libinput_read: (%04d, %04d): %d continue_reading? %d", data->point.x, data->point.y, data->state, + data->continue_reading); +} + +static void _read_pointer(lv_libinput_t * dsc, struct libinput_event * event) +{ + struct libinput_event_touch * touch_event = NULL; + struct libinput_event_pointer * pointer_event = NULL; + lv_libinput_event_t * evt = NULL; + enum libinput_event_type type = libinput_event_get_type(event); + int slot = 0; + + switch(type) { + case LIBINPUT_EVENT_TOUCH_MOTION: + case LIBINPUT_EVENT_TOUCH_DOWN: + case LIBINPUT_EVENT_TOUCH_UP: + touch_event = libinput_event_get_touch_event(event); + break; + case LIBINPUT_EVENT_POINTER_MOTION: + case LIBINPUT_EVENT_POINTER_BUTTON: + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: + pointer_event = libinput_event_get_pointer_event(event); + break; + default: + return; /* We don't care about this events */ + } + + /* We need to read unrotated display dimensions directly from the driver because libinput won't account + * for any rotation inside of LVGL */ + lv_display_t * disp = lv_display_get_default(); + + /* ignore more than 2 fingers as it will only confuse LVGL */ + if(touch_event && (slot = libinput_event_touch_get_slot(touch_event)) > 1) + return; + + evt = _create_event(dsc); + + const int32_t hor_res = disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + const int32_t ver_res = disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + + switch(type) { + case LIBINPUT_EVENT_TOUCH_MOTION: + case LIBINPUT_EVENT_TOUCH_DOWN: { + lv_point_t point; + point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_x_transformed(touch_event, hor_res) - disp->offset_x, + INT32_MAX); + point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_y_transformed(touch_event, ver_res) - disp->offset_y, + INT32_MAX); + if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { + break; /* ignore touches that are out of bounds */ + } + evt->point = point; + evt->pressed = LV_INDEV_STATE_PRESSED; + dsc->slots[slot].point = evt->point; + dsc->slots[slot].pressed = evt->pressed; + break; + } + case LIBINPUT_EVENT_TOUCH_UP: + /* + * We don't support "multitouch", but libinput does. To make fast typing with two thumbs + * on a keyboard feel good, it's necessary to handle two fingers individually. The edge + * case here is if you press a key with one finger and then press a second key with another + * finger. No matter which finger you release, it will count as the second finger releasing + * and ignore the first because LVGL only stores a single (the latest) pressed state. + * + * To work around this, we detect the case where one finger is released while the other is + * still pressed and insert dummy events so that both release events trigger at the correct + * position. + */ + if(slot == 0 && dsc->slots[1].pressed == LV_INDEV_STATE_PRESSED) { + /* The first finger is released while the second finger is still pressed. + * We turn P1 > P2 > R1 > R2 into P1 > P2 > (P1) > R1 > (P2) > R2. + */ + + /* Inject the dummy press event for the first finger */ + lv_libinput_event_t * synth_evt = evt; + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[0].point; + + /* Append the real release event for the first finger */ + evt = _create_event(dsc); + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[0].point; + + /* Inject the dummy press event for the second finger */ + synth_evt = _create_event(dsc); + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[1].point; + } + else if(slot == 1 && dsc->slots[0].pressed == LV_INDEV_STATE_PRESSED) { + /* The second finger is released while the first finger is still pressed. + * We turn P1 > P2 > R2 > R1 into P1 > P2 > R2 > (P1) > R1. + */ + + /* Append the real release event for the second finger */ + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[1].point; + + /* Inject the dummy press event for the first finger */ + lv_libinput_event_t * synth_evt = _create_event(dsc); + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[0].point; + } + else { + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[slot].point; + } + + dsc->slots[slot].pressed = evt->pressed; + break; + case LIBINPUT_EVENT_POINTER_MOTION: + dsc->pointer_position.x = (int32_t)LV_CLAMP(0, dsc->pointer_position.x + libinput_event_pointer_get_dx(pointer_event), + disp->hor_res - 1); + dsc->pointer_position.y = (int32_t)LV_CLAMP(0, dsc->pointer_position.y + libinput_event_pointer_get_dy(pointer_event), + disp->ver_res - 1); + evt->point.x = dsc->pointer_position.x; + evt->point.y = dsc->pointer_position.y; + evt->pressed = dsc->pointer_button_down; + break; + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: { + lv_point_t point; + point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_x_transformed(pointer_event, + hor_res) - disp->offset_x, INT32_MAX); + point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_y_transformed(pointer_event, + ver_res) - disp->offset_y, INT32_MAX); + if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { + break; /* ignore pointer events that are out of bounds */ + } + evt->point = point; + evt->pressed = dsc->pointer_button_down; + break; + } + case LIBINPUT_EVENT_POINTER_BUTTON: { + enum libinput_button_state button_state = libinput_event_pointer_get_button_state(pointer_event); + dsc->pointer_button_down = button_state == LIBINPUT_BUTTON_STATE_RELEASED ? LV_INDEV_STATE_RELEASED : + LV_INDEV_STATE_PRESSED; + evt->point.x = dsc->pointer_position.x; + evt->point.y = dsc->pointer_position.y; + evt->pressed = dsc->pointer_button_down; + } + default: + break; + } +} + +static void _read_keypad(lv_libinput_t * dsc, struct libinput_event * event) +{ + struct libinput_event_keyboard * keyboard_event = NULL; + enum libinput_event_type type = libinput_event_get_type(event); + lv_libinput_event_t * evt = NULL; + switch(type) { + case LIBINPUT_EVENT_KEYBOARD_KEY: + evt = _create_event(dsc); + keyboard_event = libinput_event_get_keyboard_event(event); + enum libinput_key_state key_state = libinput_event_keyboard_get_key_state(keyboard_event); + uint32_t code = libinput_event_keyboard_get_key(keyboard_event); +#if LV_LIBINPUT_XKB + evt->key_val = lv_xkb_process_key(&(dsc->xkb), code, key_state == LIBINPUT_KEY_STATE_PRESSED); +#else + switch(code) { + case KEY_BACKSPACE: + evt->key_val = LV_KEY_BACKSPACE; + break; + case KEY_ENTER: + evt->key_val = LV_KEY_ENTER; + break; + case KEY_PREVIOUS: + evt->key_val = LV_KEY_PREV; + break; + case KEY_NEXT: + evt->key_val = LV_KEY_NEXT; + break; + case KEY_UP: + evt->key_val = LV_KEY_UP; + break; + case KEY_LEFT: + evt->key_val = LV_KEY_LEFT; + break; + case KEY_RIGHT: + evt->key_val = LV_KEY_RIGHT; + break; + case KEY_DOWN: + evt->key_val = LV_KEY_DOWN; + break; + case KEY_TAB: + evt->key_val = LV_KEY_NEXT; + break; + case KEY_HOME: + evt->key_val = LV_KEY_HOME; + break; + case KEY_END: + evt->key_val = LV_KEY_END; + break; + default: + evt->key_val = 0; + break; + } +#endif /* LV_LIBINPUT_XKB */ + if(evt->key_val != 0) { + /* Only record button state when actual output is produced to prevent widgets from refreshing */ + evt->pressed = (key_state == LIBINPUT_KEY_STATE_RELEASED) ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; + + // just release the key immediatly after it got pressed. + // but don't handle special keys where holding a key makes sense + if(evt->key_val != LV_KEY_BACKSPACE && + evt->key_val != LV_KEY_UP && + evt->key_val != LV_KEY_LEFT && + evt->key_val != LV_KEY_RIGHT && + evt->key_val != LV_KEY_DOWN && + key_state == LIBINPUT_KEY_STATE_PRESSED) { + lv_libinput_event_t * release_evt = _create_event(dsc); + release_evt->pressed = LV_INDEV_STATE_RELEASED; + release_evt->key_val = evt->key_val; + } + } + break; + default: + break; + } +} + +static int _open_restricted(const char * path, int flags, void * user_data) +{ + LV_UNUSED(user_data); + int fd = open(path, flags); + return fd < 0 ? -errno : fd; +} + +static void _close_restricted(int fd, void * user_data) +{ + LV_UNUSED(user_data); + close(fd); +} + +static void _delete(lv_libinput_t * dsc) +{ + if(dsc->fd) + dsc->deinit = true; + + /* Give worker thread a whole second to quit */ + for(int i = 0; i < 100; i++) { + if(!dsc->deinit) + break; + usleep(10000); + } + + if(dsc->deinit) { + LV_LOG_ERROR("libinput worker thread did not quit in time, cancelling it"); + pthread_cancel(dsc->worker_thread); + } + + if(dsc->libinput_device) { + libinput_path_remove_device(dsc->libinput_device); + libinput_device_unref(dsc->libinput_device); + } + + if(dsc->libinput_context) { + libinput_unref(dsc->libinput_context); + } + +#if LV_LIBINPUT_XKB + lv_xkb_deinit(&(dsc->xkb)); +#endif /* LV_LIBINPUT_XKB */ + + lv_free(dsc); +} + +#endif /* LV_USE_LIBINPUT */ diff --git a/libraries/lvgl/src/drivers/libinput/lv_libinput.h b/libraries/lvgl/src/drivers/libinput/lv_libinput.h new file mode 100644 index 0000000..4ec1160 --- /dev/null +++ b/libraries/lvgl/src/drivers/libinput/lv_libinput.h @@ -0,0 +1,134 @@ +/** + * @file lv_libinput.h + * + */ + +#ifndef LV_LIBINPUT_H +#define LV_LIBINPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_LIBINPUT + +#include +#include + +#if LV_LIBINPUT_XKB +#include "lv_xkb.h" +#endif /* LV_LIBINPUT_XKB */ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_LIBINPUT_CAPABILITY_NONE = 0, + LV_LIBINPUT_CAPABILITY_KEYBOARD = 1U << 0, + LV_LIBINPUT_CAPABILITY_POINTER = 1U << 1, + LV_LIBINPUT_CAPABILITY_TOUCH = 1U << 2 +} lv_libinput_capability; + +typedef struct { + lv_indev_state_t pressed; + int key_val; + lv_point_t point; +} lv_libinput_event_t; + +#define LV_LIBINPUT_MAX_EVENTS 32 + +typedef struct { + int fd; + struct pollfd fds[1]; + + /* The points array is implemented as a circular LIFO queue */ + lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */ + lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */ + + /* Pointer devices work a bit differently in libinput which requires us to store their last known state */ + lv_point_t pointer_position; + bool pointer_button_down; + + int start; /* Index of start of event queue */ + int end; /* Index of end of queue*/ + lv_libinput_event_t last_event; /* Report when no new events + * to keep indev state consistent + */ + bool deinit; /* Tell worker thread to quit */ + pthread_mutex_t event_lock; + pthread_t worker_thread; + + struct libinput * libinput_context; + struct libinput_device * libinput_device; + +#if LV_LIBINPUT_XKB + lv_xkb_t xkb; +#endif /* LV_LIBINPUT_XKB */ +} lv_libinput_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Determine the capabilities of a specific libinput device. + * @param device the libinput device to query + * @return the supported input capabilities + */ +lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device); + +/** + * Find connected input device with specific capabilities + * @param capabilities required device capabilities + * @param force_rescan erase the device cache (if any) and rescan the file system for available devices + * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found. + * The pointer is safe to use until the next forceful device search. + */ +char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan); + +/** + * Find connected input devices with specific capabilities + * @param capabilities required device capabilities + * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are + * safe to use until the next forceful device search. + * @param count maximum number of devices to find (the devices array should be at least this long) + * @param force_rescan erase the device cache (if any) and rescan the file system for available devices + * @return number of devices that were found + */ +size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan); + +/** + * Create a new libinput input device + * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD + * @param dev_path device path, e.g. /dev/input/event0 + * @return pointer to input device or NULL if opening failed + */ +lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path); + +/** + * Delete a libinput input devic + * @param indev pointer to input device + */ +void lv_libinput_delete(lv_indev_t * indev); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LIBINPUT */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LIBINPUT_H */ diff --git a/libraries/lvgl/src/drivers/libinput/lv_xkb.c b/libraries/lvgl/src/drivers/libinput/lv_xkb.c new file mode 100644 index 0000000..96aeb4c --- /dev/null +++ b/libraries/lvgl/src/drivers/libinput/lv_xkb.c @@ -0,0 +1,180 @@ +/** + * @file lv_xkb.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_xkb.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +#include "../../core/lv_group.h" +#include "../../misc/lv_log.h" + +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct xkb_context * context = NULL; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names) +{ + if(!context) { + context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if(!context) { + LV_LOG_ERROR("xkb_context_new failed: %s", strerror(errno)); + return false; + } + } + + return _set_keymap(dsc, names); +} + +void lv_xkb_deinit(lv_xkb_t * dsc) +{ + if(dsc->state) { + xkb_state_unref(dsc->state); + dsc->state = NULL; + } + + if(dsc->keymap) { + xkb_keymap_unref(dsc->keymap); + dsc->keymap = NULL; + } +} + +uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down) +{ + /* Offset the evdev scancode by 8, see https://xkbcommon.org/doc/current/xkbcommon_8h.html#ac29aee92124c08d1953910ab28ee1997 */ + xkb_keycode_t keycode = scancode + 8; + + uint32_t result = 0; + + switch(xkb_state_key_get_one_sym(dsc->state, keycode)) { + case XKB_KEY_BackSpace: + result = LV_KEY_BACKSPACE; + break; + case XKB_KEY_Return: + case XKB_KEY_KP_Enter: + result = LV_KEY_ENTER; + break; + case XKB_KEY_Prior: + case XKB_KEY_KP_Prior: + result = LV_KEY_PREV; + break; + case XKB_KEY_Next: + case XKB_KEY_KP_Next: + result = LV_KEY_NEXT; + break; + case XKB_KEY_Up: + case XKB_KEY_KP_Up: + result = LV_KEY_UP; + break; + case XKB_KEY_Left: + case XKB_KEY_KP_Left: + result = LV_KEY_LEFT; + break; + case XKB_KEY_Right: + case XKB_KEY_KP_Right: + result = LV_KEY_RIGHT; + break; + case XKB_KEY_Down: + case XKB_KEY_KP_Down: + result = LV_KEY_DOWN; + break; + case XKB_KEY_Tab: + case XKB_KEY_KP_Tab: + result = LV_KEY_NEXT; + break; + case XKB_KEY_ISO_Left_Tab: /* Sent on SHIFT + TAB */ + result = LV_KEY_PREV; + break; + case XKB_KEY_Home: + case XKB_KEY_KP_Home: + result = LV_KEY_HOME; + break; + case XKB_KEY_End: + case XKB_KEY_KP_End: + result = LV_KEY_END; + break; + default: + break; + } + + if(result == 0) { + char buffer[4] = { 0, 0, 0, 0 }; + int size = xkb_state_key_get_utf8(dsc->state, keycode, NULL, 0) + 1; + if(size > 1) { + xkb_state_key_get_utf8(dsc->state, keycode, buffer, size); + memcpy(&result, buffer, 4); + } + } + + xkb_state_update_key(dsc->state, keycode, down ? XKB_KEY_DOWN : XKB_KEY_UP); + + return result; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names) +{ + if(dsc->keymap) { + xkb_keymap_unref(dsc->keymap); + dsc->keymap = NULL; + } + + dsc->keymap = xkb_keymap_new_from_names(context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); + if(!dsc->keymap) { + LV_LOG_ERROR("xkb_keymap_new_from_names failed: %s", strerror(errno)); + return false; + } + + if(dsc->state) { + xkb_state_unref(dsc->state); + dsc->state = NULL; + } + + dsc->state = xkb_state_new(dsc->keymap); + if(!dsc->state) { + LV_LOG_ERROR("xkb_state_new failed: %s", strerror(errno)); + return false; + } + + return true; +} + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ diff --git a/libraries/lvgl/src/drivers/libinput/lv_xkb.h b/libraries/lvgl/src/drivers/libinput/lv_xkb.h new file mode 100644 index 0000000..d048f33 --- /dev/null +++ b/libraries/lvgl/src/drivers/libinput/lv_xkb.h @@ -0,0 +1,72 @@ +/** + * @file lv_xkb.h + * + */ + +#ifndef LV_XKB_H +#define LV_XKB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + struct xkb_keymap * keymap; + struct xkb_state * state; +} lv_xkb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialise an XKB descriptor. + * @return true if the initialisation was successful + */ +bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names); + +/** + * De-initialise an XKB descriptor. + * @param dsc Pointer to descriptor + */ +void lv_xkb_deinit(lv_xkb_t * dsc); + +/** + * Process an evdev scancode using a specific XKB descriptor. + * @param state XKB descriptor to use + * @param scancode evdev scancode to process + * @param down true if the key was pressed, false if it was releases + * @return the (first) UTF-8 character produced by the event or 0 if no output was produced + */ +uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down); + +/********************** + * MACROS + **********************/ + +#endif /* LV_LIBINPUT_XKB */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ diff --git a/libraries/lvgl/src/drivers/lv_drivers.h b/libraries/lvgl/src/drivers/lv_drivers.h new file mode 100644 index 0000000..f07e000 --- /dev/null +++ b/libraries/lvgl/src/drivers/lv_drivers.h @@ -0,0 +1,60 @@ +/** + * @file lv_drivers.h + * + */ + +#ifndef LV_DRIVERS_H +#define LV_DRIVERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "sdl/lv_sdl_window.h" +#include "sdl/lv_sdl_mouse.h" +#include "sdl/lv_sdl_mousewheel.h" +#include "sdl/lv_sdl_keyboard.h" + +#include "x11/lv_x11.h" + +#include "display/drm/lv_linux_drm.h" +#include "display/fb/lv_linux_fbdev.h" + +#include "display/tft_espi/lv_tft_espi.h" + +#include "nuttx/lv_nuttx_entry.h" +#include "nuttx/lv_nuttx_fbdev.h" +#include "nuttx/lv_nuttx_touchscreen.h" +#include "nuttx/lv_nuttx_lcd.h" +#include "nuttx/lv_nuttx_libuv.h" + +#include "evdev/lv_evdev.h" +#include "libinput/lv_libinput.h" + +#include "windows/lv_windows_input.h" +#include "windows/lv_windows_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRIVERS_H*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.c new file mode 100644 index 0000000..0655d2f --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.c @@ -0,0 +1,71 @@ +/** + * @file lv_nuttx_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_cache.h" +#include "../../../lvgl.h" + +#if LV_USE_NUTTX + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_cache_init(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->invalidate_cache_cb = invalidate_cache; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + LV_ASSERT_NULL(draw_buf); + void * buf = draw_buf->data; + uint32_t stride = draw_buf->header.stride; + + lv_uintptr_t start; + lv_uintptr_t end; + + int32_t h = lv_area_get_height(area); + start = (lv_uintptr_t)buf + area->y1 * stride; + end = start + h * stride; + + LV_UNUSED(start); + LV_UNUSED(end); + up_invalidate_dcache(start, end); +} + +#endif /* LV_USE_NUTTX */ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.h new file mode 100644 index 0000000..693744e --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_cache.h @@ -0,0 +1,39 @@ +/** + * @file lv_nuttx_cache.h + * + */ + +#ifndef LV_NUTTX_CACHE_H +#define LV_NUTTX_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_cache_init(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_CACHE_H*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.c new file mode 100644 index 0000000..559f9bb --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.c @@ -0,0 +1,207 @@ +/** + * @file lv_nuttx_entry.h + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_entry.h" + +#if LV_USE_NUTTX + +#include +#include +#include +#include +#include "lv_nuttx_cache.h" +#include "lv_nuttx_image_cache.h" +#include "lv_nuttx_profiler.h" + +#include "../../../lvgl.h" + +/********************* + * DEFINES + *********************/ +#define nuttx_ctx_p (LV_GLOBAL_DEFAULT()->nuttx_ctx) +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t millis(void); +#if LV_USE_LOG + static void syslog_print(lv_log_level_t level, const char * buf); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_ENABLE_GLOBAL_CUSTOM + +static void lv_global_free(void * data) +{ + if(data) { + free(data); + } +} + +lv_global_t * lv_global_default(void) +{ + static int index = -1; + lv_global_t * data = NULL; + + if(index < 0) { + index = task_tls_alloc(lv_global_free); + } + + if(index >= 0) { + data = (lv_global_t *)task_tls_get_value(index); + if(data == NULL) { + data = (lv_global_t *)calloc(1, sizeof(lv_global_t)); + task_tls_set_value(index, (uintptr_t)data); + } + } + return data; +} +#endif + +void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc) +{ + if(dsc == NULL) + return; + + lv_memzero(dsc, sizeof(lv_nuttx_dsc_t)); + dsc->fb_path = "/dev/fb0"; + dsc->input_path = "/dev/input0"; + +#ifdef CONFIG_UINPUT_TOUCH + dsc->utouch_path = "/dev/utouch"; +#endif +} + +void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result) +{ + nuttx_ctx_p = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_t)); + LV_ASSERT_MALLOC(nuttx_ctx_p); + +#if LV_USE_LOG + lv_log_register_print_cb(syslog_print); +#endif + lv_tick_set_cb(millis); + + lv_nuttx_cache_init(); + +#if LV_CACHE_DEF_SIZE > 0 + lv_nuttx_image_cache_init(); +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_nuttx_profiler_init(); +#endif + + if(result) { + lv_memzero(result, sizeof(lv_nuttx_result_t)); + } + +#if !LV_USE_NUTTX_CUSTOM_INIT + + if(dsc && dsc->fb_path) { + lv_display_t * disp = NULL; + +#if LV_USE_NUTTX_LCD + disp = lv_nuttx_lcd_create(dsc->fb_path); +#else + disp = lv_nuttx_fbdev_create(); + if(lv_nuttx_fbdev_set_file(disp, dsc->fb_path) != 0) { + lv_display_delete(disp); + disp = NULL; + } +#endif + if(result) { + result->disp = disp; + } + } + + if(dsc) { +#if LV_USE_NUTTX_TOUCHSCREEN + if(dsc->input_path) { + lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->input_path); + if(result) { + result->indev = indev; + } + } + + if(dsc->utouch_path) { + lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->utouch_path); + if(result) { + result->utouch_indev = indev; + } + } +#endif + } + +#else + + lv_nuttx_init_custom(dsc, result); +#endif +} + +#ifdef CONFIG_SCHED_CPULOAD + +uint32_t lv_nuttx_get_idle(void) +{ + struct cpuload_s cpuload; + int ret = clock_cpuload(0, &cpuload); + if(ret < 0) { + LV_LOG_WARN("clock_cpuload failed: %d", ret); + return 0; + } + + uint32_t idle = cpuload.active * 100 / cpuload.total; + LV_LOG_TRACE("active = %" LV_PRIu32 ", total = %" LV_PRIu32, + cpuload.active, cpuload.total); + + return idle; +} + +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t millis(void) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + uint32_t tick = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + + return tick; +} + +#if LV_USE_LOG +static void syslog_print(lv_log_level_t level, const char * buf) +{ + static const int priority[_LV_LOG_LEVEL_NUM] = { + LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT + }; + + syslog(priority[level], "[LVGL] %s", buf); +} +#endif + +#endif /*LV_USE_NUTTX*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.h new file mode 100644 index 0000000..2e0d8bd --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_entry.h @@ -0,0 +1,97 @@ +/** + * @file lv_nuttx_entry.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#ifndef LV_NUTTX_ENTRY_H +#define LV_NUTTX_ENTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + const char * fb_path; + const char * input_path; + const char * utouch_path; +} lv_nuttx_dsc_t; + +typedef struct { + lv_display_t * disp; + lv_indev_t * indev; + lv_indev_t * utouch_indev; +} lv_nuttx_result_t; + +typedef struct _lv_nuttx_ctx_t { + +#if LV_CACHE_DEF_SIZE > 0 + void * image_cache; +#endif + +} lv_nuttx_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the lv_nuttx_dsc_t structure with default values for the NuttX port of LVGL. + * @param dsc Pointer to the lv_nuttx_dsc_t structure to be initialized. + */ +void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc); + +/** + * Initialize the LVGL display driver for NuttX using the provided configuration information. + * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the configuration information for the display driver. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); + +#if LV_USE_NUTTX_CUSTOM_INIT +/** + * Initialize the LVGL display driver for NuttX using the provided custom configuration information. + * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the custom configuration for the display driver. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_init_custom(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); + +#endif /* LV_USE_NUTTX_CUSTOM_INIT */ + +/** + * Get the idle percentage of the system. + * @return The idle percentage of the system. + */ +uint32_t lv_nuttx_get_idle(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_ENTRY_H */ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c new file mode 100644 index 0000000..d4cd7f7 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c @@ -0,0 +1,334 @@ +/** + * @file lv_nuttx_fbdev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_fbdev.h" +#if LV_USE_NUTTX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../lvgl.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + struct fb_videoinfo_s vinfo; + struct fb_planeinfo_s pinfo; + + void * mem; + void * mem2; + uint32_t mem2_yoffset; + + lv_draw_buf_t buf1; + lv_draw_buf_t buf2; +} lv_nuttx_fb_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static int fbdev_get_pinfo(int fd, struct fb_planeinfo_s * pinfo); +static int fbdev_init_mem2(lv_nuttx_fb_t * dsc); +static void display_refr_timer_cb(lv_timer_t * tmr); +static void display_release_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nuttx_fbdev_create(void) +{ + lv_nuttx_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_nuttx_fb_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + dsc->fd = -1; + lv_display_set_driver_data(disp, dsc); + lv_display_add_event_cb(disp, display_release_cb, LV_EVENT_DELETE, disp); + lv_display_set_flush_cb(disp, flush_cb); + return disp; +} + +int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file) +{ + int ret; + LV_ASSERT(disp && file); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + + if(dsc->fd >= 0) close(dsc->fd); + + /* Open the file for reading and writing*/ + + dsc->fd = open(file, O_RDWR); + if(dsc->fd < 0) { + LV_LOG_ERROR("Error: cannot open framebuffer device"); + return -errno; + } + LV_LOG_USER("The framebuffer device was opened successfully"); + + if(ioctl(dsc->fd, FBIOGET_VIDEOINFO, (unsigned long)((uintptr_t)&dsc->vinfo)) < 0) { + LV_LOG_ERROR("ioctl(FBIOGET_VIDEOINFO) failed: %d", errno); + ret = -errno; + goto errout; + } + + LV_LOG_USER("VideoInfo:"); + LV_LOG_USER(" fmt: %u", dsc->vinfo.fmt); + LV_LOG_USER(" xres: %u", dsc->vinfo.xres); + LV_LOG_USER(" yres: %u", dsc->vinfo.yres); + LV_LOG_USER(" nplanes: %u", dsc->vinfo.nplanes); + + if((ret = fbdev_get_pinfo(dsc->fd, &dsc->pinfo)) < 0) { + goto errout; + } + + dsc->mem = mmap(NULL, dsc->pinfo.fblen, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FILE, dsc->fd, 0); + if(dsc->mem == MAP_FAILED) { + LV_LOG_ERROR("ioctl(FBIOGET_PLANEINFO) failed: %d", errno); + ret = -errno; + goto errout; + } + + uint32_t w = dsc->vinfo.xres; + uint32_t h = dsc->vinfo.yres; + uint32_t stride = dsc->pinfo.stride; + uint32_t data_size = h * stride; + lv_draw_buf_init(&dsc->buf1, w, h, LV_COLOR_FORMAT_NATIVE, stride, dsc->mem, data_size); + + /* double buffer mode */ + + bool double_buffer = dsc->pinfo.yres_virtual == (dsc->vinfo.yres * 2); + if(double_buffer) { + if((ret = fbdev_init_mem2(dsc)) < 0) { + goto errout; + } + + lv_draw_buf_init(&dsc->buf2, w, h, LV_COLOR_FORMAT_NATIVE, stride, dsc->mem2, data_size); + } + + lv_display_set_draw_buffers(disp, &dsc->buf1, double_buffer ? &dsc->buf2 : NULL); + lv_display_set_render_mode(disp, LV_DISP_RENDER_MODE_DIRECT); + lv_display_set_resolution(disp, dsc->vinfo.xres, dsc->vinfo.yres); + lv_timer_set_cb(disp->refr_timer, display_refr_timer_cb); + + LV_LOG_USER("Resolution is set to %dx%d at %" LV_PRId32 "dpi", + dsc->vinfo.xres, dsc->vinfo.yres, lv_display_get_dpi(disp)); + return 0; + +errout: + close(dsc->fd); + dsc->fd = -1; + return ret; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void display_refr_timer_cb(lv_timer_t * tmr) +{ + lv_display_t * disp = lv_timer_get_user_data(tmr); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + struct pollfd pfds[1]; + + lv_memzero(pfds, sizeof(pfds)); + pfds[0].fd = dsc->fd; + pfds[0].events = POLLOUT; + + /* Query free fb to draw */ + + if(poll(pfds, 1, 0) < 0) { + return; + } + + if(pfds[0].revents & POLLOUT) { + _lv_display_refr_timer(tmr); + } +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + + /* Skip the non-last flush */ + + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + + if(dsc->mem == NULL || + area->x2 < 0 || area->y2 < 0 || + area->x1 > (int32_t)dsc->vinfo.xres - 1 || area->y1 > (int32_t)dsc->vinfo.yres - 1) { + lv_display_flush_ready(disp); + return; + } + +#if defined(CONFIG_FB_UPDATE) + /*May be some direct update command is required*/ + int yoffset = disp->buf_act == disp->buf_1 ? + 0 : dsc->mem2_yoffset; + + struct fb_area_s fb_area; + fb_area.x = area->x1; + fb_area.y = area->y1 + yoffset; + fb_area.w = lv_area_get_width(area); + fb_area.h = lv_area_get_height(area); + if(ioctl(dsc->fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&fb_area)) < 0) { + LV_LOG_ERROR("ioctl(FBIO_UPDATE) failed: %d", errno); + } +#endif + + /* double framebuffer */ + + if(dsc->mem2 != NULL) { + if(disp->buf_act == disp->buf_1) { + dsc->pinfo.yoffset = 0; + } + else { + dsc->pinfo.yoffset = dsc->mem2_yoffset; + } + + if(ioctl(dsc->fd, FBIOPAN_DISPLAY, (unsigned long)((uintptr_t) & (dsc->pinfo))) < 0) { + LV_LOG_ERROR("ioctl(FBIOPAN_DISPLAY) failed: %d", errno); + } + } + lv_display_flush_ready(disp); +} + +static int fbdev_get_pinfo(int fd, FAR struct fb_planeinfo_s * pinfo) +{ + if(ioctl(fd, FBIOGET_PLANEINFO, (unsigned long)((uintptr_t)pinfo)) < 0) { + LV_LOG_ERROR("ERROR: ioctl(FBIOGET_PLANEINFO) failed: %d", errno); + return -errno; + } + + LV_LOG_USER("PlaneInfo (plane %d):", pinfo->display); + LV_LOG_USER(" mem: %p", pinfo->fbmem); + LV_LOG_USER(" fblen: %zu", pinfo->fblen); + LV_LOG_USER(" stride: %u", pinfo->stride); + LV_LOG_USER(" display: %u", pinfo->display); + LV_LOG_USER(" bpp: %u", pinfo->bpp); + + /* Only these pixel depths are supported. vinfo.fmt is ignored, only + * certain color formats are supported. + */ + + if(pinfo->bpp != 32 && pinfo->bpp != 16 && + pinfo->bpp != 8 && pinfo->bpp != 1) { + LV_LOG_ERROR("bpp = %u not supported", pinfo->bpp); + return -EINVAL; + } + + return 0; +} + +static int fbdev_init_mem2(lv_nuttx_fb_t * dsc) +{ + uintptr_t buf_offset; + struct fb_planeinfo_s pinfo; + int ret; + + lv_memzero(&pinfo, sizeof(pinfo)); + + /* Get display[1] planeinfo */ + + pinfo.display = dsc->pinfo.display + 1; + + if((ret = fbdev_get_pinfo(dsc->fd, &pinfo)) < 0) { + return ret; + } + + /* Check bpp */ + + if(pinfo.bpp != dsc->pinfo.bpp) { + LV_LOG_WARN("mem2 is incorrect"); + return -EINVAL; + } + + /* Check the buffer address offset, + * It needs to be divisible by pinfo.stride + */ + + buf_offset = pinfo.fbmem - dsc->mem; + + if((buf_offset % dsc->pinfo.stride) != 0) { + LV_LOG_WARN("It is detected that buf_offset(%" PRIuPTR ") " + "and stride(%d) are not divisible, please ensure " + "that the driver handles the address offset by itself.", + buf_offset, dsc->pinfo.stride); + } + + /* Calculate the address and yoffset of mem2 */ + + if(buf_offset == 0) { + dsc->mem2_yoffset = dsc->vinfo.yres; + dsc->mem2 = pinfo.fbmem + dsc->mem2_yoffset * pinfo.stride; + LV_LOG_USER("Use consecutive mem2 = %p, yoffset = %" LV_PRIu32, + dsc->mem2, dsc->mem2_yoffset); + } + else { + dsc->mem2_yoffset = buf_offset / dsc->pinfo.stride; + dsc->mem2 = pinfo.fbmem; + LV_LOG_USER("Use non-consecutive mem2 = %p, yoffset = %" LV_PRIu32, + dsc->mem2, dsc->mem2_yoffset); + } + + return 0; +} + +static void display_release_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + if(dsc) { + lv_display_set_driver_data(disp, NULL); + lv_display_set_flush_cb(disp, NULL); + + if(dsc->fd >= 0) { + close(dsc->fd); + dsc->fd = -1; + } + lv_free(dsc); + } + LV_LOG_USER("Done"); +} + +#endif /*LV_USE_NUTTX*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h new file mode 100644 index 0000000..994c497 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h @@ -0,0 +1,55 @@ +/** + * @file lv_nuttx_fbdev_h + * + */ + +#ifndef LV_NUTTX_FBDEV_H +#define LV_NUTTX_FBDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_NUTTX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new display with NuttX backend. + */ +lv_display_t * lv_nuttx_fbdev_create(void); + +/** + * Initialize display with specified framebuffer device + * @param disp pointer to display with NuttX backend + * @param file the name of framebuffer device + */ +int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_FBDEV_H */ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c new file mode 100644 index 0000000..839704c --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c @@ -0,0 +1,129 @@ +/** + * @file lv_nuttx_image_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_cache.h" +#include "../../../lvgl.h" + +#if LV_CACHE_DEF_SIZE > 0 + +#if LV_USE_NUTTX + +#include + +/********************* + * DEFINES + *********************/ + +#define HEAP_NAME "GImageCache" + +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) +#define ctx (*(lv_nuttx_ctx_image_cache_t **)&LV_GLOBAL_DEFAULT()->nuttx_ctx->image_cache) +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t * mem; + uint32_t mem_size; + + struct mm_heap_s * heap; + uint32_t heap_size; +} lv_nuttx_ctx_image_cache_t; +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format); +static void free_cb(void * draw_buf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_image_cache_init(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->buf_malloc_cb = malloc_cb; + handlers->buf_free_cb = free_cb; + + ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t)); + LV_ASSERT_MALLOC(ctx); + + ctx->mem_size = LV_CACHE_DEF_SIZE; + ctx->mem = malloc(ctx->mem_size); + LV_ASSERT_MALLOC(ctx->mem); + + ctx->heap = mm_initialize( + HEAP_NAME, + ctx->mem, + ctx->mem_size + ); + + struct mallinfo info = mm_mallinfo(ctx->heap); + ctx->heap_size = info.arena; + + LV_LOG_USER("heap info:"); + LV_LOG_USER(" heap: %p", ctx->heap); + LV_LOG_USER(" mem: %p", ctx->mem); + LV_LOG_USER(" mem_size: %" LV_PRIu32, ctx->mem_size); + LV_LOG_USER(" arena: %d", info.arena); + LV_LOG_USER(" ordblks: %d", info.ordblks); + LV_LOG_USER(" aordblks: %d", info.aordblks); + LV_LOG_USER(" mxordblk: %d", info.mxordblk); + LV_LOG_USER(" uordblks: %d", info.uordblks); + LV_LOG_USER(" fordblks: %d", info.fordblks); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + /*Allocate larger memory to be sure it can be aligned as needed*/ + size_bytes += LV_DRAW_BUF_ALIGN - 1; + uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL); + + if(size_bytes > cache_max_size) { + LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", + (uint32_t)size_bytes, + cache_max_size); + return NULL; + } + + while(1) { + void * mem = mm_malloc(ctx->heap, size_bytes); + if(mem) return mem; + LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32, + (uint32_t)size_bytes); + bool evict_res = lv_cache_evict_one(img_cache_p, NULL); + if(evict_res == false) { + LV_LOG_ERROR("failed to evict one cache entry"); + return NULL; + } + } +} + +static void free_cb(void * draw_buf) +{ + mm_free(ctx->heap, draw_buf); +} + +#endif /* LV_USE_NUTTX */ +#endif /* LV_CACHE_DEF_SIZE > 0 */ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h new file mode 100644 index 0000000..e2af31f --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h @@ -0,0 +1,45 @@ +/** + * @file lv_nuttx_image_cache.h + * + */ + +#ifndef LV_NUTTX_IMAGE_CACHE_H +#define LV_NUTTX_IMAGE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_CACHE_DEF_SIZE > 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_image_cache_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_CACHE_DEF_SIZE > 0*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_IMAGE_CACHE_H*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c new file mode 100644 index 0000000..c785d22 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c @@ -0,0 +1,238 @@ +/** + * @file lv_nuttx_lcd.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_lcd.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LCD + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../lvgl.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + lv_display_t * disp; + struct lcddev_area_s area; + struct lcddev_area_align_s align_info; +} lv_nuttx_lcd_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t align_round_up(int32_t v, uint16_t align); +static void rounder_cb(lv_event_t * e); +static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, + uint8_t * color_p); +static lv_display_t * lcd_init(int fd, int hor_res, int ver_res); +static void display_release_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nuttx_lcd_create(const char * dev_path) +{ + struct fb_videoinfo_s vinfo; + struct lcd_planeinfo_s pinfo; + lv_display_t * disp; + int fd; + int ret; + + LV_ASSERT_NULL(dev_path); + + LV_LOG_USER("lcd %s opening", dev_path); + fd = open(dev_path, 0); + if(fd < 0) { + perror("Error: cannot open lcd device"); + return NULL; + } + + LV_LOG_USER("lcd %s open success", dev_path); + + ret = ioctl(fd, LCDDEVIO_GETVIDEOINFO, + (unsigned long)((uintptr_t)&vinfo)); + if(ret < 0) { + perror("Error: ioctl(LCDDEVIO_GETVIDEOINFO) failed"); + close(fd); + return NULL; + } + + ret = ioctl(fd, LCDDEVIO_GETPLANEINFO, + (unsigned long)((uintptr_t)&pinfo)); + if(ret < 0) { + perror("ERROR: ioctl(LCDDEVIO_GETPLANEINFO) failed"); + close(fd); + return NULL; + } + + disp = lcd_init(fd, vinfo.xres, vinfo.yres); + if(disp == NULL) { + close(fd); + } + + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t align_round_up(int32_t v, uint16_t align) +{ + return (v + align - 1) & ~(align - 1); +} + +static void rounder_cb(lv_event_t * e) +{ + lv_nuttx_lcd_t * lcd = lv_event_get_user_data(e); + lv_area_t * area = lv_event_get_param(e); + struct lcddev_area_align_s * align_info = &lcd->align_info; + int32_t w; + int32_t h; + + area->x1 &= ~(align_info->col_start_align - 1); + area->y1 &= ~(align_info->row_start_align - 1); + + w = align_round_up(lv_area_get_width(area), align_info->width_align); + h = align_round_up(lv_area_get_height(area), align_info->height_align); + + area->x2 = area->x1 + w - 1; + area->y2 = area->y1 + h - 1; +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, + uint8_t * color_p) +{ + lv_nuttx_lcd_t * lcd = disp->driver_data; + + lcd->area.row_start = area_p->y1; + lcd->area.row_end = area_p->y2; + lcd->area.col_start = area_p->x1; + lcd->area.col_end = area_p->x2; + lcd->area.data = (uint8_t *)color_p; + ioctl(lcd->fd, LCDDEVIO_PUTAREA, (unsigned long) & (lcd->area)); + lv_display_flush_ready(disp); +} + +static lv_display_t * lcd_init(int fd, int hor_res, int ver_res) +{ + lv_color_t * draw_buf = NULL; + lv_color_t * draw_buf_2 = NULL; + lv_nuttx_lcd_t * lcd = lv_malloc_zeroed(sizeof(lv_nuttx_lcd_t)); + LV_ASSERT_MALLOC(lcd); + if(lcd == NULL) { + LV_LOG_ERROR("lv_nuttx_lcd_t malloc failed"); + return NULL; + } + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(lcd); + return NULL; + } + + uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); +#if LV_NUTTX_LCD_BUFFER_COUNT > 0 + uint32_t buf_size = hor_res * ver_res * px_size; + lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_FULL; +#else + uint32_t buf_size = hor_res * LV_NUTTX_LCD_BUFFER_SIZE * px_size; + lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_PARTIAL; +#endif + + draw_buf = lv_malloc(buf_size); + if(draw_buf == NULL) { + LV_LOG_ERROR("display draw_buf malloc failed"); + lv_free(lcd); + return NULL; + } + +#if LV_NUTTX_LCD_BUFFER_COUNT == 2 + draw_buf_2 = lv_malloc(buf_size); + if(draw_buf_2 == NULL) { + LV_LOG_ERROR("display draw_buf_2 malloc failed"); + lv_free(lcd); + lv_free(draw_buf); + return NULL; + } +#endif + + lcd->fd = fd; + if(ioctl(fd, LCDDEVIO_GETAREAALIGN, &lcd->align_info) < 0) { + perror("Error: ioctl(LCDDEVIO_GETAREAALIGN) failed"); + } + + lcd->disp = disp; + lv_display_set_buffers(lcd->disp, draw_buf, draw_buf_2, buf_size, render_mode); + lv_display_set_flush_cb(lcd->disp, flush_cb); + lv_display_add_event_cb(lcd->disp, rounder_cb, LV_EVENT_INVALIDATE_AREA, lcd); + lv_display_add_event_cb(lcd->disp, display_release_cb, LV_EVENT_DELETE, lcd->disp); + lv_display_set_driver_data(lcd->disp, lcd); + + return lcd->disp; +} + +static void display_release_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_nuttx_lcd_t * dsc = lv_display_get_driver_data(disp); + if(dsc) { + lv_display_set_driver_data(disp, NULL); + lv_display_set_flush_cb(disp, NULL); + + /* clear display buffer */ + if(disp->buf_1) { + lv_free(disp->buf_1); + disp->buf_1 = NULL; + } + if(disp->buf_2) { + lv_free(disp->buf_2); + disp->buf_2 = NULL; + } + + /* close device fb */ + if(dsc->fd >= 0) { + close(dsc->fd); + dsc->fd = -1; + } + lv_free(dsc); + LV_LOG_USER("Done"); + } +} +#endif /*LV_USE_NUTTX_LCD*/ + +#endif /* LV_USE_NUTTX*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h new file mode 100644 index 0000000..16e24ff --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h @@ -0,0 +1,49 @@ +/** + * @file lv_nuttx_lcd.h + * + */ + +#ifndef LV_NUTTX_LCD_H +#define LV_NUTTX_LCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LCD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_display_t * lv_nuttx_lcd_create(const char * dev_path); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX_LCD */ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_LCD_H */ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c new file mode 100644 index 0000000..f623ae0 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c @@ -0,0 +1,340 @@ +/** + * @file lv_nuttx_libuv.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_libuv.h" +#include + +#include "../../../lvgl.h" +#include "../../lvgl_private.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LIBUV +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + int fd; + bool polling; + uv_poll_t fb_poll; + uv_poll_t vsync_poll; +} lv_nuttx_uv_fb_ctx_t; + +typedef struct { + int fd; + uv_poll_t input_poll; + lv_indev_t * indev; +} lv_nuttx_uv_input_ctx_t; + +typedef struct { + uv_timer_t uv_timer; + lv_nuttx_uv_fb_ctx_t fb_ctx; + lv_nuttx_uv_input_ctx_t input_ctx; + int32_t ref_count; +} lv_nuttx_uv_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_nuttx_uv_timer_cb(uv_timer_t * handle); +static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events); +static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events); +static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e); +static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events); +static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info) +{ + lv_nuttx_uv_ctx_t * uv_ctx; + int ret; + + uv_ctx = lv_malloc_zeroed(sizeof(lv_nuttx_uv_ctx_t)); + LV_ASSERT_MALLOC(uv_ctx); + if(uv_ctx == NULL) return NULL; + + if((ret = lv_nuttx_uv_timer_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_timer_init fail : %d", ret); + goto err_out; + } + + if((ret = lv_nuttx_uv_fb_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_fb_init fail : %d", ret); + goto err_out; + } + + if((ret = lv_nuttx_uv_input_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_input_init fail : %d", ret); + goto err_out; + } + + return uv_ctx; + +err_out: + lv_free(uv_ctx); + return NULL; +} + +void lv_nuttx_uv_deinit(void ** data) +{ + lv_nuttx_uv_ctx_t * uv_ctx = *data; + + if(uv_ctx == NULL) return; + lv_nuttx_uv_input_deinit(uv_ctx); + lv_nuttx_uv_fb_deinit(uv_ctx); + lv_nuttx_uv_timer_deinit(uv_ctx); + *data = NULL; + LV_LOG_USER("Done"); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_nuttx_uv_timer_cb(uv_timer_t * handle) +{ + uint32_t sleep_ms; + + sleep_ms = lv_timer_handler(); + + if(sleep_ms == LV_NO_TIMER_READY) { + uv_timer_stop(handle); + return; + } + + /* Prevent busy loops. */ + + if(sleep_ms == 0) { + sleep_ms = 1; + } + + LV_LOG_TRACE("sleep_ms = %" LV_PRIu32, sleep_ms); + uv_timer_start(handle, lv_nuttx_uv_timer_cb, sleep_ms, 0); +} + +static void lv_nuttx_uv_timer_resume(void * data) +{ + uv_timer_t * timer = (uv_timer_t *)data; + if(timer) + uv_timer_start(timer, lv_nuttx_uv_timer_cb, 0, 0); +} + +static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(loop); + + uv_ctx->uv_timer.data = uv_ctx; + uv_timer_init(loop, &uv_ctx->uv_timer); + uv_ctx->ref_count++; + uv_timer_start(&uv_ctx->uv_timer, lv_nuttx_uv_timer_cb, 1, 1); + + lv_timer_handler_set_resume_cb(lv_nuttx_uv_timer_resume, &uv_ctx->uv_timer); + return 0; +} + +static void lv_nuttx_uv_deinit_cb(uv_handle_t * handle) +{ + lv_nuttx_uv_ctx_t * uv_ctx = handle->data; + if(--uv_ctx->ref_count <= 0) { + LV_LOG_USER("Done"); + lv_free(uv_ctx); + } +} + +static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + lv_timer_handler_set_resume_cb(NULL, NULL); + uv_close((uv_handle_t *)&uv_ctx->uv_timer, lv_nuttx_uv_deinit_cb); + LV_LOG_USER("Done"); +} + +static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events) +{ + LV_UNUSED(handle); + LV_UNUSED(status); + LV_UNUSED(events); + + lv_display_t * d; + d = lv_display_get_next(NULL); + while(d) { + lv_display_send_event(d, LV_EVENT_VSYNC, NULL); + d = lv_display_get_next(d); + } +} + +static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events) +{ + lv_nuttx_uv_fb_ctx_t * fb_ctx = &((lv_nuttx_uv_ctx_t *)(handle->data))->fb_ctx; + + LV_UNUSED(status); + LV_UNUSED(events); + uv_poll_stop(handle); + _lv_display_refr_timer(NULL); + fb_ctx->polling = false; +} + +static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e) +{ + lv_nuttx_uv_fb_ctx_t * fb_ctx = lv_event_get_user_data(e); + + if(fb_ctx->polling) { + return; + } + fb_ctx->polling = true; + uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); +} + +static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + lv_display_t * disp = uv_info->disp; + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(disp); + LV_ASSERT_NULL(loop); + + lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; + fb_ctx->fd = *(int *)lv_display_get_driver_data(disp); + + if(fb_ctx->fd <= 0) { + LV_LOG_USER("skip uv fb init."); + return 0; + } + + if(!disp->refr_timer) { + LV_LOG_ERROR("disp->refr_timer is NULL"); + return -EINVAL; + } + + /* Remove default refr timer. */ + + lv_timer_del(disp->refr_timer); + disp->refr_timer = NULL; + + fb_ctx->fb_poll.data = uv_ctx; + uv_poll_init(loop, &fb_ctx->fb_poll, fb_ctx->fd); + uv_ctx->ref_count++; + uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); + + fb_ctx->vsync_poll.data = uv_ctx; + uv_poll_init(loop, &fb_ctx->vsync_poll, fb_ctx->fd); + uv_ctx->ref_count++; + uv_poll_start(&fb_ctx->vsync_poll, UV_PRIORITIZED, lv_nuttx_uv_vsync_poll_cb); + + LV_LOG_USER("lvgl fb loop start OK"); + + /* Register for the invalidate area event */ + + lv_event_add(&disp->event_list, lv_nuttx_uv_disp_refr_req_cb, LV_EVENT_REFR_REQUEST, fb_ctx); + + return 0; +} + +static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + /* should remove event */ + lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; + if(fb_ctx->fd > 0) { + uv_close((uv_handle_t *)&fb_ctx->fb_poll, lv_nuttx_uv_deinit_cb); + uv_close((uv_handle_t *)&fb_ctx->vsync_poll, lv_nuttx_uv_deinit_cb); + } + LV_LOG_USER("Done"); +} + +static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events) +{ + lv_indev_t * indev = ((lv_nuttx_uv_ctx_t *)(handle->data))->input_ctx.indev; + + if(status < 0) { + LV_LOG_WARN("input poll error: %s ", uv_strerror(status)); + return; + } + + if(events & UV_READABLE) { + lv_indev_read(indev); + } +} + +static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + lv_indev_t * indev = uv_info->indev; + + if(indev == NULL) { + LV_LOG_USER("skip uv input init."); + return 0; + } + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(loop); + + if(lv_indev_get_mode(indev) == LV_INDEV_MODE_EVENT) { + LV_LOG_ERROR("input device has been running in event-driven mode"); + return -EINVAL; + } + + lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; + input_ctx->fd = *(int *)lv_indev_get_driver_data(indev); + if(input_ctx->fd <= 0) { + LV_LOG_ERROR("can't get valid input fd"); + return 0; + } + + input_ctx->indev = indev; + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + + input_ctx->input_poll.data = uv_ctx; + uv_poll_init(loop, &input_ctx->input_poll, input_ctx->fd); + uv_ctx->ref_count++; + uv_poll_start(&input_ctx->input_poll, UV_READABLE, lv_nuttx_uv_input_poll_cb); + + LV_LOG_USER("lvgl input loop start OK"); + + return 0; +} + +static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; + if(input_ctx->fd > 0) { + uv_close((uv_handle_t *)&input_ctx->input_poll, lv_nuttx_uv_deinit_cb); + } + LV_LOG_USER("Done"); +} + +#endif /*LV_USE_NUTTX_LIBUV*/ + +#endif /*LV_USE_NUTTX*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h new file mode 100644 index 0000000..0799e67 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h @@ -0,0 +1,66 @@ +/** + * @file lv_nuttx_libuv.h + * + */ + +#ifndef LV_NUTTX_LIBUV_H +#define LV_NUTTX_LIBUV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LIBUV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void * loop; + lv_display_t * disp; + lv_indev_t * indev; +} lv_nuttx_uv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the uv_loop using the provided configuration information. + * @param uv_info Pointer to the lv_nuttx_uv_t structure to be initialized. + */ +void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info); + +/** + * Deinitialize the uv_loop configuration for NuttX porting layer. + * @param data Pointer to user data. + */ +void lv_nuttx_uv_deinit(void ** data); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NUTTX_LIBUV*/ + +#endif /*LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_NUTTX_LIBUV_H*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c new file mode 100644 index 0000000..a17c3a5 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c @@ -0,0 +1,96 @@ +/** + * @file lv_nuttx_profiler.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_profiler.h" +#include "../../../lvgl.h" + +#if LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#include +#include + +/********************* + * DEFINES + *********************/ + +#define TICK_TO_USEC(tick) ((tick) / cpu_freq) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t cpu_freq = 0; /* MHz */ + +/********************** + * STATIC VARIABLES + **********************/ + +static uint32_t tick_get_cb(void); +static void flush_cb(const char * buf); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_profiler_init(void) +{ + cpu_freq = (uint32_t)up_perf_getfreq() / 1000000; + if(cpu_freq == 0) { + LV_LOG_ERROR("Failed to get CPU frequency"); + return; + } + LV_LOG_USER("CPU frequency: %" LV_PRIu32 " MHz", cpu_freq); + + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + config.tick_per_sec = 1000000; /* 1 sec = 1000000 usec */ + config.tick_get_cb = tick_get_cb; + config.flush_cb = flush_cb; + lv_profiler_builtin_init(&config); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t tick_get_cb(void) +{ + static uint32_t prev_tick = 0; + static uint32_t cur_tick_us = 0; + uint32_t act_time = up_perf_gettime(); + uint32_t elaps; + + /*If there is no overflow in sys_time simple subtract*/ + if(act_time >= prev_tick) { + elaps = act_time - prev_tick; + } + else { + elaps = UINT32_MAX - prev_tick + 1; + elaps += act_time; + } + + cur_tick_us += TICK_TO_USEC(elaps); + prev_tick = act_time; + return cur_tick_us; +} + +static void flush_cb(const char * buf) +{ + printf("%s", buf); +} + +#endif diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h new file mode 100644 index 0000000..8b8cf65 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h @@ -0,0 +1,39 @@ +/** + * @file lv_nuttx_profiler.h + * + */ + +#ifndef LV_NUTTX_PROFILER_H +#define LV_NUTTX_PROFILER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_profiler_init(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_PROFILER_H*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c new file mode 100644 index 0000000..5dc1196 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c @@ -0,0 +1,165 @@ +/** + * @file lv_nuttx_touchscreen.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_touchscreen.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_TOUCHSCREEN + +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + lv_indev_state_t last_state; + lv_indev_t * indev_drv; +} lv_nuttx_touchscreen_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data); +static void touchscreen_delete_cb(lv_event_t * e); +static lv_indev_t * touchscreen_init(int fd); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path) +{ + lv_indev_t * indev; + int fd; + + LV_ASSERT_NULL(dev_path); + LV_LOG_USER("touchscreen %s opening", dev_path); + fd = open(dev_path, O_RDONLY | O_NONBLOCK); + if(fd < 0) { + perror("Error: cannot open touchscreen device"); + return NULL; + } + + LV_LOG_USER("touchscreen %s open success", dev_path); + + indev = touchscreen_init(fd); + + if(indev == NULL) { + close(fd); + } + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data) +{ + lv_nuttx_touchscreen_t * touchscreen = drv->driver_data; + struct touch_sample_s sample; + + /* Read one sample */ + + int nbytes = read(touchscreen->fd, &sample, + sizeof(struct touch_sample_s)); + + /* Handle unexpected return values */ + + if(nbytes == sizeof(struct touch_sample_s)) { + uint8_t touch_flags = sample.point[0].flags; + + if(touch_flags & TOUCH_DOWN || touch_flags & TOUCH_MOVE) { + const lv_display_t * disp_drv = drv->disp; + int32_t ver_max = disp_drv->ver_res - 1; + int32_t hor_max = disp_drv->hor_res - 1; + + data->point.x = LV_CLAMP(0, sample.point[0].x, hor_max); + data->point.y = LV_CLAMP(0, sample.point[0].y, ver_max); + touchscreen->last_state = LV_INDEV_STATE_PRESSED; + } + else if(touch_flags & TOUCH_UP) { + touchscreen->last_state = LV_INDEV_STATE_RELEASED; + } + + /* Read until the last point */ + + data->continue_reading = true; + } + + data->state = touchscreen->last_state; +} + +static void touchscreen_delete_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_nuttx_touchscreen_t * touchscreen = lv_indev_get_driver_data(indev); + if(touchscreen) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + + if(touchscreen->fd >= 0) { + close(touchscreen->fd); + touchscreen->fd = -1; + } + lv_free(touchscreen); + LV_LOG_USER("done"); + } +} + +static lv_indev_t * touchscreen_init(int fd) +{ + lv_nuttx_touchscreen_t * touchscreen; + lv_indev_t * indev = NULL; + + touchscreen = lv_malloc_zeroed(sizeof(lv_nuttx_touchscreen_t)); + if(touchscreen == NULL) { + LV_LOG_ERROR("touchscreen_s malloc failed"); + return NULL; + } + + touchscreen->fd = fd; + touchscreen->last_state = LV_INDEV_STATE_RELEASED; + touchscreen->indev_drv = indev = lv_indev_create(); + + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, touchscreen_read); + lv_indev_set_driver_data(indev, touchscreen); + lv_indev_add_event_cb(indev, touchscreen_delete_cb, LV_EVENT_DELETE, indev); + return indev; +} + +#endif /*LV_USE_NUTTX_TOUCHSCREEN*/ + +#endif /* LV_USE_NUTTX*/ diff --git a/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h new file mode 100644 index 0000000..e0dd1f1 --- /dev/null +++ b/libraries/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h @@ -0,0 +1,57 @@ +/** + * @file lv_nuttx_touchscreen.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#ifndef LV_NUTTX_TOUCHSCREEN_H +#define LV_NUTTX_TOUCHSCREEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_TOUCHSCREEN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize indev with specified input device. + * @param dev_path path of input device + */ +lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX_TOUCHSCREEN */ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_TOUCHSCREEN_H */ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.c b/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.c new file mode 100644 index 0000000..ebff6a1 --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.c @@ -0,0 +1,218 @@ +/** + * @file lv_sdl_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_keyboard.h" +#if LV_USE_SDL + +#include "../../indev/lv_indev.h" +#include "../../core/lv_group.h" +#include "../../stdlib/lv_string.h" +#include LV_SDL_INCLUDE_PATH + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + char buf[KEYBOARD_BUFFER_SIZE]; + bool dummy_read; +} lv_sdl_keyboard_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data); +static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_keyboard_create(void) +{ + lv_sdl_keyboard_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_keyboard_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, sdl_keyboard_read); + lv_indev_set_driver_data(indev, dsc); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); + + const size_t len = lv_strlen(dev->buf); + + /*Send a release manually*/ + if(dev->dummy_read) { + dev->dummy_read = false; + data->state = LV_INDEV_STATE_RELEASED; + } + /*Send the pressed character*/ + else if(len > 0) { + dev->dummy_read = true; + data->state = LV_INDEV_STATE_PRESSED; + data->key = dev->buf[0]; + memmove(dev->buf, dev->buf + 1, len); + } +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); + if(dev) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dev); + LV_LOG_INFO("done"); + } +} + +void _lv_sdl_keyboard_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_KEYDOWN: + win_id = event->key.windowID; + break; + case SDL_TEXTINPUT: + win_id = event->text.windowID; + break; + default: + return; + } + + lv_display_t * disp = _lv_sdl_get_disp_from_win_id(win_id); + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_display(indev) == disp && lv_indev_get_type(indev) == LV_INDEV_TYPE_KEYPAD) { + break; + } + indev = lv_indev_get_next(indev); + } + + if(indev == NULL) return; + lv_sdl_keyboard_t * dsc = lv_indev_get_driver_data(indev); + + /* We only care about SDL_KEYDOWN and SDL_TEXTINPUT events */ + switch(event->type) { + case SDL_KEYDOWN: { /*Button press*/ + const uint32_t ctrl_key = keycode_to_ctrl_key(event->key.keysym.sym); + if(ctrl_key == '\0') + return; + const size_t len = lv_strlen(dsc->buf); + if(len < KEYBOARD_BUFFER_SIZE - 1) { + dsc->buf[len] = ctrl_key; + dsc->buf[len + 1] = '\0'; + } + break; + } + case SDL_TEXTINPUT: { /*Text input*/ + const size_t len = lv_strlen(dsc->buf) + lv_strlen(event->text.text); + if(len < KEYBOARD_BUFFER_SIZE - 1) + strcat(dsc->buf, event->text.text); + } + break; + default: + break; + + } + + size_t len = lv_strlen(dsc->buf); + while(len) { + lv_indev_read(indev); + + /*Call again to handle dummy read in `sdl_keyboard_read`*/ + lv_indev_read(indev); + len--; + } +} + +/** + * Convert a SDL key code to it's LV_KEY_* counterpart or return '\0' if it's not a control character. + * @param sdl_key the key code + * @return LV_KEY_* control character or '\0' + */ +static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key) +{ + /*Remap some key to LV_KEY_... to manage groups*/ + switch(sdl_key) { + case SDLK_RIGHT: + case SDLK_KP_PLUS: + return LV_KEY_RIGHT; + + case SDLK_LEFT: + case SDLK_KP_MINUS: + return LV_KEY_LEFT; + + case SDLK_UP: + return LV_KEY_UP; + + case SDLK_DOWN: + return LV_KEY_DOWN; + + case SDLK_ESCAPE: + return LV_KEY_ESC; + + case SDLK_BACKSPACE: + return LV_KEY_BACKSPACE; + + case SDLK_DELETE: + return LV_KEY_DEL; + + case SDLK_KP_ENTER: + case '\r': + return LV_KEY_ENTER; + + case SDLK_TAB: + case SDLK_PAGEDOWN: + return LV_KEY_NEXT; + + case SDLK_PAGEUP: + return LV_KEY_PREV; + + case SDLK_HOME: + return LV_KEY_HOME; + + case SDLK_END: + return LV_KEY_END; + + default: + return '\0'; + } +} + +#endif /*LV_USE_SDL*/ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.h b/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.h new file mode 100644 index 0000000..a18b09d --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_keyboard.h @@ -0,0 +1,46 @@ +/** + * @file lv_sdl_keyboard.h + * + */ + +#ifndef LV_SDL_KEYBOARD_H +#define LV_SDL_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ +#ifndef KEYBOARD_BUFFER_SIZE +#define KEYBOARD_BUFFER_SIZE 32 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_keyboard_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_KEYBOARD_H */ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.c b/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.c new file mode 100644 index 0000000..a6c1c69 --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.c @@ -0,0 +1,203 @@ +/** + * @file lv_sdl_mouse.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_mouse.h" +#if LV_USE_SDL + +#include "../../core/lv_group.h" +#include "../../stdlib/lv_string.h" + +#include LV_SDL_INCLUDE_PATH +/********************* + * DEFINES + *********************/ + +#ifndef KEYBOARD_BUFFER_SIZE + #define KEYBOARD_BUFFER_SIZE 32 +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +typedef struct { + int16_t last_x; + int16_t last_y; + bool left_button_down; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + int32_t diff; +#endif +} lv_sdl_mouse_t; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_mouse_create(void) +{ + lv_sdl_mouse_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mouse_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, sdl_mouse_read); + lv_indev_set_driver_data(indev, dsc); + + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); + + /*Store the collected data*/ + data->point.x = dsc->last_x; + data->point.y = dsc->last_y; + data->state = dsc->left_button_down ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + data->enc_diff = dsc->diff; + dsc->diff = 0; +#endif +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); + if(dsc) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dsc); + LV_LOG_INFO("done"); + } +} + +void _lv_sdl_mouse_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + win_id = event->button.windowID; + break; + case SDL_MOUSEMOTION: + win_id = event->motion.windowID; + break; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + case SDL_MOUSEWHEEL: + win_id = event->wheel.windowID; + break; +#endif + case SDL_FINGERUP: + case SDL_FINGERDOWN: + case SDL_FINGERMOTION: +#if SDL_VERSION_ATLEAST(2,0,12) + win_id = event->tfinger.windowID; +#endif + break; + case SDL_WINDOWEVENT: + win_id = event->window.windowID; + break; + default: + return; + } + + lv_display_t * disp = _lv_sdl_get_disp_from_win_id(win_id); + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_display(indev) == disp && lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER) { + break; + } + indev = lv_indev_get_next(indev); + } + + if(indev == NULL) return; + lv_sdl_mouse_t * indev_dev = lv_indev_get_driver_data(indev); + if(indev_dev == NULL) return; + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + uint8_t zoom = lv_sdl_window_get_zoom(disp); + + switch(event->type) { + case SDL_WINDOWEVENT: + if(event->window.event == SDL_WINDOWEVENT_LEAVE) { + indev_dev->left_button_down = false; + } + break; + case SDL_MOUSEBUTTONUP: + if(event->button.button == SDL_BUTTON_LEFT) + indev_dev->left_button_down = false; + break; + case SDL_WINDOWEVENT_LEAVE: + indev_dev->left_button_down = false; + break; + case SDL_MOUSEBUTTONDOWN: + if(event->button.button == SDL_BUTTON_LEFT) { + indev_dev->left_button_down = true; + indev_dev->last_x = event->motion.x / zoom; + indev_dev->last_y = event->motion.y / zoom; + } + break; + case SDL_MOUSEMOTION: + indev_dev->last_x = event->motion.x / zoom; + indev_dev->last_y = event->motion.y / zoom; + break; + + case SDL_FINGERUP: + indev_dev->left_button_down = false; + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_FINGERDOWN: + indev_dev->left_button_down = true; + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_FINGERMOTION: + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_MOUSEWHEEL: +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN +#ifdef __EMSCRIPTEN__ + /*Escripten scales it wrong*/ + if(event->wheel.y < 0) dsc->diff++; + if(event->wheel.y > 0) dsc->diff--; +#else + indev_dev->diff = -event->wheel.y; +#endif /*__EMSCRIPTEN__*/ +#endif /*LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN*/ + break; + } + lv_indev_read(indev); +} + +#endif /*LV_USE_SDL*/ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.h b/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.h new file mode 100644 index 0000000..02e9b57 --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_mouse.h @@ -0,0 +1,43 @@ +/** + * @file Lv_sdl_mouse.h + * + */ + +#ifndef LV_SDL_MOUSE_H +#define LV_SDL_MOUSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_mouse_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_MOUSE_H */ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c b/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c new file mode 100644 index 0000000..f331e37 --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c @@ -0,0 +1,142 @@ +/** + * @file lv_sdl_mousewheel.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_mousewheel.h" +#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + +#include "../../core/lv_group.h" +#include "../../indev/lv_indev_private.h" +#include "../../stdlib/lv_string.h" +#include LV_SDL_INCLUDE_PATH + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +typedef struct { + int16_t diff; + lv_indev_state_t state; +} lv_sdl_mousewheel_t; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_mousewheel_create(void) +{ + lv_sdl_mousewheel_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mousewheel_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev, sdl_mousewheel_read); + lv_indev_set_driver_data(indev, dsc); + + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + + data->state = dsc->state; + data->enc_diff = dsc->diff; + dsc->diff = 0; +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + if(dsc) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dsc); + LV_LOG_INFO("done"); + } +} + +void _lv_sdl_mousewheel_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_MOUSEWHEEL: + win_id = event->wheel.windowID; + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + win_id = event->button.windowID; + break; + default: + return; + } + + lv_display_t * disp = _lv_sdl_get_disp_from_win_id(win_id); + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_display(indev) == disp && lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + break; + } + indev = lv_indev_get_next(indev); + } + + if(indev == NULL) return; + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + + switch(event->type) { + case SDL_MOUSEWHEEL: +#ifdef __EMSCRIPTEN__ + /*Escripten scales it wrong*/ + if(event->wheel.y < 0) dsc->diff++; + if(event->wheel.y > 0) dsc->diff--; +#else + dsc->diff = -event->wheel.y; +#endif + break; + case SDL_MOUSEBUTTONDOWN: + if(event->button.button == SDL_BUTTON_MIDDLE) { + dsc->state = LV_INDEV_STATE_PRESSED; + } + break; + case SDL_MOUSEBUTTONUP: + if(event->button.button == SDL_BUTTON_MIDDLE) { + dsc->state = LV_INDEV_STATE_RELEASED; + } + break; + default: + break; + } + lv_indev_read(indev); +} + +#endif /*LV_USE_SDL*/ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h b/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h new file mode 100644 index 0000000..7ca34bd --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h @@ -0,0 +1,43 @@ +/** + * @file lv_sdl_mousewheel.h + * + */ + +#ifndef LV_SDL_MOUSEWHEEL_H +#define LV_SDL_MOUSEWHEEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_mousewheel_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DEV_SDL_MOUSEWHEEL_H */ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_window.c b/libraries/lvgl/src/drivers/sdl/lv_sdl_window.c new file mode 100644 index 0000000..b430066 --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_window.c @@ -0,0 +1,427 @@ +/** + * @file lv_sdl_window.h + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL +#include +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" +#include "../../lv_init.h" + +#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ +#include LV_SDL_INCLUDE_PATH + +#if LV_USE_DRAW_SDL + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + SDL_Window * window; + SDL_Renderer * renderer; +#if LV_USE_DRAW_SDL == 0 + SDL_Texture * texture; + uint8_t * fb1; + uint8_t * fb2; + uint8_t * fb_act; + uint8_t * buf1; + uint8_t * buf2; +#endif + uint8_t zoom; + uint8_t ignore_size_chg; +} lv_sdl_window_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static void window_create(lv_display_t * disp); +static void window_update(lv_display_t * disp); +#if LV_USE_DRAW_SDL == 0 + static void texture_resize(lv_display_t * disp); +#endif +static void sdl_event_handler(lv_timer_t * t); +static void release_disp_cb(lv_event_t * e); + +/*********************** + * GLOBAL PROTOTYPES + ***********************/ +lv_display_t * _lv_sdl_get_disp_from_win_id(uint32_t win_id); +void _lv_sdl_mouse_handler(SDL_Event * event); +void _lv_sdl_mousewheel_handler(SDL_Event * event); +void _lv_sdl_keyboard_handler(SDL_Event * event); +static void res_chg_event_cb(lv_event_t * e); + +static bool inited = false; + +/********************** + * STATIC VARIABLES + **********************/ +static lv_timer_t * event_handler_timer; + +#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) +{ + if(!inited) { + SDL_Init(SDL_INIT_VIDEO); + SDL_StartTextInput(); + event_handler_timer = lv_timer_create(sdl_event_handler, 5, NULL); + lv_tick_set_cb(SDL_GetTicks); + +#if LV_USE_DRAW_SDL + if(!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { + fprintf(stderr, "could not initialize sdl2_image: %s\n", IMG_GetError()); + return NULL; + } +#endif + + inited = true; + } + + lv_sdl_window_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_window_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); + lv_display_set_driver_data(disp, dsc); + window_create(disp); + + lv_display_set_flush_cb(disp, flush_cb); + +#if LV_USE_DRAW_SDL == 0 + if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + dsc->buf1 = malloc(32 * 1024); +#if LV_SDL_BUF_COUNT == 2 + dsc->buf2 = malloc(32 * 1024); +#endif + lv_display_set_buffers(disp, dsc->buf1, dsc->buf2, + 32 * 1024, LV_DISPLAY_RENDER_MODE_PARTIAL); + } + /*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */ + else { + uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp), + lv_display_get_color_format(disp)); + lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * lv_display_get_vertical_resolution(disp), + LV_SDL_RENDER_MODE); + } +#else /*/*LV_USE_DRAW_SDL == 1*/ + uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp), + lv_display_get_color_format(disp)); + /*It will render directly to default Texture, so the buffer is not used, so just set something*/ + static uint8_t dummy_buf[1]; + lv_display_set_buffers(disp, dummy_buf, NULL, stride * lv_display_get_vertical_resolution(disp), + LV_SDL_RENDER_MODE); +#endif /*LV_USE_DRAW_SDL == 0*/ + lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + + return disp; +} + +void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_SetWindowResizable(dsc->window, value); +} + +void lv_sdl_window_set_zoom(lv_display_t * disp, uint8_t zoom) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + dsc->zoom = zoom; + lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_refr_now(disp); +} + +uint8_t lv_sdl_window_get_zoom(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + return dsc->zoom; +} + +lv_display_t * _lv_sdl_get_disp_from_win_id(uint32_t win_id) +{ + lv_display_t * disp = lv_display_get_next(NULL); + if(win_id == UINT32_MAX) return disp; + + while(disp) { + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(SDL_GetWindowID(dsc->window) == win_id) { + return disp; + } + disp = lv_display_get_next(disp); + } + return NULL; +} + +void lv_sdl_window_set_title(lv_display_t * disp, const char * title) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_SetWindowTitle(dsc->window, title); +} + +void * lv_sdl_window_get_renderer(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + return dsc->renderer; +} + +void lv_sdl_quit() +{ + if(inited) { + SDL_Quit(); + lv_timer_delete(event_handler_timer); + event_handler_timer = NULL; + inited = false; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ +#if LV_USE_DRAW_SDL == 0 + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + int32_t y; + uint8_t * fb_tmp = dsc->fb_act; + uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); + uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), lv_display_get_color_format(disp)); + uint32_t data_size = lv_area_get_width(area) * px_size; + int32_t fb_stride = lv_display_get_horizontal_resolution(disp) * px_size; + fb_tmp += area->y1 * fb_stride; + fb_tmp += area->x1 * px_size; + for(y = area->y1; y <= area->y2; y++) { + lv_memcpy(fb_tmp, px_map, data_size); + px_map += px_map_stride; + fb_tmp += fb_stride; + } + } + /* TYPICALLY YOU DO NOT NEED THIS + * If it was the last part to refresh update the texture of the window.*/ + if(lv_display_flush_is_last(disp)) { + if(LV_SDL_RENDER_MODE != LV_DISPLAY_RENDER_MODE_PARTIAL) { + dsc->fb_act = px_map; + } + window_update(disp); + } +#else + if(lv_display_flush_is_last(disp)) { + window_update(disp); + } +#endif /*LV_USE_DRAW_SDL == 0*/ + + /*IMPORTANT! It must be called to tell the system the flush is ready*/ + lv_display_flush_ready(disp); +} + +/** + * SDL main thread. All SDL related task have to be handled here! + * It initializes SDL, handles drawing and the mouse. + */ +static void sdl_event_handler(lv_timer_t * t) +{ + LV_UNUSED(t); + + /*Refresh handling*/ + SDL_Event event; + while(SDL_PollEvent(&event)) { + _lv_sdl_mouse_handler(&event); +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + _lv_sdl_mousewheel_handler(&event); +#endif + _lv_sdl_keyboard_handler(&event); + + if(event.type == SDL_WINDOWEVENT) { + lv_display_t * disp = _lv_sdl_get_disp_from_win_id(event.window.windowID); + if(disp == NULL) continue; + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + + switch(event.window.event) { +#if SDL_VERSION_ATLEAST(2, 0, 5) + case SDL_WINDOWEVENT_TAKE_FOCUS: +#endif + case SDL_WINDOWEVENT_EXPOSED: + window_update(disp); + break; + case SDL_WINDOWEVENT_RESIZED: + dsc->ignore_size_chg = 1; + lv_display_set_resolution(disp, event.window.data1 / dsc->zoom, event.window.data2 / dsc->zoom); + dsc->ignore_size_chg = 0; + lv_refr_now(disp); + break; + case SDL_WINDOWEVENT_CLOSE: + lv_display_delete(disp); + break; + default: + break; + } + } + if(event.type == SDL_QUIT) { + SDL_Quit(); + lv_deinit(); + inited = false; +#if LV_SDL_DIRECT_EXIT + exit(0); +#endif + } + } +} + +static void window_create(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + dsc->zoom = 1; + + int flag = SDL_WINDOW_RESIZABLE; +#if LV_SDL_FULLSCREEN + flag |= SDL_WINDOW_FULLSCREEN; +#endif + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + dsc->window = SDL_CreateWindow("LVGL Simulator", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ + + dsc->renderer = SDL_CreateRenderer(dsc->window, -1, SDL_RENDERER_SOFTWARE); +#if LV_USE_DRAW_SDL == 0 + texture_resize(disp); + + uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp)); + lv_memset(dsc->fb1, 0xff, hor_res * ver_res * px_size); +#if LV_SDL_BUF_COUNT == 2 + lv_memset(dsc->fb2, 0xff, hor_res * ver_res * px_size); +#endif +#endif /*LV_USE_DRAW_SDL == 0*/ + /*Some platforms (e.g. Emscripten) seem to require setting the size again */ + SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom); +#if LV_USE_DRAW_SDL == 0 + texture_resize(disp); +#endif /*LV_USE_DRAW_SDL == 0*/ +} + +static void window_update(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); +#if LV_USE_DRAW_SDL == 0 + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp)); + SDL_UpdateTexture(dsc->texture, NULL, dsc->fb_act, stride); + + SDL_RenderClear(dsc->renderer); + + /*Update the renderer with the texture containing the rendered image*/ + SDL_RenderCopy(dsc->renderer, dsc->texture, NULL, NULL); +#endif + SDL_RenderPresent(dsc->renderer); +} + +#if LV_USE_DRAW_SDL == 0 +static void texture_resize(lv_display_t * disp) +{ + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp)); + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + + dsc->fb1 = realloc(dsc->fb1, stride * ver_res); + memset(dsc->fb1, 0x00, stride * ver_res); + + if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + dsc->fb_act = dsc->fb1; + } + else { +#if LV_SDL_BUF_COUNT == 2 + dsc->fb2 = realloc(dsc->fb2, stride * ver_res); + memset(dsc->fb2, 0x00, stride * ver_res); +#endif + lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * ver_res, LV_SDL_RENDER_MODE); + } + if(dsc->texture) SDL_DestroyTexture(dsc->texture); + +#if LV_COLOR_DEPTH == 32 + SDL_PixelFormatEnum px_format = + SDL_PIXELFORMAT_RGB888; /*same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions*/ +#elif LV_COLOR_DEPTH == 24 + SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_BGR24; +#elif LV_COLOR_DEPTH == 16 + SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565; +#else +#error("Unsupported color format") +#endif + // px_format = SDL_PIXELFORMAT_BGR24; + + dsc->texture = SDL_CreateTexture(dsc->renderer, px_format, + SDL_TEXTUREACCESS_STATIC, hor_res, ver_res); + SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND); +} +#endif + +static void res_chg_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_current_target(e); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc->ignore_size_chg == false) { + SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom); + } + +#if LV_USE_DRAW_SDL == 0 + texture_resize(disp); +#endif +} + +static void release_disp_cb(lv_event_t * e) +{ + if(lv_deinit_in_progress) { + lv_sdl_quit(); + } + + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); +#if LV_USE_DRAW_SDL == 0 + SDL_DestroyTexture(dsc->texture); +#endif + SDL_DestroyRenderer(dsc->renderer); + SDL_DestroyWindow(dsc->window); +#if LV_USE_DRAW_SDL == 0 + if(dsc->fb1) free(dsc->fb1); + if(dsc->fb2) free(dsc->fb2); + if(dsc->buf1) free(dsc->buf1); + if(dsc->buf2) free(dsc->buf2); +#endif + lv_free(dsc); + lv_display_set_driver_data(disp, NULL); +} + +#endif /*LV_USE_SDL*/ diff --git a/libraries/lvgl/src/drivers/sdl/lv_sdl_window.h b/libraries/lvgl/src/drivers/sdl/lv_sdl_window.h new file mode 100644 index 0000000..4a3901f --- /dev/null +++ b/libraries/lvgl/src/drivers/sdl/lv_sdl_window.h @@ -0,0 +1,64 @@ +/** + * @file lv_sdl_window.h + * + */ + +#ifndef LV_SDL_DISP_H +#define LV_SDL_DISP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ + +/* Possible values of LV_SDL_MOUSEWHEEL_MODE */ +#define LV_SDL_MOUSEWHEEL_MODE_ENCODER 0 /* The mousewheel emulates an encoder input device*/ +#define LV_SDL_MOUSEWHEEL_MODE_CROWN 1 /* The mousewheel emulates a smart watch crown*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res); + +void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value); + +void lv_sdl_window_set_zoom(lv_display_t * disp, uint8_t zoom); + +uint8_t lv_sdl_window_get_zoom(lv_display_t * disp); + +lv_display_t * _lv_sdl_get_disp_from_win_id(uint32_t win_id); + +void lv_sdl_window_set_title(lv_display_t * disp, const char * title); + +void * lv_sdl_window_get_renderer(lv_display_t * disp); + +void lv_sdl_quit(); + +/********************** + * MACROS + **********************/ + +#endif /* LV_DRV_SDL */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_DISP_H */ diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_context.c b/libraries/lvgl/src/drivers/windows/lv_windows_context.c new file mode 100644 index 0000000..1479d0f --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_context.c @@ -0,0 +1,699 @@ +/** + * @file lv_windows_context.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_context.h" +#if LV_USE_WINDOWS + +#include "lv_windows_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t lv_windows_tick_count_callback(void); + +static void lv_windows_delay_callback(uint32_t ms); + +static void lv_windows_check_display_existence_timer_callback( + lv_timer_t * timer); + +static LRESULT CALLBACK lv_windows_window_message_callback( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +bool lv_windows_pointer_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +bool lv_windows_keypad_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +bool lv_windows_encoder_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_windows_platform_init(void) +{ + lv_tick_set_cb(lv_windows_tick_count_callback); + + lv_delay_set_cb(lv_windows_delay_callback); + + lv_timer_create( + lv_windows_check_display_existence_timer_callback, + 200, + NULL); + + // Try to ensure the default group exists. + { + lv_group_t * default_group = lv_group_get_default(); + if(!default_group) { + default_group = lv_group_create(); + if(default_group) { + lv_group_set_default(default_group); + } + } + } + + WNDCLASSEXW window_class; + lv_memzero(&window_class, sizeof(WNDCLASSEXW)); + window_class.cbSize = sizeof(WNDCLASSEXW); + window_class.style = 0; + window_class.lpfnWndProc = lv_windows_window_message_callback; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = NULL; + window_class.hIcon = NULL; + window_class.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); + window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + window_class.lpszMenuName = NULL; + window_class.lpszClassName = L"LVGL.Window"; + window_class.hIconSm = NULL; + LV_ASSERT(RegisterClassExW(&window_class)); +} + +lv_windows_window_context_t * lv_windows_get_window_context( + HWND window_handle) +{ + return (lv_windows_window_context_t *)( + GetPropW(window_handle, L"LVGL.Window.Context")); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t lv_windows_tick_count_callback(void) +{ + LARGE_INTEGER Frequency; + if(QueryPerformanceFrequency(&Frequency)) { + LARGE_INTEGER PerformanceCount; + if(QueryPerformanceCounter(&PerformanceCount)) { + return (uint32_t)(PerformanceCount.QuadPart * 1000 / Frequency.QuadPart); + } + } + + return (uint32_t)GetTickCount64(); +} + +static void lv_windows_delay_callback(uint32_t ms) +{ + HANDLE timer_handle = CreateWaitableTimerExW( + NULL, + NULL, + CREATE_WAITABLE_TIMER_MANUAL_RESET | + CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, + TIMER_ALL_ACCESS); + if(timer_handle) { + LARGE_INTEGER due_time; + due_time.QuadPart = -((int64_t)ms) * 1000 * 10; + SetWaitableTimer(timer_handle, &due_time, 0, NULL, NULL, FALSE); + WaitForSingleObject(timer_handle, INFINITE); + + CloseHandle(timer_handle); + } +} + +static void lv_windows_check_display_existence_timer_callback( + lv_timer_t * timer) +{ + if(!lv_display_get_next(NULL)) { + // Don't use lv_deinit() due to it will cause exception when parallel + // rendering is enabled. + exit(0); + } +} + +static HDC lv_windows_create_frame_buffer( + HWND window_handle, + LONG width, + LONG height, + UINT32 ** pixel_buffer, + SIZE_T * pixel_buffer_size) +{ + HDC frame_buffer_dc_handle = NULL; + + LV_ASSERT_NULL(pixel_buffer); + LV_ASSERT_NULL(pixel_buffer_size); + + HDC window_dc_handle = GetDC(window_handle); + if(window_dc_handle) { + frame_buffer_dc_handle = CreateCompatibleDC(window_dc_handle); + ReleaseDC(window_handle, window_dc_handle); + } + + if(frame_buffer_dc_handle) { +#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) + BITMAPINFO bitmap_info = { 0 }; +#elif (LV_COLOR_DEPTH == 16) + typedef struct _BITMAPINFO_16BPP { + BITMAPINFOHEADER bmiHeader; + DWORD bmiColorMask[3]; + } BITMAPINFO_16BPP, * PBITMAPINFO_16BPP; + + BITMAPINFO_16BPP bitmap_info = { 0 }; +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmap_info.bmiHeader.biWidth = width; + bitmap_info.bmiHeader.biHeight = -height; + bitmap_info.bmiHeader.biPlanes = 1; + bitmap_info.bmiHeader.biBitCount = lv_color_format_get_bpp( + LV_COLOR_FORMAT_NATIVE); +#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) + bitmap_info.bmiHeader.biCompression = BI_RGB; +#elif (LV_COLOR_DEPTH == 16) + bitmap_info.bmiHeader.biCompression = BI_BITFIELDS; + bitmap_info.bmiColorMask[0] = 0xF800; + bitmap_info.bmiColorMask[1] = 0x07E0; + bitmap_info.bmiColorMask[2] = 0x001F; +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + HBITMAP hBitmap = CreateDIBSection( + frame_buffer_dc_handle, + (PBITMAPINFO)(&bitmap_info), + DIB_RGB_COLORS, + (void **)pixel_buffer, + NULL, + 0); + if(hBitmap) { + *pixel_buffer_size = width * height; + *pixel_buffer_size *= lv_color_format_get_size( + LV_COLOR_FORMAT_NATIVE); + + DeleteObject(SelectObject(frame_buffer_dc_handle, hBitmap)); + DeleteObject(hBitmap); + } + else { + DeleteDC(frame_buffer_dc_handle); + frame_buffer_dc_handle = NULL; + } + } + + return frame_buffer_dc_handle; +} + +static void lv_windows_display_timer_callback(lv_timer_t * timer) +{ + lv_windows_window_context_t * context = lv_timer_get_user_data(timer); + LV_ASSERT_NULL(context); + + if(!context->display_resolution_changed) { + return; + } + + lv_display_set_resolution( + context->display_device_object, + context->requested_display_resolution.x, + context->requested_display_resolution.y); + + int32_t hor_res = lv_display_get_horizontal_resolution( + context->display_device_object); + int32_t ver_res = lv_display_get_vertical_resolution( + context->display_device_object); + + HWND window_handle = lv_windows_get_display_window_handle( + context->display_device_object); + if(window_handle) { + if(context->display_framebuffer_context_handle) { + context->display_framebuffer_base = NULL; + context->display_framebuffer_size = 0; + DeleteDC(context->display_framebuffer_context_handle); + context->display_framebuffer_context_handle = NULL; + } + + context->display_framebuffer_context_handle = + lv_windows_create_frame_buffer( + window_handle, + hor_res, + ver_res, + &context->display_framebuffer_base, + &context->display_framebuffer_size); + if(context->display_framebuffer_context_handle) { + lv_display_set_buffers( + context->display_device_object, + context->display_framebuffer_base, + NULL, + context->display_framebuffer_size, + LV_DISPLAY_RENDER_MODE_DIRECT); + } + } + + context->display_resolution_changed = false; + context->requested_display_resolution.x = 0; + context->requested_display_resolution.y = 0; +} + +static void lv_windows_display_driver_flush_callback( + lv_display_t * display, + const lv_area_t * area, + uint8_t * px_map) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + lv_display_flush_ready(display); + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + lv_display_flush_ready(display); + return; + } + + if(lv_display_flush_is_last(display)) { +#if (LV_COLOR_DEPTH == 32) || \ + (LV_COLOR_DEPTH == 24) || \ + (LV_COLOR_DEPTH == 16) + UNREFERENCED_PARAMETER(px_map); +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + HDC hdc = GetDC(window_handle); + if(hdc) { + SetStretchBltMode(hdc, HALFTONE); + + RECT client_rect; + GetClientRect(window_handle, &client_rect); + + int32_t width = lv_windows_zoom_to_logical( + client_rect.right - client_rect.left, + context->zoom_level); + int32_t height = lv_windows_zoom_to_logical( + client_rect.bottom - client_rect.top, + context->zoom_level); + if(context->simulator_mode) { + width = lv_windows_dpi_to_logical(width, context->window_dpi); + height = lv_windows_dpi_to_logical(height, context->window_dpi); + } + + StretchBlt( + hdc, + client_rect.left, + client_rect.top, + client_rect.right - client_rect.left, + client_rect.bottom - client_rect.top, + context->display_framebuffer_context_handle, + 0, + 0, + width, + height, + SRCCOPY); + + ReleaseDC(window_handle, hdc); + } + } + + lv_display_flush_ready(display); +} + +static UINT lv_windows_get_dpi_for_window(HWND window_handle) +{ + UINT result = (UINT)(-1); + + HMODULE module_handle = LoadLibraryW(L"SHCore.dll"); + if(module_handle) { + typedef enum MONITOR_DPI_TYPE_PRIVATE { + MDT_EFFECTIVE_DPI = 0, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, + MDT_DEFAULT = MDT_EFFECTIVE_DPI + } MONITOR_DPI_TYPE_PRIVATE; + + typedef HRESULT(WINAPI * function_type)( + HMONITOR, MONITOR_DPI_TYPE_PRIVATE, UINT *, UINT *); + + function_type function = (function_type)( + GetProcAddress(module_handle, "GetDpiForMonitor")); + if(function) { + HMONITOR MonitorHandle = MonitorFromWindow( + window_handle, + MONITOR_DEFAULTTONEAREST); + + UINT dpiX = 0; + UINT dpiY = 0; + if(SUCCEEDED(function( + MonitorHandle, + MDT_EFFECTIVE_DPI, + &dpiX, + &dpiY))) { + result = dpiX; + } + } + + FreeLibrary(module_handle); + } + + if(result == (UINT)(-1)) { + HDC hWindowDC = GetDC(window_handle); + if(hWindowDC) { + result = GetDeviceCaps(hWindowDC, LOGPIXELSX); + ReleaseDC(window_handle, hWindowDC); + } + } + + if(result == (UINT)(-1)) { + result = USER_DEFAULT_SCREEN_DPI; + } + + return result; +} + +static BOOL lv_windows_register_touch_window( + HWND window_handle, + ULONG flags) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, ULONG); + + function_type function = (function_type)( + GetProcAddress(module_handle, "RegisterTouchWindow")); + if(!function) { + return FALSE; + } + + return function(window_handle, flags); +} + +static BOOL lv_windows_enable_child_window_dpi_message( + HWND WindowHandle) +{ + // The private Per-Monitor DPI Awareness support extension is Windows 10 + // only. We don't need the private Per-Monitor DPI Awareness support + // extension if the Per-Monitor (V2) DPI Awareness exists. + OSVERSIONINFOEXW os_version_info_ex = { 0 }; + os_version_info_ex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); + os_version_info_ex.dwMajorVersion = 10; + os_version_info_ex.dwMinorVersion = 0; + os_version_info_ex.dwBuildNumber = 14986; + if(!VerifyVersionInfoW( + &os_version_info_ex, + VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask( + 0, + VER_MAJORVERSION, + VER_GREATER_EQUAL), + VER_MINORVERSION, + VER_GREATER_EQUAL), + VER_BUILDNUMBER, + VER_LESS))) { + return FALSE; + } + + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, BOOL); + + function_type function = (function_type)( + GetProcAddress(module_handle, "EnableChildWindowDpiMessage")); + if(!function) { + return FALSE; + } + + return function(WindowHandle, TRUE); +} + +static LRESULT CALLBACK lv_windows_window_message_callback( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_CREATE: { + // Note: Return -1 directly because WM_DESTROY message will be sent + // when destroy the window automatically. We free the resource when + // processing the WM_DESTROY message of this window. + + lv_windows_create_display_data_t * data = + (lv_windows_create_display_data_t *)( + ((LPCREATESTRUCTW)(lParam))->lpCreateParams); + if(!data) { + return -1; + } + + lv_windows_window_context_t * context = + (lv_windows_window_context_t *)(HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(lv_windows_window_context_t))); + if(!context) { + return -1; + } + + if(!SetPropW(hWnd, L"LVGL.Window.Context", (HANDLE)(context))) { + return -1; + } + + context->window_dpi = lv_windows_get_dpi_for_window(hWnd); + context->zoom_level = data->zoom_level; + context->allow_dpi_override = data->allow_dpi_override; + context->simulator_mode = data->simulator_mode; + + context->display_timer_object = lv_timer_create( + lv_windows_display_timer_callback, + LV_DEF_REFR_PERIOD, + context); + + context->display_resolution_changed = false; + context->requested_display_resolution.x = 0; + context->requested_display_resolution.y = 0; + + context->display_device_object = lv_display_create(0, 0); + if(!context->display_device_object) { + return -1; + } + RECT request_content_size; + GetWindowRect(hWnd, &request_content_size); + lv_display_set_resolution( + context->display_device_object, + request_content_size.right - request_content_size.left, + request_content_size.bottom - request_content_size.top); + lv_display_set_flush_cb( + context->display_device_object, + lv_windows_display_driver_flush_callback); + lv_display_set_driver_data( + context->display_device_object, + hWnd); + if(!context->allow_dpi_override) { + lv_display_set_dpi( + context->display_device_object, + context->window_dpi); + } + + if(context->simulator_mode) { + context->display_resolution_changed = true; + context->requested_display_resolution.x = + lv_display_get_horizontal_resolution( + context->display_device_object); + context->requested_display_resolution.y = + lv_display_get_vertical_resolution( + context->display_device_object); + } + + lv_windows_register_touch_window(hWnd, 0); + + lv_windows_enable_child_window_dpi_message(hWnd); + + break; + } + case WM_SIZE: { + if(wParam != SIZE_MINIMIZED) { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + if(!context->simulator_mode) { + context->display_resolution_changed = true; + context->requested_display_resolution.x = LOWORD(lParam); + context->requested_display_resolution.y = HIWORD(lParam); + } + else { + int32_t window_width = lv_windows_dpi_to_physical( + lv_windows_zoom_to_physical( + lv_display_get_horizontal_resolution( + context->display_device_object), + context->zoom_level), + context->window_dpi); + int32_t window_height = lv_windows_dpi_to_physical( + lv_windows_zoom_to_physical( + lv_display_get_vertical_resolution( + context->display_device_object), + context->zoom_level), + context->window_dpi); + + RECT window_rect; + GetWindowRect(hWnd, &window_rect); + + RECT client_rect; + GetClientRect(hWnd, &client_rect); + + int32_t original_window_width = + window_rect.right - window_rect.left; + int32_t original_window_height = + window_rect.bottom - window_rect.top; + + int32_t original_client_width = + client_rect.right - client_rect.left; + int32_t original_client_height = + client_rect.bottom - client_rect.top; + + int32_t reserved_width = + original_window_width - original_client_width; + int32_t reserved_height = + original_window_height - original_client_height; + + SetWindowPos( + hWnd, + NULL, + 0, + 0, + reserved_width + window_width, + reserved_height + window_height, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); + } + } + } + break; + } + case WM_DPICHANGED: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->window_dpi = HIWORD(wParam); + + if(!context->allow_dpi_override) { + lv_display_set_dpi( + context->display_device_object, + context->window_dpi); + } + + LPRECT suggested_rect = (LPRECT)lParam; + + SetWindowPos( + hWnd, + NULL, + suggested_rect->left, + suggested_rect->top, + suggested_rect->right, + suggested_rect->bottom, + SWP_NOZORDER | SWP_NOACTIVATE); + } + + break; + } + case WM_ERASEBKGND: { + return TRUE; + } + case WM_DESTROY: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + RemovePropW(hWnd, L"LVGL.Window.Context")); + if(context) { + lv_display_t * display_device_object = + context->display_device_object; + context->display_device_object = NULL; + lv_display_delete(display_device_object); + DeleteDC(context->display_framebuffer_context_handle); + + lv_timer_delete(context->display_timer_object); + + HeapFree(GetProcessHeap(), 0, context); + } + + PostQuitMessage(0); + + break; + } + default: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + LRESULT lResult = 0; + if(context->pointer.indev && + lv_windows_pointer_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + &lResult)) { + return lResult; + } + else if(context->keypad.indev && + lv_windows_keypad_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + &lResult)) { + return lResult; + } + else if(context->encoder.indev && + lv_windows_encoder_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + &lResult)) { + return lResult; + } + } + + return DefWindowProcW(hWnd, uMsg, wParam, lParam); + } + } + + return 0; +} + +#endif // LV_USE_WINDOWS diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_context.h b/libraries/lvgl/src/drivers/windows/lv_windows_context.h new file mode 100644 index 0000000..20e72af --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_context.h @@ -0,0 +1,123 @@ +/** + * @file lv_windows_context.h + * + */ + +#ifndef LV_WINDOWS_CONTEXT_H +#define LV_WINDOWS_CONTEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_windows_pointer_context_t { + lv_indev_state_t state; + lv_point_t point; + lv_indev_t * indev; +} lv_windows_pointer_context_t; + +typedef struct _lv_windows_keypad_queue_item_t { + uint32_t key; + lv_indev_state_t state; +} lv_windows_keypad_queue_item_t; + +typedef struct _lv_windows_keypad_context_t { + CRITICAL_SECTION mutex; + lv_ll_t queue; + uint16_t utf16_high_surrogate; + uint16_t utf16_low_surrogate; + lv_indev_t * indev; +} lv_windows_keypad_context_t; + +typedef struct _lv_windows_encoder_context_t { + lv_indev_state_t state; + int16_t enc_diff; + lv_indev_t * indev; +} lv_windows_encoder_context_t; + +typedef struct _lv_windows_window_context_t { + lv_display_t * display_device_object; + lv_timer_t * display_timer_object; + + int32_t window_dpi; + int32_t zoom_level; + bool allow_dpi_override; + bool simulator_mode; + bool display_resolution_changed; + lv_point_t requested_display_resolution; + + HDC display_framebuffer_context_handle; + uint32_t * display_framebuffer_base; + size_t display_framebuffer_size; + + lv_windows_pointer_context_t pointer; + lv_windows_keypad_context_t keypad; + lv_windows_encoder_context_t encoder; + +} lv_windows_window_context_t; + +typedef struct _lv_windows_create_display_data_t { + const wchar_t * title; + int32_t hor_res; + int32_t ver_res; + int32_t zoom_level; + bool allow_dpi_override; + bool simulator_mode; + HANDLE mutex; + lv_display_t * display; +} lv_windows_create_display_data_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the LVGL Windows backend. + * @remark This is a private API which is used for LVGL Windows backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_init. +*/ +void lv_windows_platform_init(void); + +/** + * @brief Get the window context from specific LVGL display window. + * @param window_handle The window handle of specific LVGL display window. + * @return The window context from specific LVGL display window. + * @remark This is a private API which is used for LVGL Windows backend + * implementation. LVGL users shouldn't use that because the + * maintainer doesn't promise the application binary interface + * compatibility for this API. +*/ +lv_windows_window_context_t * lv_windows_get_window_context( + HWND window_handle); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_CONTEXT_H*/ diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_display.c b/libraries/lvgl/src/drivers/windows/lv_windows_display.c new file mode 100644 index 0000000..a13d76f --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_display.c @@ -0,0 +1,181 @@ +/** + * @file lv_windows_display.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_display.h" +#if LV_USE_WINDOWS + +#include "lv_windows_context.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static unsigned int __stdcall lv_windows_display_thread_entrypoint( + void * parameter); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_windows_create_display( + const wchar_t * title, + int32_t hor_res, + int32_t ver_res, + int32_t zoom_level, + bool allow_dpi_override, + bool simulator_mode) +{ + lv_windows_create_display_data_t data; + + lv_memzero(&data, sizeof(lv_windows_create_display_data_t)); + data.title = title; + data.hor_res = hor_res; + data.ver_res = ver_res; + data.zoom_level = zoom_level; + data.allow_dpi_override = allow_dpi_override; + data.simulator_mode = simulator_mode; + data.mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); + data.display = NULL; + if(!data.mutex) { + return NULL; + } + + HANDLE thread = (HANDLE)_beginthreadex( + NULL, + 0, + lv_windows_display_thread_entrypoint, + &data, + 0, + NULL); + LV_ASSERT(thread); + + WaitForSingleObjectEx(data.mutex, INFINITE, FALSE); + + if(thread) { + CloseHandle(thread); + } + + if(data.mutex) { + CloseHandle(data.mutex); + } + + return data.display; +} + +HWND lv_windows_get_display_window_handle(lv_display_t * display) +{ + return (HWND)lv_display_get_driver_data(display); +} + +int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level) +{ + return MulDiv(physical, LV_WINDOWS_ZOOM_BASE_LEVEL, zoom_level); +} + +int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level) +{ + return MulDiv(logical, zoom_level, LV_WINDOWS_ZOOM_BASE_LEVEL); +} + +int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi) +{ + return MulDiv(physical, USER_DEFAULT_SCREEN_DPI, dpi); +} + +int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi) +{ + return MulDiv(logical, dpi, USER_DEFAULT_SCREEN_DPI); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static unsigned int __stdcall lv_windows_display_thread_entrypoint( + void * parameter) +{ + lv_windows_create_display_data_t * data = parameter; + LV_ASSERT_NULL(data); + + DWORD window_style = WS_OVERLAPPEDWINDOW; + if(data->simulator_mode) { + window_style &= ~(WS_SIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME); + } + + RECT WindowRectangle = { 0, 0, data->hor_res, data->ver_res }; //added by SquareLine team to accomodate for wished initial client area + AdjustWindowRectEx(&WindowRectangle, window_style, FALSE, 0); //(this still gives a bit (about 4 pixels) less area due to cca. 2-pixel resize-borders), see below for further improvement + + HWND window_handle = CreateWindowExW( + WS_EX_CLIENTEDGE, + L"LVGL.Window", + data->title, + window_style, + CW_USEDEFAULT, + 0, + WindowRectangle.right - WindowRectangle.left, //data->hor_res, + WindowRectangle.bottom - WindowRectangle.top, //data->ver_res, + NULL, + NULL, + NULL, + data); + if(!window_handle) { + return 0; + } + + //Further improvement by SquareLine team: re-checking the window size and re-adjusting for wished client size, now taking thin resize-borders into account + RECT ClientRectangle; LONG WidthDifference, HeightDifference; + GetClientRect(window_handle, &ClientRectangle); GetWindowRect(window_handle, &WindowRectangle); + WidthDifference = (WindowRectangle.right - WindowRectangle.left) - ClientRectangle.right; + HeightDifference = (WindowRectangle.bottom - WindowRectangle.top) - ClientRectangle.bottom; + MoveWindow( window_handle, WindowRectangle.left, WindowRectangle.top, data->hor_res + WidthDifference, data->ver_res + HeightDifference, TRUE ); + + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return 0; + } + + data->display = context->display_device_object; + + ShowWindow(window_handle, SW_SHOW); + UpdateWindow(window_handle); + + LV_ASSERT(SetEvent(data->mutex)); + + data = NULL; + + MSG message; + while(GetMessageW(&message, NULL, 0, 0)) { + TranslateMessage(&message); + DispatchMessageW(&message); + } + + return 0; +} + +#endif // LV_USE_WINDOWS diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_display.h b/libraries/lvgl/src/drivers/windows/lv_windows_display.h new file mode 100644 index 0000000..b9c6f8e --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_display.h @@ -0,0 +1,127 @@ +/** + * @file lv_windows_display.h + * + */ + +#ifndef LV_WINDOWS_DISPLAY_H +#define LV_WINDOWS_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +#define LV_WINDOWS_ZOOM_BASE_LEVEL 100 + +#ifndef USER_DEFAULT_SCREEN_DPI +#define USER_DEFAULT_SCREEN_DPI 96 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create a LVGL display object. + * @param title The window title of LVGL display. + * @param hor_res The horizontal resolution value of LVGL display. + * @param ver_res The vertical resolution value of LVGL display. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @param allow_dpi_override Allow DPI override if true, or follow the + * Windows DPI scaling setting dynamically. + * @param simulator_mode Create simulator mode display if true, or create + * application mode display. + * @return The created LVGL display object. +*/ +lv_display_t * lv_windows_create_display( + const wchar_t * title, + int32_t hor_res, + int32_t ver_res, + int32_t zoom_level, + bool allow_dpi_override, + bool simulator_mode); + +/** + * @brief Get the window handle from specific LVGL display object. + * @param display The specific LVGL display object. + * @return The window handle from specific LVGL display object. +*/ +HWND lv_windows_get_display_window_handle(lv_display_t * display); + +/** + * @brief Get logical pixel value from physical pixel value taken account + * with zoom level. + * @param physical The physical pixel value taken account with zoom level. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @return The logical pixel value. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level); + +/** + * @brief Get physical pixel value taken account with zoom level from + * logical pixel value. + * @param logical The logical pixel value. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @return The physical pixel value taken account with zoom level. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level); + +/** + * @brief Get logical pixel value from physical pixel value taken account + * with DPI scaling. + * @param physical The physical pixel value taken account with DPI scaling. + * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. + * @return The logical pixel value. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi); + +/** + * @brief Get physical pixel value taken account with DPI scaling from + * logical pixel value. + * @param logical The logical pixel value. + * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. + * @return The physical pixel value taken account with DPI scaling. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_DISPLAY_H*/ diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_input.c b/libraries/lvgl/src/drivers/windows/lv_windows_input.c new file mode 100644 index 0000000..9830261 --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_input.c @@ -0,0 +1,828 @@ +/** + * @file lv_windows_input.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_input.h" +#if LV_USE_WINDOWS + +#include "lv_windows_context.h" +#include "lv_windows_display.h" + +#include + +#include "../../widgets/textarea/lv_textarea.h" +#include "../../widgets/keyboard/lv_keyboard.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_windows_pointer_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_pointer_device_event_callback(lv_event_t * e); + +static void lv_windows_keypad_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_keypad_device_event_callback(lv_event_t * e); + +static void lv_windows_encoder_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_encoder_device_event_callback(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +HWND lv_windows_get_indev_window_handle(lv_indev_t * indev) +{ + return lv_windows_get_display_window_handle(lv_indev_get_display(indev)); +} + +lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->pointer.indev) { + context->pointer.state = LV_INDEV_STATE_RELEASED; + context->pointer.point.x = 0; + context->pointer.point.y = 0; + + context->pointer.indev = lv_indev_create(); + if(context->pointer.indev) { + lv_indev_set_type( + context->pointer.indev, + LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb( + context->pointer.indev, + lv_windows_pointer_driver_read_callback); + lv_indev_set_display( + context->pointer.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->pointer.indev, + lv_windows_release_pointer_device_event_callback, + LV_EVENT_DELETE, + context->pointer.indev); + lv_indev_set_group( + context->pointer.indev, + lv_group_get_default()); + } + } + + return context->pointer.indev; +} + +lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->keypad.indev) { + InitializeCriticalSection(&context->keypad.mutex); + _lv_ll_init( + &context->keypad.queue, + sizeof(lv_windows_keypad_queue_item_t)); + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + + context->keypad.indev = lv_indev_create(); + if(context->keypad.indev) { + lv_indev_set_type( + context->keypad.indev, + LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb( + context->keypad.indev, + lv_windows_keypad_driver_read_callback); + lv_indev_set_display( + context->keypad.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->keypad.indev, + lv_windows_release_keypad_device_event_callback, + LV_EVENT_DELETE, + context->keypad.indev); + lv_indev_set_group( + context->keypad.indev, + lv_group_get_default()); + } + } + + return context->keypad.indev; +} + +lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->encoder.indev) { + context->encoder.state = LV_INDEV_STATE_RELEASED; + context->encoder.enc_diff = 0; + + context->encoder.indev = lv_indev_create(); + if(context->encoder.indev) { + lv_indev_set_type( + context->encoder.indev, + LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb( + context->encoder.indev, + lv_windows_encoder_driver_read_callback); + lv_indev_set_display( + context->encoder.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->encoder.indev, + lv_windows_release_encoder_device_event_callback, + LV_EVENT_DELETE, + context->encoder.indev); + lv_indev_set_group( + context->encoder.indev, + lv_group_get_default()); + } + } + + return context->encoder.indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_windows_pointer_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + data->state = context->pointer.state; + data->point = context->pointer.point; +} + +static void lv_windows_release_pointer_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + context->pointer.state = LV_INDEV_STATE_RELEASED; + context->pointer.point.x = 0; + context->pointer.point.y = 0; + + context->pointer.indev = NULL; +} + +static BOOL lv_windows_get_touch_input_info( + HTOUCHINPUT touch_input_handle, + UINT input_count, + PTOUCHINPUT inputs, + int item_size) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HTOUCHINPUT, UINT, PTOUCHINPUT, int); + + function_type function = (function_type)( + GetProcAddress(module_handle, "GetTouchInputInfo")); + if(!function) { + return FALSE; + } + + return function(touch_input_handle, input_count, inputs, item_size); +} + +static BOOL lv_windows_close_touch_input_handle( + HTOUCHINPUT touch_input_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HTOUCHINPUT); + + function_type function = (function_type)( + GetProcAddress(module_handle, "CloseTouchInputHandle")); + if(!function) { + return FALSE; + } + + return function(touch_input_handle); +} + +bool lv_windows_pointer_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + switch(uMsg) { + case WM_MOUSEMOVE: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + int32_t hor_res = lv_display_get_horizontal_resolution( + context->display_device_object); + int32_t ver_res = lv_display_get_vertical_resolution( + context->display_device_object); + + context->pointer.point.x = lv_windows_zoom_to_logical( + GET_X_LPARAM(lParam), + context->zoom_level); + context->pointer.point.y = lv_windows_zoom_to_logical( + GET_Y_LPARAM(lParam), + context->zoom_level); + if(context->simulator_mode) { + context->pointer.point.x = lv_windows_dpi_to_logical( + context->pointer.point.x, + context->window_dpi); + context->pointer.point.y = lv_windows_dpi_to_logical( + context->pointer.point.y, + context->window_dpi); + } + if(context->pointer.point.x < 0) { + context->pointer.point.x = 0; + } + if(context->pointer.point.x > hor_res - 1) { + context->pointer.point.x = hor_res - 1; + } + if(context->pointer.point.y < 0) { + context->pointer.point.y = 0; + } + if(context->pointer.point.y > ver_res - 1) { + context->pointer.point.y = ver_res - 1; + } + } + + break; + } + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->pointer.state = ( + uMsg == WM_LBUTTONDOWN + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + + break; + } + case WM_TOUCH: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + UINT input_count = LOWORD(wParam); + HTOUCHINPUT touch_input_handle = (HTOUCHINPUT)(lParam); + + PTOUCHINPUT inputs = malloc(input_count * sizeof(TOUCHINPUT)); + if(inputs) { + if(lv_windows_get_touch_input_info( + touch_input_handle, + input_count, + inputs, + sizeof(TOUCHINPUT))) { + for(UINT i = 0; i < input_count; ++i) { + POINT Point; + Point.x = TOUCH_COORD_TO_PIXEL(inputs[i].x); + Point.y = TOUCH_COORD_TO_PIXEL(inputs[i].y); + if(!ScreenToClient(hWnd, &Point)) { + continue; + } + + context->pointer.point.x = lv_windows_zoom_to_logical( + Point.x, + context->zoom_level); + context->pointer.point.y = lv_windows_zoom_to_logical( + Point.y, + context->zoom_level); + if(context->simulator_mode) { + context->pointer.point.x = lv_windows_dpi_to_logical( + context->pointer.point.x, + context->window_dpi); + context->pointer.point.y = lv_windows_dpi_to_logical( + context->pointer.point.y, + context->window_dpi); + } + + DWORD MousePressedMask = + TOUCHEVENTF_MOVE | TOUCHEVENTF_DOWN; + + context->pointer.state = ( + inputs[i].dwFlags & MousePressedMask + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + } + + free(inputs); + } + + lv_windows_close_touch_input_handle(touch_input_handle); + } + + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +static void lv_windows_keypad_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + EnterCriticalSection(&context->keypad.mutex); + + lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( + _lv_ll_get_head(&context->keypad.queue)); + if(current) { + data->key = current->key; + data->state = current->state; + + _lv_ll_remove(&context->keypad.queue, current); + lv_free(current); + + data->continue_reading = true; + } + + LeaveCriticalSection(&context->keypad.mutex); +} + +static void lv_windows_release_keypad_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + DeleteCriticalSection(&context->keypad.mutex); + _lv_ll_clear(&context->keypad.queue); + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + + context->keypad.indev = NULL; +} + +static void lv_windows_push_key_to_keyboard_queue( + lv_windows_window_context_t * context, + uint32_t key, + lv_indev_state_t state) +{ + lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( + _lv_ll_ins_tail(&context->keypad.queue)); + if(current) { + current->key = key; + current->state = state; + } +} + +static HIMC lv_windows_imm_get_context( + HWND window_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef HIMC(WINAPI * function_type)(HWND); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmGetContext")); + if(!function) { + return FALSE; + } + + return function(window_handle); +} + +static BOOL lv_windows_imm_release_context( + HWND window_handle, + HIMC imm_context_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, HIMC); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmReleaseContext")); + if(!function) { + return FALSE; + } + + return function(window_handle, imm_context_handle); +} + +static HIMC lv_windows_imm_associate_context( + HWND window_handle, + HIMC imm_context_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef HIMC(WINAPI * function_type)(HWND, HIMC); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmAssociateContext")); + if(!function) { + return FALSE; + } + + return function(window_handle, imm_context_handle); +} + +static BOOL lv_windows_imm_set_composition_window( + HIMC imm_context_handle, + LPCOMPOSITIONFORM composition_form) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HIMC, LPCOMPOSITIONFORM); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmSetCompositionWindow")); + if(!function) { + return FALSE; + } + + return function(imm_context_handle, composition_form); +} + +bool lv_windows_keypad_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + switch(uMsg) { + case WM_KEYDOWN: + case WM_KEYUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + EnterCriticalSection(&context->keypad.mutex); + + bool skip_translation = false; + uint32_t translated_key = 0; + + switch(wParam) { + case VK_UP: + translated_key = LV_KEY_UP; + break; + case VK_DOWN: + translated_key = LV_KEY_DOWN; + break; + case VK_LEFT: + translated_key = LV_KEY_LEFT; + break; + case VK_RIGHT: + translated_key = LV_KEY_RIGHT; + break; + case VK_ESCAPE: + translated_key = LV_KEY_ESC; + break; + case VK_DELETE: + translated_key = LV_KEY_DEL; + break; + case VK_BACK: + translated_key = LV_KEY_BACKSPACE; + break; + case VK_RETURN: + translated_key = LV_KEY_ENTER; + break; + case VK_TAB: + case VK_NEXT: + translated_key = LV_KEY_NEXT; + break; + case VK_PRIOR: + translated_key = LV_KEY_PREV; + break; + case VK_HOME: + translated_key = LV_KEY_HOME; + break; + case VK_END: + translated_key = LV_KEY_END; + break; + default: + skip_translation = true; + break; + } + + if(!skip_translation) { + lv_windows_push_key_to_keyboard_queue( + context, + translated_key, + ((uMsg == WM_KEYUP) + ? LV_INDEV_STATE_RELEASED + : LV_INDEV_STATE_PRESSED)); + } + + LeaveCriticalSection(&context->keypad.mutex); + } + + break; + } + case WM_CHAR: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + EnterCriticalSection(&context->keypad.mutex); + + uint16_t raw_code_point = (uint16_t)(wParam); + + if(raw_code_point >= 0x20 && raw_code_point != 0x7F) { + if(IS_HIGH_SURROGATE(raw_code_point)) { + context->keypad.utf16_high_surrogate = raw_code_point; + } + else if(IS_LOW_SURROGATE(raw_code_point)) { + context->keypad.utf16_low_surrogate = raw_code_point; + } + + uint32_t code_point = raw_code_point; + + if(context->keypad.utf16_high_surrogate && + context->keypad.utf16_low_surrogate) { + uint16_t high_surrogate = + context->keypad.utf16_high_surrogate; + uint16_t low_surrogate = + context->keypad.utf16_low_surrogate; + + code_point = (low_surrogate & 0x03FF); + code_point += (((high_surrogate & 0x03FF) + 0x40) << 10); + + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + } + + uint32_t lvgl_code_point = + _lv_text_unicode_to_encoded(code_point); + + lv_windows_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_PRESSED); + lv_windows_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_RELEASED); + } + + LeaveCriticalSection(&context->keypad.mutex); + } + + break; + } + case WM_IME_SETCONTEXT: { + if(wParam == TRUE) { + HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); + if(imm_context_handle) { + lv_windows_imm_associate_context( + hWnd, + imm_context_handle); + lv_windows_imm_release_context( + hWnd, + imm_context_handle); + } + } + + *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); + break; + } + case WM_IME_STARTCOMPOSITION: { + HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); + if(imm_context_handle) { + lv_obj_t * textarea_object = NULL; + lv_obj_t * focused_object = lv_group_get_focused( + lv_group_get_default()); + if(focused_object) { + const lv_obj_class_t * object_class = lv_obj_get_class( + focused_object); + + if(object_class == &lv_textarea_class) { + textarea_object = focused_object; + } + else if(object_class == &lv_keyboard_class) { + textarea_object = lv_keyboard_get_textarea(focused_object); + } + } + + COMPOSITIONFORM composition_form; + composition_form.dwStyle = CFS_POINT; + composition_form.ptCurrentPos.x = 0; + composition_form.ptCurrentPos.y = 0; + + if(textarea_object) { + lv_textarea_t * textarea = (lv_textarea_t *)(textarea_object); + lv_obj_t * label_object = lv_textarea_get_label(textarea_object); + + composition_form.ptCurrentPos.x = + label_object->coords.x1 + textarea->cursor.area.x1; + composition_form.ptCurrentPos.y = + label_object->coords.y1 + textarea->cursor.area.y1; + } + + lv_windows_imm_set_composition_window( + imm_context_handle, + &composition_form); + lv_windows_imm_release_context( + hWnd, + imm_context_handle); + } + + *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +static void lv_windows_encoder_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + data->state = context->encoder.state; + data->enc_diff = context->encoder.enc_diff; + context->encoder.enc_diff = 0; +} + +static void lv_windows_release_encoder_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + context->encoder.state = LV_INDEV_STATE_RELEASED; + context->encoder.enc_diff = 0; + + context->encoder.indev = NULL; +} + +bool lv_windows_encoder_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + switch(uMsg) { + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->encoder.state = ( + uMsg == WM_MBUTTONDOWN + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + + break; + } + case WM_MOUSEWHEEL: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->encoder.enc_diff = + -(GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); + } + + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +#endif // LV_USE_WINDOWS diff --git a/libraries/lvgl/src/drivers/windows/lv_windows_input.h b/libraries/lvgl/src/drivers/windows/lv_windows_input.h new file mode 100644 index 0000000..892014e --- /dev/null +++ b/libraries/lvgl/src/drivers/windows/lv_windows_input.h @@ -0,0 +1,83 @@ +/** + * @file lv_windows_input.h + * + */ + +#ifndef LV_WINDOWS_INPUT_H +#define LV_WINDOWS_INPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Get the window handle from specific LVGL input device object. + * @param indev The specific LVGL input device object. + * @return The window handle from specific LVGL input device object. +*/ +HWND lv_windows_get_indev_window_handle(lv_indev_t * indev); + +/** + * @brief Open a LVGL pointer input device object for the specific LVGL + * display object, or create it if the LVGL pointer input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL pointer input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display); + +/** + * @brief Open a LVGL keypad input device object for the specific LVGL + * display object, or create it if the LVGL keypad input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL keypad input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display); + +/** + * @brief Open a LVGL encoder input device object for the specific LVGL + * display object, or create it if the LVGL encoder input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL encoder input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_INPUT_H*/ diff --git a/libraries/lvgl/src/drivers/x11/lv_x11.h b/libraries/lvgl/src/drivers/x11/lv_x11.h new file mode 100644 index 0000000..a7f6267 --- /dev/null +++ b/libraries/lvgl/src/drivers/x11/lv_x11.h @@ -0,0 +1,81 @@ +/** + * @file lv_x11.h + * + */ + +#ifndef LV_X11_H +#define LV_X11_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_X11 + +/********************* + * DEFINES + *********************/ + +/** Header of private display driver user data - for internal use only */ +typedef struct { + struct _XDisplay * display; /**< X11 display object */ + struct _x11_inp_data * inp_data; /**< input user data object */ +} _x11_user_hdr_t; + +/** optional window close callback function type + * @see lv_x11_window_set_close_cb +*/ +typedef void(*lv_x11_close_cb)(void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * create and add keyboard, mouse and scrillwheel objects and connect them to x11 display. + * + * This is a convenience method handling the typical input initialisation of an X11 window: + * - create keyboard (@ref lv_x11_keyboard_create) + * - create mouse (with scrollwheel, @ref lv_x11_mouse_create @ref lv_x11_mousewheel_create) + * + * @param[in] disp the created X11 display object from @ref lv_x11_window_create + * @param[in] mouse_img optional image description for the mouse cursor (NULL for no/invisible mouse cursor) + */ +void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img); + +/** + * create the X11 display + * + * The minimal initialisation for initializing the X11 display driver with keyboard/mouse support: + * @code + * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); + * lv_x11_inputs_create(disp, NULL); + * @endcode + * or with mouse cursor icon: + * @code + * lv_img_dsc_t mouse_symbol = {.....}; + * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); + * lv_x11_inputs_create(disp, &mouse_symbol); + * @endcode + * + * @param[in] title title of the created X11 window + * @param[in] hor_res horizontal resolution (=width) of the X11 window + * @param[in] ver_res vertical resolution (=height) of the X11 window + * @return pointer to the display object + */ +lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res); + +#endif /* LV_USE_X11 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_X11_H */ diff --git a/libraries/lvgl/src/drivers/x11/lv_x11_display.c b/libraries/lvgl/src/drivers/x11/lv_x11_display.c new file mode 100644 index 0000000..1321b82 --- /dev/null +++ b/libraries/lvgl/src/drivers/x11/lv_x11_display.c @@ -0,0 +1,394 @@ +/** + * @file lv_x11_display.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_x11.h" + +#if LV_USE_X11 + +#include +#include +#include +#include +#include +#include +#include "../../core/lv_obj_pos.h" + +/********************* + * DEFINES + *********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +#if LV_X11_RENDER_MODE_PARTIAL + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined LV_X11_RENDER_MODE_DIRECT + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined LV_X11_RENDER_MODE_FULL + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* header (containing X Display + input user data pointer - keep aligned with x11_input module!) */ + _x11_user_hdr_t hdr; + /* X11 related information */ + Window window; /**< X11 window object */ + GC gc; /**< X11 graphics context object */ + Visual * visual; /**< X11 visual */ + int dplanes; /**< X11 display depth */ + XImage * ximage; /**< X11 XImage cache object for updating window content */ + Atom wmDeleteMessage; /**< X11 atom to window object */ + void * xdata; /**< allocated data for XImage */ + /* LVGL related information */ + lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ + lv_color_t * buffer[2]; /**< (double) lv display buffers, depending on @ref LV_X11_RENDER_MODE */ + lv_area_t flush_area; /**< integrated area for a display update */ + /* systemtick by thread related information */ + pthread_t thr_tick; /**< pthread for SysTick simulation */ + bool terminated; /**< flag to germinate SysTick simulation thread */ +} x11_disp_data_t; + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_X11_DIRECT_EXIT + static unsigned int count_windows = 0; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_COLOR_DEPTH == 32 +typedef lv_color32_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + return (lv_color32_t)p; +} +#elif LV_COLOR_DEPTH == 24 +typedef lv_color_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p.red, .green = p.green, .blue = p.blue }; + return out; +} +#elif LV_COLOR_DEPTH == 16 +typedef lv_color16_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p.red << 3, .green = p.green << 2, .blue = p.blue << 3 }; + return out; +} +#elif LV_COLOR_DEPTH == 8 +typedef uint8_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p, .green = p, .blue = p }; + return out; +} +#warning ("LV_COLOR_DEPTH=8 delivers black data only - open issue in lvgl?") +#else +#error ("Unsupported LV_COLOR_DEPTH") +#endif + +/** + * Flush the content of the internal buffer the specific area on the display. + * @param[in] disp the created X11 display object from @lv_x11_window_create + * @param[in] area area to be updated + * @param[in] px_map contains the rendered image as raw pixel map and it should be copied to `area` on the display. + * @note @ref lv_display_flush_ready has to be called when it's finished. + */ +static void x11_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + static const lv_area_t inv_area = { .x1 = 0xFFFF, + .x2 = 0, + .y1 = 0xFFFF, + .y2 = 0 + }; + + /* build display update area until lv_disp_flush_is_last */ + xd->flush_area.x1 = MIN(xd->flush_area.x1, area->x1); + xd->flush_area.x2 = MAX(xd->flush_area.x2, area->x2); + xd->flush_area.y1 = MIN(xd->flush_area.y1, area->y1); + xd->flush_area.y2 = MAX(xd->flush_area.y2, area->y2); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + + uint32_t dst_offs; + lv_color32_t * dst_data; + color_t * src_data = (color_t *)px_map + (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res * + area->y1 + area->x1); + for(int16_t y = area->y1; y <= area->y2; y++) { + dst_offs = area->x1 + y * hor_res; + dst_data = &((lv_color32_t *)(xd->xdata))[dst_offs]; + for(int16_t x = area->x1; x <= area->x2; x++, src_data++, dst_data++) { + *dst_data = get_px(*src_data); + } + src_data += (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res - (area->x2 - area->x1 + 1)); + } + + if(lv_display_flush_is_last(disp)) { + LV_LOG_TRACE("(%d/%d), %dx%d)", xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x2 + 1 - xd->flush_area.x1, + xd->flush_area.y2 + 1 - xd->flush_area.y1); + + /* refresh collected display update area only */ + int16_t upd_w = xd->flush_area.x2 - xd->flush_area.x1 + 1; + int16_t upd_h = xd->flush_area.y2 - xd->flush_area.y1 + 1; + XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x1, + xd->flush_area.y1, upd_w, upd_h); + + /* invalidate collected area */ + xd->flush_area = inv_area; + } + /* Inform the graphics library that you are ready with the flushing */ + lv_display_flush_ready(disp); +} + +/** + * event callbed by lvgl display if resolution has been changed (@ref lv_display_set_resolution has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_resolution_evt_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_user_data(e); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + if(LV_X11_RENDER_MODE != LV_DISPLAY_RENDER_MODE_PARTIAL) { + /* update lvgl full-screen display draw buffers for new display size */ + int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); + xd->buffer[0] = lv_realloc(xd->buffer[0], sz_buffers); + xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? lv_realloc(xd->buffer[1], sz_buffers) : NULL); + lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); + } + + /* re-create cache image with new size */ + XDestroyImage(xd->ximage); + size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); + xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ + xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, + hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); +} + +/** + * event callbed by lvgl display if display has been closed (@ref lv_display_delete has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_disp_delete_evt_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_user_data(e); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + + lv_timer_delete(xd->timer); + + lv_free(xd->buffer[0]); + if(LV_X11_DOUBLE_BUFFER) { + lv_free(xd->buffer[1]); + } + + XDestroyImage(xd->ximage); + XFreeGC(xd->hdr.display, xd->gc); + XUnmapWindow(xd->hdr.display, xd->window); + XDestroyWindow(xd->hdr.display, xd->window); + XFlush(xd->hdr.display); + + lv_free(xd); +#if LV_X11_DIRECT_EXIT + if(0 == --count_windows) { + exit(0); + } +#endif +} + +static void x11_hide_cursor(lv_display_t * disp) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + XColor black = { .red = 0, .green = 0, .blue = 0 }; + char empty_data[] = { 0 }; + + Pixmap empty_bitmap = XCreateBitmapFromData(xd->hdr.display, xd->window, empty_data, 1, 1); + Cursor inv_cursor = XCreatePixmapCursor(xd->hdr.display, empty_bitmap, empty_bitmap, &black, &black, 0, 0); + XDefineCursor(xd->hdr.display, xd->window, inv_cursor); + XFreeCursor(xd->hdr.display, inv_cursor); + XFreePixmap(xd->hdr.display, empty_bitmap); +} + +/** + * X11 input event handler, predicated to fetch and handle only display related events + * (Window changes) + */ +static int is_disp_event(Display * disp, XEvent * event, XPointer arg) +{ + LV_UNUSED(disp); + LV_UNUSED(arg); + return (event->type == Expose + || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ + || event->type == ClientMessage); +} +static void x11_event_handler(lv_timer_t * t) +{ + lv_display_t * disp = lv_timer_get_user_data(t); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + /* handle all outstanding X events */ + XEvent event; + while(XCheckIfEvent(xd->hdr.display, &event, is_disp_event, NULL)) { + LV_LOG_TRACE("Display Event %d", event.type); + switch(event.type) { + case Expose: + if(event.xexpose.count == 0) { + XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, 0, 0, 0, 0, event.xexpose.width, event.xexpose.height); + } + break; + case ConfigureNotify: + if(event.xconfigure.width != lv_display_get_horizontal_resolution(disp) + || event.xconfigure.height != lv_display_get_vertical_resolution(disp)) { + lv_display_set_resolution(disp, event.xconfigure.width, event.xconfigure.height); + } + break; + case ClientMessage: + if(event.xclient.data.l[0] == (long)xd->wmDeleteMessage) { + xd->terminated = true; + void * ret = NULL; + pthread_join(xd->thr_tick, &ret); + lv_display_delete(disp); + return; + } + break; + case MapNotify: + case ReparentNotify: + /*suppress unhandled warning*/ + break; + default: + LV_LOG_WARN("unhandled x11 event: %d", event.type); + } + } +} + +static void * x11_tick_thread(void * data) +{ + x11_disp_data_t * xd = data; + LV_ASSERT_NULL(xd); + + while(!xd->terminated) { + usleep(5000); + lv_tick_inc(5); + } + return NULL; +} + +static void x11_window_create(lv_display_t * disp, char const * title) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + /* setup display/screen */ + xd->hdr.display = XOpenDisplay(NULL); + int screen = XDefaultScreen(xd->hdr.display); + xd->visual = XDefaultVisual(xd->hdr.display, screen); + + /* create window */ + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); +#if 0 + /* drawing contexts for an window */ + unsigned long col_fg = BlackPixel(xd->hdr.display, screen); + unsigned long col_bg = WhitePixel(xd->hdr.display, screen); + + xd->window = XCreateSimpleWindow(xd->hdr.display, DefaultRootWindow(xd->hdr.display), + 0, 0, hor_res, ver_res, 0, col_fg, col_bg); +#else + xd->window = XCreateWindow(xd->hdr.display, XDefaultRootWindow(xd->hdr.display), + 0, 0, hor_res, ver_res, 0, + XDefaultDepth(xd->hdr.display, screen), InputOutput, + xd->visual, 0, NULL); +#endif + /* window manager properties (yes, use of StdProp is obsolete) */ + XSetStandardProperties(xd->hdr.display, xd->window, title, NULL, None, NULL, 0, NULL); + xd->gc = XCreateGC(xd->hdr.display, xd->window, 0, 0); + + /* allow receiving mouse, keyboard and window change/close events */ + XSelectInput(xd->hdr.display, xd->window, + PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | ExposureMask | + StructureNotifyMask); + xd->wmDeleteMessage = XInternAtom(xd->hdr.display, "WM_DELETE_WINDOW", False); + XSetWMProtocols(xd->hdr.display, xd->window, &xd->wmDeleteMessage, 1); + + x11_hide_cursor(disp); + + /* create cache XImage */ + size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); + xd->dplanes = XDisplayPlanes(xd->hdr.display, screen); + xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ + xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, + hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); + + /* finally bring window on top of the other windows */ + XMapRaised(xd->hdr.display, xd->window); + +#if LV_X11_DIRECT_EXIT + count_windows++; +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res) +{ + x11_disp_data_t * xd = lv_malloc_zeroed(sizeof(x11_disp_data_t)); + LV_ASSERT_MALLOC(xd); + if(NULL == xd) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(NULL == disp) { + lv_free(xd); + return NULL; + } + lv_display_set_driver_data(disp, xd); + lv_display_set_flush_cb(disp, x11_flush_cb); + lv_display_add_event_cb(disp, x11_resolution_evt_cb, LV_EVENT_RESOLUTION_CHANGED, disp); + lv_display_add_event_cb(disp, x11_disp_delete_evt_cb, LV_EVENT_DELETE, disp); + + x11_window_create(disp, title); + + int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); + if(LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + sz_buffers /= 10; + } + xd->buffer[0] = lv_malloc(sz_buffers); + xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? lv_malloc(sz_buffers) : NULL); + lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); + + xd->timer = lv_timer_create(x11_event_handler, 5, disp); + + /* initialize Tick simulation */ + xd->terminated = false; + pthread_create(&xd->thr_tick, NULL, x11_tick_thread, xd); + + return disp; +} + +#endif /*LV_USE_X11*/ diff --git a/libraries/lvgl/src/drivers/x11/lv_x11_input.c b/libraries/lvgl/src/drivers/x11/lv_x11_input.c new file mode 100644 index 0000000..efa94a5 --- /dev/null +++ b/libraries/lvgl/src/drivers/x11/lv_x11_input.c @@ -0,0 +1,327 @@ +/** + * @file lv_x11_input.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_x11.h" + +#if LV_USE_X11 + +#include +#include +#include +#include "../../stdlib/lv_string.h" +#include "../../widgets/image/lv_image.h" +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _x11_inp_data { + /* LVGL related information */ + lv_group_t * inp_group; /**< input group for X input elements */ + lv_indev_t * keyboard; /**< keyboard input device object */ + lv_indev_t * mousepointer; /**< mouse input device object */ + lv_indev_t * mousewheel; /**< encoder input device object */ + lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ + /* user input related information */ + char kb_buffer[32]; /**< keyboard buffer for X keyboard inpputs */ + lv_point_t mouse_pos; /**< current reported mouse position */ + bool left_mouse_btn; /**< current state of left mouse button */ + bool right_mouse_btn; /**< current state of right mouse button */ + bool wheel_mouse_btn; /**< current state of wheel (=middle) mouse button */ + int16_t wheel_cnt; /**< mouse wheel increments */ +} x11_inp_data_t; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * X11 input event handler, predicated to fetch and handle only input related events + * (MotionNotify, ButtonPress/Release, KeyPress/Release) + */ +static int is_inp_event(Display * disp, XEvent * event, XPointer arg) +{ + LV_UNUSED(disp); + LV_UNUSED(arg); + return !(event->type == Expose + || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ + || event->type == ClientMessage); +} +static void x11_inp_event_handler(lv_timer_t * t) +{ + lv_display_t * disp = lv_timer_get_user_data(t); + _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); + x11_inp_data_t * xd = disp_hdr->inp_data; + + /* handle all outstanding X events */ + XEvent event; + while(XCheckIfEvent(disp_hdr->display, &event, is_inp_event, NULL)) { + LV_LOG_TRACE("Input Event %d", event.type); + switch(event.type) { + case MotionNotify: + xd->mouse_pos.x = event.xmotion.x; + xd->mouse_pos.y = event.xmotion.y; + break; + case ButtonPress: + switch(event.xbutton.button) { + case Button1: + xd->left_mouse_btn = true; + break; + case Button2: + xd->wheel_mouse_btn = true; + break; + case Button3: + xd->right_mouse_btn = true; + break; + case Button4: /* Scrolled up */ + xd->wheel_cnt--; + break; + case Button5: /* Scrolled down */ + xd->wheel_cnt++; + break; + default: + LV_LOG_WARN("unhandled button press : %d", event.xbutton.button); + } + break; + case ButtonRelease: + switch(event.xbutton.button) { + case Button1: + xd->left_mouse_btn = false; + break; + case Button2: + xd->wheel_mouse_btn = false; + break; + case Button3: + xd->right_mouse_btn = false; + break; + } + break; + case KeyPress: { + size_t len = strlen(xd->kb_buffer); + if(len < (sizeof(xd->kb_buffer) - 2 /* space for 1 char + '\0' */)) { + KeySym key; + int n = XLookupString(&event.xkey, &xd->kb_buffer[len], sizeof(xd->kb_buffer) - (len + 1), &key, NULL); + n += !!key; + switch(key) { + case XK_Home: + case XK_KP_Home: + xd->kb_buffer[len] = LV_KEY_HOME; + break; + case XK_Left: + case XK_KP_Left: + xd->kb_buffer[len] = LV_KEY_LEFT; + break; + case XK_Up: + case XK_KP_Up: + xd->kb_buffer[len] = LV_KEY_UP; + break; + case XK_Right: + case XK_KP_Right: + xd->kb_buffer[len] = LV_KEY_RIGHT; + break; + case XK_Down: + case XK_KP_Down: + xd->kb_buffer[len] = LV_KEY_DOWN; + break; + case XK_Prior: + case XK_KP_Prior: + xd->kb_buffer[len] = LV_KEY_PREV; + break; + case XK_Next: + case XK_KP_Next: + xd->kb_buffer[len] = LV_KEY_NEXT; + break; + case XK_End: + case XK_KP_End: + xd->kb_buffer[len] = LV_KEY_END; + break; + case XK_BackSpace: + xd->kb_buffer[len] = LV_KEY_BACKSPACE; + break; + case XK_Escape: + xd->kb_buffer[len] = LV_KEY_ESC; + break; + case XK_Delete: + case XK_KP_Delete: + xd->kb_buffer[len] = LV_KEY_DEL; + break; + case XK_KP_Enter: + xd->kb_buffer[len] = LV_KEY_ENTER; + break; + } + xd->kb_buffer[len + n] = '\0'; + } + } + break; + case KeyRelease: + break; + default: + LV_LOG_WARN("unhandled x11 event: %d", event.type); + } + } +} + +/** + * event callbed by lvgl display if display has been closed (@ref lv_display_delete has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_inp_delete_evt_cb(lv_event_t * e) +{ + x11_inp_data_t * xd = (x11_inp_data_t *)lv_event_get_user_data(e); + + lv_timer_delete(xd->timer); + lv_free(xd); +} + +/** + * create the local data/timers for the X11 input functionality. + * extracts the user data information from lv_display_t object and initializes the input user object on 1st use. + * @param[in] disp the created X11 display object from @lv_x11_window_create + * @return pointer to the local user data object @x11_inp_data_t + */ +static x11_inp_data_t * x11_input_get_user_data(lv_display_t * disp) +{ + _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(disp_hdr); + x11_inp_data_t ** inp_data = &disp_hdr->inp_data; + + /* create input data set if initial call */ + if(NULL == *inp_data) { + *inp_data = lv_malloc_zeroed(sizeof(x11_inp_data_t)); + LV_ASSERT_MALLOC(*inp_data); + if(NULL != *inp_data) { + /* initialize timer callback for X11 kb/mouse input event reading */ + (*inp_data)->timer = lv_timer_create(x11_inp_event_handler, 1, disp); + lv_display_add_event_cb(disp, x11_inp_delete_evt_cb, LV_EVENT_DELETE, *inp_data); + } + } + return *inp_data; +} + +static void x11_keyboard_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + size_t len = strlen(xd->kb_buffer); + if(len > 0) { + data->state = LV_INDEV_STATE_PRESSED; + data->key = xd->kb_buffer[0]; + memmove(xd->kb_buffer, xd->kb_buffer + 1, len); + data->continue_reading = (len > 0); + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void x11_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + xd->mouse_pos.x = MIN(xd->mouse_pos.x, hor_res - 1); + xd->mouse_pos.y = MIN(xd->mouse_pos.y, ver_res - 1); + + data->point = xd->mouse_pos; + data->state = xd->left_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + +static void x11_mousewheel_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + data->state = xd->wheel_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->enc_diff = xd->wheel_cnt; + xd->wheel_cnt = 0; +} + +static lv_indev_t * lv_x11_keyboard_create(lv_display_t * disp) +{ + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_NULL(indev); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, x11_keyboard_read_cb); + lv_indev_set_driver_data(indev, disp); + } + return indev; +} + +static lv_indev_t * lv_x11_mouse_create(lv_display_t * disp, lv_image_dsc_t const * symb) +{ + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_OBJ(indev, MY_CLASS); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, x11_mouse_read_cb); + lv_indev_set_driver_data(indev, disp); + + /* optional mouse cursor symbol */ + if(NULL != symb) { + lv_obj_t * mouse_cursor = lv_image_create(lv_screen_active()); + lv_image_set_src(mouse_cursor, symb); + lv_indev_set_cursor(indev, mouse_cursor); + } + } + return indev; +} + +static lv_indev_t * lv_x11_mousewheel_create(lv_display_t * disp) +{ + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_OBJ(indev, MY_CLASS); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev, x11_mousewheel_read_cb); + lv_indev_set_driver_data(indev, disp); + } + return indev; +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img) +{ + x11_inp_data_t * xd = x11_input_get_user_data(disp); + LV_ASSERT_NULL(xd); + + xd->inp_group = lv_group_create(); + lv_group_set_default(xd->inp_group); + + xd->mousepointer = lv_x11_mouse_create(disp, mouse_img); + lv_indev_set_group(xd->mousepointer, xd->inp_group); + + xd->mousewheel = lv_x11_mousewheel_create(disp); + lv_indev_set_group(xd->mousewheel, xd->inp_group); + + xd->keyboard = lv_x11_keyboard_create(disp); + lv_indev_set_group(xd->keyboard, xd->inp_group); +} + +#endif /*LV_USE_X11*/ diff --git a/libraries/lvgl/src/font/lv_binfont_loader.c b/libraries/lvgl/src/font/lv_binfont_loader.c new file mode 100644 index 0000000..f121f40 --- /dev/null +++ b/libraries/lvgl/src/font/lv_binfont_loader.c @@ -0,0 +1,659 @@ +/** + * @file lv_binfont_loader.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include +#include + +#include "../lvgl.h" +#include "../misc/lv_fs.h" +#include "lv_binfont_loader.h" + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_fs_file_t * fp; + int8_t bit_pos; + uint8_t byte_value; +} bit_iterator_t; + +typedef struct font_header_bin { + uint32_t version; + uint16_t tables_count; + uint16_t font_size; + uint16_t ascent; + int16_t descent; + uint16_t typo_ascent; + int16_t typo_descent; + uint16_t typo_line_gap; + int16_t min_y; + int16_t max_y; + uint16_t default_advance_width; + uint16_t kerning_scale; + uint8_t index_to_loc_format; + uint8_t glyph_id_format; + uint8_t advance_width_format; + uint8_t bits_per_pixel; + uint8_t xy_bits; + uint8_t wh_bits; + uint8_t advance_width_bits; + uint8_t compression_id; + uint8_t subpixels_mode; + uint8_t padding; + int16_t underline_position; + uint16_t underline_thickness; +} font_header_bin_t; + +typedef struct cmap_table_bin { + uint32_t data_offset; + uint32_t range_start; + uint16_t range_length; + uint16_t glyph_id_start; + uint16_t data_entries_count; + uint8_t format_type; + uint8_t padding; +} cmap_table_bin_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp); +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font); +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start); + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_font_t * lv_binfont_create(const char * path) +{ + LV_ASSERT_NULL(path); + + lv_fs_file_t file; + lv_fs_res_t fs_res = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) return NULL; + + lv_font_t * font = lv_malloc_zeroed(sizeof(lv_font_t)); + LV_ASSERT_MALLOC(font); + + if(!lvgl_load_font(&file, font)) { + LV_LOG_WARN("Error loading font file: %s", path); + /* + * When `lvgl_load_font` fails it can leak some pointers. + * All non-null pointers can be assumed as allocated and + * `lv_binfont_destroy` should free them correctly. + */ + lv_binfont_destroy(font); + font = NULL; + } + + lv_fs_close(&file); + + return font; +} + +#if LV_USE_FS_MEMFS +lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size) +{ + lv_fs_path_ex_t mempath; + + lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, buffer, size); + return lv_binfont_create((const char *)&mempath); +} +#endif + +void lv_binfont_destroy(lv_font_t * font) +{ + if(font == NULL) return; + + const lv_font_fmt_txt_dsc_t * dsc = font->dsc; + if(dsc == NULL) return; + + if(dsc->kern_classes == 0) { + const lv_font_fmt_txt_kern_pair_t * kern_dsc = dsc->kern_dsc; + if(NULL != kern_dsc) { + lv_free((void *)kern_dsc->glyph_ids); + lv_free((void *)kern_dsc->values); + lv_free((void *)kern_dsc); + } + } + else { + const lv_font_fmt_txt_kern_classes_t * kern_dsc = dsc->kern_dsc; + if(NULL != kern_dsc) { + lv_free((void *)kern_dsc->class_pair_values); + lv_free((void *)kern_dsc->left_class_mapping); + lv_free((void *)kern_dsc->right_class_mapping); + lv_free((void *)kern_dsc); + } + } + + const lv_font_fmt_txt_cmap_t * cmaps = dsc->cmaps; + if(NULL != cmaps) { + for(int i = 0; i < dsc->cmap_num; ++i) { + lv_free((void *)cmaps[i].glyph_id_ofs_list); + lv_free((void *)cmaps[i].unicode_list); + } + lv_free((void *)cmaps); + } + + lv_free((void *)dsc->glyph_bitmap); + lv_free((void *)dsc->glyph_dsc); + lv_free((void *)dsc); + lv_free(font); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp) +{ + bit_iterator_t it; + it.fp = fp; + it.bit_pos = -1; + it.byte_value = 0; + return it; +} + +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = 0; + while(n_bits--) { + it->byte_value = it->byte_value << 1; + it->bit_pos--; + + if(it->bit_pos < 0) { + it->bit_pos = 7; + *res = lv_fs_read(it->fp, &(it->byte_value), 1, NULL); + if(*res != LV_FS_RES_OK) { + return 0; + } + } + int8_t bit = (it->byte_value & 0x80) ? 1 : 0; + + value |= (bit << n_bits); + } + *res = LV_FS_RES_OK; + return value; +} + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = read_bits(it, n_bits, res); + if(value & (1 << (n_bits - 1))) { + value |= ~0u << n_bits; + } + return value; +} + +static int read_label(lv_fs_file_t * fp, int start, const char * label) +{ + lv_fs_seek(fp, start, LV_FS_SEEK_SET); + + uint32_t length; + char buf[4]; + + if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK + || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK + || memcmp(label, buf, 4) != 0) { + LV_LOG_WARN("Error reading '%s' label.", label); + return -1; + } + + return length; +} + +static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t cmaps_start, cmap_table_bin_t * cmap_table) +{ + if(lv_fs_read(fp, cmap_table, font_dsc->cmap_num * sizeof(cmap_table_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, cmaps_start + cmap_table[i].data_offset, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return false; + } + + lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); + + cmap->range_start = cmap_table[i].range_start; + cmap->range_length = cmap_table[i].range_length; + cmap->glyph_id_start = cmap_table[i].glyph_id_start; + cmap->type = cmap_table[i].format_type; + + switch(cmap_table[i].format_type) { + case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { + uint8_t ids_size = (uint8_t)(sizeof(uint8_t) * cmap_table[i].data_entries_count); + uint8_t * glyph_id_ofs_list = lv_malloc(ids_size); + + cmap->glyph_id_ofs_list = glyph_id_ofs_list; + + if(lv_fs_read(fp, glyph_id_ofs_list, ids_size, NULL) != LV_FS_RES_OK) { + return false; + } + + cmap->list_length = cmap->range_length; + break; + } + case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: + break; + case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: + case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: { + uint32_t list_size = sizeof(uint16_t) * cmap_table[i].data_entries_count; + uint16_t * unicode_list = (uint16_t *)lv_malloc(list_size); + + cmap->unicode_list = unicode_list; + cmap->list_length = cmap_table[i].data_entries_count; + + if(lv_fs_read(fp, unicode_list, list_size, NULL) != LV_FS_RES_OK) { + return false; + } + + if(cmap_table[i].format_type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t * buf = lv_malloc(sizeof(uint16_t) * cmap->list_length); + + cmap->glyph_id_ofs_list = buf; + + if(lv_fs_read(fp, buf, sizeof(uint16_t) * cmap->list_length, NULL) != LV_FS_RES_OK) { + return false; + } + } + break; + } + default: + LV_LOG_WARN("Unknown cmaps format type %d.", cmap_table[i].format_type); + return false; + } + } + return true; +} + +static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint32_t cmaps_start) +{ + int32_t cmaps_length = read_label(fp, cmaps_start, "cmap"); + if(cmaps_length < 0) { + return -1; + } + + uint32_t cmaps_subtables_count; + if(lv_fs_read(fp, &cmaps_subtables_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + lv_font_fmt_txt_cmap_t * cmaps = + lv_malloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + font_dsc->cmaps = cmaps; + font_dsc->cmap_num = cmaps_subtables_count; + + cmap_table_bin_t * cmaps_tables = lv_malloc(sizeof(cmap_table_bin_t) * font_dsc->cmap_num); + + bool success = load_cmaps_tables(fp, font_dsc, cmaps_start, cmaps_tables); + + lv_free(cmaps_tables); + + return success ? cmaps_length : -1; +} + +static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t start, uint32_t * glyph_offset, uint32_t loca_count, font_header_bin_t * header) +{ + int32_t glyph_length = read_label(fp, start, "glyf"); + if(glyph_length < 0) { + return -1; + } + + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) + lv_malloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + font_dsc->glyph_dsc = glyph_dsc; + + int cur_bmp_size = 0; + + for(unsigned int i = 0; i < loca_count; ++i) { + lv_font_fmt_txt_glyph_dsc_t * gdsc = &glyph_dsc[i]; + + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + + bit_iterator_t bit_it = init_bit_iterator(fp); + + if(header->advance_width_bits == 0) { + gdsc->adv_w = header->default_advance_width; + } + else { + gdsc->adv_w = read_bits(&bit_it, header->advance_width_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + + if(header->advance_width_format == 0) { + gdsc->adv_w *= 16; + } + + gdsc->ofs_x = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->ofs_y = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_w = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_h = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(i == 0) { + gdsc->adv_w = 0; + gdsc->box_w = 0; + gdsc->box_h = 0; + gdsc->ofs_x = 0; + gdsc->ofs_y = 0; + } + + gdsc->bitmap_index = cur_bmp_size; + if(gdsc->box_w * gdsc->box_h != 0) { + cur_bmp_size += bmp_size; + } + } + + uint8_t * glyph_bmp = (uint8_t *)lv_malloc(sizeof(uint8_t) * cur_bmp_size); + + font_dsc->glyph_bitmap = glyph_bmp; + + cur_bmp_size = 0; + + for(unsigned int i = 1; i < loca_count; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + bit_iterator_t bit_it = init_bit_iterator(fp); + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + + read_bits(&bit_it, nbits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + if(glyph_dsc[i].box_w * glyph_dsc[i].box_h == 0) { + continue; + } + + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(nbits % 8 == 0) { /*Fast path*/ + if(lv_fs_read(fp, &glyph_bmp[cur_bmp_size], bmp_size, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + for(int k = 0; k < bmp_size - 1; ++k) { + glyph_bmp[cur_bmp_size + k] = read_bits(&bit_it, 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + glyph_bmp[cur_bmp_size + bmp_size - 1] = read_bits(&bit_it, 8 - nbits % 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + /*The last fragment should be on the MSB but read_bits() will place it to the LSB*/ + glyph_bmp[cur_bmp_size + bmp_size - 1] = glyph_bmp[cur_bmp_size + bmp_size - 1] << (nbits % 8); + + } + + cur_bmp_size += bmp_size; + } + return glyph_length; +} + +/* + * Loads a `lv_font_t` from a binary file, given a `lv_fs_file_t`. + * + * Memory allocations on `lvgl_load_font` should be immediately zeroed and + * the pointer should be set on the `lv_font_t` data before any possible return. + * + * When something fails, it returns `false` and the memory on the `lv_font_t` + * still needs to be freed using `lv_binfont_destroy`. + * + * `lv_binfont_destroy` will assume that all non-null pointers are allocated and + * should be freed. + */ +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font) +{ + lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) + lv_malloc(sizeof(lv_font_fmt_txt_dsc_t)); + + memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); + + font->dsc = font_dsc; + + /*header*/ + int32_t header_length = read_label(fp, 0, "head"); + if(header_length < 0) { + return false; + } + + font_header_bin_t font_header; + if(lv_fs_read(fp, &font_header, sizeof(font_header_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + font->base_line = -font_header.descent; + font->line_height = font_header.ascent - font_header.descent; + font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt; + font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt; + font->subpx = font_header.subpixels_mode; + font->underline_position = (int8_t) font_header.underline_position; + font->underline_thickness = (int8_t) font_header.underline_thickness; + + font_dsc->bpp = font_header.bits_per_pixel; + font_dsc->kern_scale = font_header.kerning_scale; + font_dsc->bitmap_format = font_header.compression_id; + + /*cmaps*/ + uint32_t cmaps_start = header_length; + int32_t cmaps_length = load_cmaps(fp, font_dsc, cmaps_start); + if(cmaps_length < 0) { + return false; + } + + /*loca*/ + uint32_t loca_start = cmaps_start + cmaps_length; + int32_t loca_length = read_label(fp, loca_start, "loca"); + if(loca_length < 0) { + return false; + } + + uint32_t loca_count; + if(lv_fs_read(fp, &loca_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return false; + } + + bool failed = false; + uint32_t * glyph_offset = lv_malloc(sizeof(uint32_t) * (loca_count + 1)); + + if(font_header.index_to_loc_format == 0) { + for(unsigned int i = 0; i < loca_count; ++i) { + uint16_t offset; + if(lv_fs_read(fp, &offset, sizeof(uint16_t), NULL) != LV_FS_RES_OK) { + failed = true; + break; + } + glyph_offset[i] = offset; + } + } + else if(font_header.index_to_loc_format == 1) { + if(lv_fs_read(fp, glyph_offset, loca_count * sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + failed = true; + } + } + else { + LV_LOG_WARN("Unknown index_to_loc_format: %d.", font_header.index_to_loc_format); + failed = true; + } + + if(failed) { + lv_free(glyph_offset); + return false; + } + + /*glyph*/ + uint32_t glyph_start = loca_start + loca_length; + int32_t glyph_length = load_glyph( + fp, font_dsc, glyph_start, glyph_offset, loca_count, &font_header); + + lv_free(glyph_offset); + + if(glyph_length < 0) { + return false; + } + + /*kerning*/ + if(font_header.tables_count < 4) { + font_dsc->kern_dsc = NULL; + font_dsc->kern_classes = 0; + font_dsc->kern_scale = 0; + return true; + } + + uint32_t kern_start = glyph_start + glyph_length; + + int32_t kern_length = load_kern(fp, font_dsc, font_header.glyph_id_format, kern_start); + + return kern_length >= 0; +} + +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start) +{ + int32_t kern_length = read_label(fp, start, "kern"); + if(kern_length < 0) { + return -1; + } + + uint8_t kern_format_type; + int32_t padding; + if(lv_fs_read(fp, &kern_format_type, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &padding, 3 * sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + if(0 == kern_format_type) { /*sorted pairs*/ + lv_font_fmt_txt_kern_pair_t * kern_pair = lv_malloc(sizeof(lv_font_fmt_txt_kern_pair_t)); + + memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); + + font_dsc->kern_dsc = kern_pair; + font_dsc->kern_classes = 0; + + uint32_t glyph_entries; + if(lv_fs_read(fp, &glyph_entries, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int ids_size; + if(format == 0) { + ids_size = sizeof(int8_t) * 2 * glyph_entries; + } + else { + ids_size = sizeof(int16_t) * 2 * glyph_entries; + } + + uint8_t * glyph_ids = lv_malloc(ids_size); + int8_t * values = lv_malloc(glyph_entries); + + kern_pair->glyph_ids_size = format; + kern_pair->pair_cnt = glyph_entries; + kern_pair->glyph_ids = glyph_ids; + kern_pair->values = values; + + if(lv_fs_read(fp, glyph_ids, ids_size, NULL) != LV_FS_RES_OK) { + return -1; + } + + if(lv_fs_read(fp, values, glyph_entries, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else if(3 == kern_format_type) { /*array M*N of classes*/ + + lv_font_fmt_txt_kern_classes_t * kern_classes = lv_malloc(sizeof(lv_font_fmt_txt_kern_classes_t)); + + memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); + + font_dsc->kern_dsc = kern_classes; + font_dsc->kern_classes = 1; + + uint16_t kern_class_mapping_length; + uint8_t kern_table_rows; + uint8_t kern_table_cols; + + if(lv_fs_read(fp, &kern_class_mapping_length, sizeof(uint16_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_rows, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_cols, sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int kern_values_length = sizeof(int8_t) * kern_table_rows * kern_table_cols; + + uint8_t * kern_left = lv_malloc(kern_class_mapping_length); + uint8_t * kern_right = lv_malloc(kern_class_mapping_length); + int8_t * kern_values = lv_malloc(kern_values_length); + + kern_classes->left_class_mapping = kern_left; + kern_classes->right_class_mapping = kern_right; + kern_classes->left_class_cnt = kern_table_rows; + kern_classes->right_class_cnt = kern_table_cols; + kern_classes->class_pair_values = kern_values; + + if(lv_fs_read(fp, kern_left, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_right, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_values, kern_values_length, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + LV_LOG_WARN("Unknown kern_format_type: %d", kern_format_type); + return -1; + } + + return kern_length; +} diff --git a/libraries/lvgl/src/font/lv_binfont_loader.h b/libraries/lvgl/src/font/lv_binfont_loader.h new file mode 100644 index 0000000..c8537eb --- /dev/null +++ b/libraries/lvgl/src/font/lv_binfont_loader.h @@ -0,0 +1,61 @@ +/** + * @file lv_binfont_loader.h + * + */ + +#ifndef LV_FONT_LOADER_H +#define LV_FONT_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Loads a `lv_font_t` object from a binary font file + * @param path path where the font file is located + * @return pointer to font where to load + */ +lv_font_t * lv_binfont_create(const char * font_name); + +#if LV_USE_FS_MEMFS +/** + * Loads a `lv_font_t` object from a memory buffer containing the binary font file. + * Requires LV_USE_FS_MEMFS + * @param buffer address of the font file in the memory + * @param size size of the font file buffer + * @return pointer to font where to load + */ +lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size); +#endif + +/** + * Frees the memory allocated by the `lv_binfont_create()` function + * @param font lv_font_t object created by the lv_binfont_create function + */ +void lv_binfont_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_LOADER_H*/ diff --git a/libraries/lvgl/src/font/lv_font.c b/libraries/lvgl/src/font/lv_font.c new file mode 100644 index 0000000..6484889 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font.c @@ -0,0 +1,131 @@ +/** + * @file lv_font.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_font.h" +#include "../misc/lv_text.h" +#include "../misc/lv_utils.h" +#include "../misc/lv_log.h" +#include "../misc/lv_assert.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32_t letter, + lv_draw_buf_t * draw_buf) +{ + const lv_font_t * font_p = g_dsc->resolved_font; + LV_ASSERT_NULL(font_p); + return font_p->get_glyph_bitmap(g_dsc, letter, draw_buf); +} + +bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next) +{ + + LV_ASSERT_NULL(font_p); + LV_ASSERT_NULL(dsc_out); + +#if LV_USE_FONT_PLACEHOLDER + const lv_font_t * placeholder_font = NULL; +#endif + + const lv_font_t * f = font_p; + + dsc_out->resolved_font = NULL; + + while(f) { + bool found = f->get_glyph_dsc(f, dsc_out, letter, f->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next); + if(found) { + if(!dsc_out->is_placeholder) { + dsc_out->resolved_font = f; + return true; + } +#if LV_USE_FONT_PLACEHOLDER + else if(placeholder_font == NULL) { + placeholder_font = f; + } +#endif + } + f = f->fallback; + } + +#if LV_USE_FONT_PLACEHOLDER + if(placeholder_font != NULL) { + placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter, + placeholder_font->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next); + dsc_out->resolved_font = placeholder_font; + return true; + } +#endif + +#if LV_USE_FONT_PLACEHOLDER + dsc_out->box_w = font_p->line_height / 2; + dsc_out->adv_w = dsc_out->box_w + 2; +#else + dsc_out->box_w = 0; + dsc_out->adv_w = 0; +#endif + + dsc_out->resolved_font = NULL; + dsc_out->box_h = font_p->line_height; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->format = LV_FONT_GLYPH_FORMAT_A1; + dsc_out->is_placeholder = true; + + return false; +} + +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next) +{ + LV_ASSERT_NULL(font); + lv_font_glyph_dsc_t g; + + /*Return zero if letter is marker*/ + if(_lv_text_is_marker(letter)) return 0; + + lv_font_get_glyph_dsc(font, &g, letter, letter_next); + return g.adv_w; +} + +void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning) +{ + LV_ASSERT_NULL(font); + font->kerning = kerning; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/font/lv_font.h b/libraries/lvgl/src/font/lv_font.h new file mode 100644 index 0000000..85bdec1 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font.h @@ -0,0 +1,310 @@ +/** + * @file lv_font.h + * + */ + +#ifndef LV_FONT_H +#define LV_FONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include +#include + +#include "lv_symbol_def.h" +#include "../draw/lv_draw_buf.h" +#include "../misc/lv_area.h" +#include "../misc/lv_types.h" +#include "../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*------------------ + * General types + *-----------------*/ + +/** The font format.*/ +enum _lv_font_glyph_format_t { + LV_FONT_GLYPH_FORMAT_NONE = 0, /**< Maybe not visible*/ + + /**< Legacy simple formats*/ + LV_FONT_GLYPH_FORMAT_A1 = 0x01, /**< 1 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A2 = 0x02, /**< 2 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A4 = 0x04, /**< 4 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A8 = 0x08, /**< 8 bit per pixel*/ + + LV_FONT_GLYPH_FORMAT_IMAGE = 0x09, /**< Image format*/ + + /**< Advanced formats*/ + LV_FONT_GLYPH_FORMAT_VECTOR = 0x0A, /**< Vectorial format*/ + LV_FONT_GLYPH_FORMAT_SVG = 0x0B, /**< SVG format*/ + LV_FONT_GLYPH_FORMAT_CUSTOM = 0xFF, /**< Custom format*/ +}; + +#ifdef DOXYGEN +typedef _lv_font_glyph_format_t lv_font_glyph_format_t; +#else +typedef uint8_t lv_font_glyph_format_t; +#endif /*DOXYGEN*/ + +/** Describes the properties of a glyph.*/ +typedef struct { + const lv_font_t * + resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/ + uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box*/ + lv_font_glyph_format_t format; /**< Font format of the glyph see @lv_font_glyph_format_t*/ + uint8_t is_placeholder: 1; /**< Glyph is missing. But placeholder will still be displayed*/ + + uint32_t glyph_index; /**< The index of the glyph in the font file. Used by the font cache*/ + lv_cache_entry_t * entry; /**< The cache entry of the glyph draw data. Used by the font cache*/ +} lv_font_glyph_dsc_t; + +/** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/ +enum _lv_font_subpx_t { + LV_FONT_SUBPX_NONE, + LV_FONT_SUBPX_HOR, + LV_FONT_SUBPX_VER, + LV_FONT_SUBPX_BOTH, +}; + +#ifdef DOXYGEN +typedef _lv_font_subpx_t lv_font_subpx_t; +#else +typedef uint8_t lv_font_subpx_t; +#endif /*DOXYGEN*/ + +/** Adjust letter spacing for specific character pairs.*/ +enum _lv_font_kerning_t { + LV_FONT_KERNING_NORMAL, + LV_FONT_KERNING_NONE, +}; + +#ifdef DOXYGEN +typedef _lv_font_kerning_t lv_font_kerning_t; +#else +typedef uint8_t lv_font_kerning_t; +#endif /*DOXYGEN*/ + +/** Describe the properties of a font*/ +struct _lv_font_t { + /** Get a glyph's descriptor from a font*/ + bool (*get_glyph_dsc)(const lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); + + /** Get a glyph's bitmap from a font*/ + const void * (*get_glyph_bitmap)(lv_font_glyph_dsc_t *, uint32_t, lv_draw_buf_t *); + + /** Release a glyph*/ + void (*release_glyph)(const lv_font_t *, lv_font_glyph_dsc_t *); + + /*Pointer to the font in a font pack (must have the same line height)*/ + int32_t line_height; /**< The real line height where any text fits*/ + int32_t base_line; /**< Base line measured from the top of the line_height*/ + uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ + uint8_t kerning : 1; /**< An element of `lv_font_kerning_t`*/ + + int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/ + int8_t underline_thickness; /**< Thickness of the underline*/ + + const void * dsc; /**< Store implementation specific or run_time data or caching here*/ + const lv_font_t * fallback; /**< Fallback font for missing glyph. Resolved recursively */ + void * user_data; /**< Custom user data for font.*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Return with the bitmap of a font. + * @param g_dsc the glyph descriptor including which font to use etc. + * @param letter a UNICODE character code + * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph, it's OK not to use it. + * @return pointer to the glyph's data. It can be a draw buffer for bitmap fonts or an image source for imgfonts. + */ +const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32_t letter, + lv_draw_buf_t * draw_buf); + +/** + * Get the descriptor of a glyph + * @param font pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @param letter_next the next letter after `letter`. Used for kerning + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next); + +/** + * Get the width of a glyph with kerning + * @param font pointer to a font + * @param letter a UNICODE letter + * @param letter_next the next letter after `letter`. Used for kerning + * @return the width of the glyph + */ +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next); + +/** + * Get the line height of a font. All characters fit into this height + * @param font pointer to a font + * @return the height of a font + */ +static inline int32_t lv_font_get_line_height(const lv_font_t * font) +{ + return font->line_height; +} + +/** + * Configure the use of kerning information stored in a font + * @param font pointer to a font + * @param kerning `LV_FONT_KERNING_NORMAL` (default) or `LV_FONT_KERNING_NONE` + */ +void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning); + +/********************** + * MACROS + **********************/ + +#define LV_FONT_DECLARE(font_name) LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_t font_name; + +#if LV_FONT_MONTSERRAT_8 +LV_FONT_DECLARE(lv_font_montserrat_8) +#endif + +#if LV_FONT_MONTSERRAT_10 +LV_FONT_DECLARE(lv_font_montserrat_10) +#endif + +#if LV_FONT_MONTSERRAT_12 +LV_FONT_DECLARE(lv_font_montserrat_12) +#endif + +#if LV_FONT_MONTSERRAT_14 +LV_FONT_DECLARE(lv_font_montserrat_14) +#endif + +#if LV_FONT_MONTSERRAT_16 +LV_FONT_DECLARE(lv_font_montserrat_16) +#endif + +#if LV_FONT_MONTSERRAT_18 +LV_FONT_DECLARE(lv_font_montserrat_18) +#endif + +#if LV_FONT_MONTSERRAT_20 +LV_FONT_DECLARE(lv_font_montserrat_20) +#endif + +#if LV_FONT_MONTSERRAT_22 +LV_FONT_DECLARE(lv_font_montserrat_22) +#endif + +#if LV_FONT_MONTSERRAT_24 +LV_FONT_DECLARE(lv_font_montserrat_24) +#endif + +#if LV_FONT_MONTSERRAT_26 +LV_FONT_DECLARE(lv_font_montserrat_26) +#endif + +#if LV_FONT_MONTSERRAT_28 +LV_FONT_DECLARE(lv_font_montserrat_28) +#endif + +#if LV_FONT_MONTSERRAT_30 +LV_FONT_DECLARE(lv_font_montserrat_30) +#endif + +#if LV_FONT_MONTSERRAT_32 +LV_FONT_DECLARE(lv_font_montserrat_32) +#endif + +#if LV_FONT_MONTSERRAT_34 +LV_FONT_DECLARE(lv_font_montserrat_34) +#endif + +#if LV_FONT_MONTSERRAT_36 +LV_FONT_DECLARE(lv_font_montserrat_36) +#endif + +#if LV_FONT_MONTSERRAT_38 +LV_FONT_DECLARE(lv_font_montserrat_38) +#endif + +#if LV_FONT_MONTSERRAT_40 +LV_FONT_DECLARE(lv_font_montserrat_40) +#endif + +#if LV_FONT_MONTSERRAT_42 +LV_FONT_DECLARE(lv_font_montserrat_42) +#endif + +#if LV_FONT_MONTSERRAT_44 +LV_FONT_DECLARE(lv_font_montserrat_44) +#endif + +#if LV_FONT_MONTSERRAT_46 +LV_FONT_DECLARE(lv_font_montserrat_46) +#endif + +#if LV_FONT_MONTSERRAT_48 +LV_FONT_DECLARE(lv_font_montserrat_48) +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED +LV_FONT_DECLARE(lv_font_montserrat_28_compressed) +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW +LV_FONT_DECLARE(lv_font_dejavu_16_persian_hebrew) +#endif + +#if LV_FONT_SIMSUN_16_CJK +LV_FONT_DECLARE(lv_font_simsun_16_cjk) +#endif + +#if LV_FONT_UNSCII_8 +LV_FONT_DECLARE(lv_font_unscii_8) +#endif + +#if LV_FONT_UNSCII_16 +LV_FONT_DECLARE(lv_font_unscii_16) +#endif + +/*Declare the custom (user defined) fonts*/ +#ifdef LV_FONT_CUSTOM_DECLARE +LV_FONT_CUSTOM_DECLARE +#endif + +/** + * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases + * @return pointer to LV_FONT_DEFAULT + */ +static inline const lv_font_t * lv_font_default(void) +{ + return LV_FONT_DEFAULT; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*USE_FONT*/ diff --git a/libraries/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c b/libraries/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c new file mode 100644 index 0000000..02a9573 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c @@ -0,0 +1,6605 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font DejaVuSans.ttf -r 0x20-0x7f,0x5d0-0x5ea,0x600-0x6FF,0xFB50-0xFDFF,0xFE70-0xFEFF --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_dejavu_16_persian_hebrew.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1 +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x8f, 0x8e, 0x6d, + 0x0, 0x0, 0x9f, 0x9f, + + /* U+0022 "\"" */ + 0x7e, 0x8, 0xd7, 0xe0, 0x8d, 0x7e, 0x8, 0xd7, + 0xe0, 0x8d, 0x24, 0x2, 0x40, + + /* U+0023 "#" */ + 0x0, 0x0, 0x5e, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x8b, 0x0, 0xf3, 0x0, 0x0, 0x0, 0xb8, 0x3, + 0xf0, 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0x38, + 0xd3, 0x3e, 0x73, 0x30, 0x0, 0xa, 0x90, 0x1f, + 0x20, 0x0, 0x0, 0xe, 0x50, 0x5e, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x23, 0x8d, + 0x33, 0xe7, 0x33, 0x0, 0x0, 0xa9, 0x2, 0xf1, + 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x5, 0xce, 0xfd, 0xa1, 0x5f, 0x77, 0x84, 0x91, + 0x9d, 0x6, 0x60, 0x0, 0x8f, 0x36, 0x60, 0x0, + 0x1c, 0xfe, 0xc6, 0x10, 0x0, 0x3a, 0xde, 0xe3, + 0x0, 0x6, 0x60, 0xdb, 0x0, 0x6, 0x60, 0xac, + 0x98, 0x47, 0x87, 0xf7, 0x4a, 0xef, 0xfd, 0x70, + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x3, 0x30, 0x0, + + /* U+0025 "%" */ + 0x2, 0xbf, 0xc3, 0x0, 0x0, 0xa9, 0x0, 0x0, + 0xca, 0x7, 0xe0, 0x0, 0x4e, 0x0, 0x0, 0xf, + 0x30, 0xf, 0x30, 0xd, 0x50, 0x0, 0x0, 0xf2, + 0x0, 0xf3, 0x8, 0xb0, 0x0, 0x0, 0xc, 0x90, + 0x7e, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x2b, 0xfc, + 0x30, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x1, 0xbe, 0xc3, 0x0, 0x0, 0x0, 0xe, + 0x50, 0xba, 0x6, 0xe0, 0x0, 0x0, 0x8, 0xb0, + 0xf, 0x30, 0xf, 0x40, 0x0, 0x2, 0xf2, 0x0, + 0xf3, 0x0, 0xf4, 0x0, 0x0, 0xc7, 0x0, 0xb, + 0xa0, 0x7e, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x1b, + 0xfd, 0x40, + + /* U+0026 "&" */ + 0x0, 0x5d, 0xfe, 0xa0, 0x0, 0x0, 0x4f, 0xa4, + 0x6c, 0x10, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x10, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xae, 0xfa, 0x0, 0x0, + 0x41, 0x7f, 0x35, 0xfa, 0x0, 0x2f, 0x4d, 0xa0, + 0x5, 0xf9, 0x6, 0xf0, 0xf9, 0x0, 0x6, 0xf9, + 0xd9, 0xc, 0xd0, 0x0, 0x6, 0xff, 0x10, 0x3f, + 0xb3, 0x13, 0xaf, 0xf8, 0x0, 0x3b, 0xef, 0xd9, + 0x27, 0xf7, + + /* U+0027 "'" */ + 0x7e, 0x7e, 0x7e, 0x7e, 0x24, + + /* U+0028 "(" */ + 0x0, 0x8b, 0x2, 0xf3, 0x9, 0xc0, 0xe, 0x70, + 0x3f, 0x30, 0x7f, 0x0, 0x9f, 0x0, 0x9e, 0x0, + 0x8f, 0x0, 0x5f, 0x10, 0x2f, 0x50, 0xc, 0xa0, + 0x5, 0xf0, 0x0, 0xd7, 0x0, 0x36, + + /* U+0029 ")" */ + 0x7c, 0x0, 0xe, 0x50, 0x9, 0xc0, 0x3, 0xf3, + 0x0, 0xf7, 0x0, 0xcb, 0x0, 0xbc, 0x0, 0xad, + 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf5, 0x6, 0xf0, + 0xb, 0x90, 0x3f, 0x10, 0x45, 0x0, + + /* U+002A "*" */ + 0x0, 0x7, 0x70, 0x0, 0x24, 0x7, 0x70, 0x42, + 0x2b, 0xb8, 0x9a, 0xb2, 0x0, 0x4f, 0xf4, 0x0, + 0x5, 0xcb, 0xcc, 0x50, 0x4a, 0x17, 0x71, 0x94, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x1, 0x11, + 0x1f, 0x61, 0x11, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x14, 0x44, 0x4f, 0x84, 0x44, 0x30, 0x0, + 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+002D "-" */ + 0x1, 0x11, 0x13, 0xff, 0xff, 0x3, 0x33, 0x30, + + /* U+002E "." */ + 0x4f, 0x54, 0xf5, + + /* U+002F "/" */ + 0x0, 0x1, 0xf3, 0x0, 0x6, 0xe0, 0x0, 0xb, + 0x90, 0x0, 0xf, 0x40, 0x0, 0x5f, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0xf5, 0x0, 0x4, 0xf1, 0x0, + 0x9, 0xb0, 0x0, 0xe, 0x60, 0x0, 0x3f, 0x10, + 0x0, 0x8c, 0x0, 0x0, 0xd7, 0x0, 0x0, + + /* U+0030 "0" */ + 0x1, 0xae, 0xfb, 0x20, 0x0, 0xde, 0x65, 0xde, + 0x10, 0x5f, 0x40, 0x1, 0xf8, 0xa, 0xe0, 0x0, + 0xb, 0xd0, 0xdb, 0x0, 0x0, 0x8f, 0xe, 0xa0, + 0x0, 0x7, 0xf1, 0xea, 0x0, 0x0, 0x7f, 0x1d, + 0xb0, 0x0, 0x8, 0xf0, 0xae, 0x0, 0x0, 0xbd, + 0x6, 0xf3, 0x0, 0x1f, 0x80, 0xd, 0xe6, 0x5d, + 0xe1, 0x0, 0x1a, 0xef, 0xb2, 0x0, + + /* U+0031 "1" */ + 0x19, 0xcf, 0xf2, 0x0, 0x3e, 0xbb, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x5, 0x59, 0xf6, 0x53, 0xf, 0xff, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x49, 0xdf, 0xd9, 0x10, 0xcc, 0x75, 0x8f, 0xd0, + 0x20, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xa, 0xf3, 0x0, 0x0, + 0x9f, 0x95, 0x55, 0x53, 0xdf, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x3b, 0xef, 0xeb, 0x30, 0x5a, 0x75, 0x7d, 0xf3, + 0x0, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x2a, 0xf2, 0x0, 0xcf, 0xfe, 0x30, + 0x0, 0x23, 0x5c, 0xe3, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x1, 0xeb, + 0xb9, 0x65, 0x8e, 0xf3, 0x6c, 0xef, 0xda, 0x20, + + /* U+0034 "4" */ + 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, 0x0, 0x4e, + 0xfa, 0x0, 0x0, 0x0, 0xe6, 0xfa, 0x0, 0x0, + 0x9, 0xc0, 0xfa, 0x0, 0x0, 0x3f, 0x20, 0xfa, + 0x0, 0x0, 0xc8, 0x0, 0xfa, 0x0, 0x7, 0xe0, + 0x0, 0xfa, 0x0, 0x1f, 0x61, 0x11, 0xfa, 0x10, + 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x4, 0x44, 0x44, + 0xfb, 0x41, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, + + /* U+0035 "5" */ + 0x4f, 0xff, 0xff, 0xe0, 0x4f, 0x75, 0x55, 0x40, + 0x4f, 0x20, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0xfa, 0x20, 0x39, 0x54, 0x7f, 0xe1, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x4, 0xf8, + 0xb9, 0x66, 0x9f, 0xe1, 0x7c, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x4c, 0xff, 0xc3, 0x0, 0x6f, 0xb7, 0x69, + 0x50, 0x2f, 0x90, 0x0, 0x0, 0x8, 0xf1, 0x0, + 0x0, 0x0, 0xbc, 0x6e, 0xfe, 0x70, 0xd, 0xfe, + 0x64, 0x9f, 0x70, 0xdf, 0x50, 0x0, 0xbe, 0xc, + 0xf0, 0x0, 0x7, 0xf2, 0x9f, 0x0, 0x0, 0x7f, + 0x24, 0xf5, 0x0, 0xc, 0xe0, 0xb, 0xf7, 0x5a, + 0xf6, 0x0, 0x9, 0xef, 0xd5, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xfc, 0x35, 0x55, 0x57, 0xf8, + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x0, 0xe, 0xc0, + 0x0, 0x0, 0x4f, 0x60, 0x0, 0x0, 0xaf, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x0, 0xc, 0xe0, 0x0, 0x0, 0x2f, 0x80, 0x0, + 0x0, 0x8f, 0x20, 0x0, 0x0, 0xdc, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xbe, 0xfc, 0x50, 0x3, 0xfc, 0x55, 0xbf, + 0x50, 0x8f, 0x10, 0x0, 0xeb, 0x9, 0xf0, 0x0, + 0xd, 0xb0, 0x2f, 0x91, 0x17, 0xf4, 0x0, 0x3e, + 0xff, 0xf5, 0x0, 0x2e, 0xb4, 0x49, 0xf5, 0xb, + 0xe0, 0x0, 0xb, 0xe0, 0xeb, 0x0, 0x0, 0x8f, + 0x1c, 0xe0, 0x0, 0xb, 0xf0, 0x5f, 0xc5, 0x5a, + 0xf8, 0x0, 0x4c, 0xef, 0xc6, 0x0, + + /* U+0039 "9" */ + 0x3, 0xcf, 0xea, 0x10, 0x3, 0xfc, 0x56, 0xed, + 0x0, 0xbe, 0x0, 0x2, 0xf7, 0xe, 0xa0, 0x0, + 0xe, 0xc0, 0xfa, 0x0, 0x0, 0xdf, 0xc, 0xd0, + 0x0, 0x1f, 0xf0, 0x6f, 0x91, 0x2b, 0xff, 0x0, + 0x7f, 0xff, 0xbb, 0xe0, 0x0, 0x2, 0x10, 0xdb, + 0x0, 0x0, 0x0, 0x6f, 0x40, 0x39, 0x66, 0xaf, + 0x90, 0x2, 0xbe, 0xfd, 0x60, 0x0, + + /* U+003A ":" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x82, 0xf8, + + /* U+003B ";" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xeb, 0x0, 0x0, 0x16, 0xcf, 0xe8, + 0x20, 0x5, 0xbf, 0xe9, 0x30, 0x0, 0x3f, 0xfa, + 0x50, 0x0, 0x0, 0x3, 0xef, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x1, + 0x7d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x20, 0x11, 0x11, 0x11, 0x11, 0x10, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x44, 0x44, 0x44, 0x44, + 0x42, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x40, + 0x0, 0x0, 0x0, 0x6, 0xbf, 0xe9, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xd7, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xef, 0x90, 0x0, 0x0, 0x3, 0x9e, + 0xf8, 0x0, 0x2, 0x8d, 0xfc, 0x61, 0x0, 0x7c, + 0xfe, 0x82, 0x0, 0x0, 0x4f, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4b, 0xef, 0xb3, 0xd, 0xa5, 0x6e, 0xe1, 0x20, + 0x0, 0x4f, 0x40, 0x0, 0x6, 0xf3, 0x0, 0x3, + 0xfa, 0x0, 0x2, 0xeb, 0x0, 0x0, 0xbd, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0xf, + 0xa0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x7b, 0xee, 0xd8, 0x20, 0x0, 0x0, + 0x3e, 0xd6, 0x43, 0x5a, 0xf6, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0x3e, 0x60, 0xe, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xf2, 0x6c, 0x0, 0x1a, 0xed, + 0x6c, 0x50, 0xa8, 0xb6, 0x0, 0xbc, 0x44, 0xcf, + 0x50, 0x6c, 0xe3, 0x2, 0xf2, 0x0, 0x2f, 0x50, + 0x4d, 0xe3, 0x4, 0xf0, 0x0, 0xf, 0x50, 0x5c, + 0xc5, 0x2, 0xf1, 0x0, 0x1f, 0x50, 0xb8, 0x8a, + 0x0, 0xda, 0x11, 0xaf, 0x68, 0xe1, 0x1f, 0x30, + 0x2d, 0xff, 0x9c, 0xfa, 0x10, 0x6, 0xe3, 0x0, + 0x11, 0x1, 0x0, 0x0, 0x0, 0x7f, 0x83, 0x0, + 0x16, 0xd4, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0x5, 0xfb, 0xf4, 0x0, + 0x0, 0x0, 0xbe, 0x1f, 0xa0, 0x0, 0x0, 0x1f, + 0x90, 0xaf, 0x10, 0x0, 0x7, 0xf3, 0x4, 0xf6, + 0x0, 0x0, 0xdd, 0x0, 0xe, 0xc0, 0x0, 0x3f, + 0x81, 0x11, 0x9f, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xec, 0x44, 0x44, 0x4c, 0xe0, 0x5f, + 0x50, 0x0, 0x0, 0x6f, 0x4b, 0xf0, 0x0, 0x0, + 0x0, 0xfa, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xfe, 0xa2, 0x6, 0xf6, 0x44, 0x7e, + 0xe0, 0x6f, 0x20, 0x0, 0x5f, 0x46, 0xf2, 0x0, + 0x4, 0xf4, 0x6f, 0x30, 0x3, 0xce, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x6f, 0x53, 0x35, 0xce, 0x26, + 0xf2, 0x0, 0x1, 0xfa, 0x6f, 0x20, 0x0, 0xd, + 0xc6, 0xf2, 0x0, 0x1, 0xfb, 0x6f, 0x64, 0x46, + 0xdf, 0x46, 0xff, 0xff, 0xeb, 0x40, + + /* U+0043 "C" */ + 0x0, 0x3, 0xae, 0xfe, 0xb5, 0x0, 0x6, 0xfd, + 0x75, 0x6a, 0xf4, 0x3, 0xfa, 0x0, 0x0, 0x2, + 0x30, 0xaf, 0x10, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x23, 0x0, + 0x6f, 0xd7, 0x56, 0xaf, 0x40, 0x0, 0x3a, 0xef, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xfd, 0xa5, 0x0, 0x6, 0xf6, 0x45, + 0x7b, 0xfb, 0x0, 0x6f, 0x20, 0x0, 0x6, 0xf9, + 0x6, 0xf2, 0x0, 0x0, 0xb, 0xf0, 0x6f, 0x20, + 0x0, 0x0, 0x6f, 0x36, 0xf2, 0x0, 0x0, 0x4, + 0xf5, 0x6f, 0x20, 0x0, 0x0, 0x5f, 0x56, 0xf2, + 0x0, 0x0, 0x6, 0xf3, 0x6f, 0x20, 0x0, 0x0, + 0xbf, 0x6, 0xf2, 0x0, 0x0, 0x6f, 0x80, 0x6f, + 0x64, 0x57, 0xbf, 0xb0, 0x6, 0xff, 0xff, 0xea, + 0x50, 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0x6, 0xf6, 0x55, 0x55, + 0x50, 0x6f, 0x20, 0x0, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x0, 0x6f, 0x31, 0x11, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0x54, 0x44, 0x42, 0x6, + 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x65, 0x55, + 0x55, 0x6, 0xff, 0xff, 0xff, 0xf1, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0x65, 0x55, 0x51, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x31, 0x11, 0x0, 0x6f, 0xff, 0xff, 0xc0, + 0x6f, 0x54, 0x44, 0x30, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x6f, + 0xd7, 0x55, 0x9e, 0xc0, 0x3, 0xfa, 0x0, 0x0, + 0x1, 0x70, 0xb, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0xf, + 0xff, 0xf1, 0xf, 0xb0, 0x0, 0x3, 0x39, 0xf1, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf1, 0x3, 0xfa, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x6f, 0xd7, 0x55, + 0x8d, 0xf1, 0x0, 0x3, 0xae, 0xff, 0xc7, 0x10, + + /* U+0048 "H" */ + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x31, 0x11, 0x12, + 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x6f, 0x54, + 0x44, 0x45, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, + + /* U+0049 "I" */ + 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, + 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, + 0x26, 0xf2, + + /* U+004A "J" */ + 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, + 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, + 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, + 0xf2, 0x0, 0x6f, 0x20, 0x7, 0xf2, 0x0, 0xaf, + 0x4, 0x8f, 0xa0, 0xde, 0x90, 0x0, + + /* U+004B "K" */ + 0x6f, 0x20, 0x0, 0x3e, 0xd1, 0x6f, 0x20, 0x3, + 0xec, 0x10, 0x6f, 0x20, 0x3f, 0xc0, 0x0, 0x6f, + 0x24, 0xfb, 0x0, 0x0, 0x6f, 0x7f, 0xb0, 0x0, + 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xbf, + 0x80, 0x0, 0x0, 0x6f, 0x29, 0xf7, 0x0, 0x0, + 0x6f, 0x20, 0xaf, 0x70, 0x0, 0x6f, 0x20, 0xa, + 0xf6, 0x0, 0x6f, 0x20, 0x0, 0xaf, 0x60, 0x6f, + 0x20, 0x0, 0xb, 0xf5, + + /* U+004C "L" */ + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x65, 0x55, 0x54, 0x6f, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x6f, 0xf1, 0x0, 0x0, 0x4f, 0xf4, 0x6f, 0xf7, + 0x0, 0x0, 0xaf, 0xf4, 0x6f, 0xad, 0x0, 0x0, + 0xf9, 0xf4, 0x6f, 0x4f, 0x30, 0x6, 0xe5, 0xf4, + 0x6f, 0x1c, 0x90, 0xc, 0x94, 0xf4, 0x6f, 0x16, + 0xe0, 0x2f, 0x34, 0xf4, 0x6f, 0x11, 0xf4, 0x7d, + 0x4, 0xf4, 0x6f, 0x10, 0xba, 0xd8, 0x4, 0xf4, + 0x6f, 0x10, 0x5f, 0xf2, 0x4, 0xf4, 0x6f, 0x10, + 0xa, 0x90, 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, + 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, 0x4, 0xf4, + + /* U+004E "N" */ + 0x6f, 0xe0, 0x0, 0x2, 0xf6, 0x6f, 0xf7, 0x0, + 0x2, 0xf6, 0x6f, 0xbe, 0x0, 0x2, 0xf6, 0x6f, + 0x3f, 0x80, 0x2, 0xf6, 0x6f, 0x19, 0xf1, 0x2, + 0xf6, 0x6f, 0x11, 0xf8, 0x2, 0xf6, 0x6f, 0x10, + 0x8f, 0x12, 0xf6, 0x6f, 0x10, 0x1f, 0x92, 0xf6, + 0x6f, 0x10, 0x8, 0xf3, 0xf6, 0x6f, 0x10, 0x1, + 0xfb, 0xf6, 0x6f, 0x10, 0x0, 0x7f, 0xf6, 0x6f, + 0x10, 0x0, 0xe, 0xf6, + + /* U+004F "O" */ + 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xd0, 0xa, 0xf1, 0x0, 0x0, 0x7, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x58, + 0xee, 0x20, 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xfc, 0x60, 0x6, 0xf6, 0x45, 0xbf, + 0x80, 0x6f, 0x20, 0x0, 0xdf, 0x6, 0xf2, 0x0, + 0x9, 0xf1, 0x6f, 0x20, 0x0, 0xbf, 0x6, 0xf3, + 0x1, 0x7f, 0xa0, 0x6f, 0xff, 0xff, 0xa1, 0x6, + 0xf5, 0x32, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xc0, 0xa, 0xf1, 0x0, 0x0, 0x8, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x47, + 0xef, 0x30, 0x0, 0x4, 0xbe, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x30, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xfd, 0x80, 0x0, 0x6f, 0x64, 0x5a, + 0xf8, 0x0, 0x6f, 0x20, 0x0, 0xcf, 0x0, 0x6f, + 0x20, 0x0, 0x9f, 0x10, 0x6f, 0x20, 0x0, 0xbe, + 0x0, 0x6f, 0x30, 0x16, 0xf6, 0x0, 0x6f, 0xff, + 0xff, 0x90, 0x0, 0x6f, 0x53, 0x5c, 0xf5, 0x0, + 0x6f, 0x20, 0x0, 0xde, 0x0, 0x6f, 0x20, 0x0, + 0x5f, 0x70, 0x6f, 0x20, 0x0, 0xc, 0xe0, 0x6f, + 0x20, 0x0, 0x4, 0xf6, + + /* U+0053 "S" */ + 0x4, 0xbe, 0xfd, 0xa4, 0x6, 0xfc, 0x65, 0x7b, + 0x80, 0xdd, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0xaf, 0x71, 0x0, 0x0, 0x1, 0xcf, + 0xfe, 0xa4, 0x0, 0x0, 0x27, 0xbf, 0xf7, 0x0, + 0x0, 0x0, 0x1c, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0x32, 0x0, 0x0, 0x9, 0xf2, 0xec, 0x75, 0x5a, + 0xfb, 0x5, 0xad, 0xff, 0xd7, 0x0, + + /* U+0054 "T" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x55, 0x55, + 0xec, 0x55, 0x54, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, + 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, + 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, + 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, + 0x8f, 0x10, 0x0, 0x6, 0xf3, 0x4f, 0x70, 0x0, + 0xb, 0xe0, 0xb, 0xf9, 0x56, 0xbf, 0x60, 0x0, + 0x8d, 0xff, 0xc5, 0x0, + + /* U+0056 "V" */ + 0xbe, 0x0, 0x0, 0x0, 0xf, 0xa5, 0xf5, 0x0, + 0x0, 0x6, 0xf4, 0xe, 0xb0, 0x0, 0x0, 0xbe, + 0x0, 0x9f, 0x10, 0x0, 0x1f, 0x80, 0x3, 0xf6, + 0x0, 0x7, 0xf2, 0x0, 0xd, 0xc0, 0x0, 0xdc, + 0x0, 0x0, 0x7f, 0x20, 0x3f, 0x60, 0x0, 0x1, + 0xf8, 0x9, 0xf1, 0x0, 0x0, 0xb, 0xe0, 0xea, + 0x0, 0x0, 0x0, 0x5f, 0x8f, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x30, 0x0, 0x1f, 0xe0, 0x0, 0x6, 0xf2, + 0x1f, 0x70, 0x0, 0x5f, 0xf2, 0x0, 0xa, 0xe0, + 0xd, 0xb0, 0x0, 0x9b, 0xd6, 0x0, 0xe, 0xb0, + 0x9, 0xf0, 0x0, 0xd7, 0xaa, 0x0, 0x2f, 0x70, + 0x6, 0xf3, 0x1, 0xf3, 0x6e, 0x0, 0x6f, 0x30, + 0x2, 0xf7, 0x4, 0xf0, 0x2f, 0x20, 0xaf, 0x0, + 0x0, 0xeb, 0x8, 0xb0, 0xe, 0x50, 0xdb, 0x0, + 0x0, 0xae, 0xc, 0x80, 0xa, 0x91, 0xf7, 0x0, + 0x0, 0x6f, 0x3f, 0x40, 0x7, 0xd5, 0xf3, 0x0, + 0x0, 0x2f, 0xbf, 0x0, 0x3, 0xfb, 0xf0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xbf, 0x70, 0x0, + + /* U+0058 "X" */ + 0xa, 0xe1, 0x0, 0x0, 0xcd, 0x0, 0x1e, 0xa0, + 0x0, 0x7f, 0x30, 0x0, 0x5f, 0x50, 0x2f, 0x90, + 0x0, 0x0, 0xbe, 0x1c, 0xe0, 0x0, 0x0, 0x1, + 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x4f, 0x70, 0x7f, + 0x30, 0x0, 0xd, 0xc0, 0x0, 0xdd, 0x0, 0x8, + 0xf2, 0x0, 0x3, 0xf8, 0x3, 0xf8, 0x0, 0x0, + 0x8, 0xf2, + + /* U+0059 "Y" */ + 0xb, 0xe1, 0x0, 0x0, 0x3f, 0x70, 0x1f, 0xa0, + 0x0, 0xd, 0xc0, 0x0, 0x6f, 0x40, 0x8, 0xf3, + 0x0, 0x0, 0xbe, 0x12, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xcd, 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x55, 0x55, + 0x55, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xe2, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0xbf, 0x30, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xe5, 0x55, 0x55, 0x55, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xf4, + + /* U+005B "[" */ + 0xaf, 0xfb, 0xad, 0x21, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xaf, 0xfa, 0x12, 0x21, + + /* U+005C "\\" */ + 0xd7, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x3f, 0x10, + 0x0, 0xe, 0x60, 0x0, 0x9, 0xb0, 0x0, 0x4, + 0xf1, 0x0, 0x0, 0xf5, 0x0, 0x0, 0xaa, 0x0, + 0x0, 0x5f, 0x0, 0x0, 0xf, 0x40, 0x0, 0xb, + 0x90, 0x0, 0x6, 0xe0, 0x0, 0x1, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x2, 0xae, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x6f, 0xfe, 0x2, 0x21, + + /* U+005E "^" */ + 0x0, 0x0, 0x28, 0x50, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x60, 0x0, 0x0, 0x1d, 0xd1, 0x8f, 0x50, + 0x0, 0x1d, 0xc1, 0x0, 0x7f, 0x50, 0xc, 0xc0, + 0x0, 0x0, 0x6f, 0x40, + + /* U+005F "_" */ + 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, 0x22, + 0x22, 0x20, + + /* U+0060 "`" */ + 0x4f, 0x40, 0x0, 0x6e, 0x10, 0x0, 0x8b, 0x0, + + /* U+0061 "a" */ + 0x2, 0xae, 0xfd, 0x90, 0x0, 0x48, 0x53, 0x6d, + 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x7, 0xce, + 0xff, 0xf5, 0x8, 0xf6, 0x32, 0x3f, 0x50, 0xe8, + 0x0, 0x3, 0xf5, 0xf, 0x70, 0x0, 0x8f, 0x50, + 0xbd, 0x20, 0x6e, 0xf5, 0x1, 0xae, 0xfb, 0x3f, + 0x50, + + /* U+0062 "b" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe3, 0xcf, + 0xe7, 0x0, 0x8f, 0xe6, 0x49, 0xf6, 0x8, 0xf5, + 0x0, 0xa, 0xe0, 0x8f, 0x0, 0x0, 0x5f, 0x28, + 0xe0, 0x0, 0x3, 0xf3, 0x8f, 0x0, 0x0, 0x5f, + 0x28, 0xf5, 0x0, 0xa, 0xe0, 0x8f, 0xe6, 0x49, + 0xf6, 0x8, 0xe3, 0xcf, 0xe7, 0x0, + + /* U+0063 "c" */ + 0x0, 0x2a, 0xef, 0xd7, 0x3, 0xfd, 0x54, 0x69, + 0xb, 0xe0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x64, 0x69, + 0x0, 0x3b, 0xff, 0xd7, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, 0xdf, + 0xd5, 0xbb, 0x4, 0xfb, 0x45, 0xee, 0xb0, 0xcd, + 0x0, 0x3, 0xfb, 0xf, 0x80, 0x0, 0xd, 0xb1, + 0xf6, 0x0, 0x0, 0xcb, 0xf, 0x70, 0x0, 0xd, + 0xb0, 0xcb, 0x0, 0x2, 0xfb, 0x4, 0xf7, 0x2, + 0xcf, 0xb0, 0x5, 0xdf, 0xd6, 0xbb, + + /* U+0065 "e" */ + 0x0, 0x2b, 0xff, 0xc3, 0x0, 0x2f, 0xc5, 0x4a, + 0xf3, 0xb, 0xe0, 0x0, 0xd, 0xa0, 0xf8, 0x0, + 0x0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0xf9, + 0x22, 0x22, 0x22, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0x2f, 0xc6, 0x45, 0x88, 0x0, 0x2a, 0xef, 0xeb, + 0x40, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xff, 0x1, 0xf9, 0x33, 0x3, 0xf3, + 0x0, 0xaf, 0xff, 0xf9, 0x15, 0xf4, 0x21, 0x4, + 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, + 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, + 0x0, 0x4, 0xf3, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5d, + 0xeb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, + 0x4f, 0xa4, 0x5d, 0xeb, 0x0, 0x5d, 0xfd, 0x5c, + 0xa0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x94, 0x35, + 0xde, 0x10, 0xb, 0xef, 0xea, 0x20, + + /* U+0068 "h" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x2b, 0xfd, 0x60, + 0x8f, 0xd7, 0x49, 0xf4, 0x8f, 0x40, 0x0, 0xda, + 0x8f, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + + /* U+0069 "i" */ + 0x7f, 0x6c, 0x0, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006A "j" */ + 0x0, 0x7f, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x8e, 0x14, 0xda, 0x4f, 0xb2, + + /* U+006B "k" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x6f, 0x70, 0x8e, 0x0, 0x7f, 0x60, 0x8, 0xe0, + 0x9f, 0x40, 0x0, 0x8e, 0xae, 0x30, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x8e, 0x3f, 0xa0, 0x0, + 0x8, 0xe0, 0x3f, 0xa0, 0x0, 0x8e, 0x0, 0x3f, + 0xa0, 0x8, 0xe0, 0x0, 0x3f, 0xb0, + + /* U+006C "l" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfd, 0x50, 0x6d, 0xfb, 0x10, 0x8f, + 0xd6, 0x4b, 0xf8, 0xc5, 0x5e, 0xb0, 0x8f, 0x40, + 0x1, 0xfe, 0x0, 0x6, 0xf1, 0x8f, 0x0, 0x0, + 0xea, 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, + 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, + 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, + 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + + /* U+006E "n" */ + 0x8e, 0x3c, 0xfd, 0x60, 0x8f, 0xc4, 0x16, 0xf4, + 0x8f, 0x30, 0x0, 0xda, 0x8f, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, + + /* U+006F "o" */ + 0x0, 0x4c, 0xff, 0xb2, 0x0, 0x4f, 0xb4, 0x5d, + 0xe1, 0xc, 0xd0, 0x0, 0x1f, 0x90, 0xf8, 0x0, + 0x0, 0xbd, 0x1f, 0x60, 0x0, 0xa, 0xe0, 0xf8, + 0x0, 0x0, 0xbd, 0xc, 0xd0, 0x0, 0x1f, 0x90, + 0x4f, 0xb5, 0x5d, 0xe1, 0x0, 0x4c, 0xff, 0xb2, + 0x0, + + /* U+0070 "p" */ + 0x8e, 0x4d, 0xfe, 0x70, 0x8, 0xfd, 0x30, 0x6f, + 0x60, 0x8f, 0x40, 0x0, 0x9e, 0x8, 0xf0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xf0, + 0x0, 0x5, 0xf2, 0x8f, 0x60, 0x0, 0xbe, 0x8, + 0xfe, 0x74, 0x9f, 0x60, 0x8e, 0x3c, 0xfe, 0x70, + 0x8, 0xe0, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5e, + 0xeb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, + 0x4f, 0xb4, 0x5e, 0xeb, 0x0, 0x5d, 0xfd, 0x5b, + 0xb0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0xbb, + + /* U+0072 "r" */ + 0x0, 0x0, 0x0, 0x8e, 0x4c, 0xf9, 0x8f, 0xd4, + 0x12, 0x8f, 0x40, 0x0, 0x8f, 0x0, 0x0, 0x8e, + 0x0, 0x0, 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + + /* U+0073 "s" */ + 0x1, 0xae, 0xfe, 0xb0, 0xc, 0xd5, 0x35, 0x91, + 0xf, 0x60, 0x0, 0x0, 0xc, 0xe6, 0x20, 0x0, + 0x1, 0x9e, 0xfe, 0x70, 0x0, 0x0, 0x28, 0xf5, + 0x0, 0x0, 0x0, 0xf8, 0x1c, 0x64, 0x49, 0xf3, + 0x9, 0xdf, 0xfc, 0x40, + + /* U+0074 "t" */ + 0x4, 0x70, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, + 0x0, 0x9f, 0xff, 0xfe, 0x19, 0xf2, 0x21, 0x8, + 0xf0, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, + 0x8, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x5, 0xf6, + 0x32, 0x0, 0x9e, 0xfe, + + /* U+0075 "u" */ + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0x9d, 0x0, 0x0, 0xcb, + 0x7e, 0x0, 0x1, 0xfb, 0x2f, 0x81, 0x2b, 0xfb, + 0x5, 0xdf, 0xd5, 0xcb, + + /* U+0076 "v" */ + 0x5f, 0x20, 0x0, 0xb, 0xd0, 0xf8, 0x0, 0x1, + 0xf7, 0x9, 0xe0, 0x0, 0x7f, 0x10, 0x3f, 0x40, + 0xc, 0xb0, 0x0, 0xda, 0x2, 0xf5, 0x0, 0x8, + 0xf0, 0x8f, 0x0, 0x0, 0x2f, 0x5e, 0xa0, 0x0, + 0x0, 0xce, 0xf4, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x3f, 0x30, 0x6, 0xf8, 0x0, 0x2f, 0x40, 0xe7, + 0x0, 0xaf, 0xc0, 0x6, 0xf0, 0xb, 0xb0, 0xe, + 0x8f, 0x0, 0xac, 0x0, 0x6f, 0x3, 0xf1, 0xf4, + 0xe, 0x80, 0x2, 0xf4, 0x7c, 0xb, 0x82, 0xf4, + 0x0, 0xe, 0x8b, 0x80, 0x7c, 0x6f, 0x0, 0x0, + 0xac, 0xf4, 0x3, 0xfb, 0xc0, 0x0, 0x6, 0xff, + 0x0, 0xf, 0xf8, 0x0, 0x0, 0x2f, 0xc0, 0x0, + 0xbf, 0x40, 0x0, + + /* U+0078 "x" */ + 0xd, 0xc0, 0x0, 0x4f, 0x60, 0x3f, 0x80, 0x1e, + 0xb0, 0x0, 0x7f, 0x4b, 0xe1, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x1, + 0xec, 0xf6, 0x0, 0x0, 0xbe, 0x18, 0xf2, 0x0, + 0x7f, 0x30, 0xc, 0xd0, 0x3f, 0x80, 0x0, 0x2f, + 0x90, + + /* U+0079 "y" */ + 0x4f, 0x30, 0x0, 0xb, 0xc0, 0xe9, 0x0, 0x2, + 0xf6, 0x7, 0xf0, 0x0, 0x8f, 0x0, 0x1f, 0x60, + 0xe, 0x90, 0x0, 0xac, 0x5, 0xf2, 0x0, 0x3, + 0xf3, 0xcc, 0x0, 0x0, 0xd, 0xcf, 0x50, 0x0, + 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6f, 0x20, 0x0, 0x2, 0x4e, 0xb0, + 0x0, 0x0, 0xbf, 0xc1, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xfb, 0x2, 0x22, 0x26, 0xf8, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0x0, 0xcd, 0x10, + 0x0, 0xa, 0xe2, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x5, 0xf6, 0x0, 0x0, 0x2f, 0xb2, 0x22, 0x21, + 0x5f, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x30, 0x6, 0xf6, 0x20, 0x0, + 0x8e, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x9d, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x2, 0xe9, 0x0, + 0xf, 0xfc, 0x10, 0x0, 0x25, 0xf8, 0x0, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x6, 0xf3, + 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x1, 0x20, + + /* U+007C "|" */ + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + + /* U+007D "}" */ + 0xfe, 0xb1, 0x0, 0x2, 0x4f, 0x80, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0xb, 0xc0, 0x0, 0x0, 0xbc, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x7f, 0x40, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x5f, 0x73, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0xac, 0x0, 0x0, 0xb, + 0xc0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x1e, 0x90, + 0x0, 0xff, 0xd2, 0x0, 0x2, 0x10, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfe, + 0xa5, 0x12, 0x7a, 0x4d, 0x64, 0x6b, 0xff, 0xfd, + 0x31, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+05D0 "א" */ + 0x3f, 0x80, 0x0, 0x3f, 0x40, 0x8f, 0x30, 0x3, + 0xf3, 0x0, 0xdd, 0x0, 0x3f, 0x20, 0x1b, 0xf8, + 0x6, 0xf0, 0xc, 0xb8, 0xf6, 0xe8, 0x4, 0xf1, + 0xc, 0xf7, 0x0, 0x7e, 0x0, 0x2f, 0x80, 0x8, + 0xe0, 0x0, 0x7f, 0x30, 0x8e, 0x0, 0x0, 0xcd, + 0x0, + + /* U+05D1 "ב" */ + 0x5f, 0xff, 0xe8, 0x0, 0x0, 0x11, 0x25, 0xea, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x0, + 0x3f, 0x30, 0x0, 0x0, 0x3, 0xf4, 0x0, 0x0, + 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3, 0xf4, 0x0, + 0x22, 0x22, 0x4f, 0x51, 0x5f, 0xff, 0xff, 0xff, + 0x90, + + /* U+05D2 "ג" */ + 0x1f, 0xd8, 0x0, 0x0, 0x14, 0xf7, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x9f, 0x10, 0x0, 0xd, 0xf4, + 0x1, 0x4a, 0xbe, 0x80, 0x4f, 0xc1, 0x9e, 0x0, + + /* U+05D3 "ד" */ + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x11, 0x11, 0xda, + 0x10, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, + 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, + 0x0, + + /* U+05D4 "ה" */ + 0x8f, 0xff, 0xfd, 0x70, 0x1, 0x11, 0x26, 0xf6, + 0x0, 0x0, 0x0, 0x9c, 0x4, 0x0, 0x0, 0x7f, + 0x5f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, + + /* U+05D5 "ו" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, + + /* U+05D6 "ז" */ + 0x5f, 0xff, 0xd0, 0x1c, 0x81, 0x3, 0xf2, 0x0, + 0x6f, 0x10, 0x6, 0xf0, 0x0, 0x6f, 0x0, 0x6, + 0xf0, 0x0, 0x6f, 0x0, 0x6, 0xf0, 0x0, + + /* U+05D7 "ח" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8e, 0x11, 0x26, 0xf7, + 0x8e, 0x0, 0x0, 0x9d, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, + + /* U+05D8 "ט" */ + 0x8e, 0x0, 0xcf, 0xd4, 0x8, 0xe0, 0x4, 0x3b, + 0xe0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x0, 0xf6, 0x4f, 0x30, 0x0, 0x4f, 0x40, + 0xde, 0x63, 0x6e, 0xc0, 0x1, 0xae, 0xfe, 0x91, + 0x0, + + /* U+05D9 "י" */ + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x40, + + /* U+05DA "ך" */ + 0x5f, 0xff, 0xd7, 0x0, 0x1, 0x13, 0x8f, 0x70, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x6, 0xf1, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + + /* U+05DB "כ" */ + 0x5f, 0xff, 0xd8, 0x0, 0x1, 0x12, 0x5d, 0xa0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x4, 0xf3, 0x1, 0x12, 0x5d, 0xa0, + 0x5f, 0xff, 0xd8, 0x0, + + /* U+05DC "ל" */ + 0x28, 0x10, 0x0, 0x0, 0x5f, 0x20, 0x0, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x1, 0x11, 0x12, 0xf9, 0x0, 0x0, 0x6, 0xf2, + 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x2f, 0x50, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xf8, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0xc, 0xb0, 0x0, + + /* U+05DD "ם" */ + 0x8f, 0xff, 0xfe, 0x90, 0x8, 0xe1, 0x12, 0x5e, + 0x90, 0x8e, 0x0, 0x0, 0x7f, 0x8, 0xe0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, 0xe0, + 0x0, 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, + 0xe2, 0x22, 0x25, 0xf2, 0x8f, 0xff, 0xff, 0xff, + 0x20, + + /* U+05DE "מ" */ + 0x1f, 0x90, 0xae, 0xfc, 0x20, 0x9, 0xea, 0xc2, + 0x1c, 0xd0, 0x3, 0xff, 0x20, 0x4, 0xf3, 0x0, + 0xfc, 0x0, 0x1, 0xf6, 0x0, 0xf8, 0x0, 0x0, + 0xf6, 0x2, 0xf5, 0x0, 0x0, 0xf6, 0x5, 0xf2, + 0x0, 0x0, 0xf6, 0x8, 0xf0, 0x1, 0x12, 0xf6, + 0xb, 0xc0, 0xf, 0xff, 0xf6, + + /* U+05DF "ן" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, + + /* U+05E0 "נ" */ + 0x1f, 0xea, 0x10, 0x14, 0xea, 0x0, 0x9, 0xe0, + 0x0, 0x8e, 0x0, 0x8, 0xf0, 0x0, 0x8f, 0x0, + 0x8, 0xf0, 0x22, 0x9f, 0x5f, 0xff, 0xf0, + + /* U+05E1 "ס" */ + 0x8f, 0xff, 0xfe, 0x91, 0x8, 0xe3, 0x33, 0x6e, + 0xd0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x1, 0xf6, 0x3f, 0x50, 0x0, 0x6f, 0x30, + 0xcf, 0x64, 0x7f, 0xb0, 0x1, 0x9e, 0xfe, 0x90, + 0x0, + + /* U+05E2 "ע" */ + 0x2f, 0x50, 0x0, 0xf, 0x90, 0xea, 0x0, 0x0, + 0xf9, 0x9, 0xe0, 0x0, 0xf, 0x80, 0x4f, 0x30, + 0x0, 0xf7, 0x0, 0xf7, 0x0, 0x2f, 0x50, 0xb, + 0xc0, 0x6, 0xf1, 0x0, 0x6f, 0x2, 0xe9, 0x0, + 0x2, 0xfa, 0xea, 0x0, 0x5, 0xbf, 0xd5, 0x0, + 0x4, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+05E3 "ף" */ + 0x8f, 0xff, 0xfc, 0x50, 0x8e, 0x11, 0x39, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x7f, 0x20, 0x0, 0xbc, + 0x1d, 0xfe, 0x0, 0xac, 0x0, 0x21, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + + /* U+05E4 "פ" */ + 0x8f, 0xff, 0xeb, 0x30, 0x8, 0xe1, 0x24, 0xbf, + 0x30, 0x8e, 0x0, 0x0, 0xbc, 0x6, 0xf2, 0x0, + 0x6, 0xf0, 0x1d, 0xfe, 0x0, 0x5f, 0x10, 0x2, + 0x10, 0x6, 0xf0, 0x0, 0x0, 0x0, 0xcc, 0x0, + 0x11, 0x24, 0xaf, 0x30, 0x8f, 0xff, 0xfb, 0x30, + 0x0, + + /* U+05E5 "ץ" */ + 0x1e, 0xa0, 0x0, 0x7f, 0x4, 0xf5, 0x0, 0x8e, + 0x0, 0x9e, 0x10, 0xbb, 0x0, 0x1e, 0x86, 0xf3, + 0x0, 0x9, 0xfe, 0x50, 0x0, 0x6, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + + /* U+05E6 "צ" */ + 0x1e, 0xb0, 0x0, 0x6f, 0x0, 0x5f, 0x60, 0x6, + 0xf0, 0x0, 0xaf, 0x10, 0x7e, 0x0, 0x1, 0xeb, + 0xa, 0xb0, 0x0, 0x5, 0xfb, 0xf3, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, + 0x11, 0x11, 0x7f, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0x0, + + /* U+05E7 "ק" */ + 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x11, + 0x1c, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x4, + 0x0, 0x0, 0x8f, 0x10, 0x5f, 0x10, 0x0, 0xea, + 0x0, 0x5f, 0x10, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0xb, 0xd0, 0x0, 0x5f, 0x10, 0x1f, 0x60, 0x0, + 0x5f, 0x10, 0x8f, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, + 0x0, + + /* U+05E8 "ר" */ + 0x5f, 0xff, 0xd9, 0x10, 0x1, 0x12, 0x5e, 0xc0, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, + + /* U+05E9 "ש" */ + 0x3f, 0x30, 0xf, 0x50, 0xd, 0x91, 0xf5, 0x1, + 0xf4, 0x0, 0xf7, 0xf, 0x70, 0x4f, 0x10, 0x1f, + 0x40, 0xda, 0x1b, 0xc0, 0x4, 0xf1, 0xb, 0xff, + 0xd2, 0x0, 0x8d, 0x0, 0x9e, 0x10, 0x0, 0xd, + 0x80, 0x7, 0xf0, 0x0, 0x9, 0xf1, 0x0, 0x5f, + 0x42, 0x5c, 0xf4, 0x0, 0x2, 0xff, 0xfd, 0x82, + 0x0, 0x0, + + /* U+05EA "ת" */ + 0x7f, 0xff, 0xff, 0xd8, 0x0, 0x3, 0xf6, 0x12, + 0x6f, 0x70, 0x2, 0xf5, 0x0, 0x9, 0xe0, 0x2, + 0xf5, 0x0, 0x6, 0xf0, 0x2, 0xf5, 0x0, 0x6, + 0xf0, 0x2, 0xf5, 0x0, 0x6, 0xf1, 0x2, 0xf4, + 0x0, 0x6, 0xf1, 0x17, 0xf1, 0x0, 0x6, 0xf1, + 0xde, 0x70, 0x0, 0x6, 0xf1, + + /* U+0606 "؆" */ + 0x0, 0x1, 0x51, 0x53, 0x30, 0x0, 0x0, 0xe7, + 0xb8, 0x50, 0xd9, 0x0, 0x9f, 0xcc, 0x10, 0xd, + 0x0, 0x58, 0x0, 0x0, 0x7, 0x60, 0x3a, 0x0, + 0x0, 0x1, 0xc0, 0x2b, 0x0, 0x0, 0x0, 0xb2, + 0x14, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, 0x50, + 0x0, 0xd, 0x0, 0xe, 0xa5, 0x0, 0x9, 0x40, + 0x4f, 0x10, 0x0, 0x2, 0xa0, 0xab, 0x0, 0x0, + 0x0, 0xc2, 0xf5, 0x0, 0x0, 0x0, 0x6d, 0xf0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0607 "؇" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa, + 0xb2, 0x0, 0xc9, 0x0, 0x3c, 0x10, 0x0, 0xc, + 0x0, 0x3d, 0x90, 0x0, 0x7, 0x60, 0xb4, 0x1, + 0x0, 0x1, 0xc0, 0x3c, 0xca, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xb, 0xd5, + 0x0, 0xd, 0x0, 0x1f, 0x51, 0x0, 0x8, 0x50, + 0x6f, 0x0, 0x0, 0x2, 0xb0, 0xca, 0x0, 0x0, + 0x0, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x6e, 0xe0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0609 "؉" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0xc8, 0x0, 0x7c, + 0x0, 0x0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x2, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0xb8, 0x0, 0xf, + 0x70, 0x7f, + + /* U+060A "؊" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0xc8, + 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0x0, 0xe7, 0xb8, + 0x0, 0xf, 0x70, 0x7f, 0x0, 0xf7, + + /* U+060C "،" */ + 0x2, 0xc0, 0xba, 0x2f, 0x64, 0xf5, + + /* U+0615 "ؕ" */ + 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x6, 0x65, + 0x50, 0x6, 0xd6, 0xe0, 0xd, 0xdc, 0x70, + + /* U+061B "؛" */ + 0x4, 0xd0, 0xc9, 0x3f, 0x63, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x54, 0xf5, + + /* U+061F "؟" */ + 0x8, 0xef, 0xd8, 0x17, 0xf9, 0x57, 0xd6, 0xcd, + 0x0, 0x0, 0x1b, 0xe0, 0x0, 0x0, 0x3f, 0xa0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x5f, 0x30, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0xd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, 0x1, + 0xf7, 0x0, + + /* U+0621 "ء" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+0622 "آ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+0623 "أ" */ + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x17, 0x30, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + + /* U+0624 "ؤ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+0625 "إ" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+0626 "ئ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+0627 "ا" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+0628 "ب" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+0629 "ة" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+062A "ت" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+062B "ث" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+062C "ج" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+062D "ح" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+062E "خ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+062F "د" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+0630 "ذ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+0631 "ر" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+0632 "ز" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+0633 "س" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0634 "ش" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0635 "ص" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0636 "ض" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0637 "ط" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0638 "ظ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0639 "ع" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+063A "غ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+0640 "ـ" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, + + /* U+0641 "ف" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+0642 "ق" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+0643 "ك" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+0644 "ل" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+0645 "م" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+0646 "ن" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+0647 "ه" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+0648 "و" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+0649 "ى" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+064A "ي" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+064B "ً" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xd3, 0x27, 0x41, + 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, 0x0, + + /* U+064C "ٌ" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x36, 0x1c, + 0xe3, 0x2a, 0x1c, 0x10, 0x9, 0xc3, 0x0, + + /* U+064D "ٍ" */ + 0x1, 0x48, 0xb3, 0x3c, 0x85, 0x10, 0x3, 0x6a, + 0xd3, 0x3a, 0x63, 0x0, + + /* U+064E "َ" */ + 0x0, 0x0, 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, + 0x0, + + /* U+064F "ُ" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x0, 0x3e, + 0xe3, 0x1, 0x8b, 0x0, 0x3c, 0x60, 0x0, + + /* U+0650 "ِ" */ + 0x0, 0x14, 0x82, 0x3d, 0xc9, 0x50, 0x0, 0x0, + 0x0, + + /* U+0651 "ّ" */ + 0x0, 0x0, 0x32, 0x12, 0x66, 0x56, 0x66, 0x67, + 0x66, 0x66, 0x9c, 0xd3, 0x2e, 0x92, 0x30, + + /* U+0652 "ْ" */ + 0x5, 0xdd, 0x50, 0xe, 0x12, 0xe0, 0xe, 0x22, + 0xe0, 0x5, 0xed, 0x50, + + /* U+0653 "ٓ" */ + 0x2a, 0x20, 0x28, 0x94, 0xbd, 0xa3, 0x0, 0x0, + 0x0, + + /* U+0654 "ٔ" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0655 "ٕ" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0657 "ٗ" */ + 0x0, 0x5, 0xc3, 0x0, 0xa8, 0x10, 0x3e, 0xe3, + 0x0, 0xc, 0x7a, 0x0, 0x6, 0xe5, 0x0, + + /* U+065A "ٚ" */ + 0x7, 0x11, 0x70, 0x7, 0xaa, 0x70, 0x0, 0xdd, + 0x0, + + /* U+0660 "٠" */ + 0x8f, 0x29, 0xf2, + + /* U+0661 "١" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+0662 "٢" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+0663 "٣" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+0664 "٤" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x40, 0x4, + 0xfd, 0x71, 0x0, 0xda, 0x0, 0x0, 0xa, 0xe4, + 0x0, 0x0, 0x2e, 0xf6, 0x0, 0x1e, 0xd6, 0x10, + 0x8, 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x3, + 0xfb, 0x79, 0xd5, 0x5, 0xdf, 0xd9, 0x10, + + /* U+0665 "٥" */ + 0x0, 0x1, 0x0, 0x0, 0x1d, 0xf9, 0x0, 0xb, + 0xd8, 0xf5, 0x3, 0xf4, 0xb, 0xc0, 0x8e, 0x0, + 0x4f, 0x2c, 0xa0, 0x0, 0xf6, 0xe8, 0x0, 0xe, + 0x8e, 0x80, 0x0, 0xe8, 0xcc, 0x0, 0x2f, 0x67, + 0xfa, 0x8d, 0xf1, 0x8, 0xef, 0xd4, 0x0, + + /* U+0666 "٦" */ + 0x25, 0x21, 0x24, 0x40, 0x4f, 0xff, 0xff, 0xa0, + 0x1, 0x34, 0x3c, 0xa0, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x8, 0xe0, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+0667 "٧" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+0668 "٨" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+0669 "٩" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+066A "٪" */ + 0xd9, 0x0, 0xe, 0x4c, 0x80, 0x7, 0xc0, 0x0, + 0x1, 0xe3, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0x9, 0xa0, 0x0, 0x2, 0xf2, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x2f, 0x10, 0xe, 0x6b, + 0x80, 0x0, 0xf7, + + /* U+066B "٫" */ + 0x0, 0x6, 0x80, 0x0, 0x6c, 0x0, 0x8, 0xb0, + 0x0, 0xc7, 0x0, 0x6f, 0x21, 0x7f, 0x60, 0xfe, + 0x60, 0x2, 0x0, 0x0, + + /* U+066C "٬" */ + 0xa, 0x70, 0xf9, 0x3f, 0x27, 0xa0, + + /* U+066D "٭" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x5, + 0xfd, 0xf1, 0x0, 0x0, 0x94, 0x8, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+066E "ٮ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, + + /* U+066F "ٯ" */ + 0x0, 0x0, 0x0, 0x1b, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0xf9, + 0x7, 0xf0, 0x0, 0x0, 0x0, 0xdc, 0x19, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf1, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xd0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x60, + 0xf, 0x70, 0x0, 0x4, 0xeb, 0x0, 0xb, 0xe5, + 0x35, 0xaf, 0xb0, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+0670 "ٰ" */ + 0x33, 0x67, 0x67, 0x67, 0x67, + + /* U+0674 "ٴ" */ + 0x8, 0xc5, 0xc, 0x0, 0xc, 0xc7, 0x6, 0x30, + + /* U+0679 "ٹ" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+067A "ٺ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067B "ٻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067C "ټ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xff, 0xd9, 0x61, 0x0, 0x0, + 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x76, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd3, + 0x0, 0x0, 0x0, + + /* U+067D "ٽ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x89, 0x0, + 0x0, 0x9b, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067E "پ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067F "ٿ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+0680 "ڀ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+0681 "ځ" */ + 0x0, 0xa, 0xc2, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xa4, 0x0, 0x0, 0x0, + 0x38, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0682 "ڂ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0683 "ڃ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+0684 "ڄ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0685 "څ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7a, 0x8a, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0686 "چ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0687 "ڇ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0688 "ڈ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+0689 "ډ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xff, 0xf1, + 0x0, 0xa, 0x58, 0x80, 0x0, 0xb5, 0x88, 0x0, + 0x3, 0xdc, 0x10, + + /* U+068A "ڊ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x11, 0x0, + + /* U+068B "ڋ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+068C "ڌ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+068D "ڍ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+068E "ڎ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+068F "ڏ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2b, + 0x60, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7f, 0x10, + 0x96, 0xaf, 0xc0, 0xd, 0xfe, 0x91, 0x0, + + /* U+0690 "ڐ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+0691 "ڑ" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0692 "ڒ" */ + 0x0, 0x0, 0x47, 0x8, 0x40, 0x0, 0x0, 0xd8, + 0xd0, 0x0, 0x0, 0x4, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0xba, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x4e, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0693 "ړ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, 0x1, + 0x9f, 0xfe, 0x90, 0x59, 0xbf, 0xfc, 0xd1, 0xf0, + 0xae, 0xb7, 0x10, 0xbe, 0x90, + + /* U+0694 "ڔ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xb, + 0xa0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, + 0xc, 0xa0, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, + 0x2, 0xed, 0x0, 0x1, 0x4a, 0xfd, 0x20, 0xa, + 0xff, 0xc6, 0x0, 0x98, 0x33, 0x10, 0x0, 0x0, + 0x0, + + /* U+0695 "ڕ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xd3, 0x0, 0x20, 0x14, 0x6c, 0xfd, 0x2a, + 0x86, 0xb0, 0xaf, 0xfc, 0x60, 0x1, 0xee, 0x20, + 0x33, 0x10, 0x0, 0x0, 0x33, 0x0, + + /* U+0696 "ږ" */ + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x11, 0x0, 0xbb, 0x0, 0x9, 0x90, + 0xe, 0x90, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, + 0x4b, 0xfa, 0x0, 0x7c, 0xef, 0xf9, 0x6, 0x5a, + 0xec, 0x72, 0x0, 0x54, + + /* U+0697 "ڗ" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, 0xd0, + 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, 0x60, + 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0698 "ژ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0699 "ڙ" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+069A "ښ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, 0xc, 0x90, + 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, 0x0, 0x8, + 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, 0x10, 0x0, + 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, 0xca, 0x0, + 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, 0xb0, 0xe8, + 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, + 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, 0x1f, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069B "ڛ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x6f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xca, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xe8, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x85, 0x59, 0xfe, 0x20, 0xb2, 0xb0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0x91, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, + + /* U+069C "ڜ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x5, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x5f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x85, 0x59, 0xfe, 0x20, + 0xb2, 0xb0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x91, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+069D "ڝ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0xf3, 0xf0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069E "ڞ" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, + 0xa, 0x43, 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, + 0x0, 0x0, 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, + 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, + 0x0, 0xf7, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+069F "ڟ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0xf, 0x20, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x20, + 0x0, 0x0, 0x0, 0xf, 0x70, 0xf3, 0xf2, 0x0, + 0x0, 0x0, 0xf7, 0x2, 0x2, 0x10, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+06A0 "ڠ" */ + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, + 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, + 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, + 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, + 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06A1 "ڡ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xcd, 0x18, 0xf3, 0xba, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x1f, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xc0, 0xbf, 0x83, 0x21, + 0x22, 0x46, 0xaf, 0xe2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, + + /* U+06A2 "ڢ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, + 0x35, 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A3 "ڣ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, + 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+06A4 "ڤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A5 "ڥ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x9d, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xc1, 0x6f, 0x3b, 0xb0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0xf3, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x6f, 0x1e, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xc0, 0x7f, 0xa4, 0x21, + 0x23, 0x58, 0xdf, 0xe2, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf3, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A6 "ڦ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A7 "ڧ" */ + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+06A8 "ڨ" */ + 0x0, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0x6c, 0x0, 0x0, 0x0, 0x0, 0x2, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xeb, + 0x19, 0xe0, 0x0, 0x0, 0x0, 0xeb, 0x18, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf2, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xe0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x80, + 0xf, 0x70, 0x0, 0x3, 0xec, 0x0, 0xb, 0xe4, + 0x35, 0xaf, 0xc1, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+06A9 "ک" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AA "ڪ" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, + 0xc9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x5, 0x8b, + 0xdf, 0xff, 0xfc, 0x91, 0x89, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xaf, 0xce, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xd8, 0xf9, 0x42, 0x11, 0x11, 0x24, + 0x9f, 0xf5, 0x7, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x81, 0x0, 0x0, 0x24, 0x44, 0x44, 0x31, 0x0, + 0x0, + + /* U+06AB "ګ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, + 0x45, 0xa2, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, + 0xbe, 0x50, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, + 0x49, 0xff, 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AC "ڬ" */ + 0x0, 0x0, 0x2f, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x20, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+06AD "ڭ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+06AE "ڮ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06AF "گ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B0 "ڰ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xa2, 0x0, 0x0, + 0x0, 0x17, 0xde, 0x71, 0x43, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x7e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0x45, 0xa2, + 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, 0xbe, 0x50, + 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, 0x49, 0xff, + 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B1 "ڱ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B2 "ڲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd5, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, + + /* U+06B3 "ڳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+06B4 "ڴ" */ + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, 0x0, 0x0, + 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, 0x0, 0x17, + 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, 0x6b, 0x41, + 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xe8, + 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x1b, 0xe0, + 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, 0x60, 0x0, + 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B5 "ڵ" */ + 0x0, 0x0, 0x0, 0x34, 0x5, 0x30, 0x0, 0x0, + 0x1, 0xe5, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, 0xf2, 0x3, + 0x60, 0x0, 0x0, 0x5f, 0x20, 0xcb, 0x0, 0x0, + 0x8, 0xf0, 0xd, 0x90, 0x0, 0x2, 0xeb, 0x0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0x0, 0xaf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, + + /* U+06B6 "ڶ" */ + 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, 0x5, + 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, 0x0, + 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, 0x20, + 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, 0x30, + 0x0, 0x0, + + /* U+06B7 "ڷ" */ + 0x0, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x2f, 0x3e, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf2, 0x36, 0x0, 0x0, 0x5, 0xf2, 0xcb, 0x0, + 0x0, 0x8, 0xf0, 0xd9, 0x0, 0x0, 0x2e, 0xb0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0xa, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + + /* U+06B8 "ڸ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, 0x0, 0xb, 0x7b, 0x60, 0x0, + 0x0, 0x1, 0x12, 0x10, 0x0, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+06B9 "ڹ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x58, + 0x0, 0x0, 0x0, 0xf6, 0xcb, 0x0, 0x0, 0x0, + 0xe8, 0xd9, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x9, 0xf1, 0x5f, 0x94, 0x23, 0x9f, 0x80, + 0x6, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, + + /* U+06BA "ں" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+06BB "ڻ" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+06BC "ڼ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xd9, 0x0, + 0x0, 0x3, 0xf5, 0xac, 0x0, 0x0, 0xa, 0xe0, + 0x4f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0xa, 0xfd, 0x70, 0x0, 0x0, + 0xa, 0x66, 0xa0, 0x0, 0x0, 0x3, 0xdd, 0x30, + 0x0, + + /* U+06BD "ڽ" */ + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x2, 0x2, 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x23, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x0, 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, + 0xc9, 0x0, 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, + 0xa, 0xe0, 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, + 0xef, 0xff, 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, + 0x0, + + /* U+06BE "ھ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+06BF "ڿ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, + 0x6f, 0x0, 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, + 0x50, 0x0, 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06C6 "ۆ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06C7 "ۇ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+06C8 "ۈ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CB "ۋ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CC "ی" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+06CE "ێ" */ + 0xc, 0x47, 0xa0, 0x0, 0x0, 0x0, 0x2e, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x6, 0xdf, 0xe7, + 0x0, 0x0, 0x4, 0xf9, 0x48, 0xf4, 0x0, 0x0, + 0x5f, 0x60, 0x2, 0x10, 0x10, 0x0, 0xbf, 0xe7, + 0x0, 0xbb, 0x0, 0x0, 0x39, 0xfa, 0xf, 0x70, + 0x0, 0x0, 0xa, 0xf0, 0xeb, 0x0, 0x0, 0x17, + 0xfb, 0x6, 0xfd, 0xab, 0xdf, 0xfc, 0x10, 0x5, + 0xdf, 0xfd, 0x94, 0x0, 0x0, + + /* U+06D0 "ې" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06D5 "ە" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+06F0 "۰" */ + 0x8f, 0x29, 0xf2, + + /* U+06F1 "۱" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+06F2 "۲" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F3 "۳" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+06F4 "۴" */ + 0x2f, 0x60, 0x9e, 0xd1, 0xc, 0xc6, 0xf5, 0x40, + 0x6, 0xff, 0xf4, 0x22, 0x2, 0xfe, 0xff, 0xf8, + 0x0, 0xe7, 0x24, 0x41, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F5 "۵" */ + 0x0, 0x4, 0x81, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0xe9, 0x2e, 0x80, 0x7, 0xf1, 0x7, 0xf1, + 0xc, 0xb0, 0x1, 0xf6, 0xf, 0x60, 0x0, 0xd9, + 0x1f, 0x40, 0x0, 0xbb, 0x2f, 0x40, 0x0, 0xab, + 0xf, 0x67, 0xd1, 0xca, 0xc, 0xde, 0xfc, 0xf6, + 0x4, 0xed, 0x6f, 0xc0, + + /* U+06F6 "۶" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0x80, 0x5, + 0xf7, 0x45, 0x0, 0xac, 0x0, 0x0, 0x9, 0xe1, + 0x0, 0x0, 0x2e, 0xfe, 0xf2, 0x0, 0x2f, 0xe7, + 0x0, 0xc, 0xd1, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + + /* U+06F7 "۷" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+06F8 "۸" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+06F9 "۹" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB52 "ﭒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB53 "ﭓ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB54 "ﭔ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB55 "ﭕ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB56 "ﭖ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB57 "ﭗ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB58 "ﭘ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB59 "ﭙ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB5A "ﭚ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+FB5B "ﭛ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x99, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x0, 0x0, + + /* U+FB5C "ﭜ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, 0x2, + 0x2, + + /* U+FB5D "ﭝ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FB5E "ﭞ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB5F "ﭟ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x0, 0x11, 0x0, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB60 "ﭠ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB61 "ﭡ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB62 "ﭢ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB63 "ﭣ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB64 "ﭤ" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB65 "ﭥ" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB66 "ﭦ" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+FB67 "ﭧ" */ + 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x75, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xba, 0x60, 0x0, 0x12, 0x0, 0x89, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc0, 0xe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0xeb, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xf1, 0x6, 0xfe, 0x97, 0x78, + 0xad, 0xff, 0x7f, 0xc6, 0x3, 0xae, 0xff, 0xec, + 0x95, 0x0, 0x4e, 0xd0, + + /* U+FB68 "ﭨ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FB69 "ﭩ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FB6A "ﭪ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6B "ﭫ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB6C "ﭬ" */ + 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB6D "ﭭ" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB6E "ﭮ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6F "ﭯ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB70 "ﭰ" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB71 "ﭱ" */ + 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB72 "ﭲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB73 "ﭳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe7, 0x0, 0x0, + 0xbf, 0x88, 0xd0, 0x0, 0x7, 0xf4, 0x1, 0xf3, + 0x0, 0xf, 0x90, 0x0, 0xac, 0x0, 0x4f, 0x20, + 0xb7, 0x1e, 0xc3, 0x6f, 0x0, 0x11, 0x3, 0xd7, + 0x5f, 0x20, 0xb7, 0x0, 0x0, 0x1f, 0x90, 0x21, + 0x0, 0x0, 0x7, 0xfa, 0x31, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB74 "ﭴ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB75 "ﭵ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB76 "ﭶ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB77 "ﭷ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x97, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xce, 0x67, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9d, 0x10, 0x5f, 0x12, + 0x12, 0x2e, 0xe5, 0x6f, 0x1b, 0x7c, 0x63, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB78 "ﭸ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, + + /* U+FB79 "ﭹ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, + + /* U+FB7A "ﭺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7B "ﭻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x70, 0xd5, 0x0, 0x0, 0x9, 0xf9, 0x52, + 0x13, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7C "ﭼ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB7D "ﭽ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB7E "ﭾ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7F "ﭿ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x7c, 0x6d, 0x50, 0x0, 0x9, 0xfb, 0x43, + 0x23, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB80 "ﮀ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xd4, 0xe3, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, + + /* U+FB81 "ﮁ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd4, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + + /* U+FB82 "ﮂ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+FB83 "ﮃ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, + + /* U+FB84 "ﮄ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FB85 "ﮅ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB86 "ﮆ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+FB87 "ﮇ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB88 "ﮈ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+FB89 "ﮉ" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x26, 0x10, + 0x0, 0x0, 0xda, 0x98, 0x0, 0x0, 0x6e, 0xcc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb5, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB8A "ﮊ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8B "ﮋ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, + 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, + 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, + 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, + 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8C "ﮌ" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8D "ﮍ" */ + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x38, 0x10, 0x0, + 0x0, 0xe, 0xa9, 0x70, 0x0, 0x0, 0x7e, 0xcb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xa7, 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, + 0x0, 0x5, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xb0, + 0x0, 0x13, 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8E "ﮎ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+FB8F "ﮏ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + 0x1e, 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, + 0x7f, 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, + 0xde, 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, + 0xbf, 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB90 "ﮐ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FB91 "ﮑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FB92 "ﮒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB93 "ﮓ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+FB94 "ﮔ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FB95 "ﮕ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FB96 "ﮖ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+FB97 "ﮗ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB98 "ﮘ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+FB99 "ﮙ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, + + /* U+FB9A "ﮚ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB9B "ﮛ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x2, 0x3, 0x6b, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x18, 0xec, 0x61, 0x63, 0x0, 0x0, + 0x0, 0x5, 0x93, 0x4a, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xe9, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0xca, 0x0, 0x0, 0x0, 0x8, + 0xf4, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0xaf, 0x83, 0x12, 0x48, 0xef, 0xad, + 0xe8, 0x40, 0x9f, 0xff, 0xff, 0xfa, 0x40, 0x1b, + 0xfb, 0x0, 0x2, 0x43, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB9C "ﮜ" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x12, 0x15, 0xaf, + 0xb4, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1b, 0x42, + 0x8e, 0xf7, 0x0, 0x3b, 0xfe, 0x81, 0x0, 0x1f, + 0xc5, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xd0, 0x0, + 0x0, 0x0, 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x2, 0xf5, 0x0, 0x17, 0x77, + 0xdf, 0x10, 0x2, 0xff, 0xfd, 0x40, 0x0, + + /* U+FB9D "ﮝ" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x1, 0x21, 0x5a, + 0xfb, 0x40, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1, + 0xb4, 0x28, 0xef, 0x70, 0x0, 0x3b, 0xfe, 0x81, + 0x0, 0x1, 0xfc, 0x50, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, + 0x0, 0x1e, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, + 0x0, 0x2f, 0xf7, 0x0, 0x17, 0x77, 0xdf, 0xaf, + 0x97, 0x2f, 0xff, 0xd4, 0x8, 0xef, + + /* U+FB9E "ﮞ" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+FB9F "ﮟ" */ + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf2, 0x0, 0x47, 0x0, 0x0, 0x0, + 0xf9, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xef, 0x82, + 0xc9, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0x0, 0xad, 0x0, 0x0, 0xa, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x4, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBA0 "ﮠ" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FBA1 "ﮡ" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x16, 0x10, 0x0, 0x0, 0x0, 0xd, 0xa8, 0x80, + 0x0, 0x0, 0x0, 0x5d, 0xcc, 0x33, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x35, 0x0, + 0x0, 0x1, 0xf8, 0x0, 0xac, 0x0, 0x0, 0x0, + 0xef, 0x82, 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, + 0xc9, 0x0, 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, + 0x0, 0xa, 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, + 0x40, 0x0, 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x3, 0x42, 0x0, 0x0, 0x0, + + /* U+FBA2 "ﮢ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FBA3 "ﮣ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FBAA "ﮪ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+FBAB "ﮫ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe3, 0x0, 0x0, 0x6, 0xf7, 0xbb, 0x0, 0x0, + 0xd, 0xb0, 0x9c, 0x0, 0xc9, 0xf, 0x75, 0xf8, + 0x0, 0xce, 0x8f, 0xcf, 0xf8, 0x71, 0x2b, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0x74, 0xd4, 0x0, + 0x0, 0xb, 0xe3, 0xad, 0x0, 0x0, 0x1, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+FBAC "ﮬ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FBAD "ﮭ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FBD3 "ﯓ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+FBD4 "ﯔ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, + 0xf0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x2, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x58, 0x0, 0xe9, 0x0, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x22, 0x0, 0x0, 0x0, 0xf, 0x90, 0xd, + 0xa0, 0x0, 0x0, 0x9, 0xfa, 0x0, 0x9f, 0xb7, + 0x55, 0x8e, 0xfd, 0xf8, 0x40, 0x6c, 0xff, 0xfe, + 0xa4, 0x9, 0xfa, + + /* U+FBD5 "ﯕ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x12, 0x11, + 0x5, 0xca, 0x0, 0x1, 0x8e, 0xfa, 0x30, 0x9, + 0xfe, 0x81, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FBD6 "ﯖ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x1, + 0x21, 0x10, 0x5c, 0xa0, 0x0, 0x1, 0x8e, 0xfa, + 0x30, 0x0, 0x9f, 0xe8, 0x10, 0x0, 0x3, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xed, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FBD7 "ﯗ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FBD8 "ﯘ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x0, 0x6, 0x9d, + 0x10, 0x0, 0x0, 0x1, 0xcf, 0x70, 0x0, 0x0, + 0x5, 0xc2, 0x0, 0x0, 0x0, 0xd8, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xed, 0x40, 0x0, 0x0, 0x6f, + 0xac, 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FBD9 "ﯙ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDA "ﯚ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x0, 0x4, 0xde, + 0x20, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, 0x40, + 0x0, 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDB "ﯛ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDC "ﯜ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x60, 0x0, 0x0, 0x7f, 0xac, 0xf2, 0x0, + 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, + 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, + 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, + 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDE "ﯞ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDF "ﯟ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0xa, 0x8b, 0x70, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x4, 0xaa, 0x20, + 0x0, 0x0, 0x5f, 0xac, 0xe1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBE4 "ﯤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FBE5 "ﯥ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+FBE6 "ﯦ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FBE7 "ﯧ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FBE8 "ﯨ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, + + /* U+FBE9 "ﯩ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FBFC "ﯼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FBFD "ﯽ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBFE "ﯾ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FBFF "ﯿ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FE70 "ﹰ" */ + 0x0, 0x0, 0x14, 0x8b, 0xd7, 0x85, 0x21, 0x26, + 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE71 "ﹱ" */ + 0x0, 0x0, 0x1, 0x4, 0x8b, 0xd7, 0x8, 0x52, + 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE72 "ﹲ" */ + 0x1, 0xdb, 0x0, 0x4a, 0xc2, 0xa0, 0x9f, 0x8b, + 0x1a, 0x50, 0x4d, 0x70, 0x0, + + /* U+FE73 "ﹳ" */ + 0x2f, 0x50, 0x0, 0xee, 0x72, 0x3, 0xdf, 0x50, + + /* U+FE74 "ﹴ" */ + 0x3, 0x7a, 0x8c, 0xa6, 0x30, 0x25, 0x9c, 0x8a, + 0x84, 0x10, + + /* U+FE76 "ﹶ" */ + 0x0, 0x1, 0x26, 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE77 "ﹷ" */ + 0x0, 0x0, 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, + 0x75, 0x2f, 0xff, 0xfd, + + /* U+FE78 "ﹸ" */ + 0x1, 0xdb, 0x0, 0x5a, 0xc2, 0x0, 0xbf, 0x80, + 0x5d, 0x20, 0xc8, 0x10, 0x0, + + /* U+FE79 "ﹹ" */ + 0x0, 0x1d, 0xb0, 0x0, 0x5a, 0xc1, 0x0, 0xc, + 0xe8, 0x0, 0x5c, 0x20, 0xc, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7A "ﹺ" */ + 0x0, 0x36, 0x6b, 0xda, 0x62, 0x10, 0x0, 0x0, + + /* U+FE7B "ﹻ" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, 0x0, 0x3, + 0x66, 0xb, 0xda, 0x62, 0x1, 0x0, 0x0, + + /* U+FE7C "ﹼ" */ + 0x0, 0x0, 0x5, 0x4, 0xb, 0xc, 0xb, 0xc, + 0x1c, 0x1c, 0x3e, 0xc8, 0xb, 0xd2, 0x50, + + /* U+FE7D "ﹽ" */ + 0x0, 0x5, 0xb, 0xb, 0xc, 0xc, 0x1b, 0x1f, + 0x6a, 0xe, 0xb7, 0xb2, 0x2, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7E "ﹾ" */ + 0x2c, 0xe9, 0xb, 0x60, 0xb5, 0xb6, 0xb, 0x52, + 0xce, 0x90, + + /* U+FE7F "ﹿ" */ + 0x2, 0xce, 0x90, 0xb, 0x60, 0xb5, 0xb, 0x60, + 0xb5, 0x2, 0xce, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE80 "ﺀ" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+FE81 "ﺁ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+FE82 "ﺂ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7, 0xef, 0x0, + + /* U+FE83 "ﺃ" */ + 0x8, 0xc3, 0x1b, 0x0, 0xd, 0x85, 0x2d, 0x93, + 0x0, 0x0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, + + /* U+FE84 "ﺄ" */ + 0x8, 0xc3, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x85, + 0x0, 0x2d, 0x93, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, 0x70, + 0x0, 0x7e, 0xf0, + + /* U+FE85 "ﺅ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FE86 "ﺆ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xb8, 0x0, 0x0, 0x0, + 0x8, 0x62, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x8f, + 0xac, 0xf2, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FE87 "ﺇ" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+FE88 "ﺈ" */ + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7e, 0xf0, 0x9, 0xc3, 0x0, 0x1b, + 0x0, 0x0, 0xd, 0xb6, 0x0, 0x16, 0x20, 0x0, + + /* U+FE89 "ﺉ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+FE8A "ﺊ" */ + 0x0, 0x3c, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x80, + 0xb, 0xb0, 0x0, 0x0, 0xcd, 0x7f, 0x40, 0xe7, + 0x0, 0x0, 0xb, 0xf4, 0x9e, 0x3e, 0x90, 0x0, + 0x0, 0x1d, 0xb0, 0xb7, 0x8f, 0x83, 0x12, 0x49, + 0xf6, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, 0x0, 0x0, + + /* U+FE8B "ﺋ" */ + 0x0, 0x8c, 0x50, 0xc, 0x0, 0x0, 0xcb, 0x70, + 0x7, 0x30, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x17, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE8C "ﺌ" */ + 0x0, 0x8c, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xcb, + 0x70, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE8D "ﺍ" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+FE8E "ﺎ" */ + 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, + 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, + 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x6, 0xf0, + 0x0, 0x3f, 0xb7, 0x0, 0x7e, 0xf0, + + /* U+FE8F "ﺏ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+FE90 "ﺐ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+FE91 "ﺑ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, + + /* U+FE92 "ﺒ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FE93 "ﺓ" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+FE94 "ﺔ" */ + 0x4, 0xe4, 0xd0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x3, 0xb1, 0x0, 0x4, 0xcf, 0xf3, 0x0, + 0x5f, 0x82, 0xf6, 0x0, 0xc9, 0x0, 0xda, 0x0, + 0xae, 0xbd, 0xff, 0x85, 0x4, 0x75, 0x8, 0xfb, + + /* U+FE95 "ﺕ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE96 "ﺖ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, + 0x70, 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, + 0x77, 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, + 0xfe, 0xca, 0x51, 0x4, 0xed, + + /* U+FE97 "ﺗ" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FE98 "ﺘ" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE99 "ﺙ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE9A "ﺚ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FE9B "ﺛ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE9C "ﺜ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE9D "ﺝ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FE9E "ﺞ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x6b, 0xff, 0xe6, 0x0, 0x0, + 0xcf, 0x78, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9c, 0x0, 0x5f, 0x10, + 0x11, 0x1e, 0xc3, 0x6f, 0x10, 0x8a, 0x3, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FE9F "ﺟ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, + + /* U+FEA0 "ﺠ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+FEA1 "ﺡ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FEA2 "ﺢ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xbf, 0x78, 0xe0, 0x0, 0x7, 0xf4, 0x1, 0xf4, + 0x0, 0xf, 0x80, 0x0, 0x9c, 0x0, 0x4f, 0x20, + 0x0, 0x1e, 0xc3, 0x6f, 0x0, 0x0, 0x3, 0xd7, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FEA3 "ﺣ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, + + /* U+FEA4 "ﺤ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, + + /* U+FEA5 "ﺥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA6 "ﺦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x7c, 0xff, 0xff, 0xd8, 0x0, 0x98, + 0x5b, 0xff, 0xe6, 0x0, 0x0, 0xbf, 0x78, 0xe0, + 0x0, 0x7, 0xf4, 0x1, 0xf4, 0x0, 0xf, 0x80, + 0x0, 0x9c, 0x0, 0x4f, 0x20, 0x0, 0x1e, 0xc3, + 0x6f, 0x0, 0x0, 0x3, 0xd7, 0x5f, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x7, + 0xfa, 0x41, 0x14, 0xa4, 0x0, 0x5d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA7 "ﺧ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, + 0x1a, 0xf9, 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, + 0x2f, 0xec, 0x71, 0x0, 0x0, + + /* U+FEA8 "ﺨ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x1a, 0xfd, + 0xf2, 0x0, 0x17, 0x8a, 0xfe, 0x41, 0xef, 0x83, + 0x2f, 0xec, 0x71, 0x0, 0x2b, 0xf7, + + /* U+FEA9 "ﺩ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+FEAA "ﺪ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + + /* U+FEAB "ﺫ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FEAC "ﺬ" */ + 0x0, 0x7b, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FEAD "ﺭ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+FEAE "ﺮ" */ + 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb7, 0x0, 0x0, 0x0, 0xed, + 0xef, 0x0, 0x0, 0x6, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x13, 0x6c, 0xfb, 0x0, 0x0, + 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEAF "ﺯ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+FEB0 "ﺰ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, 0x0, 0x0, + 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, 0x6b, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB1 "ﺱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEB2 "ﺲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x2, + 0x81, 0x3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x5, 0xf2, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0x0, 0x7, 0xf1, 0x8, 0xf6, 0x5, 0xf6, 0x0, + 0xbc, 0x0, 0x0, 0x5, 0xfc, 0x8f, 0xde, 0x7d, + 0xff, 0x83, 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfa, + 0x1b, 0xfc, 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x63, 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB3 "ﺳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x6, 0x40, 0x3, 0x80, 0x5, 0xf1, 0x0, 0xd, + 0x90, 0x7, 0xf0, 0x6, 0xf1, 0x0, 0xf, 0xd0, + 0xa, 0xf4, 0x7, 0xf0, 0x17, 0xcf, 0xfa, 0x9f, + 0xee, 0x7e, 0xa0, 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, + 0xfa, 0x10, + + /* U+FEB4 "ﺴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x6, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe0, 0xc, 0xf6, 0x8, 0xf6, 0x0, + 0x1b, 0xef, 0xfd, 0xdf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB5 "ﺵ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB6 "ﺶ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x1, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x30, 0x1, 0x61, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, + 0xf2, 0x3, 0xf3, 0x0, 0x2a, 0x10, 0x0, 0x7, + 0xf1, 0x8, 0xf6, 0x5, 0xf5, 0x0, 0x9d, 0x0, + 0x0, 0x5, 0xfc, 0x8f, 0xee, 0x7d, 0xfe, 0x73, + 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfb, 0x1b, 0xfc, + 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x63, + 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB7 "ﺷ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x2, 0x80, 0x0, 0x5, 0x40, 0x2, + 0x60, 0x5, 0xf1, 0x0, 0xd, 0x90, 0x7, 0xf0, + 0x5, 0xf1, 0x0, 0xf, 0xd0, 0xa, 0xf4, 0x7, + 0xf0, 0x17, 0xcf, 0xfa, 0x9f, 0xee, 0x7e, 0xb0, + 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, 0xfb, 0x10, + + /* U+FEB8 "ﺸ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x20, 0x2, 0x60, 0x0, + 0x0, 0x2, 0x10, 0x1, 0x20, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x7, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe1, 0xc, 0xf7, 0x9, 0xf7, 0x0, + 0x1b, 0xef, 0xfd, 0xcf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB9 "ﺹ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBA "ﺺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBB "ﺻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEBC "ﺼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEBD "ﺽ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBE "ﺾ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBF "ﺿ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEC0 "ﻀ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEC1 "ﻁ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC2 "ﻂ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC3 "ﻃ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC4 "ﻄ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC5 "ﻅ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC6 "ﻆ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC7 "ﻇ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x6b, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC8 "ﻈ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC9 "ﻉ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECA "ﻊ" */ + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xfc, + 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, 0x0, 0x4, + 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, 0xf4, 0x0, + 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, 0xf, 0x80, + 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, 0x0, 0x0, + 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xfa, 0x31, + 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FECB "ﻋ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, + 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x2, + 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, 0x61, + 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, 0x0, + 0x0, + + /* U+FECC "ﻌ" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, 0xfb, + 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, 0xfa, + 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, 0x79, + 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, 0xe0, + + /* U+FECD "ﻍ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+FECE "ﻎ" */ + 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, + 0xcf, 0xfc, 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, + 0x0, 0x4, 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, + 0xf4, 0x0, 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, + 0xf, 0x80, 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xfa, 0x31, 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECF "ﻏ" */ + 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xef, 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x2, 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, + 0x61, 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, + 0x0, 0x0, + + /* U+FED0 "ﻐ" */ + 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, + 0xfb, 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, + 0xfa, 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, + 0x79, 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, + 0xe0, + + /* U+FED1 "ﻑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+FED2 "ﻒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FED3 "ﻓ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED4 "ﻔ" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED5 "ﻕ" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+FED6 "ﻖ" */ + 0x0, 0x0, 0x0, 0xf, 0x3f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf8, + 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xed, 0x33, + 0xf2, 0x0, 0x9, 0x70, 0x0, 0x8f, 0xfe, 0xf8, + 0x73, 0xf, 0x60, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x2f, 0x40, 0x0, 0x0, 0xc, 0xd0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x9f, 0x40, 0x0, 0xb, 0xe6, + 0x23, 0x6d, 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x44, 0x10, + 0x0, 0x0, 0x0, + + /* U+FED7 "ﻗ" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED8 "ﻘ" */ + 0x0, 0x8, 0x99, 0x80, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED9 "ﻙ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+FEDA "ﻚ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x0, 0x58, 0x0, 0xe9, 0x0, 0x0, + 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x22, 0x0, 0x0, 0x0, + 0xf, 0x90, 0xd, 0xa0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x9f, 0xb7, 0x55, 0x8e, 0xfd, 0xf8, 0x40, + 0x6c, 0xff, 0xfe, 0xa4, 0x9, 0xfa, + + /* U+FEDB "ﻛ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FEDC "ﻜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FEDD "ﻝ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+FEDE "ﻞ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x25, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0xbb, 0x0, 0x0, 0x8, + 0xfd, 0x71, 0xd9, 0x0, 0x0, 0x2e, 0xed, 0xf4, + 0x9f, 0x61, 0x37, 0xef, 0x30, 0x0, 0x1a, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, + 0x0, 0x0, + + /* U+FEDF "ﻟ" */ + 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, + 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, + 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x2, + 0xf5, 0x17, 0xcf, 0x12, 0xfe, 0x60, + + /* U+FEE0 "ﻠ" */ + 0x0, 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, 0x0, + 0x2, 0xf7, 0x0, 0x17, 0xcf, 0xe7, 0x32, 0xfe, + 0x8c, 0xf7, + + /* U+FEE1 "ﻡ" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+FEE2 "ﻢ" */ + 0x0, 0x7, 0xee, 0x60, 0x0, 0x0, 0x5f, 0xbb, + 0xf5, 0x0, 0x0, 0xbc, 0x0, 0xdc, 0x0, 0x5, + 0xee, 0x77, 0xff, 0xb7, 0x6f, 0x7a, 0xef, 0xdd, + 0xfd, 0xca, 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, + 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, + + /* U+FEE3 "ﻣ" */ + 0x0, 0x1, 0xbf, 0xd5, 0x0, 0x0, 0xce, 0x9d, + 0xf1, 0x0, 0x1f, 0x50, 0x3f, 0x41, 0x7c, 0xfb, + 0x7b, 0xf2, 0x2f, 0xe9, 0xdf, 0xe6, 0x0, + + /* U+FEE4 "ﻤ" */ + 0x0, 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x0, 0xce, + 0x9d, 0xe1, 0x0, 0x0, 0x1f, 0x50, 0x4f, 0x50, + 0x1, 0x7c, 0xfb, 0x7a, 0xfe, 0x72, 0x2f, 0xe9, + 0xdf, 0xfb, 0xef, 0x60, + + /* U+FEE5 "ﻥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FEE6 "ﻦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x7, 0xf0, 0x0, 0x24, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0xac, 0x0, 0x0, 0x0, 0xff, 0x82, + 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEE7 "ﻧ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FEE8 "ﻨ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FEE9 "ﻩ" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+FEEA "ﻪ" */ + 0x0, 0x17, 0xf2, 0x0, 0x7, 0xfe, 0xf3, 0x0, + 0x7f, 0x50, 0xf6, 0x0, 0xd9, 0x0, 0xda, 0x0, + 0x9f, 0xdf, 0xff, 0x95, 0x4, 0x75, 0x8, 0xfb, + + /* U+FEEB "ﻫ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FEEC "ﻬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FEED "ﻭ" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FEEE "ﻮ" */ + 0x0, 0x8, 0xee, 0x40, 0x0, 0x0, 0x6f, 0xac, + 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, + 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, + 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, + 0x0, 0x0, + + /* U+FEEF "ﻯ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FEF0 "ﻰ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEF1 "ﻱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+FEF2 "ﻲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, + + /* U+FEF3 "ﻳ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FEF4 "ﻴ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FEF5 "ﻵ" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x85, 0xad, 0xb4, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0xf8, 0x0, + 0x1f, 0x50, 0x0, 0xf8, 0x0, 0x9, 0xc0, 0x0, + 0xf8, 0x0, 0x2, 0xf3, 0x0, 0xf8, 0x0, 0x0, + 0xba, 0x0, 0xf8, 0x0, 0x0, 0x4f, 0x20, 0xf7, + 0x0, 0x0, 0xc, 0x90, 0xf6, 0x0, 0x0, 0x5, + 0xf4, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, + 0x0, 0x0, 0xbf, 0x50, 0x0, 0x8, 0x7c, 0xf7, + 0x0, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF6 "ﻶ" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x0, 0x85, 0xad, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xf8, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xf8, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0xf8, 0x0, 0x0, 0x2, + 0xf3, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xba, 0x0, + 0xf8, 0x0, 0x0, 0x0, 0x4f, 0x20, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0x90, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xcd, 0x0, + 0x0, 0x8, 0x7c, 0xf6, 0x3f, 0xa4, 0x0, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF7 "ﻷ" */ + 0x9, 0xc3, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x0, 0x1d, 0x52, 0x0, 0x0, 0x2, 0xed, 0x50, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xf, 0x80, 0x2e, + 0x30, 0x0, 0xf8, 0x0, 0xbb, 0x0, 0xf, 0x80, + 0x3, 0xf2, 0x0, 0xf8, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x5f, 0x10, 0xf7, 0x0, 0x0, 0xd8, + 0xf, 0x60, 0x0, 0x6, 0xe4, 0xf3, 0x0, 0x0, + 0xe, 0xee, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, + 0x87, 0xcf, 0x70, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF8 "ﻸ" */ + 0x9, 0xc3, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x52, 0x0, 0x0, 0x0, + 0x2, 0xed, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x2e, 0x30, 0x0, 0xf8, + 0x0, 0x0, 0xbb, 0x0, 0xf, 0x80, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, + 0x0, 0xd8, 0xf, 0x80, 0x0, 0x0, 0x6, 0xe4, + 0xf8, 0x0, 0x0, 0x0, 0xe, 0xef, 0x90, 0x0, + 0x0, 0x0, 0xbf, 0xdd, 0x0, 0x0, 0x87, 0xcf, + 0x73, 0xfa, 0x40, 0xb, 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF9 "ﻹ" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + 0x5c, 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, + 0x9d, 0xa0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, + + /* U+FEFA "ﻺ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, 0x5c, 0x70, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xa0, + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, + + /* U+FEFB "ﻻ" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEFC "ﻼ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEFF "" */ + +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 118, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 25, .adv_w = 215, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 163, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 157, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 247, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 313, .adv_w = 70, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 318, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 348, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 410, .adv_w = 215, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 477, .adv_w = 92, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 485, .adv_w = 81, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 488, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 527, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 581, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 629, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 677, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 785, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 887, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 935, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 989, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 86, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1055, .adv_w = 86, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1070, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1125, .adv_w = 215, .box_w = 11, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1158, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1213, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1255, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1360, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1426, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 179, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 197, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1612, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1666, .adv_w = 147, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1714, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1786, .adv_w = 193, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1846, .adv_w = 76, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1864, .adv_w = 76, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1902, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1962, .adv_w = 143, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2010, .adv_w = 221, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2142, .adv_w = 202, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2214, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2268, .adv_w = 202, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2352, .adv_w = 178, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2412, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2532, .adv_w = 187, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2592, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2658, .adv_w = 253, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2754, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2886, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2952, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2982, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3021, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3051, .adv_w = 215, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 3079, .adv_w = 128, .box_w = 10, .box_h = 2, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 3089, .adv_w = 128, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3097, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3138, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3192, .adv_w = 141, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3228, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3282, .adv_w = 158, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 90, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3359, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3413, .adv_w = 162, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3461, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3473, .adv_w = 71, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3503, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3557, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3569, .adv_w = 249, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3632, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3668, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3709, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3763, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3817, .adv_w = 105, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3847, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3883, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3919, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3955, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3996, .adv_w = 209, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4055, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4096, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4150, .adv_w = 134, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4242, .adv_w = 86, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4258, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4314, .adv_w = 215, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4336, .adv_w = 171, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4450, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4491, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4527, .adv_w = 70, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 89, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4559, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4595, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4636, .adv_w = 57, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4642, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4690, .adv_w = 135, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4774, .adv_w = 170, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4815, .adv_w = 174, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4860, .adv_w = 70, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4872, .adv_w = 103, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4895, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4936, .adv_w = 160, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4986, .adv_w = 164, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5034, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5075, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5123, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5164, .adv_w = 182, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5229, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5265, .adv_w = 181, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5315, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5360, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5435, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5510, .adv_w = 194, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5560, .adv_w = 250, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5630, .adv_w = 83, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5636, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 5651, .adv_w = 81, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5666, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5708, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5732, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5785, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5817, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 5877, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5909, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5975, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5987, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 6046, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6078, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6117, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6169, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6234, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6294, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6364, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6389, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6424, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6460, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6508, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6598, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6724, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6832, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6940, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7018, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7096, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7166, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7241, .adv_w = 75, .box_w = 6, .box_h = 2, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7247, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7337, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7421, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7487, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7562, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7602, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7657, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7682, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7722, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7777, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7843, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7858, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7873, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7885, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7894, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7909, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7918, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7933, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7945, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7954, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7962, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7970, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7985, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7994, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 7997, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8017, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8057, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8102, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8141, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8180, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8224, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8314, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8358, .adv_w = 138, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8393, .adv_w = 83, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8413, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8419, .adv_w = 140, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8455, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8494, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8566, .adv_w = 0, .box_w = 2, .box_h = 5, .ofs_x = 3, .ofs_y = 10}, + {.bitmap_index = 8571, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 8579, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8644, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8696, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8768, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 8827, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8879, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8951, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9003, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9075, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9155, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9235, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9360, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9440, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9500, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9560, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9602, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9637, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9672, .adv_w = 114, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9725, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9795, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9837, .adv_w = 114, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9876, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9918, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9990, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10053, .adv_w = 128, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10098, .adv_w = 136, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10139, .adv_w = 156, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10193, .adv_w = 136, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10229, .adv_w = 124, .box_w = 9, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10283, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10346, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10409, .adv_w = 313, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10517, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10607, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10733, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10841, .adv_w = 310, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10967, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11045, .adv_w = 153, .box_w = 10, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 11130, .adv_w = 265, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11198, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11288, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11393, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11498, .adv_w = 265, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11596, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11701, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11785, .adv_w = 199, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11881, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11979, .adv_w = 270, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12084, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12182, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12248, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12325, .adv_w = 211, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12419, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12531, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12643, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12755, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 12881, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13021, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13147, .adv_w = 186, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13252, .adv_w = 186, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13342, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13437, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 13532, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13597, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13647, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13717, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13782, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13847, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13892, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13962, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14018, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14078, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14142, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14198, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14253, .adv_w = 200, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14314, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14391, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14416, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 14419, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14439, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14479, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14524, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14564, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14608, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14647, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14692, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14737, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14781, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14917, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15013, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15125, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15221, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15287, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15543, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15669, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15797, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15905, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16033, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16089, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16173, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16317, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16413, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16501, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16581, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16707, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16812, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16910, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16990, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17102, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17172, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17242, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17340, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 17368, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17476, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17636, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17796, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17924, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17994, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18064, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18204, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18428, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18573, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18678, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18986, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19082, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19178, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19290, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19402, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19510, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19672, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19768, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19918, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20018, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20118, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20218, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20318, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20418, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20565, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20661, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20773, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20918, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21038, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21134, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21228, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21300, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21375, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21400, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21430, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21502, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21577, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21602, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21632, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21704, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21779, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21804, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21834, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21886, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21946, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21971, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22001, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22053, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22113, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22138, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22168, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22233, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22301, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22334, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22367, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22472, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22568, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22616, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22671, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22776, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22872, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22920, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22975, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23035, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23100, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23160, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23232, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23357, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23407, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23467, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23527, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23587, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23647, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23719, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23779, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23839, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23899, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23971, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24006, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24051, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24086, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24131, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24173, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24227, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24269, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24323, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24386, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24456, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24528, .adv_w = 141, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24608, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24706, .adv_w = 229, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24811, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24870, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24935, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25047, .adv_w = 229, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25167, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25235, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25310, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25450, .adv_w = 229, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25608, .adv_w = 122, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25698, .adv_w = 141, .box_w = 10, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25798, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25910, .adv_w = 229, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 26023, .adv_w = 122, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26156, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26206, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26266, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26336, .adv_w = 195, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26414, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26447, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26480, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26525, .adv_w = 162, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26580, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26621, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 26671, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26748, .adv_w = 216, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26839, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26907, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26982, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27042, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27117, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27173, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27243, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27307, .adv_w = 132, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27387, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27443, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27513, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27590, .adv_w = 213, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27668, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27693, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27723, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27736, .adv_w = 77, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27751, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27806, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27858, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27878, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27902, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27915, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27957, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27970, .adv_w = 67, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27978, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27988, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27996, .adv_w = 75, .box_w = 6, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28032, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 28045, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28087, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28095, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 28110, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 10}, + {.bitmap_index = 28125, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28167, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 28177, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28219, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 28243, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28296, .adv_w = 78, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28349, .adv_w = 71, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28383, .adv_w = 78, .box_w = 6, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28434, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28494, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28569, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28601, .adv_w = 78, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28649, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28715, .adv_w = 213, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28787, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28812, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28842, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28854, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28884, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28943, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29011, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29031, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29055, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29087, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29119, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29158, .adv_w = 251, .box_w = 15, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29203, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29223, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29247, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29299, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29359, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29384, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29414, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29479, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29539, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29589, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29649, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29709, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29774, .adv_w = 158, .box_w = 10, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29809, .adv_w = 165, .box_w = 12, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29851, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29921, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29991, .adv_w = 158, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30036, .adv_w = 165, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30090, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30115, .adv_w = 134, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30147, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30227, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30263, .adv_w = 141, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30313, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30361, .adv_w = 141, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30421, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30511, .adv_w = 326, .box_w = 20, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30621, .adv_w = 215, .box_w = 14, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30663, .adv_w = 228, .box_w = 16, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30711, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30837, .adv_w = 326, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30977, .adv_w = 215, .box_w = 14, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31040, .adv_w = 228, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31120, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31228, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31342, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31391, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31447, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31555, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31669, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31718, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31774, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31852, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31942, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32020, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32110, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32188, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32278, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32356, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32446, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32516, .adv_w = 136, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32576, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32617, .adv_w = 124, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32649, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32724, .adv_w = 136, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32794, .adv_w = 134, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32844, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32885, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32975, .adv_w = 265, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33055, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33095, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33140, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33224, .adv_w = 214, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 33315, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33355, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33400, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33466, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33544, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33603, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33668, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33743, .adv_w = 194, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33833, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33863, .adv_w = 85, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33905, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33945, .adv_w = 170, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33990, .adv_w = 137, .box_w = 9, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34013, .adv_w = 148, .box_w = 11, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34041, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34096, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34156, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34176, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34200, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34225, .adv_w = 137, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34249, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34290, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34340, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34380, .adv_w = 132, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34430, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34485, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34537, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34603, .adv_w = 213, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34668, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34688, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34712, .adv_w = 146, .box_w = 10, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34782, .adv_w = 153, .box_w = 12, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34866, .adv_w = 146, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34938, .adv_w = 153, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 35026, .adv_w = 146, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35090, .adv_w = 153, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35170, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35218, .adv_w = 153, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35278, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_2[] = { + 0x0, 0x1, 0x3, 0x4, 0x6, 0xf, 0x15, 0x19 +}; + +static const uint8_t glyph_id_ofs_list_5[] = { + 0, 0, 0, 1, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 0, 0, 0, 19 +}; + +static const uint16_t unicode_list_7[] = { + 0x0, 0x1, 0x2, 0x5, 0x6, 0x8, 0xa, 0xf, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0xe93b, 0xe942, 0xe945, 0xe946, 0xe947, 0xe94b, + 0xe94d, 0xe94f, 0xe953, 0xe956, 0xe95b, 0xe960, 0xe961, 0xe962, + 0xe978, 0xe97d, 0xe982, 0xe985, 0xe986, 0xe987, 0xe98b, 0xe98c, + 0xe98d, 0xe98e, 0xe9a1, 0xe9a2, 0xe9a8, 0xe9aa, 0xe9ab, 0xe9ae, + 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b5, 0xe9cd, 0xe9cf, 0xe9fe, 0xe9ff, + 0xea01, 0xea03, 0xea1a, 0xea21, 0xea24, 0xea2d, 0xea56, 0xea5e, + 0xea95, 0xeb25, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xebc1, + 0xebcd, 0xec27, 0xec3e, 0xee94, 0xf0fc, 0xf1dc +}; + +static const uint16_t unicode_list_9[] = { + 0x0, 0x1, 0x2, 0x3, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x34, 0x35, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x52, 0x53, + 0x54, 0x55, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1488, .range_length = 27, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1542, .range_length = 26, .glyph_id_start = 123, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 8, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 1569, .range_length = 26, .glyph_id_start = 131, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1600, .range_length = 22, .glyph_id_start = 157, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1623, .range_length = 30, .glyph_id_start = 179, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_5, .list_length = 30, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 1657, .range_length = 71, .glyph_id_start = 199, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1734, .range_length = 61917, .glyph_id_start = 270, + .unicode_list = unicode_list_7, .glyph_id_ofs_list = NULL, .list_length = 78, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 64338, .range_length = 82, .glyph_id_start = 348, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 64426, .range_length = 715, .glyph_id_start = 430, + .unicode_list = unicode_list_9, .glyph_id_ofs_list = NULL, .list_length = 31, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 65142, .range_length = 135, .glyph_id_start = 461, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 65279, .range_length = 1, .glyph_id_start = 596, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 12, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_dejavu_16_persian_hebrew = { +#else +lv_font_t lv_font_dejavu_16_persian_hebrew = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW*/ diff --git a/libraries/lvgl/src/font/lv_font_fmt_txt.c b/libraries/lvgl/src/font/lv_font_fmt_txt.c new file mode 100644 index 0000000..d1d3e38 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_fmt_txt.c @@ -0,0 +1,558 @@ +/** + * @file lv_font_fmt_txt.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_font.h" +#include "lv_font_fmt_txt.h" +#include "../core/lv_global.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_types.h" +#include "../misc/lv_log.h" +#include "../misc/lv_utils.h" +#include "../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#if LV_USE_FONT_COMPRESSED + #define font_rle LV_GLOBAL_DEFAULT()->font_fmt_rle +#endif /*LV_USE_FONT_COMPRESSED*/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t gid_left; + uint32_t gid_right; +} kern_pair_ref_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right); +static int32_t unicode_list_compare(const void * ref, const void * element); +static int32_t kern_pair_8_compare(const void * ref, const void * element); +static int32_t kern_pair_16_compare(const void * ref, const void * element); + +#if LV_USE_FONT_COMPRESSED + static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter); + static inline void decompress_line(uint8_t * out, int32_t w); + static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len); + static inline void rle_init(const uint8_t * in, uint8_t bpp); + static inline uint8_t rle_next(void); +#endif /*LV_USE_FONT_COMPRESSED*/ + +/********************** + * STATIC VARIABLES + **********************/ + +static const uint8_t opa4_table[16] = {0, 17, 34, 51, + 68, 85, 102, 119, + 136, 153, 170, 187, + 204, 221, 238, 255 + }; + +#if LV_USE_FONT_COMPRESSED +static const uint8_t opa3_table[8] = {0, 36, 73, 109, 146, 182, 218, 255}; +#endif + +static const uint8_t opa2_table[4] = {0, 85, 170, 255}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + lv_draw_buf_t * draw_buf) +{ + const lv_font_t * font = g_dsc->resolved_font; + uint8_t * bitmap_out = draw_buf->data; + + if(unicode_letter == '\t') unicode_letter = ' '; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, unicode_letter); + if(!gid) return NULL; + + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + int32_t gsize = (int32_t) gdsc->box_w * gdsc->box_h; + if(gsize == 0) return NULL; + + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + const uint8_t * bitmap_in = &fdsc->glyph_bitmap[gdsc->bitmap_index]; + uint8_t * bitmap_out_tmp = bitmap_out; + int32_t i = 0; + int32_t x, y; + uint32_t stride = lv_draw_buf_width_to_stride(gdsc->box_w, LV_COLOR_FORMAT_A8); + + if(fdsc->bpp == 1) { + for(y = 0; y < gdsc->box_h; y ++) { + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x7; + if(i == 0) bitmap_out_tmp[x] = (*bitmap_in) & 0x80 ? 0xff : 0x00; + else if(i == 1) bitmap_out_tmp[x] = (*bitmap_in) & 0x40 ? 0xff : 0x00; + else if(i == 2) bitmap_out_tmp[x] = (*bitmap_in) & 0x20 ? 0xff : 0x00; + else if(i == 3) bitmap_out_tmp[x] = (*bitmap_in) & 0x10 ? 0xff : 0x00; + else if(i == 4) bitmap_out_tmp[x] = (*bitmap_in) & 0x08 ? 0xff : 0x00; + else if(i == 5) bitmap_out_tmp[x] = (*bitmap_in) & 0x04 ? 0xff : 0x00; + else if(i == 6) bitmap_out_tmp[x] = (*bitmap_in) & 0x02 ? 0xff : 0x00; + else if(i == 7) { + bitmap_out_tmp[x] = (*bitmap_in) & 0x01 ? 0xff : 0x00; + bitmap_in++; + } + } + bitmap_out_tmp += stride; + } + } + else if(fdsc->bpp == 2) { + for(y = 0; y < gdsc->box_h; y ++) { + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x3; + if(i == 0) bitmap_out_tmp[x] = opa2_table[(*bitmap_in) >> 6]; + else if(i == 1) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 4) & 0x3]; + else if(i == 2) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 2) & 0x3]; + else if(i == 3) { + bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 0) & 0x3]; + bitmap_in++; + } + } + bitmap_out_tmp += stride; + } + + } + else if(fdsc->bpp == 4) { + for(y = 0; y < gdsc->box_h; y ++) { + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x1; + if(i == 0) { + bitmap_out_tmp[x] = opa4_table[(*bitmap_in) >> 4]; + } + else if(i == 1) { + bitmap_out_tmp[x] = opa4_table[(*bitmap_in) & 0xF]; + bitmap_in++; + } + } + bitmap_out_tmp += stride; + } + } + return draw_buf; + } + /*Handle compressed bitmap*/ + else { +#if LV_USE_FONT_COMPRESSED + bool prefilter = fdsc->bitmap_format == LV_FONT_FMT_TXT_COMPRESSED; + decompress(&fdsc->glyph_bitmap[gdsc->bitmap_index], bitmap_out, gdsc->box_w, gdsc->box_h, + (uint8_t)fdsc->bpp, prefilter); + return draw_buf; +#else /*!LV_USE_FONT_COMPRESSED*/ + LV_LOG_WARN("Compressed fonts is used but LV_USE_FONT_COMPRESSED is not enabled in lv_conf.h"); + return NULL; +#endif + } + + /*If not returned earlier then the letter is not found in this font*/ + return NULL; +} + +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + /*It fixes a strange compiler optimization issue: https://github.com/lvgl/lvgl/issues/4370*/ + bool is_tab = unicode_letter == '\t'; + if(is_tab) { + unicode_letter = ' '; + } + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, unicode_letter); + if(!gid) return false; + + int8_t kvalue = 0; + if(fdsc->kern_dsc) { + uint32_t gid_next = get_glyph_dsc_id(font, unicode_letter_next); + if(gid_next) { + kvalue = get_kern_value(font, gid, gid_next); + } + } + + /*Put together a glyph dsc*/ + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); + + uint32_t adv_w = gdsc->adv_w; + if(is_tab) adv_w *= 2; + + adv_w += kv; + adv_w = (adv_w + (1 << 3)) >> 4; + + dsc_out->adv_w = adv_w; + dsc_out->box_h = gdsc->box_h; + dsc_out->box_w = gdsc->box_w; + dsc_out->ofs_x = gdsc->ofs_x; + dsc_out->ofs_y = gdsc->ofs_y; + dsc_out->format = (uint8_t)fdsc->bpp; + dsc_out->is_placeholder = false; + + if(is_tab) dsc_out->box_w = dsc_out->box_w * 2; + + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) +{ + if(letter == '\0') return 0; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + uint16_t i; + for(i = 0; i < fdsc->cmap_num; i++) { + + /*Relative code point*/ + uint32_t rcp = letter - fdsc->cmaps[i].range_start; + if(rcp >= fdsc->cmaps[i].range_length) continue; + uint32_t glyph_id = 0; + if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { + glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { + const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { + uint16_t key = rcp; + uint16_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + (uint32_t) ofs; + } + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t key = rcp; + uint16_t * p = _lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + const uint16_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; + } + } + + return glyph_id; + } + + return 0; + +} + +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right) +{ + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + int8_t value = 0; + + if(fdsc->kern_classes == 0) { + /*Kern pairs*/ + const lv_font_fmt_txt_kern_pair_t * kdsc = fdsc->kern_dsc; + if(kdsc->glyph_ids_size == 0) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint16_t * g_ids = kdsc->glyph_ids; + kern_pair_ref_t g_id_both = {gid_left, gid_right}; + uint16_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 2, kern_pair_8_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + } + else if(kdsc->glyph_ids_size == 1) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint32_t * g_ids = kdsc->glyph_ids; + kern_pair_ref_t g_id_both = {gid_left, gid_right}; + uint32_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + + } + else { + /*Invalid value*/ + } + } + else { + /*Kern classes*/ + const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; + uint8_t left_class = kdsc->left_class_mapping[gid_left]; + uint8_t right_class = kdsc->right_class_mapping[gid_right]; + + /*If class = 0, kerning not exist for that glyph + *else got the value form `class_pair_values` 2D array*/ + if(left_class > 0 && right_class > 0) { + value = kdsc->class_pair_values[(left_class - 1) * kdsc->right_class_cnt + (right_class - 1)]; + } + + } + return value; +} + +static int32_t kern_pair_8_compare(const void * ref, const void * element) +{ + const kern_pair_ref_t * ref8_p = ref; + const uint8_t * element8_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref8_p->gid_left != element8_p[0]) return (int32_t) ref8_p->gid_left - element8_p[0]; + else return (int32_t) ref8_p->gid_right - element8_p[1]; + +} + +static int32_t kern_pair_16_compare(const void * ref, const void * element) +{ + const kern_pair_ref_t * ref16_p = ref; + const uint16_t * element16_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref16_p->gid_left != element16_p[0]) return (int32_t) ref16_p->gid_left - element16_p[0]; + else return (int32_t) ref16_p->gid_right - element16_p[1]; +} + +#if LV_USE_FONT_COMPRESSED + +/** + * The compress a glyph's bitmap + * @param in the compressed bitmap + * @param out buffer to store the result + * @param px_num number of pixels in the glyph (width * height) + * @param bpp bit per pixel (bpp = 3 will be converted to bpp = 4) + * @param prefilter true: the lines are XORed + */ +static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter) +{ + const lv_opa_t * opa_table; + switch(bpp) { + case 2: + opa_table = opa2_table; + break; + case 3: + opa_table = opa3_table; + break; + case 4: + opa_table = opa4_table; + break; + default: + LV_LOG_WARN("%d bpp is not handled", bpp); + return; + } + + rle_init(in, bpp); + + uint8_t * line_buf1 = lv_malloc(w); + + uint8_t * line_buf2 = NULL; + + if(prefilter) { + line_buf2 = lv_malloc(w); + } + + decompress_line(line_buf1, w); + + int32_t y; + int32_t x; + uint32_t stride = lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_A8); + + for(x = 0; x < w; x++) { + out[x] = opa_table[line_buf1[x]]; + } + out += stride; + + for(y = 1; y < h; y++) { + if(prefilter) { + decompress_line(line_buf2, w); + + for(x = 0; x < w; x++) { + line_buf1[x] = line_buf2[x] ^ line_buf1[x]; + out[x] = opa_table[line_buf1[x]]; + } + } + else { + decompress_line(line_buf1, w); + + for(x = 0; x < w; x++) { + out[x] = opa_table[line_buf1[x]]; + } + } + out += stride; + } + + lv_free(line_buf1); + lv_free(line_buf2); +} + +/** + * Decompress one line. Store one pixel per byte + * @param out output buffer + * @param w width of the line in pixel count + */ +static inline void decompress_line(uint8_t * out, int32_t w) +{ + int32_t i; + for(i = 0; i < w; i++) { + out[i] = rle_next(); + } +} + +/** + * Read bits from an input buffer. The read can cross byte boundary. + * @param in the input buffer to read from. + * @param bit_pos index of the first bit to read. + * @param len number of bits to read (must be <= 8). + * @return the read bits + */ +static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len) +{ + uint8_t bit_mask; + switch(len) { + case 1: + bit_mask = 0x1; + break; + case 2: + bit_mask = 0x3; + break; + case 3: + bit_mask = 0x7; + break; + case 4: + bit_mask = 0xF; + break; + case 8: + bit_mask = 0xFF; + break; + default: + bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + } + + uint32_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + + if(bit_pos + len >= 8) { + uint16_t in16 = (in[byte_pos] << 8) + in[byte_pos + 1]; + return (in16 >> (16 - bit_pos - len)) & bit_mask; + } + else { + return (in[byte_pos] >> (8 - bit_pos - len)) & bit_mask; + } +} + +static inline void rle_init(const uint8_t * in, uint8_t bpp) +{ + lv_font_fmt_rle_t * rle = &font_rle; + rle->in = in; + rle->bpp = bpp; + rle->state = RLE_STATE_SINGLE; + rle->rdp = 0; + rle->prev_v = 0; + rle->count = 0; +} + +static inline uint8_t rle_next(void) +{ + uint8_t v = 0; + uint8_t ret = 0; + lv_font_fmt_rle_t * rle = &font_rle; + + if(rle->state == RLE_STATE_SINGLE) { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + if(rle->rdp != 0 && rle->prev_v == ret) { + rle->count = 0; + rle->state = RLE_STATE_REPEATE; + } + + rle->prev_v = ret; + rle->rdp += rle->bpp; + } + else if(rle->state == RLE_STATE_REPEATE) { + v = get_bits(rle->in, rle->rdp, 1); + rle->count++; + rle->rdp += 1; + if(v == 1) { + ret = rle->prev_v; + if(rle->count == 11) { + rle->count = get_bits(rle->in, rle->rdp, 6); + rle->rdp += 6; + if(rle->count != 0) { + rle->state = RLE_STATE_COUNTER; + } + else { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + } + } + else { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + + } + else if(rle->state == RLE_STATE_COUNTER) { + ret = rle->prev_v; + rle->count--; + if(rle->count == 0) { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + } + + return ret; +} +#endif /*LV_USE_FONT_COMPRESSED*/ + +/** Code Comparator. + * + * Compares the value of both input arguments. + * + * @param[in] pRef Pointer to the reference. + * @param[in] pElement Pointer to the element to compare. + * + * @return Result of comparison. + * @retval < 0 Reference is less than element. + * @retval = 0 Reference is equal to element. + * @retval > 0 Reference is greater than element. + * + */ +static int32_t unicode_list_compare(const void * ref, const void * element) +{ + return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element)); +} diff --git a/libraries/lvgl/src/font/lv_font_fmt_txt.h b/libraries/lvgl/src/font/lv_font_fmt_txt.h new file mode 100644 index 0000000..76bade0 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_fmt_txt.h @@ -0,0 +1,251 @@ +/** + * @file lv_font_fmt_txt.h + * + */ + +#ifndef LV_FONT_FMT_TXT_H +#define LV_FONT_FMT_TXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include +#include "lv_font.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** This describes a glyph.*/ +typedef struct { +#if LV_FONT_FMT_TXT_LARGE == 0 + uint32_t bitmap_index : 20; /**< Start index of the bitmap. A font can be max 1 MB.*/ + uint32_t adv_w : 12; /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/ + uint8_t box_w; /**< Width of the glyph's bounding box*/ + uint8_t box_h; /**< Height of the glyph's bounding box*/ + int8_t ofs_x; /**< x offset of the bounding box*/ + int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#else + uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB.*/ + uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#endif +} lv_font_fmt_txt_glyph_dsc_t; + +/** Format of font character map.*/ +enum _lv_font_fmt_txt_cmap_type_t { + LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, + LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, + LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, + LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, +}; + +#ifdef DOXYGEN +typedef _lv_font_fmt_txt_cmap_type_t lv_font_fmt_txt_cmap_type_t; +#else +typedef uint8_t lv_font_fmt_txt_cmap_type_t; +#endif /*DOXYGEN*/ + +/** + * Map codepoints to a `glyph_dsc`s + * Several formats are supported to optimize memory usage + * See https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + */ +typedef struct { + /** First Unicode character for this range*/ + uint32_t range_start; + + /** Number of Unicode characters related to this range. + * Last Unicode character = range_start + range_length - 1*/ + uint16_t range_length; + + /** First glyph ID (array index of `glyph_dsc`) for this range*/ + uint16_t glyph_id_start; + + /* + According the specification there are 4 formats: + https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + + For simplicity introduce "relative code point": + rcp = codepoint - range_start + + and a search function: + search a "value" in an "array" and returns the index of "value". + + Format 0 tiny + unicode_list == NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + rcp + + Format 0 full + unicode_list == NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[rcp] + + Sparse tiny + unicode_list != NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + search(unicode_list, rcp) + + Sparse full + unicode_list != NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[search(unicode_list, rcp)] + */ + + const uint16_t * unicode_list; + + /** if(type == LV_FONT_FMT_TXT_CMAP_FORMAT0_...) it's `uint8_t *` + * if(type == LV_FONT_FMT_TXT_CMAP_SPARSE_...) it's `uint16_t *` + */ + const void * glyph_id_ofs_list; + + /** Length of `unicode_list` and/or `glyph_id_ofs_list`*/ + uint16_t list_length; + + /** Type of this character map*/ + lv_font_fmt_txt_cmap_type_t type; +} lv_font_fmt_txt_cmap_t; + +/** A simple mapping of kern values from pairs*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. for(i = 0; i < pair_cnt * 2; i += 2) + if(glyph_ids[i] == glyph_id_left && + glyph_ids[i+1] == glyph_id_right) + return values[i / 2]; + */ + const void * glyph_ids; + const int8_t * values; + uint32_t pair_cnt : 30; + uint32_t glyph_ids_size : 2; /*0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t`*/ +} lv_font_fmt_txt_kern_pair_t; + +/** More complex but more optimal class based kern value storage*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. Get the class of the left and right glyphs as `left_class` and `right_class` + left_class = left_class_mapping[glyph_id_left]; + right_class = right_class_mapping[glyph_id_right]; + 3. value = class_pair_values[(left_class-1)*right_class_cnt + (right_class-1)] + */ + + const int8_t * class_pair_values; /*left_class_cnt * right_class_cnt value*/ + const uint8_t * left_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ + const uint8_t * right_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ + uint8_t left_class_cnt; + uint8_t right_class_cnt; +} lv_font_fmt_txt_kern_classes_t; + +/** Bitmap formats*/ +typedef enum { + LV_FONT_FMT_TXT_PLAIN = 0, + LV_FONT_FMT_TXT_COMPRESSED = 1, + LV_FONT_FMT_TXT_COMPRESSED_NO_PREFILTER = 1, +} lv_font_fmt_txt_bitmap_format_t; + +/*Describe store additional data for fonts*/ +typedef struct { + /*The bitmaps of all glyphs*/ + const uint8_t * glyph_bitmap; + + /*Describe the glyphs*/ + const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc; + + /*Map the glyphs to Unicode characters. + *Array of `lv_font_cmap_fmt_txt_t` variables*/ + const lv_font_fmt_txt_cmap_t * cmaps; + + /** + * Store kerning values. + * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *` + * depending on `kern_classes` + */ + const void * kern_dsc; + + /*Scale kern values in 12.4 format*/ + uint16_t kern_scale; + + /*Number of cmap tables*/ + uint16_t cmap_num : 9; + + /*Bit per pixel: 1, 2, 3, 4, 8*/ + uint16_t bpp : 4; + + /*Type of `kern_dsc`*/ + uint16_t kern_classes : 1; + + /* + * storage format of the bitmap + * from `lv_font_fmt_txt_bitmap_format_t` + */ + uint16_t bitmap_format : 2; +} lv_font_fmt_txt_dsc_t; + +#if LV_USE_FONT_COMPRESSED +typedef enum { + RLE_STATE_SINGLE = 0, + RLE_STATE_REPEATE, + RLE_STATE_COUNTER, +} lv_font_fmt_rle_state_t; + +typedef struct { + uint32_t rdp; + const uint8_t * in; + uint8_t bpp; + uint8_t prev_v; + uint8_t count; + lv_font_fmt_rle_state_t state; +} lv_font_fmt_rle_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Used as `get_glyph_bitmap` callback in lvgl's native font format if the font is uncompressed. + * @param g_dsc the glyph descriptor including which font to use etc. + * @param letter a UNICODE character code + * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph, it's OK not to use it. + * @return pointer to an A8 bitmap (not necessarily bitmap_out) or NULL if `unicode_letter` not found + */ +const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + lv_draw_buf_t * draw_buf); + +/** + * Used as `get_glyph_dsc` callback in lvgl's native font format if the font is uncompressed. + * @param font pointer to font + * @param dsc_out store the result descriptor here + * @param unicode_letter a UNICODE letter code + * @param unicode_letter_next the unicode letter succeeding the letter under test + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next); + +/********************** + * MACROS + **********************/ + +/********************** + * ADD BUILT IN FONTS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_FMT_TXT_H*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_10.c b/libraries/lvgl/src/font/lv_font_montserrat_10.c new file mode 100644 index 0000000..80fe261 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_10.c @@ -0,0 +1,1654 @@ +/******************************************************************************* + * Size: 10 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 10 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_10.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 1 +#endif + +#if LV_FONT_MONTSERRAT_10 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3e, 0x2d, 0x2c, 0x1c, 0x5, 0x1, 0x2d, + + /* U+0022 "\"" */ + 0x57, 0x84, 0x56, 0x83, 0x23, 0x41, + + /* U+0023 "#" */ + 0x0, 0xb0, 0x28, 0x0, 0xb, 0x4, 0x60, 0x4a, + 0xea, 0xdc, 0x80, 0x28, 0x8, 0x20, 0x8c, 0xdb, + 0xeb, 0x40, 0x64, 0xb, 0x0, 0x8, 0x30, 0xb0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x13, 0x0, 0x8, 0xde, 0xc3, 0x5b, 0x27, + 0x11, 0x4d, 0x57, 0x0, 0x6, 0xce, 0x80, 0x0, + 0x29, 0x9a, 0x32, 0x27, 0x5b, 0x3c, 0xde, 0xb2, + 0x0, 0x27, 0x0, + + /* U+0025 "%" */ + 0x29, 0x92, 0x2, 0x90, 0x9, 0x11, 0x90, 0xa1, + 0x0, 0x82, 0x28, 0x74, 0x0, 0x1, 0x88, 0x49, + 0x68, 0x40, 0x0, 0xb, 0x29, 0xa, 0x0, 0x8, + 0x32, 0x80, 0xa0, 0x3, 0x80, 0x8, 0x87, 0x0, + + /* U+0026 "&" */ + 0x3, 0xcb, 0x70, 0x0, 0xa4, 0xd, 0x0, 0x5, + 0xba, 0x60, 0x0, 0x7c, 0xc0, 0x10, 0x5a, 0x7, + 0xbb, 0x37, 0x80, 0xa, 0xe0, 0xa, 0xcc, 0x97, + 0x70, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x57, 0x56, 0x23, + + /* U+0028 "(" */ + 0x2, 0xc0, 0x9, 0x60, 0xd, 0x10, 0xe, 0x0, + 0xe, 0x0, 0xe, 0x0, 0xd, 0x10, 0x9, 0x60, + 0x2, 0xc0, + + /* U+0029 ")" */ + 0x68, 0x0, 0xe0, 0xb, 0x30, 0x95, 0x8, 0x60, + 0x95, 0xb, 0x30, 0xe0, 0x68, 0x0, + + /* U+002A "*" */ + 0x24, 0x42, 0x4d, 0xd4, 0x79, 0x97, 0x2, 0x20, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x3b, 0xdc, + 0xb1, 0x0, 0x85, 0x0, 0x0, 0x85, 0x0, + + /* U+002C "," */ + 0x35, 0x4a, 0x55, + + /* U+002D "-" */ + 0x5c, 0xc3, + + /* U+002E "." */ + 0x2, 0x6a, + + /* U+002F "/" */ + 0x0, 0x2, 0xb0, 0x0, 0x85, 0x0, 0xd, 0x0, + 0x4, 0x90, 0x0, 0xa3, 0x0, 0xd, 0x0, 0x5, + 0x80, 0x0, 0xb2, 0x0, 0x1c, 0x0, 0x0, + + /* U+0030 "0" */ + 0x4, 0xdd, 0xb1, 0x1, 0xe2, 0x6, 0xb0, 0x69, + 0x0, 0xe, 0x17, 0x80, 0x0, 0xd2, 0x69, 0x0, + 0xe, 0x11, 0xe2, 0x6, 0xb0, 0x4, 0xdd, 0xb1, + 0x0, + + /* U+0031 "1" */ + 0xbe, 0xa0, 0x5a, 0x5, 0xa0, 0x5a, 0x5, 0xa0, + 0x5a, 0x5, 0xa0, + + /* U+0032 "2" */ + 0x4c, 0xdd, 0x50, 0x42, 0x1, 0xf0, 0x0, 0x0, + 0xf0, 0x0, 0xa, 0x80, 0x0, 0xa9, 0x0, 0xb, + 0x80, 0x0, 0x8f, 0xdd, 0xd5, + + /* U+0033 "3" */ + 0x8d, 0xde, 0xe0, 0x0, 0xc, 0x40, 0x0, 0x98, + 0x0, 0x0, 0xbd, 0x90, 0x0, 0x0, 0xd3, 0x51, + 0x1, 0xe2, 0x6d, 0xdd, 0x60, + + /* U+0034 "4" */ + 0x0, 0x7, 0xa0, 0x0, 0x5, 0xc0, 0x0, 0x3, + 0xd1, 0x31, 0x1, 0xd2, 0xb, 0x30, 0x8d, 0xcc, + 0xfd, 0x70, 0x0, 0xb, 0x30, 0x0, 0x0, 0xb3, + 0x0, + + /* U+0035 "5" */ + 0xf, 0xdd, 0xd0, 0x1d, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x3e, 0xdc, 0x60, 0x0, 0x1, 0xd4, 0x31, + 0x0, 0xc4, 0x5c, 0xdd, 0x80, + + /* U+0036 "6" */ + 0x2, 0xbd, 0xd4, 0x1e, 0x40, 0x0, 0x6a, 0x0, + 0x0, 0x7a, 0xab, 0xa1, 0x6e, 0x10, 0x5c, 0x1d, + 0x0, 0x3c, 0x4, 0xcc, 0xb2, + + /* U+0037 "7" */ + 0xbd, 0xdd, 0xe8, 0xb4, 0x0, 0xd3, 0x0, 0x4, + 0xc0, 0x0, 0xc, 0x40, 0x0, 0x3d, 0x0, 0x0, + 0xa6, 0x0, 0x1, 0xe0, 0x0, + + /* U+0038 "8" */ + 0x7, 0xcc, 0xb2, 0x3d, 0x0, 0x6a, 0x2d, 0x0, + 0x79, 0xb, 0xec, 0xf2, 0x6a, 0x0, 0x4d, 0x79, + 0x0, 0x3e, 0x9, 0xcb, 0xc4, + + /* U+0039 "9" */ + 0x1a, 0xcc, 0x60, 0x96, 0x0, 0xb3, 0x97, 0x0, + 0xc9, 0x9, 0xbb, 0x8a, 0x0, 0x0, 0x88, 0x0, + 0x2, 0xe2, 0x2d, 0xdc, 0x40, + + /* U+003A ":" */ + 0x6a, 0x1, 0x0, 0x2, 0x6a, + + /* U+003B ";" */ + 0x6a, 0x1, 0x0, 0x0, 0x6a, 0x38, 0x32, + + /* U+003C "<" */ + 0x0, 0x0, 0x10, 0x0, 0x5a, 0xa1, 0x3e, 0x61, + 0x0, 0x6, 0xb9, 0x30, 0x0, 0x2, 0x81, + + /* U+003D "=" */ + 0x3b, 0xbb, 0xb1, 0x0, 0x0, 0x0, 0x3b, 0xbb, + 0xb1, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x2b, 0xa4, 0x0, 0x0, 0x18, + 0xe1, 0x4, 0xab, 0x50, 0x37, 0x10, 0x0, + + /* U+003F "?" */ + 0x3c, 0xdd, 0x50, 0x52, 0x1, 0xf0, 0x0, 0x3, + 0xd0, 0x0, 0x3d, 0x20, 0x0, 0x85, 0x0, 0x0, + 0x10, 0x0, 0x0, 0xb4, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4a, 0x99, 0xa7, 0x0, 0x6, 0x90, 0x0, + 0x3, 0xa0, 0x1b, 0x7, 0xcb, 0x9b, 0x47, 0x65, + 0x4b, 0x0, 0x8b, 0xa, 0x73, 0x77, 0x0, 0x3b, + 0xa, 0x65, 0x3b, 0x0, 0x8b, 0xa, 0x1b, 0x6, + 0xcb, 0x6c, 0xb3, 0x6, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x9a, 0xa2, 0x0, + + /* U+0041 "A" */ + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x88, 0xc0, + 0x0, 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x70, + 0x2b, 0x0, 0x0, 0xdc, 0xcc, 0xe3, 0x0, 0x59, + 0x0, 0x4, 0xa0, 0xc, 0x30, 0x0, 0xd, 0x10, + + /* U+0042 "B" */ + 0xfc, 0xcc, 0xb2, 0xf, 0x0, 0x7, 0xa0, 0xf0, + 0x0, 0x88, 0xf, 0xcc, 0xdf, 0x30, 0xf0, 0x0, + 0x2e, 0xf, 0x0, 0x1, 0xf0, 0xfc, 0xcc, 0xc5, + 0x0, + + /* U+0043 "C" */ + 0x1, 0x9d, 0xdc, 0x30, 0xd6, 0x0, 0x35, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x35, 0x1, 0x9d, 0xdc, + 0x30, + + /* U+0044 "D" */ + 0xfd, 0xdd, 0xb3, 0xf, 0x0, 0x3, 0xe2, 0xf0, + 0x0, 0x6, 0x9f, 0x0, 0x0, 0x4b, 0xf0, 0x0, + 0x6, 0x9f, 0x0, 0x3, 0xe2, 0xfd, 0xdd, 0xb3, + 0x0, + + /* U+0045 "E" */ + 0xfd, 0xdd, 0xc0, 0xf0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xfc, 0xcc, 0x70, 0xf0, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0xfd, 0xdd, 0xd1, + + /* U+0046 "F" */ + 0xfd, 0xdd, 0xcf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0xdd, 0xd7, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd7, 0x0, 0x25, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x7, 0x5b, 0x0, + 0x1, 0xd0, 0xd6, 0x0, 0x3d, 0x1, 0x9d, 0xdc, + 0x50, + + /* U+0048 "H" */ + 0xf0, 0x0, 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, + 0x0, 0xf, 0x1f, 0xdd, 0xdd, 0xf1, 0xf0, 0x0, + 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, 0x0, 0xf, + 0x10, + + /* U+0049 "I" */ + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + + /* U+004A "J" */ + 0x4, 0xdd, 0xf2, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd2, 0x6, + 0x1, 0xe0, 0x8, 0xdd, 0x60, + + /* U+004B "K" */ + 0xf0, 0x0, 0xa8, 0xf, 0x0, 0x99, 0x0, 0xf0, + 0x99, 0x0, 0xf, 0x9f, 0x40, 0x0, 0xfb, 0x4e, + 0x20, 0xf, 0x10, 0x5d, 0x10, 0xf0, 0x0, 0x6b, + 0x0, + + /* U+004C "L" */ + 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0x0, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xfd, + 0xdd, 0xa0, + + /* U+004D "M" */ + 0xf2, 0x0, 0x0, 0x97, 0xfc, 0x0, 0x3, 0xf7, + 0xfa, 0x50, 0xc, 0xa7, 0xf1, 0xd0, 0x69, 0x77, + 0xf0, 0x79, 0xd1, 0x77, 0xf0, 0xd, 0x60, 0x77, + 0xf0, 0x1, 0x0, 0x77, + + /* U+004E "N" */ + 0xf4, 0x0, 0xf, 0x1f, 0xe2, 0x0, 0xf1, 0xf6, + 0xd0, 0xf, 0x1f, 0x9, 0xa0, 0xf1, 0xf0, 0xb, + 0x7f, 0x1f, 0x0, 0x1d, 0xf1, 0xf0, 0x0, 0x3f, + 0x10, + + /* U+004F "O" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd, 0x60, 0x2, 0xd4, + 0x5b, 0x0, 0x0, 0x4b, 0x78, 0x0, 0x0, 0x1e, + 0x5b, 0x0, 0x0, 0x4b, 0xd, 0x60, 0x2, 0xd4, + 0x1, 0x9d, 0xdc, 0x40, + + /* U+0050 "P" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb6, 0xfd, 0xdc, 0x70, 0xf0, + 0x0, 0x0, 0xf0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x1, 0x9d, 0xdc, 0x40, 0x0, 0xc7, 0x0, 0x3d, + 0x40, 0x5b, 0x0, 0x0, 0x4b, 0x7, 0x80, 0x0, + 0x1, 0xe0, 0x5a, 0x0, 0x0, 0x4c, 0x0, 0xd6, + 0x0, 0x2d, 0x40, 0x1, 0xad, 0xdd, 0x40, 0x0, + 0x0, 0x4, 0xab, 0xa0, + + /* U+0052 "R" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb7, 0xfc, 0xcf, 0x90, 0xf0, + 0x5, 0xb0, 0xf0, 0x0, 0x97, + + /* U+0053 "S" */ + 0x8, 0xdc, 0xc3, 0x5b, 0x0, 0x11, 0x4d, 0x20, + 0x0, 0x6, 0xde, 0x90, 0x0, 0x1, 0x9a, 0x33, + 0x0, 0x5b, 0x3b, 0xcc, 0xb2, + + /* U+0054 "T" */ + 0xcd, 0xee, 0xda, 0x0, 0x97, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x97, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x97, 0x0, + + /* U+0055 "U" */ + 0xf, 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xf, + 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xe, 0x0, + 0x2, 0xd0, 0xa7, 0x0, 0x98, 0x1, 0xad, 0xd9, + 0x0, + + /* U+0056 "V" */ + 0xc, 0x40, 0x0, 0x1d, 0x0, 0x5b, 0x0, 0x8, + 0x70, 0x0, 0xe2, 0x0, 0xe1, 0x0, 0x7, 0x90, + 0x69, 0x0, 0x0, 0x1e, 0x1d, 0x20, 0x0, 0x0, + 0x9c, 0xb0, 0x0, 0x0, 0x2, 0xf4, 0x0, 0x0, + + /* U+0057 "W" */ + 0x88, 0x0, 0xf, 0x40, 0x2, 0xc3, 0xd0, 0x5, + 0xea, 0x0, 0x86, 0xd, 0x20, 0xa4, 0xe0, 0xd, + 0x10, 0x88, 0xd, 0xa, 0x43, 0xc0, 0x2, 0xd5, + 0x90, 0x4a, 0x86, 0x0, 0xd, 0xd3, 0x0, 0xed, + 0x10, 0x0, 0x8e, 0x0, 0xa, 0xc0, 0x0, + + /* U+0058 "X" */ + 0x5c, 0x0, 0x1d, 0x10, 0x98, 0xb, 0x50, 0x0, + 0xda, 0x90, 0x0, 0x6, 0xf2, 0x0, 0x1, 0xd7, + 0xc0, 0x0, 0xc5, 0xa, 0x80, 0x8a, 0x0, 0xd, + 0x30, + + /* U+0059 "Y" */ + 0xb, 0x50, 0x0, 0xc3, 0x2, 0xd0, 0x6, 0x90, + 0x0, 0x88, 0x1d, 0x10, 0x0, 0xd, 0xb6, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x0, 0x4, 0xb0, 0x0, + + /* U+005A "Z" */ + 0x6d, 0xdd, 0xdf, 0x10, 0x0, 0xb, 0x70, 0x0, + 0x8, 0xa0, 0x0, 0x4, 0xd0, 0x0, 0x2, 0xe2, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x8f, 0xdd, 0xdd, + 0x30, + + /* U+005B "[" */ + 0xfb, 0x1f, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xfb, 0x10, + + /* U+005C "\\" */ + 0x3a, 0x0, 0x0, 0xc1, 0x0, 0x7, 0x60, 0x0, + 0x1c, 0x0, 0x0, 0xb2, 0x0, 0x5, 0x80, 0x0, + 0xd, 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, + + /* U+005D "]" */ + 0x9e, 0x40, 0xb4, 0xb, 0x40, 0xb4, 0xb, 0x40, + 0xb4, 0xb, 0x40, 0xb4, 0x9e, 0x40, + + /* U+005E "^" */ + 0x0, 0xa8, 0x0, 0x2, 0x9b, 0x0, 0x9, 0x25, + 0x60, 0x1b, 0x0, 0xb0, + + /* U+005F "_" */ + 0x99, 0x99, 0x90, + + /* U+0060 "`" */ + 0x3a, 0x30, + + /* U+0061 "a" */ + 0x1b, 0xcd, 0x60, 0x1, 0x0, 0xe0, 0x1a, 0xaa, + 0xf1, 0x78, 0x0, 0xe1, 0x2c, 0xaa, 0xe1, + + /* U+0062 "b" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0xac, 0xd6, 0x1, 0xf3, 0x1, 0xe2, 0x1e, 0x0, + 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1d, 0x9c, 0xd5, + 0x0, + + /* U+0063 "c" */ + 0x7, 0xdd, 0xa0, 0x5c, 0x0, 0x40, 0x87, 0x0, + 0x0, 0x5c, 0x0, 0x41, 0x7, 0xdd, 0xa0, + + /* U+0064 "d" */ + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x8, 0xdc, + 0x9e, 0x5c, 0x0, 0x7e, 0x87, 0x0, 0x1e, 0x5b, + 0x0, 0x6e, 0x8, 0xdb, 0x8e, + + /* U+0065 "e" */ + 0x8, 0xcc, 0x90, 0x5a, 0x0, 0x87, 0x8c, 0xaa, + 0xa8, 0x5b, 0x0, 0x20, 0x7, 0xdc, 0xb1, + + /* U+0066 "f" */ + 0x7, 0xc9, 0xe, 0x0, 0x9f, 0xb6, 0xf, 0x0, + 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, + + /* U+0067 "g" */ + 0x8, 0xdc, 0x9e, 0x5b, 0x0, 0x5f, 0x87, 0x0, + 0xf, 0x5c, 0x0, 0x6f, 0x7, 0xdc, 0x9f, 0x3, + 0x0, 0x4c, 0x1a, 0xcc, 0xb2, + + /* U+0068 "h" */ + 0x1e, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x1e, 0xac, + 0xd4, 0x1f, 0x30, 0x3d, 0x1e, 0x0, 0xe, 0x1e, + 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+0069 "i" */ + 0x2d, 0x0, 0x10, 0x1e, 0x1, 0xe0, 0x1e, 0x1, + 0xe0, 0x1e, 0x0, + + /* U+006A "j" */ + 0x1, 0xe0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0xe0, + 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xe0, 0x1, 0xe0, + 0xad, 0x60, + + /* U+006B "k" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0x1, 0xb6, 0x1, 0xe2, 0xd5, 0x0, 0x1f, 0xde, + 0x20, 0x1, 0xf2, 0x5d, 0x0, 0x1e, 0x0, 0x7b, + 0x0, + + /* U+006C "l" */ + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + + /* U+006D "m" */ + 0x1e, 0xab, 0xc5, 0xbb, 0xc2, 0x1f, 0x20, 0x5f, + 0x10, 0x69, 0x1e, 0x0, 0x2c, 0x0, 0x4b, 0x1e, + 0x0, 0x2c, 0x0, 0x4b, 0x1e, 0x0, 0x2c, 0x0, + 0x4b, + + /* U+006E "n" */ + 0x1e, 0xab, 0xc4, 0x1f, 0x20, 0x3d, 0x1e, 0x0, + 0xe, 0x1e, 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+006F "o" */ + 0x7, 0xdd, 0xb1, 0x5c, 0x0, 0x7b, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7b, 0x7, 0xdd, 0xb1, + + /* U+0070 "p" */ + 0x1e, 0xab, 0xd6, 0x1, 0xf3, 0x1, 0xd2, 0x1e, + 0x0, 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1e, 0xac, + 0xd5, 0x1, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x8, 0xdc, 0x8e, 0x5c, 0x0, 0x7e, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7e, 0x8, 0xdc, 0x8e, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xe, + + /* U+0072 "r" */ + 0x1d, 0xaa, 0x1f, 0x30, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, + + /* U+0073 "s" */ + 0x2c, 0xcc, 0x48, 0x80, 0x0, 0x2a, 0xca, 0x21, + 0x0, 0x6a, 0x6c, 0xcc, 0x30, + + /* U+0074 "t" */ + 0xf, 0x0, 0x9f, 0xb6, 0xf, 0x0, 0xf, 0x0, + 0xe, 0x10, 0x7, 0xd9, + + /* U+0075 "u" */ + 0x2d, 0x0, 0x1d, 0x2d, 0x0, 0x1d, 0x2d, 0x0, + 0x1d, 0xe, 0x10, 0x6d, 0x6, 0xdb, 0x9d, + + /* U+0076 "v" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x86, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, + + /* U+0077 "w" */ + 0xb2, 0x1, 0xf1, 0x2, 0xb5, 0x80, 0x7b, 0x80, + 0x85, 0xd, 0xd, 0x1d, 0xd, 0x0, 0x89, 0x90, + 0x99, 0x80, 0x2, 0xf2, 0x2, 0xf2, 0x0, + + /* U+0078 "x" */ + 0x5b, 0x3, 0xc0, 0x8, 0x9c, 0x10, 0x0, 0xe7, + 0x0, 0xa, 0x7c, 0x20, 0x79, 0x2, 0xd1, + + /* U+0079 "y" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x77, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, 0x0, 0xd1, 0x0, 0xc, 0xd6, 0x0, + 0x0, + + /* U+007A "z" */ + 0x6b, 0xbe, 0xb0, 0x2, 0xd1, 0x1, 0xd2, 0x0, + 0xc4, 0x0, 0x8e, 0xbb, 0x90, + + /* U+007B "{" */ + 0x4, 0xd3, 0x9, 0x50, 0xa, 0x50, 0xa, 0x40, + 0x5f, 0x10, 0xa, 0x40, 0xa, 0x50, 0x9, 0x50, + 0x4, 0xd3, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xe0, + + /* U+007D "}" */ + 0xab, 0x0, 0xd2, 0xd, 0x20, 0xc2, 0x9, 0xc0, + 0xc2, 0xd, 0x20, 0xd2, 0xab, 0x0, + + /* U+007E "~" */ + 0x1a, 0x91, 0x62, 0x44, 0x29, 0x90, + + /* U+00B0 "°" */ + 0x7, 0x81, 0x62, 0x8, 0x62, 0x8, 0x7, 0x81, + + /* U+2022 "•" */ + 0x19, 0x23, 0xe4, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0x10, 0x0, 0x16, + 0xbf, 0xff, 0xf2, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x20, 0x5, 0xff, 0xd9, 0x41, 0xf2, 0x0, 0x5f, + 0x20, 0x0, 0x1f, 0x20, 0x5, 0xe0, 0x0, 0x1, + 0xf2, 0x0, 0x5e, 0x0, 0x7, 0x9f, 0x20, 0x48, + 0xe0, 0x7, 0xff, 0xf2, 0xaf, 0xfe, 0x0, 0x2b, + 0xd8, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x41, 0x88, 0x88, 0x88, 0x14, 0xeb, 0xe7, 0x77, + 0x7e, 0xbe, 0xa2, 0xd0, 0x0, 0xd, 0x2a, 0xeb, + 0xe3, 0x33, 0x3e, 0xbe, 0xb4, 0xfb, 0xbb, 0xbf, + 0x4b, 0xd9, 0xd0, 0x0, 0xd, 0x9d, 0xb5, 0xd0, + 0x0, 0xd, 0x5b, 0xb7, 0xff, 0xff, 0xff, 0x7b, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd6, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, + 0x52, 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, + 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, 0x52, + 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, 0xfe, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0x78, 0x63, 0x88, + 0x88, 0x87, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0x7c, + 0x10, 0x6, 0xff, 0x70, 0xdf, 0xd1, 0x6f, 0xf7, + 0x0, 0x1d, 0xfe, 0xff, 0x70, 0x0, 0x1, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0xc, 0xd1, 0x2, 0xea, 0xaf, + 0xd4, 0xef, 0x80, 0xaf, 0xff, 0x80, 0x2, 0xff, + 0xf1, 0x2, 0xef, 0xdf, 0xd1, 0xdf, 0x80, 0xaf, + 0xb6, 0x70, 0x0, 0x85, + + /* U+F011 "" */ + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x2, 0xa0, 0xea, + 0x29, 0x0, 0xe, 0xe1, 0xea, 0x5f, 0xa0, 0x7f, + 0x40, 0xea, 0x8, 0xf3, 0xbd, 0x0, 0xea, 0x1, + 0xf7, 0xcc, 0x0, 0xb7, 0x0, 0xf8, 0xaf, 0x0, + 0x0, 0x4, 0xf6, 0x4f, 0xa0, 0x0, 0x1d, 0xf1, + 0x9, 0xfd, 0x89, 0xef, 0x50, 0x0, 0x6d, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x1, 0x88, 0x10, 0x0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0x1e, 0xcf, 0xff, 0xfc, 0xd0, 0x7f, + 0xff, 0xdd, 0xff, 0xf7, 0x2d, 0xfa, 0x0, 0xbf, + 0xd1, 0xb, 0xf7, 0x0, 0x8f, 0xa0, 0x6f, 0xfe, + 0x55, 0xef, 0xf6, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x6, 0x3a, 0xff, 0xa3, 0x60, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x90, 0xf8, 0x0, 0x0, 0x9, 0xf8, 0xec, + 0xf8, 0x0, 0x1, 0xbe, 0x5a, 0x5c, 0xf8, 0x0, + 0x2d, 0xd5, 0xef, 0xf6, 0xaf, 0x50, 0xda, 0x6f, + 0xff, 0xff, 0x87, 0xf1, 0x11, 0xff, 0xff, 0xff, + 0xf5, 0x10, 0x2, 0xff, 0xc3, 0x9f, 0xf6, 0x0, + 0x2, 0xff, 0xb0, 0x7f, 0xf6, 0x0, 0x1, 0xbb, + 0x70, 0x4b, 0xb3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x88, 0x20, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x0, 0x8b, 0xb9, 0x8b, 0x8b, 0xb9, + 0xdf, 0xff, 0xff, 0xfe, 0xdf, 0xcf, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf4, 0x0, 0xb, 0xc0, 0x0, 0x0, + 0x8e, 0x10, 0x6e, 0x10, 0x0, 0x0, 0xc, 0xa0, + 0xee, 0xcb, 0x10, 0xa, 0xcd, 0xf2, 0xff, 0xff, + 0xb8, 0x9f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F021 "" */ + 0x0, 0x4, 0x87, 0x30, 0x5f, 0x2, 0xdf, 0xfe, + 0xfc, 0x7f, 0x1e, 0xd3, 0x0, 0x3c, 0xff, 0x9f, + 0x10, 0x5, 0xfe, 0xff, 0x44, 0x0, 0x2, 0x66, + 0x66, 0x12, 0x22, 0x0, 0x0, 0x11, 0xff, 0xff, + 0x50, 0x0, 0xda, 0xff, 0xa3, 0x10, 0x8, 0xf4, + 0xfc, 0xfb, 0x66, 0xbf, 0x80, 0xf5, 0x5c, 0xff, + 0xd5, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x70, 0x0, 0xbf, 0xab, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3e, 0xf0, 0x0, 0x2c, + + /* U+F027 "" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0xb, 0xf0, 0x0, + 0xab, 0xdf, 0xf0, 0x20, 0xff, 0xff, 0xf0, 0xa6, + 0xff, 0xff, 0xf0, 0x59, 0xff, 0xff, 0xf0, 0x92, + 0x0, 0x3e, 0xf0, 0x0, 0x0, 0x2, 0xc0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x70, 0x0, 0xaa, 0x0, 0x0, 0xb, 0xf0, 0xa, + 0x4a, 0x70, 0xab, 0xdf, 0xf0, 0x23, 0xe2, 0xe0, + 0xff, 0xff, 0xf0, 0xa6, 0x95, 0xc2, 0xff, 0xff, + 0xf0, 0x59, 0x76, 0xc3, 0xff, 0xff, 0xf0, 0x92, + 0xc3, 0xe1, 0x0, 0x3e, 0xf0, 0x9, 0xa6, 0xb0, + 0x0, 0x2, 0xc0, 0x3, 0x3e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, + + /* U+F03E "" */ + 0x24, 0x44, 0x44, 0x44, 0x42, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xd, 0xff, 0xef, 0xff, 0xf8, + 0x4e, 0xfe, 0x25, 0xff, 0xff, 0x9d, 0xe2, 0x0, + 0x6f, 0xf9, 0x1, 0x20, 0x0, 0x4f, 0xf7, 0x44, + 0x44, 0x44, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F043 "" */ + 0x0, 0x1a, 0x0, 0x0, 0x7, 0xf5, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0x8f, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0x1b, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff, + 0xdd, 0x6e, 0xff, 0xfc, 0x7e, 0x59, 0xff, 0x60, + 0x9f, 0xff, 0x80, 0x0, 0x13, 0x10, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0xe, 0x70, 0x3, 0xe4, 0xe7, + 0x4, 0xff, 0x5e, 0x75, 0xff, 0xf5, 0xec, 0xff, + 0xff, 0x5e, 0xff, 0xff, 0xf5, 0xea, 0xef, 0xff, + 0x5e, 0x71, 0xdf, 0xf5, 0xe7, 0x1, 0xcf, 0x59, + 0x50, 0x0, 0x92, + + /* U+F04B "" */ + 0x88, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xc3, 0x0, 0xf, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xfd, 0x40, 0x0, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0xdf, + 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, 0xc0, + 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, + 0xc0, 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, + 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xfb, 0xf, 0xff, + 0xb8, 0xbb, 0x50, 0x8b, 0xb5, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xbb, 0xbb, 0xbb, 0xb5, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0xb, 0xa0, 0x0, 0xe7, 0xcf, + 0xb0, 0xe, 0x7c, 0xff, 0xc1, 0xe7, 0xcf, 0xff, + 0xdf, 0x7c, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0x9e, + 0x7c, 0xff, 0x70, 0xe7, 0xcf, 0x60, 0xe, 0x77, + 0x50, 0x0, 0x95, + + /* U+F052 "" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x60, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x40, 0x6, 0xff, 0xff, 0xff, + 0xf3, 0xe, 0xff, 0xff, 0xff, 0xfa, 0x3, 0x66, + 0x66, 0x66, 0x62, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x6, 0x88, 0x88, + 0x88, 0x84, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc7, 0x0, 0x1d, + 0xf5, 0x1, 0xdf, 0x50, 0x1d, 0xf5, 0x0, 0x4f, + 0xd0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x6, 0xf9, 0x0, 0x0, 0x51, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x3e, 0x30, 0x0, 0x2e, 0xf3, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x2e, 0xe3, 0x0, + 0x9, 0xf8, 0x0, 0x8f, 0xa0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0x6, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x40, + 0x0, 0x0, 0x9, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x9b, 0xbd, 0xfc, 0xbb, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x13, 0x3a, 0xf7, 0x33, 0x10, + 0x0, 0x9f, 0x50, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0x10, 0x0, + + /* U+F068 "" */ + 0xbd, 0xdd, 0xdd, 0xdd, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x4, 0x8a, 0x95, 0x0, 0x0, 0x1, 0xcf, + 0x84, 0x6e, 0xe3, 0x0, 0x1e, 0xf5, 0x8, 0x72, + 0xff, 0x40, 0xbf, 0xe0, 0x2d, 0xf5, 0xbf, 0xe0, + 0xdf, 0xe3, 0xff, 0xf6, 0xaf, 0xf1, 0x4f, 0xf3, + 0xaf, 0xd1, 0xef, 0x70, 0x5, 0xfd, 0x31, 0x2b, + 0xf7, 0x0, 0x0, 0x19, 0xdf, 0xea, 0x30, 0x0, + + /* U+F070 "" */ + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x16, 0xaa, 0x83, 0x0, 0x0, 0x3, 0xef, 0xe6, + 0x49, 0xfb, 0x0, 0x0, 0x1, 0xbe, 0x49, 0x28, + 0xfd, 0x0, 0x1d, 0x40, 0x8f, 0xfe, 0x1f, 0xf9, + 0x4, 0xff, 0x50, 0x5f, 0xf1, 0xff, 0xb0, 0xa, + 0xfc, 0x0, 0x2d, 0xdf, 0xf2, 0x0, 0xa, 0xfa, + 0x10, 0x1b, 0xf7, 0x0, 0x0, 0x4, 0xbe, 0xe4, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xe7, 0xcf, + 0x20, 0x0, 0x0, 0x7, 0xfc, 0x8, 0xfb, 0x0, + 0x0, 0x1, 0xef, 0xd0, 0x9f, 0xf4, 0x0, 0x0, + 0x9f, 0xff, 0x5c, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe1, 0xaf, 0xff, 0x60, 0xb, 0xff, 0xfe, 0x2b, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc1, 0xef, 0xd1, 0x3, 0xef, 0xfc, 0x99, + 0xfb, 0x2e, 0xec, 0xf8, 0x0, 0x54, 0xde, 0x25, + 0x70, 0x0, 0xc, 0xf4, 0x1, 0x10, 0x0, 0xbf, + 0x5c, 0x78, 0xd1, 0xff, 0xf6, 0xa, 0xff, 0xfd, + 0x78, 0x60, 0x0, 0x7c, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0x60, + + /* U+F077 "" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x60, + 0x0, 0x0, 0xaf, 0xef, 0x60, 0x0, 0xaf, 0x90, + 0xcf, 0x60, 0x9f, 0x80, 0x0, 0xcf, 0x57, 0x80, + 0x0, 0x0, 0xa4, + + /* U+F078 "" */ + 0x11, 0x0, 0x0, 0x2, 0xc, 0xe2, 0x0, 0x5, + 0xf8, 0x3f, 0xe2, 0x5, 0xfd, 0x10, 0x3f, 0xe7, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3b, 0x10, 0x0, + + /* U+F079 "" */ + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xc3, 0xff, 0xff, 0xf5, 0x0, 0xbe, 0xfe, 0xb3, + 0x44, 0x4e, 0x60, 0x4, 0x3f, 0x34, 0x0, 0x0, + 0xd6, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xd, 0x60, + 0x0, 0x2f, 0x20, 0x0, 0x8c, 0xea, 0xf1, 0x1, + 0xff, 0xff, 0xf7, 0xdf, 0xf7, 0x0, 0x4, 0x44, + 0x44, 0x11, 0xc7, 0x0, + + /* U+F07B "" */ + 0x58, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, 0xe4, + 0x44, 0x41, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F093 "" */ + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x36, 0xff, 0x63, + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x9a, 0xa5, 0xff, 0x5a, 0xa9, + 0xff, 0xff, 0xdd, 0xfe, 0xdf, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x39, 0x10, 0x4f, 0xf4, 0x0, 0xbf, + 0xfc, 0x9f, 0xf6, 0x0, 0xd, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x9f, 0xfd, 0x81, 0x0, 0x0, 0x1, + 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x30, 0x5, + 0xc6, 0xe7, 0xbb, 0x5, 0xff, 0x4d, 0xbd, 0xb4, + 0xff, 0x40, 0x3c, 0xff, 0xff, 0x40, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x6f, 0xff, 0xdf, 0x80, 0xe, + 0x7b, 0xb2, 0xef, 0x80, 0xdb, 0xd9, 0x2, 0xef, + 0x73, 0xca, 0x10, 0x2, 0x72, + + /* U+F0C5 "" */ + 0x0, 0x5d, 0xdd, 0x48, 0x0, 0x8, 0xff, 0xf6, + 0xf8, 0xcc, 0x8f, 0xff, 0x84, 0x3f, 0xe8, 0xff, + 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, 0xe8, + 0xff, 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, + 0xe7, 0xff, 0xff, 0xfc, 0xff, 0x46, 0x66, 0x66, + 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x34, 0x44, 0x43, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x22, 0x22, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xf5, 0x22, 0x22, 0xfe, 0x1f, 0x40, 0x0, + 0xe, 0xf8, 0xf7, 0x44, 0x44, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xf6, 0xc, 0xff, 0x9f, + 0xff, 0x20, 0x9f, 0xf9, 0xff, 0xfc, 0x7f, 0xff, + 0x9a, 0xdd, 0xdd, 0xdd, 0xd4, + + /* U+F0C9 "" */ + 0x67, 0x77, 0x77, 0x77, 0x4e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, + 0x77, 0x74, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x55, 0x55, 0x55, 0x3f, + 0xff, 0xff, 0xff, 0xfb, 0x11, 0x11, 0x11, 0x11, + 0x0, + + /* U+F0E0 "" */ + 0x58, 0x88, 0x88, 0x88, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0xc5, + 0xdf, 0xff, 0xfd, 0x5c, 0xfe, 0x6a, 0xff, 0xa5, + 0xef, 0xff, 0xf9, 0x55, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F0E7 "" */ + 0x3, 0xaa, 0xa2, 0x0, 0x7, 0xff, 0xf2, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xd8, 0x81, + 0xe, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0xd, 0xa0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+F0EA "" */ + 0x1, 0x79, 0x11, 0x0, 0xf, 0xfc, 0x9f, 0xf4, + 0x0, 0xff, 0xfd, 0xcc, 0x30, 0xf, 0xfa, 0x79, + 0x93, 0x40, 0xff, 0x8e, 0xff, 0x6f, 0x5f, 0xf8, + 0xef, 0xf7, 0x64, 0xff, 0x8e, 0xff, 0xff, 0xcf, + 0xf8, 0xef, 0xff, 0xfc, 0x46, 0x3e, 0xff, 0xff, + 0xc0, 0x0, 0xdf, 0xff, 0xfc, 0x0, 0x2, 0x44, + 0x44, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x1, 0x90, 0x0, 0x0, 0x2, 0xaf, 0x81, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0x9f, 0xff, + 0xff, 0x50, 0xc, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xf9, 0x46, 0x66, 0x66, 0x66, + 0x20, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, + + /* U+F11C "" */ + 0x24, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf4, 0xa0, 0xa0, 0xb0, + 0xb0, 0xf4, 0xff, 0xbe, 0xae, 0xae, 0xaf, 0xf4, + 0xff, 0x3a, 0xa, 0xa, 0xf, 0xf4, 0xfb, 0xea, + 0xaa, 0xaa, 0xea, 0xf4, 0xf7, 0xb4, 0x44, 0x44, + 0xc4, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x29, 0x70, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xe0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0x70, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xee, + 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, + + /* U+F15B "" */ + 0xef, 0xff, 0x5b, 0x0, 0xff, 0xff, 0x6f, 0xb0, + 0xff, 0xff, 0x68, 0x83, 0xff, 0xff, 0xfd, 0xd6, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xbf, 0xff, 0xfd, 0x81, 0x0, 0x2c, 0xfe, 0xa8, + 0x78, 0xcf, 0xf7, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x3c, 0xf5, 0x22, 0x5, 0xbe, 0xfd, 0x81, 0x5, + 0x0, 0x9, 0xfe, 0xa9, 0xcf, 0xe2, 0x0, 0x0, + 0x37, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, + 0x0, + + /* U+F240 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x55, 0x5a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0xfd, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x76, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F241 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x54, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xf0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F242 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x54, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xf2, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x10, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F243 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x54, 0x44, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0x5f, 0x6f, 0xf5, 0x0, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x20, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F244 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0x74, + 0x44, 0x44, 0x44, 0x4a, 0xf2, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x5f, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xf5, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xbd, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa1, + 0x3, 0x0, 0x0, 0xa, 0xf7, 0x39, 0x0, 0x0, + 0x7, 0x60, 0xff, 0xea, 0xbf, 0xaa, 0xaa, 0xdf, + 0x45, 0xa3, 0x0, 0x93, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x1, 0xb8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x6b, 0xca, 0x40, 0x0, 0x9f, 0xf6, 0xff, + 0x40, 0x1f, 0xff, 0x26, 0xfb, 0x4, 0xf6, 0xb4, + 0x6b, 0xf0, 0x6f, 0xf4, 0x6, 0xff, 0x6, 0xff, + 0x90, 0xbf, 0xf0, 0x5f, 0x95, 0x34, 0xcf, 0x2, + 0xfb, 0xf3, 0x4d, 0xc0, 0xc, 0xff, 0x3d, 0xf7, + 0x0, 0x1b, 0xfe, 0xf9, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F2ED "" */ + 0x12, 0x3b, 0xca, 0x22, 0x1f, 0xff, 0xff, 0xff, + 0xfb, 0x36, 0x66, 0x66, 0x66, 0x16, 0xff, 0xff, + 0xff, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, 0xf6, + 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, + 0xf6, 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, + 0x24, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x44, 0x44, + 0x42, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0xa5, 0xef, + 0xe0, 0x0, 0x0, 0xbf, 0xe5, 0xd4, 0x0, 0x0, + 0xbf, 0xff, 0xe0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0x88, 0x88, 0x88, 0x86, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xf9, + 0x6f, 0x69, 0xff, 0x88, 0xff, 0xff, 0xc1, 0x21, + 0xcf, 0xf8, 0xdf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0x82, 0xef, 0xff, 0x71, 0x91, 0x7f, 0xf8, 0x2, + 0xef, 0xfe, 0xdf, 0xde, 0xff, 0x70, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xe3, + + /* U+F7C2 "" */ + 0x1, 0xdf, 0xff, 0xe5, 0x1d, 0x6c, 0x5a, 0xab, + 0xdf, 0x3b, 0x18, 0x8b, 0xff, 0xdf, 0xde, 0xeb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x8, 0x10, + 0x0, 0x7, 0xf0, 0xb, 0xf2, 0x0, 0x0, 0x8f, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xfa, + 0x99, 0x99, 0x99, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 43, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7, .adv_w = 63, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 13, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65, .adv_w = 135, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 125, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 128, .adv_w = 54, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 54, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 160, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 168, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 183, .adv_w = 36, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 186, .adv_w = 61, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 188, .adv_w = 36, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 190, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 213, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 238, .adv_w = 59, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 249, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 270, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 316, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 337, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 358, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 379, .adv_w = 103, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 400, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 421, .adv_w = 36, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 36, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 433, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 448, .adv_w = 93, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 457, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 472, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 493, .adv_w = 165, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 538, .adv_w = 117, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 570, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 116, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 620, .adv_w = 132, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 107, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 666, .adv_w = 102, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 684, .adv_w = 124, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 709, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 50, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 741, .adv_w = 82, .box_w = 6, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 762, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 787, .adv_w = 95, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 805, .adv_w = 153, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 134, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 886, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 134, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 943, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 985, .adv_w = 94, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1006, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1031, .adv_w = 114, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1063, .adv_w = 180, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1102, .adv_w = 108, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1127, .adv_w = 104, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1155, .adv_w = 105, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1180, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1194, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1217, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1231, .adv_w = 93, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1243, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1246, .adv_w = 96, .box_w = 3, .box_h = 1, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1248, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1263, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 91, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1303, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1324, .adv_w = 98, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 56, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1353, .adv_w = 110, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1374, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1395, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1406, .adv_w = 45, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1424, .adv_w = 99, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1449, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1456, .adv_w = 169, .box_w = 10, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1481, .adv_w = 109, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 102, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1511, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1536, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1557, .adv_w = 66, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1567, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1580, .adv_w = 66, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1592, .adv_w = 108, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1607, .adv_w = 89, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1625, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 88, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 89, .box_w = 7, .box_h = 7, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1688, .adv_w = 83, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1701, .adv_w = 56, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1719, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1724, .adv_w = 56, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1738, .adv_w = 93, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1744, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1752, .adv_w = 50, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1755, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1816, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1946, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1974, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2029, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2084, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2144, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2199, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2247, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2302, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2322, .adv_w = 120, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2354, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2414, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2454, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2493, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2528, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2578, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2623, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2668, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2703, .adv_w = 140, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2753, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2783, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2813, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2858, .adv_w = 140, .box_w = 9, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2872, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2920, .adv_w = 200, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2992, .adv_w = 180, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3064, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3114, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3141, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3168, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3220, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3260, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3315, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3376, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3421, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3471, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3516, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3557, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3597, .adv_w = 100, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3641, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3691, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3741, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3789, .adv_w = 160, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3855, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3899, .adv_w = 200, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3964, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4010, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4056, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4102, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4148, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4194, .adv_w = 200, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4253, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4303, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4353, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4414, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4466, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4510, .adv_w = 161, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 4, -4, 0, 0, + 0, 0, -9, -10, 1, 8, 4, 3, + -6, 1, 8, 0, 7, 2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -5, 0, 0, 0, 0, + 0, -3, 3, 3, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -3, + 0, 0, 0, 0, -2, 0, 0, -2, + -2, 0, 0, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -2, 0, -4, 0, -19, 0, + 0, -3, 0, 3, 5, 0, 0, -3, + 2, 2, 5, 3, -3, 3, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -2, -8, 0, -6, + -1, 0, 0, 0, 0, 0, 6, 0, + -5, -1, 0, 0, 0, -3, 0, 0, + -1, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, -1, 6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 2, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 2, 5, -2, 0, 0, 3, -2, + -5, -22, 1, 4, 3, 0, -2, 0, + 6, 0, 5, 0, 5, 0, -15, 0, + -2, 5, 0, 5, -2, 3, 2, 0, + 0, 0, -2, 0, 0, -3, 13, 0, + 13, 0, 5, 0, 7, 2, 3, 5, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, -1, 0, 1, -3, -2, -3, 1, + 0, -2, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, -10, 0, 0, 0, + 0, -1, 0, 16, -2, -2, 2, 2, + -1, 0, -2, 2, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 10, 0, 0, -6, 0, + 5, 0, -11, -16, -11, -3, 5, 0, + 0, -11, 0, 2, -4, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -2, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -4, -3, 0, -4, + -5, -5, -3, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 2, 0, + 1, -2, 0, 0, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 5, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -5, + -1, -5, 3, 0, 0, -3, 2, 3, + 4, 0, -4, 0, -2, 0, 0, -8, + 2, -1, 1, -8, 2, 0, 0, 0, + -8, 0, -8, -1, -14, -1, 0, -8, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -5, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -1, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -2, -2, 0, + -3, 0, 5, -1, 0, -5, 0, 0, + 4, -8, -8, -7, -3, 2, 0, -1, + -10, -3, 0, -3, 0, -3, 2, -3, + -10, 0, -4, 0, 0, 1, 0, 1, + -1, 0, 2, 0, -5, -6, 0, -8, + -4, -3, -4, -5, -2, -4, 0, -3, + -4, 1, 0, 0, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, 0, -2, 0, -3, -4, + -4, 0, 0, -5, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -3, 0, 0, 0, 0, -8, -5, 0, + 0, 0, -2, -8, 0, 0, -2, 2, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -5, 0, -2, 0, -2, -2, + 0, -4, -4, -5, -1, 0, -3, 0, + -5, 0, 0, 0, 0, 13, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -7, + 0, 0, 0, 0, 0, -15, -3, 5, + 5, -1, -7, 0, 2, -2, 0, -8, + -1, -2, 2, -11, -2, 2, 0, 2, + -6, -2, -6, -5, -7, 0, 0, -10, + 0, 9, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -4, -5, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -2, 0, 0, + -3, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -4, 2, -1, 0, -4, + -2, 0, -2, -2, -1, 0, -2, -3, + 0, 0, -1, 0, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -3, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 2, 0, -2, 0, -1, -2, + -5, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -2, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 6, 0, 0, -4, 0, + -1, 3, 0, -2, -7, -2, 2, 0, + 0, -8, -3, 2, -3, 1, 0, -1, + -1, -5, 0, -2, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -3, -3, 0, + -3, -2, -2, -2, -2, 0, -3, 1, + -3, -3, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -5, 0, + 1, -4, 3, 0, -1, -8, 0, 0, + -4, -2, 0, -6, -4, -4, 0, 0, + -7, -2, -6, -6, -8, 0, -4, 0, + 1, 11, -2, 0, -4, -2, 0, -2, + -3, -4, -3, -6, -7, -4, -2, 0, + 0, -1, 0, 0, 0, 0, -11, -1, + 5, 4, -4, -6, 0, 0, -5, 0, + -8, -1, -2, 3, -15, -2, 0, 0, + 0, -10, -2, -8, -2, -12, 0, 0, + -11, 0, 9, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -6, -1, 0, -10, + 0, 0, 0, 0, -5, 0, -1, 0, + 0, -4, -8, 0, 0, -1, -2, -5, + -2, 0, -1, 0, 0, 0, 0, -7, + -2, -5, -5, -1, -3, -4, -2, -3, + 0, -3, -1, -5, -2, 0, -2, -3, + -2, -3, 0, 1, 0, -1, -5, 0, + 3, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -3, 7, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -5, 0, + -2, 0, -2, -2, 0, -4, -4, -5, + -1, 0, -3, 1, 6, 0, 0, 0, + 0, 13, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -3, + -2, 0, 0, -3, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -5, + -3, 0, 5, -5, -5, -3, -3, 6, + 3, 2, -14, -1, 3, -2, 0, -2, + 2, -2, -6, 0, -2, 2, -2, -1, + -5, -1, 0, 0, 5, 3, 0, -4, + 0, -9, -2, 5, -2, -6, 0, -2, + -5, -5, -2, 6, 2, 0, -2, 0, + -4, 0, 1, 5, -4, -6, -6, -4, + 5, 0, 0, -12, -1, 2, -3, -1, + -4, 0, -4, -6, -2, -2, -1, 0, + 0, -4, -3, -2, 0, 5, 4, -2, + -9, 0, -9, -2, 0, -6, -9, 0, + -5, -3, -5, -4, 4, 0, 0, -2, + 0, -3, -1, 0, -2, -3, 0, 3, + -5, 2, 0, 0, -8, 0, -2, -4, + -3, -1, -5, -4, -5, -4, 0, -5, + -2, -4, -3, -5, -2, 0, 0, 0, + 8, -3, 0, -5, -2, 0, -2, -3, + -4, -4, -4, -6, -2, -3, 3, 0, + -2, 0, -8, -2, 1, 3, -5, -6, + -3, -5, 5, -2, 1, -15, -3, 3, + -4, -3, -6, 0, -5, -7, -2, -2, + -1, -2, -3, -5, 0, 0, 0, 5, + 4, -1, -10, 0, -10, -4, 4, -6, + -11, -3, -6, -7, -8, -5, 3, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 3, 1, -3, 3, 0, 0, -5, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 1, 5, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 6, 0, 3, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, 0, -2, 3, 0, 5, + 0, 0, 16, 2, -3, -3, 2, 2, + -1, 0, -8, 0, 0, 8, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, 6, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -4, 0, + 0, 0, 0, 0, 2, 21, -3, -1, + 5, 4, -4, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -4, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -3, 0, -2, 0, + -4, 0, 0, 0, -3, 2, -2, 0, + 0, -4, -2, -4, 0, 0, -4, 0, + -2, 0, -8, 0, -2, 0, 0, -13, + -3, -6, -2, -6, 0, 0, -11, 0, + -4, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -3, -1, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 3, + 0, -1, -4, -1, -3, -3, 0, -2, + -1, -1, 1, -4, 0, 0, 0, 0, + -14, -1, -2, 0, -4, 0, -1, -8, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -3, + 2, 0, 0, 0, -4, -2, -3, 0, + 0, -4, 0, -2, 0, -8, 0, 0, + 0, 0, -16, 0, -3, -6, -8, 0, + 0, -11, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, -1, + -2, 0, 0, 0, 3, -2, 0, 5, + 8, -2, -2, -5, 2, 8, 3, 4, + -4, 2, 7, 2, 5, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 8, -3, -2, 0, -1, + 13, 7, 13, 0, 0, 0, 2, 0, + 0, 6, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -13, -2, -1, -7, + -8, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -13, -2, -1, + -7, -8, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -4, 2, 0, -2, + 1, 3, 2, -5, 0, 0, -1, 2, + 0, 1, 0, 0, 0, 0, -4, 0, + -1, -1, -3, 0, -1, -6, 0, 10, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -4, -3, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -13, + -2, -1, -7, -8, 0, 0, -11, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -5, -2, -1, 5, -1, -2, + -6, 0, -1, 0, -1, -4, 0, 4, + 0, 1, 0, 1, -4, -6, -2, 0, + -6, -3, -4, -7, -6, 0, -3, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -4, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -3, + -2, 2, 0, -3, -3, -1, 0, -5, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 5, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 7, -2, -5, -5, 1, 2, 2, 0, + -4, 1, 2, 1, 5, 1, 5, -1, + -4, 0, 0, -6, 0, 0, -5, -4, + 0, 0, -3, 0, -2, -3, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -5, + -2, 6, 0, 0, -1, 0, -3, 0, + 0, 2, -4, 0, 2, -2, 1, 0, + 0, -5, 0, -1, 0, 0, -2, 2, + -1, 0, 0, 0, -7, -2, -4, 0, + -5, 0, 0, -8, 0, 6, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -5, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 4, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 3, 0, 4, + 0, 0, 0, 0, 0, -10, -9, 0, + 7, 5, 3, -6, 1, 7, 0, 6, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_10 = { +#else +lv_font_t lv_font_montserrat_10 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 11, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_10*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_12.c b/libraries/lvgl/src/font/lv_font_montserrat_12.c new file mode 100644 index 0000000..6e5c1ea --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_12.c @@ -0,0 +1,1915 @@ +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_12.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 1 +#endif + +#if LV_FONT_MONTSERRAT_12 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0xe, 0x20, + 0xd1, 0x3, 0x0, 0x81, 0x1e, 0x30, + + /* U+0022 "\"" */ + 0x3c, 0x1e, 0x3b, 0xe, 0x3b, 0xe, 0x15, 0x7, + + /* U+0023 "#" */ + 0x0, 0x48, 0x3, 0xa0, 0x0, 0x6, 0x60, 0x58, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x10, 0xa, 0x20, + 0x84, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd, + 0x0, 0xb1, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, + 0x1c, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0x1c, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x92, 0x0, 0x3, + 0xcf, 0xfb, 0x31, 0xf7, 0xa5, 0x74, 0x4e, 0x9, + 0x20, 0x1, 0xf9, 0xb2, 0x0, 0x2, 0xbf, 0xe8, + 0x0, 0x0, 0x97, 0xda, 0x0, 0x9, 0x24, 0xe5, + 0xb4, 0xa5, 0xba, 0x8, 0xef, 0xfa, 0x10, 0x0, + 0x92, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+0025 "%" */ + 0xa, 0xc8, 0x0, 0xc, 0x10, 0x66, 0xa, 0x20, + 0x76, 0x0, 0x83, 0x7, 0x42, 0xc0, 0x0, 0x57, + 0xa, 0x2b, 0x20, 0x0, 0x9, 0xc6, 0x68, 0x5c, + 0x90, 0x0, 0x1, 0xc1, 0xc0, 0x67, 0x0, 0xa, + 0x43, 0x90, 0x2a, 0x0, 0x49, 0x1, 0xb0, 0x47, + 0x0, 0xc1, 0x0, 0x7b, 0xb1, + + /* U+0026 "&" */ + 0x0, 0x9e, 0xd4, 0x0, 0x0, 0x5c, 0x3, 0xd0, + 0x0, 0x4, 0xc0, 0x5c, 0x0, 0x0, 0xc, 0xbd, + 0x20, 0x0, 0x3, 0xde, 0x80, 0x10, 0x1, 0xe3, + 0x1d, 0x78, 0x80, 0x6b, 0x0, 0x1d, 0xf2, 0x4, + 0xf4, 0x13, 0xcf, 0x60, 0x6, 0xdf, 0xd6, 0x2b, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3c, 0x3b, 0x3b, 0x15, + + /* U+0028 "(" */ + 0xa, 0x71, 0xf1, 0x5c, 0x9, 0x80, 0xb6, 0xc, + 0x40, 0xd4, 0xc, 0x40, 0xb6, 0x9, 0x80, 0x5b, + 0x1, 0xf1, 0xa, 0x70, + + /* U+0029 ")" */ + 0x6b, 0x0, 0xf2, 0xb, 0x60, 0x7a, 0x5, 0xc0, + 0x4d, 0x3, 0xe0, 0x4d, 0x5, 0xc0, 0x7a, 0xb, + 0x60, 0xf1, 0x6b, 0x0, + + /* U+002A "*" */ + 0x0, 0xb0, 0x8, 0x9c, 0xb5, 0xb, 0xf8, 0x8, + 0x7c, 0x95, 0x0, 0xa0, 0x0, + + /* U+002B "+" */ + 0x0, 0xb, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xf, 0x0, 0x2, 0xee, 0xfe, 0xe2, 0x1, 0x1f, + 0x11, 0x0, 0x0, 0xf0, 0x0, + + /* U+002C "," */ + 0x18, 0x4, 0xf1, 0xd, 0x3, 0x80, + + /* U+002D "-" */ + 0x4f, 0xfd, 0x2, 0x22, + + /* U+002E "." */ + 0x2a, 0x4, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x34, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xf0, 0x0, 0x5, 0xb0, 0x0, 0xa, 0x60, 0x0, + 0xe, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x97, 0x0, + 0x0, 0xe2, 0x0, 0x3, 0xd0, 0x0, 0x8, 0x70, + 0x0, 0xd, 0x20, 0x0, 0x2d, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, + 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, + 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, + 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, + 0x0, 0x9e, 0xe9, 0x0, + + /* U+0031 "1" */ + 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, + + /* U+0032 "2" */ + 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, + 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, + 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, + + /* U+0033 "3" */ + 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, + 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, + 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, + 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, + 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, + 0x0, 0x0, 0xe, 0x40, + + /* U+0035 "5" */ + 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, + 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, + 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, + 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, + + /* U+0036 "6" */ + 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, + 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, + 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, + 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, + 0x1, 0xaf, 0xfa, 0x10, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, + 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, + 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, + 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, + 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, + 0x5, 0xcf, 0xfb, 0x20, + + /* U+0039 "9" */ + 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, + 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, + 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, + 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, + + /* U+003A ":" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x4d, 0x0, + + /* U+003B ";" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x80, 0x4f, 0x10, 0xd0, 0x38, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x4b, 0xe1, 0x7, + 0xdc, 0x50, 0x3, 0xf8, 0x0, 0x0, 0x4, 0xbe, + 0x71, 0x0, 0x0, 0x29, 0xe2, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0xee, 0xe2, 0x1, 0x11, + 0x11, 0x0, + + /* U+003E ">" */ + 0x12, 0x0, 0x0, 0x2, 0xeb, 0x40, 0x0, 0x0, + 0x5c, 0xd6, 0x0, 0x0, 0x8, 0xf2, 0x1, 0x7e, + 0xb4, 0x2, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x1a, 0xef, 0xc3, 0x9, 0xa3, 0x2a, 0xe0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x9, + 0xc0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x2, 0x80, 0x0, 0x0, 0x4d, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4, 0xbd, 0xdd, 0x81, 0x0, 0x0, 0x9b, + 0x30, 0x0, 0x6d, 0x30, 0x7, 0xa0, 0x8e, 0xe8, + 0xd5, 0xd1, 0xd, 0x7, 0xd2, 0x19, 0xf3, 0x77, + 0x4a, 0xd, 0x40, 0x0, 0xf3, 0x1b, 0x58, 0xf, + 0x20, 0x0, 0xd3, 0xc, 0x58, 0xd, 0x40, 0x0, + 0xf3, 0x1b, 0x3a, 0x7, 0xd2, 0x1a, 0xf5, 0x77, + 0xd, 0x0, 0x8e, 0xe8, 0x5f, 0xb0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x2, + 0x40, 0x0, 0x0, 0x5, 0xbd, 0xed, 0x60, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, + 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, + 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, + 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, + 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, + 0xc, 0x70, 0x0, 0x0, 0xb9, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, + 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, + 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, + 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, + 0xbf, 0xff, 0xfd, 0x60, + + /* U+0043 "C" */ + 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, + 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, + 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, + 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, + 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, + 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, + 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, + 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, + 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, + 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, + 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, + 0x0, + + /* U+0048 "H" */ + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, + + /* U+0049 "I" */ + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, + + /* U+004A "J" */ + 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, + 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, + 0x5, 0xdf, 0xb2, + + /* U+004B "K" */ + 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, + 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, + 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, + 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, + 0xb7, 0x0, 0x3, 0xf3, + + /* U+004C "L" */ + 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0xb8, 0x0, 0x0, 0x1, 0xf3, 0xbf, 0x10, 0x0, + 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, + 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, + 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, + 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, + 0xb6, 0x0, 0x0, 0x0, 0xf3, + + /* U+004E "N" */ + 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, + 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, + 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, + 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, + 0xb7, 0x0, 0x0, 0xd7, + + /* U+004F "O" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, + 0x0, 0x3b, 0xef, 0xb4, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, + 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, + 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, + 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, + 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, + 0xb7, 0x0, 0x7, 0xd0, + + /* U+0053 "S" */ + 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, + 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, + 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, + 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, + 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, + 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, + + /* U+0055 "U" */ + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, + 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, + 0x4, 0xcf, 0xd8, 0x0, + + /* U+0056 "V" */ + 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, + 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, + 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, + 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, + 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x10, 0x0, + + /* U+0057 "W" */ + 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, + 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, + 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, + 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, + 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, + 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, + 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, + 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, + + /* U+0058 "X" */ + 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, + 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, + 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, + 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, + 0x8d, 0x0, 0x0, 0xc9, + + /* U+0059 "Y" */ + 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, + 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, + 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, + 0x7f, 0xff, 0xff, 0xf8, + + /* U+005B "[" */ + 0xbf, 0xcb, 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, + 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, 0x60, 0xb6, + 0xb, 0x60, 0xbf, 0xc0, + + /* U+005C "\\" */ + 0x35, 0x0, 0x0, 0x2e, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x8, 0x80, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x87, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x9, 0x70, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xa6, + + /* U+005D "]" */ + 0xcf, 0xb0, 0x7b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, + 0x6b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, 0x6b, 0x6, + 0xb0, 0x7b, 0xcf, 0xb0, + + /* U+005E "^" */ + 0x0, 0x7, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0xb4, 0xb0, 0x0, 0x2c, 0xc, 0x20, 0x8, 0x60, + 0x68, 0x0, 0xd0, 0x0, 0xd0, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, + + /* U+0060 "`" */ + 0x27, 0x10, 0x5, 0xc1, + + /* U+0061 "a" */ + 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, + 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, + 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, + 0x20, + + /* U+0062 "b" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, + 0x8f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, + 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, + 0x6d, 0xfc, 0x40, + + /* U+0063 "c" */ + 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, + 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, + 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, + 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, + + /* U+0065 "e" */ + 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, + 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, + 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, + 0x0, + + /* U+0066 "f" */ + 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, + 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, + 0x0, + + /* U+0067 "g" */ + 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, + 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, + 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, + + /* U+0068 "h" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, + 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, + 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, + 0x40, 0x0, 0xf2, + + /* U+0069 "i" */ + 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, + 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, + + /* U+006A "j" */ + 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, + 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, + 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, + 0x0, + + /* U+006B "k" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, + 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, + 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, + 0x40, 0x6, 0xe1, + + /* U+006C "l" */ + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, + + /* U+006D "m" */ + 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, + 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, + 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, + 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, + 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, + + /* U+006E "n" */ + 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, + 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, + 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, + 0x20, + + /* U+006F "o" */ + 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, + 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, + 0x2, 0xbf, 0xe8, 0x0, + + /* U+0070 "p" */ + 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, + 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, + 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, + 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, + + /* U+0071 "q" */ + 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + + /* U+0072 "r" */ + 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, + 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, + + /* U+0073 "s" */ + 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, + 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, + 0x22, 0xb8, 0x4c, 0xfe, 0xa0, + + /* U+0074 "t" */ + 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, + 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, + + /* U+0075 "u" */ + 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, + 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, + 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, + 0x0, + + /* U+0076 "v" */ + 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, + 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, + 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, + 0x0, 0x6, 0xf2, 0x0, + + /* U+0077 "w" */ + 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, + 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, + 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, + 0x60, 0xa6, 0xd3, 0x0, 0x1f, 0xe1, 0x4, 0xed, + 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, + + /* U+0078 "x" */ + 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, + 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, + 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, + 0x20, + + /* U+0079 "y" */ + 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, + 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, + 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, + 0x70, 0x0, 0x9b, 0x0, 0x4, 0xe1, 0x0, 0x1e, + 0x50, 0x0, 0x8f, 0xff, 0xfd, + + /* U+007B "{" */ + 0x0, 0xbf, 0x4, 0xe1, 0x5, 0xc0, 0x5, 0xc0, + 0x5, 0xc0, 0x6, 0xc0, 0x4f, 0x60, 0x8, 0xc0, + 0x5, 0xc0, 0x5, 0xc0, 0x5, 0xc0, 0x4, 0xe1, + 0x0, 0xbf, + + /* U+007C "|" */ + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + + /* U+007D "}" */ + 0xcd, 0x10, 0xc, 0x70, 0x9, 0x90, 0x9, 0x90, + 0x9, 0x90, 0x8, 0xa0, 0x3, 0xf7, 0x8, 0xb0, + 0x9, 0x90, 0x9, 0x90, 0x9, 0x90, 0xc, 0x80, + 0xcd, 0x20, + + /* U+007E "~" */ + 0xb, 0xe8, 0xa, 0x33, 0x91, 0x8d, 0xa0, + + /* U+00B0 "°" */ + 0x6, 0xb7, 0x3, 0x80, 0x84, 0x64, 0x3, 0x73, + 0x80, 0x84, 0x6, 0xb7, 0x0, + + /* U+2022 "•" */ + 0x4, 0x22, 0xfe, 0xd, 0xa0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, + 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, + 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, + 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, + 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, + 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, + 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, + 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, + 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, + 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, + + /* U+F00B "" */ + 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, + 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, + 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, + 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, + 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, + 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, + 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, + 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, + 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, + 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, + 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, + 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, + 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, + 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, + 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, + 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, + 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, + 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, + 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, + 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, + 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, + 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, + 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf8, 0x1, 0xff, 0xf3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, + 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F01C "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, + 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F021 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, + 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, + 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, + 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, + 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, + 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, + 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, + 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, + 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, + 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, + 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, + 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, + 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, + 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, + 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, + 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, + 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, + 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F043 "" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0xcf, 0x10, + 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0xef, + 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfc, 0xe, + 0xff, 0xff, 0xff, 0xf2, 0xf9, 0xcf, 0xff, 0xff, + 0x3d, 0xc5, 0xff, 0xff, 0xf1, 0x6f, 0xa3, 0xbf, + 0xfa, 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x26, + 0x74, 0x0, 0x0, + + /* U+F048 "" */ + 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, + 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, + 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, + 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, + 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, + 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, + 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, + 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, + 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, + 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, + 0x98, 0x10, 0x48, 0x98, 0x10, + + /* U+F04D "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xfe, 0x30, + + /* U+F051 "" */ + 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, + 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, + 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, + 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, + 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+F053 "" */ + 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, + 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, + 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, + + /* U+F054 "" */ + 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, + 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, + 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, + 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, + 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0x20, 0x0, 0x0, + + /* U+F068 "" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0x40, + + /* U+F06E "" */ + 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, + 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, + 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, + 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, + 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, + 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, + 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, + + /* U+F070 "" */ + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, + 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, + 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, + 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, + 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, + 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, + 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, + 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, + 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, + 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, + 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, + 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, + 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, + 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x10, + + /* U+F077 "" */ + 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, + 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, + + /* U+F078 "" */ + 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, + 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, + 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, + 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, + 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, + 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + + /* U+F07B "" */ + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F093 "" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, + 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, + 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, + 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, + 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, + 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, + 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, + 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, + 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, + 0xc6, 0x0, 0x0, 0x56, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, + 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, + 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, + 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, + 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, + 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0xaa, 0xaa, 0xaa, + 0xaa, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0xc3, 0xbf, 0xff, 0xff, 0xfb, 0x3c, + 0xff, 0x57, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf9, + 0x3d, 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xd5, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F0E7 "" */ + 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, + 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, + 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, + 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, + 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, + 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, + 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, + 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, + 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, + 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, + 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, + 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, + 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, + 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, + 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, + 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, + 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, + 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, + 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, + 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, + 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, + 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, + 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, + 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, + 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, + 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, + 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, + 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, + 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, + 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, + 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, + 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, + 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, + 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, + 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, + 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, + 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, + 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, + 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, + 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, + 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, + 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, + 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, + 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, + 0x44, 0x44, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, + 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 51, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 22, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 63, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109, .adv_w = 162, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 132, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 199, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 203, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 223, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 243, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 256, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 277, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 283, .adv_w = 74, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 287, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 290, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 329, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 365, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 383, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 447, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 483, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 515, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 651, .adv_w = 44, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 662, .adv_w = 44, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 676, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 701, .adv_w = 112, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 719, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 744, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 848, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 893, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 970, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1011, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1116, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1152, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1161, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1188, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1224, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1256, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1301, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1382, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1478, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1514, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1578, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1614, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1659, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1722, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1758, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1799, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1835, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1855, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1894, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1914, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1935, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1938, .adv_w = 115, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1942, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1967, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2067, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2092, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2117, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2157, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2192, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2240, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2275, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2285, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2324, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2412, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2452, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2510, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2535, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2563, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2627, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2667, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2688, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2714, .adv_w = 57, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2727, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2753, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 2760, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 2773, .adv_w = 60, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2778, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2856, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2976, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3071, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3149, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3227, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3304, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3382, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3445, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3523, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3553, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3598, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3689, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3743, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3802, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3850, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3922, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3983, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4044, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4092, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 4158, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4197, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4236, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4297, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 4314, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4481, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4579, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4645, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4684, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4723, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4803, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4857, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4935, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5020, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5081, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5153, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5214, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5275, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5329, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5388, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5460, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5532, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5595, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5686, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5745, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5835, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5903, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5971, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6039, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6107, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6175, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6263, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6328, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6400, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6485, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6612, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 9, 0, 5, -4, 0, 0, + 0, 0, -11, -12, 1, 9, 4, 3, + -8, 1, 9, 1, 8, 2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 2, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -6, 0, 0, 0, 0, + 0, -4, 3, 4, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -2, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -5, 0, -23, 0, + 0, -4, 0, 4, 6, 0, 0, -4, + 2, 2, 6, 4, -3, 4, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -2, -9, 0, -8, + -1, 0, 0, 0, 0, 0, 7, 0, + -6, -2, -1, 1, 0, -3, 0, 0, + -1, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, -2, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 4, 2, 6, -2, 0, 0, 4, -2, + -6, -26, 1, 5, 4, 0, -2, 0, + 7, 0, 6, 0, 6, 0, -18, 0, + -2, 6, 0, 6, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -3, 15, 0, + 15, 0, 6, 0, 8, 2, 3, 6, + 0, 0, 0, -7, 0, 0, 0, 0, + 1, -1, 0, 1, -3, -2, -4, 1, + 0, -2, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -11, 0, -12, 0, 0, 0, + 0, -1, 0, 19, -2, -2, 2, 2, + -2, 0, -2, 2, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 12, 0, 0, -7, 0, + 6, 0, -13, -19, -13, -4, 6, 0, + 0, -13, 0, 2, -4, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 6, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -4, 0, -1, + -1, -2, 0, 0, -1, 0, 0, 0, + -4, 0, -2, 0, -4, -4, 0, -5, + -6, -6, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 1, -2, 0, 1, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 6, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 1, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -3, 0, -6, + -1, -6, 4, 0, 0, -4, 2, 4, + 5, 0, -5, -1, -2, 0, -1, -9, + 2, -1, 1, -10, 2, 0, 0, 1, + -10, 0, -10, -2, -17, -1, 0, -10, + 0, 4, 5, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -6, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, -1, 0, -4, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 6, -1, 1, -6, 0, 0, + 5, -10, -10, -8, -4, 2, 0, -2, + -12, -3, 0, -3, 0, -4, 3, -3, + -12, 0, -5, 0, 0, 1, -1, 2, + -1, 0, 2, 0, -6, -7, 0, -10, + -5, -4, -5, -6, -2, -5, 0, -4, + -5, 1, 0, 1, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -3, -4, + -4, -1, 0, -6, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -4, 0, 0, 0, 0, -10, -6, 0, + 0, 0, -3, -10, 0, 0, -2, 2, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -4, -4, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -6, 0, -2, 0, -3, -2, + 0, -4, -5, -6, -2, 0, -4, 0, + -6, 0, 0, 0, 0, 15, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -8, + 0, 0, 0, 0, 0, -18, -3, 6, + 6, -2, -8, 0, 2, -3, 0, -10, + -1, -2, 2, -13, -2, 2, 0, 3, + -7, -3, -7, -6, -8, 0, 0, -12, + 0, 11, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -5, -6, 0, -18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 2, 0, -4, 2, -1, -1, -5, + -2, 0, -2, -2, -1, 0, -3, -3, + 0, 0, -2, -1, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -4, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -1, -2, + -6, -1, -1, -1, -1, -1, -2, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -2, -2, + -2, 0, 2, 8, -1, 0, -5, 0, + -1, 4, 0, -2, -8, -2, 3, 0, + 0, -9, -3, 2, -3, 1, 0, -1, + -2, -6, 0, -3, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -4, -4, 0, + -3, -2, -3, -2, -2, 0, -3, 1, + -4, -3, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -6, 0, + 1, -4, 4, 0, -1, -9, 0, 0, + -4, -2, 0, -8, -5, -5, 0, 0, + -8, -2, -8, -7, -9, 0, -5, 0, + 2, 13, -2, 0, -4, -2, -1, -2, + -3, -5, -3, -7, -8, -4, -2, 0, + 0, -1, 0, 1, 0, 0, -13, -2, + 6, 4, -4, -7, 0, 1, -6, 0, + -10, -1, -2, 4, -18, -2, 1, 0, + 0, -12, -2, -10, -2, -14, 0, 0, + -13, 0, 11, 1, 0, -1, 0, 0, + 0, 0, -1, -1, -7, -1, 0, -12, + 0, 0, 0, 0, -6, 0, -2, 0, + -1, -5, -9, 0, 0, -1, -3, -6, + -2, 0, -1, 0, 0, 0, 0, -9, + -2, -6, -6, -2, -3, -5, -2, -3, + 0, -4, -2, -6, -3, 0, -2, -4, + -2, -4, 0, 1, 0, -1, -6, 0, + 4, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -4, 8, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -6, 0, + -2, 0, -3, -2, 0, -4, -5, -6, + -2, 0, -4, 2, 8, 0, 0, 0, + 0, 15, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -6, + -3, 0, 6, -6, -6, -4, -4, 8, + 3, 2, -17, -1, 4, -2, 0, -2, + 2, -2, -7, 0, -2, 2, -2, -2, + -6, -2, 0, 0, 6, 4, 0, -5, + 0, -11, -2, 6, -2, -7, 1, -2, + -6, -6, -2, 8, 2, 0, -3, 0, + -5, 0, 2, 6, -4, -7, -8, -5, + 6, 0, 1, -14, -2, 2, -3, -1, + -4, 0, -4, -7, -3, -3, -2, 0, + 0, -4, -4, -2, 0, 6, 4, -2, + -11, 0, -11, -3, 0, -7, -11, -1, + -6, -3, -6, -5, 5, 0, 0, -2, + 0, -4, -2, 0, -2, -3, 0, 3, + -6, 2, 0, 0, -10, 0, -2, -4, + -3, -1, -6, -5, -6, -4, 0, -6, + -2, -4, -4, -6, -2, 0, 0, 1, + 9, -3, 0, -6, -2, 0, -2, -4, + -4, -5, -5, -7, -2, -4, 4, 0, + -3, 0, -10, -2, 1, 4, -6, -7, + -4, -6, 6, -2, 1, -18, -3, 4, + -4, -3, -7, 0, -6, -8, -2, -2, + -2, -2, -4, -6, -1, 0, 0, 6, + 5, -1, -12, 0, -12, -4, 5, -7, + -13, -4, -7, -8, -10, -6, 4, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 4, 1, -4, 4, 0, 0, -6, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 6, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 7, 0, 3, 1, 1, -2, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, -2, 3, 0, 6, + 0, 0, 19, 2, -4, -4, 2, 2, + -1, 1, -10, 0, 0, 9, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 7, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -5, 0, + 0, 1, 0, 0, 2, 25, -4, -2, + 6, 5, -5, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, -5, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -5, 0, 0, 0, -3, 2, -2, 0, + 0, -5, -2, -4, 0, 0, -5, 0, + -2, 0, -9, 0, -2, 0, 0, -16, + -4, -8, -2, -7, 0, 0, -13, 0, + -5, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, -2, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 4, + 0, -1, -4, -1, -3, -4, 0, -2, + -1, -1, 1, -5, -1, 0, 0, 0, + -17, -2, -3, 0, -4, 0, -1, -9, + -2, 0, 0, -1, -2, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -4, + 2, 0, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, 0, + 0, 0, -19, 0, -4, -7, -10, 0, + 0, -13, 0, -1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 3, -2, 0, 6, + 9, -2, -2, -6, 2, 9, 3, 4, + -5, 2, 8, 2, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 9, -3, -2, 0, -2, + 15, 8, 15, 0, 0, 0, 2, 0, + 0, 7, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -16, -2, -2, -8, + -9, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -16, -2, -2, + -8, -9, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -4, 2, 0, -2, + 2, 3, 2, -6, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -5, 0, + -2, -1, -4, 0, -2, -8, 0, 12, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -5, -4, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -16, + -2, -2, -8, -9, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -6, -2, -2, 6, -2, -2, + -8, 1, -1, 1, -1, -5, 0, 4, + 0, 2, 1, 2, -5, -8, -2, 0, + -7, -4, -5, -8, -7, 0, -3, -4, + -2, -2, -2, -1, -2, -1, 0, -1, + -1, 3, 0, 3, -1, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -5, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -2, 0, 0, -3, + -2, 2, 0, -3, -4, -1, 0, -6, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 6, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 8, -2, -6, -6, 1, 2, 2, 0, + -5, 1, 3, 1, 6, 1, 6, -1, + -5, 0, 0, -8, 0, 0, -6, -5, + 0, 0, -4, 0, -2, -3, 0, -3, + 0, -3, 0, -1, 3, 0, -2, -6, + -2, 7, 0, 0, -2, 0, -4, 0, + 0, 2, -4, 0, 2, -2, 2, 0, + 0, -6, 0, -1, -1, 0, -2, 2, + -2, 0, 0, 0, -8, -2, -4, 0, + -6, 0, 0, -9, 0, 7, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -6, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 1, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 4, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 4, + 0, 0, 0, 0, 0, -12, -11, 1, + 8, 6, 3, -8, 1, 8, 0, 7, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_12 = { +#else +lv_font_t lv_font_montserrat_12 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 15, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_12*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_14.c b/libraries/lvgl/src/font/lv_font_montserrat_14.c new file mode 100644 index 0000000..2ba984e --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_14.c @@ -0,0 +1,2191 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_14.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 1 +#endif + +#if LV_FONT_MONTSERRAT_14 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xe, 0xa0, 0xd9, 0xd, 0x90, 0xc8, 0xc, 0x80, + 0xb7, 0xa, 0x60, 0x11, 0xb, 0x80, 0xd9, + + /* U+0022 "\"" */ + 0x1f, 0x9, 0x91, 0xf0, 0x88, 0x1f, 0x8, 0x80, + 0xf0, 0x88, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0xd, 0x20, 0x3c, 0x0, 0x0, 0xf, 0x0, + 0x69, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0x5c, 0x11, 0xa6, 0x10, 0x0, 0x69, 0x0, 0xc3, + 0x0, 0x0, 0x88, 0x0, 0xd2, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf0, 0x12, 0xc5, 0x23, 0xe2, 0x20, + 0x0, 0xd2, 0x3, 0xc0, 0x0, 0x0, 0xf0, 0x4, + 0xb0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x19, 0xef, + 0xea, 0x30, 0xc, 0xd6, 0xe6, 0xa7, 0x2, 0xf4, + 0xe, 0x0, 0x0, 0x1f, 0x80, 0xe0, 0x0, 0x0, + 0x6f, 0xef, 0x50, 0x0, 0x0, 0x16, 0xff, 0xe5, + 0x0, 0x0, 0xe, 0xa, 0xf0, 0x1, 0x0, 0xe0, + 0x5f, 0x13, 0xf8, 0x5e, 0x6e, 0xb0, 0x5, 0xcf, + 0xfe, 0x91, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x8, 0xdd, 0x30, 0x0, 0xa7, 0x0, 0x4b, 0x2, + 0xd0, 0x4, 0xc0, 0x0, 0x77, 0x0, 0xd0, 0x1d, + 0x20, 0x0, 0x4b, 0x3, 0xd0, 0xa7, 0x0, 0x0, + 0x7, 0xdc, 0x34, 0xc4, 0xcc, 0x30, 0x0, 0x0, + 0x1d, 0x2d, 0x22, 0xd0, 0x0, 0x0, 0xa6, 0x3b, + 0x0, 0xb3, 0x0, 0x5, 0xc0, 0x3a, 0x0, 0xa3, + 0x0, 0x1d, 0x20, 0xd, 0x0, 0xd0, 0x0, 0xa6, + 0x0, 0x4, 0xcc, 0x40, + + /* U+0026 "&" */ + 0x0, 0x4d, 0xfc, 0x30, 0x0, 0x0, 0xf7, 0x18, + 0xc0, 0x0, 0x1, 0xf2, 0x5, 0xd0, 0x0, 0x0, + 0xbb, 0x6e, 0x40, 0x0, 0x0, 0x5f, 0xf3, 0x0, + 0x0, 0x7, 0xe6, 0xdb, 0x3, 0x80, 0x2f, 0x30, + 0x1d, 0xba, 0xa0, 0x5f, 0x0, 0x1, 0xdf, 0x40, + 0x1f, 0xb4, 0x48, 0xfe, 0xc0, 0x3, 0xbf, 0xfc, + 0x40, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0x1, 0xf0, 0x1f, 0x0, 0xf0, 0x0, 0x0, + + /* U+0028 "(" */ + 0x3, 0xf1, 0xb, 0x90, 0xf, 0x40, 0x4f, 0x0, + 0x7d, 0x0, 0x9b, 0x0, 0xaa, 0x0, 0xaa, 0x0, + 0x9b, 0x0, 0x7d, 0x0, 0x4f, 0x0, 0xf, 0x40, + 0xb, 0x90, 0x3, 0xf1, + + /* U+0029 ")" */ + 0x5e, 0x0, 0xe, 0x60, 0x8, 0xc0, 0x4, 0xf0, + 0x1, 0xf3, 0x0, 0xf5, 0x0, 0xe6, 0x0, 0xe6, + 0x0, 0xf5, 0x1, 0xf3, 0x4, 0xf0, 0x8, 0xc0, + 0xe, 0x60, 0x5e, 0x0, + + /* U+002A "*" */ + 0x0, 0x93, 0x0, 0x88, 0xa6, 0xc2, 0x9, 0xfe, + 0x40, 0x4d, 0xdd, 0xb1, 0x42, 0x93, 0x50, 0x0, + 0x52, 0x0, + + /* U+002B "+" */ + 0x0, 0x4, 0x50, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xf3, + 0x3, 0x39, 0xb3, 0x30, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, + + /* U+002C "," */ + 0x1, 0x3, 0xf6, 0x1e, 0x60, 0xe1, 0x2c, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x3, 0x33, 0x10, + + /* U+002E "." */ + 0x0, 0x3, 0xf5, 0x2e, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, + 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, + 0x0, 0x0, 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x4c, 0xfe, 0x70, 0x0, 0x4f, 0xb6, 0x8f, + 0x90, 0xd, 0xb0, 0x0, 0x5f, 0x32, 0xf4, 0x0, + 0x0, 0xe7, 0x4f, 0x20, 0x0, 0xc, 0xa4, 0xf2, + 0x0, 0x0, 0xca, 0x2f, 0x40, 0x0, 0xe, 0x70, + 0xdb, 0x0, 0x5, 0xf2, 0x4, 0xfb, 0x68, 0xf9, + 0x0, 0x4, 0xcf, 0xe7, 0x0, + + /* U+0031 "1" */ + 0xef, 0xfb, 0x44, 0xcb, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, + + /* U+0032 "2" */ + 0x7, 0xdf, 0xea, 0x10, 0x8e, 0x85, 0x7e, 0xc0, + 0x1, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x6, 0xf0, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0xcc, 0x0, + 0x0, 0x1c, 0xc0, 0x0, 0x1, 0xdb, 0x0, 0x0, + 0x1d, 0xe5, 0x44, 0x42, 0x7f, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x7f, 0xff, 0xff, 0xf0, 0x24, 0x44, 0x5f, 0x90, + 0x0, 0x0, 0xbc, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x0, 0x3f, 0xd8, 0x10, 0x0, 0x4, 0x6d, 0xd0, + 0x0, 0x0, 0x2, 0xf4, 0x10, 0x0, 0x2, 0xf4, + 0xbd, 0x75, 0x7d, 0xd0, 0x19, 0xdf, 0xea, 0x10, + + /* U+0034 "4" */ + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, 0x0, + 0x4f, 0x40, 0x10, 0x0, 0x2, 0xf6, 0x0, 0xf5, + 0x0, 0x1d, 0xa0, 0x0, 0xf5, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf3, 0x13, 0x33, 0x33, 0xf7, 0x30, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, + + /* U+0035 "5" */ + 0x9, 0xff, 0xff, 0xf0, 0xa, 0xb4, 0x44, 0x40, + 0xc, 0x80, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x40, 0x3, 0x34, 0x5c, 0xf2, + 0x0, 0x0, 0x0, 0xf7, 0x10, 0x0, 0x0, 0xf7, + 0x8e, 0x85, 0x6c, 0xf1, 0x8, 0xdf, 0xfb, 0x30, + + /* U+0036 "6" */ + 0x0, 0x2a, 0xef, 0xd5, 0x0, 0x3f, 0xd6, 0x57, + 0x40, 0xc, 0xc0, 0x0, 0x0, 0x2, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0x5b, 0xff, 0xa1, 0x4, 0xfe, + 0x84, 0x5d, 0xd0, 0x3f, 0x80, 0x0, 0x3f, 0x30, + 0xe8, 0x0, 0x3, 0xf2, 0x6, 0xf8, 0x45, 0xdc, + 0x0, 0x5, 0xdf, 0xe9, 0x10, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xfd, 0x9d, 0x44, 0x44, 0xe9, + 0x9c, 0x0, 0x4, 0xf2, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x0, 0xe, 0x80, 0x0, 0x0, 0x6f, 0x10, 0x0, + + /* U+0038 "8" */ + 0x1, 0x9e, 0xfe, 0x91, 0x0, 0xbe, 0x63, 0x6e, + 0xc0, 0xf, 0x60, 0x0, 0x6f, 0x0, 0xcc, 0x20, + 0x2b, 0xc0, 0x2, 0xef, 0xff, 0xe2, 0x0, 0xdc, + 0x42, 0x4c, 0xd0, 0x5f, 0x20, 0x0, 0x1f, 0x55, + 0xf2, 0x0, 0x2, 0xf5, 0xe, 0xd5, 0x35, 0xde, + 0x0, 0x1a, 0xef, 0xea, 0x10, + + /* U+0039 "9" */ + 0x3, 0xbf, 0xea, 0x20, 0x2f, 0xa4, 0x4b, 0xe1, + 0x8e, 0x0, 0x0, 0xe9, 0x9d, 0x0, 0x0, 0xdd, + 0x4f, 0x71, 0x29, 0xff, 0x7, 0xff, 0xfc, 0x9e, + 0x0, 0x2, 0x10, 0xac, 0x0, 0x0, 0x2, 0xf6, + 0x7, 0x65, 0x8f, 0xb0, 0xa, 0xef, 0xd7, 0x0, + + /* U+003A ":" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x52, 0xe4, + + /* U+003B ";" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x52, 0xf6, 0xd, 0x21, 0xd0, 0x1, + 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x6c, 0xf2, + 0x1, 0x8e, 0xd6, 0x0, 0xf, 0xc3, 0x0, 0x0, + 0xa, 0xfb, 0x40, 0x0, 0x0, 0x17, 0xee, 0x70, + 0x0, 0x0, 0x5, 0xc3, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + + /* U+003E ">" */ + 0x4, 0x0, 0x0, 0x0, 0xe, 0xd7, 0x10, 0x0, + 0x0, 0x5c, 0xf9, 0x20, 0x0, 0x0, 0x2a, 0xf2, + 0x0, 0x3, 0xaf, 0xb1, 0x6, 0xde, 0x82, 0x0, + 0x1c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x7, 0xdf, 0xea, 0x10, 0x9e, 0x74, 0x6e, 0xc0, + 0x1, 0x0, 0x6, 0xf0, 0x0, 0x0, 0x9, 0xc0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x0, 0xc, 0x90, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x6c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x3d, 0xa4, 0x10, 0x16, 0xd9, 0x0, 0x1, 0xe5, + 0x9, 0xee, 0x98, 0xca, 0x90, 0xa, 0x80, 0xbd, + 0x43, 0xaf, 0xc0, 0xd3, 0xf, 0x13, 0xf2, 0x0, + 0xc, 0xc0, 0x69, 0x3c, 0x6, 0xd0, 0x0, 0x7, + 0xc0, 0x3b, 0x4b, 0x6, 0xd0, 0x0, 0x7, 0xc0, + 0x2c, 0x3c, 0x3, 0xf2, 0x0, 0xc, 0xc0, 0x4a, + 0xf, 0x10, 0xbd, 0x43, 0x9e, 0xe3, 0xc5, 0xa, + 0x80, 0x9, 0xee, 0x91, 0xcf, 0x90, 0x1, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xa4, + 0x10, 0x28, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xd9, 0x10, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xd7, 0x0, 0x0, 0x0, 0x0, 0xb9, 0x6e, + 0x0, 0x0, 0x0, 0x2, 0xf2, 0xe, 0x50, 0x0, + 0x0, 0x9, 0xa0, 0x7, 0xd0, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xe7, 0x33, 0x33, 0x4f, 0x20, + 0x5, 0xf0, 0x0, 0x0, 0xc, 0x90, 0xc, 0x90, + 0x0, 0x0, 0x6, 0xf1, + + /* U+0042 "B" */ + 0x8f, 0xff, 0xfe, 0xc4, 0x8, 0xe3, 0x33, 0x4b, + 0xf2, 0x8e, 0x0, 0x0, 0x1f, 0x58, 0xe0, 0x0, + 0x18, 0xf1, 0x8f, 0xff, 0xff, 0xf8, 0x8, 0xe3, + 0x33, 0x37, 0xf6, 0x8e, 0x0, 0x0, 0x9, 0xc8, + 0xe0, 0x0, 0x0, 0x9d, 0x8e, 0x33, 0x34, 0x7f, + 0x78, 0xff, 0xff, 0xfd, 0x70, + + /* U+0043 "C" */ + 0x0, 0x7, 0xcf, 0xfb, 0x40, 0x0, 0xcf, 0x96, + 0x6a, 0xf5, 0xa, 0xe2, 0x0, 0x0, 0x30, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0xa, 0xe2, 0x0, 0x0, 0x30, + 0x1, 0xcf, 0x96, 0x6a, 0xf5, 0x0, 0x7, 0xdf, + 0xfb, 0x40, + + /* U+0044 "D" */ + 0x8f, 0xff, 0xfe, 0xa4, 0x0, 0x8e, 0x44, 0x46, + 0xcf, 0x70, 0x8e, 0x0, 0x0, 0x7, 0xf3, 0x8e, + 0x0, 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x0, + 0x9d, 0x8e, 0x0, 0x0, 0x0, 0x9d, 0x8e, 0x0, + 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x7, 0xf3, + 0x8e, 0x44, 0x46, 0xbf, 0x70, 0x8f, 0xff, 0xfe, + 0xa4, 0x0, + + /* U+0045 "E" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0x8e, 0x33, 0x33, 0x20, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x42, 0x8f, 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0x8e, 0x33, 0x33, 0x20, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x7, 0xcf, 0xfc, 0x50, 0x0, 0xcf, 0x96, + 0x6a, 0xf6, 0xa, 0xe2, 0x0, 0x0, 0x20, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0xb9, 0x1f, 0x60, + 0x0, 0x0, 0xb9, 0xa, 0xe3, 0x0, 0x0, 0xb9, + 0x0, 0xcf, 0x96, 0x6a, 0xf8, 0x0, 0x7, 0xdf, + 0xfc, 0x60, + + /* U+0048 "H" */ + 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, 0x0, + 0x8e, 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, + 0x0, 0x8e, 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xe3, + 0x33, 0x33, 0x9e, 0x8e, 0x0, 0x0, 0x8, 0xe8, + 0xe0, 0x0, 0x0, 0x8e, 0x8e, 0x0, 0x0, 0x8, + 0xe8, 0xe0, 0x0, 0x0, 0x8e, + + /* U+0049 "I" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, + + /* U+004A "J" */ + 0x2, 0xff, 0xff, 0xc0, 0x4, 0x44, 0xbc, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x9, + 0xc0, 0x20, 0x0, 0xba, 0xe, 0xb5, 0x8f, 0x60, + 0x3c, 0xfe, 0x80, + + /* U+004B "K" */ + 0x8e, 0x0, 0x0, 0x4f, 0x50, 0x8e, 0x0, 0x4, + 0xf6, 0x0, 0x8e, 0x0, 0x3f, 0x70, 0x0, 0x8e, + 0x3, 0xf8, 0x0, 0x0, 0x8e, 0x2e, 0xc0, 0x0, + 0x0, 0x8e, 0xec, 0xf6, 0x0, 0x0, 0x8f, 0xb0, + 0x7f, 0x30, 0x0, 0x8e, 0x0, 0xa, 0xe1, 0x0, + 0x8e, 0x0, 0x0, 0xcc, 0x0, 0x8e, 0x0, 0x0, + 0x1e, 0xa0, + + /* U+004C "L" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x40, 0x8f, 0xff, 0xff, 0xf2, + + /* U+004D "M" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe8, 0xf7, 0x0, + 0x0, 0x2, 0xfe, 0x8f, 0xf1, 0x0, 0x0, 0xbf, + 0xe8, 0xdc, 0xa0, 0x0, 0x4f, 0x9e, 0x8d, 0x2f, + 0x30, 0xd, 0x87, 0xe8, 0xd0, 0x9c, 0x6, 0xe0, + 0x7e, 0x8d, 0x1, 0xe7, 0xe5, 0x7, 0xe8, 0xd0, + 0x6, 0xfc, 0x0, 0x7e, 0x8d, 0x0, 0xa, 0x20, + 0x7, 0xe8, 0xd0, 0x0, 0x0, 0x0, 0x7e, + + /* U+004E "N" */ + 0x8e, 0x10, 0x0, 0x8, 0xe8, 0xfc, 0x0, 0x0, + 0x8e, 0x8f, 0xf9, 0x0, 0x8, 0xe8, 0xe6, 0xf6, + 0x0, 0x8e, 0x8e, 0x9, 0xf3, 0x8, 0xe8, 0xe0, + 0xc, 0xe1, 0x8e, 0x8e, 0x0, 0x1e, 0xb8, 0xe8, + 0xe0, 0x0, 0x3f, 0xee, 0x8e, 0x0, 0x0, 0x6f, + 0xe8, 0xe0, 0x0, 0x0, 0xae, + + /* U+004F "O" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x6, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0xcf, 0x96, 0x6b, 0xfa, 0x0, 0x0, 0x7, + 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xb2, 0x8, + 0xe3, 0x33, 0x10, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x5, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x1, 0xdf, 0x85, 0x5a, 0xfa, 0x0, 0x0, 0x8, + 0xdf, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x1, 0xec, + 0x21, 0x94, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + + /* U+0052 "R" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xc2, 0x8, + 0xe3, 0x33, 0xda, 0x0, 0x8e, 0x0, 0x2, 0xf6, + 0x8, 0xe0, 0x0, 0x5, 0xf3, + + /* U+0053 "S" */ + 0x1, 0x9e, 0xfd, 0xa2, 0x0, 0xce, 0x64, 0x6b, + 0x70, 0x2f, 0x40, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6, 0xfd, 0x95, 0x0, 0x0, 0x1, + 0x6a, 0xee, 0x50, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0x20, 0x0, 0x5, 0xf1, 0x3f, 0xa5, 0x47, 0xeb, + 0x0, 0x4b, 0xef, 0xe9, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0x24, 0x44, 0xbd, 0x44, + 0x40, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x9c, + 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, + 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0x0, + + /* U+0055 "U" */ + 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, 0x0, + 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, + 0x0, 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, + 0x0, 0x0, 0xba, 0x8e, 0x0, 0x0, 0xd, 0x94, + 0xf4, 0x0, 0x3, 0xf5, 0xc, 0xf8, 0x68, 0xfd, + 0x0, 0x9, 0xef, 0xe9, 0x10, + + /* U+0056 "V" */ + 0xc, 0xb0, 0x0, 0x0, 0xa, 0xc0, 0x5f, 0x20, + 0x0, 0x1, 0xf5, 0x0, 0xe9, 0x0, 0x0, 0x8e, + 0x0, 0x8, 0xf0, 0x0, 0xe, 0x70, 0x0, 0x1f, + 0x60, 0x5, 0xf1, 0x0, 0x0, 0xad, 0x0, 0xc9, + 0x0, 0x0, 0x3, 0xf4, 0x3f, 0x30, 0x0, 0x0, + 0xc, 0xba, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0x10, 0x0, 0xd, 0xb0, 0x0, 0x2, 0xf2, + 0x1f, 0x60, 0x0, 0x3f, 0xf1, 0x0, 0x8, 0xd0, + 0xb, 0xb0, 0x0, 0x8b, 0xe6, 0x0, 0xd, 0x70, + 0x6, 0xf0, 0x0, 0xe6, 0x9b, 0x0, 0x2f, 0x20, + 0x1, 0xf5, 0x3, 0xf1, 0x4f, 0x10, 0x8d, 0x0, + 0x0, 0xca, 0x9, 0xb0, 0xe, 0x60, 0xd8, 0x0, + 0x0, 0x6f, 0xe, 0x60, 0x9, 0xb2, 0xf3, 0x0, + 0x0, 0x1f, 0x9f, 0x10, 0x4, 0xf9, 0xd0, 0x0, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xef, 0x80, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x9f, 0x30, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x50, 0x0, 0xd, 0xa0, 0x8, 0xf2, 0x0, + 0x9d, 0x0, 0x0, 0xcc, 0x4, 0xf3, 0x0, 0x0, + 0x2f, 0x9e, 0x70, 0x0, 0x0, 0x6, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x4f, + 0x4d, 0xb0, 0x0, 0x1, 0xe8, 0x2, 0xf7, 0x0, + 0xb, 0xd0, 0x0, 0x7f, 0x20, 0x7f, 0x20, 0x0, + 0xb, 0xd0, + + /* U+0059 "Y" */ + 0xc, 0xb0, 0x0, 0x0, 0x9c, 0x0, 0x2f, 0x50, + 0x0, 0x2f, 0x30, 0x0, 0x9e, 0x0, 0xc, 0x90, + 0x0, 0x0, 0xe8, 0x5, 0xf1, 0x0, 0x0, 0x5, + 0xf3, 0xe6, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, + 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x4a, + 0xf3, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x1, + 0xea, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, + 0x9e, 0x10, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x1e, 0xd4, 0x44, 0x44, + 0x36, 0xff, 0xff, 0xff, 0xfc, + + /* U+005B "[" */ + 0x8f, 0xf6, 0x8d, 0x31, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x31, 0x8f, 0xf6, + + /* U+005C "\\" */ + 0x5d, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xb, + 0x80, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, + 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x6d, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0xb, 0x70, 0x0, + 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, + 0xf2, + + /* U+005D "]" */ + 0xbf, 0xf3, 0x25, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x25, 0xf3, 0xbf, 0xf3, + + /* U+005E "^" */ + 0x0, 0xad, 0x0, 0x0, 0x1e, 0xc4, 0x0, 0x8, + 0x85, 0xa0, 0x0, 0xe2, 0xe, 0x10, 0x5b, 0x0, + 0x97, 0xb, 0x50, 0x2, 0xe0, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xe0, + + /* U+0060 "`" */ + 0xb, 0xc0, 0x0, 0x9, 0xb0, + + /* U+0061 "a" */ + 0x4, 0xcf, 0xea, 0x10, 0xb, 0x74, 0x5d, 0xb0, + 0x0, 0x0, 0x4, 0xf0, 0x4, 0xce, 0xee, 0xf2, + 0x1f, 0x82, 0x14, 0xf2, 0x4f, 0x10, 0x4, 0xf2, + 0x1f, 0x70, 0x3d, 0xf2, 0x4, 0xdf, 0xd7, 0xf2, + + /* U+0062 "b" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfc, 0x30, + 0xbf, 0xd5, 0x4b, 0xf3, 0xbe, 0x10, 0x0, 0xca, + 0xba, 0x0, 0x0, 0x7e, 0xba, 0x0, 0x0, 0x7e, + 0xbe, 0x10, 0x0, 0xca, 0xbf, 0xd5, 0x5b, 0xf3, + 0xb9, 0x8e, 0xfc, 0x30, + + /* U+0063 "c" */ + 0x0, 0x7d, 0xfd, 0x60, 0x9, 0xf7, 0x48, 0xf4, + 0x2f, 0x50, 0x0, 0x20, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x2f, 0x50, 0x0, 0x20, + 0x9, 0xf7, 0x48, 0xf4, 0x0, 0x7d, 0xfd, 0x60, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x1, + 0xf4, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x8, 0xef, + 0xc4, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x45, + 0xf0, 0x0, 0x1, 0xf4, 0x2f, 0x50, 0x0, 0x6f, + 0x40, 0xae, 0x63, 0x7e, 0xf4, 0x0, 0x8e, 0xfc, + 0x4f, 0x40, + + /* U+0065 "e" */ + 0x0, 0x8e, 0xfc, 0x40, 0xa, 0xd5, 0x38, 0xf4, + 0x2f, 0x20, 0x0, 0x8c, 0x5f, 0xee, 0xee, 0xff, + 0x5f, 0x21, 0x11, 0x11, 0x2f, 0x70, 0x0, 0x10, + 0x9, 0xf8, 0x46, 0xe4, 0x0, 0x7d, 0xfe, 0x80, + + /* U+0066 "f" */ + 0x0, 0x9e, 0xe3, 0x5, 0xf4, 0x41, 0x8, 0xc0, + 0x0, 0xcf, 0xff, 0xf0, 0x29, 0xd3, 0x20, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x7e, 0xfc, 0x4e, 0x60, 0xaf, 0x74, 0x7f, + 0xf6, 0x2f, 0x50, 0x0, 0x5f, 0x65, 0xf0, 0x0, + 0x0, 0xf6, 0x5f, 0x0, 0x0, 0xf, 0x62, 0xf6, + 0x0, 0x6, 0xf6, 0x9, 0xf7, 0x47, 0xff, 0x50, + 0x7, 0xef, 0xc4, 0xf5, 0x0, 0x0, 0x0, 0x3f, + 0x20, 0xcb, 0x64, 0x6e, 0xb0, 0x3, 0xae, 0xfd, + 0x80, 0x0, + + /* U+0068 "h" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfb, 0x20, + 0xbf, 0xc5, 0x6d, 0xd0, 0xbe, 0x0, 0x3, 0xf2, + 0xba, 0x0, 0x0, 0xf4, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, + + /* U+0069 "i" */ + 0xba, 0xa8, 0x0, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006A "j" */ + 0x0, 0xa, 0xb0, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, 0xab, 0x0, + 0xa, 0xb0, 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, + 0xab, 0x0, 0xa, 0xb0, 0x0, 0xaa, 0x6, 0x4e, + 0x71, 0xdf, 0xa0, + + /* U+006B "k" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x1c, 0xc0, + 0xba, 0x1, 0xcc, 0x0, 0xba, 0x1c, 0xd1, 0x0, + 0xbb, 0xcf, 0x60, 0x0, 0xbf, 0xdb, 0xe1, 0x0, + 0xbd, 0x11, 0xdc, 0x0, 0xba, 0x0, 0x3f, 0x70, + 0xba, 0x0, 0x7, 0xf3, + + /* U+006C "l" */ + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006D "m" */ + 0xb9, 0x9e, 0xfa, 0x15, 0xdf, 0xd4, 0xb, 0xfb, + 0x45, 0xed, 0xe6, 0x4a, 0xf2, 0xbe, 0x0, 0x6, + 0xf6, 0x0, 0xe, 0x7b, 0xa0, 0x0, 0x4f, 0x20, + 0x0, 0xc9, 0xba, 0x0, 0x3, 0xf1, 0x0, 0xc, + 0x9b, 0xa0, 0x0, 0x3f, 0x10, 0x0, 0xc9, 0xba, + 0x0, 0x3, 0xf1, 0x0, 0xc, 0x9b, 0xa0, 0x0, + 0x3f, 0x10, 0x0, 0xc9, + + /* U+006E "n" */ + 0xb9, 0x9e, 0xfb, 0x20, 0xbf, 0xb4, 0x5d, 0xd0, + 0xbe, 0x0, 0x3, 0xf2, 0xba, 0x0, 0x0, 0xf4, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + + /* U+006F "o" */ + 0x0, 0x7d, 0xfd, 0x60, 0x0, 0x9f, 0x74, 0x8f, + 0x70, 0x2f, 0x50, 0x0, 0x7f, 0x5, 0xf0, 0x0, + 0x1, 0xf3, 0x5f, 0x0, 0x0, 0x2f, 0x32, 0xf5, + 0x0, 0x7, 0xf0, 0x9, 0xf7, 0x48, 0xf7, 0x0, + 0x7, 0xdf, 0xd6, 0x0, + + /* U+0070 "p" */ + 0xb9, 0x8e, 0xfc, 0x30, 0xbf, 0xc4, 0x3a, 0xf3, + 0xbe, 0x10, 0x0, 0xca, 0xba, 0x0, 0x0, 0x7e, + 0xba, 0x0, 0x0, 0x7e, 0xbe, 0x10, 0x0, 0xca, + 0xbf, 0xd5, 0x5b, 0xf3, 0xba, 0x7e, 0xfc, 0x30, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8e, 0xfc, 0x3f, 0x40, 0xaf, 0x74, 0x8e, + 0xf4, 0x2f, 0x50, 0x0, 0x7f, 0x45, 0xf0, 0x0, + 0x1, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x40, + 0x8, 0xef, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0x40, 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, + 0x1f, 0x40, + + /* U+0072 "r" */ + 0xb9, 0x8e, 0x4b, 0xfd, 0x71, 0xbe, 0x10, 0xb, + 0xb0, 0x0, 0xba, 0x0, 0xb, 0xa0, 0x0, 0xba, + 0x0, 0xb, 0xa0, 0x0, + + /* U+0073 "s" */ + 0x5, 0xdf, 0xea, 0x13, 0xf7, 0x35, 0xa0, 0x6f, + 0x0, 0x0, 0x1, 0xee, 0x96, 0x10, 0x1, 0x6a, + 0xef, 0x30, 0x0, 0x0, 0xd9, 0x6c, 0x64, 0x6f, + 0x62, 0xae, 0xfd, 0x70, + + /* U+0074 "t" */ + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0xcf, 0xff, + 0xf0, 0x29, 0xd3, 0x20, 0x8, 0xd0, 0x0, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x5, 0xf5, 0x51, 0x0, 0x9f, 0xe3, + + /* U+0075 "u" */ + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc9, 0x0, 0x3, 0xf3, 0xab, 0x0, 0x7, 0xf3, + 0x5f, 0x83, 0x7e, 0xf3, 0x6, 0xdf, 0xc5, 0xf3, + + /* U+0076 "v" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6e, 0x0, 0x1, + 0xf3, 0x0, 0xf5, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xe, 0x60, 0x0, 0x3f, 0x24, 0xf0, 0x0, 0x0, + 0xc8, 0xb9, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xc0, 0x0, + + /* U+0077 "w" */ + 0xc8, 0x0, 0x6, 0xf1, 0x0, 0xd, 0x56, 0xd0, + 0x0, 0xcf, 0x60, 0x3, 0xf0, 0x1f, 0x30, 0x2f, + 0x9c, 0x0, 0x9a, 0x0, 0xb8, 0x7, 0xb2, 0xf1, + 0xe, 0x40, 0x5, 0xe0, 0xd6, 0xc, 0x74, 0xe0, + 0x0, 0xf, 0x6f, 0x0, 0x7c, 0x99, 0x0, 0x0, + 0xaf, 0xa0, 0x1, 0xff, 0x40, 0x0, 0x5, 0xf4, + 0x0, 0xb, 0xe0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x30, 0x7, 0xe1, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0xd9, 0xd9, 0x0, 0x0, 0x3f, 0xd0, 0x0, + 0x0, 0x4f, 0xe1, 0x0, 0x1, 0xe7, 0xbb, 0x0, + 0xb, 0xb0, 0x1e, 0x70, 0x7e, 0x10, 0x5, 0xf3, + + /* U+0079 "y" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6f, 0x0, 0x1, + 0xf3, 0x0, 0xf6, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xd, 0x60, 0x0, 0x2f, 0x34, 0xf0, 0x0, 0x0, + 0xc9, 0xa9, 0x0, 0x0, 0x5, 0xff, 0x20, 0x0, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0xe5, 0x0, + 0x0, 0x94, 0xad, 0x0, 0x0, 0x1b, 0xfc, 0x20, + 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xa1, 0x33, 0x37, 0xf4, 0x0, + 0x1, 0xe7, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x8e, + 0x10, 0x0, 0x4f, 0x40, 0x0, 0x1e, 0xa3, 0x33, + 0x26, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x6e, 0xa0, 0xf, 0x92, 0x1, 0xf4, 0x0, + 0x1f, 0x40, 0x1, 0xf4, 0x0, 0x3f, 0x30, 0x3f, + 0xc0, 0x0, 0x6f, 0x30, 0x1, 0xf4, 0x0, 0x1f, + 0x40, 0x1, 0xf4, 0x0, 0x1f, 0x40, 0x0, 0xfa, + 0x20, 0x5, 0xea, + + /* U+007C "|" */ + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + + /* U+007D "}" */ + 0xbe, 0x50, 0x2, 0xae, 0x0, 0x5, 0xf0, 0x0, + 0x5f, 0x0, 0x5, 0xf0, 0x0, 0x4f, 0x10, 0x0, + 0xdf, 0x10, 0x4f, 0x50, 0x5, 0xf0, 0x0, 0x5f, + 0x0, 0x5, 0xf0, 0x0, 0x5f, 0x0, 0x2a, 0xe0, + 0xb, 0xe4, 0x0, + + /* U+007E "~" */ + 0x7, 0xec, 0x40, 0xb4, 0x1e, 0x25, 0xdf, 0xc0, + 0x1, 0x0, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x4, 0xcc, 0x30, 0x2b, 0x1, 0xc0, 0x57, 0x0, + 0x93, 0x2b, 0x1, 0xc0, 0x5, 0xcc, 0x30, + + /* U+2022 "•" */ + 0x6, 0xa1, 0xf, 0xf6, 0xb, 0xe2, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, + 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, + 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, + 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, + 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, + 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, + 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, + 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, + 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, + 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, + 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, + 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, + 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, + 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, + 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, + 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2c, + + /* U+F00B "" */ + 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, + 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, + 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, + 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x20, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, + 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, + 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, + 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, + 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, + 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, + 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, + 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, + 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, + 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, + 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, + 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, + 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, + 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, + 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, + 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, + 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, + 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, + 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, + 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F01C "" */ + 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, + 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, + 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, + 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, + 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, + 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, + 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, + 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, + 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, + 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, + 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, + 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, + 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, + 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, + 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, + 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, + 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, + 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+F03E "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, + 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, + 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F043 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, + 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, + 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, + 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, + 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, + 0xba, 0x60, 0x0, + + /* U+F048 "" */ + 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, + 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, + 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, + 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, + 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, + 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, + 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, + 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xc0, 0x9, 0xff, 0xfc, 0x0, + + /* U+F04D "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, + + /* U+F051 "" */ + 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, + 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, + 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, + 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, + 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, + 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xa4, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, + 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, + 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, + 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xd3, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, + 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, + 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, + 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, + 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, + 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, + 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, + 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, + 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, + 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, + 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, + 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, + 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, + 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, + 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, + 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, + 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, + 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, + 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, + 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, + 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, + 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, + 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, + 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x3, 0x10, + + /* U+F078 "" */ + 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, + 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, + 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, + 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, + 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, + 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, + 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, + 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, + 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, + 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xd1, 0x0, + + /* U+F07B "" */ + 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0xcc, 0xcc, 0xb6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, + 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, + 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, + 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, + 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, + 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, + 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, + 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, + 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, + 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, + 0x10, 0x0, 0x2, 0x62, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, + 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, + 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, + 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, + 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, + 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, + 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, + 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, + 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, + 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, + 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, + 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, + 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, + 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, + 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfe, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, + 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, + 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, + 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, + 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, + 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, + 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, + 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, + 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, + 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, + 0xaa, 0xaa, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, + 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, + 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xda, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F241 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F242 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F243 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F244 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, + 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, + 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, + 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, + 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, + 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, + 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, + 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, + 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, + 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, + 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, + 0x81, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, + 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, + 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, + 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, + 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, + 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, + 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, + 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, + 0x90, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, + 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, + 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, + 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, + 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, + 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, + 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, + 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, + 0xaa, 0xa8, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, + 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, + 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 60, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 28, .adv_w = 157, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 139, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 189, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 206, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 261, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 269, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 297, .adv_w = 76, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 325, .adv_w = 90, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 343, .adv_w = 130, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 371, .adv_w = 51, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 379, .adv_w = 86, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 387, .adv_w = 51, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 392, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 441, .adv_w = 149, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 486, .adv_w = 83, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 506, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 546, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 586, .adv_w = 150, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 636, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 676, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 721, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 761, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 806, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 846, .adv_w = 51, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 875, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 907, .adv_w = 130, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 931, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 963, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1003, .adv_w = 232, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1094, .adv_w = 164, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1154, .adv_w = 170, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1199, .adv_w = 162, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1249, .adv_w = 185, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1299, .adv_w = 150, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1379, .adv_w = 173, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1429, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1474, .adv_w = 69, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1484, .adv_w = 115, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1519, .adv_w = 161, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 133, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1609, .adv_w = 214, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1664, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1709, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1769, .adv_w = 162, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1814, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1892, .adv_w = 163, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1937, .adv_w = 139, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1982, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 177, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2072, .adv_w = 159, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2127, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 151, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 145, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2312, .adv_w = 147, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2357, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2385, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2434, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2462, .adv_w = 131, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2483, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2487, .adv_w = 134, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 2492, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2524, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2568, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2600, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2650, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 79, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2715, .adv_w = 155, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2765, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2809, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 64, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2855, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2899, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 237, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2962, .adv_w = 153, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 142, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3074, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3124, .adv_w = 92, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3144, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3172, .adv_w = 93, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3202, .adv_w = 152, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3234, .adv_w = 125, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 201, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3322, .adv_w = 124, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3354, .adv_w = 125, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3404, .adv_w = 117, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3467, .adv_w = 67, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3481, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3516, .adv_w = 130, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3528, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 3543, .adv_w = 70, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3549, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3662, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3830, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3907, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3962, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4067, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4172, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4276, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4381, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4469, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4574, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4616, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4682, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4794, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4871, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4946, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5016, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5114, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5199, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5284, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5354, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5445, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5504, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5563, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5648, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 5674, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5762, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5897, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6025, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6116, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6168, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6220, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6319, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6396, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6501, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6614, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6699, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6797, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6882, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6960, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7037, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7112, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7210, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7308, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7396, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7516, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7599, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7716, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7806, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7986, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8076, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8166, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8274, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8364, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8462, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8575, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8674, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8757, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 10, 0, 6, -5, 0, 0, + 0, 0, -12, -13, 2, 11, 5, 4, + -9, 2, 11, 1, 9, 2, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -7, 0, 0, 0, 0, + 0, -4, 4, 4, 0, 0, -2, 0, + -2, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -3, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -6, 0, -27, 0, + 0, -4, 0, 4, 7, 0, 0, -4, + 2, 2, 7, 4, -4, 4, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, -3, -11, 0, -9, + -2, 0, 0, 0, 0, 0, 9, 0, + -7, -2, -1, 1, 0, -4, 0, 0, + -2, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, -2, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 7, -2, 0, 0, 4, -2, + -7, -31, 2, 6, 4, 0, -3, 0, + 8, 0, 7, 0, 7, 0, -21, 0, + -3, 7, 0, 7, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -4, 18, 0, + 18, 0, 7, 0, 9, 3, 4, 7, + 0, 0, 0, -8, 0, 0, 0, 0, + 1, -2, 0, 2, -4, -3, -4, 2, + 0, -2, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -12, 0, -14, 0, 0, 0, + 0, -2, 0, 22, -3, -3, 2, 2, + -2, 0, -3, 2, 0, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 0, 13, 0, 0, -8, 0, + 7, 0, -15, -22, -15, -4, 7, 0, + 0, -15, 0, 3, -5, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 7, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -4, 0, -1, + -1, -2, 0, 0, -2, 0, 0, 0, + -4, 0, -2, 0, -5, -4, 0, -6, + -7, -7, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 2, -2, 0, 1, 0, 0, 0, 2, + -2, 0, 0, 0, -2, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 7, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -2, -3, 0, -3, 0, -7, + -2, -7, 4, 0, 0, -4, 2, 4, + 6, 0, -6, -1, -3, 0, -1, -11, + 2, -2, 2, -12, 2, 0, 0, 1, + -12, 0, -12, -2, -19, -2, 0, -11, + 0, 4, 6, 0, 3, 0, 0, 0, + 0, 0, 0, -4, -3, 0, -7, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -2, -3, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -4, 2, 0, 0, -3, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -2, 0, -2, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 7, -2, 1, -7, 0, 0, + 6, -11, -12, -9, -4, 2, 0, -2, + -15, -4, 0, -4, 0, -4, 3, -4, + -14, 0, -6, 0, 0, 1, -1, 2, + -2, 0, 2, 0, -7, -9, 0, -11, + -5, -5, -5, -7, -3, -6, 0, -4, + -6, 1, 0, 1, 0, -2, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -4, -5, + -5, -1, 0, -7, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -4, 0, 0, 0, 0, -11, -7, 0, + 0, 0, -3, -11, 0, 0, -2, 2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -4, 0, + 0, 0, 0, 3, 0, 2, -4, -4, + 0, -2, -2, -3, 0, 0, 0, 0, + 0, 0, -7, 0, -2, 0, -3, -2, + 0, -5, -6, -7, -2, 0, -4, 0, + -7, 0, 0, 0, 0, 18, 0, 0, + 1, 0, 0, -3, 0, 2, 0, -10, + 0, 0, 0, 0, 0, -21, -4, 7, + 7, -2, -9, 0, 2, -3, 0, -11, + -1, -3, 2, -16, -2, 3, 0, 3, + -8, -3, -8, -7, -9, 0, 0, -13, + 0, 13, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -6, -7, 0, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 3, 0, -5, 2, -2, -1, -6, + -2, 0, -3, -2, -2, 0, -3, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -2, 0, 2, -2, 0, -5, 0, + 0, 0, -4, 0, -4, 0, -4, -4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -2, -3, + -7, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 9, -1, 0, -6, 0, + -2, 4, 0, -2, -9, -3, 3, 0, + 0, -11, -4, 2, -4, 2, 0, -2, + -2, -7, 0, -3, 1, 0, 0, -4, + 0, 0, 0, 2, 2, -4, -4, 0, + -4, -2, -3, -2, -2, 0, -4, 1, + -4, -4, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -7, 0, + 2, -5, 4, 0, -2, -11, 0, 0, + -5, -2, 0, -9, -6, -6, 0, 0, + -10, -2, -9, -9, -11, 0, -6, 0, + 2, 15, -3, 0, -5, -2, -1, -2, + -4, -6, -4, -8, -9, -5, -2, 0, + 0, -2, 0, 1, 0, 0, -16, -2, + 7, 5, -5, -8, 0, 1, -7, 0, + -11, -2, -2, 4, -21, -3, 1, 0, + 0, -15, -3, -12, -2, -16, 0, 0, + -16, 0, 13, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -9, -2, 0, -15, + 0, 0, 0, 0, -7, 0, -2, 0, + -1, -6, -11, 0, 0, -1, -3, -7, + -2, 0, -2, 0, 0, 0, 0, -10, + -2, -7, -7, -2, -4, -6, -2, -4, + 0, -4, -2, -7, -3, 0, -3, -4, + -2, -4, 0, 1, 0, -2, -7, 0, + 4, 0, -4, 0, 0, 0, 0, 3, + 0, 2, -4, 9, 0, -2, -2, -3, + 0, 0, 0, 0, 0, 0, -7, 0, + -2, 0, -3, -2, 0, -5, -6, -7, + -2, 0, -4, 2, 9, 0, 0, 0, + 0, 18, 0, 0, 1, 0, 0, -3, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -7, + -4, 0, 7, -7, -7, -4, -4, 9, + 4, 2, -19, -2, 4, -2, 0, -2, + 2, -2, -8, 0, -2, 2, -3, -2, + -7, -2, 0, 0, 7, 4, 0, -6, + 0, -12, -3, 6, -3, -9, 1, -3, + -7, -7, -2, 9, 2, 0, -3, 0, + -6, 0, 2, 7, -5, -8, -9, -6, + 7, 0, 1, -16, -2, 2, -4, -2, + -5, 0, -5, -8, -3, -3, -2, 0, + 0, -5, -5, -2, 0, 7, 5, -2, + -12, 0, -12, -3, 0, -8, -13, -1, + -7, -4, -7, -6, 6, 0, 0, -3, + 0, -4, -2, 0, -2, -4, 0, 4, + -7, 2, 0, 0, -12, 0, -2, -5, + -4, -2, -7, -6, -7, -5, 0, -7, + -2, -5, -4, -7, -2, 0, 0, 1, + 11, -4, 0, -7, -2, 0, -2, -4, + -5, -6, -6, -9, -3, -4, 4, 0, + -3, 0, -11, -3, 1, 4, -7, -8, + -4, -7, 7, -2, 1, -21, -4, 4, + -5, -4, -8, 0, -7, -9, -3, -2, + -2, -2, -5, -7, -1, 0, 0, 7, + 6, -2, -15, 0, -13, -5, 5, -9, + -15, -4, -8, -9, -11, -7, 4, 0, + 0, 0, 0, -3, 0, 0, 2, -3, + 4, 2, -4, 4, 0, 0, -7, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 7, 0, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 9, 0, 4, 1, 1, -3, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, -2, 4, 0, 7, + 0, 0, 22, 3, -4, -4, 2, 2, + -2, 1, -11, 0, 0, 11, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 9, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -6, 0, + 0, 1, 0, 0, 2, 29, -4, -2, + 7, 6, -6, 2, 0, 0, 2, 2, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, 0, 0, -6, 0, 0, 0, 0, + -5, -1, 0, 0, 0, -5, 0, -3, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -6, 0, 0, 0, -4, 2, -3, 0, + 0, -6, -2, -5, 0, 0, -6, 0, + -2, 0, -11, 0, -2, 0, 0, -18, + -4, -9, -2, -8, 0, 0, -15, 0, + -6, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -4, -2, -4, 0, 0, + 0, 0, -5, 0, -5, 3, -2, 4, + 0, -2, -5, -2, -4, -4, 0, -3, + -1, -2, 2, -6, -1, 0, 0, 0, + -20, -2, -3, 0, -5, 0, -2, -11, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -5, 0, -2, 0, 0, 0, -4, + 2, 0, 0, 0, -6, -2, -4, 0, + 0, -6, 0, -2, 0, -11, 0, 0, + 0, 0, -22, 0, -4, -8, -11, 0, + 0, -15, 0, -2, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 4, -3, 0, 7, + 11, -2, -2, -7, 3, 11, 4, 5, + -6, 3, 9, 3, 6, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, -4, -2, 0, -2, + 18, 10, 18, 0, 0, 0, 2, 0, + 0, 8, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -19, -3, -2, -9, + -11, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -19, -3, -2, + -9, -11, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -5, 2, 0, -2, + 2, 4, 2, -7, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -4, 0, -2, -9, 0, 14, + -2, 0, -5, -2, 0, -2, -4, 0, + -2, -6, -4, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -19, + -3, -2, -9, -11, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -7, -3, -2, 7, -2, -2, + -9, 1, -1, 1, -2, -6, 0, 5, + 0, 2, 1, 2, -5, -9, -3, 0, + -9, -4, -6, -9, -9, 0, -4, -4, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 3, 0, 3, -2, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -2, -2, 0, 0, + -6, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -2, 2, 0, -4, -4, -2, 0, -6, + -2, -5, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 7, 0, 0, -4, 0, + 0, 0, 0, -3, 0, -2, 0, 0, + -1, 0, 0, -2, 0, -5, 0, 0, + 9, -3, -7, -7, 2, 2, 2, 0, + -6, 2, 3, 2, 7, 2, 7, -2, + -6, 0, 0, -9, 0, 0, -7, -6, + 0, 0, -4, 0, -3, -4, 0, -3, + 0, -3, 0, -2, 3, 0, -2, -7, + -2, 8, 0, 0, -2, 0, -4, 0, + 0, 3, -5, 0, 2, -2, 2, 0, + 0, -7, 0, -2, -1, 0, -2, 2, + -2, 0, 0, 0, -9, -3, -5, 0, + -7, 0, 0, -11, 0, 8, -2, 0, + -4, 0, 1, 0, -2, 0, -2, -7, + 0, -2, 2, 0, 0, 0, 0, -2, + 0, 0, 2, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 5, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 5, + 0, 0, 0, 0, 0, -14, -13, 1, + 10, 7, 4, -9, 2, 9, 0, 8, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_14 = { +#else +lv_font_t lv_font_montserrat_14 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_14*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_16.c b/libraries/lvgl/src/font/lv_font_montserrat_16.c new file mode 100644 index 0000000..36cdea4 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_16.c @@ -0,0 +1,2460 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 1 +#endif + +#if LV_FONT_MONTSERRAT_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xbf, 0xb, 0xf0, 0xaf, 0xa, 0xe0, 0x9e, 0x8, + 0xd0, 0x8c, 0x7, 0xc0, 0x0, 0x0, 0x10, 0xbf, + 0x1a, 0xe0, + + /* U+0022 "\"" */ + 0xf5, 0x1f, 0x3f, 0x51, 0xf3, 0xe4, 0xf, 0x3e, + 0x40, 0xf2, 0x72, 0x8, 0x10, + + /* U+0023 "#" */ + 0x0, 0x5, 0xc0, 0x3, 0xe0, 0x0, 0x0, 0x7a, + 0x0, 0x5c, 0x0, 0x0, 0x9, 0x80, 0x7, 0xa0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x3e, + 0x73, 0x3c, 0x83, 0x30, 0x0, 0xf2, 0x0, 0xc5, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x2, + 0xf0, 0x0, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x41, 0x38, 0xc3, 0x36, 0xe3, 0x30, 0x0, + 0x89, 0x0, 0x5c, 0x0, 0x0, 0xa, 0x70, 0x7, + 0xa0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xe9, 0x20, 0x6, + 0xfc, 0xbc, 0x9e, 0x90, 0xe, 0xb0, 0x79, 0x0, + 0x10, 0xf, 0x80, 0x79, 0x0, 0x0, 0xd, 0xf5, + 0x79, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x50, 0x0, + 0x0, 0x6, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x79, + 0x5e, 0xf1, 0x0, 0x0, 0x79, 0x5, 0xf3, 0x7, + 0x0, 0x79, 0x7, 0xf1, 0x2f, 0xe9, 0xbc, 0xaf, + 0xa0, 0x3, 0xae, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, + + /* U+0025 "%" */ + 0x3, 0xde, 0x80, 0x0, 0x5, 0xd0, 0x0, 0xe4, + 0xc, 0x50, 0x1, 0xe3, 0x0, 0x4c, 0x0, 0x5a, + 0x0, 0xa9, 0x0, 0x6, 0xa0, 0x4, 0xc0, 0x4e, + 0x0, 0x0, 0x4c, 0x0, 0x5a, 0xd, 0x50, 0x0, + 0x0, 0xe4, 0x1c, 0x58, 0xa0, 0x0, 0x0, 0x3, + 0xce, 0x73, 0xe1, 0x3c, 0xe9, 0x0, 0x0, 0x0, + 0xd6, 0xe, 0x40, 0xa8, 0x0, 0x0, 0x7c, 0x3, + 0xc0, 0x3, 0xd0, 0x0, 0x2e, 0x20, 0x3c, 0x0, + 0x3d, 0x0, 0xb, 0x70, 0x0, 0xe2, 0x9, 0x80, + 0x6, 0xd0, 0x0, 0x4, 0xdd, 0xa0, + + /* U+0026 "&" */ + 0x0, 0x9, 0xef, 0xb1, 0x0, 0x0, 0x9, 0xe4, + 0x3c, 0xa0, 0x0, 0x0, 0xd9, 0x0, 0x7d, 0x0, + 0x0, 0xc, 0xc0, 0x1c, 0xa0, 0x0, 0x0, 0x3f, + 0xae, 0xc1, 0x0, 0x0, 0x1, 0xdf, 0xc0, 0x0, + 0x0, 0x3, 0xeb, 0x8f, 0x70, 0x18, 0x0, 0xdb, + 0x0, 0x7f, 0x65, 0xf0, 0x3f, 0x40, 0x0, 0x8f, + 0xea, 0x3, 0xf7, 0x0, 0x0, 0xcf, 0x70, 0xb, + 0xf9, 0x66, 0xcf, 0xbf, 0x40, 0x8, 0xdf, 0xea, + 0x30, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xf5, 0xf5, 0xe4, 0xe4, 0x72, + + /* U+0028 "(" */ + 0x0, 0xda, 0x5, 0xf2, 0xb, 0xc0, 0xf, 0x70, + 0x3f, 0x40, 0x5f, 0x20, 0x6f, 0x10, 0x7f, 0x0, + 0x6f, 0x10, 0x5f, 0x20, 0x3f, 0x40, 0xf, 0x70, + 0xb, 0xc0, 0x5, 0xf2, 0x0, 0xda, + + /* U+0029 ")" */ + 0x3f, 0x30, 0xc, 0xb0, 0x6, 0xf1, 0x1, 0xf6, + 0x0, 0xe9, 0x0, 0xbc, 0x0, 0xad, 0x0, 0xae, + 0x0, 0xad, 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf6, + 0x6, 0xf1, 0xc, 0xb0, 0x3f, 0x30, + + /* U+002A "*" */ + 0x0, 0x4a, 0x0, 0x6, 0x74, 0xa4, 0xa0, 0x2b, + 0xff, 0xe5, 0x0, 0x7f, 0xfb, 0x20, 0x7b, 0x6b, + 0x8d, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x5, 0x10, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x1, 0x1f, 0x51, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x4f, 0x74, 0x40, + 0x0, 0xf, 0x50, 0x0, 0x0, 0xf, 0x50, 0x0, + + /* U+002C "," */ + 0x9, 0x52, 0xfd, 0xb, 0xa0, 0xc5, 0xf, 0x0, + + /* U+002D "-" */ + 0x1, 0x11, 0x10, 0x1f, 0xff, 0xf3, 0x4, 0x44, + 0x40, + + /* U+002E "." */ + 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+002F "/" */ + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xf6, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0xf, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, + 0x4, 0xf1, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0xe, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x8, 0xef, 0xc5, 0x0, 0x0, 0xcf, 0xa8, + 0xcf, 0x70, 0x7, 0xf5, 0x0, 0xa, 0xf2, 0xd, + 0xc0, 0x0, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x0, + 0xdc, 0x3f, 0x60, 0x0, 0x0, 0xbd, 0x3f, 0x60, + 0x0, 0x0, 0xbd, 0x1f, 0x80, 0x0, 0x0, 0xdc, + 0xd, 0xc0, 0x0, 0x1, 0xf8, 0x7, 0xf5, 0x0, + 0xa, 0xf2, 0x0, 0xcf, 0xa8, 0xcf, 0x70, 0x0, + 0x8, 0xef, 0xc5, 0x0, + + /* U+0031 "1" */ + 0xef, 0xff, 0x36, 0x7a, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, + 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + + /* U+0032 "2" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfd, 0x98, 0xcf, + 0x90, 0x28, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x7, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x0, 0x4f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0x3e, 0xc1, 0x0, 0x0, 0x2e, 0xc1, 0x0, + 0x0, 0x2e, 0xd1, 0x0, 0x0, 0x2e, 0xf8, 0x77, + 0x77, 0x46, 0xff, 0xff, 0xff, 0xfa, + + /* U+0033 "3" */ + 0x6f, 0xff, 0xff, 0xff, 0x2, 0x77, 0x77, 0x9f, + 0xb0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, 0x9, + 0xf3, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xdf, 0xe9, 0x10, 0x0, 0x4, 0x59, 0xfd, 0x0, + 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x64, 0x40, 0x0, 0x8, 0xf3, 0xbf, 0xc9, 0x8c, + 0xfb, 0x0, 0x7c, 0xff, 0xd7, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x1, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x10, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x1, 0xd5, + 0x0, 0x3, 0xf8, 0x0, 0x2f, 0x60, 0x0, 0xed, + 0x22, 0x23, 0xf7, 0x21, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x55, 0x55, 0x56, 0xf9, 0x52, 0x0, + 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xf6, 0x0, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xff, 0x0, 0x7f, 0x77, 0x77, + 0x70, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x0, 0xb, 0xc2, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfb, 0x30, 0x4, 0x55, 0x68, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0xf, + 0x92, 0x50, 0x0, 0x5, 0xf6, 0x8f, 0xd9, 0x8a, + 0xfd, 0x10, 0x5b, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x5, 0xce, 0xfc, 0x60, 0x0, 0x9f, 0xc8, + 0x8b, 0x70, 0x5, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0x68, 0xef, 0xfa, 0x10, 0x3f, 0xee, + 0x64, 0x8f, 0xd0, 0x2f, 0xf1, 0x0, 0x6, 0xf4, + 0xe, 0xc0, 0x0, 0x2, 0xf6, 0x9, 0xf1, 0x0, + 0x6, 0xf3, 0x1, 0xde, 0x86, 0x9f, 0xb0, 0x0, + 0x19, 0xef, 0xd8, 0x0, + + /* U+0037 "7" */ + 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xf7, 0x77, 0x77, + 0xfc, 0x8f, 0x0, 0x0, 0x4f, 0x55, 0x90, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x2, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xdd, 0x0, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x1, 0xf9, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x6, 0xfc, 0x76, + 0xaf, 0xa0, 0xc, 0xd0, 0x0, 0x9, 0xf1, 0xd, + 0xc0, 0x0, 0x7, 0xf2, 0x7, 0xf7, 0x11, 0x5e, + 0xc0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x9, 0xf9, + 0x54, 0x7e, 0xd0, 0x2f, 0x80, 0x0, 0x4, 0xf6, + 0x4f, 0x50, 0x0, 0x0, 0xf8, 0x1f, 0xa0, 0x0, + 0x5, 0xf6, 0x9, 0xfb, 0x76, 0xaf, 0xd0, 0x0, + 0x6c, 0xff, 0xd8, 0x10, + + /* U+0039 "9" */ + 0x0, 0x8e, 0xfd, 0x80, 0x0, 0xc, 0xf8, 0x68, + 0xfc, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0x70, 0x8f, + 0x0, 0x0, 0xe, 0xc0, 0x7f, 0x30, 0x0, 0x1f, + 0xf0, 0x1f, 0xd4, 0x13, 0xcf, 0xf1, 0x4, 0xef, + 0xff, 0xa9, 0xf0, 0x0, 0x2, 0x31, 0xa, 0xf0, + 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, + 0x9f, 0x30, 0x9, 0xa7, 0x8d, 0xf7, 0x0, 0x7, + 0xdf, 0xeb, 0x40, 0x0, + + /* U+003A ":" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+003B ";" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe9, 0x1f, 0xd0, 0xa8, 0xe, + 0x30, 0xa0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x1, 0x7d, 0xf3, + 0x3, 0x9f, 0xe8, 0x10, 0xbf, 0xb5, 0x0, 0x0, + 0xee, 0x81, 0x0, 0x0, 0x17, 0xdf, 0xb4, 0x0, + 0x0, 0x4, 0xaf, 0xd2, 0x0, 0x0, 0x1, 0x82, + + /* U+003D "=" */ + 0xef, 0xff, 0xff, 0xf3, 0x45, 0x55, 0x55, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x44, 0x44, 0x40, + + /* U+003E ">" */ + 0x50, 0x0, 0x0, 0x0, 0xef, 0x92, 0x0, 0x0, + 0x6, 0xcf, 0xb5, 0x0, 0x0, 0x3, 0x9f, 0xe2, + 0x0, 0x0, 0x6c, 0xf3, 0x2, 0x9e, 0xe9, 0x20, + 0xbf, 0xc6, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfc, 0x77, 0xbf, + 0xa0, 0x27, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x1, 0xea, 0x0, 0x0, + 0x1, 0xdd, 0x10, 0x0, 0x0, 0xce, 0x10, 0x0, + 0x0, 0x3f, 0x60, 0x0, 0x0, 0x1, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xb5, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x53, 0x23, 0x7d, 0xc2, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x8e, 0x10, + 0x2, 0xf4, 0x1, 0xae, 0xfa, 0x3f, 0x49, 0xb0, + 0xa, 0x90, 0x1e, 0xe6, 0x5b, 0xef, 0x40, 0xe3, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0x3f, 0x0, 0xe8, 0x0, 0x0, 0x1f, 0x40, 0x5c, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0xa, 0x90, 0x1e, 0xd6, 0x5a, 0xde, 0xa6, 0xf2, + 0x3, 0xf3, 0x1, 0xaf, 0xfa, 0x16, 0xee, 0x50, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x53, 0x23, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa3, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x7f, + 0x20, 0x0, 0x0, 0x0, 0xdc, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0x60, 0xb, 0xe0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x4f, 0x60, 0x0, 0x1, 0xfa, + 0x11, 0x11, 0xed, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xe, 0xc4, 0x44, 0x44, 0x4f, + 0xa0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0xcd, 0x0, 0x0, 0x0, 0x2, 0xf8, + + /* U+0042 "B" */ + 0x5f, 0xff, 0xff, 0xeb, 0x40, 0x5, 0xf8, 0x55, + 0x57, 0xdf, 0x40, 0x5f, 0x40, 0x0, 0x1, 0xfa, + 0x5, 0xf4, 0x0, 0x0, 0xf, 0xa0, 0x5f, 0x51, + 0x11, 0x3a, 0xf4, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0x74, 0x44, 0x59, 0xfa, 0x5, 0xf4, + 0x0, 0x0, 0x8, 0xf2, 0x5f, 0x40, 0x0, 0x0, + 0x5f, 0x45, 0xf4, 0x0, 0x0, 0x9, 0xf2, 0x5f, + 0x85, 0x55, 0x6a, 0xfb, 0x5, 0xff, 0xff, 0xff, + 0xd7, 0x0, + + /* U+0043 "C" */ + 0x0, 0x2, 0x8d, 0xfe, 0xb4, 0x0, 0x4, 0xff, + 0xb8, 0x9d, 0xf9, 0x2, 0xfd, 0x20, 0x0, 0x8, + 0x50, 0xbf, 0x20, 0x0, 0x0, 0x0, 0xf, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x85, 0x0, + 0x5f, 0xfb, 0x89, 0xdf, 0x80, 0x0, 0x29, 0xdf, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x5f, 0x97, + 0x77, 0x9e, 0xf8, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0xaf, 0x60, 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, + 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, 0x5f, 0x40, + 0x0, 0x0, 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, + 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, + 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, 0x5f, 0x40, + 0x0, 0x0, 0xaf, 0x60, 0x5f, 0x97, 0x77, 0x9e, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, + + /* U+0045 "E" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x51, 0x11, 0x11, 0x5, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0x74, 0x44, 0x44, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x65, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf5, + 0x22, 0x22, 0x10, 0x5f, 0xff, 0xff, 0xfe, 0x5, + 0xf8, 0x55, 0x55, 0x40, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4f, + 0xfb, 0x89, 0xdf, 0xb0, 0x2, 0xfd, 0x20, 0x0, + 0x6, 0x60, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, + 0x9, 0xf0, 0xf, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0xb, 0xf2, 0x0, 0x0, 0x9, 0xf0, 0x2, 0xfd, + 0x20, 0x0, 0xa, 0xf0, 0x0, 0x4f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0x0, + + /* U+0048 "H" */ + 0x5f, 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, + 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, 0x4f, + 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x52, + 0x22, 0x22, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x5f, 0x85, 0x55, 0x55, 0x8f, 0x55, 0xf4, + 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, + 0x4f, 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, + 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, 0x0, + 0x4, 0xf5, + + /* U+0049 "I" */ + 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, + 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, + 0x45, 0xf4, + + /* U+004A "J" */ + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x77, 0x77, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0x20, 0x3, 0xf6, + 0xd, 0xe9, 0x8e, 0xf1, 0x1, 0xae, 0xfb, 0x30, + + /* U+004B "K" */ + 0x5f, 0x40, 0x0, 0x2, 0xeb, 0x5, 0xf4, 0x0, + 0x1, 0xec, 0x0, 0x5f, 0x40, 0x1, 0xde, 0x10, + 0x5, 0xf4, 0x0, 0xce, 0x20, 0x0, 0x5f, 0x40, + 0xbf, 0x30, 0x0, 0x5, 0xf4, 0x9f, 0x90, 0x0, + 0x0, 0x5f, 0xcf, 0xef, 0x40, 0x0, 0x5, 0xff, + 0x91, 0xee, 0x10, 0x0, 0x5f, 0xa0, 0x3, 0xfc, + 0x0, 0x5, 0xf4, 0x0, 0x6, 0xf8, 0x0, 0x5f, + 0x40, 0x0, 0x9, 0xf5, 0x5, 0xf4, 0x0, 0x0, + 0xc, 0xf2, + + /* U+004C "L" */ + 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x25, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x5f, 0x40, 0x0, 0x0, 0x0, 0x1e, 0x95, 0xfc, + 0x0, 0x0, 0x0, 0x8, 0xf9, 0x5f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x95, 0xfd, 0xe0, 0x0, 0x0, + 0xae, 0xf9, 0x5f, 0x5f, 0x70, 0x0, 0x3f, 0x5f, + 0x95, 0xf3, 0x8f, 0x10, 0xb, 0xc0, 0xf9, 0x5f, + 0x31, 0xe9, 0x4, 0xf3, 0xf, 0x95, 0xf3, 0x7, + 0xf2, 0xdb, 0x0, 0xf9, 0x5f, 0x30, 0xd, 0xef, + 0x20, 0xf, 0x95, 0xf3, 0x0, 0x5f, 0x90, 0x0, + 0xf9, 0x5f, 0x30, 0x0, 0x71, 0x0, 0xf, 0x95, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf9, + + /* U+004E "N" */ + 0x5f, 0x50, 0x0, 0x0, 0x4f, 0x55, 0xff, 0x20, + 0x0, 0x4, 0xf5, 0x5f, 0xfd, 0x0, 0x0, 0x4f, + 0x55, 0xfa, 0xf9, 0x0, 0x4, 0xf5, 0x5f, 0x4a, + 0xf5, 0x0, 0x4f, 0x55, 0xf4, 0xd, 0xf2, 0x4, + 0xf5, 0x5f, 0x40, 0x2f, 0xd0, 0x4f, 0x55, 0xf4, + 0x0, 0x6f, 0x94, 0xf5, 0x5f, 0x40, 0x0, 0xaf, + 0xaf, 0x55, 0xf4, 0x0, 0x0, 0xdf, 0xf5, 0x5f, + 0x40, 0x0, 0x2, 0xff, 0x55, 0xf4, 0x0, 0x0, + 0x6, 0xf5, + + /* U+004F "O" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4, + 0xff, 0xb8, 0x9e, 0xfa, 0x0, 0x2, 0xfd, 0x20, + 0x0, 0x8, 0xf9, 0x0, 0xbf, 0x20, 0x0, 0x0, + 0xa, 0xf2, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x3f, + 0x72, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x2f, + 0x60, 0x0, 0x0, 0x0, 0xf, 0x90, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xf7, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0xaf, 0x20, 0x2f, 0xd2, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x4f, 0xfb, 0x89, 0xef, 0xa0, 0x0, + 0x0, 0x28, 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x62, + 0x23, 0x6e, 0xf1, 0x5f, 0xff, 0xff, 0xfd, 0x30, + 0x5f, 0x85, 0x54, 0x20, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0x5f, + 0x40, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x4e, 0xfb, 0x89, 0xef, 0xa0, 0x0, 0x2, 0xfd, + 0x20, 0x0, 0x8, 0xf9, 0x0, 0xa, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x20, 0xf, 0xa0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0x60, 0x0, 0x0, 0x0, + 0xf, 0x90, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf, + 0x90, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0x70, + 0xb, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x3, + 0xfc, 0x10, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x6f, + 0xfa, 0x78, 0xdf, 0xb0, 0x0, 0x0, 0x3, 0xae, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd4, 0x15, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x31, + 0x0, + + /* U+0052 "R" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x52, + 0x23, 0x6e, 0xe1, 0x5f, 0xff, 0xff, 0xfc, 0x30, + 0x5f, 0x85, 0x55, 0xf9, 0x0, 0x5f, 0x40, 0x0, + 0x7f, 0x40, 0x5f, 0x40, 0x0, 0xc, 0xe0, 0x5f, + 0x40, 0x0, 0x2, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x5c, 0xef, 0xd9, 0x20, 0x7, 0xfc, 0x87, + 0xaf, 0x90, 0xe, 0xc0, 0x0, 0x1, 0x10, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xea, 0x50, 0x0, 0x0, 0x5, + 0xae, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x4e, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xf3, 0x8, 0x0, 0x0, + 0x8, 0xf2, 0x2f, 0xfa, 0x77, 0xbf, 0xa0, 0x2, + 0x9d, 0xff, 0xc7, 0x0, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x67, 0x78, 0xfb, + 0x77, 0x72, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, + 0x0, 0x8, 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, + 0x16, 0xf3, 0x0, 0x0, 0x8, 0xf1, 0x6f, 0x30, + 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, 0x0, 0x8, + 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x5, 0xf4, + 0x0, 0x0, 0x9, 0xf0, 0x3f, 0x70, 0x0, 0x0, + 0xcd, 0x0, 0xde, 0x20, 0x0, 0x5f, 0x80, 0x4, + 0xff, 0xa8, 0xbf, 0xd0, 0x0, 0x3, 0xbe, 0xfd, + 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6f, + 0x50, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xfb, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x9, 0xf2, 0x0, 0x0, + 0xae, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x1f, 0x90, + 0x0, 0x0, 0xce, 0x0, 0x7, 0xf2, 0x0, 0x0, + 0x5, 0xf6, 0x0, 0xdb, 0x0, 0x0, 0x0, 0xe, + 0xc0, 0x4f, 0x50, 0x0, 0x0, 0x0, 0x8f, 0x3b, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xfb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x40, 0x0, 0x0, 0xdf, 0x0, 0x0, 0x2, + 0xf5, 0xf, 0x90, 0x0, 0x2, 0xff, 0x40, 0x0, + 0x7, 0xf0, 0xb, 0xe0, 0x0, 0x7, 0xfe, 0x90, + 0x0, 0xc, 0xb0, 0x6, 0xf3, 0x0, 0xc, 0xaa, + 0xe0, 0x0, 0x1f, 0x60, 0x1, 0xf8, 0x0, 0x1f, + 0x54, 0xf3, 0x0, 0x6f, 0x10, 0x0, 0xcd, 0x0, + 0x7f, 0x10, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0x7f, + 0x20, 0xcb, 0x0, 0xad, 0x1, 0xf7, 0x0, 0x0, + 0x2f, 0x71, 0xf6, 0x0, 0x5f, 0x26, 0xf2, 0x0, + 0x0, 0xd, 0xc6, 0xf1, 0x0, 0xf, 0x7b, 0xd0, + 0x0, 0x0, 0x8, 0xfd, 0xc0, 0x0, 0xb, 0xdf, + 0x80, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x1, 0xfe, 0x0, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x90, 0x0, 0x0, 0xcd, 0x0, 0x8f, 0x40, + 0x0, 0x7f, 0x30, 0x0, 0xde, 0x10, 0x2f, 0x80, + 0x0, 0x3, 0xfa, 0xc, 0xd0, 0x0, 0x0, 0x7, + 0xfb, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0x7f, 0x70, 0x0, 0x0, 0x6f, 0x60, 0xaf, + 0x20, 0x0, 0x2f, 0xb0, 0x1, 0xed, 0x0, 0xc, + 0xf1, 0x0, 0x4, 0xf8, 0x7, 0xf6, 0x0, 0x0, + 0x9, 0xf3, + + /* U+0059 "Y" */ + 0xc, 0xe0, 0x0, 0x0, 0x7, 0xf2, 0x3, 0xf7, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0xaf, 0x10, 0x0, + 0x9e, 0x10, 0x0, 0x1f, 0xa0, 0x2, 0xf6, 0x0, + 0x0, 0x8, 0xf3, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0xec, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x1, 0x77, 0x77, + 0x77, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xf9, 0x0, + 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xf8, 0x77, 0x77, 0x77, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+005B "[" */ + 0x5f, 0xff, 0x5, 0xf7, 0x50, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, + 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf7, 0x50, 0x5f, 0xff, 0x0, + + /* U+005C "\\" */ + 0x7e, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, + 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, + 0x2, 0xf4, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, + 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x7, 0xe0, + + /* U+005D "]" */ + 0xbf, 0xfa, 0x35, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x35, 0xea, 0xbf, 0xfa, + + /* U+005E "^" */ + 0x0, 0x2f, 0x80, 0x0, 0x0, 0x9d, 0xe0, 0x0, + 0x0, 0xf3, 0xd5, 0x0, 0x6, 0xd0, 0x7b, 0x0, + 0xc, 0x60, 0x1f, 0x20, 0x3f, 0x10, 0xb, 0x80, + 0x9a, 0x0, 0x4, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0x11, 0x11, + + /* U+0060 "`" */ + 0x7, 0xf6, 0x0, 0x3, 0xe7, + + /* U+0061 "a" */ + 0x1, 0x9e, 0xfd, 0x80, 0x0, 0xce, 0x87, 0xaf, + 0x90, 0x2, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x0, + 0x6, 0xf2, 0x2, 0xbe, 0xff, 0xff, 0x20, 0xec, + 0x42, 0x27, 0xf2, 0x2f, 0x50, 0x0, 0x7f, 0x20, + 0xec, 0x42, 0x7f, 0xf2, 0x2, 0xbf, 0xfb, 0x6f, + 0x20, + + /* U+0062 "b" */ + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0xec, 0x78, 0xef, + 0x30, 0x8f, 0xa0, 0x0, 0x1e, 0xc0, 0x8f, 0x20, + 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, 0xf3, + 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, 0x0, + 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, 0x8e, + 0x2b, 0xfe, 0xb3, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3a, 0xef, 0xc4, 0x0, 0x4f, 0xd8, 0x7c, + 0xf4, 0xd, 0xd0, 0x0, 0x7, 0x13, 0xf6, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x6, 0x10, + 0x4f, 0xd7, 0x7c, 0xf4, 0x0, 0x3a, 0xef, 0xc4, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x3b, 0xff, 0xa3, 0xf7, 0x4, 0xfd, 0x87, 0xce, + 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, 0x60, + 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, 0xf7, + 0x3f, 0x50, 0x0, 0x3, 0xf7, 0xe, 0xc0, 0x0, + 0xa, 0xf7, 0x4, 0xfc, 0x65, 0xbe, 0xf7, 0x0, + 0x3b, 0xff, 0xb2, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x3b, 0xfe, 0xa2, 0x0, 0x4, 0xfc, 0x67, + 0xee, 0x20, 0xe, 0xc0, 0x0, 0x1e, 0xa0, 0x3f, + 0x50, 0x0, 0x7, 0xf0, 0x4f, 0xff, 0xff, 0xff, + 0xf1, 0x3f, 0x72, 0x22, 0x22, 0x20, 0xe, 0xc0, + 0x0, 0x2, 0x0, 0x4, 0xfd, 0x87, 0xaf, 0x50, + 0x0, 0x3a, 0xef, 0xd6, 0x0, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xfc, 0x0, 0x2f, 0xb5, 0x70, 0x4, + 0xf3, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x48, 0xf7, + 0x53, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, + 0x30, 0x0, + + /* U+0067 "g" */ + 0x0, 0x3b, 0xff, 0xb2, 0xe9, 0x4, 0xfe, 0x87, + 0xcf, 0xf9, 0xe, 0xd1, 0x0, 0xa, 0xf9, 0x3f, + 0x60, 0x0, 0x1, 0xf9, 0x4f, 0x40, 0x0, 0x0, + 0xf9, 0x3f, 0x60, 0x0, 0x1, 0xf9, 0xe, 0xd0, + 0x0, 0x9, 0xf9, 0x4, 0xfd, 0x87, 0xcf, 0xf8, + 0x0, 0x3b, 0xff, 0xb3, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0x9, 0xe9, 0x77, 0xaf, 0xb0, 0x1, + 0x7c, 0xff, 0xd8, 0x0, + + /* U+0068 "h" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf2, 0xbf, + 0xea, 0x10, 0x8f, 0xfb, 0x89, 0xfd, 0x8, 0xf8, + 0x0, 0x6, 0xf4, 0x8f, 0x10, 0x0, 0x1f, 0x78, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x88, 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0xf, 0x88, 0xf0, 0x0, 0x0, 0xf8, + + /* U+0069 "i" */ + 0x9e, 0x1a, 0xf2, 0x0, 0x8, 0xf0, 0x8f, 0x8, + 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, + 0x8, 0xf0, + + /* U+006A "j" */ + 0x0, 0x7, 0xe2, 0x0, 0x9, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, + 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, + 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, + 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x8, 0xf0, 0x18, + 0x6e, 0xc0, 0x3e, 0xfc, 0x20, + + /* U+006B "k" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x1d, 0xd1, 0x8f, 0x0, 0x1d, 0xe2, 0x8, 0xf0, + 0x1d, 0xe2, 0x0, 0x8f, 0x2d, 0xf3, 0x0, 0x8, + 0xfe, 0xff, 0x70, 0x0, 0x8f, 0xe2, 0xbf, 0x30, + 0x8, 0xf2, 0x1, 0xee, 0x10, 0x8f, 0x0, 0x3, + 0xfb, 0x8, 0xf0, 0x0, 0x7, 0xf7, + + /* U+006C "l" */ + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x8, + 0xff, 0x96, 0x9f, 0xcf, 0xc6, 0x8f, 0xd0, 0x8f, + 0x70, 0x0, 0x9f, 0xc0, 0x0, 0x5f, 0x58, 0xf1, + 0x0, 0x5, 0xf6, 0x0, 0x1, 0xf7, 0x8f, 0x0, + 0x0, 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, 0x4, + 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0x4f, + 0x40, 0x0, 0xf, 0x80, + + /* U+006E "n" */ + 0x8e, 0x3b, 0xfe, 0xa1, 0x8, 0xff, 0xa6, 0x8f, + 0xd0, 0x8f, 0x80, 0x0, 0x6f, 0x48, 0xf1, 0x0, + 0x1, 0xf7, 0x8f, 0x0, 0x0, 0xf, 0x88, 0xf0, + 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, 0x88, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x80, + + /* U+006F "o" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x4, 0xfd, 0x87, + 0xcf, 0x60, 0xe, 0xd0, 0x0, 0xb, 0xf1, 0x3f, + 0x60, 0x0, 0x3, 0xf5, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf5, 0xe, 0xd0, + 0x0, 0xb, 0xf1, 0x4, 0xfd, 0x77, 0xcf, 0x60, + 0x0, 0x3b, 0xef, 0xc4, 0x0, + + /* U+0070 "p" */ + 0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x8f, 0xfb, 0x57, + 0xdf, 0x30, 0x8f, 0x90, 0x0, 0xd, 0xc0, 0x8f, + 0x10, 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, + 0xf3, 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, + 0x0, 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, + 0x8f, 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x3b, 0xff, 0xa2, 0xf7, 0x4, 0xfd, 0x87, + 0xde, 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, + 0x60, 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf7, 0xe, 0xd0, + 0x0, 0xb, 0xf7, 0x4, 0xfd, 0x77, 0xce, 0xf7, + 0x0, 0x3b, 0xff, 0xa3, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, + + /* U+0072 "r" */ + 0x8e, 0x2b, 0xf0, 0x8f, 0xed, 0x90, 0x8f, 0xa0, + 0x0, 0x8f, 0x20, 0x0, 0x8f, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x8f, 0x0, 0x0, + + /* U+0073 "s" */ + 0x2, 0xae, 0xfd, 0x91, 0x1e, 0xd7, 0x69, 0xd0, + 0x4f, 0x30, 0x0, 0x0, 0x2f, 0xb4, 0x10, 0x0, + 0x6, 0xef, 0xfd, 0x60, 0x0, 0x1, 0x5b, 0xf5, + 0x1, 0x0, 0x0, 0xf7, 0x5f, 0xa7, 0x6b, 0xf3, + 0x19, 0xdf, 0xec, 0x40, + + /* U+0074 "t" */ + 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0xcf, + 0xff, 0xfa, 0x4, 0x8f, 0x75, 0x30, 0x5, 0xf3, + 0x0, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x4, 0xf4, 0x0, 0x0, + 0x1f, 0xc6, 0x80, 0x0, 0x5d, 0xfc, 0x10, + + /* U+0075 "u" */ + 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, 0x2, + 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, + 0x2, 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x59, 0xf0, + 0x0, 0x4, 0xf5, 0x6f, 0x30, 0x0, 0xaf, 0x51, + 0xee, 0x76, 0xbf, 0xf5, 0x2, 0xbe, 0xfb, 0x3f, + 0x50, + + /* U+0076 "v" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf2, 0x0, + 0x2, 0xf5, 0x0, 0xf9, 0x0, 0x9, 0xe0, 0x0, + 0x9e, 0x0, 0xf, 0x80, 0x0, 0x2f, 0x60, 0x6f, + 0x10, 0x0, 0xc, 0xc0, 0xcb, 0x0, 0x0, 0x5, + 0xf6, 0xf4, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x8f, 0x70, 0x0, + + /* U+0077 "w" */ + 0xbb, 0x0, 0x0, 0x9f, 0x10, 0x0, 0x4f, 0x16, + 0xf1, 0x0, 0xe, 0xf6, 0x0, 0x9, 0xc0, 0xf, + 0x60, 0x5, 0xfc, 0xb0, 0x0, 0xf6, 0x0, 0xac, + 0x0, 0xab, 0x5f, 0x10, 0x5f, 0x10, 0x5, 0xf1, + 0xf, 0x50, 0xf7, 0xa, 0xb0, 0x0, 0xf, 0x76, + 0xf0, 0x9, 0xc0, 0xf5, 0x0, 0x0, 0xac, 0xba, + 0x0, 0x4f, 0x8f, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xe0, 0x0, + 0x8, 0xf4, 0x0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x70, 0x0, 0x9f, 0x20, 0x8f, 0x30, 0x5f, + 0x50, 0x0, 0xcd, 0x2e, 0x90, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x4, + 0xfd, 0xe1, 0x0, 0x1, 0xeb, 0xd, 0xc0, 0x0, + 0xbe, 0x10, 0x3f, 0x80, 0x6f, 0x40, 0x0, 0x7f, + 0x40, + + /* U+0079 "y" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf3, 0x0, + 0x2, 0xf4, 0x0, 0xea, 0x0, 0x9, 0xd0, 0x0, + 0x8f, 0x10, 0x1f, 0x70, 0x0, 0x1f, 0x70, 0x7f, + 0x10, 0x0, 0xa, 0xe0, 0xd9, 0x0, 0x0, 0x3, + 0xf9, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x1c, 0x79, 0xf5, 0x0, 0x0, 0x1a, + 0xee, 0x70, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xf9, 0x15, 0x55, 0x5b, 0xf4, + 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, + 0x0, 0xb, 0xe1, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0x1e, 0xe5, 0x55, 0x53, + 0x5f, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x2c, 0xf5, 0x0, 0xaf, 0x61, 0x0, 0xcc, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, + 0xdb, 0x0, 0x2, 0xea, 0x0, 0x1f, 0xf4, 0x0, + 0x5, 0xfa, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0xaf, 0x61, 0x0, 0x2c, 0xf5, + + /* U+007C "|" */ + 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, + 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, + 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x10, + + /* U+007D "}" */ + 0xbe, 0x80, 0x3, 0xaf, 0x40, 0x1, 0xf6, 0x0, + 0x1f, 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x0, + 0xf9, 0x0, 0xa, 0xfb, 0x0, 0xfb, 0x20, 0x1f, + 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x1, 0xf6, + 0x3, 0xaf, 0x40, 0xbe, 0x90, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe4, 0x0, + 0xb5, 0xc, 0x86, 0xf5, 0x1e, 0x20, 0xf0, 0x3, + 0xef, 0x90, 0x2, 0x0, 0x0, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x2, 0xce, 0x90, 0xd, 0x40, 0x89, 0x3b, 0x0, + 0xe, 0x3b, 0x0, 0xe, 0xd, 0x40, 0x89, 0x2, + 0xce, 0x90, + + /* U+2022 "•" */ + 0x0, 0x8, 0xf8, 0xef, 0xe7, 0xf7, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 69, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 100, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 31, .adv_w = 180, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 177, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 176, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 327, .adv_w = 54, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 332, .adv_w = 86, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 362, .adv_w = 87, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 392, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 417, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 449, .adv_w = 58, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 457, .adv_w = 98, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 466, .adv_w = 58, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 535, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 625, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 679, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 733, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 799, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 853, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 913, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 967, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1087, .adv_w = 58, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1101, .adv_w = 58, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1119, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1151, .adv_w = 149, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1175, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1207, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1261, .adv_w = 265, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1381, .adv_w = 187, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1459, .adv_w = 194, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1591, .adv_w = 211, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1717, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1771, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1843, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1909, .adv_w = 79, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1927, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1975, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2041, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2095, .adv_w = 244, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2173, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2239, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2317, .adv_w = 185, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 215, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2482, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2542, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2662, .adv_w = 202, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2728, .adv_w = 182, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2806, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2914, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2980, .adv_w = 166, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3052, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3118, .adv_w = 85, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3156, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3220, .adv_w = 85, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3250, .adv_w = 149, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3278, .adv_w = 128, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3286, .adv_w = 154, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3291, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3332, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3433, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3493, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3538, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3640, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3694, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3712, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 3757, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3811, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3823, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3891, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3932, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3977, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4037, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4097, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4124, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4160, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4199, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4240, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4285, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4353, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4394, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 4454, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4490, .adv_w = 90, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4535, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4558, .adv_w = 90, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4596, .adv_w = 149, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 4619, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 4637, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4643, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4779, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4875, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4987, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5083, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5149, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5277, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5405, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5531, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5659, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5767, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5895, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5951, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6035, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6179, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6275, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6363, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6443, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6569, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6772, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6852, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6964, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7034, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7104, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7202, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 7230, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7338, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7498, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7658, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7786, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7856, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7926, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8066, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8162, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8290, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8435, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8540, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8652, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8848, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8944, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9040, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9152, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9264, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9372, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9534, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9630, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9780, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9880, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9980, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10080, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10180, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10280, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10427, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10523, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10635, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10780, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10900, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10996, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 12, 0, 7, -6, 0, 0, + 0, 0, -14, -15, 2, 12, 6, 4, + -10, 2, 13, 1, 11, 3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, -8, 0, 0, 0, 0, + 0, -5, 4, 5, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -5, + 0, 0, 0, 0, -3, 0, 0, -3, + -4, 0, 0, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -7, 0, -31, 0, + 0, -5, 0, 5, 8, 0, 0, -5, + 3, 3, 8, 5, -4, 5, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, -3, -13, 0, -10, + -2, 0, 0, 0, 0, 1, 10, 0, + -8, -2, -1, 1, 0, -4, 0, 0, + -2, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -20, -2, 10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 3, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 5, 3, 8, -3, 0, 0, 5, -3, + -8, -35, 2, 7, 5, 1, -3, 0, + 9, 0, 8, 0, 8, 0, -24, 0, + -3, 8, 0, 8, -3, 5, 3, 0, + 0, 1, -3, 0, 0, -4, 20, 0, + 20, 0, 8, 0, 11, 3, 4, 8, + 0, 0, 0, -9, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -3, -5, 2, + 0, -3, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -14, 0, -16, 0, 0, 0, + 0, -2, 0, 25, -3, -3, 3, 3, + -2, 0, -3, 3, 0, 0, -14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 15, 0, 0, -9, 0, + 8, 0, -17, -25, -17, -5, 8, 0, + 0, -17, 0, 3, -6, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 8, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -5, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -5, 0, -2, 0, -6, -5, 0, -6, + -8, -8, -5, 0, -5, 0, -5, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 8, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -3, 0, -4, 0, -8, + -2, -8, 5, 0, 0, -5, 3, 5, + 7, 0, -6, -1, -3, 0, -1, -12, + 3, -2, 2, -14, 3, 0, 0, 1, + -13, 0, -14, -2, -22, -2, 0, -13, + 0, 5, 7, 0, 3, 0, 0, 0, + 0, 1, 0, -5, -3, 0, -8, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -5, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 8, -2, 1, -8, 0, 0, + 7, -13, -13, -11, -5, 3, 0, -2, + -17, -5, 0, -5, 0, -5, 4, -5, + -16, 0, -7, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -8, -10, 0, -13, + -6, -5, -6, -8, -3, -7, -1, -5, + -7, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -4, -6, + -6, -1, 0, -8, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -13, -8, 0, + 0, 0, -4, -13, 0, 0, -3, 3, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -5, -5, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -8, 0, -3, 0, -4, -3, + 0, -6, -6, -8, -2, 0, -5, 0, + -8, 0, 0, 0, 0, 20, 0, 0, + 1, 0, 0, -3, 0, 3, 0, -11, + 0, 0, 0, 0, 0, -24, -5, 8, + 8, -2, -11, 0, 3, -4, 0, -13, + -1, -3, 3, -18, -3, 3, 0, 4, + -9, -4, -9, -8, -11, 0, 0, -15, + 0, 15, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -7, -8, -1, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -5, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -5, 0, 0, 5, + -1, 3, 0, -6, 3, -2, -1, -7, + -3, 0, -3, -3, -2, 0, -4, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -5, 0, -4, 0, -4, -4, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 3, 0, -4, 0, -2, -3, + -8, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 10, -1, 0, -7, 0, + -2, 5, 0, -3, -11, -3, 4, 0, + 0, -12, -4, 3, -4, 2, 0, -2, + -2, -8, 0, -4, 1, 0, 0, -4, + 0, 0, 0, 3, 3, -5, -5, 0, + -4, -3, -4, -3, -3, 0, -4, 1, + -5, -4, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -3, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -5, 0, 0, 0, -8, 0, + 2, -6, 5, 1, -2, -12, 0, 0, + -6, -3, 0, -10, -6, -7, 0, 0, + -11, -3, -10, -10, -12, 0, -7, 0, + 2, 17, -3, 0, -6, -3, -1, -3, + -4, -7, -5, -9, -10, -6, -3, 0, + 0, -2, 0, 1, 0, 0, -18, -2, + 8, 6, -6, -9, 0, 1, -8, 0, + -13, -2, -3, 5, -24, -3, 1, 0, + 0, -17, -3, -13, -3, -19, 0, 0, + -18, 0, 15, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -10, -2, 0, -17, + 0, 0, 0, 0, -8, 0, -2, 0, + -1, -7, -12, 0, 0, -1, -4, -8, + -3, 0, -2, 0, 0, 0, 0, -12, + -3, -8, -8, -2, -4, -6, -3, -4, + 0, -5, -2, -8, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -8, 0, + 5, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -5, 10, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -8, 0, + -3, 0, -4, -3, 0, -6, -6, -8, + -2, 0, -5, 2, 10, 0, 0, 0, + 0, 20, 0, 0, 1, 0, 0, -3, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -5, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -5, + -3, 0, 0, -5, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 5, 2, -2, 0, -8, + -4, 0, 8, -8, -8, -5, -5, 10, + 5, 3, -22, -2, 5, -3, 0, -3, + 3, -3, -9, 0, -3, 3, -3, -2, + -8, -2, 0, 0, 8, 5, 0, -7, + 0, -14, -3, 7, -3, -10, 1, -3, + -8, -8, -3, 10, 3, 0, -4, 0, + -7, 0, 2, 8, -6, -9, -10, -6, + 8, 0, 1, -19, -2, 3, -4, -2, + -6, 0, -6, -9, -4, -4, -2, 0, + 0, -6, -5, -3, 0, 8, 6, -3, + -14, 0, -14, -4, 0, -9, -15, -1, + -8, -4, -8, -7, 7, 0, 0, -3, + 0, -5, -2, 0, -3, -5, 0, 4, + -8, 3, 0, 0, -14, 0, -3, -6, + -4, -2, -8, -6, -8, -6, 0, -8, + -3, -6, -5, -8, -3, 0, 0, 1, + 12, -4, 0, -8, -3, 0, -3, -5, + -6, -7, -7, -10, -3, -5, 5, 0, + -4, 0, -13, -3, 2, 5, -8, -9, + -5, -8, 8, -3, 1, -24, -5, 5, + -6, -4, -9, 0, -8, -11, -3, -3, + -2, -3, -5, -8, -1, 0, 0, 8, + 7, -2, -17, 0, -15, -6, 6, -10, + -17, -5, -9, -11, -13, -8, 5, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 5, 2, -5, 5, 0, 0, -8, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 8, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 10, 0, 5, 1, 1, -3, + 0, 5, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 0, -3, 4, 0, 8, + 0, 0, 25, 3, -5, -5, 3, 3, + -2, 1, -13, 0, 0, 12, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 10, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -7, 0, + 0, 1, 0, 0, 3, 33, -5, -2, + 8, 7, -7, 3, 0, 0, 3, 3, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -33, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, -7, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -7, 0, 0, 0, -4, 3, -3, 0, + 0, -7, -3, -6, 0, 0, -7, 0, + -3, 0, -12, 0, -3, 0, 0, -21, + -5, -10, -3, -9, 0, 0, -17, 0, + -7, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -4, 0, 0, + 0, 0, -6, 0, -6, 3, -3, 5, + 0, -2, -6, -2, -4, -5, 0, -3, + -1, -2, 2, -7, -1, 0, 0, 0, + -23, -2, -4, 0, -6, 0, -2, -12, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -5, + 3, 0, 0, 0, -7, -3, -5, 0, + 0, -7, 0, -3, 0, -12, 0, 0, + 0, 0, -25, 0, -5, -9, -13, 0, + 0, -17, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 4, -3, 0, 8, + 13, -3, -3, -8, 3, 13, 4, 6, + -7, 3, 11, 3, 7, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 12, -5, -3, 0, -2, + 20, 11, 20, 0, 0, 0, 3, 0, + 0, 9, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -22, -3, -2, -10, + -13, 0, 0, -17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -22, -3, -2, + -10, -13, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -6, 3, 0, -3, + 2, 5, 3, -8, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -5, 0, -2, -10, 0, 16, + -3, 0, -6, -2, 0, -2, -4, 0, + -3, -7, -5, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -22, + -3, -2, -10, -13, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -8, -3, -2, 8, -2, -3, + -10, 1, -2, 1, -2, -7, 1, 6, + 1, 2, 1, 2, -6, -10, -3, 0, + -10, -5, -7, -11, -10, 0, -4, -5, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -7, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -3, 3, 0, -4, -5, -2, 0, -7, + -2, -6, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 8, 0, 0, -5, 0, + 0, 0, 0, -3, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -6, 0, 0, + 11, -3, -8, -8, 2, 3, 3, -1, + -7, 2, 4, 2, 8, 2, 8, -2, + -7, 0, 0, -10, 0, 0, -8, -7, + 0, 0, -5, 0, -3, -4, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -8, + -3, 9, 0, 0, -2, 0, -5, 0, + 0, 3, -6, 0, 3, -3, 2, 0, + 0, -8, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -10, -3, -6, 0, + -8, 0, 0, -12, 0, 9, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -8, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 5, 0, 6, + 0, 0, 0, 0, 0, -16, -15, 1, + 11, 8, 4, -10, 2, 11, 0, 9, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_16 = { +#else +lv_font_t lv_font_montserrat_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 18, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_16*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_18.c b/libraries/lvgl/src/font/lv_font_montserrat_18.c new file mode 100644 index 0000000..de73390 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_18.c @@ -0,0 +1,2860 @@ +/******************************************************************************* + * Size: 18 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 18 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_18.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 1 +#endif + +#if LV_FONT_MONTSERRAT_18 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x68, 0xf6, 0x8f, 0x57, 0xf4, 0x6f, 0x46, + 0xf3, 0x5f, 0x35, 0xf2, 0x4f, 0x10, 0x0, 0x15, + 0xa, 0xf7, 0x7f, 0x40, + + /* U+0022 "\"" */ + 0xda, 0x9, 0xed, 0x90, 0x9d, 0xd9, 0x8, 0xdc, + 0x80, 0x8d, 0xc8, 0x8, 0xc0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xe5, 0x0, 0x4f, 0x0, 0x0, 0x0, + 0xf, 0x30, 0x6, 0xe0, 0x0, 0x0, 0x2, 0xf1, + 0x0, 0x8c, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0x5a, 0xe5, 0x55, 0xda, 0x55, + 0x0, 0x0, 0x9b, 0x0, 0xe, 0x60, 0x0, 0x0, + 0xb, 0x90, 0x0, 0xf4, 0x0, 0x0, 0x11, 0xd8, + 0x11, 0x3f, 0x31, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0x45, 0xf6, 0x44, 0x8e, 0x44, + 0x20, 0x0, 0x2f, 0x10, 0x7, 0xc0, 0x0, 0x0, + 0x4, 0xf0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x5e, + 0x0, 0xb, 0x90, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, + 0x0, 0x2, 0xad, 0xff, 0xd9, 0x20, 0x3, 0xff, + 0xbf, 0xcd, 0xfc, 0x0, 0xbf, 0x40, 0xe4, 0x3, + 0x30, 0xe, 0xd0, 0xe, 0x40, 0x0, 0x0, 0xdf, + 0x30, 0xe4, 0x0, 0x0, 0x5, 0xff, 0xaf, 0x50, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x1e, 0xbe, 0xfb, 0x0, 0x0, 0x0, 0xe4, + 0xb, 0xf4, 0x0, 0x0, 0xe, 0x40, 0x6f, 0x60, + 0xb4, 0x0, 0xe4, 0xb, 0xf3, 0x1e, 0xfd, 0xaf, + 0xbe, 0xfa, 0x0, 0x17, 0xcf, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, + + /* U+0025 "%" */ + 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0xc9, 0x16, 0xe0, 0x0, 0xc, 0x90, 0x0, 0x2f, + 0x0, 0xc, 0x50, 0x7, 0xe0, 0x0, 0x4, 0xd0, + 0x0, 0xa7, 0x2, 0xf4, 0x0, 0x0, 0x3f, 0x0, + 0xc, 0x60, 0xc9, 0x0, 0x0, 0x0, 0xd7, 0x4, + 0xf1, 0x7e, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xe4, + 0x2f, 0x41, 0xae, 0xb2, 0x0, 0x0, 0x10, 0xc, + 0x90, 0xc9, 0x28, 0xe0, 0x0, 0x0, 0x6, 0xe1, + 0x3f, 0x0, 0xd, 0x50, 0x0, 0x2, 0xf4, 0x4, + 0xd0, 0x0, 0xa7, 0x0, 0x0, 0xba, 0x0, 0x3e, + 0x0, 0xc, 0x50, 0x0, 0x6e, 0x10, 0x0, 0xd7, + 0x5, 0xe1, 0x0, 0x1f, 0x50, 0x0, 0x2, 0xbf, + 0xc3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x4, 0xcf, 0xe9, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x57, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x8, 0xf1, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2f, 0xb3, 0xce, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x4e, 0xef, 0xb0, 0x0, 0x10, 0x0, 0x5f, 0xa0, + 0x6f, 0xb0, 0x1f, 0x50, 0xe, 0xc0, 0x0, 0x6f, + 0xb7, 0xf2, 0x2, 0xf8, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0xf, 0xd0, 0x0, 0x1, 0xdf, 0xb0, 0x0, + 0x8f, 0xe9, 0x8a, 0xfe, 0x8f, 0xb0, 0x0, 0x5c, + 0xff, 0xd9, 0x10, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xda, 0xd9, 0xd9, 0xc8, 0xc8, 0x0, + + /* U+0028 "(" */ + 0x0, 0x6f, 0x40, 0xd, 0xc0, 0x4, 0xf6, 0x0, + 0x9f, 0x10, 0xd, 0xd0, 0x0, 0xfb, 0x0, 0x2f, + 0x80, 0x3, 0xf7, 0x0, 0x4f, 0x60, 0x4, 0xf6, + 0x0, 0x3f, 0x70, 0x2, 0xf8, 0x0, 0xf, 0xb0, + 0x0, 0xdd, 0x0, 0x8, 0xf1, 0x0, 0x3f, 0x60, + 0x0, 0xdc, 0x0, 0x6, 0xf4, + + /* U+0029 ")" */ + 0x3f, 0x70, 0x0, 0xbe, 0x0, 0x5, 0xf5, 0x0, + 0x1f, 0xa0, 0x0, 0xce, 0x0, 0x9, 0xf1, 0x0, + 0x7f, 0x30, 0x6, 0xf4, 0x0, 0x5f, 0x50, 0x5, + 0xf5, 0x0, 0x6f, 0x40, 0x7, 0xf3, 0x0, 0x9f, + 0x10, 0xc, 0xe0, 0x1, 0xfa, 0x0, 0x5f, 0x50, + 0xb, 0xe0, 0x3, 0xf7, 0x0, + + /* U+002A "*" */ + 0x0, 0xe, 0x20, 0x3, 0x60, 0xe2, 0x56, 0x4d, + 0xdf, 0xce, 0x60, 0x1d, 0xff, 0x30, 0x4e, 0xcf, + 0xbf, 0x63, 0x60, 0xe2, 0x45, 0x0, 0xe, 0x20, + 0x0, + + /* U+002B "+" */ + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x8, 0xf0, 0x0, 0x1, 0x22, 0x9f, + 0x22, 0x20, 0xcf, 0xff, 0xff, 0xff, 0x44, 0x55, + 0xaf, 0x55, 0x51, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x0, + + /* U+002C "," */ + 0x1, 0x10, 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, + 0xb, 0x90, 0xe, 0x40, + + /* U+002D "-" */ + 0x88, 0x88, 0x7f, 0xff, 0xfe, + + /* U+002E "." */ + 0x5, 0x60, 0x1f, 0xf2, 0xc, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0xea, + 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x9, 0xe0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0xf, 0x90, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, 0x0, 0x6f, + 0xfb, 0xbf, 0xf6, 0x0, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0xa, 0xf3, 0x0, 0x0, 0x3f, 0xa0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0xf, 0xb0, + 0x0, 0x0, 0xb, 0xf0, 0x1f, 0xa0, 0x0, 0x0, + 0xa, 0xf1, 0xf, 0xb0, 0x0, 0x0, 0xb, 0xf0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0x9, 0xf3, + 0x0, 0x0, 0x3f, 0x90, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0x0, 0x6f, 0xfb, 0xbf, 0xf6, 0x0, + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xc8, 0xaa, 0xfc, 0x0, 0xf, 0xc0, + 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, + 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, + 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, + 0xc0, + + /* U+0032 "2" */ + 0x1, 0x8d, 0xfe, 0xc5, 0x0, 0x4f, 0xfd, 0xac, + 0xff, 0x70, 0x3c, 0x30, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x2, 0xee, 0x20, 0x0, 0x0, 0x2e, 0xf3, 0x0, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, 0xf3, + 0x0, 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, + 0xfc, 0xaa, 0xaa, 0xa7, 0x5f, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x5f, 0xff, 0xff, 0xff, 0xf0, 0x3a, 0xaa, 0xaa, + 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x0, 0x0, 0x4, 0xfe, 0x61, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xf2, + 0x0, 0x0, 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, + 0x6, 0xf6, 0x69, 0x10, 0x0, 0x1d, 0xf2, 0x9f, + 0xfc, 0xbc, 0xff, 0x80, 0x4, 0xae, 0xfe, 0xb5, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xc0, 0x3, 0xc5, 0x0, 0x0, 0xde, 0x10, 0x4, + 0xf7, 0x0, 0xb, 0xf4, 0x0, 0x4, 0xf7, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x39, 0x99, + 0x99, 0x9b, 0xfc, 0x98, 0x0, 0x0, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + + /* U+0035 "5" */ + 0x2, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xfc, 0xaa, + 0xaa, 0xa0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xf3, 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc7, 0x0, 0x7, 0xaa, + 0xab, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0x3, 0xfa, 0x3c, 0x20, 0x0, 0xb, 0xf6, 0x6f, + 0xfd, 0xbb, 0xef, 0xb0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x4, 0xef, + 0xca, 0xad, 0x90, 0x1, 0xee, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xfb, 0x2a, 0xef, 0xd7, + 0x0, 0x1f, 0xdf, 0xd9, 0x9d, 0xfb, 0x1, 0xff, + 0xa0, 0x0, 0xa, 0xf5, 0xf, 0xf2, 0x0, 0x0, + 0x3f, 0x90, 0xbf, 0x20, 0x0, 0x3, 0xf8, 0x4, + 0xfa, 0x0, 0x0, 0xaf, 0x40, 0x9, 0xfd, 0x99, + 0xdf, 0xa0, 0x0, 0x5, 0xcf, 0xfc, 0x60, 0x0, + + /* U+0037 "7" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0xaa, + 0xaa, 0xaf, 0xe0, 0x7f, 0x40, 0x0, 0x5, 0xf8, + 0x6, 0xf4, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x4f, 0x90, + 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2a, 0xef, 0xfc, 0x70, 0x0, 0x3f, 0xfb, + 0x89, 0xdf, 0xb0, 0xa, 0xf5, 0x0, 0x0, 0xbf, + 0x30, 0xbf, 0x10, 0x0, 0x8, 0xf4, 0x4, 0xfc, + 0x42, 0x26, 0xfd, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x10, 0x5, 0xfe, 0x85, 0x6a, 0xfd, 0x10, 0xee, + 0x10, 0x0, 0x7, 0xf8, 0x2f, 0xa0, 0x0, 0x0, + 0x1f, 0xb2, 0xfb, 0x0, 0x0, 0x2, 0xfb, 0xd, + 0xf4, 0x0, 0x0, 0xaf, 0x70, 0x3f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+0039 "9" */ + 0x0, 0x6c, 0xff, 0xc6, 0x0, 0x0, 0xaf, 0xd9, + 0x8c, 0xfa, 0x0, 0x3f, 0xb0, 0x0, 0x7, 0xf6, + 0x7, 0xf5, 0x0, 0x0, 0xf, 0xd0, 0x6f, 0x60, + 0x0, 0x2, 0xff, 0x11, 0xff, 0x51, 0x4, 0xdf, + 0xf2, 0x4, 0xef, 0xff, 0xfb, 0x9f, 0x30, 0x0, + 0x57, 0x73, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x3e, 0xf2, 0x0, 0x8e, 0xba, 0xcf, + 0xf5, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + + /* U+003A ":" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, + 0x1f, 0xf2, 0xc, 0xd0, + + /* U+003B ";" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, 0xb, 0x90, + 0xe, 0x40, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x1, 0x8e, + 0xf4, 0x0, 0x4b, 0xff, 0x93, 0x6, 0xdf, 0xc6, + 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x5, 0xcf, + 0xe7, 0x10, 0x0, 0x0, 0x39, 0xff, 0xb4, 0x0, + 0x0, 0x1, 0x6d, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x20, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0x46, 0x77, 0x77, 0x77, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x45, 0x55, 0x55, 0x55, 0x10, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0xc, 0xfb, 0x40, 0x0, + 0x0, 0x6, 0xcf, 0xe7, 0x10, 0x0, 0x0, 0x39, + 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, + 0x4b, 0xff, 0x91, 0x18, 0xef, 0xc6, 0x0, 0xc, + 0xfa, 0x30, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x2, 0x9d, 0xfe, 0xc5, 0x0, 0x4f, 0xfb, 0x9b, + 0xff, 0x80, 0x4c, 0x20, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xc0, 0x0, 0x0, 0x1, 0xcf, 0x30, 0x0, 0x0, + 0x1d, 0xf4, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcd, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xec, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc7, 0x54, 0x58, 0xdf, + 0x60, 0x0, 0x0, 0xc, 0xe4, 0x0, 0x0, 0x0, + 0x6, 0xf9, 0x0, 0x0, 0xae, 0x10, 0x3b, 0xef, + 0xb2, 0xbd, 0x3f, 0x60, 0x4, 0xf4, 0x4, 0xfe, + 0x97, 0xcf, 0xed, 0x6, 0xe0, 0xa, 0xc0, 0xe, + 0xe1, 0x0, 0x8, 0xfd, 0x0, 0xe5, 0xe, 0x60, + 0x4f, 0x60, 0x0, 0x0, 0xfd, 0x0, 0xa9, 0x1f, + 0x40, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, 0x8b, + 0x2f, 0x30, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, + 0x8b, 0x1f, 0x40, 0x3f, 0x60, 0x0, 0x0, 0xfd, + 0x0, 0x99, 0xe, 0x60, 0xe, 0xe1, 0x0, 0x8, + 0xfe, 0x0, 0xe5, 0xa, 0xc0, 0x4, 0xfe, 0x87, + 0xbf, 0xaf, 0x9b, 0xe0, 0x4, 0xf4, 0x0, 0x3b, + 0xff, 0xb3, 0x1b, 0xfc, 0x30, 0x0, 0x9e, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc7, 0x54, 0x6a, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xdb, 0x50, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x60, 0x4f, 0x70, 0x0, 0x0, 0x0, 0xb, + 0xe0, 0x0, 0xdd, 0x0, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x10, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xf8, 0x88, 0x88, + 0x88, 0xfa, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, + 0xb, 0xf1, 0x0, 0x5f, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0x80, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xfe, 0xb4, 0x0, 0x1f, 0xd8, + 0x88, 0x8a, 0xff, 0x70, 0x1f, 0xb0, 0x0, 0x0, + 0x2f, 0xf0, 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0x2f, 0xc0, 0x1f, 0xd8, + 0x88, 0x8a, 0xfe, 0x30, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x1f, 0xb0, 0x0, 0x1, 0x4d, 0xf3, + 0x1f, 0xb0, 0x0, 0x0, 0x4, 0xf9, 0x1f, 0xb0, + 0x0, 0x0, 0x2, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x8, 0xf8, 0x1f, 0xd8, 0x88, 0x89, 0xcf, 0xe1, + 0x1f, 0xff, 0xff, 0xff, 0xd9, 0x10, + + /* U+0043 "C" */ + 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x1, + 0xbf, 0xfc, 0xac, 0xff, 0xb0, 0x0, 0xbf, 0xb2, + 0x0, 0x1, 0x9c, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb2, 0x0, 0x1, 0xac, 0x10, + 0x1, 0xbf, 0xfc, 0xbc, 0xff, 0xb0, 0x0, 0x0, + 0x4b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x1, 0xfe, + 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x2b, 0xfa, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x3f, + 0xb1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xee, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xee, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xb1, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x2b, 0xfa, 0x1, + 0xfe, 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xfe, 0xaa, + 0xaa, 0xaa, 0x70, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xfd, 0x99, 0x99, 0x99, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xfe, 0xaa, 0xaa, + 0xaa, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xea, 0xaa, + 0xaa, 0xa7, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xe9, 0x99, 0x99, 0x90, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x1, + 0xbf, 0xfc, 0xbb, 0xff, 0xc1, 0x0, 0xbf, 0xb2, + 0x0, 0x0, 0x7d, 0x10, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x39, 0x30, 0xfc, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x6, + 0xf5, 0x0, 0xbf, 0xb2, 0x0, 0x0, 0x9f, 0x50, + 0x0, 0xaf, 0xfd, 0xbc, 0xff, 0xd2, 0x0, 0x0, + 0x4a, 0xef, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xea, + 0xaa, 0xaa, 0xaa, 0xfb, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + + /* U+0049 "I" */ + 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, + 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, + 0xb1, 0xfb, 0x1f, 0xb0, + + /* U+004A "J" */ + 0x0, 0xef, 0xff, 0xff, 0x70, 0x8, 0xaa, 0xab, + 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, + 0x70, 0x0, 0x0, 0x6, 0xf6, 0xa, 0x70, 0x0, + 0xcf, 0x30, 0xcf, 0xda, 0xdf, 0xc0, 0x0, 0x8d, + 0xfe, 0x90, 0x0, + + /* U+004B "K" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xe2, 0x1f, 0xb0, + 0x0, 0x1, 0xdf, 0x30, 0x1f, 0xb0, 0x0, 0xc, + 0xf4, 0x0, 0x1f, 0xb0, 0x0, 0xbf, 0x50, 0x0, + 0x1f, 0xb0, 0xb, 0xf7, 0x0, 0x0, 0x1f, 0xb0, + 0xaf, 0x80, 0x0, 0x0, 0x1f, 0xb9, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xf8, 0x0, 0x0, + 0x1f, 0xfb, 0x1, 0xdf, 0x50, 0x0, 0x1f, 0xd0, + 0x0, 0x2f, 0xf2, 0x0, 0x1f, 0xb0, 0x0, 0x4, + 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, 0x7f, 0xb0, + 0x1f, 0xb0, 0x0, 0x0, 0x9, 0xf8, + + /* U+004C "L" */ + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xea, 0xaa, 0xaa, 0xa5, 0x1f, 0xff, 0xff, 0xff, + 0xf8, + + /* U+004D "M" */ + 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x41, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x41, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xfe, 0xf4, 0x1f, 0xad, + 0xe0, 0x0, 0x0, 0xbe, 0x8f, 0x41, 0xfa, 0x4f, + 0x80, 0x0, 0x4f, 0x67, 0xf4, 0x1f, 0xa0, 0xaf, + 0x20, 0xd, 0xd0, 0x7f, 0x41, 0xfa, 0x2, 0xfa, + 0x7, 0xf4, 0x7, 0xf4, 0x1f, 0xa0, 0x8, 0xf5, + 0xea, 0x0, 0x7f, 0x41, 0xfa, 0x0, 0xe, 0xff, + 0x20, 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x5f, 0x80, + 0x0, 0x6f, 0x41, 0xfa, 0x0, 0x0, 0x60, 0x0, + 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x40, + + /* U+004E "N" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xf8, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xff, 0x50, 0x0, + 0x1, 0xfb, 0x1f, 0xdf, 0xf2, 0x0, 0x1, 0xfb, + 0x1f, 0xb6, 0xfd, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x9f, 0xa0, 0x1, 0xfb, 0x1f, 0xb0, 0xc, 0xf6, + 0x1, 0xfb, 0x1f, 0xb0, 0x1, 0xef, 0x31, 0xfb, + 0x1f, 0xb0, 0x0, 0x4f, 0xe2, 0xfb, 0x1f, 0xb0, + 0x0, 0x7, 0xfd, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0xbf, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x2, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf2, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0x80, 0x0, 0xbf, 0xb2, 0x0, 0x1, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xfc, 0xbc, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xf0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xea, 0xaa, 0xbe, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x7f, 0xa0, 0x0, 0x0, + 0x0, 0x8f, 0x80, 0x0, 0xcf, 0xa1, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xcf, 0xfb, 0xab, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6c, 0xef, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe6, 0x34, + 0xa7, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xe0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xd9, 0x99, 0xae, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xb0, + 0x0, 0x1f, 0xd0, 0x0, 0x1f, 0xb0, 0x0, 0x6, + 0xf9, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0xbf, 0x40, + 0x1f, 0xb0, 0x0, 0x0, 0x1e, 0xe0, + + /* U+0053 "S" */ + 0x0, 0x29, 0xdf, 0xfd, 0x81, 0x0, 0x3f, 0xfc, + 0x9a, 0xdf, 0xc0, 0xb, 0xf4, 0x0, 0x0, 0x23, + 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x61, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x0, 0x48, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf6, 0xb, + 0x50, 0x0, 0x0, 0xcf, 0x31, 0xdf, 0xeb, 0x9a, + 0xef, 0x90, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0x89, 0xaa, 0xad, + 0xfb, 0xaa, 0xa5, 0x0, 0x0, 0x9f, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, + 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf6, + 0x2f, 0xb0, 0x0, 0x0, 0x7, 0xf5, 0xe, 0xf0, + 0x0, 0x0, 0xb, 0xf2, 0x8, 0xfa, 0x0, 0x0, + 0x7f, 0xb0, 0x0, 0xcf, 0xfb, 0xbe, 0xfe, 0x20, + 0x0, 0x7, 0xcf, 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xf9, 0x6, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x7f, 0x50, 0x0, 0x1f, 0xd0, 0x0, + 0x0, 0xee, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x3, 0xfb, 0x0, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0xdf, 0x20, 0x2f, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0x80, 0x9f, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xe1, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0x90, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x2, 0xf8, 0xe, 0xe0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x8, 0xf3, 0x9, 0xf3, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0xd, 0xd0, 0x4, 0xf8, + 0x0, 0x0, 0xcd, 0x8f, 0x20, 0x0, 0x2f, 0x80, + 0x0, 0xfe, 0x0, 0x2, 0xf8, 0x3f, 0x80, 0x0, + 0x7f, 0x30, 0x0, 0xaf, 0x30, 0x7, 0xf3, 0xe, + 0xd0, 0x0, 0xde, 0x0, 0x0, 0x5f, 0x80, 0xc, + 0xd0, 0x8, 0xf2, 0x2, 0xf9, 0x0, 0x0, 0xf, + 0xd0, 0x2f, 0x80, 0x3, 0xf7, 0x7, 0xf4, 0x0, + 0x0, 0xa, 0xf2, 0x7f, 0x30, 0x0, 0xed, 0xc, + 0xe0, 0x0, 0x0, 0x5, 0xf7, 0xdd, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xfe, 0xf8, + 0x0, 0x0, 0x3f, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x2f, 0xd0, 0x0, 0x0, 0xb, 0xf3, 0x6, 0xfa, + 0x0, 0x0, 0x7f, 0x70, 0x0, 0xbf, 0x50, 0x2, + 0xfc, 0x0, 0x0, 0x1e, 0xe1, 0xd, 0xf2, 0x0, + 0x0, 0x5, 0xfb, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, + 0x0, 0x9, 0xf6, 0x5f, 0xa0, 0x0, 0x0, 0x4f, + 0xb0, 0xa, 0xf6, 0x0, 0x1, 0xee, 0x10, 0x1, + 0xef, 0x20, 0xb, 0xf5, 0x0, 0x0, 0x4f, 0xc0, + 0x6f, 0xa0, 0x0, 0x0, 0x8, 0xf8, + + /* U+0059 "Y" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0x60, 0x3f, + 0xb0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x9f, 0x50, + 0x0, 0x8, 0xf3, 0x0, 0x1, 0xee, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x6, 0xf8, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0xc, 0xf1, 0x4f, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xbd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xa, 0xaa, + 0xaa, 0xaa, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x20, 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfb, 0xaa, 0xaa, 0xaa, 0xa2, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+005B "[" */ + 0x1f, 0xff, 0xa1, 0xfc, 0x74, 0x1f, 0xa0, 0x1, + 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, + 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, + 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, + 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, + 0x1f, 0xc7, 0x41, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x47, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0xa, 0xe0, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0xea, + + /* U+005D "]" */ + 0xaf, 0xff, 0x14, 0x7c, 0xf1, 0x0, 0xaf, 0x10, + 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, + 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, + 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, + 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, + 0x47, 0xcf, 0x1a, 0xff, 0xf1, + + /* U+005E "^" */ + 0x0, 0xa, 0xf2, 0x0, 0x0, 0x1, 0xfe, 0x90, + 0x0, 0x0, 0x7d, 0x5e, 0x0, 0x0, 0xd, 0x70, + 0xf5, 0x0, 0x4, 0xf1, 0x9, 0xc0, 0x0, 0xab, + 0x0, 0x3f, 0x20, 0x1f, 0x50, 0x0, 0xd8, 0x7, + 0xe0, 0x0, 0x6, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x22, 0x22, 0x22, + 0x22, + + /* U+0060 "`" */ + 0x48, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x7f, 0x40, + + /* U+0061 "a" */ + 0x1, 0x7c, 0xff, 0xd6, 0x0, 0x9, 0xfc, 0x99, + 0xef, 0x80, 0x1, 0x30, 0x0, 0xd, 0xf0, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x1, 0x9e, 0xff, 0xff, + 0xf3, 0xa, 0xf8, 0x43, 0x3a, 0xf3, 0xf, 0xb0, + 0x0, 0x8, 0xf3, 0xf, 0xb0, 0x0, 0xe, 0xf3, + 0x9, 0xf9, 0x46, 0xdf, 0xf3, 0x0, 0x8d, 0xfe, + 0x87, 0xf3, + + /* U+0062 "b" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x56, + 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfc, 0x9b, 0xff, + 0x30, 0x5f, 0xf5, 0x0, 0x4, 0xfe, 0x5, 0xfa, + 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, 0x0, 0x0, + 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, 0xf7, 0x5f, + 0xa0, 0x0, 0x0, 0x8f, 0x45, 0xff, 0x50, 0x0, + 0x4f, 0xe0, 0x5f, 0xcf, 0xc9, 0xbf, 0xf3, 0x5, + 0xf4, 0x6d, 0xfe, 0xa2, 0x0, + + /* U+0063 "c" */ + 0x0, 0x7, 0xdf, 0xeb, 0x30, 0x0, 0xcf, 0xd9, + 0xaf, 0xf4, 0x9, 0xf7, 0x0, 0x2, 0xc3, 0xf, + 0xd0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xf, 0xc0, + 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xc3, + 0x0, 0xcf, 0xd9, 0xaf, 0xf3, 0x0, 0x7, 0xdf, + 0xeb, 0x30, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xfa, 0x0, 0x8, + 0xdf, 0xe8, 0x2f, 0xa0, 0x1d, 0xfd, 0x9b, 0xfd, + 0xfa, 0xa, 0xf8, 0x0, 0x2, 0xef, 0xa0, 0xfd, + 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, 0x0, 0x0, + 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, 0xfa, 0xf, + 0xc0, 0x0, 0x0, 0x5f, 0xa0, 0xaf, 0x60, 0x0, + 0x1e, 0xfa, 0x1, 0xdf, 0xb7, 0x9e, 0xdf, 0xa0, + 0x0, 0x8d, 0xfe, 0x91, 0xfa, + + /* U+0065 "e" */ + 0x0, 0x8, 0xdf, 0xe9, 0x10, 0x0, 0x1d, 0xfb, + 0x8a, 0xfe, 0x20, 0xa, 0xf3, 0x0, 0x3, 0xfb, + 0x0, 0xfa, 0x0, 0x0, 0x9, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfa, 0x33, 0x33, 0x33, + 0x30, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x90, 0x0, 0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, + 0xf6, 0x0, 0x0, 0x7d, 0xff, 0xc5, 0x0, + + /* U+0066 "f" */ + 0x0, 0x1a, 0xee, 0x90, 0xa, 0xf9, 0x88, 0x0, + 0xfb, 0x0, 0x0, 0x1f, 0x90, 0x0, 0xbf, 0xff, + 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x8, 0xdf, 0xe9, 0x1e, 0xc0, 0x1d, 0xfd, + 0x9b, 0xfe, 0xec, 0xa, 0xf8, 0x0, 0x1, 0xdf, + 0xc0, 0xfd, 0x0, 0x0, 0x4, 0xfc, 0x3f, 0x90, + 0x0, 0x0, 0xf, 0xc3, 0xf8, 0x0, 0x0, 0x0, + 0xfc, 0xf, 0xd0, 0x0, 0x0, 0x4f, 0xc0, 0xaf, + 0x80, 0x0, 0x1d, 0xfc, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xc0, 0x0, 0x8d, 0xfe, 0x91, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x90, 0x27, 0x0, 0x0, + 0xb, 0xf4, 0x7, 0xff, 0xb9, 0xae, 0xfa, 0x0, + 0x4, 0xae, 0xff, 0xc6, 0x0, + + /* U+0068 "h" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5f, 0x56, 0xdf, 0xea, + 0x10, 0x5f, 0xef, 0xca, 0xdf, 0xd0, 0x5f, 0xf4, + 0x0, 0xa, 0xf6, 0x5f, 0x90, 0x0, 0x2, 0xf9, + 0x5f, 0x60, 0x0, 0x0, 0xfa, 0x5f, 0x50, 0x0, + 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, + 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, + 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + + /* U+0069 "i" */ + 0x6f, 0x69, 0xf9, 0x4, 0x0, 0x0, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006A "j" */ + 0x0, 0x4, 0xf7, 0x0, 0x7, 0xfa, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, + 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, + 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x6, 0xf5, + 0x4b, 0x9f, 0xe1, 0x5e, 0xfc, 0x30, + + /* U+006B "k" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x50, + 0x0, 0x1d, 0xf3, 0x5, 0xf5, 0x0, 0x2d, 0xf3, + 0x0, 0x5f, 0x50, 0x2e, 0xf4, 0x0, 0x5, 0xf5, + 0x2e, 0xf4, 0x0, 0x0, 0x5f, 0x9e, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xfa, 0x0, 0x0, 0x5f, + 0xe3, 0xc, 0xf6, 0x0, 0x5, 0xf6, 0x0, 0x1e, + 0xf3, 0x0, 0x5f, 0x50, 0x0, 0x4f, 0xd0, 0x5, + 0xf5, 0x0, 0x0, 0x7f, 0xa0, + + /* U+006C "l" */ + 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006D "m" */ + 0x5f, 0x58, 0xdf, 0xe8, 0x0, 0x8d, 0xfe, 0x80, + 0x5, 0xfe, 0xfa, 0x9d, 0xfb, 0xdf, 0xa9, 0xdf, + 0xb0, 0x5f, 0xf2, 0x0, 0xd, 0xff, 0x30, 0x0, + 0xcf, 0x35, 0xf9, 0x0, 0x0, 0x7f, 0xa0, 0x0, + 0x6, 0xf6, 0x5f, 0x60, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, + 0x60, 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, + 0xf6, 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, + 0x5f, 0x60, 0x0, 0x4, 0xf7, + + /* U+006E "n" */ + 0x5f, 0x57, 0xdf, 0xea, 0x10, 0x5f, 0xef, 0xa8, + 0xcf, 0xd0, 0x5f, 0xf3, 0x0, 0x9, 0xf6, 0x5f, + 0x90, 0x0, 0x2, 0xf9, 0x5f, 0x60, 0x0, 0x0, + 0xfa, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, + 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, + 0x0, 0xfb, + + /* U+006F "o" */ + 0x0, 0x7, 0xdf, 0xea, 0x30, 0x0, 0xd, 0xfd, + 0x9a, 0xff, 0x50, 0x9, 0xf7, 0x0, 0x2, 0xef, + 0x10, 0xfd, 0x0, 0x0, 0x6, 0xf7, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0x93, 0xf8, 0x0, 0x0, 0x2, + 0xf9, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0x60, 0x9f, + 0x80, 0x0, 0x2e, 0xf1, 0x0, 0xcf, 0xd9, 0xaf, + 0xf4, 0x0, 0x0, 0x7d, 0xfe, 0xa3, 0x0, + + /* U+0070 "p" */ + 0x5f, 0x46, 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfa, + 0x8a, 0xff, 0x30, 0x5f, 0xf4, 0x0, 0x3, 0xfe, + 0x5, 0xfa, 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, + 0x0, 0x0, 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, + 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x9f, 0x45, 0xff, + 0x50, 0x0, 0x4f, 0xe0, 0x5f, 0xdf, 0xc9, 0xbf, + 0xf3, 0x5, 0xf5, 0x6d, 0xfe, 0xa2, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8, 0xdf, 0xe8, 0x1f, 0xa0, 0x1d, 0xfd, + 0x9b, 0xfc, 0xfa, 0xa, 0xf7, 0x0, 0x2, 0xef, + 0xa0, 0xfd, 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0xa0, 0xaf, + 0x80, 0x0, 0x2e, 0xfa, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xa0, 0x0, 0x8d, 0xfe, 0x82, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xfa, + + /* U+0072 "r" */ + 0x5f, 0x46, 0xdb, 0x5f, 0xcf, 0xd9, 0x5f, 0xf5, + 0x0, 0x5f, 0xa0, 0x0, 0x5f, 0x70, 0x0, 0x5f, + 0x50, 0x0, 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + + /* U+0073 "s" */ + 0x1, 0x8d, 0xfe, 0xc7, 0x0, 0xcf, 0xb8, 0xad, + 0xd0, 0x3f, 0x90, 0x0, 0x1, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb8, 0x40, 0x0, 0x5, + 0x9c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x50, 0x0, 0x5, 0xf7, 0x5f, 0xea, 0x9a, 0xfe, + 0x10, 0x6c, 0xef, 0xd9, 0x20, + + /* U+0074 "t" */ + 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0xbf, + 0xff, 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, + 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0xbf, 0xa9, 0x90, 0x1, + 0xbe, 0xe9, + + /* U+0075 "u" */ + 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, + 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, + 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, + 0xf8, 0x7f, 0x40, 0x0, 0x4, 0xf8, 0x6f, 0x60, + 0x0, 0x6, 0xf8, 0x2f, 0xc0, 0x0, 0x1e, 0xf8, + 0xa, 0xfd, 0x89, 0xee, 0xf8, 0x0, 0x8d, 0xfe, + 0x92, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0xaf, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xf9, 0x0, + 0x0, 0x2f, 0x90, 0x7, 0xf3, 0x0, 0x0, 0xb, + 0xf0, 0xe, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0xed, 0xbe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf1, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbe, 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0xae, + 0x5, 0xf4, 0x0, 0x2, 0xff, 0x60, 0x0, 0xf, + 0x80, 0xf, 0x90, 0x0, 0x8f, 0xeb, 0x0, 0x5, + 0xf2, 0x0, 0xae, 0x0, 0xd, 0xb8, 0xf1, 0x0, + 0xbd, 0x0, 0x4, 0xf4, 0x3, 0xf5, 0x2f, 0x70, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x9e, 0x0, 0xcc, + 0x6, 0xf1, 0x0, 0x0, 0x9f, 0x1e, 0x90, 0x6, + 0xf2, 0xcc, 0x0, 0x0, 0x3, 0xfa, 0xf3, 0x0, + 0x1f, 0xaf, 0x60, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x5, 0xfb, 0x0, 0x0, + + /* U+0078 "x" */ + 0x3f, 0xb0, 0x0, 0xc, 0xf2, 0x7, 0xf7, 0x0, + 0x7f, 0x60, 0x0, 0xbf, 0x33, 0xfa, 0x0, 0x0, + 0x1e, 0xde, 0xd0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xbc, 0xf2, 0x0, 0x0, 0xde, 0x12, 0xfc, 0x0, + 0xa, 0xf4, 0x0, 0x5f, 0x90, 0x6f, 0x80, 0x0, + 0xa, 0xf5, + + /* U+0079 "y" */ + 0xd, 0xe0, 0x0, 0x0, 0xc, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xfa, 0x0, + 0x0, 0x2f, 0x90, 0x6, 0xf3, 0x0, 0x0, 0xc, + 0xf0, 0xd, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xed, 0xae, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x1, 0x0, 0x7f, 0x40, 0x0, 0x0, + 0x1f, 0xaa, 0xfb, 0x0, 0x0, 0x0, 0x19, 0xee, + 0xa1, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0x91, 0x77, 0x77, 0x7e, + 0xf4, 0x0, 0x0, 0x6, 0xf8, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x0, 0x1e, 0xf8, 0x77, 0x77, + 0x54, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x7e, 0xf0, 0x3f, 0xd7, 0x7, 0xf4, 0x0, + 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x8f, 0x30, 0x8, + 0xf3, 0x0, 0x9f, 0x20, 0x8e, 0xe0, 0xf, 0xfa, + 0x0, 0xb, 0xf2, 0x0, 0x8f, 0x30, 0x8, 0xf3, + 0x0, 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x7f, 0x40, + 0x4, 0xfd, 0x70, 0x8, 0xef, + + /* U+007C "|" */ + 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, + 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, + 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, + 0x1f, 0x71, 0xf7, + + /* U+007D "}" */ + 0xaf, 0xa1, 0x0, 0x4b, 0xf9, 0x0, 0x0, 0xed, + 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, + 0x0, 0xaf, 0x92, 0x0, 0x5f, 0xf4, 0x0, 0xcf, + 0x10, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xed, 0x0, + 0x4a, 0xf9, 0x0, 0xaf, 0xb1, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x1, 0x1, 0xdf, 0xc1, 0x0, + 0xc5, 0xac, 0x5c, 0xe3, 0x4f, 0x2d, 0x40, 0x9, + 0xff, 0x90, 0x30, 0x0, 0x2, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x1, 0xaf, 0xd5, 0x0, 0xb8, 0x3, 0xe4, 0x1e, + 0x0, 0x6, 0xa2, 0xe0, 0x0, 0x6a, 0xc, 0x70, + 0x1d, 0x50, 0x2c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x5, 0x30, 0x9f, 0xf3, 0xcf, 0xf6, 0x4e, 0xc1, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x3f, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x95, 0x0, + 0x1, 0xff, 0x20, 0x0, 0x5, 0xff, 0x73, 0x0, + 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x20, 0x0, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x20, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, 0x69, + 0x8f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x3, 0x58, 0xfe, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x2d, 0xff, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0xb, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x4, 0xbd, 0xc8, 0x10, + 0xaf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x51, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, + 0x15, 0xf7, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x8f, 0xfd, 0xcf, 0xf3, 0x33, 0x33, 0x33, + 0x6f, 0xec, 0xdf, 0xf2, 0xc, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0xf2, 0xc, 0xe0, 0x0, + 0x0, 0x0, 0x3f, 0x80, 0x2f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x2d, + 0xf9, 0x99, 0x99, 0x99, 0xbf, 0x92, 0x4f, 0xf2, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x2f, + 0xfb, 0xaf, 0xf1, 0x11, 0x11, 0x11, 0x5f, 0xda, + 0xbf, 0xf9, 0x8e, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xc8, 0x9f, 0xf2, 0xc, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x2f, 0xf6, 0x4d, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xa4, 0x6f, 0xfe, 0xef, 0xfb, 0xbb, + 0xbb, 0xbb, 0xcf, 0xfe, 0xef, 0xc2, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2c, + + /* U+F00B "" */ + 0x58, 0x88, 0x70, 0x28, 0x88, 0x88, 0x88, 0x88, + 0x85, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd1, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x58, 0x88, 0x60, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x85, 0x47, 0x77, 0x50, 0x17, 0x77, + 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x90, 0x9, 0xd2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x9f, 0xfe, + 0x20, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x28, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x2d, 0xb0, 0x0, 0x0, 0x6, 0xe6, 0xd, 0xff, + 0xc0, 0x0, 0x6, 0xff, 0xf3, 0xcf, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xc7, 0xff, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0xdf, + 0xff, 0xc0, 0x6, 0xff, 0xff, 0x51, 0xdf, 0xff, + 0xc0, 0xff, 0xff, 0x50, 0x1, 0xdf, 0xff, 0x58, + 0xff, 0x50, 0x0, 0x1, 0xdf, 0xd0, 0x5, 0x30, + 0x0, 0x0, 0x1, 0x61, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0xcd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe3, 0x3, 0xff, + 0xa0, 0xb, 0xc1, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x3f, 0xfa, 0x4, 0xff, 0xd1, 0x0, 0x4, 0xff, + 0xf6, 0x3, 0xff, 0xa0, 0x1e, 0xff, 0xa0, 0x0, + 0xdf, 0xf7, 0x0, 0x3f, 0xfa, 0x0, 0x2e, 0xff, + 0x40, 0x3f, 0xfc, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x6f, 0xfa, 0x8, 0xff, 0x60, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf2, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x1b, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xbf, 0xf1, 0x9f, + 0xf3, 0x0, 0x0, 0x24, 0x0, 0x0, 0xd, 0xff, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x9f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xfe, + 0x71, 0x0, 0x4, 0xcf, 0xff, 0x50, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xfd, 0xa5, + 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x17, 0xff, 0xff, + 0xff, 0x71, 0x87, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, 0xff, + 0xff, 0xfe, 0x88, 0xef, 0xff, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xfc, 0x10, 0x3e, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xe3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe8, 0xfd, 0x0, 0x0, + 0x11, 0x1, 0x9f, 0xff, 0xf9, 0x10, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xee, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0x92, 0x0, 0x6b, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xe4, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf6, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x31, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x25, 0x70, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x1, 0xbf, 0xfa, + 0x8, 0xff, 0xb0, 0x7f, 0xff, 0x40, 0x0, 0x2, + 0xdf, 0xf8, 0xa, 0xff, 0xff, 0xd2, 0x5f, 0xff, + 0x50, 0x4, 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, + 0xe4, 0x2e, 0xff, 0x70, 0xdf, 0xe3, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1c, 0xff, 0x13, 0xb1, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, + 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x88, 0xbf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x3f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x3, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x2f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x9, 0xaa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xc0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, 0x7, + 0xff, 0x70, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xc1, 0x66, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x10, 0x6f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfa, 0xe, 0xff, 0xcc, 0xcc, 0x20, 0x0, 0x0, + 0xbc, 0xcc, 0xef, 0xf2, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x15, 0x66, 0x40, 0x0, 0x5, + 0xcb, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0x92, + 0x7, 0xff, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x66, 0xff, 0x0, 0x8f, 0xff, 0xa4, 0x12, + 0x5b, 0xff, 0xfd, 0xff, 0x4, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x45, 0x46, 0xff, 0xff, 0x4f, 0xf7, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x77, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x6, 0x73, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x3f, 0xf6, 0xff, 0xff, 0xee, 0xfd, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x2, 0xbf, 0xfe, 0x10, 0xff, + 0x8d, 0xff, 0xfc, 0xa9, 0xcf, 0xff, 0xe2, 0x0, + 0xff, 0x61, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0xff, 0x70, 0x1, 0x7c, 0xee, 0xd9, 0x30, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, 0x3, + 0xef, 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, 0x7b, 0xbb, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x70, 0x8b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x40, 0x0, 0x0, 0x2d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0x0, 0x0, 0x40, 0x1c, + 0xf4, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x5f, 0xb0, 0x1e, 0xe1, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x0, 0x0, 0xaf, 0xa0, 0x6f, 0x70, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0x10, 0xbf, 0x30, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xfd, + 0x3, 0xf9, 0xa, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xf5, 0xe, 0xc0, 0x8f, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0x70, 0xdd, 0x7, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1d, 0xf3, + 0xf, 0xb0, 0x9f, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x3, 0xf7, 0x7, 0xf6, 0xc, 0xf0, 0x7b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x3, 0xfe, 0x12, 0xfa, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x3, 0xff, + 0x40, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x0, 0x3c, 0x30, 0x6f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0x0, + + /* U+F03E "" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xd5, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xf5, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x0, 0xaf, 0x50, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x74, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F043 "" */ + 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0x2c, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xf0, 0x7f, 0xf2, 0x5c, 0xff, 0xff, + 0xfb, 0x0, 0xef, 0xe5, 0x8, 0xff, 0xff, 0x30, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x1, + 0xaf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x31, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x6b, 0x90, 0x0, 0x0, 0x3, 0xa2, 0x9f, 0xe0, + 0x0, 0x0, 0x4f, 0xf9, 0x9f, 0xe0, 0x0, 0x5, + 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x6f, 0xff, 0xfa, + 0x9f, 0xe0, 0x7, 0xff, 0xff, 0xfa, 0x9f, 0xe0, + 0x8f, 0xff, 0xff, 0xfa, 0x9f, 0xe9, 0xff, 0xff, + 0xff, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xfe, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xe1, 0xdf, 0xff, + 0xff, 0xfa, 0x9f, 0xe0, 0x1c, 0xff, 0xff, 0xfa, + 0x9f, 0xe0, 0x0, 0xbf, 0xff, 0xfa, 0x9f, 0xe0, + 0x0, 0xa, 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x0, + 0x9f, 0xfa, 0x9f, 0xe0, 0x0, 0x0, 0x8, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x3a, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x3a, 0xbb, 0xb9, 0x10, 0x3, 0xab, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x4a, 0x20, 0x0, 0x0, 0xa, 0xb4, 0xbf, 0xe3, + 0x0, 0x0, 0xf, 0xf8, 0xcf, 0xff, 0x40, 0x0, + 0xf, 0xf8, 0xcf, 0xff, 0xf5, 0x0, 0xf, 0xf8, + 0xcf, 0xff, 0xff, 0x60, 0xf, 0xf8, 0xcf, 0xff, + 0xff, 0xf7, 0xf, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xdf, 0xf8, 0xcf, 0xff, 0xff, 0xfc, + 0x1f, 0xf8, 0xcf, 0xff, 0xff, 0xb0, 0xf, 0xf8, + 0xcf, 0xff, 0xfa, 0x0, 0xf, 0xf8, 0xcf, 0xff, + 0x80, 0x0, 0xf, 0xf8, 0xbf, 0xf7, 0x0, 0x0, + 0xf, 0xf8, 0x7f, 0x60, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2, 0xca, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x10, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3c, 0x60, + + /* U+F054 "" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3d, 0x50, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x39, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x36, 0x77, 0x77, 0xef, 0xfc, 0x77, 0x77, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x3, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xfd, 0x63, 0x25, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xfd, 0x0, 0x8, 0xfc, + 0x20, 0x9f, 0xff, 0xa0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x8f, 0xfe, 0x12, 0xff, 0xff, 0x60, 0xcf, + 0xff, 0xf2, 0x16, 0x7f, 0xff, 0xf5, 0xe, 0xff, + 0xfe, 0x1e, 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xf2, 0x6f, 0xff, 0xf3, 0xe, + 0xff, 0xff, 0xf3, 0xf, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0x90, 0x4f, 0xff, 0xf8, 0x5, 0xff, 0xfe, + 0x10, 0x1, 0xdf, 0xff, 0x40, 0x28, 0x84, 0x1, + 0xef, 0xff, 0x30, 0x0, 0x1, 0xbf, 0xff, 0x60, + 0x0, 0x4, 0xef, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xfb, 0xbe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x4a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x15, 0x78, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xa6, 0xdf, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe8, 0x32, 0x5b, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x10, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf8, 0x7f, 0xd3, 0x9, 0xff, 0xfb, 0x0, + 0x0, 0x1e, 0x70, 0x1, 0xbf, 0xfe, 0xff, 0xf2, + 0x1f, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xdf, 0xff, 0xf1, 0x0, + 0xcf, 0xff, 0xd1, 0x0, 0x5f, 0xff, 0xf9, 0xc, + 0xff, 0xff, 0x30, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x2d, 0xff, 0xb0, 0xef, 0xff, 0xb0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x10, 0x0, 0x3, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xcb, 0x80, + 0x1, 0xbf, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xdf, 0xfe, 0x70, 0x0, 0x8f, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x33, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x42, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf9, 0x0, 0x12, 0x22, 0x10, 0x0, 0x0, 0x1, + 0x29, 0xff, 0x90, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x20, + 0x5, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xad, 0xff, + 0xd0, 0x5f, 0xff, 0xbd, 0xff, 0xe2, 0x0, 0x0, + 0xcf, 0x44, 0xff, 0xf9, 0x8, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0x4f, 0xff, 0x90, 0x4, 0xd2, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa1, 0x91, 0x6, + 0xf6, 0x0, 0x0, 0x2, 0xef, 0xfb, 0xc, 0xfc, + 0x8, 0xff, 0x60, 0xef, 0xff, 0xff, 0xb0, 0x1d, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xb0, + 0x0, 0x0, 0x2d, 0xde, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xcf, 0xfe, 0x30, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xc, 0xff, 0xe3, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xfe, 0x30, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, + 0x1b, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, + + /* U+F078 "" */ + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x6f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0x5, 0xff, 0xf6, + 0x1c, 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x1, 0xcf, 0xfe, 0x30, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x1c, 0xff, 0xe3, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x90, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xa0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xe, 0xfd, 0xef, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0xb, 0xe2, 0xdf, 0x67, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x4, + 0x15, 0xfe, 0x3, 0x20, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x6f, 0xd6, 0xfe, 0x4f, 0xf1, + 0x0, 0x0, 0xdf, 0x94, 0x44, 0x44, 0x41, 0x3f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, + + /* U+F07B "" */ + 0x17, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x44, + 0x44, 0x44, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x11, 0x2f, 0xff, 0xf7, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x42, 0x1f, + 0xff, 0xf6, 0x24, 0x44, 0x42, 0xff, 0xff, 0xfc, + 0x8, 0xbb, 0xa2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x55, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x4, 0xa5, 0x0, 0x0, 0xaf, 0xff, + 0xd0, 0x0, 0x0, 0x7d, 0xff, 0xf4, 0x2, 0xcf, + 0xff, 0xe2, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xe9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x35, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfa, 0x0, 0x0, 0x1, 0x9c, 0xa1, + 0xaf, 0xfe, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xf9, + 0xef, 0x60, 0xaf, 0xb0, 0x3, 0xef, 0xff, 0xb0, + 0xef, 0x92, 0xcf, 0x90, 0x3e, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xa0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x36, 0xef, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xaf, 0xfe, 0xff, 0xc2, 0xdf, 0xff, 0xd1, 0x0, + 0xef, 0x60, 0xaf, 0xa0, 0x1c, 0xff, 0xfd, 0x20, + 0xef, 0x92, 0xcf, 0xa0, 0x0, 0xcf, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf9, + 0x8, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x58, 0x50, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x68, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0xf8, + 0x36, 0x62, 0xaf, 0xff, 0xff, 0xf1, 0x36, 0x66, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xf6, 0x22, 0x22, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x5, 0x66, 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xef, 0xf9, 0x0, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xc5, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0x93, 0x4d, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa1, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3d, 0xfe, 0x42, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x26, 0xff, 0xff, + 0xf9, 0x19, 0xff, 0xff, 0xff, 0x91, 0xbf, 0xff, + 0xff, 0xff, 0xd3, 0x5f, 0xff, 0xe5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0x99, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F0E7 "" */ + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa5, 0x55, 0x40, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x22, 0x23, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x8d, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbc, 0xfa, 0xfd, 0xbb, 0x90, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x95, 0xff, 0xff, 0xf1, 0x79, 0x0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xb0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xfa, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf2, 0x2, 0x21, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xdd, 0xdc, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7a, 0xaa, 0x58, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xf4, 0x4, 0xd0, 0x2f, 0x0, 0xf3, 0x3, 0xf0, + 0xf, 0xf4, 0xff, 0x40, 0x5d, 0x2, 0xf0, 0xf, + 0x40, 0x4f, 0x0, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0x22, 0xb7, 0x29, 0xa2, 0x4f, 0x42, 0xcf, + 0xff, 0x4f, 0xff, 0xf0, 0xa, 0x60, 0x79, 0x2, + 0xf2, 0xb, 0xff, 0xf4, 0xff, 0xff, 0xdd, 0xfe, + 0xdf, 0xfd, 0xef, 0xed, 0xff, 0xff, 0x4f, 0xf8, + 0x48, 0xe4, 0x44, 0x44, 0x44, 0x47, 0xf4, 0x5f, + 0xf4, 0xff, 0x40, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0xff, 0x4f, 0xf7, 0x48, 0xe4, 0x44, + 0x44, 0x44, 0x47, 0xf4, 0x4f, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x56, + 0x66, 0x66, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x58, 0x88, 0x88, 0x87, 0x6, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0xf, 0x90, 0x0, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xfe, 0xf, 0xff, 0x90, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x32, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0x89, 0xa9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x6, 0xff, + 0xff, 0xfc, 0x75, 0x43, 0x46, 0x9e, 0xff, 0xff, + 0xb1, 0x8, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xe2, 0xcf, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0x40, 0xb6, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xc7, + 0x20, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x40, + 0x0, 0x2, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xf5, 0xff, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, + 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xf5, 0xff, 0x45, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F241 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x30, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F242 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F243 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x49, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x49, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x44, 0x88, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F244 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x80, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xa1, 0x0, 0xcf, 0xff, 0xd4, + 0x9f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xa0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xb2, 0x0, + 0x9c, 0x90, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x2, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf9, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x1, 0x7b, 0xdd, 0xb8, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xdf, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0x68, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0x60, 0x9f, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x60, + 0x9, 0xff, 0xf3, 0x8f, 0xf6, 0xbf, 0x61, 0xc0, + 0x9f, 0xf7, 0xbf, 0xf6, 0xb, 0x60, 0xe2, 0x5f, + 0xf9, 0xdf, 0xff, 0x50, 0x20, 0x33, 0xff, 0xfb, + 0xef, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xfc, 0xef, + 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xfc, 0xdf, 0xff, + 0xd1, 0x0, 0x9, 0xff, 0xfc, 0xcf, 0xfc, 0x14, + 0x50, 0x90, 0xaf, 0xfb, 0xaf, 0xf2, 0x4f, 0x60, + 0xf3, 0x2f, 0xf9, 0x6f, 0xfd, 0xff, 0x70, 0x52, + 0xef, 0xf6, 0x1f, 0xff, 0xff, 0x70, 0x2e, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0x72, 0xef, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xae, 0xff, 0xfd, 0x10, 0x0, + 0x5, 0xcf, 0xff, 0xfd, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x5, 0x88, 0x88, 0x30, 0x0, 0x0, + 0x56, 0x66, 0x7f, 0xff, 0xff, 0xe6, 0x66, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x44, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x44, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x44, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x41, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x72, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xa8, 0xff, 0xff, 0xf8, 0x0, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xa0, 0xa, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x60, 0x3, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xe3, 0x0, + 0xbf, 0xff, 0xf8, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x23, 0xff, 0xf3, 0x2e, 0xff, 0xff, 0x80, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F7C2 "" */ + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, + 0x47, 0xf4, 0xd8, 0x4f, 0xf5, 0xc, 0xff, 0x3, + 0xe0, 0xc5, 0xe, 0xf5, 0xcf, 0xff, 0x3, 0xe0, + 0xc5, 0xe, 0xf5, 0xff, 0xff, 0x24, 0xe2, 0xc6, + 0x2e, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0x34, + 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x3e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x2e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 77, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 77, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20, .adv_w = 113, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 35, .adv_w = 202, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 120, .adv_w = 179, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 219, .adv_w = 243, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 317, .adv_w = 198, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 408, .adv_w = 60, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 414, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 459, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 504, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 529, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 570, .adv_w = 65, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 582, .adv_w = 110, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 587, .adv_w = 65, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 593, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 665, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 743, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 841, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 193, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 984, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1049, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1121, .adv_w = 172, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1193, .adv_w = 185, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1265, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 65, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1357, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1383, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1424, .adv_w = 168, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1456, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1497, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1562, .adv_w = 298, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1715, .adv_w = 211, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1813, .adv_w = 218, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1891, .adv_w = 208, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1976, .adv_w = 238, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2061, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2133, .adv_w = 183, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2198, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2283, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2361, .adv_w = 89, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2381, .adv_w = 148, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2440, .adv_w = 207, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2518, .adv_w = 171, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2583, .adv_w = 275, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2681, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2759, .adv_w = 242, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2857, .adv_w = 208, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2935, .adv_w = 242, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3055, .adv_w = 209, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3133, .adv_w = 179, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3205, .adv_w = 169, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3277, .adv_w = 228, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3355, .adv_w = 205, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3446, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3576, .adv_w = 194, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3654, .adv_w = 186, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 189, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3817, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3862, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3934, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3979, .adv_w = 168, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4015, .adv_w = 144, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4024, .adv_w = 173, .box_w = 5, .box_h = 3, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 4032, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4082, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4159, .adv_w = 164, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4209, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4286, .adv_w = 176, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4341, .adv_w = 102, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4390, .adv_w = 199, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4467, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4537, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4558, .adv_w = 82, .box_w = 6, .box_h = 18, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 4612, .adv_w = 177, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4689, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4710, .adv_w = 304, .box_w = 17, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4795, .adv_w = 196, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4845, .adv_w = 183, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4900, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4977, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5054, .adv_w = 118, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5084, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5129, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5171, .adv_w = 195, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5221, .adv_w = 161, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5281, .adv_w = 259, .box_w = 17, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 159, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5416, .adv_w = 161, .box_w = 12, .box_h = 14, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 5500, .adv_w = 150, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5545, .adv_w = 101, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5590, .adv_w = 86, .box_w = 3, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5617, .adv_w = 101, .box_w = 6, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5671, .adv_w = 168, .box_w = 9, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 5694, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 5719, .adv_w = 90, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5727, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5908, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6034, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6187, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6313, .adv_w = 198, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6398, .adv_w = 288, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6569, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6740, .adv_w = 324, .box_w = 21, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6919, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7090, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7237, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7408, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7476, .adv_w = 216, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7581, .adv_w = 324, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7770, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 198, .box_w = 13, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8020, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8122, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8274, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8410, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8546, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8648, .adv_w = 252, .box_w = 18, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8801, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8889, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8977, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9113, .adv_w = 252, .box_w = 16, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 9145, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9292, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9511, .adv_w = 324, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9720, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9873, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 9953, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10033, .adv_w = 360, .box_w = 24, .box_h = 15, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10213, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10339, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10510, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10691, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10827, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10979, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11115, .adv_w = 252, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11235, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11361, .adv_w = 180, .box_w = 13, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11485, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11637, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11789, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11936, .adv_w = 288, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12136, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12269, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12476, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12614, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12752, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12890, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13028, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13166, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13339, .adv_w = 252, .box_w = 14, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13472, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13624, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13805, .adv_w = 360, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13966, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14099, .adv_w = 290, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 13, 0, 8, -6, 0, 0, + 0, 0, -16, -17, 2, 14, 6, 5, + -12, 2, 14, 1, 12, 3, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -9, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -4, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -8, 0, -35, 0, + 0, -6, 0, 6, 9, 0, 0, -6, + 3, 3, 10, 6, -5, 6, 0, 0, + -16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, -3, -14, 0, -12, + -2, 0, 0, 0, 0, 1, 11, 0, + -9, -2, -1, 1, 0, -5, 0, 0, + -2, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -23, -2, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 9, -3, 0, 0, 6, -3, + -10, -39, 2, 8, 6, 1, -4, 0, + 10, 0, 9, 0, 9, 0, -27, 0, + -3, 9, 0, 10, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 23, 0, + 23, 0, 9, 0, 12, 4, 5, 9, + 0, 0, 0, -11, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -4, -6, 2, + 0, -3, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -16, 0, -18, 0, 0, 0, + 0, -2, 0, 29, -3, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 17, 0, 0, -11, 0, + 10, 0, -20, -28, -20, -6, 9, 0, + 0, -19, 0, 3, -7, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, -35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -2, 0, -7, -6, 0, -7, + -10, -10, -5, 0, -6, 0, -6, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -3, 0, -5, 0, 0, -2, 0, 9, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -4, 0, -9, + -2, -9, 6, 0, 0, -6, 3, 6, + 8, 0, -7, -1, -3, 0, -1, -14, + 3, -2, 2, -15, 3, 0, 0, 1, + -15, 0, -15, -2, -25, -2, 0, -14, + 0, 6, 8, 0, 4, 0, 0, 0, + 0, 1, 0, -5, -4, 0, -9, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -6, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 9, -2, 1, -9, 0, 0, + 8, -14, -15, -12, -6, 3, 0, -2, + -19, -5, 0, -5, 0, -6, 4, -5, + -18, 0, -8, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -9, -11, 0, -14, + -7, -6, -7, -9, -3, -8, -1, -5, + -8, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -5, -6, + -6, -1, 0, -9, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -14, -9, 0, + 0, 0, -4, -14, 0, 0, -3, 3, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -6, -6, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -9, 0, -3, 0, -4, -3, + 0, -6, -7, -9, -2, 0, -6, 0, + -9, 0, 0, 0, 0, 23, 0, 0, + 1, 0, 0, -4, 0, 3, 0, -12, + 0, 0, 0, 0, 0, -27, -5, 10, + 9, -2, -12, 0, 3, -4, 0, -14, + -1, -4, 3, -20, -3, 4, 0, 4, + -10, -4, -11, -10, -12, 0, 0, -17, + 0, 16, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -8, -10, -1, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -6, 3, -2, -1, -7, + -3, 0, -4, -3, -2, 0, -4, -5, + 0, 0, -2, -1, -2, -5, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -3, + -9, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -3, -3, + -3, 0, 2, 12, -1, 0, -8, 0, + -2, 6, 0, -3, -12, -4, 4, 0, + 0, -14, -5, 3, -5, 2, 0, -2, + -2, -9, 0, -4, 1, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -5, 0, + -5, -3, -4, -3, -3, 0, -5, 1, + -5, -5, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -6, 0, 0, 0, -10, 0, + 2, -6, 6, 1, -2, -14, 0, 0, + -6, -3, 0, -12, -7, -8, 0, 0, + -12, -3, -12, -11, -14, 0, -7, 0, + 2, 19, -4, 0, -7, -3, -1, -3, + -5, -8, -5, -11, -12, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -20, -3, + 9, 6, -6, -11, 0, 1, -9, 0, + -14, -2, -3, 6, -26, -4, 1, 0, + 0, -19, -3, -15, -3, -21, 0, 0, + -20, 0, 17, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -11, -2, 0, -19, + 0, 0, 0, 0, -9, 0, -3, 0, + -1, -8, -14, 0, 0, -1, -4, -9, + -3, 0, -2, 0, 0, 0, 0, -13, + -3, -10, -9, -2, -5, -7, -3, -5, + 0, -6, -3, -10, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -10, 0, + 6, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -6, 12, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -9, 0, + -3, 0, -4, -3, 0, -6, -7, -9, + -2, 0, -6, 2, 12, 0, 0, 0, + 0, 23, 0, 0, 1, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 6, 2, -3, 0, -9, + -5, 0, 9, -10, -9, -6, -6, 12, + 5, 3, -25, -2, 6, -3, 0, -3, + 3, -3, -10, 0, -3, 3, -4, -2, + -9, -2, 0, 0, 9, 6, 0, -8, + 0, -16, -4, 8, -4, -11, 1, -4, + -10, -10, -3, 12, 3, 0, -4, 0, + -8, 0, 2, 10, -7, -11, -12, -7, + 9, 0, 1, -21, -2, 3, -5, -2, + -7, 0, -6, -11, -4, -4, -2, 0, + 0, -7, -6, -3, 0, 9, 7, -3, + -16, 0, -16, -4, 0, -10, -17, -1, + -9, -5, -10, -8, 8, 0, 0, -4, + 0, -6, -3, 0, -3, -5, 0, 5, + -10, 3, 0, 0, -15, 0, -3, -6, + -5, -2, -9, -7, -10, -7, 0, -9, + -3, -7, -5, -9, -3, 0, 0, 1, + 14, -5, 0, -9, -3, 0, -3, -6, + -7, -8, -8, -11, -4, -6, 6, 0, + -4, 0, -14, -3, 2, 6, -9, -11, + -6, -10, 10, -3, 1, -27, -5, 6, + -6, -5, -11, 0, -9, -12, -3, -3, + -2, -3, -6, -9, -1, 0, 0, 9, + 8, -2, -19, 0, -17, -7, 7, -11, + -20, -6, -10, -12, -14, -10, 6, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 6, 2, -5, 6, 0, 0, -9, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 9, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 11, 0, 5, 1, 1, -4, + 0, 6, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 0, -3, 5, 0, 9, + 0, 0, 29, 3, -6, -6, 3, 3, + -2, 1, -14, 0, 0, 14, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -20, 11, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -8, 0, + 0, 1, 0, 0, 3, 37, -6, -2, + 9, 8, -8, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -37, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, -8, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -8, 0, 0, 0, -5, 3, -3, 0, + 0, -8, -3, -7, 0, 0, -8, 0, + -3, 0, -14, 0, -3, 0, 0, -23, + -5, -12, -3, -10, 0, 0, -19, 0, + -8, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -5, 0, 0, + 0, 0, -6, 0, -6, 4, -3, 6, + 0, -2, -7, -2, -5, -5, 0, -3, + -1, -2, 2, -8, -1, 0, 0, 0, + -25, -2, -4, 0, -6, 0, -2, -14, + -3, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -8, -3, -6, 0, + 0, -8, 0, -3, 0, -14, 0, 0, + 0, 0, -28, 0, -6, -11, -14, 0, + 0, -19, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 5, -4, 0, 9, + 14, -3, -3, -9, 3, 14, 5, 6, + -8, 3, 12, 3, 8, 6, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 14, -5, -3, 0, -2, + 23, 12, 23, 0, 0, 0, 3, 0, + 0, 11, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -24, -3, -2, -12, + -14, 0, 0, -19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -24, -3, -2, + -12, -14, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -7, 3, 0, -3, + 2, 5, 3, -9, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -7, 0, + -3, -2, -6, 0, -3, -12, 0, 18, + -3, 0, -6, -2, 0, -2, -5, 0, + -3, -8, -6, -3, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -24, + -3, -2, -12, -14, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -9, -3, -3, 9, -3, -3, + -12, 1, -2, 1, -2, -8, 1, 6, + 1, 2, 1, 2, -7, -12, -3, 0, + -11, -5, -8, -12, -11, 0, -5, -6, + -3, -4, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -8, 0, -1, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -2, 0, 0, -5, + -3, 3, 0, -5, -5, -2, 0, -8, + -2, -6, -2, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 9, 0, 0, -5, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -7, 0, 0, + 12, -4, -10, -9, 2, 3, 3, -1, + -8, 2, 4, 2, 9, 2, 10, -2, + -8, 0, 0, -12, 0, 0, -9, -8, + 0, 0, -6, 0, -4, -5, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -9, + -3, 11, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 2, 0, + 0, -10, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -12, -3, -6, 0, + -9, 0, 0, -14, 0, 11, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -9, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -18, -16, 1, + 12, 9, 5, -12, 2, 12, 0, 11, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_18 = { +#else +lv_font_t lv_font_montserrat_18 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 21, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_18*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_20.c b/libraries/lvgl/src/font/lv_font_montserrat_20.c new file mode 100644 index 0000000..de7e49d --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_20.c @@ -0,0 +1,3217 @@ +/******************************************************************************* + * Size: 20 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 20 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_20.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 1 +#endif + +#if LV_FONT_MONTSERRAT_20 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xc6, 0xfc, 0x5f, 0xb4, 0xfa, 0x4f, 0xa3, + 0xf9, 0x3f, 0x92, 0xf8, 0x2f, 0x71, 0xd6, 0x0, + 0x1, 0x94, 0x9f, 0xe4, 0xf9, + + /* U+0022 "\"" */ + 0xbe, 0x1, 0xf8, 0xbe, 0x1, 0xf8, 0xad, 0x1, + 0xf7, 0xad, 0x0, 0xf7, 0xad, 0x0, 0xf7, 0x57, + 0x0, 0x83, + + /* U+0023 "#" */ + 0x0, 0x0, 0x7f, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0xac, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x9, 0xd0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6, 0x88, 0xfb, 0x88, + 0x8e, 0xc8, 0x84, 0x0, 0x2, 0xf4, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x3, 0xf2, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x4f, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x38, 0x8d, + 0xd8, 0x88, 0xcf, 0x88, 0x70, 0x0, 0xd, 0x90, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xe8, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xc8, 0x10, + 0x1, 0xdf, 0xfe, 0xfd, 0xff, 0xd0, 0x8, 0xfc, + 0x15, 0xf0, 0x6, 0x60, 0xc, 0xf3, 0x5, 0xf0, + 0x0, 0x0, 0xc, 0xf5, 0x5, 0xf0, 0x0, 0x0, + 0x6, 0xfe, 0x76, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x5, 0xf4, 0xaf, 0xf2, + 0x0, 0x0, 0x5, 0xf0, 0x9, 0xf7, 0x1, 0x0, + 0x5, 0xf0, 0x6, 0xf8, 0xc, 0x92, 0x5, 0xf0, + 0x2d, 0xf4, 0xc, 0xff, 0xed, 0xfd, 0xff, 0xa0, + 0x0, 0x4a, 0xef, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x9e, 0xe9, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0xad, 0x44, 0xda, 0x0, 0x0, 0x9e, 0x10, + 0x0, 0x1f, 0x40, 0x4, 0xf1, 0x0, 0x4f, 0x40, + 0x0, 0x3, 0xf1, 0x0, 0x1f, 0x30, 0x1e, 0x90, + 0x0, 0x0, 0x2f, 0x30, 0x3, 0xf1, 0xa, 0xd0, + 0x0, 0x0, 0x0, 0xcb, 0x11, 0xbb, 0x5, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x11, 0xe8, + 0x1a, 0xfe, 0x70, 0x0, 0x0, 0x11, 0x0, 0xad, + 0xa, 0xd4, 0x5f, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0x32, 0xf3, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x1f, + 0x70, 0x4f, 0x0, 0x4, 0xf0, 0x0, 0x0, 0xb, + 0xc0, 0x4, 0xf0, 0x0, 0x3f, 0x0, 0x0, 0x6, + 0xf2, 0x0, 0x2f, 0x20, 0x6, 0xe0, 0x0, 0x2, + 0xf7, 0x0, 0x0, 0xbb, 0x23, 0xe6, 0x0, 0x0, + 0xcc, 0x0, 0x0, 0x1, 0xaf, 0xe8, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9d, 0xfd, 0x70, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x7b, 0xf7, 0x0, 0x0, 0x0, 0x4f, + 0x90, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0xec, 0x0, 0x0, 0x0, 0x1f, 0xe1, 0x1b, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xfd, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc7, 0xfd, 0x20, 0x8, 0x30, + 0x7, 0xf9, 0x0, 0x5f, 0xe2, 0x1f, 0x80, 0xe, + 0xe0, 0x0, 0x5, 0xfe, 0xaf, 0x30, 0xf, 0xd0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0xd, 0xf7, 0x0, + 0x0, 0x5e, 0xff, 0x30, 0x4, 0xff, 0xeb, 0xbe, + 0xfe, 0x6f, 0xf2, 0x0, 0x29, 0xdf, 0xfc, 0x70, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0027 "'" */ + 0xbe, 0xbe, 0xad, 0xad, 0xad, 0x57, + + /* U+0028 "(" */ + 0x0, 0xe, 0xd0, 0x0, 0x7f, 0x60, 0x0, 0xef, + 0x0, 0x3, 0xfa, 0x0, 0x8, 0xf5, 0x0, 0xb, + 0xf2, 0x0, 0xe, 0xf0, 0x0, 0xf, 0xe0, 0x0, + 0xf, 0xd0, 0x0, 0x1f, 0xc0, 0x0, 0xf, 0xd0, + 0x0, 0xf, 0xe0, 0x0, 0xe, 0xf0, 0x0, 0xb, + 0xf2, 0x0, 0x8, 0xf5, 0x0, 0x3, 0xfa, 0x0, + 0x0, 0xee, 0x0, 0x0, 0x7f, 0x60, 0x0, 0xe, + 0xd0, + + /* U+0029 ")" */ + 0x2f, 0xb0, 0x0, 0xaf, 0x30, 0x3, 0xfa, 0x0, + 0xe, 0xf0, 0x0, 0x9f, 0x40, 0x6, 0xf7, 0x0, + 0x3f, 0xa0, 0x2, 0xfb, 0x0, 0x1f, 0xc0, 0x0, + 0xfd, 0x0, 0x1f, 0xc0, 0x2, 0xfb, 0x0, 0x3f, + 0xa0, 0x6, 0xf7, 0x0, 0x9f, 0x40, 0xe, 0xf0, + 0x3, 0xfa, 0x0, 0xaf, 0x30, 0x2f, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x9, 0x90, 0x0, 0x26, 0x9, 0x90, 0x62, + 0x5f, 0xcb, 0xbc, 0xf5, 0x2, 0xbf, 0xfb, 0x20, + 0x7, 0xef, 0xfe, 0x70, 0x6f, 0x69, 0x96, 0xf6, + 0x1, 0x9, 0x90, 0x10, 0x0, 0x6, 0x60, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xfd, 0xaa, 0xa2, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, + + /* U+002C "," */ + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+002D "-" */ + 0x9b, 0xbb, 0xb5, 0xdf, 0xff, 0xf8, + + /* U+002E "." */ + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x4, + 0xf7, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, + 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, 0xc0, 0x0, + 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0xef, 0xf6, 0x0, 0x0, 0xdf, 0xa1, + 0x0, 0x6f, 0xf2, 0x0, 0x6f, 0xc0, 0x0, 0x0, + 0x7f, 0xb0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0x0, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf3, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0xaf, 0x50, 0xff, 0x0, + 0x0, 0x0, 0xa, 0xf5, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0xcf, 0x30, 0xbf, 0x40, 0x0, 0x0, 0xf, + 0xf0, 0x6, 0xfc, 0x0, 0x0, 0x7, 0xfb, 0x0, + 0xd, 0xfa, 0x10, 0x6, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x18, 0xdf, + 0xea, 0x30, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xf4, 0xac, 0xce, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, + 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, + + /* U+0032 "2" */ + 0x0, 0x6c, 0xef, 0xea, 0x30, 0x2, 0xdf, 0xfe, + 0xdf, 0xff, 0x50, 0x5f, 0x91, 0x0, 0x9, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0x1d, 0xf5, 0x0, 0x0, + 0x0, 0x1c, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xf8, + 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, 0x0, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xf6, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xcc, 0xcc, 0xcc, 0x94, + 0xff, 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x3, 0xcc, 0xcc, + 0xcc, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xe2, + 0x0, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0x0, 0x0, + 0xc, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x80, 0x0, 0x0, + 0x6, 0x68, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x1, + 0x0, 0x0, 0x0, 0xaf, 0x77, 0xe6, 0x10, 0x0, + 0x6f, 0xf2, 0x7f, 0xff, 0xee, 0xff, 0xf6, 0x0, + 0x28, 0xcf, 0xfe, 0xa3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x2e, 0xf2, 0x0, 0x6f, 0x70, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x6f, 0x70, 0x0, + 0x9, 0xf9, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2c, 0xcc, + 0xcc, 0xcc, 0xdf, 0xec, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0x70, 0x0, + + /* U+0035 "5" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfc, + 0xcc, 0xcc, 0xc0, 0x2, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xec, 0xca, 0x72, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x2, + 0x0, 0x0, 0x0, 0x6f, 0xa3, 0xf8, 0x20, 0x0, + 0x5f, 0xf4, 0x4f, 0xff, 0xed, 0xff, 0xf9, 0x0, + 0x17, 0xce, 0xfe, 0xb5, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x5b, 0xef, 0xeb, 0x60, 0x0, 0xb, + 0xff, 0xec, 0xdf, 0xb0, 0x0, 0xaf, 0xb2, 0x0, + 0x1, 0x10, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf0, + 0x6c, 0xff, 0xc6, 0x0, 0xf, 0xfa, 0xfd, 0xbc, + 0xff, 0xa0, 0xf, 0xff, 0x60, 0x0, 0x2e, 0xf5, + 0xf, 0xfa, 0x0, 0x0, 0x5, 0xfa, 0xc, 0xf7, + 0x0, 0x0, 0x3, 0xfc, 0x7, 0xfa, 0x0, 0x0, + 0x5, 0xfa, 0x1, 0xef, 0x60, 0x0, 0x2e, 0xf4, + 0x0, 0x4f, 0xfe, 0xbc, 0xff, 0x80, 0x0, 0x1, + 0x9d, 0xfe, 0xb4, 0x0, + + /* U+0037 "7" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6f, 0xec, + 0xcc, 0xcc, 0xdf, 0xf1, 0x6f, 0x80, 0x0, 0x0, + 0x6f, 0xa0, 0x6f, 0x80, 0x0, 0x0, 0xdf, 0x30, + 0x14, 0x20, 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, 0x0, 0x6, + 0xfb, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xce, 0xfe, 0xb5, 0x0, 0x0, 0xcf, + 0xfc, 0xac, 0xff, 0xb0, 0x6, 0xfc, 0x10, 0x0, + 0x2d, 0xf4, 0x9, 0xf6, 0x0, 0x0, 0x8, 0xf7, + 0x6, 0xfb, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0xaf, + 0xea, 0x9a, 0xff, 0x80, 0x0, 0x5e, 0xff, 0xff, + 0xfe, 0x40, 0x6, 0xfe, 0x61, 0x2, 0x7f, 0xf4, + 0xe, 0xf3, 0x0, 0x0, 0x5, 0xfc, 0x1f, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xf1, 0x0, 0x0, + 0x3, 0xfe, 0xa, 0xfb, 0x10, 0x0, 0x2d, 0xf8, + 0x1, 0xdf, 0xfc, 0xbc, 0xff, 0xc0, 0x0, 0x7, + 0xce, 0xfe, 0xb6, 0x0, + + /* U+0039 "9" */ + 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, 0x6, 0xff, + 0xda, 0xcf, 0xf8, 0x0, 0x1f, 0xf4, 0x0, 0x1, + 0xcf, 0x50, 0x5f, 0x90, 0x0, 0x0, 0x2f, 0xd0, + 0x6f, 0x90, 0x0, 0x0, 0x3f, 0xf1, 0x2f, 0xf4, + 0x0, 0x1, 0xcf, 0xf4, 0x8, 0xff, 0xda, 0xbf, + 0xec, 0xf5, 0x0, 0x4b, 0xef, 0xd9, 0x1a, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x90, 0x0, 0x40, 0x0, 0x1a, 0xfe, 0x10, + 0x6, 0xfe, 0xdd, 0xff, 0xe3, 0x0, 0x3, 0xad, + 0xfe, 0xc7, 0x10, 0x0, + + /* U+003A ":" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+003B ";" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x2, + 0x9f, 0xf4, 0x0, 0x5, 0xcf, 0xfb, 0x40, 0x28, + 0xef, 0xe8, 0x10, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x9e, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x39, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, + + /* U+003D "=" */ + 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, 0xaa, + 0xaa, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xaa, 0xaa, 0xa2, + + /* U+003E ">" */ + 0x63, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0x10, + 0x0, 0x0, 0x17, 0xdf, 0xf9, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xfc, 0x60, 0x0, 0x0, 0x1, 0x6e, + 0xf4, 0x0, 0x0, 0x6, 0xcf, 0xf3, 0x0, 0x39, + 0xff, 0xd6, 0x0, 0x5d, 0xff, 0xa3, 0x0, 0x0, + 0xad, 0x71, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x7c, 0xef, 0xda, 0x30, 0x2, 0xef, 0xfc, + 0xce, 0xff, 0x60, 0x6f, 0x80, 0x0, 0x8, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x0, 0x0, + 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xc0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x93, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x6, 0xf8, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfd, 0x97, 0x67, + 0x9e, 0xfb, 0x10, 0x0, 0x0, 0x5, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4d, 0xe3, 0x0, 0x0, 0x3f, + 0xa0, 0x0, 0x58, 0x85, 0x3, 0x94, 0xbe, 0x10, + 0x0, 0xec, 0x0, 0x2d, 0xff, 0xff, 0xd7, 0xf5, + 0x1d, 0xb0, 0x6, 0xf3, 0x1, 0xef, 0x71, 0x4, + 0xdf, 0xf5, 0x5, 0xf2, 0xb, 0xd0, 0x8, 0xf7, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0xe7, 0xe, 0x90, + 0xc, 0xf0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0xca, + 0xf, 0x70, 0xe, 0xe0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0xab, 0xf, 0x70, 0xd, 0xf0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0xba, 0xe, 0x90, 0xa, 0xf3, + 0x0, 0x0, 0xb, 0xf5, 0x0, 0xd8, 0xb, 0xd0, + 0x3, 0xfd, 0x10, 0x0, 0x7f, 0xf7, 0x3, 0xf4, + 0x6, 0xf3, 0x0, 0x7f, 0xfa, 0x9d, 0xf7, 0xfe, + 0xae, 0xc0, 0x0, 0xec, 0x0, 0x4, 0xcf, 0xfb, + 0x40, 0x5e, 0xfa, 0x10, 0x0, 0x3f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xfd, 0x97, 0x68, 0xaf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, + 0xb7, 0x10, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xaf, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfa, 0x1f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xf3, 0xa, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xc0, 0x3, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0xcf, 0x30, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x5f, 0xb0, 0x0, + 0x0, 0x8, 0xf7, 0x0, 0x0, 0xe, 0xf2, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xda, 0xaa, 0xaa, 0xaa, 0xff, 0x10, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf6, + + /* U+0042 "B" */ + 0xef, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xe, 0xfb, + 0xaa, 0xab, 0xdf, 0xfa, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x4f, 0xf3, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0x60, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf4, + 0xe, 0xf1, 0x0, 0x0, 0x29, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xe, 0xfb, 0xaa, + 0xaa, 0xce, 0xfd, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x8, 0xfb, 0xe, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xff, 0x1e, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xef, 0xba, + 0xaa, 0xab, 0xef, 0xf4, 0xe, 0xff, 0xff, 0xff, + 0xfd, 0x92, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xc1, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x3b, 0xf5, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x30, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x30, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x3b, 0xf5, 0x0, 0x5, 0xef, 0xff, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0044 "D" */ + 0xef, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x0, 0xef, + 0xdc, 0xcc, 0xdf, 0xff, 0xb1, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x5d, 0xfd, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xf1, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xf6, 0xef, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xf8, 0xef, 0x10, 0x0, 0x0, 0x0, 0x7, 0xf8, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xa, 0xf6, 0xef, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xef, 0x10, 0x0, + 0x0, 0x5d, 0xfd, 0x10, 0xef, 0xcc, 0xcc, 0xdf, + 0xff, 0xb1, 0x0, 0xef, 0xff, 0xff, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe, 0xfd, 0xcc, + 0xcc, 0xcc, 0xc0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xfc, + 0xcc, 0xcc, 0xcc, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, 0xcc, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0046 "F" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, + 0xcc, 0xcc, 0xc1, 0xef, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb6, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xd2, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x29, 0xf7, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x20, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x2a, 0xfb, 0x0, 0x4, 0xef, 0xff, + 0xdf, 0xff, 0xe4, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb6, 0x0, + + /* U+0048 "H" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, + 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcf, 0xf2, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+0049 "I" */ + 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, + 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, + 0x1e, 0xf1, 0xef, 0x1e, 0xf1, + + /* U+004A "J" */ + 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x9c, 0xcc, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, + 0xb, 0xf4, 0x1, 0x0, 0x0, 0xd, 0xf2, 0xc, + 0xc2, 0x0, 0x6f, 0xe0, 0xa, 0xff, 0xde, 0xff, + 0x60, 0x0, 0x6c, 0xff, 0xc5, 0x0, + + /* U+004B "K" */ + 0xef, 0x10, 0x0, 0x0, 0xb, 0xf8, 0xe, 0xf1, + 0x0, 0x0, 0xb, 0xf8, 0x0, 0xef, 0x10, 0x0, + 0xb, 0xf9, 0x0, 0xe, 0xf1, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0xef, 0x10, 0xa, 0xfb, 0x0, 0x0, + 0xe, 0xf1, 0xa, 0xfb, 0x0, 0x0, 0x0, 0xef, + 0x19, 0xff, 0x30, 0x0, 0x0, 0xe, 0xfa, 0xfe, + 0xfe, 0x10, 0x0, 0x0, 0xef, 0xfd, 0x1a, 0xfc, + 0x0, 0x0, 0xe, 0xfd, 0x10, 0xc, 0xfa, 0x0, + 0x0, 0xef, 0x20, 0x0, 0x1e, 0xf7, 0x0, 0xe, + 0xf1, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x4f, 0xf2, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0xd1, + + /* U+004C "L" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, + 0xc8, 0xef, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xef, 0x9f, + 0x60, 0x0, 0x0, 0x4f, 0xaf, 0xfe, 0xf1, 0xee, + 0x10, 0x0, 0xd, 0xf1, 0xff, 0xef, 0x6, 0xf9, + 0x0, 0x7, 0xf7, 0xe, 0xfe, 0xf0, 0xc, 0xf3, + 0x1, 0xfd, 0x0, 0xef, 0xef, 0x0, 0x3f, 0xc0, + 0xaf, 0x40, 0xe, 0xfe, 0xf0, 0x0, 0x9f, 0x9f, + 0xa0, 0x0, 0xef, 0xef, 0x0, 0x1, 0xef, 0xf1, + 0x0, 0xe, 0xfe, 0xf0, 0x0, 0x6, 0xf7, 0x0, + 0x0, 0xef, 0xef, 0x0, 0x0, 0x4, 0x0, 0x0, + 0xe, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, + + /* U+004E "N" */ + 0xef, 0x20, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xfd, + 0x10, 0x0, 0x0, 0xd, 0xf2, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xfe, 0xf8, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x4f, 0xf5, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x5f, 0xf3, 0x0, 0xd, 0xf2, 0xef, + 0x10, 0x8f, 0xe1, 0x0, 0xdf, 0x2e, 0xf1, 0x0, + 0xbf, 0xc0, 0xd, 0xf2, 0xef, 0x10, 0x1, 0xdf, + 0x90, 0xdf, 0x2e, 0xf1, 0x0, 0x2, 0xff, 0x6d, + 0xf2, 0xef, 0x10, 0x0, 0x5, 0xff, 0xff, 0x2e, + 0xf1, 0x0, 0x0, 0x8, 0xff, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xff, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+004F "O" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x5f, 0xf9, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x0, 0x4, 0xef, 0xff, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0050 "P" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xef, 0xcc, + 0xcc, 0xb9, 0x40, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfd, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x4b, 0xff, + 0x20, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x9, + 0xfd, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xfc, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfa, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x6, 0xff, + 0x92, 0x0, 0x3, 0xbf, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0xce, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xe2, 0x0, 0x1a, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xb3, + 0x0, + + /* U+0052 "R" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xcc, + 0xcb, 0xdf, 0x90, 0x0, 0xef, 0x10, 0x0, 0x1e, + 0xf2, 0x0, 0xef, 0x10, 0x0, 0x4, 0xfd, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x9f, 0x90, 0xef, 0x10, + 0x0, 0x0, 0xd, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x6, 0xce, 0xfe, 0xc7, 0x10, 0x0, 0xcf, + 0xfd, 0xcd, 0xff, 0xd0, 0x8, 0xfc, 0x20, 0x0, + 0x17, 0x60, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x1, 0x6a, 0xef, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xf7, 0x1, 0x0, 0x0, 0x0, + 0x7, 0xf8, 0xd, 0xb3, 0x0, 0x0, 0x3e, 0xf4, + 0xa, 0xff, 0xfc, 0xce, 0xff, 0x90, 0x0, 0x39, + 0xdf, 0xfe, 0xa4, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbc, 0xcc, + 0xdf, 0xfc, 0xcc, 0xc8, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, + 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xfd, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0xff, 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x2f, 0xc0, 0xdf, 0x30, 0x0, 0x0, 0x5, + 0xfa, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0x60, + 0x2f, 0xf8, 0x0, 0x1, 0xaf, 0xe0, 0x0, 0x5f, + 0xff, 0xde, 0xff, 0xe3, 0x0, 0x0, 0x29, 0xdf, + 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf1, + 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x90, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0xdf, 0x20, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x9, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x1, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd0, 0x7, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x5f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xef, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x3f, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, + 0x0, 0x2, 0xfb, 0xd, 0xf3, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x8, 0xf5, 0x8, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xf1, 0x3, 0xfd, 0x0, 0x0, 0xc, 0xf8, 0xf7, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0xdf, 0x30, 0x0, + 0x2f, 0xb2, 0xfc, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x8f, 0x80, 0x0, 0x7f, 0x50, 0xcf, 0x10, 0x0, + 0xdf, 0x0, 0x0, 0x3f, 0xd0, 0x0, 0xdf, 0x0, + 0x7f, 0x70, 0x3, 0xfb, 0x0, 0x0, 0xd, 0xf3, + 0x2, 0xfa, 0x0, 0x2f, 0xc0, 0x8, 0xf5, 0x0, + 0x0, 0x8, 0xf8, 0x8, 0xf5, 0x0, 0xc, 0xf2, + 0xe, 0xf0, 0x0, 0x0, 0x3, 0xfd, 0xd, 0xf0, + 0x0, 0x7, 0xf7, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x6f, 0xa0, 0x0, 0x1, 0xfc, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0xcf, 0xef, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x5, + 0xfe, 0x10, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x9f, + 0xa0, 0x0, 0x2f, 0xe1, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0xdf, 0x40, 0x0, 0x0, 0x3, 0xff, 0x29, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0xaf, 0xa0, 0x0, 0x0, 0xdf, 0x50, + 0x0, 0xd, 0xf5, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x3, 0xff, 0x20, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x2f, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8f, 0x90, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0xef, 0x30, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf6, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe1, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfe, + 0xcc, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0xef, 0xff, 0x4e, 0xfa, 0xa2, 0xef, 0x0, 0xe, + 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, + 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, + 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, + 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, + 0xef, 0x0, 0xe, 0xfa, 0xa2, 0xef, 0xff, 0x40, + + /* U+005C "\\" */ + 0x57, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0xcf, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0x5, 0xf6, + + /* U+005D "]" */ + 0xaf, 0xff, 0x96, 0xac, 0xf9, 0x0, 0x5f, 0x90, + 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, + 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, + 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, + 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, + 0x0, 0x5f, 0x96, 0xac, 0xf9, 0xaf, 0xff, 0x90, + + /* U+005E "^" */ + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0xc, 0xbf, 0x70, 0x0, 0x0, + 0x3f, 0x49, 0xd0, 0x0, 0x0, 0x9d, 0x3, 0xf4, + 0x0, 0x1, 0xf7, 0x0, 0xcb, 0x0, 0x7, 0xf1, + 0x0, 0x6f, 0x20, 0xd, 0xa0, 0x0, 0xf, 0x80, + 0x4f, 0x30, 0x0, 0x9, 0xe0, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, + + /* U+0060 "`" */ + 0x27, 0x70, 0x0, 0x5, 0xfc, 0x10, 0x0, 0x2d, + 0xd1, + + /* U+0061 "a" */ + 0x5, 0xbe, 0xfe, 0xb4, 0x0, 0x7f, 0xfd, 0xbd, + 0xff, 0x50, 0x2a, 0x10, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x1, 0x11, 0x1c, + 0xf3, 0x8, 0xef, 0xff, 0xff, 0xf3, 0x9f, 0xc6, + 0x44, 0x4c, 0xf3, 0xff, 0x0, 0x0, 0xb, 0xf3, + 0xef, 0x10, 0x0, 0x3f, 0xf3, 0x8f, 0xd7, 0x69, + 0xfe, 0xf3, 0x6, 0xcf, 0xfc, 0x59, 0xf3, + + /* U+0062 "b" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb1, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xde, + 0xfd, 0xce, 0xfe, 0x40, 0x3f, 0xfe, 0x30, 0x0, + 0x8f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xce, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xa1, 0x9e, 0xfe, + 0x92, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xae, 0xfe, 0x91, 0x0, 0x7, 0xff, + 0xdc, 0xef, 0xe2, 0x4, 0xfe, 0x40, 0x0, 0x7f, + 0x60, 0xcf, 0x40, 0x0, 0x0, 0x10, 0xf, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0x0, 0x10, 0x4, 0xfe, 0x40, 0x0, + 0x7f, 0x60, 0x7, 0xff, 0xdc, 0xef, 0xe2, 0x0, + 0x3, 0xae, 0xfe, 0x91, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x4, 0xbe, 0xfc, 0x61, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf5, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x8, 0xfd, + 0x5, 0xfe, 0x20, 0x0, 0x5f, 0xfd, 0x0, 0x8f, + 0xfb, 0xad, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfd, + 0x70, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0x8f, + 0xfc, 0xbe, 0xfc, 0x0, 0x5, 0xfd, 0x20, 0x0, + 0xaf, 0x80, 0xc, 0xf3, 0x0, 0x0, 0xd, 0xf0, + 0xf, 0xe1, 0x11, 0x11, 0x19, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xe4, 0x44, 0x44, + 0x44, 0x41, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x40, 0x0, 0x2b, 0x20, 0x0, 0x7f, + 0xfe, 0xcd, 0xff, 0x60, 0x0, 0x3, 0xae, 0xfe, + 0xa3, 0x0, + + /* U+0066 "f" */ + 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x6f, 0xea, 0xc6, + 0x0, 0xcf, 0x20, 0x0, 0x0, 0xef, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf1, 0x7a, 0xff, 0xaa, 0xa0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x4, 0xbe, 0xfd, 0x70, 0xdf, 0x0, 0x8f, + 0xfd, 0xce, 0xfc, 0xef, 0x5, 0xfe, 0x40, 0x0, + 0x5f, 0xff, 0xc, 0xf4, 0x0, 0x0, 0x6, 0xff, + 0xf, 0xe0, 0x0, 0x0, 0x0, 0xff, 0x2f, 0xc0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xe0, 0x0, 0x0, + 0x1, 0xff, 0xc, 0xf5, 0x0, 0x0, 0x7, 0xff, + 0x5, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x0, 0x8f, + 0xfd, 0xbe, 0xfc, 0xff, 0x0, 0x4, 0xbe, 0xfd, + 0x71, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0x1, 0xa4, 0x0, 0x0, 0x2d, 0xf5, 0x4, 0xff, + 0xfc, 0xbd, 0xff, 0xa0, 0x0, 0x28, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0068 "h" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb1, + 0x9e, 0xfe, 0x91, 0x3, 0xfd, 0xef, 0xdd, 0xff, + 0xd0, 0x3f, 0xfd, 0x20, 0x2, 0xdf, 0x73, 0xff, + 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, 0x0, 0x0, + 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, + 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, + 0x0, 0xf, 0xe0, + + /* U+0069 "i" */ + 0x3e, 0xb0, 0x7f, 0xf0, 0x8, 0x40, 0x0, 0x0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + + /* U+006A "j" */ + 0x0, 0x2, 0xec, 0x0, 0x0, 0x5f, 0xf1, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xfd, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, + 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, 0xd0, + 0x0, 0x5, 0xfa, 0x7, 0xdb, 0xff, 0x40, 0x7e, + 0xfd, 0x50, 0x0, + + /* U+006B "k" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x2, 0xdf, 0x50, 0x3f, 0xb0, + 0x0, 0x2e, 0xf6, 0x0, 0x3f, 0xb0, 0x3, 0xef, + 0x60, 0x0, 0x3f, 0xb0, 0x3f, 0xf6, 0x0, 0x0, + 0x3f, 0xb4, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x3f, 0xff, 0x59, 0xfd, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0xcf, 0x90, 0x0, + 0x3f, 0xb0, 0x0, 0x1e, 0xf6, 0x0, 0x3f, 0xb0, + 0x0, 0x4, 0xff, 0x20, 0x3f, 0xb0, 0x0, 0x0, + 0x7f, 0xd0, + + /* U+006C "l" */ + 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, + 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, + 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb0, + + /* U+006D "m" */ + 0x3f, 0xa3, 0xae, 0xfd, 0x70, 0x5, 0xcf, 0xfc, + 0x50, 0x3, 0xfd, 0xfe, 0xbc, 0xff, 0xaa, 0xfe, + 0xbc, 0xff, 0x70, 0x3f, 0xfb, 0x10, 0x3, 0xff, + 0xf9, 0x0, 0x4, 0xff, 0x13, 0xff, 0x10, 0x0, + 0x9, 0xfe, 0x0, 0x0, 0xb, 0xf4, 0x3f, 0xd0, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x8f, 0x63, + 0xfb, 0x0, 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, + 0xf6, 0x3f, 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x8f, 0x63, 0xfb, 0x0, 0x0, 0x5, 0xf9, + 0x0, 0x0, 0x8, 0xf6, 0x3f, 0xb0, 0x0, 0x0, + 0x5f, 0x90, 0x0, 0x0, 0x8f, 0x63, 0xfb, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, 0xf6, 0x3f, + 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, 0x8f, + 0x60, + + /* U+006E "n" */ + 0x3f, 0xa2, 0xae, 0xfe, 0x91, 0x3, 0xfd, 0xff, + 0xcb, 0xef, 0xd0, 0x3f, 0xfc, 0x10, 0x1, 0xcf, + 0x73, 0xff, 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, + 0x0, 0x0, 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, + 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, + 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, + 0xf, 0xe3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe0, + + /* U+006F "o" */ + 0x0, 0x3, 0xae, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xe1, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfb, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfb, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0x4, 0xfe, 0x40, 0x0, 0x7f, 0xe1, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x0, 0x3, 0xae, 0xfd, + 0x91, 0x0, + + /* U+0070 "p" */ + 0x3f, 0xa2, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xce, + 0xfb, 0xad, 0xfe, 0x40, 0x3f, 0xfd, 0x20, 0x0, + 0x6f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0x9, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xde, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xb1, 0x9e, 0xfe, + 0x92, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfa, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0x5, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfc, + 0x61, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, + + /* U+0072 "r" */ + 0x3f, 0xa1, 0x9e, 0x83, 0xfc, 0xef, 0xf7, 0x3f, + 0xfe, 0x40, 0x3, 0xff, 0x40, 0x0, 0x3f, 0xe0, + 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x3, + 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5c, 0xef, 0xea, 0x50, 0x9, 0xff, 0xcb, + 0xdf, 0xd0, 0x1f, 0xe1, 0x0, 0x2, 0x30, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x63, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x1, + 0x47, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x9, 0x30, 0x0, 0xb, 0xf5, 0x5f, 0xfe, 0xbb, + 0xef, 0xc0, 0x5, 0xae, 0xfe, 0xc7, 0x0, + + /* U+0074 "t" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf1, + 0x7a, 0xff, 0xaa, 0xa0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, + 0x0, 0x6f, 0xfb, 0xd7, 0x0, 0x7, 0xdf, 0xd5, + + /* U+0075 "u" */ + 0x4f, 0xa0, 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, + 0x0, 0x3, 0xfb, 0x4f, 0xa0, 0x0, 0x0, 0x3f, + 0xb4, 0xfa, 0x0, 0x0, 0x3, 0xfb, 0x4f, 0xa0, + 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, 0x0, 0x3, + 0xfb, 0x4f, 0xb0, 0x0, 0x0, 0x5f, 0xb2, 0xfd, + 0x0, 0x0, 0x9, 0xfb, 0xd, 0xf7, 0x0, 0x5, + 0xff, 0xb0, 0x4f, 0xfd, 0xad, 0xfc, 0xfb, 0x0, + 0x3b, 0xef, 0xd7, 0x2f, 0xb0, + + /* U+0076 "v" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x90, 0x0, 0xff, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x9, 0xf6, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x2f, 0xc0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xbf, 0x30, 0xf, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x6, 0xf7, 0x0, 0x0, 0x0, 0xd, + 0xf1, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x7f, 0xbf, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x10, 0x0, 0x0, 0xef, 0x0, 0x0, 0x1, + 0xfa, 0x5f, 0x70, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x6, 0xf5, 0xf, 0xd0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0xc, 0xe0, 0xa, 0xf2, 0x0, 0x1f, 0xab, + 0xf1, 0x0, 0x1f, 0x90, 0x4, 0xf8, 0x0, 0x6f, + 0x55, 0xf7, 0x0, 0x7f, 0x30, 0x0, 0xed, 0x0, + 0xce, 0x0, 0xec, 0x0, 0xde, 0x0, 0x0, 0x8f, + 0x32, 0xf9, 0x0, 0x9f, 0x23, 0xf8, 0x0, 0x0, + 0x3f, 0x98, 0xf3, 0x0, 0x3f, 0x88, 0xf2, 0x0, + 0x0, 0xd, 0xee, 0xd0, 0x0, 0xd, 0xde, 0xc0, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x10, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xe1, 0x0, 0x0, 0xdf, 0x30, 0x6f, 0xb0, + 0x0, 0xaf, 0x60, 0x0, 0xaf, 0x70, 0x6f, 0xa0, + 0x0, 0x0, 0xdf, 0x5f, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xfe, 0x2e, 0xf2, 0x0, 0x0, 0xdf, 0x40, 0x3f, + 0xd0, 0x0, 0x9f, 0x80, 0x0, 0x8f, 0xa0, 0x5f, + 0xc0, 0x0, 0x0, 0xcf, 0x60, + + /* U+0079 "y" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x80, 0x0, 0xef, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x8, 0xf7, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xaf, 0x40, 0xf, 0xd0, 0x0, 0x0, + 0x3, 0xfb, 0x6, 0xf6, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xcf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x3, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x2, 0xfd, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xef, 0xc4, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xaa, 0xaa, + 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xe1, + 0x0, 0x0, 0x1, 0xdf, 0x40, 0x0, 0x0, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x4, 0xfd, 0x10, 0x0, 0x0, 0x1e, 0xfc, 0xaa, + 0xaa, 0xa6, 0x3f, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x3c, 0xfa, 0x0, 0xef, 0xc6, 0x3, 0xfc, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x5, 0xfa, 0x0, + 0x8e, 0xf6, 0x0, 0xdf, 0xe2, 0x0, 0x7, 0xf9, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0xef, 0xc6, 0x0, 0x3c, + 0xfa, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, + + /* U+007D "}" */ + 0xaf, 0xc3, 0x0, 0x6c, 0xfe, 0x0, 0x0, 0xcf, + 0x30, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x9f, 0x50, + 0x0, 0x5f, 0xe8, 0x0, 0x2e, 0xfd, 0x0, 0x9f, + 0x70, 0x0, 0x9f, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, + 0x0, 0xcf, 0x30, 0x6c, 0xfe, 0x0, 0xaf, 0xc3, + 0x0, + + /* U+007E "~" */ + 0x9, 0xee, 0x60, 0x0, 0xd6, 0x7f, 0xab, 0xfb, + 0x26, 0xf3, 0xb9, 0x0, 0x5e, 0xff, 0x90, 0x31, + 0x0, 0x0, 0x32, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x6d, 0xea, 0x10, 0x7, 0xe5, 0x3b, 0xc0, + 0xe, 0x40, 0x0, 0xe4, 0x1f, 0x0, 0x0, 0xb7, + 0xf, 0x30, 0x0, 0xd5, 0x8, 0xc2, 0x8, 0xe0, + 0x0, 0x9f, 0xfc, 0x20, 0x0, 0x0, 0x10, 0x0, + + /* U+2022 "•" */ + 0x9, 0xa2, 0x8f, 0xfc, 0x9f, 0xfd, 0x2d, 0xe5, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xae, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x69, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfe, 0x95, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xc7, 0x30, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x1, 0x7b, 0xbd, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x0, 0x13, + 0x3f, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xa1, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8a, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0xc4, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4c, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xfa, 0x8a, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb8, 0xaf, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xf4, 0x4, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x47, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0xdf, 0x84, 0x7f, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4f, + 0xf7, 0x47, 0xfd, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0x84, 0x7f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x4, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4f, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xfa, 0x8a, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb8, 0xaf, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xc4, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4c, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf9, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x6, 0xe4, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x18, 0x40, 0x8f, + 0xfb, 0x0, 0x0, 0x1, 0xdf, 0xf4, 0xff, 0xff, + 0xb0, 0x0, 0x1d, 0xff, 0xfb, 0x7f, 0xff, 0xfb, + 0x1, 0xdf, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xbd, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1d, 0xff, + 0xff, 0x48, 0xff, 0xff, 0xb0, 0xcf, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xf9, 0xdf, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xf9, 0x2e, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, + 0xdf, 0xf4, 0x0, 0x72, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x10, 0xdf, 0xf4, 0x9, 0xfe, 0x30, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0xdf, 0xf4, 0xe, 0xff, + 0xe1, 0x0, 0x5, 0xff, 0xfb, 0x0, 0xdf, 0xf4, + 0x5, 0xff, 0xfb, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0xdf, 0xf4, 0x0, 0x5f, 0xff, 0x40, 0x4f, 0xff, + 0x20, 0x0, 0xdf, 0xf4, 0x0, 0xb, 0xff, 0xa0, + 0x8f, 0xfb, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x4, + 0xff, 0xf0, 0xbf, 0xf7, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x1, 0xff, 0xf1, 0xbf, 0xf6, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0xff, 0xf2, 0xbf, 0xf7, + 0x0, 0x0, 0x8d, 0xc1, 0x0, 0x0, 0xff, 0xf1, + 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0xaf, 0xff, 0xd5, 0x10, 0x3, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x2b, 0xff, 0xff, 0xb2, 0x0, 0x10, 0x0, + 0x0, 0x8f, 0x87, 0xff, 0xff, 0xff, 0xff, 0x79, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2f, 0xff, + 0xff, 0xff, 0xc7, 0x7c, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xff, 0xff, 0xc7, 0x7c, + 0xff, 0xff, 0xff, 0xf2, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8f, 0x97, 0xff, 0xff, 0xff, 0xff, 0x78, + 0xf8, 0x0, 0x0, 0x1, 0x0, 0x1b, 0xff, 0xff, + 0xb1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, + 0x67, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x20, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0x51, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, + 0x8f, 0xff, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8, 0xd3, + 0x2d, 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x1b, 0xff, 0xf5, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xe2, 0x2d, 0xff, 0xff, 0xf7, + 0x8, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xc1, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xf9, 0xe, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x13, 0xef, 0xf6, 0x4f, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xcc, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x56, 0x65, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xfe, 0xee, + 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x91, + 0x4f, 0xf4, 0x19, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0xfd, 0x23, 0x32, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F01C "" */ + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0xdf, + 0xf3, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x80, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0xd, 0xff, 0x98, 0x88, 0x70, 0x0, 0x0, 0x3, + 0x88, 0x88, 0xdf, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x7, 0xba, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xb5, 0x0, 0xb, 0xff, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xb, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xdb, 0xbe, 0xff, 0xff, 0x9a, 0xff, + 0x0, 0xaf, 0xff, 0xa2, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x7, 0xba, 0x9c, 0xff, 0xff, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xf6, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xff, 0xff, 0xc9, 0xaa, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xd0, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x3b, 0xff, + 0xf9, 0x0, 0xff, 0xa9, 0xff, 0xff, 0xeb, 0xbd, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xb0, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xb0, + 0x0, 0x5b, 0xff, 0xff, 0xc8, 0x10, 0x0, 0x0, + 0xab, 0x70, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x2, 0xee, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x47, 0x77, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x89, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x73, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x85, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x9, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, + 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0xef, 0xb0, 0xc, + 0xf6, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, 0x0, + 0x2, 0xdf, 0x80, 0x3f, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x74, 0x1, 0xff, 0x10, 0xcf, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, + 0x8, 0xf7, 0x7, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x4f, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x2, + 0xfb, 0x4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x5f, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0x8, 0xf7, + 0x7, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x74, 0x2, 0xff, 0x10, 0xcf, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x2, 0xef, 0x80, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0xef, 0xb0, 0xc, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0x20, 0x0, 0x0, + + /* U+F03E "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x7f, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, + 0x90, 0x3e, 0xff, 0xff, 0xff, 0xfa, 0x7c, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf9, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8c, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xa6, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xbf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xf9, 0x7, 0xcf, 0xff, 0xff, 0xf2, 0xc, + 0xff, 0xb3, 0x9, 0xff, 0xff, 0x80, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x40, 0x0, 0x0, + + /* U+F048 "" */ + 0x47, 0x60, 0x0, 0x0, 0x0, 0x16, 0x1b, 0xff, + 0x10, 0x0, 0x0, 0x2d, 0xfb, 0xbf, 0xf1, 0x0, + 0x0, 0x2e, 0xff, 0xcb, 0xff, 0x10, 0x0, 0x3e, + 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xcb, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xfc, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, + 0xff, 0x4e, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xf1, + 0x2d, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x10, 0x1c, + 0xff, 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0xc, 0xff, + 0xff, 0xcb, 0xff, 0x10, 0x0, 0xb, 0xff, 0xfc, + 0xbf, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xca, 0xff, + 0x10, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x6, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x6, 0x77, 0x77, 0x30, 0x0, 0x6, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xc1, 0x0, 0x6f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x5, 0x20, 0x0, 0x0, 0x0, 0x57, 0x66, 0xff, + 0x40, 0x0, 0x0, 0xc, 0xff, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0xdf, 0xf8, 0xff, 0xff, 0x70, 0x0, + 0xd, 0xff, 0x8f, 0xff, 0xff, 0x80, 0x0, 0xdf, + 0xf8, 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xb0, 0xdf, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x40, 0xdf, 0xf8, 0xff, 0xff, 0xfe, + 0x30, 0xd, 0xff, 0x8f, 0xff, 0xfe, 0x20, 0x0, + 0xdf, 0xf8, 0xff, 0xfd, 0x20, 0x0, 0xd, 0xff, + 0x7f, 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xf3, 0xfb, + 0x10, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x5f, 0xff, 0xe2, 0x0, 0x0, + 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x5f, 0xff, 0xe3, + 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x2, 0x55, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x37, + 0x77, 0x77, 0x8f, 0xff, 0xc7, 0x77, 0x77, 0x60, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x14, 0x44, 0x44, 0x5f, 0xff, + 0xb4, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x92, 0x0, 0x5, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2, + 0x52, 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x7f, 0xf9, 0x1, 0xef, 0xff, + 0xb0, 0x1, 0xef, 0xff, 0xf0, 0x0, 0x8, 0xff, + 0xf7, 0x8, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xfb, + 0x2, 0x25, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x21, + 0xef, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xf5, 0x7, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0x80, 0x1a, + 0xff, 0xe5, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x10, 0x1, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x92, 0x0, + 0x5, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x4, 0x8c, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xc4, 0x0, + 0x4, 0xcf, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0x3, 0x10, 0x9, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x4f, 0xfa, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x4e, 0xff, 0xef, 0xff, + 0xa0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xfd, + 0x30, 0x1, 0xcf, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0x50, 0x0, 0xbf, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xdf, 0xfe, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xc4, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfe, 0xe3, + 0x0, 0x1b, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xec, 0x20, 0x0, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xa2, 0x24, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x3, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xc0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x9c, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf5, 0x2b, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x22, 0x23, 0xdf, 0xf8, + 0x9, 0xff, 0xf7, 0x2f, 0xff, 0x80, 0x0, 0x0, + 0x2e, 0xb0, 0x7f, 0xff, 0x90, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x3, 0x6, 0xff, 0xfa, 0x0, 0x7, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x3, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xe1, 0x3f, 0x90, 0xf, 0xf8, 0x0, + 0x22, 0x23, 0xdf, 0xfe, 0x22, 0xef, 0xf7, 0x2f, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf9, 0x2, 0xef, 0xff, 0x50, 0x0, 0x0, 0xcf, + 0xff, 0x90, 0x0, 0x2e, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf2, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xe1, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0x20, + + /* U+F078 "" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x20, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xe1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf2, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x3e, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x9c, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xd1, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x81, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x20, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xfc, 0xff, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, + 0x0, 0x7f, 0xc2, 0xff, 0x67, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x3, 0x1, + 0xff, 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xd7, 0x1f, 0xf6, + 0x3d, 0x70, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x7f, 0xf9, 0xef, 0xf0, 0x0, + 0x1, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x32, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x2, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + + /* U+F07B "" */ + 0x5e, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x88, 0x88, 0x88, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x11, 0x1b, 0xff, 0xff, 0x51, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x2b, + 0xff, 0xff, 0x42, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0x82, 0x67, 0x76, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x29, 0xff, 0x70, 0x0, 0x3e, 0xff, + 0xff, 0x30, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x57, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x25, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x4, + 0xaa, 0x50, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xef, 0xd3, 0x7f, 0xf6, 0x0, + 0x8, 0xff, 0xff, 0xb0, 0xff, 0x80, 0xf, 0xf7, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0xdf, 0xe7, 0xaf, + 0xf5, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfb, + 0x6f, 0xff, 0xfd, 0x10, 0x0, 0xef, 0xd3, 0x7f, + 0xf5, 0x5, 0xff, 0xff, 0xd1, 0x0, 0xff, 0x80, + 0xf, 0xf7, 0x0, 0x5f, 0xff, 0xfd, 0x10, 0xdf, + 0xe7, 0xaf, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x5f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x5, 0xef, 0xfb, 0x10, 0x0, 0x0, 0x1, + 0x66, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0x50, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x81, + 0xfb, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x81, 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x81, 0xff, 0xf8, 0x8c, 0xc9, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xd5, 0x44, 0x43, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x10, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfc, 0x10, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xe4, 0x2, + 0xcf, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xfc, 0x8a, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc4, 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, 0xcd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 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, 0xac, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0E0 "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xe3, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x3e, 0xff, 0x70, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, 0xff, 0xfb, + 0x13, 0xdf, 0xff, 0xff, 0xfd, 0x31, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xa, 0xff, 0xff, 0xa0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5d, 0xd5, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F0E7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x6, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0xbf, 0xfe, 0x44, 0x43, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x4f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x3f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xa8, 0x88, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xcf, 0xff, 0xff, 0x51, 0xe2, 0x0, + 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, 0xfe, + 0x20, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, + 0xff, 0xe2, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, + 0x50, 0xbb, 0xb7, 0xff, 0xff, 0xf0, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x75, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xc8, 0x8f, 0xa8, 0xaf, 0x88, 0xbf, 0x88, 0xfb, + 0x88, 0xff, 0x8f, 0xf8, 0x0, 0xf4, 0x4, 0xf0, + 0x5, 0xe0, 0xe, 0x50, 0xf, 0xf8, 0xff, 0x80, + 0xf, 0x40, 0x4f, 0x0, 0x6f, 0x0, 0xf6, 0x0, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x94, + 0x6f, 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, + 0x8f, 0xff, 0xf6, 0x2, 0xf2, 0x5, 0xf0, 0x8, + 0x80, 0xe, 0xff, 0xf8, 0xff, 0xff, 0x94, 0x6f, + 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0x80, 0xf, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf6, 0x0, 0xff, 0x8f, 0xf8, + 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x50, + 0xf, 0xf8, 0xff, 0xc8, 0x8f, 0xa8, 0x88, 0x88, + 0x88, 0x88, 0xfb, 0x88, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2, 0xac, 0xcc, 0xcc, 0xcd, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x24, 0x44, 0x44, 0x44, 0x30, 0x30, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0x60, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0x60, 0xf, 0xff, + 0xff, 0xff, 0xfc, 0xf, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xfc, 0xb, 0xbb, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfa, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xb0, + 0xba, 0x10, 0x0, 0x5, 0x9d, 0xef, 0xed, 0x95, + 0x0, 0x0, 0x1a, 0xb0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9d, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5b, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F241 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F242 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F243 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F244 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfb, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x70, 0xa, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x30, 0x0, 0xcf, 0xff, 0xf6, 0x3c, 0xf3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x5f, 0xf9, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf6, + 0x33, 0x34, 0xed, 0x33, 0x33, 0x33, 0x33, 0x5f, + 0xfa, 0x10, 0x2d, 0xff, 0x90, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0x30, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf3, 0xa, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0xae, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xbe, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x20, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x34, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0x10, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0xbf, 0xff, 0x60, + 0x7f, 0xfd, 0x8f, 0xf1, 0x66, 0xc, 0xff, 0xa0, + 0xaf, 0xf8, 0x7, 0xf1, 0x6f, 0x13, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x71, 0x53, 0x1e, 0xff, 0xf0, + 0xdf, 0xff, 0xf7, 0x0, 0x1, 0xdf, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x60, 0xc, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x10, 0x8f, 0xff, 0xf0, + 0xcf, 0xff, 0x30, 0xb1, 0x67, 0x9, 0xff, 0xf0, + 0x9f, 0xf6, 0xb, 0xf2, 0x6e, 0x2, 0xff, 0xd0, + 0x6f, 0xff, 0xcf, 0xf2, 0x52, 0x2e, 0xff, 0xa0, + 0x1f, 0xff, 0xff, 0xf2, 0x2, 0xef, 0xff, 0x50, + 0x9, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xf4, 0xef, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x27, 0xab, 0xb9, 0x50, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x2, 0xab, 0xbb, 0xb7, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x7c, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, 0xff, + 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, + 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, + 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, + 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, + 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, + 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, + 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, + 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, + 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, + 0x40, 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x90, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xb0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xb0, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x85, 0xff, 0xff, 0x58, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x4, 0xff, 0x40, 0xb, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, 0x40, 0x4, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, + 0x40, 0x4, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x4, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x85, + 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, 0x73, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1d, + 0xf6, 0xe, 0x50, 0xd6, 0x8, 0xff, 0x1d, 0xff, + 0x60, 0xe5, 0xd, 0x60, 0x8f, 0xfc, 0xff, 0xf6, + 0xe, 0x50, 0xd6, 0x8, 0xff, 0xff, 0xff, 0x60, + 0xe5, 0xd, 0x60, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xab, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x10, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1d, + 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9f, + 0xff, 0xf9, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x40, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 86, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 86, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 39, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 137, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 257, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 376, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 481, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 487, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 544, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 592, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 624, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 674, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 686, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 692, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 698, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 788, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 879, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 921, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 998, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1173, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1334, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1502, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1586, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1608, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1636, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1686, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1721, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1771, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1848, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 2028, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2140, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2231, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2329, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2427, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2504, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2574, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2672, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2763, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2784, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2945, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3015, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3120, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3211, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3407, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3552, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3636, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3720, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3804, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3895, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4007, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4161, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4259, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4364, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4455, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4503, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4593, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4641, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4686, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4701, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 4710, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4765, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4855, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4916, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5006, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5072, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5132, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5222, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5305, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 5402, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5492, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5515, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5620, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5681, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5747, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5837, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5927, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5966, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6021, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6077, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6138, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6210, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6309, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6370, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 6468, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6523, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6580, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6656, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6676, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 6708, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 6716, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6926, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7076, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7266, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7416, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7521, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7731, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7941, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8160, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8370, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8543, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8753, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8833, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8953, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9172, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9322, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9469, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9593, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9782, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9953, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10124, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10248, .adv_w = 280, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10429, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10534, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10639, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10810, .adv_w = 280, .box_w = 18, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 10855, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11028, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11301, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11553, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11743, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11842, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11941, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12149, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12299, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12509, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12730, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13090, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13261, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13414, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13711, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13900, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14089, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14262, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14493, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14651, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14889, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15052, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15215, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15378, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15541, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15704, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15925, .adv_w = 280, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 16093, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16282, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16503, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16691, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16849, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 14, 0, 9, -7, 0, 0, + 0, 0, -18, -19, 2, 15, 7, 5, + -13, 2, 16, 1, 13, 3, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -10, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -2, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -5, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -5, 0, -9, 0, -39, 0, + 0, -6, 0, 6, 10, 0, 0, -6, + 3, 3, 11, 6, -5, 6, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, -4, -16, 0, -13, + -2, 0, 0, 0, 0, 1, 12, 0, + -10, -3, -1, 1, 0, -5, 0, 0, + -2, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, -3, 12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 10, -3, 0, 0, 6, -3, + -11, -44, 2, 9, 6, 1, -4, 0, + 12, 0, 10, 0, 10, 0, -30, 0, + -4, 10, 0, 11, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 26, 0, + 26, 0, 10, 0, 13, 4, 5, 10, + 0, 0, 0, -12, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -4, -6, 2, + 0, -3, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -18, 0, -20, 0, 0, 0, + 0, -2, 0, 32, -4, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -20, 0, 19, 0, 0, -12, 0, + 11, 0, -22, -31, -22, -6, 10, 0, + 0, -21, 0, 4, -7, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 10, -39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -3, 0, -7, -6, 0, -8, + -11, -11, -6, 0, -6, 0, -6, 0, + 0, 0, 0, -3, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -6, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -4, 0, -5, 0, 0, -2, 0, 10, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -3, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -5, 0, -10, + -2, -10, 6, 0, 0, -6, 3, 6, + 9, 0, -8, -1, -4, 0, -1, -15, + 3, -2, 2, -17, 3, 0, 0, 1, + -17, 0, -17, -3, -28, -2, 0, -16, + 0, 6, 9, 0, 4, 0, 0, 0, + 0, 1, 0, -6, -4, 0, -10, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -4, -3, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -6, 3, 0, 0, -4, + 2, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -6, 0, 10, -2, 1, -10, 0, 0, + 9, -16, -17, -13, -6, 3, 0, -3, + -21, -6, 0, -6, 0, -6, 5, -6, + -20, 0, -9, 0, 0, 2, -1, 3, + -2, 0, 3, 0, -10, -12, 0, -16, + -8, -7, -8, -10, -4, -9, -1, -6, + -9, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 0, -1, -3, 0, -5, -7, + -7, -1, 0, -10, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -6, 0, 0, 0, 0, -16, -10, 0, + 0, 0, -5, -16, 0, 0, -3, 3, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -6, -6, + 0, -3, -3, -4, 0, 0, 0, 0, + 0, 0, -10, 0, -3, 0, -5, -3, + 0, -7, -8, -10, -3, 0, -6, 0, + -10, 0, 0, 0, 0, 26, 0, 0, + 2, 0, 0, -4, 0, 3, 0, -14, + 0, 0, 0, 0, 0, -30, -6, 11, + 10, -3, -13, 0, 3, -5, 0, -16, + -2, -4, 3, -22, -3, 4, 0, 5, + -11, -5, -12, -11, -13, 0, 0, -19, + 0, 18, 0, 0, -2, 0, 0, 0, + -2, -2, -3, -9, -11, -1, -30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -2, -3, -5, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -7, 3, -2, -1, -8, + -3, 0, -4, -3, -2, 0, -5, -5, + 0, 0, -3, -1, -2, -5, -4, 0, + 0, -3, 0, 3, -2, 0, -7, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -4, + -10, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -3, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 13, -1, 0, -9, 0, + -2, 6, 0, -3, -13, -4, 5, 0, + 0, -15, -5, 3, -5, 2, 0, -2, + -3, -10, 0, -5, 2, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -6, 0, + -5, -3, -5, -3, -3, 0, -5, 2, + -6, -5, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -6, 0, 0, 0, -11, 0, + 2, -7, 6, 1, -2, -15, 0, 0, + -7, -3, 0, -13, -8, -9, 0, 0, + -14, -3, -13, -12, -15, 0, -8, 0, + 3, 21, -4, 0, -7, -3, -1, -3, + -5, -9, -6, -12, -13, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -22, -3, + 10, 7, -7, -12, 0, 1, -10, 0, + -16, -2, -3, 6, -29, -4, 1, 0, + 0, -21, -4, -17, -3, -23, 0, 0, + -22, 0, 19, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -12, -2, 0, -21, + 0, 0, 0, 0, -10, 0, -3, 0, + -1, -9, -15, 0, 0, -2, -5, -10, + -3, 0, -2, 0, 0, 0, 0, -14, + -3, -11, -10, -3, -5, -8, -3, -5, + 0, -6, -3, -11, -5, 0, -4, -6, + -3, -6, 0, 2, 0, -2, -11, 0, + 6, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -6, 13, 0, -3, -3, -4, + 0, 0, 0, 0, 0, 0, -10, 0, + -3, 0, -5, -3, 0, -7, -8, -10, + -3, 0, -6, 3, 13, 0, 0, 0, + 0, 26, 0, 0, 2, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 6, 3, -3, 0, -10, + -5, 0, 10, -11, -10, -6, -6, 13, + 6, 3, -28, -2, 6, -3, 0, -3, + 4, -3, -11, 0, -3, 3, -4, -3, + -10, -3, 0, 0, 10, 6, 0, -9, + 0, -18, -4, 9, -4, -12, 1, -4, + -11, -11, -3, 13, 3, 0, -5, 0, + -9, 0, 3, 11, -7, -12, -13, -8, + 10, 0, 1, -23, -3, 3, -5, -2, + -7, 0, -7, -12, -5, -5, -3, 0, + 0, -7, -7, -3, 0, 10, 7, -3, + -18, 0, -18, -4, 0, -11, -19, -1, + -10, -5, -11, -9, 9, 0, 0, -4, + 0, -6, -3, 0, -3, -6, 0, 5, + -11, 3, 0, 0, -17, 0, -3, -7, + -5, -2, -10, -8, -11, -7, 0, -10, + -3, -7, -6, -10, -3, 0, 0, 1, + 15, -5, 0, -10, -3, 0, -3, -6, + -7, -9, -9, -12, -4, -6, 6, 0, + -5, 0, -16, -4, 2, 6, -10, -12, + -6, -11, 11, -3, 2, -30, -6, 6, + -7, -5, -12, 0, -10, -13, -4, -3, + -3, -3, -7, -10, -1, 0, 0, 10, + 9, -2, -21, 0, -19, -7, 8, -12, + -22, -6, -11, -13, -16, -11, 6, 0, + 0, 0, 0, -4, 0, 0, 3, -4, + 6, 2, -6, 6, 0, 0, -10, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 3, 10, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 12, 0, 6, 1, 1, -4, + 0, 6, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, -3, 5, 0, 10, + 0, 0, 32, 4, -6, -6, 3, 3, + -2, 1, -16, 0, 0, 15, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 12, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -9, 0, + 0, 1, 0, 0, 3, 41, -6, -3, + 10, 9, -9, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, -9, 0, 0, 0, 0, + -7, -2, 0, 0, 0, -7, 0, -4, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -21, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -6, 0, -5, 0, + -9, 0, 0, 0, -5, 3, -4, 0, + 0, -9, -3, -7, 0, 0, -9, 0, + -3, 0, -15, 0, -4, 0, 0, -26, + -6, -13, -4, -12, 0, 0, -21, 0, + -9, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -5, 0, 0, + 0, 0, -7, 0, -7, 4, -4, 6, + 0, -2, -7, -2, -5, -6, 0, -4, + -2, -2, 2, -9, -1, 0, 0, 0, + -28, -3, -4, 0, -7, 0, -2, -15, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -7, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -9, -3, -6, 0, + 0, -9, 0, -3, 0, -15, 0, 0, + 0, 0, -31, 0, -6, -12, -16, 0, + 0, -21, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -5, -2, + -5, 1, 0, 0, 5, -4, 0, 10, + 16, -3, -3, -10, 4, 16, 5, 7, + -9, 4, 13, 4, 9, 7, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 15, -6, -3, 0, -3, + 26, 14, 26, 0, 0, 0, 3, 0, + 0, 12, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -27, -4, -3, -13, + -16, 0, 0, -21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -27, -4, -3, + -13, -16, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -7, 3, 0, -3, + 3, 6, 3, -10, 0, -1, -3, 3, + 0, 3, 0, 0, 0, 0, -8, 0, + -3, -2, -6, 0, -3, -13, 0, 20, + -3, 0, -7, -2, 0, -2, -5, 0, + -3, -9, -6, -4, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -27, + -4, -3, -13, -16, 0, 0, -21, 0, + 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -10, -4, -3, 10, -3, -3, + -13, 1, -2, 1, -2, -9, 1, 7, + 1, 3, 1, 3, -8, -13, -4, 0, + -12, -6, -9, -13, -12, 0, -5, -6, + -4, -4, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -9, 0, -2, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -3, 0, 0, -5, + -3, 3, 0, -5, -6, -2, 0, -9, + -2, -7, -2, -4, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 10, 0, 0, -6, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -2, 0, 0, -2, 0, -7, 0, 0, + 13, -4, -11, -10, 2, 4, 4, -1, + -9, 2, 5, 2, 10, 2, 11, -2, + -9, 0, 0, -13, 0, 0, -10, -9, + 0, 0, -6, 0, -4, -5, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -10, + -3, 12, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 3, 0, + 0, -11, 0, -2, -1, 0, -3, 4, + -3, 0, 0, 0, -13, -4, -7, 0, + -10, 0, 0, -15, 0, 12, -3, 0, + -6, 0, 2, 0, -3, 0, -3, -10, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 7, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -20, -18, 1, + 14, 10, 5, -13, 2, 13, 0, 12, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_20 = { +#else +lv_font_t lv_font_montserrat_20 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 22, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_20*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_22.c b/libraries/lvgl/src/font/lv_font_montserrat_22.c new file mode 100644 index 0000000..3390743 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_22.c @@ -0,0 +1,3646 @@ +/******************************************************************************* + * Size: 22 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 22 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_22.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 1 +#endif + +#if LV_FONT_MONTSERRAT_22 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x4f, 0xf2, 0x3f, 0xf2, 0x3f, 0xf1, 0x2f, 0xf1, + 0x1f, 0xf0, 0x1f, 0xf0, 0xf, 0xf0, 0xf, 0xe0, + 0xf, 0xd0, 0xf, 0xd0, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xb0, 0x6f, 0xf5, 0x2d, 0xd1, + + /* U+0022 "\"" */ + 0x9f, 0x30, 0x9f, 0x39, 0xf3, 0x9, 0xf2, 0x8f, + 0x20, 0x9f, 0x28, 0xf2, 0x8, 0xf2, 0x8f, 0x10, + 0x8f, 0x17, 0xf1, 0x8, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xf, 0x90, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x8f, 0x0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0xa, 0xe0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7a, 0xad, + 0xfa, 0xaa, 0xaf, 0xda, 0xa8, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xb0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf9, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, + 0x5f, 0x30, 0x0, 0x4a, 0xab, 0xfc, 0xaa, 0xac, + 0xfa, 0xaa, 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x6, 0xf2, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0xdb, 0x0, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0xf, 0x90, 0x0, + 0x0, 0x0, 0xcc, 0x0, 0x1, 0xf7, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xfe, + 0xc7, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x3f, 0xf8, 0x1c, 0xa0, 0x4a, 0xa0, 0x9, + 0xfa, 0x0, 0xca, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0xc, 0xa0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x7d, 0xa0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0xcc, 0x9f, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xa0, 0x1d, 0xf9, 0x0, 0x0, 0x0, 0xca, 0x0, + 0x7f, 0xb0, 0x42, 0x0, 0xc, 0xa0, 0x9, 0xfa, + 0xd, 0xf8, 0x20, 0xca, 0x17, 0xff, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x28, 0xcf, + 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0xc, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x6d, 0xfd, 0x40, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x6, 0xf8, 0x5a, 0xf3, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0xe, 0x90, 0x0, 0xcb, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x8e, 0x0, + 0x9, 0xf1, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x7e, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0xf, 0x80, 0x0, + 0xbc, 0x0, 0xec, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x16, 0xf5, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x3f, 0x70, 0x9f, 0xfb, 0x20, + 0x0, 0x1, 0x31, 0x0, 0xdc, 0x9, 0xf6, 0x5d, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x1f, 0x60, + 0x2, 0xf6, 0x0, 0x0, 0x0, 0x3f, 0x70, 0x4f, + 0x10, 0x0, 0xd9, 0x0, 0x0, 0x0, 0xdc, 0x0, + 0x6f, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x8, 0xf2, + 0x0, 0x4f, 0x10, 0x0, 0xc9, 0x0, 0x0, 0x3f, + 0x80, 0x0, 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x0, + 0xdd, 0x0, 0x0, 0x8, 0xe5, 0x3c, 0xd0, 0x0, + 0x8, 0xf3, 0x0, 0x0, 0x0, 0x8e, 0xfb, 0x10, + + /* U+0026 "&" */ + 0x0, 0x0, 0x4c, 0xee, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x0, 0x2f, 0xc0, 0x0, 0x0, 0x1, + 0xfe, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, 0x8f, + 0xc1, 0x8f, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xdf, + 0xa0, 0x0, 0x63, 0x0, 0x3f, 0xf4, 0x1, 0xdf, + 0xa0, 0xe, 0xe0, 0xb, 0xf6, 0x0, 0x1, 0xdf, + 0xa4, 0xf9, 0x0, 0xff, 0x10, 0x0, 0x1, 0xdf, + 0xff, 0x30, 0xe, 0xf4, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x9f, 0xe3, 0x0, 0x2, 0xaf, 0xff, + 0xa0, 0x1, 0xcf, 0xfe, 0xce, 0xff, 0xc3, 0xdf, + 0x80, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x1, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0x39, 0xf3, 0x8f, 0x28, 0xf2, 0x8f, 0x17, + 0xf1, 0x0, 0x0, + + /* U+0028 "(" */ + 0x0, 0x8f, 0x70, 0x1f, 0xf0, 0x8, 0xf8, 0x0, + 0xdf, 0x30, 0x2f, 0xe0, 0x6, 0xfa, 0x0, 0x8f, + 0x80, 0xb, 0xf5, 0x0, 0xcf, 0x40, 0xd, 0xf3, + 0x0, 0xef, 0x20, 0xd, 0xf3, 0x0, 0xcf, 0x40, + 0xb, 0xf5, 0x0, 0x8f, 0x70, 0x5, 0xfa, 0x0, + 0x2f, 0xe0, 0x0, 0xdf, 0x30, 0x7, 0xf8, 0x0, + 0x1f, 0xf0, 0x0, 0x8f, 0x70, + + /* U+0029 ")" */ + 0x1f, 0xe0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xfe, + 0x0, 0x0, 0xcf, 0x40, 0x0, 0x7f, 0x90, 0x0, + 0x4f, 0xc0, 0x0, 0x1f, 0xf0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf3, 0x0, 0xc, 0xf4, 0x0, 0xb, + 0xf5, 0x0, 0xc, 0xf4, 0x0, 0xd, 0xf3, 0x0, + 0xe, 0xf2, 0x0, 0x1f, 0xf0, 0x0, 0x3f, 0xc0, + 0x0, 0x7f, 0x90, 0x0, 0xcf, 0x40, 0x2, 0xfe, + 0x0, 0x9, 0xf7, 0x0, 0x1f, 0xe0, 0x0, + + /* U+002A "*" */ + 0x0, 0x4, 0xf0, 0x0, 0x0, 0x40, 0x4f, 0x0, + 0x50, 0x5f, 0xb6, 0xf4, 0xdf, 0x20, 0x4d, 0xff, + 0xfc, 0x30, 0x0, 0x8f, 0xff, 0x60, 0x4, 0xef, + 0xaf, 0xaf, 0xc2, 0x2a, 0x13, 0xf0, 0x3b, 0x0, + 0x0, 0x4f, 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x6d, 0x40, 0x0, 0x0, 0x0, 0x8, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x6c, 0xcc, + 0xef, 0xdc, 0xcc, 0x48, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0xb, 0xfb, 0xdf, 0xe4, 0xfb, 0x3f, 0x67, + 0xf1, 0xbb, 0x0, + + /* U+002D "-" */ + 0xad, 0xdd, 0xdd, 0x2c, 0xff, 0xff, 0xf2, + + /* U+002E "." */ + 0x0, 0x9, 0xf9, 0xff, 0xe8, 0xf7, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x8, 0xf6, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0x40, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, 0x81, + 0x3, 0xbf, 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, + 0xbf, 0xa0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x1a, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf5, 0xcf, + 0x50, 0x0, 0x0, 0x0, 0xaf, 0x7e, 0xf4, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0x9c, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0xaf, 0x80, 0x0, 0x0, 0x0, 0xdf, 0x55, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x1e, 0xf6, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x6f, 0xf7, 0x10, + 0x2b, 0xff, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x3a, 0xef, 0xd8, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xfd, 0xcf, 0xff, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + + /* U+0032 "2" */ + 0x0, 0x39, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x6f, 0xe7, 0x20, 0x15, + 0xef, 0xc0, 0x6, 0x20, 0x0, 0x0, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x46, 0x8b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x6, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x8f, 0xc5, + 0x10, 0x14, 0xcf, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x1, 0x7b, 0xef, 0xed, 0x81, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x3, 0x63, 0x0, 0x0, 0x1, 0xef, 0x70, + 0x0, 0x8f, 0x80, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x7f, 0xe1, 0x0, 0x0, + 0x8f, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + + /* U+0035 "5" */ + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xec, + 0x82, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x14, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, + 0x7, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xe7, + 0x20, 0x3, 0xbf, 0xf3, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x5a, 0xdf, 0xfd, 0x92, 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x7c, 0xef, 0xdb, 0x60, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, 0xb3, 0x0, + 0x4, 0x40, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x6a, 0xcb, + 0x82, 0x0, 0xef, 0x6d, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0x71, 0x2, 0xaf, 0xf4, 0xdf, 0xf4, + 0x0, 0x0, 0xa, 0xfb, 0xbf, 0xe0, 0x0, 0x0, + 0x4, 0xfe, 0x8f, 0xd0, 0x0, 0x0, 0x3, 0xfe, + 0x2f, 0xf2, 0x0, 0x0, 0x8, 0xfb, 0x9, 0xfd, + 0x40, 0x0, 0x6f, 0xf4, 0x0, 0xaf, 0xfe, 0xdf, + 0xff, 0x70, 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0x0, + + /* U+0037 "7" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, 0xc0, 0x0, + 0x0, 0x6, 0xfd, 0x5, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x4d, 0x90, 0x0, 0x0, 0x4f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x4f, 0xff, 0xee, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xa1, 0x0, 0x19, 0xff, 0x20, 0x5, 0xfe, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x7, 0xfc, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x4, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0xcf, 0xc4, 0x10, 0x3b, 0xfe, + 0x10, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfe, 0xcc, 0xef, 0xfa, 0x0, 0x7, + 0xfe, 0x50, 0x0, 0x3, 0xdf, 0x90, 0xe, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0xf, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xf2, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0x7, 0xff, 0x60, 0x0, 0x5, + 0xef, 0xa0, 0x0, 0xaf, 0xff, 0xed, 0xff, 0xfc, + 0x10, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x50, 0x0, + + /* U+0039 "9" */ + 0x0, 0x7, 0xcf, 0xfd, 0x91, 0x0, 0x0, 0x1c, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0xb, 0xfd, 0x30, + 0x0, 0x8f, 0xf2, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x9f, 0xb0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x15, 0xfd, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x2f, + 0xf3, 0x0, 0x0, 0xb, 0xff, 0x60, 0xbf, 0xe6, + 0x10, 0x3a, 0xff, 0xf7, 0x1, 0xcf, 0xff, 0xff, + 0xf9, 0xbf, 0x70, 0x0, 0x5a, 0xcc, 0x94, 0xc, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0x0, 0x7, 0x20, 0x1, + 0x6e, 0xfb, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x18, 0xce, 0xfd, 0xa4, 0x0, 0x0, + + /* U+003A ":" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf9, 0xff, + 0xe8, 0xf7, + + /* U+003B ";" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0xef, + 0xe7, 0xfc, 0x2f, 0x76, 0xf2, 0xac, 0x3, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xf5, 0x0, 0x1, 0x7d, 0xff, 0xc6, + 0x0, 0x3a, 0xff, 0xe9, 0x20, 0x0, 0x7f, 0xfc, + 0x50, 0x0, 0x0, 0x8, 0xfe, 0x71, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x56, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x50, + + /* U+003E ">" */ + 0x56, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x1, 0x6d, 0xff, 0x40, 0x0, 0x0, 0x2, 0x8f, + 0xf5, 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x29, + 0xef, 0xfa, 0x30, 0x0, 0x7f, 0xfd, 0x71, 0x0, + 0x0, 0x8, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4a, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xfe, 0xff, 0xfe, 0x30, 0x8f, 0xe5, 0x0, 0x4, + 0xef, 0xc0, 0x6, 0x10, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xea, 0x87, + 0x8a, 0xef, 0xd4, 0x0, 0x0, 0x0, 0xa, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x4d, 0xf8, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf7, 0x0, 0x6, 0xf9, 0x0, 0x5, 0xcf, 0xfc, + 0x50, 0xfe, 0xa, 0xf3, 0x0, 0xec, 0x0, 0xa, + 0xff, 0xdc, 0xef, 0x9f, 0xe0, 0xe, 0xc0, 0x6f, + 0x40, 0x7, 0xfd, 0x20, 0x0, 0x8f, 0xfe, 0x0, + 0x6f, 0x2a, 0xf0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0xaf, 0xe0, 0x1, 0xf6, 0xdc, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0x3, 0xfe, 0x0, 0xe, 0x9e, 0xa0, + 0x6, 0xf9, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, + 0xda, 0xea, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, + 0xfe, 0x0, 0xd, 0xad, 0xc0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0xe9, 0xaf, 0x0, + 0xe, 0xf2, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x2f, + 0x65, 0xf5, 0x0, 0x7f, 0xd2, 0x0, 0x8, 0xff, + 0xf1, 0x9, 0xf1, 0xe, 0xd0, 0x0, 0xaf, 0xfc, + 0xce, 0xf9, 0x9f, 0xec, 0xf8, 0x0, 0x6f, 0x90, + 0x0, 0x5c, 0xff, 0xc5, 0x1, 0xbf, 0xe7, 0x0, + 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xfe, 0xa8, 0x89, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xee, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x87, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x21, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfb, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf4, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0xc, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x60, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0x9, 0xff, 0xcc, 0xcc, 0xcc, + 0xef, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xb0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x5, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe0, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0xbf, + 0xed, 0xdd, 0xdd, 0xff, 0xfa, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x7, 0xff, 0x50, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xa0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x8f, 0xb0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0xbf, 0x80, 0x0, 0x0, 0x7, 0xff, + 0x20, 0xbf, 0xed, 0xdd, 0xdd, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xbf, + 0x80, 0x0, 0x0, 0x14, 0xcf, 0xd0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0xbf, 0x80, 0x0, 0x0, 0x1, + 0x9f, 0xf2, 0xbf, 0xed, 0xdd, 0xdd, 0xef, 0xff, + 0x70, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x93, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xa5, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xcf, 0xfa, 0x41, 0x2, 0x6e, 0xfc, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0x20, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x92, 0x0, 0xc, 0xff, 0xa4, 0x10, 0x16, 0xef, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xea, 0x50, 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0xee, 0xee, 0xee, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0xcf, 0xfa, 0x41, 0x1, 0x5c, 0xfe, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x1c, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x8f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x12, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0x10, 0xc, 0xff, 0xa4, 0x10, 0x25, 0xcf, + 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+0049 "I" */ + 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, + 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, + 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, + + /* U+004A "J" */ + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0x3, 0x50, 0x0, 0x5, 0xfe, 0x0, + 0xef, 0x70, 0x3, 0xef, 0x90, 0x8, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x4, 0xae, 0xfe, 0x91, 0x0, + + /* U+004B "K" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, 0xd1, 0xbf, + 0x80, 0x0, 0x0, 0x8, 0xfe, 0x10, 0xbf, 0x80, + 0x0, 0x0, 0x7f, 0xe2, 0x0, 0xbf, 0x80, 0x0, + 0x6, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x5f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x4, 0xff, 0x50, + 0x0, 0x0, 0xbf, 0x80, 0x3f, 0xf7, 0x0, 0x0, + 0x0, 0xbf, 0x83, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xae, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb4, 0xff, 0x90, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x8, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0xbf, 0xe1, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x1, 0xef, + 0x90, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf6, + + /* U+004C "L" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xab, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xab, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0xbf, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xaf, 0xef, 0xab, 0xf7, 0xef, 0x30, 0x0, 0x0, + 0x3f, 0xd7, 0xfa, 0xbf, 0x65, 0xfc, 0x0, 0x0, + 0xc, 0xf5, 0x6f, 0xab, 0xf6, 0xc, 0xf6, 0x0, + 0x5, 0xfc, 0x6, 0xfa, 0xbf, 0x60, 0x3f, 0xe0, + 0x0, 0xef, 0x30, 0x6f, 0xbb, 0xf6, 0x0, 0xaf, + 0x80, 0x7f, 0x90, 0x6, 0xfb, 0xbf, 0x60, 0x1, + 0xff, 0x3f, 0xf1, 0x0, 0x6f, 0xbb, 0xf6, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x6, 0xfb, 0xbf, 0x60, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x6f, 0xbb, 0xf6, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x6, 0xfb, 0xbf, + 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x6f, 0xbb, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfb, + + /* U+004E "N" */ + 0xbf, 0x70, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xbf, 0xf9, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x86, 0xff, 0x50, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x9f, 0xf2, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0xc, 0xfd, 0x0, 0xa, 0xf8, + 0xbf, 0x80, 0x2, 0xef, 0xb0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x4f, 0xf7, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x8, 0xff, 0x4a, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0xbf, 0xeb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x1e, 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+004F "O" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, 0xff, + 0x40, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x1b, + 0xfe, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfa, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x4e, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x6c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x12, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xa0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xe2, 0x0, 0xc, + 0xff, 0xa4, 0x10, 0x26, 0xef, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xab, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x1, + 0x6e, 0xfd, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, + 0xff, 0x40, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x1, 0xbf, 0xe1, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfa, 0x0, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0xef, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x50, 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x40, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfa, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xdf, 0xf9, + 0x30, 0x1, 0x6d, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xef, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe5, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xec, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xef, 0xd7, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0x9b, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf5, 0xbf, 0x80, 0x0, 0x1, + 0x5d, 0xfd, 0xb, 0xff, 0xee, 0xef, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x5f, 0xe1, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0xbf, 0xa0, 0xb, 0xf8, 0x0, 0x0, + 0x1, 0xef, 0x50, 0xbf, 0x80, 0x0, 0x0, 0x6, + 0xfe, 0x1b, 0xf8, 0x0, 0x0, 0x0, 0xb, 0xfa, + + /* U+0053 "S" */ + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x6, + 0xff, 0xff, 0xef, 0xff, 0xe0, 0x3, 0xff, 0x92, + 0x0, 0x4, 0xba, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xea, 0x50, 0x0, 0x0, 0x0, 0x6b, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x38, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfb, 0x4, 0x20, + 0x0, 0x0, 0x0, 0xaf, 0x90, 0xdf, 0x94, 0x0, + 0x1, 0x8f, 0xf3, 0x7, 0xff, 0xff, 0xef, 0xff, + 0xf7, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, + 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xcf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf2, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xa, 0xff, 0x71, 0x0, 0x4d, + 0xfe, 0x10, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x70, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x9, + 0xfa, 0x0, 0x8, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0xbf, 0xa0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0xd, 0xf8, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x6f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x9d, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x2f, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x7, 0xfc, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x2f, 0xf1, + 0x0, 0x0, 0xb, 0xfc, 0xf9, 0x0, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0xff, + 0x3f, 0xe0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x5f, 0xa0, 0xdf, 0x40, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0xb, + 0xf5, 0x8, 0xf9, 0x0, 0x2, 0xff, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x1, 0xff, 0x0, 0x3f, 0xe0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0xdf, 0x30, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x3f, 0xf0, 0xb, 0xf5, 0x0, 0x8, + 0xf9, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x51, 0xff, 0x0, 0x0, 0x3f, 0xe0, 0x6f, 0xb0, + 0x0, 0x0, 0x0, 0x9, 0xfa, 0x6f, 0xa0, 0x0, + 0x0, 0xdf, 0x3c, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfb, 0xf5, 0x0, 0x0, 0x8, 0xfa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + + /* U+0058 "X" */ + 0x1e, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x5f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xef, 0x50, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x6f, 0xe1, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x7, 0xfe, + 0x10, 0x0, 0x1e, 0xf8, 0x0, 0x0, 0xc, 0xfb, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x5, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0x3, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x1f, 0xf4, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x1, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf1, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x4f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xef, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xbf, 0xff, 0xeb, 0xfd, 0xcb, 0xbf, 0x60, 0xb, + 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, + 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, + 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, + 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, + 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, + 0xfd, 0xcb, 0xbf, 0xff, 0xe0, + + /* U+005C "\\" */ + 0xaf, 0x40, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0xa, + 0xf4, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, + 0x0, 0xe, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, 0xc, + 0xf2, + + /* U+005D "]" */ + 0x9f, 0xff, 0xf0, 0x7c, 0xcf, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x7c, 0xcf, 0xf0, 0x9f, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x48, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x0, 0x4, 0xfc, 0xf1, 0x0, + 0x0, 0x0, 0xae, 0x2f, 0x80, 0x0, 0x0, 0x1f, + 0x80, 0xbe, 0x0, 0x0, 0x8, 0xf2, 0x4, 0xf5, + 0x0, 0x0, 0xeb, 0x0, 0xe, 0xb0, 0x0, 0x5f, + 0x50, 0x0, 0x8f, 0x20, 0xb, 0xe0, 0x0, 0x1, + 0xf8, 0x2, 0xf8, 0x0, 0x0, 0xb, 0xe0, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x40, + + /* U+0060 "`" */ + 0x1b, 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, + 0x6, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x2, 0x8d, 0xff, 0xea, 0x20, 0x4, 0xff, 0xfe, + 0xef, 0xff, 0x30, 0x1d, 0x61, 0x0, 0x2c, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x30, 0x3a, 0xef, 0xff, 0xff, + 0xf3, 0x4f, 0xfc, 0x98, 0x88, 0xff, 0x3c, 0xf8, + 0x0, 0x0, 0xe, 0xf3, 0xef, 0x30, 0x0, 0x1, + 0xff, 0x3b, 0xf8, 0x0, 0x0, 0xbf, 0xf3, 0x3f, + 0xfc, 0x99, 0xef, 0xef, 0x30, 0x2a, 0xef, 0xea, + 0x2c, 0xf3, + + /* U+0062 "b" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, + 0x9f, 0xff, 0xef, 0xfe, 0x40, 0xf, 0xff, 0xc3, + 0x0, 0x2b, 0xfe, 0x10, 0xff, 0xd0, 0x0, 0x0, + 0xc, 0xf9, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xe0, 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, + 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, 0x50, + 0x0, 0x0, 0x5, 0xfe, 0xf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xff, 0xfc, 0x30, 0x3, 0xcf, + 0xe1, 0xf, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xff, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x7c, 0xef, 0xd8, 0x0, 0x0, 0x3d, + 0xff, 0xfe, 0xff, 0xe2, 0x1, 0xef, 0xc3, 0x0, + 0x2b, 0xf8, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, + 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, 0x1, 0xef, + 0xc3, 0x0, 0x2c, 0xf9, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7c, 0xef, 0xd7, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf0, 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, + 0x4e, 0xff, 0xef, 0xff, 0x9f, 0xf0, 0x1e, 0xfc, + 0x20, 0x3, 0xcf, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xef, 0x50, 0x0, 0x0, 0x5, + 0xff, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, + 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xe, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x9f, 0xc0, 0x0, + 0x0, 0xc, 0xff, 0x1, 0xef, 0xa1, 0x0, 0x1a, + 0xff, 0xf0, 0x4, 0xef, 0xfc, 0xdf, 0xf9, 0xff, + 0x0, 0x1, 0x8d, 0xff, 0xb5, 0xf, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x3, + 0xef, 0xfd, 0xef, 0xfa, 0x0, 0x1, 0xef, 0x90, + 0x0, 0x3d, 0xf8, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x2f, 0xf1, 0xe, 0xf2, 0x0, 0x0, 0x0, 0xaf, + 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf, + 0xf9, 0x88, 0x88, 0x88, 0x88, 0x40, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x1e, 0xfc, 0x40, 0x1, 0x7f, + 0x50, 0x0, 0x3e, 0xff, 0xfe, 0xff, 0xf5, 0x0, + 0x0, 0x7, 0xce, 0xfd, 0x92, 0x0, + + /* U+0066 "f" */ + 0x0, 0x2, 0xbf, 0xfc, 0x30, 0x0, 0xef, 0xed, + 0xf3, 0x0, 0x7f, 0xc0, 0x2, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0xd, 0xf2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xbd, 0xf2, 0x3, 0xff, + 0xb2, 0x0, 0x19, 0xff, 0xf2, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xf2, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xf2, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0xe, 0xf2, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xf2, + 0x3, 0xff, 0xa2, 0x0, 0x19, 0xff, 0xf2, 0x0, + 0x5f, 0xff, 0xee, 0xff, 0xaf, 0xf2, 0x0, 0x2, + 0x9d, 0xff, 0xc5, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x1, 0xec, 0x51, 0x0, 0x7, + 0xff, 0x60, 0x2, 0xdf, 0xff, 0xee, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, + + /* U+0068 "h" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, + 0xbe, 0xfd, 0x80, 0x0, 0xff, 0xbf, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xfa, 0x20, 0x6, 0xff, 0x80, + 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xd0, 0xff, 0x50, + 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, 0x0, 0x0, + 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+0069 "i" */ + 0x1d, 0xe2, 0x5f, 0xf6, 0xa, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x9, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xf, 0xf2, + 0x1, 0x0, 0x4f, 0xf0, 0xb, 0xfd, 0xff, 0x80, + 0x8, 0xef, 0xe8, 0x0, + + /* U+006B "k" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x2, 0xef, 0x80, 0xff, 0x10, 0x0, 0x3e, + 0xf8, 0x0, 0xff, 0x10, 0x3, 0xff, 0x80, 0x0, + 0xff, 0x10, 0x4f, 0xf8, 0x0, 0x0, 0xff, 0x15, + 0xff, 0x90, 0x0, 0x0, 0xff, 0x7f, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0xff, 0xf6, 0xa, 0xfe, 0x20, 0x0, 0xff, 0x60, + 0x0, 0xcf, 0xc0, 0x0, 0xff, 0x10, 0x0, 0x2e, + 0xf9, 0x0, 0xff, 0x10, 0x0, 0x4, 0xff, 0x50, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xf2, + + /* U+006C "l" */ + 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, + 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, + 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, + 0xff, 0x10, + + /* U+006D "m" */ + 0xff, 0x6, 0xcf, 0xfc, 0x60, 0x3, 0xae, 0xfe, + 0xa2, 0x0, 0xff, 0xbf, 0xfd, 0xff, 0xfa, 0x6f, + 0xfe, 0xdf, 0xff, 0x30, 0xff, 0xf7, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xd0, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x2f, 0xf2, + 0xff, 0x40, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0xd, 0xf5, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + + /* U+006E "n" */ + 0xff, 0x6, 0xce, 0xfd, 0x80, 0x0, 0xff, 0xbf, + 0xfd, 0xef, 0xfd, 0x0, 0xff, 0xf8, 0x0, 0x4, + 0xef, 0x80, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xd0, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, + 0x0, 0x0, 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x3e, 0xff, 0xef, 0xff, 0xd3, 0x0, 0x1, 0xef, + 0xb2, 0x0, 0x2b, 0xfe, 0x10, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0xcf, 0x80, 0xe, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, + 0xf0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x8, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x1, + 0xef, 0xc3, 0x0, 0x3c, 0xfd, 0x10, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0xf, 0xfa, + 0xff, 0xdd, 0xff, 0xe4, 0x0, 0xff, 0xfb, 0x10, + 0x1, 0xaf, 0xe1, 0xf, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0xff, 0x50, 0x0, 0x0, 0x4, 0xfe, + 0xf, 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, + 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, 0xf5, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0xff, 0xd0, 0x0, 0x0, + 0xd, 0xf8, 0xf, 0xff, 0xc3, 0x0, 0x3c, 0xfe, + 0x10, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0xf, + 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb4, 0xf, 0xf0, 0x4, + 0xef, 0xfe, 0xff, 0xf8, 0xff, 0x1, 0xef, 0xb2, + 0x0, 0x3c, 0xff, 0xf0, 0x9f, 0xc0, 0x0, 0x0, + 0xd, 0xff, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xf, + 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0xef, 0x50, + 0x0, 0x0, 0x5, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0x1e, 0xfc, 0x30, 0x3, 0xcf, + 0xff, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x9f, 0xf0, + 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + + /* U+0072 "r" */ + 0xff, 0x5, 0xbe, 0x4f, 0xf8, 0xff, 0xf4, 0xff, + 0xfc, 0x41, 0xf, 0xfd, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0xff, 0x10, 0x0, + 0xf, 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, + 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf1, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x29, 0xdf, 0xfd, 0x93, 0x0, 0x5f, 0xff, + 0xde, 0xff, 0xc0, 0xe, 0xf8, 0x0, 0x1, 0x73, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x28, 0xcf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x50, 0xd8, 0x20, 0x0, 0x4f, 0xf3, 0x4f, + 0xff, 0xfe, 0xff, 0xf9, 0x0, 0x28, 0xcf, 0xfd, + 0xb4, 0x0, + + /* U+0074 "t" */ + 0x0, 0x58, 0x30, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xc0, 0x2, 0x0, 0x1, 0xff, 0xfe, 0xf4, 0x0, + 0x2, 0xbe, 0xeb, 0x20, + + /* U+0075 "u" */ + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x4, 0xfe, 0x1f, 0xf1, 0x0, 0x0, 0x6, 0xfe, + 0xe, 0xf5, 0x0, 0x0, 0xc, 0xfe, 0x9, 0xfe, + 0x30, 0x0, 0x9f, 0xfe, 0x1, 0xdf, 0xfe, 0xdf, + 0xfb, 0xfe, 0x0, 0x8, 0xdf, 0xfc, 0x52, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xff, + 0x30, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x8f, 0x90, + 0x0, 0x3, 0xfd, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0xa, 0xf6, 0x0, 0x0, 0xb, 0xf7, 0x0, 0x1f, + 0xe0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0xdf, 0x40, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xb5, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x50, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x6, 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0xc, 0xf1, 0xf, 0xf0, 0x0, 0x0, + 0xdf, 0xfb, 0x0, 0x0, 0x2f, 0xb0, 0x9, 0xf6, + 0x0, 0x3, 0xfa, 0xdf, 0x10, 0x0, 0x8f, 0x50, + 0x3, 0xfb, 0x0, 0x9, 0xf4, 0x8f, 0x70, 0x0, + 0xdf, 0x0, 0x0, 0xef, 0x10, 0xf, 0xe0, 0x2f, + 0xc0, 0x3, 0xfa, 0x0, 0x0, 0x8f, 0x60, 0x5f, + 0x80, 0xc, 0xf2, 0x9, 0xf4, 0x0, 0x0, 0x2f, + 0xc0, 0xbf, 0x20, 0x6, 0xf8, 0xe, 0xe0, 0x0, + 0x0, 0xc, 0xf3, 0xfc, 0x0, 0x0, 0xfe, 0x5f, + 0x90, 0x0, 0x0, 0x7, 0xfe, 0xf6, 0x0, 0x0, + 0xaf, 0xdf, 0x30, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xa0, 0x0, 0x0, 0xe, 0xf7, 0x0, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xf4, 0x0, 0x0, 0x2f, 0xf3, 0x5, 0xfe, + 0x10, 0x0, 0xcf, 0x70, 0x0, 0x9f, 0xb0, 0x9, + 0xfb, 0x0, 0x0, 0xd, 0xf7, 0x4f, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xef, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0xdf, 0x60, 0x0, + 0x0, 0x2f, 0xf4, 0x2f, 0xf3, 0x0, 0x0, 0xcf, + 0x80, 0x6, 0xfe, 0x10, 0x9, 0xfc, 0x0, 0x0, + 0xaf, 0xb0, 0x5f, 0xe1, 0x0, 0x0, 0xd, 0xf7, + + /* U+0079 "y" */ + 0xd, 0xf6, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x7f, 0xb0, + 0x0, 0x4, 0xfc, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0xb, 0xf5, 0x0, 0x0, 0x9, 0xf9, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x9f, 0x70, + 0x0, 0x0, 0x0, 0xbf, 0x71, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x2e, 0xf5, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0xcc, 0xcc, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xdf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xd1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xfa, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x40, 0x9, 0xff, 0xd3, 0x0, + 0xef, 0x60, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, + 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, 0x20, + 0x0, 0xf, 0xf2, 0x0, 0x1, 0xff, 0x10, 0x9, + 0xef, 0xb0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf2, + 0x0, 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, + 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x8, 0xff, 0xd3, 0x0, 0x8, + 0xef, 0x40, + + /* U+007C "|" */ + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, + 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, + 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x40, + + /* U+007D "}" */ + 0x9f, 0xd6, 0x0, 0x7, 0xef, 0xf4, 0x0, 0x0, + 0xaf, 0xa0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x6, 0xfb, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0x1, 0xef, 0xd5, 0x0, 0xb, 0xff, 0x70, 0x4, + 0xfe, 0x10, 0x0, 0x5f, 0xb0, 0x0, 0x6, 0xfb, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0xaf, 0x90, 0x7, 0xef, 0xf3, 0x0, 0x9f, 0xd5, + 0x0, 0x0, + + /* U+007E "~" */ + 0x1, 0x89, 0x50, 0x0, 0x9, 0x51, 0xef, 0xff, + 0xa0, 0x2, 0xf5, 0x7f, 0x41, 0x8f, 0xd8, 0xdf, + 0x1a, 0xb0, 0x0, 0x3c, 0xfd, 0x40, + + /* U+00B0 "°" */ + 0x0, 0x4c, 0xfd, 0x60, 0x0, 0x4f, 0x83, 0x6f, + 0x80, 0xc, 0x80, 0x0, 0x5f, 0x0, 0xf4, 0x0, + 0x1, 0xf3, 0xd, 0x60, 0x0, 0x4f, 0x10, 0x7e, + 0x50, 0x3d, 0xa0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x0, 0x2, 0x10, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x1, 0xcf, 0xb0, 0x7f, 0xff, 0x56, + 0xff, 0xf5, 0xb, 0xfa, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0xa, 0xff, 0xea, 0x50, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0x54, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0x69, 0x9d, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x2a, 0xff, 0xfc, 0x50, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xcc, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x42, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, 0x24, 0xf8, 0x22, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x22, 0x8f, 0xff, 0xff, + 0xff, 0xb9, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x44, 0x9f, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf7, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, 0x66, 0xff, + 0x74, 0x44, 0x44, 0x44, 0x47, 0xff, 0x66, 0xaf, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6f, 0xf6, 0x0, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcd, 0xfe, 0x0, 0x6f, 0xff, 0xee, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, + 0xff, 0xfc, 0x88, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x88, 0xcf, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf6, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x6f, 0xfe, 0xcc, 0xff, 0x41, 0x11, 0x11, + 0x11, 0x14, 0xff, 0xcc, 0xef, 0xfd, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xdf, + 0xc6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6c, + + /* U+F00B "" */ + 0xbf, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, + 0x88, 0x87, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x31, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x47, 0x88, 0x87, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x31, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x37, 0x77, 0x76, 0x0, 0x57, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x74, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xe8, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x4f, 0xff, 0x80, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0xef, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x2, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf8, 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x8, 0xc4, 0x0, 0x0, 0x0, 0x2, 0xc9, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xff, 0xb0, + 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xf1, + 0x7f, 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xfa, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x2, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xff, 0xe0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x50, 0xe, 0xff, 0x80, + 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0xe0, 0xe, 0xff, 0x80, 0x5f, 0xff, + 0xf2, 0x0, 0x3, 0xff, 0xfe, 0x30, 0xe, 0xff, + 0x80, 0x8, 0xff, 0xfc, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0xe, 0xff, 0x80, 0x0, 0xaf, 0xff, 0x50, + 0x1f, 0xff, 0x90, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xb0, 0x6f, 0xff, 0x30, 0x0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xfd, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x3, 0xff, 0xf3, 0x9f, 0xfd, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x4, 0xff, 0xf2, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x20, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, 0x0, 0x4f, + 0xff, 0xfd, 0x62, 0x1, 0x49, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0xee, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2a, + 0xff, 0xff, 0xff, 0xb2, 0x3, 0x80, 0x0, 0x0, + 0x8f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xf8, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xaf, 0xff, + 0xff, 0xff, 0xf2, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x20, 0x0, 0x1, 0xff, 0xff, + 0xf9, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xb2, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x2a, 0xf3, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xdf, 0xff, 0xfe, + 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x66, + 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe9, 0x0, + 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x37, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb4, 0xdf, 0xff, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x80, + 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x50, 0x8f, 0x50, 0x9f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0x70, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x12, 0xdf, 0xff, 0xff, 0xa0, + 0x3e, 0xff, 0xe3, 0x0, 0xa, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xc1, 0x2d, 0xff, 0xf6, + 0xc, 0xff, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xb, 0xff, 0xf8, 0x9f, 0xf5, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x8, + 0xff, 0x50, 0x93, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x5, 0x70, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x40, 0x0, 0x1, 0x44, 0x44, 0x41, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfc, 0x4, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x23, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfa, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xe1, 0xdf, 0xfa, 0x44, 0x44, + 0x20, 0x0, 0x0, 0x0, 0x34, 0x44, 0x4d, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x5, 0x9c, + 0xdd, 0xb8, 0x30, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xa5, 0x34, 0x6b, 0xff, 0xff, 0xce, 0xff, 0x0, + 0xaf, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x7d, 0xdc, 0xbf, 0xff, 0xff, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xee, 0xee, 0xee, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, + 0xff, 0xff, 0xf4, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x5, 0xcf, 0xff, 0xf2, + 0x0, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xff, 0xf0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x28, 0xdf, 0xff, 0xfe, 0xa3, 0x0, + 0x0, 0x0, 0xab, 0xa0, 0x0, 0x0, 0x1, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x24, 0x44, + 0x47, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x24, 0x44, 0x47, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2f, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xdf, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1, 0xfe, 0x20, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x1, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x5, 0xf9, 0x0, 0x9f, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0xdf, 0x80, 0x24, 0x44, 0x47, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xf7, 0x4, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x86, 0x0, + 0x4f, 0xf1, 0xd, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xf7, 0x0, 0xcf, 0x60, 0x9f, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, + 0xf1, 0x7, 0xf9, 0x6, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x40, 0x5f, 0xb0, + 0x5f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xf2, 0x5, 0xfa, 0x5, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xd, 0xfc, 0x0, 0x9f, + 0x80, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xfd, 0x20, 0x1e, 0xf3, 0xb, 0xf6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0xa, + 0xfc, 0x1, 0xff, 0x20, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x20, 0x8f, 0xc0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0x40, 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x0, 0x0, 0x19, 0x20, 0x1d, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, + 0x0, 0x0, 0x2d, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x50, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, + 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0x56, + 0xef, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x2, 0xed, 0x10, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xc0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9f, 0xf5, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x3f, 0xfe, 0x21, 0x8b, 0xff, 0xff, 0xff, 0x50, + 0xa, 0xff, 0xf7, 0x20, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xab, 0xa7, 0x20, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x82, 0xff, + 0xe0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x92, 0xff, 0xe0, + 0x0, 0x3e, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x92, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x92, 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xff, + 0xf9, 0x2f, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xe0, 0x0, 0x8f, 0xff, 0xff, 0xf9, + 0x2f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x92, + 0xff, 0xe0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x92, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+F04B "" */ + 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x3d, 0xff, 0xff, 0xe6, 0x0, 0x3, 0xdf, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x30, 0xf, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x24, 0x44, 0x43, 0x0, + + /* U+F04D "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdc, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x7f, + 0xfd, 0x20, 0x0, 0x0, 0xd, 0xff, 0x47, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xdf, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0xd, 0xff, 0x47, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xf4, 0x7f, 0xff, 0xff, + 0xff, 0x60, 0xd, 0xff, 0x47, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xdf, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x8d, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xcd, + 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xdf, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0x47, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xf4, + 0x7f, 0xff, 0xff, 0x80, 0x0, 0xd, 0xff, 0x47, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf4, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0xd, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xea, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x27, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x30, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x1, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x1d, 0xff, 0xfc, + 0x10, 0x0, 0x1, 0xdf, 0xff, 0xc1, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F054 "" */ + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x1, 0xbe, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x14, 0x55, + 0x55, 0x59, 0xff, 0xfc, 0x55, 0x55, 0x54, 0x20, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, + 0xdd, 0xde, 0xff, 0xff, 0xdd, 0xdd, 0xdc, 0x90, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0xce, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x71, 0x0, 0x2, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, 0x20, 0x2, + 0x53, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x30, 0x0, 0x6f, 0xfc, 0x10, 0x7f, + 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0xf5, 0x1, 0x3, 0xef, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xf3, 0xef, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, + 0xad, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0x10, 0xaf, 0xff, + 0xfe, 0x10, 0x8f, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x1f, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x6c, 0xdb, 0x40, 0xa, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfc, 0x52, 0x12, 0x6d, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x60, 0x28, 0xcf, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xfc, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x6e, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, + 0x15, 0x40, 0x1, 0xdf, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0xff, 0xfb, 0x1f, 0xfe, + 0x50, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7e, + 0x30, 0x0, 0x9f, 0xff, 0xef, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xfd, 0x1, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0x55, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x3d, 0xff, 0xfe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xe8, 0x31, 0x20, 0x0, 0x3e, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xbf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xef, 0xfd, 0x80, 0x0, 0x8, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x88, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0x0, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xfd, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x17, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0x0, 0x12, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x9f, 0xff, 0x50, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x55, 0xbf, + 0xff, 0x60, 0xaf, 0xff, 0xd5, 0xaf, 0xff, 0x80, + 0x0, 0x0, 0xb, 0xf8, 0xa, 0xff, 0xfe, 0x10, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, 0x9f, + 0xff, 0xe2, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x10, + 0x0, 0x2a, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x41, 0xda, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0x90, 0x8f, + 0xff, 0x30, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfa, 0x67, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x3, 0x77, 0xbf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x50, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x40, + + /* U+F078 "" */ + 0x9, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcb, 0x18, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xfc, 0x9f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xd0, 0xbf, 0xff, 0xe3, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, + 0x0, 0xbf, 0xff, 0xe3, 0x1, 0xcf, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe4, 0xcf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x15, 0xbb, 0xbb, + 0xbb, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0xdf, 0xfb, + 0xef, 0xdc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x9f, 0xc0, 0xef, 0xd1, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x3, 0x0, 0xef, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0xaf, 0xf1, + 0x19, 0x30, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0xaf, 0xf3, 0xdf, 0xe0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xef, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x30, 0x6, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x5, 0x78, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcb, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x11, 0x11, 0xef, + 0xff, 0xf9, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xe0, 0xdf, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x26, + 0x66, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x52, 0x22, 0x25, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xf6, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x4d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xb9, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x1, 0x8c, 0xda, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0xef, 0xe1, + 0xc, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0xff, 0xd0, 0xa, 0xff, 0x30, 0xb, 0xff, 0xff, + 0xe3, 0x0, 0xbf, 0xfc, 0xbf, 0xff, 0x10, 0xcf, + 0xff, 0xfe, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x2d, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x33, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xe1, 0xc, 0xff, + 0x20, 0x2e, 0xff, 0xff, 0xc1, 0x0, 0xff, 0xd0, + 0xa, 0xff, 0x30, 0x2, 0xef, 0xff, 0xfc, 0x10, + 0xbf, 0xfc, 0xbf, 0xff, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd1, 0x3, 0xdf, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xe, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, 0xff, 0x70, + 0x1, 0x22, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, + 0xff, 0xf2, 0xdf, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8b, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xb7, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x10, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf5, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, + 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xfe, 0x51, 0x3b, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xda, 0xbf, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0xce, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x13, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + 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, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 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, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, + + /* U+F0E0 "" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0xb1, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x3e, 0xfe, 0x50, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, + 0xff, 0xf9, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x31, 0xbf, 0xff, 0xff, 0xff, 0xd3, 0x1b, 0xff, + 0xff, 0xff, 0xb1, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x6f, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x12, 0x99, 0x22, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x33, 0x8f, 0xff, 0xff, 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, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F0E7 "" */ + 0x0, 0x3, 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x66, 0x66, 0x51, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1, 0x22, 0x22, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xdf, 0xbc, + 0xfc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfe, 0x1, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfc, 0x1, 0x22, 0x22, 0x22, 0x1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xfc, 0xe, + 0x70, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xfc, 0xe, 0xf7, 0x0, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0x70, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf2, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x58, 0x88, 0x84, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x80, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x81, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x0, + 0x8f, 0x10, 0x7f, 0x10, 0x5f, 0x30, 0x3f, 0x50, + 0x1f, 0xfc, 0xff, 0xc0, 0x7, 0xe0, 0x6, 0xf0, + 0x4, 0xf2, 0x2, 0xf4, 0x0, 0xff, 0xcf, 0xfc, + 0x0, 0x8f, 0x0, 0x7f, 0x10, 0x5f, 0x30, 0x3f, + 0x50, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0x66, 0xbf, 0x66, 0xaf, 0x76, 0x8f, + 0x86, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x6, + 0xf0, 0x5, 0xf1, 0x3, 0xf3, 0x1, 0xff, 0xff, + 0xcf, 0xff, 0xfd, 0x0, 0x7f, 0x0, 0x5f, 0x10, + 0x3f, 0x30, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xfe, 0x66, 0xcf, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x9f, 0xa6, 0x7f, 0xfc, 0xff, 0xc0, + 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, + 0x0, 0xff, 0xcf, 0xfc, 0x0, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x40, 0xf, 0xfc, 0xff, + 0xfc, 0xce, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, + 0xfd, 0xcc, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x37, 0x77, 0x77, 0x77, 0x74, 0x5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xfa, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xfa, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9c, 0xde, 0xdc, 0xb8, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xdb, 0x99, 0x9a, + 0xcf, 0xff, 0xff, 0xff, 0xb1, 0x0, 0xa, 0xff, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf4, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xf2, + 0xa, 0xd2, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x8e, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, + 0x87, 0x89, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F241 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x76, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x4c, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd2, 0x0, + 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0xaf, 0xff, 0xfc, 0x1, 0xde, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x88, 0x88, 0x9f, 0xe8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0x91, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xc3, 0x0, 0x4, 0xbb, 0x60, 0x0, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x30, + 0x8, 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0x20, 0x0, 0x8, 0xff, 0xff, 0xf2, 0xdf, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xff, 0xff, 0x11, 0xdf, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x1, + 0xef, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0x12, + 0x12, 0xef, 0xff, 0x53, 0xff, 0xf4, 0x7f, 0xf1, + 0x3d, 0x13, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x7f, + 0x13, 0xf5, 0xc, 0xff, 0xb8, 0xff, 0xff, 0x40, + 0x71, 0x35, 0xa, 0xff, 0xfd, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xea, 0xff, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x6f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x8f, + 0xff, 0xf4, 0x6, 0x13, 0x50, 0x8f, 0xff, 0xd6, + 0xff, 0xf4, 0x7, 0xf1, 0x3f, 0x40, 0x9f, 0xfb, + 0x3f, 0xff, 0x47, 0xff, 0x13, 0xd1, 0x1d, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xf1, 0x21, 0x1d, 0xff, + 0xf5, 0xa, 0xff, 0xff, 0xff, 0x20, 0x2e, 0xff, + 0xff, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xdd, + 0xc9, 0x40, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcd, 0xff, + 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xa, 0xff, 0xe1, 0xef, 0xf2, 0xcf, + 0xf3, 0xbf, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xe1, 0xef, 0xf1, 0xcf, 0xf3, 0xaf, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x91, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0xc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb9, 0x75, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xfc, 0x0, + 0xc, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf8, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x5f, + 0xff, 0x50, 0x2e, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x2, 0xef, 0xbb, 0xfc, 0xbf, 0xdb, + 0xbf, 0xf9, 0x2, 0xef, 0xd0, 0x2f, 0x40, 0xe7, + 0x1, 0xff, 0xa2, 0xef, 0xfd, 0x2, 0xf4, 0xe, + 0x70, 0x1f, 0xfa, 0xef, 0xff, 0xd0, 0x2f, 0x40, + 0xe7, 0x1, 0xff, 0xaf, 0xff, 0xfd, 0x24, 0xf6, + 0x2e, 0x82, 0x3f, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x10, 0x0, 0x3, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x6, 0xff, 0xff, + 0xf6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9f, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x2, 0xef, 0xff, 0xf1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 95, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 94, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32, .adv_w = 138, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 57, .adv_w = 247, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 177, .adv_w = 219, .box_w = 13, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 320, .adv_w = 297, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 241, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 592, .adv_w = 74, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 603, .adv_w = 119, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 656, .adv_w = 119, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 719, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 760, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 815, .adv_w = 80, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 826, .adv_w = 135, .box_w = 7, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 833, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 839, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 944, .adv_w = 235, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1048, .adv_w = 130, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1096, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1192, .adv_w = 201, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 235, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1408, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1504, .adv_w = 217, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1600, .adv_w = 210, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1704, .adv_w = 227, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1816, .adv_w = 217, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1920, .adv_w = 80, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1938, .adv_w = 80, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1962, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2023, .adv_w = 205, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 2062, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2123, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2219, .adv_w = 364, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2429, .adv_w = 258, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2573, .adv_w = 266, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2685, .adv_w = 254, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2805, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2933, .adv_w = 236, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3029, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 272, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3357, .adv_w = 109, .box_w = 3, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3381, .adv_w = 181, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3469, .adv_w = 253, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3581, .adv_w = 209, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3669, .adv_w = 336, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3805, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3917, .adv_w = 296, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4053, .adv_w = 254, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4157, .adv_w = 296, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4328, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4432, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 207, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4640, .adv_w = 278, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4752, .adv_w = 251, .box_w = 17, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4888, .adv_w = 396, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5088, .adv_w = 237, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5208, .adv_w = 228, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5336, .adv_w = 231, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 117, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 5501, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5606, .adv_w = 117, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5669, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5724, .adv_w = 176, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5741, .adv_w = 211, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 5752, .adv_w = 210, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5929, .adv_w = 201, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6001, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6112, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6190, .adv_w = 124, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6267, .adv_w = 243, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6379, .adv_w = 240, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 98, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6515, .adv_w = 100, .box_w = 8, .box_h = 21, .ofs_x = -3, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 217, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6701, .adv_w = 98, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6727, .adv_w = 372, .box_w = 20, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6847, .adv_w = 240, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6919, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7003, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7107, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7211, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7253, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7319, .adv_w = 146, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7387, .adv_w = 238, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7459, .adv_w = 197, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7543, .adv_w = 316, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7663, .adv_w = 194, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7735, .adv_w = 197, .box_w = 14, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 7847, .adv_w = 183, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7913, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7987, .adv_w = 105, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 8019, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8093, .adv_w = 205, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 8115, .adv_w = 147, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 8151, .adv_w = 111, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 8164, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8429, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8616, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8836, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9023, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9151, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9404, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9657, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9907, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10160, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10373, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10626, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10725, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10878, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11153, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11340, .adv_w = 242, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11524, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11682, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11922, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12122, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12322, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 12480, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12690, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12810, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12930, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13130, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 13180, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13393, .adv_w = 440, .box_w = 28, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13715, .adv_w = 396, .box_w = 27, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14026, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14257, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14371, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14485, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14737, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14924, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15177, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15442, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15642, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15872, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16072, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16252, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16439, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16612, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16842, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17072, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17285, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17561, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17757, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18051, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18261, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18471, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18681, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18891, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19101, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19353, .adv_w = 308, .box_w = 17, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19549, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19779, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20044, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20282, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20478, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 16, 0, 10, -8, 0, 0, + 0, 0, -19, -21, 2, 17, 8, 6, + -14, 2, 17, 1, 15, 4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, -11, 0, 0, 0, 0, + 0, -7, 6, 7, 0, 0, -4, 0, + -2, 4, 0, -4, 0, -4, -2, -7, + 0, 0, 0, 0, -4, 0, 0, -5, + -5, 0, 0, -4, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -5, 0, -10, 0, -43, 0, + 0, -7, 0, 7, 11, 0, 0, -7, + 4, 4, 12, 7, -6, 7, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -4, -17, 0, -14, + -2, 0, 0, 0, 0, 1, 14, 0, + -11, -3, -1, 1, 0, -6, 0, 0, + -2, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, -3, 13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, + 0, 4, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 7, 4, 11, -4, 0, 0, 7, -4, + -12, -48, 2, 10, 7, 1, -5, 0, + 13, 0, 11, 0, 11, 0, -33, 0, + -4, 11, 0, 12, -4, 7, 4, 0, + 0, 1, -4, 0, 0, -6, 28, 0, + 28, 0, 11, 0, 15, 5, 6, 11, + 0, 0, 0, -13, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -5, -7, 2, + 0, -4, 0, 0, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -19, 0, -22, 0, 0, 0, + 0, -2, 0, 35, -4, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -34, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -22, 0, 21, 0, 0, -13, 0, + 12, 0, -24, -34, -24, -7, 11, 0, + 0, -24, 0, 4, -8, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 11, -43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -7, 0, -1, + -1, -4, 0, 0, -2, 0, 0, 0, + -7, 0, -3, 0, -8, -7, 0, -9, + -12, -12, -7, 0, -7, 0, -7, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 2, -4, 0, 1, 0, 0, 0, 4, + -2, 0, 0, 0, -2, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -2, 0, + -4, 0, -6, 0, 0, -2, 0, 11, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -5, 0, -5, 0, -11, + -2, -11, 7, 0, 0, -7, 4, 7, + 10, 0, -9, -1, -4, 0, -1, -17, + 4, -2, 2, -19, 4, 0, 0, 1, + -18, 0, -19, -3, -31, -2, 0, -18, + 0, 7, 10, 0, 5, 0, 0, 0, + 0, 1, 0, -6, -5, 0, -11, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -2, -4, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -7, 4, 0, 0, -4, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -4, 0, -4, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -7, 0, 11, -2, 1, -11, 0, 0, + 10, -18, -18, -15, -7, 4, 0, -3, + -23, -6, 0, -6, 0, -7, 5, -6, + -23, 0, -10, 0, 0, 2, -1, 3, + -2, 0, 4, 0, -11, -13, 0, -18, + -8, -7, -8, -11, -4, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 2, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -6, -8, + -8, -1, 0, -11, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -7, 0, 0, 0, 0, -18, -11, 0, + 0, 0, -5, -18, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -7, -7, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, -11, 0, -4, 0, -5, -4, + 0, -8, -9, -11, -3, 0, -7, 0, + -11, 0, 0, 0, 0, 28, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -15, + 0, 0, 0, 0, 0, -33, -6, 12, + 11, -3, -15, 0, 4, -5, 0, -18, + -2, -5, 4, -25, -4, 5, 0, 5, + -12, -5, -13, -12, -15, 0, 0, -21, + 0, 20, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -12, -1, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -5, 0, 0, + -7, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -7, 0, 0, 7, + -1, 5, 0, -8, 4, -2, -1, -9, + -4, 0, -5, -4, -2, 0, -5, -6, + 0, 0, -3, -1, -2, -6, -4, 0, + 0, -4, 0, 4, -2, 0, -8, 0, + 0, 0, -7, 0, -6, 0, -6, -6, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 4, 0, -5, 0, -2, -4, + -11, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 14, -1, 0, -10, 0, + -2, 7, 0, -4, -15, -5, 5, 0, + 0, -17, -6, 4, -6, 2, 0, -2, + -3, -11, 0, -5, 2, 0, 0, -6, + 0, 0, 0, 4, 4, -7, -7, 0, + -6, -4, -5, -4, -4, 0, -6, 2, + -7, -6, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -7, 0, 0, 0, -12, 0, + 2, -8, 7, 1, -2, -17, 0, 0, + -8, -4, 0, -14, -9, -10, 0, 0, + -15, -4, -14, -13, -17, 0, -9, 0, + 3, 24, -5, 0, -8, -4, -1, -4, + -6, -10, -6, -13, -14, -8, -4, 0, + 0, -2, 0, 1, 0, 0, -25, -3, + 11, 8, -8, -13, 0, 1, -11, 0, + -18, -2, -4, 7, -32, -5, 1, 0, + 0, -23, -4, -18, -4, -26, 0, 0, + -25, 0, 21, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -13, -2, 0, -23, + 0, 0, 0, 0, -11, 0, -3, 0, + -1, -10, -17, 0, 0, -2, -5, -11, + -4, 0, -2, 0, 0, 0, 0, -16, + -4, -12, -11, -3, -6, -9, -4, -6, + 0, -7, -3, -12, -5, 0, -4, -7, + -4, -7, 0, 2, 0, -2, -12, 0, + 7, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -7, 14, 0, -4, -4, -4, + 0, 0, 0, 0, 0, 0, -11, 0, + -4, 0, -5, -4, 0, -8, -9, -11, + -3, 0, -7, 3, 14, 0, 0, 0, + 0, 28, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -7, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -7, + -4, 0, 0, -7, 0, 6, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 7, 3, -3, 0, -11, + -6, 0, 11, -12, -11, -7, -7, 14, + 6, 4, -31, -2, 7, -4, 0, -4, + 4, -4, -12, 0, -4, 4, -5, -3, + -11, -3, 0, 0, 11, 7, 0, -10, + 0, -19, -5, 10, -5, -13, 1, -5, + -12, -12, -4, 14, 4, 0, -5, 0, + -10, 0, 3, 12, -8, -13, -14, -9, + 11, 0, 1, -26, -3, 4, -6, -2, + -8, 0, -8, -13, -5, -5, -3, 0, + 0, -8, -7, -4, 0, 11, 8, -4, + -19, 0, -19, -5, 0, -12, -20, -1, + -11, -6, -12, -10, 10, 0, 0, -5, + 0, -7, -3, 0, -4, -6, 0, 6, + -12, 4, 0, 0, -19, 0, -4, -8, + -6, -2, -11, -9, -12, -8, 0, -11, + -4, -8, -7, -11, -4, 0, 0, 1, + 17, -6, 0, -11, -4, 0, -4, -7, + -8, -10, -10, -13, -5, -7, 7, 0, + -5, 0, -18, -4, 2, 7, -11, -13, + -7, -12, 12, -4, 2, -33, -6, 7, + -8, -6, -13, 0, -11, -15, -4, -4, + -3, -4, -7, -11, -1, 0, 0, 11, + 10, -2, -23, 0, -21, -8, 8, -13, + -24, -7, -12, -15, -18, -12, 7, 0, + 0, 0, 0, -4, 0, 0, 4, -4, + 7, 2, -7, 7, 0, 0, -11, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 11, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 13, 0, 6, 1, 1, -5, + 0, 7, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -21, 0, -4, 6, 0, 11, + 0, 0, 35, 4, -7, -7, 4, 4, + -2, 1, -18, 0, 0, 17, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -24, 13, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -10, 0, + 0, 1, 0, 0, 4, 45, -7, -3, + 11, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -4, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -24, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -5, 0, + -10, 0, 0, 0, -6, 4, -4, 0, + 0, -10, -4, -8, 0, 0, -10, 0, + -4, 0, -17, 0, -4, 0, 0, -29, + -7, -14, -4, -13, 0, 0, -24, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -6, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 7, + 0, -2, -8, -2, -6, -7, 0, -4, + -2, -2, 2, -10, -1, 0, 0, 0, + -31, -3, -5, 0, -8, 0, -2, -17, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -6, -2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -2, 0, 0, 0, -7, + 4, 0, 0, 0, -10, -4, -7, 0, + 0, -10, 0, -4, 0, -17, 0, 0, + 0, 0, -34, 0, -7, -13, -18, 0, + 0, -24, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -5, -2, + -5, 1, 0, 0, 6, -5, 0, 11, + 17, -4, -4, -11, 4, 17, 6, 8, + -10, 4, 15, 4, 10, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 17, -6, -4, 0, -3, + 28, 15, 28, 0, 0, 0, 4, 0, + 0, 13, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -30, -4, -3, -14, + -17, 0, 0, -24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -30, -4, -3, + -14, -17, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -8, 4, 0, -4, + 3, 6, 4, -11, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -9, 0, + -3, -2, -7, 0, -3, -14, 0, 22, + -4, 0, -8, -2, 0, -2, -6, 0, + -4, -10, -7, -4, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -30, + -4, -3, -14, -17, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -11, -4, -3, 11, -3, -4, + -14, 1, -2, 1, -2, -10, 1, 8, + 1, 3, 1, 3, -8, -14, -4, 0, + -13, -7, -10, -15, -14, 0, -6, -7, + -4, -5, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -4, -4, 0, 0, + -10, 0, -2, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -6, + -4, 4, 0, -6, -7, -2, 0, -10, + -2, -8, -2, -4, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 11, 0, 0, -6, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -2, 0, -8, 0, 0, + 15, -5, -12, -11, 2, 4, 4, -1, + -10, 2, 5, 2, 11, 2, 12, -2, + -10, 0, 0, -14, 0, 0, -11, -10, + 0, 0, -7, 0, -5, -6, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -11, + -4, 13, 0, 0, -3, 0, -7, 0, + 0, 5, -8, 0, 4, -4, 3, 0, + 0, -12, 0, -2, -1, 0, -4, 4, + -3, 0, 0, 0, -14, -4, -8, 0, + -11, 0, 0, -17, 0, 13, -4, 0, + -6, 0, 2, 0, -4, 0, -4, -11, + 0, -4, 4, 0, 0, 0, 0, -2, + 0, 0, 4, -5, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 7, 0, 8, + 0, 0, 0, 0, 0, -22, -20, 1, + 15, 11, 6, -14, 2, 15, 0, 13, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_22 = { +#else +lv_font_t lv_font_montserrat_22 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_22*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_24.c b/libraries/lvgl/src/font/lv_font_montserrat_24.c new file mode 100644 index 0000000..ffb9c83 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_24.c @@ -0,0 +1,4057 @@ +/******************************************************************************* + * Size: 24 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_24.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 1 +#endif + +#if LV_FONT_MONTSERRAT_24 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x1f, 0xf8, 0x1f, 0xf8, 0xf, 0xf7, 0xf, 0xf7, + 0xf, 0xf6, 0xe, 0xf5, 0xe, 0xf5, 0xd, 0xf4, + 0xd, 0xf3, 0xc, 0xf3, 0xb, 0xf2, 0x7, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf6, 0x4f, 0xfb, + 0xc, 0xe5, + + /* U+0022 "\"" */ + 0x7f, 0x80, 0x2f, 0xd7, 0xf7, 0x1, 0xfd, 0x6f, + 0x70, 0x1f, 0xc6, 0xf7, 0x1, 0xfc, 0x6f, 0x60, + 0xf, 0xc5, 0xf6, 0x0, 0xfb, 0x38, 0x30, 0x8, + 0x60, + + /* U+0023 "#" */ + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x7f, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x9, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0xbf, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7c, 0xcd, 0xfe, 0xcc, 0xcc, + 0xfe, 0xcc, 0xc2, 0x0, 0x0, 0x4f, 0x60, 0x0, + 0x1f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x3, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x20, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0xa, 0xf0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x0, 0x0, 0x8f, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4c, 0xcc, + 0xfe, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0x0, 0x0, + 0x2f, 0x90, 0x0, 0xe, 0xd0, 0x0, 0x0, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x0, 0x2f, 0x90, 0x0, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x4, 0xf7, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xfe, 0xb6, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0xef, 0xe6, 0x5f, 0x73, + 0x7d, 0xc0, 0x6, 0xff, 0x20, 0x3f, 0x50, 0x0, + 0x20, 0x9, 0xfc, 0x0, 0x3f, 0x50, 0x0, 0x0, + 0x8, 0xfe, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x3, + 0xff, 0xc3, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xef, 0x91, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x1, 0x7f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0x53, + 0xbf, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0x50, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x7, 0xfe, + 0x5, 0x70, 0x0, 0x3f, 0x50, 0xc, 0xfb, 0xc, + 0xfd, 0x73, 0x4f, 0x64, 0xbf, 0xf4, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6, 0xbe, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x3c, 0xfe, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0x70, 0x0, 0x3, 0xfd, 0x78, 0xfb, 0x0, 0x0, + 0x2, 0xfc, 0x0, 0x0, 0xb, 0xe1, 0x0, 0x6f, + 0x40, 0x0, 0xc, 0xf2, 0x0, 0x0, 0xf, 0x90, + 0x0, 0xf, 0x90, 0x0, 0x7f, 0x60, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0x80, 0x0, 0xf, 0x90, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x3f, + 0x60, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x5, 0xf9, + 0x24, 0xde, 0x2, 0xfb, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd3, 0xc, 0xe1, 0x8, 0xff, + 0xe7, 0x0, 0x0, 0x1, 0x43, 0x0, 0x7f, 0x50, + 0x9f, 0x85, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xfa, 0x2, 0xf8, 0x0, 0xb, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0xe1, 0x5, 0xf3, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0x50, 0x6, 0xf1, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x5, + 0xf3, 0x0, 0x5, 0xf3, 0x0, 0x0, 0xd, 0xe1, + 0x0, 0x1, 0xf8, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x8f, 0x40, 0x0, 0x0, 0x8f, 0x84, 0x9f, 0x60, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xd6, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9e, 0xfe, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xbd, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xb0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x0, 0xdf, 0x50, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0x70, 0x0, 0x6f, 0xa0, 0x0, 0x0, + 0x0, 0x6f, 0xe1, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x51, 0xcf, 0xd1, 0x0, 0xac, 0x20, + 0x4f, 0xf2, 0x0, 0xc, 0xfd, 0x20, 0xff, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0xcf, 0xe8, 0xfb, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x6f, 0xfa, 0x20, 0x1, 0x6e, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xbf, 0xd0, + 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0x87, 0xf7, 0x6f, 0x76, 0xf7, 0x6f, 0x65, + 0xf6, 0x38, 0x30, + + /* U+0028 "(" */ + 0x0, 0x2f, 0xf1, 0x0, 0x9f, 0x90, 0x1, 0xff, + 0x20, 0x6, 0xfc, 0x0, 0xc, 0xf7, 0x0, 0xf, + 0xf3, 0x0, 0x3f, 0xf0, 0x0, 0x6f, 0xd0, 0x0, + 0x8f, 0xb0, 0x0, 0x9f, 0xa0, 0x0, 0xaf, 0x90, + 0x0, 0xbf, 0x80, 0x0, 0xaf, 0x90, 0x0, 0x9f, + 0xa0, 0x0, 0x8f, 0xb0, 0x0, 0x6f, 0xd0, 0x0, + 0x3f, 0xf0, 0x0, 0xf, 0xf3, 0x0, 0xc, 0xf7, + 0x0, 0x6, 0xfc, 0x0, 0x1, 0xff, 0x20, 0x0, + 0x9f, 0x90, 0x0, 0x2f, 0xf1, + + /* U+0029 ")" */ + 0xf, 0xf3, 0x0, 0x8, 0xfb, 0x0, 0x1, 0xff, + 0x30, 0x0, 0xbf, 0x80, 0x0, 0x6f, 0xd0, 0x0, + 0x1f, 0xf2, 0x0, 0xe, 0xf5, 0x0, 0xb, 0xf8, + 0x0, 0x9, 0xfa, 0x0, 0x8, 0xfb, 0x0, 0x7, + 0xfc, 0x0, 0x6, 0xfd, 0x0, 0x7, 0xfc, 0x0, + 0x8, 0xfb, 0x0, 0x9, 0xfa, 0x0, 0xb, 0xf8, + 0x0, 0xe, 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x6f, + 0xd0, 0x0, 0xbf, 0x80, 0x1, 0xff, 0x30, 0x8, + 0xfb, 0x0, 0xf, 0xf3, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x3, 0x0, 0xe8, + 0x0, 0x20, 0x4f, 0xa1, 0xe8, 0x4d, 0xe0, 0x8, + 0xff, 0xfe, 0xfd, 0x40, 0x0, 0x2e, 0xff, 0xb0, + 0x0, 0x7, 0xef, 0xff, 0xfc, 0x30, 0x5f, 0xb2, + 0xe8, 0x5e, 0xe0, 0x4, 0x0, 0xe8, 0x0, 0x30, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5e, 0xee, 0xef, 0xfe, + 0xee, 0xe5, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, + + /* U+002C "," */ + 0x3b, 0x80, 0xcf, 0xf3, 0xaf, 0xf3, 0xf, 0xe0, + 0x1f, 0x90, 0x5f, 0x40, 0x9e, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xd0, + + /* U+002E "." */ + 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, 0x6f, 0xb0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf5, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, 0xf4, + 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x1, 0xff, + 0xe7, 0x33, 0x7e, 0xff, 0x10, 0xb, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xb0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0xf7, 0xaf, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xfa, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0xdf, 0x80, 0x0, 0x0, 0x0, 0x8, 0xfd, 0xcf, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, 0xaf, 0xb0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0xf7, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0xb, 0xfe, 0x10, 0x0, 0x2, + 0xef, 0xb0, 0x1, 0xff, 0xe7, 0x33, 0x7e, 0xff, + 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x1, 0x7c, 0xee, 0xc7, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xff, 0x5d, 0xff, 0xff, 0xf5, 0x11, + 0x11, 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, + 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, + 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, + 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, 0xf5, + 0x0, 0x0, 0xff, 0x50, + + /* U+0032 "2" */ + 0x0, 0x17, 0xce, 0xfe, 0xc6, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xfc, 0x63, + 0x35, 0xbf, 0xfa, 0x0, 0x97, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xc1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc2, 0x11, 0x11, + 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1, 0x11, 0x11, + 0x11, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x15, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x81, 0xa1, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x9f, 0xfa, 0x53, 0x34, 0x9f, + 0xfd, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x49, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x9d, 0x70, 0x0, + 0x0, 0x1e, 0xfa, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x7, 0xff, 0x41, 0x11, 0x11, 0xbf, 0x91, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + + /* U+0035 "5" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xbf, 0x81, + 0x11, 0x11, 0x11, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x31, 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfe, 0xa3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x26, 0xdf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x93, 0x0, 0x0, + 0x0, 0x1e, 0xfa, 0x5f, 0xfb, 0x63, 0x24, 0x7e, + 0xff, 0x31, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x10, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, + 0xf9, 0x42, 0x23, 0x76, 0x0, 0x8, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xa0, 0x5b, 0xef, 0xd9, 0x30, + 0x0, 0xbf, 0x9a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xdf, 0xff, 0xc4, 0x1, 0x4c, 0xff, 0x40, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xbf, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x4, 0xff, 0xc3, 0x0, 0x3b, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd9, 0x20, 0x0, + + /* U+0037 "7" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4f, 0xf2, + 0x11, 0x11, 0x11, 0x8f, 0xf1, 0x4f, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0x90, 0x4f, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0x20, 0x2, 0x20, 0x0, 0x0, 0xc, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x20, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0x71, 0x0, 0x4b, 0xff, 0x40, 0x3f, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0xa, 0xff, 0x72, 0x1, 0x4c, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x4, 0xdf, 0xff, 0xef, 0xff, 0xf8, 0x0, 0x2f, + 0xfc, 0x40, 0x0, 0x18, 0xff, 0x90, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x80, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xaf, 0xe1, 0x0, 0x0, 0x0, + 0x8f, 0xf2, 0x3f, 0xfd, 0x51, 0x0, 0x3a, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x17, 0xce, 0xff, 0xd9, 0x40, 0x0, + + /* U+0039 "9" */ + 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0x82, 0x0, 0x4c, 0xfe, 0x10, 0x1f, 0xf6, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xa, 0xff, 0x82, 0x0, 0x4c, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xfa, 0x0, + 0x6, 0xbe, 0xfe, 0xa4, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0xa7, 0x31, 0x25, 0xcf, 0xf9, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7b, 0xdf, 0xec, 0x82, 0x0, 0x0, + + /* U+003A ":" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, + 0x6f, 0xb0, + + /* U+003B ";" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xb0, 0xcf, 0xf4, + 0x8f, 0xf2, 0xf, 0xd0, 0x2f, 0x80, 0x6f, 0x30, + 0x7b, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x18, 0xef, + 0xfe, 0x81, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x3e, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x84, + + /* U+003D "=" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, 0xee, 0xee, + 0xee, 0xe5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+003E ">" */ + 0x47, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x18, 0xef, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x1, 0x7d, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xe3, 0x0, 0x4, 0xaf, 0xff, 0xb4, 0x0, + 0x18, 0xef, 0xfe, 0x71, 0x0, 0x0, 0x6f, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x47, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x28, 0xce, 0xfe, 0xc7, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, 0xfb, 0x52, + 0x13, 0xaf, 0xfb, 0x0, 0x96, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xca, 0x9a, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xc5, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xd2, 0x0, 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, 0xdf, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xd0, 0x0, 0x8f, 0x80, 0x0, 0x7, 0xcf, 0xfc, + 0x60, 0xaf, 0x70, 0x7f, 0x70, 0xf, 0xe0, 0x0, + 0x2d, 0xff, 0xfe, 0xff, 0xcb, 0xf7, 0x0, 0xde, + 0x5, 0xf7, 0x0, 0xd, 0xfd, 0x30, 0x1, 0x7f, + 0xff, 0x70, 0x7, 0xf4, 0x9f, 0x30, 0x6, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x2f, 0x7c, + 0xf0, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xf9, 0xde, 0x0, 0xd, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0xf, 0xad, 0xe0, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0xf9, 0xbf, 0x0, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x2f, 0x79, 0xf3, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x6, + 0xf4, 0x5f, 0x70, 0x0, 0xdf, 0xc3, 0x0, 0x7, + 0xff, 0xfb, 0x1, 0xde, 0x0, 0xee, 0x0, 0x2, + 0xdf, 0xfe, 0xdf, 0xfc, 0x3f, 0xfe, 0xff, 0x50, + 0x8, 0xf9, 0x0, 0x0, 0x7c, 0xff, 0xc7, 0x0, + 0x5d, 0xfd, 0x50, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x50, 0x0, + 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0xaa, 0xbd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x5d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0x50, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x5f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x50, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, + 0xe0, 0x0, 0x0, 0x2, 0x9f, 0xfa, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x7f, 0xe0, 0x0, + 0x0, 0x2, 0x9f, 0xf5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x14, 0xcf, 0xf3, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xa7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xe7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x59, 0xff, 0xf2, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0x0, 0x5f, 0xff, 0xb5, 0x33, 0x49, 0xff, 0xf2, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x50, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x7f, 0xe1, 0x11, 0x12, 0x36, 0xbf, 0xff, + 0x40, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfe, 0x20, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x7f, + 0xe1, 0x11, 0x11, 0x35, 0xbf, 0xff, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xfe, 0x11, 0x11, 0x11, 0x11, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7f, 0xe1, 0x11, 0x11, 0x11, 0x10, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x48, 0xef, 0xf5, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9, 0xb0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0x94, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x5f, 0xff, 0xb6, 0x32, 0x47, 0xdf, 0xf7, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, + 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, + 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, + 0x7f, 0xe0, + + /* U+004A "J" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1, 0x11, 0x11, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xd0, + 0x5a, 0x0, 0x0, 0xd, 0xfa, 0xf, 0xfc, 0x41, + 0x3b, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+004B "K" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe3, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xfd, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd1, 0x2f, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xfe, 0x10, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, + + /* U+004C "L" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x67, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x67, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x67, + 0xfd, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0xcf, 0x8e, + 0xf6, 0x7f, 0xd2, 0xff, 0x40, 0x0, 0x0, 0x5f, + 0xe0, 0xef, 0x67, 0xfd, 0x8, 0xfd, 0x0, 0x0, + 0xe, 0xf6, 0xe, 0xf6, 0x7f, 0xd0, 0xe, 0xf7, + 0x0, 0x8, 0xfc, 0x0, 0xef, 0x67, 0xfd, 0x0, + 0x5f, 0xf1, 0x1, 0xff, 0x30, 0xe, 0xf6, 0x7f, + 0xd0, 0x0, 0xbf, 0xa0, 0xaf, 0x90, 0x0, 0xef, + 0x67, 0xfd, 0x0, 0x2, 0xff, 0x7f, 0xe1, 0x0, + 0xe, 0xf6, 0x7f, 0xd0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0x67, 0xfd, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xe, 0xf6, 0x7f, 0xd0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0xef, 0x67, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x60, + + /* U+004E "N" */ + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xfd, + 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x3f, + 0xfd, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x5f, + 0xfa, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x8f, + 0xf7, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0xbf, + 0xf4, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x1, 0xef, + 0xe1, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x3, 0xff, + 0xc0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x6, 0xff, + 0xa7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xdf, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xfd, 0x30, + 0x0, 0x0, 0x1, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x9f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x3f, 0xfd, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xb5, 0x33, 0x59, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x7, 0xfe, 0x11, 0x11, 0x24, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x2f, 0xfd, 0x30, + 0x0, 0x0, 0x2, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xe, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x4f, 0xfc, 0x20, 0x0, + 0x0, 0x1, 0xbf, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xa4, 0x22, 0x48, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf7, + 0x10, 0x4, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xef, 0xea, 0x40, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x7, 0xfe, 0x11, 0x11, 0x13, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x1, 0xef, 0x90, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0x40, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x10, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xef, 0xfd, 0xa5, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xef, + 0xe7, 0x21, 0x14, 0x8e, 0xc0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x20, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd9, 0x51, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x1, 0x59, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x5, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0xd, 0xfe, 0x84, 0x21, 0x25, 0xcf, + 0xf4, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, + 0x13, 0xff, 0x51, 0x11, 0x11, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x99, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf9, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x87, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf6, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x20, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x3, 0xff, 0xe7, 0x32, 0x38, 0xef, 0xf3, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xec, 0x71, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x70, 0x0, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x8, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x10, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x5, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0xbf, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0xef, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x1f, 0xf4, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x6, 0xfd, 0xc, 0xf8, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0xbf, 0x70, + 0x6f, 0xe0, 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x1f, 0xf2, 0x1, 0xff, 0x30, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x6, 0xff, 0x0, + 0x6, 0xfd, 0x0, 0xc, 0xf8, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xbf, 0x70, + 0x0, 0x6f, 0xe0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xb0, 0x1f, 0xf2, 0x0, 0x1, 0xff, + 0x30, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x6, 0xfc, 0x0, 0x0, 0xb, 0xf8, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0xcf, 0x70, + 0x0, 0x0, 0x6f, 0xe3, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xcf, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe1, + 0x3, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x1e, 0xf9, 0x0, + 0x0, 0xc, 0xfe, 0x10, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x6, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x2f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x9f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xe1, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x40, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0xdf, 0xd0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xb0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + + /* U+0059 "Y" */ + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x50, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x1, 0xef, 0x90, 0x0, 0x0, 0xd, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x1, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0x9d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x11, 0x11, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005B "[" */ + 0x7f, 0xff, 0xf8, 0x7f, 0xfe, 0xe7, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xfe, 0xe7, 0x7f, 0xff, 0xf8, + + /* U+005C "\\" */ + 0xbf, 0x50, 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x5, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x60, 0x0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xf7, 0x8e, 0xef, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x8e, + 0xef, 0xf7, 0x8f, 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xbf, + 0x10, 0x0, 0x0, 0x7, 0xf5, 0x5f, 0x70, 0x0, + 0x0, 0xd, 0xe0, 0xe, 0xd0, 0x0, 0x0, 0x4f, + 0x80, 0x8, 0xf4, 0x0, 0x0, 0xbf, 0x10, 0x1, + 0xfb, 0x0, 0x2, 0xfa, 0x0, 0x0, 0xaf, 0x20, + 0x9, 0xf4, 0x0, 0x0, 0x4f, 0x80, 0xf, 0xd0, + 0x0, 0x0, 0xd, 0xe0, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0x40, 0x0, 0x4, 0xef, 0x60, 0x0, + 0x1, 0xbf, 0x70, + + /* U+0061 "a" */ + 0x0, 0x6b, 0xef, 0xfd, 0x81, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xe, 0xb5, 0x10, 0x27, + 0xff, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x37, + 0xaa, 0xaa, 0xaf, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x6f, 0xf6, 0x10, 0x0, 0xf, 0xf4, + 0xbf, 0x90, 0x0, 0x0, 0xf, 0xf4, 0xcf, 0x80, + 0x0, 0x0, 0x5f, 0xf4, 0x8f, 0xe2, 0x0, 0x4, + 0xff, 0xf4, 0x1d, 0xff, 0xcb, 0xdf, 0xdf, 0xf4, + 0x1, 0x8d, 0xff, 0xd8, 0xe, 0xf4, + + /* U+0062 "b" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x70, 0x7c, 0xfe, 0xc7, + 0x10, 0x0, 0xdf, 0x9d, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xfe, 0x20, + 0xdf, 0xf8, 0x0, 0x0, 0x1, 0xef, 0xa0, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x1f, 0xf3, 0xdf, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xf1, 0xdf, 0xf8, 0x0, 0x0, 0x2, 0xef, + 0xa0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xff, 0x20, + 0xdf, 0x8d, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, + 0x60, 0x7d, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x4f, 0xf6, 0x0, 0x0, 0x3, 0x91, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x2, 0x91, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, 0x92, + 0x2f, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x7f, + 0xf3, 0xb, 0xff, 0x93, 0x12, 0x7f, 0xff, 0xf3, + 0x5f, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xbf, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xf3, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf5, 0x0, 0x0, 0x2, 0xff, + 0xf3, 0xb, 0xff, 0x71, 0x0, 0x5e, 0xff, 0xf3, + 0x1, 0xbf, 0xff, 0xef, 0xff, 0x7f, 0xf3, 0x0, + 0x5, 0xbe, 0xfe, 0xa3, 0xf, 0xf3, + + /* U+0065 "e" */ + 0x0, 0x5, 0xbe, 0xfd, 0xa3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xfe, 0x61, + 0x2, 0x8f, 0xf7, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xf1, 0xaf, 0x90, 0x0, 0x0, 0x0, 0xcf, + 0x6d, 0xfc, 0xbb, 0xbb, 0xbb, 0xbd, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, + 0x0, 0xa, 0xff, 0xa3, 0x11, 0x4b, 0xf8, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, + 0xad, 0xff, 0xd8, 0x10, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x8d, 0xfe, 0xa1, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x4f, 0xf5, 0x0, 0x30, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, + 0xfe, 0xee, 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0xd, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x8d, 0xf5, 0xb, 0xff, + 0x93, 0x12, 0x6e, 0xff, 0xf5, 0x4f, 0xf6, 0x0, + 0x0, 0x1, 0xef, 0xf5, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x5f, 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, 0xf5, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf6, 0x0, 0x0, 0x1, 0xef, 0xf5, 0xa, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x8f, 0xf5, 0x0, 0x5, 0xbe, 0xfe, + 0xa3, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x3, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0xd, 0xf9, 0x52, 0x11, 0x4b, 0xff, 0x50, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xd9, 0x30, 0x0, + + /* U+0068 "h" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x18, 0xdf, 0xfc, 0x70, 0x0, 0xdf, + 0xae, 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xf8, + 0x31, 0x4a, 0xff, 0x90, 0xdf, 0xf5, 0x0, 0x0, + 0xa, 0xff, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0xdf, 0x80, 0x0, 0x0, 0x1, 0xff, 0x3d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, + 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+0069 "i" */ + 0xb, 0xf6, 0x2f, 0xfd, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, + + /* U+006A "j" */ + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x80, 0x4, 0x20, 0x5f, 0xf4, 0x0, 0xef, + 0xff, 0xfc, 0x0, 0x9, 0xef, 0xe9, 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xa0, 0xdf, + 0x70, 0x0, 0x3, 0xff, 0xb0, 0xd, 0xf7, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xdf, 0x70, 0x5, 0xff, + 0xb0, 0x0, 0xd, 0xf7, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0xdf, 0x77, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xfe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xff, + 0x87, 0xff, 0x70, 0x0, 0xd, 0xff, 0x70, 0xa, + 0xff, 0x40, 0x0, 0xdf, 0x90, 0x0, 0xd, 0xfe, + 0x10, 0xd, 0xf7, 0x0, 0x0, 0x2e, 0xfc, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x4f, 0xf9, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xf5, + + /* U+006C "l" */ + 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, + 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, + 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, + 0xdf, 0x7d, 0xf7, + + /* U+006D "m" */ + 0xdf, 0x61, 0x9d, 0xfe, 0xb5, 0x0, 0x7, 0xcf, + 0xfd, 0x80, 0x0, 0xdf, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xef, 0xff, 0xff, 0xfd, 0x10, 0xdf, 0xfe, + 0x60, 0x3, 0xcf, 0xff, 0xfa, 0x20, 0x17, 0xff, + 0xa0, 0xdf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xf3, 0xdf, + 0x80, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, + 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+006E "n" */ + 0xdf, 0x61, 0x8d, 0xff, 0xc7, 0x0, 0xd, 0xf9, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0x61, + 0x2, 0x8f, 0xf9, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x9f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0x2d, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x40, + + /* U+006F "o" */ + 0x0, 0x4, 0xad, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0x80, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf1, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf1, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x4f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0x80, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x4, 0xad, 0xfe, + 0xb5, 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0x61, 0x8d, 0xfe, 0xc7, 0x10, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, 0xff, + 0x92, 0x0, 0x5d, 0xfe, 0x20, 0xdf, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xa0, 0xdf, 0xd0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xdf, 0x90, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, + 0xf5, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xf3, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, + 0xf8, 0x0, 0x0, 0x2, 0xef, 0xa0, 0xdf, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0x20, 0xdf, 0x9d, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0xdf, 0x70, 0x7c, 0xfe, + 0xc7, 0x10, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa2, 0xf, 0xf3, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x5f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x5f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0x7f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, + 0x92, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0x61, 0x8d, 0xf0, 0xdf, 0x7e, 0xff, 0xf0, + 0xdf, 0xff, 0xb5, 0x40, 0xdf, 0xf7, 0x0, 0x0, + 0xdf, 0xd0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x18, 0xcf, 0xfe, 0xb7, 0x10, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xfe, 0x41, 0x2, + 0x6c, 0x30, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd9, 0x52, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0x47, 0xad, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x1, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xe, 0xc6, 0x20, 0x3, + 0xaf, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0074 "t" */ + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, 0xfe, 0xee, + 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xf7, 0x1, 0x50, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x9e, 0xfd, 0x81, + + /* U+0075 "u" */ + 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xf, 0xf6, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, 0x60, 0x0, + 0x0, 0x4, 0xff, 0xf, 0xf6, 0x0, 0x0, 0x0, + 0x4f, 0xf0, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, + 0x60, 0x0, 0x0, 0x4, 0xff, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0xdf, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xa, 0xfe, 0x0, 0x0, 0x1, 0xef, + 0xf0, 0x3f, 0xfb, 0x20, 0x4, 0xdf, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x0, 0x4b, + 0xef, 0xea, 0x32, 0xff, 0x0, + + /* U+0076 "v" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x1, 0xff, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x5d, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0x80, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, + 0x0, 0xc, 0xf4, 0x5f, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x0, 0x2f, 0xe0, 0xe, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x8f, + 0x80, 0x9, 0xf9, 0x0, 0x0, 0x7f, 0xbf, 0xf1, + 0x0, 0x0, 0xef, 0x20, 0x3, 0xfe, 0x0, 0x0, + 0xcf, 0x4b, 0xf7, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0xdf, 0x40, 0x2, 0xfe, 0x5, 0xfc, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x7f, 0xa0, 0x8, 0xf8, 0x0, + 0xef, 0x20, 0xf, 0xf1, 0x0, 0x0, 0x2f, 0xf0, + 0xe, 0xf2, 0x0, 0x9f, 0x80, 0x5f, 0xb0, 0x0, + 0x0, 0xc, 0xf5, 0x4f, 0xc0, 0x0, 0x3f, 0xe0, + 0xbf, 0x50, 0x0, 0x0, 0x6, 0xfb, 0xaf, 0x60, + 0x0, 0xd, 0xf5, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4f, + 0xf4, 0x0, 0x1, 0xef, 0x80, 0x0, 0x8f, 0xe1, + 0x0, 0xbf, 0xb0, 0x0, 0x0, 0xcf, 0xb0, 0x7f, + 0xe1, 0x0, 0x0, 0x1, 0xef, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0x5e, + 0xf7, 0x0, 0x0, 0x1, 0xef, 0x80, 0x4f, 0xf3, + 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x8f, 0xe1, 0x0, + 0x8f, 0xe1, 0x0, 0x0, 0xcf, 0xb0, 0x4f, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0x80, + + /* U+0079 "y" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x4, 0xfe, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x8, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x6c, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa4, 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xee, + 0xee, 0xee, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xee, 0xee, 0xee, 0xe8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x3, 0xce, 0xf0, 0x2, 0xff, 0xfe, 0x0, + 0x8f, 0xe2, 0x0, 0xa, 0xfa, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0xb, 0xf9, 0x0, 0x1, 0xef, 0x70, 0xa, 0xff, + 0xd1, 0x0, 0x9f, 0xfe, 0x20, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x9f, + 0xe2, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x4, 0xcf, + 0xf0, + + /* U+007C "|" */ + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, + 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa0, + + /* U+007D "}" */ + 0x8f, 0xd7, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x3f, 0xf1, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0xf, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xf0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x1f, 0xf5, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x8f, 0xd8, 0x0, 0x0, + + /* U+007E "~" */ + 0x3, 0xcf, 0xd5, 0x0, 0x0, 0xf8, 0xe, 0xfd, + 0xff, 0x90, 0x5, 0xf5, 0x6f, 0x60, 0x1b, 0xfe, + 0xbf, 0xe0, 0x8f, 0x0, 0x0, 0x6d, 0xfc, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, + 0x1e, 0xc5, 0x5c, 0xe2, 0x9d, 0x0, 0x0, 0xda, + 0xd8, 0x0, 0x0, 0x7e, 0xd7, 0x0, 0x0, 0x7e, + 0xac, 0x0, 0x0, 0xcb, 0x3f, 0xa2, 0x2a, 0xf3, + 0x4, 0xef, 0xfe, 0x40, 0x0, 0x2, 0x20, 0x0, + + /* U+2022 "•" */ + 0x1, 0x64, 0x1, 0xef, 0xf7, 0x5f, 0xff, 0xd4, + 0xff, 0xfc, 0x8, 0xfd, 0x20, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x3a, 0xdf, 0xef, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xad, 0xfe, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x6f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xea, 0x30, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7b, 0xfd, 0x88, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0xdf, + 0xff, 0xff, 0xff, 0xb4, 0x44, 0x44, 0x44, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xf8, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x8f, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfd, 0x88, 0xef, 0xa2, + 0x22, 0x22, 0x22, 0x22, 0x3f, 0xfb, 0x88, 0xdf, + 0xf8, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x8f, 0xf8, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, + 0xfd, 0x88, 0xef, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x3f, 0xfb, 0x88, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xf8, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x8f, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb4, + 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xdf, 0xb7, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7b, + + /* U+F00B "" */ + 0x14, 0x44, 0x44, 0x10, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x41, 0xef, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7b, 0xbb, 0xbb, 0x60, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x10, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xef, 0xff, 0xff, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, 0x60, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, + 0x2, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xcc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, + 0x1, 0xdf, 0xd2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x70, 0xcf, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4e, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xe2, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x7a, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf3, + 0x0, 0xef, 0xfd, 0x0, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0xef, 0xfd, 0x0, + 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0xef, 0xfd, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x9f, 0xff, 0x20, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf8, + 0x9f, 0xff, 0x20, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x37, 0x72, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe8, 0x42, 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x89, 0x97, 0x51, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x89, 0x98, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc3, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x3c, 0xc0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x1e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x60, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x94, 0x49, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xc3, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x3c, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, + 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0xdf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xb3, 0xbf, 0xff, 0xce, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x5d, + 0x50, 0x6f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x30, 0x8f, 0xff, 0x70, 0x4e, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfd, + 0x20, 0xaf, 0xff, 0xff, 0xa0, 0x2d, 0xff, 0xfb, + 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xc1, 0xb, 0xff, 0xfd, 0x20, 0x4f, + 0xff, 0xf8, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x8, 0xff, 0xfe, 0x4e, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xfe, 0x4f, 0xe3, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xef, 0x40, + 0x41, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x1, 0x40, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xeb, 0xbb, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xbb, 0xbb, + 0xba, 0x10, 0x0, 0x1a, 0xbb, 0xbb, 0xb3, 0x0, + 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, + 0xdf, 0xff, 0xff, 0xfd, 0xdd, 0xda, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x55, 0x11, 0xdf, 0xfd, 0x11, + 0x55, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1d, 0xd1, 0x1d, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0xa, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x1, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe1, 0xaf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x67, 0x75, 0x20, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xfd, + 0x70, 0x0, 0x4f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x3f, 0xff, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xfb, 0x3f, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xdf, 0xff, + 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0x4, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xee, 0xef, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xfd, 0xee, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0x40, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfa, 0x0, + 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xd0, 0x0, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xff, 0xf3, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0x67, 0x76, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x14, 0x44, 0x44, 0xcf, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, + 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4a, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x5, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x2e, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5b, 0x30, 0x7c, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x6, 0x30, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf0, 0x0, 0x3, 0xff, 0x70, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0xc, 0xff, 0x70, 0xc, 0xfc, 0x1, 0x44, + 0x44, 0x4c, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5a, 0x20, 0xc, 0xfb, 0x0, + 0xdf, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xfe, 0x20, 0x4f, 0xf1, 0x8, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2e, 0xfa, + 0x0, 0xff, 0x50, 0x5f, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xe0, 0xc, 0xf7, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xfe, 0x0, 0xcf, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xef, + 0xa0, 0xf, 0xf5, 0x6, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe2, 0x4, 0xff, + 0x10, 0x9f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xa2, 0x0, 0xcf, 0xb0, 0xd, 0xf8, + 0x7b, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf3, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf7, + 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x53, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xca, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x42, 0x8f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8f, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0xff, 0xf9, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xfb, 0x40, 0x6f, 0xff, + 0xff, 0xb0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+F048 "" */ + 0x34, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xfb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8f, 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, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xea, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x5, 0xb4, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04C "" */ + 0x19, 0xcc, 0xcc, 0xc9, 0x10, 0x0, 0x19, 0xcc, + 0xcc, 0xc9, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x50, 0x13, 0x33, 0x33, + 0x10, 0x0, 0x0, 0x13, 0x33, 0x33, 0x10, + + /* U+F04D "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F051 "" */ + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x3b, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x86, 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, 0xfd, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x16, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xba, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x40, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+F054 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 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, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x77, 0x77, 0x77, 0x7d, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x71, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xab, 0xa2, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x76, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe9, 0x54, 0x59, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x14, 0x20, 0x0, 0x7f, + 0xff, 0xfe, 0x20, 0x0, 0x1e, 0xff, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xc2, 0x0, 0xbf, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x5f, + 0xff, 0xe2, 0x3, 0xff, 0xff, 0xfb, 0x6, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, 0xc0, + 0xd, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xfe, 0x5f, + 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xef, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, + 0x30, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xff, 0xb0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, 0xe1, 0x0, + 0x2, 0xef, 0xff, 0xf7, 0x0, 0x39, 0xb9, 0x30, + 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x95, 0x45, 0x9e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x71, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x5, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfe, 0x40, 0x0, 0x48, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xb6, 0x45, 0x7d, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x1, 0x76, 0x20, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x4e, 0xff, 0xfa, 0x1f, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, + 0x2c, 0xff, 0xfd, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, 0xff, + 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xb1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x1, 0xbf, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x64, 0x51, + 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xfe, 0xa1, + 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa4, 0x44, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf7, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x9, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x9b, 0xbb, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xbb, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xe2, 0xc, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x3, 0xff, 0x30, 0xaf, 0xff, 0xf3, + 0x0, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x54, + 0x9, 0xff, 0xff, 0x40, 0x0, 0xbe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x4, 0x50, + 0x0, 0xbe, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x3f, 0xf3, 0x0, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfc, 0x2, 0xef, 0xfe, + 0x30, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9b, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x3b, + 0xbb, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfd, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x79, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, + + /* U+F078 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x89, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xef, 0xfe, + 0xdf, 0xfb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xd, 0xfe, 0x2b, + 0xff, 0x48, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x17, 0x20, 0xbf, + 0xf4, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0xef, 0xf1, + 0x4f, 0xc0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x6e, 0xff, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0xbf, 0xf7, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x60, 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x2f, 0xff, 0xff, 0xf2, 0x22, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x52, 0xf, 0xff, 0xff, 0xf0, + 0x25, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x1, 0x10, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xea, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xa0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0x70, 0x3, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xc9, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x73, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x90, 0xaf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0xef, 0xf4, 0x4, 0xff, + 0xe0, 0x0, 0x9, 0xff, 0xff, 0xfb, 0x0, 0xff, + 0xf1, 0x1, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xcf, 0xfb, 0x5b, 0xff, 0xc0, 0x9, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf5, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xcf, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xef, 0xf4, 0x4, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0x50, 0x0, 0xff, 0xf1, 0x1, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xfb, + 0x5b, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xae, 0xea, 0x20, 0x0, + 0x39, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xfa, 0x47, 0x88, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x48, 0x88, 0x7f, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x74, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, + 0xf8, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 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, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F0C9 "" */ + 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x10, 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, 0x57, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, 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, 0x1, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, + 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, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x31, + + /* U+F0E0 "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xe4, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x4e, 0xff, 0x80, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x8, 0xff, + 0xff, 0xfc, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x4, + 0xef, 0xff, 0xff, 0xfe, 0x40, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1c, 0xff, 0xff, 0xb1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x6d, 0xd6, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd9, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0E7 "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xc8, 0x88, 0x87, 0x30, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x37, + 0x88, 0x88, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x70, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x3, 0xdf, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x78, 0x88, 0xff, 0xef, 0xf8, + 0x88, 0x74, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x7, 0x88, 0x88, + 0x88, 0x3, 0x30, 0x0, 0xff, 0xff, 0xff, 0x7, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0x40, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x40, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0x4f, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x78, 0x88, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6f, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xc3, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0x90, 0x9, 0xf1, 0x1, + 0xf9, 0x0, 0x9f, 0x10, 0x1f, 0xff, 0xff, 0xf0, + 0x0, 0xf8, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x8, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x1f, 0x90, + 0x9, 0xf1, 0x1, 0xf9, 0x0, 0x9f, 0x10, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x8f, 0xe8, 0x8b, 0xfb, 0x88, 0xfe, + 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xcc, 0x0, 0x4f, 0x40, 0xc, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xc0, 0x4, + 0xf4, 0x0, 0xcc, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xfe, 0x88, 0xbf, 0xb8, 0x8f, + 0xe8, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x1, 0xff, 0xff, + 0xff, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0xff, 0xff, 0xf1, 0x1, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf1, + 0x1, 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, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x57, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x77, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc9, 0x65, 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, + 0xc1, 0xdf, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x9, + 0xf6, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xdc, + 0x84, 0x0, 0x0, 0x0, 0x6f, 0x90, 0x0, 0x10, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc5, 0x10, 0x0, 0x1, 0x5c, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F240 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F241 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F242 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F243 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F244 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x7d, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0x3a, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x9, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x50, + 0x0, 0x6f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, + 0x1e, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x10, 0xe, 0xff, 0xff, 0xfd, 0xbe, + 0xfe, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0x60, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1c, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xd4, 0x0, 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, + 0x0, 0x0, 0x4, 0x63, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0x4b, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x5c, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xfe, 0x10, 0x2, 0xff, + 0xff, 0xff, 0xf0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xfc, 0xff, 0xf0, 0x16, 0x7, + 0xff, 0xff, 0x21, 0xff, 0xf8, 0x9, 0xff, 0x1, + 0xf6, 0x7, 0xff, 0xf5, 0x4f, 0xff, 0xd1, 0x9, + 0xf0, 0x1f, 0x70, 0x6f, 0xff, 0x86, 0xff, 0xff, + 0xd1, 0x7, 0x1, 0x70, 0x5f, 0xff, 0xf9, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xff, + 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff, + 0x40, 0x30, 0x3, 0x7, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0x40, 0x4e, 0x1, 0xe2, 0x8, 0xff, 0xf8, + 0x2f, 0xff, 0x70, 0x4f, 0xf0, 0x1f, 0x90, 0x2f, + 0xff, 0x60, 0xef, 0xff, 0x7f, 0xff, 0x1, 0xb0, + 0x2e, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x0, 0x2e, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, + 0xec, 0x82, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x1a, 0xcc, 0xcc, 0xca, 0x10, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x49, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0x66, 0xff, 0xd1, 0xdf, 0xf6, 0x6f, 0xff, + 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, + 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, + 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, + 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, + 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, + 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, + 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, + 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, + 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, + 0xff, 0x80, 0x8, 0xff, 0xf6, 0x6f, 0xfd, 0x1d, + 0xff, 0x66, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x3f, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0x3f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xb0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, 0x3f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xdb, 0xa8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, + 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xf4, 0x8, 0xf0, + 0xe, 0x90, 0xf, 0xff, 0x8, 0xff, 0xf4, 0x8, + 0xf0, 0xe, 0x90, 0xf, 0xff, 0x8f, 0xff, 0xf4, + 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x8c, 0xf8, 0x8f, 0xc8, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfe, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x1c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x2b, 0xff, 0xf1, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x60, 0x0, 0x7f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 103, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34, .adv_w = 150, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 59, .adv_w = 270, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 204, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 365, .adv_w = 324, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 263, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 679, .adv_w = 81, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 690, .adv_w = 129, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 759, .adv_w = 130, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 828, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 878, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 944, .adv_w = 87, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 958, .adv_w = 147, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 969, .adv_w = 87, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1104, .adv_w = 256, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1223, .adv_w = 142, .box_w = 7, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1283, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1394, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1505, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1641, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1752, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1871, .adv_w = 230, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1990, .adv_w = 247, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2109, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2228, .adv_w = 87, .box_w = 4, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 87, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2288, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2354, .adv_w = 223, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2402, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2468, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2579, .adv_w = 397, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2832, .adv_w = 281, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 291, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3122, .adv_w = 278, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3258, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3403, .adv_w = 257, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3514, .adv_w = 244, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3625, .adv_w = 296, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3761, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3889, .adv_w = 119, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3915, .adv_w = 197, .box_w = 11, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4009, .adv_w = 276, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4145, .adv_w = 228, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4256, .adv_w = 367, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4546, .adv_w = 323, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4708, .adv_w = 277, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4836, .adv_w = 323, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5026, .adv_w = 279, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5154, .adv_w = 238, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5273, .adv_w = 225, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5392, .adv_w = 304, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5520, .adv_w = 273, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5682, .adv_w = 432, .box_w = 27, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5912, .adv_w = 258, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6048, .adv_w = 248, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6193, .adv_w = 252, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6321, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 6390, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6517, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 6586, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 6646, .adv_w = 192, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6658, .adv_w = 230, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 6669, .adv_w = 230, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6747, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6873, .adv_w = 219, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6951, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7077, .adv_w = 235, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7162, .adv_w = 136, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7252, .adv_w = 265, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7378, .adv_w = 262, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7495, .adv_w = 107, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7531, .adv_w = 109, .box_w = 9, .box_h = 23, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 7635, .adv_w = 237, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7752, .adv_w = 107, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7779, .adv_w = 406, .box_w = 22, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7922, .adv_w = 262, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8007, .adv_w = 244, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8098, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8224, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8350, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8402, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8480, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8560, .adv_w = 260, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8645, .adv_w = 215, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8743, .adv_w = 345, .box_w = 22, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8886, .adv_w = 212, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8971, .adv_w = 215, .box_w = 15, .box_h = 18, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9106, .adv_w = 200, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9184, .adv_w = 135, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9265, .adv_w = 115, .box_w = 3, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 135, .box_w = 8, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 9392, .adv_w = 223, .box_w = 12, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 9416, .adv_w = 161, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 9456, .adv_w = 121, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 9469, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9769, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9985, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10249, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10465, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10618, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10906, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11194, .adv_w = 432, .box_w = 27, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11491, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11779, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12022, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12334, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12448, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12619, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12943, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 264, .box_w = 17, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13363, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13528, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13801, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14032, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14263, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 14428, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14681, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14824, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14967, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15198, .adv_w = 336, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 15261, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15876, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16224, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16488, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16635, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16782, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17077, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17293, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17581, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17894, .adv_w = 336, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18136, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18388, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18619, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18829, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19045, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19249, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19501, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19753, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19996, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20334, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20550, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20895, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21135, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21375, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21615, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21855, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22095, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22405, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22633, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22885, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23198, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23468, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23684, .adv_w = 386, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 17, 0, 10, -8, 0, 0, + 0, 0, -21, -23, 3, 18, 8, 7, + -15, 3, 19, 1, 16, 4, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -10, 0, -46, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 13, 8, -7, 8, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -5, -19, 0, -15, + -3, 0, 0, 0, 0, 1, 15, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -28, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -31, -3, 15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -13, -53, 3, 10, 8, 1, -5, 0, + 14, 0, 12, 0, 12, 0, -36, 0, + -5, 12, 0, 13, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 31, 0, + 31, 0, 12, 0, 16, 5, 7, 12, + 0, 0, 0, -14, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -21, 0, -24, 0, 0, 0, + 0, -3, 0, 38, -5, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 23, 0, 0, -14, 0, + 13, 0, -26, -37, -26, -8, 12, 0, + 0, -26, 0, 5, -9, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 12, -47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -9, -8, 0, -10, + -13, -13, -7, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 10, 0, -10, -1, -5, 0, -1, -18, + 4, -3, 3, -20, 4, 0, 0, 1, + -20, 0, -20, -3, -33, -3, 0, -19, + 0, 8, 11, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -6, 0, + -7, 0, 12, -3, 1, -12, 0, 0, + 10, -19, -20, -16, -8, 4, 0, -3, + -25, -7, 0, -7, 0, -8, 6, -7, + -25, 0, -10, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -15, 0, -19, + -9, -8, -9, -12, -5, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -8, + -8, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -7, 0, 0, 0, 0, -19, -12, 0, + 0, 0, -6, -19, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -8, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 31, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -17, + 0, 0, 0, 0, 0, -36, -7, 13, + 12, -3, -16, 0, 4, -6, 0, -19, + -2, -5, 4, -27, -4, 5, 0, 6, + -13, -6, -14, -13, -16, 0, 0, -23, + 0, 22, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -13, -1, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -8, 4, -3, -1, -10, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -8, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -5, 0, -3, -5, + -12, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -3, -5, + -3, 0, 3, 15, -1, 0, -10, 0, + -3, 8, 0, -4, -16, -5, 6, 0, + 0, -18, -7, 4, -7, 3, 0, -3, + -3, -12, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -7, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -7, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -13, 0, + 3, -8, 8, 1, -3, -18, 0, 0, + -8, -4, 0, -15, -10, -11, 0, 0, + -17, -4, -15, -15, -18, 0, -10, 0, + 3, 26, -5, 0, -9, -4, -1, -4, + -7, -10, -7, -14, -16, -9, -4, 0, + 0, -3, 0, 1, 0, 0, -27, -3, + 12, 8, -8, -14, 0, 1, -12, 0, + -19, -3, -4, 8, -35, -5, 1, 0, + 0, -25, -5, -20, -4, -28, 0, 0, + -27, 0, 23, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -15, -3, 0, -25, + 0, 0, 0, 0, -12, 0, -3, 0, + -1, -11, -18, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -17, + -4, -13, -12, -3, -7, -10, -4, -7, + 0, -8, -3, -13, -6, 0, -5, -7, + -4, -7, 0, 2, 0, -3, -13, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 16, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -8, -10, -12, + -3, 0, -8, 3, 15, 0, 0, 0, + 0, 31, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -3, 0, -12, + -6, 0, 12, -13, -12, -8, -8, 15, + 7, 4, -33, -3, 8, -4, 0, -4, + 4, -4, -13, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -11, + 0, -21, -5, 11, -5, -15, 1, -5, + -13, -13, -4, 15, 4, 0, -6, 0, + -10, 0, 3, 13, -9, -14, -15, -10, + 12, 0, 1, -28, -3, 4, -7, -3, + -9, 0, -8, -14, -6, -6, -3, 0, + 0, -9, -8, -4, 0, 12, 9, -4, + -21, 0, -21, -5, 0, -13, -22, -1, + -12, -7, -13, -11, 10, 0, 0, -5, + 0, -8, -3, 0, -4, -7, 0, 7, + -13, 4, 0, 0, -20, 0, -4, -8, + -7, -3, -12, -10, -13, -9, 0, -12, + -4, -9, -7, -12, -4, 0, 0, 1, + 18, -7, 0, -12, -4, 0, -4, -8, + -9, -10, -11, -15, -5, -8, 8, 0, + -6, 0, -19, -5, 2, 8, -12, -14, + -8, -13, 13, -4, 2, -36, -7, 8, + -8, -7, -14, 0, -12, -16, -5, -4, + -3, -4, -8, -12, -1, 0, 0, 12, + 11, -3, -25, 0, -23, -9, 9, -15, + -26, -8, -13, -16, -19, -13, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -7, 8, 0, 0, -12, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 15, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -23, 0, -4, 7, 0, 12, + 0, 0, 38, 5, -8, -8, 4, 4, + -3, 1, -19, 0, 0, 18, -23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -26, 15, 54, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -10, 0, + 0, 1, 0, 0, 4, 50, -8, -3, + 12, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -50, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -5, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -6, 0, + -10, 0, 0, 0, -7, 4, -5, 0, + 0, -10, -4, -9, 0, 0, -10, 0, + -4, 0, -18, 0, -4, 0, 0, -31, + -7, -15, -4, -14, 0, 0, -26, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 8, + 0, -3, -9, -3, -7, -7, 0, -5, + -2, -3, 3, -10, -1, 0, 0, 0, + -34, -3, -5, 0, -8, 0, -3, -18, + -3, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -10, -4, -8, 0, + 0, -11, 0, -4, 0, -18, 0, 0, + 0, 0, -37, 0, -8, -14, -19, 0, + 0, -26, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 12, + 19, -4, -4, -12, 5, 19, 7, 8, + -10, 5, 16, 5, 11, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 18, -7, -4, 0, -3, + 31, 17, 31, 0, 0, 0, 4, 0, + 0, 14, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -32, -5, -3, -16, + -19, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -32, -5, -3, + -16, -19, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -9, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -3, -3, -8, 0, -3, -15, 0, 24, + -4, 0, -8, -3, 0, -3, -7, 0, + -4, -11, -8, -5, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -32, + -5, -3, -16, -19, 0, 0, -26, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -12, -5, -3, 12, -3, -4, + -15, 1, -2, 1, -3, -10, 1, 8, + 1, 3, 1, 3, -9, -15, -5, 0, + -15, -7, -10, -16, -15, 0, -6, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -10, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -23, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -7, -3, 0, -11, + -3, -8, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 12, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -9, 0, 0, + 16, -5, -13, -12, 3, 4, 4, -1, + -11, 3, 6, 3, 12, 3, 13, -3, + -10, 0, 0, -15, 0, 0, -12, -10, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 14, 0, 0, -3, 0, -8, 0, + 0, 5, -9, 0, 4, -4, 3, 0, + 0, -13, 0, -3, -1, 0, -4, 4, + -3, 0, 0, 0, -16, -5, -8, 0, + -12, 0, 0, -18, 0, 14, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 9, + 0, 0, 0, 0, 0, -24, -22, 1, + 17, 12, 7, -15, 3, 16, 0, 14, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_24 = { +#else +lv_font_t lv_font_montserrat_24 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 27, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_24*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_26.c b/libraries/lvgl/src/font/lv_font_montserrat_26.c new file mode 100644 index 0000000..93d4f71 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_26.c @@ -0,0 +1,4592 @@ +/******************************************************************************* + * Size: 26 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 26 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_26.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 1 +#endif + +#if LV_FONT_MONTSERRAT_26 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0x0, 0xef, 0xe0, 0xe, 0xfd, 0x0, + 0xdf, 0xd0, 0xc, 0xfc, 0x0, 0xcf, 0xb0, 0xb, + 0xfb, 0x0, 0xbf, 0xa0, 0xa, 0xfa, 0x0, 0x9f, + 0x90, 0x9, 0xf8, 0x0, 0x8f, 0x80, 0x4, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x41, 0x0, 0xef, 0xe0, + 0x2f, 0xff, 0x10, 0x9f, 0x90, + + /* U+0022 "\"" */ + 0x5f, 0xd0, 0xa, 0xf8, 0x5f, 0xc0, 0xa, 0xf7, + 0x4f, 0xc0, 0x9, 0xf7, 0x4f, 0xb0, 0x9, 0xf6, + 0x4f, 0xb0, 0x8, 0xf6, 0x3f, 0xa0, 0x8, 0xf6, + 0x3f, 0xa0, 0x8, 0xf5, 0x1, 0x0, 0x0, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, + 0xaf, 0x30, 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, + 0x0, 0xcf, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6, 0xee, 0xef, + 0xfe, 0xee, 0xee, 0xff, 0xee, 0xe8, 0x0, 0x0, + 0xe, 0xf0, 0x0, 0x2, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xd0, 0x0, 0x4, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x90, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0xa, + 0xf3, 0x0, 0x0, 0x4e, 0xee, 0xff, 0xfe, 0xee, + 0xef, 0xfe, 0xee, 0xa0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, + 0x10, 0x0, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xfd, 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, 0x60, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xae, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xb, 0xff, 0xc6, + 0xbf, 0x57, 0xbf, 0xe0, 0x3, 0xff, 0xa0, 0x9, + 0xf0, 0x0, 0x14, 0x0, 0x6f, 0xf2, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x10, 0x9f, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xac, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x9, 0xf0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x8f, 0xf0, 0x4c, + 0x30, 0x0, 0x9f, 0x0, 0x1e, 0xfd, 0xc, 0xff, + 0xb7, 0x4b, 0xf4, 0x7e, 0xff, 0x50, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3, 0x9d, + 0xef, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x1a, 0xef, 0xc5, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1e, 0xfa, 0x9d, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x9, 0xf5, 0x0, + 0xd, 0xf0, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0xed, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x4, 0xf6, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, + 0x5f, 0x50, 0xa, 0xf6, 0x0, 0x0, 0x0, 0xb, + 0xf1, 0x0, 0xa, 0xf1, 0x5, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd4, 0x38, 0xfa, 0x1, 0xee, + 0x10, 0x1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x0, 0xbf, 0x40, 0x7e, 0xff, 0xb1, 0x0, 0x0, + 0x4, 0x42, 0x0, 0x6f, 0x90, 0x8f, 0xb6, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x1f, + 0xc0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xf3, 0x5, 0xf5, 0x0, 0x0, 0xec, 0x0, 0x0, + 0x0, 0x7, 0xf8, 0x0, 0x7f, 0x30, 0x0, 0xc, + 0xe0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0xce, 0x0, 0x0, 0x0, 0xcf, 0x30, + 0x0, 0x5f, 0x50, 0x0, 0xe, 0xc0, 0x0, 0x0, + 0x8f, 0x70, 0x0, 0x0, 0xfc, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0xfb, + 0x68, 0xfc, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xe9, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5c, 0xff, 0xd9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xef, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x1c, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x7, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0x49, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x9c, + 0xff, 0x40, 0x0, 0x44, 0x0, 0xb, 0xfe, 0x30, + 0xc, 0xff, 0x40, 0xb, 0xf7, 0x6, 0xff, 0x20, + 0x0, 0xb, 0xff, 0x51, 0xff, 0x20, 0xbf, 0xb0, + 0x0, 0x0, 0xa, 0xff, 0xbf, 0xc0, 0xc, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x2, + 0xff, 0xe8, 0x31, 0x25, 0xaf, 0xfd, 0xff, 0x80, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, + 0x30, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xd5, 0xfc, 0x4f, 0xc4, 0xfb, 0x4f, 0xb3, + 0xfa, 0x3f, 0xa0, 0x10, + + /* U+0028 "(" */ + 0x0, 0xb, 0xfb, 0x0, 0x3f, 0xf3, 0x0, 0xbf, + 0xb0, 0x1, 0xff, 0x50, 0x6, 0xff, 0x0, 0xb, + 0xfb, 0x0, 0xf, 0xf7, 0x0, 0x2f, 0xf4, 0x0, + 0x4f, 0xf2, 0x0, 0x6f, 0xf0, 0x0, 0x7f, 0xf0, + 0x0, 0x8f, 0xe0, 0x0, 0x8f, 0xe0, 0x0, 0x7f, + 0xf0, 0x0, 0x6f, 0xf0, 0x0, 0x4f, 0xf2, 0x0, + 0x2f, 0xf4, 0x0, 0xe, 0xf7, 0x0, 0xb, 0xfb, + 0x0, 0x6, 0xff, 0x0, 0x1, 0xff, 0x50, 0x0, + 0xbf, 0xb0, 0x0, 0x3f, 0xf3, 0x0, 0xb, 0xfb, + + /* U+0029 ")" */ + 0xe, 0xf7, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, + 0xef, 0x80, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x3f, + 0xf3, 0x0, 0x0, 0xef, 0x80, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x4f, 0xf2, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x2f, 0xf4, 0x0, 0x2, 0xff, 0x40, 0x0, 0x3f, + 0xf3, 0x0, 0x4, 0xff, 0x20, 0x0, 0x5f, 0xf1, + 0x0, 0x8, 0xfe, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0xe, 0xf8, 0x0, 0x3, 0xff, 0x30, 0x0, 0x9f, + 0xd0, 0x0, 0xe, 0xf7, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0xef, 0x70, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x1, 0x0, 0x9f, + 0x0, 0x0, 0x2f, 0x91, 0x8f, 0x6, 0xe8, 0x2b, + 0xff, 0xdf, 0xcf, 0xe5, 0x0, 0x4d, 0xff, 0xf7, + 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x20, 0x3e, 0xfc, + 0xbf, 0x8f, 0xf8, 0x1d, 0x50, 0x8f, 0x2, 0xb6, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x11, 0x11, + 0x9f, 0xa1, 0x11, 0x10, 0x0, 0x0, 0x8, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0x20, 0x6f, 0xf5, 0xbf, 0xfa, 0x6f, 0xf8, + 0xc, 0xf2, 0xf, 0xd0, 0x4f, 0x80, 0x8f, 0x20, + + /* U+002D "-" */ + 0x12, 0x22, 0x22, 0x21, 0x8f, 0xff, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x7, 0x70, 0x9f, 0xf8, 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0xbf, 0xfd, 0x85, 0x6b, 0xff, 0xe1, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x6, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0xbf, 0xfd, 0x75, 0x6b, 0xff, 0xe1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xec, 0xff, 0xff, 0xfe, 0x34, + 0x44, 0xcf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0xbf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, + 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + + /* U+0032 "2" */ + 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5f, + 0xff, 0xb7, 0x56, 0x9f, 0xff, 0x90, 0x0, 0xbd, + 0x20, 0x0, 0x0, 0x1e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x64, 0x44, 0x44, 0x44, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0x44, + 0x44, 0x44, 0x4b, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x6, 0x78, 0xbf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x2e, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xf4, 0xaf, 0xfe, 0xa6, 0x56, 0x8e, 0xff, 0xb0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x40, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe1, 0x0, 0xa, 0xc7, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x30, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x4e, 0xfb, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xe4, 0x44, 0x44, 0x44, 0x40, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, + 0x43, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xd0, 0xd, 0xa2, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5, 0xff, 0xfb, 0x76, 0x67, 0xdf, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x1, 0x6a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x7f, 0xff, 0xa6, 0x44, 0x6b, 0xa0, 0x0, 0x3f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x1, 0x10, 0x0, 0x0, 0xa, 0xfe, 0x3, 0xaf, + 0xff, 0xfb, 0x50, 0x0, 0xbf, 0xd6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0x72, 0x1, + 0x5d, 0xff, 0x80, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0xc, 0xff, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xf3, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x41, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x9, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xfd, + 0x0, 0xd, 0xff, 0x94, 0x23, 0x6e, 0xff, 0x50, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd8, 0x20, 0x0, + + /* U+0037 "7" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xf7, 0x44, 0x44, 0x44, 0x4b, 0xff, 0x33, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x3f, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x1, 0x77, 0x20, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x4, 0x9d, 0xff, 0xec, 0x82, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xa, + 0xff, 0xc6, 0x32, 0x37, 0xef, 0xf5, 0x0, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x8, 0xff, 0xa3, + 0x10, 0x15, 0xcf, 0xf3, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0xcf, 0xfa, 0x31, 0x2, + 0x5c, 0xff, 0x80, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x2b, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x8b, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x20, 0xdf, 0xfc, 0x53, 0x23, 0x7e, 0xff, 0x90, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x4, + 0xff, 0xe7, 0x32, 0x49, 0xff, 0xd0, 0x0, 0xcf, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0x90, 0x1f, 0xf6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x13, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x90, 0xef, 0xd1, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0x6, 0xff, 0xe7, 0x32, + 0x39, 0xff, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xfc, 0x0, 0x3, 0x9d, 0xff, 0xd9, + 0x20, 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, + 0x0, 0x9, 0xb6, 0x54, 0x5a, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, 0x0, + + /* U+003A ":" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x9f, 0xf8, + 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+003B ";" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x6f, 0xf5, + 0xbf, 0xfa, 0x6f, 0xf8, 0xc, 0xf2, 0xf, 0xd0, + 0x4f, 0x80, 0x8f, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xf6, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xf9, 0x20, 0x0, 0x6c, 0xff, 0xfc, + 0x60, 0x0, 0x19, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, + + /* U+003E ">" */ + 0x39, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xf6, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0x60, 0x0, 0x1, + 0x6c, 0xff, 0xfb, 0x50, 0x0, 0x4a, 0xff, 0xfe, + 0x81, 0x0, 0x2, 0xdf, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x4f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x6, 0xbd, 0xff, 0xea, 0x50, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, + 0x95, 0x34, 0x7e, 0xff, 0x90, 0x2c, 0xc1, 0x0, + 0x0, 0x1, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0x60, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xfe, 0xcb, 0xce, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x51, 0x0, 0x0, + 0x1, 0x5b, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xa0, 0x0, 0x0, 0x7f, 0xd1, 0x0, 0x17, 0xcf, + 0xfc, 0x70, 0x4f, 0xf1, 0xcf, 0x70, 0x0, 0x2f, + 0xf2, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd6, 0xff, + 0x1, 0xef, 0x20, 0xa, 0xf6, 0x0, 0x1e, 0xfe, + 0x61, 0x3, 0x9f, 0xff, 0xf0, 0x4, 0xfa, 0x1, + 0xfe, 0x0, 0xa, 0xfe, 0x20, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0xc, 0xf1, 0x6f, 0x80, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x7f, + 0x59, 0xf5, 0x0, 0x4f, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x4, 0xf8, 0xbf, 0x30, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, + 0x2f, 0x9b, 0xf2, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x0, 0x2, 0xf9, 0xbf, 0x30, + 0x4, 0xff, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x3f, 0x89, 0xf5, 0x0, 0xf, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x5, 0xf6, 0x6f, + 0x90, 0x0, 0x9f, 0xe2, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0xaf, 0x21, 0xfe, 0x0, 0x1, 0xef, + 0xe6, 0x10, 0x29, 0xfd, 0xff, 0x70, 0x6f, 0xc0, + 0xa, 0xf6, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x2b, 0xff, 0xff, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x1a, 0xef, 0xb2, + 0x0, 0x0, 0x7f, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x61, 0x0, + 0x0, 0x2, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xdf, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0x81, 0x11, 0x11, 0x11, 0x11, + 0x8f, 0xf0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd0, + + /* U+0042 "B" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x4f, 0xf6, 0x22, 0x22, 0x23, 0x5c, 0xff, + 0xd0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf6, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x50, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf1, 0x4, 0xff, 0x62, 0x22, 0x22, + 0x35, 0xcf, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x14, 0xbf, 0xf8, 0x4, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x24, + 0xff, 0x62, 0x22, 0x22, 0x23, 0x6c, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, + 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x1c, 0xff, 0xfc, 0x76, 0x57, 0xcf, + 0xff, 0x60, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3d, 0xe2, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x3, 0xde, 0x30, + 0x1, 0xcf, 0xff, 0xc7, 0x65, 0x7c, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xda, 0x50, + 0x0, + + /* U+0044 "D" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x40, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x46, + 0x9e, 0xff, 0xf7, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf1, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x34, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x14, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0x60, 0x4, 0xff, + 0x84, 0x44, 0x44, 0x68, 0xef, 0xff, 0x70, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xb6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x1c, 0xff, 0xfc, 0x86, 0x57, 0xbf, + 0xff, 0x90, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x1a, 0xf4, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x1b, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xd0, + 0x1, 0xcf, 0xff, 0xc8, 0x65, 0x7a, 0xff, 0xfc, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, 0x71, + 0x0, + + /* U+0048 "H" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x84, 0x44, 0x44, + 0x44, 0x44, 0x6f, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+0049 "I" */ + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, + + /* U+004A "J" */ + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x14, 0x44, 0x44, + 0x4d, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x10, + 0x0, 0x0, 0xf, 0xfa, 0x7, 0xe2, 0x0, 0x0, + 0x6f, 0xf6, 0xe, 0xff, 0x95, 0x59, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x17, + 0xcf, 0xfd, 0x92, 0x0, + + /* U+004B "K" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4, 0xff, 0x50, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x8e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x3c, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x30, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x20, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf4, + + /* U+004C "L" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x14, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x14, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x14, 0xff, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xaf, 0xf1, 0x4f, + 0xf3, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0x96, + 0xff, 0x14, 0xff, 0x34, 0xff, 0x50, 0x0, 0x0, + 0x8f, 0xe1, 0x6f, 0xf1, 0x4f, 0xf3, 0xa, 0xfe, + 0x0, 0x0, 0x2f, 0xf6, 0x6, 0xff, 0x14, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0xa, 0xfc, 0x0, 0x6f, + 0xf1, 0x4f, 0xf3, 0x0, 0x6f, 0xf2, 0x4, 0xff, + 0x30, 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0xdf, + 0xc0, 0xdf, 0x90, 0x0, 0x6f, 0xf1, 0x4f, 0xf3, + 0x0, 0x3, 0xff, 0xbf, 0xe1, 0x0, 0x6, 0xff, + 0x14, 0xff, 0x30, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf3, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0x14, 0xff, 0x30, + 0x0, 0x0, 0x6d, 0x30, 0x0, 0x0, 0x6f, 0xf1, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, + + /* U+004E "N" */ + 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x6d, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x2f, 0xff, 0x20, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x4f, 0xfe, + 0x10, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x7f, + 0xfc, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, + 0xaf, 0xf9, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0xdf, 0xf6, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x1, 0xef, 0xf3, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x3, 0xff, 0xe5, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xef, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+004F "O" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfc, + 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0xbf, + 0xfc, 0x20, 0x0, 0x0, 0x3, 0xdf, 0xf9, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x60, 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x9f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x9f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x6f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xe0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x60, 0x0, 0xcf, 0xfc, 0x20, + 0x0, 0x0, 0x3, 0xdf, 0xfa, 0x0, 0x0, 0x1c, + 0xff, 0xfb, 0x76, 0x68, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, + 0xb6, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x32, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfc, 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0xb, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x80, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xd0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0xdf, 0xfb, 0x10, 0x0, + 0x0, 0x2, 0xcf, 0xfb, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xa6, 0x45, 0x6b, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x22, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xfe, 0xb5, 0x0, + + /* U+0052 "R" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xf7, 0x33, 0x33, 0x3c, 0xfe, 0x10, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, + + /* U+0053 "S" */ + 0x0, 0x3, 0x9d, 0xef, 0xec, 0x94, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xa, + 0xff, 0xc7, 0x43, 0x47, 0xbf, 0xe0, 0x3, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x25, 0x0, 0x6f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x1e, 0xfc, + 0xc, 0xff, 0xd9, 0x54, 0x35, 0x8e, 0xff, 0x40, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x2, 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x44, 0x44, 0x44, 0xcf, 0xf4, 0x44, 0x44, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x7, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0xcf, 0xfe, 0x96, 0x57, 0xbf, 0xff, 0x50, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf4, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x3, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0x40, 0xaf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x5, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0xf, 0xfb, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0xff, 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xf0, + 0xbf, 0xc0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0xb, 0xfa, 0x5, 0xff, + 0x20, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x1, 0xff, 0x50, 0xf, 0xf7, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x6f, 0xf0, 0x0, 0xaf, 0xd0, 0x0, 0xe, + 0xf9, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0xc, + 0xfa, 0x0, 0x5, 0xff, 0x20, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xf8, 0x0, 0x9f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x50, 0x7f, 0xe0, 0x0, 0x0, + 0x9f, 0xd0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfb, 0xd, 0xf9, 0x0, 0x0, 0x4, 0xff, + 0x34, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf4, 0xff, 0x40, 0x0, 0x0, 0xe, 0xf8, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x9f, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0xb, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xe1, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x8d, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x19, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x8, 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x10, 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf9, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe1, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x40, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd1, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4c, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x4f, 0xff, 0xff, 0x24, 0xff, 0xff, 0xf2, 0x4f, + 0xf4, 0x11, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, + 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, + 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x41, 0x10, 0x4f, 0xff, 0xff, + 0x24, 0xff, 0xff, 0xf2, + + /* U+005C "\\" */ + 0x78, 0x20, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, 0x1, 0x19, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x1, + 0x19, 0xfe, 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, + + /* U+005E "^" */ + 0x0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xaf, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf0, 0xdf, + 0x10, 0x0, 0x0, 0x5, 0xf9, 0x6, 0xf7, 0x0, + 0x0, 0x0, 0xcf, 0x30, 0x1f, 0xe0, 0x0, 0x0, + 0x2f, 0xc0, 0x0, 0x9f, 0x50, 0x0, 0x9, 0xf6, + 0x0, 0x3, 0xfb, 0x0, 0x0, 0xfe, 0x0, 0x0, + 0xc, 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x6f, + 0x90, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x0, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x58, 0x83, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x7f, 0xf4, 0x0, 0x0, 0x4e, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x39, 0xdf, 0xfe, 0xb6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xe, 0xfa, 0x63, + 0x36, 0xdf, 0xf8, 0x0, 0x42, 0x0, 0x0, 0x0, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, + 0x6b, 0xef, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xdd, 0xdd, 0xdf, 0xf4, 0x6f, 0xf7, 0x0, 0x0, + 0x3, 0xff, 0x4a, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf4, 0xaf, 0xe0, 0x0, 0x0, 0xa, 0xff, 0x45, + 0xff, 0x80, 0x0, 0x1a, 0xff, 0xf4, 0xa, 0xff, + 0xfd, 0xdf, 0xfa, 0xff, 0x40, 0x6, 0xcf, 0xfe, + 0xb5, 0x1f, 0xf4, + + /* U+0062 "b" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x2, + 0x9e, 0xfe, 0xc6, 0x0, 0x0, 0xaf, 0xd6, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0xa, 0xff, 0xff, 0xa5, + 0x35, 0xaf, 0xff, 0x20, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x7a, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x9a, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x3a, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xfa, 0x53, 0x5a, 0xff, 0xf2, 0xa, + 0xfc, 0x6f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xc0, 0x39, 0xef, 0xec, 0x60, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x1, 0x7c, 0xef, 0xea, 0x50, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xf9, + 0x43, 0x5b, 0xff, 0xa1, 0xef, 0xe2, 0x0, 0x0, + 0x7, 0xd3, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, 0x7d, 0x40, + 0x4f, 0xff, 0x94, 0x35, 0xbf, 0xfa, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x17, 0xce, + 0xfe, 0xa4, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x18, + 0xde, 0xfd, 0x81, 0x2f, 0xf5, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0x50, 0x5f, 0xff, 0x84, + 0x36, 0xcf, 0xff, 0xf5, 0x1f, 0xfe, 0x20, 0x0, + 0x0, 0x8f, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0xbf, 0xd0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x5d, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf5, 0xdf, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x5b, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x51, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xff, 0xf5, + 0x5, 0xff, 0xe6, 0x21, 0x3a, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf5, 0x0, + 0x2, 0x8d, 0xff, 0xd8, 0x10, 0xff, 0x50, + + /* U+0065 "e" */ + 0x0, 0x2, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, + 0xd5, 0x22, 0x5d, 0xff, 0x40, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xbf, 0xe0, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x20, 0x0, 0x0, 0x19, 0x0, 0x4, 0xff, 0xf9, + 0x43, 0x48, 0xef, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x1, 0x6c, 0xef, 0xeb, + 0x60, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xfc, 0x31, 0x43, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x14, + 0xff, 0x41, 0x11, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xef, 0xd9, 0x20, 0xdf, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xf8, 0x7, + 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0x82, 0xff, + 0xc1, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x8f, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x8c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf8, 0xef, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x8c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf8, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x83, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xf8, 0x9, 0xff, 0xd5, 0x10, 0x27, + 0xef, 0xff, 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0x0, 0x5, 0xbf, 0xff, 0xfc, 0x40, + 0xff, 0x80, 0x0, 0x0, 0x2, 0x20, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x4a, 0x10, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xe, 0xff, 0xa6, 0x43, 0x48, 0xef, 0xf5, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0068 "h" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x3a, 0xef, 0xfc, + 0x60, 0x0, 0xaf, 0xd8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xf8, 0x54, 0x6d, 0xff, 0x90, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0xdf, 0xf1, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0xaf, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf6, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xf6, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, + + /* U+0069 "i" */ + 0x8, 0xfb, 0x0, 0xff, 0xf3, 0xc, 0xfe, 0x10, + 0x3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0xa, + 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, + 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, + 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, + 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x6, 0xfc, 0x10, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xf0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x74, + 0x26, 0xff, 0x90, 0x2f, 0xff, 0xff, 0xe1, 0x1, + 0xad, 0xfe, 0xa2, 0x0, + + /* U+006B "k" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x3, + 0xef, 0xd1, 0xaf, 0xd0, 0x0, 0x0, 0x4f, 0xfc, + 0x10, 0xaf, 0xd0, 0x0, 0x5, 0xff, 0xc1, 0x0, + 0xaf, 0xd0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0xaf, + 0xd0, 0x7, 0xff, 0xc1, 0x0, 0x0, 0xaf, 0xd0, + 0x8f, 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xd9, 0xff, + 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, + 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x7f, 0xfb, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0xaf, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, + + /* U+006C "l" */ + 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, + 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, + 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, + 0xaf, 0xda, 0xfd, 0xaf, 0xd0, + + /* U+006D "m" */ + 0xaf, 0xc0, 0x5b, 0xef, 0xea, 0x40, 0x0, 0x5a, + 0xef, 0xeb, 0x50, 0x0, 0xaf, 0xca, 0xff, 0xff, + 0xff, 0xf8, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xd6, 0x22, 0x6e, 0xff, 0xdf, 0xe7, + 0x32, 0x5d, 0xff, 0x60, 0xaf, 0xfd, 0x0, 0x0, + 0x2, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xd0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0xaf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + + /* U+006E "n" */ + 0xaf, 0xc0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0xaf, + 0xc9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xe6, 0x32, 0x4c, 0xff, 0x90, 0xaf, 0xfd, 0x10, + 0x0, 0x0, 0xcf, 0xf1, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xf6, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf6, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x4, + 0xff, 0xf8, 0x43, 0x5c, 0xff, 0xc0, 0x1, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0x80, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xfe, 0xb, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x37, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x1e, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x4f, 0xff, 0x84, 0x36, 0xcf, + 0xfc, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0070 "p" */ + 0xaf, 0xc0, 0x3a, 0xef, 0xec, 0x60, 0x0, 0xa, + 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xff, 0xf8, 0x31, 0x38, 0xff, 0xf2, 0xa, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x3a, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x9a, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x7a, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xff, 0x40, 0x0, 0x0, + 0x5f, 0xfc, 0xa, 0xff, 0xff, 0xa5, 0x35, 0xaf, + 0xff, 0x20, 0xaf, 0xd6, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xa, 0xfd, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xef, 0xd8, 0x10, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xf5, 0x5, + 0xff, 0xf8, 0x43, 0x6c, 0xff, 0xff, 0x51, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x5b, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x5f, 0xff, 0x84, 0x36, 0xcf, + 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe5, + 0xff, 0x50, 0x0, 0x28, 0xdf, 0xfd, 0x81, 0x2f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + + /* U+0072 "r" */ + 0xaf, 0xc0, 0x3a, 0xec, 0xaf, 0xc7, 0xff, 0xfc, + 0xaf, 0xef, 0xfb, 0x75, 0xaf, 0xff, 0x30, 0x0, + 0xaf, 0xf6, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x50, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xa4, + 0x23, 0x59, 0xf2, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x6b, + 0xef, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x14, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x4, 0x20, 0x0, 0x0, 0x5, 0xff, 0x30, + 0xef, 0xb6, 0x33, 0x47, 0xff, 0xd0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xad, 0xff, + 0xec, 0x71, 0x0, + + /* U+0074 "t" */ + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x9f, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x14, 0xff, 0x41, 0x11, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0x52, 0x55, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5c, 0xff, 0xc6, 0x0, + + /* U+0075 "u" */ + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x9f, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x5f, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xf3, 0xe, 0xff, 0x83, + 0x13, 0x8f, 0xff, 0xf3, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x7f, 0xf3, 0x0, 0x18, 0xdf, 0xfd, 0x91, + 0x2f, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xb0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xf2, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfe, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0xa0, + 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0x40, 0x9, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0xff, 0x10, 0x0, 0x4, 0xfe, 0x0, + 0x3, 0xff, 0x20, 0x0, 0xf, 0xf4, 0xdf, 0x60, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x5f, 0xe0, 0x8f, 0xc0, 0x0, 0x1f, 0xf3, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0xbf, 0x80, 0x2f, 0xf2, + 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x1f, 0xf3, 0x1, + 0xff, 0x20, 0xc, 0xf8, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0xb, 0xf9, 0x7, 0xfc, 0x0, 0x6, 0xfe, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x5, 0xfe, 0xd, + 0xf6, 0x0, 0x0, 0xff, 0x48, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x8f, 0xf0, 0x0, 0x0, 0xaf, + 0x9d, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x4, + 0xff, 0x80, 0x0, 0x2, 0xff, 0x80, 0x0, 0x7f, + 0xf4, 0x0, 0xd, 0xfc, 0x0, 0x0, 0xb, 0xfe, + 0x10, 0xaf, 0xe1, 0x0, 0x0, 0x1, 0xef, 0xc6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0xfc, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x83, 0xff, 0x80, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0xbf, 0xe1, + 0x0, 0xb, 0xfe, 0x20, 0x8, 0xff, 0x40, 0x0, + 0x1, 0xef, 0xc0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xf9, + + /* U+0079 "y" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x9, 0xfe, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x2, 0xff, 0x60, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x2, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0xf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x8f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0x73, 0x3a, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x1, 0x11, 0x11, 0x14, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1e, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x1, 0x9d, 0xfa, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x3f, 0xfa, 0x20, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x1, 0xbf, 0xf0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x3f, 0xfa, 0x20, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x1, 0x9d, 0xfa, + + /* U+007C "|" */ + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + + /* U+007D "}" */ + 0x8f, 0xea, 0x10, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x1, 0x9f, 0xf6, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xc, 0xfd, 0x20, 0x0, 0x4, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xf, 0xf8, 0x0, 0x1, 0x9f, 0xf6, 0x0, + 0x8f, 0xff, 0xe0, 0x0, 0x8f, 0xea, 0x10, 0x0, + + /* U+007E "~" */ + 0x1, 0xaf, 0xfa, 0x20, 0x0, 0x1f, 0x80, 0xcf, + 0xff, 0xff, 0x60, 0x8, 0xf6, 0x3f, 0xb1, 0x17, + 0xff, 0xed, 0xfe, 0x6, 0xf3, 0x0, 0x2, 0xae, + 0xfb, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xe8, + 0x0, 0xd, 0xe7, 0x58, 0xfb, 0x7, 0xf2, 0x0, + 0x4, 0xf5, 0xcb, 0x0, 0x0, 0xe, 0xac, 0xb0, + 0x0, 0x0, 0xda, 0x8f, 0x10, 0x0, 0x3f, 0x71, + 0xed, 0x52, 0x5e, 0xd0, 0x2, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x24, 0x20, 0x0, + + /* U+2022 "•" */ + 0x2, 0xab, 0x40, 0xe, 0xff, 0xf2, 0x3f, 0xff, + 0xf5, 0x1f, 0xff, 0xf3, 0x5, 0xee, 0x70, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xa5, 0x10, + 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0x98, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2, + 0x44, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x5d, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x4, + 0xac, 0xdb, 0x81, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x34, 0x0, 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x81, 0x0, 0x43, 0xea, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xae, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0xcc, 0xff, 0xfa, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, + 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, 0xfb, 0x0, + 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0xaa, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0xaa, 0xef, 0xfa, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xfc, + 0x22, 0x5f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, + 0xbf, 0xf5, 0x22, 0xcf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfe, 0x88, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x88, 0xef, 0xfa, 0x0, + 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf2, 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, + 0xfc, 0x44, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x66, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x66, 0xdf, 0xa9, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9a, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x77, 0x77, 0x60, 0x1, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x88, 0x88, 0x70, 0x2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe3, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x48, 0x88, 0x88, 0x71, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xc, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe3, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x20, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe2, 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0xbf, 0xff, 0xff, 0xe2, 0x3, 0xff, 0xff, + 0xff, 0xab, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0xb, 0xff, 0xff, + 0xfe, 0x23, 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, + 0xff, 0xe2, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x3, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x9, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xef, 0x70, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xbb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xf5, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x8f, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x2f, 0xff, 0xe0, 0x2, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0xcf, + 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xe0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0xbf, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0xa, 0xdd, 0x70, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0xf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x85, 0x34, + 0x59, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xdc, 0xb9, 0x50, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x55, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x6, 0x10, + 0x0, 0x0, 0xd, 0xfd, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc5, 0xdf, 0xd0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x33, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf4, + 0x0, 0x0, 0x7, 0xe5, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x5d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xdd, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfd, 0x30, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, + 0x30, 0x20, 0x1c, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xc1, 0x9, + 0xfb, 0x10, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x1, 0xbf, 0xff, + 0xd2, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x2d, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x10, 0x0, 0x1, 0xcf, + 0xff, 0xf4, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xdf, 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xfd, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1b, 0xff, 0xff, 0x50, 0xef, 0xff, 0xc1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x9f, 0xff, 0xf2, 0x6f, 0xf9, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x6, + 0xff, 0xa0, 0x7, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x39, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x83, 0x33, 0x5f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x20, 0x0, 0xe, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xbb, 0xb9, 0x0, + 0x0, 0x7, 0xbb, 0xbb, 0xba, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x14, 0xff, 0xff, 0xff, 0x41, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x9, + 0xff, 0x90, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x77, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xef, 0xff, + 0xcc, 0xcc, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x1b, + 0xcc, 0xcc, 0xce, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, + 0x0, 0x0, 0x0, 0x6e, 0xec, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x7f, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xfe, 0x84, 0x22, 0x59, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0x0, 0x1e, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, + 0x88, 0x88, 0x88, 0x86, 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, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0xff, 0xff, 0xfe, 0x56, 0x77, 0x81, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf4, + 0x0, 0xff, 0xfd, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xf8, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x8b, 0xdd, 0xb9, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf6, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xb5, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, + 0xdf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x2f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xfe, 0x20, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 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, 0xb, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0x6d, 0x40, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3e, 0xff, 0x50, 0xb, 0xff, 0x0, + 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x3, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xc6, + 0x0, 0x3f, 0xf9, 0x0, 0xdf, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x70, + 0xa, 0xff, 0x0, 0x8f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xf1, 0x5, + 0xff, 0x30, 0x5f, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xf6, 0x2, 0xff, + 0x50, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf7, 0x1, 0xff, 0x50, + 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x6f, 0xf4, 0x3, 0xff, 0x40, 0x4f, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xd0, 0x7, 0xff, 0x10, 0x6f, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xfd, 0x20, 0xd, 0xfc, 0x0, 0xbf, 0xd0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x40, + 0x0, 0x8f, 0xf5, 0x1, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xfe, + 0x10, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xc1, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf0, 0x0, 0x0, 0x15, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x2b, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xef, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xef, 0xf6, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xfb, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xf3, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0x93, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xfd, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd2, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x7b, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x8b, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0x66, 0xbb, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xa5, 0x0, 0x0, 0x7, + 0xab, 0xbb, 0xba, 0x50, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xee, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xf9, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0x9a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0xff, 0xf9, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, 0xff, + 0x9a, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1, 0xff, 0xf9, 0x8f, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x91, 0x99, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xab, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+F054 "" */ + 0x2, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0xff, 0xff, 0xd3, 0x33, + 0x33, 0x33, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x3a, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, + 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, 0x77, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x38, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xe2, + 0x0, 0x3, 0x98, 0x30, 0x0, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xe2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xfd, 0x0, + 0x3f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf2, 0x4, 0xff, 0xff, 0xff, 0x70, 0xcf, + 0xff, 0xff, 0xf6, 0x1, 0xc9, 0xdf, 0xff, 0xff, + 0xf7, 0x2, 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, + 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff, 0xff, + 0xf6, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, 0x10, + 0x1d, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x1, + 0x9f, 0xff, 0xb3, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc8, 0x78, 0xbf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xdb, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x25, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x5a, + 0xef, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf8, 0x30, 0x1, 0x4b, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb1, 0x7, 0x97, 0x10, 0x4, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xd3, 0xaf, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1e, 0xa0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x2, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x4f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0x10, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xa8, 0x78, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xa, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xef, 0xfe, 0xc8, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x4f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x72, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x10, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x10, 0xdf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0x11, 0x1b, 0xff, 0xfc, 0x1, 0xdf, 0xff, + 0xf8, 0x18, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xd1, 0x1d, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0xcf, + 0xff, 0xf9, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, + 0x26, 0x0, 0x4, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x1, 0xdf, 0x50, 0x7, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd1, 0x1d, 0xff, 0xf5, 0x8, 0xff, 0xfc, 0x10, + 0xde, 0xee, 0xef, 0xff, 0xfd, 0x10, 0x3f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x29, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x91, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x6e, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, + 0x10, + + /* U+F078 "" */ + 0x1, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x40, 0x1, 0xdf, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0xaf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x48, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xf4, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x3, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x4, 0x44, 0x44, 0x44, 0x44, 0x4e, 0xff, + 0x60, 0x0, 0x0, 0xcf, 0xff, 0x6f, 0xff, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0x42, 0xff, 0xf2, + 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x3, 0x20, 0x2f, 0xff, + 0x20, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x40, 0xdf, 0xf6, 0xa, 0xf5, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x3d, 0xff, 0x69, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xef, 0xfd, 0xff, 0xfd, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x0, 0x5, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x4, 0x78, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7b, 0xbb, 0xb9, 0x15, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xb0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x28, + 0xef, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0x70, 0x1a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, 0x0, + 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0xcf, 0xfd, 0x35, 0xff, 0xf8, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x10, 0xff, 0xf5, 0x0, 0x9f, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xd1, 0x0, + 0xff, 0xf6, 0x0, 0xaf, 0xfb, 0x0, 0xc, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xbf, 0xff, 0x89, 0xff, + 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xce, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xcf, 0xfd, 0x35, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x9f, 0xfb, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xf6, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xe8, 0x0, 0x0, 0x3a, 0xcc, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x4c, 0xdd, 0xdd, 0xdd, 0xdd, + 0x11, 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, 0xff, + 0xff, 0xb9, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0x41, 0x89, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x82, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf6, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0xff, 0xff, + 0x80, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x70, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf9, 0xff, 0xf9, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x87, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdc, 0x60, + + /* U+F0C9 "" */ + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 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, 0x69, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 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, + 0x69, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 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, + 0xfe, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xb2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4e, + 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x8, 0xff, 0xff, 0xfa, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1c, 0xff, 0xff, 0xff, 0xc1, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x8f, 0xff, 0xf8, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, 0x99, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F0E7 "" */ + 0x0, 0x9, 0xaa, 0xaa, 0xaa, 0xa9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x6c, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x33, 0x8f, 0xff, + 0xfb, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xd0, + 0x7d, 0xdd, 0xdd, 0xdd, 0x21, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, + 0x1f, 0xe2, 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xff, 0xff, 0xff, 0x31, 0xff, 0xe2, 0xf, 0xff, + 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x1f, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0x31, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xa2, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x56, 0x66, 0x63, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf4, 0x0, 0x9f, + 0x20, 0xb, 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, + 0x1, 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, + 0xa, 0xf0, 0x0, 0xbe, 0x0, 0xe, 0xb0, 0x0, + 0xff, 0xf4, 0xff, 0xf5, 0x0, 0xaf, 0x20, 0xb, + 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, 0x1, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xaa, 0xbf, 0xea, 0xac, 0xfe, + 0xaa, 0xdf, 0xda, 0xad, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, + 0x4f, 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, 0x4f, + 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xa0, 0x4, 0xf9, 0x0, 0x6f, 0x60, + 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x99, 0xef, 0xb9, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xaf, 0xf9, 0x9a, + 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, + 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, 0xf4, + 0xff, 0xf8, 0x44, 0xbf, 0x64, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4f, 0xd4, 0x45, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F124 "" */ + 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, 0x17, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xad, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x83, 0x7, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xc1, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xfc, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, + 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xff, 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfc, + 0x84, 0x20, 0x0, 0x1, 0x36, 0xae, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2d, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xf5, 0x8f, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x10, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x38, 0xcd, 0xef, 0xec, 0xa6, 0x10, + 0x0, 0x0, 0x4, 0xfe, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x63, 0x21, 0x24, + 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xae, 0x30, 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, 0x5, + 0xbd, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x79, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x80, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F241 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x10, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F242 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F243 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x41, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x1f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x41, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x41, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x1f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x88, 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F244 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbc, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x31, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x50, 0x0, 0x5c, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x50, 0x0, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd2, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x50, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfa, 0x10, 0x2e, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xd3, 0x0, 0x0, 0x18, + 0xb9, 0x20, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xa0, + 0x0, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x30, 0x1f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xfe, 0x77, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x56, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xdf, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xd9, 0xff, 0xe0, 0x3a, + 0x1, 0xdf, 0xff, 0xc0, 0xd, 0xff, 0xf1, 0x8, + 0xfe, 0x2, 0xfa, 0x2, 0xef, 0xff, 0x0, 0xff, + 0xff, 0xb0, 0x8, 0xe0, 0x2f, 0x50, 0x5f, 0xff, + 0xf1, 0x1f, 0xff, 0xff, 0xa0, 0x7, 0x2, 0x50, + 0x4f, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0x43, 0xff, 0xff, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xff, 0xf4, 0x3f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x50, 0x1c, 0x2, 0xa0, 0xb, + 0xff, 0xff, 0x20, 0xef, 0xff, 0x50, 0x1d, 0xf0, + 0x2f, 0xa0, 0xd, 0xff, 0xf0, 0xc, 0xff, 0xf4, + 0x1d, 0xff, 0x2, 0xf5, 0x4, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xfd, 0xff, 0xf0, 0x25, 0x3, 0xff, + 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x4, 0xbc, 0xcc, 0xcc, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0xef, + 0xff, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x10, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, 0x1d, 0xff, + 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, 0x0, 0x6f, + 0xff, 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, + 0xff, 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, + 0xdf, 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, + 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, + 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, + 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, + 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, + 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, + 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, + 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, + 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, + 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, + 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, 0xff, + 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, 0xd, + 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, + 0x1d, 0xff, 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf5, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xec, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xda, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xdf, 0xff, 0xd1, 0x8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x1, 0xdf, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1, 0xb1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x3, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x7, + 0xf7, 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x7, + 0xff, 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0xff, 0xff, 0xf7, 0x2e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1d, + 0xfc, 0x44, 0xfc, 0x44, 0xfc, 0x44, 0xff, 0xf5, + 0x1, 0xdf, 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, + 0xef, 0xf5, 0x1d, 0xff, 0xfb, 0x0, 0xeb, 0x0, + 0xeb, 0x0, 0xef, 0xf5, 0xdf, 0xff, 0xfb, 0x0, + 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, 0xff, 0xff, + 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, + 0xff, 0xff, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xdd, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 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, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x1, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x1, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x3, 0xef, 0xff, 0xff, + 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xee, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 111, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 45, .adv_w = 163, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 77, .adv_w = 292, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 239, .adv_w = 258, .box_w = 15, .box_h = 25, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 427, .adv_w = 351, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 616, .adv_w = 285, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 87, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 790, .adv_w = 140, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 862, .adv_w = 141, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 946, .adv_w = 166, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 996, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1074, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1090, .adv_w = 159, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1102, .adv_w = 94, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1110, .adv_w = 146, .box_w = 12, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1260, .adv_w = 277, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1404, .adv_w = 154, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1467, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1602, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1728, .adv_w = 278, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1890, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2025, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2160, .adv_w = 249, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2295, .adv_w = 268, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2430, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2565, .adv_w = 94, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2593, .adv_w = 94, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2629, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2707, .adv_w = 242, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2766, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2844, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2970, .adv_w = 430, .box_w = 25, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3258, .adv_w = 305, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3447, .adv_w = 315, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3600, .adv_w = 301, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3753, .adv_w = 344, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3924, .adv_w = 279, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4050, .adv_w = 264, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4176, .adv_w = 321, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4329, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4482, .adv_w = 129, .box_w = 4, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4518, .adv_w = 213, .box_w = 12, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4626, .adv_w = 299, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4779, .adv_w = 247, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4905, .adv_w = 397, .box_w = 21, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5094, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5247, .adv_w = 349, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5427, .adv_w = 300, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5571, .adv_w = 349, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5802, .adv_w = 302, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5946, .adv_w = 258, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6081, .adv_w = 244, .box_w = 16, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6225, .adv_w = 329, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6369, .adv_w = 296, .box_w = 20, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6549, .adv_w = 468, .box_w = 29, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6810, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6972, .adv_w = 269, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7134, .adv_w = 273, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7278, .adv_w = 139, .box_w = 7, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7362, .adv_w = 146, .box_w = 11, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 7500, .adv_w = 139, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7572, .adv_w = 243, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 7644, .adv_w = 208, .box_w = 13, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7657, .adv_w = 250, .box_w = 7, .box_h = 4, .ofs_x = 3, .ofs_y = 16}, + {.bitmap_index = 7671, .adv_w = 249, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7762, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7905, .adv_w = 238, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7996, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8139, .adv_w = 255, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8237, .adv_w = 147, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8342, .adv_w = 287, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8485, .adv_w = 283, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8618, .adv_w = 116, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8666, .adv_w = 118, .box_w = 9, .box_h = 24, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 8774, .adv_w = 256, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8907, .adv_w = 116, .box_w = 3, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 440, .box_w = 24, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 283, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9202, .adv_w = 264, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9307, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9450, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9593, .adv_w = 171, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9649, .adv_w = 208, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9740, .adv_w = 172, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9834, .adv_w = 282, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9932, .adv_w = 233, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10044, .adv_w = 374, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10212, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10310, .adv_w = 233, .box_w = 16, .box_h = 19, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10462, .adv_w = 217, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10546, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10642, .adv_w = 124, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 10690, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 10786, .adv_w = 242, .box_w = 13, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 10812, .adv_w = 174, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 10857, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 10872, .adv_w = 416, .box_w = 27, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11250, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11822, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12082, .adv_w = 286, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12253, .adv_w = 416, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12591, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12942, .adv_w = 468, .box_w = 30, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13302, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13653, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13953, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14304, .adv_w = 208, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14441, .adv_w = 312, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14651, .adv_w = 468, .box_w = 30, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15041, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15301, .adv_w = 286, .box_w = 18, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15544, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 15757, .adv_w = 364, .box_w = 23, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16079, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16355, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16631, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 16844, .adv_w = 364, .box_w = 25, .box_h = 24, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17144, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17305, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17742, .adv_w = 364, .box_w = 23, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 17811, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18111, .adv_w = 520, .box_w = 33, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18557, .adv_w = 468, .box_w = 31, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 18976, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19288, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19449, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19610, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19957, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20217, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20568, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20933, .adv_w = 364, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21221, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21532, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21808, .adv_w = 364, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22050, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22310, .adv_w = 260, .box_w = 18, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22553, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22864, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23175, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23475, .adv_w = 416, .box_w = 28, .box_h = 28, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23867, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24137, .adv_w = 520, .box_w = 33, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24533, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 24814, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25095, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25376, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25657, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25938, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26285, .adv_w = 364, .box_w = 21, .box_h = 27, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26569, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26880, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27245, .adv_w = 520, .box_w = 33, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27575, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27845, .adv_w = 418, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 19, 0, 11, -9, 0, 0, + 0, 0, -23, -25, 3, 20, 9, 7, + -17, 3, 20, 1, 17, 4, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -11, 0, -50, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 14, 8, -7, 8, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, -5, -20, 0, -17, + -3, 0, 0, 0, 0, 1, 16, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -33, -3, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -14, -57, 3, 11, 8, 1, -5, 0, + 15, 0, 13, 0, 13, 0, -39, 0, + -5, 12, 0, 14, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 33, 0, + 33, 0, 12, 0, 17, 5, 7, 12, + 0, 0, 0, -15, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -23, 0, -26, 0, 0, 0, + 0, -3, 0, 41, -5, -5, 4, 4, + -4, 0, -5, 4, 0, 0, -22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 25, 0, 0, -15, 0, + 14, 0, -28, -40, -28, -8, 12, 0, + 0, -28, 0, 5, -10, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, -51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -10, -8, 0, -10, + -14, -14, -8, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -8, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 11, 0, -10, -1, -5, 0, -1, -20, + 4, -3, 3, -22, 4, 0, 0, 1, + -22, 0, -22, -3, -36, -3, 0, -21, + 0, 8, 12, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -5, -6, 0, + -8, 0, 12, -3, 1, -13, 0, 0, + 11, -21, -22, -17, -8, 4, 0, -3, + -27, -7, 0, -7, 0, -8, 6, -7, + -27, 0, -11, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -16, 0, -21, + -10, -9, -10, -12, -5, -11, -1, -8, + -11, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -9, + -9, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -8, 0, 0, 0, 0, -21, -12, 0, + 0, 0, -6, -21, 0, 0, -4, 4, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -9, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 33, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -18, + 0, 0, 0, 0, 0, -39, -7, 14, + 12, -3, -17, 0, 4, -6, 0, -21, + -2, -5, 4, -29, -4, 5, 0, 6, + -15, -6, -15, -14, -17, 0, 0, -25, + 0, 24, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -11, -14, -1, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -9, 4, -3, -1, -11, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -9, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -6, 0, -3, -5, + -13, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 3, 17, -1, 0, -11, 0, + -3, 8, 0, -4, -17, -5, 6, 0, + 0, -20, -7, 4, -7, 3, 0, -3, + -3, -13, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -8, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -8, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -14, 0, + 3, -9, 8, 1, -3, -20, 0, 0, + -9, -4, 0, -17, -10, -12, 0, 0, + -18, -4, -17, -16, -20, 0, -11, 0, + 3, 28, -5, 0, -10, -4, -1, -4, + -7, -11, -7, -15, -17, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -29, -4, + 12, 9, -9, -15, 0, 1, -13, 0, + -21, -3, -4, 8, -38, -5, 1, 0, + 0, -27, -5, -22, -4, -30, 0, 0, + -29, 0, 25, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -16, -3, 0, -27, + 0, 0, 0, 0, -13, 0, -4, 0, + -1, -12, -20, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -19, + -4, -14, -13, -3, -7, -10, -4, -7, + 0, -8, -4, -14, -6, 0, -5, -8, + -4, -8, 0, 2, 0, -3, -14, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 17, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -9, -10, -12, + -3, 0, -8, 3, 17, 0, 0, 0, + 0, 33, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -4, 0, -13, + -7, 0, 12, -14, -13, -8, -8, 17, + 7, 4, -36, -3, 8, -4, 0, -4, + 5, -4, -15, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -12, + 0, -23, -5, 12, -5, -16, 1, -5, + -14, -14, -4, 17, 4, 0, -6, 0, + -11, 0, 3, 14, -10, -15, -17, -10, + 12, 0, 1, -30, -3, 4, -7, -3, + -10, 0, -9, -15, -6, -6, -3, 0, + 0, -10, -9, -4, 0, 12, 10, -4, + -23, 0, -23, -6, 0, -15, -24, -1, + -13, -7, -14, -12, 11, 0, 0, -5, + 0, -8, -4, 0, -4, -7, 0, 7, + -14, 4, 0, 0, -22, 0, -4, -9, + -7, -3, -12, -10, -14, -10, 0, -12, + -4, -10, -8, -12, -4, 0, 0, 1, + 20, -7, 0, -12, -4, 0, -4, -8, + -10, -11, -12, -16, -5, -8, 8, 0, + -6, 0, -21, -5, 2, 8, -13, -15, + -8, -14, 14, -4, 2, -39, -7, 8, + -9, -7, -15, 0, -12, -17, -5, -4, + -3, -4, -9, -12, -1, 0, 0, 12, + 12, -3, -27, 0, -25, -10, 10, -16, + -28, -8, -15, -17, -21, -14, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -8, 8, 0, 0, -13, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 16, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, -4, 7, 0, 12, + 0, 0, 41, 5, -8, -8, 4, 4, + -3, 1, -21, 0, 0, 20, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 16, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -11, 0, + 0, 1, 0, 0, 4, 54, -8, -3, + 13, 11, -11, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -54, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -12, + 0, 0, 0, -11, 0, 0, 0, 0, + -9, -2, 0, 0, 0, -9, 0, -5, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -8, 0, -6, 0, + -11, 0, 0, 0, -7, 4, -5, 0, + 0, -11, -4, -10, 0, 0, -11, 0, + -4, 0, -20, 0, -5, 0, 0, -34, + -8, -17, -5, -15, 0, 0, -28, 0, + -11, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -9, 0, -9, 5, -5, 8, + 0, -3, -10, -3, -7, -8, 0, -5, + -2, -3, 3, -11, -1, 0, 0, 0, + -37, -3, -6, 0, -9, 0, -3, -20, + -4, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -9, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -11, -4, -8, 0, + 0, -12, 0, -4, 0, -20, 0, 0, + 0, 0, -40, 0, -8, -15, -21, 0, + 0, -28, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 13, + 20, -4, -4, -12, 5, 20, 7, 9, + -11, 5, 17, 5, 12, 9, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 20, -7, -4, 0, -3, + 33, 18, 33, 0, 0, 0, 4, 0, + 0, 15, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -35, -5, -3, -17, + -20, 0, 0, -28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -35, -5, -3, + -17, -20, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -10, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -4, -3, -8, 0, -4, -17, 0, 26, + -4, 0, -9, -3, 0, -3, -7, 0, + -4, -12, -8, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -35, + -5, -3, -17, -20, 0, 0, -28, 0, + 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -13, -5, -4, 12, -4, -4, + -17, 1, -2, 1, -3, -11, 1, 9, + 1, 3, 1, 3, -10, -17, -5, 0, + -16, -8, -11, -17, -16, 0, -7, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -11, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -8, -3, 0, -12, + -3, -9, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 13, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 17, -5, -14, -13, 3, 5, 5, -1, + -12, 3, 6, 3, 12, 3, 14, -3, + -11, 0, 0, -17, 0, 0, -12, -11, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 15, 0, 0, -4, 0, -8, 0, + 0, 5, -10, 0, 4, -4, 3, 0, + 0, -14, 0, -3, -1, 0, -4, 5, + -3, 0, 0, 0, -17, -5, -9, 0, + -12, 0, 0, -20, 0, 15, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 9, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 10, + 0, 0, 0, 0, 0, -26, -24, 1, + 18, 12, 7, -17, 3, 17, 0, 15, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_26 = { +#else +lv_font_t lv_font_montserrat_26 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 29, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_26*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_28.c b/libraries/lvgl/src/font/lv_font_montserrat_28.c new file mode 100644 index 0000000..a186747 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_28.c @@ -0,0 +1,5140 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 1 +#endif + +#if LV_FONT_MONTSERRAT_28 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x50, 0xcf, 0xf4, 0xb, 0xff, 0x30, + 0xaf, 0xf3, 0xa, 0xff, 0x20, 0x9f, 0xf2, 0x9, + 0xff, 0x10, 0x8f, 0xf0, 0x7, 0xff, 0x0, 0x7f, + 0xf0, 0x6, 0xfe, 0x0, 0x6f, 0xe0, 0x5, 0xfd, + 0x0, 0x27, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x86, 0x0, 0xdf, 0xf6, 0xf, 0xff, 0x80, + 0x6f, 0xc1, + + /* U+0022 "\"" */ + 0x3f, 0xf1, 0x2, 0xff, 0x23, 0xff, 0x10, 0x2f, + 0xf2, 0x2f, 0xf0, 0x1, 0xff, 0x12, 0xff, 0x0, + 0x1f, 0xf1, 0x2f, 0xf0, 0x1, 0xff, 0x11, 0xff, + 0x0, 0xf, 0xf0, 0x1f, 0xf0, 0x0, 0xff, 0x0, + 0x98, 0x0, 0x9, 0x90, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xaf, 0x50, 0x0, 0x6, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, 0x0, + 0x7f, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x9, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, 0x80, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf2, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xa, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0xcf, 0x30, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x60, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8c, 0xef, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x5, 0xff, 0xfc, 0x8f, 0xd7, 0xae, 0xff, 0x10, + 0xe, 0xff, 0x50, 0xf, 0xc0, 0x0, 0x59, 0x0, + 0x4f, 0xf9, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xfa, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xed, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x3c, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x8f, 0xf3, + 0x4, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xbf, 0xf1, + 0x5f, 0xa2, 0x0, 0xf, 0xc0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xc8, 0x7f, 0xd8, 0xcf, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xff, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7d, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x4f, 0xb0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xf, 0xd0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xfe, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, 0xf1, 0x0, + 0xef, 0x30, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, + 0xf, 0xd0, 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x8f, 0x70, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0xef, 0x30, 0x5, 0x88, 0x50, 0x0, 0x0, 0x7d, + 0xfe, 0x80, 0x9, 0xf8, 0x1, 0xcf, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0xb, + 0xf9, 0x11, 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x30, 0x2f, 0xc0, 0x0, 0xc, 0xf3, 0x0, + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x6f, 0x60, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x8f, 0x40, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x7f, 0x50, 0x0, 0x5, 0xf8, + 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x4f, 0x80, + 0x0, 0x8, 0xf5, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xe, 0xe1, 0x0, 0x1e, 0xe0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x0, 0x4, 0xfe, 0x87, 0xef, + 0x40, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xb3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x19, 0xdf, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfe, 0x40, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xf7, + 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x2d, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x8f, 0xfd, 0x10, + 0x0, 0x24, 0x0, 0x6, 0xff, 0xa1, 0x5, 0xff, + 0xd1, 0x0, 0x9f, 0xb0, 0x2f, 0xfb, 0x0, 0x0, + 0x5f, 0xfd, 0x10, 0xdf, 0x70, 0x8f, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xd6, 0xff, 0x30, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0xd, 0xff, 0xe7, 0x54, 0x59, 0xef, 0xfb, + 0xff, 0xd1, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x5f, 0xf8, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf1, 0x3f, 0xf1, 0x2f, 0xf0, 0x2f, 0xf0, + 0x2f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0, 0x9, 0x80, + + /* U+0028 "(" */ + 0x0, 0x4, 0xff, 0x40, 0x0, 0xcf, 0xc0, 0x0, + 0x4f, 0xf5, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x5f, 0xf4, 0x0, 0x9, 0xff, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0xf, 0xfa, 0x0, 0x2, + 0xff, 0x70, 0x0, 0x3f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x5f, 0xf5, 0x0, 0x5, 0xff, 0x50, + 0x0, 0x4f, 0xf6, 0x0, 0x3, 0xff, 0x60, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0xff, 0xa0, 0x0, 0xc, + 0xfd, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0xf, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0xc, 0xfc, 0x0, + 0x0, 0x4f, 0xf4, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, + 0xdf, 0xb0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x2f, + 0xf7, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x3, 0xff, 0x60, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0xe, 0xfb, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0xd, + 0xfc, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0xff, 0x90, 0x0, 0x3f, 0xf6, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x8f, 0xf0, 0x0, 0xd, + 0xfc, 0x0, 0x2, 0xff, 0x70, 0x0, 0x7f, 0xf2, + 0x0, 0xd, 0xfb, 0x0, 0x6, 0xff, 0x30, 0x0, + 0xdf, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0x1e, 0x80, 0x3f, 0x60, 0x7e, + 0x33, 0xdf, 0xe9, 0xfa, 0xdf, 0xe5, 0x0, 0x7e, + 0xff, 0xff, 0x91, 0x0, 0x1, 0xaf, 0xff, 0xc2, + 0x0, 0x7, 0xef, 0xef, 0xef, 0xf9, 0x13, 0xfe, + 0x63, 0xf6, 0x4d, 0xf6, 0x6, 0x10, 0x3f, 0x60, + 0x6, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x30, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, 0x3, 0x33, 0x33, 0xff, 0x73, + 0x33, 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x8, 0xff, 0xe0, 0x9f, 0xff, 0x2, + 0xdf, 0xc0, 0xa, 0xf6, 0x0, 0xef, 0x10, 0x2f, + 0xc0, 0x6, 0xf6, 0x0, + + /* U+002D "-" */ + 0x25, 0x55, 0x55, 0x55, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x6f, 0xff, 0xff, 0xff, 0x20, + + /* U+002E "." */ + 0x1a, 0xc4, 0x9, 0xff, 0xe0, 0xaf, 0xff, 0x2, + 0xde, 0x60, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x7, 0xcf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xd9, 0x8a, 0xff, 0xfd, + 0x10, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x1, 0xbf, + 0xfa, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x7, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0x9f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x3a, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xaf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x49, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x13, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x1, 0xef, 0xf7, 0x0, 0x0, 0x1b, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0xfd, 0x98, 0xaf, 0xff, 0xd1, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xf6, + 0x57, 0x77, 0xaf, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + + /* U+0032 "2" */ + 0x0, 0x3, 0x8c, 0xef, 0xfc, 0x82, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2e, 0xff, 0xfb, 0x98, 0xae, 0xff, 0xf5, 0x0, + 0x2d, 0xf9, 0x10, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x1, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x77, 0x77, 0x77, 0x77, 0x70, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, 0x88, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, + 0x3f, 0xc4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x2a, + 0xff, 0xfe, 0xa8, 0x89, 0xdf, 0xff, 0x70, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, + 0x6a, 0xdf, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xa0, 0x0, 0xa, 0xb7, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x66, 0x66, + 0x66, 0x6f, 0xfc, 0x66, 0x62, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x4f, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x0, + 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0xd, 0xe6, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x70, + 0x5f, 0xff, 0xfb, 0x98, 0x9b, 0xff, 0xfd, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x4, 0x9c, 0xef, 0xed, 0x94, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x1d, 0xff, 0xfb, 0x86, 0x89, 0xed, 0x0, + 0x0, 0xcf, 0xfb, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x5, 0xae, 0xfe, 0xd8, 0x20, 0x0, + 0xaf, 0xf3, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xfd, 0xff, 0x95, 0x46, 0xaf, 0xff, 0x60, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xe0, + 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0xa, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x2, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x7f, 0xff, 0x95, 0x45, 0xaf, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0xcf, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xa6, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x2, 0xef, 0xfd, 0x75, 0x57, 0xdf, 0xff, 0x20, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0xa, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x1, 0xef, 0xfa, 0x42, 0x25, 0xaf, 0xfe, 0x10, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xb, 0xff, 0xc5, 0x20, 0x2, 0x6d, 0xff, 0xb0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x2, 0xdf, 0xf5, + 0xa, 0xff, 0xfa, 0x64, 0x56, 0xaf, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0x7c, 0xef, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x5b, 0xef, 0xed, 0x93, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xfc, 0x64, 0x58, 0xdf, 0xfa, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0xa, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x2, 0xff, 0xfd, 0x75, 0x58, 0xdf, 0xee, 0xfe, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x3e, 0xfe, + 0x0, 0x0, 0x7c, 0xef, 0xeb, 0x60, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x10, + 0x0, 0x8f, 0xa8, 0x67, 0xae, 0xff, 0xf3, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x39, 0xcf, 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xac, 0x40, 0x9f, 0xfe, + 0xa, 0xff, 0xf0, 0x2d, 0xe6, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xab, 0x40, 0x8f, 0xfe, + 0x9, 0xff, 0xf0, 0x2d, 0xfc, 0x0, 0xaf, 0x60, + 0xe, 0xf1, 0x2, 0xfc, 0x0, 0x6f, 0x60, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xb2, 0x0, 0x1, 0x7d, + 0xff, 0xfd, 0x71, 0x0, 0x4, 0xaf, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x2f, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x61, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xdf, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+003E ">" */ + 0x1b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xf6, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xc3, + 0x0, 0x0, 0x5c, 0xff, 0xfe, 0x82, 0x0, 0x3, + 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x1f, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4, 0x9d, 0xef, 0xfc, 0x92, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, + 0xff, 0xe9, 0x76, 0x8d, 0xff, 0xf6, 0x4, 0xef, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xed, 0x10, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd7, + 0x20, 0x0, 0x0, 0x26, 0xcf, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xfd, 0x10, 0x0, 0x0, 0x1d, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0xa, 0xfc, 0x0, 0x0, + 0x18, 0xdf, 0xfd, 0x81, 0xf, 0xf8, 0xb, 0xfa, + 0x0, 0x3, 0xff, 0x20, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe4, 0xff, 0x80, 0x1e, 0xf3, 0x0, 0xbf, + 0x80, 0x0, 0x4f, 0xff, 0x83, 0x35, 0xbf, 0xff, + 0xf8, 0x0, 0x6f, 0xb0, 0x1f, 0xf1, 0x0, 0xe, + 0xfe, 0x20, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0xef, 0x15, 0xfc, 0x0, 0x5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, 0x8f, + 0x80, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x80, 0x0, 0x7f, 0x79, 0xf7, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x5, 0xf8, 0xaf, 0x60, 0x0, 0xef, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, 0x4f, 0x99, + 0xf7, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x5, 0xf8, 0x7f, 0x90, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x7f, 0x75, 0xfc, 0x0, 0x5, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, + 0x1f, 0xf1, 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x1, 0xff, 0x0, 0xbf, 0x80, + 0x0, 0x4f, 0xff, 0x83, 0x24, 0xaf, 0xfc, 0xff, + 0x53, 0xcf, 0x80, 0x3, 0xff, 0x20, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xe4, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xfc, 0x0, 0x0, 0x18, 0xcf, 0xfd, + 0x81, 0x0, 0x5d, 0xfe, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xd7, 0x30, 0x0, + 0x0, 0x37, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe9, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x81, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x10, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x6, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x33, 0x33, 0x33, 0x3c, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0xc, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x69, + 0xff, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0x60, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x14, 0xbf, 0xfb, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, + 0x45, 0x8e, 0xff, 0xa0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x45, 0x8e, + 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xda, 0x50, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x6, 0xef, 0xb0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, + 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x5f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x8a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xfd, 0x77, 0x77, + 0x77, 0x9c, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xf8, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xf8, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x9c, + 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xfd, 0x66, 0x66, 0x66, 0x66, 0x63, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x71, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, + 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x51, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xd6, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x88, 0xae, 0xff, 0xfb, 0x0, 0x4, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x4, 0xdf, 0xd1, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x38, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x31, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x4f, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0x30, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x89, + 0xdf, 0xff, 0xe1, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfd, 0xa6, 0x10, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xfd, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x7f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, + + /* U+0049 "I" */ + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + + /* U+004A "J" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x17, 0x77, + 0x77, 0x78, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x6, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0xa, 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x11, 0xdf, + 0xfd, 0x86, 0x8e, 0xff, 0xa0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5b, 0xef, 0xeb, + 0x60, 0x0, + + /* U+004B "K" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xe2, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf4, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xf5, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x1, 0xdf, 0xf6, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x20, 0x8f, 0xfe, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x20, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x20, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xf7, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + + /* U+004C "L" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd7, 0x77, 0x77, 0x77, 0x77, 0x72, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0x1f, + 0xfe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x1f, 0xfa, 0xcf, 0xe1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7e, 0xfc, 0x1f, 0xfa, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xe, 0xfc, + 0x1f, 0xfa, 0x9, 0xff, 0x20, 0x0, 0x0, 0x6f, + 0xf4, 0xe, 0xfc, 0x1f, 0xfa, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xb0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x7f, 0xf5, 0x0, 0x8, 0xff, 0x20, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0xd, 0xfe, 0x0, 0x2f, + 0xf8, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x4, + 0xff, 0x70, 0xbf, 0xe0, 0x0, 0xe, 0xfc, 0x1f, + 0xfa, 0x0, 0x0, 0xaf, 0xf6, 0xff, 0x60, 0x0, + 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, 0xe, 0xfc, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, + 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x49, 0x10, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfc, + + /* U+004E "N" */ + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x5, 0xff, 0xf2, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x9f, 0xfd, 0x10, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0xc, 0xff, 0xb0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xaf, 0xfd, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xaf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf2, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x90, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x20, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, + 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, 0xff, + 0xf3, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x51, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x91, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf5, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1, 0xff, 0xd7, + 0x77, 0x77, 0x7a, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf8, + 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfd, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x20, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x5f, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x87, 0x79, 0xef, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa5, 0x46, 0xdf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xce, 0xfd, 0x81, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, + 0xff, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xfd, 0x66, 0x66, 0x67, + 0x9e, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xa0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfe, 0x10, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x4, 0xff, 0xfc, 0x86, 0x67, 0xbf, 0xff, 0x10, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa6, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x5f, 0xb4, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0xaf, 0xff, 0xe9, 0x76, 0x68, 0xdf, 0xff, 0x30, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x67, 0x77, 0x77, 0x8f, 0xfc, 0x77, 0x77, + 0x77, 0x20, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x2f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xea, 0x88, 0xae, 0xff, + 0xf5, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, + 0xeb, 0x60, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf5, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x32, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xfb, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x4, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0x4b, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x6f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0xe, 0xfa, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x5, 0xff, 0x80, + 0x0, 0x4, 0xff, 0x40, 0xb, 0xff, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x6f, 0xf4, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf3, 0x0, + 0xf, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, 0x4, + 0xff, 0x40, 0x0, 0xb, 0xff, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x5f, 0xf4, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xf, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x90, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x85, 0xff, 0x40, + 0x0, 0x0, 0xb, 0xfe, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfd, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x1, + 0xef, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x1, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xd2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf2, + 0x6, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x1e, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0x4, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x50, 0x0, 0x9f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x1e, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x50, 0x1, 0xef, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x74, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, + + /* U+005B "[" */ + 0x1f, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xfc, 0x1f, + 0xfb, 0x33, 0x21, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xb3, 0x32, 0x1f, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xfc, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x60, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0x67, 0xff, 0xff, 0xf6, 0x13, + 0x37, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, + 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, + 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, + 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, + 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x61, 0x33, 0x7f, 0xf6, 0x7f, 0xff, 0xff, 0x67, + 0xff, 0xff, 0xf6, + + /* U+005E "^" */ + 0x0, 0x0, 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd7, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xf6, 0x1f, 0xf0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0xaf, 0x60, 0x0, 0x0, + 0x8f, 0x90, 0x3, 0xfd, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf4, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0xff, + 0x20, 0x4f, 0xd0, 0x0, 0x0, 0x9, 0xf9, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf0, + + /* U+005F "_" */ + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x87, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0x2d, 0xfc, 0x10, 0x0, 0x0, 0xaf, 0xd1, + + /* U+0061 "a" */ + 0x0, 0x17, 0xbe, 0xff, 0xda, 0x40, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xd, 0xfe, + 0xa6, 0x56, 0xaf, 0xff, 0x60, 0x3, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x28, 0xce, 0xef, 0xff, 0xff, + 0xf4, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x2f, 0xfe, 0x51, 0x0, 0x0, 0x6f, 0xf5, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x2f, 0xfe, 0x50, 0x1, + 0x6e, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf5, 0x0, 0x29, 0xef, 0xfd, 0x92, 0x3f, + 0xf5, + + /* U+0062 "b" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfd, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf2, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xdf, 0xfe, 0x96, 0x69, 0xff, 0xf8, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1, + 0xcf, 0x80, 0x1, 0xdf, 0xfe, 0x96, 0x69, 0xff, + 0xf8, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x4f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf8, + 0xc, 0xff, 0x80, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x1, 0xef, 0xfc, 0x63, 0x47, 0xef, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x70, 0xf, 0xf8, + + /* U+0065 "e" */ + 0x0, 0x0, 0x4b, 0xdf, 0xec, 0x61, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, + 0xef, 0xfb, 0x64, 0x59, 0xff, 0xf4, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x2, 0xdf, 0xe1, 0x3f, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x69, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xbf, 0xfb, 0x10, 0x0, 0x0, + 0x5e, 0x30, 0x1, 0xdf, 0xff, 0x96, 0x68, 0xcf, + 0xfc, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x39, 0xde, 0xfe, 0xa5, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x18, 0xdf, 0xeb, 0x40, 0x0, 0x1d, + 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xa4, 0x49, + 0x30, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x23, 0x4f, 0xfb, 0x33, + 0x33, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xc, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4c, 0xfc, + 0x3, 0xff, 0xfd, 0x86, 0x68, 0xef, 0xfe, 0xfc, + 0xd, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xfc, + 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x2, 0xff, 0xfe, 0x96, 0x69, 0xef, 0xff, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xfb, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3, 0xe6, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0xc, 0xff, 0xea, 0x76, 0x68, 0xcf, 0xff, 0x50, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x6, + 0xbe, 0xfe, 0xb5, 0x0, 0x7, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xfe, 0x97, + 0x7a, 0xff, 0xf9, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x67, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x97, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0xdf, 0xfa, 0xbf, 0xf7, 0x6, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x3, 0xee, 0x40, 0x0, 0x0, 0xbf, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, + 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x9, 0xff, 0x30, + 0xb6, 0x58, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xf4, + 0x2, 0xad, 0xfe, 0xb3, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x20, + 0x7f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x6f, 0xfe, 0x20, 0x0, + 0x7f, 0xf3, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0x0, + 0x7f, 0xf3, 0x9, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x7f, 0xf4, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x5f, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, + + /* U+006C "l" */ + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006D "m" */ + 0x7f, 0xf2, 0x18, 0xce, 0xfd, 0x93, 0x0, 0x2, + 0x8d, 0xff, 0xd9, 0x20, 0x0, 0x7f, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x7f, 0xff, 0xfc, 0x64, 0x5a, 0xff, + 0xfa, 0xff, 0xc6, 0x45, 0xaf, 0xff, 0x30, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xb0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf3, + + /* U+006E "n" */ + 0x7f, 0xf2, 0x7, 0xce, 0xfe, 0xb5, 0x0, 0x7, + 0xff, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xf9, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x2, 0xef, 0xf2, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x67, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x7f, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x97, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x82, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x1, 0xdf, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x92, 0x0, 0x0, + + /* U+0070 "p" */ + 0x7f, 0xf2, 0x6, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xfe, 0x84, 0x46, 0xcf, 0xff, 0x20, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0xf, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + + /* U+0072 "r" */ + 0x7f, 0xf2, 0x6, 0xce, 0x87, 0xff, 0x3d, 0xff, + 0xf8, 0x7f, 0xfd, 0xff, 0xc9, 0x57, 0xff, 0xfd, + 0x20, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x7, 0xff, + 0x80, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x2, 0x9d, 0xff, 0xec, 0x83, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5, 0xff, + 0xe8, 0x65, 0x69, 0xef, 0x20, 0xb, 0xff, 0x20, + 0x0, 0x0, 0x3, 0x0, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0xb8, 0x51, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x36, 0x9c, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x5, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0xe, 0xff, 0xa7, 0x55, + 0x7c, 0xff, 0xb0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x8, 0x85, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfe, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x23, 0x4f, 0xfb, 0x33, 0x33, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb5, 0x5a, 0x40, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x19, 0xef, 0xea, + 0x30, + + /* U+0075 "u" */ + 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x68, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x61, 0xff, 0xe2, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x8, 0xff, 0xe8, 0x44, 0x6d, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x5f, + 0xf6, 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x2, 0xff, + 0x60, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xf9, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, 0x7, + 0xff, 0x20, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xc0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x37, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd4, 0xff, 0x40, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xf7, 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8f, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xbf, 0xb0, 0x2, 0xff, 0x50, 0x0, 0x2, 0xff, + 0x5f, 0xf6, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xc, + 0xfb, 0x0, 0x0, 0x8f, 0xd0, 0xbf, 0xc0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x7f, 0xf1, 0x0, 0xe, + 0xf7, 0x5, 0xff, 0x20, 0x0, 0xcf, 0x90, 0x0, + 0x1, 0xff, 0x60, 0x4, 0xff, 0x10, 0xe, 0xf8, + 0x0, 0x2f, 0xf3, 0x0, 0x0, 0xb, 0xfc, 0x0, + 0xaf, 0xb0, 0x0, 0x9f, 0xe0, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x1f, 0xf5, 0x0, 0x3, + 0xff, 0x40, 0xef, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x86, 0xff, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0xcf, 0x90, 0x0, + 0x0, 0x6f, 0xfa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x2, 0xef, 0xc0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xdf, 0xe2, 0x9f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xfe, 0x10, 0x9, 0xff, 0x50, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x7, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, + 0x6f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x79, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x65, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x23, 0x33, 0x33, + 0x33, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x33, 0x33, 0x33, 0x33, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, + + /* U+007B "{" */ + 0x0, 0x0, 0x6c, 0xff, 0x40, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0x73, 0x10, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, + 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x1, 0x3a, 0xff, 0x50, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x0, 0x2, 0xff, 0x80, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x31, 0x0, 0x6, 0xff, 0xff, + 0x40, 0x0, 0x5, 0xcf, 0xf4, + + /* U+007C "|" */ + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, + + /* U+007D "}" */ + 0x7f, 0xfb, 0x40, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x14, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x30, 0x0, 0x1, + 0xbf, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x1, + 0x49, 0xff, 0xc0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xb4, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7e, 0xfc, 0x30, 0x0, 0x2, 0xfa, 0x7, + 0xff, 0xff, 0xf6, 0x0, 0x5, 0xf8, 0xe, 0xf6, + 0x27, 0xff, 0x80, 0x1d, 0xf4, 0x3f, 0xb0, 0x0, + 0x4e, 0xff, 0xff, 0xb0, 0x5f, 0x70, 0x0, 0x1, + 0xaf, 0xfa, 0x10, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xc4, 0x0, 0xa, 0xfa, 0x67, 0xdf, 0x50, 0x4f, + 0x80, 0x0, 0xc, 0xf0, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0xbd, 0x0, 0x0, 0x2, 0xf6, 0x9f, 0x10, + 0x0, 0x5, 0xf4, 0x3f, 0xa0, 0x0, 0x1e, 0xe0, + 0x8, 0xfd, 0x9a, 0xff, 0x40, 0x0, 0x5c, 0xfe, + 0xa2, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x4, 0xef, 0xc1, 0xe, 0xff, + 0xfb, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xfa, 0x3, + 0xcf, 0xb1, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x73, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7a, 0xcb, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0x33, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xfb, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x32, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xaa, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x9b, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, 0xfe, 0x44, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x44, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x88, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x88, 0xff, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xfc, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0xcf, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xfc, 0x0, + 0xc, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xff, 0xc0, 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xff, 0x88, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x44, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x44, 0xef, + 0xab, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, + + /* U+F00B "" */ + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 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, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 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, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8e, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xa, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xfa, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0x2e, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x50, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf6, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x96, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x8a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x60, 0x3, 0xff, 0xff, + 0x30, 0x6, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0x3, + 0xff, 0xff, 0x30, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x9, 0xff, + 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x7f, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x8f, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0xe, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x0, 0x9f, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, + 0x75, 0x57, 0xaf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6d, 0x40, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x32, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfb, 0x10, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x32, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x10, 0x0, 0x1, + 0xc8, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x60, 0x0, 0x0, 0x48, 0x88, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xe3, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0xcf, 0xff, 0xf9, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd2, 0x3, + 0x10, 0x7f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x8f, + 0xd2, 0x4, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0xb, 0xff, + 0xff, 0x40, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf5, 0x2, 0xdf, 0xff, + 0xff, 0xf7, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xc1, 0x0, + 0xa, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x4, 0xef, 0xff, 0xf4, + 0xbf, 0xff, 0x70, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2d, 0xff, 0xf3, + 0xd, 0xf4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, 0x60, + 0x1, 0x20, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0xdd, 0xef, + 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x8, + 0xff, 0xff, 0x80, 0x1, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xf8, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x6, 0x60, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 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, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0xdf, 0xff, 0xb8, 0x88, 0x88, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x88, 0x88, 0x8e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfe, 0xb7, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0xcf, 0xff, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0xbf, 0xff, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x94, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xfe, 0xdf, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x8, 0xff, 0xff, 0xff, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2b, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 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, + 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xb2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xd0, 0x0, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xff, 0xfb, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfc, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xb9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xcf, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xdf, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xdb, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x8f, 0xf6, 0x0, 0xcf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xf0, 0x6, 0xff, 0x30, 0x2f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x9f, 0xf6, 0x0, 0xdf, 0xe0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x3, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3e, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x3b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfa, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xf8, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xdf, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9f, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfa, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfe, 0x10, + 0x2, 0xff, 0xff, 0xd6, 0x10, 0xbf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x67, 0x64, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "" */ + 0x48, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x70, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x31, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x30, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x9f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04B "" */ + 0x3, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x1a, 0xef, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xd5, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x66, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4, 0x89, 0x99, 0x98, + 0x71, 0x0, 0x0, 0x4, 0x89, 0x99, 0x98, 0x71, + 0x0, + + /* U+F04D "" */ + 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, + + /* U+F051 "" */ + 0x5, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x87, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x1c, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 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, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F054 "" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x23, 0x33, 0x33, 0x33, + 0x8f, 0xff, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xdc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xbd, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x39, + 0x95, 0x0, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, + 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x48, 0x6b, 0xff, + 0xff, 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0x1f, 0xff, 0xff, 0xff, 0x20, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xad, + 0xc8, 0x10, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xac, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x26, 0xad, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xfa, 0x16, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0xbe, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc5, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xc1, 0x6, 0xba, 0x50, + 0x0, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe4, 0x7f, + 0xff, 0xc1, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0xad, 0x20, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xd2, 0xe, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xfe, 0xba, 0xb5, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfd, 0xb4, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x1e, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xef, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0xf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x48, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x71, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x4f, 0xff, 0xfe, 0x30, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xa0, 0x1d, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xc0, 0xc, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfe, 0x20, 0x0, 0x4, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x5, 0xe2, 0x0, 0xe, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x4f, 0xfd, 0x10, 0xf, 0xff, 0xe2, 0x0, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfe, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x24, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x11, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x1, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x50, 0x0, + + /* U+F078 "" */ + 0x1, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x60, 0x1, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x16, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0xf, 0xff, 0xf4, 0xef, 0xf9, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xf5, 0xe, 0xff, + 0x90, 0xaf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x32, 0x0, + 0xef, 0xf9, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x80, + 0xe, 0xff, 0x90, 0x2a, 0x70, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0xef, 0xf9, 0x2e, 0xff, 0x60, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0xe, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x73, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdb, 0x0, 0x0, + 0x0, + + /* U+F07B "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0xcf, + 0xff, 0xff, 0xf6, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x18, 0x99, 0x99, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x76, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x5, 0x99, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xb8, + 0x10, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x38, 0xff, 0xff, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf4, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0x80, 0x0, 0xff, 0xf7, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, + 0x60, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xfd, 0xbf, 0xff, 0xf4, 0x3, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x18, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x99, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, 0x5, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xe2, 0xa, 0xff, + 0xfd, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbe, 0xfb, 0x30, 0x0, 0x18, 0xcd, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x42, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xf4, 0xaf, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x37, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0x15, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x40, 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, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 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, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xe5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5e, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfd, + 0x20, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2d, 0xff, 0xff, + 0xd2, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7e, 0xe7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x99, 0x99, 0xff, 0xef, 0xfe, 0x99, + 0x99, 0x81, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xa0, 0x1e, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x1, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x64, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xd6, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xef, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xef, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x4, 0x44, 0x44, 0x1f, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xf0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 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, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0xff, 0x98, + 0x8e, 0xfa, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0xdf, 0x10, + 0xc, 0xf3, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x2f, + 0x80, 0x0, 0xed, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xa0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xab, 0xcb, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xba, + 0xaa, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x7, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x2d, 0xf7, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xc8, 0x76, 0x78, 0xcf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xcd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xe1, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x7, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xfc, 0x20, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xfa, + 0x35, 0xef, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4d, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xbc, 0xff, + 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, + 0xfe, 0x50, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xb2, 0x0, 0x0, 0x0, 0x58, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x20, 0x6, 0xdd, 0xdd, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x9, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xde, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc7, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xc0, 0x9, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, 0xf1, + 0x6, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x39, 0x0, + 0xcf, 0xff, 0xf5, 0xa, 0xff, 0xf9, 0x3, 0xef, + 0xc0, 0x3f, 0x90, 0x1d, 0xff, 0xf8, 0xc, 0xff, + 0xfd, 0x10, 0x3e, 0xc0, 0x2f, 0xb0, 0xc, 0xff, + 0xfa, 0xe, 0xff, 0xff, 0xd1, 0x3, 0xb0, 0x2b, + 0x0, 0xaf, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x10, 0x0, 0x9, 0xff, 0xff, 0xfd, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xfb, 0x0, + 0x20, 0x11, 0x4, 0xff, 0xff, 0xfd, 0xe, 0xff, + 0xff, 0xb0, 0x5, 0xc0, 0x2d, 0x10, 0x5f, 0xff, + 0xfc, 0xc, 0xff, 0xfb, 0x0, 0x5f, 0xc0, 0x2f, + 0xd0, 0x7, 0xff, 0xfa, 0x9, 0xff, 0xfb, 0x5, + 0xff, 0xc0, 0x3f, 0x60, 0x1d, 0xff, 0xf7, 0x5, + 0xff, 0xff, 0xdf, 0xff, 0xc0, 0x36, 0x1, 0xdf, + 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1d, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, 0x1d, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xd1, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xab, 0xba, 0x84, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4f, 0xff, 0xf5, 0x5f, 0xff, 0x92, + 0xff, 0xfc, 0x1c, 0xff, 0xfc, 0x0, 0x4, 0xff, + 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, 0xaf, + 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, 0xff, + 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, 0x4, + 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, + 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, + 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, + 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, + 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, + 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, + 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, + 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, + 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, + 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, + 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, + 0xf6, 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, + 0x4f, 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, + 0xa, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x55, + 0xff, 0xf9, 0x2f, 0xff, 0xc1, 0xcf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x66, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xec, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfc, 0x0, 0xbf, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xbe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xec, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x76, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x8, 0xff, 0x80, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2e, 0xff, 0x20, 0x1f, 0xa0, + 0xe, 0xd0, 0x8, 0xff, 0xf0, 0x2e, 0xff, 0xf2, + 0x1, 0xfa, 0x0, 0xed, 0x0, 0x8f, 0xff, 0x3e, + 0xff, 0xff, 0x20, 0x1f, 0xa0, 0xe, 0xd0, 0x8, + 0xff, 0xfe, 0xff, 0xff, 0xf2, 0x1, 0xfa, 0x0, + 0xed, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x1f, 0xa0, 0xe, 0xd0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x10, 0x0, 0x1c, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 50, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 86, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 276, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 484, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 704, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 893, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 909, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 1091, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1152, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1243, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1263, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1277, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1287, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1449, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1619, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1699, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2009, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2189, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2509, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2669, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2829, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2989, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3027, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3075, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3166, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 3229, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3320, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3470, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3808, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4028, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4208, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4398, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4598, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4908, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5098, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5278, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5318, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5638, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5788, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6008, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6188, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6408, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6578, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6854, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7034, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7194, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7364, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7544, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7754, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8064, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8254, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8454, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8624, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8715, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 8891, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8982, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 9060, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9074, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 9090, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9195, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9363, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9476, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9644, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9757, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9873, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10033, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10191, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10233, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 10350, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10518, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10560, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10755, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10868, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10988, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 11148, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11308, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11376, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11481, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11586, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11699, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11827, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12015, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12135, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 12305, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12403, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12520, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 12572, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 12689, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 12724, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 12774, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 12792, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13198, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13492, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13842, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14136, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14346, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14752, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 15144, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15544, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15950, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16286, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16692, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16853, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17095, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17527, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17821, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18111, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 18345, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18708, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19021, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19334, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 19568, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19893, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20093, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20293, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20606, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 20694, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21030, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21538, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22017, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22367, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22555, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22743, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23128, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23422, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23828, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 24249, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24562, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24925, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25238, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25526, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25820, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 26096, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26459, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26822, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27158, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27593, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27898, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28353, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 28686, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29019, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29352, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29685, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 30018, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30432, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30751, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31114, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31535, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31903, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 32208, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_28 = { +#else +lv_font_t lv_font_montserrat_28 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_28*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_28_compressed.c b/libraries/lvgl/src/font/lv_font_montserrat_28_compressed.c new file mode 100644 index 0000000..170ab48 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_28_compressed.c @@ -0,0 +1,3271 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28_compressed.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED 1 +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x28, 0x6, 0x10, 0x70, 0x3, 0x80, + 0x80, 0x7c, 0x20, 0x60, 0x1f, 0x18, 0x8, 0x0, + 0x43, 0xc0, 0x3f, 0x84, 0x4, 0x3, 0xe3, 0x3, + 0x0, 0x3c, 0x40, 0x0, 0x4e, 0xa0, 0x1f, 0x14, + 0x30, 0x3, 0xde, 0x58, 0x8, 0x1, 0xc1, 0x20, + 0x72, + + /* U+0022 "\"" */ + 0x3f, 0xf0, 0x81, 0x7f, 0x88, 0x3, 0xf8, 0x40, + 0x2, 0x6, 0x0, 0x30, 0xf, 0xfe, 0x31, 0x80, + 0x61, 0x0, 0x8, 0x7, 0xf0, 0xb3, 0x80, 0x4c, + 0xc0, + + /* U+0023 "#" */ + 0x0, 0xf5, 0x7a, 0x80, 0x66, 0xfa, 0x0, 0xfe, + 0x10, 0x60, 0xc, 0x20, 0x40, 0x1f, 0xcc, 0x4, + 0x1, 0xb8, 0x38, 0x3, 0xf8, 0x80, 0x40, 0x31, + 0x1, 0x0, 0x7e, 0x10, 0x20, 0xe, 0x60, 0x60, + 0xc, 0xbf, 0xf7, 0x1, 0x7f, 0xf1, 0x6, 0xff, + 0xb8, 0x3, 0xff, 0x90, 0xbf, 0xf3, 0x83, 0xff, + 0xeb, 0x3, 0xff, 0xb8, 0x3, 0x84, 0x38, 0x3, + 0x8, 0x30, 0x7, 0xf1, 0x1, 0x0, 0x62, 0x2, + 0x0, 0xfe, 0x60, 0x60, 0xd, 0xc1, 0xc0, 0x1f, + 0xc4, 0x4, 0x1, 0x8c, 0x8, 0x3, 0xf0, 0x80, + 0x80, 0x73, 0x3, 0x80, 0x64, 0xff, 0xb8, 0x7, + 0xff, 0x8c, 0x33, 0xfe, 0x0, 0xff, 0xe4, 0x27, + 0xfd, 0x0, 0xff, 0xfb, 0x40, 0xbf, 0xf0, 0x7, + 0x70, 0x70, 0x6, 0x60, 0x60, 0xf, 0xe2, 0x2, + 0x0, 0xc4, 0x4, 0x1, 0xfc, 0xc0, 0xc0, 0x1b, + 0x83, 0x80, 0x3f, 0x88, 0x8, 0x3, 0x10, 0x10, + 0x7, 0x0, + + /* U+0024 "$" */ + 0x0, 0xfb, 0xf0, 0x3, 0xff, 0xbc, 0x31, 0x9c, + 0x7, 0xfb, 0x28, 0x1, 0xcd, 0xce, 0x62, 0x1, + 0x13, 0x5e, 0x90, 0x1, 0x64, 0x0, 0x6e, 0x5, + 0xa, 0x20, 0x46, 0x0, 0xb0, 0x5, 0x64, 0x0, + 0xbd, 0x75, 0x30, 0x82, 0x8, 0x32, 0x80, 0x7c, + 0xb2, 0x0, 0x10, 0x7, 0x80, 0x7f, 0xf0, 0x4, + 0x1, 0x80, 0x1f, 0xfc, 0x4, 0x10, 0x58, 0x0, + 0xff, 0xe0, 0x40, 0x1, 0xfe, 0xc0, 0x3f, 0xcd, + 0x42, 0x0, 0x40, 0x3e, 0x94, 0x0, 0xf2, 0xfc, + 0xa0, 0x4, 0x2d, 0x78, 0x60, 0x1c, 0x2d, 0x7c, + 0x2, 0x40, 0x3, 0xc3, 0x0, 0xf8, 0x40, 0xb7, + 0xc, 0x1, 0xe0, 0x1f, 0xf1, 0xe1, 0x1, 0x88, + 0x7, 0xff, 0x1, 0x40, 0x4, 0x8, 0x1, 0xfe, + 0x30, 0x1, 0x2d, 0xd1, 0x0, 0x7c, 0xa8, 0x6, + 0x3e, 0xb, 0xb9, 0xe, 0x3, 0x19, 0x40, 0xf, + 0xa, 0x60, 0x1, 0xbc, 0x1, 0x39, 0x80, 0xd9, + 0x80, 0x27, 0xa1, 0x4, 0x3, 0x1c, 0x72, 0x0, + 0x61, 0x7b, 0xef, 0x3, 0xfc, 0x70, 0xf, 0xfe, + 0xc0, + + /* U+0025 "%" */ + 0x0, 0x3e, 0xff, 0x40, 0x7, 0xf6, 0xf9, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x0, 0xfa, 0x49, 0x8c, + 0x2, 0x45, 0x4d, 0x9c, 0x73, 0x70, 0xe, 0x46, + 0x29, 0x0, 0xde, 0x10, 0x1, 0x40, 0x50, 0x7, + 0x48, 0x70, 0x7, 0x28, 0x18, 0x6, 0x32, 0x10, + 0xa, 0x49, 0x8c, 0x3, 0x84, 0x40, 0x1c, 0xc0, + 0x19, 0x18, 0xa4, 0x3, 0xc2, 0x20, 0xe, 0x60, + 0xd, 0x41, 0xc0, 0x1f, 0x28, 0x18, 0x6, 0x32, + 0x10, 0x91, 0x73, 0x0, 0xfb, 0xc2, 0x0, 0x28, + 0xa, 0x4, 0x62, 0x80, 0xf, 0xc8, 0xa9, 0xb3, + 0x8e, 0x6e, 0x14, 0x1c, 0x0, 0x58, 0x82, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x9, 0x17, 0x31, 0xca, + 0x77, 0x56, 0x8, 0x4, 0xfb, 0xfd, 0x0, 0x8c, + 0x50, 0x14, 0x6d, 0xdc, 0x73, 0xa0, 0xf, 0xea, + 0xe, 0x2, 0x43, 0x91, 0x14, 0x1a, 0x18, 0x7, + 0xd2, 0x2e, 0x60, 0x81, 0x40, 0x1a, 0x81, 0x0, + 0x3c, 0x8c, 0x50, 0x0, 0xe0, 0x20, 0xc, 0x41, + 0xe0, 0x1c, 0x34, 0x1c, 0x1, 0x78, 0x8, 0x6, + 0x10, 0xf, 0xac, 0x5c, 0xc0, 0x23, 0xd, 0x0, + 0xda, 0x1a, 0x1, 0x91, 0x4a, 0x0, 0x32, 0xb, + 0x8, 0x0, 0x58, 0x54, 0x2, 0x1a, 0xe, 0x0, + 0xf5, 0xf, 0xc3, 0xf8, 0xd0, 0x6, 0xb1, 0x73, + 0x0, 0xf2, 0x62, 0xbc, 0x2e, 0x20, 0x0, + + /* U+0026 "&" */ + 0x0, 0xc3, 0x3b, 0xfe, 0xd8, 0x0, 0xff, 0x1f, + 0x31, 0x0, 0x9, 0xf4, 0x3, 0xfb, 0x80, 0x6f, + 0xfd, 0x40, 0x50, 0x1, 0xf1, 0x90, 0x5a, 0x0, + 0x15, 0x81, 0x0, 0x3e, 0x70, 0x3, 0x0, 0x61, + 0x0, 0xfe, 0x60, 0x2, 0x0, 0x42, 0xc0, 0x80, + 0x1f, 0x11, 0x84, 0x10, 0x16, 0x8, 0xa4, 0x3, + 0xf7, 0x80, 0x3e, 0x34, 0x87, 0x44, 0x3, 0xf1, + 0xd0, 0x13, 0x82, 0x79, 0x80, 0x7f, 0x1c, 0x80, + 0x43, 0x42, 0x1, 0xfc, 0xd8, 0x62, 0xe0, 0x38, + 0x20, 0x11, 0x20, 0x4, 0xd2, 0xb, 0xf1, 0x40, + 0x58, 0x20, 0xb, 0xb8, 0xa, 0x41, 0x28, 0x41, + 0x68, 0xb, 0x4, 0x10, 0x30, 0x28, 0x1, 0x20, + 0x19, 0x68, 0xb, 0x18, 0x81, 0x0, 0xc0, 0x48, + 0x3, 0x96, 0x80, 0xa4, 0x10, 0xc0, 0x40, 0x44, + 0x1, 0xe5, 0xa0, 0xb, 0x80, 0x18, 0x0, 0xb0, + 0xf, 0xb0, 0x2, 0x81, 0x6, 0x20, 0x5e, 0x75, + 0x45, 0x9e, 0x60, 0x40, 0x2c, 0x10, 0xc4, 0x1, + 0x8a, 0xba, 0x61, 0x14, 0xdd, 0x1, 0x48, 0xd, + 0xd9, 0x88, 0x0, 0x29, 0x3c, 0xc0, 0xb4, 0x90, + 0x1, 0x24, 0xef, 0xfb, 0xad, 0x80, 0x32, 0xd8, + 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf0, 0x80, 0x61, 0x0, 0x8, 0x7, 0xe3, + 0x0, 0xf8, 0x59, 0xc0, + + /* U+0028 "(" */ + 0x0, 0x93, 0xfc, 0x80, 0x14, 0x1, 0xa0, 0x1, + 0xc, 0x24, 0x2, 0xf0, 0x15, 0x0, 0x90, 0x1c, + 0x2, 0x50, 0x6, 0x80, 0x58, 0x0, 0x40, 0x9, + 0x40, 0x80, 0x31, 0x83, 0x80, 0x44, 0x0, 0xd0, + 0x8, 0x40, 0x2, 0x1, 0x38, 0x7, 0x84, 0x0, + 0x60, 0x1f, 0xe1, 0x0, 0x18, 0x4, 0xe0, 0x1e, + 0x10, 0x0, 0x80, 0x44, 0x0, 0xd0, 0xc, 0x60, + 0xe0, 0x19, 0x40, 0x80, 0x36, 0x0, 0x10, 0x2, + 0x50, 0x6, 0x80, 0x65, 0x7, 0x0, 0xdc, 0x2, + 0xa0, 0x12, 0x18, 0x48, 0x6, 0x80, 0x34, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0xd6, 0x8, 0x60, 0x13, 0x10, + 0x40, 0x6, 0xa0, 0x42, 0x0, 0x94, 0x0, 0xa0, + 0x11, 0x10, 0x2c, 0x3, 0x28, 0x18, 0x6, 0xe0, + 0x1, 0x80, 0x4a, 0x0, 0x50, 0x8, 0xc0, 0x1e, + 0x1, 0xe3, 0x0, 0xc2, 0x2, 0x1, 0x8c, 0x1c, + 0x3, 0xfe, 0x30, 0x70, 0xc, 0x20, 0x20, 0x1e, + 0x30, 0x8, 0xc0, 0x1e, 0x1, 0x28, 0x1, 0x40, + 0x2e, 0x0, 0x18, 0x4, 0xa0, 0x60, 0x11, 0x10, + 0x2c, 0x2, 0x50, 0x2, 0x80, 0x54, 0x8, 0x40, + 0x6, 0x20, 0x80, 0xa, 0xc1, 0xc, 0x0, + + /* U+002A "*" */ + 0x0, 0xc7, 0xec, 0x1, 0xff, 0xc3, 0x1e, 0x80, + 0xe, 0x7e, 0x32, 0x37, 0xea, 0xc, 0xd8, 0x6, + 0x3d, 0x80, 0x60, 0x52, 0x6f, 0x50, 0x3, 0x20, + 0x4, 0x76, 0x20, 0x7, 0xf5, 0x10, 0x13, 0xd9, + 0x13, 0x80, 0x9d, 0x8, 0xb2, 0x67, 0x39, 0xf6, + 0x0, 0x93, 0x65, 0x81, 0x84, 0x3, 0xcc, 0x1, + 0xc5, 0xa, 0x1, 0x80, + + /* U+002B "+" */ + 0x0, 0xf2, 0x20, 0x40, 0x3f, 0xeb, 0xb2, 0x0, + 0x7f, 0xf9, 0xc, 0xf8, 0x0, 0x46, 0x78, 0x4b, + 0x33, 0x80, 0x11, 0x99, 0x9c, 0x3, 0xff, 0x84, + 0x5f, 0xfc, 0x0, 0xaf, 0xfc, 0xc0, 0x1f, 0xfe, + 0xc0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x9, 0x54, 0xa0, 0x10, 0x0, 0x85, + 0x90, 0x18, 0x13, 0x85, 0x0, 0x10, 0x1c, 0x8, + 0x4c, 0x41, 0x2, 0x80, 0x0, + + /* U+002D "-" */ + 0x25, 0x5f, 0x81, 0x2a, 0xbe, 0x20, 0xf, 0xe0, + + /* U+002E "." */ + 0x1a, 0xc4, 0x8, 0x53, 0xa0, 0x30, 0x0, 0x84, + 0x10, 0xc8, 0x0, + + /* U+002F "/" */ + 0x0, 0xfe, 0x58, 0x60, 0xf, 0xeb, 0x7e, 0x0, + 0xfc, 0x62, 0x16, 0x1, 0xfa, 0x80, 0x8c, 0x3, + 0xf3, 0x85, 0x0, 0x7e, 0x41, 0x5, 0x0, 0xfd, + 0xc0, 0x64, 0x1, 0xf9, 0x42, 0xc0, 0x3f, 0x28, + 0x1, 0x80, 0x3f, 0x78, 0x18, 0x80, 0x7e, 0x50, + 0xa0, 0xf, 0xcc, 0x0, 0x70, 0xf, 0xda, 0x8, + 0x20, 0x1f, 0xa, 0x7, 0x0, 0x7e, 0x70, 0x2, + 0x80, 0x7e, 0xa0, 0x50, 0xf, 0xc4, 0x61, 0xe0, + 0x1f, 0x94, 0x5, 0x40, 0x3f, 0x50, 0x38, 0x7, + 0xe2, 0x20, 0x68, 0x7, 0xea, 0x1, 0x40, 0xf, + 0xca, 0xe, 0x1, 0xf8, 0xc8, 0x28, 0x3, 0xf5, + 0x1, 0x18, 0x7, 0xe7, 0x5, 0x0, 0xfc, 0x82, + 0x14, 0x1, 0xfb, 0x40, 0x88, 0x1, 0xf8, + + /* U+0030 "0" */ + 0x0, 0xe7, 0xcf, 0xf7, 0x5a, 0x80, 0x7e, 0x4e, + 0x83, 0x0, 0xa, 0x55, 0x88, 0x7, 0x25, 0x88, + 0x13, 0x3a, 0x80, 0x13, 0x4, 0x2, 0x1a, 0x0, + 0x46, 0xcc, 0x57, 0x20, 0x15, 0x80, 0x52, 0x20, + 0xee, 0x0, 0xc3, 0x64, 0xa, 0x60, 0x6, 0x1, + 0x80, 0xf, 0xa4, 0x1, 0x40, 0x62, 0xe, 0x1, + 0xf9, 0x4, 0x1c, 0x10, 0x1, 0x80, 0x1f, 0xca, + 0x2, 0x2e, 0x0, 0x30, 0x7, 0xf1, 0x80, 0x8, + 0xc0, 0x2, 0x1, 0xfd, 0xe0, 0x7, 0x0, 0xff, + 0xe2, 0x98, 0x0, 0x40, 0x3f, 0xbc, 0x0, 0xfc, + 0x0, 0x60, 0xf, 0xe3, 0x0, 0x12, 0x0, 0x30, + 0x3, 0xf9, 0x40, 0x44, 0x62, 0xe, 0x1, 0xf9, + 0x4, 0x1c, 0x0, 0xc0, 0x30, 0x1, 0xf4, 0x80, + 0x28, 0x1, 0x22, 0xe, 0xe0, 0xc, 0x36, 0x40, + 0xa6, 0x0, 0x1a, 0x0, 0x46, 0xcc, 0x57, 0x20, + 0x15, 0x80, 0x64, 0xb1, 0x2, 0x67, 0x50, 0x1, + 0xe0, 0x80, 0x72, 0x74, 0x18, 0x0, 0x52, 0xb0, + 0x40, 0x20, + + /* U+0031 "1" */ + 0xcf, 0xff, 0x30, 0x7, 0xe9, 0x88, 0x94, 0x2, + 0x57, 0x7b, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, + 0xc0, + + /* U+0032 "2" */ + 0x0, 0x8e, 0x33, 0xbf, 0xd9, 0x4, 0x1, 0xc5, + 0x78, 0xe6, 0x20, 0x3, 0x7d, 0x60, 0x8, 0xb1, + 0x0, 0x8, 0xce, 0xa2, 0x0, 0x95, 0x0, 0x8c, + 0x1b, 0xae, 0x62, 0xb9, 0xc0, 0x16, 0x0, 0x2c, + 0x99, 0x8, 0x7, 0x41, 0x80, 0x90, 0x0, 0x58, + 0x3, 0xf2, 0x0, 0x18, 0x3, 0xff, 0x80, 0x20, + 0x6, 0x0, 0xff, 0xe0, 0x38, 0x9, 0x0, 0x7f, + 0xce, 0x20, 0xe0, 0x1f, 0xf2, 0x40, 0xc, 0x0, + 0x7f, 0x8e, 0xc0, 0x14, 0x20, 0x1f, 0xc9, 0x80, + 0xb, 0x40, 0xf, 0xe4, 0xb0, 0x5, 0xa0, 0x7, + 0xf2, 0x58, 0x2, 0xd0, 0x3, 0xf9, 0x2c, 0x1, + 0x68, 0x1, 0xfc, 0xb6, 0x0, 0xc4, 0x0, 0xfe, + 0x5a, 0x0, 0x61, 0x80, 0x7f, 0x2d, 0x0, 0x15, + 0x1d, 0xff, 0x0, 0x28, 0x2, 0x58, 0x8f, 0xe2, + 0x0, 0xff, 0xe2, 0x0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xfe, 0x8, 0x7, 0xff, 0x16, 0x62, + 0x3f, 0x10, 0x2, 0x0, 0xc, 0xef, 0xf0, 0x90, + 0x2b, 0x80, 0x7f, 0x1c, 0x81, 0x50, 0x7, 0xf0, + 0xe8, 0x3, 0xc0, 0x3f, 0xda, 0x21, 0x64, 0x1, + 0xfd, 0x26, 0x10, 0x80, 0x1f, 0xca, 0xc0, 0xe, + 0x61, 0x0, 0xfc, 0x40, 0x13, 0x4f, 0x38, 0x7, + 0xc8, 0xee, 0x52, 0x0, 0x44, 0x80, 0x78, 0xe2, + 0x15, 0xb6, 0x0, 0x63, 0x0, 0xff, 0x24, 0x80, + 0x2c, 0x3, 0xfe, 0x70, 0x1, 0x80, 0x7f, 0xf0, + 0x84, 0x14, 0x3, 0xf9, 0xc0, 0x4, 0x75, 0x88, + 0x1, 0xe5, 0x90, 0x5, 0x48, 0x1d, 0xf5, 0x44, + 0x27, 0x68, 0x1, 0x5, 0x4c, 0x0, 0x15, 0x77, + 0x31, 0x0, 0x21, 0xc0, 0x13, 0xd2, 0xa4, 0x0, + 0x13, 0x8d, 0x70, 0x0, + + /* U+0034 "4" */ + 0x0, 0xfe, 0x4f, 0xf5, 0x80, 0x7f, 0xf0, 0x4a, + 0x80, 0x68, 0x3, 0xff, 0x83, 0xc2, 0x1a, 0x20, + 0x1f, 0xfc, 0x9, 0x30, 0x83, 0x0, 0xff, 0xe0, + 0x2b, 0x2, 0xb8, 0x7, 0xff, 0x0, 0xa8, 0xa, + 0x80, 0x3f, 0xf8, 0x3e, 0x0, 0xe0, 0xf, 0xfe, + 0xd, 0x10, 0x49, 0x80, 0x7f, 0xf0, 0x1d, 0x41, + 0x58, 0x2, 0xab, 0x70, 0xf, 0x1c, 0x1, 0x50, + 0x6, 0x54, 0xd0, 0xe, 0x1d, 0x0, 0x78, 0x7, + 0xff, 0x6, 0x84, 0x28, 0x80, 0x3f, 0xf8, 0x10, + 0x80, 0x46, 0xcd, 0xe0, 0x3, 0x36, 0x26, 0x0, + 0x14, 0xcf, 0xc0, 0x3, 0x99, 0x90, 0x40, 0x3f, + 0xf8, 0xbf, 0xff, 0xf0, 0x1, 0x7f, 0xe6, 0x0, + 0xff, 0xfe, 0x0, + + /* U+0035 "5" */ + 0x0, 0xf, 0xff, 0xfc, 0x1, 0x88, 0x3, 0xff, + 0x86, 0xe0, 0x6, 0x88, 0xfc, 0x1, 0x88, 0x1, + 0x4e, 0xff, 0x80, 0x37, 0x0, 0x8, 0x3, 0xff, + 0x80, 0x20, 0x1, 0x0, 0xff, 0xe0, 0x10, 0x8, + 0x7, 0xff, 0x5, 0xc0, 0xc0, 0x3f, 0xf8, 0x24, + 0x5, 0xff, 0x76, 0x4a, 0x0, 0x78, 0x40, 0x38, + 0x4d, 0xaf, 0x8, 0x3, 0x44, 0x79, 0x8c, 0x0, + 0x78, 0x20, 0x13, 0xbf, 0xa7, 0x34, 0xc0, 0x60, + 0x3, 0xfe, 0x2d, 0x0, 0x38, 0x7, 0xff, 0x0, + 0x4c, 0x4, 0x3, 0xff, 0x8c, 0x62, 0x1, 0xf8, + 0x4c, 0x8, 0x1, 0xde, 0xc0, 0x1e, 0x2d, 0x0, + 0x50, 0x29, 0xc, 0xfd, 0xcc, 0x4d, 0xe9, 0x81, + 0x38, 0x2d, 0x10, 0x1, 0x19, 0xd9, 0x0, 0x9, + 0x80, 0x12, 0xed, 0xb1, 0x88, 0x9, 0x35, 0xd8, + 0x40, 0x0, + + /* U+0036 "6" */ + 0x0, 0xe2, 0x8c, 0xef, 0xf6, 0xd2, 0x0, 0x70, + 0xd6, 0xb9, 0x88, 0x0, 0x96, 0xd0, 0x2, 0x1c, + 0x50, 0x2, 0x3c, 0xbb, 0x9, 0x20, 0x5, 0xa4, + 0x9, 0xb7, 0xd, 0x13, 0xde, 0x1, 0x31, 0x82, + 0x59, 0x0, 0x78, 0x80, 0x2b, 0x0, 0x50, 0x7, + 0xfc, 0x44, 0x5, 0x10, 0xf, 0xf9, 0x0, 0x18, + 0x1, 0xff, 0xc0, 0xe0, 0x2, 0x82, 0xd7, 0x7f, + 0x6c, 0x10, 0x4, 0x40, 0x15, 0xd2, 0x88, 0x9, + 0x3e, 0xb8, 0x7, 0x72, 0x3, 0x55, 0xca, 0x80, + 0x21, 0x80, 0xc0, 0x4, 0x4e, 0x95, 0x46, 0xab, + 0x0, 0x40, 0x70, 0x5, 0xc2, 0x1, 0xc8, 0xe0, + 0x2a, 0x60, 0x1, 0x30, 0xf, 0xb0, 0x0, 0x4a, + 0x1, 0xff, 0xc2, 0x11, 0x28, 0x9, 0x80, 0x7d, + 0x80, 0x2, 0x8, 0x0, 0x70, 0x80, 0x72, 0x38, + 0x12, 0x1, 0x40, 0x17, 0x4a, 0xa2, 0xd5, 0x80, + 0x24, 0x2, 0x79, 0x0, 0x35, 0x5d, 0x28, 0xd, + 0xa0, 0x6, 0x6e, 0x83, 0x10, 0x13, 0x8f, 0x40, + 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xfe, 0x15, 0x0, 0x7f, 0xf0, 0xcc, + 0x2, 0x48, 0x8f, 0xc6, 0x0, 0xc0, 0x8, 0xdd, + 0xff, 0x18, 0xa, 0x80, 0x7f, 0xcc, 0x0, 0x90, + 0xf, 0xfe, 0x5, 0x80, 0x18, 0xb, 0xfd, 0x0, + 0x1e, 0x42, 0x6, 0x10, 0xf, 0xfa, 0x0, 0x16, + 0x1, 0xff, 0x19, 0x81, 0x8, 0x3, 0xfe, 0x90, + 0x7, 0x80, 0x7f, 0xc2, 0xa0, 0x48, 0x1, 0xff, + 0x48, 0x2, 0xc0, 0x3f, 0xf8, 0xc, 0x2, 0xc0, + 0x1f, 0xf3, 0x8, 0x30, 0x7, 0xff, 0x2, 0xc0, + 0x12, 0x1, 0xff, 0x21, 0x2, 0x88, 0x7, 0xfd, + 0xe0, 0x9, 0x0, 0xff, 0x89, 0x0, 0xcc, 0x1, + 0xff, 0x58, 0x2, 0x40, 0x3f, 0xe1, 0x60, 0x15, + 0x0, 0xf8, + + /* U+0038 "8" */ + 0x0, 0xcb, 0x5b, 0xfe, 0xda, 0x60, 0xf, 0x1e, + 0xd2, 0x90, 0x0, 0x96, 0x74, 0xc0, 0x22, 0xd2, + 0x2, 0x8a, 0xa4, 0x10, 0x16, 0x10, 0x2, 0x4, + 0x1f, 0x5d, 0x54, 0xfa, 0xe0, 0x8, 0x0, 0x20, + 0xc, 0x0, 0x7a, 0x8, 0x14, 0x0, 0x20, 0xa0, + 0x1f, 0x9c, 0x3, 0xcc, 0x1, 0xf9, 0x80, 0x32, + 0x81, 0x28, 0x7, 0x94, 0xc1, 0x40, 0x16, 0x21, + 0x54, 0x42, 0x22, 0xd5, 0x0, 0x6c, 0x0, 0x38, + 0x60, 0xb7, 0xba, 0xa5, 0x3, 0xc1, 0x0, 0xa8, + 0xc0, 0x3f, 0x1d, 0x0, 0x56, 0xe0, 0x75, 0xbf, + 0xed, 0x92, 0x7, 0xb0, 0x54, 0x4, 0xc5, 0x20, + 0x1, 0x36, 0xa8, 0x22, 0xf8, 0x2, 0x40, 0x3f, + 0x40, 0x3, 0xc4, 0x0, 0x40, 0x1f, 0x88, 0x0, + 0xc4, 0x0, 0x40, 0xf, 0xc8, 0x0, 0x6d, 0x0, + 0x49, 0x0, 0x78, 0xa4, 0x1, 0xe8, 0xa0, 0x5b, + 0x4c, 0x8a, 0xd5, 0xa4, 0x8, 0xa1, 0x4c, 0x0, + 0x59, 0xba, 0x95, 0x0, 0x35, 0x80, 0x53, 0xb0, + 0x62, 0x0, 0x13, 0x8d, 0x90, 0x0, + + /* U+0039 "9" */ + 0x0, 0xcb, 0x7d, 0xfd, 0xb2, 0x60, 0x1e, 0x2c, + 0xa4, 0x10, 0x12, 0x6c, 0x90, 0xc, 0x3e, 0x60, + 0x73, 0x74, 0xe4, 0xd, 0x40, 0x14, 0x10, 0x3e, + 0x32, 0x2c, 0x6a, 0x82, 0xb0, 0x1, 0x80, 0xa0, + 0x3, 0xd4, 0x21, 0x0, 0x40, 0x5, 0x0, 0xfc, + 0xe0, 0x2a, 0x1, 0xff, 0xc3, 0xc2, 0x0, 0x28, + 0x7, 0xe7, 0x0, 0x28, 0x28, 0x14, 0x0, 0x7a, + 0x84, 0x0, 0x21, 0x0, 0x7, 0xd7, 0x55, 0x46, + 0xa8, 0x88, 0xc, 0xb, 0x4, 0xa, 0x2a, 0x8e, + 0x43, 0xa0, 0x1c, 0x7d, 0x6, 0x20, 0x29, 0x3c, + 0x62, 0x6, 0x1, 0x9f, 0x3b, 0xfa, 0xd8, 0x8, + 0x0, 0xe0, 0x1f, 0xfc, 0x4, 0x0, 0x68, 0x7, + 0xff, 0x2, 0x80, 0xc, 0x1, 0xff, 0x39, 0x82, + 0x88, 0x0, 0x44, 0x1, 0xe8, 0x80, 0xd, 0x80, + 0x53, 0xd5, 0xc, 0xf5, 0xce, 0x0, 0xd1, 0x0, + 0x9c, 0x15, 0xe6, 0x14, 0x40, 0xf4, 0xc0, 0x36, + 0x31, 0x80, 0x44, 0xd7, 0x84, 0x1, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xb1, 0x2, 0x14, 0xe8, 0xc, 0x0, 0x21, 0x4, + 0x32, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xad, 0x2, 0x55, 0x28, 0x4, 0x0, 0x21, 0x64, + 0x6, 0x4, 0xe1, 0x40, 0x4, 0x7, 0x2, 0x13, + 0x10, 0x40, 0xa0, 0x0, + + /* U+003C "<" */ + 0x0, 0xff, 0x8e, 0x58, 0x3, 0xf0, 0xb6, 0xe3, + 0x0, 0x7c, 0x75, 0xd2, 0x40, 0x88, 0x0, 0x85, + 0xf7, 0x14, 0xa, 0x3a, 0xc8, 0x12, 0xba, 0x8, + 0x17, 0x35, 0xc4, 0x0, 0x56, 0xa0, 0x73, 0xf4, + 0x60, 0x1f, 0x86, 0x9c, 0x3, 0xf1, 0x28, 0xc, + 0xf5, 0x20, 0x7, 0xd5, 0xd2, 0x40, 0xb7, 0xae, + 0x20, 0x1c, 0x2d, 0xb8, 0xc0, 0x51, 0xd6, 0xa0, + 0x1e, 0x39, 0xf9, 0x30, 0x4a, 0x60, 0xf, 0xcd, + 0x98, 0x60, 0xf, 0xfe, 0x1, 0xcf, 0xb8, + + /* U+003D "=" */ + 0x2f, 0xff, 0xfe, 0x3, 0x0, 0x7f, 0xf0, 0x8b, + 0x33, 0xff, 0x80, 0xe0, 0x67, 0xff, 0xc0, 0x10, + 0xf, 0xfe, 0x89, 0x9f, 0xff, 0x0, 0x4b, 0x33, + 0xff, 0x80, 0xe0, 0x1f, 0xfc, 0x20, + + /* U+003E ">" */ + 0x1b, 0x50, 0xf, 0xf8, 0xd2, 0xba, 0x8, 0x3, + 0xf1, 0x30, 0x89, 0xf7, 0x14, 0x3, 0xe9, 0xea, + 0x40, 0x3a, 0xe9, 0x20, 0xf, 0x2d, 0xeb, 0x88, + 0x9b, 0x71, 0x80, 0x3c, 0x51, 0xd6, 0xa0, 0x72, + 0xc0, 0x1f, 0x93, 0x90, 0x3, 0xf8, 0xa3, 0xad, + 0x0, 0xd4, 0x3, 0x2e, 0x6b, 0x88, 0x9f, 0x70, + 0xc0, 0xe7, 0xe8, 0xc1, 0x2b, 0xa0, 0x80, 0x3, + 0x8c, 0x2, 0xfb, 0x6a, 0x1, 0xc6, 0x9, 0x5d, + 0x4, 0x1, 0xf1, 0x75, 0xa8, 0x7, 0xf8, + + /* U+003F "?" */ + 0x0, 0x92, 0x77, 0xbf, 0xd9, 0x24, 0x1, 0x8a, + 0xec, 0xc4, 0x20, 0x3, 0x6d, 0x80, 0x1, 0xe2, + 0x0, 0xb4, 0x4b, 0x90, 0x1, 0xd8, 0x1c, 0x1, + 0x1d, 0x2e, 0xd1, 0xb0, 0x0, 0x80, 0x4f, 0xa7, + 0x0, 0xf3, 0x90, 0x8, 0x80, 0x54, 0x3, 0xf3, + 0x0, 0x7f, 0xf0, 0x94, 0x4, 0x40, 0x1f, 0xe8, + 0x10, 0x60, 0xf, 0xf4, 0x38, 0x1c, 0x0, 0x7f, + 0x4b, 0x81, 0xe0, 0x7, 0xf4, 0x30, 0x26, 0x0, + 0x7f, 0x13, 0x81, 0x58, 0x7, 0xf9, 0x40, 0x16, + 0x1, 0xff, 0x12, 0xa9, 0x0, 0x3f, 0xe5, 0xaa, + 0x10, 0x7, 0xff, 0x38, 0x61, 0x80, 0x3f, 0xf8, + 0x18, 0xf2, 0xc0, 0x1f, 0xf1, 0x0, 0x38, 0x3, + 0xfe, 0x91, 0x29, 0x0, 0xe0, + + /* U+0040 "@" */ + 0x0, 0xfc, 0x4f, 0x7b, 0xff, 0x75, 0xc1, 0x80, + 0x7f, 0xf0, 0x93, 0x36, 0x10, 0x84, 0x84, 0x48, + 0xf9, 0x85, 0x0, 0xff, 0xaa, 0xcc, 0xa3, 0x7f, + 0xb7, 0xbf, 0x64, 0xcd, 0x56, 0x20, 0x1f, 0xe, + 0xa8, 0xd6, 0xb9, 0x0, 0x71, 0x36, 0x59, 0x26, + 0x8, 0x7, 0xe, 0x11, 0xfa, 0x80, 0x7f, 0xc9, + 0xaa, 0x58, 0x20, 0x1a, 0xc8, 0xf0, 0x40, 0x3, + 0x1b, 0xfe, 0xd8, 0x10, 0xff, 0x45, 0x21, 0x58, + 0x4, 0x6a, 0x1c, 0x1, 0x27, 0x39, 0x0, 0x9, + 0xfd, 0x0, 0x35, 0xa, 0x98, 0x2, 0x1, 0xc8, + 0x0, 0x96, 0x0, 0x7c, 0xc5, 0x20, 0xd8, 0x6, + 0x18, 0x8, 0x1, 0x40, 0x90, 0xa, 0x80, 0x76, + 0xc, 0xcb, 0x72, 0x1, 0xe6, 0x14, 0x14, 0x3, + 0x10, 0x2, 0x88, 0x51, 0x0, 0x73, 0x28, 0x7, + 0x90, 0x17, 0x41, 0x0, 0x2f, 0x2, 0x40, 0xf, + 0xa4, 0x3, 0xda, 0x6, 0x21, 0xe0, 0x13, 0x83, + 0x80, 0x7e, 0x30, 0xf, 0x10, 0x79, 0x80, 0x80, + 0x46, 0x6, 0x1, 0xfc, 0x20, 0x1c, 0x20, 0x26, + 0x2, 0x1, 0x18, 0x18, 0x7, 0xf0, 0x80, 0x70, + 0x80, 0xf0, 0x70, 0x4, 0xe0, 0xe0, 0x1f, 0x8c, + 0x3, 0xc4, 0x1e, 0x40, 0xa0, 0x17, 0x81, 0x20, + 0x7, 0xd2, 0x1, 0xed, 0x3, 0x40, 0x31, 0x0, + 0x28, 0x85, 0x10, 0x7, 0x32, 0x80, 0x4, 0x0, + 0x2a, 0x8, 0x28, 0x12, 0x1, 0x50, 0xe, 0xc1, + 0x92, 0x54, 0x81, 0x83, 0x29, 0xe8, 0x38, 0x2, + 0x1, 0xc8, 0x0, 0x96, 0x0, 0x7c, 0xdb, 0x51, + 0xb8, 0x0, 0x56, 0x19, 0xa0, 0x0, 0x6a, 0x1c, + 0x1, 0x27, 0x39, 0x80, 0x9, 0xfd, 0x11, 0x44, + 0x2, 0xf8, 0x1, 0xa8, 0x8f, 0x4, 0x0, 0x31, + 0x9f, 0xed, 0x81, 0x0, 0x2e, 0xff, 0x40, 0x7, + 0xb0, 0x8f, 0xd4, 0x3, 0xff, 0x94, 0x38, 0xa3, + 0x5a, 0xe6, 0x1, 0xc6, 0xf8, 0x1, 0xff, 0xc0, + 0x1a, 0xb3, 0x28, 0xcf, 0xee, 0xbf, 0x20, 0xd0, + 0x3, 0xff, 0x82, 0x99, 0x88, 0x41, 0x1c, 0x4b, + 0x3c, 0x80, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x0, 0xfe, 0x6f, 0xf6, 0x80, 0x7f, 0xf1, 0xac, + 0x0, 0x48, 0x1, 0xff, 0xc4, 0x42, 0x0, 0xbc, + 0x3, 0xff, 0x89, 0xe0, 0x2c, 0x8, 0x40, 0x1f, + 0xfc, 0x22, 0x40, 0x68, 0x0, 0x40, 0x7, 0xff, + 0xa, 0xc0, 0x12, 0x2a, 0xa, 0x20, 0x1f, 0xfc, + 0x1, 0x60, 0x51, 0x9, 0x0, 0x48, 0x7, 0xff, + 0x1, 0x80, 0x12, 0x0, 0x33, 0x3, 0x0, 0x7f, + 0xf0, 0x24, 0x8, 0xc0, 0x2a, 0x1, 0x60, 0xf, + 0xf2, 0x88, 0x58, 0x6, 0x61, 0xb, 0x0, 0xff, + 0x40, 0xb, 0x0, 0x73, 0x1, 0x20, 0x7, 0xe4, + 0x20, 0x60, 0xf, 0x48, 0x3, 0xc0, 0x3f, 0x78, + 0x3, 0x4c, 0xfc, 0x46, 0x8, 0x60, 0x1e, 0x24, + 0x0, 0x56, 0x67, 0xc6, 0x0, 0x90, 0xf, 0x58, + 0x7, 0xff, 0x9, 0x44, 0x3, 0xb, 0x1, 0xff, + 0xff, 0xa8, 0x1, 0x20, 0x19, 0x80, 0x12, 0x1, + 0xfe, 0x51, 0x6, 0x0, 0xd2, 0x2, 0xa0, 0x1f, + 0xf3, 0x0, 0xb0, 0x1, 0x44, 0x18, 0x3, 0xff, + 0x81, 0x20, 0xb, 0x0, 0x48, 0x2, 0x40, 0x3f, + 0xf8, 0x2, 0xa0, 0x48, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xf6, 0xd2, 0x80, 0x7f, 0xf0, 0xc9, + 0x6b, 0x48, 0x3, 0x8e, 0xef, 0xd2, 0xc0, 0x2, + 0xf0, 0xe, 0x74, 0x4f, 0x34, 0xf1, 0x81, 0x30, + 0x7, 0xff, 0x4, 0x7c, 0x1, 0x80, 0x1f, 0xfc, + 0x22, 0x0, 0x8, 0x7, 0xff, 0x8, 0xc0, 0x4, + 0x1, 0xff, 0xc2, 0xb0, 0x6, 0x80, 0x7f, 0xc2, + 0x96, 0xc0, 0x88, 0x0, 0xc9, 0xff, 0xee, 0xb4, + 0x5, 0xb0, 0xf, 0xfe, 0x22, 0x38, 0x7, 0x1d, + 0xdf, 0xd4, 0xe2, 0x28, 0xa0, 0xc, 0xe8, 0x9f, + 0x2c, 0x71, 0x82, 0xa0, 0x7, 0xff, 0xb, 0xc0, + 0x1a, 0x1, 0xff, 0xc2, 0x30, 0x2, 0x80, 0x7f, + 0xf0, 0x8c, 0x0, 0xe0, 0x1f, 0xfc, 0x28, 0x0, + 0x60, 0x4, 0xe8, 0x9f, 0x2c, 0x72, 0x0, 0xb0, + 0x4, 0x77, 0x7f, 0x53, 0x88, 0x16, 0x8, 0x7, + 0xff, 0x0, 0x96, 0xb4, 0x80, + + /* U+0043 "C" */ + 0x0, 0xf1, 0xc6, 0x77, 0xf6, 0xd2, 0x80, 0x7e, + 0x2b, 0xc7, 0x31, 0x1, 0x25, 0xae, 0x50, 0xe, + 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, 0xa0, + 0x2, 0x5a, 0x0, 0x26, 0x6d, 0x44, 0xdf, 0xc8, + 0x81, 0x80, 0x6, 0x80, 0xf, 0x66, 0x1, 0xe6, + 0xc7, 0xb0, 0x5, 0x80, 0x16, 0x0, 0x3f, 0x8a, + 0x0, 0x2, 0xa0, 0xa, 0x0, 0xff, 0xe1, 0x20, + 0x1, 0x80, 0x3f, 0xf8, 0x7a, 0x0, 0xc0, 0xf, + 0xfe, 0x19, 0x0, 0x18, 0x3, 0xff, 0xac, 0x40, + 0x6, 0x0, 0xff, 0xe1, 0xe8, 0x3, 0x0, 0x3f, + 0xf8, 0x68, 0x0, 0x60, 0xf, 0xfe, 0x18, 0xa8, + 0x2, 0x80, 0x3f, 0xf8, 0x76, 0x0, 0x58, 0x0, + 0xfe, 0x29, 0x0, 0x86, 0x80, 0xf, 0x66, 0x1, + 0xe6, 0xc6, 0xb0, 0x9, 0x68, 0x0, 0x99, 0xb5, + 0x10, 0xaf, 0x91, 0x3, 0x0, 0xcb, 0xa6, 0x0, + 0x25, 0x77, 0x28, 0x0, 0x6a, 0x0, 0x38, 0xb3, + 0xe, 0x62, 0x2, 0x4b, 0x5c, 0xa0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xee, 0xc9, 0x40, 0xf, 0xfe, 0x20, + 0x9b, 0x5e, 0xa0, 0x7, 0xc5, 0x11, 0xe6, 0x30, + 0x1, 0x5c, 0x0, 0x79, 0x9d, 0xfd, 0x39, 0xac, + 0x0, 0x78, 0x0, 0xff, 0xe1, 0x14, 0xd0, 0x1, + 0xd0, 0x3, 0xff, 0x86, 0xb2, 0x0, 0x80, 0xf, + 0xfe, 0x23, 0x10, 0x19, 0x80, 0x3f, 0xf8, 0x96, + 0x0, 0x40, 0xf, 0xfe, 0x22, 0x80, 0x34, 0x3, + 0xff, 0x88, 0x40, 0x6, 0x0, 0xff, 0xec, 0x10, + 0x1, 0x80, 0x3f, 0xf8, 0x8a, 0x0, 0xd0, 0xf, + 0xfe, 0x25, 0x80, 0x10, 0x3, 0xff, 0x86, 0xc4, + 0x6, 0x60, 0xf, 0xfe, 0x12, 0x48, 0x2, 0x0, + 0x3f, 0xf8, 0x23, 0x36, 0x0, 0x74, 0x0, 0xcc, + 0xef, 0xe9, 0xce, 0x60, 0x3, 0xc0, 0x7, 0x14, + 0x47, 0x98, 0xc0, 0x5, 0x70, 0x1, 0xff, 0xc1, + 0x13, 0x6b, 0xd4, 0x0, 0xc0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf2, 0xa, + 0x23, 0xfd, 0x20, 0x19, 0x9d, 0xff, 0xca, 0x1, + 0xff, 0xff, 0x0, 0xfe, 0x4f, 0xff, 0xe9, 0x0, + 0xff, 0xe4, 0x94, 0xcf, 0xf5, 0x0, 0x73, 0x37, + 0xf8, 0xc0, 0x3f, 0xff, 0x2c, 0xef, 0xff, 0x8, + 0x4, 0x51, 0x1f, 0xf1, 0x80, 0x7f, 0xf1, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf1, 0x8a, + 0x23, 0xfd, 0x20, 0x13, 0x3b, 0xff, 0x94, 0x3, + 0xff, 0xfe, 0x1, 0x33, 0x7f, 0x8c, 0x3, 0x14, + 0xcf, 0xf5, 0x0, 0x7f, 0xf1, 0xd3, 0xff, 0xfa, + 0x40, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x30, + + /* U+0047 "G" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x84, 0x3, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x72, 0xea, 0x0, 0x9, 0x5d, 0xca, 0x20, 0x8, + 0xb0, 0x9, 0x28, 0x0, 0x79, 0xb5, 0x10, 0xae, + 0xb2, 0x6, 0x10, 0x1b, 0x0, 0x3e, 0x18, 0x7, + 0x93, 0x5f, 0x4, 0x20, 0x0, 0xb0, 0x1, 0xfe, + 0x81, 0x1, 0x60, 0x5, 0x0, 0x7f, 0xf0, 0x90, + 0x0, 0xc0, 0x1f, 0xfc, 0x3d, 0x0, 0x60, 0x7, + 0xff, 0xc, 0x80, 0xc, 0x1, 0xff, 0xc0, 0x11, + 0x0, 0x7f, 0xf1, 0x1f, 0xb8, 0x64, 0x0, 0x60, + 0xf, 0xfe, 0x1e, 0x80, 0x30, 0x3, 0xff, 0x86, + 0x80, 0x6, 0x0, 0xff, 0xe1, 0x8b, 0x0, 0x28, + 0x3, 0xff, 0x87, 0x0, 0x5, 0x80, 0xf, 0xfe, + 0x10, 0xd8, 0x1, 0xf0, 0xc0, 0x3c, 0x76, 0x1, + 0xc9, 0x40, 0x3, 0xcd, 0xa8, 0x84, 0xee, 0x18, + 0x9, 0x0, 0x4b, 0xa8, 0x0, 0x25, 0x77, 0x31, + 0x0, 0x1b, 0xc4, 0x3, 0x15, 0xe3, 0x98, 0x80, + 0x9, 0x67, 0xa4, 0x40, + + /* U+0048 "H" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xdf, 0xec, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0x13, 0xff, 0xfe, 0x0, + 0xff, 0xe6, 0x14, 0x47, 0xfc, 0x1, 0xe6, 0x77, + 0xff, 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, 0xa0, + + /* U+0049 "I" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, + + /* U+004A "J" */ + 0x0, 0x27, 0xff, 0xf4, 0x80, 0x7f, 0xf0, 0xd6, + 0x23, 0xce, 0x1, 0xc2, 0xef, 0xeb, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xfd, 0xdc, 0x0, 0x20, 0x6, + 0x0, 0xf6, 0x0, 0x38, 0x2a, 0x60, 0x3, 0xb, + 0x80, 0x1c, 0x5c, 0x1f, 0x61, 0xa3, 0xc0, 0xa, + 0x22, 0xf3, 0x2, 0x79, 0x71, 0x3, 0xa0, 0x1, + 0x65, 0x20, 0x80, 0xa4, 0xe0, 0x0, + + /* U+004B "K" */ + 0x1f, 0xf5, 0x80, 0x7f, 0x17, 0x7f, 0x10, 0x7, + 0xff, 0x4, 0xb0, 0x43, 0x48, 0x3, 0xff, 0x80, + 0x38, 0x21, 0x66, 0x1, 0xff, 0xc0, 0x1c, 0x10, + 0xa4, 0x0, 0xff, 0xe0, 0xe, 0x10, 0x4a, 0x80, + 0x7f, 0xf0, 0x74, 0x82, 0x18, 0x3, 0xff, 0x83, + 0x86, 0xe, 0xe0, 0xf, 0xfe, 0xd, 0x98, 0x34, + 0x0, 0x7f, 0xf0, 0x6d, 0x1, 0x64, 0x3, 0xff, + 0x83, 0x48, 0x0, 0x30, 0xf, 0xfe, 0xc, 0xa8, + 0x4, 0xcc, 0x0, 0xff, 0x91, 0x80, 0x5c, 0x1, + 0x26, 0x1, 0xff, 0xc0, 0x1c, 0x87, 0x0, 0x68, + 0x80, 0x7f, 0x87, 0x8, 0x21, 0x0, 0x74, 0x3, + 0xf8, 0x70, 0x80, 0x2b, 0x30, 0x3a, 0x0, 0xfc, + 0xa4, 0x1, 0xda, 0x20, 0xae, 0x1, 0xff, 0xc2, + 0x1d, 0x0, 0x42, 0x0, 0x7f, 0xf0, 0x8e, 0xc0, + 0x14, 0x40, 0x1f, 0xfc, 0x24, 0x80, 0x1f, 0x0, + 0xff, 0xe1, 0xbb, 0x1, 0x58, 0x0, + + /* U+004C "L" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, + 0xe0, 0x1f, 0xff, 0xf0, 0xf, 0xfe, 0x8b, 0x3b, + 0xff, 0x88, 0x2, 0x28, 0x8f, 0xf3, 0x80, 0x7f, + 0xf0, 0xc0, + + /* U+004D "M" */ + 0x1f, 0xf4, 0x0, 0x7f, 0xf0, 0xf3, 0xf0, 0x2, + 0x72, 0x0, 0xff, 0xe0, 0xb1, 0x80, 0x7a, 0x0, + 0x3f, 0xf8, 0x30, 0x1, 0xf2, 0xa0, 0x7, 0xfd, + 0x2, 0x1, 0xfa, 0x40, 0x3f, 0xc4, 0xe0, 0x1f, + 0x8, 0x13, 0x0, 0x7f, 0x40, 0x7, 0xe4, 0x30, + 0x81, 0x0, 0xf9, 0x14, 0x20, 0x40, 0x3d, 0xe0, + 0x30, 0x1, 0xf4, 0x81, 0x38, 0x7, 0xc6, 0xc0, + 0xc4, 0x1, 0xcc, 0x41, 0x20, 0x1f, 0xd0, 0x0, + 0x90, 0xe, 0x80, 0x44, 0x0, 0x7f, 0xc, 0x2, + 0x28, 0x5, 0x2, 0x12, 0x1, 0xff, 0x39, 0x5, + 0x80, 0x9, 0xc1, 0xc8, 0x3, 0xff, 0x81, 0x20, + 0x2e, 0x12, 0x3, 0x0, 0x1f, 0xfc, 0x14, 0x50, + 0x86, 0x40, 0x80, 0xf, 0xfe, 0x1c, 0x0, 0x24, + 0xd, 0x80, 0x3f, 0xf8, 0x64, 0xe0, 0x17, 0x80, + 0x7f, 0xf1, 0x60, 0x41, 0x4c, 0x3, 0xff, 0x8d, + 0x4d, 0x60, 0x1f, 0xfc, 0x74, 0x91, 0x0, 0xff, + 0xe9, 0x80, + + /* U+004E "N" */ + 0x1f, 0xf5, 0x0, 0x7f, 0xdf, 0xec, 0x0, 0x95, + 0x80, 0x3f, 0xf8, 0xb2, 0x60, 0x1f, 0xfc, 0x5d, + 0x10, 0xf, 0xfe, 0x20, 0xe8, 0x7, 0xff, 0x8, + 0xc8, 0xe, 0x40, 0x3f, 0xf8, 0x2f, 0xe0, 0x6, + 0x50, 0xf, 0xfe, 0x9, 0x50, 0x2, 0x88, 0x3, + 0xff, 0x82, 0xac, 0x0, 0xf1, 0x0, 0xff, 0xe0, + 0xc9, 0x81, 0x50, 0x7, 0xff, 0xb, 0x44, 0x12, + 0x0, 0x3f, 0xf8, 0x23, 0xa0, 0x7, 0x40, 0xf, + 0xfe, 0x9, 0xc8, 0x2, 0xc8, 0x3, 0xff, 0x82, + 0xca, 0x0, 0xf0, 0xf, 0xfe, 0x15, 0x18, 0x15, + 0x0, 0x7f, 0xf0, 0xb8, 0x41, 0x40, 0x3f, 0xf8, + 0x45, 0x40, 0x1f, 0xfc, 0x54, 0x80, 0xf, 0xfe, + 0x2b, 0xa8, 0x7, 0xff, 0x16, 0x88, 0x0, + + /* U+004F "O" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x7e, 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, + 0x2c, 0x40, 0x39, 0x28, 0x0, 0x99, 0xb5, 0x13, + 0x7f, 0x20, 0x4, 0xd0, 0xc, 0x34, 0x0, 0x7b, + 0x30, 0xf, 0x36, 0x90, 0x1c, 0x80, 0x50, 0x20, + 0xb0, 0x1, 0xfc, 0x5e, 0x0, 0x62, 0x1, 0x60, + 0x5, 0x0, 0x7f, 0xc5, 0x0, 0xb, 0x4, 0x0, + 0x30, 0x7, 0xff, 0x5, 0x80, 0x8, 0x1a, 0x0, + 0xc0, 0xf, 0xfe, 0x8, 0x90, 0x10, 0x10, 0x1, + 0x80, 0x3f, 0xf8, 0x4c, 0x0, 0x20, 0xf, 0xfe, + 0x51, 0x0, 0x18, 0x3, 0xff, 0x84, 0xc0, 0x2, + 0xd0, 0x6, 0x0, 0x7f, 0xf0, 0x44, 0x80, 0x81, + 0x0, 0xc, 0x1, 0xff, 0xc1, 0x60, 0x2, 0x0, + 0xb0, 0x2, 0x80, 0x3f, 0xe2, 0x80, 0x5, 0x80, + 0x20, 0x41, 0x60, 0x3, 0xf8, 0xbc, 0x0, 0xc4, + 0x0, 0x1a, 0x0, 0x3d, 0x98, 0x7, 0x9b, 0x48, + 0xe, 0x40, 0x32, 0x50, 0x1, 0x33, 0x6a, 0x26, + 0xfe, 0x40, 0x7, 0xa0, 0x1e, 0x5d, 0x40, 0x1, + 0x2b, 0xb2, 0x0, 0x51, 0x82, 0x1, 0xf1, 0x5e, + 0x39, 0x88, 0x0, 0x96, 0x7d, 0xc0, 0x38, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x12, + 0xd6, 0x98, 0x7, 0x14, 0x47, 0x3a, 0x80, 0xb, + 0xc, 0x3, 0x33, 0xbf, 0x45, 0x7a, 0x80, 0x38, + 0x3, 0xff, 0x83, 0x48, 0x4, 0xa0, 0x1f, 0xfc, + 0x1f, 0x0, 0x60, 0x7, 0xff, 0x5, 0x40, 0x4, + 0x1, 0xff, 0xd2, 0x50, 0x1, 0x0, 0x7f, 0xf0, + 0x7c, 0x1, 0x80, 0x1f, 0xfc, 0x9, 0x40, 0x25, + 0x0, 0x99, 0xdf, 0xd5, 0xec, 0x0, 0xe0, 0xc, + 0x51, 0x1e, 0x50, 0x1, 0x61, 0x80, 0x7f, 0xc4, + 0xb5, 0xa6, 0x1, 0xc9, 0xff, 0xed, 0xa5, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf0, 0x80, + + /* U+0051 "Q" */ + 0x0, 0xf1, 0x46, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xf8, 0x5, 0x7a, 0xe6, 0x20, 0x2, 0x59, 0xe7, + 0x0, 0xfe, 0x4d, 0x40, 0x1, 0x2b, 0xb2, 0x0, + 0x6, 0x2c, 0x40, 0x3c, 0x96, 0x0, 0x3c, 0xda, + 0x89, 0xbf, 0x80, 0x2, 0x68, 0x7, 0xd, 0x0, + 0x1f, 0xc, 0x3, 0xcf, 0xa4, 0x7, 0x0, 0x1a, + 0x4, 0x16, 0x0, 0x3f, 0x8b, 0xc0, 0xe, 0x40, + 0x13, 0x0, 0x28, 0x3, 0xfe, 0x27, 0x0, 0x50, + 0x1, 0x40, 0xc, 0x1, 0xff, 0xc1, 0x90, 0x2, + 0x80, 0x34, 0x1, 0x80, 0x1f, 0xfc, 0x11, 0x20, + 0x20, 0x0, 0x80, 0x18, 0x3, 0xff, 0x84, 0xc0, + 0x2, 0x3, 0x0, 0xff, 0xe2, 0x88, 0x0, 0xc0, + 0x80, 0xc, 0x1, 0xff, 0xc2, 0x60, 0x0, 0x86, + 0x80, 0x34, 0x3, 0xff, 0x82, 0x26, 0x4, 0x0, + 0x40, 0x3, 0x0, 0x7f, 0xf0, 0x58, 0x0, 0xa0, + 0x1, 0x50, 0x19, 0x0, 0xff, 0x8a, 0x0, 0x14, + 0x1, 0x40, 0x1, 0x9c, 0x3, 0xf8, 0x7c, 0x0, + 0xc4, 0x1, 0x15, 0x0, 0x22, 0x88, 0x3, 0xcb, + 0xe4, 0x7, 0x20, 0x1c, 0xb2, 0x0, 0x5d, 0xc8, + 0x77, 0x4f, 0x50, 0x81, 0xe8, 0x7, 0xcd, 0x84, + 0x0, 0x37, 0x88, 0x30, 0x80, 0x23, 0x4, 0x3, + 0xf1, 0xed, 0x29, 0x0, 0x62, 0x9e, 0x70, 0xf, + 0xfe, 0x2, 0xd6, 0xfc, 0x0, 0x8, 0x82, 0x1, + 0xa4, 0xc0, 0x3f, 0xe7, 0x90, 0x5, 0xd2, 0xa3, + 0x6b, 0x70, 0x7, 0xff, 0x1, 0xac, 0x41, 0x6a, + 0xe4, 0x82, 0x40, 0x3f, 0xf8, 0x29, 0xd2, 0x62, + 0x4, 0xfc, 0x80, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x92, + 0xd6, 0x98, 0x7, 0x8a, 0x23, 0x9d, 0x40, 0x5, + 0x86, 0x1, 0xcc, 0xef, 0xd1, 0x5e, 0xa0, 0xe, + 0x0, 0xff, 0xe1, 0x52, 0x1, 0x28, 0x7, 0xff, + 0xb, 0xc0, 0x18, 0x1, 0xff, 0xc2, 0x50, 0x1, + 0x0, 0x7f, 0xf5, 0x14, 0x0, 0x40, 0x1f, 0xfc, + 0x2f, 0x0, 0x60, 0x7, 0xff, 0x6, 0x50, 0x5, + 0x40, 0x33, 0x37, 0x9e, 0x79, 0x80, 0x1a, 0x1, + 0xc5, 0x33, 0xd0, 0xc2, 0x5, 0x86, 0x1, 0xff, + 0xc2, 0x4d, 0x30, 0xf, 0x27, 0xff, 0x8c, 0x10, + 0xc0, 0x3f, 0xf8, 0x5c, 0x0, 0xd0, 0xf, 0xfe, + 0x11, 0x48, 0xd, 0x0, 0x7f, 0xf0, 0x99, 0x1, + 0x54, 0x1, 0xff, 0xc2, 0xa1, 0xb, 0x10, 0xf, + 0xfe, 0x8, 0xd0, 0xd, 0x0, + + /* U+0053 "S" */ + 0x0, 0xcd, 0x7b, 0xfe, 0xec, 0x83, 0x0, 0xe5, + 0xe9, 0x42, 0x0, 0x9, 0xbe, 0x60, 0x80, 0x9, + 0x42, 0x6, 0xf3, 0x28, 0x40, 0x1, 0x98, 0x1, + 0x20, 0xa, 0xc8, 0x66, 0x3d, 0xfc, 0xb0, 0x81, + 0x90, 0x32, 0x80, 0x7c, 0xd2, 0x0, 0x60, 0x7, + 0x80, 0x7f, 0xf0, 0x18, 0x1, 0x80, 0x1f, 0xfc, + 0x3, 0x10, 0x58, 0x0, 0xff, 0xe0, 0x40, 0x1, + 0xfe, 0x98, 0x80, 0x3f, 0x35, 0x8, 0x1, 0x67, + 0x75, 0x28, 0x1, 0xe5, 0xe9, 0x40, 0x8, 0x9a, + 0xf4, 0xc0, 0x3c, 0xd7, 0xf6, 0xe6, 0x0, 0x2c, + 0x30, 0xf, 0xc9, 0x19, 0xa8, 0x0, 0xe0, 0xf, + 0xf8, 0xac, 0xc0, 0x84, 0x3, 0xff, 0x80, 0x80, + 0x2, 0x5, 0x0, 0xff, 0x10, 0x0, 0x96, 0xad, + 0x0, 0x3e, 0x65, 0x4, 0x1f, 0x4, 0xbe, 0x97, + 0x66, 0x46, 0xc8, 0x2, 0x2, 0xa0, 0x40, 0x5a, + 0x26, 0x4e, 0x40, 0x58, 0x60, 0x7, 0xea, 0x62, + 0x10, 0x12, 0x5a, 0xd3, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xfe, 0x1a, 0x80, 0x7f, 0xf1, 0x62, + 0x3c, 0xe0, 0x3, 0x88, 0xf3, 0xb3, 0xbf, 0x50, + 0x1, 0x5d, 0xfc, 0x40, 0x1f, 0xff, 0xf0, 0xf, + 0xff, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xc6, + + /* U+0055 "U" */ + 0x3f, 0xf4, 0x80, 0x7f, 0x9b, 0xfc, 0xa0, 0x1f, + 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x90, + 0x40, 0x6, 0x1, 0xfe, 0x10, 0x0, 0x90, 0x1, + 0xc0, 0x3f, 0xda, 0x0, 0x60, 0x30, 0x22, 0x0, + 0x7f, 0x20, 0x9, 0x5, 0x80, 0x20, 0x3, 0xf3, + 0x88, 0x38, 0x1, 0xc4, 0x16, 0x40, 0x3c, 0xf0, + 0x0, 0xb0, 0xa, 0x80, 0xd, 0xd5, 0x10, 0xae, + 0x80, 0x5, 0x10, 0x4, 0x98, 0x20, 0x2a, 0xee, + 0x51, 0x1, 0xb5, 0x0, 0xe3, 0xe9, 0x51, 0x0, + 0xa, 0x4f, 0x20, 0x4, + + /* U+0056 "V" */ + 0xd, 0xff, 0x18, 0x7, 0xff, 0x0, 0x7f, 0xd8, + 0x16, 0x0, 0x90, 0xf, 0xfe, 0x3, 0x0, 0x24, + 0x18, 0x41, 0x44, 0x3, 0xfe, 0x90, 0x15, 0x0, + 0x30, 0x2, 0x40, 0x3f, 0xca, 0x21, 0x20, 0x14, + 0x80, 0x18, 0x3, 0xfd, 0x20, 0x6, 0x0, 0x85, + 0x40, 0x54, 0x3, 0xf1, 0x98, 0x18, 0x40, 0x34, + 0x80, 0x24, 0x3, 0xf4, 0x80, 0x2c, 0x3, 0x8c, + 0xc0, 0x66, 0x0, 0xf0, 0xa8, 0x21, 0x0, 0x7a, + 0x40, 0x12, 0x1, 0xe9, 0x0, 0x70, 0x7, 0xca, + 0x20, 0xa2, 0x1, 0xcc, 0x2, 0xa0, 0x1f, 0x98, + 0x1, 0x20, 0x19, 0x84, 0x24, 0x3, 0xfa, 0x40, + 0xc, 0x1, 0xac, 0x0, 0xc0, 0x1f, 0xc2, 0xa0, + 0x2a, 0x0, 0x42, 0x6, 0x10, 0xf, 0xf4, 0x80, + 0x24, 0x1, 0xc0, 0xb, 0x0, 0xff, 0x8c, 0xc0, + 0x66, 0x25, 0x4, 0x20, 0xf, 0xfe, 0x4, 0x80, + 0x26, 0x80, 0x1e, 0x1, 0xff, 0xc1, 0x51, 0x5, + 0x70, 0x24, 0x0, 0xff, 0xe1, 0x48, 0x6, 0xa0, + 0xf, 0xfe, 0x1b, 0x0, 0x66, 0x0, 0xff, 0xe1, + 0x8b, 0x0, 0x18, 0x40, 0x3e, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0xff, 0x4f, 0xf9, 0x40, 0x3f, + 0x8f, 0xfc, 0xe0, 0xe0, 0x28, 0x1, 0xfc, 0xe0, + 0xf, 0x0, 0xfe, 0xb0, 0x2, 0x86, 0x80, 0x34, + 0x3, 0xf2, 0x8, 0x1, 0x40, 0x3f, 0x94, 0xc, + 0x81, 0x4, 0x1c, 0x3, 0xf6, 0x80, 0x65, 0x0, + 0xf8, 0xc8, 0x2c, 0x2, 0x40, 0x13, 0x0, 0xf9, + 0xc1, 0x0, 0x1e, 0x1, 0xf5, 0x80, 0x14, 0x2, + 0xe0, 0x5, 0x0, 0x79, 0x4, 0x3d, 0x1, 0x40, + 0x3e, 0x50, 0x22, 0x0, 0x48, 0x0, 0x70, 0xf, + 0x68, 0x1, 0x34, 0x0, 0xa0, 0x1c, 0x44, 0xa, + 0x0, 0xe5, 0x1, 0x30, 0xe, 0x70, 0x50, 0x70, + 0x7, 0x80, 0x75, 0x0, 0x14, 0x3, 0xbc, 0x1, + 0x60, 0x19, 0x4, 0x38, 0x5, 0x1, 0x40, 0x39, + 0x40, 0x88, 0x1, 0xca, 0x0, 0x50, 0xd, 0xc0, + 0x28, 0x0, 0xd0, 0x2, 0x0, 0x44, 0x40, 0x50, + 0xf, 0x94, 0x8, 0xc0, 0x25, 0x4, 0x0, 0x9c, + 0x1, 0xc0, 0x15, 0x0, 0x2c, 0x3, 0xef, 0x0, + 0x58, 0x1, 0x0, 0x1c, 0x1, 0xa, 0x2, 0x80, + 0x4a, 0x4, 0x60, 0x1f, 0x28, 0x1, 0x40, 0x1c, + 0x2, 0x80, 0x1b, 0x80, 0x8, 0x4, 0x40, 0x50, + 0xf, 0xe5, 0x2, 0x20, 0x28, 0x38, 0x7, 0x28, + 0x3, 0x41, 0x40, 0x16, 0x1, 0xfd, 0xe0, 0xa, + 0x50, 0x6, 0x80, 0x79, 0x1, 0xc2, 0x80, 0x8c, + 0x3, 0xf9, 0x40, 0xb, 0xe0, 0x28, 0x1, 0xee, + 0x1, 0x72, 0x5, 0x0, 0xff, 0x90, 0x9, 0x41, + 0xc0, 0x3e, 0x50, 0x4, 0x0, 0x2c, 0x3, 0xfe, + 0xe0, 0xd, 0xa0, 0x1f, 0x90, 0x2, 0x13, 0x0, + 0xff, 0x90, 0x2, 0x14, 0x0, 0xfd, 0xc0, 0x13, + 0x80, 0x7f, 0xf0, 0x5, 0x0, 0xe, 0x1, 0xfc, + 0xa0, 0x15, 0x0, 0x78, + + /* U+0058 "X" */ + 0xc, 0xff, 0x28, 0x7, 0xf3, 0x7f, 0xa4, 0x1, + 0xc0, 0xa, 0x20, 0xf, 0x8a, 0x40, 0xa4, 0x0, + 0x52, 0x0, 0xe0, 0xf, 0xbc, 0x1, 0xc0, 0x19, + 0x90, 0xd, 0xc0, 0x3a, 0x8, 0x20, 0xc0, 0x3a, + 0x84, 0x20, 0xc0, 0x24, 0x70, 0x47, 0x0, 0xf0, + 0xd0, 0x3, 0x80, 0x3, 0x40, 0x34, 0x1, 0xf9, + 0x18, 0xa, 0x82, 0xc4, 0x2c, 0x40, 0x3f, 0xa4, + 0x81, 0x69, 0x41, 0x94, 0x3, 0xfe, 0xf0, 0x2, + 0x81, 0x48, 0x7, 0xff, 0x0, 0xa0, 0x2, 0x90, + 0xf, 0xfe, 0x15, 0x80, 0x5c, 0x1, 0xff, 0xc1, + 0x83, 0x0, 0x95, 0x80, 0x3f, 0xe4, 0x70, 0x2d, + 0x0, 0x49, 0x0, 0x7f, 0xd, 0x0, 0x3c, 0xa4, + 0x1, 0xc0, 0x1f, 0xd6, 0x21, 0x4, 0xc, 0xa0, + 0x70, 0x1, 0xf3, 0x28, 0x23, 0x80, 0x56, 0x20, + 0xe8, 0x1, 0xc5, 0x20, 0x34, 0x1, 0x87, 0x40, + 0x14, 0x20, 0x1b, 0xc0, 0x16, 0x20, 0x1c, 0x6e, + 0x3, 0x60, 0x14, 0x90, 0x2a, 0x80, 0x3e, 0x83, + 0x5, 0x60, 0x46, 0x2, 0xa0, 0xf, 0xee, 0x0, + 0x49, 0x0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x18, 0x7, 0xfd, 0xbf, 0xc0, 0xf, + 0x0, 0x78, 0x7, 0xf9, 0xc8, 0x2c, 0x0, 0x6c, + 0x6, 0xc0, 0x1f, 0x86, 0x1, 0x14, 0x2, 0x81, + 0x8, 0x0, 0xfd, 0x60, 0x9, 0x0, 0xc3, 0x0, + 0x32, 0x1, 0xe3, 0x50, 0x72, 0x0, 0xe6, 0x20, + 0x62, 0x0, 0xee, 0x1, 0x80, 0xf, 0xb8, 0x1, + 0x20, 0x19, 0x88, 0x2c, 0x3, 0xf1, 0xa8, 0x22, + 0x80, 0x6, 0x0, 0xd4, 0x3, 0xfa, 0xc0, 0x16, + 0x0, 0x81, 0xe, 0x0, 0xff, 0xc, 0x0, 0xc1, + 0xb0, 0x31, 0x0, 0x7f, 0xce, 0x40, 0xfc, 0x3, + 0x20, 0x1f, 0xfc, 0x1e, 0x0, 0x10, 0x40, 0x7, + 0xff, 0x8, 0xd4, 0x0, 0x6c, 0x1, 0xff, 0xc3, + 0xf0, 0x5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfd, + 0x20, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xfe, 0x19, 0x80, 0x7f, 0xf1, 0x76, + 0x23, 0xfe, 0x20, 0x2, 0x1a, 0x3b, 0xff, 0x8c, + 0x80, 0x68, 0x3, 0xfe, 0x2b, 0x0, 0x68, 0x80, + 0x7f, 0xde, 0x0, 0x93, 0x0, 0xff, 0xa8, 0x81, + 0x98, 0x1, 0xff, 0x3a, 0x81, 0xc8, 0x7, 0xfc, + 0x90, 0x3, 0xc0, 0x1f, 0xf0, 0xd0, 0x2, 0x88, + 0x3, 0xfe, 0xd1, 0x8, 0x40, 0xf, 0xfa, 0x4c, + 0x11, 0xc0, 0x3f, 0xe6, 0x60, 0x15, 0x80, 0x7f, + 0xc7, 0x20, 0xf, 0x0, 0xff, 0x87, 0x40, 0x14, + 0x40, 0x1f, 0xf5, 0x8, 0x32, 0x80, 0x7f, 0xd0, + 0x80, 0x72, 0x1, 0xff, 0x2b, 0x80, 0x11, 0xdf, + 0xfe, 0x49, 0x0, 0x9e, 0x23, 0xfe, 0xd0, 0xf, + 0xfe, 0x28, + + /* U+005B "[" */ + 0x1f, 0xfe, 0xc0, 0xf, 0xf2, 0x66, 0x38, 0x2, + 0x13, 0x31, 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xfe, + 0x22, 0x66, 0x20, 0x9, 0x33, 0x1c, 0x1, 0xf0, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0xff, 0x63, 0xc0, 0x7, 0xfb, + 0x81, 0x4, 0x3, 0xf9, 0x40, 0xe, 0x1, 0xfe, + 0x50, 0xa0, 0xf, 0xf7, 0x81, 0x88, 0x7, 0xf2, + 0x80, 0x18, 0x3, 0xfc, 0xa1, 0x40, 0x1f, 0xee, + 0x2, 0x20, 0x7, 0xf2, 0x8, 0x50, 0x7, 0xf9, + 0xc1, 0x40, 0x3f, 0xd4, 0x4, 0x60, 0x1f, 0xc6, + 0x21, 0x60, 0x1f, 0xe6, 0x6, 0x0, 0xff, 0x50, + 0xa, 0x0, 0x7f, 0x11, 0x3, 0x40, 0x3f, 0xd4, + 0xe, 0x1, 0xfe, 0x50, 0x14, 0x0, 0xfe, 0x23, + 0xe, 0x0, 0xff, 0x58, 0x28, 0x7, 0xf9, 0x80, + 0xa, 0x1, 0xfc, 0x28, 0x1c, 0x1, 0xfe, 0xd0, + 0x41, 0x0, 0xfe, 0x70, 0x3, 0x80, 0x7f, 0xa, + 0x6, 0x80, 0x7f, 0xb8, 0x10, 0x40, 0x3f, 0x94, + 0x0, 0xe0, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x60, 0xf, 0x9b, 0x31, 0x0, 0x10, + 0x99, 0xc0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0x88, + 0x99, 0xc0, 0x13, 0x66, 0x20, 0x3, 0xfc, + + /* U+005E "^" */ + 0x0, 0xe7, 0x83, 0x0, 0xfe, 0x58, 0x78, 0x0, + 0xfe, 0x90, 0x2, 0x10, 0x7, 0xc6, 0x62, 0x80, + 0xb0, 0xf, 0xa4, 0x2d, 0x81, 0x80, 0x3c, 0x2a, + 0xc, 0x2a, 0xc, 0x1, 0xd2, 0xc, 0x0, 0x90, + 0xb0, 0xe, 0x60, 0xb0, 0x1, 0x91, 0x10, 0x2, + 0x61, 0x42, 0x0, 0xac, 0x3c, 0x2, 0xb0, 0xf0, + 0xc, 0xc0, 0x84, 0x8, 0x44, 0x40, 0xe, 0x60, + 0xb0, 0xf0, 0xa0, 0xf, 0x58, 0x30, 0x0, + + /* U+005F "_" */ + 0xbb, 0xff, 0xe1, 0x22, 0x7f, 0xf0, 0x80, + + /* U+0060 "`" */ + 0x38, 0x83, 0x80, 0x63, 0xe7, 0x8b, 0x0, 0xcd, + 0xa4, 0x98, 0x20, 0x11, 0x6a, 0x9e, 0x8, + + /* U+0061 "a" */ + 0x0, 0xb, 0xdf, 0x7f, 0xb6, 0x90, 0x3, 0x47, + 0x42, 0x8, 0x0, 0x96, 0xe4, 0x2, 0x50, 0x15, + 0x9a, 0x95, 0x0, 0x33, 0x0, 0x1d, 0x1d, 0x4c, + 0xad, 0x5a, 0x0, 0x80, 0x1, 0xb8, 0x7, 0x89, + 0xc0, 0x48, 0x3, 0xfd, 0xc0, 0x6, 0x0, 0x14, + 0x67, 0x73, 0xfe, 0x90, 0xc, 0xda, 0xe6, 0x22, + 0x0, 0xf0, 0x94, 0x80, 0xd7, 0x7f, 0xe9, 0x0, + 0x94, 0x1, 0x4a, 0x20, 0x1f, 0xb8, 0x0, 0xa0, + 0x1e, 0xe0, 0xb, 0x80, 0x8, 0x1, 0xc4, 0xe0, + 0x12, 0x80, 0x2d, 0x40, 0x2, 0xd8, 0x1, 0x8a, + 0x80, 0x6b, 0xfd, 0xd2, 0x2c, 0x1, 0x97, 0x58, + 0x40, 0x4, 0xdb, 0x40, 0x10, + + /* U+0062 "b" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0x4b, 0x7d, 0xfb, 0x6a, 0x1, 0xf3, 0x65, 0x20, + 0x81, 0x25, 0x69, 0x0, 0x75, 0x98, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x12, 0xda, 0x76, 0x8e, + 0x60, 0x7, 0x80, 0x77, 0x90, 0x7, 0x4a, 0x81, + 0x28, 0x4, 0xc4, 0x1, 0xf4, 0x0, 0x3c, 0x2, + 0xc0, 0xf, 0xc4, 0x20, 0xc0, 0x13, 0x0, 0x7f, + 0x18, 0x10, 0x4, 0xc0, 0x1f, 0xc6, 0x4, 0x1, + 0x60, 0x7, 0xe3, 0x10, 0x60, 0x9, 0x88, 0x3, + 0xe8, 0x0, 0x78, 0x6, 0xf2, 0x0, 0xe9, 0x40, + 0x25, 0x0, 0x88, 0x9b, 0x4e, 0xd1, 0xcc, 0x0, + 0xf0, 0xd, 0xc6, 0xb, 0x12, 0xe2, 0x5, 0xa4, + 0x1, 0x87, 0x29, 0x4, 0x5, 0x2b, 0x48, 0x0, + + /* U+0063 "c" */ + 0x0, 0xc7, 0x3b, 0xfe, 0xd9, 0x30, 0xe, 0x1b, + 0xc6, 0x20, 0x1, 0x36, 0x48, 0x4, 0x38, 0x80, + 0x2d, 0x32, 0x60, 0x3, 0x40, 0x2, 0x88, 0x17, + 0xa5, 0x99, 0x3c, 0x60, 0x11, 0xa0, 0x1d, 0x0, + 0x70, 0xee, 0xa0, 0x2c, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0xc, 0x0, 0x80, 0x1f, 0xf3, 0x80, 0x80, + 0x7f, 0xf0, 0x1c, 0x4, 0x3, 0xff, 0x80, 0x60, + 0x4, 0x0, 0xff, 0xa8, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0x9, 0x0, 0xe8, 0x3, 0x87, 0x75, 0x0, + 0xa, 0x20, 0x5e, 0x96, 0x64, 0xf1, 0x80, 0x61, + 0xc4, 0x1, 0x69, 0x93, 0x0, 0x1e, 0x0, 0x21, + 0xbc, 0x62, 0x0, 0x13, 0x64, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0xff, 0xe0, 0x17, 0xfa, 0x0, 0x3f, 0xff, + 0xe0, 0x1f, 0xcb, 0x5b, 0xfd, 0x8c, 0x1, 0xf1, + 0x65, 0x29, 0x0, 0x9c, 0xeb, 0x0, 0x61, 0xc3, + 0x1, 0x69, 0x92, 0x81, 0x50, 0x6, 0xd1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x80, 0x46, 0x60, 0x3a, + 0x0, 0xe1, 0xd1, 0x0, 0xa8, 0x1, 0x0, 0x1f, + 0xb, 0x0, 0x44, 0x0, 0x40, 0xf, 0xd6, 0x1, + 0x38, 0x8, 0x7, 0xf0, 0x80, 0x4e, 0x2, 0x1, + 0xfc, 0x20, 0x11, 0x0, 0xc, 0x3, 0xf2, 0x0, + 0x54, 0x0, 0x80, 0xf, 0xd4, 0x1, 0x19, 0x81, + 0x20, 0x3, 0xd6, 0x40, 0x1b, 0x44, 0x1f, 0x18, + 0xd1, 0xf9, 0x4, 0x3, 0xe, 0x18, 0x1c, 0xe5, + 0xc0, 0x8b, 0x40, 0x38, 0xb2, 0x90, 0x80, 0x4e, + 0x38, 0xc0, 0x20, + + /* U+0065 "e" */ + 0x0, 0xc9, 0x7b, 0xfd, 0x8c, 0x20, 0x1c, 0x39, + 0x68, 0x40, 0x27, 0x3e, 0x80, 0x10, 0xf9, 0x82, + 0x4d, 0xd3, 0x0, 0xda, 0x0, 0x28, 0x42, 0xec, + 0xc8, 0xb3, 0xa4, 0x14, 0x26, 0x81, 0x28, 0x1, + 0xc5, 0xe0, 0x2f, 0x40, 0x6, 0x0, 0xf8, 0x90, + 0x34, 0x80, 0x1f, 0xff, 0xc8, 0xc, 0xe0, 0x1f, + 0xfc, 0x13, 0x70, 0x7, 0xff, 0xfd, 0xc6, 0x0, + 0x40, 0xf, 0xfa, 0xc0, 0x10, 0x1, 0xf8, 0x40, + 0x6, 0x80, 0x76, 0x20, 0x1c, 0xbe, 0x60, 0xa, + 0x20, 0x4e, 0x96, 0x64, 0x65, 0xf, 0x80, 0x7, + 0x10, 0x0, 0xd3, 0x27, 0x30, 0x2e, 0x0, 0x86, + 0xf1, 0x88, 0x40, 0x56, 0xb4, 0x80, + + /* U+0066 "f" */ + 0x0, 0xc3, 0x1b, 0xfd, 0x68, 0x1, 0xe, 0x39, + 0x0, 0xa6, 0x80, 0x50, 0x40, 0xb7, 0x66, 0xa0, + 0x9, 0xc0, 0xa9, 0x11, 0x26, 0x1, 0x8, 0x20, + 0x7, 0xc2, 0x1, 0xfa, 0x7f, 0x80, 0xd, 0xff, + 0x70, 0x7, 0xff, 0x2, 0xf2, 0xc0, 0x9, 0x99, + 0x68, 0x11, 0xa8, 0x0, 0x4c, 0xf0, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xc6, + + /* U+0067 "g" */ + 0x0, 0xcb, 0x7b, 0xfd, 0x8e, 0x21, 0x9f, 0x80, + 0x3, 0xda, 0x42, 0x1, 0x38, 0xf4, 0x0, 0xc7, + 0x84, 0x4, 0xf3, 0x27, 0x11, 0x59, 0x0, 0x5c, + 0x0, 0x7d, 0x86, 0x64, 0x73, 0x80, 0x80, 0x14, + 0x81, 0xa0, 0x3, 0xd0, 0xc0, 0x17, 0x80, 0x2c, + 0x3, 0xf5, 0x80, 0x4c, 0x2, 0x40, 0x1f, 0x88, + 0x40, 0x30, 0x80, 0x7f, 0x84, 0x0, 0xc0, 0x2, + 0x0, 0xfc, 0x40, 0x17, 0x80, 0x20, 0x3, 0xf4, + 0x0, 0x4a, 0x40, 0xb2, 0x1, 0xe9, 0x50, 0xd, + 0xe0, 0x6, 0xe9, 0x66, 0x4f, 0x30, 0x7, 0x16, + 0x10, 0xb, 0x4c, 0x98, 0x45, 0x60, 0x7, 0x0, + 0x1e, 0xd2, 0x10, 0x9, 0xc7, 0xa0, 0x0, 0x40, + 0x32, 0xde, 0xff, 0x63, 0x89, 0x0, 0xc, 0x3, + 0xff, 0x81, 0x40, 0xc, 0x3, 0xe6, 0x0, 0xf9, + 0x5c, 0x5, 0x43, 0xc6, 0x7a, 0x9d, 0x99, 0x19, + 0x40, 0xb, 0x0, 0x71, 0x80, 0xac, 0x4c, 0x9c, + 0xc0, 0x12, 0xa0, 0x2, 0xcc, 0x3a, 0x8, 0x0, + 0x52, 0x39, 0x80, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf8, + 0x8d, 0x7d, 0xfd, 0x6a, 0x1, 0xe6, 0xd9, 0x41, + 0x1, 0x4a, 0xb0, 0xe, 0xa2, 0x16, 0x88, 0x28, + 0x1, 0x24, 0x3, 0x93, 0xa5, 0xdd, 0x58, 0x0, + 0x62, 0x0, 0x86, 0xc0, 0x38, 0xe0, 0x0, 0x80, + 0x14, 0x80, 0x7c, 0x80, 0xe, 0x0, 0x8c, 0x3, + 0xe2, 0x0, 0x8, 0x4, 0xe0, 0x1f, 0xe3, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0x81, 0x29, 0x60, 0x6, 0xdc, 0xd3, + 0x83, 0x28, 0x7, 0x3f, 0xf8, 0xc0, 0x3f, 0xfd, + 0x80, + + /* U+006A "j" */ + 0x0, 0xe3, 0xee, 0x20, 0x7, 0x40, 0x8a, 0x0, + 0x38, 0x80, 0xa, 0x1, 0xd3, 0x38, 0x3, 0xcc, + 0xc0, 0xf, 0xfe, 0x1a, 0xff, 0x98, 0x3, 0xff, + 0xfe, 0x1, 0xff, 0xef, 0x30, 0xe, 0xc0, 0x3, + 0x5, 0xb2, 0xc3, 0x0, 0x9a, 0xa4, 0xd3, 0x80, + 0x28, 0x1d, 0x48, 0x5, 0x31, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xe9, 0xfe, 0xe2, 0x0, 0xff, 0x2d, 0x80, 0xe1, + 0x0, 0x7f, 0x35, 0x0, 0xe1, 0x0, 0x7f, 0x3c, + 0x80, 0xe1, 0x0, 0x7f, 0x44, 0x0, 0x70, 0x80, + 0x3f, 0xa5, 0xc0, 0x70, 0x80, 0x3f, 0x3d, 0x30, + 0x1, 0xc8, 0x3, 0xfa, 0x94, 0x2, 0x65, 0x0, + 0xfe, 0x10, 0x3a, 0x0, 0x51, 0x0, 0x7f, 0x26, + 0x2b, 0x80, 0x3c, 0x3, 0xf2, 0xd8, 0x2, 0x10, + 0xa, 0x80, 0x3e, 0x90, 0xd, 0x64, 0xa, 0xe0, + 0x1f, 0xfc, 0xf, 0x0, 0x42, 0x0, 0x7f, 0xc5, + 0x40, 0xa, 0x10, 0xf, 0xf9, 0x5c, 0x7, 0x40, + + /* U+006C "l" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x38, + + /* U+006D "m" */ + 0x7f, 0xf1, 0xc, 0x67, 0x7e, 0xc9, 0x80, 0x45, + 0x1b, 0xfe, 0xd9, 0x20, 0xf, 0x3f, 0xb9, 0x88, + 0x13, 0x63, 0x83, 0xeb, 0x90, 0x0, 0x9b, 0x58, + 0x3, 0xa8, 0x4e, 0x6e, 0x94, 0x1, 0x15, 0x0, + 0x73, 0x74, 0xa0, 0x9, 0x30, 0xe, 0x7c, 0x64, + 0x5a, 0x90, 0x2, 0x83, 0xe3, 0x22, 0xd4, 0x0, + 0x20, 0x3, 0x14, 0x0, 0x73, 0x10, 0x0, 0xe0, + 0x3, 0x9c, 0x81, 0x0, 0x35, 0x0, 0x7c, 0x80, + 0xb, 0x0, 0xf9, 0x0, 0x2, 0x1, 0x18, 0x7, + 0xdc, 0x0, 0x30, 0xf, 0x84, 0x0, 0x60, 0x13, + 0x80, 0x7f, 0x9c, 0x3, 0xfc, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x50, + + /* U+006E "n" */ + 0x7f, 0xf1, 0x3, 0xe7, 0x7f, 0x5a, 0x80, 0x79, + 0xfa, 0xc, 0x40, 0x52, 0xac, 0x3, 0xa8, 0x4a, + 0x2a, 0x8e, 0x20, 0x92, 0x1, 0xcd, 0xae, 0xaa, + 0x8c, 0x10, 0x62, 0x0, 0x8a, 0x40, 0x38, 0xa4, + 0x0, 0x80, 0x15, 0x0, 0x7c, 0xa0, 0xe, 0x0, + 0x8c, 0x3, 0xe3, 0x0, 0x8, 0x4, 0xe0, 0x1f, + 0xe3, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+006F "o" */ + 0x0, 0xc9, 0x5b, 0xfd, 0xb0, 0x40, 0x1e, 0x1b, + 0xb2, 0x90, 0x9, 0x3e, 0xc0, 0x6, 0x1f, 0x40, + 0x16, 0x99, 0x28, 0x1, 0xec, 0x2, 0xa1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x23, 0x81, 0xa0, 0x1d, + 0x0, 0x70, 0xe8, 0x84, 0x85, 0x80, 0x20, 0x3, + 0xe1, 0x90, 0x15, 0x30, 0x2, 0x0, 0x7e, 0x40, + 0x1, 0x38, 0x8, 0x7, 0xf0, 0x80, 0x39, 0xc0, + 0x40, 0x3f, 0x84, 0x1, 0xc6, 0x0, 0x40, 0xf, + 0xd6, 0x0, 0x2b, 0x0, 0x40, 0x7, 0xc2, 0xc0, + 0x2a, 0x68, 0x7, 0x40, 0x1c, 0x3a, 0x21, 0x20, + 0xa, 0x20, 0x5e, 0x96, 0x65, 0x71, 0x82, 0x38, + 0x0, 0x71, 0x0, 0x5a, 0x64, 0xa0, 0x7, 0xb0, + 0xc, 0x37, 0x65, 0x20, 0x12, 0x6d, 0x80, 0x8, + + /* U+0070 "p" */ + 0x7f, 0xf1, 0x3, 0x5f, 0x7e, 0xda, 0x80, 0x7c, + 0xdb, 0x28, 0x20, 0x49, 0x5a, 0x40, 0x1d, 0x44, + 0x2f, 0x76, 0x93, 0x2, 0xd2, 0x0, 0xc2, 0x7f, + 0x8, 0x86, 0xc8, 0x0, 0x78, 0x6, 0x1d, 0x10, + 0xe, 0x76, 0x2, 0x50, 0x9, 0x84, 0x3, 0xeb, + 0x0, 0x78, 0x5, 0x80, 0x1f, 0x88, 0x41, 0x80, + 0x27, 0x0, 0xfe, 0x30, 0x20, 0x9, 0x80, 0x3f, + 0x8c, 0x8, 0x2, 0xc0, 0xf, 0xc6, 0x20, 0xc0, + 0x13, 0x10, 0x7, 0xd0, 0x0, 0xf0, 0xd, 0xe4, + 0x1, 0xd2, 0x80, 0x4a, 0x1, 0x9, 0x6d, 0x3b, + 0x47, 0x30, 0x3, 0xc0, 0x35, 0x18, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x7c, 0xa4, 0x10, 0x14, + 0xad, 0x20, 0xf, 0x96, 0xfb, 0xfa, 0xd4, 0x3, + 0xff, 0xf0, + + /* U+0071 "q" */ + 0x0, 0xcb, 0x5b, 0xfd, 0x8c, 0x0, 0xff, 0x40, + 0x0, 0xb2, 0x94, 0x80, 0x4e, 0x74, 0x80, 0x30, + 0xe1, 0x80, 0xb4, 0xc9, 0x40, 0xb0, 0x3, 0x68, + 0x82, 0xf4, 0xb3, 0x2b, 0x4c, 0x40, 0x23, 0x30, + 0x1d, 0x0, 0x71, 0x68, 0x80, 0x54, 0x0, 0x80, + 0xf, 0x86, 0x40, 0x22, 0x0, 0x20, 0x7, 0xe4, + 0x0, 0x9c, 0x4, 0x3, 0xf8, 0x40, 0x27, 0x1, + 0x0, 0xfe, 0x10, 0x8, 0x80, 0x8, 0x1, 0xfa, + 0xc0, 0x2a, 0x0, 0x40, 0x7, 0xc2, 0xc0, 0x11, + 0x98, 0xe, 0x80, 0x38, 0x74, 0x40, 0x36, 0x88, + 0x2f, 0x4b, 0x32, 0xb8, 0xc4, 0x3, 0xe, 0x18, + 0xb, 0x4c, 0x94, 0xf, 0x40, 0x38, 0xb2, 0x90, + 0x80, 0x4e, 0x70, 0x40, 0x3e, 0x5b, 0xdf, 0xec, + 0x60, 0xf, 0xff, 0xc8, + + /* U+0072 "r" */ + 0x7f, 0xf1, 0x3, 0x67, 0x40, 0x4, 0x3b, 0x26, + 0x20, 0x1b, 0x88, 0xd, 0xb4, 0x2, 0x22, 0x6e, + 0x4a, 0x80, 0x6c, 0x20, 0xf, 0x38, 0x80, 0x7d, + 0xa0, 0x1f, 0x98, 0x3, 0xff, 0xf0, + + /* U+0073 "s" */ + 0x0, 0x8a, 0x77, 0xfd, 0xd9, 0x6, 0x1, 0xa3, + 0x58, 0x80, 0x2, 0x6f, 0x90, 0x0, 0x57, 0x1, + 0x79, 0xa9, 0x61, 0xa, 0x0, 0x70, 0x3, 0x21, + 0x95, 0xa7, 0xb0, 0x80, 0xc, 0x4, 0x40, 0xf, + 0x18, 0x4, 0xc0, 0x4e, 0x1, 0xfe, 0x80, 0x4, + 0x75, 0xc2, 0x88, 0x7, 0x1d, 0x90, 0xa, 0x3d, + 0x76, 0xa8, 0x6, 0x4d, 0xc9, 0x63, 0x0, 0x15, + 0x38, 0x7, 0x1b, 0x4e, 0x7d, 0x8, 0x40, 0x7, + 0xf9, 0x58, 0x0, 0x40, 0xae, 0x1, 0xf1, 0x80, + 0xc, 0x2e, 0x3e, 0x9d, 0x54, 0xf8, 0x80, 0x82, + 0x22, 0x0, 0x2c, 0x55, 0x20, 0xc0, 0xe8, 0x7, + 0x30, 0xe6, 0x20, 0x2, 0x5a, 0xc1, 0x0, + + /* U+0074 "t" */ + 0x0, 0xa2, 0xa, 0x1, 0xf0, 0xbb, 0xbc, 0x3, + 0xff, 0x9f, 0x3f, 0xc0, 0x5, 0xff, 0xb8, 0x3, + 0xff, 0x81, 0x79, 0x60, 0x4, 0xcc, 0xb4, 0x8, + 0xd4, 0x0, 0x26, 0x78, 0x3, 0xff, 0xf2, 0x20, + 0x1f, 0xfc, 0x14, 0x0, 0xfc, 0xa0, 0x36, 0xaa, + 0xa4, 0x0, 0xa0, 0x41, 0x2a, 0x8b, 0xe0, 0x11, + 0x7b, 0x8, 0xa, 0xc0, + + /* U+0075 "u" */ + 0x9f, 0xf0, 0x80, 0x7c, 0xbf, 0xe6, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xf8, 0x44, 0x0, 0x40, 0x1f, + 0x68, 0x5, 0xa0, 0x4, 0x0, 0xf9, 0x80, 0x24, + 0x0, 0x49, 0x0, 0x75, 0x8, 0x4, 0x2e, 0x3, + 0x90, 0x88, 0x6d, 0x50, 0xe, 0x85, 0x1, 0x7b, + 0xb4, 0x90, 0xd0, 0x7, 0x55, 0xa8, 0x80, 0x9c, + 0x73, 0x80, 0x40, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x30, 0x30, 0x85, 0x0, + 0x7c, 0x2c, 0xc, 0x20, 0x6, 0x3, 0x30, 0x7, + 0x98, 0x1, 0x60, 0x15, 0x0, 0x24, 0x3, 0xd2, + 0x8, 0x40, 0x11, 0x28, 0x28, 0x80, 0x65, 0x10, + 0xf0, 0xe, 0x90, 0x4, 0x80, 0x69, 0x2, 0x40, + 0xe, 0x32, 0x6, 0x0, 0x8c, 0xc1, 0x60, 0x1f, + 0x58, 0xa, 0x80, 0x24, 0x0, 0xc0, 0x1f, 0x30, + 0x84, 0x80, 0xa8, 0x30, 0x7, 0xf3, 0x1, 0x99, + 0x80, 0x16, 0x1, 0xfd, 0x20, 0x9, 0x90, 0x21, + 0x0, 0x7f, 0xa, 0x82, 0x88, 0x78, 0x7, 0xfd, + 0x20, 0x11, 0x20, 0x7, 0xfc, 0x66, 0x0, 0x58, + 0x7, 0x80, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0xf, 0xd5, 0xfc, 0x1, 0xfa, 0x7f, + 0x78, 0x5, 0x0, 0x3c, 0x2a, 0x2, 0xa0, 0x1f, + 0x38, 0x52, 0x8, 0x68, 0x7, 0x9c, 0x2, 0xe0, + 0xf, 0x28, 0x83, 0x3, 0x3, 0x0, 0x7a, 0x80, + 0x24, 0x10, 0xe, 0xe0, 0x41, 0xa, 0x0, 0x28, + 0x6, 0x23, 0xa, 0x0, 0x38, 0x6, 0x14, 0xe, + 0x0, 0x11, 0x87, 0x0, 0x6a, 0x2, 0x54, 0xa, + 0x0, 0xce, 0x2, 0xa0, 0x15, 0x82, 0x8, 0x4, + 0xc1, 0x41, 0xc0, 0x64, 0x1, 0x50, 0x38, 0x6, + 0x60, 0x3, 0x80, 0x10, 0x41, 0x81, 0x44, 0x28, + 0x0, 0x46, 0x14, 0x1, 0x85, 0x2, 0x80, 0x1c, + 0x8, 0x20, 0x7, 0x6, 0x0, 0x50, 0x11, 0x80, + 0x77, 0x1, 0x90, 0xa8, 0x70, 0x5, 0x40, 0x28, + 0xc, 0x14, 0x1, 0xe5, 0x10, 0xa7, 0x0, 0x28, + 0x4, 0x66, 0xd, 0x41, 0x6, 0x0, 0xf9, 0xc1, + 0x68, 0x18, 0x3, 0xa8, 0x1b, 0x81, 0x4, 0x3, + 0xea, 0x2, 0x30, 0xa0, 0xe, 0x70, 0x2, 0x86, + 0x80, 0x7e, 0x32, 0x0, 0x11, 0x80, 0x70, 0xa8, + 0x4, 0xc0, 0x1f, 0xd4, 0x0, 0xa0, 0xf, 0xb8, + 0x0, 0xa0, 0x1c, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0xf, 0x4f, 0xf9, 0x40, 0x74, + 0x7, 0x40, 0x39, 0x58, 0x19, 0x40, 0x7, 0x20, + 0x70, 0x1, 0x15, 0x81, 0xc8, 0x6, 0x65, 0x7, + 0x50, 0x7, 0x8, 0x70, 0x7, 0xa8, 0x82, 0xca, + 0x4c, 0x28, 0x80, 0x3e, 0xf0, 0x1c, 0x60, 0x75, + 0x0, 0xfc, 0x52, 0x2, 0x7, 0x0, 0x1f, 0xe6, + 0x10, 0x4, 0x80, 0x7f, 0xd4, 0x20, 0xb, 0x20, + 0xf, 0xe6, 0x50, 0x50, 0x1e, 0x0, 0xfc, 0x72, + 0x7, 0x54, 0x3, 0x90, 0xf, 0xf, 0x0, 0xe8, + 0x2b, 0x3, 0x28, 0x7, 0x51, 0x5, 0x8, 0x2, + 0x48, 0x28, 0x80, 0x27, 0x40, 0x74, 0x0, 0xde, + 0x0, 0xf0, 0x1, 0xc0, 0x1c, 0x0, 0x71, 0x50, + 0x15, 0x0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x38, 0x30, 0x85, 0x80, + 0x7c, 0x2c, 0xe, 0x1, 0x48, 0x12, 0x80, 0x7a, + 0x40, 0x12, 0x1, 0x30, 0x2, 0x40, 0x3c, 0xc0, + 0xa2, 0x1, 0xb, 0x1, 0x98, 0x3, 0x30, 0x84, + 0x80, 0x75, 0x80, 0x24, 0x3, 0x58, 0x19, 0x80, + 0x38, 0x94, 0x14, 0x40, 0x8, 0x41, 0x0, 0x1f, + 0x48, 0x2, 0x40, 0x1e, 0x4, 0x80, 0x1f, 0x19, + 0x81, 0xc0, 0x90, 0x2c, 0x3, 0xfa, 0x0, 0xf, + 0x60, 0x2c, 0x1, 0xfc, 0x84, 0x12, 0xc1, 0x20, + 0x1f, 0xf5, 0x80, 0x80, 0x18, 0x3, 0xfe, 0x61, + 0x0, 0x30, 0x80, 0x7f, 0xf0, 0x1c, 0x1, 0x60, + 0x1f, 0xfc, 0x1, 0x60, 0x42, 0x0, 0xf8, 0x40, + 0x34, 0x0, 0x20, 0x3, 0xf7, 0xdb, 0x2d, 0x30, + 0x29, 0x80, 0x7c, 0xc2, 0x93, 0x4a, 0x5, 0x60, + 0x1f, 0x9a, 0x4c, 0x0, 0x51, 0xa2, 0x1, 0xf8, + + /* U+007A "z" */ + 0xbf, 0xff, 0xf9, 0x40, 0x3f, 0xf8, 0x3, 0x39, + 0x9f, 0x38, 0x1, 0x10, 0x46, 0x7e, 0x17, 0x2, + 0xa0, 0xf, 0x87, 0xc0, 0x1c, 0x20, 0x1f, 0x51, + 0x5, 0x18, 0x7, 0xd0, 0x80, 0xea, 0x1, 0xf2, + 0x38, 0x24, 0x0, 0x7c, 0x56, 0x3, 0x40, 0x1f, + 0xbc, 0x1, 0xa2, 0x1, 0xf5, 0x10, 0x49, 0x80, + 0x7c, 0xea, 0xc, 0xc0, 0xf, 0x92, 0x0, 0x68, + 0xcf, 0xe1, 0x90, 0x0, 0xe6, 0x7e, 0x93, 0x0, + 0xff, 0xe0, 0x0, + + /* U+007B "{" */ + 0x0, 0xcd, 0x9f, 0xe4, 0x0, 0x9e, 0x4c, 0x3, + 0xd2, 0x0, 0x8c, 0x50, 0x0, 0x88, 0x11, 0xcc, + 0x40, 0x6, 0x0, 0x30, 0xf, 0xff, 0x68, 0x9c, + 0x0, 0x34, 0x2, 0x7c, 0x50, 0x65, 0x0, 0xf9, + 0x4, 0x2, 0x6f, 0x80, 0x27, 0x0, 0xe5, 0x0, + 0x70, 0x7, 0xff, 0xbc, 0xc0, 0x6, 0x1, 0xc2, + 0x20, 0x48, 0x31, 0x0, 0xa0, 0x0, 0xf8, 0xa0, + 0x13, 0x51, 0x80, 0x40, + + /* U+007C "|" */ + 0x1f, 0xf3, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xa0, + + /* U+007D "}" */ + 0x7f, 0xf5, 0xa0, 0x7, 0xc9, 0x68, 0x1, 0x35, + 0xb0, 0x2, 0x0, 0x21, 0x49, 0x20, 0x30, 0xf, + 0x38, 0x7, 0xff, 0xc8, 0x80, 0x10, 0x60, 0x1a, + 0x50, 0x1f, 0xc, 0x2, 0x35, 0x0, 0xfa, 0xc4, + 0x2b, 0xcc, 0x2, 0x30, 0x2, 0x80, 0x7f, 0xfb, + 0xdc, 0x3, 0x85, 0x24, 0x80, 0xc0, 0x26, 0xb6, + 0x0, 0x40, 0x7, 0x92, 0xd0, 0x2, + + /* U+007E "~" */ + 0x0, 0x3f, 0x7e, 0x18, 0x6, 0x2f, 0xa0, 0x78, + 0x10, 0x3c, 0x60, 0x9, 0xc0, 0x82, 0x42, 0x76, + 0x2, 0x60, 0x6, 0x3, 0xc, 0x51, 0x89, 0xec, + 0x5f, 0xf8, 0x91, 0xc, 0x18, 0x1, 0x27, 0xa8, + 0x1, 0x68, 0x0, + + /* U+00B0 "°" */ + 0x0, 0xc2, 0x1, 0xf3, 0xf7, 0x3f, 0x10, 0x2, + 0xa8, 0x49, 0x81, 0xb5, 0x4, 0x57, 0xa6, 0x7d, + 0x3a, 0xd, 0x8, 0x0, 0xd0, 0xa, 0x44, 0x0, + 0xe6, 0x3, 0x22, 0x8, 0x6, 0x70, 0x2a, 0xb, + 0x0, 0x86, 0xc5, 0xd, 0xd7, 0x66, 0xb8, 0x68, + 0x1, 0x14, 0x2c, 0x8b, 0xa8, 0x0, + + /* U+2022 "•" */ + 0x0, 0x84, 0x2, 0x4e, 0xe6, 0x8, 0x50, 0x81, + 0xd0, 0x88, 0x2, 0x61, 0x10, 0x4, 0xe1, 0xa6, + 0x9, 0x60, + + /* U+F001 "" */ + 0x0, 0xff, 0xe6, 0x89, 0x80, 0x7f, 0xf2, 0xce, + 0x37, 0xb2, 0x40, 0x3f, 0xf8, 0xc2, 0xb5, 0xd8, + 0xe4, 0x0, 0x60, 0xf, 0xfe, 0x19, 0x3e, 0x75, + 0x28, 0x80, 0x7f, 0xf1, 0x92, 0x7b, 0x60, 0xc0, + 0x3f, 0xf8, 0xc2, 0xd7, 0xf6, 0xc2, 0x1, 0xff, + 0xc8, 0x8e, 0x94, 0x0, 0xff, 0xe6, 0x38, 0x7, + 0xff, 0x78, 0x59, 0x0, 0x3f, 0xf9, 0x47, 0x19, + 0xd2, 0x60, 0x1f, 0xfc, 0x61, 0x5a, 0xec, 0x73, + 0x0, 0xff, 0xe3, 0x13, 0xe7, 0x52, 0x88, 0x7, + 0xff, 0x1d, 0x77, 0x50, 0x60, 0x1f, 0xfc, 0xb2, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xf8, 0x2f, + 0x59, 0x68, 0x1, 0xff, 0xc9, 0x5e, 0x85, 0x34, + 0x30, 0xf, 0xfe, 0x41, 0x50, 0x7, 0xff, 0x0, + 0x4c, 0xc4, 0x1, 0xfe, 0x50, 0xf, 0xf8, 0xf3, + 0xb3, 0x1a, 0x1, 0xfe, 0x20, 0xf, 0xe2, 0x5c, + 0x30, 0xf, 0xfe, 0x12, 0xa0, 0x7, 0xe9, 0x80, + 0xf, 0xfe, 0x2d, 0xc0, 0x80, 0x64, 0xd4, 0x20, + 0xf, 0xef, 0x0, 0xfc, 0xfd, 0xcc, 0xdf, 0xb2, + 0x5, 0x0, 0xfe, 0x50, 0xf, 0xf0, 0x99, 0x0, + 0x6a, 0x50, 0xf, 0xd, 0x90, 0x7, 0xff, 0x1a, + 0xb6, 0x15, 0x4d, 0x5c, 0x80, 0x1f, 0xfc, 0x60, + + /* U+F008 "" */ + 0x9b, 0x0, 0xb3, 0xff, 0xff, 0x89, 0x60, 0x15, + 0xcb, 0x2a, 0x24, 0x40, 0x1f, 0xfc, 0x45, 0x44, + 0x95, 0x80, 0x6e, 0xe1, 0x0, 0x2a, 0xff, 0xf0, + 0x0, 0x3, 0x77, 0x8, 0x4, 0xef, 0x0, 0xa, + 0xab, 0xff, 0x80, 0x20, 0x7, 0x78, 0x2, 0x38, + 0x88, 0xc0, 0x3f, 0xf8, 0x89, 0x11, 0x18, 0x7, + 0xff, 0x48, 0x40, 0x21, 0x0, 0xff, 0xe2, 0x30, + 0x4, 0x20, 0x2, 0xff, 0x88, 0x3, 0xff, 0x88, + 0x5f, 0xf1, 0x0, 0x46, 0x70, 0x0, 0xc0, 0x3f, + 0xf8, 0x66, 0x70, 0x4, 0x79, 0x91, 0x80, 0xee, + 0xff, 0xf0, 0x4, 0xf, 0x32, 0x30, 0xf, 0xe2, + 0x2f, 0xfe, 0x0, 0x1, 0xc0, 0x3f, 0xf8, 0x24, + 0x5f, 0xfc, 0x0, 0x3, 0x80, 0x78, 0xf3, 0x23, + 0x1, 0xdd, 0xff, 0xe0, 0x8, 0x1e, 0x64, 0x60, + 0x11, 0x9c, 0x0, 0x30, 0xf, 0xfe, 0x19, 0x9c, + 0x1, 0x17, 0xfc, 0x40, 0x1f, 0xfc, 0x42, 0xff, + 0x88, 0x0, 0x20, 0x10, 0x80, 0x7f, 0xf1, 0x18, + 0x2, 0x10, 0xf, 0xfe, 0x91, 0xc4, 0x46, 0x1, + 0xff, 0xc4, 0x48, 0x88, 0xc0, 0x27, 0x78, 0x0, + 0x55, 0x5f, 0xfc, 0x1, 0x0, 0x3b, 0xc0, 0x10, + 0xdd, 0xc2, 0x0, 0x55, 0xff, 0xe0, 0x0, 0x6, + 0xee, 0x10, 0x55, 0x22, 0x44, 0x1, 0xff, 0xc4, + 0x54, 0x49, 0x58, + + /* U+F00B "" */ + 0x9f, 0xff, 0x58, 0x2, 0xbf, 0xff, 0xf8, 0x92, + 0xc0, 0x1e, 0x42, 0x15, 0x0, 0xff, 0xe2, 0x30, + 0x7, 0xff, 0xfc, 0x3, 0xff, 0xb2, 0xa0, 0x1e, + 0x32, 0x13, 0x0, 0xff, 0xe2, 0x2d, 0x7f, 0xfb, + 0x0, 0x19, 0xff, 0xff, 0xc4, 0xa0, 0xf, 0xfe, + 0x84, 0xff, 0xfa, 0xc0, 0x17, 0xff, 0xff, 0xc4, + 0x96, 0x0, 0xf2, 0x10, 0xa0, 0x7, 0xff, 0x11, + 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x95, 0x0, + 0xf1, 0x90, 0xa0, 0x7, 0xff, 0x11, 0xab, 0xff, + 0xd8, 0x0, 0xbf, 0xff, 0xfe, 0x24, 0x80, 0x7f, + 0xf4, 0x2b, 0xff, 0xd8, 0x0, 0xcf, 0xff, 0xfe, + 0x25, 0x28, 0x7, 0x8c, 0x84, 0xc0, 0x3f, 0xf8, + 0x8a, 0x1, 0xff, 0xff, 0x0, 0xff, 0xec, 0xb0, + 0x7, 0x90, 0x85, 0x40, 0x3f, 0xf8, 0x8c, + + /* U+F00C "" */ + 0x0, 0xff, 0xe5, 0xaf, 0x48, 0x7, 0xff, 0x31, + 0xa8, 0x5a, 0x80, 0x3f, 0xf9, 0x4d, 0x20, 0x12, + 0xc8, 0x7, 0xff, 0x21, 0xa4, 0x3, 0x98, 0x3, + 0xff, 0x8e, 0xd2, 0x1, 0xe7, 0x0, 0xff, 0xe3, + 0x34, 0x80, 0x79, 0xe0, 0x3, 0xff, 0x8a, 0xd2, + 0x1, 0xe7, 0x80, 0xa, 0x39, 0x40, 0x3f, 0xe6, + 0x90, 0xf, 0x3c, 0x0, 0x54, 0xe3, 0x4c, 0x1, + 0xfc, 0xd2, 0x1, 0xe7, 0x80, 0xa, 0x54, 0x2, + 0x96, 0x0, 0xf9, 0xa4, 0x3, 0xcf, 0x0, 0x19, + 0x80, 0x3a, 0x58, 0x3, 0x9a, 0x40, 0x3c, 0xf0, + 0x1, 0xce, 0x1, 0xe9, 0x60, 0x9, 0xa4, 0x3, + 0xcf, 0x0, 0x1e, 0x87, 0x0, 0xf4, 0xb0, 0x34, + 0x80, 0x79, 0xe0, 0x3, 0xf4, 0x38, 0x7, 0xa6, + 0xa4, 0x3, 0xcf, 0x0, 0x1f, 0xe8, 0x70, 0xf, + 0x28, 0x7, 0x9e, 0x0, 0x3f, 0xf8, 0x10, 0xe0, + 0x1f, 0xf3, 0xc0, 0x7, 0xff, 0xa, 0x1c, 0x3, + 0xf9, 0xe0, 0x3, 0xff, 0x89, 0xe, 0x1, 0xf4, + 0x40, 0x3, 0xff, 0x8d, 0x10, 0x0, 0xe8, 0x70, + 0xf, 0xfe, 0x43, 0xc0, 0x5, 0xe, 0x1, 0xff, + 0xca, 0x78, 0x18, 0x70, 0xf, 0xfe, 0x18, + + /* U+F00D "" */ + 0x0, 0xff, 0xe2, 0x8, 0x6, 0x6f, 0xf2, 0x80, + 0x7f, 0x16, 0xf5, 0x0, 0x1a, 0x40, 0x14, 0xa0, + 0x1f, 0x16, 0x10, 0x2d, 0x4, 0x0, 0x6a, 0x50, + 0xe, 0x2c, 0x10, 0x9, 0x48, 0x80, 0x1d, 0x4a, + 0x1, 0x16, 0x8, 0x7, 0x1f, 0x8, 0x7, 0x52, + 0x81, 0x60, 0x80, 0x75, 0x9, 0x60, 0x80, 0x75, + 0x3e, 0x8, 0x7, 0x52, 0x80, 0xb, 0x4, 0x3, + 0xa0, 0x40, 0x3a, 0x94, 0x3, 0x16, 0x8, 0x7, + 0xfa, 0x94, 0x3, 0xc5, 0x82, 0x1, 0xfa, 0x94, + 0x3, 0xf1, 0x50, 0x7, 0xce, 0xa0, 0x1f, 0xc5, + 0x40, 0x1f, 0x3a, 0x80, 0x7e, 0x2c, 0x10, 0xf, + 0xd4, 0xa0, 0x1e, 0x2c, 0x10, 0xf, 0xf5, 0x28, + 0x6, 0x2c, 0x10, 0xe, 0x91, 0x0, 0xea, 0x50, + 0x1, 0x60, 0x80, 0x75, 0xb6, 0x8, 0x7, 0x52, + 0x87, 0x8, 0x7, 0x5a, 0x1, 0x60, 0x80, 0x75, + 0x9, 0x0, 0x75, 0xa0, 0x4, 0x58, 0x20, 0x1c, + 0x70, 0x1, 0xad, 0x0, 0x38, 0xb0, 0x40, 0x25, + 0x26, 0x90, 0x5, 0xa0, 0x7, 0xc5, 0x84, 0xb, + 0x40, 0x6, 0xff, 0x20, 0x7, 0xf1, 0x6f, 0x50, + 0x0, + + /* U+F011 "" */ + 0x0, 0xff, 0xe0, 0x34, 0xc9, 0x80, 0x3f, 0xf9, + 0x65, 0x2c, 0xc9, 0x20, 0xf, 0xfe, 0x50, 0x80, + 0x61, 0x0, 0xff, 0xe2, 0xd, 0x40, 0x7, 0xff, + 0x2, 0x28, 0x40, 0x3f, 0x8f, 0xd5, 0xd8, 0x3, + 0xfc, 0xce, 0xbe, 0x60, 0x1f, 0x16, 0x88, 0x2, + 0x0, 0x3f, 0xd0, 0x0, 0x1c, 0x30, 0xf, 0x78, + 0x80, 0x7f, 0xf1, 0xf8, 0x40, 0x34, 0x90, 0x4, + 0x3a, 0x1, 0xfe, 0xd1, 0x0, 0x8a, 0x0, 0x22, + 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, 0x82, 0x1, + 0x31, 0x0, 0x2c, 0x3, 0x59, 0x0, 0x7f, 0xf0, + 0xa, 0xc0, 0x35, 0x80, 0x1c, 0x2, 0x35, 0x0, + 0xff, 0xe1, 0x29, 0x80, 0x4e, 0x6, 0x20, 0x14, + 0x80, 0x7f, 0xf1, 0x28, 0x2, 0x13, 0x50, 0xc, + 0xa0, 0x1f, 0xfc, 0x46, 0x0, 0xca, 0x20, 0x10, + 0x80, 0x7f, 0xf1, 0x84, 0x2, 0xef, 0x0, 0x8c, + 0x3, 0xc2, 0x1, 0x84, 0x3, 0xc6, 0x1, 0xf8, + 0xc0, 0x3c, 0x42, 0x0, 0x12, 0x0, 0xf1, 0x80, + 0x5f, 0xc0, 0x10, 0x80, 0x7d, 0xdb, 0xae, 0x0, + 0xf8, 0x40, 0x21, 0x50, 0xc, 0xa0, 0x1f, 0x11, + 0x0, 0x3e, 0x50, 0xc, 0xa6, 0x20, 0x17, 0x0, + 0x7f, 0xf1, 0x38, 0x2, 0x13, 0x7, 0x0, 0x91, + 0x0, 0x1f, 0xfc, 0x24, 0x40, 0x4, 0xe0, 0xb, + 0x0, 0xd4, 0x40, 0x1f, 0xfc, 0x2, 0xa0, 0xd, + 0x60, 0x2, 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, + 0x82, 0x1, 0x31, 0x0, 0x50, 0x20, 0x10, 0xe4, + 0x0, 0x7e, 0x8c, 0x10, 0x8, 0xa0, 0x3, 0xe, + 0x80, 0x73, 0xfd, 0x3a, 0xa9, 0xeb, 0xdc, 0x3, + 0xf, 0x88, 0x7, 0x1e, 0x8, 0x7, 0x2c, 0x55, + 0x21, 0x40, 0x38, 0x74, 0x80, 0x3e, 0x3c, 0x30, + 0xf, 0xfe, 0x11, 0xf9, 0x80, 0x7f, 0x16, 0x48, + 0x80, 0x7f, 0x86, 0x70, 0x40, 0x3f, 0xf8, 0xd, + 0xd6, 0xc4, 0x1, 0x9, 0x35, 0xf3, 0x0, 0x7f, + 0xf1, 0x12, 0x77, 0xfe, 0xed, 0x94, 0x0, 0xfe, + + /* U+F013 "" */ + 0x0, 0xff, 0xec, 0x16, 0x7f, 0xed, 0x60, 0xf, + 0xfe, 0x3b, 0x98, 0x6, 0x2c, 0x0, 0xff, 0xf1, + 0x68, 0x7, 0x98, 0x40, 0x3f, 0xe1, 0xc8, 0x0, + 0x2e, 0xb8, 0x7, 0x8f, 0xa0, 0x0, 0xda, 0x80, + 0x1d, 0xa6, 0xfd, 0x54, 0x20, 0xf, 0xe7, 0xcc, + 0x49, 0x51, 0x0, 0x4e, 0x60, 0x1, 0x50, 0xf, + 0xfe, 0x1, 0x98, 0x0, 0x32, 0x0, 0x18, 0x0, + 0xff, 0xe5, 0x22, 0x1, 0x80, 0x3f, 0xf9, 0x9e, + 0x16, 0x1, 0xfc, 0x31, 0x9b, 0x44, 0x1, 0xfc, + 0x83, 0xe6, 0x1, 0xf0, 0xfb, 0x99, 0x2e, 0xa0, + 0x7, 0xc3, 0x22, 0x79, 0x0, 0x1e, 0xa1, 0x0, + 0xeb, 0x10, 0xe, 0x4f, 0x60, 0x8, 0xc0, 0x38, + 0x50, 0x3, 0xe7, 0x0, 0xe2, 0x10, 0xc, 0x20, + 0x1c, 0x40, 0x1f, 0x84, 0x3, 0x8c, 0x3, 0x84, + 0x3, 0x88, 0x3, 0xf0, 0x80, 0x71, 0x0, 0x71, + 0x80, 0x70, 0xa0, 0x7, 0xce, 0x1, 0xc6, 0x20, + 0x3, 0xc8, 0x0, 0xf5, 0x8, 0x7, 0x58, 0x80, + 0x72, 0x7b, 0x7, 0x98, 0x7, 0xc3, 0xee, 0x64, + 0xba, 0x80, 0x1f, 0xc, 0x8d, 0x80, 0x7f, 0xc, + 0x66, 0xd1, 0x0, 0x7f, 0x20, 0xb0, 0x80, 0x7f, + 0xf2, 0xfc, 0x6, 0x40, 0x3f, 0xf9, 0x48, 0x80, + 0x3, 0x98, 0x0, 0x54, 0x3, 0xff, 0x80, 0x66, + 0x0, 0xd, 0x0, 0x6d, 0x37, 0xea, 0xa1, 0x0, + 0x7f, 0x3e, 0x62, 0x8a, 0x84, 0x3, 0xe, 0x40, + 0x1, 0x75, 0xc0, 0x3c, 0x7f, 0x0, 0x5, 0xd4, + 0x0, 0xff, 0xe0, 0x68, 0x7, 0x98, 0x3, 0xff, + 0xc4, 0xe6, 0x1, 0x8b, 0x0, 0x3f, 0xf8, 0xe5, + 0x9f, 0xfb, 0x58, 0x3, 0xfc, + + /* U+F015 "" */ + 0x0, 0xff, 0xe1, 0x1b, 0xb0, 0x7, 0x24, 0x44, + 0x80, 0x1f, 0xfc, 0x67, 0xc8, 0x9d, 0x10, 0xb, + 0x9d, 0xee, 0x0, 0xff, 0xe2, 0xd4, 0x0, 0x45, + 0xe6, 0x0, 0x10, 0x8, 0x40, 0x3f, 0xf8, 0x63, + 0x8a, 0x1, 0xc3, 0x8c, 0x1, 0xff, 0xc8, 0x3f, + 0x30, 0x9, 0xcc, 0x2, 0x99, 0x0, 0x7f, 0xf1, + 0x9b, 0x4, 0x0, 0x39, 0x18, 0xa0, 0x13, 0x20, + 0x7, 0xff, 0x12, 0x24, 0x2, 0x2c, 0x33, 0xd, + 0x40, 0x7, 0xff, 0x18, 0x6d, 0xc0, 0x25, 0xd2, + 0x8c, 0xc1, 0x3d, 0x80, 0x7f, 0xf1, 0xb, 0x10, + 0x2, 0x7a, 0xb, 0x70, 0x2d, 0x44, 0x69, 0x0, + 0x7f, 0xf0, 0x53, 0x48, 0x2, 0xa8, 0x2d, 0x40, + 0xd, 0x6e, 0x58, 0x80, 0x12, 0x50, 0x7, 0x9e, + 0xc0, 0x21, 0xc5, 0x3c, 0x20, 0xf, 0x45, 0xd, + 0xb0, 0x4, 0xb8, 0x20, 0x15, 0x40, 0x4, 0x7e, + 0x6d, 0x82, 0x1, 0xf9, 0x70, 0x66, 0x40, 0x11, + 0xf9, 0x85, 0xa8, 0x4, 0xb8, 0x33, 0x20, 0xf, + 0xf8, 0xfc, 0xda, 0xc4, 0x0, 0x38, 0x80, 0x1a, + 0x28, 0x6d, 0x80, 0x3f, 0xf8, 0x23, 0x8a, 0x98, + 0x40, 0x13, 0xd9, 0x5, 0xb9, 0x62, 0x0, 0x7f, + 0xf1, 0x2a, 0xb, 0x50, 0x24, 0xc3, 0x35, 0x2, + 0x48, 0x3, 0xff, 0x8c, 0xe6, 0x17, 0x8c, 0x0, + 0x12, 0x0, 0x38, 0x7, 0xff, 0x21, 0xc0, 0x6, + 0x1, 0xff, 0xe3, 0xbf, 0xfc, 0x60, 0x1f, 0xfc, + 0xe6, 0x0, 0xcc, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfd, 0xa0, 0x7, 0x88, 0x80, 0x1b, 0x0, 0x3c, + 0x2a, 0x1, 0xc0, + + /* U+F019 "" */ + 0x0, 0xff, 0x8d, 0x57, 0x18, 0x7, 0xff, 0x25, + 0x72, 0xab, 0x62, 0x80, 0x7f, 0xf2, 0x34, 0x3, + 0xda, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xc0, 0x3f, 0xf8, 0x23, 0x9b, 0xb9, + 0x80, 0x3c, 0xdb, 0xbb, 0x4, 0x3, 0xf2, 0x99, + 0x16, 0x10, 0xf, 0x9, 0x16, 0x35, 0x0, 0xfc, + 0x8c, 0x1, 0xff, 0xc4, 0x64, 0x0, 0xfe, 0x96, + 0x0, 0xff, 0xe1, 0x34, 0x80, 0x7f, 0xd2, 0xc0, + 0x1f, 0xfc, 0x6, 0x90, 0xf, 0xfe, 0xc, 0xb8, + 0x7, 0xf9, 0xe4, 0x3, 0xff, 0x87, 0xe, 0x1, + 0xf9, 0xe0, 0x3, 0xff, 0x8b, 0xe, 0x1, 0xe7, + 0x80, 0xf, 0xf0, 0x8f, 0xe0, 0x87, 0x0, 0xcf, + 0x0, 0x23, 0xf8, 0x2f, 0xbb, 0xf6, 0x8c, 0x38, + 0x1, 0xe0, 0x77, 0xbb, 0xf5, 0xa0, 0x7, 0xe2, + 0xf2, 0x89, 0x94, 0x16, 0x10, 0x7, 0xe4, 0x0, + 0xff, 0xe, 0x1b, 0x30, 0xf0, 0x80, 0x3f, 0xf9, + 0x23, 0x9b, 0xac, 0x10, 0xf, 0xfe, 0x61, 0x10, + 0x3, 0xff, 0xa9, 0x7c, 0x29, 0xee, 0x1, 0xff, + 0xca, 0x13, 0x7, 0x10, 0xc, 0x20, 0x1f, 0xfc, + 0x6a, 0xd1, 0x3e, 0x70, 0x0, 0xec, 0x3b, 0xff, + 0xf3, 0x23, 0x40, + + /* U+F01C "" */ + 0x0, 0xf1, 0x5f, 0xff, 0xff, 0xf, 0xa0, 0x3, + 0xff, 0x80, 0x38, 0x80, 0x1f, 0xfc, 0x31, 0x78, + 0x0, 0xff, 0xac, 0x40, 0x3f, 0xf8, 0xce, 0x60, + 0x1f, 0xca, 0xa0, 0x1, 0x3b, 0xff, 0xf0, 0x58, + 0x2, 0xe0, 0xf, 0xc3, 0x60, 0x17, 0x44, 0x7f, + 0xf0, 0x65, 0x0, 0x5, 0x0, 0x1f, 0x58, 0x80, + 0x1c, 0xc0, 0x3f, 0xf8, 0x54, 0x20, 0x7, 0x30, + 0xe, 0x55, 0x0, 0xa, 0x0, 0x3f, 0xf8, 0x63, + 0x60, 0x17, 0x0, 0x61, 0xb0, 0xb, 0x80, 0x3f, + 0xf8, 0xaa, 0x80, 0x2, 0x80, 0xa, 0xc4, 0x0, + 0xe6, 0x1, 0xff, 0xc6, 0xa1, 0x0, 0x39, 0x2, + 0xa8, 0x0, 0x50, 0x1, 0xff, 0xc7, 0x1b, 0x0, + 0xbc, 0x20, 0x2, 0x68, 0x8e, 0x70, 0xf, 0xe4, + 0x88, 0xed, 0x10, 0x1, 0x29, 0x0, 0x48, 0xef, + 0xd0, 0xe0, 0x1f, 0xa9, 0xdf, 0xc2, 0x1, 0x10, + 0x7, 0xfd, 0x20, 0x1f, 0x38, 0x80, 0x7f, 0xbc, + 0x3, 0xfe, 0x17, 0x0, 0xf4, 0x80, 0x7f, 0xf3, + 0x23, 0xff, 0xc2, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfa, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, 0x3, + 0xff, 0x9e, 0x34, 0x60, + + /* U+F021 "" */ + 0x0, 0xff, 0xe6, 0x2c, 0x41, 0x80, 0x3f, 0x92, + 0x77, 0xbf, 0xdd, 0x6e, 0x40, 0x1d, 0xe, 0xe9, + 0x0, 0xf9, 0xb6, 0xd8, 0x84, 0x0, 0x29, 0x1b, + 0x66, 0x1, 0xff, 0xc0, 0x1b, 0x92, 0x0, 0xff, + 0x26, 0x50, 0x80, 0x80, 0x7c, 0x5e, 0x80, 0x1e, + 0x11, 0x0, 0x79, 0x7c, 0xdc, 0x3, 0xc5, 0x82, + 0x1, 0x9a, 0xff, 0xb9, 0xf6, 0x80, 0x18, 0x75, + 0x80, 0x3d, 0xe2, 0x1, 0x1e, 0xca, 0x0, 0x64, + 0xbc, 0x30, 0x8, 0x48, 0x3, 0xa4, 0x80, 0x26, + 0xc2, 0x0, 0xfc, 0x78, 0xe0, 0x1f, 0x89, 0x80, + 0x26, 0x90, 0xf, 0xc2, 0x20, 0x4, 0x38, 0x7, + 0xd6, 0x1, 0x14, 0x80, 0x7e, 0x3e, 0xe7, 0xfb, + 0x98, 0x3, 0xe7, 0x0, 0xa4, 0x3, 0xf9, 0xc0, + 0x30, 0x88, 0x3, 0xc6, 0x20, 0x1, 0x40, 0xf, + 0xfe, 0x50, 0xa1, 0x9a, 0x0, 0x3f, 0xca, 0x86, + 0x7f, 0xe5, 0x2b, 0xcc, 0x30, 0x7, 0xf8, 0x6f, + 0x33, 0xfd, 0x40, 0x1f, 0xfe, 0xca, 0xcc, 0xff, + 0x58, 0x80, 0x7f, 0x9a, 0xf2, 0xc9, 0x4c, 0xff, + 0xc8, 0xa0, 0x1f, 0xe8, 0x43, 0x40, 0xf, 0xfe, + 0x5a, 0x88, 0x0, 0x48, 0x3, 0xc2, 0x20, 0xc, + 0xe0, 0x1f, 0xd0, 0x1, 0x38, 0x7, 0xcd, 0xdf, + 0xee, 0xe1, 0x80, 0x7e, 0xa2, 0x0, 0xac, 0x3, + 0xe7, 0x80, 0x0, 0x88, 0x3, 0xf4, 0xa8, 0x4, + 0xc4, 0x1, 0xf9, 0xec, 0x80, 0x3f, 0x16, 0x30, + 0x4, 0x52, 0x1, 0xc4, 0x20, 0x12, 0x6d, 0x20, + 0x6, 0x4a, 0xd3, 0x0, 0x87, 0xc0, 0x3c, 0xda, + 0x20, 0x19, 0x6f, 0xfb, 0x9f, 0x6a, 0x1, 0x87, + 0x8, 0x3, 0xce, 0x7e, 0xa0, 0x1e, 0x11, 0x0, + 0x79, 0x3c, 0x80, 0x3e, 0x10, 0x1a, 0xc4, 0x0, + 0xff, 0x14, 0xd8, 0x80, 0x7f, 0xf0, 0xe, 0xf6, + 0xc, 0x3, 0x13, 0x5e, 0xb0, 0x7, 0xd2, 0xee, + 0x80, 0xe, 0x27, 0xcf, 0xfd, 0xb2, 0x80, 0x1f, + 0xc0, + + /* U+F026 "" */ + 0x0, 0xff, 0xe6, 0x9d, 0xb0, 0x7, 0xf8, 0xf1, + 0x24, 0x3, 0xf8, 0xf0, 0x3, 0xfe, 0x3c, 0x0, + 0xff, 0x8f, 0x0, 0x38, 0xe2, 0x3d, 0x80, 0x1e, + 0xd7, 0x7f, 0x0, 0x7c, 0x20, 0x1f, 0xff, 0xf0, + 0xf, 0xfe, 0xc3, 0x0, 0x7f, 0xf0, 0x67, 0xff, + 0xce, 0x1, 0xff, 0xc1, 0x87, 0x0, 0xff, 0xe0, + 0xc3, 0x80, 0x7f, 0xf0, 0x61, 0xc0, 0x3f, 0xf8, + 0x30, 0xe0, 0x60, 0x1f, 0xf4, 0x76, 0x0, + + /* U+F027 "" */ + 0x0, 0xff, 0xea, 0x1d, 0xb0, 0x7, 0xff, 0x14, + 0xf5, 0x24, 0x3, 0xff, 0x88, 0x78, 0x20, 0x1f, + 0xfc, 0x53, 0xc0, 0xf, 0xfe, 0x31, 0xe0, 0x7, + 0xff, 0x0, 0xe2, 0x3d, 0x80, 0x1f, 0xfc, 0x1d, + 0x77, 0xf0, 0x7, 0xf0, 0xdc, 0x80, 0x4, 0x3, + 0xff, 0x86, 0xe8, 0xd8, 0x1, 0xff, 0xc5, 0x73, + 0x3, 0x70, 0xf, 0xfe, 0x20, 0xe0, 0x85, 0x0, + 0x7f, 0xf1, 0x90, 0x8, 0x3, 0xff, 0x8c, 0xe0, + 0x40, 0x1f, 0xfc, 0x5b, 0x20, 0x50, 0xf, 0xfe, + 0x23, 0x20, 0x14, 0x0, 0x7f, 0xf1, 0x10, 0x93, + 0x1, 0x80, 0x3f, 0xf8, 0x65, 0xb6, 0x21, 0x3f, + 0xfe, 0x70, 0xf, 0xfe, 0x44, 0x38, 0x7, 0xff, + 0x22, 0x1c, 0x3, 0xff, 0x91, 0xe, 0x1, 0xff, + 0xc8, 0x87, 0x3, 0x0, 0xff, 0xe3, 0x46, 0xe0, + 0x7, 0xc0, + + /* U+F028 "" */ + 0x0, 0xff, 0xe5, 0xc, 0x28, 0x7, 0xff, 0x45, + 0x9e, 0xa8, 0x1, 0xff, 0xd0, 0x40, 0x2, 0xe0, + 0x80, 0x7f, 0xf0, 0xce, 0xd8, 0x3, 0xf1, 0xe9, + 0x1, 0xe8, 0x7, 0xff, 0x8, 0xf1, 0x24, 0x3, + 0xc4, 0x20, 0x58, 0x60, 0x72, 0x1, 0xff, 0xc0, + 0x3c, 0x0, 0xfc, 0x9b, 0xea, 0x3, 0xa2, 0xc, + 0x60, 0x1f, 0xe3, 0xc0, 0xf, 0xe1, 0x1, 0xa6, + 0x1, 0xa0, 0x7, 0x80, 0x7f, 0x1e, 0x0, 0x7f, + 0x96, 0x0, 0x12, 0x80, 0x8a, 0x6, 0x80, 0x71, + 0x1e, 0xc0, 0xf, 0xfe, 0x3, 0xd0, 0x2, 0x80, + 0x10, 0x0, 0xe0, 0xd7, 0x7f, 0x0, 0x7f, 0xe, + 0x50, 0x82, 0xb8, 0xb, 0x1, 0x18, 0x28, 0x8, + 0x7, 0xff, 0xd, 0xcd, 0x70, 0x1, 0x20, 0xa, + 0x0, 0x20, 0x0, 0x80, 0x3f, 0xf8, 0x8e, 0x60, + 0x50, 0x2, 0xa0, 0x60, 0xc, 0x0, 0x38, 0x7, + 0xff, 0x10, 0x70, 0x81, 0x40, 0x1a, 0x0, 0x20, + 0x70, 0x1, 0x0, 0x7f, 0xf1, 0x9c, 0x8, 0x0, + 0x20, 0x1, 0x1, 0x0, 0xff, 0xe4, 0xb8, 0x10, + 0x0, 0x40, 0x2, 0x2, 0x1, 0xff, 0xc7, 0x1c, + 0x20, 0x50, 0x6, 0x80, 0x8, 0x1c, 0x0, 0x40, + 0x1f, 0xfc, 0x47, 0x30, 0x28, 0x1, 0x50, 0x30, + 0x6, 0x0, 0x1c, 0x3, 0xff, 0x88, 0xe6, 0xb8, + 0x0, 0x80, 0x5, 0x0, 0x14, 0x4, 0x98, 0x3, + 0xff, 0x86, 0x39, 0x42, 0xa, 0xc0, 0x2c, 0x6, + 0x40, 0x81, 0x3f, 0xfe, 0x70, 0xf, 0xfe, 0x3, + 0xd0, 0x2, 0x80, 0x12, 0x0, 0xe0, 0xf, 0xd0, + 0xe0, 0x1f, 0xe5, 0x80, 0x4, 0xa0, 0x22, 0x81, + 0xa0, 0x7, 0xf4, 0x38, 0x7, 0xf0, 0x80, 0xd3, + 0x0, 0xd0, 0x3, 0xc0, 0x3f, 0xe8, 0x70, 0xf, + 0xc9, 0xbe, 0xa0, 0x38, 0x20, 0xc6, 0x1, 0xff, + 0xc0, 0x87, 0x3, 0x0, 0xf1, 0x8, 0x16, 0x10, + 0x1c, 0x80, 0x7f, 0xf0, 0xa3, 0xb0, 0x3, 0xf1, + 0xe9, 0x1, 0xe8, 0x7, 0xff, 0x10, 0x40, 0x3f, + 0x90, 0x0, 0xb8, 0x20, 0x1f, 0xfc, 0xe6, 0x7a, + 0xa0, 0x7, 0x80, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x19, + 0xb3, 0x60, 0x3, 0xff, 0x96, 0xd2, 0x64, 0xf4, + 0x1, 0xff, 0xca, 0xb0, 0xc, 0xa2, 0x1, 0xff, + 0xd8, 0x27, 0x0, 0xff, 0x94, 0x3, 0x18, 0x80, + 0x7c, 0x79, 0x12, 0x1, 0xfe, 0x85, 0x0, 0x1f, + 0x0, 0x7c, 0x7a, 0x20, 0xd2, 0x1, 0xfe, 0xae, + 0xe6, 0x10, 0x7, 0x8f, 0x44, 0x2, 0x69, 0x0, + 0xff, 0x8, 0xc0, 0x1e, 0x3d, 0x10, 0xe, 0x69, + 0x0, 0xff, 0x1f, 0xe0, 0x80, 0x47, 0xa2, 0x1, + 0xf3, 0x30, 0x3, 0xf1, 0xe8, 0x9e, 0x88, 0x1e, + 0x88, 0x7, 0xf0, 0x80, 0x7c, 0x7a, 0x20, 0x3, + 0xd4, 0xd1, 0x0, 0xff, 0xe2, 0x96, 0x88, 0x6, + 0x3b, 0x10, 0xf, 0xfe, 0x32, 0x88, 0x7, 0xff, + 0xa9, 0x22, 0x3f, 0xf9, 0x8, 0x1, 0xe3, 0x77, + 0xff, 0xe4, 0x18, 0x4, 0x80, 0x1f, 0xfc, 0xe4, + 0xa4, 0x0, 0xff, 0xe6, 0x25, 0x0, + + /* U+F043 "" */ + 0x0, 0xfc, 0x72, 0xa0, 0x1f, 0xfc, 0x5d, 0x6a, + 0x20, 0xf, 0xfe, 0x1a, 0x8, 0x2, 0x80, 0x3f, + 0xf8, 0x7c, 0x1, 0x30, 0x7, 0xff, 0x8, 0x54, + 0x2, 0x14, 0x0, 0xff, 0xe0, 0xc8, 0x7, 0x40, + 0x7, 0xff, 0x0, 0x5c, 0x3, 0x8d, 0x0, 0x3f, + 0xe9, 0x0, 0xfa, 0x0, 0x3f, 0xc4, 0xe0, 0x1f, + 0x1b, 0x0, 0x7f, 0x70, 0x7, 0xf4, 0x88, 0x7, + 0xce, 0x60, 0x1f, 0xea, 0x0, 0xf1, 0xc0, 0x7, + 0xfc, 0x8e, 0x1, 0xdc, 0x1, 0xff, 0xc1, 0x83, + 0x0, 0x9c, 0x80, 0x3f, 0xf8, 0x50, 0x1, 0x48, + 0x7, 0xff, 0xd, 0xc, 0x18, 0x40, 0x3f, 0xf8, + 0x94, 0x1a, 0x1, 0xff, 0xc5, 0x70, 0x60, 0xf, + 0xfe, 0x28, 0x88, 0x80, 0xb, 0xe4, 0x1, 0xff, + 0xc1, 0x21, 0x0, 0x10, 0x38, 0x7, 0xff, 0x4, + 0x4c, 0x0, 0x81, 0x80, 0x1f, 0xfc, 0x13, 0x40, + 0x1, 0x93, 0x18, 0x7, 0xfc, 0x43, 0xa0, 0x14, + 0x86, 0x30, 0x7, 0xfa, 0x81, 0xc, 0x0, 0x94, + 0x13, 0xfa, 0x60, 0x1e, 0x16, 0x0, 0x70, 0x4, + 0xba, 0xc2, 0x4e, 0x1, 0xeb, 0x10, 0x1, 0x50, + 0x4, 0x53, 0xde, 0x80, 0x1c, 0xea, 0x1, 0x96, + 0xc4, 0x3, 0xfd, 0x30, 0x1, 0xe4, 0xf7, 0x0, + 0xf9, 0x75, 0x80, 0x3f, 0xc, 0x7d, 0xcc, 0x4d, + 0xfd, 0x10, 0x7, 0x0, + + /* U+F048 "" */ + 0x48, 0x88, 0x3, 0xfe, 0x77, 0x7, 0xbb, 0xc6, + 0x1, 0xfd, 0x71, 0x9, 0x0, 0xff, 0xe0, 0xe, + 0x20, 0x1, 0x40, 0x3f, 0xe1, 0xc3, 0x0, 0xff, + 0xe1, 0x17, 0x90, 0x7, 0xff, 0x8, 0xf0, 0x40, + 0x3f, 0xf8, 0x49, 0x82, 0x1, 0xff, 0xc2, 0x5b, + 0x0, 0xff, 0xe1, 0xb5, 0x0, 0x7f, 0xf0, 0xde, + 0x40, 0x3f, 0xf8, 0x71, 0x0, 0xf, 0xfe, 0x22, + 0x0, 0x7f, 0xfe, 0xe8, 0x80, 0x3f, 0xf8, 0x8d, + 0x86, 0x1, 0xff, 0xc4, 0x1c, 0x40, 0xf, 0xfe, + 0x2d, 0xa8, 0x7, 0xff, 0x16, 0x98, 0x3, 0xff, + 0x8b, 0x2e, 0x1, 0xff, 0xc5, 0x89, 0x0, 0xff, + 0xe2, 0xb5, 0x0, 0x7f, 0xf1, 0x56, 0xc0, 0x27, + 0x20, 0x0, 0x88, 0x3, 0xf2, 0x61, 0x12, 0x27, + 0xfd, 0xc4, 0x1, 0xfc, 0x7b, 0xa3, + + /* U+F04B "" */ + 0x3, 0x75, 0x0, 0xff, 0xe4, 0xbe, 0x45, 0x61, + 0x80, 0x7f, 0xf1, 0xe4, 0x2, 0x3c, 0x91, 0x0, + 0xff, 0xe2, 0x88, 0x7, 0x37, 0xb0, 0x7, 0xff, + 0x2c, 0x67, 0x4c, 0x3, 0xff, 0x96, 0x59, 0x42, + 0x1, 0xff, 0xcb, 0x5e, 0x70, 0xf, 0xfe, 0x64, + 0x6a, 0x0, 0x7f, 0xf2, 0xca, 0xec, 0x40, 0x1f, + 0xfc, 0xb4, 0xd8, 0x0, 0xff, 0xe6, 0x3f, 0x28, + 0x7, 0xff, 0x2c, 0x6a, 0xc8, 0x3, 0xff, 0x96, + 0x9a, 0xe0, 0x1f, 0xfc, 0xc8, 0x40, 0xf, 0xfe, + 0x61, 0x80, 0x7f, 0xf3, 0xc, 0x3, 0xff, 0x97, + 0x8, 0x1, 0xff, 0xc9, 0x4d, 0x70, 0xf, 0xfe, + 0x40, 0xd5, 0x90, 0x7, 0xff, 0x21, 0xf9, 0x40, + 0x3f, 0xf9, 0x9, 0xb0, 0x1, 0xff, 0xc8, 0x2b, + 0xb1, 0x0, 0x7f, 0xf2, 0x23, 0x50, 0x3, 0xff, + 0x90, 0xbc, 0xe0, 0x1f, 0xfc, 0x82, 0xca, 0x10, + 0xf, 0xfe, 0x38, 0xce, 0x98, 0x7, 0xff, 0x8, + 0x40, 0x39, 0xbd, 0x80, 0x3f, 0xf8, 0x90, 0x1, + 0x1e, 0x48, 0x80, 0x7f, 0xf1, 0x5b, 0x22, 0xf0, + 0xc0, 0x3f, 0xf8, 0xe0, + + /* U+F04C "" */ + 0x1a, 0xef, 0xfe, 0xd5, 0x0, 0xc3, 0x5d, 0xff, + 0xda, 0xa1, 0x6a, 0x20, 0x1c, 0x54, 0x40, 0x15, + 0xa8, 0x80, 0x71, 0x51, 0x28, 0x7, 0xf2, 0x80, + 0x4a, 0x1, 0xfc, 0xa0, 0x1f, 0xef, 0x0, 0xff, + 0xe0, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xc0, 0x3f, 0xfe, 0x1e, 0x1, 0xff, 0xc1, + 0xf1, 0x0, 0xfe, 0x10, 0x8, 0x40, 0x3f, 0x86, + 0x0, 0x3f, 0x13, 0x0, 0x50, 0x1, 0xf8, 0x99, + 0x96, 0xec, 0xd9, 0xe3, 0x0, 0x33, 0x5b, 0xb3, + 0x67, 0x8c, 0x0, + + /* U+F04D "" */ + 0x3, 0x88, 0xff, 0xe4, 0x30, 0x1, 0xb1, 0xdf, + 0xff, 0x91, 0x3a, 0x10, 0x1, 0xff, 0xca, 0x26, + 0x10, 0xf, 0xfe, 0x58, 0x80, 0x7f, 0xf3, 0x3c, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xef, 0x50, 0xf, 0xfe, 0x5a, 0xda, + 0x88, 0x7, 0xff, 0x1c, 0xa8, 0x80, + + /* U+F051 "" */ + 0x5, 0x81, 0x0, 0xff, 0x34, 0x41, 0xd6, 0x9f, + 0xc8, 0x3, 0xfa, 0x1d, 0xd0, 0x40, 0x1, 0xc3, + 0x0, 0xfc, 0x20, 0x17, 0x80, 0x43, 0x88, 0x1, + 0xff, 0xc5, 0xb5, 0x0, 0xff, 0xe2, 0xd3, 0x0, + 0x7f, 0xf1, 0x66, 0x0, 0x3f, 0xf8, 0xaf, 0x20, + 0x1f, 0xfc, 0x56, 0xa0, 0xf, 0xfe, 0x2a, 0xd8, + 0x7, 0xff, 0x15, 0x30, 0x3, 0xff, 0x8a, 0x60, + 0x1f, 0xff, 0xa1, 0xc0, 0xf, 0xfe, 0x18, 0xe1, + 0x80, 0x7f, 0xf0, 0x8b, 0x8, 0x3, 0xff, 0x84, + 0x58, 0x40, 0x1f, 0xfc, 0x23, 0xc1, 0x0, 0xff, + 0xe1, 0x26, 0x8, 0x7, 0xff, 0x9, 0x6c, 0x3, + 0xff, 0x86, 0xd4, 0x1, 0xff, 0x78, 0x4, 0xf2, + 0x1, 0xff, 0xc0, 0x63, 0x9, 0x80, 0xf, 0xe3, + 0x0, 0x10, 0xe7, 0xb0, 0x7, 0xfb, 0x3f, 0xda, + + /* U+F052 "" */ + 0x0, 0xff, 0x86, 0x69, 0x40, 0x3f, 0xf9, 0x23, + 0xec, 0xb5, 0x0, 0x1f, 0xfc, 0x71, 0xc1, 0x0, + 0x9d, 0x80, 0x3f, 0xf8, 0xda, 0x40, 0x1d, 0x2a, + 0x1, 0xff, 0xc4, 0xb3, 0x0, 0xfa, 0x90, 0x3, + 0xff, 0x85, 0x48, 0x1, 0xfd, 0x66, 0x1, 0xff, + 0xc0, 0x95, 0x0, 0xff, 0xb4, 0x80, 0x3f, 0xd0, + 0xc0, 0x1f, 0xfc, 0x1, 0xc1, 0x0, 0xfc, 0xce, + 0x1, 0xff, 0xc2, 0x1c, 0x10, 0xf, 0x2c, 0x80, + 0x7f, 0xf1, 0xb, 0x40, 0x39, 0x28, 0x3, 0xff, + 0x8c, 0x76, 0x1, 0x1d, 0x80, 0x7f, 0xf2, 0x12, + 0x80, 0x1e, 0x1, 0xff, 0xca, 0x55, 0x1, 0x80, + 0x7f, 0xf2, 0xc8, 0x14, 0x3, 0xff, 0x96, 0x81, + 0x68, 0x1, 0xff, 0xc8, 0x19, 0x30, 0x1b, 0xff, + 0xff, 0xe4, 0x73, 0x0, 0x7f, 0xf4, 0x1b, 0xff, + 0xff, 0x95, 0xa2, 0x12, 0x1, 0xff, 0xca, 0x26, + 0x0, 0xff, 0xe6, 0xf8, 0x7, 0xff, 0xa4, 0x40, + 0x3f, 0xf9, 0x7c, 0x16, 0x20, 0x1f, 0xfc, 0x94, + 0x60, + + /* U+F053 "" */ + 0x0, 0xff, 0x8e, 0x4c, 0x3, 0xff, 0x80, 0x98, + 0xd8, 0x60, 0x1f, 0xe4, 0xb0, 0xb, 0x40, 0x3f, + 0x92, 0xc0, 0x31, 0x0, 0x7e, 0x4b, 0x0, 0xc5, + 0xa0, 0x1f, 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, + 0x58, 0x6, 0x2c, 0x10, 0xf, 0x25, 0x80, 0x62, + 0xc1, 0x0, 0xf2, 0x58, 0x6, 0x2c, 0x10, 0xf, + 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, 0x58, 0x6, + 0x2c, 0x10, 0xf, 0x1d, 0x80, 0x62, 0xc1, 0x0, + 0xf9, 0x0, 0x3a, 0x84, 0x3, 0xf3, 0xa0, 0x6, + 0x86, 0x0, 0xfe, 0xb4, 0x0, 0xd2, 0xc0, 0x1f, + 0xd6, 0x80, 0x1a, 0x58, 0x3, 0xfa, 0xd0, 0x3, + 0x4b, 0x0, 0x7f, 0x5a, 0x0, 0x69, 0x60, 0xf, + 0xeb, 0x30, 0xd, 0x2c, 0x1, 0xfd, 0x86, 0x1, + 0xa5, 0x80, 0x3f, 0xb0, 0xc0, 0x34, 0xb0, 0x7, + 0xf6, 0x18, 0x6, 0x90, 0xf, 0xf6, 0x18, 0x4, + 0xa0, 0x1f, 0xf6, 0x20, 0x2d, 0x0, 0x7f, 0xf0, + 0x2f, 0x68, 0x0, + + /* U+F054 "" */ + 0x0, 0x3c, 0x0, 0x7f, 0xf0, 0x6a, 0x1e, 0xc0, + 0x3f, 0xe6, 0x50, 0x2, 0x58, 0x7, 0xf8, 0x80, + 0x32, 0x58, 0x7, 0xf2, 0x40, 0x6, 0x4b, 0x0, + 0xfe, 0x78, 0x0, 0xc9, 0x60, 0x1f, 0xcf, 0x0, + 0x19, 0x2c, 0x3, 0xf9, 0xe0, 0x3, 0x25, 0x80, + 0x7f, 0x3c, 0x0, 0x64, 0xb0, 0xf, 0xe7, 0x80, + 0xc, 0x96, 0x1, 0xfc, 0xf0, 0x1, 0x92, 0xc0, + 0x3f, 0x9e, 0x0, 0x32, 0x50, 0x7, 0xf3, 0x8, + 0x6, 0x50, 0xf, 0xc3, 0xa2, 0x1, 0xa8, 0x3, + 0xe1, 0xd3, 0x0, 0xd4, 0xa0, 0x1e, 0x1d, 0x30, + 0xd, 0x4a, 0x1, 0xe1, 0xd3, 0x0, 0xd4, 0xa0, + 0x1e, 0x1d, 0x30, 0xd, 0x4a, 0x1, 0xe1, 0xd3, + 0x0, 0xd4, 0xa0, 0x1e, 0x1c, 0x30, 0xd, 0x4a, + 0x1, 0xe1, 0xc2, 0x0, 0xd4, 0xa0, 0x1f, 0x31, + 0x0, 0x6a, 0x50, 0xf, 0xca, 0x1, 0xa9, 0x40, + 0x3f, 0x8b, 0x0, 0x14, 0xa0, 0x1f, 0xf1, 0xf7, + 0x14, 0x3, 0xfe, + + /* U+F067 "" */ + 0x0, 0xff, 0x2d, 0x52, 0x4, 0x3, 0xff, 0x8e, + 0x74, 0xaa, 0x7a, 0x0, 0xff, 0xe3, 0xb0, 0x6, + 0x60, 0xf, 0xfe, 0x39, 0x80, 0x63, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xcd, 0xff, + 0xfa, 0x40, 0x30, 0xff, 0xfe, 0xc1, 0x90, 0xf, + 0xfe, 0x51, 0xb0, 0x7, 0xff, 0x33, 0xc0, 0x3f, + 0xf9, 0x9e, 0xc0, 0x1f, 0xfc, 0xa1, 0x59, 0xdc, + 0xcf, 0x9c, 0x3, 0xe, 0x67, 0xef, 0x20, 0x23, + 0x3f, 0xb8, 0x3, 0x8c, 0xff, 0x8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xfe, 0x1, 0xfe, 0x20, 0xc, + 0x40, 0x1f, 0xfc, 0x74, 0x72, 0x21, 0xf8, 0x7, + 0xf8, + + /* U+F068 "" */ + 0x1, 0x22, 0xff, 0xe4, 0x8, 0x2, 0x3b, 0x77, + 0xff, 0x91, 0xdc, 0x17, 0x0, 0xff, 0xe5, 0xb, + 0x0, 0x7f, 0xf3, 0x3c, 0x3, 0xff, 0x99, 0xf0, + 0x1, 0xff, 0xca, 0x16, 0x7e, 0xdd, 0xff, 0xe4, + 0x77, 0x4, + + /* U+F06E "" */ + 0x0, 0xff, 0x13, 0x56, 0xf7, 0xfb, 0xb2, 0x54, + 0x3, 0xff, 0x8e, 0xb9, 0xb2, 0xa4, 0x20, 0x1, + 0x36, 0xaf, 0xa2, 0x0, 0xff, 0xe1, 0x1e, 0x51, + 0x80, 0x64, 0x54, 0x20, 0xc, 0xbb, 0x22, 0x1, + 0xff, 0x46, 0x18, 0x4, 0x55, 0xf7, 0x57, 0xbc, + 0xe0, 0x19, 0xbd, 0x0, 0x3f, 0xad, 0xc0, 0x32, + 0xea, 0x80, 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, + 0x1f, 0x62, 0x0, 0x64, 0xa0, 0x8, 0xe6, 0x4a, + 0x0, 0x3c, 0x10, 0xd, 0x2e, 0x1, 0xd4, 0x60, + 0x18, 0x6c, 0x3, 0x99, 0x95, 0xa4, 0x5, 0x60, + 0x1d, 0xa, 0x1, 0x3a, 0x80, 0x74, 0x80, 0x7f, + 0x16, 0x8, 0x29, 0x0, 0x75, 0x10, 0x14, 0x0, + 0x79, 0x40, 0x3a, 0x40, 0x30, 0xc8, 0x1, 0x40, + 0x3d, 0xc1, 0x20, 0x1f, 0x10, 0x24, 0x35, 0xa8, + 0x7, 0x28, 0x3, 0x40, 0x3c, 0x6a, 0x80, 0x1e, + 0x10, 0x1, 0xbc, 0xa0, 0x7, 0x88, 0x0, 0x20, + 0x1f, 0x62, 0x0, 0x78, 0x40, 0x2, 0x1, 0xfc, + 0x20, 0x1, 0x0, 0xfb, 0x28, 0x3, 0xe2, 0x7, + 0x0, 0xfe, 0x70, 0x6, 0x80, 0x78, 0xd4, 0x64, + 0x3, 0xca, 0x2, 0xe0, 0x1f, 0xac, 0x0, 0xa0, + 0x1e, 0xe0, 0x3, 0x28, 0x7, 0x48, 0x2, 0x14, + 0x3, 0xd6, 0x40, 0xa4, 0x1, 0xd4, 0x40, 0x15, + 0x20, 0x6, 0x1b, 0x0, 0x55, 0xa9, 0x1b, 0xf2, + 0x1, 0x58, 0x7, 0x42, 0x80, 0x75, 0xa0, 0x6, + 0x4a, 0x0, 0x25, 0x6e, 0x40, 0x81, 0xe0, 0x80, + 0x69, 0x70, 0xf, 0xae, 0x0, 0x32, 0xea, 0x80, + 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, 0x1f, 0xcf, + 0x86, 0x1, 0x15, 0x7d, 0xd5, 0x33, 0x9c, 0x3, + 0x37, 0xa0, 0x7, 0xfc, 0x79, 0x66, 0x1, 0x91, + 0x54, 0x60, 0x19, 0x76, 0x44, 0x3, 0xff, 0x84, + 0x99, 0xb2, 0xa4, 0x1, 0x9, 0xb5, 0x7d, 0x10, + 0x7, 0xe0, + + /* U+F070 "" */ + 0x4, 0x40, 0x7, 0xff, 0x51, 0x2e, 0xd0, 0x1, + 0xff, 0xd3, 0xa0, 0x3, 0xe0, 0x80, 0x7f, 0xf4, + 0x58, 0x2, 0x3f, 0x30, 0xf, 0xfe, 0x84, 0x50, + 0x4, 0x38, 0xe0, 0x18, 0x9a, 0xb7, 0xfd, 0xdb, + 0x6e, 0x60, 0x1f, 0xfc, 0x15, 0xd2, 0x0, 0xa2, + 0x85, 0xb7, 0x52, 0xa4, 0x0, 0x12, 0x48, 0xcd, + 0x70, 0xf, 0xfe, 0x1, 0x6a, 0x80, 0x4b, 0xd2, + 0x40, 0x19, 0x15, 0x4, 0x2, 0x28, 0xe6, 0x0, + 0xff, 0xe0, 0x54, 0x0, 0x7c, 0x75, 0xf7, 0x57, + 0xd8, 0x80, 0x10, 0xcd, 0x88, 0x7, 0xfc, 0xf8, + 0x20, 0x18, 0xb1, 0x40, 0x38, 0xee, 0x0, 0x32, + 0x79, 0x0, 0x7f, 0xc7, 0xe8, 0x1, 0x16, 0x8, + 0x35, 0xd2, 0x80, 0x1e, 0x0, 0x30, 0xe1, 0x0, + 0x7f, 0xc3, 0x6e, 0x1, 0x1f, 0xa0, 0xa2, 0xd6, + 0x8, 0x3a, 0x0, 0x61, 0xf1, 0x0, 0xf5, 0x69, + 0x0, 0x51, 0x60, 0x10, 0xdd, 0x80, 0x23, 0xd0, + 0x4, 0x0, 0x71, 0x50, 0x7, 0x2a, 0x8b, 0x54, + 0x2, 0x4d, 0x20, 0x8, 0xc0, 0x31, 0xa8, 0x18, + 0x80, 0x72, 0x28, 0x6, 0xb0, 0xa, 0xa4, 0x2, + 0x2d, 0x50, 0xf, 0xde, 0x0, 0x50, 0xf, 0x58, + 0x4, 0x42, 0x1, 0x9b, 0x8, 0x2, 0xa9, 0x0, + 0xf8, 0x40, 0x2, 0x1, 0xe1, 0x20, 0x1, 0x8, + 0x7, 0x1f, 0x0, 0x66, 0xc1, 0x0, 0xe1, 0x0, + 0x30, 0x7, 0x84, 0x80, 0x2b, 0x0, 0xf1, 0x80, + 0x71, 0xfa, 0x0, 0x67, 0x20, 0x20, 0xf, 0x58, + 0x6, 0x54, 0x0, 0xf2, 0x0, 0x70, 0xdc, 0x0, + 0x45, 0xb0, 0x20, 0x1c, 0xca, 0x1, 0xd6, 0x40, + 0x1d, 0x0, 0x1f, 0x3d, 0x88, 0x4, 0xe0, 0x1c, + 0x72, 0x1, 0xf7, 0x88, 0x6, 0x38, 0x0, 0xf9, + 0x3c, 0xc0, 0x3e, 0x1d, 0x0, 0xfc, 0x58, 0x40, + 0x19, 0xdc, 0x1, 0xf0, 0xe3, 0x0, 0x70, 0xe0, + 0x80, 0x7f, 0x16, 0x20, 0x6, 0x8c, 0x40, 0xf, + 0xa6, 0x80, 0x30, 0xa0, 0x7, 0xfc, 0x37, 0x22, + 0x1, 0x1d, 0xf5, 0xd5, 0xa8, 0x4, 0xba, 0x40, + 0x14, 0xd0, 0x7, 0xff, 0x1, 0xba, 0x8, 0x2, + 0x14, 0x54, 0xa8, 0x0, 0x8b, 0x54, 0x2, 0x5d, + 0x20, 0xf, 0xfe, 0x3, 0xee, 0x42, 0x10, 0x80, + 0x8, 0xd0, 0x3, 0x54, 0x0, 0x45, 0xaa, 0x1, + 0xff, 0xc1, 0x37, 0xbd, 0xef, 0xf6, 0xda, 0x0, + 0x73, 0xe0, 0x80, 0x55, 0x0, 0x1f, 0xfd, 0x3, + 0xf3, 0x0, 0x98, 0x3, 0xff, 0xa2, 0x38, 0xe0, + 0xa, 0x0, 0xff, 0xe9, 0xc5, 0xd9, 0x0, + + /* U+F071 "" */ + 0x0, 0xff, 0xe1, 0xa4, 0x38, 0x80, 0x7f, 0xf4, + 0x16, 0xde, 0x30, 0x3, 0xff, 0x9e, 0x36, 0x1, + 0x13, 0x80, 0x7f, 0xf3, 0xa4, 0x40, 0x34, 0x8, + 0x7, 0xff, 0x30, 0x9c, 0x3, 0xd6, 0x1, 0xff, + 0xcc, 0x90, 0xf, 0x94, 0xc0, 0x3f, 0xf9, 0x48, + 0x80, 0xf, 0xde, 0x1, 0xff, 0xca, 0x90, 0xf, + 0xe3, 0x50, 0xf, 0xfe, 0x43, 0x10, 0x7, 0xfa, + 0xc0, 0x3f, 0xf8, 0xe3, 0x0, 0x1f, 0xf0, 0xc0, + 0x7, 0xff, 0x1a, 0x4, 0x2, 0x7f, 0xfb, 0x84, + 0x2, 0x71, 0x0, 0xff, 0xe2, 0x13, 0x0, 0x6e, + 0x0, 0x84, 0x3, 0xac, 0x3, 0xff, 0x89, 0x20, + 0x1c, 0x20, 0x18, 0x40, 0x32, 0x98, 0x7, 0xff, + 0x9, 0x10, 0x1, 0xde, 0x1, 0xfe, 0xf0, 0xf, + 0xfe, 0x14, 0x80, 0x7f, 0xf1, 0x4d, 0x40, 0x3f, + 0xf8, 0xe, 0x40, 0x1e, 0x10, 0x8, 0x40, 0x3e, + 0xb0, 0xf, 0xf8, 0x60, 0x3, 0xe3, 0x0, 0x8c, + 0x3, 0xe1, 0x80, 0xf, 0xf4, 0x0, 0x7e, 0x10, + 0x8, 0x40, 0x3f, 0x38, 0x80, 0x7e, 0x26, 0x0, + 0xfc, 0xc2, 0x0, 0x50, 0xf, 0xeb, 0x0, 0xfd, + 0x20, 0x1f, 0xc5, 0xdf, 0xe9, 0x0, 0xfe, 0x53, + 0x0, 0xf2, 0xa0, 0x7, 0xfa, 0xbf, 0x90, 0x3, + 0xfd, 0xe0, 0x1e, 0x80, 0xf, 0xf4, 0x28, 0xd, + 0x88, 0x7, 0xf1, 0xb0, 0x6, 0x72, 0x0, 0xff, + 0x18, 0x6, 0x20, 0xf, 0xf4, 0x0, 0x43, 0x0, + 0x1f, 0xf6, 0x0, 0x42, 0x60, 0x1f, 0xe1, 0x80, + 0x4, 0x0, 0x7f, 0xf0, 0x1d, 0x84, 0xf4, 0x3, + 0xff, 0x80, 0xe2, 0xc, 0x1, 0xff, 0xc1, 0x9e, + 0xc3, 0x0, 0xff, 0xe0, 0xb0, 0x8, 0x7, 0xff, + 0x48, 0x42, 0x40, 0x3f, 0xfa, 0x22, 0xc0, 0xf6, + 0xec, 0xdf, 0xfc, 0xd7, 0x8f, 0x0, + + /* U+F074 "" */ + 0x0, 0xff, 0xe4, 0xb5, 0x10, 0x7, 0xff, 0x36, + 0x57, 0xc, 0x3, 0xff, 0x9c, 0x3a, 0x60, 0x2, + 0x44, 0xe3, 0x0, 0xff, 0x12, 0x24, 0x1, 0xe, + 0x98, 0x6d, 0xdf, 0x65, 0x80, 0x7e, 0x3d, 0xbb, + 0x80, 0x30, 0xe9, 0x80, 0x7c, 0x94, 0x1, 0xe3, + 0xc0, 0xf, 0xe1, 0xd0, 0xf, 0xcb, 0x20, 0x18, + 0xb4, 0x3, 0xfe, 0x30, 0xf, 0xe6, 0x80, 0x0, + 0xe0, 0x80, 0x7f, 0x8b, 0x3b, 0x77, 0x48, 0x6, + 0x20, 0x1c, 0x10, 0x8, 0xb7, 0x40, 0x18, 0xb0, + 0x44, 0x45, 0x9a, 0x0, 0x9, 0x43, 0x84, 0x1, + 0x16, 0x11, 0x0, 0x22, 0xc1, 0x0, 0xf9, 0xdc, + 0x76, 0x1a, 0x40, 0x10, 0xf8, 0x80, 0x4, 0xb, + 0x4, 0x3, 0xfa, 0x30, 0x2c, 0xc0, 0x21, 0xc2, + 0x0, 0xa9, 0xf0, 0x40, 0x3f, 0xf8, 0x14, 0x80, + 0x1b, 0x48, 0x3, 0x24, 0x8, 0x7, 0xff, 0x2, + 0x54, 0x3, 0x59, 0x80, 0x72, 0x40, 0x80, 0x7f, + 0xd0, 0xc0, 0x1a, 0x91, 0x78, 0x80, 0x2a, 0x7f, + 0x20, 0xf, 0xe7, 0x70, 0x6, 0x95, 0x4a, 0x1f, + 0x10, 0x0, 0x80, 0xe1, 0x0, 0x4, 0x8b, 0x34, + 0x0, 0x68, 0x63, 0xb0, 0x1, 0x61, 0x10, 0x2, + 0x1c, 0x20, 0xed, 0xdd, 0x20, 0x19, 0xdc, 0x4, + 0x20, 0x11, 0x6e, 0x80, 0x30, 0xe1, 0x0, 0x7f, + 0x34, 0x0, 0x7, 0x4, 0x3, 0xfc, 0x3e, 0x1, + 0xf9, 0x64, 0x3, 0x16, 0x80, 0x7f, 0xf1, 0xd2, + 0x80, 0x3c, 0x78, 0x1, 0xfc, 0x3f, 0xb7, 0x7d, + 0x96, 0x1, 0xf8, 0xf6, 0xee, 0x0, 0xc3, 0x84, + 0x44, 0x4e, 0x30, 0xf, 0xf1, 0x22, 0x40, 0x10, + 0xe9, 0x0, 0x7f, 0xf3, 0x7, 0x4c, 0x3, 0xff, + 0x97, 0x2b, 0x86, 0x1, 0x0, + + /* U+F077 "" */ + 0x0, 0xff, 0x9e, 0xc8, 0x3, 0xff, 0x93, 0x10, + 0x4c, 0x20, 0xf, 0xfe, 0x3c, 0x38, 0x0, 0x70, + 0x80, 0x3f, 0xf8, 0xb0, 0xe0, 0x18, 0x70, 0x80, + 0x3f, 0xf8, 0x70, 0xe0, 0x1e, 0x1c, 0x20, 0xf, + 0xfe, 0xc, 0x38, 0x7, 0xe1, 0xc2, 0x0, 0xff, + 0xa1, 0xc0, 0x32, 0xe0, 0x6, 0x1c, 0x20, 0xf, + 0xe8, 0x70, 0xc, 0xb4, 0x78, 0x1, 0x87, 0x8, + 0x3, 0xe8, 0x70, 0xc, 0xb4, 0x0, 0x3c, 0x0, + 0xc3, 0x84, 0x1, 0xd0, 0xe0, 0x19, 0x68, 0x3, + 0x1e, 0x0, 0x61, 0xc2, 0x0, 0xa1, 0xc0, 0x32, + 0xd0, 0x7, 0x8f, 0x0, 0x30, 0xe1, 0x3, 0x38, + 0x6, 0x5a, 0x0, 0xfc, 0x78, 0x1, 0x87, 0x3, + 0xc0, 0x32, 0xd0, 0x7, 0xf8, 0xf0, 0x3, 0x8, + 0xa0, 0x80, 0xb, 0x40, 0x1f, 0xfc, 0x3, 0xc0, + 0xa, 0x44, 0x58, 0xaf, 0x40, 0x1f, 0xfc, 0x23, + 0xc4, 0xa6, 0x0, + + /* U+F078 "" */ + 0x1, 0xa8, 0x0, 0xff, 0xe2, 0x1d, 0xb0, 0x0, + 0x71, 0x5e, 0x80, 0x3f, 0xf8, 0x47, 0x89, 0x2c, + 0x10, 0x40, 0x5, 0xa0, 0xf, 0xfe, 0x1, 0xe0, + 0x5, 0x23, 0xe0, 0x19, 0x68, 0x3, 0xfc, 0x78, + 0x1, 0x88, 0x59, 0xc0, 0x32, 0xd0, 0x7, 0xe3, + 0xc0, 0xc, 0x3e, 0x0, 0x87, 0x0, 0xcb, 0x40, + 0x1e, 0x3c, 0x0, 0xc3, 0x84, 0x1, 0x43, 0x80, + 0x65, 0xa0, 0xc, 0x78, 0x1, 0x87, 0x8, 0x3, + 0xa1, 0xc0, 0x32, 0xd0, 0x0, 0xf0, 0x3, 0xe, + 0x10, 0x7, 0xd0, 0xe0, 0x19, 0x68, 0xf0, 0x3, + 0xe, 0x10, 0x7, 0xf4, 0x38, 0x6, 0x5c, 0x0, + 0xc3, 0x84, 0x1, 0xff, 0x43, 0x80, 0x7e, 0x1c, + 0x20, 0xf, 0xfe, 0xc, 0x38, 0x7, 0x87, 0x8, + 0x3, 0xff, 0x87, 0xe, 0x1, 0x87, 0x8, 0x3, + 0xff, 0x8b, 0xe, 0x0, 0x1c, 0x20, 0xf, 0xfe, + 0x3c, 0x4a, 0xe1, 0x0, 0x7f, 0x80, + + /* U+F079 "" */ + 0x0, 0xf2, 0x10, 0x7, 0xff, 0x52, 0x6f, 0x50, + 0x3, 0xff, 0xa5, 0x2c, 0x0, 0xb4, 0x0, 0xca, + 0xef, 0xff, 0xc1, 0x60, 0xf, 0xe9, 0x60, 0xd, + 0x68, 0x0, 0x4a, 0x88, 0xff, 0xe0, 0xcb, 0x80, + 0x7d, 0x2c, 0x1, 0xeb, 0x40, 0x60, 0xf, 0xfe, + 0x1f, 0x0, 0x7a, 0x58, 0x3, 0xf5, 0xa1, 0x58, + 0x7, 0xff, 0x22, 0x58, 0x3, 0xc2, 0x1, 0x5a, + 0x23, 0xff, 0xfe, 0x10, 0xf, 0xcc, 0x1, 0x58, + 0x80, 0x1d, 0x80, 0x2d, 0x0, 0xff, 0xe4, 0xc0, + 0x2, 0x90, 0x3, 0x4a, 0x80, 0xd8, 0x7, 0xff, + 0x25, 0xf3, 0x54, 0x3, 0xd5, 0x7e, 0x40, 0x1f, + 0xfc, 0xa3, 0x20, 0xf, 0xc8, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xfe, 0xd0, 0xcc, 0x0, 0x7c, 0x54, + 0xe0, 0x1f, 0xfc, 0xad, 0x67, 0xa0, 0xe, 0x2c, + 0x58, 0x60, 0xf, 0xfe, 0x49, 0x0, 0x16, 0x40, + 0x23, 0xf1, 0x0, 0x78, 0x7, 0xe5, 0x77, 0xff, + 0x18, 0x50, 0x4, 0xc2, 0x0, 0x52, 0x0, 0x1c, + 0x0, 0x7e, 0x38, 0x8f, 0xf6, 0x2a, 0x58, 0x7, + 0xf1, 0xe8, 0x80, 0x7f, 0xf2, 0x28, 0x12, 0xc0, + 0x3e, 0x3d, 0x10, 0xf, 0x38, 0x7, 0xff, 0x9, + 0x40, 0x9, 0x80, 0x1c, 0x7a, 0x20, 0x1f, 0x4f, + 0xff, 0xff, 0xa, 0x80, 0x23, 0xc0, 0x8, 0xf4, + 0x40, 0x3f, 0xfa, 0x7, 0x84, 0x98, 0x20, 0x18, + + /* U+F07B "" */ + 0x1b, 0xff, 0xfe, 0xc1, 0x0, 0xff, 0xe1, 0xd2, + 0x0, 0x7f, 0x1e, 0x88, 0x7, 0xff, 0x9, 0x0, + 0x3f, 0xe3, 0xd1, 0x0, 0xff, 0xe7, 0x1e, 0x44, + 0x7f, 0x9c, 0xc0, 0x3f, 0xf8, 0x64, 0xef, 0xfe, + 0x8c, 0x50, 0xf, 0xfe, 0x7d, 0x80, 0x7f, 0xf3, + 0xc4, 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfb, + 0x8, 0x1, 0xff, 0xce, 0x4a, 0x40, 0xf, 0xfe, + 0x62, 0x50, + + /* U+F093 "" */ + 0x0, 0xff, 0xe0, 0x98, 0x80, 0x7f, 0xf3, 0x5f, + 0x3c, 0x80, 0x3f, 0xf9, 0x6f, 0x0, 0x38, 0x40, + 0x1f, 0xfc, 0x97, 0x80, 0x8, 0x70, 0x80, 0x3f, + 0xf8, 0xef, 0x0, 0x1c, 0x38, 0x40, 0x1f, 0xfc, + 0x57, 0x80, 0xf, 0x87, 0x8, 0x3, 0xff, 0x86, + 0xf0, 0x1, 0xfc, 0x38, 0x40, 0x1f, 0xfc, 0x17, + 0x80, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xe7, 0x80, + 0xf, 0xfe, 0x8, 0xe1, 0x0, 0x7f, 0x2c, 0x0, + 0x7f, 0xf0, 0xc7, 0x0, 0x3f, 0x8c, 0x3, 0xff, + 0x8a, 0x20, 0x1f, 0xcd, 0xbb, 0xc6, 0x1, 0xe9, + 0xdd, 0xdc, 0x1, 0xfe, 0x22, 0xe7, 0x0, 0xf1, + 0x17, 0x8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xcc, 0x11, 0xf8, 0x3, 0xff, 0x80, + 0x23, 0xf0, 0x5f, 0x77, 0xd8, 0x2, 0x1, 0xe7, + 0xc, 0xee, 0xfa, 0xd0, 0x3, 0xe3, 0x1b, 0x76, + 0x6d, 0x26, 0x26, 0x1, 0xf2, 0x0, 0x7f, 0x68, + 0x44, 0xce, 0x61, 0xd0, 0xf, 0xfe, 0x31, 0xf6, + 0x67, 0xb8, 0xc0, 0x3f, 0xf9, 0x6, 0x7e, 0x0, + 0xff, 0xe9, 0x5f, 0xa, 0x7b, 0x80, 0x7f, 0xf2, + 0x84, 0xc1, 0xc4, 0x3, 0x8, 0x7, 0xff, 0x1a, + 0xb4, 0x4f, 0x9c, 0x0, 0x3b, 0xe, 0xff, 0xfc, + 0xc8, 0xd0, + + /* U+F095 "" */ + 0x0, 0xff, 0xe4, 0xb3, 0x8, 0x3, 0xff, 0x9a, + 0x93, 0x2d, 0xeb, 0x73, 0x0, 0xff, 0xe4, 0xf8, + 0x4, 0x29, 0x19, 0x80, 0xf, 0xfe, 0x39, 0x20, + 0x7, 0xc6, 0x1, 0xff, 0xc7, 0xb0, 0xf, 0xc2, + 0x1, 0xff, 0xc6, 0x16, 0x0, 0xff, 0xe7, 0xb0, + 0x7, 0xf1, 0x0, 0x7f, 0xf1, 0xa8, 0x3, 0xf9, + 0x80, 0x3f, 0xf8, 0xcc, 0x1, 0xfd, 0xa0, 0x1f, + 0xfc, 0x6b, 0x40, 0xf, 0xc8, 0x1, 0xff, 0xc7, + 0xb7, 0x0, 0xf8, 0xc0, 0x3f, 0xf9, 0x11, 0x0, + 0xe, 0x60, 0xf, 0xfe, 0x56, 0x80, 0x76, 0x80, + 0x7f, 0xf2, 0x4d, 0x40, 0x31, 0x20, 0x7, 0xff, + 0x27, 0xc0, 0x3a, 0x0, 0x3f, 0xf9, 0x32, 0x60, + 0x18, 0xd4, 0x3, 0xff, 0x90, 0xcc, 0x0, 0xef, + 0x0, 0xff, 0x13, 0x8, 0x7, 0xcb, 0x20, 0x1c, + 0xe6, 0x1, 0xf9, 0x2f, 0x67, 0x40, 0x3c, 0xd4, + 0x1, 0xc7, 0x0, 0x1f, 0x36, 0xda, 0x0, 0xe, + 0x80, 0x35, 0x48, 0x7, 0xe, 0x80, 0x79, 0xfe, + 0x48, 0x3, 0x95, 0xc1, 0x79, 0x40, 0x38, 0x70, + 0x40, 0x3d, 0x0, 0x1f, 0xd1, 0xb4, 0x20, 0x1c, + 0x38, 0x40, 0x1f, 0x18, 0x7, 0xf8, 0x80, 0x3c, + 0x58, 0x40, 0x1f, 0x90, 0x3, 0xff, 0x88, 0xba, + 0x40, 0x1f, 0xd8, 0x1, 0xff, 0xc2, 0x19, 0xa0, + 0xf, 0xf9, 0x40, 0x3f, 0xf8, 0x2d, 0xec, 0x1, + 0xff, 0xc0, 0x12, 0x0, 0xfe, 0x16, 0xe9, 0x10, + 0xf, 0xfe, 0x12, 0x0, 0x78, 0x9a, 0xfa, 0x44, + 0x3, 0xff, 0x89, 0x11, 0x4d, 0x67, 0xec, 0xa0, + 0x7, 0xff, 0x14, + + /* U+F0C4 "" */ + 0x0, 0x96, 0x64, 0xe4, 0x1, 0xff, 0xc6, 0x2d, + 0xa6, 0x64, 0x6b, 0x80, 0x7f, 0xb, 0xdd, 0xa0, + 0x40, 0x70, 0x80, 0x3a, 0x1c, 0x3, 0xe2, 0xf8, + 0x44, 0x3f, 0x9c, 0x88, 0x4, 0x20, 0x14, 0x8, + 0x7, 0x16, 0x8, 0x6, 0x17, 0x50, 0x0, 0xf7, + 0x20, 0x2, 0x40, 0xc, 0x58, 0x20, 0x1d, 0x48, + 0x40, 0x6, 0x10, 0x70, 0x8, 0x80, 0x22, 0xc1, + 0x0, 0xea, 0x50, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x1, 0x60, 0x80, 0x75, 0x28, 0x1, 0x0, + 0x7, 0xb7, 0x60, 0x8, 0x80, 0xf0, 0x40, 0x3a, + 0x94, 0x2, 0x80, 0x8, 0x90, 0x3, 0x52, 0xe8, + 0x80, 0x75, 0x28, 0x6, 0x2b, 0x0, 0xfc, 0x34, + 0x20, 0x1d, 0x4a, 0x1, 0xe4, 0xe7, 0x32, 0x0, + 0xff, 0xa9, 0x40, 0x3f, 0xc, 0x66, 0xd0, 0x7, + 0xf5, 0x28, 0x7, 0xff, 0x5, 0x60, 0x3, 0xe8, + 0x50, 0xf, 0xfe, 0x11, 0xc8, 0x7, 0xd2, 0x40, + 0x1f, 0xf2, 0xcc, 0xb4, 0x40, 0x3e, 0x1c, 0x20, + 0xf, 0xc5, 0xb4, 0xcc, 0x10, 0xf, 0xe1, 0xc2, + 0x0, 0xf0, 0xe1, 0x0, 0x7e, 0x60, 0xe, 0x1c, + 0x20, 0xe, 0x91, 0x0, 0x84, 0x3, 0x4c, 0xa8, + 0x3, 0x87, 0x8, 0x3, 0x28, 0x0, 0x7b, 0x90, + 0x1, 0x18, 0x2d, 0x0, 0x70, 0xe1, 0x0, 0x44, + 0x0, 0x61, 0x7, 0x0, 0x88, 0x0, 0xb4, 0x1, + 0xc3, 0x84, 0x0, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x9, 0x68, 0x3, 0x87, 0x8, 0x10, 0x0, + 0x7b, 0x76, 0x0, 0x90, 0x3, 0x2d, 0x0, 0x70, + 0xe1, 0x40, 0x4, 0x48, 0x1, 0x31, 0x0, 0x72, + 0xd8, 0x7, 0xb, 0x15, 0x80, 0x79, 0x24, 0x3, + 0xe4, 0xc4, 0x10, 0x4c, 0x40, 0x4e, 0x73, 0x24, + 0xab, 0x0, 0xfe, 0x3b, 0xef, 0xb3, 0x0, + + /* U+F0C5 "" */ + 0x0, 0xf8, 0x51, 0x3f, 0x88, 0xc, 0x3, 0xff, + 0x81, 0x97, 0x7f, 0xd4, 0x1b, 0x60, 0x1f, 0xf1, + 0x0, 0x7f, 0xf0, 0x12, 0xc0, 0x3f, 0xf9, 0x89, + 0x60, 0x1f, 0xfc, 0xc4, 0xb0, 0xf, 0xfe, 0x62, + 0x22, 0xbf, 0xf2, 0x0, 0x7f, 0xc4, 0x1d, 0xff, + 0x91, 0x40, 0x3f, 0xf8, 0x8b, 0x97, 0x7c, 0x60, + 0x1f, 0xfc, 0x63, 0x44, 0xe6, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0xf0, 0xf, 0xfe, 0x90, 0x82, 0x80, 0x7f, + 0xf0, 0xc5, 0x0, 0x3b, 0x82, 0xbf, 0xff, 0xf8, + 0x7c, 0x20, 0x1c, 0x94, 0x40, 0x1f, 0xfc, 0xb5, + 0xdf, 0xff, 0xe8, 0x0, 0xff, 0xea, 0x8, 0x7, + 0xff, 0x13, 0x80, 0x3e, 0xd8, 0x77, 0xff, 0xe1, + 0x4b, 0x0, 0x7c, + + /* U+F0C7 "" */ + 0x4, 0x88, 0xff, 0xe1, 0xb9, 0x0, 0x79, 0xad, + 0xdf, 0xff, 0x87, 0x1a, 0x80, 0x1d, 0x0, 0x1f, + 0xfc, 0x6b, 0x40, 0xc, 0x20, 0x1f, 0xfc, 0x7b, + 0x40, 0xf, 0x37, 0xff, 0xff, 0x4, 0x80, 0x2b, + 0x40, 0xe, 0x10, 0xf, 0xfe, 0xb, 0x0, 0x6b, + 0x30, 0xf, 0xfe, 0x66, 0x80, 0x7f, 0xf3, 0x4, + 0xc0, 0x3f, 0xf9, 0x8e, 0x1, 0xff, 0xd0, 0x57, + 0x7f, 0xfe, 0xa, 0x80, 0x7f, 0x8a, 0x23, 0xff, + 0x82, 0x20, 0x1f, 0xff, 0x77, 0xde, 0xa1, 0x0, + 0xff, 0xe3, 0xc4, 0x8, 0x57, 0x40, 0x3f, 0xf8, + 0xee, 0x1, 0x8d, 0x0, 0x3f, 0xf8, 0xa6, 0x1, + 0xe3, 0x0, 0xff, 0xe2, 0x90, 0x7, 0x84, 0x3, + 0xff, 0x8a, 0x26, 0x1, 0xce, 0x1, 0xff, 0xc6, + 0xe1, 0x0, 0xa4, 0x40, 0x3f, 0xf8, 0xc5, 0xf5, + 0x3a, 0xc0, 0x1f, 0xfc, 0x81, 0x56, 0x20, 0xf, + 0xf3, 0xa8, 0x7, 0xff, 0x28, 0x4e, 0xd4, 0x40, + 0x3f, 0xf8, 0xe7, 0xa0, + + /* U+F0C9 "" */ + 0x0, 0xff, 0xe6, 0xef, 0xff, 0xff, 0x2d, 0x48, + 0x3, 0xff, 0x97, 0xa0, 0x1f, 0xfc, 0xd5, 0x11, + 0xff, 0xe5, 0x16, 0x57, 0x77, 0xff, 0x2b, 0x50, + 0x3, 0xff, 0xfe, 0xf7, 0x7f, 0xfc, 0xaa, 0x28, + 0x44, 0xff, 0xe5, 0x2a, 0x80, 0x3f, 0xf9, 0x9e, + 0x20, 0x1f, 0xfc, 0xbe, 0xfb, 0xbf, 0xfe, 0x56, + 0x30, 0xa2, 0x7f, 0xf2, 0x8c, 0x3, 0xff, 0xfe, + 0x15, 0xdd, 0xff, 0xca, 0xd4, 0x51, 0x1f, 0xfe, + 0x51, 0x60, 0x7, 0xff, 0x34, 0x80, 0x3f, 0xf9, + 0x7b, 0xaf, 0xff, 0xfe, 0x5a, 0x80, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x1f, + 0xfd, 0x5, 0x0, 0xff, 0xe7, 0x2d, 0x40, 0x7, + 0xff, 0x32, 0x28, 0x1f, 0x4, 0x3, 0xff, 0x90, + 0x38, 0xe1, 0xca, 0x7e, 0x80, 0x1f, 0xfc, 0x64, + 0xf3, 0x5e, 0x1a, 0x91, 0xb8, 0x0, 0xff, 0xe2, + 0x45, 0x8c, 0xd0, 0x80, 0x1b, 0x49, 0xf0, 0x80, + 0x3f, 0xf8, 0x5, 0x8e, 0x5a, 0xc0, 0x1c, 0x5a, + 0xc7, 0xaa, 0x1, 0xfe, 0x5d, 0x36, 0xd2, 0x0, + 0xfd, 0x34, 0x35, 0x20, 0x1f, 0xa6, 0x82, 0xa4, + 0x3, 0xfe, 0x5f, 0x36, 0xd2, 0x0, 0xc5, 0xac, + 0x7a, 0xa0, 0x1f, 0xfc, 0x11, 0xc6, 0x2d, 0x81, + 0x14, 0x69, 0x3e, 0x10, 0x7, 0xff, 0x12, 0x6c, + 0x5f, 0xb8, 0xe3, 0x70, 0x1, 0xff, 0xc7, 0x4e, + 0x95, 0x54, 0xf2, 0x0, 0x7f, 0xf2, 0x9a, 0xa8, + 0xc0, 0x1f, 0xff, 0x84, 0x0, 0xff, 0xe7, 0x25, + 0x20, 0x7, 0xff, 0x31, 0x28, + + /* U+F0E7 "" */ + 0x0, 0xa2, 0xef, 0xf4, 0x0, 0x7e, 0x37, 0x44, + 0xfc, 0xe4, 0x1, 0xf2, 0x80, 0x7f, 0x88, 0x3, + 0xee, 0x0, 0xfe, 0x40, 0xf, 0xc4, 0x1, 0xfd, + 0xc0, 0x1f, 0x98, 0x3, 0xf9, 0x0, 0x3f, 0x10, + 0x7, 0xe4, 0x10, 0xf, 0xc2, 0x1, 0xfb, 0x40, + 0x3f, 0x18, 0x7, 0xf3, 0x80, 0x7e, 0x60, 0xf, + 0xee, 0xff, 0xed, 0x20, 0x20, 0xf, 0xfe, 0x19, + 0x28, 0x70, 0x7, 0xff, 0x11, 0x80, 0x80, 0x3f, + 0xf8, 0x70, 0x20, 0xc0, 0x1f, 0xfc, 0x22, 0x70, + 0x1, 0x0, 0x7f, 0xf0, 0xa0, 0x2, 0x50, 0xf, + 0xfe, 0xa, 0x28, 0x5, 0x5f, 0xfe, 0xa0, 0xf, + 0x48, 0x7, 0xfd, 0xa0, 0x1c, 0xc4, 0x1, 0xff, + 0x20, 0x6, 0x18, 0x0, 0xff, 0xe0, 0x18, 0x6, + 0x81, 0x0, 0xff, 0x8c, 0x3, 0x13, 0x0, 0x7f, + 0xf0, 0x10, 0x3, 0x48, 0x7, 0xff, 0x7, 0x0, + 0x24, 0x40, 0x7, 0xff, 0x5, 0x40, 0x29, 0x0, + 0xff, 0xe0, 0x90, 0x80, 0x1c, 0x80, 0x3f, 0xf8, + 0x28, 0x0, 0x18, 0x0, 0xff, 0xe1, 0x60, 0x2, + 0x0, 0x3f, 0xf8, 0x66, 0x6, 0xc0, 0x1f, 0xfc, + 0x39, 0xcc, 0x0, 0x7f, 0x80, + + /* U+F0EA "" */ + 0x0, 0xf8, 0x50, 0xc0, 0x3f, 0xf9, 0x2f, 0xd7, + 0x9c, 0x60, 0x1f, 0xfc, 0x14, 0x99, 0xe8, 0x1, + 0x1, 0xd9, 0x9d, 0x2, 0x1, 0xf5, 0xb3, 0x70, + 0x2f, 0x70, 0x44, 0xcd, 0x9e, 0x0, 0x3f, 0xf9, + 0x86, 0x1, 0xff, 0xc2, 0x5f, 0xe1, 0x0, 0xff, + 0xf1, 0x9c, 0xdd, 0xfd, 0x20, 0x1f, 0xfc, 0x24, + 0xc6, 0x44, 0xf8, 0xc0, 0x3f, 0xf8, 0x52, 0x15, + 0xff, 0xf5, 0x6, 0xb0, 0x7, 0xfc, 0x42, 0xa0, + 0x1f, 0xc7, 0x2c, 0x1, 0xff, 0xcc, 0x96, 0x0, + 0xff, 0xe6, 0x4b, 0x0, 0x7f, 0xf3, 0x24, 0xc0, + 0x3f, 0xf8, 0xf5, 0x77, 0x88, 0x3, 0xff, 0x8a, + 0x82, 0x89, 0xc2, 0x1, 0xff, 0xc5, 0x1e, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf9, 0x94, + 0x3, 0xff, 0x99, 0x5f, 0xfe, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xf3, 0x84, 0x40, 0x1f, 0xfc, 0x27, + 0x0, 0xfe, 0xfb, 0xbf, 0xfe, 0xe, 0x90, + + /* U+F0F3 "" */ + 0x0, 0xff, 0x9e, 0x88, 0x3, 0xff, 0x92, 0xb0, + 0xbe, 0x1, 0xff, 0xc9, 0x20, 0x1, 0x0, 0x7f, + 0xf1, 0xca, 0x28, 0x2, 0xa5, 0x0, 0xff, 0xe2, + 0x4e, 0xb9, 0x0, 0x4b, 0x5a, 0x80, 0x1f, 0xfc, + 0x1, 0xc6, 0x0, 0xfc, 0x56, 0xa0, 0x1f, 0xf6, + 0x98, 0x7, 0xfd, 0x48, 0x1, 0xfc, 0xc6, 0x1, + 0xff, 0xc1, 0x90, 0xf, 0xe8, 0x0, 0xff, 0xe1, + 0x12, 0x80, 0x7c, 0x62, 0x1, 0xff, 0xc3, 0xe0, + 0xf, 0x94, 0x3, 0xff, 0x88, 0xc0, 0x1f, 0x8, + 0x7, 0xff, 0x10, 0x80, 0x3e, 0xf0, 0xf, 0xfe, + 0x60, 0x80, 0x7f, 0xf1, 0x44, 0x3, 0xca, 0x1, + 0xff, 0xc5, 0x50, 0xf, 0x18, 0x7, 0xff, 0x14, + 0xc0, 0x38, 0xc0, 0x3f, 0xf8, 0xd8, 0x1, 0xd4, + 0x1, 0xff, 0xc6, 0x41, 0x0, 0x8d, 0x80, 0x3f, + 0xf8, 0xf6, 0x0, 0x1d, 0x0, 0xff, 0xe4, 0x2b, + 0x85, 0x8, 0x7, 0xff, 0x26, 0xd, 0x40, 0x3f, + 0xf9, 0x69, 0x0, 0x1f, 0xfc, 0xa2, 0x66, 0x7f, + 0xff, 0xf2, 0xb4, 0x40, 0x3f, 0xfa, 0xa7, 0xff, + 0xeb, 0x0, 0xff, 0xe2, 0x98, 0x80, 0x76, 0x80, + 0x7f, 0xf1, 0xb4, 0x40, 0x26, 0x60, 0x7, 0xff, + 0x18, 0xfe, 0xa3, 0x24, 0x3, 0xfc, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xe7, 0xf2, 0x85, 0x20, 0x7, + 0xff, 0x3c, 0x68, 0xd0, 0x3, 0xff, 0xa4, 0x80, + 0x11, 0x3b, 0x98, 0x0, 0xef, 0x0, 0x19, 0xdc, + 0x20, 0xae, 0xe4, 0x2, 0x77, 0x30, 0x5, 0xe0, + 0x12, 0xc4, 0x24, 0xe, 0x22, 0x30, 0x98, 0x82, + 0x5, 0xc4, 0x3c, 0x2a, 0x21, 0x20, 0x1f, 0xfd, + 0xb1, 0x0, 0x8, 0x8, 0x4, 0x20, 0x20, 0x6, + 0x2, 0x0, 0x10, 0x70, 0x0, 0x40, 0x3e, 0x6f, + 0xf7, 0x1, 0x7f, 0xc4, 0x1d, 0xfe, 0x30, 0xcf, + 0xf4, 0x83, 0x7f, 0xb8, 0x3, 0xfc, 0x46, 0x61, + 0x1, 0x33, 0x10, 0x0, 0xcc, 0x40, 0x3, 0x38, + 0x3, 0xff, 0x83, 0xf9, 0x88, 0x8, 0xcc, 0x70, + 0x3e, 0x63, 0x40, 0xb3, 0x25, 0x0, 0xff, 0xe4, + 0x8, 0x7, 0x8, 0x7, 0xff, 0x34, 0x40, 0x38, + 0x40, 0x3f, 0xf8, 0xbf, 0x98, 0x80, 0x8c, 0xc7, + 0x3, 0xe6, 0x34, 0xb, 0x32, 0x50, 0xf, 0xfe, + 0x1, 0x19, 0x84, 0x4, 0xcc, 0x40, 0x3, 0x31, + 0x0, 0xc, 0xe0, 0xf, 0xf3, 0x7f, 0xb8, 0xb, + 0xff, 0xff, 0x83, 0x20, 0xdf, 0xee, 0x0, 0xf8, + 0x40, 0x2, 0x2, 0x1, 0xff, 0xc1, 0x20, 0xe0, + 0x0, 0x80, 0x7f, 0xf6, 0xd6, 0x21, 0x20, 0x71, + 0x1f, 0xfc, 0x1f, 0xa, 0x88, 0x48, 0x7, 0xc4, + 0xee, 0x60, 0x3, 0xbf, 0xff, 0x5, 0x0, 0x9d, + 0xcc, 0x1, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, + 0x3, 0xff, 0x9e, 0x34, 0x60, + + /* U+F124 "" */ + 0x0, 0xff, 0xe6, 0xab, 0x90, 0x7, 0xff, 0x35, + 0xba, 0xa3, 0x50, 0x3, 0xff, 0x92, 0x31, 0xd2, + 0x20, 0x14, 0x80, 0x7f, 0xf1, 0xca, 0x79, 0xc4, + 0x3, 0x8c, 0x3, 0xff, 0x8a, 0x75, 0xac, 0x1, + 0xf9, 0xc0, 0x3f, 0xf8, 0x69, 0x98, 0x50, 0xf, + 0xf5, 0x80, 0x7f, 0xf0, 0x5b, 0x6c, 0xc0, 0x3f, + 0xe4, 0x20, 0xf, 0xf0, 0xbf, 0x49, 0x0, 0x7f, + 0xf0, 0x60, 0x3, 0xf8, 0x63, 0xa0, 0x40, 0x3f, + 0xf8, 0x46, 0x60, 0xf, 0x8a, 0xb9, 0xc0, 0x3f, + 0xf8, 0xb2, 0x1, 0xe4, 0xbd, 0x50, 0xf, 0xfe, + 0x31, 0x28, 0x6, 0x1b, 0xb2, 0x0, 0x7f, 0xf2, + 0x2c, 0x3, 0xa9, 0x0, 0x3f, 0xf9, 0x22, 0xc0, + 0x1c, 0x80, 0x1f, 0xfc, 0xa9, 0x0, 0xf1, 0x0, + 0x7f, 0xf2, 0x98, 0x3, 0xd2, 0x1, 0xff, 0xc9, + 0x61, 0x0, 0xf2, 0x7e, 0x5d, 0xff, 0x10, 0x7, + 0xf5, 0x80, 0x7f, 0x1a, 0x27, 0xf0, 0x80, 0x7e, + 0x52, 0x0, 0xff, 0xe8, 0x48, 0x7, 0xff, 0x41, + 0xc, 0x3, 0xff, 0xa1, 0xe0, 0x1f, 0xfd, 0x2, + 0x40, 0xf, 0xfe, 0x84, 0x0, 0x7f, 0xf4, 0x5, + 0x40, 0x3f, 0xfa, 0x12, 0x1, 0xff, 0xcb, 0x70, + 0xe, 0x70, 0xf, 0xfe, 0x58, 0x80, 0x67, 0x0, + 0xff, 0xe6, 0x40, 0x4, 0x50, 0x1, 0xff, 0xcc, + 0x2e, 0x89, 0xd0, 0xf, 0xfe, 0x0, + + /* U+F15B "" */ + 0x14, 0x4f, 0xf8, 0x40, 0xc0, 0x3d, 0x97, 0x7f, + 0xf2, 0x86, 0x50, 0x7, 0x10, 0x7, 0xff, 0x9, + 0x68, 0x3, 0xff, 0x90, 0xb4, 0x1, 0xff, 0xc8, + 0x5a, 0x0, 0xff, 0xe4, 0x2d, 0x0, 0x7f, 0xf2, + 0x16, 0x40, 0x3f, 0xf8, 0x48, 0x9e, 0x20, 0xf, + 0xfe, 0x6, 0x5, 0xdf, 0xc0, 0x1f, 0xfc, 0x7, + 0xff, 0xfc, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xfe, 0xd2, 0x0, 0xff, 0xe3, 0x96, 0x5d, 0xff, + 0xf1, 0xf0, + + /* U+F1EB "" */ + 0x0, 0xff, 0xf1, 0x9b, 0x4d, 0x5e, 0x5d, 0x4b, + 0x18, 0x7, 0xff, 0x20, 0x9f, 0x3f, 0x25, 0x95, + 0xd, 0x15, 0xa7, 0x3f, 0x1c, 0x80, 0x3f, 0xf8, + 0x47, 0x7b, 0x6, 0x1, 0xff, 0xc1, 0x38, 0xdb, + 0x30, 0xf, 0xf1, 0x66, 0x10, 0x3, 0xff, 0x8e, + 0x99, 0x82, 0x0, 0xfa, 0x34, 0xc0, 0x3f, 0x12, + 0x2a, 0xc8, 0x40, 0x1f, 0x8f, 0x60, 0x3, 0xe, + 0xb8, 0x7, 0x8e, 0x33, 0xf6, 0xea, 0xab, 0xdf, + 0xc8, 0x30, 0xf, 0x3e, 0x88, 0x1f, 0x90, 0x7, + 0x36, 0xe3, 0x98, 0x7, 0xf1, 0xbe, 0x6b, 0x0, + 0x71, 0x79, 0xe8, 0x80, 0x64, 0xd9, 0x20, 0xf, + 0xfe, 0x19, 0x4e, 0xa0, 0x6, 0x1d, 0x90, 0xd, + 0x36, 0x40, 0x1f, 0xfc, 0x72, 0xb9, 0x0, 0xd2, + 0xf0, 0x3, 0xac, 0x1, 0xe4, 0x8b, 0xef, 0xfb, + 0x6e, 0x10, 0x3, 0xcd, 0xa4, 0x10, 0xe0, 0xf7, + 0xe4, 0x1, 0x86, 0x3a, 0xdd, 0x4, 0x2, 0x24, + 0x7b, 0xe8, 0x10, 0xc, 0x59, 0x6e, 0x1, 0x20, + 0x80, 0x66, 0xf7, 0x10, 0xf, 0xf8, 0x5f, 0xd8, + 0x3, 0xa, 0x0, 0x7e, 0x1b, 0x91, 0x0, 0xff, + 0xe1, 0x8c, 0xd8, 0x80, 0x7f, 0xf0, 0x29, 0x0, + 0x3c, 0x6f, 0x13, 0xe, 0x60, 0x1e, 0x4d, 0x0, + 0xff, 0xe0, 0x18, 0x6, 0x18, 0xfc, 0x87, 0x67, + 0x8c, 0xf8, 0x10, 0xc, 0x80, 0x1f, 0xfc, 0x8, + 0x70, 0x3, 0x73, 0x80, 0x7f, 0x3f, 0x30, 0x1, + 0xa0, 0x3, 0xff, 0x83, 0x13, 0x72, 0x1, 0xff, + 0xc1, 0x9b, 0x89, 0x0, 0xff, 0xe1, 0xb2, 0x0, + 0x7c, 0x20, 0x1f, 0x23, 0x80, 0x7f, 0xf2, 0xdf, + 0xfb, 0xdc, 0x3, 0xff, 0xa2, 0xf0, 0x1, 0x43, + 0x80, 0x7f, 0xf4, 0x24, 0x3, 0xa4, 0x3, 0xff, + 0xa0, 0x20, 0x1c, 0x20, 0x1f, 0xfd, 0x3, 0x0, + 0xe3, 0x0, 0xff, 0xe8, 0x40, 0x7, 0x40, 0x7, + 0xff, 0x41, 0x31, 0x9, 0x31, 0x0, 0x3f, 0xf8, + 0x40, + + /* U+F240 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xb3, 0xff, 0xff, 0x94, 0x1, + 0xff, 0xd8, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, + 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, + 0x1, 0xff, 0xd4, 0x70, 0xf, 0xf6, 0x7f, 0xff, + 0xf2, 0x80, 0x3c, 0x20, 0x11, 0xbb, 0xff, 0xf3, + 0x74, 0x2, 0x5d, 0x0, 0x92, 0x23, 0xff, 0x9a, + 0xc0, 0x14, 0x9a, 0x0, 0x7f, 0xf4, 0xc4, 0xc2, + 0x90, 0x3, 0xff, 0xa2, 0x5a, 0x0, 0x1b, 0xff, + 0xff, 0xe8, 0xe9, 0x80, 0x0, + + /* U+F241 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xff, 0x89, 0x20, + 0x1f, 0xfd, 0xd6, 0x73, 0x0, 0xff, 0xea, 0x14, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0x9e, 0x7e, + 0xe0, 0x1f, 0xfd, 0x47, 0x0, 0xff, 0x77, 0xff, + 0xff, 0x12, 0x40, 0x3f, 0xe1, 0x0, 0x8d, 0xdf, + 0xff, 0x9b, 0xa0, 0x12, 0xe8, 0x4, 0x91, 0x1f, + 0xfc, 0xd6, 0x0, 0xa4, 0xd0, 0x3, 0xff, 0xa6, + 0x26, 0x14, 0x80, 0x1f, 0xfd, 0x12, 0xd0, 0x0, + 0xdf, 0xff, 0xff, 0x47, 0x4c, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xfe, 0x50, 0xf, + 0xff, 0x13, 0x39, 0x80, 0x7f, 0xf5, 0xa, 0x10, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xcf, 0x3f, 0x70, + 0xf, 0xfe, 0xa3, 0x80, 0x7f, 0xbb, 0xff, 0xfe, + 0x50, 0xf, 0xfe, 0x20, 0x80, 0x46, 0xef, 0xff, + 0xcd, 0xd0, 0x9, 0x74, 0x2, 0x48, 0x8f, 0xfe, + 0x6b, 0x0, 0x52, 0x68, 0x1, 0xff, 0xd3, 0x13, + 0xa, 0x40, 0xf, 0xfe, 0x89, 0x68, 0x0, 0x6f, + 0xff, 0xff, 0xa3, 0xa6, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xc2, 0x1, 0xff, + 0xe7, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, 0x0, + 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, 0x1, + 0xff, 0xd4, 0x70, 0xf, 0xf7, 0x7f, 0xf8, 0x40, + 0x3f, 0xf9, 0x22, 0x1, 0x1b, 0xbf, 0xff, 0x37, + 0x40, 0x25, 0xd0, 0x9, 0x22, 0x3f, 0xf9, 0xac, + 0x1, 0x49, 0xa0, 0x7, 0xff, 0x4c, 0x4c, 0x29, + 0x0, 0x3f, 0xfa, 0x25, 0xa0, 0x1, 0xbf, 0xff, + 0xfe, 0x8e, 0x98, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xff, 0xe8, 0xce, 0x60, 0x1f, + 0xfd, 0x42, 0x84, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xf3, 0xcf, 0xdc, 0x3, 0xff, 0xa8, 0xe0, 0x1f, + 0xfd, 0xb1, 0x0, 0x8d, 0xdf, 0xff, 0x9b, 0xa0, + 0x12, 0xe8, 0x4, 0x91, 0x1f, 0xfc, 0xd6, 0x0, + 0xa4, 0xd0, 0x3, 0xff, 0xa6, 0x26, 0x14, 0x80, + 0x1f, 0xfd, 0x12, 0xd0, 0x0, 0xdf, 0xff, 0xff, + 0x47, 0x4c, 0x0, + + /* U+F287 "" */ + 0x0, 0xff, 0xe4, 0x8, 0x7, 0xff, 0x55, 0x7b, + 0xa4, 0x0, 0xff, 0xe8, 0x9, 0x1d, 0x8, 0xd, + 0x88, 0x7, 0xff, 0x34, 0x6f, 0xb7, 0x0, 0x39, + 0x0, 0x3f, 0xf9, 0xb4, 0x80, 0x64, 0x1, 0xc2, + 0x1, 0xff, 0xcc, 0x54, 0x1e, 0xcd, 0x30, 0x8, + 0xd0, 0x3, 0xff, 0x99, 0x1, 0x62, 0x0, 0xc8, + 0x58, 0xc0, 0xf, 0xfe, 0x21, 0x8, 0x7, 0x90, + 0x88, 0xa0, 0x19, 0xe9, 0xc0, 0x3f, 0xf8, 0x69, + 0xdb, 0xd8, 0x40, 0x1a, 0x2, 0x0, 0x3f, 0xf8, + 0x6e, 0x80, 0x1c, 0x96, 0x20, 0x3, 0xc1, 0x0, + 0x21, 0x8a, 0x80, 0x7f, 0xf0, 0xee, 0xe2, 0x0, + 0xa0, 0x3, 0x86, 0xcd, 0x68, 0x1d, 0x13, 0xff, + 0x88, 0x20, 0x9a, 0xe0, 0x3, 0x0, 0xf2, 0xe5, + 0x8, 0x35, 0xdf, 0xff, 0x10, 0x80, 0x28, 0xd0, + 0x10, 0xf, 0xa, 0x27, 0x18, 0x0, 0xd1, 0x3f, + 0xf8, 0x0, 0x18, 0x60, 0x18, 0x3, 0xd5, 0x77, + 0xd8, 0xc0, 0xd7, 0x7f, 0xfc, 0x3, 0x0, 0x3f, + 0x28, 0x42, 0x0, 0x67, 0x40, 0xf, 0x48, 0xa9, + 0x0, 0x7f, 0xf0, 0x13, 0x60, 0x3, 0x5d, 0x3c, + 0x64, 0x0, 0x7e, 0x90, 0x80, 0xf, 0xfb, 0x2c, + 0x80, 0x3c, 0xb0, 0xe6, 0x1, 0xfc, 0xc0, 0xa4, + 0x0, 0x6d, 0xdd, 0x84, 0x1, 0xff, 0xcb, 0x17, + 0xe, 0x0, 0x79, 0x16, 0x36, 0x0, 0xff, 0xe6, + 0x41, 0x9b, 0xf5, 0xc0, 0x3f, 0xfa, 0x7a, 0xa0, + 0x42, 0x1, 0xff, 0xd3, 0x1a, 0xfe, 0x60, 0xf, + 0xfe, 0xb0, 0x88, 0x3, 0xff, 0xaf, 0x1f, 0xfc, + 0x80, 0x1f, 0x80, + + /* U+F293 "" */ + 0x0, 0xfe, 0x13, 0x43, 0x20, 0xf, 0xfe, 0x11, + 0xd7, 0x73, 0x2f, 0x37, 0xed, 0x40, 0x3f, 0xd5, + 0x8a, 0x20, 0x1e, 0x4a, 0xc1, 0x0, 0xf0, 0xe2, + 0x80, 0x63, 0x80, 0xe, 0x3c, 0x10, 0xe, 0xa3, + 0x0, 0xf3, 0xb8, 0x3, 0x8b, 0x40, 0x32, 0xa0, + 0x7, 0xe8, 0x60, 0xe, 0x35, 0x0, 0xa4, 0x3, + 0xfd, 0x2a, 0x1, 0xdc, 0x0, 0x23, 0x0, 0xff, + 0xa9, 0x0, 0x32, 0x8, 0x20, 0x6, 0x50, 0xe, + 0x39, 0xb, 0x30, 0xc, 0x81, 0x80, 0x13, 0x56, + 0x8, 0x6, 0x69, 0xd, 0x20, 0xb, 0x41, 0x80, + 0x24, 0x13, 0xd1, 0x0, 0x8, 0x10, 0x8, 0x80, + 0x22, 0x2, 0x0, 0x8b, 0x4, 0xf5, 0xc0, 0x9, + 0x61, 0x46, 0x1, 0x30, 0x8, 0x6, 0x2c, 0x13, + 0xa0, 0x2b, 0x9, 0x50, 0xc, 0x20, 0x1f, 0x16, + 0x8, 0x80, 0x27, 0x60, 0xe, 0x31, 0x0, 0xf8, + 0xb0, 0x40, 0xb, 0x0, 0x1f, 0xfc, 0x46, 0x10, + 0x3, 0x0, 0x7e, 0x10, 0xf, 0x92, 0xc0, 0x23, + 0xc0, 0xf, 0x18, 0x7, 0xc9, 0x60, 0x40, 0x22, + 0x3b, 0x0, 0xf8, 0x40, 0x32, 0x58, 0x2f, 0x1, + 0xe0, 0xa5, 0x0, 0x61, 0x2, 0x0, 0x92, 0xc1, + 0x68, 0x2, 0x2c, 0x5, 0x80, 0x9, 0x81, 0x40, + 0x39, 0x68, 0x2, 0x10, 0xb0, 0x1a, 0x0, 0xb4, + 0x30, 0x2, 0x4d, 0xa0, 0xe, 0x96, 0x1c, 0x20, + 0x8, 0xc1, 0x0, 0x31, 0x0, 0x42, 0x6, 0xc3, + 0x84, 0x1, 0x90, 0x5, 0x40, 0x3f, 0xc3, 0x84, + 0x1, 0x94, 0x2, 0x80, 0xf, 0xe1, 0xc2, 0x0, + 0xe8, 0x0, 0x8a, 0x40, 0x3e, 0x1d, 0x20, 0xe, + 0x72, 0x0, 0xcd, 0x20, 0x1c, 0x7a, 0x60, 0x1c, + 0x90, 0x1, 0xe6, 0xd5, 0x0, 0x84, 0xc0, 0x30, + 0xc5, 0x80, 0x7e, 0x2a, 0xea, 0x75, 0x44, 0x2b, + 0xdf, 0x38, 0x6, + + /* U+F2ED "" */ + 0x0, 0xfc, 0x28, 0x9e, 0x30, 0xf, 0xfe, 0x20, + 0xf5, 0xdf, 0xb2, 0x40, 0x3f, 0x2c, 0x47, 0xb4, + 0x3, 0xf3, 0x44, 0x7c, 0x34, 0xef, 0xe3, 0x0, + 0xfe, 0x77, 0xf9, 0x80, 0x3f, 0xf9, 0x9e, 0x80, + 0x1f, 0xfc, 0xa1, 0xcb, 0xff, 0xff, 0xe5, 0x72, + 0x1, 0x44, 0x7f, 0xf2, 0x18, 0x2, 0x67, 0x7f, + 0xfe, 0x45, 0x0, 0x7f, 0xfb, 0xaa, 0x80, 0x13, + 0x68, 0x4, 0x7c, 0x60, 0x1f, 0xfc, 0x7, 0x70, + 0x5, 0xe4, 0x20, 0x6, 0x16, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0x27, 0x70, 0x5, 0xe4, 0x20, 0x6, 0x16, + 0x0, 0xf9, 0xc0, 0x35, 0x50, 0x2, 0x6d, 0x0, + 0x8f, 0x8c, 0x2, 0x70, 0x8, 0x40, 0x3f, 0xf9, + 0x2, 0x1, 0x13, 0x0, 0x7f, 0xf1, 0xe0, 0x3, + 0x4d, 0xc3, 0xbf, 0xff, 0xe, 0x78, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0xff, 0xe5, 0x33, 0x4, 0x3, 0xff, 0x98, + 0x5b, 0x32, 0xf3, 0x0, 0xff, 0xe5, 0x16, 0x10, + 0x0, 0x70, 0xc0, 0x3f, 0xf9, 0x5, 0x82, 0x1, + 0xd8, 0x60, 0x1f, 0xfc, 0x7b, 0x10, 0xf, 0xb0, + 0xc0, 0x3f, 0xf8, 0x82, 0x12, 0x80, 0x1f, 0xbc, + 0x3, 0xff, 0x86, 0x5f, 0x81, 0x68, 0x1, 0xf1, + 0x80, 0x7f, 0xf0, 0x8b, 0x4, 0xf0, 0x2d, 0x0, + 0x3c, 0x80, 0x1f, 0xfc, 0x12, 0xc1, 0x0, 0x1e, + 0x5, 0xa0, 0x6, 0x1a, 0x0, 0xff, 0xe0, 0x16, + 0x8, 0x6, 0x3c, 0xb, 0x40, 0x0, 0xe0, 0x80, + 0x7f, 0xc5, 0x82, 0x1, 0xe3, 0xc0, 0xb4, 0x1c, + 0x20, 0xf, 0xf8, 0xb0, 0x40, 0x3f, 0x1e, 0x5, + 0xf9, 0x0, 0x7f, 0xc5, 0x82, 0x1, 0xfe, 0x3a, + 0x1, 0x0, 0xff, 0x8b, 0x4, 0x3, 0xfe, 0x18, + 0x0, 0xff, 0xe0, 0x16, 0x8, 0x7, 0xfc, 0x38, + 0x40, 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, + 0x1, 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, + 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, + 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, + 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, 0xff, + 0xe, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, 0xfc, + 0x4, 0x10, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xf8, + 0x24, 0x1, 0xff, 0xe, 0x10, 0x7, 0xff, 0xb, + 0x80, 0x3f, 0xc3, 0x84, 0x1, 0xff, 0xc3, 0x20, + 0xf, 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x30, 0x7, + 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x90, 0x7, 0xc3, + 0x84, 0x1, 0xff, 0xc6, 0x10, 0xe, 0x13, 0xc2, + 0x0, 0xff, 0xe3, 0xec, 0x4d, 0xef, 0xf6, 0x10, + 0x7, 0xff, 0x1c, + + /* U+F55A "" */ + 0x0, 0xfe, 0x8e, 0xff, 0xff, 0xe4, 0xea, 0x80, + 0x7f, 0x5b, 0x88, 0x7, 0xff, 0x24, 0xa9, 0x40, + 0x3e, 0xb4, 0x0, 0xff, 0xe6, 0xc0, 0x7, 0xad, + 0x0, 0x3f, 0xf9, 0xc4, 0x1, 0xd6, 0x80, 0x1f, + 0xcc, 0xc0, 0xf, 0x33, 0x0, 0x3f, 0xf8, 0x36, + 0x80, 0x1f, 0xcf, 0x32, 0x70, 0xc, 0xf3, 0x28, + 0x0, 0xff, 0xad, 0x0, 0x3f, 0x86, 0x0, 0x10, + 0xe0, 0x7, 0x80, 0x3, 0x88, 0x7, 0xf5, 0xa0, + 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, 0x50, + 0x20, 0x1f, 0xad, 0x0, 0x3f, 0xf8, 0xf, 0x0, + 0x14, 0x40, 0x2, 0x87, 0x0, 0xfd, 0x48, 0x1, + 0xff, 0xc2, 0x78, 0x0, 0xf4, 0x38, 0x7, 0xf2, + 0x80, 0x7f, 0xf1, 0x1d, 0x0, 0x32, 0x38, 0x7, + 0xf9, 0x40, 0x3f, 0xf8, 0x8e, 0x80, 0x19, 0x1c, + 0x3, 0xfd, 0x48, 0x1, 0xff, 0xc2, 0x78, 0x0, + 0xf4, 0x38, 0x7, 0xfa, 0xd0, 0x3, 0xff, 0x80, + 0xf0, 0x1, 0x44, 0x0, 0x28, 0x70, 0xf, 0xf5, + 0xa0, 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, + 0x50, 0x20, 0x1f, 0xeb, 0x40, 0xf, 0xe1, 0x80, + 0x4, 0x38, 0x1, 0xe0, 0x1, 0x2, 0x1, 0xff, + 0x5a, 0x0, 0x7f, 0x3c, 0xc9, 0xc0, 0x33, 0xcc, + 0x9c, 0x3, 0xff, 0x83, 0x68, 0x1, 0xfc, 0xcc, + 0x0, 0xf3, 0x30, 0x3, 0xff, 0x87, 0x68, 0x1, + 0xff, 0xce, 0x20, 0xf, 0xad, 0x40, 0x3f, 0xf9, + 0xb0, 0x1, 0xfa, 0x9c, 0x40, 0x3f, 0xf9, 0x25, + 0x4a, + + /* U+F7C2 "" */ + 0x0, 0xf0, 0xbc, 0x47, 0xf3, 0xa8, 0x7, 0xc3, + 0x90, 0xef, 0xfd, 0x15, 0x82, 0x1, 0x8b, 0x8, + 0x3, 0xff, 0x80, 0x76, 0x1, 0x16, 0x10, 0x7, + 0xff, 0x9, 0x40, 0x5, 0x82, 0x1b, 0xfc, 0xb, + 0xfe, 0x12, 0xff, 0x38, 0x6, 0x2c, 0x10, 0xf, + 0xfe, 0x29, 0xe0, 0x80, 0x7f, 0xf1, 0xb4, 0x40, + 0x3f, 0xf8, 0xe2, 0x1, 0xff, 0xce, 0xdf, 0xe0, + 0x5f, 0xf0, 0x97, 0xf9, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0x8c, 0x20, 0x1f, 0xfc, 0x71, + 0x60, 0xf, 0xfe, 0x3b, 0x42, 0x80, 0x7f, 0xf1, + 0x5a, 0x2, 0xb6, 0xef, 0xff, 0x87, 0xb2, 0x0, + + /* U+F8A2 "" */ + 0x0, 0xff, 0xe7, 0xa0, 0x7, 0xff, 0x3e, 0x6c, + 0x40, 0x3f, 0xf9, 0xb2, 0xc0, 0x1f, 0xfc, 0xe9, + 0x60, 0xf, 0xe5, 0xc5, 0x0, 0xff, 0xe1, 0x1b, + 0x0, 0x7f, 0x3d, 0x1c, 0x0, 0x7f, 0xf0, 0x9c, + 0x3, 0xfa, 0x20, 0x1, 0xff, 0xce, 0x97, 0x0, + 0xff, 0xe7, 0x53, 0x0, 0x7f, 0xf3, 0xad, 0x40, + 0x38, 0xbf, 0xff, 0xf8, 0x56, 0x1, 0xd4, 0x80, + 0x1f, 0xfc, 0xf6, 0x0, 0xff, 0xe8, 0x70, 0x80, + 0x7f, 0xf3, 0x44, 0x45, 0xe4, 0x1, 0xc3, 0x55, + 0xff, 0xc6, 0xf0, 0x0, 0xe1, 0x80, 0x63, 0x55, + 0xff, 0xe3, 0x8, 0x4, 0x38, 0x60, 0x1f, 0xfd, + 0xc, 0x40, 0xf, 0xfe, 0x85, 0xa8, 0x20, 0x7, + 0xff, 0x3a, 0xba, 0x40, 0x3f, 0xf9, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 41, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 66, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 196, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 341, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 685, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 697, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 776, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 855, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 907, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 940, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 961, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 969, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 980, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1083, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1221, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1238, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1354, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1462, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1561, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1675, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1812, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1910, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2052, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2187, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2213, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2249, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2320, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2350, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2421, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2522, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2798, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2946, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3063, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3198, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3315, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3363, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3402, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3542, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3574, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3634, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3760, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3786, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3916, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4019, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4272, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4483, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4592, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4834, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4983, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5219, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5365, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5470, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5568, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 5592, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 5698, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 5721, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5784, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5791, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 5806, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5899, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6003, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6098, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6205, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6299, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6351, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6491, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6570, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 6616, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6711, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6806, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6966, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7072, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7180, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7210, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7305, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7357, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7408, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7506, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7661, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7759, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7887, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7954, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8014, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8023, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8077, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8112, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8158, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 8176, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8344, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8523, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8634, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8793, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8946, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9210, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 9431, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9642, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9805, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9961, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10218, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10281, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10395, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10670, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10804, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10984, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11094, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11242, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11325, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11379, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11491, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11628, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11759, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11890, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11979, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 12013, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12263, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12598, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 12836, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13065, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13188, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13314, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13498, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13734, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 13945, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14184, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14291, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14423, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14501, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14634, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14791, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14918, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15084, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15281, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 15463, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15537, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15794, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15895, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15997, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16098, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16198, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16289, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16500, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 16743, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16863, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 17090, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17387, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 1, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_28_compressed = { +#else +lv_font_t lv_font_montserrat_28_compressed = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_28_COMPRESSED*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_30.c b/libraries/lvgl/src/font/lv_font_montserrat_30.c new file mode 100644 index 0000000..30e48eb --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_30.c @@ -0,0 +1,5723 @@ +/******************************************************************************* + * Size: 30 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 30 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_30.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 1 +#endif + +#if LV_FONT_MONTSERRAT_30 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xaf, 0xfb, 0x9f, 0xfa, 0x9f, 0xfa, 0x8f, 0xf9, + 0x7f, 0xf8, 0x7f, 0xf8, 0x6f, 0xf7, 0x6f, 0xf6, + 0x5f, 0xf6, 0x4f, 0xf5, 0x4f, 0xf4, 0x3f, 0xf4, + 0x3f, 0xf3, 0x2f, 0xf3, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xb3, 0xcf, 0xfd, 0xdf, 0xfe, + 0x4e, 0xe4, + + /* U+0022 "\"" */ + 0x1f, 0xf6, 0x0, 0xaf, 0xd1, 0xff, 0x50, 0xa, + 0xfc, 0xf, 0xf5, 0x0, 0xaf, 0xc0, 0xff, 0x50, + 0x9, 0xfb, 0xf, 0xf4, 0x0, 0x9f, 0xb0, 0xff, + 0x40, 0x9, 0xfb, 0xf, 0xf3, 0x0, 0x8f, 0xa0, + 0xff, 0x30, 0x8, 0xfa, 0x1, 0x10, 0x0, 0x1, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x2, 0x22, 0x3f, 0xf3, 0x22, 0x22, + 0x6f, 0xd2, 0x22, 0x20, 0x0, 0x0, 0x2, 0xff, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf7, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x22, 0x22, 0xcf, 0x72, 0x22, 0x22, 0xff, + 0x52, 0x22, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x7, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x2, 0xef, 0xff, 0xcc, 0xfc, + 0xbe, 0xff, 0xf3, 0x0, 0xbf, 0xfc, 0x20, 0x7f, + 0x70, 0x2, 0x9c, 0x0, 0x1f, 0xff, 0x10, 0x7, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x69, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x8e, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x9f, 0xf5, 0x8, 0x10, 0x0, 0x7, 0xf7, 0x0, + 0xd, 0xff, 0x34, 0xfe, 0x71, 0x0, 0x7f, 0x70, + 0xa, 0xff, 0xd0, 0x8f, 0xff, 0xfc, 0xac, 0xfb, + 0xbf, 0xff, 0xf3, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x4, 0x9d, 0xef, + 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5c, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xcd, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x3f, 0xe3, 0x0, 0x3e, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0x40, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x6f, + 0xd0, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x1, + 0xfd, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe2, 0x0, 0x3e, 0xf2, 0x2, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xcc, 0xff, + 0x70, 0xc, 0xf7, 0x0, 0x59, 0xa8, 0x20, 0x0, + 0x0, 0x5c, 0xff, 0xc5, 0x0, 0x8f, 0xc0, 0xc, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x20, 0xaf, 0xb2, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x1, 0xfe, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xb0, 0x6, 0xf9, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x8, 0xf6, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xe, + 0xf6, 0x0, 0x8, 0xf6, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x4, 0xfe, + 0x10, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xd0, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0xbf, 0x60, 0x0, 0x0, 0xaf, 0xa0, + 0x0, 0x0, 0x0, 0x2e, 0xfa, 0x9d, 0xfa, 0x0, + 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xae, 0xfd, 0x70, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb4, + 0x23, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x1, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x5e, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x35, 0xff, 0xf4, 0x0, 0x4, 0xc7, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x4f, 0xff, 0x40, 0x9, + 0xfe, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0xe, 0xf9, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xaf, 0xf4, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf6, 0x0, 0x9, 0xff, 0xfd, 0x86, + 0x78, 0xdf, 0xff, 0x8e, 0xff, 0x70, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x2, 0xef, 0xc0, + 0x0, 0x2, 0x7c, 0xef, 0xed, 0x95, 0x0, 0x0, + 0x2c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xf6, 0x1f, 0xf5, 0xf, 0xf5, 0xf, 0xf5, + 0xf, 0xf4, 0xf, 0xf4, 0xf, 0xf3, 0xf, 0xf3, + 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0xd, 0xfe, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0x7, 0xff, 0x50, 0x0, + 0xa, 0xff, 0x20, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x7, 0xff, 0x50, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0xdf, 0xe0, + + /* U+0029 ")" */ + 0xc, 0xfe, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xbf, 0xf1, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0xff, 0xc0, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x6, 0xff, 0x60, + 0x0, 0xb, 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x6f, 0xf6, 0x0, 0x0, 0xdf, 0xe1, 0x0, + 0x5, 0xff, 0x70, 0x0, 0xc, 0xfe, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0xc, 0x70, 0xe, 0xe0, + 0x7, 0xc0, 0x3f, 0xfe, 0x5e, 0xe5, 0xef, 0xf3, + 0x2, 0xaf, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x3e, 0xff, 0x7e, 0xe7, 0xff, 0xe3, + 0xd, 0xa1, 0xe, 0xe0, 0x1a, 0xd0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x56, 0x66, 0x6b, 0xff, 0x66, 0x66, 0x62, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x41, 0x3, 0xff, 0xe1, 0x8f, 0xff, 0x55, + 0xff, 0xf4, 0x9, 0xff, 0x0, 0x8f, 0xa0, 0xc, + 0xf5, 0x0, 0xff, 0x0, 0x4f, 0xa0, 0x0, + + /* U+002D "-" */ + 0x27, 0x77, 0x77, 0x77, 0x64, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xc0, + + /* U+002E "." */ + 0x0, 0x0, 0x1, 0xdf, 0xb0, 0x8f, 0xff, 0x58, + 0xff, 0xf4, 0x1b, 0xf9, 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xd9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf6, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x40, 0x0, 0xaf, 0xfe, 0x50, 0x0, 0x4, 0xef, + 0xfa, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xda, 0x30, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0x79, 0x99, 0x9f, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, + + /* U+0032 "2" */ + 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x1c, 0xff, 0xff, 0xcb, 0xbd, 0xff, 0xff, + 0x30, 0x3, 0xef, 0xe5, 0x0, 0x0, 0x4, 0xdf, + 0xfd, 0x0, 0x2, 0xa1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, + + /* U+0033 "3" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x80, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x11, 0x13, 0x8e, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x4f, 0xfa, 0x30, 0x0, 0x0, 0x1a, 0xff, 0xf1, + 0x9f, 0xff, 0xfe, 0xca, 0xbd, 0xff, 0xff, 0x50, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x4, 0x8c, 0xef, 0xfd, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x0, 0x7f, + 0xfc, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x20, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0xf9, 0x99, 0x99, + 0x99, 0x9f, 0xfe, 0x99, 0x96, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x90, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfe, 0xb8, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x89, 0x99, + 0x9a, 0xbd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, + 0x0, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x3f, 0xff, 0xff, 0xdb, 0xac, 0xff, 0xff, + 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xc9, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8, 0xff, 0xff, 0xca, 0x99, 0xcf, + 0xe0, 0x0, 0x6, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x1, 0x7c, + 0xef, 0xec, 0x71, 0x0, 0x8, 0xff, 0x75, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x8f, 0xfb, 0xff, + 0xea, 0x77, 0x9e, 0xff, 0xf5, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x7f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x65, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xa0, + 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x2e, 0xff, 0xea, 0x77, 0x9e, 0xff, + 0xf3, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x0, + + /* U+0037 "7" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x1f, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x9e, + 0xff, 0x81, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf1, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfa, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x20, 0x5, 0x54, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x39, 0xce, 0xfe, 0xda, 0x50, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0xdf, 0xff, 0xb8, 0x78, 0xaf, 0xff, + 0xf3, 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x1a, + 0xff, 0xc0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf3, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x7f, 0xfc, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0x96, + 0x45, 0x8d, 0xff, 0xe2, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, + 0x93, 0x10, 0x3, 0x7e, 0xff, 0xb0, 0x2f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x67, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc1, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x7, 0xff, + 0xf5, 0x5, 0xff, 0xff, 0xa7, 0x67, 0x9e, 0xff, + 0xf9, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xdb, + 0x61, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x38, 0xde, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb7, 0x78, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xd2, 0x0, 0x0, + 0x3, 0xdf, 0xf5, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf0, 0x3, 0xff, 0xfb, 0x41, 0x1, 0x5c, 0xff, + 0xff, 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xf0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xfb, 0x30, 0xff, 0xf0, 0x0, 0x0, 0x1, 0x46, + 0x64, 0x10, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf9, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xd0, 0x0, 0x0, 0x7f, 0xeb, 0xa9, 0xae, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfb, + 0x8, 0xff, 0xf5, 0x8f, 0xff, 0x41, 0xbf, 0x90, + + /* U+003B ";" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, + 0x7, 0xff, 0xf4, 0x7f, 0xff, 0x51, 0xcf, 0xf1, + 0x7, 0xfc, 0x0, 0xbf, 0x70, 0xf, 0xf1, 0x3, + 0xfc, 0x0, 0x25, 0x20, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xc3, 0x0, 0x2, 0x8e, 0xff, + 0xfe, 0x93, 0x0, 0x5, 0xbf, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0xef, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 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, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xf9, 0x30, 0x0, 0x5b, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x8e, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xb7, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1d, 0xff, 0xfe, 0xa9, 0x9c, 0xff, 0xff, 0x40, + 0x6f, 0xfd, 0x40, 0x0, 0x0, 0x2d, 0xff, 0xd0, + 0x3, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xf9, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xcf, 0xfe, 0x94, 0x20, 0x0, 0x14, 0x7c, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x2, 0x44, + 0x20, 0x0, 0x25, 0x50, 0x5f, 0xf4, 0x0, 0x0, + 0xcf, 0xc0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xd6, + 0x9, 0xff, 0x0, 0x7f, 0xe0, 0x0, 0x4f, 0xf2, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xf0, 0x0, 0xcf, 0x70, 0xb, 0xfa, 0x0, 0x0, + 0xcf, 0xfc, 0x51, 0x2, 0x7e, 0xff, 0xff, 0x0, + 0x5, 0xfd, 0x0, 0xff, 0x40, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0xe, + 0xf2, 0x4f, 0xf0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0xbf, 0x56, + 0xfc, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x8, 0xf7, 0x8f, 0xa0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x7f, 0x88, 0xfa, 0x0, 0x6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x7, 0xf8, 0x8f, 0xa0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x8f, 0x76, 0xfc, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0xa, 0xf5, + 0x3f, 0xf0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x0, 0x0, 0xef, 0x20, 0xff, + 0x40, 0x0, 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x6f, 0xd0, 0xa, 0xfa, 0x0, + 0x0, 0x9f, 0xff, 0x95, 0x46, 0xbf, 0xf9, 0xff, + 0xc5, 0x7f, 0xf5, 0x0, 0x4f, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x29, + 0xdf, 0xfd, 0x82, 0x0, 0x19, 0xef, 0xd6, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xfe, 0x95, 0x21, 0x1, 0x36, 0xaf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xcd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x9, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xb6, 0x66, 0x66, 0x66, 0x6c, 0xff, 0x90, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, + + /* U+0042 "B" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x8b, 0xff, 0xff, 0x30, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfb, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf9, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x14, 0xaf, 0xfe, 0x10, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xd, 0xff, 0x86, 0x66, 0x66, 0x67, 0x8b, 0xff, + 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf8, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x1d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xb0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x78, 0xbf, 0xff, 0xf2, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x29, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x0, 0x1d, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x29, 0xff, 0xf3, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x95, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xb0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf4, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x5d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x2d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xb0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+0046 "F" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x96, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xca, 0xbd, 0xff, 0xff, 0xd1, 0x0, 0xc, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x17, 0xef, 0xf6, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa5, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0xc, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x5, 0xdf, 0xf9, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbc, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa6, + 0x10, 0x0, + + /* U+0048 "H" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0xff, 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, + + /* U+0049 "I" */ + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, + + /* U+004A "J" */ + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x19, + 0x99, 0x99, 0x99, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x1, 0xb1, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xc, + 0xfd, 0x20, 0x0, 0xa, 0xff, 0xd0, 0xc, 0xff, + 0xfc, 0x99, 0xef, 0xff, 0x50, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xad, 0xff, + 0xd9, 0x20, 0x0, + + /* U+004B "K" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xf7, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf8, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xf9, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0xbf, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0xaf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x35, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x70, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + + /* U+004C "L" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+004D "M" */ + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0xdf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x7d, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0xdf, 0xf9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xff, + 0x7d, 0xff, 0x1e, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x6f, 0xf7, 0xdf, 0xf0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x6, 0xff, 0x7d, + 0xff, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x6f, 0xf7, 0xdf, 0xf0, 0x2, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xb0, 0x6, 0xff, 0x7d, 0xff, + 0x0, 0x8, 0xff, 0x60, 0x0, 0xbf, 0xf2, 0x0, + 0x6f, 0xf7, 0xdf, 0xf0, 0x0, 0xe, 0xff, 0x10, + 0x4f, 0xf8, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, + 0x0, 0x5f, 0xf9, 0xd, 0xfe, 0x0, 0x0, 0x6f, + 0xf7, 0xdf, 0xf0, 0x0, 0x0, 0xbf, 0xfa, 0xff, + 0x50, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6f, 0xf7, + 0xdf, 0xf0, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, + + /* U+004E "N" */ + 0xdf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf3, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x22, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xf3, 0xdf, + 0xf2, 0x0, 0xb, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0x3d, 0xff, 0x20, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x4c, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xef, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa3, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xd0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x80, 0xc, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x98, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfb, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x92, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xa3, + 0x0, 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0xdf, 0xfa, + 0x99, 0x99, 0x98, 0x63, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x29, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xd0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x17, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xa9, 0xac, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, 0xe6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x2, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x92, 0x2, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x54, 0x0, 0x0, + + /* U+0052 "R" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0xdf, 0xf9, + 0x88, 0x88, 0x89, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0053 "S" */ + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0x72, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x1, 0xef, 0xff, 0xc9, 0x89, 0xbe, 0xff, + 0xf4, 0x0, 0xaf, 0xfc, 0x20, 0x0, 0x0, 0x3, + 0xad, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xae, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x35, 0xff, 0x92, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xc0, 0x7f, 0xff, 0xfe, 0xb9, 0x89, 0xcf, 0xff, + 0xf3, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x89, 0x99, 0x99, 0x9d, 0xff, 0xb9, + 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xa0, 0xef, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x7f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xca, + 0xbd, 0xff, 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x80, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xa0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf4, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, + 0x0, 0xa, 0xff, 0x24, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xd0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x9f, 0xf4, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x30, 0x0, 0xa, 0xff, 0x10, 0x4, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x8f, + 0xf8, 0x0, 0x0, 0xff, 0xc0, 0x0, 0xe, 0xfe, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xd0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x9f, + 0xf4, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0xb, 0xff, 0x10, 0x0, 0x4, + 0xff, 0x90, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf8, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x3b, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xff, 0xa4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xe1, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0xcf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x6, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x1e, 0xff, 0x50, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x8, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf6, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x30, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe1, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x1, + 0xef, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x3f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x7d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9d, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xdf, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf6, 0xdf, + 0xf6, 0x55, 0x2d, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x65, 0x52, 0xdf, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf6, + + /* U+005C "\\" */ + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xfd, 0x25, + 0x56, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, + 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd2, + 0x55, 0x6f, 0xfd, 0x7f, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0xfd, + + /* U+005E "^" */ + 0x0, 0x0, 0x4, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0x19, + 0xfa, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x2, 0xff, + 0x10, 0x0, 0x0, 0xf, 0xf4, 0x0, 0xbf, 0x70, + 0x0, 0x0, 0x6f, 0xd0, 0x0, 0x5f, 0xe0, 0x0, + 0x0, 0xdf, 0x60, 0x0, 0xe, 0xf5, 0x0, 0x4, + 0xff, 0x0, 0x0, 0x8, 0xfc, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x1, 0xff, 0x20, 0x2f, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x90, 0x8f, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xf1, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xc, + 0xff, 0xea, 0x88, 0x9e, 0xff, 0xf4, 0x0, 0x3e, + 0x50, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x19, 0xff, 0x50, 0x2, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x51, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x8f, 0xf5, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x57, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x50, 0xef, 0xf9, 0x31, 0x14, 0xaf, 0xff, + 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xd8, 0xff, + 0x50, 0x1, 0x8c, 0xff, 0xec, 0x70, 0x6f, 0xf5, + + /* U+0062 "b" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, 0x4f, + 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xfd, 0xff, 0xfb, 0x99, 0xcf, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, 0xcf, + 0xfd, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, + 0xcf, 0xfd, 0x0, 0x4f, 0xfc, 0xff, 0xfb, 0x89, + 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf7, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, 0xf7, 0x1, + 0x8c, 0xff, 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x28, 0xdf, 0xfe, + 0xa4, 0x2, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfb, 0x3f, 0xfb, 0x0, 0xaf, 0xff, 0xea, + 0x8a, 0xef, 0xfd, 0xff, 0xb0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xbb, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb1, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x7, 0xff, 0xe4, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xb0, 0xa, 0xff, 0xfb, 0x75, 0x7b, 0xff, + 0xdf, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0xff, 0xb0, 0x0, 0x2, 0x8c, 0xef, 0xea, + 0x50, 0xf, 0xfb, + + /* U+0065 "e" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0xb7, 0x79, 0xef, 0xfe, + 0x20, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x8f, + 0xfc, 0x0, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x9f, 0xf4, 0x11, 0x11, 0x11, + 0x11, 0x1c, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x9, + 0xff, 0xfe, 0xa8, 0x8b, 0xff, 0xfd, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x5, 0xff, 0xf8, + 0x68, 0xc0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x36, 0x6e, 0xff, 0x66, 0x66, 0x30, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xb5, 0x0, 0xcf, + 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x2c, + 0xff, 0x0, 0xbf, 0xff, 0xea, 0x89, 0xcf, 0xfe, + 0xef, 0xf0, 0x8f, 0xff, 0x60, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x2, 0xff, + 0xfd, 0x62, 0x1, 0x4b, 0xff, 0xff, 0xf0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0x67, 0x63, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x2, 0xfd, 0x50, 0x0, 0x0, 0x1, 0xaf, + 0xfe, 0x0, 0xaf, 0xff, 0xfb, 0x98, 0x9b, 0xff, + 0xff, 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xa6, 0x0, 0x0, + + /* U+0068 "h" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2, 0x8d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xea, 0x9a, 0xef, 0xff, 0x90, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xf2, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+0069 "i" */ + 0x2d, 0xe7, 0xb, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0x9a, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, + 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, + 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, + 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x1, 0xcf, 0x90, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x1e, 0x97, 0xaf, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x3a, + 0xdf, 0xfb, 0x40, 0x0, + + /* U+006B "k" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xff, 0x90, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xbc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd1, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x4, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x1, 0xdf, 0xfa, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe1, + + /* U+006C "l" */ + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, + + /* U+006D "m" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xff, 0xd8, 0x20, 0x0, + 0x6, 0xbe, 0xfe, 0xc7, 0x0, 0x0, 0x4f, 0xf7, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x4f, 0xfe, 0xff, 0xc8, + 0x78, 0xef, 0xff, 0x8f, 0xff, 0xa7, 0x79, 0xff, + 0xfe, 0x10, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1d, 0xff, 0x80, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + + /* U+006E "n" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xd8, 0x77, 0xcf, 0xff, 0x90, + 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf2, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf8, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+006F "o" */ + 0x0, 0x0, 0x17, 0xce, 0xff, 0xc8, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xea, 0x8a, 0xef, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x15, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xab, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfc, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x5, 0xff, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x9, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xfc, 0x81, 0x0, 0x0, + + /* U+0070 "p" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xef, 0xea, 0x50, 0x0, + 0x0, 0x4f, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x4f, 0xfd, 0xff, 0xe9, 0x67, 0x9f, + 0xff, 0xf2, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x1, 0xbf, 0xfd, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x70, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xd0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, + 0x0, 0x2, 0xdf, 0xfd, 0x0, 0x4f, 0xfd, 0xff, + 0xfb, 0x89, 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf9, + 0x5e, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, + 0xf9, 0x1, 0x8c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xa4, 0x0, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x1f, + 0xfb, 0x0, 0xaf, 0xff, 0xea, 0x8a, 0xef, 0xfc, + 0xff, 0xb0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xbb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xb9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xb1, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb0, 0xa, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xdf, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xb0, + 0x0, 0x2, 0x8c, 0xef, 0xea, 0x40, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, + + /* U+0072 "r" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xe4, 0x4f, 0xf7, 0x6f, + 0xff, 0xf4, 0x4f, 0xfc, 0xff, 0xfd, 0xc3, 0x4f, + 0xff, 0xfb, 0x20, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xfd, 0x97, 0x79, 0xdf, 0xf1, 0x0, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x35, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xc9, 0x40, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x47, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0xef, 0xfe, 0xa8, 0x78, 0xbf, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1, 0x7b, 0xdf, 0xfe, 0xc9, 0x30, 0x0, + + /* U+0074 "t" */ + 0x0, 0x6, 0x88, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x36, 0x6e, 0xff, 0x66, + 0x66, 0x30, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x79, 0xe1, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x6, 0xcf, 0xfd, 0x81, + + /* U+0075 "u" */ + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, 0xf8, + 0x3, 0xff, 0xfe, 0x86, 0x7a, 0xff, 0xef, 0xf8, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x4f, 0xf8, + 0x0, 0x1, 0x8c, 0xff, 0xeb, 0x50, 0x3f, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x9f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0xe, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1, 0xff, 0x70, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xf8, 0xff, 0x60, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0xb, 0xfd, 0xd, 0xfc, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x2, 0xff, 0x70, + 0x8f, 0xf2, 0x0, 0x3, 0xff, 0x60, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x8f, 0xf1, 0x2, 0xff, 0x80, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0xd, 0xfb, 0x0, 0xb, 0xfe, 0x0, 0xe, 0xfa, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0xff, 0x50, + 0x0, 0x5f, 0xf4, 0x5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0xaf, 0xe0, 0x0, 0x0, 0xff, + 0x90, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x2f, 0xf9, 0x0, 0x0, 0x9, 0xff, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, + 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf6, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x3f, 0xfd, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x1e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0xb, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfc, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x10, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0x80, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x6, + 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x3, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x3, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x6f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xe9, 0x7a, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x36, 0x66, + 0x66, 0x66, 0x6c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x75, 0x55, 0x55, + 0x55, 0x52, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+007B "{" */ + 0x0, 0x0, 0x19, 0xef, 0xf0, 0x0, 0x1e, 0xff, + 0xff, 0x0, 0x9, 0xff, 0xe7, 0x50, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xc2, 0x0, 0x1, 0x6a, 0xff, 0xc0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xef, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x9f, 0xfe, 0x75, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x2, 0xae, 0xff, + + /* U+007C "|" */ + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, + + /* U+007D "}" */ + 0x7f, 0xfc, 0x60, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x0, 0x26, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, + 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x74, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x2, 0x6a, 0xff, 0xf2, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xc6, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x3f, 0xa0, + 0x4f, 0xff, 0xff, 0xd2, 0x0, 0x7, 0xf8, 0xd, + 0xfc, 0x46, 0xef, 0xf6, 0x4, 0xef, 0x41, 0xff, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xb0, 0x3f, 0xb0, + 0x0, 0x0, 0x5c, 0xfe, 0x90, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xf8, 0x20, 0x4d, 0xf5, + 0x4, 0xf8, 0x0, 0x0, 0x1e, 0xd0, 0x9f, 0x20, + 0x0, 0x0, 0x9f, 0x29, 0xf1, 0x0, 0x0, 0x8, + 0xf2, 0x7f, 0x50, 0x0, 0x0, 0xcf, 0x1, 0xfe, + 0x20, 0x0, 0x8f, 0x90, 0x4, 0xff, 0xca, 0xef, + 0xc0, 0x0, 0x2, 0xae, 0xfd, 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x26, 0x40, 0x0, 0x5f, 0xff, 0xb0, 0xd, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0x10, 0x1a, 0xfd, 0x40, + + /* U+F001 "" */ + 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, 0x27, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x53, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x16, 0x99, + 0x8c, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xfc, 0x60, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xac, 0xdc, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x26, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x62, 0xee, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xee, 0xff, 0xba, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x48, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb4, 0x44, 0xff, 0xfe, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, + 0xef, 0xff, 0x10, 0x5, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xee, 0xff, 0xfe, 0x0, + 0x4, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xff, 0x90, 0x0, 0xef, 0xfe, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xff, 0x76, 0x6a, 0xff, 0xc2, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x28, 0xff, 0xc6, + 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x98, 0x8b, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd8, 0x88, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0xef, 0xff, 0xcc, 0xce, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x32, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x22, 0xff, 0x9d, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xd9, + + /* U+F00B "" */ + 0x26, 0x77, 0x77, 0x76, 0x0, 0x4, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 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, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0x88, 0x88, 0x87, 0x10, 0x5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x88, 0x88, + 0x87, 0x10, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfe, 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00D "" */ + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0xbf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x9f, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x51, 0xcf, 0xff, 0xff, + 0xfd, 0x10, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, + 0xcf, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x71, 0xcf, 0xff, 0xff, 0xfd, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x73, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xc0, 0x4, 0xef, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x10, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xc0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x5, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x10, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf5, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf9, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfc, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, 0xbb, 0xa1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x3f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x4, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0xcf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0x17, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xeb, 0x99, 0xad, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcc, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7, 0xff, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x11, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x99, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x8, 0xff, 0xe7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x7e, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x99, 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x34, 0x44, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xb1, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x24, 0xef, 0xff, + 0xfb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x75, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xe3, 0x2, + 0xdf, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1c, + 0xff, 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xd2, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, 0xf8, 0x2e, + 0xfb, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xc0, + 0x3, 0x70, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x18, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa7, 0x77, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcd, + 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdc, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x77, + 0x10, 0x4f, 0xff, 0xf5, 0x1, 0x77, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x4, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x22, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x50, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0xcf, 0xff, 0xd4, 0x44, 0x44, + 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x4f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0x88, + 0x88, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xdd, 0xb8, + 0x40, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xff, 0xff, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb8, 0x66, 0x8c, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x10, 0xd, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 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, 0x12, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x10, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xec, 0xcd, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x50, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xc4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xb, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xef, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfd, 0x10, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x36, 0x0, 0x0, 0x44, 0x44, 0x44, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x4, + 0x92, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x9, 0xff, + 0x70, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x2, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xad, 0x40, 0x0, 0xef, 0xf4, + 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf5, 0x0, 0x6f, + 0xf9, 0x0, 0x7f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x0, + 0xf, 0xfe, 0x0, 0x4f, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, + 0x60, 0xc, 0xff, 0x0, 0x2f, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, + 0xff, 0x80, 0xb, 0xff, 0x10, 0x1f, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0x70, 0xc, 0xff, 0x10, 0x2f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x3e, 0xff, 0x30, 0xe, 0xff, 0x0, 0x3f, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x6f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xc1, 0x0, 0xaf, 0xf7, + 0x0, 0xaf, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x35, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0xef, 0xf0, 0x4, 0x44, 0x44, 0x47, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x70, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xc1, 0x0, 0x8f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xf9, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x60, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, + 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, 0xf4, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x9f, + 0xff, 0xf4, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0x50, 0x1, 0xef, 0xff, 0xfb, 0x41, 0xc, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, + 0xba, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x4, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf7, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xba, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x34, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xeb, 0x20, 0x0, 0x0, 0x9e, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F04D "" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F051 "" */ + 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x40, 0x2e, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x6f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x6a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0x10, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x11, 0x11, 0xbf, 0xff, 0xff, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x17, 0x99, 0x99, 0x99, 0x99, 0xdf, 0xff, 0xff, + 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xde, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x17, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x89, + 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x84, 0x23, 0x49, 0xef, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x5, 0xdd, 0x93, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, 0xf6, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x10, 0xf, 0xff, 0xff, + 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, 0x80, 0x5, + 0x44, 0x9f, 0xff, 0xff, 0xff, 0x50, 0xc, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xc, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xff, 0xa0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x9, 0xff, + 0xff, 0xff, 0xe0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfd, 0x0, 0x3, 0xdf, + 0xff, 0xfb, 0x10, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2, 0x55, 0x10, 0x0, 0x1e, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xde, 0xff, 0xec, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4, 0x79, 0xa9, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xb1, 0x2, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x59, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xe3, 0x6, 0xdc, + 0x92, 0x0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x54, 0xff, 0xff, 0x60, 0x0, 0xef, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xf5, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xfe, 0xde, 0xc1, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, + 0xec, 0x80, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x20, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x11, 0x11, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x81, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7c, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, 0xaa, 0xa7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xaa, 0xdf, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf5, 0x2, 0xef, 0xff, + 0xff, 0x40, 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x70, 0x1e, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe8, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1a, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x1a, 0x10, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, + 0xcf, 0xd1, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0xb, 0xff, + 0xfc, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, + 0xab, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, + 0xca, 0xdf, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xde, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xa6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x1d, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x6f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xce, 0x40, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x9f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x1d, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x2a, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x90, 0x0, 0x5, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xff, 0xfe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xe4, + 0xff, 0xf9, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xfe, 0x22, 0xff, 0xf9, 0xa, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x0, 0x0, 0x3, 0x82, 0x2, 0xff, 0xf9, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0xaf, 0xff, 0x10, + 0x2, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, + 0xaf, 0xff, 0x10, 0xcf, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0xaf, 0xff, 0x1c, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xdf, 0xff, + 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x2, 0x68, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xca, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xec, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, + 0x33, 0x3e, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x72, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x27, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xb, + 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x45, + 0x55, 0x53, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc8, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xd1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xbf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xba, 0x98, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x79, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8a, 0x83, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xff, + 0xa3, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0xf, 0xff, 0xe0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xff, 0xfd, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, + 0xf5, 0x2, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xff, + 0xff, 0xf2, 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xb, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x37, 0xff, 0xff, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xdf, 0xff, 0x50, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xe1, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x10, 0x2d, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xce, 0xd8, 0x0, 0x0, + 0x7, 0xbd, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, + 0xd0, 0x16, 0x66, 0x64, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x59, 0x99, 0x99, 0xd, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfc, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x3, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x96, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xfe, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xfd, 0x10, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, + + /* U+F0C9 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 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, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 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, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xc3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, + 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfb, + 0x10, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x2d, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0x99, 0x30, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0x92, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x6, 0xcd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x66, 0x66, 0xcf, 0xff, + 0xff, 0xb6, 0x66, 0x65, 0x10, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x29, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x54, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x8b, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, + 0xfe, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x5, 0xaa, 0xaa, 0xa0, + 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x22, 0x22, 0x20, 0xff, 0xff, 0xff, 0xf8, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xf8, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x11, 0x55, 0x55, 0x55, 0x20, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xab, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, + 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x10, 0x1d, + 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x4f, 0xe1, 0x1, + 0xef, 0x40, 0x2, 0xff, 0xfc, 0xff, 0xfc, 0x0, + 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, 0xc0, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, 0xfc, + 0x0, 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, + 0xc0, 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, + 0xfd, 0x0, 0xd, 0xf4, 0x0, 0x1f, 0xf2, 0x0, + 0x3f, 0xe0, 0x0, 0xef, 0x30, 0x2, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xfe, + 0xef, 0xff, 0xee, 0xef, 0xff, 0xee, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0x20, 0x1, 0xff, 0x0, 0x6, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, 0x0, + 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xb2, 0x23, 0xef, 0x52, 0x24, 0xff, 0x32, 0x29, + 0xf9, 0x22, 0x3e, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xbb, 0xbf, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbc, 0xff, 0xdb, 0xbd, 0xff, 0xfc, + 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, 0xff, + 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x10, 0x0, + 0xff, 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0xff, 0xfc, 0xff, 0xff, 0xcc, 0xcf, 0xfd, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xdc, 0xcd, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x59, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x6, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xfd, + 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x0, + + /* U+F1EB "" */ + 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, 0x3, 0x45, 0x65, 0x43, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x65, 0x55, 0x67, 0x9c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf7, 0x6f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xc1, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3, + 0x8b, 0xdf, 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x43, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x48, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x98, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xdc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xac, 0xcf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa5, 0x5e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x15, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x30, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x32, 0x5f, 0xf7, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x2b, 0xff, 0xf9, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xaf, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1c, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x10, 0x0, 0x2, 0xbf, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9d, 0xff, 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0xef, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x3, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0x20, + 0x4f, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xa7, + 0xff, 0xf7, 0x2, 0xe2, 0x5, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xfc, 0x0, 0x6f, 0xf7, 0x1, 0xfe, + 0x20, 0x5f, 0xff, 0xf3, 0xc, 0xff, 0xff, 0x70, + 0x6, 0xf7, 0x1, 0xfc, 0x0, 0x8f, 0xff, 0xf6, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x67, 0x1, 0xc0, + 0x7, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xe, 0xff, 0xff, 0xf8, + 0x0, 0x47, 0x1, 0xa0, 0x6, 0xff, 0xff, 0xf7, + 0xc, 0xff, 0xff, 0x80, 0x4, 0xf7, 0x1, 0xfa, + 0x0, 0x7f, 0xff, 0xf6, 0xa, 0xff, 0xfc, 0x0, + 0x4f, 0xf8, 0x1, 0xfe, 0x20, 0x2e, 0xff, 0xf4, + 0x7, 0xff, 0xff, 0x95, 0xff, 0xf8, 0x2, 0xe3, + 0x2, 0xef, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0x30, 0x2e, 0xff, 0xff, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x3, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf9, 0x3e, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0xbc, 0xdd, 0xca, + 0x61, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, 0x77, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa9, 0x99, 0x99, 0x98, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x40, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0x62, 0xff, 0xfe, 0x18, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, + 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, + 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, + 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, + 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, + 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, + 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, + 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, + 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, + 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, + 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, + 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, + 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xb0, 0xbf, 0xff, 0x62, 0xff, 0xfe, + 0x18, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x7, 0xbc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xba, 0x86, 0x43, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4e, 0xff, 0xff, 0xfe, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xe3, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x50, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, + 0xf9, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x9, 0xff, 0xff, 0xf9, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, + 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xdb, 0xbf, 0xfb, 0xbb, 0xff, 0xbb, 0xbf, + 0xff, 0xa0, 0x3, 0xff, 0xf9, 0x0, 0xcf, 0x10, + 0xf, 0xf0, 0x1, 0xff, 0xfa, 0x4, 0xff, 0xff, + 0x90, 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, + 0xa4, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, + 0xf0, 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0x90, + 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, 0xf0, + 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0x40, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x1b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2d, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x2e, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xff, + 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xef, 0xff, 0xf1, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xe2, 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 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 129, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 129, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 42, .adv_w = 188, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 83, .adv_w = 337, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 304, .adv_w = 298, .box_w = 17, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 551, .adv_w = 405, .box_w = 24, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 803, .adv_w = 329, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1023, .adv_w = 101, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 1041, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 1153, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 1265, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1337, .adv_w = 279, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1435, .adv_w = 109, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1458, .adv_w = 184, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1472, .adv_w = 109, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1485, .adv_w = 169, .box_w = 13, .box_h = 28, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1667, .adv_w = 320, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 178, .box_w = 8, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1940, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2119, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2287, .adv_w = 321, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2666, .adv_w = 296, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2845, .adv_w = 287, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3024, .adv_w = 309, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3203, .adv_w = 296, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 109, .box_w = 5, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 109, .box_w = 5, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3485, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3590, .adv_w = 279, .box_w = 14, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 3660, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3765, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3933, .adv_w = 496, .box_w = 29, .box_h = 27, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4325, .adv_w = 351, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4567, .adv_w = 363, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4767, .adv_w = 347, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4977, .adv_w = 396, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5198, .adv_w = 322, .box_w = 16, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5524, .adv_w = 371, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5734, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5934, .adv_w = 149, .box_w = 4, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5976, .adv_w = 246, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6123, .adv_w = 345, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6323, .adv_w = 285, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 458, .box_w = 23, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6723, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6923, .adv_w = 403, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7165, .adv_w = 347, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 403, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7666, .adv_w = 349, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7855, .adv_w = 298, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8034, .adv_w = 282, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8223, .adv_w = 380, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8423, .adv_w = 342, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8665, .adv_w = 540, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9012, .adv_w = 323, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9222, .adv_w = 311, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9443, .adv_w = 315, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9632, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 9730, .adv_w = 169, .box_w = 14, .box_h = 28, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 9926, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 10024, .adv_w = 280, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 10115, .adv_w = 240, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10130, .adv_w = 288, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 18}, + {.bitmap_index = 10148, .adv_w = 287, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10268, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10466, .adv_w = 274, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10594, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10781, .adv_w = 294, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10917, .adv_w = 169, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11049, .adv_w = 331, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11236, .adv_w = 327, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11412, .adv_w = 134, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11467, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 11607, .adv_w = 296, .box_w = 17, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11794, .adv_w = 134, .box_w = 4, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11838, .adv_w = 507, .box_w = 28, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12062, .adv_w = 327, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12190, .adv_w = 305, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12326, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 12524, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12711, .adv_w = 197, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12791, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12911, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13031, .adv_w = 325, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 268, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13303, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13519, .adv_w = 265, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13655, .adv_w = 268, .box_w = 18, .box_h = 22, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 13853, .adv_w = 250, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13965, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14091, .adv_w = 144, .box_w = 3, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 14133, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 14259, .adv_w = 279, .box_w = 15, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 14297, .adv_w = 201, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 14352, .adv_w = 151, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 14373, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14854, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15199, .adv_w = 480, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15604, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15949, .adv_w = 330, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16180, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16645, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17110, .adv_w = 540, .box_w = 34, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17569, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18034, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18425, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18890, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19070, .adv_w = 360, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19346, .adv_w = 540, .box_w = 34, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19839, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20184, .adv_w = 330, .box_w = 21, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20510, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 20790, .adv_w = 420, .box_w = 27, .box_h = 32, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21222, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21587, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21952, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 22232, .adv_w = 420, .box_w = 28, .box_h = 27, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 22610, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22840, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23070, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23435, .adv_w = 420, .box_w = 27, .box_h = 7, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 23530, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23921, .adv_w = 600, .box_w = 38, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24510, .adv_w = 540, .box_w = 36, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 25068, .adv_w = 480, .box_w = 30, .box_h = 28, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25488, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25709, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25930, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26386, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26731, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27196, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27677, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28042, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28461, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28826, .adv_w = 420, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29150, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29495, .adv_w = 300, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 29805, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30224, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30643, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31034, .adv_w = 480, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31530, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31887, .adv_w = 600, .box_w = 38, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32419, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32799, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33179, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33559, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33939, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34319, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34775, .adv_w = 420, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 35147, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35566, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 36047, .adv_w = 600, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36484, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 36841, .adv_w = 483, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 5, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 22, 0, 13, -11, 0, 0, + 0, 0, -26, -29, 3, 23, 11, 8, + -19, 3, 24, 1, 20, 5, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -14, 0, 0, 0, 0, + 0, -10, 8, 10, 0, 0, -5, 0, + -3, 5, 0, -5, 0, -5, -2, -10, + 0, 0, 0, 0, -5, 0, 0, -6, + -7, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -7, 0, -13, 0, -58, 0, + 0, -10, 0, 10, 14, 0, 0, -10, + 5, 5, 16, 10, -8, 10, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, -6, -24, 0, -19, + -3, 0, 0, 0, 0, 1, 19, 0, + -14, -4, -1, 1, 0, -8, 0, 0, + -3, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -38, -4, 18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 16, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 10, 5, 14, -5, 0, 0, 10, -5, + -16, -66, 3, 13, 10, 1, -6, 0, + 17, 0, 15, 0, 15, 0, -45, 0, + -6, 14, 0, 16, -5, 10, 5, 0, + 0, 1, -5, 0, 0, -8, 38, 0, + 38, 0, 14, 0, 20, 6, 8, 14, + 0, 0, 0, -18, 0, 0, 0, 0, + 1, -3, 0, 3, -9, -6, -10, 3, + 0, -5, 0, 0, 0, -19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -26, 0, -30, 0, 0, 0, + 0, -3, 0, 48, -6, -6, 5, 5, + -4, 0, -6, 5, 0, 0, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -47, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 29, 0, 0, -18, 0, + 16, 0, -33, -47, -33, -10, 14, 0, + 0, -32, 0, 6, -11, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 14, -59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -6, -10, 0, -1, + -1, -5, 0, 0, -3, 0, 0, 0, + -10, 0, -4, 0, -11, -10, 0, -12, + -16, -16, -9, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 3, -5, 0, 1, 0, 0, 0, 5, + -3, 0, 0, 0, -3, 5, 5, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -6, 0, -8, 0, 0, -3, 0, 14, + 0, 0, -5, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -5, -6, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -14, + -3, -14, 10, 0, 0, -10, 5, 10, + 13, 0, -12, -1, -6, 0, -1, -23, + 5, -3, 3, -25, 5, 0, 0, 1, + -25, 0, -25, -4, -42, -3, 0, -24, + 0, 10, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -9, -6, 0, -14, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -3, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -3, 0, -10, 5, 0, 0, -6, + 2, 5, 5, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -5, 0, -5, -3, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 14, -3, 1, -15, 0, 0, + 13, -24, -25, -20, -10, 5, 0, -4, + -31, -9, 0, -9, 0, -10, 7, -9, + -31, 0, -13, 0, 0, 2, -1, 4, + -3, 0, 5, 0, -14, -18, 0, -24, + -12, -10, -12, -14, -6, -13, -1, -9, + -13, 3, 0, 1, 0, -5, 0, 0, + 0, 3, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -2, 0, -1, -5, 0, -8, -11, + -11, -1, 0, -14, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -24, -14, 0, + 0, 0, -7, -24, 0, 0, -5, 5, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 3, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -14, 0, -5, 0, -7, -5, + 0, -11, -12, -14, -4, 0, -10, 0, + -14, 0, 0, 0, 0, 38, 0, 0, + 2, 0, 0, -6, 0, 5, 0, -21, + 0, 0, 0, 0, 0, -45, -9, 16, + 14, -4, -20, 0, 5, -7, 0, -24, + -2, -6, 5, -34, -5, 6, 0, 7, + -17, -7, -18, -16, -20, 0, 0, -29, + 0, 27, 0, 0, -2, 0, 0, 0, + -2, -2, -5, -13, -16, -1, -45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -2, -5, -7, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -10, 0, 0, 10, + -1, 6, 0, -11, 5, -3, -1, -12, + -5, 0, -6, -5, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -6, 0, + 0, -5, 0, 5, -3, 0, -11, 0, + 0, 0, -10, 0, -8, 0, -8, -8, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -3, -6, + -15, -3, -3, -3, -1, -3, -6, -1, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -3, 0, -3, + 0, 0, 0, -3, -6, -3, -4, -6, + -4, 0, 4, 19, -1, 0, -13, 0, + -3, 10, 0, -5, -20, -6, 7, 0, + 0, -23, -8, 5, -8, 3, 0, -3, + -4, -15, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 5, 5, -10, -9, 0, + -8, -5, -7, -5, -5, 0, -8, 2, + -9, -8, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -10, 0, 0, 0, -16, 0, + 3, -11, 10, 1, -3, -23, 0, 0, + -11, -5, 0, -19, -12, -13, 0, 0, + -21, -5, -19, -18, -23, 0, -12, 0, + 4, 32, -6, 0, -11, -5, -1, -5, + -8, -13, -9, -18, -20, -11, -5, 0, + 0, -3, 0, 1, 0, 0, -34, -4, + 14, 11, -11, -18, 0, 1, -15, 0, + -24, -3, -5, 10, -44, -6, 1, 0, + 0, -31, -6, -25, -5, -35, 0, 0, + -34, 0, 28, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -18, -3, 0, -31, + 0, 0, 0, 0, -15, 0, -4, 0, + -1, -13, -23, 0, 0, -2, -7, -14, + -5, 0, -3, 0, 0, 0, 0, -22, + -5, -16, -15, -4, -8, -12, -5, -8, + 0, -10, -4, -16, -7, 0, -6, -9, + -5, -9, 0, 2, 0, -3, -16, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 3, -10, 20, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -14, 0, + -5, 0, -7, -5, 0, -11, -12, -14, + -4, 0, -10, 4, 19, 0, 0, 0, + 0, 38, 0, 0, 2, 0, 0, -6, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -10, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 10, 4, -4, 0, -15, + -8, 0, 14, -16, -15, -10, -10, 19, + 9, 5, -42, -3, 10, -5, 0, -5, + 5, -5, -17, 0, -5, 5, -6, -4, + -14, -4, 0, 0, 14, 10, 0, -13, + 0, -26, -6, 14, -6, -18, 1, -6, + -16, -16, -5, 19, 5, 0, -7, 0, + -13, 0, 4, 16, -11, -18, -19, -12, + 14, 0, 1, -35, -4, 5, -8, -3, + -11, 0, -11, -18, -7, -7, -4, 0, + 0, -11, -10, -5, 0, 14, 11, -5, + -26, 0, -26, -7, 0, -17, -28, -1, + -15, -8, -16, -13, 13, 0, 0, -6, + 0, -10, -4, 0, -5, -9, 0, 8, + -16, 5, 0, 0, -25, 0, -5, -11, + -8, -3, -14, -12, -16, -11, 0, -14, + -5, -11, -9, -14, -5, 0, 0, 1, + 23, -8, 0, -14, -5, 0, -5, -10, + -11, -13, -13, -18, -6, -10, 10, 0, + -7, 0, -24, -6, 3, 10, -15, -18, + -10, -16, 16, -5, 2, -45, -9, 10, + -11, -8, -18, 0, -14, -20, -6, -5, + -4, -5, -10, -14, -1, 0, 0, 14, + 13, -3, -31, 0, -29, -11, 12, -18, + -33, -10, -17, -20, -24, -16, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 3, -9, 10, 0, 0, -15, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 14, 1, 0, -6, 0, 0, + 0, 0, -3, -3, -6, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 18, 0, 9, 1, 1, -6, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -29, 0, -5, 8, 0, 14, + 0, 0, 48, 6, -10, -10, 5, 5, + -3, 1, -24, 0, 0, 23, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 18, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -13, 0, + 0, 1, 0, 0, 5, 62, -10, -4, + 15, 13, -13, 5, 0, 0, 5, 5, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -62, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -13, 0, 0, 0, 0, + -11, -2, 0, 0, 0, -11, 0, -6, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -32, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -9, 0, -7, 0, + -13, 0, 0, 0, -8, 5, -6, 0, + 0, -13, -5, -11, 0, 0, -13, 0, + -5, 0, -23, 0, -5, 0, 0, -39, + -9, -19, -5, -17, 0, 0, -32, 0, + -13, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -9, -4, -8, 0, 0, + 0, 0, -11, 0, -11, 6, -5, 10, + 0, -3, -11, -3, -8, -9, 0, -6, + -2, -3, 3, -13, -1, 0, 0, 0, + -42, -4, -7, 0, -11, 0, -3, -23, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -11, 0, -3, 0, 0, 0, -10, + 5, 0, 0, 0, -13, -5, -10, 0, + 0, -13, 0, -5, 0, -23, 0, 0, + 0, 0, -47, 0, -10, -18, -24, 0, + 0, -32, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 15, + 24, -5, -5, -14, 6, 24, 8, 11, + -13, 6, 20, 6, 14, 11, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 23, -9, -5, 0, -4, + 38, 21, 38, 0, 0, 0, 5, 0, + 0, 18, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -40, -6, -4, -20, + -24, 0, 0, -32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -40, -6, -4, + -20, -24, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -11, 5, 0, -5, + 4, 9, 5, -14, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -12, 0, + -4, -3, -10, 0, -4, -19, 0, 30, + -5, 0, -11, -3, 0, -3, -8, 0, + -5, -13, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -40, + -6, -4, -20, -24, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -15, -6, -4, 14, -4, -5, + -19, 1, -3, 1, -3, -13, 1, 11, + 1, 4, 1, 4, -12, -19, -6, 0, + -18, -9, -13, -20, -19, 0, -8, -10, + -6, -6, -4, -3, -6, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -5, -5, 0, 0, + -13, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -5, 5, 0, -8, -9, -3, 0, -14, + -3, -11, -3, -6, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 15, 0, 0, -9, 0, + 0, 0, 0, -6, 0, -5, 0, 0, + -2, 0, 0, -3, 0, -11, 0, 0, + 20, -6, -16, -15, 3, 5, 5, -1, + -13, 3, 7, 3, 14, 3, 16, -3, + -13, 0, 0, -19, 0, 0, -14, -13, + 0, 0, -10, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -14, + -5, 18, 0, 0, -4, 0, -10, 0, + 0, 6, -11, 0, 5, -5, 4, 0, + 0, -16, 0, -3, -1, 0, -5, 5, + -4, 0, 0, 0, -20, -6, -11, 0, + -14, 0, 0, -23, 0, 18, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -14, + 0, -5, 5, 0, 0, 0, 0, -3, + 0, 0, 5, -6, 1, 0, 0, -6, + -3, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, -30, -27, 1, + 21, 14, 8, -19, 3, 20, 0, 18, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_30 = { +#else +lv_font_t lv_font_montserrat_30 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 33, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_30*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_32.c b/libraries/lvgl/src/font/lv_font_montserrat_32.c new file mode 100644 index 0000000..a12a49c --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_32.c @@ -0,0 +1,6212 @@ +/******************************************************************************* + * Size: 32 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 32 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_32.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 1 +#endif + +#if LV_FONT_MONTSERRAT_32 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x7f, 0xff, 0x17, 0xff, 0xf0, 0x6f, 0xff, 0x5, + 0xff, 0xf0, 0x5f, 0xfe, 0x4, 0xff, 0xe0, 0x4f, + 0xfd, 0x3, 0xff, 0xc0, 0x2f, 0xfc, 0x2, 0xff, + 0xb0, 0x1f, 0xfb, 0x1, 0xff, 0xa0, 0xf, 0xf9, + 0x0, 0xff, 0x90, 0xf, 0xf8, 0x0, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0xb, + 0xff, 0xf4, 0xaf, 0xff, 0x42, 0xcf, 0x90, + + /* U+0022 "\"" */ + 0xff, 0xb0, 0x2, 0xff, 0x7f, 0xfa, 0x0, 0x2f, + 0xf7, 0xef, 0xa0, 0x2, 0xff, 0x6e, 0xf9, 0x0, + 0x1f, 0xf6, 0xef, 0x90, 0x1, 0xff, 0x6d, 0xf8, + 0x0, 0x1f, 0xf5, 0xdf, 0x80, 0x0, 0xff, 0x5d, + 0xf8, 0x0, 0xf, 0xf4, 0x79, 0x40, 0x0, 0x99, + 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x6, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x55, 0x55, + 0xcf, 0xb5, 0x55, 0x55, 0x9f, 0xe5, 0x55, 0x53, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x7f, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x40, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x30, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0x55, 0x5d, 0xfa, 0x55, 0x55, 0x59, 0xfe, + 0x55, 0x55, 0x30, 0x0, 0x0, 0xd, 0xf6, 0x0, + 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xf, 0xf3, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, + 0xff, 0xfe, 0xb8, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0xbf, + 0xff, 0xfc, 0xff, 0xde, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xf8, 0x10, 0xef, 0x20, 0x16, 0xce, 0x0, + 0xe, 0xff, 0x70, 0x0, 0xef, 0x20, 0x0, 0x2, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x30, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xef, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xef, 0x22, 0x9f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0xaf, 0xf8, 0xb, 0x50, 0x0, + 0x0, 0xef, 0x20, 0x1, 0xef, 0xf4, 0x4f, 0xfc, + 0x51, 0x0, 0xef, 0x20, 0x3d, 0xff, 0xd0, 0x5f, + 0xff, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xff, 0x30, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x10, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2a, 0xef, 0xd8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0xa, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xfa, 0x0, 0x0, 0x6, 0xfd, 0x0, + 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x8, 0xfe, 0x0, + 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x8f, + 0x80, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x1, + 0xff, 0x20, 0x1e, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb2, 0x3, 0xcf, 0xa0, 0xb, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x6, 0xff, 0x20, 0x19, 0xdf, 0xe9, + 0x20, 0x0, 0x0, 0x7b, 0xcb, 0x60, 0x2, 0xff, + 0x60, 0x1e, 0xff, 0xdf, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0xc, 0xfb, 0x10, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe1, 0x3, 0xff, 0x10, 0x0, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, + 0xf9, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x9f, + 0x70, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x7, + 0xfa, 0x0, 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x80, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xda, 0xcf, 0xf3, 0x0, 0x0, + 0x1e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, + 0xfe, 0xa2, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x54, 0x6e, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, 0x3d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xfe, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x50, 0x0, 0x1, 0xdf, + 0xfa, 0x10, 0x4f, 0xff, 0x80, 0x0, 0x5f, 0xf4, + 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x9, 0xff, 0x10, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x91, 0xff, 0xc0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xef, 0xf5, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfc, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1e, 0xff, 0xb2, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xc1, 0x0, + 0x5f, 0xff, 0xfc, 0xa8, 0x9c, 0xff, 0xff, 0x6c, + 0xff, 0xc1, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x1c, 0xfe, 0x20, 0x0, 0x5, 0xad, + 0xff, 0xec, 0x83, 0x0, 0x0, 0x1c, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xbf, 0xfa, 0xef, 0xae, 0xf9, 0xef, 0x9d, + 0xf8, 0xdf, 0x8d, 0xf8, 0x79, 0x40, + + /* U+0028 "(" */ + 0x0, 0x6, 0xff, 0x80, 0x0, 0xef, 0xe0, 0x0, + 0x7f, 0xf8, 0x0, 0xe, 0xff, 0x10, 0x3, 0xff, + 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0xe, 0xff, 0x10, + 0x1, 0xff, 0xd0, 0x0, 0x4f, 0xfa, 0x0, 0x7, + 0xff, 0x80, 0x0, 0xaf, 0xf5, 0x0, 0xc, 0xff, + 0x30, 0x0, 0xcf, 0xf2, 0x0, 0xd, 0xff, 0x20, + 0x0, 0xef, 0xf1, 0x0, 0xe, 0xff, 0x10, 0x0, + 0xdf, 0xf2, 0x0, 0xc, 0xff, 0x20, 0x0, 0xcf, + 0xf3, 0x0, 0xa, 0xff, 0x50, 0x0, 0x7f, 0xf8, + 0x0, 0x4, 0xff, 0xa0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x8, 0xff, 0x60, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x6, + 0xff, 0x80, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x6f, + 0xf8, + + /* U+0029 ")" */ + 0xbf, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x5f, 0xfb, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0xbf, 0xf4, 0x0, 0x8, 0xff, 0x70, 0x0, + 0x6f, 0xf9, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x5f, + 0xfb, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x4f, 0xfc, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x6f, 0xfa, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x8f, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0xef, 0xf1, 0x0, 0x1f, 0xfe, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xf, 0xff, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xcf, + 0xf3, 0x0, 0x3f, 0xfb, 0x0, 0xb, 0xff, 0x30, + 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x9, 0x70, 0x8, + 0xf5, 0x0, 0x87, 0x2, 0xff, 0xd4, 0x8f, 0x56, + 0xef, 0xe0, 0x4, 0xdf, 0xfe, 0xfe, 0xff, 0xb3, + 0x0, 0x0, 0x6e, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x7e, 0xff, + 0xdf, 0xdf, 0xfd, 0x50, 0x2f, 0xfa, 0x28, 0xf5, + 0x3c, 0xfe, 0x0, 0x74, 0x0, 0x8f, 0x50, 0x6, + 0x50, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x40, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0xff, + 0xd8, 0x88, 0x88, 0x30, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x7, 0xca, 0x14, 0xff, 0xf9, 0x6f, 0xff, 0xb2, + 0xef, 0xf8, 0x4, 0xff, 0x30, 0x6f, 0xe0, 0xa, + 0xf9, 0x0, 0xef, 0x30, 0x2f, 0xe0, 0x0, + + /* U+002D "-" */ + 0x1a, 0xaa, 0xaa, 0xaa, 0xa4, 0x2f, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x1, 0x42, 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, + 0xff, 0xf9, 0xa, 0xfc, 0x10, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfc, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xfc, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x40, 0x0, 0x29, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x21, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf6, 0x4f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x96, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfc, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xb4, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xc4, 0x0, + 0x2, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x0, + 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, + 0xf7, 0x9c, 0xcc, 0xce, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, + + /* U+0032 "2" */ + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xe2, 0x0, 0x4f, 0xff, 0xb4, 0x0, 0x0, + 0x18, 0xff, 0xfb, 0x0, 0x4, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0033 "3" */ + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x9, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x6, 0x99, 0xad, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x16, 0xef, + 0xfe, 0x7, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xed, + 0x94, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x3, 0xdd, 0x90, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xc0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, + 0xbb, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0xcc, 0xba, 0x96, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x49, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x6, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x1e, 0xff, 0xb5, 0x10, 0x0, 0x4, + 0xcf, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xfe, 0xdd, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x59, + 0xde, 0xff, 0xdb, 0x61, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x94, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x3, 0xef, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0x10, 0x0, 0x2e, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x36, 0x0, 0x0, 0xcf, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x2, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x6f, 0xfb, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x7f, 0xff, 0xff, 0xd6, 0x10, + 0x3, 0x9f, 0xff, 0xc0, 0x6f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x2f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x8f, 0xff, 0x60, 0x0, 0x0, + 0x2c, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xfe, 0xb9, + 0x9c, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0037 "7" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xff, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xc0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xb, 0xbb, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xed, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0xa9, + 0xbd, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x91, + 0x0, 0x0, 0x4, 0xdf, 0xfe, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x6f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0xcf, 0xfe, 0x83, + 0x10, 0x14, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x1c, 0xff, 0xfc, 0x97, 0x67, 0xaf, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x19, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x14, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, + 0xb9, 0x9a, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x99, + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0xc, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0xaf, 0xff, 0xfb, 0x99, 0xbf, 0xff, 0xaf, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xf2, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, + 0x20, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x3b, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, 0xec, + 0xbc, 0xef, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xff, 0xda, 0x60, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x42, + 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, 0xff, 0xf9, + 0xa, 0xfc, 0x10, + + /* U+003B ";" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc1, 0x5f, 0xff, 0xa6, 0xff, 0xfb, + 0x1d, 0xff, 0x80, 0x3f, 0xf3, 0x7, 0xfd, 0x0, + 0xbf, 0x80, 0xf, 0xf2, 0x2, 0xdb, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x6, 0xcf, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0xd, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x60, + + /* U+003D "=" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 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, 0x7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x1, 0x6d, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xff, 0xa2, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xc6, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xd, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xa, 0xff, 0xff, 0xec, 0xbd, 0xff, 0xff, + 0xf3, 0x6, 0xff, 0xf9, 0x20, 0x0, 0x1, 0x8f, + 0xff, 0xc0, 0x5, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xee, 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, 0x7, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe4, + 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, + 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xea, 0x63, 0x21, 0x23, + 0x58, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe2, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x1, + 0x77, 0x41, 0xdf, 0xd0, 0x0, 0x0, 0x6f, 0xf6, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0x91, 0x3f, + 0xf9, 0x1, 0xef, 0x90, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, + 0x90, 0x4, 0xff, 0x20, 0x6, 0xff, 0x20, 0x0, + 0x3f, 0xff, 0xc4, 0x10, 0x26, 0xef, 0xff, 0xf9, + 0x0, 0xb, 0xf9, 0x0, 0xcf, 0xa0, 0x0, 0xd, + 0xff, 0x80, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x90, + 0x0, 0x5f, 0xe0, 0x1f, 0xf5, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, + 0x0, 0xff, 0x34, 0xff, 0x10, 0x0, 0x9f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0xc, 0xf6, 0x6f, 0xf0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0xbf, 0x77, 0xfe, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0xa, + 0xf8, 0x7f, 0xe0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0xaf, + 0x76, 0xff, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0xb, 0xf6, + 0x3f, 0xf2, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0xff, 0x50, 0x0, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x3f, 0xf0, 0xc, + 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x30, 0x0, 0x0, + 0x6f, 0xff, 0xfd, 0x0, 0xb, 0xfa, 0x0, 0x6f, + 0xf2, 0x0, 0x0, 0xcf, 0xff, 0xb7, 0x68, 0xdf, + 0xf9, 0xcf, 0xfb, 0x7b, 0xff, 0x20, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x93, 0x0, + 0x4, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa6, 0x43, 0x23, 0x47, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9b, 0xef, 0xff, 0xdb, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x1b, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf3, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x40, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x7, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, + + /* U+0042 "B" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x60, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0xaf, 0xfd, 0x99, 0x99, + 0x99, 0x9a, 0xdf, 0xff, 0xf6, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xf9, 0x0, 0xaf, 0xfd, 0x99, 0x99, 0x99, 0x9a, + 0xdf, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x14, 0xaf, + 0xff, 0x80, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf1, 0xaf, 0xfd, + 0x99, 0x99, 0x99, 0x99, 0xad, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xa5, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x7f, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0x0, 0x1e, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x7, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xbd, 0xff, 0xed, 0x95, 0x0, 0x0, + + /* U+0044 "D" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, 0xfe, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xdf, 0xff, 0xd1, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xe0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xd1, + 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xdb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb8, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xc7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x4, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcd, 0x10, 0x1, + 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x6, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x3, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x61, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xef, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, + + /* U+0049 "I" */ + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, + + /* U+004A "J" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x3e, 0x40, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1e, + 0xff, 0x81, 0x0, 0x5, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xfd, 0xce, 0xff, 0xfe, 0x10, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x28, + 0xce, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xd1, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x10, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x10, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe2, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xaf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xa, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x60, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xb0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, + + /* U+004C "L" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x2a, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x2a, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x2a, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf2, 0xaf, 0xfb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xce, 0xff, 0x2a, + 0xff, 0x7b, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0xef, 0xf2, 0xaf, 0xf7, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xe, 0xff, + 0x2a, 0xff, 0x70, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0xef, 0xf2, 0xaf, 0xf7, 0x0, + 0xdf, 0xf5, 0x0, 0x0, 0xb, 0xff, 0x50, 0xe, + 0xff, 0x2a, 0xff, 0x70, 0x3, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xef, 0xf3, 0xaf, 0xf7, + 0x0, 0xa, 0xff, 0x80, 0x0, 0xdf, 0xf2, 0x0, + 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x1e, 0xff, + 0x20, 0x8f, 0xf8, 0x0, 0x0, 0xef, 0xf3, 0xaf, + 0xf7, 0x0, 0x0, 0x6f, 0xfb, 0x2f, 0xfe, 0x0, + 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x50, 0x0, 0x0, 0xef, 0xf3, + 0xaf, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x1e, 0xf7, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf3, + + /* U+004E "N" */ + 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xef, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0x30, 0x0, 0xe, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf3, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x47, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x32, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x30, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0xe, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, 0x93, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xec, 0xbc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xff, + 0xfe, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x30, 0x14, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x67, 0x74, 0x0, 0x0, + + /* U+0052 "R" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf7, + + /* U+0053 "S" */ + 0x0, 0x0, 0x16, 0xbd, 0xef, 0xed, 0xa6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0xbf, 0xff, 0xfd, 0xbb, 0xce, + 0xff, 0xff, 0x60, 0x7, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x27, 0xde, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xcf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf4, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xd0, 0x4e, 0xff, 0xff, 0xfd, 0xbb, + 0xcf, 0xff, 0xfe, 0x20, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x1, 0x59, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xac, 0xcc, 0xcc, 0xcc, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x80, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+0055 "U" */ + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x2, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfd, + 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x7f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xc, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x53, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0xa, 0xff, 0x40, 0x3, 0xff, + 0xd0, 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0xa, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x6f, 0xf9, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0xb, + 0xff, 0x30, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x5f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x1, 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0x40, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x5f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe2, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x4b, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xbf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x1, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x27, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x5d, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x3f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf8, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe0, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x20, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, + + /* U+005B "[" */ + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + 0xaf, 0xfb, 0x88, 0x80, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xfb, 0x88, 0x80, + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xe0, + + /* U+005D "]" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + 0x38, 0x88, 0xef, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x38, 0x88, 0xef, 0xf4, + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + + /* U+005E "^" */ + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x70, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x6, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfa, + 0x0, 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x8f, 0xd0, 0x0, 0x0, 0xaf, 0xc0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0xef, 0x70, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xef, 0xf4, + 0x0, 0x0, 0x1, 0xcf, 0xf6, 0x0, 0x0, 0x0, + 0x8f, 0xf7, + + /* U+0061 "a" */ + 0x0, 0x2, 0x8b, 0xef, 0xfe, 0xb6, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xb, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x20, + 0x2, 0xfa, 0x30, 0x0, 0x0, 0x3e, 0xff, 0xb0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x5, 0xad, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xb, 0xff, 0xe8, 0x43, 0x33, 0x33, 0xcf, 0xf5, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x2d, 0xff, 0xf5, + 0xa, 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xf5, + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x40, 0x9f, 0xf5, + + /* U+0062 "b" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4, 0x9d, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x1f, 0xff, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1, 0xff, 0xfc, + 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xe3, 0x0, 0x1f, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x61, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x61, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, 0x1, + 0xff, 0xec, 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xf3, + 0x0, 0x1f, 0xfd, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x1, 0xff, 0xd0, 0x4, 0xad, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xdb, 0x61, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xf6, 0x0, 0x1e, 0xff, 0xe5, 0x0, 0x0, 0x2a, + 0xff, 0xe0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x9, 0xa1, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x9, 0xa1, 0x0, 0x1e, + 0xff, 0xe5, 0x0, 0x0, 0x2a, 0xff, 0xe0, 0x0, + 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xf5, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, 0x61, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, + 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x2f, 0xfe, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, + 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xcf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, 0x2, + 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x5f, 0xff, + 0xfb, 0x98, 0xaf, 0xff, 0xcf, 0xfe, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xfe, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x30, 0xf, 0xfe, + + /* U+0065 "e" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x9a, 0xcf, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xf9, 0x10, 0x0, + 0x2, 0xcf, 0xfc, 0x0, 0xb, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x7f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x9f, 0xf9, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x30, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0x80, 0x0, 0x2, 0xef, 0xfe, + 0x50, 0x0, 0x0, 0x5d, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xcb, 0xce, 0xff, 0xfc, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x1, 0x9d, 0xff, 0xd7, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfe, 0x99, 0xdd, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x0, 0x10, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x88, 0xdf, 0xfb, 0x88, 0x88, + 0x20, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x40, 0xc, + 0xff, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xcf, 0xf2, 0x0, 0x7f, 0xff, 0xfe, 0xbb, + 0xcf, 0xff, 0xdd, 0xff, 0x20, 0x4f, 0xff, 0xc3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x24, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x2a, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0xaf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x28, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x4, 0xff, 0xfd, 0x40, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xec, + 0xbc, 0xff, 0xfd, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x1f, 0xff, 0x20, 0x0, + 0x0, 0x6b, 0xef, 0xfd, 0x94, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xf7, 0x0, 0x2f, 0xfb, 0x50, + 0x0, 0x0, 0x5, 0xef, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x4a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, + 0x1f, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0xdf, 0xff, 0xcc, 0xdf, 0xff, + 0xf9, 0x0, 0x1f, 0xff, 0xff, 0x60, 0x0, 0x2, + 0xcf, 0xff, 0x30, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x90, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + + /* U+0069 "i" */ + 0x1b, 0xfb, 0x8, 0xff, 0xf6, 0x8f, 0xff, 0x61, + 0xbe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x1, 0xff, 0xf0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0xaf, 0xc1, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xae, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x2, 0x0, 0x8, 0xff, 0xd0, 0x5f, + 0xb9, 0xcf, 0xff, 0x70, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x4a, 0xdf, 0xfc, 0x60, 0x0, + + /* U+006B "k" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x60, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xaf, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x1, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x1d, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0x80, + 0x0, 0x0, 0x1f, 0xff, 0xc1, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, + + /* U+006C "l" */ + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + + /* U+006D "m" */ + 0x1f, 0xfd, 0x0, 0x6b, 0xef, 0xec, 0x71, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xa4, 0x0, 0x0, 0x1f, + 0xfd, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1f, 0xfe, + 0xef, 0xfc, 0xa9, 0xcf, 0xff, 0xf5, 0xdf, 0xff, + 0xb9, 0xae, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xfd, + 0x30, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + + /* U+006E "n" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0xfd, 0xa3, 0x0, + 0x0, 0x1f, 0xfd, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x1f, 0xfe, 0xef, 0xfd, 0xa9, 0xbf, + 0xff, 0xf9, 0x0, 0x1f, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xf8, 0x0, 0x2, 0xef, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x6f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1, 0xef, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, + + /* U+0070 "p" */ + 0x1f, 0xfd, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xd1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x1f, 0xfe, 0xdf, 0xfe, 0xa8, + 0x9d, 0xff, 0xfe, 0x30, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x4, 0xef, 0xfd, 0x10, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x1, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x41, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x71, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x6, 0xff, 0xfd, 0x10, 0x1f, 0xff, 0xbf, + 0xff, 0xcb, 0xcf, 0xff, 0xff, 0x30, 0x1, 0xff, + 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x1f, 0xff, 0x0, 0x39, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x30, 0xf, + 0xfe, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xaf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, 0x5f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xbf, 0xfe, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xfe, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + + /* U+0072 "r" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0x1, 0xff, 0xd1, + 0xbf, 0xff, 0xf0, 0x1f, 0xfd, 0xcf, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0xf9, 0x30, 0x0, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x1, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xdb, 0xaa, 0xdf, 0xff, 0x10, + 0x6, 0xff, 0xe3, 0x0, 0x0, 0x1, 0x87, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6e, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6, 0xf9, 0x30, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xca, 0xac, 0xff, 0xff, 0x50, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x5, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x48, + 0x8d, 0xff, 0xb8, 0x88, 0x82, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x10, 0x0, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xaa, 0xdd, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xae, 0xff, 0xc6, + 0x0, + + /* U+0075 "u" */ + 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xb3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xb1, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xb0, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0xd9, 0x9a, 0xef, 0xfd, 0xff, 0xb0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xfb, + 0x0, 0x0, 0x4a, 0xef, 0xfd, 0x93, 0x3, 0xff, + 0xb0, + + /* U+0076 "v" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x12, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x8f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x64, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xff, 0xb0, 0x0, 0x0, 0x8, + 0xff, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xef, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x4f, 0xf7, 0xb, 0xff, + 0x20, 0x0, 0x9, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0xa, 0xff, 0x10, 0x4f, 0xf8, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x1, 0xff, 0xb0, 0x0, 0xef, 0xe0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x7f, + 0xf5, 0x0, 0x8, 0xff, 0x40, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0xd, 0xfe, 0x0, + 0x0, 0x2f, 0xf9, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x43, 0xff, 0x80, 0x0, 0x0, + 0xcf, 0xf0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x9f, 0xf2, 0x0, 0x0, 0x6, 0xff, + 0x5d, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x6a, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x16, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0xaf, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x6, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x7, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf5, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0xb, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x32, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xab, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x48, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + + /* U+007B "{" */ + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xfa, 0x0, 0x3, 0xff, 0xfd, 0x95, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0x80, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x0, 0x2e, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x18, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x85, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x6, 0xcf, 0xfa, + + /* U+007C "|" */ + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, + + /* U+007D "}" */ + 0x6f, 0xfd, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x2d, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xfc, 0x83, 0x0, 0x2, 0xff, + 0xf0, 0x0, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x38, + 0xbf, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xfd, 0x0, + 0x0, 0x6f, 0xfd, 0x81, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x44, 0x10, 0x0, 0x0, 0x1, 0x54, + 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xfb, + 0x4, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xa, 0xf8, + 0xb, 0xfd, 0x20, 0x7f, 0xfe, 0x62, 0x7f, 0xf3, + 0xf, 0xf3, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xa0, + 0x1f, 0xf0, 0x0, 0x0, 0x7, 0xdf, 0xe8, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x18, 0xdf, 0xea, 0x30, 0x0, 0x2e, 0xfe, + 0xbd, 0xff, 0x60, 0xd, 0xf7, 0x0, 0x3, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x4, 0xfb, 0x7f, 0x50, + 0x0, 0x0, 0xf, 0xe7, 0xf5, 0x0, 0x0, 0x0, + 0xfe, 0x4f, 0xa0, 0x0, 0x0, 0x4f, 0xb0, 0xdf, + 0x70, 0x0, 0x3e, 0xf3, 0x2, 0xef, 0xec, 0xdf, + 0xf7, 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, + + /* U+2022 "•" */ + 0x5, 0xbb, 0x50, 0x5f, 0xff, 0xf5, 0xcf, 0xff, + 0xfc, 0xdf, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0x8, + 0xee, 0x80, + + /* U+F001 "" */ + 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, 0x5, 0x9d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + + /* U+F00B "" */ + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 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, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 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, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x3d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x1d, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x1, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x10, 0x1e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xaa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xa0, 0x9f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfc, 0x1e, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0x1, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x10, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x95, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x3, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf3, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xf1, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xb0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x9f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x67, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf9, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xca, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xda, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0xcf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x6, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x0, 0x5f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xc7, 0x64, 0x57, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9a, + 0xba, 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, 0x77, + 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x91, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x2a, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0x85, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0xff, 0xf3, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x85, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x58, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xa2, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x2a, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x77, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, + 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0xcf, 0xff, 0xff, 0x88, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x1a, 0xa1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc1, 0x2, + 0xdf, 0xfd, 0x20, 0x1c, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0xaf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4f, 0xff, 0xff, 0xd2, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x7f, 0xff, 0xff, 0xb1, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x1c, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xfd, 0x3f, 0xff, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xf3, + 0x6, 0xe4, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0xef, + 0xfe, 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2d, + 0xd2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x61, + 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x50, 0x1e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x57, + 0x75, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, 0x20, + 0x2, 0x6b, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x54, 0x43, 0x5f, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 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, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xf5, 0x34, 0x45, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xb6, 0x20, + 0x2, 0x5a, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3, 0x67, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xe7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xf9, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 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, 0xce, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, + 0xc2, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, + 0x10, 0x9, 0xff, 0xb0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x90, 0x1, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, 0xcf, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, + 0x7f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x6f, + 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, + 0x0, 0x2f, 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x2f, + 0xfe, 0x0, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x6f, 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, 0x7f, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfe, 0x10, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4e, 0xc2, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xce, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x33, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1f, 0xff, 0xfb, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfe, 0x72, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbd, 0xff, 0xdb, 0x61, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xee, 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, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, + + /* U+F04D "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 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, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc5, 0x0, + + /* U+F054 "" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 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, 0xfe, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 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, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, 0x20, 0x2, + 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x4e, 0xfc, 0x70, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x41, 0x17, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x1, 0xcf, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xcf, 0xfc, 0x70, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, + 0x20, 0x2, 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x15, + 0x9c, 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfa, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xde, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x30, 0x2, 0x5b, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x30, 0x4e, 0xfc, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf7, 0x1f, 0xff, 0xfd, + 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xf9, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xc2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xb5, 0x20, 0x1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xca, + 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + + /* U+F074 "" */ + 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, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x40, 0x1e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0xdf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfd, + 0x10, 0x40, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe1, + 0x4, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, 0x20, + 0x3f, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd1, + 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x10, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, + + /* U+F078 "" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfd, 0x10, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf2, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xff, 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, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, + 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F095 "" */ + 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, 0x2e, 0xea, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xec, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x7, 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xc5, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x50, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x40, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x4, 0xdf, 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, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0C9 "" */ + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 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, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 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, + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 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, 0xfe, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0xa, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8e, + 0xe8, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x41, + 0x14, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 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, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xf0, + 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, + 0xf, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, 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, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F124 "" */ + 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, 0x2, 0x9e, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F1EB "" */ + 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, 0x4, 0x7a, 0xde, 0xff, 0xff, 0xed, + 0xa7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x96, + 0x42, 0x10, 0x1, 0x24, 0x69, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf5, 0x5, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x0, 0x46, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x73, 0x20, 0x2, 0x37, 0xbf, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 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, 0x2, 0xbf, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 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, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F241 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 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, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F242 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 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, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F243 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 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, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F244 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 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, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xce, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb5, + 0x5b, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0x6, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x64, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xfd, 0x30, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x10, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf9, 0x12, 0x8f, + 0xf5, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0xaf, 0xff, 0xd3, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, + 0xff, 0xff, 0xff, 0x92, 0x22, 0x22, 0x24, 0xef, + 0xc2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xfd, 0x40, 0x3, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x3a, 0xaa, 0xaa, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x76, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcc, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 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, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xef, 0xff, 0xf4, 0x5, 0x20, + 0x1d, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xfc, 0x19, + 0xff, 0xf4, 0x6, 0xe2, 0x2, 0xef, 0xff, 0xf7, + 0x9f, 0xff, 0xf3, 0x0, 0x9f, 0xf4, 0x6, 0xfe, + 0x10, 0x3f, 0xff, 0xf9, 0xbf, 0xff, 0xfe, 0x20, + 0x9, 0xf4, 0x6, 0xf8, 0x0, 0xaf, 0xff, 0xfb, + 0xdf, 0xff, 0xff, 0xe2, 0x0, 0x94, 0x6, 0x80, + 0x9, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x33, 0x4, 0x20, 0xc, 0xff, 0xff, 0xfe, + 0xcf, 0xff, 0xff, 0x70, 0x3, 0xe4, 0x6, 0xe2, + 0x0, 0xcf, 0xff, 0xfc, 0xaf, 0xff, 0xf7, 0x0, + 0x3f, 0xf4, 0x6, 0xfe, 0x10, 0x1e, 0xff, 0xfb, + 0x7f, 0xff, 0xf7, 0x3, 0xff, 0xf4, 0x6, 0xf8, + 0x0, 0x6f, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x9f, + 0xff, 0xf4, 0x6, 0x80, 0x6, 0xff, 0xff, 0xf5, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x1, 0x0, + 0x6f, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xef, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xf3, 0x3f, + 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xf3, 0x3f, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x10, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x6f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xec, 0xa9, 0x75, 0x30, 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, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, + 0xff, 0xfa, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, + 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfa, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + + /* U+F8A2 "" */ + 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, 0x6, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x1, 0xcf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0x12, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 138, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 137, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 55, .adv_w = 200, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 96, .adv_w = 360, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 338, .adv_w = 318, .box_w = 18, .box_h = 30, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 608, .adv_w = 432, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 883, .adv_w = 351, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1125, .adv_w = 108, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 1139, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 1244, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1349, .adv_w = 205, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1427, .adv_w = 298, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1532, .adv_w = 116, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1555, .adv_w = 196, .box_w = 10, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1570, .adv_w = 116, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1583, .adv_w = 180, .box_w = 14, .box_h = 30, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1793, .adv_w = 342, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 189, .box_w = 9, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2101, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2299, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2486, .adv_w = 343, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2717, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2915, .adv_w = 316, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3113, .adv_w = 306, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3311, .adv_w = 330, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3520, .adv_w = 316, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 116, .box_w = 5, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3772, .adv_w = 116, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3827, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 3940, .adv_w = 298, .box_w = 15, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4015, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4128, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4315, .adv_w = 529, .box_w = 31, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4749, .adv_w = 375, .box_w = 25, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5024, .adv_w = 388, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5244, .adv_w = 370, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5475, .adv_w = 423, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5717, .adv_w = 343, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5904, .adv_w = 325, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6091, .adv_w = 395, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6333, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 159, .box_w = 4, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6597, .adv_w = 263, .box_w = 15, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6762, .adv_w = 368, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6982, .adv_w = 304, .box_w = 16, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 489, .box_w = 25, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7433, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7653, .adv_w = 430, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7928, .adv_w = 370, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8137, .adv_w = 430, .box_w = 26, .box_h = 27, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8488, .adv_w = 372, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8697, .adv_w = 318, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8895, .adv_w = 301, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 405, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9324, .adv_w = 365, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9588, .adv_w = 577, .box_w = 35, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9973, .adv_w = 345, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10215, .adv_w = 331, .box_w = 22, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 336, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10677, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 10797, .adv_w = 180, .box_w = 15, .box_h = 30, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 11022, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 11142, .adv_w = 298, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 11240, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11256, .adv_w = 307, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 19}, + {.bitmap_index = 11274, .adv_w = 306, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11410, .adv_w = 349, .box_w = 19, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11638, .adv_w = 292, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11783, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11999, .adv_w = 313, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 181, .box_w = 13, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12308, .adv_w = 353, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12527, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12743, .adv_w = 143, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12803, .adv_w = 145, .box_w = 10, .box_h = 30, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 12953, .adv_w = 315, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13169, .adv_w = 143, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13217, .adv_w = 541, .box_w = 30, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13472, .adv_w = 349, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13625, .adv_w = 325, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13778, .adv_w = 349, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 13997, .adv_w = 349, .box_w = 18, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14204, .adv_w = 210, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14298, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14434, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14571, .adv_w = 347, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14716, .adv_w = 286, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14878, .adv_w = 460, .box_w = 29, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15125, .adv_w = 283, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15278, .adv_w = 286, .box_w = 19, .box_h = 23, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 15497, .adv_w = 267, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15625, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 15775, .adv_w = 153, .box_w = 4, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 15835, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 15985, .adv_w = 298, .box_w = 16, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 16033, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 16088, .adv_w = 161, .box_w = 6, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 16106, .adv_w = 512, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16634, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17018, .adv_w = 512, .box_w = 32, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17850, .adv_w = 352, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18092, .adv_w = 512, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18588, .adv_w = 512, .box_w = 30, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 19068, .adv_w = 576, .box_w = 36, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19572, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20084, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20516, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21028, .adv_w = 256, .box_w = 16, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21236, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21548, .adv_w = 576, .box_w = 36, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22124, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22508, .adv_w = 352, .box_w = 22, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22860, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 23160, .adv_w = 448, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23636, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24042, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24434, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 24734, .adv_w = 448, .box_w = 30, .box_h = 28, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 25154, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25406, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25658, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26050, .adv_w = 448, .box_w = 28, .box_h = 6, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 26134, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26566, .adv_w = 640, .box_w = 40, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27206, .adv_w = 576, .box_w = 38, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27814, .adv_w = 512, .box_w = 32, .box_h = 30, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28294, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28546, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28798, .adv_w = 640, .box_w = 40, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29318, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29702, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30214, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 30759, .adv_w = 448, .box_w = 29, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31165, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31613, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32005, .adv_w = 448, .box_w = 28, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32369, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32753, .adv_w = 320, .box_w = 22, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 33105, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33553, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 34001, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34433, .adv_w = 512, .box_w = 34, .box_h = 34, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35011, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35395, .adv_w = 640, .box_w = 40, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35975, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36375, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36775, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37175, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37575, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37975, .adv_w = 640, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38508, .adv_w = 448, .box_w = 24, .box_h = 32, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 38892, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 39340, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39885, .adv_w = 640, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40365, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 40749, .adv_w = 515, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 23, 0, 14, -11, 0, 0, + 0, 0, -28, -31, 4, 24, 11, 9, + -20, 4, 25, 2, 22, 5, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -15, 0, 0, 0, 0, + 0, -10, 9, 10, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -10, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -14, 0, -62, 0, + 0, -10, 0, 10, 15, 1, 0, -10, + 5, 5, 17, 10, -9, 10, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -14, -6, -25, 0, -20, + -4, 0, 0, 0, 0, 1, 20, 0, + -15, -4, -2, 2, 0, -9, 0, 0, + -4, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, -4, 19, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 10, 5, 15, -5, 0, 0, 10, -5, + -17, -70, 4, 14, 10, 1, -7, 0, + 18, 0, 16, 0, 16, 0, -48, 0, + -6, 15, 0, 17, -5, 10, 5, 0, + 0, 2, -5, 0, 0, -9, 41, 0, + 41, 0, 15, 0, 22, 7, 9, 15, + 0, 0, 0, -19, 0, 0, 0, 0, + 2, -4, 0, 4, -9, -7, -10, 4, + 0, -5, 0, 0, 0, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -28, 0, -32, 0, 0, 0, + 0, -4, 0, 51, -6, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 31, 0, 0, -19, 0, + 17, 0, -35, -50, -35, -10, 15, 0, + 0, -34, 0, 6, -12, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 15, -62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -6, -10, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -10, 0, -4, 0, -12, -10, 0, -13, + -17, -17, -10, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -6, 0, -9, 0, 0, -4, 0, 15, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -6, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -15, + -4, -15, 10, 0, 0, -10, 5, 10, + 14, 0, -13, -2, -6, 0, -2, -24, + 5, -4, 4, -27, 5, 0, 0, 2, + -27, 0, -27, -4, -45, -4, 0, -26, + 0, 10, 14, 0, 7, 0, 0, 0, + 0, 1, 0, -9, -7, 0, -15, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -4, 0, -10, 5, 0, 0, -6, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 15, -4, 2, -16, 0, 0, + 14, -26, -27, -22, -10, 5, 0, -4, + -33, -9, 0, -9, 0, -10, 8, -9, + -33, 0, -14, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -15, -19, 0, -26, + -12, -11, -12, -15, -6, -14, -1, -10, + -14, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -11, + -11, -2, 0, -15, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -26, -15, 0, + 0, 0, -8, -26, 0, 0, -5, 5, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 4, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -15, 0, -5, 0, -8, -5, + 0, -11, -13, -15, -4, 0, -10, 0, + -15, 0, 0, 0, 0, 41, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -22, + 0, 0, 0, 0, 0, -48, -9, 17, + 15, -4, -22, 0, 5, -8, 0, -26, + -3, -7, 5, -36, -5, 7, 0, 8, + -18, -8, -19, -17, -22, 0, 0, -31, + 0, 29, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -14, -17, -1, -48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -10, 0, 0, 10, + -2, 7, 0, -11, 5, -4, -2, -13, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -6, 0, + 0, -5, 0, 5, -4, 0, -11, 0, + 0, 0, -10, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -4, -6, + -16, -4, -4, -4, -2, -4, -6, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -4, 0, -4, + 0, 0, 0, -4, -6, -4, -5, -6, + -5, 0, 4, 20, -2, 0, -14, 0, + -4, 10, 0, -5, -22, -7, 8, 1, + 0, -24, -9, 5, -9, 4, 0, -4, + -4, -16, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -10, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -10, 0, 0, 0, -17, 0, + 4, -11, 10, 1, -4, -24, 0, 0, + -11, -5, 0, -20, -13, -14, 0, 0, + -22, -5, -20, -19, -25, 0, -13, 0, + 4, 34, -7, 0, -12, -5, -2, -5, + -9, -14, -9, -19, -21, -12, -5, 0, + 0, -4, 0, 2, 0, 0, -36, -5, + 15, 11, -11, -19, 0, 2, -16, 0, + -26, -4, -5, 10, -47, -7, 2, 0, + 0, -33, -6, -27, -5, -37, 0, 0, + -36, 0, 30, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -19, -4, 0, -33, + 0, 0, 0, 0, -16, 0, -5, 0, + -2, -14, -24, 0, 0, -3, -8, -15, + -5, 0, -4, 0, 0, 0, 0, -23, + -5, -17, -16, -4, -9, -13, -5, -9, + 0, -10, -5, -17, -8, 0, -6, -10, + -5, -10, 0, 3, 0, -4, -17, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 4, -10, 21, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -15, 0, + -5, 0, -8, -5, 0, -11, -13, -15, + -4, 0, -10, 4, 20, 0, 0, 0, + 0, 41, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -10, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 10, 4, -5, 0, -16, + -8, 0, 15, -17, -16, -10, -10, 20, + 9, 5, -45, -4, 10, -5, 0, -5, + 6, -5, -18, 0, -5, 5, -7, -4, + -15, -4, 0, 0, 15, 10, 0, -14, + 0, -28, -7, 15, -7, -19, 2, -7, + -17, -17, -5, 20, 5, 0, -8, 0, + -14, 0, 4, 17, -12, -19, -20, -13, + 15, 0, 2, -37, -4, 5, -9, -4, + -12, 0, -11, -19, -8, -8, -4, 0, + 0, -12, -11, -5, 0, 15, 12, -5, + -28, 0, -28, -7, 0, -18, -30, -2, + -16, -9, -17, -14, 14, 0, 0, -7, + 0, -10, -5, 0, -5, -9, 0, 9, + -17, 5, 0, 0, -27, 0, -5, -11, + -9, -4, -15, -13, -17, -12, 0, -15, + -5, -12, -10, -15, -5, 0, 0, 2, + 24, -9, 0, -15, -5, 0, -5, -10, + -12, -14, -14, -19, -7, -10, 10, 0, + -8, 0, -26, -6, 3, 10, -16, -19, + -10, -17, 17, -5, 3, -48, -9, 10, + -11, -9, -19, 0, -15, -22, -6, -5, + -4, -5, -11, -15, -2, 0, 0, 15, + 14, -4, -33, 0, -31, -12, 12, -19, + -35, -10, -18, -22, -26, -17, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 4, -10, 10, 0, 0, -16, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 15, 1, 0, -6, 0, 0, + 0, 0, -4, -4, -6, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 19, 0, 9, 2, 2, -7, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, -5, 9, 0, 15, + 0, 0, 51, 6, -10, -10, 5, 5, + -4, 2, -26, 0, 0, 25, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 19, 72, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -14, 0, + 0, 2, 0, 0, 5, 66, -10, -4, + 16, 14, -14, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -67, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -14, + 0, 0, 0, -14, 0, 0, 0, 0, + -11, -3, 0, 0, 0, -11, 0, -6, + 0, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -14, 0, 0, 0, -9, 5, -6, 0, + 0, -14, -5, -12, 0, 0, -14, 0, + -5, 0, -24, 0, -6, 0, 0, -41, + -10, -20, -6, -18, 0, 0, -34, 0, + -14, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -9, -4, -9, 0, 0, + 0, 0, -11, 0, -11, 7, -6, 10, + 0, -4, -12, -4, -9, -10, 0, -6, + -3, -4, 4, -14, -2, 0, 0, 0, + -45, -4, -7, 0, -11, 0, -4, -24, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -11, 0, -4, 0, 0, 0, -10, + 5, 0, 0, 0, -14, -5, -10, 0, + 0, -14, 0, -5, 0, -24, 0, 0, + 0, 0, -50, 0, -10, -19, -26, 0, + 0, -34, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 16, + 25, -5, -5, -15, 6, 25, 9, 11, + -14, 6, 22, 6, 15, 11, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 24, -9, -5, 0, -4, + 41, 22, 41, 0, 0, 0, 5, 0, + 0, 19, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -43, -6, -4, -21, + -25, 0, 0, -34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -43, -6, -4, + -21, -25, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -12, 5, 0, -5, + 4, 9, 5, -15, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -13, 0, + -5, -4, -10, 0, -5, -20, 0, 32, + -5, 0, -11, -4, 0, -4, -9, 0, + -5, -14, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -43, + -6, -4, -21, -25, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -16, -6, -5, 15, -5, -5, + -20, 2, -3, 2, -4, -14, 1, 11, + 1, 4, 2, 4, -12, -20, -6, 0, + -19, -10, -14, -22, -20, 0, -8, -10, + -6, -7, -4, -4, -6, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -14, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -15, + -4, -11, -4, -6, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 16, 0, 0, -9, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -12, 0, 0, + 22, -7, -17, -16, 4, 6, 6, -1, + -14, 4, 8, 4, 15, 4, 17, -4, + -14, 0, 0, -20, 0, 0, -15, -14, + 0, 0, -10, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -15, + -5, 19, 0, 0, -5, 0, -10, 0, + 0, 7, -12, 0, 5, -5, 4, 1, + 0, -17, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -21, -6, -11, 0, + -15, 0, 0, -24, 0, 19, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -15, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -6, + -4, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -32, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 12, + 0, 0, 0, 0, 0, -32, -29, 2, + 22, 15, 9, -20, 4, 22, 0, 19, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_32 = { +#else +lv_font_t lv_font_montserrat_32 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 35, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_32*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_34.c b/libraries/lvgl/src/font/lv_font_montserrat_34.c new file mode 100644 index 0000000..7577c73 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_34.c @@ -0,0 +1,7011 @@ +/******************************************************************************* + * Size: 34 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 34 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_34.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 1 +#endif + +#if LV_FONT_MONTSERRAT_34 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x5f, 0xff, 0x74, 0xff, 0xf7, 0x4f, 0xff, 0x63, + 0xff, 0xf5, 0x2f, 0xff, 0x52, 0xff, 0xf4, 0x1f, + 0xff, 0x31, 0xff, 0xf3, 0xf, 0xff, 0x20, 0xff, + 0xf1, 0xf, 0xff, 0x10, 0xef, 0xf0, 0xd, 0xff, + 0x0, 0xdf, 0xf0, 0xc, 0xfe, 0x0, 0xcf, 0xd0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x10, 0x2e, 0xff, 0x49, 0xff, 0xfb, 0x8f, + 0xff, 0x90, 0xbf, 0xc1, + + /* U+0022 "\"" */ + 0xdf, 0xf0, 0x0, 0xbf, 0xf2, 0xdf, 0xf0, 0x0, + 0xaf, 0xf1, 0xcf, 0xe0, 0x0, 0xaf, 0xf1, 0xcf, + 0xe0, 0x0, 0xaf, 0xf0, 0xcf, 0xe0, 0x0, 0x9f, + 0xf0, 0xbf, 0xd0, 0x0, 0x9f, 0xf0, 0xbf, 0xd0, + 0x0, 0x8f, 0xf0, 0xbf, 0xc0, 0x0, 0x8f, 0xf0, + 0xaf, 0xc0, 0x0, 0x8f, 0xe0, 0x1, 0x0, 0x0, + 0x1, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x77, 0x77, 0x9f, + 0xf8, 0x77, 0x77, 0x7b, 0xff, 0x77, 0x77, 0x70, + 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x77, 0x77, 0x7f, + 0xfa, 0x77, 0x77, 0x79, 0xff, 0x97, 0x77, 0x60, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xff, 0xdb, 0x71, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xe6, 0x15, 0xfd, + 0x1, 0x4a, 0xff, 0x20, 0xa, 0xff, 0xe2, 0x0, + 0x5f, 0xd0, 0x0, 0x2, 0x70, 0x0, 0xef, 0xf7, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe3, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x35, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd1, 0x7e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xd0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0xaf, + 0xfb, 0x2, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0xc, 0xff, 0x90, 0xdd, 0x30, 0x0, 0x5, 0xfd, + 0x0, 0x4, 0xff, 0xf5, 0x4f, 0xff, 0xb5, 0x10, + 0x5f, 0xd0, 0x28, 0xff, 0xfd, 0x3, 0xef, 0xff, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0x20, 0x1, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x5, 0x9d, 0xef, 0xff, 0xfd, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xb0, 0x0, 0x0, 0xa, 0xfd, 0x30, 0x7, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x7f, 0xc0, + 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0x70, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x9f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfd, 0x30, 0x7, 0xff, 0x40, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x70, 0xa, 0xfe, 0x10, 0x6, 0xbe, 0xda, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x5, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0x90, 0x9, + 0xfe, 0x50, 0x18, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x1, 0xff, 0x40, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf4, 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xf9, 0x0, 0x9, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x0, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0x50, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x2, 0xff, 0x20, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xfc, 0x10, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xcc, 0xff, 0x90, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xfb, 0x50, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5a, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x96, 0x6b, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf5, 0x0, 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x32, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0xc, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0x60, 0x6, 0xff, 0xe3, 0x0, 0x0, 0xcf, + 0xff, 0x40, 0x7, 0xff, 0x60, 0xe, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xc, 0xff, 0x10, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x8f, 0xfc, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0x0, 0x6f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0xc, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x50, 0x1, + 0xdf, 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xfe, 0x3a, + 0xff, 0xf5, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x27, + 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xdf, 0xfd, 0xff, 0xcf, 0xec, 0xfe, 0xcf, 0xeb, + 0xfd, 0xbf, 0xdb, 0xfc, 0xaf, 0xc0, 0x10, + + /* U+0028 "(" */ + 0x0, 0x1, 0xef, 0xf2, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x20, 0x0, 0x7f, 0xfa, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xf, 0xff, 0x30, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, + 0xbf, 0xf8, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xe, 0xff, 0x20, + 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0xef, 0xf2, + + /* U+0029 ")" */ + 0xaf, 0xf7, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0xe, 0xff, 0x40, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0x60, 0x3, + 0xfc, 0x0, 0x19, 0x21, 0xff, 0xc3, 0x3f, 0xc0, + 0x7f, 0xfa, 0x8, 0xff, 0xfb, 0xfe, 0xdf, 0xfd, + 0x40, 0x1, 0x9f, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x2e, 0xff, 0xb5, 0xfc, + 0x6e, 0xff, 0xa0, 0xcd, 0x50, 0x3f, 0xc0, 0x8, + 0xf6, 0x1, 0x0, 0x3, 0xfc, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x87, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x6b, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xaa, 0xdf, 0xfc, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, + 0xf0, 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, + 0xff, 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, + 0xd, 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+002D "-" */ + 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x10, + + /* U+002E "." */ + 0x2, 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, + 0xf1, 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x39, 0xcf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc5, 0x10, 0x26, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0x30, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x70, 0xf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x41, 0x1, + 0x6e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xf0, 0xae, 0xee, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0032 "2" */ + 0x0, 0x0, 0x27, 0xbd, 0xef, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0xa5, + 0x10, 0x2, 0x6e, 0xff, 0xf8, 0x0, 0x7, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe5, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+0033 "3" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xaa, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfd, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfb, 0xd, 0xe5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x7f, 0xff, 0xd8, 0x31, + 0x0, 0x15, 0xcf, 0xff, 0xc0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x1, 0x59, 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x10, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x1, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xe4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x49, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x6f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x1e, 0xff, + 0xe9, 0x52, 0x0, 0x3, 0x9f, 0xff, 0xf4, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, + 0xda, 0x50, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xf3, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x27, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x1, 0x69, 0xaa, + 0x85, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x12, 0xbf, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x5f, 0xff, 0xef, 0xfa, 0x41, 0x1, 0x5b, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0xcf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xe5, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0xbc, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xce, 0xfe, 0xc9, 0x30, 0x0, 0x0, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xfd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xdc, 0xce, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, + 0xff, 0x81, 0x0, 0x0, 0x29, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x40, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x70, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x7, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xb5, 0x10, 0x2, + 0x5c, 0xff, 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0xa9, 0x9a, 0xef, 0xff, + 0xf5, 0x0, 0x6, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x50, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x5f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0xf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, + 0x7, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x16, 0xef, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xdb, 0xcd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xfe, 0xc8, 0x40, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x5e, 0xff, 0xe1, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, 0xf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x6, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0xdf, + 0xff, 0xb5, 0x10, 0x14, 0xaf, 0xfe, 0xff, 0xf5, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xf4, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xfb, 0x21, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x69, + 0xab, 0x97, 0x20, 0x3, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0x72, 0x0, 0x0, 0x38, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 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, 0x2, + 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, 0xf1, + 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+003B ";" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 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, + 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, 0xf0, + 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, 0xff, + 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, 0xd, + 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, + + /* U+003D "=" */ + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 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, + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x6, 0xcf, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x27, 0xcd, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x20, 0x0, + 0x6, 0xef, 0xff, 0x90, 0x9, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x55, 0x51, 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, 0x14, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc8, + 0x64, 0x44, 0x57, 0xae, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x30, 0xd, 0xff, + 0x10, 0x1e, 0xfb, 0x0, 0x0, 0xdf, 0xd0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xf1, 0x0, 0x5f, 0xf3, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0xa9, 0xbf, 0xff, 0xce, + 0xff, 0x10, 0x0, 0xdf, 0x90, 0xa, 0xfe, 0x0, + 0x0, 0xd, 0xff, 0xe4, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x7, 0xfe, 0x0, 0xef, 0xa0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x10, 0x0, 0x2f, 0xf2, 0x1f, 0xf6, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0xff, 0x54, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0xd, 0xf7, 0x5f, + 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xcf, 0x85, + 0xff, 0x10, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0xc, 0xf7, + 0x5f, 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xdf, + 0x74, 0xff, 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0xf, + 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x3, + 0xff, 0x20, 0xef, 0xa0, 0x0, 0x8, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0x8f, 0xd0, 0x9, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xe4, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xf7, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x2e, + 0xff, 0xfd, 0xa9, 0xbe, 0xff, 0xc6, 0xff, 0xfa, + 0xaf, 0xfd, 0x0, 0x0, 0xdf, 0xd0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xc, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x40, 0x0, 0x18, + 0xdf, 0xe9, 0x10, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x29, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xc8, 0x64, 0x44, 0x69, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe3, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x10, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x50, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0xc, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x7f, 0xff, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf7, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xcd, 0xff, 0xff, + 0xe3, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0x20, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x90, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x50, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xfa, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xda, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x20, 0x1, 0x38, 0xef, 0xff, 0xe1, 0x0, 0xc, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x8, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x60, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x1, + 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xe1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xd1, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xfe, 0x20, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xec, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xed, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x30, 0x1, 0x37, 0xcf, 0xff, 0xf3, 0x0, 0xb, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xfa, 0x0, 0x7, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x20, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x54, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xbf, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x62, 0x0, 0x2, 0x6b, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + + /* U+004A "J" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x6, 0xfb, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x1f, 0xff, 0xd5, 0x0, 0x4, 0xdf, 0xff, 0x20, + 0x7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x6b, 0xef, 0xfd, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x40, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x3, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x3f, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xef, 0xff, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x40, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, + + /* U+004C "L" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xec, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x7f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfd, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xef, 0xfd, 0x7f, 0xfd, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x7f, 0xfd, + 0x7f, 0xfd, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x6f, 0xfe, 0x7f, 0xfd, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xdf, 0xf8, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x40, 0x6f, 0xfe, 0x7f, + 0xfd, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xa, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xf1, 0x0, 0x6f, + 0xfe, 0x7f, 0xfd, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0xd, + 0xff, 0x70, 0xef, 0xf4, 0x0, 0x0, 0x6f, 0xfe, + 0x7f, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf9, 0xff, + 0xb0, 0x0, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, + 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + + /* U+004E "N" */ + 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x1d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x5f, 0xff, + 0xd1, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x1d, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd1, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x85, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x1, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfb, 0x62, 0x0, 0x3, 0x7e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0x30, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x62, + 0x0, 0x14, 0x8e, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x10, 0x0, 0x1, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x4f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfa, 0x40, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xc4, + 0x10, 0x28, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xa9, 0x84, 0x0, 0x0, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x14, 0xaf, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x25, 0xbf, + 0xff, 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xd0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x3, 0x8c, 0xdf, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xf8, + 0x20, 0x0, 0x2, 0x6b, 0xff, 0x20, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfb, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xde, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x5f, 0xff, + 0xe8, 0x40, 0x0, 0x0, 0x39, 0xff, 0xfc, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, + 0xdb, 0x72, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xce, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xec, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf7, 0x9f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x68, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x31, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xb, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x20, 0x0, 0x9f, 0xff, 0xe8, 0x30, 0x0, + 0x38, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xef, 0xed, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x6, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xb0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x10, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x4, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x54, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0xe, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfe, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf6, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0xd, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x10, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x1e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xd0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x5f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x9, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + 0x7f, 0xff, 0xaa, 0xa7, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xaa, 0xa7, + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x18, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + 0x3a, 0xaa, 0xdf, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x3a, 0xaa, 0xdf, 0xfc, + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf9, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x4f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xb0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x7, 0xff, 0x10, 0x0, + 0x0, 0xa, 0xfe, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xc, 0xfc, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x6, 0xff, 0x30, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0x90, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+0060 "`" */ + 0x5, 0x88, 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0x40, 0x0, 0x0, 0x2, 0xdf, + 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xd1, 0x0, 0x2f, 0xf9, 0x30, 0x0, 0x2, 0xaf, + 0xff, 0x90, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x14, 0x45, + 0x55, 0x55, 0xef, 0xf5, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0xe, 0xff, 0x61, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x63, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0xf, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xd7, 0x55, 0x7d, 0xff, 0xff, 0xf6, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xff, + 0x60, 0x0, 0x29, 0xdf, 0xfe, 0xc8, 0x20, 0xbf, + 0xf6, + + /* U+0062 "b" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0xef, 0xf5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0xe, 0xff, 0xaf, + 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xef, + 0xff, 0xff, 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, + 0xe, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf7, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xae, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x7e, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0xef, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0xe, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x3a, 0xff, 0xfe, + 0x10, 0xef, 0xf8, 0xff, 0xff, 0xed, 0xff, 0xff, + 0xfe, 0x30, 0xe, 0xff, 0x34, 0xef, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0xef, 0xf3, 0x0, 0x6b, + 0xef, 0xfd, 0x94, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0x40, 0x0, 0xbf, 0xff, 0xc4, 0x0, + 0x1, 0x6e, 0xff, 0xe1, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x40, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x40, 0x0, 0xaf, + 0xff, 0xc4, 0x0, 0x0, 0x6e, 0xff, 0xe1, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0x8c, 0xff, 0xec, 0x71, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x62, + 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, 0xfd, 0xef, + 0xff, 0xfa, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x8f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf1, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xca, 0xbd, 0xff, 0xfa, 0xff, 0xf1, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf1, + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0xff, 0xf1, + + /* U+0065 "e" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xcb, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x18, 0xff, 0xf9, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xb0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x17, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0xef, 0xf4, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xc4, 0x0, 0x0, 0x29, 0xff, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xaf, 0xff, 0xdb, 0xcf, 0x90, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x1, 0x10, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5a, + 0xac, 0xff, 0xfa, 0xaa, 0xaa, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xec, 0x82, 0x0, + 0xcf, 0xf5, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xcf, 0xf5, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xfb, 0xcf, 0xf5, 0x0, 0xcf, + 0xff, 0xb4, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xf5, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, 0x3f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf5, 0x6, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe7, + 0x20, 0x13, 0x8e, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf5, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x59, 0xcc, 0xba, + 0x50, 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, + 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x60, 0x1, 0xff, 0xfa, 0x41, 0x0, 0x0, + 0x28, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x16, 0x9c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0068 "h" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, 0x0, + 0xef, 0xf5, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xf9, 0x0, 0xef, 0xff, 0xfe, 0x61, 0x0, 0x16, + 0xef, 0xff, 0x40, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, + + /* U+0069 "i" */ + 0x2, 0x75, 0x2, 0xff, 0xf9, 0x6f, 0xff, 0xe3, + 0xff, 0xfa, 0x5, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0xef, + 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, + 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, + 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, + 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, + 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, + 0xf5, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x1, 0x66, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xa9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, 0x1, 0x40, + 0x0, 0x9f, 0xff, 0x20, 0x8, 0xfe, 0xce, 0xff, + 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x4, 0xbe, 0xff, 0xc7, 0x0, 0x0, + + /* U+006B "k" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x1c, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x1, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x2e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfe, 0x33, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xe2, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0xef, 0xfd, 0x20, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, + + /* U+006C "l" */ + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, + + /* U+006D "m" */ + 0xef, 0xf3, 0x2, 0x8c, 0xef, 0xec, 0x61, 0x0, + 0x0, 0x27, 0xce, 0xfe, 0xc8, 0x20, 0x0, 0xe, + 0xff, 0x38, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xef, + 0xfc, 0xff, 0xfd, 0xbc, 0xff, 0xff, 0xf3, 0xbf, + 0xff, 0xec, 0xce, 0xff, 0xff, 0x70, 0xe, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x4, 0xef, 0xff, 0x10, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0xe, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xc0, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0xe, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + + /* U+006E "n" */ + 0xef, 0xf3, 0x1, 0x7c, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0xef, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xfc, 0xff, 0xfe, 0xcc, 0xef, + 0xff, 0xf9, 0x0, 0xef, 0xff, 0xfc, 0x30, 0x0, + 0x3, 0xdf, 0xff, 0x40, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, + + /* U+006F "o" */ + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xc4, 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x10, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x80, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x70, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xef, 0xf3, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, + 0x0, 0xe, 0xff, 0x36, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0xef, 0xfa, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x17, 0xff, 0xfe, 0x10, 0xef, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x7e, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xbe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xae, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0xef, 0xff, 0xff, + 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, 0xe, 0xff, + 0xaf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xf5, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x71, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xf8, 0xff, 0xf1, 0x0, 0xcf, + 0xff, 0xc4, 0x0, 0x1, 0x7f, 0xff, 0xff, 0xf1, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xf1, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xf9, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x52, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, + 0x71, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, + + /* U+0072 "r" */ + 0xef, 0xf3, 0x1, 0x7b, 0xec, 0xef, 0xf3, 0x5e, + 0xff, 0xfc, 0xef, 0xf7, 0xff, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0x94, 0x21, 0xef, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x28, 0xce, 0xff, 0xeb, 0x84, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xaf, 0xff, 0xfe, 0xcc, 0xef, 0xff, + 0xe0, 0x0, 0x3f, 0xff, 0x92, 0x0, 0x0, 0x16, + 0xd6, 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x18, 0xdf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x69, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x6, + 0xfd, 0x73, 0x0, 0x0, 0x5, 0xef, 0xfa, 0x0, + 0xef, 0xff, 0xff, 0xdc, 0xdf, 0xff, 0xff, 0x20, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5a, 0xac, 0xff, 0xfa, 0xaa, 0xaa, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x3, 0x20, 0x0, 0x0, 0xbf, + 0xff, 0xec, 0xdf, 0xa0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xea, 0x30, + + /* U+0075 "u" */ + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x2, 0xff, + 0xfe, 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, + 0x7f, 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xcf, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xfe, 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, + 0x3f, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x5, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfa, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x23, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0xd, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xfd, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0x70, 0xef, 0xf2, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0xdf, 0xf1, 0x8, 0xff, 0x80, 0x0, + 0x5, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x4f, 0xfb, 0x0, 0x2f, 0xfd, 0x0, 0x0, + 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0x0, + 0xa, 0xff, 0x40, 0x0, 0xbf, 0xf3, 0x0, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0xff, 0xe0, 0x0, 0x5, 0xff, 0x90, 0x7, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x6f, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xf5, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x3, 0xff, 0xb9, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x1e, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xfa, 0xc, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x9, + 0xff, 0xe1, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x90, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf7, 0x0, 0x3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x3, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xcd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+007B "{" */ + 0x0, 0x0, 0x2, 0x9e, 0xff, 0x40, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xda, + 0x20, 0x0, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xbc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xa2, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2a, 0xef, 0xf4, + + /* U+007C "|" */ + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + + /* U+007D "}" */ + 0x5f, 0xfd, 0x91, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x3a, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xba, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xf2, + 0x0, 0x3a, 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0x30, 0x0, 0x5f, 0xfe, 0x92, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6f, + 0xc0, 0xb, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9, + 0xfa, 0x5, 0xff, 0xd8, 0xbf, 0xfe, 0x30, 0x1, + 0xff, 0x70, 0xbf, 0xc0, 0x0, 0x6f, 0xff, 0xa8, + 0xef, 0xf2, 0xe, 0xf5, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0xcc, 0x20, 0x0, 0x0, 0x19, + 0xef, 0xd6, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x5, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0xaf, + 0xfd, 0xdf, 0xfc, 0x10, 0x8, 0xfc, 0x20, 0x1, + 0xaf, 0xc0, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x5f, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x6f, 0x70, + 0x0, 0x0, 0x3, 0xfa, 0x5f, 0x90, 0x0, 0x0, + 0x5, 0xf9, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x8, 0xfc, 0x20, 0x1, 0xbf, 0xc0, 0x0, 0xaf, + 0xfe, 0xdf, 0xfd, 0x10, 0x0, 0x5, 0xbe, 0xfc, + 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x0, 0x7f, 0xfd, 0x30, 0x5f, + 0xff, 0xfe, 0x1a, 0xff, 0xff, 0xf4, 0xaf, 0xff, + 0xff, 0x44, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xb2, + 0x0, + + /* U+F001 "" */ + 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, + 0x27, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x10, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x89, 0x87, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x24, 0x54, 0x6f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcd, 0xdb, 0x72, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xea, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x17, 0x10, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x0, 0x1, + 0x71, 0xdf, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xfd, 0xff, 0x96, 0x66, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xcc, 0xce, 0xff, 0xff, 0x20, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, + 0x20, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0xef, 0xfc, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xef, + 0xfb, 0x22, 0x26, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xde, 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0xca, 0xaa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xaa, 0xac, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x88, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x88, + 0x8b, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x74, 0x44, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xef, 0xff, + 0xff, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xff, 0x7f, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xf7, + + /* U+F00B "" */ + 0x28, 0x88, 0x88, 0x88, 0x71, 0x0, 0x28, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6e, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 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, 0x7f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x17, 0x88, 0x88, 0x88, 0x71, + 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x61, 0xcf, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x2, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x40, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, + 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf3, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2e, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd1, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe1, + 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x9e, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xc3, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfe, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x3f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xe0, 0x2f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x40, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0x78, 0x9d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xbc, 0xdd, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x4, 0xdf, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0xa1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x2b, 0xff, 0xa0, 0x0, + 0x0, 0x1, 0x93, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, + 0xba, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9a, 0x50, 0x0, 0x0, 0x7, 0xbb, 0xba, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf6, 0x4e, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x2, 0xdf, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0x70, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, 0xa0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x20, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x1, 0xbf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfc, 0x10, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf9, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3e, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xe4, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xd2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xf9, 0x0, 0x9f, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x8, 0xfc, 0x0, 0x0, + 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0x88, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, + 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xb, + 0xff, 0xc0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x99, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x66, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfe, 0x10, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdd, + 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x8, 0xff, 0xff, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xe, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, 0x76, 0xbf, + 0xff, 0xff, 0xff, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 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, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xaa, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xfd, 0xdd, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0x9e, 0xff, + 0xff, 0xff, 0xfb, 0x63, 0x11, 0x36, 0xaf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, 0x81, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, + 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x29, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, + 0x79, 0xba, 0x98, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x43, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 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, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xab, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7f, 0xa1, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xef, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xef, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x1, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2d, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xdf, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x29, 0x40, 0x0, 0x3a, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x98, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x1, 0xff, 0xd3, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x8f, 0xfe, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x1, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8, 0xfb, 0x10, 0x0, 0xaf, 0xfe, 0x0, 0xb, + 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xfe, 0x10, 0x2, + 0xff, 0xf4, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0x80, 0x3, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x8f, + 0xfb, 0x0, 0xf, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x6, 0xff, 0xd0, 0x0, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x5f, 0xfd, + 0x0, 0xf, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x30, 0x6, 0xff, 0xc0, 0x0, 0xff, 0xf2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2d, 0xff, 0xe0, 0x0, 0xaf, 0xfa, 0x0, + 0x2f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0xe, 0xff, 0x70, 0x5, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xdf, 0xf7, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x9f, + 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2, 0x83, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xe, 0xff, 0x70, 0x3a, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x5, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x9d, + 0x60, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x2, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xd9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, 0x50, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x4f, 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x30, + 0x7, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xb5, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xbb, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x50, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf7, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf6, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xab, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xba, 0x81, 0x0, 0x0, + 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04D "" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 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, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb5, 0x5f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x7f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xc4, 0x0, + + /* U+F054 "" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xba, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xa9, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4, 0x67, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x77, 0x77, 0x76, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x20, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xf8, 0x30, 0x0, + 0x2, 0x7e, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x4f, 0xff, 0xa2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x20, 0x4, 0xef, + 0xff, 0xff, 0xff, 0x40, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xde, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x1, 0x69, 0x97, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x95, 0x33, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x2, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x1, 0x59, 0xdf, 0xff, 0xff, 0xff, + 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x90, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xfe, 0x30, 0x2e, 0xfd, + 0x92, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xb1, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe3, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0x95, 0x33, 0x51, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0xac, 0xef, 0xfe, 0xdb, 0x81, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x43, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x20, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xc0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x10, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe2, 0x2, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x30, 0x1e, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x50, 0xb, 0x70, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0xaf, 0xf6, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0x50, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x9f, + 0xff, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0xf6, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xae, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf9, 0x2, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x60, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf1, + 0x1c, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x5, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x4f, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x29, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0xbf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0xd, 0xff, 0xf6, 0xc, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xae, 0x60, 0xd, + 0xff, 0xf6, 0x1, 0xbd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x31, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x5f, 0xff, 0xe0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x5f, 0xff, + 0xe0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x8f, 0xff, 0xe9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, + + /* U+F07B "" */ + 0x1, 0x57, 0x88, 0x88, 0x88, 0x88, 0x87, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x31, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x33, 0x33, 0x4f, 0xff, 0xff, 0xff, 0xf8, + 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, + 0xbc, 0xcc, 0xcb, 0x80, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x55, 0x55, 0x55, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 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, 0x6b, 0x84, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xd9, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfc, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x15, 0x64, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x53, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xe5, 0x27, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0xfe, 0x52, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x7d, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x7, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xfc, 0x28, 0x99, 0x99, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x66, 0x66, + 0x66, 0xdf, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x32, 0x22, 0x22, 0x22, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x90, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xfd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xe2, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x56, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x23, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, + + /* U+F0C9 "" */ + 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 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, 0x0, 0xcf, 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, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, + 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, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 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, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1, 0xc3, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x6f, 0xff, 0x80, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xa, 0xff, 0xff, 0xfc, 0x20, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x1, 0xbf, + 0xff, 0xfa, 0x10, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x3, 0x99, 0x30, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x77, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F0E7 "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x55, 0x55, 0x55, 0x51, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xb9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xaa, + 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xa9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xe4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0x44, 0x44, 0x43, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdc, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xaa, 0xaa, + 0xaa, 0x50, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 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, 0x5f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x43, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0x4f, 0xff, 0xf6, 0x0, 0x6, 0xfe, 0x0, + 0x3, 0xff, 0x10, 0x1, 0xff, 0x50, 0x0, 0x5f, + 0xf1, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xd0, 0x0, 0x2f, 0xf0, 0x0, 0xe, + 0xf3, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, 0xff, + 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, 0x0, 0x2, + 0xff, 0x0, 0x0, 0xef, 0x30, 0x0, 0x3f, 0xe0, + 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf2, 0x0, 0x1f, 0xf5, + 0x0, 0x5, 0xff, 0x10, 0x2, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xa2, 0x22, 0x6f, 0xf3, 0x22, 0x3f, + 0xf6, 0x22, 0x2e, 0xf9, 0x22, 0x27, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xff, 0x30, 0x0, 0xcf, 0x50, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2f, 0xe0, 0x0, 0xf, 0xf3, + 0x0, 0xc, 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xfe, + 0x0, 0x0, 0xff, 0x30, 0x0, 0xdf, 0x60, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xff, 0xfe, 0xdd, 0xef, 0xff, 0xdd, + 0xef, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xfa, 0x44, 0x4a, + 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x9f, 0xf6, 0x44, 0x7f, 0xff, 0xf4, 0xff, + 0xff, 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0xff, 0xff, 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, + 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0x4f, 0xff, 0xf9, 0x44, 0x4a, 0xff, 0x54, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, + 0xf5, 0x44, 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F124 "" */ + 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, 0x7b, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x56, 0x66, 0x66, 0x66, 0x66, 0x67, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x8, 0x20, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xf, 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x22, 0x22, 0x22, 0x22, 0x21, 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, + 0xf8, 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, 0xf8, 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, 0xf8, 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, 0xf8, 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, + 0xf8, 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, 0xf8, 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, 0xf8, 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, 0xf8, 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, + 0xf8, 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, 0xf8, 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, 0xf7, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x10, + + /* U+F1EB "" */ + 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, 0x14, 0x68, 0x9a, + 0xa9, 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x9, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xe2, 0xef, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xb9, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x76, + 0x56, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x5, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x80, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F241 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F242 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F243 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x9, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x4, 0x88, 0x88, + 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F244 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xcc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x7a, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x4e, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, + 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x20, + 0x0, 0x0, 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x91, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1b, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xe6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x55, 0x55, 0x55, 0x8f, 0xfe, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5b, 0xff, + 0xff, 0xc3, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, + 0x9, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xbd, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf2, 0x0, 0xd, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc9, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xac, 0xcf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xcd, 0xcb, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0x10, 0x39, 0x0, 0x5f, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xfe, 0x20, 0xbf, 0xff, + 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, 0xf4, 0x7f, + 0xff, 0xfb, 0x0, 0xb, 0xff, 0x10, 0x3f, 0xf6, + 0x0, 0xaf, 0xff, 0xf7, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0xbf, 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, + 0xf9, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0xb, 0x10, + 0x2a, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0xcf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0x60, 0x1, 0x0, 0x11, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x1d, 0x10, + 0x3d, 0x10, 0xb, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0x60, 0x1, 0xdf, 0x10, 0x3f, 0xc1, 0x0, + 0xcf, 0xff, 0xf8, 0x6f, 0xff, 0xfa, 0x0, 0x2d, + 0xff, 0x10, 0x3f, 0xf4, 0x0, 0x7f, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x52, 0xef, 0xff, 0x20, 0x3f, + 0x50, 0x6, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0x20, 0x35, 0x0, 0x6f, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x7, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8b, 0xef, 0xff, 0xff, 0xeb, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x88, 0x88, + 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x66, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x66, 0x66, 0x66, 0x61, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x13, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x60, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0xb9, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x4, + 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x8, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0xb, 0xff, 0xff, 0xfb, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xf9, + 0x44, 0x7f, 0xf4, 0x45, 0xff, 0x54, 0x4f, 0xff, + 0xf5, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x3f, 0xe0, + 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, 0x0, 0xcf, + 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xff, 0xf5, 0xc, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, + 0xff, 0x10, 0xe, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf8, 0x22, 0x4f, + 0xe2, 0x22, 0xff, 0x22, 0x2e, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3e, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xd4, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 146, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 146, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 60, .adv_w = 213, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 110, .adv_w = 382, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 386, .adv_w = 338, .box_w = 19, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 690, .adv_w = 459, .box_w = 27, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1014, .adv_w = 373, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1289, .adv_w = 114, .box_w = 3, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 1304, .adv_w = 183, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1432, .adv_w = 184, .box_w = 8, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1560, .adv_w = 218, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1645, .adv_w = 317, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1765, .adv_w = 123, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1795, .adv_w = 208, .box_w = 11, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1812, .adv_w = 123, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2067, .adv_w = 363, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2319, .adv_w = 201, .box_w = 10, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2439, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2667, .adv_w = 311, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2883, .adv_w = 364, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3147, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3375, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3615, .adv_w = 325, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3831, .adv_w = 350, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4071, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4311, .adv_w = 123, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4365, .adv_w = 123, .box_w = 6, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4434, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4562, .adv_w = 317, .box_w = 16, .box_h = 11, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4650, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4778, .adv_w = 312, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4994, .adv_w = 562, .box_w = 33, .box_h = 31, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5506, .adv_w = 398, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 412, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6082, .adv_w = 393, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6358, .adv_w = 449, .box_w = 24, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6646, .adv_w = 364, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 345, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7078, .adv_w = 420, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7618, .adv_w = 169, .box_w = 4, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7666, .adv_w = 279, .box_w = 16, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7858, .adv_w = 391, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8122, .adv_w = 323, .box_w = 17, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8326, .adv_w = 520, .box_w = 26, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8638, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8902, .adv_w = 457, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9214, .adv_w = 393, .box_w = 20, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9454, .adv_w = 457, .box_w = 28, .box_h = 29, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9860, .adv_w = 395, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10112, .adv_w = 338, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10340, .adv_w = 319, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10580, .adv_w = 430, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10832, .adv_w = 387, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11144, .adv_w = 613, .box_w = 37, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11588, .adv_w = 366, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11864, .adv_w = 352, .box_w = 24, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 357, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12404, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 12532, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 12772, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 12900, .adv_w = 317, .box_w = 16, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 13012, .adv_w = 272, .box_w = 17, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13038, .adv_w = 326, .box_w = 10, .box_h = 5, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 13063, .adv_w = 325, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13216, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13454, .adv_w = 311, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13616, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13866, .adv_w = 333, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14037, .adv_w = 192, .box_w = 14, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14212, .adv_w = 375, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14462, .adv_w = 370, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14687, .adv_w = 152, .box_w = 5, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14752, .adv_w = 154, .box_w = 12, .box_h = 33, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 14950, .adv_w = 335, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15175, .adv_w = 152, .box_w = 4, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15225, .adv_w = 575, .box_w = 31, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 370, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15666, .adv_w = 345, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15846, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 16084, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 16334, .adv_w = 223, .box_w = 10, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16424, .adv_w = 273, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16577, .adv_w = 225, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16731, .adv_w = 368, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 304, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17082, .adv_w = 489, .box_w = 31, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17361, .adv_w = 300, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17532, .adv_w = 304, .box_w = 21, .box_h = 25, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 17795, .adv_w = 283, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17939, .adv_w = 191, .box_w = 11, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18115, .adv_w = 163, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 18179, .adv_w = 191, .box_w = 10, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 18339, .adv_w = 317, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 18390, .adv_w = 228, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 13}, + {.bitmap_index = 18456, .adv_w = 171, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 18481, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 19111, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19553, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20080, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20522, .adv_w = 374, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20810, .adv_w = 544, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21388, .adv_w = 544, .box_w = 32, .box_h = 35, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21948, .adv_w = 612, .box_w = 39, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22553, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23148, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23655, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24250, .adv_w = 272, .box_w = 17, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24480, .adv_w = 408, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24831, .adv_w = 612, .box_w = 39, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 25475, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25917, .adv_w = 374, .box_w = 24, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26337, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 26689, .adv_w = 476, .box_w = 30, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27229, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27694, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28159, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 28511, .adv_w = 476, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29007, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29292, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29577, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30042, .adv_w = 476, .box_w = 30, .box_h = 7, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 30147, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30654, .adv_w = 680, .box_w = 43, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 31407, .adv_w = 612, .box_w = 40, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 32107, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32634, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 32919, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 33204, .adv_w = 680, .box_w = 44, .box_h = 27, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 33798, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34240, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 34835, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35465, .adv_w = 476, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35946, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36471, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36936, .adv_w = 476, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37341, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37783, .adv_w = 340, .box_w = 23, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 38186, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38711, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39743, .adv_w = 544, .box_w = 36, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 40391, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40846, .adv_w = 680, .box_w = 43, .box_h = 32, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41534, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42007, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42480, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42953, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43426, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43899, .adv_w = 680, .box_w = 43, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44480, .adv_w = 476, .box_w = 26, .box_h = 35, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 44935, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45460, .adv_w = 544, .box_w = 35, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46073, .adv_w = 680, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46632, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47087, .adv_w = 547, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 24, 0, 15, -12, 0, 0, + 0, 0, -30, -33, 4, 26, 12, 9, + -22, 4, 27, 2, 23, 5, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, -16, 0, 0, 0, 0, + 0, -11, 9, 11, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -11, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -15, 0, -66, 0, + 0, -11, 0, 11, 16, 1, 0, -11, + 5, 5, 18, 11, -9, 11, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -15, -7, -27, 0, -22, + -4, 0, 0, 0, 0, 1, 21, 0, + -16, -4, -2, 2, 0, -9, 0, 0, + -4, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -44, -4, 21, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, + 0, 5, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 11, 5, 16, -5, 0, 0, 11, -5, + -18, -75, 4, 15, 11, 1, -7, 0, + 20, 0, 17, 0, 17, 0, -51, 0, + -7, 16, 0, 18, -5, 11, 5, 0, + 0, 2, -5, 0, 0, -9, 44, 0, + 44, 0, 16, 0, 23, 7, 9, 16, + 0, 0, 0, -20, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -11, 4, + 0, -5, 0, 0, 0, -22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -30, 0, -34, 0, 0, 0, + 0, -4, 0, 54, -7, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -53, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 33, 0, 0, -20, 0, + 18, 0, -37, -53, -37, -11, 16, 0, + 0, -36, 0, 7, -13, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 16, -66, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -11, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -11, 0, -4, 0, -13, -11, 0, -14, + -18, -18, -10, 0, -11, 0, -11, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -9, 0, 0, -4, 0, 16, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -16, + -4, -16, 11, 0, 0, -11, 5, 11, + 15, 0, -14, -2, -7, 0, -2, -26, + 5, -4, 4, -29, 5, 0, 0, 2, + -28, 0, -29, -4, -47, -4, 0, -27, + 0, 11, 15, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -16, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -7, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -7, + 0, -4, 0, -11, 5, 0, 0, -7, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 16, -4, 2, -17, 0, 0, + 15, -27, -28, -23, -11, 5, 0, -4, + -35, -10, 0, -10, 0, -11, 8, -10, + -35, 0, -15, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -16, -21, 0, -27, + -13, -11, -13, -16, -7, -15, -1, -10, + -15, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -12, + -12, -2, 0, -16, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -27, -16, 0, + 0, 0, -8, -27, 0, 0, -5, 5, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -11, -11, + 0, -5, -5, -7, 0, 0, 0, 0, + 0, 0, -16, 0, -5, 0, -8, -5, + 0, -12, -14, -16, -4, 0, -11, 0, + -16, 0, 0, 0, 0, 44, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -23, + 0, 0, 0, 0, 0, -51, -10, 18, + 16, -4, -23, 0, 5, -8, 0, -27, + -3, -7, 5, -38, -5, 7, 0, 8, + -19, -8, -20, -18, -23, 0, 0, -33, + 0, 31, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -15, -18, -1, -51, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -11, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -11, 0, 0, 11, + -2, 7, 0, -12, 5, -4, -2, -14, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -7, 0, + 0, -5, 0, 5, -4, 0, -12, 0, + 0, 0, -11, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 5, 0, -8, 0, -4, -7, + -17, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 4, 22, -2, 0, -15, 0, + -4, 11, 0, -5, -23, -7, 8, 1, + 0, -26, -9, 5, -9, 4, 0, -4, + -4, -17, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -11, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -11, 0, 0, 0, -18, 0, + 4, -12, 11, 1, -4, -26, 0, 0, + -12, -5, 0, -22, -14, -15, 0, 0, + -23, -5, -22, -21, -26, 0, -14, 0, + 4, 36, -7, 0, -13, -5, -2, -5, + -9, -15, -10, -20, -22, -13, -5, 0, + 0, -4, 0, 2, 0, 0, -38, -5, + 16, 12, -12, -20, 0, 2, -17, 0, + -27, -4, -5, 11, -50, -7, 2, 0, + 0, -35, -7, -28, -5, -40, 0, 0, + -38, 0, 32, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -21, -4, 0, -35, + 0, 0, 0, 0, -17, 0, -5, 0, + -2, -15, -26, 0, 0, -3, -8, -16, + -5, 0, -4, 0, 0, 0, 0, -24, + -5, -18, -17, -4, -9, -14, -5, -9, + 0, -11, -5, -18, -8, 0, -7, -10, + -5, -10, 0, 3, 0, -4, -18, 0, + 11, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -11, 22, 0, -5, -5, -7, + 0, 0, 0, 0, 0, 0, -16, 0, + -5, 0, -8, -5, 0, -12, -14, -16, + -4, 0, -11, 4, 22, 0, 0, 0, + 0, 44, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -11, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -11, + -5, 0, 0, -11, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 11, 4, -5, 0, -17, + -9, 0, 16, -18, -17, -11, -11, 22, + 10, 5, -47, -4, 11, -5, 0, -5, + 6, -5, -19, 0, -5, 5, -7, -4, + -16, -4, 0, 0, 16, 11, 0, -15, + 0, -30, -7, 16, -7, -21, 2, -7, + -18, -18, -5, 22, 5, 0, -8, 0, + -15, 0, 4, 18, -13, -20, -22, -14, + 16, 0, 2, -40, -4, 5, -9, -4, + -13, 0, -12, -20, -8, -8, -4, 0, + 0, -13, -11, -5, 0, 16, 13, -5, + -30, 0, -30, -8, 0, -19, -32, -2, + -17, -9, -18, -15, 15, 0, 0, -7, + 0, -11, -5, 0, -5, -10, 0, 9, + -18, 5, 0, 0, -29, 0, -5, -12, + -9, -4, -16, -14, -18, -13, 0, -16, + -5, -13, -10, -16, -5, 0, 0, 2, + 26, -9, 0, -16, -5, 0, -5, -11, + -13, -15, -15, -21, -7, -11, 11, 0, + -8, 0, -27, -7, 3, 11, -17, -20, + -11, -18, 18, -5, 3, -51, -10, 11, + -12, -9, -20, 0, -16, -23, -7, -5, + -4, -5, -11, -16, -2, 0, 0, 16, + 15, -4, -35, 0, -33, -13, 13, -21, + -37, -11, -19, -23, -27, -18, 11, 0, + 0, 0, 0, -7, 0, 0, 5, -7, + 11, 4, -10, 11, 0, 0, -17, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 16, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 21, 0, 10, 2, 2, -7, + 0, 11, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 0, -5, 9, 0, 16, + 0, 0, 54, 7, -11, -11, 5, 5, + -4, 2, -27, 0, 0, 26, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 21, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -15, 0, + 0, 2, 0, 0, 5, 70, -11, -4, + 17, 15, -15, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -71, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, -15, 0, 0, 0, 0, + -12, -3, 0, 0, 0, -12, 0, -7, + 0, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -15, 0, 0, 0, -9, 5, -7, 0, + 0, -15, -5, -13, 0, 0, -15, 0, + -5, 0, -26, 0, -6, 0, 0, -44, + -10, -22, -6, -20, 0, 0, -36, 0, + -15, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -10, -4, -9, 0, 0, + 0, 0, -12, 0, -12, 7, -6, 11, + 0, -4, -13, -4, -9, -10, 0, -7, + -3, -4, 4, -15, -2, 0, 0, 0, + -48, -4, -8, 0, -12, 0, -4, -26, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -12, 0, -4, 0, 0, 0, -11, + 5, 0, 0, 0, -15, -5, -11, 0, + 0, -15, 0, -5, 0, -26, 0, 0, + 0, 0, -53, 0, -11, -20, -27, 0, + 0, -36, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 17, + 27, -5, -5, -16, 7, 27, 9, 12, + -15, 7, 23, 7, 16, 12, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 26, -10, -5, 0, -4, + 44, 23, 44, 0, 0, 0, 5, 0, + 0, 20, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -46, -7, -4, -22, + -27, 0, 0, -36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -46, -7, -4, + -22, -27, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -13, 5, 0, -5, + 4, 10, 5, -16, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -14, 0, + -5, -4, -11, 0, -5, -22, 0, 34, + -5, 0, -12, -4, 0, -4, -9, 0, + -5, -15, -11, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -46, + -7, -4, -22, -27, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -17, -7, -5, 16, -5, -5, + -22, 2, -3, 2, -4, -15, 1, 12, + 1, 4, 2, 4, -13, -22, -7, 0, + -21, -10, -15, -23, -21, 0, -9, -11, + -7, -7, -4, -4, -7, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -15, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -16, + -4, -12, -4, -7, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 17, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 23, -7, -18, -17, 4, 6, 6, -1, + -15, 4, 8, 4, 16, 4, 18, -4, + -15, 0, 0, -22, 0, 0, -16, -15, + 0, 0, -11, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -16, + -5, 20, 0, 0, -5, 0, -11, 0, + 0, 7, -13, 0, 5, -5, 4, 1, + 0, -18, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -22, -7, -12, 0, + -16, 0, 0, -26, 0, 20, -5, 0, + -10, 0, 3, 0, -5, 0, -5, -16, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34, 0, 12, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 11, 0, 13, + 0, 0, 0, 0, 0, -34, -31, 2, + 23, 16, 9, -22, 4, 23, 0, 20, + 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_34 = { +#else +lv_font_t lv_font_montserrat_34 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 38, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_34*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_36.c b/libraries/lvgl/src/font/lv_font_montserrat_36.c new file mode 100644 index 0000000..f5ef2ec --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_36.c @@ -0,0 +1,7655 @@ +/******************************************************************************* + * Size: 36 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 36 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_36.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 1 +#endif + +#if LV_FONT_MONTSERRAT_36 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x1f, 0xff, + 0xc0, 0xf, 0xff, 0xb0, 0xf, 0xff, 0xb0, 0xf, + 0xff, 0xa0, 0xf, 0xff, 0x90, 0xe, 0xff, 0x90, + 0xd, 0xff, 0x80, 0xd, 0xff, 0x70, 0xc, 0xff, + 0x70, 0xc, 0xff, 0x60, 0xb, 0xff, 0x50, 0xa, + 0xff, 0x50, 0xa, 0xff, 0x40, 0x9, 0xff, 0x30, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x76, 0x0, 0x2f, + 0xff, 0xc0, 0x7f, 0xff, 0xf1, 0x5f, 0xff, 0xf0, + 0x8, 0xed, 0x40, + + /* U+0022 "\"" */ + 0xbf, 0xf4, 0x0, 0x3f, 0xfc, 0xbf, 0xf4, 0x0, + 0x3f, 0xfc, 0xaf, 0xf3, 0x0, 0x2f, 0xfb, 0xaf, + 0xf3, 0x0, 0x2f, 0xfb, 0xaf, 0xf2, 0x0, 0x1f, + 0xfb, 0x9f, 0xf2, 0x0, 0x1f, 0xfa, 0x9f, 0xf2, + 0x0, 0x1f, 0xfa, 0x9f, 0xf1, 0x0, 0xf, 0xf9, + 0x8f, 0xf1, 0x0, 0xf, 0xf9, 0x49, 0x90, 0x0, + 0x9, 0x95, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, + 0x7, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x89, 0x99, 0x9f, + 0xfe, 0x99, 0x99, 0x99, 0xdf, 0xf9, 0x99, 0x99, + 0x30, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, + 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x9, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x99, + 0x9e, 0xfe, 0x99, 0x99, 0x91, 0x0, 0x0, 0x0, + 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xdf, 0xff, 0xc6, 0x2c, 0xf9, 0x24, 0x8d, + 0xff, 0x40, 0x6, 0xff, 0xf9, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x4a, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xa0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x60, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0xae, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfc, 0xcf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x2, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0xaf, 0xfd, + 0x4, 0x30, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0xef, 0xfb, 0xc, 0xf9, 0x10, 0x0, 0xc, 0xf8, + 0x0, 0x9, 0xff, 0xf6, 0x4f, 0xff, 0xfa, 0x62, + 0x1c, 0xf8, 0x15, 0xcf, 0xff, 0xd0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x71, + 0x4, 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x9, 0xfc, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0xc, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x1, 0xff, + 0x70, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x71, 0x4, 0xdf, 0xe0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8f, 0xf4, + 0x0, 0x5c, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xfe, 0x91, 0x0, 0x3f, 0xf8, 0x0, 0xaf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x7f, 0xf8, 0x11, + 0x5e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0xf, 0xf7, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x5, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xaf, 0xa0, 0x0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xdf, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xed, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfd, + 0x70, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x18, 0xce, 0xfe, 0xc7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xea, 0x89, 0xef, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x2b, 0xff, 0xf7, 0x0, 0x0, 0xb, 0x83, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x2f, 0xfc, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0xef, 0xf3, 0x0, 0x4f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xc0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, + 0x1f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xd2, 0x7f, 0xff, 0xc0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xad, 0xef, 0xed, 0xa5, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xbf, 0xf4, 0xbf, 0xf4, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf2, 0x9f, 0xf2, 0x9f, 0xf2, 0x9f, 0xf1, + 0x8f, 0xf1, 0x49, 0x90, + + /* U+0028 "(" */ + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x7, 0xff, 0xe0, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0xe, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfb, + + /* U+0029 ")" */ + 0x9f, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x5f, 0xff, 0x10, + 0x0, 0xf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xa0, + 0x0, 0xf, 0xff, 0x40, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x9f, 0xfb, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x4, 0x40, + 0x0, 0xdf, 0x40, 0x1, 0x70, 0xd, 0xfb, 0x20, + 0xdf, 0x40, 0x8f, 0xf4, 0x1b, 0xff, 0xf9, 0xef, + 0x9e, 0xff, 0xe4, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x7, 0xff, 0xfc, 0xef, 0xbf, 0xff, 0xb2, 0x1f, + 0xfe, 0x60, 0xdf, 0x42, 0xbf, 0xf6, 0x6, 0x80, + 0x0, 0xdf, 0x40, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x87, 0xdd, 0xdd, 0xdd, + 0xff, 0xfd, 0xdd, 0xdd, 0xd7, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, 0x3f, 0xff, + 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, 0xf1, 0x0, + 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, 0xff, 0x0, + 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+002D "-" */ + 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, 0x4f, 0xff, + 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, 0x70, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb5, 0x33, 0x5a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0xf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x2f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf3, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x3, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xa5, 0x33, 0x5a, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, + 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x11, + 0x11, 0x11, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, + + /* U+0032 "2" */ + 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, + 0xfe, 0x95, 0x32, 0x36, 0xbf, 0xff, 0xf6, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe3, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+0033 "3" */ + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x12, 0xdf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x33, 0x6a, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x45, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x48, + 0xff, 0xff, 0xc8, 0x53, 0x23, 0x5a, 0xff, 0xff, + 0xb0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xed, 0xa5, 0x10, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x31, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x7d, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x8, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xb0, 0x2f, 0xff, 0xfe, 0xa6, 0x42, 0x34, + 0x8e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xeb, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x94, 0x21, 0x13, 0x6b, + 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x70, 0x3, 0x8c, 0xef, 0xed, + 0x94, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x4f, 0xff, + 0x6d, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0x40, + 0x3, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x1, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x20, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x5, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, + 0xc5, 0x0, 0x0, 0x3a, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xee, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xef, 0xf9, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x90, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfb, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x89, 0x94, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xfe, 0xdb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xb, 0xff, 0xfe, 0x61, 0x0, 0x1, 0x5d, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x1, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x29, 0xff, 0xfb, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0xbb, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x1d, 0xff, 0xfd, 0x73, 0x0, 0x2, 0x6c, + 0xff, 0xfe, 0x20, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x1, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x76, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf9, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x82, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xfb, + 0x51, 0x0, 0x0, 0x4a, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xde, 0xfe, 0xdb, 0x73, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xdb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, + 0xfc, 0x50, 0x0, 0x4, 0xaf, 0xff, 0xd0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x20, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0xd, 0xff, + 0xfd, 0x50, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xf7, + 0x2, 0xef, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf5, + 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x32, 0xff, 0xf6, 0x0, 0x0, 0x38, 0xce, + 0xfe, 0xd9, 0x40, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0xbc, 0x73, 0x10, 0x13, 0x7d, + 0xff, 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x17, 0xbd, 0xff, 0xfd, 0xb7, 0x20, 0x0, + 0x0, 0x0, + + /* U+003A ":" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 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, 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, + 0x4f, 0xff, 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, + 0x70, + + /* U+003B ";" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 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, 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, + 0x3f, 0xff, 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, + 0xf1, 0x0, 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, + 0xff, 0x0, 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, + + /* U+003D "=" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x60, 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, 0x7d, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x1, + 0x7d, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0xd7, + 0x31, 0x1, 0x4a, 0xff, 0xff, 0x80, 0x2c, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, + 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 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, 0x17, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xbe, + 0xef, 0xfe, 0xca, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xfd, 0xa7, 0x65, 0x56, 0x8b, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0x5a, 0xef, 0xfd, 0x94, 0x0, 0x7f, 0xfa, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x27, + 0xff, 0xa0, 0x0, 0xcf, 0xe0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xcd, 0xff, + 0xfe, 0x9f, 0xfa, 0x0, 0x4, 0xff, 0x60, 0x5, + 0xff, 0x60, 0x0, 0x2, 0xff, 0xfe, 0x60, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xa0, 0x0, 0xd, 0xfb, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xf0, 0xe, 0xfc, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0x31, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x1f, 0xf6, 0x2f, 0xf7, 0x0, + 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0xff, 0x73, 0xff, + 0x60, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xf, 0xf7, + 0x3f, 0xf6, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0x72, 0xff, 0x70, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, + 0x0, 0x1f, 0xf6, 0x1f, 0xf9, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0x30, 0xef, 0xc0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xf0, 0xa, 0xff, + 0x10, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0xd, 0xfb, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xe6, 0x0, + 0x0, 0x17, 0xff, 0xef, 0xff, 0x30, 0x8, 0xff, + 0x40, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xe1, 0xef, 0xff, 0xcd, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x5, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x40, 0x0, + 0x4, 0xbe, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x28, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xda, 0x76, 0x66, 0x8a, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + + /* U+0042 "B" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x3f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xf9, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xf5, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0x5c, 0xff, 0xfb, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x3, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xf4, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x33, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x13, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xef, 0xff, 0x90, 0x3f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xc0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xd2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0044 "D" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x3f, + 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, 0x8d, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, + 0x8d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, + + /* U+0046 "F" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0xff, 0xf6, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x53, 0x24, 0x5a, 0xef, 0xff, 0xf8, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xf3, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x30, + 0x0, 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xa7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfb, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x43, 0x23, 0x59, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x73, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + + /* U+0049 "I" */ + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, + 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, + 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x60, + + /* U+004A "J" */ + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x93, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8, 0xfe, 0x30, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x1f, 0xff, 0xfa, 0x41, 0x14, 0xbf, 0xff, 0xe0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x4, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x4, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x63, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x60, 0xa, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd1, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + + /* U+004C "L" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, 0xef, 0xf9, + 0x3f, 0xff, 0x3c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf9, 0x3f, 0xff, + 0x33, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x9f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x1e, 0xff, 0x90, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x9, 0xff, + 0xe1, 0x8, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xf9, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x5f, 0xff, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + + /* U+004E "N" */ + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0xdf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x2, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, + 0xf6, 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x2, + 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x2, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd3, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc7, + 0x43, 0x23, 0x6b, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x2f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xc7, 0x43, 0x23, 0x6a, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x74, 0x32, 0x46, 0xbf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x4f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x70, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x52, 0x11, + 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x30, 0x0, 0x3a, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xff, + 0xeb, 0x60, 0x0, + + /* U+0052 "R" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfd, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf3, + + /* U+0053 "S" */ + 0x0, 0x0, 0x1, 0x7b, 0xdf, 0xff, 0xeb, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0xff, 0xd7, 0x31, 0x1, 0x25, 0x9e, 0xff, 0x40, + 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0xd, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x5f, 0xff, 0xfd, 0x84, 0x21, 0x1, + 0x37, 0xdf, 0xff, 0xc0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xda, 0x61, + 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x11, 0x11, 0x11, 0x14, 0xff, 0xf6, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0xc, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf3, 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x50, 0x0, + 0x3f, 0xff, 0xfe, 0x85, 0x32, 0x36, 0xcf, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, 0x95, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x5f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x50, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x79, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x35, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x5, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf7, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xc0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xa0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xb0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x1b, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xba, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x1e, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x2f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x3f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf4, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0xb, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x1, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x9f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x5c, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfc, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0x3f, 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0xff, + 0xf4, 0x3f, 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xff, 0x40, + + /* U+005C "\\" */ + 0x28, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xff, 0x35, 0xff, 0xff, 0xff, + 0xf3, 0x4d, 0xdd, 0xdf, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x4d, + 0xdd, 0xdf, 0xff, 0x35, 0xff, 0xff, 0xff, 0xf3, + 0x5f, 0xff, 0xff, 0xff, 0x30, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xc, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x60, 0x6f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x20, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0xc, 0xfe, + 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + + /* U+005F "_" */ + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x88, 0x60, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x10, 0x0, 0x0, 0x6, 0xff, + 0xd1, + + /* U+0061 "a" */ + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x1, 0xff, 0xe8, 0x30, 0x0, + 0x26, 0xef, 0xff, 0x70, 0x0, 0x67, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0xff, 0xff, 0xb8, 0x77, 0x77, + 0x77, 0xff, 0xf6, 0xd, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xc, + 0xff, 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf6, + 0x3, 0xff, 0xff, 0xb8, 0x78, 0xcf, 0xfe, 0xff, + 0xf6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xef, 0xf6, 0x0, 0x1, 0x6b, 0xef, 0xfd, 0xa6, + 0x0, 0xef, 0xf6, + + /* U+0062 "b" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x2, 0x8c, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xb, 0xff, + 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, + 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xb, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xb, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xbf, 0xf9, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0xb, 0xff, + 0x90, 0x2, 0x8c, 0xef, 0xec, 0x83, 0x0, 0x0, + 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, + 0xa4, 0x10, 0x14, 0xbf, 0xff, 0xe1, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x52, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x52, 0x0, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x4, + 0xff, 0xff, 0xa4, 0x10, 0x14, 0xaf, 0xff, 0xe1, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, + 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x5, 0xad, 0xff, 0xdb, + 0x50, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x3f, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0xfa, 0x41, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x46, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x46, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x41, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, + 0x7f, 0xff, 0xf7, 0x10, 0x0, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xec, 0xef, + 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x6, 0xad, 0xff, 0xeb, 0x60, 0x0, 0xff, + 0xf4, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, + 0xff, 0xd5, 0x10, 0x0, 0x4c, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x40, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0x4f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x6f, 0xff, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7, 0xe2, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x51, 0x0, 0x26, 0xdf, 0xfd, 0x10, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x92, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0xfe, 0xdf, 0xf5, 0x0, 0x0, 0xef, + 0xfe, 0x30, 0x0, 0x50, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5c, + 0xcd, 0xff, 0xfd, 0xcc, 0xcc, 0x80, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x6a, 0xdf, 0xfe, 0xb6, 0x10, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xcf, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0xff, 0x80, + 0x9, 0xff, 0xff, 0x94, 0x10, 0x3, 0x8f, 0xff, + 0xff, 0xf8, 0x5, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x80, 0xdf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x85, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x87, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf8, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x82, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x80, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xfa, 0x41, + 0x1, 0x39, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xf8, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x6, 0xad, 0xff, + 0xeb, 0x71, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x7, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x1, + 0xff, 0xff, 0xa6, 0x20, 0x0, 0x26, 0xdf, 0xff, + 0xe1, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfe, 0xb8, 0x20, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x3, 0x8c, 0xef, + 0xec, 0x81, 0x0, 0x0, 0xbf, 0xfb, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xb, 0xff, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xd6, 0x21, 0x14, 0xaf, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x1b, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x5b, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + + /* U+0069 "i" */ + 0x0, 0x66, 0x10, 0xd, 0xff, 0xd0, 0x4f, 0xff, + 0xf4, 0x2f, 0xff, 0xf2, 0x6, 0xdd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x57, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xce, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xb0, 0x4, 0x60, 0x0, 0x9f, + 0xff, 0x60, 0xb, 0xff, 0xef, 0xff, 0xfe, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xbe, + 0xff, 0xd8, 0x10, 0x0, + + /* U+006B "k" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x2d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xe3, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xbf, 0xfe, 0x20, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x10, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, + + /* U+006C "l" */ + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, + + /* U+006D "m" */ + 0xbf, 0xf9, 0x0, 0x5a, 0xdf, 0xfd, 0xb5, 0x0, + 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0xf9, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xbf, 0xfc, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x27, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0x92, 0x0, 0x3, 0xcf, 0xff, + 0xef, 0xff, 0xa3, 0x0, 0x3, 0xbf, 0xff, 0xd0, + 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + + /* U+006E "n" */ + 0xbf, 0xf9, 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x10, + 0x0, 0xb, 0xff, 0x92, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xbf, 0xfb, 0xef, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x17, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf1, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x4b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x60, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xf3, 0x0, 0x2, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe1, 0x0, 0xaf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf5, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, 0x5, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0xb, 0xff, 0x91, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0xbf, 0xfb, 0xdf, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xb, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x4, 0xbf, 0xff, + 0xe1, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0xbf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf9, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, + 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0xbf, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0xb, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x27, 0xdf, 0xff, 0xe1, 0x0, + 0xbf, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xb, 0xff, 0xb0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x28, 0xce, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xb6, 0x0, + 0xf, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xff, 0xf4, 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf4, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0x3, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xff, 0xf4, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x33, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6a, 0xdf, 0xfd, 0xb5, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, + + /* U+0072 "r" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0x8b, 0xff, 0x90, + 0xaf, 0xff, 0xf8, 0xbf, 0xf9, 0xbf, 0xff, 0xff, + 0x8b, 0xff, 0xff, 0xff, 0x96, 0x42, 0xbf, 0xff, + 0xfc, 0x10, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x6, 0xad, 0xff, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x1f, 0xff, 0xe6, 0x10, 0x0, 0x25, + 0xbf, 0x60, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0xa7, 0x30, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x0, 0x4, + 0x8b, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x8e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, + 0x7f, 0xfc, 0x73, 0x0, 0x0, 0x3a, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x5c, 0xcd, 0xff, 0xfd, 0xcc, 0xcc, + 0x80, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x50, 0x1, 0x81, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xef, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xfc, + 0x81, + + /* U+0075 "u" */ + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x19, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x10, 0xcf, + 0xff, 0xb3, 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, + 0x2, 0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xaf, + 0xff, 0x10, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x53, 0xff, 0xf1, 0x0, 0x0, 0x4a, 0xdf, 0xfe, + 0xb6, 0x0, 0x3f, 0xff, 0x10, + + /* U+0076 "v" */ + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x52, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x90, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xef, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xd7, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0xbf, 0xf7, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x7, 0xff, 0xb0, 0x4, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x9, 0xff, 0x80, 0x0, 0x2, 0xff, + 0xf0, 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0xef, 0xf2, 0x0, 0x0, 0xc, + 0xff, 0x50, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf6, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xcb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x1, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd1, 0x1e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf5, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, 0xb, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, + 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x30, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x3f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x10, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x72, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xa3, 0x0, 0x3d, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x4c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, + + /* U+007B "{" */ + 0x0, 0x0, 0x7, 0xcf, 0xff, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xec, 0x0, + 0xd, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xcd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xec, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x7, 0xcf, 0xff, + + /* U+007C "|" */ + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, + + /* U+007D "}" */ + 0x5f, 0xfe, 0xb4, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x3, + 0xff, 0xff, 0xd7, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x4d, 0xff, 0xff, + 0xf2, 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5f, 0xfe, 0xa4, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x6c, 0xfe, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xb, + 0xfb, 0x3f, 0xff, 0xbb, 0xff, 0xfc, 0x20, 0x4, + 0xff, 0x79, 0xff, 0x30, 0x3, 0xdf, 0xff, 0xbb, + 0xff, 0xf2, 0xcf, 0x90, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0xa, 0xc5, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xc5, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7b, 0xdb, 0x71, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x92, + 0x2, 0x8f, 0xf3, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x7f, 0xd0, 0x2f, 0xe0, 0x0, 0x0, 0x0, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0x62, 0xfe, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xd, 0xf6, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x4f, 0xf7, 0x10, 0x7, 0xff, + 0x50, 0x0, 0x6f, 0xff, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x29, 0xdf, 0xea, 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x37, 0x50, 0x0, 0x9f, 0xff, 0xd1, 0x5f, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xb1, 0xff, 0xff, 0xf5, 0x3, 0xcf, 0xd5, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x69, 0xbc, 0xac, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0x43, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xa3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xba, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6f, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xf6, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0xff, 0xec, 0xcc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x88, + 0x8c, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xc8, 0x88, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xce, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0x7f, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xf6, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 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, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 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, 0x6e, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xa, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x6c, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcc, 0x40, 0x0, 0x8f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x50, 0x0, 0x6c, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcc, 0x40, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xed, 0x10, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x4, 0xed, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf4, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x7f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x20, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xb0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe0, + 0x4f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, 0x6f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, + 0xcd, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xce, 0xee, 0xda, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x18, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa2, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x6e, 0xff, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb2, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7, + 0x40, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xce, 0xee, 0xda, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x62, 0x0, 0x0, 0x0, 0x6, 0x77, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x2, 0x50, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0x40, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, + 0xd2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfb, + 0x10, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x5f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xe3, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xa, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xd2, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x4, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0x80, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x2, 0xdf, 0xff, + 0xe1, 0xa, 0xff, 0x50, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0xbf, 0xf3, 0x0, 0x9, 0x30, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 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, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x33, 0x33, + 0x39, 0xff, 0xff, 0xff, 0xff, 0x93, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8, 0xff, 0xff, 0x80, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x5, 0x50, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x70, 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0xc, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x9, 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, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x9b, 0xde, 0xec, 0xa7, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x24, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xed, 0xcb, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 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, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xbc, + 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xca, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x42, 0x24, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, + 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x16, + 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x4e, 0xe4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x5f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xff, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5f, 0xf7, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x11, 0x0, 0x1, 0x67, 0x77, 0x77, 0x77, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xa8, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x1f, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x1e, 0xff, 0xc0, 0x0, + 0xbf, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0x20, 0x6, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x1, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0xbf, + 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x6f, 0xff, 0x0, 0xa, 0xff, 0xc0, 0x0, 0xef, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0xbf, 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x1, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x8f, 0xff, 0x20, + 0x7, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xc0, 0x0, 0xbf, 0xfd, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x30, 0x0, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x1c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x1c, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xfc, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbd, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, 0xff, 0xd0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x18, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x83, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x6, 0x77, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x65, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xf2, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x1, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x42, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 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, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc5, 0x0, + + /* U+F054 "" */ + 0x0, 0x9, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 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, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xad, 0xef, 0xfe, 0xdb, 0x85, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x76, + 0x8a, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x14, 0x53, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x11, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x6, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x23, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8e, 0xff, + 0xfb, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x66, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xdb, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x16, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xfe, 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x76, + 0x79, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, 0x32, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf6, 0x1, 0xff, 0xfe, 0x80, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfa, 0xb, 0xff, 0xff, 0xd2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xd0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x30, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xd9, 0x66, 0x76, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x9c, 0xde, 0xfe, 0xdc, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x10, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x17, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, + 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xaa, 0xaf, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x56, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0x50, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x7a, 0xaa, + 0xaa, 0xaa, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0xaa, 0xaf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x90, 0x0, + + /* U+F078 "" */ + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 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, 0x2d, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0x7c, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x1f, 0xff, 0xf6, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x1, 0xff, 0xff, 0x60, 0x1d, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xa9, 0x10, 0x1f, + 0xff, 0xf6, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfc, 0x1, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x1f, 0xff, 0xf6, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x68, 0x88, 0x88, + 0x73, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x10, 0x0, 0x0, 0x1, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x77, 0x65, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x3, 0x54, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe3, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x55, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x50, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x44, 0x44, 0x44, 0x43, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xf1, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x60, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 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, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 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, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 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, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x1, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfe, + 0x40, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5e, + 0xff, 0xff, 0xe5, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x1, 0x8e, 0xe8, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 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, 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, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x66, 0x6a, 0xff, 0xff, 0xff, 0xd6, + 0x66, 0x66, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xb, 0xbb, 0xbb, 0xb7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x9f, 0xff, 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, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xe8, 0x88, 0xaf, 0xfc, + 0x88, 0x8c, 0xff, 0xa8, 0x88, 0xdf, 0xf9, 0x88, + 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xf4, 0x0, 0x4, 0xff, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, + 0xf0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0xef, 0x50, + 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xf6, 0x0, 0x6, 0xff, 0x20, 0x0, 0x8f, + 0xf1, 0x0, 0x1f, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x5f, + 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, 0x7f, 0xf7, + 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0xe, + 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xf0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x44, 0x5f, 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, + 0x7f, 0xf7, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x2, 0xff, 0xff, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0xe8, 0x88, 0xaf, + 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F124 "" */ + 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, 0x47, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xd1, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xd1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xf, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x30, + + /* U+F1EB "" */ + 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, + 0x12, 0x34, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, + 0x66, 0x67, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xae, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x30, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0x0, 0x3b, 0x40, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcb, + 0xab, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, + 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x40, 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, 0x6b, 0xdb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xbf, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x44, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x60, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x88, 0xbf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x91, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xc3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x7, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe8, 0x8b, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe1, 0xdf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xe0, 0x9, 0x30, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xb0, 0x5f, 0xff, + 0xe0, 0xa, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0x10, 0x5, 0xff, 0xe0, 0xa, + 0xff, 0x20, 0xb, 0xff, 0xff, 0xa0, 0x6f, 0xff, + 0xff, 0xd1, 0x0, 0x5f, 0xe0, 0x9, 0xfa, 0x0, + 0x3f, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfd, + 0x10, 0x4, 0xe0, 0x9, 0xa0, 0x2, 0xef, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x30, 0x4, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x40, 0x5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x5, + 0xe0, 0x9, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf0, 0x9, + 0xfa, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x3f, 0xff, + 0xff, 0x10, 0x6, 0xff, 0xf0, 0xa, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xc1, + 0x6f, 0xff, 0xf0, 0xa, 0xe2, 0x0, 0x7f, 0xff, + 0xff, 0x70, 0xc, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf0, 0x8, 0x20, 0x7, 0xff, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x68, 0x9a, 0xba, + 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xbb, 0xbb, + 0xbb, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 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, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xd1, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x1, 0xdf, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x1, 0xdf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, + 0xde, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xca, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x76, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xe0, + 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x0, 0x1d, 0xff, 0xfe, 0x0, 0xe, 0xf5, + 0x0, 0x2f, 0xf2, 0x0, 0x8f, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, + 0x20, 0x8, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xfe, + 0x0, 0xe, 0xf5, 0x0, 0x2f, 0xf2, 0x0, 0x8f, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, + 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xe, 0xf5, 0x0, 0x2f, + 0xf2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x39, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb9, 0x30, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 155, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 154, .box_w = 6, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 75, .adv_w = 225, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 125, .adv_w = 405, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 438, .adv_w = 358, .box_w = 20, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 778, .adv_w = 486, .box_w = 29, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1141, .adv_w = 395, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1453, .adv_w = 121, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1473, .adv_w = 194, .box_w = 8, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1605, .adv_w = 195, .box_w = 8, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1737, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1835, .adv_w = 335, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 1971, .adv_w = 131, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2001, .adv_w = 221, .box_w = 10, .box_h = 3, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 2016, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2031, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2303, .adv_w = 384, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2578, .adv_w = 213, .box_w = 10, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2703, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2953, .adv_w = 329, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3191, .adv_w = 385, .box_w = 23, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3479, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 355, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3992, .adv_w = 344, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4242, .adv_w = 371, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4505, .adv_w = 355, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4755, .adv_w = 131, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4812, .adv_w = 131, .box_w = 6, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4884, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5029, .adv_w = 335, .box_w = 17, .box_h = 11, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5123, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5268, .adv_w = 330, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5506, .adv_w = 596, .box_w = 35, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6066, .adv_w = 422, .box_w = 28, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6416, .adv_w = 436, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 416, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7004, .adv_w = 476, .box_w = 26, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7329, .adv_w = 386, .box_w = 20, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7579, .adv_w = 366, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7817, .adv_w = 445, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8117, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8405, .adv_w = 179, .box_w = 5, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8468, .adv_w = 295, .box_w = 16, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8668, .adv_w = 414, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8956, .adv_w = 342, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9194, .adv_w = 550, .box_w = 28, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9544, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9832, .adv_w = 484, .box_w = 28, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10182, .adv_w = 416, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 484, .box_w = 29, .box_h = 30, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10892, .adv_w = 419, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11167, .adv_w = 358, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11417, .adv_w = 338, .box_w = 21, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11680, .adv_w = 456, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11955, .adv_w = 410, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12293, .adv_w = 649, .box_w = 39, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12781, .adv_w = 388, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13081, .adv_w = 373, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13394, .adv_w = 378, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13669, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 13818, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 14090, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 14239, .adv_w = 336, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 14367, .adv_w = 288, .box_w = 18, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14394, .adv_w = 346, .box_w = 10, .box_h = 5, .ofs_x = 4, .ofs_y = 22}, + {.bitmap_index = 14419, .adv_w = 344, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14590, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14863, .adv_w = 329, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15044, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15317, .adv_w = 353, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15507, .adv_w = 203, .box_w = 14, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15689, .adv_w = 397, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 15962, .adv_w = 392, .box_w = 19, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16209, .adv_w = 161, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16290, .adv_w = 164, .box_w = 12, .box_h = 34, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 16494, .adv_w = 355, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16754, .adv_w = 161, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16806, .adv_w = 609, .box_w = 32, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17110, .adv_w = 392, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 366, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17491, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 17764, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18037, .adv_w = 236, .box_w = 11, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18142, .adv_w = 289, .box_w = 17, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18304, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18465, .adv_w = 390, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18646, .adv_w = 322, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18855, .adv_w = 518, .box_w = 33, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19169, .adv_w = 318, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19359, .adv_w = 322, .box_w = 22, .box_h = 26, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 19645, .adv_w = 300, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19807, .adv_w = 202, .box_w = 10, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19972, .adv_w = 172, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 20038, .adv_w = 202, .box_w = 11, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 20220, .adv_w = 335, .box_w = 17, .box_h = 6, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 20271, .adv_w = 241, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 20349, .adv_w = 181, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 20374, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21040, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21526, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22120, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22606, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22919, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23567, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24215, .adv_w = 648, .box_w = 41, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24892, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 25558, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26112, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26778, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27039, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27431, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28149, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28635, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29098, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 29494, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30086, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30614, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31142, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 31522, .adv_w = 504, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 32083, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32393, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32703, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33231, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 33343, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33897, .adv_w = 720, .box_w = 47, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34767, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35544, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36138, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36442, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36746, .adv_w = 720, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37399, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37885, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38551, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39764, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40356, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40884, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41348, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41834, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 42278, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42870, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 43462, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 44016, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44738, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45238, .adv_w = 720, .box_w = 45, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46003, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 46521, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47039, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47557, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48075, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48593, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49260, .adv_w = 504, .box_w = 28, .box_h = 37, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 49778, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50370, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 51055, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 51663, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 52163, .adv_w = 579, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 26, 0, 16, -13, 0, 0, + 0, 0, -32, -35, 4, 27, 13, 10, + -23, 4, 28, 2, 24, 6, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -17, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -7, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -70, 0, + 0, -12, 0, 12, 17, 1, 0, -12, + 6, 6, 19, 12, -10, 12, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -28, 0, -23, + -4, 0, 0, 0, 0, 1, 22, 0, + -17, -5, -2, 2, 0, -10, 0, 0, + -4, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -46, -5, 22, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 17, -6, 0, 0, 12, -6, + -19, -79, 4, 16, 12, 1, -7, 0, + 21, 0, 18, 0, 18, 0, -54, 0, + -7, 17, 0, 19, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 46, 0, + 46, 0, 17, 0, 24, 7, 10, 17, + 0, 0, 0, -21, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -12, 4, + 0, -6, 0, 0, 0, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -32, 0, -36, 0, 0, 0, + 0, -4, 0, 57, -7, -7, 6, 6, + -5, 0, -7, 6, 0, 0, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -56, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 35, 0, 0, -21, 0, + 19, 0, -39, -56, -39, -12, 17, 0, + 0, -39, 0, 7, -13, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 17, -70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -13, -12, 0, -14, + -19, -19, -11, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -11, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 17, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -9, 0, -17, + -4, -17, 12, 0, 0, -12, 6, 12, + 16, 0, -14, -2, -7, 0, -2, -27, + 6, -4, 4, -31, 6, 0, 0, 2, + -30, 0, -31, -5, -50, -4, 0, -29, + 0, 12, 16, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -17, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -6, -9, 0, + -11, 0, 17, -4, 2, -18, 0, 0, + 16, -29, -30, -24, -12, 6, 0, -5, + -37, -10, 0, -10, 0, -12, 9, -10, + -37, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -17, -22, 0, -29, + -14, -12, -14, -17, -7, -16, -1, -11, + -16, 3, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -17, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -11, 0, 0, 0, 0, -29, -17, 0, + 0, 0, -9, -29, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -17, 0, -6, 0, -9, -6, + 0, -13, -14, -17, -5, 0, -12, 0, + -17, 0, 0, 0, 0, 46, 0, 0, + 3, 0, 0, -7, 0, 6, 0, -25, + 0, 0, 0, 0, 0, -54, -10, 19, + 17, -5, -24, 0, 6, -9, 0, -29, + -3, -7, 6, -40, -6, 7, 0, 9, + -20, -9, -21, -19, -24, 0, 0, -35, + 0, 33, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -19, -1, -54, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 7, 0, -13, 6, -4, -2, -15, + -6, 0, -7, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -8, 0, -4, -7, + -18, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 23, -2, 0, -16, 0, + -4, 12, 0, -6, -24, -7, 9, 1, + 0, -27, -10, 6, -10, 4, 0, -4, + -5, -18, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -11, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -11, -10, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -7, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -19, 0, + 4, -13, 12, 1, -4, -27, 0, 0, + -13, -6, 0, -23, -14, -16, 0, 0, + -25, -6, -23, -22, -28, 0, -15, 0, + 5, 39, -7, 0, -13, -6, -2, -6, + -10, -16, -10, -21, -24, -13, -6, 0, + 0, -4, 0, 2, 0, 0, -40, -5, + 17, 13, -13, -21, 0, 2, -18, 0, + -29, -4, -6, 12, -53, -7, 2, 0, + 0, -37, -7, -30, -6, -42, 0, 0, + -40, 0, 34, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -22, -4, 0, -37, + 0, 0, 0, 0, -18, 0, -5, 0, + -2, -16, -27, 0, 0, -3, -9, -17, + -6, 0, -4, 0, 0, 0, 0, -26, + -6, -19, -18, -5, -10, -14, -6, -10, + 0, -12, -5, -19, -9, 0, -7, -11, + -6, -11, 0, 3, 0, -4, -19, 0, + 12, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -12, 24, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -17, 0, + -6, 0, -9, -6, 0, -13, -14, -17, + -5, 0, -12, 5, 23, 0, 0, 0, + 0, 46, 0, 0, 3, 0, 0, -7, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -18, + -9, 0, 17, -19, -18, -12, -12, 23, + 10, 6, -50, -4, 12, -6, 0, -6, + 6, -6, -20, 0, -6, 6, -7, -5, + -17, -5, 0, 0, 17, 12, 0, -16, + 0, -32, -7, 17, -7, -22, 2, -7, + -19, -19, -6, 23, 6, 0, -9, 0, + -16, 0, 5, 19, -13, -21, -23, -14, + 17, 0, 2, -42, -5, 6, -10, -4, + -13, 0, -13, -21, -9, -9, -5, 0, + 0, -13, -12, -6, 0, 17, 13, -6, + -32, 0, -32, -8, 0, -20, -33, -2, + -18, -10, -19, -16, 16, 0, 0, -7, + 0, -12, -5, 0, -6, -10, 0, 10, + -19, 6, 0, 0, -31, 0, -6, -13, + -10, -4, -17, -14, -19, -13, 0, -17, + -6, -13, -11, -17, -6, 0, 0, 2, + 27, -10, 0, -17, -6, 0, -6, -12, + -13, -16, -16, -22, -7, -12, 12, 0, + -9, 0, -29, -7, 3, 12, -18, -21, + -12, -19, 19, -6, 3, -54, -10, 12, + -13, -10, -21, 0, -17, -24, -7, -6, + -5, -6, -12, -17, -2, 0, 0, 17, + 16, -4, -37, 0, -35, -13, 14, -22, + -39, -12, -20, -24, -29, -19, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -11, 12, 0, 0, -18, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 17, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 22, 0, 10, 2, 2, -7, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 0, -6, 10, 0, 17, + 0, 0, 57, 7, -12, -12, 6, 6, + -4, 2, -29, 0, 0, 28, -35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -39, 22, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 74, -12, -5, + 18, 16, -16, 6, 0, 0, 6, 6, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -75, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -39, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -11, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -13, 0, 0, -16, 0, + -6, 0, -27, 0, -6, 0, 0, -47, + -11, -23, -6, -21, 0, 0, -39, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -10, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 7, -6, 12, + 0, -4, -13, -4, -10, -11, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -51, -5, -8, 0, -13, 0, -4, -27, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -16, 0, -6, 0, -27, 0, 0, + 0, 0, -56, 0, -12, -21, -29, 0, + 0, -39, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -7, 0, 18, + 28, -6, -6, -17, 7, 28, 10, 13, + -16, 7, 24, 7, 17, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 27, -10, -6, 0, -5, + 46, 25, 46, 0, 0, 0, 6, 0, + 0, 21, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -48, -7, -5, -24, + -28, 0, 0, -39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -48, -7, -5, + -24, -28, 0, 0, -23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -13, 6, 0, -6, + 5, 10, 6, -17, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -14, 0, + -5, -4, -12, 0, -5, -23, 0, 36, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -16, -12, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -48, + -7, -5, -24, -28, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -18, -7, -5, 17, -5, -6, + -23, 2, -3, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -14, -23, -7, 0, + -22, -11, -16, -24, -22, 0, -9, -12, + -7, -7, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -7, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -11, -4, 0, -17, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -39, 0, 18, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 24, -7, -19, -18, 4, 6, 6, -1, + -16, 4, 9, 4, 17, 4, 19, -4, + -16, 0, 0, -23, 0, 0, -17, -16, + 0, 0, -12, 0, -7, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -17, + -6, 21, 0, 0, -5, 0, -12, 0, + 0, 7, -13, 0, 6, -6, 5, 1, + 0, -19, 0, -4, -2, 0, -6, 6, + -5, 0, 0, 0, -24, -7, -13, 0, + -17, 0, 0, -27, 0, 21, -6, 0, + -10, 0, 3, 0, -6, 0, -6, -17, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -36, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 13, + 0, 0, 0, 0, 0, -36, -33, 2, + 25, 17, 10, -23, 4, 24, 0, 21, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_36 = { +#else +lv_font_t lv_font_montserrat_36 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 40, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_36*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_38.c b/libraries/lvgl/src/font/lv_font_montserrat_38.c new file mode 100644 index 0000000..992b5c6 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_38.c @@ -0,0 +1,8400 @@ +/******************************************************************************* + * Size: 38 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 38 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_38.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 1 +#endif + +#if LV_FONT_MONTSERRAT_38 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf2, 0xe, 0xff, 0xf1, 0xd, 0xff, 0xf1, 0xd, + 0xff, 0xf0, 0xc, 0xff, 0xf0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xe0, 0xa, 0xff, 0xe0, 0xa, 0xff, + 0xd0, 0x9, 0xff, 0xc0, 0x9, 0xff, 0xc0, 0x8, + 0xff, 0xb0, 0x7, 0xff, 0xa0, 0x7, 0xff, 0xa0, + 0x6, 0xff, 0x90, 0x5, 0xee, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xab, 0x50, 0x1f, 0xff, 0xf3, 0x5f, 0xff, 0xf8, + 0x2f, 0xff, 0xf5, 0x6, 0xee, 0x80, + + /* U+0022 "\"" */ + 0x9f, 0xf9, 0x0, 0xb, 0xff, 0x79, 0xff, 0x80, + 0x0, 0xbf, 0xf6, 0x8f, 0xf8, 0x0, 0xa, 0xff, + 0x68, 0xff, 0x70, 0x0, 0xaf, 0xf6, 0x8f, 0xf7, + 0x0, 0xa, 0xff, 0x57, 0xff, 0x70, 0x0, 0x9f, + 0xf5, 0x7f, 0xf6, 0x0, 0x9, 0xff, 0x47, 0xff, + 0x60, 0x0, 0x9f, 0xf4, 0x6f, 0xf5, 0x0, 0x8, + 0xff, 0x36, 0xff, 0x50, 0x0, 0x8f, 0xf3, 0x1, + 0x10, 0x0, 0x0, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x8, 0xbb, 0xbb, 0xdf, + 0xfc, 0xbb, 0xbb, 0xbb, 0xef, 0xfb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0xbb, 0xbb, 0xbd, 0xff, 0xcb, 0xbb, 0xbb, 0xbd, + 0xff, 0xcb, 0xbb, 0xb5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0xef, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x66, 0xff, 0x65, 0x8b, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x0, 0x18, 0xe0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfb, 0x54, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x57, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x4, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0xc, 0xff, 0xf0, 0x4, 0x90, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x1f, 0xff, 0xc0, 0xc, 0xfd, + 0x60, 0x0, 0x3, 0xff, 0x30, 0x1, 0xcf, 0xff, + 0x70, 0x3f, 0xff, 0xfe, 0xa6, 0x45, 0xff, 0x55, + 0x9f, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xff, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2, 0xae, 0xfe, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0xc4, 0x24, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0xdf, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0x60, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc5, + 0x24, 0xbf, 0xf7, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xff, 0xc0, 0x0, 0x6d, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x3, 0xae, 0xfe, 0xb4, + 0x0, 0xc, 0xff, 0x20, 0xa, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x8f, 0xf9, 0x20, 0x2b, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0x1, 0xff, 0x90, 0x0, 0x0, 0xcf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x10, + 0x6, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xfe, 0x0, 0x0, 0xa, 0xfb, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xbf, + 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x1a, 0xff, 0x40, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xef, 0xea, 0x30, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0xba, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x83, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfd, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0xef, 0xb1, 0x0, 0x1e, 0xff, 0xe3, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc1, 0x8, 0xff, 0xa0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd2, 0xff, 0xf5, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xc6, 0x20, + 0x1, 0x37, 0xef, 0xff, 0xef, 0xff, 0xf4, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x4f, 0xff, 0xf3, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0xf9, 0x9f, 0xf8, 0x8f, 0xf8, 0x8f, 0xf7, + 0x8f, 0xf7, 0x7f, 0xf7, 0x7f, 0xf6, 0x7f, 0xf6, + 0x6f, 0xf5, 0x6f, 0xf5, 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xff, 0x40, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0x50, + + /* U+0029 ")" */ + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf0, 0x0, + 0x0, 0x7f, 0xff, 0x10, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x5, 0xff, + 0xf3, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, + 0x8, 0xff, 0xf0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x8f, 0xb0, 0x0, 0x24, 0x0, 0xbf, + 0xa2, 0x8, 0xfb, 0x1, 0x9f, 0xe0, 0x1e, 0xff, + 0xf8, 0x8f, 0xb6, 0xef, 0xff, 0x30, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x1, 0xef, 0xfe, 0x78, 0xfb, + 0x5d, 0xff, 0xf3, 0xa, 0xf9, 0x10, 0x8f, 0xb0, + 0x7, 0xfd, 0x0, 0x12, 0x0, 0x8, 0xfb, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x3, 0x66, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x0, 0x35, 0x20, 0x9, 0xff, 0xf4, 0x1f, 0xff, + 0xfb, 0x1f, 0xff, 0xfc, 0xb, 0xff, 0xf9, 0x0, + 0xcf, 0xf4, 0x0, 0xdf, 0xe0, 0x1, 0xff, 0x90, + 0x5, 0xff, 0x40, 0x9, 0xfe, 0x0, 0xd, 0xf9, + 0x0, + + /* U+002D "-" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, 0x1f, 0xff, + 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, 0xf9, 0x3, + 0xdf, 0xa0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb7, + 0x56, 0x9e, 0xff, 0xff, 0x70, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x51, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x72, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf7, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x7f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0xdf, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x75, 0x69, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x44, 0x44, 0x4c, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + + /* U+0032 "2" */ + 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xd9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x97, 0x55, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x1b, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, + + /* U+0033 "3" */ + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbb, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x6, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfa, 0x1, 0xef, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xc8, 0x75, 0x56, 0xae, 0xff, 0xff, + 0x90, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x5, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x3d, 0xff, 0xe3, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x1, 0x44, 0x44, 0x44, 0x45, 0x79, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x1, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x9f, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xea, 0x76, 0x56, 0x8c, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb7, 0x20, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xa6, 0x43, + 0x45, 0x8d, 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x5a, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x1f, 0xff, 0xb0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x2f, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x2f, + 0xff, 0xef, 0xff, 0xb5, 0x10, 0x3, 0x7e, 0xff, + 0xfe, 0x10, 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf6, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xb5, 0x21, + 0x13, 0x7e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, + + /* U+0037 "7" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xc0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x60, 0xc, 0xee, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xed, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x62, 0x10, 0x14, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x3, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xfc, 0x52, 0x0, 0x13, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xe5, 0x0, 0x1, 0xdf, 0xff, 0xe7, 0x20, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xa, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x1, 0xef, 0xff, 0xfa, 0x52, 0x10, + 0x13, 0x7d, 0xff, 0xff, 0x70, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, + 0xff, 0xed, 0xb7, 0x20, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x41, 0x1, 0x37, 0xdf, 0xff, + 0xc0, 0x0, 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x9, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0xdf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2b, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xf9, 0x41, + 0x0, 0x27, 0xdf, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0x90, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x13, 0xff, 0xf9, 0x0, 0x0, 0x27, 0xbe, 0xff, + 0xec, 0x83, 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x9f, 0xc7, 0x43, 0x45, 0x8d, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 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, 0x5, 0xef, 0xc1, + 0x1f, 0xff, 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, + 0xf9, 0x3, 0xdf, 0xa0, + + /* U+003B ";" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 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, 0x3, 0xdf, 0xa1, + 0xe, 0xff, 0xf9, 0x2f, 0xff, 0xfc, 0xe, 0xff, + 0xfb, 0x4, 0xef, 0xf6, 0x0, 0xbf, 0xf1, 0x0, + 0xff, 0xc0, 0x3, 0xff, 0x60, 0x8, 0xff, 0x10, + 0xc, 0xfb, 0x0, 0x6, 0x63, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x39, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, + 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003D "=" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 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, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, + 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xff, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2d, 0xff, + 0xff, 0xb7, 0x43, 0x34, 0x8e, 0xff, 0xff, 0x60, + 0x3e, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xd0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, + 0x50, 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, 0x7, 0xb9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 0x20, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xee, 0xff, 0xed, 0xa8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xec, 0x98, 0x78, 0x8a, + 0xdf, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x49, 0xcd, + 0xdb, 0x83, 0x0, 0x1e, 0xee, 0x22, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x22, 0xff, 0xf3, + 0x2, 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4f, 0xff, 0x30, 0x5, 0xff, 0x90, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x4, 0xff, 0xff, 0xa4, 0x10, + 0x25, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x20, 0x1, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xf8, 0x0, 0x7f, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xd0, 0xb, 0xff, + 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x8, 0xff, + 0x10, 0xef, 0xe0, 0x0, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xf4, 0xf, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0x51, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xf6, + 0x2f, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x2, 0xff, 0x71, 0xff, 0xa0, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xf6, 0xf, 0xfb, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x4, 0xff, 0x40, + 0xef, 0xe0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x7f, 0xf2, 0xb, 0xff, 0x20, 0x0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x0, 0xb, 0xfe, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x90, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x20, + 0x0, 0x29, 0xff, 0xed, 0xff, 0xd1, 0x2, 0xdf, + 0xf2, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf3, 0x7f, 0xff, + 0xfd, 0xff, 0xf8, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x8d, 0xfe, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xec, 0x98, 0x88, 0x9b, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xef, 0xff, 0xec, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x7b, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x90, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0xcf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, + + /* U+0042 "B" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x1, 0x26, 0xcf, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x10, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xbf, 0xff, 0xe2, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5b, 0xff, 0xff, 0x70, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5a, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x97, 0x55, 0x79, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0x80, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x79, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x57, + 0xbf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, + 0x0, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x45, + 0x7b, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x30, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xf, 0xff, 0xd2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, + + /* U+0046 "F" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0xd3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x78, + 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x20, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xf1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x68, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, 0x96, 0x10, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + + /* U+0049 "I" */ + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, + + /* U+004A "J" */ + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf9, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x1e, 0xff, 0xfe, 0x85, 0x35, + 0xaf, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xed, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe2, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x3f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe1, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, + + /* U+004C "L" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, 0xff, 0xf4, + 0xf, 0xff, 0xa8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb6, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x26, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x6, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0xbf, 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xb5, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x30, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + + /* U+004E "N" */ + 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0xc, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x10, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfa, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x96, 0x55, 0x69, 0xdf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, + 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xe, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfd, + 0x96, 0x55, 0x69, 0xdf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x57, + 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xdb, 0x83, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xd9, 0x65, 0x56, 0x9e, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xfc, 0x75, 0x33, 0x57, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xce, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x1, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x61, 0x0, 0x38, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, + 0x0, + + /* U+0052 "R" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf2, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x35, + 0x9e, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x74, 0x33, 0x45, + 0x9d, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xe0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x5, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0xd, + 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0x60, 0x4f, 0xff, 0xff, 0xd9, 0x54, 0x33, + 0x46, 0xbf, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, + 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x23, 0x44, 0x44, 0x44, 0x44, 0xcf, + 0xff, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xea, 0x75, 0x57, 0xae, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x9c, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x1, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x4e, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x64, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xf, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x1, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf1, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x1, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe1, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x8c, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfe, 0x10, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, + 0x1e, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x10, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0xdf, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, + + /* U+005D "]" */ + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x4, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xa7, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x31, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0xc, 0xff, 0x10, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x5, 0xff, + 0x70, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x1, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x8, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + + /* U+005F "_" */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xd8, + 0x42, 0x12, 0x5b, 0xff, 0xff, 0x50, 0x0, 0x6c, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x3, 0x67, + 0x89, 0x99, 0x99, 0xaf, 0xff, 0x60, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6f, 0xff, 0xe6, 0x20, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0x60, 0x1d, 0xff, 0xff, 0xb9, 0x9b, 0xff, + 0xfc, 0xff, 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xff, 0x60, 0x0, 0x4, 0xad, + 0xff, 0xec, 0x93, 0x0, 0xff, 0xf6, + + /* U+0062 "b" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xef, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x13, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, + 0xff, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x50, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x8f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x16, 0xbd, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc2, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xcf, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xc2, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, + 0xff, 0xc0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x23, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xfd, 0x61, 0x0, 0x16, 0xcf, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0xff, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xc5, 0x20, 0x14, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xf3, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xd, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x11, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x4f, 0xff, 0xb9, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x86, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x94, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2c, 0xf4, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa6, 0x32, 0x35, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, 0x40, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xc7, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7, 0xff, 0xfb, 0x30, 0x4, 0x90, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0xbf, 0xfb, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xfb, 0x0, 0x5f, 0xff, 0xff, 0x95, 0x32, 0x37, + 0xcf, 0xff, 0xff, 0xfb, 0x1, 0xef, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0xe, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfb, 0x1, 0xef, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xa5, 0x32, 0x47, 0xdf, 0xff, 0xff, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x0, 0x4f, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0x80, 0x1, 0xef, 0xff, + 0xea, 0x64, 0x22, 0x36, 0xaf, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x69, 0xce, 0xff, 0xed, 0xa7, 0x10, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x5, 0xad, 0xef, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x14, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfc, 0x74, 0x34, 0x8e, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+0069 "i" */ + 0x0, 0x57, 0x20, 0xa, 0xff, 0xf4, 0x1f, 0xff, + 0xfa, 0x1f, 0xff, 0xf9, 0x6, 0xff, 0xd1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x7, 0x83, 0x12, 0xaf, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x0, + + /* U+006B "k" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd1, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd1, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x1, 0xcf, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x2, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x14, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x62, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + + /* U+006C "l" */ + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, + 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + + /* U+006D "m" */ + 0x8f, 0xff, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x40, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xed, 0x93, 0x0, + 0x0, 0x8f, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x8f, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x8f, 0xff, 0xff, 0xf8, 0x31, + 0x2, 0x7e, 0xff, 0xfd, 0xef, 0xff, 0x83, 0x11, + 0x38, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, + + /* U+006E "n" */ + 0x8f, 0xff, 0x0, 0x6, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x41, 0x1, 0x5c, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x10, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf6, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x80, 0x0, 0xcf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x27, + 0xef, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x5b, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x12, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x23, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xd9, + 0x30, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, + + /* U+0072 "r" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xe4, 0x8f, 0xff, + 0x3, 0xdf, 0xff, 0xf4, 0x8f, 0xff, 0x4f, 0xff, + 0xff, 0xf4, 0x8f, 0xff, 0xef, 0xff, 0xb8, 0x72, + 0x8f, 0xff, 0xff, 0x91, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x3, 0x9c, 0xef, 0xfe, 0xc9, 0x51, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xc5, 0x21, + 0x12, 0x59, 0xef, 0x50, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0xb7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x50, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x3, 0x69, + 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x7, 0xff, 0xfb, 0x74, 0x21, 0x24, 0x8f, 0xff, + 0xf5, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfd, 0x41, 0x15, 0xb0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xcf, 0xfe, 0xb5, 0x0, + + /* U+0075 "u" */ + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf3, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, + 0x7, 0xff, 0xff, 0x93, 0x0, 0x14, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x33, 0xff, 0xf3, 0x0, 0x0, + 0x17, 0xbe, 0xff, 0xda, 0x50, 0x3, 0xff, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0xaf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfb, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0x7, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xda, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0x74, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xe, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0xef, 0xf7, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x1f, 0xff, 0x30, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x4f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xef, 0xf5, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x1c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x1d, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfe, 0x2d, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xaf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0x2, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x6f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x4, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0x62, 0x14, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8c, 0xef, 0xeb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, + + /* U+007B "{" */ + 0x0, 0x0, 0x3, 0xad, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xc2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x30, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc2, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xae, 0xff, + 0x90, + + /* U+007C "|" */ + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + + /* U+007D "}" */ + 0x4f, 0xfe, 0xb6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xfe, 0xb6, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7, 0xbb, 0x93, 0x0, 0x0, 0x0, 0x6, + 0xca, 0x1, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xa, 0xfc, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xe, 0xfa, 0x3f, 0xfc, 0x20, 0x5e, 0xff, + 0xd2, 0x0, 0x9f, 0xf6, 0x8f, 0xf2, 0x0, 0x1, + 0xdf, 0xff, 0xce, 0xff, 0xe0, 0xbf, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, 0x9b, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xb3, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7c, 0xfe, 0xc6, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xb3, 0x0, 0x4d, 0xfe, 0x10, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0xcf, 0x90, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0xf0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x2, + 0xff, 0xc4, 0x1, 0x5d, 0xfe, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7d, + 0xfe, 0xc7, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x7c, 0xb6, 0x0, 0xb, 0xff, 0xff, 0xa0, + 0x4f, 0xff, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xf5, + 0x4f, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xc0, + 0x1, 0xae, 0xe9, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x5e, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x10, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x55, 0x53, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0x58, 0x99, 0x7c, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x17, 0x30, 0x0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x0, 0x3, 0x71, 0xcf, 0x60, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x6, 0xfc, 0xff, 0xa2, + 0x22, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x44, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x44, + 0x4b, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x7f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf7, 0x66, 0x6c, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x70, 0x0, 0xf, 0xff, 0xf9, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xf0, + 0x0, 0x7, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x88, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x88, 0x8d, 0xff, 0xff, 0x60, 0x0, 0xe, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x7, 0xff, + 0xff, 0xfc, 0xcc, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaa, 0xae, + 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0x6f, 0x60, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xf6, + + /* U+F00B "" */ + 0x5e, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x17, 0x88, 0x88, 0x88, 0x87, + 0x10, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x71, 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, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x47, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x71, 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, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x6, 0x77, 0x77, 0x77, 0x76, + 0x10, 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd1, + 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xef, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xc6, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x2, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x8f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x6, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd0, 0x4, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x90, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x10, 0x0, 0x0, + 0x49, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x58, 0x9a, 0xa9, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xad, 0x50, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xd4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x6e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xce, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x8e, 0xff, + 0xff, 0xff, 0x4b, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x26, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x4f, 0xfd, 0x20, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x7f, 0xff, 0xfe, 0x40, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0x70, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x70, + 0xcf, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, + 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x9, + 0xff, 0xff, 0xf8, 0x1e, 0xff, 0xe4, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x7, 0xff, 0xfc, + 0x0, 0x3f, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x4, 0xfe, 0x10, 0x0, 0x10, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x33, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x33, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8a, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0x0, 0x9, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x3, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x77, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x77, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x2f, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xf, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xed, 0xdd, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1, 0x23, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x85, 0x33, 0x57, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf2, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, + 0xff, 0xff, 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xaa, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf0, 0x34, 0x44, 0x44, 0x44, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, 0x90, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xb0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x4, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xaf, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6f, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xb3, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 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, 0x1, 0xdf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xa1, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xe2, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xd0, + 0x0, 0xe, 0xff, 0xf0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x90, 0x0, 0x7f, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x20, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0xff, 0xfb, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0xa, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x7f, 0xff, 0x30, 0x2, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x4, 0xef, 0xff, 0x10, 0x3, + 0xff, 0xf6, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xef, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0xf, 0xff, 0x90, 0x0, 0xef, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x1, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x8, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x7, + 0x93, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0xdf, + 0xfe, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0x0, 0x4f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf7, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0x92, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x29, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xef, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x30, 0x2, + 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xc6, 0x20, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x79, 0xbb, + 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, + 0x70, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf7, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x63, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0x3, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, + + /* U+F04B "" */ + 0x0, 0x13, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, + 0x92, 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, + + /* U+F04C "" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F04D "" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe3, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9e, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, + 0x3f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x60, 0xaf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbe, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 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, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x75, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xe6, 0x0, + + /* U+F054 "" */ + 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9d, + 0xed, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xca, 0x20, 0xaf, 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, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0x45, 0x55, 0x55, + 0x55, 0x55, 0x5f, 0xff, 0xff, 0xff, 0x75, 0x55, + 0x55, 0x55, 0x55, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x65, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "" */ + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x45, 0x77, 0x65, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x73, + 0x21, 0x24, 0x8d, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x14, 0x54, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa1, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x9, 0xa7, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x3, 0x9c, 0xdc, 0x82, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x15, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xba, 0x9a, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, 0xc9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x67, 0x76, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x38, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfb, 0x11, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x31, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x35, 0x42, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xd4, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xb1, 0x8f, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x74, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xa9, 0xab, 0x20, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xcd, 0xef, 0xfe, 0xca, 0x72, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x57, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x21, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x3b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0x10, 0x0, + + /* U+F074 "" */ + 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, 0x8, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xbe, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x90, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x10, 0x0, 0x0, 0x9, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x9, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x1, 0x11, 0x11, + 0x18, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x11, 0x8f, 0xff, 0xff, 0xf6, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xad, + 0xdd, 0xdd, 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xdd, 0xdd, 0xef, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, 0x0, + 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x30, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x30, 0x0, 0x17, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x20, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf9, + 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfa, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x2e, 0xff, 0xfd, 0x3f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0xe, 0xff, 0xfd, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x40, 0xe, 0xff, 0xfd, 0x0, 0x5f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x3, 0x72, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xa, 0xff, 0xff, 0x10, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0xa, 0xff, 0xff, 0x15, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xba, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xb9, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x5, 0x66, + 0x66, 0x66, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x73, 0x22, 0x22, 0x22, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 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, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbb, + 0xa9, 0x86, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x6a, 0xdd, 0xb7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xa9, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xcf, 0xff, 0xf9, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xdf, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xff, 0x10, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xba, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x9, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x2e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0xff, 0xba, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xa3, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xed, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xef, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xef, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xf2, + 0x6f, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x26, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x10, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x83, 0x12, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x10, 0x0, + + /* U+F0C9 "" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x26, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 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, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x26, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x40, 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, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1, 0xc4, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x7f, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfc, 0x20, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2, 0xcf, 0xff, + 0xfc, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xaa, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x33, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x53, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xff, + 0xfe, 0xef, 0xff, 0xcc, 0xcc, 0xcc, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x0, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xed, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xef, 0xd1, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xef, 0xfd, 0x10, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xef, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x17, + 0x88, 0x88, 0x88, 0x84, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x40, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xbf, 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, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdb, 0x30, + 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, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xba, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x1, + 0xaf, 0xf2, 0x0, 0x9, 0xff, 0x40, 0x0, 0x7f, + 0xf5, 0x0, 0x5, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x6, 0xff, + 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xfc, 0xff, 0xff, 0xc0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x4, + 0xff, 0x20, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xf2, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x7f, 0xf5, 0x0, + 0x5, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, + 0x8f, 0xfd, 0x66, 0x68, 0xff, 0xd6, 0x66, 0x7f, + 0xfd, 0x66, 0x66, 0xef, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0x70, + 0x0, 0xe, 0xf7, 0x0, 0x0, 0xef, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xf, 0xf7, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xff, 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, + 0xef, 0x70, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1f, 0xf9, + 0x0, 0x1, 0xff, 0x90, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0x76, 0x67, 0xdf, 0xf8, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0xff, 0xb6, 0x66, 0x9f, 0xff, 0xfc, 0xff, 0xff, + 0xc0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xfd, 0xcc, + 0xcf, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xcc, 0xce, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xab, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x40, 0x6, 0x10, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xfe, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xf, 0xff, 0xfe, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xfe, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x32, + 0x22, 0x22, 0x22, 0x22, 0x1f, 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, 0x8f, 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, 0x8f, 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, 0x8f, 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, + 0x8f, 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, 0x8f, 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, 0x8f, 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, 0x8f, + 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, 0x8f, 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, 0x8f, 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, 0x8f, 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, 0x8f, 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, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F1EB "" */ + 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, + 0x25, 0x8a, 0xcd, 0xee, 0xed, 0xcb, 0x96, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x42, 0x11, 0x12, 0x35, 0x79, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xf5, + 0x2e, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, + 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x69, 0xce, 0xff, 0xfe, 0xdb, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, + 0x0, 0x2c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x42, 0x0, 0x1, 0x26, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x35, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x22, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x9e, 0xff, + 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xfd, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x2a, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xa, 0xdd, + 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x53, 0x3e, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x56, 0x6f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, + 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xfe, 0x0, 0x5c, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xe3, + 0x5, 0xff, 0xfe, 0x0, 0x4f, 0xc1, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xfe, 0x0, 0x4f, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xfb, 0x0, 0x4, + 0xfe, 0x0, 0x4f, 0xd1, 0x0, 0xaf, 0xff, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0x0, 0x4d, 0x10, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, 0x0, + 0x21, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, + 0x0, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x2d, 0x0, + 0x4b, 0x0, 0x8, 0xff, 0xff, 0xff, 0xe0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x2, 0xef, 0x0, 0x4f, + 0xa0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xd1, 0x0, 0x2e, 0xff, 0x0, 0x4f, 0xf9, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xd1, 0x2, 0xef, 0xff, 0x0, 0x4f, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0x0, 0x5e, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x50, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x32, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, + 0xab, 0xcd, 0xdc, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 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, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xfb, 0x7, + 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0x97, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xa1, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xfd, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x21, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa2, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x2, 0xef, 0xfc, 0xbb, 0xbf, 0xfc, + 0xbb, 0xcf, 0xfc, 0xbb, 0xbf, 0xff, 0xfa, 0x0, + 0x2, 0xef, 0xff, 0x50, 0x2, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xa0, 0x2, 0xef, + 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, 0x3f, 0xf3, + 0x0, 0x1f, 0xff, 0xfa, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x2, 0xff, 0x40, 0x3, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xa2, 0xef, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xf4, 0x0, 0x3f, 0xf3, 0x0, 0x1f, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2, 0xff, + 0x40, 0x3, 0xff, 0x30, 0x1, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, + 0x3f, 0xf3, 0x0, 0x1f, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0x62, 0x24, 0xff, 0x62, 0x25, 0xff, + 0x52, 0x23, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x5c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x20, 0x0, + + /* U+F8A2 "" */ + 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, 0x7, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x40, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 164, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 163, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 238, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 139, .adv_w = 427, .box_w = 25, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 378, .box_w = 22, .box_h = 36, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 860, .adv_w = 513, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 417, .box_w = 25, .box_h = 27, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1588, .adv_w = 128, .box_w = 4, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1610, .adv_w = 205, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1768, .adv_w = 206, .box_w = 9, .box_h = 35, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1926, .adv_w = 243, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 2031, .adv_w = 354, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2184, .adv_w = 138, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2217, .adv_w = 233, .box_w = 11, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 2239, .adv_w = 138, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2555, .adv_w = 406, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 225, .box_w = 11, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2997, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 348, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3543, .adv_w = 407, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3855, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4128, .adv_w = 375, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4414, .adv_w = 364, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4687, .adv_w = 392, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4973, .adv_w = 375, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5246, .adv_w = 138, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5306, .adv_w = 138, .box_w = 6, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 5384, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5546, .adv_w = 354, .box_w = 18, .box_h = 12, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5654, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5816, .adv_w = 348, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6076, .adv_w = 629, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6687, .adv_w = 445, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7064, .adv_w = 460, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7376, .adv_w = 440, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7714, .adv_w = 502, .box_w = 27, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8065, .adv_w = 407, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8338, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8598, .adv_w = 469, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9248, .adv_w = 188, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9313, .adv_w = 312, .box_w = 17, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9534, .adv_w = 437, .box_w = 25, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9859, .adv_w = 361, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10119, .adv_w = 581, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10509, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10821, .adv_w = 511, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11211, .adv_w = 439, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 511, .box_w = 31, .box_h = 31, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11991, .adv_w = 442, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12290, .adv_w = 378, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12576, .adv_w = 357, .box_w = 23, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12875, .adv_w = 481, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13187, .adv_w = 433, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 685, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14097, .adv_w = 409, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14435, .adv_w = 393, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14773, .adv_w = 399, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15072, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 15230, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 15528, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 15686, .adv_w = 354, .box_w = 18, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 15830, .adv_w = 304, .box_w = 19, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15859, .adv_w = 365, .box_w = 11, .box_h = 5, .ofs_x = 4, .ofs_y = 23}, + {.bitmap_index = 15887, .adv_w = 364, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16077, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16385, .adv_w = 347, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16585, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 372, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17103, .adv_w = 215, .box_w = 15, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17313, .adv_w = 420, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 17610, .adv_w = 414, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17890, .adv_w = 170, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17977, .adv_w = 173, .box_w = 12, .box_h = 36, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 18193, .adv_w = 375, .box_w = 21, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18487, .adv_w = 170, .box_w = 5, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18557, .adv_w = 643, .box_w = 34, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18897, .adv_w = 414, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19097, .adv_w = 386, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19317, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 19614, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 19911, .adv_w = 249, .box_w = 12, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20031, .adv_w = 305, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20211, .adv_w = 252, .box_w = 15, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20399, .adv_w = 412, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20599, .adv_w = 340, .box_w = 23, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20829, .adv_w = 547, .box_w = 34, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21169, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21379, .adv_w = 340, .box_w = 23, .box_h = 27, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 21690, .adv_w = 317, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21870, .adv_w = 213, .box_w = 11, .box_h = 35, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 22063, .adv_w = 182, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 22151, .adv_w = 213, .box_w = 12, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 22361, .adv_w = 354, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 22424, .adv_w = 255, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 22508, .adv_w = 191, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 22536, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23848, .adv_w = 608, .box_w = 38, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24494, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25045, .adv_w = 418, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25410, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26151, .adv_w = 608, .box_w = 36, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26853, .adv_w = 684, .box_w = 43, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27584, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 28325, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28949, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29690, .adv_w = 304, .box_w = 19, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29975, .adv_w = 456, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30410, .adv_w = 684, .box_w = 43, .box_h = 37, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31206, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31757, .adv_w = 418, .box_w = 27, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32284, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 32722, .adv_w = 532, .box_w = 34, .box_h = 40, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33402, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33980, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34558, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 34996, .adv_w = 532, .box_w = 35, .box_h = 34, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 35591, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 35921, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36251, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36829, .adv_w = 532, .box_w = 34, .box_h = 8, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 36965, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37589, .adv_w = 760, .box_w = 48, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38525, .adv_w = 684, .box_w = 45, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39403, .adv_w = 608, .box_w = 38, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40068, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40415, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40762, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41482, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42033, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42774, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43535, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44113, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 44776, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45354, .adv_w = 532, .box_w = 34, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45864, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46415, .adv_w = 380, .box_w = 26, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46922, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47585, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48248, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 48872, .adv_w = 608, .box_w = 40, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49652, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50218, .adv_w = 760, .box_w = 48, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51058, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 51658, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52258, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52858, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 53458, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 54058, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54778, .adv_w = 532, .box_w = 30, .box_h = 39, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 55363, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56026, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 56787, .adv_w = 760, .box_w = 48, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57483, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 58049, .adv_w = 612, .box_w = 39, .box_h = 25, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 27, 0, 16, -13, 0, 0, + 0, 0, -33, -36, 4, 29, 13, 10, + -24, 4, 30, 2, 26, 6, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -18, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -8, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -74, 0, + 0, -12, 0, 12, 18, 1, 0, -12, + 6, 6, 20, 12, -10, 12, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -30, 0, -24, + -4, 0, 0, 0, 0, 1, 24, 0, + -18, -5, -2, 2, 0, -10, 0, 0, + -4, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, -5, 23, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 18, -6, 0, 0, 12, -6, + -20, -83, 4, 16, 12, 1, -8, 0, + 22, 0, 19, 0, 19, 0, -57, 0, + -7, 18, 0, 20, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 49, 0, + 49, 0, 18, 0, 26, 8, 10, 18, + 0, 0, 0, -22, 0, 0, 0, 0, + 2, -4, 0, 4, -11, -8, -12, 4, + 0, -6, 0, 0, 0, -24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -33, 0, -38, 0, 0, 0, + 0, -4, 0, 60, -7, -8, 6, 6, + -5, 0, -8, 6, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -59, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 36, 0, 0, -22, 0, + 20, 0, -41, -59, -41, -12, 18, 0, + 0, -41, 0, 7, -14, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 18, -74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -14, -12, 0, -15, + -20, -20, -12, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 18, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -9, 0, -18, + -4, -18, 12, 0, 0, -12, 6, 12, + 16, 0, -15, -2, -7, 0, -2, -29, + 6, -4, 4, -32, 6, 0, 0, 2, + -32, 0, -32, -5, -53, -4, 0, -30, + 0, 12, 17, 0, 8, 0, 0, 0, + 0, 1, 0, -11, -8, 0, -18, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -9, 0, + -12, 0, 18, -4, 2, -19, 0, 0, + 16, -30, -32, -26, -12, 6, 0, -5, + -40, -11, 0, -11, 0, -12, 9, -11, + -39, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -18, -23, 0, -30, + -15, -13, -15, -18, -7, -16, -1, -12, + -16, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -18, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -30, -18, 0, + 0, 0, -9, -30, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -11, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -18, 0, -6, 0, -9, -6, + 0, -13, -15, -18, -5, 0, -12, 0, + -18, 0, 0, 0, 0, 49, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -26, + 0, 0, 0, 0, 0, -57, -11, 20, + 18, -5, -26, 0, 6, -9, 0, -30, + -3, -8, 6, -43, -6, 8, 0, 9, + -21, -9, -22, -20, -26, 0, 0, -36, + 0, 35, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -20, -1, -57, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 8, 0, -13, 6, -4, -2, -16, + -6, 0, -8, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -9, 0, -4, -7, + -19, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 24, -2, 0, -16, 0, + -4, 12, 0, -6, -26, -8, 9, 1, + 0, -29, -10, 6, -10, 4, 0, -4, + -5, -19, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -12, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -12, -10, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -20, 0, + 4, -13, 12, 1, -4, -29, 0, 0, + -13, -6, 0, -24, -15, -17, 0, 0, + -26, -6, -24, -23, -29, 0, -16, 0, + 5, 41, -8, 0, -14, -6, -2, -6, + -10, -16, -11, -22, -25, -14, -6, 0, + 0, -4, 0, 2, 0, 0, -43, -5, + 18, 13, -13, -22, 0, 2, -19, 0, + -30, -4, -6, 12, -56, -8, 2, 0, + 0, -40, -7, -32, -6, -44, 0, 0, + -43, 0, 36, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -23, -4, 0, -40, + 0, 0, 0, 0, -19, 0, -5, 0, + -2, -17, -29, 0, 0, -3, -9, -18, + -6, 0, -4, 0, 0, 0, 0, -27, + -6, -20, -19, -5, -10, -15, -6, -10, + 0, -12, -5, -20, -9, 0, -7, -12, + -6, -12, 0, 3, 0, -4, -20, 0, + 12, 0, -11, 0, 0, 0, 0, 7, + 0, 4, -12, 25, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -18, 0, + -6, 0, -9, -6, 0, -13, -15, -18, + -5, 0, -12, 5, 24, 0, 0, 0, + 0, 49, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -19, + -10, 0, 18, -20, -19, -12, -12, 24, + 11, 6, -53, -4, 12, -6, 0, -6, + 7, -6, -21, 0, -6, 6, -8, -5, + -18, -5, 0, 0, 18, 12, 0, -17, + 0, -33, -8, 18, -8, -23, 2, -8, + -20, -20, -6, 24, 6, 0, -9, 0, + -16, 0, 5, 20, -14, -22, -24, -15, + 18, 0, 2, -44, -5, 6, -10, -4, + -14, 0, -13, -22, -9, -9, -5, 0, + 0, -14, -13, -6, 0, 18, 14, -6, + -33, 0, -33, -9, 0, -21, -35, -2, + -19, -10, -20, -17, 16, 0, 0, -8, + 0, -12, -5, 0, -6, -11, 0, 10, + -20, 6, 0, 0, -32, 0, -6, -13, + -10, -4, -18, -15, -20, -14, 0, -18, + -6, -14, -12, -18, -6, 0, 0, 2, + 29, -10, 0, -18, -6, 0, -6, -12, + -14, -16, -17, -23, -8, -12, 12, 0, + -9, 0, -30, -7, 4, 12, -19, -22, + -12, -20, 20, -6, 3, -57, -11, 12, + -13, -10, -22, 0, -18, -26, -7, -6, + -5, -6, -13, -18, -2, 0, 0, 18, + 17, -4, -40, 0, -36, -14, 15, -23, + -41, -12, -21, -26, -30, -20, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -12, 12, 0, 0, -19, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 18, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 23, 0, 11, 2, 2, -8, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -36, 0, -6, 10, 0, 18, + 0, 0, 60, 7, -12, -12, 6, 6, + -4, 2, -30, 0, 0, 29, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -41, 23, 85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 78, -12, -5, + 19, 16, -16, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -79, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -17, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -14, 0, 0, -16, 0, + -6, 0, -29, 0, -7, 0, 0, -49, + -12, -24, -7, -22, 0, 0, -41, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -11, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 8, -7, 12, + 0, -4, -14, -4, -10, -12, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -54, -5, -9, 0, -13, 0, -4, -29, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -17, 0, -6, 0, -29, 0, 0, + 0, 0, -59, 0, -12, -22, -30, 0, + 0, -41, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -8, 0, 19, + 30, -6, -6, -18, 7, 30, 10, 13, + -16, 7, 26, 7, 18, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 29, -11, -6, 0, -5, + 49, 26, 49, 0, 0, 0, 6, 0, + 0, 22, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -51, -7, -5, -25, + -30, 0, 0, -41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -51, -7, -5, + -25, -30, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -14, 6, 0, -6, + 5, 11, 6, -18, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -15, 0, + -5, -4, -12, 0, -5, -24, 0, 38, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -17, -12, -7, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -51, + -7, -5, -25, -30, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 30, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -19, -7, -5, 18, -5, -6, + -24, 2, -4, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -15, -24, -7, 0, + -23, -12, -16, -26, -24, 0, -10, -12, + -7, -8, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -12, -4, 0, -18, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -41, 0, 19, 0, 0, -11, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -14, 0, 0, + 26, -8, -20, -19, 4, 7, 7, -1, + -17, 4, 9, 4, 18, 4, 20, -4, + -16, 0, 0, -24, 0, 0, -18, -16, + 0, 0, -12, 0, -8, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -18, + -6, 22, 0, 0, -5, 0, -12, 0, + 0, 8, -14, 0, 6, -6, 5, 1, + 0, -20, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -25, -7, -13, 0, + -18, 0, 0, -29, 0, 22, -6, 0, + -11, 0, 4, 0, -6, 0, -6, -18, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -38, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 14, + 0, 0, 0, 0, 0, -38, -35, 2, + 26, 18, 10, -24, 4, 26, 0, 22, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_38 = { +#else +lv_font_t lv_font_montserrat_38 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 41, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_38*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_40.c b/libraries/lvgl/src/font/lv_font_montserrat_40.c new file mode 100644 index 0000000..36c7d31 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_40.c @@ -0,0 +1,9248 @@ +/******************************************************************************* + * Size: 40 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 40 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_40.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 1 +#endif + +#if LV_FONT_MONTSERRAT_40 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xd, 0xff, 0xf9, 0xd, 0xff, 0xf9, 0xc, 0xff, + 0xf8, 0xb, 0xff, 0xf8, 0xb, 0xff, 0xf7, 0xa, + 0xff, 0xf6, 0xa, 0xff, 0xf6, 0x9, 0xff, 0xf5, + 0x9, 0xff, 0xf4, 0x8, 0xff, 0xf4, 0x7, 0xff, + 0xf3, 0x7, 0xff, 0xf3, 0x6, 0xff, 0xf2, 0x6, + 0xff, 0xf1, 0x5, 0xff, 0xf1, 0x4, 0xff, 0xf0, + 0x4, 0xff, 0xf0, 0x3, 0xff, 0xf0, 0x3, 0xff, + 0xe0, 0x1, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x6, 0xff, 0xe3, 0x1f, 0xff, 0xfc, 0x2f, 0xff, + 0xfe, 0xe, 0xff, 0xfa, 0x3, 0xcf, 0xb1, + + /* U+0022 "\"" */ + 0x7f, 0xfd, 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfd, + 0x0, 0x3, 0xff, 0xf1, 0x6f, 0xfc, 0x0, 0x2, + 0xff, 0xf0, 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, + 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xfb, 0x0, 0x1, + 0xff, 0xf0, 0x5f, 0xfa, 0x0, 0x1, 0xff, 0xe0, + 0x4f, 0xfa, 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xfa, + 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xf9, 0x0, 0x0, + 0xff, 0xd0, 0x1, 0x11, 0x0, 0x0, 0x11, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xea, 0xdf, 0xf9, 0xbe, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xfe, 0x50, 0xa, 0xfe, 0x0, 0x2, + 0x8f, 0xf3, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfc, 0x50, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x5b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x4, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x5, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x6, 0xf9, 0x10, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xdf, 0xff, + 0x82, 0x0, 0xa, 0xfe, 0x0, 0x18, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xfd, 0xa9, 0xdf, 0xf8, + 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, + 0xef, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x7d, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x66, 0xaf, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x60, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe5, 0x0, 0x5e, 0xff, 0x30, 0x5, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1e, + 0xff, 0x10, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, 0x0, 0xaf, + 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x5, 0xff, + 0xb0, 0x3, 0xff, 0xf9, 0x67, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x20, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x57, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf7, 0x10, 0x3, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x1b, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x15, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xc3, + 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x7, 0x72, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0xc, 0xff, 0xfd, + 0x10, 0x0, 0xe, 0xff, 0x50, 0x1, 0xef, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xd1, 0x0, 0x2f, + 0xff, 0x20, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x8f, 0xfe, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd1, 0xef, 0xf9, 0x0, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xff, 0xf2, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x30, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xdf, 0xff, + 0xfe, 0x96, 0x45, 0x6a, 0xef, 0xff, 0xfa, 0xcf, + 0xff, 0xc0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x1d, 0xff, 0xf9, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x1, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0x5a, + 0xde, 0xfe, 0xdb, 0x62, 0x0, 0x0, 0x0, 0x1d, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0xfd, 0x7f, 0xfd, 0x6f, 0xfc, 0x6f, 0xfc, + 0x6f, 0xfc, 0x5f, 0xfb, 0x5f, 0xfb, 0x5f, 0xfa, + 0x4f, 0xfa, 0x4f, 0xfa, 0x4f, 0xf9, 0x1, 0x11, + + /* U+0028 "(" */ + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, + 0xb, 0xff, 0xe0, + + /* U+0029 ")" */ + 0x7f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x5, 0xff, 0xf6, + 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0x0, 0x3, 0xff, 0xf8, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x1, 0xff, + 0xfa, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x2f, 0xf2, 0x0, 0x1, 0x0, + 0x7, 0xf7, 0x0, 0x2f, 0xf2, 0x0, 0x7f, 0x70, + 0x1e, 0xff, 0xd4, 0x2f, 0xf2, 0x4d, 0xff, 0xe0, + 0x5, 0xef, 0xff, 0xcf, 0xfc, 0xff, 0xfe, 0x50, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x1e, 0xff, 0xf8, 0x3f, 0xf3, 0x8f, 0xff, 0xe1, + 0xa, 0xfb, 0x20, 0x2f, 0xf2, 0x2, 0xcf, 0xa0, + 0x1, 0x50, 0x0, 0x2f, 0xf2, 0x0, 0x5, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x51, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0x33, 0x33, 0x33, 0x4f, 0xff, + 0x73, 0x33, 0x33, 0x32, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+002D "-" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x60, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+002E "." */ + 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xec, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xeb, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x96, 0x99, 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + + /* U+0032 "2" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xdb, 0xab, 0xdf, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfa, 0x0, 0x3, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x4, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x45, 0x7b, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc0, 0xa, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xdb, + 0xab, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, + 0xde, 0xff, 0xeb, 0x72, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xbe, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xef, 0xff, 0x88, 0x88, 0x82, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, + 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe9, 0x99, 0x87, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x47, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf3, 0x2, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0xb, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, + 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xeb, 0x99, 0x9b, 0xef, 0xf3, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x48, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x1, 0x6b, 0xdf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xfe, 0x86, 0x56, + 0x9e, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x70, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0xaf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe9, 0x65, 0x69, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xcf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0xaf, 0xff, 0xf0, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x9c, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xfd, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x96, + 0x55, 0x7a, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x7f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x41, 0x0, 0x15, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xf9, 0x53, 0x22, 0x36, 0xbf, 0xff, 0xfe, 0x20, + 0x2, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xfd, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xc2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x2, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x7a, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x86, 0x57, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0xb, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x3f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfd, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x50, 0xcf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfa, 0x7, + 0xff, 0xff, 0xe7, 0x30, 0x1, 0x4a, 0xff, 0xfe, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x14, 0xff, 0xfb, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xfa, 0x40, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x45, + 0x42, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x9f, 0xfe, 0xa9, 0x89, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 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, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+003B ";" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 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, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfc, 0x60, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x50, + + /* U+003D "=" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 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, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xaf, 0xff, 0xff, 0xea, 0x98, 0x9b, 0xff, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xfa, 0x0, 0x6f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0x20, 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, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xde, 0x80, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, + 0xbd, 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0xcb, 0xcd, 0xef, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x14, 0x9e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x1, 0x22, 0x10, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xfc, 0x71, + 0x0, 0xcf, 0xfb, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xc, 0xff, 0xb0, 0x0, + 0x9f, 0xf8, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xfb, 0x0, 0x1, 0xff, 0xf0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x41, + 0x1, 0x4b, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8, + 0xff, 0x50, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x7f, 0xf8, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xf0, 0xa, 0xff, 0x40, 0x0, 0x4, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0xa, 0xff, 0x20, 0xdf, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xf4, + 0xf, 0xff, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x5, 0xff, 0x50, 0xff, 0xe0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xf6, 0x1f, + 0xfd, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x4, 0xff, 0x60, 0xff, 0xe0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x5f, 0xf5, 0xf, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0x40, 0xdf, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xf2, 0xa, 0xff, 0x40, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xa0, 0x2, 0xff, 0xd0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xf5, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x63, 0x23, 0x6d, 0xff, 0xf8, 0xff, 0xfb, 0x33, + 0xaf, 0xfd, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, 0x0, + 0x3a, 0xef, 0xd9, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xfe, 0xc9, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x1e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x4a, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x6f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, + + /* U+0042 "B" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, 0xf7, + 0x55, 0x55, 0x55, 0x55, 0x68, 0xcf, 0xff, 0xff, + 0x90, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x20, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xb0, 0x0, 0xcf, 0xff, + 0x75, 0x55, 0x55, 0x55, 0x56, 0x8c, 0xff, 0xff, + 0xd1, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x70, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x2c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, + 0xc, 0xff, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x56, + 0x7a, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x60, + 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xab, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x50, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xad, 0xef, 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x9b, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x9b, 0xdf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, + 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x80, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x94, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, + + /* U+0046 "F" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xa8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x10, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xce, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x90, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xaa, 0x40, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf7, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xec, 0xaa, 0xbe, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfd, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, + + /* U+0049 "I" */ + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x30, + + /* U+004A "J" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0x99, 0x99, 0x99, + 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x64, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xfb, 0x99, 0xcf, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+004B "K" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xf7, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x33, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe2, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd1, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xb0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, + + /* U+004C "L" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x93, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+004D "M" */ + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0xef, 0xff, 0xcf, + 0xff, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0xef, 0xff, 0xcf, 0xff, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xcf, 0xfe, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xa5, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, + + /* U+004E "N" */ + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xfd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x4d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x2f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfd, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xeb, 0xab, 0xcf, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x20, 0xcf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf6, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xc, 0xff, 0xfa, 0x99, 0x99, 0x99, + 0x9a, 0xdf, 0xff, 0xff, 0xf7, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xc0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x3c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xac, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x8c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfd, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, 0xad, 0xff, + 0xff, 0xff, 0x70, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x72, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xc9, 0x89, 0xad, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xfe, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x85, 0x47, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x30, + 0x0, 0x0, + + /* U+0052 "R" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, + 0x99, 0x99, 0xad, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x90, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x14, 0x8e, + 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x98, 0x88, 0x88, 0x87, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xda, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb9, + 0x88, 0x9c, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0x30, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x80, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0xa6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xae, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x7f, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xe, 0xff, 0xfb, 0x51, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xf4, 0x2, + 0xef, 0xff, 0xff, 0xfc, 0xa9, 0x88, 0xad, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, + 0xfe, 0xb8, 0x30, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x79, 0x99, 0x99, 0x99, + 0x9a, 0xff, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf8, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfe, 0xca, 0xbc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xde, 0xff, 0xdc, 0x84, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf2, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xc1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x8f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x93, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x45, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x1f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x60, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x4, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x91, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, + + /* U+005B "[" */ + 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xf4, + 0x44, 0x42, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x33, 0x32, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x90, + + /* U+005C "\\" */ + 0x38, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, + 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x4, + 0x44, 0x4c, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x3, + 0x33, 0x3c, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xf2, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xcf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x2c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf5, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x0, 0x9f, 0xf6, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x0, 0x2, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0x6f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x86, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xf8, + + /* U+0061 "a" */ + 0x0, 0x0, 0x48, 0xbd, 0xef, 0xed, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1, 0xef, 0xff, 0xfb, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0x20, 0x7, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf9, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x5, + 0x8b, 0xcd, 0xdd, 0xdd, 0xde, 0xff, 0xf7, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xf9, 0x31, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x7a, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf7, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x7a, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xfc, 0x52, 0x11, + 0x4a, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3f, 0xff, 0x70, + 0x0, 0x17, 0xce, 0xff, 0xda, 0x60, 0x3, 0xff, + 0xf7, + + /* U+0062 "b" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xeb, 0x61, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xef, 0xff, 0xfc, 0x97, + 0x9b, 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, + 0x0, 0x5f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x15, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x85, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x95, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x5f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x55, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x5f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xfc, 0xff, 0xff, 0xc9, 0x79, 0xbf, 0xff, 0xff, + 0xe1, 0x0, 0x5f, 0xff, 0x59, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x5, 0xff, 0xf5, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, + 0xb6, 0x10, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x78, 0xaf, 0xff, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x40, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0x40, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe5, 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xfd, 0x97, 0x8a, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xce, 0xff, 0xeb, 0x61, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xc7, 0x20, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfc, 0x97, + 0x8b, 0xff, 0xff, 0xef, 0xff, 0xa0, 0x7, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xfa, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xa1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xd9, 0x78, 0xbf, 0xff, 0xfc, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, + 0x72, 0x0, 0xf, 0xff, 0xa0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd9, 0x65, 0x7a, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xfe, 0x10, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x90, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf9, 0x3f, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x1, 0xaf, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x98, 0x79, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x64, 0x6c, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xbf, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4b, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xc9, + 0x78, 0x9d, 0xff, 0xff, 0xef, 0xfe, 0x0, 0x9f, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xe0, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfe, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xe0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xe0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x0, 0x8f, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, + 0xd9, 0x78, 0xae, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x6, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, 0xea, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x5, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x99, 0xae, 0xff, 0xff, 0xf3, + 0x5, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x25, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x95, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, + + /* U+0069 "i" */ + 0x0, 0x37, 0x40, 0x0, 0x7f, 0xff, 0x90, 0xe, + 0xff, 0xff, 0x10, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x6, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, + 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, + 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, + 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x97, 0x10, 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, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x0, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0xc, 0xc7, 0x57, 0xdf, 0xff, 0xe0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5b, 0xef, + 0xfd, 0x92, 0x0, 0x0, + + /* U+006B "k" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x1, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1d, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x71, 0xdf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xae, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x39, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd2, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, + + /* U+006C "l" */ + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x70, + + /* U+006D "m" */ + 0x5f, 0xff, 0x50, 0x2, 0x8c, 0xef, 0xec, 0x93, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x5f, 0xff, 0x51, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x5f, 0xff, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xb7, 0x56, 0x8e, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xa6, 0x56, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xd0, 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, + + /* U+006E "n" */ + 0x5f, 0xff, 0x50, 0x2, 0x7b, 0xdf, 0xfd, 0xa6, + 0x0, 0x0, 0x5, 0xff, 0xf5, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5, + 0xff, 0xff, 0xff, 0xfc, 0x86, 0x57, 0xbf, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x5f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x65, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb5, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc9, + 0x78, 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xc0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x73, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x30, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xfb, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, + 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x5, 0xff, 0xfe, 0xff, 0xfe, 0x85, + 0x45, 0x8e, 0xff, 0xff, 0xd1, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xb0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x55, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x95, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x75, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x15, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x5f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, 0x0, 0x5f, + 0xff, 0xdf, 0xff, 0xfc, 0x97, 0x9b, 0xff, 0xff, + 0xfe, 0x10, 0x5, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0x70, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5, 0xbd, 0xff, + 0xeb, 0x61, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1f, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xc9, + 0x78, 0xbf, 0xff, 0xfc, 0xff, 0xfa, 0x0, 0x7f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xa0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x8, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa3, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfa, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xa0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xdf, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xff, 0xfa, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, + 0xc7, 0x10, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, + + /* U+0072 "r" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0x5, 0xff, + 0xf5, 0x7, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0x5a, + 0xff, 0xff, 0xff, 0x5, 0xff, 0xfb, 0xff, 0xff, + 0xfd, 0xc0, 0x5f, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xdb, 0x83, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8, 0xff, 0xff, + 0xd8, 0x66, 0x78, 0xcf, 0xff, 0x60, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x18, 0xc0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xb8, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x4, 0x7a, 0xdf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x1f, 0xf9, 0x30, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xea, 0x87, + 0x78, 0xaf, 0xff, 0xff, 0x10, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x75, 0x7d, 0xb0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, 0xd9, 0x20, + + /* U+0075 "u" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x67, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf6, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x63, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x60, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x1, 0xef, 0xff, + 0xff, 0xb9, 0x9a, 0xef, 0xff, 0xdf, 0xff, 0x60, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xf6, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x49, + 0xde, 0xfe, 0xc7, 0x20, 0x3, 0xff, 0xf6, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0x1, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x9f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xd, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0xd, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x9f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x1, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x54, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x2e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x7, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x5f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x86, 0x8e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xef, 0xec, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x36, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x15, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6c, 0xef, 0xf4, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xc6, 0x41, + 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x34, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb5, 0x31, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6c, + 0xef, 0xf4, + + /* U+007C "|" */ + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + + /* U+007D "}" */ + 0x3f, 0xfe, 0xc6, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x4, 0x5b, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x43, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x70, 0x0, 0x3, 0x5b, 0xff, 0xff, 0x30, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xfe, 0xc7, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9e, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x7, 0xcb, 0x1, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xfa, 0x2f, 0xff, + 0x50, 0x2a, 0xff, 0xfd, 0x41, 0x3d, 0xff, 0x66, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9f, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf4, 0x7, 0xba, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0xa2, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xdf, 0xe6, + 0x10, 0x29, 0xff, 0x90, 0x7, 0xfe, 0x20, 0x0, + 0x0, 0x6f, 0xf3, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xfd, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xfe, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xfd, 0xd, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0xbf, 0xfa, + 0x53, 0x6c, 0xff, 0x70, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd9, + 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x16, 0x84, 0x0, 0x3, 0xef, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xfc, + 0x5f, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xf2, 0x0, 0x8e, 0xfc, 0x30, + + /* U+F001 "" */ + 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, 0x37, 0xcf, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x20, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcf, + 0xfe, 0xcf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0x9c, 0xff, + 0xec, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xff, 0xd9, 0x30, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x5e, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xe5, 0xef, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8, 0xfe, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xef, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xfe, 0x5e, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xe5, + + /* U+F00B "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x19, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xa2, 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, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 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, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0x80, 0x0, 0x19, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x17, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x79, 0x40, 0x0, 0x2, 0xef, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf4, 0x3f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x3b, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0x80, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe3, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf5, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x78, 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x90, + 0x3, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x51, 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x45, 0x54, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x55, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x55, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x2, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x7d, 0xff, 0xff, 0xff, 0xb3, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x2d, 0xfd, 0x20, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x4e, 0xff, 0xfe, 0x40, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x30, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x5, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf4, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xd2, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2, 0xdf, 0xfa, + 0x0, 0xc, 0xb1, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x1, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x10, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbc, 0xcc, 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x4, 0xff, 0xff, 0x40, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4f, 0xf4, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x1, 0xef, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 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, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x67, 0x75, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa6, 0x42, 0x24, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x21, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x55, 0x55, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x53, 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, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x67, 0x77, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x42, 0x24, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x33, 0x33, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xd2, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4e, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2d, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x14, 0x10, + 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x16, 0x40, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xb1, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xe1, 0x0, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xa0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xd, 0xfe, 0x30, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2f, 0xff, 0xfe, + 0x0, 0x0, 0xdf, 0xff, 0x10, 0x2, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0xdf, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf6, 0x0, 0xd, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xdf, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x5, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xe3, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xf0, 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfc, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x20, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfb, 0x10, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, + 0x74, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaa, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x67, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xf4, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, + 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x20, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xb0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0x2, 0x68, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, + 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x24, 0x44, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x41, 0xe, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6f, 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, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x98, 0xbb, 0xbb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xe8, 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, + + /* U+F04C "" */ + 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, + 0x91, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x23, 0x33, + 0x33, 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0x20, 0x0, + + /* U+F04D "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F051 "" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x24, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfe, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf0, 0x7b, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 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, 0x1, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb7, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x44, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xfa, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xef, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8b, 0xbb, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x84, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 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, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x36, 0xac, 0xde, 0xfe, 0xdc, 0xa6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x24, 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfa, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x73, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x1, 0x69, 0xba, 0x61, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x27, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xcd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, + 0xed, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x4, 0x8a, 0xde, 0xff, 0xed, 0xb7, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xa3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x10, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x57, 0x74, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0xd, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa0, 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xcd, 0xe7, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xcd, 0xef, + 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdd, 0x10, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x79, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x52, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x24, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf5, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x50, 0x5, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xef, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, + 0x0, 0x0, 0x0, 0x5d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x5e, 0x20, 0x0, 0x0, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x4f, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, + + /* U+F078 "" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf5, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf1, 0xbf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x44, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x81, 0xdf, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "" */ + 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, 0x7f, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0x5c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0xb, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x70, 0xb, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xeb, 0x10, 0xe, 0xff, 0xff, + 0x10, 0x9, 0xea, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xe, 0xff, + 0xff, 0x10, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, 0xe, + 0xff, 0xff, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xae, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x74, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xa3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x33, 0x33, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0x11, 0x11, 0x10, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "" */ + 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, 0x4e, 0xea, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xee, + 0xdb, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xfd, 0x81, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x34, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xe0, 0x68, 0x88, 0x88, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x48, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0xf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, + 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x64, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F0C9 "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 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, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 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, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x10, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xf8, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xc1, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x1c, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0x9e, 0xe9, 0x10, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb9, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F0E7 "" */ + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xfe, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, 0x86, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x72, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x27, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x80, 0x3, + 0x60, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbf, 0xff, 0xff, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 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, 0xf7, + 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x74, 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, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9e, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, + 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0xaf, 0xfe, 0x88, 0x88, 0xbf, 0xfd, 0x88, 0x89, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x1, 0xff, 0x70, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x1f, 0xf6, 0x0, 0x0, 0xef, 0x90, 0x0, 0x1, + 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0x88, 0xbf, 0xfd, 0x88, + 0x8a, 0xff, 0xe8, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F124 "" */ + 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, 0x18, 0xef, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0xfb, 0x30, 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, + + /* U+F15B "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, + 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F1EB "" */ + 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, 0x1, 0x45, 0x78, 0x88, 0x87, 0x54, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xcc, 0xdd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x73, 0x10, 0x0, 0x0, 0x0, 0x1, 0x37, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xfd, 0x2e, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x2, 0xef, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9b, 0xde, 0xff, 0xed, 0xb9, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, 0x20, 0x0, + 0x2d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, + 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0x30, 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, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xaa, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x88, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x65, 0x5a, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x1d, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, + 0x0, 0x19, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x23, 0xcf, 0xfc, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x36, 0xff, 0xff, 0xfb, 0x20, 0xe, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, + 0xaa, 0xaa, 0xaa, 0xdf, 0xff, 0xba, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, + 0xff, 0xf9, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xba, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa4, 0x38, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x78, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x55, + 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1, 0x60, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x6f, + 0xff, 0xfc, 0x0, 0x1f, 0x60, 0x1, 0xef, 0xff, + 0xff, 0xf2, 0xa, 0xff, 0xff, 0xf6, 0x0, 0x6f, + 0xff, 0xc0, 0x1, 0xff, 0x60, 0x2, 0xef, 0xff, + 0xff, 0x50, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xfc, 0x0, 0x1f, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xc0, 0x1, 0xff, 0x30, 0x4, 0xff, 0xff, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6c, + 0x0, 0x1f, 0x30, 0x3, 0xff, 0xff, 0xff, 0xfb, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x30, + 0x0, 0x30, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x80, 0x0, 0x90, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xcc, 0x0, 0x1f, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xcf, 0xc0, 0x1, 0xff, 0x80, 0x0, 0x9f, + 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0x20, 0x1, + 0xcf, 0xfd, 0x0, 0x1f, 0xfd, 0x0, 0x4, 0xff, + 0xff, 0xf7, 0x8, 0xff, 0xff, 0xfd, 0x11, 0xcf, + 0xff, 0xd0, 0x1, 0xfd, 0x10, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xff, 0xfd, 0xcf, 0xff, + 0xfd, 0x0, 0x1d, 0x10, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, 0xca, 0x61, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x44, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb6, 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x22, 0xef, 0xff, 0xf9, 0x9, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe2, + 0x2e, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x61, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x9f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xfd, 0xb9, 0x86, 0x42, 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, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x8f, + 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, + 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, + 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xcf, 0xf8, 0x88, 0x8f, 0xfb, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0xff, + 0xff, 0xff, 0x20, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 172, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 172, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 87, .adv_w = 250, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 159, .adv_w = 450, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 397, .box_w = 23, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 540, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1464, .adv_w = 439, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1854, .adv_w = 134, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 1878, .adv_w = 216, .box_w = 10, .box_h = 39, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2073, .adv_w = 216, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2249, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2377, .adv_w = 372, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2548, .adv_w = 145, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2590, .adv_w = 245, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2614, .adv_w = 145, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2635, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2986, .adv_w = 427, .box_w = 24, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3334, .adv_w = 237, .box_w = 11, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3494, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3813, .adv_w = 366, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4132, .adv_w = 428, .box_w = 26, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4828, .adv_w = 395, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5162, .adv_w = 383, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5481, .adv_w = 412, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5815, .adv_w = 395, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6134, .adv_w = 145, .box_w = 7, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6211, .adv_w = 145, .box_w = 7, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6309, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6490, .adv_w = 372, .box_w = 19, .box_h = 13, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 6614, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6795, .adv_w = 367, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7100, .adv_w = 662, .box_w = 39, .box_h = 37, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 7822, .adv_w = 468, .box_w = 31, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8272, .adv_w = 484, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8635, .adv_w = 463, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9027, .adv_w = 529, .box_w = 28, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9433, .adv_w = 429, .box_w = 21, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9738, .adv_w = 406, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10028, .adv_w = 494, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10420, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10783, .adv_w = 198, .box_w = 5, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10856, .adv_w = 328, .box_w = 18, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11117, .adv_w = 460, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11480, .adv_w = 380, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11770, .adv_w = 611, .box_w = 30, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12205, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12568, .adv_w = 538, .box_w = 31, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13018, .adv_w = 462, .box_w = 23, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13352, .adv_w = 538, .box_w = 33, .box_h = 35, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13930, .adv_w = 465, .box_w = 24, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14278, .adv_w = 397, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14612, .adv_w = 376, .box_w = 24, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14960, .adv_w = 506, .box_w = 25, .box_h = 29, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15323, .adv_w = 456, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15758, .adv_w = 721, .box_w = 43, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16382, .adv_w = 431, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16774, .adv_w = 414, .box_w = 28, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17180, .adv_w = 420, .box_w = 25, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17543, .adv_w = 213, .box_w = 9, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 17719, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 18070, .adv_w = 213, .box_w = 10, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 18265, .adv_w = 373, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 18418, .adv_w = 320, .box_w = 20, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18448, .adv_w = 384, .box_w = 11, .box_h = 6, .ofs_x = 4, .ofs_y = 25}, + {.bitmap_index = 18481, .adv_w = 383, .box_w = 19, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 18690, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19047, .adv_w = 365, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19278, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19635, .adv_w = 392, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19877, .adv_w = 226, .box_w = 16, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20125, .adv_w = 442, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 20470, .adv_w = 436, .box_w = 21, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20796, .adv_w = 179, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20908, .adv_w = 182, .box_w = 13, .box_h = 40, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 21168, .adv_w = 394, .box_w = 22, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21509, .adv_w = 179, .box_w = 5, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21587, .adv_w = 676, .box_w = 36, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21983, .adv_w = 436, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22214, .adv_w = 406, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22467, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 22812, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 23157, .adv_w = 262, .box_w = 13, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23300, .adv_w = 321, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23509, .adv_w = 265, .box_w = 16, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23725, .adv_w = 433, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23956, .adv_w = 358, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24220, .adv_w = 575, .box_w = 36, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24616, .adv_w = 353, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24858, .adv_w = 358, .box_w = 24, .box_h = 30, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 25218, .adv_w = 333, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25427, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 25661, .adv_w = 191, .box_w = 4, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 25739, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 25973, .adv_w = 372, .box_w = 19, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 26049, .adv_w = 268, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 26147, .adv_w = 201, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 26179, .adv_w = 640, .box_w = 40, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26999, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27599, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28319, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28919, .adv_w = 440, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29311, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30111, .adv_w = 640, .box_w = 38, .box_h = 40, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30871, .adv_w = 720, .box_w = 45, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31681, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32481, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33156, .adv_w = 640, .box_w = 40, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33996, .adv_w = 320, .box_w = 20, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34316, .adv_w = 480, .box_w = 30, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34796, .adv_w = 720, .box_w = 45, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35651, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36251, .adv_w = 440, .box_w = 28, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36811, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 37274, .adv_w = 560, .box_w = 35, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38009, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 38639, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39269, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 39732, .adv_w = 560, .box_w = 37, .box_h = 36, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 40398, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 40776, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 41154, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41784, .adv_w = 560, .box_w = 35, .box_h = 8, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 41924, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42599, .adv_w = 800, .box_w = 51, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43619, .adv_w = 720, .box_w = 47, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44559, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45279, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 45664, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 46049, .adv_w = 800, .box_w = 50, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46849, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47449, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48249, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49090, .adv_w = 560, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49738, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50438, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51068, .adv_w = 560, .box_w = 35, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51628, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52228, .adv_w = 400, .box_w = 27, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 52768, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 53468, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 54168, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 54843, .adv_w = 640, .box_w = 42, .box_h = 42, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 55725, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56325, .adv_w = 800, .box_w = 50, .box_h = 37, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57250, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 57900, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 58550, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59200, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59850, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 60500, .adv_w = 800, .box_w = 51, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61316, .adv_w = 560, .box_w = 31, .box_h = 40, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 61936, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 62636, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63477, .adv_w = 800, .box_w = 50, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 64227, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 64827, .adv_w = 644, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 29, 0, 17, -14, 0, 0, + 0, 0, -35, -38, 4, 30, 14, 11, + -26, 4, 31, 2, 27, 6, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -19, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -13, + 0, 0, 0, 0, -6, 0, 0, -8, + -10, 0, 0, -6, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -10, 0, -17, 0, -77, 0, + 0, -13, 0, 13, 19, 1, 0, -13, + 6, 6, 21, 13, -11, 13, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -17, -8, -31, 0, -26, + -4, 0, 0, 0, 0, 1, 25, 0, + -19, -5, -2, 2, 0, -11, 0, 0, + -4, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, -5, 24, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, + 0, 6, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 13, 6, 19, -6, 0, 0, 13, -6, + -21, -88, 4, 17, 13, 1, -8, 0, + 23, 0, 20, 0, 20, 0, -60, 0, + -8, 19, 0, 21, -6, 13, 6, 0, + 0, 2, -6, 0, 0, -11, 51, 0, + 51, 0, 19, 0, 27, 8, 11, 19, + 0, 0, 0, -24, 0, 0, 0, 0, + 2, -4, 0, 4, -12, -8, -13, 4, + 0, -6, 0, 0, 0, -26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -35, 0, -40, 0, 0, 0, + 0, -4, 0, 63, -8, -8, 6, 6, + -6, 0, -8, 6, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -62, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 38, 0, 0, -24, 0, + 21, 0, -44, -62, -44, -13, 19, 0, + 0, -43, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 19, -78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -8, -13, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -16, + -21, -21, -12, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -8, 0, -11, 0, 0, -4, 0, 19, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -10, 0, -19, + -4, -19, 13, 0, 0, -13, 6, 13, + 17, 0, -16, -2, -8, 0, -2, -30, + 6, -4, 4, -34, 6, 0, 0, 2, + -33, 0, -34, -5, -56, -4, 0, -32, + 0, 13, 18, 0, 8, 0, 0, 0, + 0, 1, 0, -12, -8, 0, -19, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -8, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -4, 0, -13, 6, 0, 0, -8, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -12, 0, 19, -4, 2, -20, 0, 0, + 17, -32, -33, -27, -13, 6, 0, -5, + -42, -12, 0, -12, 0, -13, 10, -12, + -41, 0, -17, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -19, -24, 0, -32, + -15, -13, -15, -19, -8, -17, -1, -12, + -17, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -11, -14, + -14, -2, 0, -19, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -32, -19, 0, + 0, 0, -10, -32, 0, 0, -6, 6, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -12, 0, + 0, 0, 0, 8, 0, 4, -13, -13, + 0, -6, -6, -8, 0, 0, 0, 0, + 0, 0, -19, 0, -6, 0, -10, -6, + 0, -14, -16, -19, -5, 0, -13, 0, + -19, 0, 0, 0, 0, 51, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -28, + 0, 0, 0, 0, 0, -60, -12, 21, + 19, -5, -27, 0, 6, -10, 0, -32, + -3, -8, 6, -45, -6, 8, 0, 10, + -22, -10, -24, -21, -27, 0, 0, -38, + 0, 36, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -17, -21, -1, -60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -10, 0, 0, + -13, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 8, 0, -14, 6, -4, -2, -17, + -6, 0, -8, -6, -4, 0, -10, -11, + 0, 0, -5, -2, -4, -11, -8, 0, + 0, -6, 0, 6, -4, 0, -14, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 6, 0, -9, 0, -4, -8, + -20, -4, -4, -4, -2, -4, -8, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 8, -4, 0, -4, + 0, 0, 0, -4, -8, -4, -6, -8, + -6, 0, 5, 26, -2, 0, -17, 0, + -4, 13, 0, -6, -27, -8, 10, 1, + 0, -30, -11, 6, -11, 4, 0, -4, + -5, -20, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 6, 6, -13, -12, 0, + -11, -6, -10, -6, -6, 0, -11, 3, + -12, -11, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -21, 0, + 4, -14, 13, 1, -4, -30, 0, 0, + -14, -6, 0, -26, -16, -18, 0, 0, + -28, -6, -26, -24, -31, 0, -17, 0, + 5, 43, -8, 0, -15, -6, -2, -6, + -11, -17, -12, -24, -26, -15, -6, 0, + 0, -4, 0, 2, 0, 0, -45, -6, + 19, 14, -14, -24, 0, 2, -20, 0, + -32, -4, -6, 13, -59, -8, 2, 0, + 0, -42, -8, -33, -6, -47, 0, 0, + -45, 0, 38, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -24, -4, 0, -42, + 0, 0, 0, 0, -20, 0, -6, 0, + -2, -18, -30, 0, 0, -3, -10, -19, + -6, 0, -4, 0, 0, 0, 0, -29, + -6, -21, -20, -5, -11, -16, -6, -11, + 0, -13, -6, -21, -10, 0, -8, -12, + -6, -12, 0, 3, 0, -4, -21, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 4, -13, 26, 0, -6, -6, -8, + 0, 0, 0, 0, 0, 0, -19, 0, + -6, 0, -10, -6, 0, -14, -16, -19, + -5, 0, -13, 5, 26, 0, 0, 0, + 0, 51, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -13, + -6, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -20, + -10, 0, 19, -21, -20, -13, -13, 26, + 12, 6, -56, -4, 13, -6, 0, -6, + 7, -6, -22, 0, -6, 6, -8, -5, + -19, -5, 0, 0, 19, 13, 0, -18, + 0, -35, -8, 19, -8, -24, 2, -8, + -21, -21, -6, 26, 6, 0, -10, 0, + -17, 0, 5, 21, -15, -24, -26, -16, + 19, 0, 2, -47, -5, 6, -11, -4, + -15, 0, -14, -24, -10, -10, -5, 0, + 0, -15, -13, -6, 0, 19, 15, -6, + -35, 0, -35, -9, 0, -22, -37, -2, + -20, -11, -21, -18, 17, 0, 0, -8, + 0, -13, -6, 0, -6, -12, 0, 11, + -21, 6, 0, 0, -34, 0, -6, -14, + -11, -4, -19, -16, -21, -15, 0, -19, + -6, -15, -12, -19, -6, 0, 0, 2, + 30, -11, 0, -19, -6, 0, -6, -13, + -15, -17, -18, -24, -8, -13, 13, 0, + -10, 0, -32, -8, 4, 13, -20, -24, + -13, -21, 21, -6, 3, -60, -12, 13, + -14, -11, -24, 0, -19, -27, -8, -6, + -5, -6, -13, -19, -2, 0, 0, 19, + 18, -4, -42, 0, -38, -15, 15, -24, + -44, -13, -22, -27, -32, -21, 13, 0, + 0, 0, 0, -8, 0, 0, 6, -8, + 13, 4, -12, 13, 0, 0, -20, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 19, 1, 0, -8, 0, 0, + 0, 0, -4, -4, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 24, 0, 12, 2, 2, -8, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -38, 0, -6, 11, 0, 19, + 0, 0, 63, 8, -13, -13, 6, 6, + -4, 2, -32, 0, 0, 31, -38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 24, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -17, 0, + 0, 2, 0, 0, 6, 83, -13, -5, + 20, 17, -17, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -83, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, -17, 0, 0, 0, 0, + -14, -3, 0, 0, 0, -14, 0, -8, + 0, -30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -43, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -10, 0, + -17, 0, 0, 0, -11, 6, -8, 0, + 0, -17, -6, -15, 0, 0, -17, 0, + -6, 0, -30, 0, -7, 0, 0, -52, + -12, -26, -7, -23, 0, 0, -43, 0, + -17, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -14, 0, -14, 8, -7, 13, + 0, -4, -15, -4, -11, -12, 0, -8, + -3, -4, 4, -17, -2, 0, 0, 0, + -56, -5, -9, 0, -14, 0, -4, -30, + -6, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -11, -4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -14, 0, -4, 0, 0, 0, -13, + 6, 0, 0, 0, -17, -6, -13, 0, + 0, -18, 0, -6, 0, -30, 0, 0, + 0, 0, -62, 0, -13, -24, -32, 0, + 0, -43, 0, -4, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -10, -3, + -10, 2, 0, 0, 11, -8, 0, 20, + 31, -6, -6, -19, 8, 31, 11, 14, + -17, 8, 27, 8, 19, 14, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 30, -12, -6, 0, -5, + 51, 28, 51, 0, 0, 0, 6, 0, + 0, 24, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -54, -8, -5, -26, + -31, 0, 0, -43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -54, -8, -5, + -26, -31, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 6, 0, -6, + 5, 12, 6, -19, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -16, 0, + -6, -4, -13, 0, -6, -26, 0, 40, + -6, 0, -14, -4, 0, -4, -11, 0, + -6, -18, -13, -8, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -54, + -8, -5, -26, -31, 0, 0, -43, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -20, -8, -6, 19, -6, -6, + -26, 2, -4, 2, -4, -17, 1, 14, + 1, 5, 2, 5, -15, -26, -8, 0, + -24, -12, -17, -27, -25, 0, -10, -13, + -8, -8, -5, -4, -8, -4, 0, -4, + -2, 10, 0, 10, -4, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -17, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -11, + -6, 6, 0, -11, -12, -4, 0, -19, + -4, -14, -4, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -43, 0, 20, 0, 0, -12, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -15, 0, 0, + 27, -8, -21, -20, 4, 7, 7, -1, + -18, 4, 10, 4, 19, 4, 21, -4, + -17, 0, 0, -26, 0, 0, -19, -17, + 0, 0, -13, 0, -8, -11, 0, -10, + 0, -10, 0, -4, 10, 0, -5, -19, + -6, 24, 0, 0, -6, 0, -13, 0, + 0, 8, -15, 0, 6, -6, 5, 1, + 0, -21, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -26, -8, -14, 0, + -19, 0, 0, -30, 0, 24, -6, 0, + -12, 0, 4, 0, -6, 0, -6, -19, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -8, + -4, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -40, 0, 14, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -40, -36, 2, + 28, 19, 11, -26, 4, 27, 0, 24, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_40 = { +#else +lv_font_t lv_font_montserrat_40 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 44, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_40*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_42.c b/libraries/lvgl/src/font/lv_font_montserrat_42.c new file mode 100644 index 0000000..71fdd93 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_42.c @@ -0,0 +1,10090 @@ +/******************************************************************************* + * Size: 42 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 42 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_42.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 1 +#endif + +#if LV_FONT_MONTSERRAT_42 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, + 0xfd, 0x0, 0x8f, 0xff, 0xc0, 0x7, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0xb0, 0x6, 0xff, 0xfa, 0x0, + 0x6f, 0xff, 0xa0, 0x5, 0xff, 0xf9, 0x0, 0x4f, + 0xff, 0x90, 0x4, 0xff, 0xf8, 0x0, 0x3f, 0xff, + 0x70, 0x3, 0xff, 0xf7, 0x0, 0x2f, 0xff, 0x60, + 0x1, 0xff, 0xf6, 0x0, 0x1f, 0xff, 0x50, 0x0, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0x40, 0x0, 0x99, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x6f, 0xff, 0xb0, 0xf, 0xff, 0xff, 0x30, 0xff, + 0xff, 0xf4, 0xc, 0xff, 0xfe, 0x10, 0x1b, 0xfd, + 0x30, + + /* U+0022 "\"" */ + 0x5f, 0xff, 0x20, 0x0, 0xbf, 0xfc, 0x5f, 0xff, + 0x20, 0x0, 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, + 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, 0xaf, 0xfb, + 0x4f, 0xff, 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, + 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, 0x0, 0x0, + 0x9f, 0xf9, 0x3f, 0xff, 0x0, 0x0, 0x9f, 0xf9, + 0x2f, 0xff, 0x0, 0x0, 0x9f, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x8f, 0xf8, 0x2f, 0xfe, 0x0, 0x0, + 0x8f, 0xf8, 0x19, 0x98, 0x0, 0x0, 0x49, 0x94, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1, 0x22, 0x22, 0x2b, + 0xff, 0x62, 0x22, 0x22, 0x22, 0xdf, 0xf4, 0x22, + 0x22, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x12, 0x22, 0x23, 0xff, + 0xe2, 0x22, 0x22, 0x22, 0x5f, 0xfc, 0x22, 0x22, + 0x22, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xcf, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfc, 0x40, 0x1f, 0xf9, 0x0, + 0x26, 0xcf, 0xf5, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x6e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x6, 0xfe, 0x50, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0xd, 0xff, 0xfd, 0x72, + 0x0, 0x1f, 0xf9, 0x0, 0x4c, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0xec, 0xbf, 0xfd, 0xbe, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xde, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5b, 0xef, 0xea, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0x97, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x2e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x20, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x3, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xdf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc0, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe8, 0x79, 0xff, 0xf8, 0x0, 0xd, 0xff, + 0x50, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, + 0xa0, 0x0, 0x6e, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x5, 0xbe, 0xfe, 0xa4, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x6f, 0xfd, 0x50, 0x5, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xe, 0xfe, 0x10, 0x0, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x5, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x7, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x62, + 0x2, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x3c, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfe, 0xcf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x91, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xaf, 0xa4, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xf5, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x9, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x5f, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xd9, 0x77, 0x8a, 0xef, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x50, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x38, 0xcd, 0xff, 0xec, 0xa5, 0x10, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xff, 0x25, 0xff, 0xf2, 0x4f, 0xff, 0x14, + 0xff, 0xf1, 0x4f, 0xff, 0x3, 0xff, 0xf0, 0x3f, + 0xff, 0x3, 0xff, 0xf0, 0x2f, 0xff, 0x2, 0xff, + 0xe0, 0x2f, 0xfe, 0x1, 0x99, 0x80, + + /* U+0028 "(" */ + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0xdf, 0xff, 0x10, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0x6, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, 0xf8, + + /* U+0029 ")" */ + 0x6f, 0xff, 0x70, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, + 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x16, 0x66, + 0x66, 0x66, 0xbf, 0xff, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x9, 0xed, 0x50, 0x9f, 0xff, 0xf2, 0xef, 0xff, + 0xf7, 0xef, 0xff, 0xf7, 0x8f, 0xff, 0xf5, 0x8, + 0xff, 0xf0, 0x7, 0xff, 0xb0, 0xa, 0xff, 0x50, + 0xe, 0xff, 0x0, 0x2f, 0xfb, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf1, 0x0, + + /* U+002D "-" */ + 0x59, 0x99, 0x99, 0x99, 0x99, 0x96, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x0, 0x8d, 0xc4, 0x0, 0x9f, 0xff, 0xf2, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0x20, 0x1a, 0xed, 0x50, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfe, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x7b, 0xbb, 0xbb, 0xbf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x2, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x0, 0x0, 0x3c, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5c, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0xb, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x4, + 0xff, 0xff, 0xe8, 0x40, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfd, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xac, 0xef, 0xfe, 0xda, 0x61, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0x88, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x96, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0xfb, 0xbb, 0xbb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xcb, 0xbb, 0xa9, 0x85, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x59, 0xef, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x60, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x4, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xde, 0xff, 0xeb, 0x83, 0x0, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfd, 0xbb, 0xce, 0xff, 0xf5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x2, 0x7c, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf7, 0x0, 0x0, 0x4, 0x57, 0x65, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0xff, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, 0xfe, 0xff, + 0xfc, 0x62, 0x0, 0x25, 0xbf, 0xff, 0xff, 0x30, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xd, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x6f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfb, 0xd, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x6f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, + 0x3, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0x60, 0x0, 0x7, 0xff, 0xff, 0xfe, + 0xa8, 0x89, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xef, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf2, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x1, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xea, 0x88, 0x8a, 0xef, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0x40, 0x0, 0xb, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xa0, 0x0, 0x2, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x75, 0x45, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xa5, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0x20, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x22, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf2, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, + 0x0, 0x1e, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xa8, 0x78, 0xad, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xdb, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x98, + 0x8a, 0xef, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0x20, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x1c, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x88, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfb, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, 0xbf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xfd, 0x1, 0xef, 0xff, 0xff, 0xc9, 0x88, 0xae, + 0xff, 0xff, 0x9f, 0xff, 0xd0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xfd, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x83, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xd7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xbb, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xca, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 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, 0x8, 0xdc, 0x40, 0x9, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf7, 0xf, 0xff, + 0xff, 0x70, 0xaf, 0xff, 0xf2, 0x1, 0xae, 0xd5, + 0x0, + + /* U+003B ";" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 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, 0x9, 0xed, 0x50, 0x9, + 0xff, 0xff, 0x20, 0xef, 0xff, 0xf7, 0xe, 0xff, + 0xff, 0x70, 0x8f, 0xff, 0xf5, 0x0, 0x8f, 0xff, + 0x0, 0x7, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xe, 0xff, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x6f, + 0xf5, 0x0, 0xa, 0xff, 0x10, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, + 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x2, 0x9e, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + + /* U+003D "=" */ + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x64, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 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, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x64, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xcf, + 0xff, 0xff, 0xfe, 0x10, 0x5f, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x90, 0x9, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe0, 0x0, 0x4b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x66, 0x64, 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, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd4, 0x0, 0x0, + 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, + 0xcd, 0xef, 0xfe, 0xdb, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x2, + 0x59, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, + 0x0, 0x15, 0x55, 0x10, 0xbf, 0xfe, 0x10, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x6f, 0xff, 0x40, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x6f, 0xff, 0x40, 0x2, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6f, 0xff, 0x40, + 0x0, 0x7f, 0xfb, 0x0, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x94, 0x10, 0x14, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, 0x20, + 0xe, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0x70, 0x4f, 0xfe, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x40, 0x0, 0x2, 0xff, 0xc0, + 0x8f, 0xf9, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf6, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf2, + 0xdf, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xef, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xf6, 0xff, 0xf1, 0x0, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xef, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xdf, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xf3, + 0xaf, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xdf, 0xf0, 0x7f, 0xfa, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x40, 0x0, 0x1, 0xff, 0xd0, + 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, + 0x0, 0x7, 0xff, 0x80, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0x20, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xe9, 0x54, 0x69, 0xef, 0xff, 0x6e, 0xff, 0xfa, + 0x57, 0xef, 0xfa, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x7, 0xdf, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0x95, + 0x20, 0x0, 0x0, 0x14, 0x7c, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xce, 0xff, 0xfe, 0xca, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xa7, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xff, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + + /* U+0042 "B" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9f, + 0xff, 0xc7, 0x77, 0x77, 0x77, 0x78, 0x8b, 0xef, + 0xff, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xf6, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x7d, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, 0x77, 0x78, + 0xad, 0xff, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0x80, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xd0, 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x78, 0xad, 0xff, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xc1, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xc1, 0x0, 0x1f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcc, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xfd, 0x10, 0x0, 0xb, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xef, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xff, + 0xec, 0x84, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x70, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x79, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x99, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x49, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf7, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, + + /* U+0046 "F" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, + 0xfe, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, + 0x0, 0x15, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0xa, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0x30, 0x0, 0x6f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe3, 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x20, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x1, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfd, 0xc9, + 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xce, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + + /* U+0049 "I" */ + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, + + /* U+004A "J" */ + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x0, 0x0, + + /* U+004B "K" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xd1, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe2, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x35, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf2, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd1, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xb0, + + /* U+004C "L" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x69, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, + + /* U+004D "M" */ + 0x9f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfa, + 0x9f, 0xff, 0x7d, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd6, 0xff, 0xfa, + 0x9f, 0xff, 0x74, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x45, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x8f, 0xff, 0x90, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf3, + 0xe, 0xff, 0xe1, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + + /* U+004E "N" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x9b, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0xb, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xfe, 0x20, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x70, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x18, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf6, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe8, + 0x30, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xfe, 0xcb, 0xbd, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xff, 0xff, + 0xf6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x3, 0xcf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x86, 0x8c, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, + + /* U+0052 "R" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0x60, 0x9, 0xff, 0xfd, 0xaa, + 0xaa, 0xaa, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf9, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xcf, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xf6, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, + 0x7, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xa5, + 0x10, 0x0, 0x0, 0x1, 0x6e, 0xff, 0xff, 0x40, + 0x1d, 0xff, 0xff, 0xff, 0xfd, 0xcb, 0xab, 0xdf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xbd, 0xff, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbe, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xaf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xde, 0xfe, + 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xb, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x96, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf3, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0xb, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xc, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x37, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xc0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf7, 0x1e, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xb0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+005B "[" */ + 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xa6, 0x66, 0x61, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xa6, 0x66, + 0x61, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x16, + 0x66, 0x6a, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x16, 0x66, 0x6a, 0xff, + 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0xe, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0x0, 0xf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfb, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x6, 0x88, 0x88, 0x20, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0xa9, 0xac, 0xff, 0xff, 0xfe, 0x10, + 0x6, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0x80, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xfc, 0x51, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf7, 0x2f, 0xff, + 0xff, 0x95, 0x33, 0x59, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x15, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x5, 0xff, 0xf7, + + /* U+0062 "b" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x27, 0xce, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xd2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xee, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x2f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x2f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xcd, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xb2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xb0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xdb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xf5, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x80, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x1e, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, 0xeb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, + 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x10, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfc, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfa, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xfd, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x0, 0x0, 0xff, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xea, + 0x88, 0xae, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x0, 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x70, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x91, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, + 0xba, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xde, 0xfe, 0xdb, 0x61, 0x0, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfd, 0x92, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x76, + 0xaf, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, + 0xcf, 0xff, 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, 0xfd, 0xb7, + 0x10, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0x10, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, 0xed, + 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x12, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x3f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x13, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x1f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, 0xa, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf1, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0x10, 0x1, 0xef, 0xff, + 0xfe, 0x83, 0x10, 0x13, 0x8e, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xef, 0xff, 0x10, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0x99, 0x75, 0x10, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, + 0xe7, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xec, 0xaa, + 0xac, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8c, 0xde, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x38, + 0xce, 0xfe, 0xda, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x2f, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xce, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xc0, 0x2f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+0069 "i" */ + 0x2, 0x66, 0x0, 0x4f, 0xff, 0xd1, 0xcf, 0xff, + 0xf7, 0xdf, 0xff, 0xf7, 0x8f, 0xff, 0xf2, 0x8, + 0xcc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xcc, 0x60, 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, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x4, 0x0, 0x0, 0x1d, 0xff, 0xf9, + 0x0, 0xfe, 0x98, 0x9e, 0xff, 0xff, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6, 0xbe, 0xff, 0xda, + 0x30, 0x0, 0x0, + + /* U+006B "k" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x50, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x1d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x3e, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + + /* U+006C "l" */ + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + + /* U+006D "m" */ + 0x2f, 0xff, 0xb0, 0x0, 0x5a, 0xde, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x49, 0xce, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x2f, 0xff, + 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfc, 0x98, 0x9c, + 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xfe, 0xa8, 0x8a, + 0xef, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, + + /* U+006E "n" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x2f, 0xff, + 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfd, 0x98, 0x8a, + 0xef, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x2f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x2f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x2f, 0xff, 0xb0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xdf, 0xff, + 0xfe, 0x97, 0x68, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd0, 0x2f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xed, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x2f, 0xff, 0xd1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xd0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x27, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xb6, + 0x10, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfa, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0xa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfc, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xfd, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xa5, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, + + /* U+0072 "r" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xc2, 0xff, + 0xfb, 0x2, 0xcf, 0xff, 0xfc, 0x2f, 0xff, 0xb3, + 0xff, 0xff, 0xff, 0xc2, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xa4, 0x10, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc9, 0x61, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, + 0xda, 0x89, 0xac, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xc0, 0x2, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x58, 0xbf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x1f, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x68, 0xff, 0xff, 0xfe, + 0xba, 0x99, 0xbe, 0xff, 0xff, 0xd0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, 0xcf, 0xff, + 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x3, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc8, 0x8b, 0xf8, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x18, 0xce, 0xfe, 0xb7, 0x0, + + /* U+0075 "u" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf9, 0x3, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xbc, 0xef, + 0xff, 0xfc, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xf9, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4, + 0xff, 0xf9, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xb6, 0x10, 0x4, 0xff, 0xf9, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x9, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x6, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x8c, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x26, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x91, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x50, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x2c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x37, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x91, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x89, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xef, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x76, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x47, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x76, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + + /* U+007C "|" */ + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, + + /* U+007D "}" */ + 0x3f, 0xff, 0xc8, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x1, 0x68, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xaf, 0xff, 0xe8, 0x72, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x16, 0x8c, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x81, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0xae, 0xe0, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x5, + 0xff, 0xb0, 0x1f, 0xff, 0x81, 0x6, 0xef, 0xff, + 0xc5, 0x37, 0xff, 0xf6, 0x4, 0xff, 0xb0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x30, 0x6, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xe9, 0x20, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x29, 0xdf, 0xec, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7f, 0xfd, 0x75, 0x5a, 0xff, 0xe1, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x9, 0xfd, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, 0xef, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xf8, 0xf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x80, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x6f, 0xf3, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xfc, 0x0, 0x7, 0xff, 0xe8, 0x56, 0xaf, + 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x0, 0x3b, 0xdb, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0x60, 0xe, 0xff, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x50, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0x5, 0xdf, 0xd7, 0x0, + + /* U+F001 "" */ + 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, 0x1, + 0x5a, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x84, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x89, 0x86, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x1, 0x35, 0x53, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xdd, 0xda, 0x71, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6, 0x50, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x10, 0x0, 0x5, 0x60, 0xbf, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xfb, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xce, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xec, 0xcc, 0xcf, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaa, 0xad, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xda, 0xaa, 0xaf, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xd2, 0x22, 0x27, 0xff, 0xff, + 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x35, 0xff, 0xff, 0x72, 0x22, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8c, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc8, 0x88, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xe4, 0x44, 0x49, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x94, 0x44, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 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, 0x66, 0x6a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x66, 0x6e, 0xff, 0xef, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xfe, 0x4e, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xe4, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x5, + 0x77, 0x77, 0x77, 0x77, 0x61, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x50, 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, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x1, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x60, 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, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, + 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x3, 0xcd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x5, + 0xef, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe3, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x81, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc0, 0x1, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0x0, 0x1, 0x8b, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xcc, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x93, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x18, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x20, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x5, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xfb, 0x5f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb7, 0x31, 0x0, 0x12, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x67, 0x89, + 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0xcf, 0xff, 0xff, 0xeb, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x91, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x2b, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x60, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x53, 0x36, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1, + 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x47, 0x89, 0x98, 0x64, + 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, + + /* U+F015 "" */ + 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, 0x6, 0xdf, 0xe7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3a, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0xff, 0xfd, 0x20, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x1, 0xef, 0x50, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xf4, 0x0, + 0x0, 0x11, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x53, 0x33, 0x33, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xc, + 0xff, 0xc1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x99, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, + 0xc, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0xdf, 0xff, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xcc, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xfd, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x10, 0x0, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xaa, 0xa9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa6, 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, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x90, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x89, + 0xab, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x74, 0x22, 0x46, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x8a, 0xbb, + 0xb9, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x55, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xcc, 0x30, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xbc, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x1e, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xaf, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbf, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0xd, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x30, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0x1, 0xff, 0xff, 0x40, 0x0, 0x7f, 0xff, 0x90, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xbb, 0x20, 0x0, + 0xa, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc2, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x34, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xb1, 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, + + /* U+F03E "" */ + 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x84, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 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, 0x11, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x35, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xda, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xfd, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0x60, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x98, 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0x50, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x2, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe8, + 0x31, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x33, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x50, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x11, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x15, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xbb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf8, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xb0, 0x2a, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 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, 0x8e, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x73, 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, 0x1a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x3a, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0x9a, 0x97, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x8, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xc5, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x89, 0xab, 0xa9, 0x86, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x53, 0x46, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x1, 0x89, 0x86, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x93, 0x13, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x7c, 0xff, 0xfe, 0x91, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x62, 0x0, 0x1, 0x49, 0xef, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xcb, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x2, 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x79, 0xab, 0xa8, 0x75, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x1, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x43, 0x57, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6, 0xbc, 0xb7, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x5f, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x51, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xe3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x94, 0x10, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 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, 0x2, 0x0, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xed, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfb, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x33, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x74, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x34, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x69, 0x99, 0x99, 0x99, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xe9, 0x9c, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x10, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8d, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x80, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xa, 0xfb, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x6, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x48, 0x88, 0x88, 0x88, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x88, 0x8c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x22, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xc1, 0x0, 0x3, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x6, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x83, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x92, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xa0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x2f, 0xff, 0xff, 0x20, + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9d, 0x80, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x2b, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x90, 0xd, 0xff, 0xff, + 0x60, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x1e, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0x7d, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa5, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F095 "" */ + 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, 0x7b, 0x84, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd9, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xdb, 0x85, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x32, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, 0xb8, 0x20, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, + 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xbc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, 0xff, + 0xf5, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xfd, + 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x68, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbc, 0xca, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x10, 0x1c, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xff, 0xfc, 0x4d, 0xff, 0xff, 0xfd, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfb, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x0, + + /* U+F0C9 "" */ + 0x8d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 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, + 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, + 0x8, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 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, 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, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1, 0xd5, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x30, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x4, 0xaa, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x61, 0x0, 0x16, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcc, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x33, 0x33, + 0x33, 0x5f, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, + 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x2b, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, 0x1, 0xc7, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x1f, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x1f, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, + 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x66, 0x66, + 0x66, 0x66, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xea, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xf7, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x82, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 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, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x1, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaa, 0xaa, 0xff, + 0xfd, 0xaa, 0xab, 0xff, 0xfc, 0xaa, 0xac, 0xff, + 0xfb, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xcf, + 0xf5, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfd, 0x99, 0x99, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9b, 0xff, 0xfa, 0x99, 0x9c, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x9f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfa, 0x44, 0x44, 0xdf, 0xf8, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x46, 0xff, 0xe5, 0x44, 0x47, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F124 "" */ + 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, + 0x6, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x30, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xff, 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, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 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, 0x12, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8, + 0x87, 0x77, 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf4, 0x1d, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xf7, 0x0, 0x1d, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x9b, 0xde, 0xff, 0xfe, 0xca, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x99, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 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, 0x2, 0x9c, 0xdb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x58, 0x97, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xcb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xde, 0xee, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd3, 0x11, 0x3f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x0, 0x0, 0x4c, 0xed, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x11, 0x4e, 0xff, 0xb2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xfd, 0x40, 0xe, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfa, 0x10, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x6, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfb, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xbb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbc, + 0xdd, 0xba, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x10, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x90, 0x8, 0x50, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x8f, + 0x50, 0x0, 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0x90, 0x8, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0x80, 0xa, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0xf9, 0x0, + 0x8f, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0x90, + 0x8, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x89, + 0x0, 0x8a, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x30, 0x3, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x40, 0x4, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xa9, 0x0, 0x8c, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xa0, 0x8, 0xfc, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x8f, + 0xfa, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xa0, 0x8, + 0xfe, 0x30, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0xbf, 0xff, 0xfa, 0x0, + 0x8e, 0x30, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8, 0x30, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xff, 0xff, 0xfe, 0xb7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x21, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xca, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x22, 0x22, 0x22, 0x22, 0x21, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x1, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, + 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, + 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, + 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, + 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, + 0xff, 0xff, 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xca, 0x86, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x20, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1d, 0xff, 0xf6, 0x44, 0x4f, 0xfc, + 0x44, 0x45, 0xff, 0xa4, 0x44, 0xff, 0xff, 0xf5, + 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdf, 0xff, + 0xdd, 0xdd, 0xff, 0xed, 0xdd, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 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, 0xc, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xac, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xcf, 0xff, 0xff, 0xf1, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 181, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 180, .box_w = 7, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 105, .adv_w = 263, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 177, .adv_w = 472, .box_w = 28, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 597, .adv_w = 417, .box_w = 24, .box_h = 41, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1089, .adv_w = 566, .box_w = 33, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1584, .adv_w = 461, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2018, .adv_w = 141, .box_w = 5, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2048, .adv_w = 226, .box_w = 10, .box_h = 40, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2248, .adv_w = 227, .box_w = 10, .box_h = 40, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2448, .adv_w = 269, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2584, .adv_w = 391, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2774, .adv_w = 153, .box_w = 6, .box_h = 12, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 2810, .adv_w = 257, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2834, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2855, .adv_w = 237, .box_w = 19, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3245, .adv_w = 448, .box_w = 24, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3605, .adv_w = 249, .box_w = 12, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3785, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4130, .adv_w = 384, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4475, .adv_w = 450, .box_w = 27, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4880, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5225, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5570, .adv_w = 402, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5915, .adv_w = 433, .box_w = 25, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6290, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6635, .adv_w = 153, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6716, .adv_w = 153, .box_w = 7, .box_h = 29, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6818, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7018, .adv_w = 391, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 7158, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7358, .adv_w = 385, .box_w = 22, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7688, .adv_w = 695, .box_w = 40, .box_h = 38, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 8448, .adv_w = 492, .box_w = 32, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8928, .adv_w = 509, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9318, .adv_w = 486, .box_w = 27, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9723, .adv_w = 555, .box_w = 29, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10158, .adv_w = 450, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10488, .adv_w = 427, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10818, .adv_w = 519, .box_w = 28, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11238, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11628, .adv_w = 208, .box_w = 5, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11703, .adv_w = 345, .box_w = 19, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11988, .adv_w = 483, .box_w = 27, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12393, .adv_w = 399, .box_w = 21, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12708, .adv_w = 642, .box_w = 32, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13188, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13578, .adv_w = 564, .box_w = 32, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14058, .adv_w = 485, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14433, .adv_w = 564, .box_w = 33, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 15027, .adv_w = 489, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15402, .adv_w = 417, .box_w = 24, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15762, .adv_w = 394, .box_w = 25, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16137, .adv_w = 532, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16527, .adv_w = 478, .box_w = 31, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 16992, .adv_w = 757, .box_w = 45, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17667, .adv_w = 452, .box_w = 28, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18087, .adv_w = 435, .box_w = 29, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18522, .adv_w = 442, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18912, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 19112, .adv_w = 237, .box_w = 18, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 19481, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 19681, .adv_w = 392, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 19852, .adv_w = 336, .box_w = 21, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19884, .adv_w = 403, .box_w = 12, .box_h = 6, .ofs_x = 4, .ofs_y = 26}, + {.bitmap_index = 19920, .adv_w = 402, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20150, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20534, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20787, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21171, .adv_w = 411, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21436, .adv_w = 237, .box_w = 17, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21708, .adv_w = 464, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 22096, .adv_w = 458, .box_w = 22, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22448, .adv_w = 187, .box_w = 6, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22547, .adv_w = 191, .box_w = 13, .box_h = 41, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 22814, .adv_w = 414, .box_w = 23, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23182, .adv_w = 187, .box_w = 5, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23262, .adv_w = 710, .box_w = 38, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23699, .adv_w = 458, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23952, .adv_w = 427, .box_w = 24, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24228, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 24600, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 24972, .adv_w = 276, .box_w = 13, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25122, .adv_w = 337, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25341, .adv_w = 278, .box_w = 17, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25579, .adv_w = 455, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25832, .adv_w = 376, .box_w = 25, .box_h = 23, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26120, .adv_w = 604, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26557, .adv_w = 371, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26822, .adv_w = 376, .box_w = 25, .box_h = 31, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 27210, .adv_w = 350, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27440, .adv_w = 236, .box_w = 12, .box_h = 40, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 27680, .adv_w = 201, .box_w = 5, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 27780, .adv_w = 236, .box_w = 13, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 28040, .adv_w = 391, .box_w = 21, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 28124, .adv_w = 282, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 28229, .adv_w = 211, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 28265, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 29211, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29883, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30681, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31353, .adv_w = 462, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 31788, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32670, .adv_w = 672, .box_w = 40, .box_h = 43, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 33530, .adv_w = 756, .box_w = 48, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34442, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 35345, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36113, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37016, .adv_w = 336, .box_w = 21, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37363, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37891, .adv_w = 756, .box_w = 48, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38875, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39547, .adv_w = 462, .box_w = 29, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40171, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 40698, .adv_w = 588, .box_w = 37, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41512, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42215, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42918, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 43445, .adv_w = 588, .box_w = 39, .box_h = 38, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 44186, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 44612, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 45038, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45741, .adv_w = 588, .box_w = 37, .box_h = 9, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 45908, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46676, .adv_w = 840, .box_w = 53, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47816, .adv_w = 756, .box_w = 49, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 48870, .adv_w = 672, .box_w = 42, .box_h = 39, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 49689, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50115, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50541, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51416, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52088, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52991, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53937, .adv_w = 588, .box_w = 38, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54659, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 55455, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 56158, .adv_w = 588, .box_w = 37, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56769, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57441, .adv_w = 420, .box_w = 28, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58043, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 58839, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 59635, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 60403, .adv_w = 672, .box_w = 44, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 61371, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 62059, .adv_w = 840, .box_w = 53, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 63093, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 63809, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 64525, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65241, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65957, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 66673, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67548, .adv_w = 588, .box_w = 33, .box_h = 43, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 68258, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 69054, .adv_w = 672, .box_w = 43, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69979, .adv_w = 840, .box_w = 53, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 70827, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71515, .adv_w = 676, .box_w = 43, .box_h = 28, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 30, 0, 18, -15, 0, 0, + 0, 0, -37, -40, 5, 32, 15, 11, + -27, 5, 33, 2, 28, 7, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -20, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -3, -13, + 0, 0, 0, 0, -7, 0, 0, -9, + -10, 0, 0, -7, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -10, 0, -18, 0, -81, 0, + 0, -13, 0, 13, 20, 1, 0, -13, + 7, 7, 22, 13, -11, 13, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -18, -8, -33, 0, -27, + -5, 0, 0, 0, 0, 1, 26, 0, + -20, -5, -2, 2, 0, -11, 0, 0, + -5, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -54, -5, 26, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, + 0, 7, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 13, 7, 20, -7, 0, 0, 13, -7, + -22, -92, 5, 18, 13, 1, -9, 0, + 24, 0, 22, 0, 22, 0, -62, 0, + -8, 20, 0, 22, -7, 13, 7, 0, + 0, 2, -7, 0, 0, -11, 54, 0, + 54, 0, 20, 0, 28, 9, 11, 20, + 0, 0, 0, -25, 0, 0, 0, 0, + 2, -5, 0, 5, -12, -9, -13, 5, + 0, -7, 0, 0, 0, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -37, 0, -42, 0, 0, 0, + 0, -5, 0, 67, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -65, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 40, 0, 0, -25, 0, + 22, 0, -46, -65, -46, -13, 20, 0, + 0, -45, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 20, -82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -13, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -17, + -22, -22, -13, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -11, 0, 0, -5, 0, 20, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -10, 0, -20, + -5, -20, 13, 0, 0, -13, 7, 13, + 18, 0, -17, -2, -8, 0, -2, -32, + 7, -5, 5, -36, 7, 0, 0, 2, + -35, 0, -36, -5, -58, -5, 0, -34, + 0, 13, 19, 0, 9, 0, 0, 0, + 0, 1, 0, -12, -9, 0, -20, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -5, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -5, 0, -13, 7, 0, 0, -8, + 3, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -13, 0, 20, -5, 2, -22, 0, 0, + 18, -34, -35, -28, -13, 7, 0, -5, + -44, -12, 0, -12, 0, -13, 10, -12, + -43, 0, -18, 0, 0, 3, -2, 5, + -5, 0, 7, 1, -20, -26, 0, -34, + -16, -14, -16, -20, -8, -18, -1, -13, + -18, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -3, 0, -2, -7, 0, -11, -15, + -15, -2, 0, -20, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -34, -20, 0, + 0, 0, -10, -34, 0, 0, -7, 7, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -12, 0, + 0, 0, 0, 8, 0, 5, -13, -13, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -20, 0, -7, 0, -10, -7, + 0, -15, -17, -20, -5, 0, -13, 0, + -20, 0, 0, 0, 0, 54, 0, 0, + 3, 0, 0, -9, 0, 7, 0, -29, + 0, 0, 0, 0, 0, -62, -12, 22, + 20, -5, -28, 0, 7, -10, 0, -34, + -3, -9, 7, -47, -7, 9, 0, 10, + -24, -10, -25, -22, -28, 0, 0, -40, + 0, 38, 0, 0, -3, 0, 0, 0, + -3, -3, -7, -18, -22, -1, -62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -3, -7, -10, 0, 0, + -13, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 9, 0, -15, 7, -5, -2, -17, + -7, 0, -9, -7, -5, 0, -10, -11, + 0, 0, -5, -2, -5, -11, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 7, 0, -9, 0, -5, -8, + -21, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -5, -5, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 5, 27, -2, 0, -18, 0, + -5, 13, 0, -7, -28, -9, 10, 1, + 0, -32, -11, 7, -11, 5, 0, -5, + -5, -22, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 7, 7, -13, -13, 0, + -11, -7, -10, -7, -7, 0, -11, 3, + -13, -11, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -22, 0, + 5, -15, 13, 1, -5, -32, 0, 0, + -15, -7, 0, -27, -17, -19, 0, 0, + -29, -7, -27, -26, -32, 0, -17, 0, + 5, 45, -9, 0, -15, -7, -2, -7, + -11, -18, -12, -25, -28, -15, -7, 0, + 0, -5, 0, 2, 0, 0, -47, -6, + 20, 15, -15, -25, 0, 2, -21, 0, + -34, -5, -7, 13, -62, -9, 2, 0, + 0, -44, -8, -35, -7, -49, 0, 0, + -47, 0, 40, 2, 0, -5, 0, 0, + 0, 0, -3, -5, -26, -5, 0, -44, + 0, 0, 0, 0, -22, 0, -6, 0, + -2, -19, -32, 0, 0, -3, -10, -20, + -7, 0, -5, 0, 0, 0, 0, -30, + -7, -22, -22, -5, -11, -17, -7, -11, + 0, -13, -6, -22, -10, 0, -8, -13, + -7, -13, 0, 3, 0, -5, -22, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 5, -13, 28, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -20, 0, + -7, 0, -10, -7, 0, -15, -17, -20, + -5, 0, -13, 5, 27, 0, 0, 0, + 0, 54, 0, 0, 3, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -7, -7, 0, 0, -13, + -7, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -22, + -11, 0, 20, -22, -22, -13, -13, 27, + 12, 7, -58, -5, 13, -7, 0, -7, + 7, -7, -24, 0, -7, 7, -9, -5, + -20, -5, 0, 0, 20, 13, 0, -19, + 0, -37, -9, 19, -9, -26, 2, -9, + -22, -22, -7, 27, 7, 0, -10, 0, + -18, 0, 5, 22, -15, -25, -27, -17, + 20, 0, 2, -49, -5, 7, -11, -5, + -15, 0, -15, -25, -10, -10, -5, 0, + 0, -15, -14, -7, 0, 20, 15, -7, + -37, 0, -37, -9, 0, -24, -39, -2, + -22, -11, -22, -19, 18, 0, 0, -9, + 0, -13, -6, 0, -7, -12, 0, 11, + -22, 7, 0, 0, -36, 0, -7, -15, + -11, -5, -20, -17, -22, -15, 0, -20, + -7, -15, -13, -20, -7, 0, 0, 2, + 32, -11, 0, -20, -7, 0, -7, -13, + -15, -18, -19, -26, -9, -13, 13, 0, + -10, 0, -34, -8, 4, 13, -22, -25, + -13, -22, 22, -7, 3, -62, -12, 13, + -15, -11, -25, 0, -20, -28, -8, -7, + -5, -7, -14, -20, -2, 0, 0, 20, + 19, -5, -44, 0, -40, -15, 16, -26, + -46, -13, -24, -28, -34, -22, 13, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 13, 5, -13, 13, 0, 0, -21, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 5, 20, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 26, 0, 12, 2, 2, -9, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, -7, 11, 0, 20, + 0, 0, 67, 8, -13, -13, 7, 7, + -5, 2, -34, 0, 0, 32, -40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 26, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -18, 0, + 0, 2, 0, 0, 7, 87, -13, -5, + 22, 18, -18, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -87, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -19, + 0, 0, 0, -18, 0, 0, 0, 0, + -15, -3, 0, 0, 0, -15, 0, -8, + 0, -32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -45, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -10, 0, + -18, 0, 0, 0, -11, 7, -8, 0, + 0, -18, -7, -15, 0, 0, -18, 0, + -7, 0, -32, 0, -7, 0, 0, -54, + -13, -27, -7, -24, 0, 0, -45, 0, + -18, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -15, 0, -15, 9, -7, 13, + 0, -5, -15, -5, -11, -13, 0, -8, + -3, -5, 5, -18, -2, 0, 0, 0, + -59, -5, -9, 0, -15, 0, -5, -32, + -6, 0, 0, -5, -5, 0, 0, 0, + 0, 5, 0, -5, -11, -5, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -13, + 7, 0, 0, 0, -18, -7, -13, 0, + 0, -19, 0, -7, 0, -32, 0, 0, + 0, 0, -65, 0, -13, -25, -34, 0, + 0, -45, 0, -5, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -10, -3, + -10, 2, 0, 0, 11, -9, 0, 21, + 33, -7, -7, -20, 8, 33, 11, 15, + -18, 8, 28, 8, 19, 15, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 32, -12, -7, 0, -5, + 54, 29, 54, 0, 0, 0, 7, 0, + 0, 25, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -56, -8, -5, -28, + -33, 0, 0, -45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -56, -8, -5, + -28, -33, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 7, 0, -7, + 5, 12, 7, -20, 0, -1, -5, 7, + 0, 5, 0, 0, 0, 0, -17, 0, + -6, -5, -13, 0, -6, -27, 0, 42, + -7, 0, -15, -5, 0, -5, -11, 0, + -7, -19, -13, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -56, + -8, -5, -28, -33, 0, 0, -45, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -22, -8, -6, 20, -6, -7, + -27, 2, -4, 2, -5, -18, 1, 15, + 1, 5, 2, 5, -16, -27, -8, 0, + -26, -13, -18, -28, -26, 0, -11, -13, + -8, -9, -5, -5, -8, -5, 0, -5, + -2, 10, 0, 10, -5, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -18, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -5, 0, 0, -11, + -7, 7, 0, -11, -13, -5, 0, -19, + -5, -15, -5, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -45, 0, 22, 0, 0, -12, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -3, 0, 0, -5, 0, -15, 0, 0, + 28, -9, -22, -21, 5, 7, 7, -1, + -19, 5, 10, 5, 20, 5, 22, -5, + -18, 0, 0, -27, 0, 0, -20, -18, + 0, 0, -13, 0, -9, -11, 0, -10, + 0, -10, 0, -5, 10, 0, -5, -20, + -7, 25, 0, 0, -6, 0, -13, 0, + 0, 9, -15, 0, 7, -7, 5, 1, + 0, -22, 0, -5, -2, 0, -7, 7, + -5, 0, 0, 0, -28, -8, -15, 0, + -20, 0, 0, -32, 0, 25, -7, 0, + -12, 0, 4, 0, -7, 0, -7, -20, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 0, 15, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -42, -38, 2, + 29, 20, 11, -27, 5, 28, 0, 25, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_42 = { +#else +lv_font_t lv_font_montserrat_42 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 46, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_42*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_44.c b/libraries/lvgl/src/font/lv_font_montserrat_44.c new file mode 100644 index 0000000..0707153 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_44.c @@ -0,0 +1,10916 @@ +/******************************************************************************* + * Size: 44 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 44 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_44.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 1 +#endif + +#if LV_FONT_MONTSERRAT_44 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x8f, 0xff, 0xf6, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf4, 0x7f, 0xff, 0xf4, 0x6f, 0xff, 0xf3, 0x5f, + 0xff, 0xf3, 0x5f, 0xff, 0xf2, 0x4f, 0xff, 0xf1, + 0x4f, 0xff, 0xf1, 0x3f, 0xff, 0xf0, 0x2f, 0xff, + 0xf0, 0x2f, 0xff, 0xf0, 0x1f, 0xff, 0xe0, 0x1f, + 0xff, 0xe0, 0xf, 0xff, 0xd0, 0xf, 0xff, 0xc0, + 0xf, 0xff, 0xc0, 0xe, 0xff, 0xb0, 0xe, 0xff, + 0xa0, 0xd, 0xff, 0xa0, 0xd, 0xff, 0x90, 0x6, + 0x77, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0x30, 0x6f, 0xff, + 0xf3, 0xdf, 0xff, 0xfa, 0xef, 0xff, 0xfa, 0x9f, + 0xff, 0xf5, 0x9, 0xee, 0x70, + + /* U+0022 "\"" */ + 0x3f, 0xff, 0x70, 0x0, 0x4f, 0xff, 0x63, 0xff, + 0xf6, 0x0, 0x3, 0xff, 0xf6, 0x2f, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x52, 0xff, 0xf6, 0x0, 0x3, + 0xff, 0xf5, 0x2f, 0xff, 0x50, 0x0, 0x2f, 0xff, + 0x51, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xf4, 0x1f, + 0xff, 0x40, 0x0, 0x2f, 0xff, 0x41, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x30, 0x0, + 0x1f, 0xff, 0x30, 0xff, 0xf3, 0x0, 0x0, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0x0, 0xf, 0xff, 0x20, + 0xff, 0xf2, 0x0, 0x0, 0xff, 0xf2, 0x1, 0x11, + 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x44, 0x44, 0x47, 0xff, 0xe4, 0x44, + 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x47, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, + 0x44, 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xff, 0xfe, 0xda, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xa3, 0x8, 0xff, 0x50, 0x15, 0x9f, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x70, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe7, 0x28, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x54, 0xaf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, + 0xd6, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x6f, 0xfb, 0x30, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0xc7, 0x20, 0x8, 0xff, 0x50, + 0x28, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xfd, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x3a, 0xdf, 0xec, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc9, 0x9e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x6f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x8f, + 0xfd, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x9a, + 0xef, 0xff, 0x30, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x57, 0x87, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x2f, 0xff, + 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x5, 0xff, 0xf7, 0x10, 0x3b, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0xdf, 0xf4, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, + 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xa9, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xef, 0xe9, 0x30, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfb, 0x52, 0x35, 0xbf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x1, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x67, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x3b, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x83, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xe3, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x4, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x90, 0xbf, 0xff, 0x20, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xeb, 0x9a, 0xbd, 0xff, + 0xff, 0xff, 0x66, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x7, 0xff, 0xff, 0x40, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x15, 0xac, + 0xef, 0xfd, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xff, 0x73, 0xff, 0xf6, 0x2f, 0xff, 0x62, + 0xff, 0xf6, 0x2f, 0xff, 0x51, 0xff, 0xf5, 0x1f, + 0xff, 0x41, 0xff, 0xf4, 0xf, 0xff, 0x30, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0xff, 0xf2, 0x1, 0x11, + 0x0, + + /* U+0028 "(" */ + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x2, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xb0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xe0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xef, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf2, + + /* U+0029 ")" */ + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0xb, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2e, 0x50, 0x0, 0x7f, 0xf1, 0x0, + 0x19, 0xb0, 0xa, 0xff, 0xb2, 0x7, 0xff, 0x10, + 0x6e, 0xff, 0x40, 0xcf, 0xff, 0xf8, 0x8f, 0xf4, + 0xcf, 0xff, 0xf6, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0xff, 0xef, 0xff, 0xe6, 0x0, 0xef, 0xff, + 0xd4, 0x7f, 0xf1, 0x7f, 0xff, 0xf8, 0x8, 0xff, + 0x70, 0x7, 0xff, 0x10, 0x1a, 0xff, 0x20, 0x9, + 0x10, 0x0, 0x7f, 0xf1, 0x0, 0x4, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbb, 0x10, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x50, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x66, 0x10, 0x2e, 0xff, 0xf3, 0xbf, 0xff, + 0xfb, 0xdf, 0xff, 0xfe, 0xbf, 0xff, 0xfc, 0x3f, + 0xff, 0xf9, 0x3, 0xff, 0xf4, 0x5, 0xff, 0xe0, + 0x9, 0xff, 0x90, 0xd, 0xff, 0x40, 0x1f, 0xfe, + 0x0, 0x4f, 0xf9, 0x0, 0x8f, 0xf4, 0x0, + + /* U+002D "-" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x37, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x9f, 0xff, + 0xf9, 0xef, 0xff, 0xfd, 0xdf, 0xff, 0xfd, 0x8f, + 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfa, 0x51, 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x51, + 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x9e, 0xee, 0xee, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x27, 0xad, 0xff, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2f, 0xff, 0xff, 0xfa, 0x52, 0x10, 0x2, 0x6c, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x55, 0x67, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, + 0x3, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xb0, 0xc, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x50, + 0x6f, 0xff, 0xff, 0xd8, 0x42, 0x10, 0x2, 0x5a, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0xcd, 0xef, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x77, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xdc, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf3, 0x4, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc0, + 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, 0x1, 0x38, + 0xef, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, 0xff, 0xda, + 0x72, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x94, 0x0, 0x0, + 0x1, 0x49, 0xe0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, + 0x1, 0x58, 0x9a, 0x97, 0x40, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xa0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xef, 0xff, + 0xfa, 0x41, 0x0, 0x26, 0xdf, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0xaf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0x0, 0xd, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xec, 0xaa, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xcd, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x46, 0x66, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, 0xff, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfe, 0xa8, 0x66, 0x79, 0xdf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xe8, 0x41, 0x0, 0x13, + 0x6c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf5, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xde, 0xff, 0xfd, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xca, 0xab, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x28, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xef, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x1f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, + 0xad, 0xff, 0xfe, 0xb7, 0x20, 0x0, 0x8f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xd7, + 0x20, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xbe, 0xff, 0xfe, 0xb8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 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, 0xa, 0xff, + 0xa0, 0x9f, 0xff, 0xf9, 0xef, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+003B ";" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 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, 0x8, 0xee, + 0x80, 0x7f, 0xff, 0xf7, 0xcf, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xfb, 0x9, 0xff, 0xf6, + 0x3, 0xff, 0xf1, 0x7, 0xff, 0xc0, 0xb, 0xff, + 0x60, 0xe, 0xff, 0x10, 0x2f, 0xfc, 0x0, 0x6f, + 0xf7, 0x0, 0x58, 0x81, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfe, 0x92, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 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, 0x8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, + 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x30, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf7, 0x1, 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x6f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 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, 0x2, 0x9a, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9c, 0xde, 0xff, 0xed, 0xb8, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xea, 0x63, + 0x10, 0x0, 0x1, 0x46, 0xaf, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xb5, 0x10, 0x0, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xff, 0xfc, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xb8, 0x79, 0xbf, 0xff, 0xfb, 0xff, 0xfc, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x81, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xe, 0xff, + 0x40, 0xe, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0x90, 0x3f, 0xff, + 0x10, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, + 0x3, 0xff, 0xd0, 0x6f, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x9f, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xcf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0xcf, 0xf6, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0xdf, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xf5, 0xdf, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0xcf, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x9f, 0xfa, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x3f, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0x60, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x7f, 0xfe, 0x10, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xa7, 0x68, 0xaf, 0xff, 0xfa, 0x7f, 0xff, 0xf9, + 0x7b, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x3a, 0xef, 0xeb, + 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfa, 0x74, 0x21, 0x0, 0x14, + 0x6a, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x9c, 0xef, 0xff, 0xec, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x97, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x21, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xab, 0xdf, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xfe, 0x10, 0x0, 0x6f, 0xff, + 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdf, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x5a, + 0xff, 0xff, 0xf7, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x61, 0x0, + 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x1, 0x25, 0x9e, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0x60, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x95, + 0x20, 0x1, 0x25, 0xae, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xff, 0xeb, 0x84, 0x0, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x26, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x26, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa5, 0x20, 0x0, 0x24, 0x8d, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xb0, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0xa2, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x36, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x1e, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, + 0x20, 0x0, 0x13, 0x7c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9b, 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, + 0x0, 0x0, + + /* U+0048 "H" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, + + /* U+0049 "I" */ + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, + + /* U+004A "J" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x8, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0x92, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0x10, 0x7, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xff, 0xed, 0xa6, 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x5f, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x7e, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf5, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfd, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, + + /* U+004C "L" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xea, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf5, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x6f, 0xff, 0xd9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x7e, + 0xff, 0xf5, 0x6f, 0xff, 0xd1, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xd, 0xff, 0xf5, 0x6f, 0xff, 0xd0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf4, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xb0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x53, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + + /* U+004E "N" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x8f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, + 0xff, 0xeb, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x0, 0x25, 0x9e, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x8c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xce, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xcc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfb, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x86, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, 0x9e, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9b, 0xef, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xf7, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xa0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9e, 0xff, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xed, + 0xcb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xeb, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, + 0x9e, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, + 0x2, 0x7d, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, 0xf6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x4e, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe7, 0x20, 0x14, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x78, 0x75, 0x10, 0x0, + 0x0, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xef, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdc, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xed, + 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xb5, 0x10, + 0x0, 0x0, 0x36, 0xbf, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xf1, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xc8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x7f, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xe9, 0x51, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, + 0xf5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xde, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, 0xa6, + 0x10, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xce, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x58, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x23, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x3, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xe0, 0x0, 0xb, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xfa, 0x52, 0x0, 0x12, 0x6c, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xcd, 0xef, 0xed, 0xb7, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x5c, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, + 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xb0, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x2f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf2, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa2, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xac, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x9e, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0x10, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xa0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x4, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x40, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0xbe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xe9, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+005B "[" */ + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, + 0xff, 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x1, 0x88, 0x88, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x18, 0x88, 0x8a, 0xff, 0xff, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x78, 0x85, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x8f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x3, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, + + /* U+005F "_" */ + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, + + /* U+0060 "`" */ + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xe2, + + /* U+0061 "a" */ + 0x0, 0x0, 0x4, 0x8b, 0xde, 0xfe, 0xda, 0x71, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xcc, 0xdf, 0xff, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xf6, 0x0, 0xb, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xfa, 0x52, 0x11, 0x11, 0x11, + 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x7b, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x74, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf7, 0xc, 0xff, 0xff, 0xe8, 0x65, 0x58, + 0xdf, 0xff, 0xef, 0xff, 0x70, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xf7, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x8f, + 0xff, 0x70, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xb6, + 0x10, 0x8, 0xff, 0xf7, + + /* U+0062 "b" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0x95, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xed, 0xce, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf6, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0xf, 0xff, 0xf0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xed, 0xde, 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0x40, 0x6, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xc2, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x70, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfd, 0x30, 0x0, 0xaf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x28, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xec, + 0x94, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, + 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xec, 0xce, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xde, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfe, 0xba, 0xbe, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0x31, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xe, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xf4, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, 0xfe, 0xda, + 0x51, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xeb, 0x9a, 0xef, 0x30, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x38, 0x88, 0xbf, 0xff, + 0xe8, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, + 0x50, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1b, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdc, 0xef, 0xff, + 0xff, 0xdc, 0xff, 0xf5, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf5, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf5, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf5, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, 0x50, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, + 0xb, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x73, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9d, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0xf, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x10, 0x0, 0x16, 0xef, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, + + /* U+0069 "i" */ + 0x1, 0x66, 0x20, 0x1e, 0xff, 0xf4, 0x9f, 0xff, + 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xff, 0xfa, 0x9, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x20, 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, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x71, 0x0, + 0x1, 0xdf, 0xff, 0xe0, 0x0, 0x3f, 0xfc, 0xab, + 0xff, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa4, + 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x2, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x3e, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xd, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xa0, + + /* U+006C "l" */ + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x30, + + /* U+006D "m" */ + 0xff, 0xff, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xdb, + 0xab, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xfe, + 0xba, 0xbe, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xe0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, + + /* U+006E "n" */ + 0xff, 0xff, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xff, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xeb, + 0xab, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0xf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf1, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0xa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xfb, + 0xff, 0xff, 0xeb, 0x99, 0xae, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfe, 0xf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xec, + 0xce, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xf, 0xff, + 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xff, 0xff, 0x30, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf0, 0x0, 0xcf, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xaf, 0xff, 0xf0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x94, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, + + /* U+0072 "r" */ + 0xff, 0xff, 0x0, 0x0, 0x6a, 0xdf, 0x8f, 0xff, + 0xf0, 0x6, 0xef, 0xff, 0xf8, 0xff, 0xff, 0x9, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x32, + 0x1f, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, 0x84, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff, + 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x4a, + 0xfc, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x6b, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x1f, 0xff, + 0xc6, 0x20, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xf3, + 0x9f, 0xff, 0xff, 0xff, 0xdc, 0xbc, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x48, 0xbd, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x38, 0x88, 0xbf, 0xff, 0xe8, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x20, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0xab, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xfd, 0xa4, 0x0, + + /* U+0075 "u" */ + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0xd6, 0x10, + 0x0, 0x27, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x74, 0xff, 0xfb, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xed, 0xa4, + 0x0, 0x4, 0xff, 0xfb, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x9, + 0xff, 0xf3, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x75, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xdb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x3, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, 0xa, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xd4, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xeb, 0xbe, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8d, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x23, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0x90, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, 0xff, 0xff, + 0xfb, 0x95, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x4, 0x9a, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb9, 0x50, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xf9, + + /* U+007C "|" */ + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, + + /* U+007D "}" */ + 0x2f, 0xff, 0xd9, 0x30, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1, 0x8a, 0xdf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0x98, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x18, + 0xad, 0xff, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, + + /* U+007E "~" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x9b, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0xa, 0xff, 0xf8, 0x58, 0xff, 0xff, 0x90, + 0x0, 0xa, 0xff, 0x90, 0xf, 0xff, 0x40, 0x0, + 0x2d, 0xff, 0xfd, 0x65, 0xbf, 0xff, 0x40, 0x3f, + 0xfc, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x4b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd8, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x24, 0x53, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfc, 0x41, 0x3, 0x9f, 0xfe, 0x10, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x5, 0xff, 0x90, + 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0xc, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0xdf, 0xd0, + 0x1, 0xef, 0xe3, 0x0, 0x0, 0x1b, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xb7, 0x79, 0xef, 0xfa, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x5, 0xef, 0xfd, + 0x30, 0x5, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xfd, 0xc, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xe1, 0x0, 0x3b, 0xfe, 0xa1, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8d, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x30, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xbc, 0xb9, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x23, 0x43, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xff, 0xe9, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xba, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x4d, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xd4, 0xef, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xfd, 0xff, 0xe5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x88, 0x89, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x98, 0x88, 0x9f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdc, 0xcc, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfd, 0xcc, 0xcd, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xdc, 0xcc, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf9, 0x88, 0x89, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xef, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xfd, + 0x4e, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xe4, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 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, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 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, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0xbd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x7, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd0, 0x1d, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf3, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xca, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xa2, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x99, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf9, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x85, 0x21, 0x11, 0x36, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x7a, 0xbc, 0xcc, 0xb9, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 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, 0x58, 0xab, 0xcc, + 0xb9, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x10, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf8, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfb, + 0x20, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x3, 0xcf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0xab, 0xcc, 0xba, 0x73, 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, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x76, 0x10, 0x0, 0x0, + 0x0, 0x4, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, 0xa7, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xf9, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf5, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xe3, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x9f, 0xfc, 0x0, 0x0, + 0x6b, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xbf, 0xfb, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 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, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0xa, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc0, + 0xcf, 0xff, 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 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, 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, 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, + 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, 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, 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, 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, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x77, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9b, + 0xcd, 0xdb, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x75, 0x57, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x43, 0x22, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xcc, 0xcc, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 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, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xee, 0xed, 0x90, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xfd, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, + 0x75, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7a, 0xcd, 0xdc, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, + + /* U+F027 "" */ + 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, 0x3, 0xba, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xb1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xef, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xd2, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0x50, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xc1, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xf9, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x0, + 0x8, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x6f, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0xf, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0xd, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0xe, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xe1, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0xbf, 0xff, 0x90, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb9, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, + 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1f, + 0xff, 0xff, 0xf1, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xc0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x13, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x46, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x94, 0x0, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf9, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x77, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0xf, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x30, 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, + + /* U+F04C "" */ + 0x1, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x50, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x37, 0x89, + 0x99, 0x99, 0x99, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x89, 0x99, 0x99, 0x99, 0x86, 0x0, + 0x0, + + /* U+F04D "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x86, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 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, 0x8f, + 0xff, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, + 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, + 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, + 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, + 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 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, 0x8f, + 0xff, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, + 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, + 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, + 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, + 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, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x21, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x88, 0x85, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x13, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x4, 0xdf, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 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, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xaa, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 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, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xdd, 0xda, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x1, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x7, 0xcd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0xac, 0xef, 0xff, 0xed, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x18, 0x99, 0x72, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x13, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6f, + 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x2, 0x8b, 0xdc, 0xa6, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x46, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xac, 0xef, 0xff, 0xfd, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F070 "" */ + 0x0, 0x45, 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, 0x6, 0xff, 0xc1, 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, + 0x3f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xbd, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x11, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x32, 0x34, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x4, 0xab, 0xa8, 0x30, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x2, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0xef, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x84, 0x22, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfd, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xf6, 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, 0x5, 0x50, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xfd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x99, 0x99, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x41, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x97, + 0x10, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xad, 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x3f, 0xff, 0xff, 0xa0, 0x0, + 0xf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xc3, 0x0, + + /* U+F078 "" */ + 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc3, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 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, 0x1, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x67, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x76, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xfa, 0xcf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf9, 0xe, 0xff, 0xff, 0x91, 0xdf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xf9, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0xe, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x82, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, 0x49, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xe2, 0xe, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd1, 0xef, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xc7, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfe, 0x40, 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, + + /* U+F07B "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x62, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x33, 0x33, 0x33, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0x99, + 0x99, 0x99, 0x98, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0xb7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x14, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x76, 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x2, 0x79, 0x98, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfd, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x90, 0x3, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xe, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x1, + 0xcf, 0xff, 0xff, 0x30, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xac, 0xde, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x79, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, 0x3, 0xef, + 0xff, 0xff, 0x20, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xcf, 0xff, 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xcb, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x75, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xac, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0x44, + 0xef, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x11, 0x39, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x32, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 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, 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, 0x15, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6c, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdb, 0x10, 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, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 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, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x32, 0x0, + + /* U+F0E0 "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xf9, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, + 0xff, 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, + 0x9e, 0xe9, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x75, 0x57, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9b, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xdb, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xe, 0xfd, 0x10, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, + 0xfd, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xe, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x54, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8a, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 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, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x67, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, + 0x88, 0x88, 0xaf, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xa8, 0x88, 0x8f, 0xff, 0xb8, 0x88, 0x8b, 0xff, + 0xf8, 0x88, 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x3f, + 0xfe, 0x10, 0x0, 0x1e, 0xff, 0x30, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x3, + 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, 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, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, + 0xcf, 0xff, 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x3, 0xff, 0xa0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, 0xcf, 0xff, + 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, 0xce, 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, 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, 0xf8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x88, 0x88, + 0xaf, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf8, 0x88, + 0x8a, 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, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F124 "" */ + 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, 0x3, 0x76, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F1EB "" */ + 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, 0x25, 0x79, 0xbc, 0xcc, 0xcc, 0xb9, 0x75, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x64, 0x32, 0x22, 0x34, 0x68, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xc1, + 0x1, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc1, 0x0, 0x1, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, 0x0, 0x1, + 0x48, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc2, 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, 0x10, 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, 0x4c, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xcd, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 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, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 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, + + /* U+F241 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 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, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 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, + + /* U+F242 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 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, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 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, + + /* U+F243 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 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, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 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, + + /* U+F244 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 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, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 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, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x41, 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, 0x6, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x34, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x8c, 0xda, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9c, 0xca, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x43, 0x49, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0xef, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x53, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 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, 0x2f, 0xff, 0x20, 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, + 0xb, 0xff, 0xa0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x20, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0xde, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x26, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x34, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0x60, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, + 0xff, 0xe2, 0x6f, 0xff, 0xff, 0x30, 0x6, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xff, 0xfe, 0x20, 0x6, 0xff, 0xff, 0x30, 0x6, + 0xff, 0x60, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xb, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x30, + 0x6, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, 0xf6, + 0xd, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, + 0x30, 0x5, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, + 0xf9, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5f, 0x30, 0x5, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0x30, 0x5, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x4, 0x30, 0x5, 0x40, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0x30, 0x5, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x5, 0xff, 0x30, 0x5, 0xff, + 0x30, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0xb, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x40, 0x6, + 0xff, 0xe1, 0x0, 0xc, 0xff, 0xff, 0xf7, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x5, 0xff, 0xff, 0x40, + 0x6, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x5, 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, + 0x40, 0x6, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x40, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x89, 0xab, 0xba, 0x97, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 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, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe2, 0x2e, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, + 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, + 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfe, 0x22, 0xef, 0xff, 0xff, 0x41, 0xbf, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x61, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, + 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x3, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x3, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0xcb, 0x97, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xe3, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, 0x0, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0x2e, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x2f, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, + 0xff, 0xff, 0xf1, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x71, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 189, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 189, .box_w = 6, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 93, .adv_w = 275, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 178, .adv_w = 495, .box_w = 29, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 628, .adv_w = 437, .box_w = 25, .box_h = 42, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1153, .adv_w = 593, .box_w = 35, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1696, .adv_w = 483, .box_w = 29, .box_h = 32, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 148, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2193, .adv_w = 237, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2403, .adv_w = 238, .box_w = 10, .box_h = 42, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2613, .adv_w = 282, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 2758, .adv_w = 410, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2968, .adv_w = 160, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3007, .adv_w = 270, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 3033, .adv_w = 160, .box_w = 6, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3054, .adv_w = 248, .box_w = 20, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3484, .adv_w = 470, .box_w = 26, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3887, .adv_w = 260, .box_w = 12, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4073, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4445, .adv_w = 403, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4817, .adv_w = 471, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5251, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5623, .adv_w = 434, .box_w = 24, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5995, .adv_w = 421, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6367, .adv_w = 453, .box_w = 26, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6770, .adv_w = 434, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 160, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7230, .adv_w = 160, .box_w = 6, .box_h = 31, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 7323, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7544, .adv_w = 410, .box_w = 21, .box_h = 14, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7691, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7912, .adv_w = 403, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 728, .box_w = 42, .box_h = 40, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 9109, .adv_w = 515, .box_w = 34, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9636, .adv_w = 533, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10070, .adv_w = 509, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10520, .adv_w = 582, .box_w = 31, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11001, .adv_w = 472, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11358, .adv_w = 447, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11715, .adv_w = 543, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12165, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12599, .adv_w = 218, .box_w = 6, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12692, .adv_w = 361, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13002, .adv_w = 506, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13436, .adv_w = 418, .box_w = 22, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13777, .adv_w = 672, .box_w = 34, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14304, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14738, .adv_w = 591, .box_w = 33, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15250, .adv_w = 508, .box_w = 26, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15653, .adv_w = 591, .box_w = 35, .box_h = 38, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 16318, .adv_w = 512, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16737, .adv_w = 437, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17125, .adv_w = 413, .box_w = 26, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17528, .adv_w = 557, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17947, .adv_w = 501, .box_w = 33, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18459, .adv_w = 793, .box_w = 48, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19203, .adv_w = 474, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19668, .adv_w = 455, .box_w = 30, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20133, .adv_w = 463, .box_w = 27, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20552, .adv_w = 234, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 20762, .adv_w = 248, .box_w = 19, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 21171, .adv_w = 234, .box_w = 11, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 21402, .adv_w = 410, .box_w = 20, .box_h = 19, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 21592, .adv_w = 352, .box_w = 22, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21625, .adv_w = 422, .box_w = 12, .box_h = 6, .ofs_x = 5, .ofs_y = 27}, + {.bitmap_index = 21661, .adv_w = 421, .box_w = 21, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 21913, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 22326, .adv_w = 402, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22602, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23015, .adv_w = 431, .box_w = 25, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23315, .adv_w = 249, .box_w = 18, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23612, .adv_w = 486, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 24041, .adv_w = 479, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24421, .adv_w = 196, .box_w = 6, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 24523, .adv_w = 200, .box_w = 15, .box_h = 43, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 24846, .adv_w = 434, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25242, .adv_w = 196, .box_w = 5, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25325, .adv_w = 744, .box_w = 39, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25793, .adv_w = 479, .box_w = 23, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26069, .adv_w = 447, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26381, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 26794, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 27207, .adv_w = 289, .box_w = 13, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27363, .adv_w = 353, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27603, .adv_w = 291, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27864, .adv_w = 477, .box_w = 23, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28140, .adv_w = 394, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28452, .adv_w = 633, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28932, .adv_w = 389, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29220, .adv_w = 394, .box_w = 26, .box_h = 33, .ofs_x = -1, .ofs_y = -9}, + {.bitmap_index = 29649, .adv_w = 367, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29901, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 30174, .adv_w = 210, .box_w = 5, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 30279, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 30552, .adv_w = 410, .box_w = 22, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 30640, .adv_w = 295, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 17}, + {.bitmap_index = 30760, .adv_w = 221, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 30801, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 31791, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32517, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33375, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34101, .adv_w = 484, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34582, .adv_w = 704, .box_w = 44, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 35550, .adv_w = 704, .box_w = 42, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 36495, .adv_w = 792, .box_w = 50, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37470, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38460, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39285, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40275, .adv_w = 352, .box_w = 22, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40660, .adv_w = 528, .box_w = 33, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41238, .adv_w = 792, .box_w = 50, .box_h = 43, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42313, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43039, .adv_w = 484, .box_w = 31, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 43737, .adv_w = 616, .box_w = 29, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 44332, .adv_w = 616, .box_w = 39, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 45249, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46010, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46771, .adv_w = 616, .box_w = 28, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 47345, .adv_w = 616, .box_w = 41, .box_h = 39, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 48145, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 48613, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 49081, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49842, .adv_w = 616, .box_w = 39, .box_h = 9, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 50018, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50843, .adv_w = 880, .box_w = 56, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52103, .adv_w = 792, .box_w = 52, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53273, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54131, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 54568, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 55005, .adv_w = 880, .box_w = 55, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55968, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 56694, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57684, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58697, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 59458, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60336, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 61097, .adv_w = 616, .box_w = 39, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61780, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62506, .adv_w = 440, .box_w = 29, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63159, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64037, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64915, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 65740, .adv_w = 704, .box_w = 46, .box_h = 46, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 66798, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67541, .adv_w = 880, .box_w = 55, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 68669, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 69467, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 70265, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71063, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71861, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 72659, .adv_w = 880, .box_w = 56, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73639, .adv_w = 616, .box_w = 34, .box_h = 45, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 74404, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75282, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 76295, .adv_w = 880, .box_w = 55, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77203, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 77946, .adv_w = 708, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 32, 0, 19, -15, 0, 0, + 0, 0, -39, -42, 5, 33, 15, 12, + -28, 5, 34, 2, 30, 7, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, -21, 0, 0, 0, 0, + 0, -14, 12, 14, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -14, + 0, 0, 0, 0, -7, 0, 0, -9, + -11, 0, 0, -7, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -19, 0, -85, 0, + 0, -14, 0, 14, 21, 1, 0, -14, + 7, 7, 23, 14, -12, 14, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -19, -8, -34, 0, -28, + -5, 0, 0, 0, 0, 1, 27, 0, + -21, -6, -2, 2, 0, -12, 0, 0, + -5, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -56, -6, 27, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, + 0, 7, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 14, 7, 21, -7, 0, 0, 14, -7, + -23, -96, 5, 19, 14, 1, -9, 0, + 25, 0, 23, 0, 23, 0, -65, 0, + -8, 21, 0, 23, -7, 14, 7, 0, + 0, 2, -7, 0, 0, -12, 56, 0, + 56, 0, 21, 0, 30, 9, 12, 21, + 0, 0, 0, -26, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -9, -14, 5, + 0, -7, 0, 0, 0, -28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -39, 0, -44, 0, 0, 0, + 0, -5, 0, 70, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -68, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 42, 0, 0, -26, 0, + 23, 0, -48, -68, -48, -14, 21, 0, + 0, -47, 0, 8, -16, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 18, 21, -86, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -14, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -14, 0, -6, 0, -16, -14, 0, -18, + -23, -23, -13, 0, -14, 0, -14, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -12, 0, 0, -5, 0, 21, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -11, 0, -21, + -5, -21, 14, 0, 0, -14, 7, 14, + 19, 0, -18, -2, -8, 0, -2, -33, + 7, -5, 5, -37, 7, 0, 0, 2, + -37, 0, -37, -6, -61, -5, 0, -35, + 0, 14, 20, 0, 9, 0, 0, 0, + 0, 1, 0, -13, -9, 0, -21, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, -5, 0, -14, 7, 0, 0, -8, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -13, 0, 21, -5, 2, -23, 0, 0, + 19, -35, -37, -30, -14, 7, 0, -6, + -46, -13, 0, -13, 0, -14, 11, -13, + -45, 0, -19, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -21, -27, 0, -35, + -17, -15, -17, -21, -8, -19, -1, -13, + -19, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -12, -15, + -15, -2, 0, -21, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -35, -21, 0, + 0, 0, -11, -35, 0, 0, -7, 7, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 8, 0, 5, -14, -14, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -21, 0, -7, 0, -11, -7, + 0, -15, -18, -21, -6, 0, -14, 0, + -21, 0, 0, 0, 0, 56, 0, 0, + 4, 0, 0, -9, 0, 7, 0, -30, + 0, 0, 0, 0, 0, -65, -13, 23, + 21, -6, -30, 0, 7, -11, 0, -35, + -4, -9, 7, -49, -7, 9, 0, 11, + -25, -11, -26, -23, -30, 0, 0, -42, + 0, 40, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -19, -23, -1, -65, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -14, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -14, 0, 0, 14, + -2, 9, 0, -15, 7, -5, -2, -18, + -7, 0, -9, -7, -5, 0, -11, -12, + 0, 0, -6, -2, -5, -12, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -14, 0, -12, 0, -12, -12, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 7, 0, -10, 0, -5, -8, + -22, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 6, 28, -2, 0, -19, 0, + -5, 14, 0, -7, -30, -9, 11, 1, + 0, -33, -12, 7, -12, 5, 0, -5, + -6, -23, 0, -11, 4, 0, 0, -12, + 0, 0, 0, 7, 7, -14, -13, 0, + -12, -7, -11, -7, -7, 0, -12, 4, + -13, -12, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -14, 0, 0, 0, -23, 0, + 5, -15, 14, 1, -5, -33, 0, 0, + -15, -7, 0, -28, -18, -20, 0, 0, + -30, -7, -28, -27, -34, 0, -18, 0, + 6, 47, -9, 0, -16, -7, -2, -7, + -12, -19, -13, -26, -29, -16, -7, 0, + 0, -5, 0, 2, 0, 0, -49, -6, + 21, 15, -15, -26, 0, 2, -22, 0, + -35, -5, -7, 14, -65, -9, 2, 0, + 0, -46, -8, -37, -7, -51, 0, 0, + -49, 0, 42, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -27, -5, 0, -46, + 0, 0, 0, 0, -23, 0, -6, 0, + -2, -20, -33, 0, 0, -4, -11, -21, + -7, 0, -5, 0, 0, 0, 0, -32, + -7, -23, -23, -6, -12, -18, -7, -12, + 0, -14, -6, -23, -11, 0, -8, -13, + -7, -13, 0, 4, 0, -5, -23, 0, + 14, 0, -13, 0, 0, 0, 0, 8, + 0, 5, -14, 29, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -21, 0, + -7, 0, -11, -7, 0, -15, -18, -21, + -6, 0, -14, 6, 28, 0, 0, 0, + 0, 56, 0, 0, 4, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -14, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -14, + -7, 0, 0, -14, 0, 12, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 14, 6, -6, 0, -23, + -11, 0, 21, -23, -23, -14, -14, 28, + 13, 7, -61, -5, 14, -7, 0, -7, + 8, -7, -25, 0, -7, 7, -9, -6, + -21, -6, 0, 0, 21, 14, 0, -20, + 0, -39, -9, 20, -9, -27, 2, -9, + -23, -23, -7, 28, 7, 0, -11, 0, + -19, 0, 6, 23, -16, -26, -28, -18, + 21, 0, 2, -51, -6, 7, -12, -5, + -16, 0, -15, -26, -11, -11, -6, 0, + 0, -16, -15, -7, 0, 21, 16, -7, + -39, 0, -39, -10, 0, -25, -41, -2, + -23, -12, -23, -20, 19, 0, 0, -9, + 0, -14, -6, 0, -7, -13, 0, 12, + -23, 7, 0, 0, -37, 0, -7, -15, + -12, -5, -21, -18, -23, -16, 0, -21, + -7, -16, -13, -21, -7, 0, 0, 2, + 33, -12, 0, -21, -7, 0, -7, -14, + -16, -19, -20, -27, -9, -14, 14, 0, + -11, 0, -35, -8, 4, 14, -23, -26, + -14, -23, 23, -7, 4, -65, -13, 14, + -15, -12, -26, 0, -21, -30, -8, -7, + -6, -7, -15, -21, -2, 0, 0, 21, + 20, -5, -46, 0, -42, -16, 17, -27, + -48, -14, -25, -30, -35, -23, 14, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 14, 5, -13, 14, 0, 0, -22, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 21, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 27, 0, 13, 2, 2, -9, + 0, 14, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -42, 0, -7, 12, 0, 21, + 0, 0, 70, 8, -14, -14, 7, 7, + -5, 2, -35, 0, 0, 34, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -48, 27, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -19, 0, + 0, 2, 0, 0, 7, 91, -14, -6, + 23, 19, -19, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -92, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -20, + 0, 0, 0, -19, 0, 0, 0, 0, + -15, -4, 0, 0, 0, -15, 0, -8, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -47, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -11, 0, + -19, 0, 0, 0, -12, 7, -8, 0, + 0, -19, -7, -16, 0, 0, -19, 0, + -7, 0, -33, 0, -8, 0, 0, -57, + -13, -28, -8, -25, 0, 0, -47, 0, + -19, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -12, 0, 0, + 0, 0, -15, 0, -15, 9, -8, 14, + 0, -5, -16, -5, -12, -13, 0, -8, + -4, -5, 5, -19, -2, 0, 0, 0, + -62, -6, -10, 0, -15, 0, -5, -33, + -6, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -12, -5, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -14, + 7, 0, 0, 0, -19, -7, -14, 0, + 0, -20, 0, -7, 0, -33, 0, 0, + 0, 0, -68, 0, -14, -26, -35, 0, + 0, -47, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 12, -9, 0, 22, + 34, -7, -7, -21, 8, 34, 12, 15, + -19, 8, 30, 8, 20, 15, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 33, -13, -7, 0, -6, + 56, 30, 56, 0, 0, 0, 7, 0, + 0, 26, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -59, -8, -6, -29, + -34, 0, 0, -47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -59, -8, -6, + -29, -34, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -16, 7, 0, -7, + 6, 13, 7, -21, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -6, -5, -14, 0, -6, -28, 0, 44, + -7, 0, -15, -5, 0, -5, -12, 0, + -7, -20, -14, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -59, + -8, -6, -29, -34, 0, 0, -47, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -23, -8, -6, 21, -6, -7, + -28, 2, -4, 2, -5, -19, 1, 15, + 1, 6, 2, 6, -17, -28, -8, 0, + -27, -13, -19, -30, -27, 0, -11, -14, + -8, -9, -6, -5, -8, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -19, 0, -4, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -6, 0, 0, -12, + -7, 7, 0, -12, -13, -5, 0, -20, + -5, -15, -5, -8, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -47, 0, 23, 0, 0, -13, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -16, 0, 0, + 30, -9, -23, -22, 5, 8, 8, -1, + -20, 5, 11, 5, 21, 5, 23, -5, + -19, 0, 0, -28, 0, 0, -21, -19, + 0, 0, -14, 0, -9, -12, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -21, + -7, 26, 0, 0, -6, 0, -14, 0, + 0, 9, -16, 0, 7, -7, 6, 1, + 0, -23, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -29, -8, -15, 0, + -21, 0, 0, -33, 0, 26, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -21, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -44, 0, 15, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 14, 0, 16, + 0, 0, 0, 0, 0, -44, -40, 2, + 30, 21, 12, -28, 5, 30, 0, 26, + 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_44 = { +#else +lv_font_t lv_font_montserrat_44 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 49, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_44*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_46.c b/libraries/lvgl/src/font/lv_font_montserrat_46.c new file mode 100644 index 0000000..48fa687 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_46.c @@ -0,0 +1,11868 @@ +/******************************************************************************* + * Size: 46 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 46 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_46.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 1 +#endif + +#if LV_FONT_MONTSERRAT_46 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xb0, 0x5f, + 0xff, 0xfa, 0x4, 0xff, 0xff, 0xa0, 0x3f, 0xff, + 0xf9, 0x3, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf8, + 0x2, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0xff, + 0xff, 0x50, 0xf, 0xff, 0xf4, 0x0, 0xef, 0xff, + 0x40, 0xd, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x20, + 0xc, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0x10, 0xb, + 0xff, 0xf0, 0x0, 0xbf, 0xff, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x9f, 0xff, 0x0, 0x3, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xea, 0x10, 0x5f, 0xff, 0xfb, 0xb, 0xff, 0xff, + 0xf1, 0xbf, 0xff, 0xff, 0x16, 0xff, 0xff, 0xb0, + 0x7, 0xde, 0xa1, 0x0, + + /* U+0022 "\"" */ + 0x1f, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf1, 0x1f, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xf0, 0xf, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, + 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, 0xff, + 0xe0, 0xf, 0xff, 0x90, 0x0, 0x9, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, 0xff, + 0x70, 0x0, 0x8, 0xff, 0xd0, 0xd, 0xff, 0x70, + 0x0, 0x8, 0xff, 0xc0, 0x8, 0xaa, 0x40, 0x0, + 0x5, 0xaa, 0x70, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x16, 0x66, 0x66, 0x6e, 0xff, + 0xa6, 0x66, 0x66, 0x66, 0x6f, 0xff, 0x96, 0x66, + 0x66, 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x56, 0x66, 0x66, 0xaf, + 0xfe, 0x66, 0x66, 0x66, 0x66, 0xbf, 0xfd, 0x66, + 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xec, 0x95, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xf9, 0x41, + 0xff, 0xf1, 0x25, 0x8d, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x20, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x4c, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x60, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfe, 0x83, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x9f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x6e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0xed, 0x20, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x6, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x7, 0xff, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, + 0xff, 0xf0, 0x26, 0xcf, 0xff, 0xff, 0x40, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xef, 0xff, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfb, 0xbd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa1, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x51, 0x3, + 0xbf, 0xff, 0x20, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x5a, 0xef, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x6f, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x27, 0x9a, 0x84, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0xcf, 0xff, + 0xdb, 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x8f, 0xfe, 0x30, 0x0, 0x2d, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x2, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0xbc, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xb6, + 0x0, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfa, 0x64, 0x58, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x4e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf7, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x95, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x37, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x30, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8, 0xff, 0xd2, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xd0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0x20, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x5, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0x53, + 0xff, 0xff, 0xf3, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xfd, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xff, 0xc1, 0xff, 0xfb, 0xf, 0xff, 0xb0, + 0xff, 0xfa, 0xf, 0xff, 0xa0, 0xff, 0xf9, 0xf, + 0xff, 0x90, 0xff, 0xf9, 0xe, 0xff, 0x80, 0xef, + 0xf8, 0xe, 0xff, 0x70, 0xdf, 0xf7, 0x8, 0xaa, + 0x40, + + /* U+0028 "(" */ + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x8, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, + + /* U+0029 ")" */ + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x1a, 0x50, 0x8, 0xff, 0xb2, 0x2, + 0xff, 0x80, 0x7, 0xff, 0xe0, 0xd, 0xff, 0xff, + 0x72, 0xff, 0x84, 0xdf, 0xff, 0xf4, 0x0, 0x8f, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfb, 0x30, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x8, 0xff, 0xff, 0xd6, 0xff, + 0xaa, 0xff, 0xff, 0xc2, 0xb, 0xff, 0xf7, 0x2, + 0xff, 0x80, 0x3d, 0xff, 0xf2, 0x3, 0xfa, 0x10, + 0x2, 0xff, 0x80, 0x0, 0x7f, 0x90, 0x0, 0x20, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x66, 0x30, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xab, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, + 0xff, 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, + 0x0, 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, + 0x7f, 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, + 0xf2, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, + 0x0, + + /* U+002D "-" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, + + /* U+002E "." */ + 0x0, 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, + 0xff, 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x47, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfa, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfb, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x29, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x6c, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x7c, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x24, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb6, + 0x32, 0x47, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xed, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0x11, 0x11, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xa6, 0x43, + 0x24, 0x6b, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, + + /* U+0033 "3" */ + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x7a, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x10, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x20, 0x7f, 0xff, + 0xff, 0xfd, 0x96, 0x43, 0x23, 0x6a, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x3, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x25, 0x8d, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xb7, 0x53, 0x23, 0x47, 0xdf, 0xff, + 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfa, 0x62, 0x10, 0x12, 0x48, 0xef, 0x20, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, + 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xcf, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf9, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0xaf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xd0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xec, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xaf, 0xff, 0xd1, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1b, 0xff, 0xff, 0x1a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, 0xec, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf4, + 0x0, 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x20, 0xb, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd7, 0x31, 0x0, + 0x14, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfe, 0xb9, 0x99, 0xad, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfd, 0x10, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf1, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x1f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0xfe, + 0x72, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0xcd, + 0xef, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xa7, 0x30, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xfe, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x27, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe0, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, 0xa4, + 0x10, 0x2, 0x5a, 0xff, 0xff, 0xef, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, + 0xff, 0xf1, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0x8a, 0xcc, 0xb9, 0x72, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x63, + 0x10, 0x12, 0x48, 0xdf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 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, + 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, 0xff, + 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, 0x0, + + /* U+003B ";" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 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, 0x6e, 0xfb, 0x10, 0x5f, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, 0x7f, + 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, 0xf2, + 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x80, + + /* U+003D "=" */ + 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 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, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+003E ">" */ + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, 0xfe, 0xdb, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1e, 0xff, 0xff, 0xfd, 0x73, 0x10, 0x1, 0x49, + 0xff, 0xff, 0xff, 0x40, 0x3e, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb0, + 0x1, 0xbf, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x77, 0x70, + 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, 0x1a, 0xed, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xed, 0x60, + 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xcd, 0xef, 0xfe, 0xdb, 0x96, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb8, 0x53, 0x21, 0x12, 0x36, 0x8c, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, + 0xff, 0xdb, 0x61, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xa, 0xff, 0xf5, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1a, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xb9, 0xad, 0xff, 0xff, 0xdb, 0xff, + 0xf5, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x9, 0xff, + 0xe0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0xe, 0xff, 0x90, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0xaf, 0xfb, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xbf, 0xfa, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0xcf, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0xcf, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0xbf, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0xaf, 0xfb, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xff, + 0x10, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, + 0xff, 0x80, 0xd, 0xff, 0xa0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x19, 0xff, 0xfe, 0xff, + 0xfe, 0x10, 0x1, 0xdf, 0xfc, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0xa9, 0x9c, 0xff, 0xff, 0xc2, 0xff, 0xff, 0xea, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xfe, 0x10, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xeb, 0x71, 0x0, 0x0, 0x0, + 0x7c, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xc8, 0x53, 0x32, 0x23, + 0x57, 0xae, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x8e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf1, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, + + /* U+0042 "B" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xff, 0xff, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, 0xbf, + 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0x60, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x62, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x22, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7e, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xec, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfe, + 0x20, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb2, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x46, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x36, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, + + /* U+0046 "F" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x35, 0x7b, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0x50, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb6, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x7, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x34, 0x7a, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + + /* U+0049 "I" */ + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, + + /* U+004A "J" */ + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x18, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x0, 0x2, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x1, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xd7, 0x31, 0x3, 0x8f, 0xff, 0xff, 0xb0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xc, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x1d, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe1, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, + + /* U+004C "L" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, + + /* U+004D "M" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xaf, 0xff, 0xf0, 0x2f, 0xff, 0xf4, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfb, 0x5f, 0xff, 0xf0, 0x2f, 0xff, + 0xf4, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x10, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf1, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, + + /* U+004E "N" */ + 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xfd, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x7b, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x1, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xb0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x41, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xfe, 0x3f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfb, 0x74, 0x32, 0x35, + 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x4b, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x6b, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x48, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x3, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xfb, 0x74, 0x32, 0x35, 0x8c, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, 0x7b, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xb2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf2, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xd9, 0x61, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x71, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfb, 0x74, + 0x32, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x60, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x8f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe9, 0x52, + 0x10, 0x13, 0x6a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xff, 0xff, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x1, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xe8, 0x30, 0x3, 0x8e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xa8, 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, + 0x7b, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xf3, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfa, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xfe, + 0xda, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xfa, 0x52, 0x0, 0x1, 0x36, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0xee, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x7, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, 0xfe, + 0x96, 0x30, 0x0, 0x1, 0x48, 0xef, 0xff, 0xff, + 0x40, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1c, 0xff, 0xfc, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x4f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf6, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x3, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb7, 0x43, 0x24, + 0x6a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xfe, + 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0xb, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0x1, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xac, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x57, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x0, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x80, 0xa, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0xf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf9, 0x7f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x1e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x50, 0x3, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf8, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf8, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+005B "[" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x72, 0xff, 0xff, 0xcb, 0xbb, 0xb4, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xbb, + 0xbb, 0x42, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005C "\\" */ + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x71, 0xbb, 0xbb, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x1b, 0xbb, 0xbb, 0xff, + 0xff, 0x72, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x48, 0x88, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0xa, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x10, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x50, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x5, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xfe, 0x94, + 0x10, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x33, 0x33, 0x33, 0x3e, 0xff, + 0xf7, 0x0, 0x0, 0x4a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xb5, 0x20, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf8, 0xa, + 0xff, 0xff, 0xfd, 0x97, 0x79, 0xcf, 0xff, 0xfe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x94, 0x0, + 0xb, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf4, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x10, 0xdf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0x61, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x10, 0x2, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x0, 0x1e, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x83, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xec, 0x83, 0x0, 0x0, 0xff, 0xff, + 0x30, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe0, 0xe, 0xff, 0xf8, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x4f, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x94, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xbe, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfe, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3b, 0xbb, 0xbf, + 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0x20, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xaf, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0x0, 0x9, + 0xff, 0xff, 0xfe, 0x73, 0x0, 0x1, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, + 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0x41, 0x0, + 0x26, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xce, 0xed, 0xb7, 0x30, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x1c, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x9, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x84, 0x10, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x8b, 0xde, 0xff, 0xed, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbd, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+0069 "i" */ + 0x0, 0x57, 0x40, 0x0, 0xcf, 0xff, 0x90, 0x6f, + 0xff, 0xff, 0x38, 0xff, 0xff, 0xf5, 0x5f, 0xff, + 0xff, 0x20, 0xaf, 0xff, 0x60, 0x0, 0x24, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, + 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x20, 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, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0xa3, 0x0, 0x2, + 0xdf, 0xff, 0xf3, 0x0, 0x6f, 0xfe, 0xcd, 0xff, + 0xff, 0xfb, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa5, 0x0, + 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x6f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x20, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, + + /* U+006C "l" */ + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x90, + + /* U+006D "m" */ + 0xdf, 0xff, 0x60, 0x0, 0x38, 0xce, 0xff, 0xeb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xfe, + 0xda, 0x60, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0xdf, 0xff, 0x64, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x20, + 0x12, 0x7e, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc6, + 0x20, 0x12, 0x7e, 0xff, 0xff, 0xf4, 0xd, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0xdf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8d, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xad, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, + + /* U+006E "n" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0xaf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xad, 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x62, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf9, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0x91, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, + 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xec, 0x83, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xf4, 0xdf, + 0xff, 0x60, 0x1a, 0xff, 0xff, 0xf4, 0xdf, 0xff, + 0x63, 0xef, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0x8e, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x75, 0x41, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, + 0xff, 0x40, 0x7, 0xff, 0xff, 0xd6, 0x10, 0x0, + 0x1, 0x49, 0xef, 0xb0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc9, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x7a, 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x8f, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x1f, 0xff, 0xfb, 0x63, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xff, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x70, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x36, 0xac, + 0xef, 0xfe, 0xdb, 0x82, 0x0, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x18, 0x88, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3b, 0xbb, 0xbf, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa1, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x20, + + /* U+0075 "u" */ + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0xb, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x7, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0xff, 0xc6, 0x20, 0x2, 0x6c, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x54, 0xff, 0xfe, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfc, 0x93, + 0x0, 0x4, 0xff, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xae, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfc, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x2c, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x1, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xb0, 0x9f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfd, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xd0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x6d, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0xc, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, + 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x1e, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x50, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x50, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x11, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x77, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x32, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x81, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xed, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfc, 0xb2, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x4b, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xb2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xf4, + + /* U+007C "|" */ + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + + /* U+007D "}" */ + 0x2f, 0xff, 0xda, 0x40, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1b, 0xce, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xb5, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x1b, 0xce, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xbb, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x4f, 0xfd, 0x0, 0x8f, 0xff, 0xc7, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xa0, 0xd, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xc8, 0x8e, 0xff, + 0xf4, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x3, 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x1, 0xef, 0xfe, 0x97, 0x9d, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xfe, 0x10, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xfe, 0x10, + 0x1, 0xef, 0xfe, 0xa8, 0x9e, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x27, 0x85, 0x0, 0x0, 0x7f, 0xff, 0xfc, + 0x10, 0x5f, 0xff, 0xff, 0xfb, 0xc, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, + 0xff, 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xfe, 0x1, + 0xef, 0xff, 0xff, 0x50, 0x1, 0x9e, 0xfc, 0x40, + 0x0, + + /* U+F001 "" */ + 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, 0x3, 0x8c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x10, 0xe, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x55, 0x42, 0xef, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x4, 0x79, 0x99, 0x6c, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xea, 0x50, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcd, 0xcb, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x5, 0x60, 0x0, 0x0, 0x18, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x84, 0x0, 0x0, 0x6, 0x50, 0x9f, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xf9, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfc, 0xaa, + 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x44, 0x44, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x44, 0x44, 0x5f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf8, 0x66, 0x66, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x66, + 0x66, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x88, 0x88, 0xcf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x88, 0x88, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x22, 0x22, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x22, 0x22, 0x3f, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xfd, 0x3d, 0xd0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xd3, + + /* U+F00B "" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x76, 0x10, 0x0, + 0x3, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 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, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5, 0x78, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x3, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x50, 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, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x4, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9d, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbd, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0x70, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, + 0x0, 0x3, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1, 0x9b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf4, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x30, + 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xc4, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xbb, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x53, 0x22, 0x46, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xff, 0xdb, 0x84, 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, + + /* U+F013 "" */ + 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, 0x1, 0x46, + 0x78, 0x87, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xa3, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xa2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3c, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x31, 0x14, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf9, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, + 0xff, 0xff, 0xdb, 0x81, 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, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x44, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xe5, 0x7f, 0xff, 0xff, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x5f, 0xd2, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xc1, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x4e, 0xff, 0xff, 0xe1, 0x7, 0xff, + 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x2, 0xdf, 0xff, 0x30, + 0x0, 0x9f, 0x80, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x77, 0x77, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 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, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x36, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x22, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xf6, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x9f, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x88, 0x75, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x21, 0x0, 0x3, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x54, 0x43, 0x21, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 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, 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, 0x13, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x43, 0x10, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xcd, 0xef, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb8, 0x77, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xad, 0xee, 0xec, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 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, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xec, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfe, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xaf, 0xff, 0xd2, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2, 0xcf, 0xa0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xab, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x93, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x36, 0x10, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, + 0x60, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x1, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xa, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0xc, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfc, 0x10, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbe, 0x80, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x7a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xef, 0xff, 0xff, 0xb8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x94, 0x20, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbb, + 0xba, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x3, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x52, 0x0, 0x2f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf2, + 0x1e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xb8, 0x10, 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, + + /* U+F04C "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F04D "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 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, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F051 "" */ + 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x40, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x1f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, + 0x2, 0xbf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x5, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x60, 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, 0x27, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x7, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x56, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xde, 0xed, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x2, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xdf, 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x35, 0x67, 0x66, 0x53, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x51, 0x0, 0x0, + 0x26, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x2, 0xbd, 0xdb, + 0x71, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x3, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x35, 0x53, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x65, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xff, 0xff, 0xdc, 0x97, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x2, 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, 0x2, 0xef, 0x90, + 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, 0xd, 0xff, 0xfc, 0x10, 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, 0xaf, + 0xff, 0xff, 0xe4, 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, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x66, 0x64, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x3b, 0xdc, 0xa6, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xf, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xf5, 0xc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x9c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x55, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb8, 0x51, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 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, 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf7, 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, 0x2d, 0xff, 0xff, + 0xd0, 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, 0xaf, 0xff, 0x20, 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, + 0x6, 0xb3, 0x0, + + /* U+F071 "" */ + 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, 0x5d, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x8, 0xce, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xdb, 0x60, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x25, 0x55, 0x55, 0x55, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x55, 0xaf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xc8, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8f, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x11, 0x11, + 0x11, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x11, 0x8f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdb, 0x10, 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, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x3, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x60, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xe3, 0x0, + 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfe, 0x30, 0xb, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe2, + 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 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, 0x8, 0xff, 0xfd, 0x10, 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, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xad, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x2f, 0xff, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x70, + 0x2f, 0xff, 0xff, 0x90, 0x2e, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x2, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x16, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x4e, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xf1, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf9, + 0xa, 0xff, 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x7a, 0xff, 0xff, + 0xf3, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 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, 0x6, 0xff, 0xff, 0xc0, 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, + 0x6f, 0xfb, 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, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x16, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xa5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F093 "" */ + 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, 0x6, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x33, 0x33, 0x33, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x21, 0x11, 0x11, 0x11, + 0x12, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 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, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9b, 0xba, 0x98, 0x64, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x57, 0x98, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xe8, 0x10, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x9f, 0xff, 0xff, 0xf7, 0x35, + 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x20, 0x0, 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfd, 0x20, 0x1a, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x79, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x73, 0x5e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xaf, 0xff, 0xff, 0xd2, 0x1, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x56, 0x52, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xdc, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 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, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x46, 0x66, 0x66, 0x64, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x59, 0x99, 0x99, 0x99, 0x90, 0x8f, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x27, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x97, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x32, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x10, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x27, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 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, + 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, 0x27, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x74, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 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, 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, 0x1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x2, 0xd6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2d, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5, 0xaa, 0x50, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xab, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xad, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x8d, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x5a, + 0xaa, 0xaa, 0xaa, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x42, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0x55, 0x55, 0x55, 0x55, + 0x52, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xdf, 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 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, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8b, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x82, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 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, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1e, 0xff, 0x60, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x2e, 0xff, + 0x50, 0x0, 0x4, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x1d, 0xff, 0x60, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x1e, 0xff, 0x40, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xfe, 0xee, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0x27, + 0xff, 0xf3, 0x22, 0x23, 0xff, 0xf7, 0x22, 0x22, + 0x5f, 0xff, 0x52, 0x22, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xcb, 0xbb, 0xcf, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xcf, 0xff, 0xeb, 0xbb, 0xbd, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcf, + 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xec, 0xcc, + 0xce, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9b, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, + 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, + 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, + 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, + 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, + 0xff, 0xff, 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, 0x8f, 0xff, 0xff, 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, 0x8f, 0xff, 0xff, + 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, + 0x8f, 0xff, 0xff, 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, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x18, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, 0x0, + + /* U+F1EB "" */ + 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, + 0x1, 0x34, 0x56, 0x66, 0x65, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xb7, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x2, 0x47, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xb, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xcf, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb9, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, + 0x53, 0x33, 0x46, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 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, 0x27, 0x98, 0x50, 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, 0x9, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x70, 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, 0x6b, 0xdc, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 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, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, + + /* U+F241 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 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, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, + + /* U+F242 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 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, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, + + /* U+F243 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 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, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, + + /* U+F244 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 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, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 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, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 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, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xad, 0xb6, 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, 0x9f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xaa, 0xae, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x99, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3, 0x9b, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, + 0xff, 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, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x55, + 0x55, 0x55, 0xaf, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 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, 0xff, 0xf7, 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, 0x8f, + 0xfe, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x45, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x99, 0x99, 0x99, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xc9, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0xd5, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xf5, 0x8, 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x50, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x6, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0xcf, 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xf0, 0x0, 0xcf, 0xfc, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0xcf, 0xc0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x7, 0xf0, 0x0, 0xcc, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x70, 0x0, + 0x80, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x30, 0x0, 0x40, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x3, 0xe0, 0x0, 0xc7, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x3e, 0xf1, 0x0, 0xcf, 0x60, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0xcf, 0xf9, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x90, 0x4, 0xff, 0xff, 0xff, 0xd1, 0x3, + 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xa0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xf1, 0x0, 0xda, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x8a, 0xcd, 0xdd, 0xcb, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x76, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x50, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 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, 0x1c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x7f, + 0xff, 0xff, 0xe3, 0x1c, 0xff, 0xff, 0xfb, 0x14, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, + 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, + 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x70, 0x7f, 0xff, 0xff, 0xe3, 0x1c, 0xff, + 0xff, 0xfb, 0x14, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xab, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x71, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xa8, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xe3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x53, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xeb, 0x40, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xff, 0xff, 0xbb, 0xbb, + 0xff, 0xfb, 0xbb, 0xbc, 0xff, 0xeb, 0xbb, 0xbf, + 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, 0xf1, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, + 0x1, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xa0, 0x3, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x3f, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xfa, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, + 0xa4, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xc, + 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, 0x1, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x1f, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0x8a, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x61, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xd8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 198, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 197, .box_w = 7, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 116, .adv_w = 288, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 207, .adv_w = 517, .box_w = 31, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 719, .adv_w = 457, .box_w = 26, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1304, .adv_w = 620, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1915, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2408, .adv_w = 155, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 2441, .adv_w = 248, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2683, .adv_w = 249, .box_w = 11, .box_h = 44, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2925, .adv_w = 294, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3087, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3308, .adv_w = 167, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3357, .adv_w = 282, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3383, .adv_w = 167, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3408, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 3848, .adv_w = 491, .box_w = 27, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4294, .adv_w = 272, .box_w = 13, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4922, .adv_w = 421, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 492, .box_w = 30, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5830, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6243, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6672, .adv_w = 440, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7085, .adv_w = 474, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7514, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7943, .adv_w = 167, .box_w = 7, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8031, .adv_w = 167, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8143, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8364, .adv_w = 428, .box_w = 21, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 8522, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8743, .adv_w = 422, .box_w = 24, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9139, .adv_w = 761, .box_w = 44, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10063, .adv_w = 539, .box_w = 35, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10641, .adv_w = 557, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11120, .adv_w = 532, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11615, .adv_w = 608, .box_w = 32, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12143, .adv_w = 493, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12556, .adv_w = 467, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12952, .adv_w = 568, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13447, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13926, .adv_w = 228, .box_w = 6, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14025, .adv_w = 378, .box_w = 21, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14372, .adv_w = 529, .box_w = 30, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14867, .adv_w = 437, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15247, .adv_w = 703, .box_w = 36, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15841, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16320, .adv_w = 618, .box_w = 35, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16898, .adv_w = 531, .box_w = 27, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17344, .adv_w = 618, .box_w = 36, .box_h = 40, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 18064, .adv_w = 535, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 18526, .adv_w = 457, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18955, .adv_w = 432, .box_w = 27, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19401, .adv_w = 582, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 19863, .adv_w = 524, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20424, .adv_w = 829, .box_w = 50, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21249, .adv_w = 495, .box_w = 31, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21761, .adv_w = 476, .box_w = 31, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22273, .adv_w = 484, .box_w = 28, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22735, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 22977, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 23417, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 23659, .adv_w = 429, .box_w = 21, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 23869, .adv_w = 368, .box_w = 23, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23904, .adv_w = 442, .box_w = 13, .box_h = 6, .ofs_x = 5, .ofs_y = 28}, + {.bitmap_index = 23943, .adv_w = 440, .box_w = 22, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24218, .adv_w = 502, .box_w = 26, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24673, .adv_w = 420, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24973, .adv_w = 502, .box_w = 27, .box_h = 35, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25446, .adv_w = 450, .box_w = 26, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25771, .adv_w = 260, .box_w = 18, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 508, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 26545, .adv_w = 501, .box_w = 24, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26965, .adv_w = 205, .box_w = 7, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 27091, .adv_w = 209, .box_w = 15, .box_h = 45, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 27429, .adv_w = 453, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27867, .adv_w = 205, .box_w = 5, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27955, .adv_w = 778, .box_w = 41, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28468, .adv_w = 501, .box_w = 24, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28768, .adv_w = 467, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29106, .adv_w = 502, .box_w = 26, .box_h = 34, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 29548, .adv_w = 502, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 30007, .adv_w = 302, .box_w = 14, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 369, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 30445, .adv_w = 305, .box_w = 18, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30724, .adv_w = 498, .box_w = 24, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 31024, .adv_w = 411, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31362, .adv_w = 662, .box_w = 42, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31887, .adv_w = 406, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32200, .adv_w = 411, .box_w = 28, .box_h = 34, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 32676, .adv_w = 383, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32951, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 33259, .adv_w = 220, .box_w = 5, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 33369, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 33677, .adv_w = 428, .box_w = 23, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 33769, .adv_w = 308, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 33889, .adv_w = 231, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 33930, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 35035, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35840, .adv_w = 736, .box_w = 46, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36783, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37588, .adv_w = 506, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 38116, .adv_w = 736, .box_w = 45, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 39174, .adv_w = 736, .box_w = 44, .box_h = 47, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 40208, .adv_w = 828, .box_w = 52, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41274, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 42355, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43265, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 44346, .adv_w = 368, .box_w = 23, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44760, .adv_w = 552, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45390, .adv_w = 828, .box_w = 52, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 46534, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47339, .adv_w = 506, .box_w = 32, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 48091, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 48721, .adv_w = 644, .box_w = 41, .box_h = 48, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 49705, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 50546, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51387, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 52017, .adv_w = 644, .box_w = 42, .box_h = 41, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 52878, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53378, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53878, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54719, .adv_w = 644, .box_w = 41, .box_h = 10, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 54924, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 55834, .adv_w = 920, .box_w = 58, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57197, .adv_w = 828, .box_w = 54, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58466, .adv_w = 736, .box_w = 46, .box_h = 42, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 59432, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 59932, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 60432, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61476, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62281, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 63362, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 64467, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65308, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 66272, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 67113, .adv_w = 644, .box_w = 41, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67851, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 68656, .adv_w = 460, .box_w = 31, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69385, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70349, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71313, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 72223, .adv_w = 736, .box_w = 48, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 73351, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 74174, .adv_w = 920, .box_w = 58, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 75392, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 76262, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 77132, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78002, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78872, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 79742, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80786, .adv_w = 644, .box_w = 36, .box_h = 47, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 81632, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 82596, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 83701, .adv_w = 920, .box_w = 58, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 84716, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 85539, .adv_w = 740, .box_w = 47, .box_h = 30, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 33, 0, 20, -16, 0, 0, + 0, 0, -40, -44, 5, 35, 16, 13, + -29, 5, 36, 2, 31, 7, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -22, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -15, + 0, 0, 0, 0, -7, 0, 0, -10, + -11, 0, 0, -7, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -20, 0, -89, 0, + 0, -15, 0, 15, 22, 1, 0, -15, + 7, 7, 24, 15, -13, 15, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -20, -9, -36, 0, -29, + -5, 0, 0, 0, 0, 1, 29, 0, + -22, -6, -2, 2, 0, -13, 0, 0, + -5, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -59, -6, 28, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, + 0, 7, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 7, 22, -7, 0, 0, 15, -7, + -24, -101, 5, 20, 15, 1, -10, 0, + 26, 0, 24, 0, 24, 0, -68, 0, + -9, 22, 0, 24, -7, 15, 7, 0, + 0, 2, -7, 0, 0, -13, 59, 0, + 59, 0, 22, 0, 31, 10, 13, 22, + 0, 0, 0, -27, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -10, -15, 5, + 0, -7, 0, 0, 0, -29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -40, 0, -46, 0, 0, 0, + 0, -5, 0, 73, -9, -10, 7, 7, + -7, 0, -10, 7, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 44, 0, 0, -27, 0, + 24, 0, -50, -71, -50, -15, 22, 0, + 0, -49, 0, 9, -17, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 22, -90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -17, -15, 0, -18, + -24, -24, -14, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -14, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 22, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -10, 0, -11, 0, -22, + -5, -22, 15, 0, 0, -15, 7, 15, + 20, 0, -18, -2, -9, 0, -2, -35, + 7, -5, 5, -39, 7, 0, 0, 2, + -38, 0, -39, -6, -64, -5, 0, -37, + 0, 15, 21, 0, 10, 0, 0, 0, + 0, 1, 0, -13, -10, 0, -22, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -9, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 7, 0, 0, -9, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -14, 0, 22, -5, 2, -24, 0, 0, + 20, -37, -38, -31, -15, 7, 0, -6, + -48, -13, 0, -13, 0, -15, 11, -13, + -47, 0, -20, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -22, -28, 0, -37, + -18, -15, -18, -22, -9, -20, -1, -14, + -20, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -13, -16, + -16, -2, 0, -22, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -14, 0, 0, 0, 0, -37, -22, 0, + 0, 0, -11, -37, 0, 0, -7, 7, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -7, -7, -9, 0, 0, 0, 0, + 0, 0, -22, 0, -7, 0, -11, -7, + 0, -16, -18, -22, -6, 0, -15, 0, + -22, 0, 0, 0, 0, 59, 0, 0, + 4, 0, 0, -10, 0, 7, 0, -32, + 0, 0, 0, 0, 0, -68, -13, 24, + 22, -6, -31, 0, 7, -11, 0, -37, + -4, -10, 7, -52, -7, 10, 0, 11, + -26, -11, -27, -24, -31, 0, 0, -44, + 0, 42, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -20, -24, -1, -68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -15, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -16, 7, -5, -2, -19, + -7, 0, -10, -7, -5, 0, -11, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -7, 0, 7, -5, 0, -16, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 7, 0, -10, 0, -5, -9, + -23, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 29, -2, 0, -20, 0, + -5, 15, 0, -7, -31, -10, 11, 1, + 0, -35, -13, 7, -13, 5, 0, -5, + -6, -24, 0, -11, 4, 0, 0, -13, + 0, 0, 0, 7, 7, -15, -14, 0, + -13, -7, -11, -7, -7, 0, -13, 4, + -14, -13, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -10, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -15, 0, 0, 0, -24, 0, + 5, -16, 15, 1, -5, -35, 0, 0, + -16, -7, 0, -29, -18, -21, 0, 0, + -32, -7, -29, -28, -35, 0, -19, 0, + 6, 49, -10, 0, -17, -7, -2, -7, + -13, -20, -13, -27, -30, -17, -7, 0, + 0, -5, 0, 2, 0, 0, -52, -7, + 22, 16, -16, -27, 0, 2, -23, 0, + -37, -5, -7, 15, -68, -10, 2, 0, + 0, -48, -9, -38, -7, -54, 0, 0, + -52, 0, 43, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -28, -5, 0, -48, + 0, 0, 0, 0, -24, 0, -7, 0, + -2, -21, -35, 0, 0, -4, -11, -22, + -7, 0, -5, 0, 0, 0, 0, -33, + -7, -24, -24, -6, -13, -18, -7, -13, + 0, -15, -7, -24, -11, 0, -9, -14, + -7, -14, 0, 4, 0, -5, -24, 0, + 15, 0, -13, 0, 0, 0, 0, 9, + 0, 5, -15, 30, 0, -7, -7, -9, + 0, 0, 0, 0, 0, 0, -22, 0, + -7, 0, -11, -7, 0, -16, -18, -22, + -6, 0, -15, 6, 29, 0, 0, 0, + 0, 59, 0, 0, 4, 0, 0, -10, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -15, + -7, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 15, 6, -7, 0, -24, + -12, 0, 22, -24, -24, -15, -15, 29, + 13, 7, -64, -5, 15, -7, 0, -7, + 8, -7, -26, 0, -7, 7, -10, -6, + -22, -6, 0, 0, 22, 15, 0, -21, + 0, -40, -10, 21, -10, -28, 2, -10, + -24, -24, -7, 29, 7, 0, -11, 0, + -20, 0, 6, 24, -17, -27, -29, -18, + 22, 0, 2, -54, -6, 7, -13, -5, + -17, 0, -16, -27, -11, -11, -6, 0, + 0, -17, -15, -7, 0, 22, 17, -7, + -40, 0, -40, -10, 0, -26, -43, -2, + -24, -13, -24, -21, 20, 0, 0, -10, + 0, -15, -7, 0, -7, -13, 0, 13, + -24, 7, 0, 0, -39, 0, -7, -16, + -13, -5, -22, -18, -24, -17, 0, -22, + -7, -17, -14, -22, -7, 0, 0, 2, + 35, -13, 0, -22, -7, 0, -7, -15, + -17, -20, -21, -28, -10, -15, 15, 0, + -11, 0, -37, -9, 4, 15, -24, -27, + -15, -24, 24, -7, 4, -68, -13, 15, + -16, -13, -27, 0, -22, -31, -9, -7, + -6, -7, -15, -22, -2, 0, 0, 22, + 21, -5, -48, 0, -44, -17, 18, -28, + -50, -15, -26, -31, -37, -24, 15, 0, + 0, 0, 0, -9, 0, 0, 7, -9, + 15, 5, -14, 15, 0, 0, -23, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 22, 1, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 28, 0, 13, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 0, -7, 13, 0, 22, + 0, 0, 73, 9, -15, -15, 7, 7, + -5, 2, -37, 0, 0, 35, -44, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 28, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -20, 0, + 0, 2, 0, 0, 7, 95, -15, -6, + 24, 20, -20, 7, 0, 0, 7, 7, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -96, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -21, + 0, 0, 0, -20, 0, 0, 0, 0, + -16, -4, 0, 0, 0, -16, 0, -9, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -14, 0, -11, 0, + -20, 0, 0, 0, -13, 7, -9, 0, + 0, -20, -7, -17, 0, 0, -20, 0, + -7, 0, -35, 0, -8, 0, 0, -60, + -14, -29, -8, -26, 0, 0, -49, 0, + -20, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -13, 0, 0, + 0, 0, -16, 0, -16, 10, -8, 15, + 0, -5, -17, -5, -13, -14, 0, -9, + -4, -5, 5, -20, -2, 0, 0, 0, + -65, -6, -10, 0, -16, 0, -5, -35, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -16, 0, -5, 0, 0, 0, -15, + 7, 0, 0, 0, -20, -7, -15, 0, + 0, -21, 0, -7, 0, -35, 0, 0, + 0, 0, -71, 0, -15, -27, -37, 0, + 0, -49, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 13, -10, 0, 23, + 36, -7, -7, -22, 9, 36, 13, 16, + -20, 9, 31, 9, 21, 16, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 35, -13, -7, 0, -6, + 59, 32, 59, 0, 0, 0, 7, 0, + 0, 27, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -62, -9, -6, -30, + -36, 0, 0, -49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -62, -9, -6, + -30, -36, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -17, 7, 0, -7, + 6, 13, 7, -22, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -7, -5, -15, 0, -7, -29, 0, 46, + -7, 0, -16, -5, 0, -5, -13, 0, + -7, -21, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -62, + -9, -6, -30, -36, 0, 0, -49, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -24, -9, -7, 22, -7, -7, + -29, 2, -4, 2, -5, -20, 1, 16, + 1, 6, 2, 6, -18, -29, -9, 0, + -28, -14, -20, -31, -29, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -20, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -7, 7, 0, -13, -14, -5, 0, -21, + -5, -16, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -49, 0, 24, 0, 0, -13, 0, + 0, 0, 0, -10, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -17, 0, 0, + 31, -10, -24, -23, 5, 8, 8, -1, + -21, 5, 11, 5, 22, 5, 24, -5, + -20, 0, 0, -29, 0, 0, -22, -20, + 0, 0, -15, 0, -10, -13, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -22, + -7, 27, 0, 0, -7, 0, -15, 0, + 0, 10, -17, 0, 7, -7, 6, 1, + 0, -24, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -30, -9, -16, 0, + -22, 0, 0, -35, 0, 27, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -22, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 0, 16, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 15, 0, 17, + 0, 0, 0, 0, 0, -46, -42, 2, + 32, 22, 13, -29, 5, 31, 0, 27, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_46 = { +#else +lv_font_t lv_font_montserrat_46 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 50, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_46*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_48.c b/libraries/lvgl/src/font/lv_font_montserrat_48.c new file mode 100644 index 0000000..1f731ac --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_48.c @@ -0,0 +1,12569 @@ +/******************************************************************************* + * Size: 48 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 48 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_48.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 1 +#endif + +#if LV_FONT_MONTSERRAT_48 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3f, 0xff, 0xff, 0x23, 0xff, 0xff, 0xf1, 0x2f, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, 0x0, + 0xef, 0xff, 0xc0, 0xd, 0xff, 0xfc, 0x0, 0xdf, + 0xff, 0xb0, 0xc, 0xff, 0xfa, 0x0, 0xcf, 0xff, + 0xa0, 0xb, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0x80, + 0xa, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0x70, 0x9, + 0xff, 0xf7, 0x0, 0x8f, 0xff, 0x60, 0x7, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x50, 0x6, 0xff, 0xf4, + 0x0, 0x14, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x7, 0xff, 0xf6, 0x4, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0x79, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x10, 0x4c, 0xfc, 0x30, + + /* U+0022 "\"" */ + 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xbf, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xae, 0xff, 0xf0, 0x0, 0x3, + 0xff, 0xfa, 0xef, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0xad, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xf9, 0xdf, + 0xfe, 0x0, 0x0, 0x2f, 0xff, 0x9c, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xf8, 0xcf, 0xfd, 0x0, 0x0, + 0x1f, 0xff, 0x8c, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0xf7, 0xbf, 0xfc, 0x0, 0x0, 0xf, 0xff, 0x7b, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf7, 0xbf, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0x61, 0x22, 0x10, 0x0, + 0x0, 0x22, 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x88, 0x88, 0x88, 0xcf, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x9f, 0xff, 0xb8, 0x88, 0x88, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x8d, 0xff, 0xe8, 0x88, 0x88, + 0x88, 0x89, 0xff, 0xfa, 0x88, 0x88, 0x87, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xff, 0xfd, 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x95, 0x7f, 0xfc, 0x45, + 0x8c, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf8, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1, 0x7e, + 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xb4, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3, + 0xaf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1b, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xf8, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xf5, 0x6, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x74, 0x37, 0xff, + 0xb3, 0x6a, 0xff, 0xff, 0xff, 0x40, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xbe, 0xff, 0xff, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfe, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x3c, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x1, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xf7, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x50, 0x0, 0x3c, + 0xff, 0xe0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0xce, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x16, 0xab, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, + 0xc7, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x3, 0xff, 0xfb, 0x30, 0x15, 0xef, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x3f, + 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfd, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xdf, 0xfd, 0x81, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa7, 0x68, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x0, 0x6, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x3c, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4f, 0xb6, 0x10, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x9, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe7, 0x30, 0x0, + 0x1, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x2, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x2, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xff, 0xf, 0xff, 0xf0, 0xef, 0xff, 0xe, + 0xff, 0xf0, 0xef, 0xff, 0xd, 0xff, 0xe0, 0xdf, + 0xfe, 0xc, 0xff, 0xd0, 0xcf, 0xfd, 0xc, 0xff, + 0xc0, 0xbf, 0xfc, 0xb, 0xff, 0xc0, 0xbf, 0xfb, + 0x1, 0x22, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xf5, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + + /* U+0029 ")" */ + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0xd, 0xff, 0x0, 0x0, 0x2a, 0x10, 0x5, 0xff, + 0xa1, 0x0, 0xdf, 0xf0, 0x0, 0x8f, 0xf8, 0x0, + 0xdf, 0xff, 0xf7, 0xc, 0xff, 0x5, 0xef, 0xff, + 0xf1, 0x2, 0xbf, 0xff, 0xfd, 0xef, 0xfb, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xee, 0xff, 0xcf, 0xff, + 0xfb, 0x20, 0xd, 0xff, 0xff, 0x80, 0xcf, 0xf0, + 0x6e, 0xff, 0xff, 0x10, 0x6f, 0xfb, 0x20, 0xd, + 0xff, 0x0, 0x19, 0xff, 0x90, 0x0, 0xb5, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x57, 0x50, 0x0, 0xcf, 0xff, 0xb0, 0x7f, + 0xff, 0xff, 0x5a, 0xff, 0xff, 0xf9, 0x9f, 0xff, + 0xff, 0x83, 0xff, 0xff, 0xf5, 0x4, 0xef, 0xff, + 0x10, 0xd, 0xff, 0xb0, 0x1, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0x10, 0x9, 0xff, 0xb0, 0x0, 0xdf, + 0xf6, 0x0, 0x1f, 0xff, 0x10, 0x5, 0xff, 0xb0, + 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+002E "." */ + 0x0, 0x79, 0x70, 0x1, 0xdf, 0xff, 0xc0, 0x8f, + 0xff, 0xff, 0x6b, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0x73, 0xff, 0xff, 0xf1, 0x4, 0xcf, 0xc3, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x75, 0x57, + 0xbf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf9, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, + 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfb, 0x76, 0x67, 0xbf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x23, 0x33, 0x33, 0x34, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, 0xed, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfa, 0x76, 0x55, 0x7a, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1c, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x38, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xa7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x8e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfe, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0x10, 0x8f, 0xff, 0xff, 0xff, 0xd9, 0x76, 0x56, + 0x7a, 0xef, 0xff, 0xff, 0xf7, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9c, 0xef, 0xff, 0xec, 0x96, 0x10, 0x0, + 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3, 0xbb, 0xbb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x42, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xf4, 0x22, 0x22, 0x21, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf4, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0x33, + 0x33, 0x33, 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0xdf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0x90, 0xe, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x65, + 0x68, 0xcf, 0xff, 0xff, 0xfe, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x7b, 0xde, 0xff, 0xfd, 0xb8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xb7, 0x53, 0x33, 0x57, + 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x22, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, + 0xef, 0xff, 0xf9, 0x41, 0x0, 0x3, 0x8e, 0xff, + 0xff, 0xf8, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x6, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xb, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfa, 0x41, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xf4, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xdf, 0xff, + 0xf4, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x50, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0x0, 0x25, 0x55, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf8, 0x41, 0x0, 0x1, 0x49, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x10, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xef, 0xff, 0xff, 0x95, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x1, 0xef, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x29, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfc, 0xdf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xcc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x73, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, + 0x2e, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, 0x14, + 0x8e, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xac, 0xef, 0xff, 0xec, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xb5, 0x10, 0x0, 0x15, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, 0x52, + 0x0, 0x1, 0x5b, 0xff, 0xff, 0xef, 0xff, 0xf3, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x40, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xec, + 0x84, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x74, 0x33, 0x45, 0x9d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x69, 0xce, 0xff, 0xfe, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 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, 0x7, 0x97, 0x0, 0x1d, 0xff, + 0xfc, 0x8, 0xff, 0xff, 0xf6, 0xbf, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0xff, 0x10, + 0x4c, 0xfc, 0x30, + + /* U+003B ";" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 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, 0x5, 0x75, 0x0, 0xc, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x50, + 0x4e, 0xff, 0xf1, 0x0, 0xdf, 0xfb, 0x0, 0x1f, + 0xff, 0x60, 0x5, 0xff, 0xf1, 0x0, 0x9f, 0xfb, + 0x0, 0xd, 0xff, 0x60, 0x1, 0xff, 0xf1, 0x0, + 0x5f, 0xfb, 0x0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 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, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xdf, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc7, 0x43, + 0x22, 0x48, 0xef, 0xff, 0xff, 0xf3, 0x4, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x2, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x10, + 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, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x9c, 0xde, 0xff, 0xed, 0xc9, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0xa7, 0x54, + 0x33, 0x45, 0x7a, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xab, 0xba, 0x73, 0x0, 0x0, 0x3b, + 0xbb, 0xa0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5f, 0xff, + 0xd0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x5f, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf9, 0x41, 0x1, + 0x38, 0xef, 0xff, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0xf, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, 0xff, 0xa0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x9f, 0xfe, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xff, 0xf3, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf4, 0xbf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, + 0xf3, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xde, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0xbc, 0xef, 0xff, + 0xff, 0x2a, 0xff, 0xff, 0xeb, 0xdf, 0xff, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0x8b, 0xef, 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x2, + 0x9e, 0xfe, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xd6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xfd, 0xa7, 0x55, 0x44, 0x56, 0x9b, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xac, + 0xee, 0xff, 0xed, 0xb8, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x10, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, + + /* U+0042 "B" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xfe, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x70, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x8e, 0xff, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, + 0xff, 0x30, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xaf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, + 0xc9, 0x61, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, + 0x8b, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x90, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdb, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xd0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, 0xff, + 0xfe, 0x33, 0x33, 0x33, 0x33, 0x34, 0x46, 0x9d, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfe, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xac, + 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x75, 0x56, 0x7a, 0xef, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfd, 0x10, + 0x0, 0xd, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x20, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xd9, + 0x76, 0x56, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xff, 0xdb, 0x95, 0x10, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, + + /* U+0049 "I" */ + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, + + /* U+004A "J" */ + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2e, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, 0x1d, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfd, + 0x2, 0xff, 0xff, 0xff, 0xc6, 0x43, 0x48, 0xef, + 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+004B "K" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xb, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x68, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xe2, + + /* U+004C "L" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+004D "M" */ + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xab, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x6d, 0xff, 0xfc, 0xff, 0xff, + 0xa2, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x10, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0xcf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, + + /* U+004E "N" */ + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x2, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfa, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x1f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x8, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x1, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfc, + 0x96, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xde, 0xff, 0xed, 0xb8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x34, 0x56, 0xae, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x4f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfa, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, + 0x1, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x43, + 0x34, 0x69, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xde, 0xff, 0xff, 0xff, 0xf7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x4, 0xef, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x25, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xcd, 0xc9, + 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf1, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, + 0x22, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf5, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, 0xef, 0xff, + 0xec, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xa6, 0x42, 0x23, 0x46, 0xad, + 0xff, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x9d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0xa6, 0x42, 0x22, 0x35, + 0x7c, 0xff, 0xff, 0xff, 0x40, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xef, 0xff, 0xed, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 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, 0xdf, 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, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x37, 0xff, 0xff, + 0x93, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x3f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x1f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0xc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x79, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, + 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x4, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf2, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x40, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfc, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe1, + 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x5f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2f, 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, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+005B "[" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005C "\\" */ + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf0, + + /* U+005D "]" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xbb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x44, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf2, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x88, 0x50, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0x70, + + /* U+0061 "a" */ + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xd9, 0x52, 0x11, 0x25, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0xa, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xa0, 0x0, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x6, 0xff, 0xff, 0xfd, 0x86, 0x55, 0x55, + 0x55, 0x56, 0xff, 0xff, 0x80, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x88, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x87, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x4f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x17, 0xef, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, + 0xff, 0xda, 0x9a, 0xcf, 0xff, 0xfe, 0xef, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2d, 0xff, 0xf8, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xdb, 0x72, 0x0, + 0xd, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xa, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0xa, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xaf, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xfc, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x38, 0xce, 0xff, + 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfd, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1d, 0xff, 0xff, 0xfe, 0x84, 0x21, 0x35, + 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfe, 0x50, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x81, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x50, + 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x84, 0x21, 0x35, 0xbf, 0xff, 0xff, 0xf2, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbd, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, 0x71, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x33, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf6, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x9f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, 0xe8, + 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0xf, 0xff, 0xf6, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xf4, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfd, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, + 0xc5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x51, 0xcf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0x90, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x95, 0x31, + 0x23, 0x6b, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xd0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd4, 0x0, 0x2, 0x86, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xfb, 0x0, 0x6f, + 0xff, 0xff, 0xfd, 0x84, 0x21, 0x24, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2f, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfb, 0xb, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xb2, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xbb, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xbe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x6, 0xff, 0xff, 0xff, 0xc7, 0x31, 0x1, + 0x37, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xb0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xd9, 0x40, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xe0, 0x0, 0x1f, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xd9, 0x53, 0x21, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6a, + 0xcd, 0xef, 0xfd, 0xc9, 0x61, 0x0, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0xa, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x85, 0x33, 0x58, 0xef, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x7a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, + + /* U+0069 "i" */ + 0x0, 0x37, 0x50, 0x0, 0x8f, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0x96, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0x90, 0xaf, 0xff, 0xe1, 0x0, 0x58, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, + 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x72, 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, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x3, 0xd5, 0x10, 0x4, 0xdf, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x1, 0x6b, 0xef, 0xfe, 0xb6, 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x10, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf2, + + /* U+006C "l" */ + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, + + /* U+006D "m" */ + 0xaf, 0xff, 0xc0, 0x0, 0x5, 0xad, 0xff, 0xfd, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6b, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xb6, 0x43, 0x47, 0xcf, + 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x6a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + + /* U+006E "n" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0xa, 0xff, 0xfc, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x85, + 0x33, 0x58, 0xef, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0xaf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x4a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x7a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x25, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf3, + 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfb, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x3e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xe8, 0x42, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xaf, 0xff, 0xc0, 0x0, 0x3, 0x8c, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0xa, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xaf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x38, 0xce, + 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf6, 0x0, 0x2f, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, + 0xe8, 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x60, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, + + /* U+0072 "r" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xa, + 0xff, 0xfc, 0x0, 0x5e, 0xff, 0xff, 0xf0, 0xaf, + 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xef, 0xff, 0xff, 0xd9, 0x88, 0xa, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x4, 0xff, 0xff, 0xfb, + 0x52, 0x0, 0x1, 0x48, 0xdf, 0xfa, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc2, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa7, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x58, 0xdf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf8, 0x8, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x1f, + 0xff, 0xff, 0xa7, 0x32, 0x10, 0x13, 0x7d, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x15, 0x8c, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x7, 0x88, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, + 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x71, 0x0, + 0x3a, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xfe, 0xb6, 0x0, + + /* U+0075 "u" */ + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x1d, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x1a, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf1, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6a, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x4, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, + 0x20, 0x0, 0x4f, 0xff, 0xf1, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x1, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x2, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x9f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, 0x6, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x98, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x30, 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa1, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xa0, 0x1e, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0xf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, + 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x3, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb4, 0x10, 0x27, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xef, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xff, + + /* U+007C "|" */ + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x50, + + /* U+007D "}" */ + 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x1, 0xde, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xee, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0x0, 0x0, 0x1, 0xde, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x15, 0x88, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x40, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x8, 0xff, 0xf9, 0x10, 0x4d, 0xff, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x90, 0xc, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0xfd, 0xab, 0xff, 0xff, 0x30, + 0xf, 0xff, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2a, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xfe, 0xc6, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x2, 0x68, 0x86, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xfa, 0x30, 0x3, 0x9f, 0xff, 0x40, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xe1, + 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, + 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xef, 0xf3, + 0x8, 0xff, 0xd4, 0x0, 0x0, 0x3d, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xda, 0xad, 0xff, 0xfc, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x5b, 0xdc, 0x60, 0x0, 0x9f, 0xff, 0xff, + 0x90, 0x5f, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0x60, + 0xbf, 0xff, 0xff, 0xb0, 0x0, 0x7d, 0xfd, 0x80, + 0x0, + + /* U+F001 "" */ + 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, 0x1, 0x5a, 0xee, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x72, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa5, 0x10, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 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, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 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, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + 0x0, 0x2, 0xcf, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xc2, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xe2, 0x1, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x49, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xa9, 0x30, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x40, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x76, 0x56, 0x8b, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xdf, 0xff, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfd, 0x40, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x5, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfb, 0x20, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x20, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xfe, 0x50, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x4, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x22, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0xe3, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xfc, 0x0, 0x0, 0x17, 0x10, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x1, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4e, 0xe4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 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, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 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, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7b, 0xef, 0xff, 0xff, 0xfc, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xba, 0xab, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x10, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, + 0x76, 0x54, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 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, 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, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x45, 0x67, + 0x78, 0x9a, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x1, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xba, 0xab, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcf, 0xff, 0xff, 0xfe, 0xb8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 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, 0x8e, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x70, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xb1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x85, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x75, 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, 0x1e, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xb, 0xff, + 0xff, 0x30, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, + 0x0, 0x4, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0xf, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x9, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0xf, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x2, 0x74, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xc, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x22, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbf, 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xd1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x73, 0x10, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 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, 0xc3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0xfd, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xfd, 0x70, 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, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F04D "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 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, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x2, 0x98, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x10, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x42, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0xac, 0xef, 0xff, 0xfe, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xda, 0x40, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xdc, 0x98, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4, 0x9d, 0xff, 0xda, 0x40, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x9c, 0xee, 0xff, 0xfe, + 0xca, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0xaf, 0x70, 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, 0x9, 0xff, + 0xfb, 0x10, 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, 0x6f, 0xff, 0xff, 0xe3, + 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, 0xef, 0xff, 0xff, 0xff, 0x60, 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, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 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, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xd2, 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, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xad, 0xef, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x8a, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x2, + 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0xcf, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xee, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x98, 0x89, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x7a, 0xce, 0xff, 0xfe, 0xdc, 0x96, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xf8, 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, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xc1, 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, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 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, 0x6, 0xff, 0xff, 0xff, 0xfe, 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, + 0x3e, 0xff, 0xff, 0xf6, 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, 0x1, 0xbf, + 0xff, 0x90, 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, 0x7, 0xfa, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x51, 0x15, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x37, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 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, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 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, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F074 "" */ + 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, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3f, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xef, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xf9, 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, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xbf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, + 0x0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x45, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x10, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe3, 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 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, 0xaf, 0xfa, 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, + 0xb, 0xff, 0xff, 0xb0, 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, 0xbf, 0xff, + 0xff, 0xfb, 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, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x90, 0xf, 0xff, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0x60, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x6, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x6, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 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, 0xbf, 0xff, 0xff, 0xfb, 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, + 0xb, 0xff, 0xff, 0xb0, 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, 0xaf, + 0xfa, 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, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 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, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F095 "" */ + 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, 0x7f, 0xea, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xfe, 0xdd, 0xb9, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x51, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xf7, 0x11, 0x7f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x71, 0x17, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x11, 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x70, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x71, 0x17, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x57, 0x75, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F0C9 "" */ + 0x39, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + 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, 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, 0x39, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x20, 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, 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, 0x39, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, + 0xff, 0xd3, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0x9e, 0xe9, 0x20, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x30, 0x13, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xb1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xe2, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 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, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, + 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, 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, 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, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, + 0x0, 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 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, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F124 "" */ + 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, 0x1, 0x8d, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xfc, 0x70, 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, + + /* U+F15B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F1EB "" */ + 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, 0x3, 0x68, + 0xbd, 0xef, 0xff, 0xff, 0xfe, 0xdb, 0x86, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0xa9, 0x98, 0x89, 0x9a, 0xce, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xb, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x7a, 0xce, 0xef, 0xfe, 0xec, 0xa7, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0xb, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xb0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x89, + 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xce, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xec, 0x10, 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, 0x7, 0xcf, 0xfc, + 0x70, 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, 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, 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, 0x7, + 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x8d, 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, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 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, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 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, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 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, 0x80, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x8d, 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, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 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, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 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, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 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, 0x80, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x8d, 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, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 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, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 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, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 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, 0x80, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x8d, 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, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 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, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 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, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 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, 0x80, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x8d, 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, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 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, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 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, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 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, 0x80, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 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, 0x6, 0xdf, + 0xfe, 0x70, 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, 0x8, 0xff, 0xff, 0xff, + 0xb0, 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, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, + 0xdc, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x99, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xcc, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x79, 0xff, + 0xff, 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbd, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 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, 0x1f, 0xff, + 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, 0xaf, 0xff, 0x10, + 0x0, 0x1, 0xde, 0xee, 0xee, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, + 0xcd, 0xff, 0xff, 0xff, 0xff, 0xfc, 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, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfc, 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, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 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, 0x12, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xff, 0xec, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x71, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xf8, 0xaf, + 0xff, 0xff, 0xe0, 0x0, 0xac, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xd1, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9f, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xf6, + 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x9f, 0xe2, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x9, 0xe0, 0x0, 0x9e, 0x20, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x70, 0x0, + 0x72, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1, 0xb0, 0x0, 0x85, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x1d, 0xe0, 0x0, 0x9f, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xe0, 0x0, + 0x9f, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x1d, 0xff, + 0xe0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x2, + 0xef, 0xff, 0xe0, 0x0, 0x9f, 0xf8, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0x80, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf3, 0xc, 0xff, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa8, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x58, 0xbd, 0xef, 0xff, + 0xed, 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 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, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd2, + 0x2d, 0xff, 0xff, 0xfd, 0x22, 0xdf, 0xff, 0xff, + 0xd2, 0x2d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xfd, 0x22, + 0xdf, 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xfe, 0xca, 0x86, 0x53, 0x10, 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, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + + /* U+F8A2 "" */ + 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, 0x1c, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0x91, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 207, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 206, .box_w = 7, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 119, .adv_w = 300, .box_w = 13, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 210, .adv_w = 540, .box_w = 32, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 754, .adv_w = 477, .box_w = 27, .box_h = 46, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1375, .adv_w = 647, .box_w = 38, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2021, .adv_w = 527, .box_w = 31, .box_h = 35, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2564, .adv_w = 161, .box_w = 5, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 2599, .adv_w = 259, .box_w = 11, .box_h = 45, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2847, .adv_w = 260, .box_w = 11, .box_h = 45, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 3095, .adv_w = 307, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3276, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3518, .adv_w = 174, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3567, .adv_w = 294, .box_w = 14, .box_h = 5, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3602, .adv_w = 174, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3627, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 4110, .adv_w = 512, .box_w = 28, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4586, .adv_w = 284, .box_w = 13, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4807, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5249, .adv_w = 439, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5691, .adv_w = 514, .box_w = 31, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6218, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6660, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7119, .adv_w = 459, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7561, .adv_w = 495, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8020, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8479, .adv_w = 174, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8570, .adv_w = 174, .box_w = 7, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8686, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8928, .adv_w = 447, .box_w = 22, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 9093, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 9335, .adv_w = 440, .box_w = 25, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 794, .box_w = 46, .box_h = 43, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10749, .adv_w = 562, .box_w = 37, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11378, .adv_w = 581, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 11871, .adv_w = 555, .box_w = 31, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12398, .adv_w = 634, .box_w = 33, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 12959, .adv_w = 515, .box_w = 25, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13384, .adv_w = 488, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13792, .adv_w = 593, .box_w = 32, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14336, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14829, .adv_w = 238, .box_w = 5, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14914, .adv_w = 394, .box_w = 21, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15271, .adv_w = 552, .box_w = 30, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 15781, .adv_w = 456, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16189, .adv_w = 733, .box_w = 36, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16801, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 17294, .adv_w = 645, .box_w = 37, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17923, .adv_w = 554, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 18399, .adv_w = 645, .box_w = 38, .box_h = 41, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19178, .adv_w = 558, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 19654, .adv_w = 477, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20113, .adv_w = 451, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20589, .adv_w = 607, .box_w = 30, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 21099, .adv_w = 547, .box_w = 36, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21711, .adv_w = 865, .box_w = 52, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22595, .adv_w = 517, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23139, .adv_w = 497, .box_w = 33, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 23700, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24193, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 24441, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 24924, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 25172, .adv_w = 448, .box_w = 22, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 25392, .adv_w = 384, .box_w = 24, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25440, .adv_w = 461, .box_w = 13, .box_h = 7, .ofs_x = 5, .ofs_y = 29}, + {.bitmap_index = 25486, .adv_w = 459, .box_w = 23, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 25785, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26271, .adv_w = 439, .box_w = 24, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 26583, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27069, .adv_w = 470, .box_w = 26, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27407, .adv_w = 271, .box_w = 19, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27749, .adv_w = 530, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 28222, .adv_w = 523, .box_w = 25, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28672, .adv_w = 214, .box_w = 7, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28802, .adv_w = 218, .box_w = 16, .box_h = 46, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 29170, .adv_w = 473, .box_w = 26, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29638, .adv_w = 214, .box_w = 5, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29728, .adv_w = 812, .box_w = 43, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30287, .adv_w = 523, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30612, .adv_w = 488, .box_w = 27, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 30963, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 31436, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 31909, .adv_w = 315, .box_w = 15, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 32104, .adv_w = 385, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32390, .adv_w = 318, .box_w = 19, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32694, .adv_w = 520, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 33019, .adv_w = 429, .box_w = 28, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33383, .adv_w = 690, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33942, .adv_w = 424, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34280, .adv_w = 429, .box_w = 29, .box_h = 35, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 34788, .adv_w = 400, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 35087, .adv_w = 270, .box_w = 14, .box_h = 45, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 35402, .adv_w = 230, .box_w = 5, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 35515, .adv_w = 270, .box_w = 15, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 35853, .adv_w = 447, .box_w = 24, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 35961, .adv_w = 322, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 19}, + {.bitmap_index = 36089, .adv_w = 241, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 36130, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37306, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38170, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39178, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40042, .adv_w = 528, .box_w = 33, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 40603, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41755, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 42859, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43993, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 45145, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46117, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47269, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47725, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48409, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 49651, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50515, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 51307, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 51967, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 53017, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 53920, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54802, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 55462, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 56386, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 56932, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 57478, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58360, .adv_w = 672, .box_w = 42, .box_h = 10, .ofs_x = 0, .ofs_y = 13}, + {.bitmap_index = 58570, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 59542, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60982, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 62326, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 63382, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 63928, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 64474, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65614, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 66478, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67630, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 68831, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69734, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70742, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 71624, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72422, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 73286, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 74054, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75062, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 76070, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77042, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 78292, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 79156, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 80476, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 81376, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 82276, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 83176, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84076, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84976, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86135, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 86999, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 88007, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 89208, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 90288, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 91152, .adv_w = 773, .box_w = 49, .box_h = 31, .ofs_x = 0, .ofs_y = 3} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 8, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 35, 0, 21, -17, 0, 0, + 0, 0, -42, -46, 5, 36, 17, 13, + -31, 5, 38, 2, 32, 8, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -23, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -8, 0, + -5, 8, 0, -8, 0, -8, -4, -15, + 0, 0, 0, 0, -8, 0, 0, -10, + -12, 0, 0, -8, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, -12, 0, -21, 0, -93, 0, + 0, -15, 0, 15, 23, 1, 0, -15, + 8, 8, 25, 15, -13, 15, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -21, -9, -38, 0, -31, + -5, 0, 0, 0, 0, 2, 30, 0, + -23, -6, -2, 2, 0, -13, 0, 0, + -5, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -61, -6, 29, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 8, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 8, 23, -8, 0, 0, 15, -8, + -25, -105, 5, 21, 15, 2, -10, 0, + 28, 0, 25, 0, 25, 0, -71, 0, + -9, 23, 0, 25, -8, 15, 8, 0, + 0, 2, -8, 0, 0, -13, 61, 0, + 61, 0, 23, 0, 32, 10, 13, 23, + 0, 0, 0, -28, 0, 0, 0, 0, + 2, -5, 0, 5, -14, -10, -15, 5, + 0, -8, 0, 0, 0, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -42, 0, -48, 0, 0, 0, + 0, -5, 0, 76, -9, -10, 8, 8, + -7, 0, -10, 8, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -74, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 46, 0, 0, -28, 0, + 25, 0, -52, -74, -52, -15, 23, 0, + 0, -51, 0, 9, -18, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 23, -94, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -8, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -18, -15, 0, -19, + -25, -25, -15, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 8, 0, + 5, -8, 0, 2, 0, 0, 0, 8, + -5, 0, 0, 0, -5, 8, 8, -2, + 0, 0, 0, -15, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 23, + 0, 0, -8, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -8, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -8, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -8, -8, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, -5, -10, 0, -12, 0, -23, + -5, -23, 15, 0, 0, -15, 8, 15, + 21, 0, -19, -2, -9, 0, -2, -36, + 8, -5, 5, -41, 8, 0, 0, 2, + -40, 0, -41, -6, -67, -5, 0, -38, + 0, 15, 22, 0, 10, 0, 0, 0, + 0, 2, 0, -14, -10, 0, -23, 0, + 0, 0, -8, 0, 0, 0, -8, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -8, -8, 0, -5, -9, -6, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 8, 0, 0, -9, + 4, 8, 8, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -8, 0, -8, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -12, 0, + -15, 0, 23, -5, 2, -25, 0, 0, + 21, -38, -40, -32, -15, 8, 0, -6, + -50, -14, 0, -14, 0, -15, 12, -14, + -49, 0, -21, 0, 0, 4, -2, 6, + -5, 0, 8, 1, -23, -29, 0, -38, + -18, -16, -18, -23, -9, -21, -2, -15, + -21, 5, 0, 2, 0, -8, 0, 0, + 0, 5, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, -4, 0, -2, -8, 0, -13, -17, + -17, -2, 0, -23, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -5, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -15, 0, 0, 0, 0, -38, -23, 0, + 0, 0, -12, -38, 0, 0, -8, 8, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, -14, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -8, -8, -9, 0, 0, 0, 0, + 0, 0, -23, 0, -8, 0, -12, -8, + 0, -17, -19, -23, -6, 0, -15, 0, + -23, 0, 0, 0, 0, 61, 0, 0, + 4, 0, 0, -10, 0, 8, 0, -33, + 0, 0, 0, 0, 0, -71, -14, 25, + 23, -6, -32, 0, 8, -12, 0, -38, + -4, -10, 8, -54, -8, 10, 0, 12, + -27, -12, -28, -25, -32, 0, 0, -46, + 0, 44, 0, 0, -4, 0, 0, 0, + -4, -4, -8, -21, -25, -2, -71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, -4, -8, -12, 0, 0, + -15, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -17, 8, -5, -2, -20, + -8, 0, -10, -8, -5, 0, -12, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -8, 0, 8, -5, 0, -17, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 8, 0, -11, 0, -5, -9, + -24, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -8, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 31, -2, 0, -21, 0, + -5, 15, 0, -8, -32, -10, 12, 1, + 0, -36, -13, 8, -13, 5, 0, -5, + -6, -25, 0, -12, 4, 0, 0, -13, + 0, 0, 0, 8, 8, -15, -15, 0, + -13, -8, -12, -8, -8, 0, -13, 4, + -15, -13, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -10, + 0, 0, -8, -8, 0, 0, 0, 0, + -8, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -12, 0, -15, 0, 0, 0, -25, 0, + 5, -17, 15, 2, -5, -36, 0, 0, + -17, -8, 0, -31, -19, -22, 0, 0, + -33, -8, -31, -29, -37, 0, -20, 0, + 6, 51, -10, 0, -18, -8, -2, -8, + -13, -21, -14, -28, -31, -18, -8, 0, + 0, -5, 0, 2, 0, 0, -54, -7, + 23, 17, -17, -28, 0, 2, -24, 0, + -38, -5, -8, 15, -71, -10, 2, 0, + 0, -50, -9, -40, -8, -56, 0, 0, + -54, 0, 45, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -29, -5, 0, -50, + 0, 0, 0, 0, -25, 0, -7, 0, + -2, -22, -36, 0, 0, -4, -12, -23, + -8, 0, -5, 0, 0, 0, 0, -35, + -8, -25, -25, -6, -13, -19, -8, -13, + 0, -15, -7, -25, -12, 0, -9, -15, + -8, -15, 0, 4, 0, -5, -25, 0, + 15, 0, -14, 0, 0, 0, 0, 9, + 0, 5, -15, 31, 0, -8, -8, -9, + 0, 0, 0, 0, 0, 0, -23, 0, + -8, 0, -12, -8, 0, -17, -19, -23, + -6, 0, -15, 6, 31, 0, 0, 0, + 0, 61, 0, 0, 4, 0, 0, -10, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -8, -8, 0, 0, -15, + -8, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 12, 15, 6, -7, 0, -25, + -12, 0, 23, -25, -25, -15, -15, 31, + 14, 8, -67, -5, 15, -8, 0, -8, + 8, -8, -27, 0, -8, 8, -10, -6, + -23, -6, 0, 0, 23, 15, 0, -22, + 0, -42, -10, 22, -10, -29, 2, -10, + -25, -25, -8, 31, 8, 0, -12, 0, + -21, 0, 6, 25, -18, -28, -31, -19, + 23, 0, 2, -56, -6, 8, -13, -5, + -18, 0, -17, -28, -12, -12, -6, 0, + 0, -18, -16, -8, 0, 23, 18, -8, + -42, 0, -42, -11, 0, -27, -45, -2, + -25, -13, -25, -22, 21, 0, 0, -10, + 0, -15, -7, 0, -8, -14, 0, 13, + -25, 8, 0, 0, -41, 0, -8, -17, + -13, -5, -23, -19, -25, -18, 0, -23, + -8, -18, -15, -23, -8, 0, 0, 2, + 36, -13, 0, -23, -8, 0, -8, -15, + -18, -21, -22, -29, -10, -15, 15, 0, + -12, 0, -38, -9, 5, 15, -25, -28, + -15, -25, 25, -8, 4, -71, -14, 15, + -17, -13, -28, 0, -23, -32, -9, -8, + -6, -8, -16, -23, -2, 0, 0, 23, + 22, -5, -50, 0, -46, -18, 18, -29, + -52, -15, -27, -32, -38, -25, 15, 0, + 0, 0, 0, -9, 0, 0, 8, -9, + 15, 5, -15, 15, 0, 0, -24, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 6, 23, 2, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 29, 0, 14, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 0, -8, 13, 0, 23, + 0, 0, 76, 9, -15, -15, 8, 8, + -5, 2, -38, 0, 0, 37, -46, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -52, 29, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -21, 0, + 0, 2, 0, 0, 8, 99, -15, -6, + 25, 21, -21, 8, 0, 0, 8, 8, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -100, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -22, + 0, 0, 0, -21, 0, 0, 0, 0, + -17, -4, 0, 0, 0, -17, 0, -9, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -8, 0, 0, -15, 0, -12, 0, + -21, 0, 0, 0, -13, 8, -9, 0, + 0, -21, -8, -18, 0, 0, -21, 0, + -8, 0, -36, 0, -8, 0, 0, -62, + -15, -31, -8, -28, 0, 0, -51, 0, + -21, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -12, -14, -6, -13, 0, 0, + 0, 0, -17, 0, -17, 10, -8, 15, + 0, -5, -18, -5, -13, -15, 0, -9, + -4, -5, 5, -21, -2, 0, 0, 0, + -68, -6, -11, 0, -17, 0, -5, -36, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -17, 0, -5, 0, 0, 0, -15, + 8, 0, 0, 0, -21, -8, -15, 0, + 0, -22, 0, -8, 0, -36, 0, 0, + 0, 0, -74, 0, -15, -28, -38, 0, + 0, -51, 0, -5, -12, 0, 0, 0, + 0, 0, 0, 0, 0, -8, -12, -4, + -12, 2, 0, 0, 13, -10, 0, 24, + 38, -8, -8, -23, 9, 38, 13, 17, + -21, 9, 32, 9, 22, 17, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 36, -14, -8, 0, -6, + 61, 33, 61, 0, 0, 0, 8, 0, + 0, 28, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, -65, -9, -6, -31, + -38, 0, 0, -51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, -65, -9, -6, + -31, -38, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -18, 8, 0, -8, + 6, 14, 8, -23, 0, -2, -6, 8, + 0, 6, 0, 0, 0, 0, -19, 0, + -7, -5, -15, 0, -7, -31, 0, 48, + -8, 0, -17, -5, 0, -5, -13, 0, + -8, -22, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, -65, + -9, -6, -31, -38, 0, 0, -51, 0, + 0, 0, 0, 0, 0, 38, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -25, -9, -7, 23, -7, -8, + -31, 2, -5, 2, -5, -21, 2, 17, + 2, 6, 2, 6, -18, -31, -9, 0, + -29, -15, -21, -32, -30, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 12, 0, 12, -5, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -8, -8, 0, 0, + -21, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -8, 8, 0, -13, -15, -5, 0, -22, + -5, -17, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -51, 0, 25, 0, 0, -14, 0, + 0, 0, 0, -10, 0, -8, 0, 0, + -4, 0, 0, -5, 0, -18, 0, 0, + 32, -10, -25, -24, 5, 8, 8, -2, + -22, 5, 12, 5, 23, 5, 25, -5, + -21, 0, 0, -31, 0, 0, -23, -21, + 0, 0, -15, 0, -10, -13, 0, -12, + 0, -12, 0, -5, 12, 0, -6, -23, + -8, 28, 0, 0, -7, 0, -15, 0, + 0, 10, -18, 0, 8, -8, 6, 1, + 0, -25, 0, -5, -2, 0, -8, 8, + -6, 0, 0, 0, -31, -9, -17, 0, + -23, 0, 0, -36, 0, 28, -8, 0, + -14, 0, 5, 0, -8, 0, -8, -23, + 0, -8, 8, 0, 0, 0, 0, -5, + 0, 0, 8, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -48, 0, 17, 0, + 0, -6, 0, 0, 0, 0, 2, 0, + -8, -8, 0, 0, 0, 15, 0, 18, + 0, 0, 0, 0, 0, -48, -44, 2, + 33, 23, 13, -31, 5, 32, 0, 28, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_48 = { +#else +lv_font_t lv_font_montserrat_48 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 52, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -4, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_48*/ diff --git a/libraries/lvgl/src/font/lv_font_montserrat_8.c b/libraries/lvgl/src/font/lv_font_montserrat_8.c new file mode 100644 index 0000000..6985792 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_montserrat_8.c @@ -0,0 +1,1440 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 8 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 1 +#endif + +#if LV_FONT_MONTSERRAT_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x58, 0x57, 0x46, 0x23, 0x46, + + /* U+0022 "\"" */ + 0x73, 0x97, 0x29, 0x0, 0x0, + + /* U+0023 "#" */ + 0x4, 0x52, 0x60, 0x4b, 0x9b, 0xa3, 0x8, 0x7, + 0x20, 0x6c, 0x8c, 0x81, 0x9, 0x9, 0x0, + + /* U+0024 "$" */ + 0x0, 0x80, 0x2, 0xbd, 0xa2, 0x76, 0x80, 0x0, + 0x8d, 0x81, 0x0, 0x84, 0x95, 0xad, 0xb3, 0x0, + 0x80, 0x0, + + /* U+0025 "%" */ + 0x58, 0x70, 0x63, 0x8, 0x8, 0x36, 0x0, 0x27, + 0x58, 0x67, 0x10, 0x8, 0x27, 0x26, 0x6, 0x20, + 0x88, 0x20, + + /* U+0026 "&" */ + 0x9, 0x99, 0x0, 0xb, 0x3a, 0x0, 0x19, 0xc2, + 0x20, 0x83, 0x1a, 0xa0, 0x3a, 0x99, 0x92, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x72, 0x72, 0x0, + + /* U+0028 "(" */ + 0x8, 0x20, 0xb0, 0x1a, 0x3, 0x80, 0x1a, 0x0, + 0xb0, 0x8, 0x20, + + /* U+0029 ")" */ + 0x73, 0x19, 0xb, 0xc, 0xb, 0x19, 0x73, + + /* U+002A "*" */ + 0x48, 0x40, 0x6e, 0x80, 0x15, 0x10, + + /* U+002B "+" */ + 0x0, 0x20, 0x0, 0xa, 0x0, 0x49, 0xd9, 0x10, + 0xa, 0x0, + + /* U+002C "," */ + 0x0, 0x75, 0x71, + + /* U+002D "-" */ + 0x5a, 0x60, + + /* U+002E "." */ + 0x0, 0x74, + + /* U+002F "/" */ + 0x0, 0xa, 0x0, 0x2, 0x80, 0x0, 0x82, 0x0, + 0xa, 0x0, 0x4, 0x60, 0x0, 0x91, 0x0, 0x19, + 0x0, 0x0, + + /* U+0030 "0" */ + 0xa, 0xbb, 0x26, 0x60, 0x1b, 0x93, 0x0, 0xc6, + 0x60, 0x1b, 0xa, 0xbb, 0x20, + + /* U+0031 "1" */ + 0x9e, 0x20, 0xa2, 0xa, 0x20, 0xa2, 0xa, 0x20, + + /* U+0032 "2" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, + 0x87, 0x0, 0x9e, 0xaa, 0x30, + + /* U+0033 "3" */ + 0x7a, 0xbe, 0x0, 0xa, 0x20, 0x4, 0xa9, 0x0, + 0x0, 0xa2, 0x8a, 0xa9, 0x0, + + /* U+0034 "4" */ + 0x0, 0x49, 0x0, 0x3, 0xa0, 0x0, 0x1b, 0x8, + 0x20, 0x8b, 0xad, 0xb2, 0x0, 0x9, 0x30, + + /* U+0035 "5" */ + 0x3d, 0xaa, 0x5, 0x60, 0x0, 0x5b, 0xa8, 0x0, + 0x0, 0x93, 0x7a, 0xaa, 0x0, + + /* U+0036 "6" */ + 0x9, 0xaa, 0x36, 0x70, 0x0, 0x98, 0x9a, 0x26, + 0x80, 0x2a, 0x9, 0x9a, 0x40, + + /* U+0037 "7" */ + 0xca, 0xad, 0x67, 0x0, 0xc0, 0x0, 0x67, 0x0, + 0xc, 0x0, 0x6, 0x70, 0x0, + + /* U+0038 "8" */ + 0x1a, 0xab, 0x25, 0x60, 0x48, 0x1d, 0xad, 0x38, + 0x40, 0x1b, 0x3a, 0x9a, 0x40, + + /* U+0039 "9" */ + 0x4a, 0x99, 0xb, 0x10, 0x95, 0x3a, 0x99, 0x80, + 0x0, 0x95, 0x3a, 0xb8, 0x0, + + /* U+003A ":" */ + 0x74, 0x0, 0x0, 0x74, + + /* U+003B ";" */ + 0x74, 0x0, 0x0, 0x75, 0x62, 0x0, + + /* U+003C "<" */ + 0x0, 0x1, 0x0, 0x49, 0x80, 0x5c, 0x30, 0x0, + 0x16, 0x91, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x49, 0x99, 0x10, 0x0, 0x0, 0x49, 0x99, 0x10, + + /* U+003E ">" */ + 0x10, 0x0, 0x3, 0x98, 0x20, 0x0, 0x6d, 0x14, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0xa4, 0x0, + 0x3, 0x0, 0x2, 0x80, 0x0, + + /* U+0040 "@" */ + 0x3, 0x87, 0x78, 0x50, 0x28, 0x4a, 0x9c, 0x75, + 0x80, 0xb0, 0xa, 0x28, 0x80, 0xb0, 0xa, 0x28, + 0x28, 0x49, 0x99, 0xa6, 0x3, 0x88, 0x75, 0x0, + + /* U+0041 "A" */ + 0x0, 0xb, 0x90, 0x0, 0x3, 0x8a, 0x10, 0x0, + 0xb1, 0x39, 0x0, 0x4d, 0x99, 0xd1, 0xb, 0x10, + 0x3, 0x90, + + /* U+0042 "B" */ + 0x2d, 0x99, 0xb1, 0x2a, 0x0, 0x84, 0x2d, 0x9a, + 0xd1, 0x2a, 0x0, 0x39, 0x2d, 0x99, 0xb4, + + /* U+0043 "C" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x7, 0xba, 0xa2, + + /* U+0044 "D" */ + 0x2e, 0xab, 0xb3, 0x2, 0xa0, 0x1, 0xc0, 0x2a, + 0x0, 0x9, 0x22, 0xa0, 0x1, 0xc0, 0x2e, 0xab, + 0xb3, 0x0, + + /* U+0045 "E" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2d, 0xaa, 0x42, + 0xa0, 0x0, 0x2e, 0xaa, 0x90, + + /* U+0046 "F" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2e, 0xaa, 0x42, + 0xa0, 0x0, 0x2a, 0x0, 0x0, + + /* U+0047 "G" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x23, 0x59, 0x0, 0x47, 0x7, 0xba, 0xa3, + + /* U+0048 "H" */ + 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, 0x2e, 0xaa, + 0xba, 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, + + /* U+0049 "I" */ + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + + /* U+004A "J" */ + 0x5, 0xad, 0x50, 0x0, 0x75, 0x0, 0x7, 0x50, + 0x0, 0x84, 0x9, 0xab, 0x0, + + /* U+004B "K" */ + 0x2a, 0x1, 0xa2, 0x2a, 0x1b, 0x20, 0x2c, 0xc7, + 0x0, 0x2d, 0x19, 0x50, 0x2a, 0x0, 0xa4, + + /* U+004C "L" */ + 0x2a, 0x0, 0x2, 0xa0, 0x0, 0x2a, 0x0, 0x2, + 0xa0, 0x0, 0x2e, 0xaa, 0x70, + + /* U+004D "M" */ + 0x2c, 0x0, 0x3, 0xc2, 0xd7, 0x0, 0xbc, 0x29, + 0x92, 0x84, 0xc2, 0x91, 0xb9, 0xc, 0x29, 0x3, + 0x0, 0xc0, + + /* U+004E "N" */ + 0x2d, 0x10, 0x2a, 0x2c, 0xb0, 0x2a, 0x2a, 0x4b, + 0x2a, 0x2a, 0x5, 0xca, 0x2a, 0x0, 0x7a, + + /* U+004F "O" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x1, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, + + /* U+0050 "P" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2e, 0xaa, 0x60, 0x2a, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x0, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, 0x0, 0x39, 0x93, + + /* U+0052 "R" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2d, 0xac, 0x80, 0x2a, 0x1, 0xa1, + + /* U+0053 "S" */ + 0x2a, 0xaa, 0x27, 0x60, 0x0, 0x8, 0x98, 0x10, + 0x0, 0x49, 0x5a, 0xaa, 0x30, + + /* U+0054 "T" */ + 0xaa, 0xea, 0x60, 0xc, 0x0, 0x0, 0xc0, 0x0, + 0xc, 0x0, 0x0, 0xc0, 0x0, + + /* U+0055 "U" */ + 0x39, 0x0, 0x48, 0x39, 0x0, 0x48, 0x39, 0x0, + 0x48, 0x1c, 0x0, 0x66, 0x6, 0xba, 0xa0, + + /* U+0056 "V" */ + 0xb, 0x10, 0x5, 0x70, 0x49, 0x0, 0xb0, 0x0, + 0xc1, 0x57, 0x0, 0x4, 0x9c, 0x0, 0x0, 0xc, + 0x70, 0x0, + + /* U+0057 "W" */ + 0x94, 0x0, 0xf1, 0x3, 0x93, 0xa0, 0x69, 0x70, + 0x93, 0xc, 0xb, 0xb, 0xb, 0x0, 0x79, 0x80, + 0x89, 0x70, 0x1, 0xf2, 0x2, 0xf1, 0x0, + + /* U+0058 "X" */ + 0x58, 0x2, 0xa0, 0x8, 0x7b, 0x10, 0x0, 0xf5, + 0x0, 0xa, 0x4b, 0x10, 0x76, 0x2, 0xb0, + + /* U+0059 "Y" */ + 0xa, 0x20, 0xb, 0x0, 0x1b, 0x9, 0x30, 0x0, + 0x5b, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6a, 0xac, 0xd0, 0x0, 0x1b, 0x10, 0x0, 0xb2, + 0x0, 0xb, 0x30, 0x0, 0x8d, 0xaa, 0xa0, + + /* U+005B "[" */ + 0x2d, 0x42, 0x90, 0x29, 0x2, 0x90, 0x29, 0x2, + 0x90, 0x2d, 0x40, + + /* U+005C "\\" */ + 0x19, 0x0, 0x0, 0xa0, 0x0, 0x5, 0x50, 0x0, + 0xa, 0x0, 0x0, 0x91, 0x0, 0x3, 0x70, 0x0, + 0xa, 0x0, + + /* U+005D "]" */ + 0x8c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x8c, + + /* U+005E "^" */ + 0x3, 0xc0, 0x0, 0x94, 0x50, 0x27, 0x9, 0x0, + + /* U+005F "_" */ + 0x77, 0x77, + + /* U+0060 "`" */ + 0x6, 0x60, + + /* U+0061 "a" */ + 0x29, 0x98, 0x2, 0x98, 0xd0, 0x84, 0xc, 0x13, + 0xb9, 0xd1, + + /* U+0062 "b" */ + 0x48, 0x0, 0x0, 0x48, 0x0, 0x0, 0x4c, 0xab, + 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, 0xc0, 0x4c, + 0xaa, 0x50, + + /* U+0063 "c" */ + 0x1a, 0xaa, 0x18, 0x40, 0x0, 0x84, 0x0, 0x1, + 0xaa, 0xa1, + + /* U+0064 "d" */ + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1a, 0xaa, 0xb9, + 0x40, 0x3b, 0x94, 0x2, 0xb1, 0xa9, 0x9b, + + /* U+0065 "e" */ + 0x19, 0x99, 0x19, 0x98, 0x86, 0x85, 0x1, 0x1, + 0xaa, 0xb1, + + /* U+0066 "f" */ + 0xa, 0xa0, 0x2a, 0x0, 0x9d, 0x70, 0x29, 0x0, + 0x29, 0x0, 0x29, 0x0, + + /* U+0067 "g" */ + 0x1a, 0x99, 0xb9, 0x40, 0x1c, 0x94, 0x2, 0xc1, + 0xaa, 0xab, 0x18, 0x9a, 0x30, + + /* U+0068 "h" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x4c, 0x9b, 0x44, + 0x90, 0x1b, 0x48, 0x0, 0xc4, 0x80, 0xc, + + /* U+0069 "i" */ + 0x37, 0x0, 0x48, 0x48, 0x48, 0x48, + + /* U+006A "j" */ + 0x3, 0x70, 0x0, 0x3, 0x80, 0x38, 0x3, 0x80, + 0x38, 0x6b, 0x40, + + /* U+006B "k" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x48, 0xa, 0x44, + 0x9c, 0x30, 0x4d, 0x6a, 0x4, 0x80, 0x77, + + /* U+006C "l" */ + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + + /* U+006D "m" */ + 0x4c, 0x9b, 0x89, 0xb4, 0x49, 0x3, 0xb0, 0xb, + 0x48, 0x2, 0xa0, 0xc, 0x48, 0x2, 0xa0, 0xc, + + /* U+006E "n" */ + 0x4c, 0x9b, 0x44, 0x90, 0x1b, 0x48, 0x0, 0xc4, + 0x80, 0xc, + + /* U+006F "o" */ + 0x1a, 0xaa, 0x18, 0x40, 0x3a, 0x84, 0x3, 0xa1, + 0xaa, 0xa1, + + /* U+0070 "p" */ + 0x4c, 0xab, 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, + 0xc0, 0x4c, 0xaa, 0x50, 0x48, 0x0, 0x0, + + /* U+0071 "q" */ + 0x1a, 0xa9, 0xb9, 0x40, 0x3b, 0x94, 0x3, 0xb1, + 0xaa, 0x9b, 0x0, 0x0, 0xb0, + + /* U+0072 "r" */ + 0x4b, 0xa0, 0x4a, 0x0, 0x48, 0x0, 0x48, 0x0, + + /* U+0073 "s" */ + 0x5b, 0x95, 0x87, 0x30, 0x3, 0x79, 0x7a, 0xa6, + + /* U+0074 "t" */ + 0x29, 0x0, 0x9d, 0x70, 0x29, 0x0, 0x29, 0x0, + 0xb, 0x90, + + /* U+0075 "u" */ + 0x57, 0x1, 0xb5, 0x70, 0x1b, 0x48, 0x3, 0xb0, + 0xa9, 0x9b, + + /* U+0076 "v" */ + 0xb, 0x0, 0x84, 0x5, 0x70, 0xb0, 0x0, 0xb7, + 0x50, 0x0, 0x6d, 0x0, + + /* U+0077 "w" */ + 0xb0, 0xe, 0x20, 0xa0, 0x55, 0x59, 0x82, 0x80, + 0xa, 0xa0, 0xa8, 0x20, 0x9, 0x80, 0x6b, 0x0, + + /* U+0078 "x" */ + 0x67, 0x1b, 0x0, 0x9b, 0x10, 0xa, 0xb2, 0x7, + 0x51, 0xb0, + + /* U+0079 "y" */ + 0xb, 0x10, 0x83, 0x3, 0x81, 0xa0, 0x0, 0xaa, + 0x30, 0x0, 0x4a, 0x0, 0xa, 0xb2, 0x0, + + /* U+007A "z" */ + 0x59, 0xbb, 0x1, 0xb1, 0xb, 0x20, 0x9c, 0x98, + + /* U+007B "{" */ + 0xa, 0x60, 0xc0, 0xc, 0x5, 0xb0, 0xc, 0x0, + 0xc0, 0xa, 0x60, + + /* U+007C "|" */ + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + + /* U+007D "}" */ + 0x97, 0x0, 0xb0, 0xb, 0x0, 0xd3, 0xb, 0x0, + 0xb0, 0x97, 0x0, + + /* U+007E "~" */ + 0x29, 0x35, 0x15, 0x6, 0x80, + + /* U+00B0 "°" */ + 0x26, 0x47, 0x7, 0x27, 0x50, + + /* U+2022 "•" */ + 0x0, 0x5d, 0x2, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, + 0x0, 0x8d, 0xff, 0xff, 0x0, 0xff, 0xe9, 0x5f, + 0x0, 0xf3, 0x0, 0xf, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0xf0, 0xa, 0xff, 0xaf, 0xf0, 0xa, 0xfa, + 0xaf, 0xa0, 0x0, 0x0, + + /* U+F008 "" */ + 0xbd, 0xcc, 0xce, 0xab, 0x8b, 0x0, 0x7, 0x58, + 0xcd, 0x66, 0x6a, 0xac, 0xcd, 0x66, 0x6a, 0xac, + 0x8b, 0x0, 0x7, 0x58, 0xbd, 0xcc, 0xce, 0xab, + + /* U+F00B "" */ + 0x34, 0x14, 0x44, 0x43, 0xff, 0x7f, 0xff, 0xff, + 0xab, 0x4b, 0xbb, 0xba, 0xbc, 0x5c, 0xcc, 0xcb, + 0xff, 0x7f, 0xff, 0xff, 0x67, 0x17, 0x88, 0x86, + 0xff, 0x7f, 0xff, 0xff, 0xab, 0x4b, 0xbb, 0xba, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9, 0xfa, + 0xa9, 0x0, 0x9f, 0xa0, 0xaf, 0x99, 0xfa, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x99, 0x0, 0x0, + + /* U+F00D "" */ + 0x63, 0x0, 0x82, 0xcf, 0x4a, 0xf4, 0x1d, 0xff, + 0x60, 0xa, 0xff, 0x30, 0xaf, 0x7d, 0xf3, 0xa6, + 0x1, 0xb3, + + /* U+F011 "" */ + 0x0, 0xc, 0x51, 0x0, 0x1d, 0x7d, 0x6e, 0x70, + 0x8d, 0xd, 0x65, 0xf1, 0xc7, 0xd, 0x60, 0xe6, + 0xd7, 0x6, 0x20, 0xe6, 0x9d, 0x0, 0x4, 0xf2, + 0x1e, 0xc7, 0x8f, 0x80, 0x1, 0x9d, 0xc6, 0x0, + + /* U+F013 "" */ + 0x0, 0xc, 0xc0, 0x0, 0x18, 0x8f, 0xf8, 0x81, + 0x8f, 0xfe, 0xef, 0xf8, 0x2f, 0xe0, 0xe, 0xf2, + 0x2f, 0xe0, 0xe, 0xf2, 0x8f, 0xfe, 0xef, 0xf8, + 0x18, 0x8f, 0xf8, 0x81, 0x0, 0xc, 0xc0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x30, 0x22, 0x0, 0x0, 0xaf, 0xaa, + 0xa0, 0x1, 0xda, 0x6a, 0xfa, 0x3, 0xe8, 0xbf, + 0xb8, 0xe3, 0xb6, 0xdf, 0xff, 0xd6, 0xb0, 0x8f, + 0xfb, 0xff, 0x80, 0x8, 0xfc, 0xc, 0xf8, 0x0, + 0x5b, 0x80, 0x8b, 0x50, + + /* U+F019 "" */ + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xf9, 0x0, 0x78, 0x7a, 0xa7, 0x87, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F01C "" */ + 0x5, 0xff, 0xff, 0xf5, 0x1, 0xe3, 0x0, 0x3, + 0xe1, 0xa8, 0x0, 0x0, 0x8, 0xaf, 0xff, 0x60, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x3, 0x2, 0xbf, 0xfb, 0x3f, + 0x2e, 0x91, 0x18, 0xff, 0x9a, 0x0, 0x6c, 0xff, + 0x31, 0x0, 0x24, 0x44, 0x44, 0x42, 0x0, 0x13, + 0xff, 0xc6, 0x0, 0xb9, 0xfe, 0xa5, 0x5b, 0xd1, + 0xf2, 0x8c, 0xc8, 0x10, 0x30, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x9, 0x34, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xab, 0xff, 0x0, 0x4f, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x9, 0x0, 0x34, 0xcf, 0x1, 0xff, 0xff, + 0x1b, 0xff, 0xff, 0x1b, 0xbb, 0xff, 0x1, 0x0, + 0x4f, 0x0, 0x0, 0x1, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x90, 0x23, + 0xb3, 0x34, 0xcf, 0x2, 0xc3, 0xbf, 0xff, 0xf1, + 0xb5, 0x6c, 0xff, 0xff, 0x1b, 0x56, 0xca, 0xbf, + 0xf0, 0x2c, 0x3a, 0x0, 0x4f, 0x2, 0x3b, 0x30, + 0x0, 0x10, 0x5, 0x40, + + /* U+F03E "" */ + 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0x7f, 0xff, 0xff, + 0xf8, 0xcf, 0xb1, 0xbf, 0xfb, 0x5b, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F043 "" */ + 0x0, 0xb4, 0x0, 0x3, 0xfb, 0x0, 0xb, 0xff, + 0x40, 0x6f, 0xff, 0xd0, 0xdf, 0xff, 0xf5, 0xf8, + 0xff, 0xf7, 0xaa, 0x8f, 0xf2, 0x1a, 0xfd, 0x40, + + /* U+F048 "" */ + 0x40, 0x0, 0x2f, 0x20, 0x8f, 0xf2, 0x9f, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xf2, + 0x2e, 0xfb, 0x10, 0x19, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0xd, 0xa1, 0x0, 0x0, 0xff, + 0xf7, 0x0, 0xf, 0xff, 0xfd, 0x40, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xd4, + 0xf, 0xff, 0x70, 0x0, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x9b, 0x90, 0x9b, 0x9f, 0xff, 0xf, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, 0xff, + 0xf2, 0x42, 0x2, 0x42, + + /* U+F04D "" */ + 0x24, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F051 "" */ + 0x20, 0x0, 0x4f, 0x80, 0x2f, 0xff, 0x92, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xfd, + 0x22, 0xf9, 0x10, 0x1b, + + /* U+F052 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0x50, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x58, + 0x88, 0x88, 0x50, 0xf, 0xff, 0xff, 0xff, 0x0, + 0xab, 0xbb, 0xbb, 0xa0, + + /* U+F053 "" */ + 0x0, 0x6, 0x20, 0x7, 0xf4, 0x7, 0xf5, 0x5, + 0xf6, 0x0, 0x1e, 0xb0, 0x0, 0x2e, 0xb0, 0x0, + 0x2e, 0x60, 0x0, 0x10, + + /* U+F054 "" */ + 0x26, 0x0, 0x4, 0xf7, 0x0, 0x5, 0xf7, 0x0, + 0x6, 0xf5, 0x0, 0xbe, 0x10, 0xbe, 0x20, 0x6e, + 0x20, 0x0, 0x10, 0x0, + + /* U+F067 "" */ + 0x0, 0x4, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x4f, 0x40, 0x7, 0x8a, 0xfa, 0x87, 0xef, 0xff, + 0xff, 0xe0, 0x4, 0xf4, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x1, 0xb1, 0x0, + + /* U+F068 "" */ + 0x78, 0x88, 0x88, 0x7e, 0xff, 0xff, 0xfe, + + /* U+F06E "" */ + 0x0, 0x8c, 0xcc, 0x80, 0x1, 0xdd, 0x16, 0x3d, + 0xd1, 0xcf, 0x55, 0xed, 0x5f, 0xcb, 0xf5, 0xdf, + 0xd5, 0xfc, 0x1d, 0xd3, 0x73, 0xdd, 0x10, 0x8, + 0xdc, 0xc8, 0x10, + + /* U+F070 "" */ + 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x8c, + 0xcc, 0xa2, 0x0, 0x0, 0x2d, 0xb4, 0x49, 0xf4, + 0x0, 0x7a, 0x1a, 0xff, 0x3f, 0xe1, 0x7, 0xfa, + 0x6, 0xf7, 0xff, 0x10, 0xa, 0xf3, 0x3, 0xef, + 0x40, 0x0, 0x6, 0xcc, 0x71, 0xbb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x89, + + /* U+F071 "" */ + 0x0, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xfc, 0xf6, 0x0, + 0x0, 0x0, 0xed, 0xd, 0xe0, 0x0, 0x0, 0x8f, + 0xe0, 0xef, 0x80, 0x0, 0x2f, 0xff, 0x6f, 0xff, + 0x20, 0xb, 0xff, 0xe2, 0xef, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xd0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x20, 0x44, 0x0, 0x4, 0xf5, + 0xef, 0xb1, 0xcf, 0xfd, 0x1, 0x8c, 0xd1, 0xc1, + 0x1, 0xdc, 0x81, 0xc1, 0xef, 0xc1, 0xbf, 0xfd, + 0x44, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x20, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, 0x0, 0x4, + 0xfc, 0xf4, 0x4, 0xf8, 0x8, 0xf4, 0xb8, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x8b, 0x4f, + 0x80, 0x8f, 0x40, 0x4f, 0xcf, 0x40, 0x0, 0x4e, + 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x94, 0x14, 0x44, 0x40, 0x0, 0xbf, 0xf8, + 0xbb, 0xbf, 0x10, 0x8, 0xb7, 0x60, 0x0, 0xe1, + 0x0, 0xb, 0x40, 0x0, 0x1e, 0x20, 0x0, 0xb7, + 0x44, 0x5e, 0xfd, 0x50, 0x7, 0xbb, 0xb8, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F07B "" */ + 0xdf, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F093 "" */ + 0x0, 0x9, 0x90, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x78, 0x4f, 0xf4, 0x87, + 0xff, 0xe8, 0x8e, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xea, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, + 0x0, 0x1d, 0xe0, 0x7, 0xdc, 0x4d, 0xf3, 0x0, + 0xef, 0xff, 0xe3, 0x0, 0xa, 0xec, 0x70, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x3, 0x0, 0x0, 0x0, 0xcd, 0xc0, 0x2d, 0xc0, + 0xe7, 0xf2, 0xee, 0x20, 0x4b, 0xff, 0xe2, 0x0, + 0x4, 0xff, 0xa0, 0x0, 0xcd, 0xf9, 0xf9, 0x0, + 0xe7, 0xe0, 0x7f, 0x90, 0x4a, 0x40, 0x4, 0x50, + + /* U+F0C5 "" */ + 0x0, 0xff, 0xf7, 0x47, 0x4f, 0xff, 0x47, 0xf8, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, 0x78, 0x88, + 0x7f, 0xff, 0xff, 0x0, + + /* U+F0C7 "" */ + 0x24, 0x44, 0x41, 0xf, 0xbb, 0xbb, 0xe2, 0xf0, + 0x0, 0xf, 0xdf, 0x44, 0x44, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xd5, 0xdf, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0xf, 0xff, 0xff, 0xff, 0x1, + 0x11, 0x11, 0x5, 0x55, 0x55, 0x55, 0xcc, 0xcc, + 0xcc, 0xc0, 0x11, 0x11, 0x10, 0xff, 0xff, 0xff, + 0xf0, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0xdf, 0xff, 0xff, 0xfd, 0x9f, 0xff, 0xff, 0xf9, + 0xb7, 0xff, 0xff, 0x7b, 0xfe, 0x7c, 0xc7, 0xef, + 0xff, 0xfa, 0xaf, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F0E7 "" */ + 0x7, 0xff, 0x60, 0x0, 0xaf, 0xf2, 0x0, 0xc, + 0xff, 0x87, 0x0, 0xef, 0xff, 0xb0, 0x7, 0x8e, + 0xf2, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x6, 0x50, 0x0, + + /* U+F0EA "" */ + 0x79, 0xb9, 0x70, 0xf, 0xfc, 0xff, 0x0, 0xff, + 0x68, 0x83, 0xf, 0xf8, 0xff, 0x8b, 0xff, 0x8f, + 0xf8, 0x8f, 0xf8, 0xff, 0xff, 0x78, 0x8f, 0xff, + 0xf0, 0x7, 0xff, 0xff, + + /* U+F0F3 "" */ + 0x0, 0xd, 0x0, 0x0, 0x4e, 0xfe, 0x30, 0xd, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0x3b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x60, 0x4, 0xf4, 0x0, + + /* U+F11C "" */ + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x18, 0x81, 0x88, + 0x1f, 0xfe, 0xaa, 0xca, 0xae, 0xff, 0xea, 0xac, + 0xaa, 0xef, 0xf1, 0x80, 0x0, 0x81, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xc0, 0x0, 0x0, 0x5c, 0xff, 0xb0, 0x0, + 0x6e, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, 0xfc, + 0x0, 0x6, 0x88, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0x60, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xff, 0xf8, 0xb0, 0xff, 0xf8, 0xfb, 0xff, 0xfc, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+F1EB "" */ + 0x0, 0x4, 0x77, 0x40, 0x0, 0x9, 0xff, 0xcc, + 0xff, 0x90, 0xcd, 0x40, 0x0, 0x4, 0xdc, 0x20, + 0x4b, 0xff, 0xb4, 0x2, 0x1, 0xfa, 0x55, 0xaf, + 0x10, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, + + /* U+F240 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0xee, 0x5f, 0xf8, + 0xff, 0xff, 0xff, 0x2f, 0xf5, 0x66, 0x66, 0x66, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F241 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0x70, 0x5f, 0xf8, + 0xff, 0xff, 0x80, 0x2f, 0xf5, 0x66, 0x66, 0x54, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F242 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xe0, 0x0, 0x5f, 0xf8, + 0xff, 0xf0, 0x0, 0x2f, 0xf5, 0x66, 0x64, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F243 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xe7, 0x0, 0x0, 0x5f, 0xf8, + 0xf8, 0x0, 0x0, 0x2f, 0xf5, 0x65, 0x44, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F244 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xd8, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x44, 0x44, 0x44, + 0xad, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd8, 0x0, 0x0, 0x0, 0x7, 0x36, 0x40, 0x0, + 0x9, 0xb1, 0x91, 0x11, 0x17, 0x20, 0xef, 0x88, + 0xd8, 0x88, 0xd9, 0x2, 0x20, 0x6, 0x48, 0x70, + 0x0, 0x0, 0x0, 0x6, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x6, 0xdd, 0xc3, 0x4, 0xff, 0x3e, 0xd0, 0x9c, + 0xb5, 0x5f, 0x2b, 0xf7, 0x1a, 0xf4, 0xbf, 0x81, + 0xbf, 0x39, 0xc9, 0x64, 0xf2, 0x4f, 0xf3, 0xde, + 0x0, 0x6d, 0xed, 0x30, + + /* U+F2ED "" */ + 0x78, 0xdf, 0xd8, 0x77, 0x88, 0x88, 0x87, 0x8f, + 0xff, 0xff, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, + 0xcc, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, 0xcc, + 0x85, 0xff, 0xff, 0xf5, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x7e, 0x30, 0x0, 0x0, 0x4b, + 0xfe, 0x0, 0x0, 0x8f, 0x9b, 0x70, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xb, 0xff, 0x9c, + 0xc9, 0xff, 0xaf, 0xff, 0xc1, 0x1c, 0xff, 0xaf, + 0xff, 0xc1, 0x1c, 0xff, 0xb, 0xff, 0x9c, 0xc9, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfc, + + /* U+F7C2 "" */ + 0x7, 0xff, 0xfe, 0x17, 0xb6, 0x27, 0xc3, 0xfe, + 0xb9, 0xbe, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0xff, 0xe1, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x23, 0x0, 0x2, + 0xf0, 0x2e, 0x92, 0x22, 0x5f, 0xd, 0xff, 0xff, + 0xff, 0xf0, 0x2e, 0x92, 0x22, 0x21, 0x0, 0x23, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 82, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 106, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 116, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 121, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 141, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 162, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 175, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 188, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 203, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 242, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 268, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 272, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 278, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 299, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 312, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 325, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 349, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 382, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 397, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 428, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 456, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 476, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 489, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 504, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 550, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 568, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 604, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 660, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 678, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 716, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 749, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 760, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 785, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 793, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 795, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 797, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 825, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 835, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 850, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 860, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 885, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 900, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 917, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 932, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 938, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 974, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 989, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1002, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1010, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1018, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1028, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1038, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1066, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1091, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1099, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1110, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1117, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1128, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1133, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1138, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1141, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1177, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1201, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1233, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1257, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1275, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1307, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1339, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1375, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1407, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1434, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1474, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1488, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1509, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1545, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 88, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1593, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1613, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1648, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1676, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1704, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1724, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1760, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1780, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1800, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1828, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1835, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1862, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1950, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1982, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2003, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2024, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2063, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2119, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2192, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2220, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2248, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2276, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2300, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2328, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2356, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2384, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2411, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2461, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2485, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2525, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2555, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2585, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2615, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2645, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2675, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2719, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2747, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2775, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2816, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2846, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2874, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 3, -3, 0, 0, + 0, 0, -7, -8, 1, 6, 3, 2, + -5, 1, 6, 0, 5, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -4, 0, 0, 0, 0, + 0, -3, 2, 3, 0, 0, -1, 0, + -1, 1, 0, -1, 0, -1, -1, -3, + 0, 0, 0, 0, -1, 0, 0, -2, + -2, 0, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, -2, 0, -3, 0, -15, 0, + 0, -3, 0, 3, 4, 0, 0, -3, + 1, 1, 4, 3, -2, 3, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -2, -6, 0, -5, + -1, 0, 0, 0, 0, 0, 5, 0, + -4, -1, 0, 0, 0, -2, 0, 0, + -1, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -1, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 1, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 4, -1, 0, 0, 3, -1, + -4, -18, 1, 3, 3, 0, -2, 0, + 5, 0, 4, 0, 4, 0, -12, 0, + -2, 4, 0, 4, -1, 3, 1, 0, + 0, 0, -1, 0, 0, -2, 10, 0, + 10, 0, 4, 0, 5, 2, 2, 4, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, -1, 0, 1, -2, -2, -3, 1, + 0, -1, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, -8, 0, 0, 0, + 0, -1, 0, 13, -2, -2, 1, 1, + -1, 0, -2, 1, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 8, 0, 0, -5, 0, + 4, 0, -9, -12, -9, -3, 4, 0, + 0, -9, 0, 2, -3, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 4, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -1, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -3, -3, 0, -3, + -4, -4, -2, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 0, 0, 1, + -1, 0, 0, 0, -1, 1, 1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -2, 0, 0, -1, 0, 4, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -4, + -1, -4, 3, 0, 0, -3, 1, 3, + 3, 0, -3, 0, -2, 0, 0, -6, + 1, -1, 1, -7, 1, 0, 0, 0, + -7, 0, -7, -1, -11, -1, 0, -6, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -2, -2, 0, -4, 0, + 0, 0, -1, 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, -1, -2, -1, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 1, 0, 0, -2, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -1, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + -2, 0, 4, -1, 0, -4, 0, 0, + 3, -6, -7, -5, -3, 1, 0, -1, + -8, -2, 0, -2, 0, -3, 2, -2, + -8, 0, -3, 0, 0, 1, 0, 1, + -1, 0, 1, 0, -4, -5, 0, -6, + -3, -3, -3, -4, -2, -3, 0, -2, + -3, 1, 0, 0, 0, -1, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, 0, 0, -1, 0, -2, -3, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -2, 0, 0, 0, 0, -6, -4, 0, + 0, 0, -2, -6, 0, 0, -1, 1, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, -2, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, 0, -1, 0, -2, -1, + 0, -3, -3, -4, -1, 0, -3, 0, + -4, 0, 0, 0, 0, 10, 0, 0, + 1, 0, 0, -2, 0, 1, 0, -6, + 0, 0, 0, 0, 0, -12, -2, 4, + 4, -1, -5, 0, 1, -2, 0, -6, + -1, -2, 1, -9, -1, 2, 0, 2, + -4, -2, -5, -4, -5, 0, 0, -8, + 0, 7, 0, 0, -1, 0, 0, 0, + -1, -1, -1, -3, -4, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -1, -1, -2, 0, 0, + -3, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -3, 1, -1, 0, -3, + -1, 0, -2, -1, -1, 0, -2, -2, + 0, 0, -1, 0, -1, -2, -2, 0, + 0, -1, 0, 1, -1, 0, -3, 0, + 0, 0, -3, 0, -2, 0, -2, -2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 1, 0, -2, 0, -1, -2, + -4, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 5, 0, 0, -3, 0, + -1, 3, 0, -1, -5, -2, 2, 0, + 0, -6, -2, 1, -2, 1, 0, -1, + -1, -4, 0, -2, 1, 0, 0, -2, + 0, 0, 0, 1, 1, -3, -2, 0, + -2, -1, -2, -1, -1, 0, -2, 1, + -2, -2, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -1, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -4, 0, + 1, -3, 3, 0, -1, -6, 0, 0, + -3, -1, 0, -5, -3, -4, 0, 0, + -6, -1, -5, -5, -6, 0, -3, 0, + 1, 9, -2, 0, -3, -1, 0, -1, + -2, -3, -2, -5, -5, -3, -1, 0, + 0, -1, 0, 0, 0, 0, -9, -1, + 4, 3, -3, -5, 0, 0, -4, 0, + -6, -1, -1, 3, -12, -2, 0, 0, + 0, -8, -2, -7, -1, -9, 0, 0, + -9, 0, 8, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -5, -1, 0, -8, + 0, 0, 0, 0, -4, 0, -1, 0, + 0, -4, -6, 0, 0, -1, -2, -4, + -1, 0, -1, 0, 0, 0, 0, -6, + -1, -4, -4, -1, -2, -3, -1, -2, + 0, -3, -1, -4, -2, 0, -2, -2, + -1, -2, 0, 1, 0, -1, -4, 0, + 3, 0, -2, 0, 0, 0, 0, 2, + 0, 1, -3, 5, 0, -1, -1, -2, + 0, 0, 0, 0, 0, 0, -4, 0, + -1, 0, -2, -1, 0, -3, -3, -4, + -1, 0, -3, 1, 5, 0, 0, 0, + 0, 10, 0, 0, 1, 0, 0, -2, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -1, -1, 0, 0, -3, + -1, 0, 0, -3, 0, 2, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -4, + -2, 0, 4, -4, -4, -3, -3, 5, + 2, 1, -11, -1, 3, -1, 0, -1, + 1, -1, -4, 0, -1, 1, -2, -1, + -4, -1, 0, 0, 4, 3, 0, -4, + 0, -7, -2, 4, -2, -5, 0, -2, + -4, -4, -1, 5, 1, 0, -2, 0, + -3, 0, 1, 4, -3, -5, -5, -3, + 4, 0, 0, -9, -1, 1, -2, -1, + -3, 0, -3, -5, -2, -2, -1, 0, + 0, -3, -3, -1, 0, 4, 3, -1, + -7, 0, -7, -2, 0, -4, -7, 0, + -4, -2, -4, -4, 3, 0, 0, -2, + 0, -3, -1, 0, -1, -2, 0, 2, + -4, 1, 0, 0, -7, 0, -1, -3, + -2, -1, -4, -3, -4, -3, 0, -4, + -1, -3, -2, -4, -1, 0, 0, 0, + 6, -2, 0, -4, -1, 0, -1, -3, + -3, -3, -4, -5, -2, -3, 3, 0, + -2, 0, -6, -2, 1, 3, -4, -5, + -3, -4, 4, -1, 1, -12, -2, 3, + -3, -2, -5, 0, -4, -5, -2, -1, + -1, -1, -3, -4, 0, 0, 0, 4, + 4, -1, -8, 0, -8, -3, 3, -5, + -9, -3, -4, -5, -6, -4, 3, 0, + 0, 0, 0, -2, 0, 0, 1, -2, + 3, 1, -2, 3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 1, 4, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 5, 0, 2, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -1, 2, 0, 4, + 0, 0, 13, 2, -3, -3, 1, 1, + -1, 0, -6, 0, 0, 6, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 5, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -3, 0, + 0, 0, 0, 0, 1, 17, -3, -1, + 4, 3, -3, 1, 0, 0, 1, 1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + -3, -1, 0, 0, 0, -3, 0, -2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, 0, -2, 0, + -3, 0, 0, 0, -2, 1, -2, 0, + 0, -3, -1, -3, 0, 0, -3, 0, + -1, 0, -6, 0, -1, 0, 0, -10, + -2, -5, -1, -5, 0, 0, -9, 0, + -3, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, -1, -2, 0, 0, + 0, 0, -3, 0, -3, 2, -1, 3, + 0, -1, -3, -1, -2, -2, 0, -2, + -1, -1, 1, -3, 0, 0, 0, 0, + -11, -1, -2, 0, -3, 0, -1, -6, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -2, -1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -3, 0, -1, 0, 0, 0, -3, + 1, 0, 0, 0, -3, -1, -3, 0, + 0, -4, 0, -1, 0, -6, 0, 0, + 0, 0, -12, 0, -3, -5, -6, 0, + 0, -9, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -2, -1, + -2, 0, 0, 0, 2, -2, 0, 4, + 6, -1, -1, -4, 2, 6, 2, 3, + -3, 2, 5, 2, 4, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 6, -2, -1, 0, -1, + 10, 6, 10, 0, 0, 0, 1, 0, + 0, 5, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -11, -2, -1, -5, + -6, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -11, -2, -1, + -5, -6, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -3, 1, 0, -1, + 1, 2, 1, -4, 0, 0, -1, 1, + 0, 1, 0, 0, 0, 0, -3, 0, + -1, -1, -3, 0, -1, -5, 0, 8, + -1, 0, -3, -1, 0, -1, -2, 0, + -1, -4, -3, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -11, + -2, -1, -5, -6, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -4, -2, -1, 4, -1, -1, + -5, 0, -1, 0, -1, -3, 0, 3, + 0, 1, 0, 1, -3, -5, -2, 0, + -5, -2, -3, -5, -5, 0, -2, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, 0, 0, + -3, 0, -1, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -2, + -1, 1, 0, -2, -2, -1, 0, -4, + -1, -3, -1, -2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, -1, 0, 0, + -1, 0, 0, -1, 0, -3, 0, 0, + 5, -2, -4, -4, 1, 1, 1, 0, + -4, 1, 2, 1, 4, 1, 4, -1, + -3, 0, 0, -5, 0, 0, -4, -3, + 0, 0, -3, 0, -2, -2, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -4, + -1, 5, 0, 0, -1, 0, -3, 0, + 0, 2, -3, 0, 1, -1, 1, 0, + 0, -4, 0, -1, 0, 0, -1, 1, + -1, 0, 0, 0, -5, -2, -3, 0, + -4, 0, 0, -6, 0, 5, -1, 0, + -2, 0, 1, 0, -1, 0, -1, -4, + 0, -1, 1, 0, 0, 0, 0, -1, + 0, 0, 1, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 3, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 0, -8, -7, 0, + 6, 4, 2, -5, 1, 5, 0, 5, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_8 = { +#else +lv_font_t lv_font_montserrat_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 10, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_8*/ diff --git a/libraries/lvgl/src/font/lv_font_simsun_16_cjk.c b/libraries/lvgl/src/font/lv_font_simsun_16_cjk.c new file mode 100644 index 0000000..d791058 --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_simsun_16_cjk.c @@ -0,0 +1,23772 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font SimSun.woff -r 0x20-0x7f --symbols (),盗提陽帯鼻画輕ッ冊ェル写父ぁフ結想正四O夫源庭場天續鳥れ講猿苦階給了製守8祝己妳薄泣塩帰ぺ吃変輪那着仍嗯爭熱創味保字宿捨準查達肯ァ薬得査障該降察ね網加昼料等図邪秋コ態品屬久原殊候路願楽確針上被怕悲風份重歡っ附ぷ既4黨價娘朝凍僅際洋止右航よ专角應酸師個比則響健昇豐筆歷適修據細忙跟管長令家ザ期般花越ミ域泳通些油乏ラ。營ス返調農叫樹刊愛間包知把ヤ貧橋拡普聞前ジ建当繰ネ送習渇用補ィ覺體法遊宙ョ酔余利壊語くつ払皆時辺追奇そ們只胸械勝住全沈力光ん深溝二類北面社值試9和五勵ゃ貿幾逐打課ゲて領3鼓辦発評1渉詳暇込计駄供嘛郵頃腦反構絵お容規借身妻国慮剛急乗静必議置克土オ乎荷更肉還混古渡授合主離條値決季晴東大尚央州が嗎験流先医亦林田星晩拿60旅婦量為痛テ孫う環友況玩務其ぼち揺坐一肩腰犯タょ希即果ぶ物練待み高九找やヶ都グ去」サ、气仮雑酒許終企笑録形リ銀切ギ快問滿役単黄集森毎實研喜蘇司鉛洲川条媽ノ才兩話言雖媒出客づ卻現異故り誌逮同訊已視本題ぞを横開音第席費持眾怎選元退限ー賽処喝就残無いガ多ケ沒義遠歌隣錢某雪析嬉採自透き側員予ゼ白婚电へ顯呀始均畫似懸格車騒度わ親店週維億締慣免帳電甚來園浴ゅ愈京と杯各海怒ぜ排敗挙老買7極模実紀ヒ携隻告シ並屋這孩讓質ワブ富賃争康由辞マ火於短樣削弟材注節另室ダ招擁ぃ若套底波行勤關著泊背疲狭作念推ぐ民貸祖介說ビ代温契你我レ入描變再札ソ派頭智遅私聽舉灣山伸放直安ト誕煙付符幅ふ絡她届耳飲忘参革團仕様載ど歩獲嫌息の汚交興魚指資雙與館初学年幸史位柱族走括び考青也共腕Lで販擔理病イ今逃當寺猫邊菓係ム秘示解池影ド文例斷曾事茶寫明科桃藝売便え導禁財飛替而亡到し具空寝辛業ウ府セ國何基菜厳市努張缺雲根外だ断万砂ゴ超使台实ぽ礼最慧算軟界段律像夕丈窓助刻月夏政呼ぴざ擇趣除動従涼方勉名線対存請子氏將5少否諸論美感或西者定食御表は參歳緑命進易性錯房も捕皿判中觀戦ニ緩町ピ番ず金千ろ?不た象治関ャ每看徒卒統じ手範訪押座步号ベ旁以母すほ密減成往歲件緒読歯效院种七謂凝濃嵌震喉繼クュ拭死円2積水欲如ポにさ寒道區精啦姐ア聯能足及停思壓2春且メ裏株官答概黒過氷柿戻厚ぱ党祭織引計け委暗複誘港バ失下村較続神ぇ尤強秀膝兒来績十書済化服破新廠1紹您情半式產系好教暑早め樂地休協良な哪常要揮周かエ麗境働避護ンツ香夜太見設非改広聲他検求危清彼經未在起葉控靴所差內造寄南望尺換向展備眠點完約ぎ裡分説申童優伝島机須塊日立拉,鉄軽單気信很転識支布数紙此迎受心輸坊モ處「訳三曇兄野顔戰增ナ伊列又髪両有取左毛至困吧昔赤狀相夠整別士経頼然簡ホ会發隨営需脱ヨば接永居冬迫圍甘醫誰部充消連弱宇會咲覚姉麼的増首统帶糖朋術商担移景功育庫曲總劃牛程駅犬報ロ學責因パ嚴八世後平負公げ曜陸專午之閉ぬ談ご災昨冷職悪謝對它近射敢意運船臉局難什産頗!球真記ま但蔵究制機案湖臺ひ害券男留内木驗雨施種特復句末濟キ色訴依せ百型る石牠討呢时任執飯歐宅組傳配小活ゆべ暖ズ漸站素らボ束価チ浅回女片独妹英目從認生違策僕楚ペ米こ掛む爸六状落漢プ投カ校做啊洗声探あ割体項履触々訓技ハ低工映是標速善点人デ口次可 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_simsun_16_cjk.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_SIMSUN_16_CJK + #define LV_FONT_SIMSUN_16_CJK 1 +#endif + +#if LV_FONT_SIMSUN_16_CJK + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x97, 0xb9, 0xa8, 0x97, 0x75, 0x64, 0x53, 0x53, + 0x0, 0x0, 0xa8, 0xb9, + + /* U+0022 "\"" */ + 0x2, 0xe1, 0x98, 0xa, 0xc3, 0xf4, 0x2c, 0xa, + 0x60, 0x81, 0x27, 0x0, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x90, 0x3, 0x50, 0x0, 0x90, 0x4, 0x40, + 0x0, 0x90, 0x6, 0x40, 0x7f, 0xff, 0xff, 0xf6, + 0x13, 0xa3, 0x39, 0x41, 0x0, 0x80, 0x8, 0x0, + 0x1, 0x70, 0x9, 0x0, 0x3, 0x70, 0x9, 0x0, + 0x7f, 0xff, 0xff, 0xf6, 0x17, 0x73, 0x3a, 0x31, + 0x5, 0x30, 0x9, 0x0, 0x6, 0x20, 0x9, 0x0, + + /* U+0024 "$" */ + 0x0, 0x45, 0x0, 0x6, 0xaa, 0x80, 0x48, 0x45, + 0x86, 0x95, 0x45, 0xc7, 0x7b, 0x45, 0x20, 0x1e, + 0xc5, 0x0, 0x2, 0xec, 0x0, 0x0, 0x4f, 0xb0, + 0x0, 0x45, 0xd5, 0x52, 0x45, 0x6a, 0xe7, 0x45, + 0x49, 0xa4, 0x45, 0x74, 0x18, 0x9a, 0x60, 0x0, + 0x45, 0x0, 0x0, 0x45, 0x0, + + /* U+0025 "%" */ + 0x19, 0x80, 0x3, 0x20, 0x82, 0x64, 0x8, 0x0, + 0xb0, 0x47, 0x7, 0x0, 0xc0, 0x48, 0x61, 0x0, + 0xb0, 0x47, 0x70, 0x0, 0x73, 0x76, 0x50, 0x0, + 0x7, 0x67, 0x7, 0x60, 0x0, 0x7, 0x64, 0x64, + 0x0, 0x42, 0xa1, 0x38, 0x0, 0x70, 0xb1, 0x39, + 0x1, 0x50, 0x82, 0x47, 0x5, 0x0, 0x19, 0x91, + + /* U+0026 "&" */ + 0x0, 0x88, 0x50, 0x0, 0x6, 0x40, 0xc0, 0x0, + 0x9, 0x30, 0xd0, 0x0, 0x8, 0x53, 0x90, 0x0, + 0x6, 0x99, 0x10, 0x0, 0x5, 0xf0, 0x2a, 0x80, + 0x18, 0xd4, 0x9, 0x10, 0x84, 0x6a, 0x8, 0x0, + 0xc2, 0xe, 0x38, 0x0, 0xb3, 0x6, 0xe5, 0x0, + 0x6a, 0x0, 0xe9, 0x5, 0x9, 0xc9, 0x2b, 0xc3, + + /* U+0027 "'" */ + 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x30, + 0x1, 0x0, + + /* U+0028 "(" */ + 0x0, 0x6, 0x10, 0x4, 0x60, 0x0, 0xb0, 0x0, + 0x84, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x0, 0x67, + 0x0, 0x8, 0x60, 0x0, 0x77, 0x0, 0x6, 0x80, + 0x0, 0x2c, 0x0, 0x0, 0xc1, 0x0, 0x5, 0x70, + 0x0, 0xa, 0x10, 0x0, 0x19, 0x0, 0x0, 0x21, + + /* U+0029 ")" */ + 0x16, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb0, 0x0, + 0x5, 0x70, 0x0, 0xd, 0x0, 0x0, 0xb3, 0x0, + 0x8, 0x50, 0x0, 0x77, 0x0, 0x8, 0x60, 0x0, + 0x95, 0x0, 0xc, 0x10, 0x1, 0xb0, 0x0, 0x84, + 0x0, 0x29, 0x0, 0x9, 0x0, 0x1, 0x10, 0x0, + + /* U+002A "*" */ + 0x0, 0x7, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, + 0x5d, 0x26, 0x52, 0xd4, 0x18, 0xd6, 0x6d, 0x80, + 0x0, 0x1b, 0xa1, 0x0, 0x8, 0xd6, 0x6d, 0x80, + 0x5d, 0x27, 0x52, 0xd4, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, + + /* U+002B "+" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x39, 0x9a, 0xc9, 0x94, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x3, 0x60, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x0, 0x2, 0x40, 0x0, + + /* U+002C "," */ + 0xb, 0xb0, 0x7, 0xf0, 0x0, 0xc0, 0x8, 0x40, + 0x2, 0x0, + + /* U+002D "-" */ + 0x49, 0x99, 0x99, 0x94, + + /* U+002E "." */ + 0x0, 0xcb, 0xbb, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x71, + 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x5, 0x20, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x44, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x60, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, + 0x0, 0x71, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, + 0x5, 0x30, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x6a, 0x95, 0x0, 0x3, 0xc0, 0xb, 0x30, + 0xb, 0x60, 0x6, 0xa0, 0xf, 0x20, 0x2, 0xf0, + 0x2f, 0x0, 0x1, 0xf1, 0x3f, 0x0, 0x0, 0xf2, + 0x3f, 0x0, 0x0, 0xf2, 0x2f, 0x0, 0x1, 0xf1, + 0xf, 0x20, 0x2, 0xe0, 0xb, 0x50, 0x6, 0xa0, + 0x3, 0xc0, 0xb, 0x30, 0x0, 0x6a, 0x95, 0x0, + + /* U+0031 "1" */ + 0x0, 0x17, 0x0, 0x16, 0xd9, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x79, 0x0, 0x0, 0x79, + 0x0, 0x16, 0xde, 0x72, + + /* U+0032 "2" */ + 0x0, 0x77, 0x89, 0x0, 0x92, 0x0, 0x88, 0xe, + 0x20, 0x4, 0xc0, 0xd5, 0x0, 0x3c, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x93, + 0x0, 0x0, 0x74, 0x0, 0x0, 0x55, 0x0, 0x0, + 0x28, 0x0, 0x6, 0x9, 0x0, 0x1, 0xa2, 0xff, + 0xff, 0xfb, + + /* U+0033 "3" */ + 0x1, 0x77, 0xa5, 0x0, 0xa2, 0x0, 0xd3, 0xd, + 0x40, 0x8, 0x80, 0x10, 0x0, 0x96, 0x0, 0x0, + 0x2c, 0x10, 0x0, 0x8d, 0x20, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x4c, 0x3, 0x0, 0x2, 0xf0, + 0xf4, 0x0, 0x3d, 0xd, 0x30, 0x9, 0x60, 0x28, + 0x78, 0x70, + + /* U+0034 "4" */ + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xac, 0x0, + 0x0, 0x3, 0x8c, 0x0, 0x0, 0x8, 0x4c, 0x0, + 0x0, 0x53, 0x4c, 0x0, 0x0, 0x80, 0x4c, 0x0, + 0x6, 0x20, 0x4c, 0x0, 0x7, 0x0, 0x4c, 0x0, + 0x47, 0x66, 0x8d, 0x62, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x5, 0xaf, 0x71, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xb0, 0x61, 0x0, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x7, 0x5a, + 0xca, 0x0, 0x85, 0x0, 0xa7, 0x1, 0x0, 0x3, + 0xd0, 0x0, 0x0, 0x1f, 0x7, 0x20, 0x1, 0xe0, + 0xf4, 0x0, 0x3c, 0xb, 0x10, 0x9, 0x50, 0x17, + 0x79, 0x80, + + /* U+0036 "6" */ + 0x0, 0x28, 0x7b, 0x20, 0x1, 0xa0, 0xa, 0x80, + 0x9, 0x40, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x1f, 0x2a, 0xbb, 0x10, 0x3f, 0x90, 0x7, 0xa0, + 0x3f, 0x20, 0x0, 0xf0, 0x3f, 0x0, 0x0, 0xe2, + 0x1f, 0x10, 0x0, 0xe2, 0xd, 0x40, 0x0, 0xe0, + 0x6, 0xb0, 0x4, 0x90, 0x0, 0x79, 0x88, 0x0, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xb, 0x30, 0x1, 0x80, 0x60, + 0x0, 0x71, 0x0, 0x0, 0x8, 0x0, 0x0, 0x7, + 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0xf, 0x30, 0x0, 0x2, 0xf3, 0x0, 0x0, 0x1e, + 0x20, 0x0, + + /* U+0038 "8" */ + 0x1, 0x87, 0x78, 0x0, 0xa, 0x20, 0x4, 0x80, + 0xd, 0x0, 0x0, 0xd0, 0xe, 0x20, 0x0, 0xc0, + 0x7, 0xd3, 0x7, 0x50, 0x0, 0x9f, 0xc6, 0x0, + 0x5, 0x72, 0xbe, 0x10, 0xc, 0x0, 0x9, 0xb0, + 0x39, 0x0, 0x0, 0xf0, 0x3a, 0x0, 0x0, 0xe0, + 0xb, 0x10, 0x3, 0x90, 0x1, 0x87, 0x78, 0x0, + + /* U+0039 "9" */ + 0x1, 0x98, 0x86, 0x0, 0xa, 0x40, 0x9, 0x40, + 0x1e, 0x0, 0x4, 0xb0, 0x3c, 0x0, 0x2, 0xf0, + 0x4c, 0x0, 0x1, 0xf1, 0x2e, 0x0, 0x6, 0xf1, + 0xc, 0x70, 0x29, 0xf1, 0x1, 0x99, 0x73, 0xf0, + 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x9, 0x50, + 0xa, 0x80, 0x1c, 0x0, 0x4, 0xb7, 0x91, 0x0, + + /* U+003A ":" */ + 0xc8, 0xb7, 0x0, 0x0, 0x0, 0x0, 0xb7, 0xc8, + + /* U+003B ";" */ + 0xda, 0x64, 0x0, 0x0, 0x0, 0x0, 0x65, 0xda, + 0x56, 0x90, + + /* U+003C "<" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x38, 0x0, 0x2, + 0x90, 0x0, 0x19, 0x0, 0x1, 0xa0, 0x0, 0xa, + 0x10, 0x0, 0xa1, 0x0, 0x0, 0x56, 0x0, 0x0, + 0x6, 0x50, 0x0, 0x0, 0x74, 0x0, 0x0, 0x8, + 0x30, 0x0, 0x0, 0x92, 0x0, 0x0, 0x6, + + /* U+003D "=" */ + 0x49, 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0x99, 0x99, 0x94, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x83, 0x0, 0x0, 0x9, 0x20, + 0x0, 0x0, 0x91, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x1, 0xa0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x65, + 0x0, 0x5, 0x60, 0x0, 0x47, 0x0, 0x3, 0x80, + 0x0, 0x29, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x79, 0xa9, 0x10, 0x8, 0x10, 0x5, 0xb0, + 0x1a, 0x0, 0x0, 0xf1, 0x2f, 0x40, 0x0, 0xf1, + 0x5, 0x10, 0x5, 0xe0, 0x0, 0x0, 0x5d, 0x20, + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xc, 0x80, 0x0, + + /* U+0040 "@" */ + 0x0, 0x38, 0x78, 0x10, 0x2, 0x90, 0x0, 0x90, + 0xa, 0x10, 0x79, 0x64, 0x1b, 0x8, 0x2b, 0x27, + 0x49, 0xa, 0xc, 0x9, 0x58, 0x57, 0xc, 0x8, + 0x58, 0x84, 0xb, 0x8, 0x39, 0x93, 0x39, 0x25, + 0x1b, 0x73, 0x78, 0x70, 0xa, 0x29, 0x3a, 0x41, + 0x3, 0x80, 0x0, 0x72, 0x0, 0x59, 0x88, 0x30, + + /* U+0041 "A" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, 0x44, 0xd1, 0x0, + 0x0, 0x70, 0x95, 0x0, 0x0, 0x80, 0x68, 0x0, + 0x0, 0x80, 0x2c, 0x0, 0x3, 0x96, 0x6f, 0x0, + 0x7, 0x10, 0xc, 0x30, 0x8, 0x0, 0x8, 0x70, + 0x9, 0x0, 0x5, 0xa0, 0x8d, 0x20, 0x9, 0xf5, + + /* U+0042 "B" */ + 0x4e, 0xa6, 0x8a, 0x20, 0xb, 0x50, 0x6, 0xb0, + 0xb, 0x50, 0x2, 0xe0, 0xb, 0x50, 0x3, 0xd0, + 0xb, 0x50, 0xa, 0x50, 0xb, 0x96, 0xb7, 0x0, + 0xb, 0x50, 0x7, 0x90, 0xb, 0x50, 0x0, 0xe2, + 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, + 0xb, 0x50, 0x3, 0xe1, 0x5e, 0xa6, 0x7a, 0x30, + + /* U+0043 "C" */ + 0x0, 0x49, 0x7c, 0xf0, 0x3, 0xb0, 0x0, 0xb2, + 0xc, 0x40, 0x0, 0x25, 0x2f, 0x0, 0x0, 0x0, + 0x6c, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, + 0x7b, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x2, 0xf, 0x20, 0x0, 0x42, + 0x7, 0xa0, 0x1, 0x70, 0x0, 0x7b, 0x98, 0x0, + + /* U+0044 "D" */ + 0x4e, 0xb6, 0x84, 0x0, 0xb, 0x50, 0xa, 0x50, + 0xb, 0x50, 0x3, 0xe0, 0xb, 0x50, 0x0, 0xe3, + 0xb, 0x50, 0x0, 0xd5, 0xb, 0x50, 0x0, 0xc6, + 0xb, 0x50, 0x0, 0xc6, 0xb, 0x50, 0x0, 0xd5, + 0xb, 0x50, 0x0, 0xf2, 0xb, 0x50, 0x3, 0xd0, + 0xb, 0x50, 0xb, 0x40, 0x4e, 0xb6, 0x94, 0x0, + + /* U+0045 "E" */ + 0x3d, 0xb6, 0x6b, 0xc0, 0xa, 0x60, 0x0, 0xb0, + 0xa, 0x60, 0x0, 0x22, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x8b, 0x0, + 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x6, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x3, + 0xa, 0x60, 0x0, 0x63, 0x3d, 0xb6, 0x69, 0xe0, + + /* U+0046 "F" */ + 0x3d, 0xb6, 0x69, 0xf1, 0xa, 0x60, 0x0, 0x65, + 0xa, 0x60, 0x0, 0x5, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x6, 0x0, 0xa, 0xa6, 0x7e, 0x0, + 0xa, 0x60, 0x9, 0x0, 0xa, 0x60, 0x5, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x68, 0x9f, 0x50, 0x4, 0x90, 0x4, 0x80, + 0xd, 0x10, 0x0, 0x70, 0x3c, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x29, 0xb4, 0x6a, 0x0, 0x5, 0xb0, + 0x4d, 0x0, 0x5, 0xb0, 0xe, 0x10, 0x5, 0xb0, + 0x7, 0x80, 0x6, 0xb0, 0x0, 0x88, 0x77, 0x20, + + /* U+0048 "H" */ + 0x4f, 0x80, 0x9, 0xf4, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x76, 0x68, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0xe, 0x20, 0x3, 0xd0, + 0xe, 0x20, 0x3, 0xd0, 0x5f, 0x90, 0x9, 0xf4, + + /* U+0049 "I" */ + 0x36, 0xcc, 0x63, 0x0, 0x88, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, + 0x0, 0x36, 0xcc, 0x63, + + /* U+004A "J" */ + 0x0, 0x36, 0xbd, 0x64, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x1, 0x0, 0x87, 0x0, + 0x5d, 0x0, 0xb2, 0x0, 0x1b, 0x77, 0x40, 0x0, + + /* U+004B "K" */ + 0x4e, 0xa1, 0x2c, 0xb2, 0xb, 0x50, 0x9, 0x0, + 0xb, 0x50, 0x62, 0x0, 0xb, 0x51, 0x60, 0x0, + 0xb, 0x5a, 0x10, 0x0, 0xb, 0x9d, 0x60, 0x0, + 0xb, 0xa3, 0xd0, 0x0, 0xb, 0x50, 0xd3, 0x0, + 0xb, 0x50, 0x6a, 0x0, 0xb, 0x50, 0xe, 0x10, + 0xb, 0x50, 0x9, 0x70, 0x4e, 0xa1, 0xa, 0xf5, + + /* U+004C "L" */ + 0x2c, 0xc3, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x8, 0x80, 0x0, 0x4, + 0x8, 0x80, 0x0, 0x63, 0x3c, 0xc6, 0x69, 0xf0, + + /* U+004D "M" */ + 0x7f, 0x0, 0x4, 0xf6, 0x1f, 0x30, 0x7, 0xf0, + 0x1c, 0x60, 0x6, 0xf0, 0x19, 0x90, 0x6, 0xf0, + 0x16, 0xc0, 0x14, 0xf0, 0x15, 0xd0, 0x51, 0xf0, + 0x15, 0xb3, 0x60, 0xf0, 0x15, 0x86, 0x60, 0xf0, + 0x15, 0x49, 0x60, 0xf0, 0x15, 0x1e, 0x40, 0xf0, + 0x15, 0xe, 0x10, 0xf0, 0x7a, 0x9, 0x6, 0xf6, + + /* U+004E "N" */ + 0x5f, 0x40, 0x4, 0xc6, 0xb, 0xc0, 0x0, 0x60, + 0x6, 0xd3, 0x0, 0x60, 0x6, 0x6a, 0x0, 0x60, + 0x6, 0xe, 0x20, 0x60, 0x6, 0x8, 0x90, 0x60, + 0x6, 0x1, 0xe1, 0x60, 0x6, 0x0, 0x98, 0x60, + 0x6, 0x0, 0x2e, 0x60, 0x6, 0x0, 0xb, 0xc0, + 0x6, 0x0, 0x3, 0xd0, 0x6c, 0x40, 0x0, 0x90, + + /* U+004F "O" */ + 0x0, 0x68, 0x87, 0x0, 0x5, 0x90, 0x6, 0x70, + 0xd, 0x20, 0x0, 0xe0, 0x2e, 0x0, 0x0, 0xd3, + 0x5c, 0x0, 0x0, 0xb6, 0x6c, 0x0, 0x0, 0xa8, + 0x6c, 0x0, 0x0, 0xa8, 0x5c, 0x0, 0x0, 0xa7, + 0x2e, 0x0, 0x0, 0xc4, 0xd, 0x20, 0x0, 0xe0, + 0x4, 0x80, 0x5, 0x70, 0x0, 0x57, 0x77, 0x0, + + /* U+0050 "P" */ + 0x3d, 0xb6, 0x79, 0x20, 0xa, 0x60, 0x1, 0xd0, + 0xa, 0x60, 0x0, 0xc4, 0xa, 0x60, 0x0, 0xb5, + 0xa, 0x60, 0x0, 0xd2, 0xa, 0x60, 0x6, 0xa0, + 0xa, 0xa6, 0x76, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xa, 0x60, 0x0, 0x0, 0x4d, 0xb2, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x88, 0x87, 0x0, 0x7, 0x80, 0x6, 0x60, + 0xe, 0x10, 0x0, 0xe0, 0x3d, 0x0, 0x0, 0xd3, + 0x6b, 0x0, 0x0, 0xb6, 0x7b, 0x0, 0x0, 0xb7, + 0x7b, 0x0, 0x0, 0xb7, 0x6b, 0x0, 0x0, 0xb6, + 0x4d, 0x5b, 0x60, 0xd4, 0xf, 0x90, 0xd1, 0xe0, + 0x7, 0x90, 0x9c, 0x80, 0x0, 0x78, 0xbe, 0x0, + 0x0, 0x0, 0xd, 0xe1, 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0x3c, 0xb6, 0x7a, 0x20, 0x9, 0x70, 0x5, 0xc0, + 0x9, 0x70, 0x0, 0xf0, 0x9, 0x70, 0x1, 0xf0, + 0x9, 0x70, 0x8, 0x80, 0x9, 0xa6, 0xc5, 0x0, + 0x9, 0x70, 0xd1, 0x0, 0x9, 0x70, 0x87, 0x0, + 0x9, 0x70, 0x3c, 0x0, 0x9, 0x70, 0xe, 0x20, + 0x9, 0x70, 0x8, 0x70, 0x3c, 0xc2, 0x3, 0xe4, + + /* U+0053 "S" */ + 0x1, 0x77, 0x9f, 0x70, 0xa, 0x0, 0x5, 0x90, + 0x1a, 0x0, 0x0, 0x40, 0x1c, 0x0, 0x0, 0x0, + 0xb, 0xb2, 0x0, 0x0, 0x0, 0x9f, 0x91, 0x0, + 0x0, 0x2, 0xae, 0x20, 0x0, 0x0, 0x7, 0xb0, + 0x0, 0x0, 0x0, 0xe0, 0x35, 0x0, 0x0, 0xd0, + 0xd, 0x10, 0x3, 0x90, 0xe, 0xe8, 0x78, 0x0, + + /* U+0054 "T" */ + 0x1e, 0x8c, 0xb8, 0xe0, 0x54, 0x9, 0x70, 0x53, + 0x40, 0x9, 0x70, 0x3, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, + + /* U+0055 "U" */ + 0x5f, 0x90, 0x4, 0xc4, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xe, 0x20, 0x0, 0x60, + 0xe, 0x20, 0x0, 0x60, 0xc, 0x20, 0x0, 0x50, + 0x8, 0x60, 0x3, 0x40, 0x0, 0x98, 0x86, 0x0, + + /* U+0056 "V" */ + 0x5f, 0x90, 0x5, 0xe4, 0xb, 0x50, 0x0, 0x70, + 0x8, 0x80, 0x4, 0x30, 0x4, 0xb0, 0x7, 0x0, + 0x1, 0xf0, 0x7, 0x0, 0x0, 0xd2, 0x7, 0x0, + 0x0, 0xa6, 0x34, 0x0, 0x0, 0x69, 0x60, 0x0, + 0x0, 0x3c, 0x70, 0x0, 0x0, 0xf, 0x70, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x8, 0x10, 0x0, + + /* U+0057 "W" */ + 0x8d, 0x2b, 0xc0, 0xa8, 0x2b, 0x5, 0x90, 0x50, + 0xd, 0x3, 0xb0, 0x60, 0xd, 0x4, 0xd0, 0x60, + 0xc, 0x17, 0xe0, 0x60, 0xa, 0x37, 0xd1, 0x60, + 0x8, 0x57, 0xa5, 0x40, 0x5, 0x86, 0x89, 0x20, + 0x3, 0xd3, 0x6d, 0x0, 0x1, 0xf1, 0x4d, 0x0, + 0x0, 0xd0, 0x2a, 0x0, 0x0, 0x80, 0x7, 0x0, + + /* U+0058 "X" */ + 0x2c, 0xc1, 0x9, 0xb2, 0x4, 0xb0, 0x6, 0x10, + 0x0, 0xd2, 0x7, 0x0, 0x0, 0x78, 0x43, 0x0, + 0x0, 0x1d, 0x80, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0x8, 0xd2, 0x0, + 0x0, 0x62, 0x79, 0x0, 0x0, 0x80, 0x1e, 0x0, + 0x3, 0x50, 0xa, 0x60, 0x3d, 0x70, 0xb, 0xe4, + + /* U+0059 "Y" */ + 0x4f, 0xa0, 0x7, 0xe4, 0x9, 0x70, 0x2, 0x50, + 0x3, 0xc0, 0x6, 0x0, 0x0, 0xe1, 0x7, 0x0, + 0x0, 0x86, 0x24, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0xd, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4c, 0xb3, 0x0, + + /* U+005A "Z" */ + 0x8, 0xd7, 0x67, 0xf1, 0xb, 0x10, 0x7, 0x90, + 0x3, 0x0, 0xe, 0x20, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x31, + 0xb, 0x50, 0x0, 0xa0, 0x3f, 0x66, 0x6b, 0xb0, + + /* U+005B "[" */ + 0xa9, 0x98, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa9, 0x98, + + /* U+005C "\\" */ + 0xa1, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, 0x2, 0x90, + 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x65, 0x0, + 0x0, 0x1, 0xa0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x9, 0x20, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0x0, 0x4, 0x10, + + /* U+005D "]" */ + 0x89, 0x99, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x99, 0x99, + + /* U+005E "^" */ + 0x2, 0xdd, 0x20, 0x7, 0x1, 0x70, + + /* U+005F "_" */ + 0x66, 0x66, 0x66, 0x66, + + /* U+0060 "`" */ + 0x3c, 0x90, 0x0, 0x43, + + /* U+0061 "a" */ + 0x2, 0x86, 0x68, 0x0, 0xd, 0x20, 0x9, 0x40, + 0x5, 0x0, 0x8, 0x50, 0x0, 0x68, 0x6a, 0x60, + 0xb, 0x50, 0x8, 0x60, 0x3d, 0x0, 0x8, 0x60, + 0x3e, 0x0, 0x9, 0x63, 0x7, 0x97, 0x76, 0xb4, + + /* U+0062 "b" */ + 0x2, 0x10, 0x0, 0x0, 0x4e, 0x30, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0xb, 0x48, 0x9b, 0x10, + 0xb, 0xa0, 0x5, 0xa0, 0xb, 0x40, 0x0, 0xf0, + 0xb, 0x30, 0x0, 0xe1, 0xb, 0x30, 0x0, 0xe1, + 0xb, 0x30, 0x0, 0xe0, 0xb, 0x60, 0x5, 0x80, + 0x8, 0x57, 0x89, 0x0, + + /* U+0063 "c" */ + 0x0, 0x67, 0x69, 0x0, 0x59, 0x0, 0x87, 0xc, + 0x20, 0x4, 0x30, 0xf0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x3, 0x6, 0x80, 0x0, + 0x60, 0x8, 0xa8, 0x80, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x2a, 0xa0, + 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x0, 0x4, 0xa0, 0x0, 0x89, 0x87, 0xa0, + 0x6, 0x80, 0x6, 0xa0, 0xd, 0x20, 0x4, 0xa0, + 0xf, 0x0, 0x4, 0xa0, 0xf, 0x0, 0x4, 0xa0, + 0xe, 0x10, 0x4, 0xa0, 0x7, 0x60, 0x9, 0xa0, + 0x0, 0x99, 0x86, 0xc3, + + /* U+0065 "e" */ + 0x6, 0x87, 0x90, 0x4, 0x70, 0x5, 0xa0, 0xb1, + 0x0, 0xf, 0xe, 0x66, 0x66, 0xb0, 0xe0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x20, 0x5a, 0x0, 0x16, + 0x0, 0x7a, 0x87, 0x0, + + /* U+0066 "f" */ + 0x0, 0x2, 0x76, 0xa2, 0x0, 0xb, 0x0, 0x87, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x6, 0x8d, 0x66, 0x20, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x5, 0x9e, 0x64, 0x0, + + /* U+0067 "g" */ + 0x0, 0x86, 0x88, 0xb6, 0x7, 0x50, 0xb, 0x21, + 0xa, 0x30, 0x9, 0x40, 0x4, 0x80, 0xb, 0x10, + 0x3, 0x86, 0x72, 0x0, 0x8, 0x84, 0x10, 0x0, + 0x3, 0xaa, 0xde, 0x70, 0xc, 0x0, 0x0, 0xe0, + 0xc, 0x0, 0x0, 0xb0, 0x3, 0x86, 0x68, 0x30, + + /* U+0068 "h" */ + 0x3d, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xa, 0x40, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xa, 0x59, 0x9b, 0x10, 0xa, 0xb0, 0x6, 0x70, + 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, + + /* U+0069 "i" */ + 0x0, 0x8a, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x26, 0xc7, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x26, 0xbc, 0x62, + + /* U+006A "j" */ + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x36, 0xe3, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0xb1, 0x73, 0x0, 0xb0, 0x6c, + 0x88, 0x10, + + /* U+006B "k" */ + 0x3c, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x9, 0x50, 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x9, 0x50, 0x4e, 0x70, 0x9, 0x50, 0x63, 0x0, + 0x9, 0x54, 0x70, 0x0, 0x9, 0x7c, 0x80, 0x0, + 0x9, 0xb0, 0xd2, 0x0, 0x9, 0x50, 0x5a, 0x0, + 0x9, 0x50, 0xc, 0x30, 0x2c, 0xa1, 0xb, 0xd3, + + /* U+006C "l" */ + 0x26, 0xb7, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x77, 0x0, 0x0, 0x77, + 0x0, 0x26, 0xbb, 0x62, + + /* U+006D "m" */ + 0x8b, 0x7b, 0x68, 0xc1, 0x3d, 0x6, 0xa0, 0x94, + 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, + 0x3b, 0x6, 0x80, 0x95, 0x3b, 0x6, 0x80, 0x95, + 0x3b, 0x6, 0x80, 0x95, 0x8d, 0x2b, 0xc2, 0xc9, + + /* U+006E "n" */ + 0x3d, 0x58, 0x8a, 0x10, 0xa, 0xa0, 0x6, 0x70, + 0xa, 0x40, 0x4, 0x90, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0xa, 0x40, 0x4, 0xa0, + 0xa, 0x40, 0x4, 0xa0, 0x3d, 0xa0, 0xa, 0xd3, + + /* U+006F "o" */ + 0x0, 0x87, 0x78, 0x0, 0x7, 0x60, 0x6, 0x70, + 0xd, 0x0, 0x0, 0xd0, 0x2c, 0x0, 0x0, 0xd2, + 0x2c, 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd0, + 0x8, 0x50, 0x4, 0x80, 0x0, 0x87, 0x77, 0x0, + + /* U+0070 "p" */ + 0x5e, 0x59, 0x89, 0x10, 0xa, 0xa0, 0x3, 0xc0, + 0xa, 0x40, 0x0, 0xe1, 0xa, 0x40, 0x0, 0xc3, + 0xa, 0x40, 0x0, 0xc2, 0xa, 0x40, 0x0, 0xe0, + 0xa, 0x70, 0x5, 0x90, 0xa, 0x87, 0x8a, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x3d, 0xa2, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x88, 0x74, 0x70, 0x7, 0x60, 0x8, 0x90, + 0xe, 0x0, 0x5, 0x90, 0x1d, 0x0, 0x5, 0x90, + 0x2d, 0x0, 0x5, 0x90, 0xe, 0x0, 0x5, 0x90, + 0x9, 0x40, 0x9, 0x90, 0x1, 0xa9, 0x87, 0x90, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x2a, 0xd3, + + /* U+0072 "r" */ + 0x38, 0xe3, 0x58, 0xd2, 0x0, 0xb7, 0x40, 0x82, + 0x0, 0xb8, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x36, 0xe9, 0x60, 0x0, + + /* U+0073 "s" */ + 0x6, 0x68, 0xe6, 0x46, 0x0, 0x28, 0x59, 0x0, + 0x2, 0xa, 0xd7, 0x10, 0x0, 0x29, 0xe3, 0x40, + 0x0, 0x3b, 0x92, 0x0, 0xa, 0x8e, 0x86, 0x72, + + /* U+0074 "t" */ + 0x0, 0x30, 0x0, 0x0, 0x80, 0x0, 0x5, 0xb0, + 0x0, 0x67, 0xd6, 0x61, 0x2, 0xc0, 0x0, 0x2, + 0xc0, 0x0, 0x2, 0xc0, 0x0, 0x2, 0xc0, 0x0, + 0x1, 0xc0, 0x1, 0x0, 0xd0, 0x6, 0x0, 0x7a, + 0x81, + + /* U+0075 "u" */ + 0x4e, 0x30, 0x1a, 0x90, 0xb, 0x30, 0x5, 0x90, + 0xb, 0x30, 0x5, 0x90, 0xb, 0x30, 0x5, 0x90, + 0xb, 0x30, 0x5, 0x90, 0xa, 0x30, 0x5, 0x90, + 0x8, 0x50, 0xa, 0x90, 0x1, 0xca, 0x96, 0xb3, + + /* U+0076 "v" */ + 0x2c, 0xb1, 0x9, 0xc2, 0x4, 0x90, 0x5, 0x20, + 0x0, 0xd0, 0x7, 0x0, 0x0, 0xb3, 0x7, 0x0, + 0x0, 0x68, 0x42, 0x0, 0x0, 0x1c, 0x60, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x7, 0x30, 0x0, + + /* U+0077 "w" */ + 0x9e, 0x2b, 0xb1, 0xb8, 0x1c, 0x4, 0x80, 0x70, + 0xc, 0x6, 0xb0, 0x60, 0x9, 0x26, 0xc0, 0x60, + 0x6, 0x66, 0xa4, 0x30, 0x2, 0xa4, 0x7b, 0x0, + 0x0, 0xf1, 0x4c, 0x0, 0x0, 0x90, 0x8, 0x0, + + /* U+0078 "x" */ + 0x8, 0xf5, 0x2c, 0x80, 0x0, 0xa5, 0x8, 0x0, + 0x0, 0x2e, 0x81, 0x0, 0x0, 0x9, 0x90, 0x0, + 0x0, 0x9, 0xd0, 0x0, 0x0, 0x44, 0x77, 0x0, + 0x0, 0x80, 0xd, 0x10, 0x2b, 0xb0, 0x2d, 0xc2, + + /* U+0079 "y" */ + 0x2b, 0xd2, 0x1a, 0xb2, 0x2, 0xc0, 0x7, 0x10, + 0x0, 0xc1, 0x8, 0x0, 0x0, 0x66, 0x16, 0x0, + 0x0, 0x1b, 0x61, 0x0, 0x0, 0xb, 0x90, 0x0, + 0x0, 0x5, 0x70, 0x0, 0x0, 0x5, 0x20, 0x0, + 0x2, 0x8, 0x0, 0x0, 0xb, 0xc3, 0x0, 0x0, + + /* U+007A "z" */ + 0xaa, 0x66, 0xe4, 0x90, 0x4, 0xb0, 0x30, 0xd, + 0x20, 0x0, 0x78, 0x0, 0x1, 0xd0, 0x0, 0xa, + 0x50, 0x5, 0x4c, 0x0, 0x9, 0xc9, 0x66, 0xc8, + + /* U+007B "{" */ + 0x0, 0x46, 0x1, 0x80, 0x3, 0x50, 0x4, 0x50, + 0x4, 0x50, 0x4, 0x50, 0x5, 0x40, 0x38, 0x0, + 0x27, 0x0, 0x5, 0x30, 0x4, 0x50, 0x4, 0x50, + 0x4, 0x50, 0x3, 0x50, 0x1, 0x80, 0x0, 0x46, + + /* U+007C "|" */ + 0x21, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, + + /* U+007D "}" */ + 0x64, 0x0, 0x8, 0x10, 0x5, 0x30, 0x5, 0x40, + 0x5, 0x40, 0x5, 0x40, 0x4, 0x50, 0x0, 0x83, + 0x0, 0x72, 0x3, 0x50, 0x5, 0x40, 0x5, 0x40, + 0x5, 0x40, 0x5, 0x30, 0x8, 0x10, 0x64, 0x0, + + /* U+007E "~" */ + 0x4, 0x95, 0x0, 0x0, 0x5, 0xb, 0x30, 0x4, + 0x30, 0x1, 0xc1, 0x41, 0x0, 0x0, 0x3a, 0x50, + + /* U+007F "" */ + + /* U+3001 "、" */ + 0x3, 0x0, 0x0, 0x4d, 0x50, 0x0, 0x4f, 0x40, + 0x0, 0xa8, 0x0, 0x1, 0x0, + + /* U+3002 "。" */ + 0x4, 0x40, 0x74, 0x56, 0x80, 0x8, 0x48, 0x93, + 0x0, 0x0, + + /* U+3005 "々" */ + 0x0, 0x56, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x15, 0x0, 0x5b, 0x86, + 0x58, 0xf1, 0x9, 0x21, 0x0, 0x85, 0x4, 0x0, + 0x0, 0xb, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, + 0x1, 0x0, 0x80, 0x0, 0x0, 0x9, 0xb1, 0x0, + 0x0, 0x0, 0xb, 0xa0, 0x0, 0x0, 0x0, 0x1e, + 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+300C "「" */ + 0xda, 0xa8, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, 0xa0, 0x0, + 0xa0, 0x0, 0xa0, 0x0, + + /* U+300D "」" */ + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, 0x0, 0xa, + 0x0, 0xa, 0x8a, 0xad, + + /* U+3041 "ぁ" */ + 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x5, 0x61, + 0x50, 0x0, 0x2, 0x6b, 0xa8, 0x30, 0x0, 0x0, + 0x7, 0x3, 0x0, 0x0, 0x0, 0x8, 0x7c, 0x78, + 0x20, 0x0, 0x6c, 0x18, 0x0, 0xb0, 0x5, 0x56, + 0x92, 0x0, 0xb0, 0x8, 0x6, 0x80, 0x0, 0xa0, + 0xb, 0x87, 0xa0, 0xa, 0x20, 0x1, 0x20, 0x5, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3042 "あ" */ + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x6b, + 0x40, 0x0, 0x4, 0x8a, 0xea, 0x51, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0xca, 0x73, 0x0, 0x0, 0x4, 0xe6, 0xc1, + 0x29, 0x80, 0x0, 0x6a, 0xa2, 0xa0, 0x0, 0xc1, + 0x6, 0x90, 0xaa, 0x20, 0x0, 0x94, 0xb, 0x0, + 0xd8, 0x0, 0x0, 0xb1, 0x47, 0x3, 0xf3, 0x0, + 0x2, 0xa0, 0x2b, 0x89, 0x4a, 0x0, 0x2b, 0x10, + 0x3, 0x20, 0x0, 0x17, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x40, 0x0, 0x0, + + /* U+3043 "ぃ" */ + 0xa, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, + 0x34, 0x0, 0x9, 0x0, 0x0, 0x7, 0x40, 0x9, + 0x0, 0x0, 0x0, 0xb0, 0xa, 0x3, 0x0, 0x5, + 0xd0, 0x9, 0x93, 0x0, 0x2, 0x60, 0x1, 0xa0, + 0x0, 0x0, 0x0, + + /* U+3044 "い" */ + 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x49, 0x0, 0x0, 0x0, + 0x1a, 0x10, 0x66, 0x0, 0x0, 0x0, 0x2, 0xb0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x76, 0x3, + 0x0, 0x0, 0x20, 0xa3, 0x3c, 0x9, 0x0, 0x0, + 0x1b, 0xf1, 0xa, 0xd7, 0x0, 0x0, 0x0, 0x50, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + + /* U+3046 "う" */ + 0x0, 0x5, 0x86, 0x30, 0x0, 0x0, 0x1, 0xce, + 0x30, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9a, 0x50, 0x0, 0x4a, 0x71, 0xa, 0x41, 0xb9, + 0x10, 0x0, 0x49, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0xa, + 0x30, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x1, + 0xc1, 0x0, 0x0, 0x5, 0xa1, 0x0, 0x0, 0x6, + 0x30, 0x0, 0x0, + + /* U+3047 "ぇ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x81, 0x0, + 0x0, 0x2, 0x71, 0x0, 0x0, 0x5, 0xb6, 0x0, + 0x9, 0x93, 0x93, 0x0, 0x0, 0x5, 0x60, 0x0, + 0x0, 0x39, 0x0, 0x0, 0x3, 0x96, 0x80, 0x0, + 0x4b, 0x0, 0xa0, 0x0, 0x90, 0x0, 0x99, 0xa6, + 0x0, 0x0, 0x0, 0x0, + + /* U+3048 "え" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x60, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x0, 0x3, + 0x78, 0x6d, 0x0, 0x0, 0x2c, 0x81, 0xb, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x5, 0x60, 0x0, 0x0, 0x0, 0x3, 0xd8, 0x10, + 0x0, 0x0, 0x1, 0xb1, 0x3a, 0x0, 0x0, 0x1, + 0xc2, 0x0, 0xc0, 0x0, 0x0, 0xe4, 0x0, 0xb, + 0x44, 0x88, 0x6, 0x0, 0x0, 0x17, 0x75, 0x10, + + /* U+304A "お" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x20, 0x0, 0x10, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0xc, 0x7d, 0x40, 0x6, 0xb4, + 0x29, 0xbe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x4, 0x9a, 0x70, 0x0, 0x0, 0xd, 0xa5, 0x0, + 0x4b, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x8, 0x50, + 0xa, 0x3c, 0x0, 0x0, 0x7, 0x70, 0x9, 0xc, + 0x5, 0x0, 0xc, 0x20, 0x1, 0xbf, 0x5, 0x86, + 0xb7, 0x0, 0x0, 0x4c, 0x0, 0x25, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+304B "か" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x25, 0xcb, 0xac, + 0x20, 0x53, 0x0, 0xb, 0xb6, 0xd0, 0x6, 0x90, + 0x9, 0x50, 0x0, 0x6, 0x60, 0x5, 0x80, 0x0, + 0xe2, 0x0, 0xc, 0x0, 0x8, 0x50, 0x22, 0xb7, + 0x0, 0x66, 0x0, 0xc, 0x10, 0x9, 0xf4, 0x1, + 0xc0, 0x0, 0x2c, 0x0, 0x0, 0x20, 0xc, 0x40, + 0x86, 0xc5, 0x0, 0x0, 0x0, 0x6, 0x0, 0x3f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+304C "が" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0x8, 0x0, 0x3, 0x11, 0x80, 0x0, 0x0, + 0xe, 0x30, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x9a, 0x98, + 0x1, 0x10, 0x0, 0xb, 0xdb, 0xe2, 0x9, 0x70, + 0x84, 0x0, 0x0, 0x5, 0x70, 0x7, 0x60, 0xb, + 0x50, 0x0, 0xc, 0x10, 0xa, 0x30, 0x2, 0xe0, + 0x0, 0x48, 0x0, 0xd, 0x0, 0x43, 0xe3, 0x0, + 0xc1, 0x0, 0x3a, 0x0, 0x1b, 0xf1, 0x9, 0x71, + 0x60, 0xb4, 0x0, 0x0, 0x30, 0xb, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, + + /* U+304D "き" */ + 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x10, + 0x25, 0x0, 0x0, 0x5, 0x99, 0xa1, 0x0, 0x4, + 0x9a, 0xd4, 0x0, 0x10, 0x0, 0x0, 0x3a, 0x2a, + 0x70, 0x0, 0x2, 0x5e, 0xb2, 0x0, 0x0, 0x67, + 0x53, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x5a, 0x0, + 0x7, 0xb9, 0x9b, 0xbe, 0x70, 0x4b, 0x0, 0x0, + 0x18, 0xb0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x70, 0x0, 0x21, 0x0, 0x0, 0x8d, 0xed, 0xa2, + 0x0, + + /* U+304E "ぎ" */ + 0x0, 0x33, 0x0, 0x0, 0x1, 0x78, 0x0, 0x5, + 0xd0, 0x1, 0x20, 0xb5, 0x90, 0x0, 0xa, 0x47, + 0xc4, 0x1, 0x70, 0x0, 0x56, 0xae, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x84, 0x3c, 0x60, 0x0, + 0x0, 0x0, 0x16, 0xf9, 0x10, 0x0, 0x0, 0x1, + 0x77, 0x54, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x7, 0x70, 0x0, 0x0, 0x7, 0xca, 0x9b, 0xbf, + 0x50, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc8, 0x32, 0x58, 0x40, 0x0, 0x0, 0x0, 0x7b, + 0xb9, 0x50, 0x0, 0x0, 0x0, + + /* U+304F "く" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, + 0x0, 0x7d, 0x10, 0x0, 0x3d, 0x10, 0x0, 0x2b, + 0x10, 0x0, 0x2a, 0x0, 0x0, 0x9, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x0, 0x1, 0xa3, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xc, 0x80, 0x0, 0x0, + 0x22, + + /* U+3050 "ぐ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xcb, 0x0, 0x22, + 0x0, 0x0, 0x8a, 0x0, 0x10, 0xc4, 0x0, 0x59, + 0x0, 0x6, 0xa1, 0x10, 0x39, 0x0, 0x0, 0x7, + 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+3051 "け" */ + 0x6, 0x10, 0x0, 0x0, 0xb2, 0x0, 0xb, 0x60, + 0x0, 0x0, 0xc4, 0x0, 0xc, 0x20, 0x0, 0x0, + 0xa3, 0x23, 0xc, 0x0, 0x6, 0x9a, 0xec, 0x95, + 0x48, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x84, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0xa2, 0x10, 0x0, 0x0, + 0xb1, 0x0, 0xa3, 0x60, 0x0, 0x0, 0xc0, 0x0, + 0x87, 0x90, 0x0, 0x1, 0xc0, 0x0, 0x2f, 0x80, + 0x0, 0x8, 0x60, 0x0, 0x8, 0x50, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+3052 "げ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x1, + 0x0, 0x0, 0x0, 0x30, 0x34, 0x5b, 0xc, 0x40, + 0x0, 0x0, 0xe4, 0x9, 0x63, 0xc, 0x30, 0x0, + 0x0, 0xb3, 0x0, 0x20, 0xd, 0x0, 0x0, 0x2, + 0xba, 0xc6, 0x0, 0x48, 0x0, 0x7, 0x98, 0xc5, + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x84, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x84, 0x10, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x76, + 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3c, 0x90, + 0x0, 0x5, 0x80, 0x0, 0x0, 0xd, 0x70, 0x0, + 0x1c, 0x10, 0x0, 0x0, 0x2, 0x10, 0x2, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, + 0x0, 0x0, + + /* U+3053 "こ" */ + 0x0, 0x58, 0x9a, 0xc7, 0x0, 0x0, 0x0, 0x3c, + 0x71, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x3, 0x70, 0x6, 0xcc, 0xcd, + 0xfd, 0x70, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+3054 "ご" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x16, 0xa0, 0x0, 0x32, 0x1, + 0x31, 0xb, 0x56, 0x0, 0x1, 0x7a, 0xdf, 0x90, + 0x16, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x98, 0x42, 0x34, 0x8d, 0x20, 0x0, 0x0, 0x49, + 0xbc, 0xb8, 0x30, 0x0, 0x0, + + /* U+3055 "さ" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x0, 0x5, 0xb0, 0x7, 0x40, 0x0, 0x9, + 0xcc, 0x70, 0x3, 0xaa, 0x8b, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x1, 0x20, 0x3d, 0x0, + 0x7b, 0x99, 0xbb, 0xd7, 0x4a, 0x0, 0x0, 0x1b, + 0x96, 0x70, 0x0, 0x0, 0x1, 0x1d, 0x30, 0x0, + 0x0, 0x0, 0x2a, 0xdc, 0xcd, 0x0, 0x0, 0x0, + 0x22, 0x0, 0x0, + + /* U+3056 "ざ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x25, + 0x0, 0x0, 0x16, 0x5b, 0x0, 0x2d, 0x20, 0x0, + 0x7, 0x81, 0x0, 0x2, 0xc1, 0x6, 0xb0, 0x10, + 0x0, 0x1, 0x6d, 0xb7, 0x0, 0x0, 0x1, 0x67, + 0x77, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0x1, 0x10, 0xd, 0x20, 0x0, + 0x6, 0xba, 0xac, 0xbb, 0xa0, 0x0, 0x2c, 0x0, + 0x0, 0x19, 0xd0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x10, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+3057 "し" */ + 0x7, 0x10, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, + 0x2, 0x90, 0xb, 0x40, 0x0, 0x7a, 0x0, 0x2, + 0xda, 0xad, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, + + /* U+3058 "じ" */ + 0x1a, 0x10, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x86, 0x0, 0xe, 0x0, 0x2a, 0x3c, 0x0, 0x1d, + 0x0, 0x4, 0x90, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x11, 0xd, 0x0, 0x0, + 0x4, 0x80, 0xb, 0x50, 0x1, 0x99, 0x0, 0x2, + 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3059 "す" */ + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x13, 0x57, 0x40, 0x5, 0x57, 0x99, + 0x9e, 0x87, 0x65, 0x50, 0x3, 0x74, 0x10, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xae, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x56, 0xc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x74, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, + 0x0, 0x0, 0x0, + + /* U+305A "ず" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x0, 0x1, 0x40, 0x0, 0x31, 0x6a, 0x0, + 0x0, 0x0, 0x1f, 0x20, 0x0, 0xc3, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0x20, 0x0, 0x0, + 0x24, 0x7e, 0xaa, 0xbc, 0x80, 0x0, 0x7d, 0xb8, + 0x52, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x92, 0xb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+305B "せ" */ + 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x3, 0xc0, 0x0, 0x0, 0x0, 0xb1, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x12, 0x58, + 0xec, 0xd8, 0x7, 0x8a, 0xe9, 0x74, 0x49, 0x0, + 0x0, 0x33, 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xa1, 0x5, 0x96, 0x0, 0x0, 0x0, 0xa, + 0x20, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x3, 0xac, 0xcb, 0x90, 0x0, + + /* U+305C "ぜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x29, 0x4, 0xa3, 0x70, 0x0, + 0xc, 0x40, 0x0, 0xf0, 0x7, 0x10, 0x0, 0x0, + 0xa4, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x21, 0x46, 0xeb, 0xc8, 0x0, 0x5, 0x69, 0xdb, + 0x96, 0x4b, 0x0, 0x0, 0x0, 0x55, 0x29, 0x20, + 0x1, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x92, 0x4, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x1c, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xad, 0xdd, 0xc4, + 0x0, 0x0, + + /* U+305D "そ" */ + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x1, 0x56, + 0x98, 0x9e, 0x0, 0x0, 0x8, 0x60, 0x3d, 0x40, + 0x0, 0x0, 0x0, 0x5a, 0x10, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x2, 0x0, 0x4, 0x82, 0x48, 0xcc, + 0xa6, 0x2c, 0xe9, 0x85, 0xa4, 0x0, 0x1, 0x62, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd9, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x80, 0x0, + + /* U+305E "ぞ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0x30, 0x17, 0x90, 0x0, 0x57, + 0x88, 0x5d, 0x90, 0x96, 0x52, 0x0, 0x15, 0x11, + 0xb4, 0x0, 0x9, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x35, + 0x30, 0x0, 0x1, 0x85, 0x58, 0xbd, 0x97, 0x50, + 0x0, 0x4e, 0xc8, 0x35, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, + 0x0, 0x0, + + /* U+305F "た" */ + 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, 0x34, 0x70, + 0x0, 0x0, 0x14, 0x5d, 0xc9, 0x20, 0x1, 0x0, + 0x4, 0x5c, 0x0, 0x38, 0x8c, 0xd1, 0x0, 0x39, + 0x0, 0x0, 0x68, 0x30, 0x0, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x3, 0x0, 0x0, 0x0, 0x9, 0x50, + 0x8, 0x0, 0x0, 0x0, 0x2d, 0x0, 0xa, 0x10, + 0x0, 0x0, 0x64, 0x0, 0x2, 0xab, 0xce, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3060 "だ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, + 0xc5, 0x0, 0x1, 0x92, 0xc0, 0x0, 0x0, 0xc1, + 0x64, 0x0, 0x29, 0x0, 0x3, 0x35, 0xeb, 0x50, + 0x0, 0x10, 0x0, 0x1, 0x57, 0x90, 0x5, 0x98, + 0xd8, 0x0, 0x0, 0x6, 0x50, 0x0, 0x7, 0x84, + 0x0, 0x0, 0xb, 0x10, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x2, 0x50, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x2, + 0xa1, 0x0, 0x11, 0x0, 0x7, 0x30, 0x0, 0x4a, + 0xbc, 0xd9, 0x0, + + /* U+3061 "ち" */ + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xa3, 0x6a, 0x40, + 0x0, 0x7a, 0xdb, 0x75, 0x20, 0x0, 0x0, 0xa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x16, 0x98, + 0x30, 0x0, 0x58, 0x88, 0x30, 0x4d, 0x40, 0xa, + 0xd2, 0x0, 0x0, 0x5b, 0x0, 0x63, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0x4, 0xb5, 0x0, 0x0, 0x1, 0x56, + 0x40, 0x0, + + /* U+3063 "っ" */ + 0x0, 0x5, 0x99, 0x99, 0x10, 0x6b, 0xa5, 0x0, + 0x4, 0xa0, 0x2, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x6, + 0x80, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x16, + 0x87, 0x10, 0x0, + + /* U+3064 "つ" */ + 0x0, 0x0, 0x5, 0xaa, 0xab, 0x70, 0x0, 0x25, + 0x9b, 0x50, 0x0, 0x6, 0xc0, 0x9, 0xc3, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc5, 0x0, 0x0, 0x0, 0x36, 0x79, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3065 "づ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x31, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x24, 0x0, 0x0, 0x26, + 0x99, 0xaa, 0x44, 0x20, 0x4, 0x7b, 0x93, 0x0, + 0x0, 0xb4, 0x0, 0xb, 0x81, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb6, 0x0, 0x0, 0x0, 0x1, 0x68, + 0x84, 0x0, 0x0, 0x0, + + /* U+3066 "て" */ + 0x0, 0x0, 0x1, 0x48, 0xbd, 0xd1, 0x37, 0x8a, + 0xa8, 0x49, 0xb6, 0x30, 0x15, 0x30, 0x1, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xc0, 0x0, + + /* U+3067 "で" */ + 0x0, 0x0, 0x0, 0x37, 0xad, 0xfb, 0x0, 0x66, + 0x8a, 0xa6, 0x4a, 0x82, 0x0, 0x4, 0x74, 0x0, + 0x2c, 0x20, 0x11, 0x0, 0x0, 0x0, 0x1c, 0x10, + 0x20, 0x95, 0x0, 0x0, 0xb, 0x30, 0x2, 0xc2, + 0x60, 0x0, 0x2, 0xc0, 0x0, 0x5, 0x20, 0x0, + 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3068 "と" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x2, 0xa0, + 0x0, 0x20, 0x0, 0xc, 0x0, 0x6e, 0x50, 0x0, + 0x7b, 0xc7, 0x20, 0x0, 0x5c, 0x50, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x1, 0x20, 0x2b, 0xdc, 0xce, 0xf9, 0x0, 0x0, + 0x12, 0x10, 0x0, + + /* U+3069 "ど" */ + 0x0, 0x8, 0x10, 0x0, 0x1, 0x70, 0x0, 0xd, + 0x30, 0x0, 0x46, 0x4b, 0x0, 0xb, 0x10, 0x0, + 0xb, 0x32, 0x0, 0xa, 0x10, 0x1, 0x40, 0x0, + 0x0, 0x8, 0x40, 0x7e, 0x90, 0x0, 0x0, 0x2, + 0xdc, 0x71, 0x0, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x91, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x6c, 0xcc, 0xde, 0xc2, 0x0, + + /* U+306A "な" */ + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x73, + 0x0, 0x0, 0x3, 0x8b, 0xca, 0x60, 0x47, 0x10, + 0x0, 0xa, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x74, + 0x0, 0x4, 0xb7, 0xa5, 0x3, 0xa0, 0x0, 0xc, + 0x0, 0x0, 0x2e, 0x20, 0x0, 0xc, 0x0, 0x0, + 0x95, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x5, + 0x99, 0x9d, 0x0, 0x0, 0x0, 0x1a, 0x0, 0xe, + 0xc2, 0x0, 0x0, 0xc, 0x42, 0x96, 0x5d, 0x0, + 0x0, 0x1, 0x78, 0x40, 0x3, 0x0, + + /* U+306B "に" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x46, 0x7c, 0xd1, 0xc, 0x40, 0x1, 0x24, 0xa3, + 0x0, 0xd0, 0x0, 0x1, 0x40, 0x0, 0x48, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x84, 0x0, 0x10, 0x0, 0x0, 0x8, 0x35, + 0x6, 0x0, 0x0, 0x0, 0x58, 0x80, 0x90, 0x0, + 0x0, 0x1, 0xf6, 0x8, 0x81, 0x1, 0x45, 0x6, + 0x30, 0x5, 0xac, 0xcb, 0x40, + + /* U+306C "ぬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0xc2, 0x30, 0x0, 0x0, 0x4a, 0x1, 0x9c, 0x66, + 0xa7, 0x0, 0x0, 0xa4, 0x97, 0x50, 0x0, 0x95, + 0x0, 0xc, 0x80, 0xa1, 0x0, 0x2, 0xa0, 0x3, + 0xd4, 0x19, 0x0, 0x0, 0xc, 0x0, 0xa1, 0xb9, + 0x20, 0x0, 0x1, 0xa0, 0x19, 0x7, 0xb0, 0x7, + 0xa8, 0x96, 0x2, 0x80, 0xbb, 0x67, 0x60, 0x2f, + 0xa0, 0xc, 0xb4, 0x0, 0x76, 0x1a, 0x68, 0xa0, + 0x11, 0x0, 0x0, 0x79, 0x40, 0x3, + + /* U+306D "ね" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0xb, 0x40, + 0x89, 0x79, 0x80, 0x0, 0x18, 0xad, 0x2a, 0x20, + 0x0, 0x85, 0x0, 0x3, 0x3f, 0x80, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0xae, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x1, 0xca, 0x0, 0x0, 0x0, 0x39, 0x0, + 0xa, 0x3a, 0x0, 0x6, 0x86, 0x86, 0x0, 0x4c, + 0x1a, 0x0, 0xa6, 0x25, 0xfb, 0x30, 0x81, 0xae, + 0x0, 0xc2, 0x29, 0x73, 0xd2, 0x0, 0x3c, 0x0, + 0x29, 0x94, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+306E "の" */ + 0x0, 0x0, 0x0, 0x45, 0x51, 0x0, 0x0, 0x0, + 0x8, 0xba, 0x56, 0xab, 0x10, 0x0, 0x1c, 0x30, + 0x80, 0x0, 0x4c, 0x0, 0xb, 0x20, 0x8, 0x10, + 0x0, 0xa5, 0x5, 0x80, 0x0, 0x81, 0x0, 0x6, + 0x90, 0xa2, 0x0, 0xa, 0x0, 0x0, 0x3a, 0xc, + 0x0, 0x0, 0xb0, 0x0, 0x4, 0x90, 0xb0, 0x0, + 0x57, 0x0, 0x0, 0x86, 0xa, 0x20, 0xc, 0x0, + 0x0, 0x1d, 0x10, 0x4b, 0x5c, 0x30, 0x0, 0x1c, + 0x40, 0x0, 0x48, 0x20, 0x0, 0x6a, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, + + /* U+306F "は" */ + 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0xc7, 0xc5, + 0x4, 0x70, 0x3, 0x89, 0xe3, 0x0, 0x8, 0x30, + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb0, 0x0, + 0xc, 0x60, 0x4, 0x65, 0xb0, 0x0, 0xd, 0xa0, + 0x77, 0x35, 0xea, 0x20, 0x8, 0xa0, 0xb1, 0x1, + 0xc3, 0xe2, 0x0, 0x30, 0x3c, 0xab, 0x20, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3070 "ば" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x11, 0xb2, 0x9, 0x20, + 0x0, 0xd, 0x30, 0x3a, 0x45, 0xc, 0x10, 0x0, + 0xb, 0x10, 0x6, 0x10, 0xc, 0x0, 0x0, 0xb, + 0x49, 0x60, 0x0, 0x29, 0x0, 0x38, 0xae, 0x73, + 0x0, 0x0, 0x55, 0x0, 0x0, 0xb, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, + 0xa1, 0x10, 0x0, 0xb, 0x0, 0x0, 0x0, 0xb4, + 0x10, 0x2, 0x1b, 0x0, 0x0, 0x0, 0xba, 0x3, + 0xc6, 0x7e, 0x70, 0x0, 0x0, 0x7a, 0x7, 0x70, + 0xa, 0x6d, 0x10, 0x0, 0x15, 0x2, 0xd9, 0xb4, + 0x5, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+3071 "ぱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x6, 0x75, 0xa, 0x10, 0x0, + 0xd, 0x30, 0x90, 0x60, 0xd1, 0x0, 0x0, 0xb0, + 0x1, 0x73, 0xb, 0x0, 0x0, 0xb, 0x5a, 0x60, + 0x3, 0x70, 0x3, 0x8a, 0xd5, 0x10, 0x0, 0x64, + 0x0, 0x0, 0xb, 0x0, 0x0, 0x9, 0x10, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xb, + 0x0, 0x0, 0xb, 0x50, 0x2, 0x43, 0xb0, 0x0, + 0x0, 0xba, 0x5, 0xa4, 0x5e, 0x80, 0x0, 0x7, + 0x90, 0x93, 0x1, 0xb4, 0xd1, 0x0, 0x3, 0x2, + 0xba, 0xb2, 0x3, 0x10, 0x0, + + /* U+3072 "ひ" */ + 0x0, 0x4a, 0xd1, 0x0, 0x82, 0x0, 0x6, 0xc6, + 0x99, 0x0, 0xd, 0x90, 0x0, 0x0, 0x49, 0x0, + 0x0, 0xac, 0x0, 0x0, 0xc, 0x0, 0x0, 0x9, + 0x86, 0x0, 0x7, 0x50, 0x0, 0x0, 0xa2, 0xd2, + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x5, 0xd0, 0xc, + 0x0, 0x0, 0x1, 0xc0, 0x1, 0x0, 0xc0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0xc, 0x10, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x5a, 0x0, 0x1b, 0x50, 0x0, + 0x0, 0x0, 0x6c, 0xbb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3073 "び" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x95, 0x0, 0x16, + 0xc7, 0x0, 0x27, 0x1c, 0x14, 0xc, 0x94, 0xd4, + 0x0, 0x4f, 0x14, 0x10, 0x0, 0xb, 0x40, 0x0, + 0x2d, 0x60, 0x0, 0x0, 0x59, 0x0, 0x0, 0x29, + 0xc0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x29, 0x79, + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x48, 0xc, 0x60, + 0x5, 0x60, 0x0, 0x0, 0x75, 0x0, 0x10, 0x6, + 0x50, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x80, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x5c, 0x10, 0x0, 0x0, 0x0, 0x2c, 0xcc, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+3074 "ぴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x1, 0x38, + 0xc4, 0x0, 0x45, 0x16, 0x61, 0x2c, 0x75, 0xc2, + 0x0, 0x7e, 0x3, 0x30, 0x0, 0xc, 0x10, 0x0, + 0x4d, 0x30, 0x0, 0x0, 0x94, 0x0, 0x0, 0x49, + 0xa0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x46, 0xa4, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x75, 0x1e, 0x20, + 0xa, 0x20, 0x0, 0x0, 0xa2, 0x1, 0x0, 0xb, + 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x40, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x2, 0xc1, 0x0, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xbc, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+3075 "ふ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, 0x14, 0x0, + 0x0, 0x2, 0x1, 0xb0, 0x6, 0x90, 0x41, 0x83, + 0x0, 0xb1, 0x0, 0xc6, 0x8d, 0x24, 0x20, 0xc0, + 0x0, 0x35, 0x10, 0x0, 0x7a, 0x40, 0x0, 0x0, + + /* U+3076 "ぶ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x52, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x53, 0xc0, 0x0, 0x0, 0x6, 0xf3, + 0x5, 0x92, 0x0, 0x0, 0x8, 0x71, 0x0, 0x2, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x10, 0x31, 0x0, 0x0, 0x0, 0x30, 0x3a, + 0x0, 0xa4, 0x0, 0x33, 0x80, 0x0, 0xc0, 0x1, + 0xe2, 0xe, 0xb0, 0x13, 0x1c, 0x0, 0x6, 0x30, + 0x30, 0x0, 0x38, 0x20, 0x0, 0x0, + + /* U+3077 "ぷ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x62, 0x0, 0x4, 0x61, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x60, 0x60, 0x0, 0x0, 0x8, 0xf2, + 0x3, 0x61, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x10, 0x32, 0x0, 0x0, 0x0, 0x20, 0x3a, + 0x0, 0xa5, 0x0, 0x43, 0x80, 0x0, 0xc0, 0x1, + 0xe1, 0xf, 0xa0, 0x51, 0x2c, 0x0, 0x7, 0x10, + 0x50, 0x1, 0x99, 0x20, 0x0, 0x0, + + /* U+3078 "へ" */ + 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x10, + 0x39, 0x0, 0x0, 0x0, 0x4d, 0x30, 0x0, 0x67, + 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x67, + + /* U+3079 "べ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x24, 0xa1, 0x0, 0x0, 0x15, + 0x0, 0x6, 0x95, 0x30, 0x0, 0x29, 0x4a, 0x0, + 0x8, 0x0, 0x0, 0x1a, 0x0, 0x39, 0x0, 0x0, + 0x0, 0x3c, 0x20, 0x0, 0x66, 0x0, 0x0, 0x1b, + 0x40, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x78, + + /* U+307A "ぺ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, + 0x1, 0x50, 0x0, 0x60, 0x60, 0x0, 0x1, 0xb4, + 0xa0, 0x1, 0x64, 0x0, 0x1, 0xb1, 0x2, 0xa0, + 0x0, 0x0, 0x3, 0xc3, 0x0, 0x6, 0x70, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, + + /* U+307B "ほ" */ + 0x5, 0x20, 0x0, 0x2, 0x48, 0x10, 0x9, 0x60, + 0x7, 0x9d, 0x63, 0x0, 0xa, 0x10, 0x0, 0xb, + 0x20, 0x0, 0xb, 0x0, 0x0, 0xa, 0x0, 0x0, + 0x1a, 0x0, 0x0, 0xb, 0x49, 0x70, 0x46, 0x0, + 0x7, 0x9e, 0x72, 0x0, 0x64, 0x0, 0x0, 0xb, + 0x0, 0x0, 0x82, 0x40, 0x0, 0xb, 0x0, 0x0, + 0x88, 0x30, 0x35, 0x4b, 0x0, 0x0, 0x5f, 0x6, + 0x63, 0x5e, 0x91, 0x0, 0x9, 0xa, 0x0, 0x2a, + 0x4d, 0x20, 0x0, 0x2, 0xaa, 0xa1, 0x2, 0x20, + + /* U+307C "ぼ" */ + 0x2, 0x40, 0x0, 0x1, 0x36, 0x50, 0x0, 0x3, + 0xa0, 0x2, 0x8b, 0xb4, 0x11, 0x60, 0x7, 0x40, + 0x0, 0x3, 0xb0, 0x36, 0x49, 0xa, 0x0, 0x0, + 0x2, 0xa0, 0x8, 0x40, 0xa, 0x0, 0x0, 0x2, + 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, + 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x19, 0x50, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, + 0x50, 0xa4, 0x38, 0xd5, 0x0, 0x0, 0x5, 0x21, + 0x90, 0x6, 0x79, 0xa0, 0x0, 0x0, 0x0, 0x7a, + 0xa9, 0x0, 0x50, 0x0, + + /* U+307D "ぽ" */ + 0x2, 0x40, 0x0, 0x1, 0x36, 0x40, 0x0, 0x3, + 0xa0, 0x2, 0x8b, 0xb4, 0x5, 0x85, 0x7, 0x40, + 0x0, 0x3, 0xb0, 0x5, 0x7, 0xa, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0x51, 0xa, 0x0, 0x0, 0x2, + 0xb6, 0xa2, 0x0, 0xa, 0x0, 0x3, 0x8a, 0xc5, + 0x10, 0x0, 0xa, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x19, 0x40, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0x54, 0xa0, 0x0, 0x0, 0xd, + 0x50, 0xa4, 0x38, 0xd4, 0x0, 0x0, 0x6, 0x21, + 0x90, 0x6, 0x7b, 0x90, 0x0, 0x0, 0x0, 0x7a, + 0xa9, 0x0, 0x50, 0x0, + + /* U+307E "ま" */ + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x80, 0x5, 0x9a, + 0xe7, 0x30, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0xd6, 0xb4, 0x0, 0x69, 0xad, 0x40, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x56, 0x4c, 0x0, + 0x0, 0xb5, 0x27, 0xf8, 0x0, 0x1a, 0x0, 0x67, + 0x6d, 0x30, 0x8b, 0xba, 0x0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+307F "み" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x7a, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x42, + 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x67, 0x0, 0x1f, 0x0, 0x0, + 0x59, 0x9e, 0xa9, 0x43, 0xa0, 0x0, 0x85, 0x9, + 0x40, 0x17, 0xe7, 0x0, 0x1a, 0x4, 0x90, 0x0, + 0x2b, 0xb9, 0x2, 0x93, 0xb0, 0x0, 0xb, 0x10, + 0xa1, 0x8, 0x80, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3080 "む" */ + 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0x3c, 0x8b, 0x0, 0x46, + 0x0, 0x69, 0xc2, 0x0, 0x0, 0xa6, 0x0, 0x2a, + 0x0, 0x0, 0x2, 0xb2, 0x76, 0xa0, 0x0, 0x0, + 0x0, 0x90, 0x3c, 0x0, 0x0, 0x0, 0xa, 0x38, + 0xa0, 0x0, 0x1, 0x0, 0x3b, 0xd4, 0x0, 0x0, + 0x8, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0xd4, 0x1, 0x35, 0xbb, 0x0, 0x1, 0x79, 0xa9, + 0x61, 0x0, + + /* U+3081 "め" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0xa6, 0x0, 0x0, 0x9, 0x70, 0x0, 0xa2, + 0x0, 0x0, 0x2, 0xa0, 0x49, 0xe9, 0x60, 0x0, + 0x0, 0xca, 0x53, 0x90, 0x6c, 0x10, 0x2, 0xd4, + 0x7, 0x40, 0x3, 0xb0, 0xb, 0x29, 0xb, 0x0, + 0x0, 0xc0, 0x64, 0xa, 0x95, 0x0, 0x0, 0xc0, + 0xb0, 0x4, 0xf1, 0x0, 0x2, 0xb0, 0xb0, 0x3b, + 0x55, 0x0, 0xa, 0x30, 0x4b, 0x81, 0x0, 0x1, + 0xa4, 0x0, 0x0, 0x0, 0x2, 0x67, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+3082 "も" */ + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x32, 0x74, + 0x0, 0x0, 0x0, 0x6e, 0xba, 0x10, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x11, + 0x88, 0xa2, 0x20, 0x5, 0x0, 0x8a, 0x88, 0x0, + 0x80, 0x6, 0x50, 0x0, 0xa, 0x0, 0x48, 0x0, + 0x2, 0x90, 0x0, 0xc4, 0x13, 0xc2, 0x0, 0x1, + 0x8a, 0x92, 0x0, + + /* U+3083 "ゃ" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x39, 0x0, 0x0, 0x0, 0x57, 0x1, 0xa4, 0x51, + 0x0, 0x1, 0xa2, 0x99, 0x55, 0xc4, 0x0, 0x2d, + 0x91, 0x0, 0x4, 0x80, 0xa9, 0x49, 0x7, 0x65, + 0xc3, 0x0, 0x0, 0xb2, 0x3, 0x52, 0x0, 0x0, + 0x4, 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + + /* U+3084 "や" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x3a, + 0x0, 0x4c, 0x52, 0x31, 0x0, 0x0, 0xc, 0x0, + 0x4b, 0xb8, 0x7a, 0x80, 0x0, 0x7, 0xab, 0x71, + 0x0, 0x0, 0xd1, 0x0, 0x3b, 0xe1, 0x0, 0x0, + 0x0, 0xd0, 0x2c, 0x91, 0x77, 0x5, 0x40, 0x6, + 0xa0, 0x0, 0x0, 0xd, 0x0, 0x38, 0xa7, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, + + /* U+3085 "ゅ" */ + 0x0, 0x0, 0x48, 0x0, 0x0, 0xd, 0x0, 0x3c, + 0xa5, 0x0, 0x1b, 0x9, 0x87, 0x56, 0x80, 0x47, + 0x76, 0x6, 0x50, 0xc0, 0x56, 0xa1, 0x7, 0x40, + 0xa2, 0x4d, 0x46, 0x19, 0x10, 0xd0, 0xe, 0x0, + 0xab, 0x18, 0x80, 0x2, 0x0, 0x8a, 0x94, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, + + /* U+3086 "ゆ" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x0, 0x3e, + 0x51, 0x0, 0xb, 0x30, 0x3b, 0x8d, 0x5a, 0x70, + 0xc, 0x4, 0xb1, 0xb, 0x0, 0x95, 0x1a, 0x1c, + 0x0, 0xb, 0x0, 0x3b, 0x47, 0x94, 0x10, 0xc, + 0x0, 0xd, 0x47, 0xb0, 0x60, 0xc, 0x0, 0x2b, + 0x3d, 0x70, 0x72, 0x2a, 0x0, 0x77, 0xf, 0x40, + 0xb, 0x95, 0x17, 0xb0, 0x5, 0x10, 0x2, 0xda, + 0x95, 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + + /* U+3087 "ょ" */ + 0x0, 0x9, 0x30, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x9, 0xab, 0x80, 0x0, 0x9, 0x30, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xa, 0x20, 0x0, + 0x29, 0x9e, 0xb8, 0x0, 0x83, 0x2d, 0x8, 0x40, + 0x2d, 0xd5, 0x0, 0x0, + + /* U+3088 "よ" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0xb2, 0x1, 0x0, 0x0, 0xb, + 0x9c, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x4, 0x4d, 0x0, 0x0, 0x2b, 0x65, 0xec, 0x80, + 0x6, 0x50, 0x49, 0x9, 0x70, 0x1b, 0xbb, 0x10, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3089 "ら" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x0, 0x0, 0x2, 0x5c, 0xd0, 0x0, 0x0, + 0x67, 0x13, 0x90, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, 0x0, 0xb, 0x16, + 0xba, 0xba, 0x20, 0xe, 0xb5, 0x0, 0x3, 0xd0, + 0x3e, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, + 0x1, 0x37, 0xb7, 0x0, 0x0, 0x24, 0x31, 0x0, + 0x0, + + /* U+308A "り" */ + 0x5, 0x0, 0x0, 0x0, 0x1f, 0x4, 0xbb, 0x40, + 0x3a, 0x3a, 0x1, 0xc0, 0x66, 0xc0, 0x0, 0xd0, + 0x98, 0x70, 0x0, 0xb1, 0xac, 0x10, 0x0, 0xb1, + 0x9b, 0x0, 0x0, 0xc0, 0x58, 0x0, 0x1, 0xb0, + 0x1, 0x0, 0x6, 0x60, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x84, 0x0, 0x0, 0x6, 0x50, 0x0, + 0x0, 0x53, 0x0, 0x0, + + /* U+308B "る" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xca, 0x0, 0x1, 0xcb, 0x50, 0xb7, 0x0, 0x0, + 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x6d, + 0x9a, 0xab, 0x70, 0x8, 0xe6, 0x0, 0x0, 0x96, + 0x6d, 0x10, 0x0, 0x0, 0x3b, 0x21, 0x1a, 0x92, + 0x0, 0x49, 0x0, 0x85, 0x9, 0x10, 0xc3, 0x0, + 0x3b, 0x45, 0xbc, 0x40, 0x0, 0x2, 0x66, 0x40, + 0x0, + + /* U+308C "れ" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x0, 0x18, 0x91, 0x0, 0x0, 0x0, 0xb, 0x63, + 0xb3, 0x57, 0x0, 0x0, 0x17, 0x9d, 0x88, 0x0, + 0x47, 0x0, 0x0, 0x3, 0x1f, 0x60, 0x0, 0x65, + 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x82, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x7, 0x6a, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x1d, + 0x2a, 0x0, 0x0, 0xb0, 0x1, 0x60, 0x75, 0x9e, + 0x10, 0x0, 0x97, 0x79, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+308D "ろ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x88, + 0xe4, 0x0, 0x1, 0x96, 0x3, 0xd2, 0x0, 0x0, + 0x0, 0x2b, 0x10, 0x0, 0x0, 0x1, 0xa1, 0x0, + 0x0, 0x0, 0x1a, 0x23, 0x42, 0x0, 0x2, 0xda, + 0x85, 0x58, 0xb1, 0x5e, 0x80, 0x0, 0x0, 0x4a, + 0xb3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x0, 0x0, 0x0, 0x2, 0xc1, 0x0, + 0x4, 0x67, 0x99, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+308F "わ" */ + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x35, + 0x41, 0x0, 0x1, 0x69, 0xf5, 0xa7, 0x56, 0xb7, + 0x0, 0x46, 0x4e, 0x90, 0x0, 0x0, 0x95, 0x0, + 0xc, 0xb0, 0x0, 0x0, 0x2, 0xa0, 0x5, 0xbb, + 0x0, 0x0, 0x0, 0x1b, 0x0, 0xd2, 0xb0, 0x0, + 0x0, 0x3, 0x80, 0x89, 0x1b, 0x0, 0x0, 0x0, + 0xa1, 0xc, 0x49, 0xb0, 0x0, 0x1, 0x93, 0x0, + 0x0, 0x79, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3092 "を" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x3, 0x5, 0x83, 0x99, 0x0, + 0x0, 0x59, 0xea, 0x73, 0x0, 0x0, 0x0, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0x89, 0x10, 0x1, + 0xa1, 0x4e, 0x70, 0x2a, 0x18, 0xc8, 0x1c, 0x40, + 0x2, 0xeb, 0x40, 0x0, 0x0, 0x8, 0xac, 0x0, + 0x0, 0x0, 0xb, 0x41, 0xb0, 0x0, 0x0, 0x2, + 0xa0, 0x14, 0x0, 0x0, 0x0, 0x1d, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xcc, 0xdd, 0x20, 0x0, + + /* U+3093 "ん" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x47, 0x91, 0x0, 0x0, 0x0, 0x1, 0xcb, + 0x46, 0x80, 0x0, 0x0, 0x0, 0x8e, 0x20, 0x39, + 0x0, 0x1, 0x30, 0x1f, 0x50, 0x3, 0x90, 0x0, + 0x80, 0xa, 0xa0, 0x0, 0x2a, 0x0, 0x55, 0x0, + 0xe1, 0x0, 0x0, 0xd5, 0x88, 0x0, 0x1, 0x0, + 0x0, 0x1, 0x62, 0x0, 0x0, + + /* U+30A1 "ァ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x57, 0x8a, + 0xc0, 0x4b, 0x84, 0x0, 0xb8, 0x0, 0x0, 0x23, + 0x92, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x95, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30A2 "ア" */ + 0x0, 0x0, 0x0, 0x0, 0x15, 0x60, 0x0, 0x1, + 0x36, 0x88, 0x89, 0xf3, 0x9, 0xfa, 0x62, 0x0, + 0x2e, 0x60, 0x0, 0x0, 0x0, 0x1, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0x98, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30A3 "ィ" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, 0x4c, 0x10, + 0x0, 0x6, 0xc9, 0x0, 0x0, 0x86, 0xc, 0x0, + 0x15, 0x10, 0xb, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0x0, 0x2, 0x0, + + /* U+30A4 "イ" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0x40, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0xb, 0x70, + 0x0, 0x0, 0x2, 0xb8, 0xc0, 0x0, 0x0, 0x69, + 0x13, 0xa0, 0x0, 0x27, 0x30, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x70, + 0x0, + + /* U+30A6 "ウ" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x47, 0xb8, + 0x9, 0x9a, 0xaa, 0x85, 0x27, 0xc0, 0x94, 0x0, + 0x0, 0x0, 0xd3, 0x8, 0x50, 0x0, 0x0, 0x59, + 0x0, 0x86, 0x0, 0x0, 0xc, 0x10, 0x4, 0x40, + 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xa1, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30A7 "ェ" */ + 0x0, 0x1, 0x25, 0x94, 0x0, 0x3, 0xb9, 0xd5, + 0x20, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, + 0x0, 0x25, 0x78, 0xdb, 0xbc, 0xd1, 0x17, 0x42, + 0x0, 0x0, 0x0, + + /* U+30A8 "エ" */ + 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x2, 0x99, + 0xac, 0xa9, 0x73, 0x0, 0x0, 0x33, 0xc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0x56, 0x72, 0x6c, 0xca, 0xa9, 0x76, 0x55, 0x64, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AA "オ" */ + 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4c, + 0x8a, 0xc4, 0x0, 0x8d, 0xb9, 0x7e, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xb0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xb, 0x0, 0x0, 0x0, 0x3, 0xb1, 0x0, + 0xb0, 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x0, + 0x0, 0x4, 0x40, 0x0, 0x52, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+30AB "カ" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0x37, 0xb5, 0x3, 0x88, + 0xac, 0xb6, 0x38, 0xb0, 0x6, 0x30, 0xb1, 0x0, + 0xa4, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x0, 0x0, + 0xb, 0x30, 0x3, 0xb0, 0x0, 0x4, 0x90, 0x0, + 0x86, 0x0, 0x1, 0xb0, 0x0, 0xd, 0x10, 0x1, + 0x91, 0x0, 0xac, 0xb0, 0x0, 0x50, 0x0, 0x2, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AC "ガ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x20, 0x1, 0x6, 0x90, 0x0, 0x0, 0xc, + 0x60, 0x1b, 0x28, 0x0, 0x0, 0x0, 0xd2, 0x0, + 0x36, 0x0, 0x0, 0x0, 0xd, 0x4, 0x85, 0x0, + 0x0, 0x55, 0x8a, 0xd9, 0x67, 0xe0, 0x0, 0x6, + 0x62, 0x76, 0x0, 0x69, 0x0, 0x0, 0x0, 0xc, + 0x10, 0xa, 0x40, 0x0, 0x0, 0x4, 0x90, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x3a, 0x0, + 0x0, 0x0, 0x85, 0x0, 0x8, 0x50, 0x0, 0x0, + 0x66, 0x0, 0x88, 0xe1, 0x0, 0x0, 0x32, 0x0, + 0x0, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30AD "キ" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc7, 0x9a, 0x90, 0x3, 0xca, + 0x7b, 0x30, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xba, 0xbb, 0x83, 0xcb, + 0xa7, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+30AE "ギ" */ + 0x0, 0x0, 0x23, 0x0, 0x1, 0x83, 0x0, 0x0, + 0x3d, 0x0, 0x27, 0x29, 0x0, 0x0, 0xc, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x2c, 0x8a, 0xb3, 0x0, + 0x2, 0xca, 0x6a, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x50, 0x1, 0x0, 0x0, 0x1, 0x38, 0xca, + 0xba, 0x80, 0x2c, 0xb9, 0x64, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30AF "ク" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x0, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x4, 0xe4, 0x46, 0x70, 0x0, 0xc, 0x56, 0x34, + 0xf4, 0x0, 0x94, 0x0, 0x9, 0x90, 0x7, 0x30, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30B0 "グ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x40, 0x2, 0x93, 0x0, 0x0, 0x1e, 0x20, + 0x2a, 0x57, 0x0, 0x0, 0x9b, 0x55, 0x87, 0x60, + 0x0, 0x3, 0xb4, 0x42, 0x6f, 0x0, 0x0, 0x1b, + 0x10, 0x0, 0xd4, 0x0, 0x1, 0x70, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x82, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30B1 "ケ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x31, 0x36, 0x9c, 0xb1, + 0x0, 0x7b, 0xca, 0x9b, 0x10, 0x0, 0x3, 0x90, + 0x0, 0x5c, 0x0, 0x0, 0x15, 0x0, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B2 "ゲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x1b, 0x0, 0x0, 0x21, 0xc2, 0x0, 0x6, 0xc0, + 0x0, 0x2, 0xc4, 0x30, 0x0, 0xc1, 0x1, 0x36, + 0x96, 0x20, 0x0, 0x8b, 0xb9, 0xba, 0x43, 0x0, + 0x0, 0x48, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x25, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B3 "コ" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x7, 0x78, 0x9a, + 0xab, 0xe1, 0x4, 0x53, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x7, + 0x50, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2, 0x34, 0x68, 0xaf, 0x20, + 0x2b, 0x96, 0x42, 0x11, 0x0, + + /* U+30B4 "ゴ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0x18, 0x0, 0x0, 0x0, 0x2, 0x26, 0x30, + 0x15, 0x57, 0x99, 0x9b, 0xe0, 0x0, 0x7, 0x73, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x23, 0x45, 0x78, 0xae, + 0x0, 0x0, 0x29, 0x75, 0x32, 0x11, 0x0, 0x0, + + /* U+30B5 "サ" */ + 0x0, 0x0, 0x30, 0x0, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x1, 0xc4, + 0x68, 0xdb, 0xbc, 0xb0, 0x1c, 0xb8, 0xd4, 0x21, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x70, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x0, 0x0, 0x0, 0x0, + + /* U+30B6 "ザ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, + 0x0, 0x30, 0x0, 0xa1, 0x19, 0x28, 0x30, 0x0, + 0xd, 0x30, 0xc, 0x10, 0x2a, 0x0, 0x0, 0x0, + 0xa1, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x56, 0x8e, 0x99, 0xb9, 0x0, 0xb, 0xb9, 0xd5, + 0x20, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x10, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x38, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + 0x0, + + /* U+30B7 "シ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x15, + 0x28, 0x40, 0x0, 0x0, 0x1, 0x90, 0x1, 0xc9, + 0x0, 0x0, 0x2b, 0x10, 0x0, 0x3, 0x0, 0x3, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x90, 0x0, 0x0, 0x2, 0x6b, + 0xd4, 0x0, 0x0, 0x0, 0x3, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B8 "ジ" */ + 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x29, 0x60, 0x0, 0x69, 0x20, 0x0, + 0xc3, 0x20, 0x0, 0x3, 0xe1, 0x0, 0x21, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x24, 0x7, 0x80, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x7d, 0x0, 0x0, + 0x2b, 0x10, 0x0, 0x5, 0x0, 0x3, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x10, 0x0, 0x0, 0x0, + 0x1b, 0x80, 0x0, 0x0, 0x1, 0x6a, 0xc3, 0x0, + 0x0, 0x0, 0x1, 0xb7, 0x0, 0x0, 0x0, 0x0, + + /* U+30B9 "ス" */ + 0x0, 0x0, 0x0, 0x16, 0x90, 0x0, 0x5, 0x68, + 0xaa, 0x6f, 0x40, 0x0, 0x68, 0x30, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x40, + 0x0, 0x0, 0x0, 0x2d, 0x16, 0x60, 0x0, 0x0, + 0x2d, 0x20, 0xa, 0x60, 0x0, 0x3c, 0x20, 0x0, + 0xe, 0x40, 0x68, 0x0, 0x0, 0x0, 0x6c, 0x21, + 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+30BA "ズ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x12, 0xc2, 0x0, 0x0, + 0x0, 0x5, 0x60, 0xa5, 0x22, 0x0, 0x55, 0x8a, + 0x99, 0xf1, 0x14, 0x0, 0x0, 0x97, 0x20, 0xa, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x19, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x3a, + 0x10, 0x0, 0x1e, 0x30, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, + + /* U+30BB "セ" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x19, 0x60, 0x0, 0x0, 0xd0, 0x49, 0x9a, 0xe0, + 0x0, 0x3, 0xe9, 0x60, 0x1c, 0x10, 0x39, 0xc8, + 0xd0, 0x0, 0x91, 0x0, 0x4, 0x0, 0xd0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb6, 0x22, 0x36, 0x70, 0x0, 0x0, 0x19, 0xbb, + 0x98, 0x30, + + /* U+30BC "ゼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xa5, 0x80, 0x0, 0x4e, 0x0, 0x0, + 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x6, 0x40, + 0x0, 0x0, 0x1c, 0x2, 0x8a, 0xce, 0x0, 0x0, + 0x3, 0xea, 0x71, 0x2c, 0x10, 0x2, 0x7b, 0x9c, + 0x0, 0xa, 0x10, 0x0, 0x16, 0x1, 0xc0, 0x6, + 0x10, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x12, 0x57, 0x0, 0x0, 0x0, + 0x3a, 0xbc, 0xba, 0x50, 0x0, + + /* U+30BD "ソ" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x35, 0x0, 0x0, + 0x0, 0xf5, 0xb, 0x50, 0x0, 0x2, 0xe0, 0x4, + 0xe0, 0x0, 0x8, 0x80, 0x0, 0xa0, 0x0, 0x1e, + 0x10, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0x20, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x0, + + /* U+30BF "タ" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xaa, 0x0, 0x51, 0x0, 0x0, 0x2f, 0xaa, 0xaf, + 0x80, 0x0, 0xc, 0x42, 0x12, 0xe1, 0x0, 0xa, + 0xa0, 0x0, 0xa6, 0x0, 0xa, 0x43, 0xc3, 0x3c, + 0x0, 0x6, 0x10, 0x4, 0xed, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x1a, 0x60, 0x0, 0x0, 0x0, 0x58, 0x20, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30C0 "ダ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x52, 0xc2, 0x0, 0x0, + 0x1f, 0x20, 0x35, 0x2d, 0x31, 0x0, 0x0, 0x9d, + 0x8a, 0xaf, 0x13, 0x0, 0x0, 0x4, 0xc3, 0x20, + 0x97, 0x0, 0x0, 0x0, 0x3d, 0x30, 0x2, 0xd0, + 0x0, 0x0, 0x4, 0xa0, 0x98, 0xb, 0x40, 0x0, + 0x0, 0x24, 0x0, 0xb, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C1 "チ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xe1, 0x0, 0x0, 0x4, 0x8b, 0xc3, + 0x0, 0x0, 0x0, 0x22, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x35, 0x61, 0x49, 0x9a, + 0xaa, 0xe8, 0x77, 0x75, 0x3, 0x20, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30C3 "ッ" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, 0x73, 0x0, + 0xe3, 0x9, 0x41, 0xc0, 0x1f, 0x10, 0x39, 0x2, + 0x7, 0x80, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x0, + + /* U+30C4 "ツ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x9, 0x20, + 0x0, 0x75, 0x81, 0x2, 0xe0, 0x0, 0xa8, 0x3d, + 0x0, 0xc0, 0x1, 0xd0, 0xd, 0x10, 0x0, 0x9, + 0x50, 0x1, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, + + /* U+30C6 "テ" */ + 0x0, 0x2, 0x35, 0x7b, 0x70, 0x0, 0x0, 0x77, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x23, 0x45, 0x78, 0x9b, 0xda, 0x2a, 0x85, + 0x38, 0x90, 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C7 "デ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x3, + 0x35, 0x7a, 0x70, 0x95, 0x90, 0x0, 0x6, 0x64, + 0x21, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x24, 0x68, 0x9a, 0xbc, + 0x80, 0x0, 0x29, 0x75, 0x25, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C8 "ト" */ + 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x3a, + 0x0, 0x0, 0x3, 0x90, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x2, 0x97, 0x81, 0x0, 0x29, 0x4, 0xe6, + 0x2, 0x90, 0x2, 0xd0, 0x29, 0x0, 0x0, 0x3, + 0x90, 0x0, 0x0, 0x49, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+30C9 "ド" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x2, + 0x50, 0xe, 0x0, 0x7, 0x36, 0x90, 0xc0, 0x0, + 0x1d, 0x2, 0xc, 0x10, 0x0, 0x10, 0x0, 0xc5, + 0x93, 0x0, 0x0, 0xc, 0x2, 0xd8, 0x0, 0x0, + 0xc0, 0x1, 0xd1, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, + + /* U+30CA "ナ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xc8, 0xac, 0xc1, 0x5d, 0xca, + 0x78, 0x91, 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+30CB "ニ" */ + 0x0, 0x0, 0x0, 0x1, 0x23, 0x0, 0x0, 0x0, + 0x2c, 0xa9, 0x98, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0x45, 0x62, 0xb, + 0xca, 0x99, 0x87, 0x65, 0x55, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30CD "ネ" */ + 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xd0, 0x0, + 0x0, 0x6b, 0xa5, 0x1d, 0x40, 0x0, 0x0, 0x1, + 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, + 0x0, 0x0, 0x0, 0x1, 0xb6, 0xc0, 0x87, 0x0, + 0x0, 0x49, 0x11, 0xa0, 0x9, 0xb0, 0x6, 0x40, + 0x1, 0xa0, 0x0, 0x90, 0x0, 0x0, 0x1, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+30CE "ノ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0x10, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x3, 0xc1, 0x0, 0x0, 0x0, + 0x3, 0xb1, 0x0, 0x0, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x15, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+30CF "ハ" */ + 0x0, 0x0, 0x17, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xf1, 0x0, 0x81, 0x0, 0x0, 0x0, 0xc5, + 0x0, 0x1, 0xb1, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xc, + 0x70, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x4d, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+30D0 "バ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x34, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x40, 0x0, 0x0, 0x5, + 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x5e, 0x0, + 0x6, 0x20, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xa1, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xb, 0x60, + 0x1, 0x91, 0x0, 0x0, 0x0, 0x4, 0xd0, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, + + /* U+30D1 "パ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x6, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, + 0x3, 0x60, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x94, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1e, + 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x8, 0xa0, + 0x0, 0x83, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x4, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x70, + + /* U+30D2 "ヒ" */ + 0x11, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x1, + 0x5c, 0xc0, 0xe, 0x67, 0x75, 0x32, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc6, 0x21, 0x23, 0x65, 0x1, 0x7a, 0xaa, + 0x98, 0x40, + + /* U+30D3 "ビ" */ + 0x30, 0x0, 0x0, 0x5, 0x10, 0xd5, 0x0, 0x0, + 0x42, 0xd1, 0xb2, 0x0, 0x0, 0x4d, 0x30, 0xb2, + 0x0, 0x1, 0x82, 0x0, 0xb2, 0x1, 0x8d, 0xb3, + 0x0, 0xb6, 0x78, 0x30, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x42, 0x23, + 0x68, 0x0, 0x5, 0x89, 0x99, 0x75, 0x0, + + /* U+30D4 "ピ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x3, 0x40, 0x0, + 0x0, 0x32, 0x60, 0x4d, 0x0, 0x0, 0x3, 0x9a, + 0x3, 0xa0, 0x0, 0x0, 0x1, 0x10, 0x2a, 0x0, + 0x4, 0xdb, 0x0, 0x2, 0xa0, 0x6a, 0x84, 0x0, + 0x0, 0x2c, 0x61, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdc, 0xbc, 0xdd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D5 "フ" */ + 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x7, 0x78, + 0x9a, 0xa9, 0x7a, 0xe0, 0x3, 0x63, 0x10, 0x0, + 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D6 "ブ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x17, 0x0, 0x2, 0x36, + 0x8a, 0xbe, 0x25, 0x0, 0x5d, 0xb8, 0x64, 0x10, + 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D7 "プ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x73, 0x0, 0x0, 0x24, + 0x69, 0xbc, 0x10, 0x0, 0x7d, 0xca, 0x86, 0x31, + 0x4e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D9 "ベ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, + 0x12, 0x0, 0x2a, 0x1c, 0x0, 0x0, 0x3, 0xcb, + 0x50, 0x4, 0x60, 0x0, 0x0, 0x3c, 0x10, 0xb4, + 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x1c, 0x40, + 0x0, 0x0, 0x3c, 0x20, 0x0, 0x1, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+30DA "ペ" */ + 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x37, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x2, 0x78, 0x0, 0x0, 0x0, 0x5, 0xb9, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0xb, 0x60, + 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30DB "ホ" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x13, 0x52, 0x9, 0xaa, + 0xad, 0xb9, 0x88, 0x70, 0x11, 0x0, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x20, 0x0, 0x7, + 0x0, 0x93, 0x2, 0x80, 0x3, 0x90, 0x9, 0x30, + 0x9, 0x61, 0xd3, 0x0, 0x83, 0x0, 0x2d, 0x13, + 0x0, 0x8d, 0x40, 0x0, 0x30, 0x0, 0x1, 0xc1, + 0x0, 0x0, + + /* U+30DC "ボ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xb3, 0x0, 0x0, 0xe, 0x20, + 0x5a, 0x37, 0x0, 0x0, 0xc, 0x10, 0x7, 0x0, + 0x0, 0x0, 0xb, 0x0, 0x24, 0x10, 0x19, 0x99, + 0x9e, 0x99, 0x88, 0x50, 0x2, 0x20, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x10, 0x0, + 0x0, 0x70, 0xb, 0x10, 0x27, 0x0, 0x2, 0x90, + 0xb, 0x10, 0x9, 0x60, 0xd, 0x40, 0xb, 0x10, + 0x2, 0xd0, 0x24, 0x1, 0x8d, 0x10, 0x0, 0x30, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30DD "ポ" */ + 0x0, 0x0, 0x1, 0x2, 0x76, 0x0, 0x0, 0x0, + 0xe2, 0x42, 0x60, 0x0, 0x0, 0xc, 0x10, 0x64, + 0x0, 0x0, 0x0, 0xb0, 0x13, 0x51, 0x1a, 0xaa, + 0x9e, 0x98, 0x77, 0x50, 0x11, 0x0, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x0, 0x20, 0x0, 0x7, + 0x0, 0xb1, 0x2, 0x80, 0x3, 0x90, 0xb, 0x10, + 0x9, 0x61, 0xd3, 0x0, 0xb1, 0x0, 0x2d, 0x13, + 0x1, 0x9e, 0x10, 0x0, 0x30, 0x0, 0x3, 0xb0, + 0x0, 0x0, + + /* U+30DE "マ" */ + 0x0, 0x0, 0x0, 0x1, 0x36, 0x60, 0x4c, 0xba, + 0x99, 0x98, 0x65, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x10, 0x1, 0xa3, 0x0, + 0x0, 0x0, 0x83, 0x18, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + + /* U+30DF "ミ" */ + 0x1, 0x67, 0x20, 0x0, 0x0, 0x3, 0xcc, 0x30, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x78, 0x30, 0x0, 0x0, 0x2, 0xcc, 0x0, + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x85, 0x0, 0x0, 0x0, 0x6, 0xd9, 0x10, + 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x40, + + /* U+30E0 "ム" */ + 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, 0x20, + 0x0, 0x0, 0xb, 0x10, 0x3, 0x80, 0x0, 0x4, + 0x70, 0x0, 0x8, 0x90, 0x0, 0xb0, 0x26, 0x98, + 0x5d, 0x50, 0xbe, 0xd9, 0x40, 0x0, 0x6a, 0x5, + 0x50, 0x0, 0x0, 0x0, 0x30, + + /* U+30E1 "メ" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0x0, 0x0, 0x4, 0x10, 0xd, 0x20, 0x0, 0x0, + 0x6, 0x88, 0x80, 0x0, 0x0, 0x0, 0x5, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0xca, 0x0, 0x0, + 0x0, 0xa5, 0x1, 0xd1, 0x0, 0x0, 0x96, 0x0, + 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+30E2 "モ" */ + 0x0, 0x0, 0x3, 0x59, 0xc7, 0x0, 0x2, 0xba, + 0xac, 0x31, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x13, 0x10, + 0x14, 0x57, 0x9e, 0x9a, 0xa9, 0x90, 0x17, 0x52, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x42, 0x24, 0x20, 0x0, 0x0, + 0x1, 0x8a, 0xa9, 0x20, + + /* U+30E3 "ャ" */ + 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x5, 0x10, 0x0, 0x1, 0xc6, 0x98, 0xca, + 0x2, 0x7a, 0x9d, 0x30, 0xa, 0x0, 0x3, 0x0, + 0x75, 0x5, 0x10, 0x0, 0x0, 0x2, 0xa0, 0x10, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30E4 "ヤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x49, 0xd3, 0x0, 0x0, 0xc, 0x7a, 0x96, 0x2e, + 0x30, 0x68, 0xaa, 0xa8, 0x0, 0x7, 0x50, 0x3, + 0x40, 0x2, 0xa0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+30E5 "ュ" */ + 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0xba, 0x99, + 0xf0, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x3c, 0xba, 0xac, 0xbc, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30E7 "ョ" */ + 0x0, 0x0, 0x0, 0x10, 0x7, 0xcb, 0xbb, 0xf3, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xd0, + 0x5, 0xcb, 0xaa, 0xb0, 0x0, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x6, 0x70, 0x2c, 0xba, 0xaa, 0x70, + + /* U+30E8 "ヨ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xaa, + 0xbb, 0xbd, 0xd0, 0x0, 0x2, 0x10, 0x0, 0x2f, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x0, 0x8, 0xdc, 0xaa, 0xad, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x7e, 0xcb, 0xaa, 0xab, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30E9 "ラ" */ + 0x1, 0x43, 0x45, 0x7a, 0x60, 0x0, 0x78, 0x64, + 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x23, 0x58, 0xab, 0xe8, 0x5c, 0x97, 0x53, 0x10, + 0xb6, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x1, 0xb4, + 0x0, 0x0, 0x0, 0x59, 0x10, 0x0, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, + + /* U+30EA "リ" */ + 0x0, 0x0, 0x1, 0x2, 0x90, 0x0, 0xc6, 0xf, + 0x0, 0x9, 0x60, 0xd0, 0x0, 0x94, 0xd, 0x0, + 0x9, 0x40, 0xd0, 0x0, 0xa3, 0xe, 0x0, 0xb, + 0x20, 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0x4, + 0x80, 0x0, 0x3, 0x30, 0x0, 0x0, + + /* U+30EB "ル" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0xa3, 0x0, 0x0, 0x50, 0x0, 0xd, 0x0, 0xa3, + 0x0, 0x4, 0x40, 0x0, 0x1b, 0x0, 0xa3, 0x0, + 0x48, 0x0, 0x0, 0x48, 0x0, 0xa3, 0x6, 0x90, + 0x0, 0x0, 0xa2, 0x0, 0xa5, 0xb8, 0x0, 0x0, + 0x4, 0x70, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x5, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + + /* U+30EC "レ" */ + 0x9, 0x20, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, + 0x50, 0xb, 0x20, 0x0, 0x78, 0x0, 0xb, 0x20, + 0x5b, 0x40, 0x0, 0xb, 0x7c, 0x90, 0x0, 0x0, + 0xa, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30ED "ロ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x55, 0x79, + 0xbc, 0xe2, 0x4d, 0x64, 0x31, 0x0, 0xf4, 0xc, + 0x0, 0x0, 0x2, 0xc0, 0xd, 0x0, 0x0, 0x5, + 0x70, 0xc, 0x0, 0x0, 0x8, 0x30, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xe, 0x67, 0x9b, 0xcf, 0x20, + 0xc, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30EF "ワ" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x9, 0x98, 0x9b, + 0xbb, 0xbc, 0xd0, 0x97, 0x21, 0x0, 0x0, 0x8a, + 0x8, 0x60, 0x0, 0x0, 0xd, 0x10, 0x86, 0x0, + 0x0, 0x6, 0x80, 0x7, 0x70, 0x0, 0x1, 0xc0, + 0x0, 0x1, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, + + /* U+30F3 "ン" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x7, 0x80, 0x0, 0x0, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xc1, 0x0, 0x0, + 0x0, 0x1, 0xa9, 0x0, 0x0, 0x0, 0x4, 0xbd, + 0x40, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, + 0x0, 0x0, + + /* U+30F6 "ヶ" */ + 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x2d, 0x10, + 0x1, 0x0, 0x0, 0xba, 0x8a, 0xbb, 0x80, 0x5, + 0x72, 0x1a, 0x50, 0x0, 0x15, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, + + /* U+30FC "ー" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x81, 0x8, + 0xfe, 0xee, 0xdc, 0xcc, 0xbb, 0xbb, 0xa0, 0x4, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E00 "一" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x80, + + /* U+4E03 "七" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x2c, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x15, 0x66, 0x40, 0x0, + 0x0, 0x0, 0x15, 0x6f, 0x40, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x40, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xa0, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x3, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xcc, 0xcc, 0xa1, + + /* U+4E07 "万" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x46, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xe8, 0x11, 0x0, + 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x30, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x1f, 0x66, 0x66, + 0x6e, 0x60, 0x0, 0x0, 0x3e, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x7a, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xa, + 0x60, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x1, 0xa0, 0x0, 0x4, + 0x87, 0xd7, 0x0, 0x17, 0x0, 0x0, 0x0, 0x2d, + 0x90, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E08 "丈" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x60, 0x5, 0x76, + 0x66, 0x66, 0xd8, 0x66, 0x7b, 0x60, 0x0, 0x10, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x4b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdb, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd7, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xc3, 0x1, 0x9f, 0xc8, + 0x42, 0x0, 0x39, 0x70, 0x0, 0x0, 0x2a, 0xfc, + 0x20, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+4E09 "三" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x89, 0x10, + 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, 0x5, 0x20, 0x0, + 0x0, 0x7, 0x66, 0x66, 0x66, 0x69, 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, 0x1, 0x10, + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xc1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E0A "上" */ + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x66, 0x67, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x7, 0x80, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + + /* U+4E0B "下" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x46, + 0x66, 0x66, 0x66, 0x66, 0x67, 0xe6, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x5d, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x1, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, + + /* U+4E0D "不" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x76, 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, + 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0xb3, 0x6, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0x1b, 0x30, 0x1a, 0x30, 0x0, 0x0, 0x1c, 0x20, + 0xb3, 0x0, 0x1d, 0x60, 0x0, 0x1b, 0x20, 0xb, + 0x30, 0x0, 0x2f, 0x60, 0x29, 0x10, 0x0, 0xb3, + 0x0, 0x0, 0x6a, 0x15, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E13 "专" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x66, 0xaa, 0x66, 0x6a, 0xb0, 0x0, + 0x0, 0x1, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x6c, 0xa0, + 0x2, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6a, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x1d, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x85, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+4E14 "且" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x10, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x7, 0x40, + 0x28, 0x66, 0x86, 0x66, 0x66, 0x68, 0x69, 0x80, + + /* U+4E16 "世" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x8, 0x20, 0x0, + 0x0, 0x6, 0x0, 0xe, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x20, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x7, 0x70, + 0x18, 0x6e, 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x50, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x7, 0x0, 0x5, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x2e, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x90, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E21 "両" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd0, 0x2b, 0xc, 0x0, 0xc4, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x1b, 0xc, 0x0, 0xc1, 0xd, 0x0, + 0x0, 0xd0, 0x3c, 0x69, 0x66, 0xd1, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x43, 0x4c, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+4E26 "並" */ + 0x0, 0x4, 0x10, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x2e, 0x30, 0x0, 0x0, + 0x0, 0x3f, 0x10, 0x9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x2, 0x50, 0x39, 0x0, 0x7, 0x66, + 0x6e, 0x66, 0xc7, 0x66, 0x61, 0x0, 0x10, 0x0, + 0xd0, 0xb, 0x30, 0x3, 0x0, 0x6, 0x20, 0xd, + 0x0, 0xb3, 0x2, 0xf3, 0x0, 0x1a, 0x0, 0xd0, + 0xb, 0x30, 0xa7, 0x0, 0x0, 0xc3, 0xd, 0x0, + 0xb3, 0x3a, 0x0, 0x0, 0x8, 0x90, 0xd0, 0xb, + 0x3a, 0x10, 0x0, 0x0, 0x68, 0xd, 0x0, 0xb8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xb3, 0x0, + 0x72, 0x5, 0x76, 0x66, 0x96, 0x68, 0x66, 0x6a, + 0x80, + + /* U+4E2D "中" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xa6, 0x66, 0x6e, 0x66, 0x66, 0x6e, + 0x2d, 0x10, 0x0, 0xd1, 0x0, 0x0, 0xe0, 0xd1, + 0x0, 0xd, 0x10, 0x0, 0xe, 0xd, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0xe0, 0xd1, 0x0, 0xd, 0x10, + 0x0, 0xe, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x66, + 0xe0, 0x60, 0x0, 0xd, 0x10, 0x0, 0x5, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+4E3B "主" */ + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x66, 0x6a, 0x66, 0x6c, 0xb0, 0x0, 0x20, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x33, 0x0, 0x0, 0x28, 0x66, 0x6d, + 0x86, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x7, 0x1, 0x86, 0x66, 0x66, 0x86, 0x66, 0x67, + 0xa5, + + /* U+4E45 "久" */ + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x6d, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x20, 0x0, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x43, 0x0, 0x6, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x1d, 0x13, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x0, 0xb, 0x80, 0x0, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x1, 0xeb, 0x30, + 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x60, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E4B "之" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x2, 0x76, 0x66, 0x66, 0x66, 0x8d, 0x10, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x1, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x90, 0x1b, 0x95, 0x32, 0x22, 0x34, 0x51, + 0x3, 0x0, 0x0, 0x5a, 0xce, 0xef, 0xff, 0x30, + + /* U+4E4E "乎" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6c, 0x20, 0x0, + 0x0, 0x23, 0x68, 0xab, 0xa8, 0x62, 0x0, 0x4, + 0x54, 0x32, 0x4b, 0x0, 0x2, 0x0, 0x0, 0x3, + 0x30, 0x3, 0xb0, 0x3, 0xd1, 0x0, 0x0, 0xb, + 0x40, 0x3b, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x4e, + 0x3, 0xb0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x3b, 0x5, 0x0, 0x14, 0x6, 0x76, 0x66, 0x68, + 0xd6, 0x66, 0x69, 0xa1, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0x6b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E4F "乏" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x7a, 0xed, 0xc3, 0x0, 0x5, + 0x66, 0x78, 0x42, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x86, 0x6a, 0x70, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x8, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x7a, 0x63, 0x22, 0x23, + 0x45, 0x10, 0x20, 0x0, 0x16, 0xac, 0xde, 0xff, + 0x40, + + /* U+4E57 "乗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0xa7, 0x0, + 0x0, 0x45, 0x55, 0x67, 0xd9, 0x87, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x66, 0x66, 0xe6, 0x66, 0xab, 0x0, + 0x0, 0x11, 0x6, 0x0, 0xd0, 0x16, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x2, 0x30, + 0x6, 0x76, 0x6d, 0x66, 0xe6, 0x7c, 0x68, 0x80, + 0x0, 0x0, 0x1c, 0x0, 0xd0, 0x3b, 0x0, 0x0, + 0x0, 0x46, 0x6d, 0x66, 0xe6, 0x7c, 0x9c, 0x10, + 0x0, 0x11, 0x0, 0x7b, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xc1, 0xd1, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x10, 0xd0, 0x4c, 0x10, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd0, 0x5, 0xe9, 0x30, + 0x5, 0x61, 0x0, 0x0, 0xe0, 0x0, 0x2c, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+4E5D "九" */ + 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xc0, 0x0, 0x40, 0x0, 0x0, 0x5, 0x65, + 0x6d, 0x66, 0x6e, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x50, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xd, + 0x0, 0x3, 0x0, 0x4, 0x90, 0x0, 0x0, 0xd0, + 0x0, 0x70, 0x1, 0x90, 0x0, 0x0, 0xe, 0x0, + 0xb, 0x2, 0x70, 0x0, 0x0, 0x0, 0xbd, 0xcc, + 0xd2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E5F "也" */ + 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x30, 0xc, 0x10, 0x0, 0x20, 0x0, 0x0, + 0xa3, 0x0, 0xc1, 0x1, 0x6f, 0x20, 0x0, 0xa, + 0x30, 0xc, 0x67, 0x61, 0xd0, 0x0, 0x0, 0xa4, + 0x57, 0xe2, 0x0, 0xd, 0x0, 0x0, 0x5c, 0x81, + 0xc, 0x10, 0x2, 0xb0, 0x0, 0x61, 0xa3, 0x0, + 0xc1, 0x0, 0x3a, 0x0, 0x0, 0xa, 0x30, 0xc, + 0x12, 0x18, 0x70, 0x0, 0x0, 0xa3, 0x0, 0xc1, + 0x4d, 0xe1, 0x0, 0x0, 0xa, 0x30, 0xd, 0x10, + 0x10, 0x5, 0x0, 0x0, 0xa3, 0x0, 0x50, 0x0, + 0x0, 0x70, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x6e, 0xcc, 0xcc, 0xcc, 0xcc, + 0xe6, + + /* U+4E86 "了" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x3, 0x76, + 0x66, 0x66, 0x66, 0x7f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x40, 0x0, 0x0, 0x0, 0x0, 0x47, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E88 "予" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x6, 0x76, 0x66, 0x66, 0x7e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x50, 0x0, 0x0, 0x0, + 0x1, 0x76, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x5, 0x20, 0x47, 0x66, 0x66, + 0x6e, 0x66, 0x66, 0xfa, 0x0, 0x0, 0x0, 0x1, + 0xd0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E89 "争" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x76, 0x6b, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xc2, 0x0, 0x3c, 0x20, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x90, 0x0, 0x20, 0x0, + 0x1, 0x75, 0x76, 0x6b, 0x76, 0x67, 0xd0, 0x0, + 0x4, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa5, 0x60, + 0x7, 0x66, 0x66, 0x6d, 0x76, 0x67, 0xc6, 0x50, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x3, 0xa0, 0x0, + 0x0, 0x26, 0x66, 0x6d, 0x76, 0x67, 0xa0, 0x0, + 0x0, 0x1, 0x0, 0xb, 0x20, 0x1, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+4E8B "事" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x10, 0x5, + 0x66, 0x66, 0x6e, 0x66, 0x66, 0xae, 0x20, 0x10, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x66, 0x6e, 0x66, 0x6c, 0x40, 0x0, 0x0, 0xa2, + 0x0, 0xe0, 0x0, 0xc2, 0x0, 0x0, 0xa, 0x76, + 0x6e, 0x66, 0x6d, 0x20, 0x0, 0x0, 0x40, 0x0, + 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, 0x66, 0x6e, + 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0xc2, 0x81, 0x27, 0x66, 0x66, 0x6e, 0x66, + 0x6d, 0x77, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0xc2, 0x0, 0x0, 0x37, 0x66, 0x6e, 0x66, 0x6d, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x28, 0xed, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, + + /* U+4E8C "二" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x27, 0x66, 0x66, 0x66, 0x67, 0xa4, 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, 0x2d, 0x40, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + + /* U+4E94 "五" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x76, 0x66, 0x68, 0x66, 0x66, 0xab, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x85, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x37, 0x66, 0xc8, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0x1c, 0x6, 0x40, + 0x7, 0x66, 0x68, 0x66, 0x66, 0x68, 0x68, 0x80, + + /* U+4E9B "些" */ + 0x0, 0x0, 0x8, 0x0, 0x8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x50, 0xd, 0x0, 0xd, 0x0, 0x2b, 0x10, + 0x0, 0xd2, 0xe, 0x6c, 0x2d, 0x2, 0xc5, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x47, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x20, 0x0, 0x40, + 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x70, + 0x0, 0xd0, 0xd, 0x55, 0x2d, 0x20, 0x5, 0xc0, + 0xa, 0xe9, 0x74, 0x0, 0x4, 0xaa, 0xaa, 0x50, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, + 0x0, 0x7, 0x66, 0x66, 0x66, 0x6a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x20, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x78, 0x60, + + /* U+4EA1 "亡" */ + 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x10, + 0x5, 0x66, 0x66, 0x66, 0x86, 0x66, 0x6b, 0xe2, + 0x1, 0x11, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x4, 0xe6, 0x66, 0x66, 0x66, 0xad, 0x20, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EA4 "交" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6f, 0x80, + 0x1, 0x0, 0x5, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x20, 0x0, 0x78, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x15, 0xe4, 0x0, + 0x0, 0x67, 0x5, 0x0, 0x5, 0xd1, 0x7b, 0x0, + 0x4, 0x20, 0x5, 0x20, 0xa, 0x60, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x90, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x65, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x50, 0x1a, 0xc6, 0x20, 0x0, + 0x0, 0x47, 0x60, 0x0, 0x0, 0x3a, 0xff, 0xb1, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, + + /* U+4EA6 "亦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x20, 0x0, 0x10, 0x4, 0x66, + 0x66, 0x66, 0xd6, 0x66, 0x6d, 0xb0, 0x11, 0x0, + 0xe, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0xa6, 0xe, + 0x0, 0x1c, 0x21, 0x0, 0x0, 0xe, 0x10, 0xe0, + 0x1, 0xc0, 0x91, 0x0, 0x4, 0x80, 0x2c, 0x0, + 0x1c, 0x2, 0xc1, 0x0, 0xa1, 0x4, 0x90, 0x1, + 0xc0, 0x9, 0xa0, 0x26, 0x0, 0xa5, 0x0, 0x1c, + 0x0, 0x2f, 0x4, 0x0, 0x1c, 0x0, 0x1, 0xc0, + 0x0, 0x50, 0x0, 0xa, 0x30, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0x8, 0x30, 0x3, 0x79, 0xc0, 0x0, + 0x0, 0x17, 0x10, 0x0, 0x2, 0xd5, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EAC "京" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x10, 0x0, 0x50, 0x5, 0x76, + 0x66, 0x66, 0x86, 0x66, 0x6b, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x66, 0x66, 0x6b, 0x40, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xf6, 0x66, 0xc6, + 0x6d, 0x10, 0x0, 0x0, 0x2, 0x20, 0x1d, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x31, 0xd0, 0x38, + 0x0, 0x0, 0x0, 0x2c, 0x30, 0x1d, 0x0, 0x5c, + 0x10, 0x0, 0x3a, 0x10, 0x2, 0xd0, 0x0, 0x9b, + 0x0, 0x45, 0x0, 0x29, 0xeb, 0x0, 0x1, 0x80, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+4EBA "人" */ + 0x0, 0x0, 0x0, 0x1b, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa7, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x1a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x60, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xb8, 0x0, 0x0, + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x1e, 0x70, 0x0, + 0x0, 0x2b, 0x20, 0x0, 0x0, 0x3, 0xfc, 0x50, + 0x4, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x61, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EC0 "什" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x2, 0xf1, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd, + 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0xc1, 0x0, 0x20, 0x0, 0xac, 0x47, + 0x66, 0x6d, 0x66, 0x6d, 0x60, 0x37, 0xa3, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x8, 0xa, 0x30, 0x0, + 0xc, 0x10, 0x0, 0x4, 0x10, 0xa3, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+4ECA "今" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe2, 0x54, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x10, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x3a, 0x10, 0xb, 0xc4, 0x0, + 0x0, 0x76, 0x0, 0x6, 0xc0, 0x0, 0x7f, 0xc1, + 0x16, 0x20, 0x0, 0x0, 0x60, 0x0, 0x2, 0x10, + 0x0, 0x5, 0x66, 0x66, 0x66, 0x6a, 0x50, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x2e, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, + + /* U+4ECB "介" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x60, 0xa, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xa0, 0x0, 0x1c, 0x30, 0x0, 0x0, 0x5, 0x82, + 0x0, 0x3, 0x2d, 0xa3, 0x0, 0x6, 0x50, 0xb6, + 0x0, 0xb6, 0x1a, 0xf6, 0x15, 0x10, 0xb, 0x20, + 0xb, 0x30, 0x1, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0xa, + 0x30, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x57, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + + /* U+4ECD "仍" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc2, 0x76, 0x66, 0x66, 0xc2, 0x0, + 0x0, 0x9, 0x50, 0x13, 0xa0, 0x1, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x4, 0x90, 0x5, 0x90, 0x0, + 0x0, 0x7e, 0x30, 0x4, 0x90, 0x8, 0x50, 0x0, + 0x0, 0xac, 0x10, 0x5, 0x80, 0xc, 0x21, 0x20, + 0x7, 0x2c, 0x10, 0x6, 0x70, 0x1c, 0x69, 0xb0, + 0x25, 0xc, 0x10, 0x8, 0x50, 0x0, 0x7, 0x70, + 0x0, 0xc, 0x10, 0xa, 0x20, 0x0, 0x8, 0x50, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xa, 0x30, + 0x0, 0xc, 0x10, 0x48, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xc, 0x10, 0xa1, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xc, 0x14, 0x60, 0x0, 0x43, 0x8b, 0x0, + 0x0, 0xd, 0x46, 0x0, 0x0, 0x1a, 0xe3, 0x0, + 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED5 "仕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x93, 0x0, 0x0, 0x0, + 0x1, 0xf2, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xc, + 0x30, 0x0, 0xd, 0x10, 0x0, 0x0, 0x2, 0xf3, + 0x0, 0x0, 0xd1, 0x0, 0x30, 0x0, 0xae, 0x47, + 0x66, 0x6e, 0x66, 0x6b, 0x60, 0x28, 0xb3, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x8, 0xb, 0x30, 0x0, + 0xd, 0x10, 0x0, 0x3, 0x10, 0xb3, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd1, 0x4, + 0x80, 0x0, 0xb, 0x43, 0x76, 0x66, 0x66, 0x66, + 0x10, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED6 "他" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0xd3, 0xd, 0x0, 0x26, 0x0, + 0x0, 0x7d, 0x20, 0xd0, 0xd, 0x66, 0x7b, 0x0, + 0x0, 0xbd, 0x24, 0xe6, 0x5d, 0x0, 0x3a, 0x0, + 0x6, 0x4c, 0x22, 0xd0, 0xd, 0x0, 0x3a, 0x0, + 0x7, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x49, 0x0, + 0x20, 0xc, 0x10, 0xd0, 0xd, 0x2, 0x88, 0x0, + 0x0, 0xc, 0x10, 0xd0, 0xd, 0x5, 0xe3, 0x0, + 0x0, 0xc, 0x10, 0xd0, 0xd, 0x0, 0x0, 0x30, + 0x0, 0xc, 0x10, 0xd0, 0x4, 0x0, 0x0, 0x60, + 0x0, 0xc, 0x10, 0xc0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0xd, 0x10, 0x7c, 0xbb, 0xbb, 0xbc, 0xb1, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED8 "付" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xa, + 0x30, 0x0, 0x0, 0xd, 0x23, 0x0, 0x1, 0xf3, + 0x27, 0x66, 0x66, 0xe7, 0x96, 0x0, 0x9d, 0x30, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x28, 0xa3, 0x1, + 0x20, 0x0, 0xd2, 0x0, 0x8, 0xa, 0x30, 0x9, + 0x30, 0xd, 0x20, 0x3, 0x10, 0xa3, 0x0, 0x2f, + 0x10, 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0xb1, + 0xd, 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0xd, + 0x20, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0xd2, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x16, 0xdf, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+4EE3 "代" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x15, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x1e, 0x13, 0x92, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0xd, 0x0, 0x4f, 0x20, + 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x6, 0x10, + 0x0, 0xb, 0xa0, 0x0, 0xd, 0x0, 0x7, 0x50, + 0x0, 0x3c, 0xc1, 0x65, 0x6d, 0x76, 0x54, 0x30, + 0x0, 0xa3, 0xb0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x6, 0x32, 0xb0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0x4, 0x2, 0xb0, 0x0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xa6, 0x0, 0x11, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x2e, 0x30, 0x60, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x6, 0xe3, 0xb0, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5e, 0xf1, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x1, 0x72, + + /* U+4EE4 "令" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x27, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x8, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x32, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0xc2, 0xa, 0x70, 0x1d, 0x70, 0x0, + 0x0, 0x39, 0x10, 0x1, 0xf2, 0x1, 0xce, 0x81, + 0x5, 0x40, 0x0, 0x0, 0x40, 0x7, 0x16, 0x30, + 0x0, 0x4, 0x76, 0x66, 0x66, 0x9f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x94, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + + /* U+4EE5 "以" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x60, 0x1, 0xe2, + 0x1, 0x0, 0x0, 0x4d, 0x0, 0xe, 0x0, 0x57, + 0x0, 0x4, 0xb0, 0x0, 0xe0, 0x0, 0xc8, 0x0, + 0x4b, 0x0, 0xe, 0x0, 0x5, 0xc0, 0x5, 0xa0, + 0x0, 0xe0, 0x0, 0x2, 0x0, 0x59, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0xe0, 0x0, + 0x1, 0x0, 0x96, 0x0, 0xe, 0x0, 0x37, 0x0, + 0xd, 0x30, 0x0, 0xe0, 0x87, 0x0, 0x4, 0xf1, + 0x0, 0x1f, 0xe5, 0x0, 0x0, 0xc4, 0xa4, 0x2, + 0xe4, 0x0, 0x1, 0xb6, 0x1, 0xe5, 0x1, 0x0, + 0x4, 0xb3, 0x0, 0x6, 0xc0, 0x2, 0x67, 0x40, + 0x0, 0x0, 0x5, 0x2, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4EEE "仮" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0xe0, 0x36, 0x56, 0x89, 0x86, 0x20, + 0x0, 0x6, 0x80, 0x49, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x49, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x10, 0x4b, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xad, 0x0, 0x48, 0x50, 0x0, 0x88, 0x0, + 0x5, 0x3d, 0x0, 0x58, 0x60, 0x0, 0xb1, 0x0, + 0x14, 0xd, 0x0, 0x67, 0x34, 0x1, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x85, 0x9, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0xa2, 0x8, 0x2c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x1, 0xe7, 0x0, 0x0, + 0x0, 0xd, 0x3, 0x70, 0x4, 0xdb, 0x0, 0x0, + 0x0, 0xd, 0x7, 0x0, 0x69, 0x8, 0xc3, 0x0, + 0x0, 0xd, 0x34, 0x38, 0x40, 0x0, 0x5f, 0xa0, + 0x0, 0x2, 0x12, 0x30, 0x0, 0x0, 0x1, 0x0, + + /* U+4EF6 "件" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x1, 0xf2, 0x6, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x2e, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x59, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x5f, 0x40, 0x97, 0x66, 0xe6, 0x68, 0x30, + 0x0, 0xad, 0x10, 0x90, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x3c, 0x14, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x25, 0xc, 0x12, 0x0, 0x0, 0xd0, 0x1, 0x50, + 0x10, 0xc, 0x15, 0x76, 0x66, 0xe6, 0x66, 0x71, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+4EFB "任" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x27, 0xd5, 0x0, 0x0, + 0x59, 0x25, 0x67, 0xd8, 0x53, 0x10, 0x0, 0xc, + 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, 0xe1, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xae, 0x20, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x46, 0xc1, 0x0, + 0x0, 0xc1, 0x0, 0x40, 0x7, 0xc, 0x17, 0x66, + 0x6d, 0x76, 0x6a, 0x43, 0x0, 0xc1, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x40, 0x0, 0xd, 0x27, 0x66, 0x69, 0x66, 0x69, + 0x60, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EFD "份" */ + 0x0, 0x0, 0x32, 0x0, 0x0, 0x43, 0x0, 0x0, + 0x0, 0x0, 0xb9, 0x0, 0xd3, 0x24, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x4, 0xb0, 0x8, 0x0, 0x0, + 0x0, 0x8, 0x60, 0xb, 0x30, 0x8, 0x10, 0x0, + 0x0, 0x1d, 0x0, 0x3a, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x8f, 0x30, 0xa1, 0x0, 0x0, 0x8b, 0x10, + 0x3, 0x6d, 0x16, 0x30, 0x0, 0x0, 0x4a, 0xc1, + 0x16, 0xd, 0x43, 0x16, 0xe6, 0x67, 0xd0, 0x0, + 0x10, 0xd, 0x10, 0x0, 0xe0, 0x2, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xd0, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x5, 0x90, 0x3, 0x90, 0x0, + 0x0, 0xd, 0x10, 0xb, 0x20, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x10, 0x57, 0x1, 0x7, 0x70, 0x0, + 0x0, 0xd, 0x15, 0x60, 0x3, 0xcf, 0x20, 0x0, + 0x0, 0x6, 0x41, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+4F01 "企" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb8, 0x17, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x4, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x20, 0x7a, 0x0, 0x0, + 0x0, 0x4, 0xa0, 0x1, 0xe1, 0x6, 0xe6, 0x10, + 0x0, 0x66, 0x0, 0x1, 0xd0, 0x0, 0x4e, 0xa1, + 0x15, 0x10, 0x85, 0x1, 0xd0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x1, 0xe6, 0x6c, 0x70, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x1, 0xd0, 0x0, 0x7, 0x20, + 0x7, 0x66, 0x76, 0x66, 0x86, 0x66, 0x69, 0x70, + + /* U+4F0A "伊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xb3, 0x66, 0x66, 0x66, 0xc3, 0x0, + 0x0, 0xb, 0x30, 0x10, 0xe0, 0x0, 0xe0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, + 0x0, 0x9e, 0x30, 0x0, 0xe0, 0x0, 0xe0, 0x30, + 0x1, 0x9d, 0x38, 0x66, 0xe6, 0x66, 0xe7, 0x90, + 0x7, 0xd, 0x10, 0x0, 0xe0, 0x0, 0xe0, 0x0, + 0x22, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x15, 0x78, 0xc6, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x7, 0x60, 0x0, 0x20, 0x0, + 0x0, 0xd, 0x10, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F11 "休" */ + 0x0, 0x0, 0x84, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x8, 0x0, + 0x0, 0x4d, 0x37, 0x66, 0xcf, 0x96, 0x66, 0x30, + 0x0, 0xbe, 0x20, 0x0, 0xee, 0x60, 0x0, 0x0, + 0x5, 0x5c, 0x10, 0x4, 0xad, 0x35, 0x0, 0x0, + 0x7, 0xc, 0x10, 0xb, 0x2d, 0xa, 0x0, 0x0, + 0x20, 0xc, 0x10, 0x49, 0xd, 0x7, 0x60, 0x0, + 0x0, 0xc, 0x10, 0xb1, 0xd, 0x0, 0xe3, 0x0, + 0x0, 0xc, 0x17, 0x30, 0xd, 0x0, 0x5e, 0x50, + 0x0, 0xc, 0x44, 0x0, 0xd, 0x0, 0x7, 0x50, + 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + + /* U+4F1A "会" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd2, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x50, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0xa9, 0x10, 0x0, + 0x0, 0x8, 0x50, 0x0, 0x1, 0x78, 0xfa, 0x61, + 0x0, 0x73, 0x66, 0x66, 0x66, 0x61, 0x2a, 0x50, + 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9d, 0x10, + 0x0, 0x20, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xc0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x2, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xa1, 0x0, 0x0, 0x2e, 0x50, 0x0, + 0x0, 0xe, 0xcc, 0xba, 0x87, 0x67, 0xf0, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+4F1D "伝" */ + 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x2, 0xd0, 0x18, 0x66, 0x66, 0x62, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, + 0x6, 0x4c, 0x14, 0x76, 0x6e, 0x76, 0x66, 0x50, + 0x25, 0xc, 0x10, 0x0, 0x3e, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc0, 0x2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x7, 0x50, 0x2, 0x70, 0x0, + 0x0, 0xc, 0x10, 0x29, 0x0, 0x0, 0x96, 0x0, + 0x0, 0xc, 0x12, 0xc5, 0x55, 0x66, 0x7f, 0x0, + 0x0, 0xc, 0x21, 0xd9, 0x53, 0x10, 0xe, 0x10, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+4F38 "伸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0xa4, 0x2, 0x0, 0x2b, 0x0, 0x50, 0x0, 0x1c, + 0x0, 0xe6, 0x67, 0xd6, 0x6e, 0x20, 0x9, 0xf1, + 0xe, 0x0, 0x2b, 0x0, 0xe0, 0x1, 0x9e, 0x0, + 0xe0, 0x2, 0xb0, 0xe, 0x0, 0x81, 0xe0, 0xe, + 0x66, 0x7d, 0x66, 0xe0, 0x22, 0xe, 0x0, 0xe0, + 0x2, 0xb0, 0xe, 0x0, 0x0, 0xe0, 0xe, 0x0, + 0x2b, 0x0, 0xe0, 0x0, 0xe, 0x0, 0xe6, 0x67, + 0xd6, 0x6e, 0x0, 0x0, 0xe0, 0x5, 0x0, 0x2b, + 0x0, 0x50, 0x0, 0xe, 0x0, 0x0, 0x2, 0xb0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0xf, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+4F3C "似" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd2, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xa8, 0x0, + 0x0, 0xc, 0x20, 0x91, 0x40, 0x0, 0xa5, 0x0, + 0x0, 0x3a, 0x0, 0xd0, 0x1b, 0x0, 0xa4, 0x0, + 0x0, 0x9e, 0x20, 0xd0, 0xb, 0x60, 0xb4, 0x0, + 0x2, 0x9e, 0x0, 0xd0, 0x6, 0x30, 0xc3, 0x0, + 0x8, 0xe, 0x0, 0xd0, 0x0, 0x0, 0xe1, 0x0, + 0x22, 0xe, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0xe, 0x0, 0xd0, 0x46, 0x9, 0x70, 0x0, + 0x0, 0xe, 0x0, 0xda, 0x50, 0x2e, 0x83, 0x0, + 0x0, 0xe, 0x0, 0xe5, 0x0, 0xc4, 0xc, 0x50, + 0x0, 0xe, 0x0, 0x10, 0x1b, 0x30, 0x4, 0xe0, + 0x0, 0xe, 0x0, 0x16, 0x60, 0x0, 0x0, 0x70, + 0x0, 0x5, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+4F46 "但" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe1, 0x86, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0x8, 0x70, 0xb3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x6d, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xce, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x4d, 0x0, 0xa8, 0x66, 0x66, 0x6d, 0x0, + 0x15, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xb8, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0xe, 0x27, 0x66, 0x66, 0x66, 0x66, 0x93, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F4D "位" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1e, 0x10, 0x0, 0x0, + 0x0, 0x8, 0x60, 0x0, 0xc, 0x20, 0x1, 0x0, + 0x0, 0xd, 0x4, 0x66, 0x66, 0x66, 0x7f, 0x40, + 0x0, 0x4e, 0x21, 0x10, 0x0, 0x1, 0x10, 0x0, + 0x0, 0xbe, 0x0, 0x20, 0x0, 0x4, 0xe1, 0x0, + 0x4, 0x5d, 0x0, 0x25, 0x0, 0x7, 0x90, 0x0, + 0x7, 0xd, 0x0, 0xc, 0x0, 0xa, 0x30, 0x0, + 0x10, 0xd, 0x0, 0xa, 0x60, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0xa0, 0x19, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0x90, 0x54, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, 0x3, 0x60, + 0x0, 0xd, 0x17, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F4E "低" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0x5c, 0xd6, 0x0, + 0x0, 0xa, 0x40, 0x96, 0x68, 0xd1, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x9e, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0x9d, 0x0, 0xd0, 0x0, 0xd0, 0x1, 0x0, + 0x8, 0xd, 0x0, 0xd6, 0x66, 0xe6, 0x6a, 0x60, + 0x11, 0xd, 0x0, 0xd0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x85, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x4a, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd, 0x10, 0x40, + 0x0, 0xd, 0x0, 0xd3, 0x83, 0x6, 0xb0, 0x80, + 0x0, 0xd, 0x0, 0xfb, 0x75, 0x0, 0xbb, 0xb0, + 0x0, 0xe, 0x0, 0x40, 0xc, 0x30, 0x8, 0xd0, + 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+4F4F "住" */ + 0x0, 0x0, 0x57, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x1, 0xe4, 0x0, 0x0, 0x0, + 0x2, 0xd0, 0x0, 0x8, 0x50, 0x1, 0x0, 0x0, + 0xa4, 0x36, 0x66, 0x66, 0x67, 0xe3, 0x0, 0x3e, + 0x10, 0x10, 0xe, 0x0, 0x0, 0x0, 0xa, 0xe2, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x4c, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x2, 0x50, 0xc1, 0x0, + 0x0, 0xe0, 0x6, 0x10, 0x0, 0xc, 0x11, 0x86, + 0x6e, 0x66, 0x75, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xe, 0x0, + 0x4, 0x0, 0x0, 0xd3, 0x86, 0x66, 0xa6, 0x66, + 0xa5, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4F53 "体" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0x4, 0x66, 0x6d, 0x66, 0x6d, 0x60, + 0x0, 0x7c, 0x21, 0x10, 0xcf, 0x60, 0x0, 0x0, + 0x0, 0xad, 0x0, 0x2, 0xbc, 0x43, 0x0, 0x0, + 0x7, 0x1d, 0x0, 0xa, 0x4c, 0x18, 0x0, 0x0, + 0x23, 0xd, 0x0, 0x2a, 0xc, 0x17, 0x40, 0x0, + 0x0, 0xd, 0x0, 0xa1, 0xc, 0x10, 0xd1, 0x0, + 0x0, 0xd, 0x6, 0x40, 0xc, 0x10, 0x7d, 0x20, + 0x0, 0xd, 0x35, 0x46, 0x6d, 0x69, 0xab, 0x90, + 0x0, 0xd, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4F55 "何" */ + 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0x50, + 0x0, 0x5, 0x92, 0x76, 0x66, 0x66, 0xe6, 0x50, + 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x3f, 0x20, 0x30, 0x0, 0x40, 0xd0, 0x0, + 0x0, 0xae, 0x0, 0xe6, 0x68, 0xc0, 0xd0, 0x0, + 0x4, 0x5d, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x5, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x3, 0xa0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xe6, 0x68, 0xb0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x80, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x5b, 0xe0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+4F59 "余" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd1, 0x46, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x20, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x0, 0x0, 0x7c, 0x30, 0x0, + 0x0, 0x1a, 0x76, 0x66, 0x66, 0xd8, 0xfc, 0x60, + 0x5, 0x60, 0x10, 0xc, 0x10, 0x0, 0x2a, 0x30, + 0x21, 0x0, 0x0, 0xc, 0x10, 0x2, 0x50, 0x0, + 0x0, 0x67, 0x66, 0x6d, 0x66, 0x67, 0x70, 0x0, + 0x0, 0x0, 0x31, 0xc, 0x12, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe7, 0xc, 0x11, 0x95, 0x0, 0x0, + 0x0, 0xb, 0x50, 0xc, 0x10, 0xa, 0xb1, 0x0, + 0x0, 0xa4, 0x0, 0xd, 0x10, 0x0, 0xbb, 0x0, + 0x17, 0x10, 0x17, 0xcf, 0x0, 0x0, 0x17, 0x0, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+4F5C "作" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe1, 0x2, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x9, 0x50, 0x0, 0x5, 0x30, + 0x0, 0xc, 0x10, 0x1c, 0x7c, 0x66, 0x66, 0x60, + 0x0, 0x4d, 0x20, 0x83, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xbd, 0x13, 0x60, 0x2b, 0x0, 0x0, 0x0, + 0x7, 0x3c, 0x15, 0x0, 0x2d, 0x66, 0x7d, 0x10, + 0x14, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x4, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2d, 0x66, 0x69, 0x60, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + + /* U+4F60 "你" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa8, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf3, 0x1, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x7, 0x80, 0x0, 0x1, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x76, 0x66, 0x6b, 0xb0, + 0x0, 0x5e, 0x20, 0x66, 0x1, 0x30, 0xb, 0x10, + 0x0, 0xbd, 0x11, 0x80, 0x3, 0xc0, 0x21, 0x0, + 0x7, 0x2c, 0x14, 0x3, 0x3, 0xb0, 0x0, 0x0, + 0x23, 0xc, 0x10, 0xd, 0x53, 0xb0, 0x60, 0x0, + 0x0, 0xc, 0x10, 0x3b, 0x3, 0xb0, 0x48, 0x0, + 0x0, 0xc, 0x10, 0x93, 0x3, 0xb0, 0xb, 0x60, + 0x0, 0xc, 0x12, 0x80, 0x3, 0xb0, 0x3, 0xe0, + 0x0, 0xc, 0x17, 0x0, 0x3, 0xb0, 0x0, 0xb0, + 0x0, 0xc, 0x31, 0x1, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x2, 0x9f, 0x80, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4F7F "使" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x96, 0x46, 0x66, 0xd6, 0x66, 0xa8, 0x0, 0xd, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x7, 0xe2, + 0x8, 0x66, 0xd6, 0x66, 0x90, 0x0, 0xad, 0x0, + 0xd0, 0xc, 0x0, 0x1b, 0x0, 0x71, 0xd0, 0xd, + 0x0, 0xc0, 0x1, 0xb0, 0x23, 0xd, 0x0, 0xd6, + 0x6e, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x7, 0x10, + 0xc0, 0x1, 0x60, 0x0, 0xd, 0x0, 0x6, 0xc, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x39, 0x90, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xc9, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x86, 0x6c, 0x72, + 0x0, 0x0, 0xd, 0x4, 0x72, 0x0, 0x18, 0xee, + 0x80, 0x0, 0x32, 0x10, 0x0, 0x0, 0x0, 0x20, + + /* U+4F86 "來" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x5, 0x40, 0x2, 0x76, + 0x76, 0x6c, 0x86, 0x67, 0x66, 0x0, 0x0, 0x3e, + 0x10, 0xa4, 0x2, 0xe1, 0x0, 0x0, 0x7, 0x80, + 0xa, 0x40, 0x59, 0x0, 0x0, 0x0, 0xc7, 0x70, + 0xa4, 0xa, 0x79, 0x10, 0x0, 0x84, 0xb, 0x4f, + 0x93, 0x70, 0x5a, 0x0, 0x43, 0x0, 0x1b, 0xe8, + 0x80, 0x0, 0x20, 0x0, 0x0, 0x8, 0x9a, 0x48, + 0x40, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xa4, 0xb, + 0x50, 0x0, 0x0, 0x8, 0x80, 0xa, 0x40, 0xc, + 0xa2, 0x0, 0x18, 0x30, 0x0, 0xa4, 0x0, 0x9, + 0xf8, 0x14, 0x0, 0x0, 0xb, 0x50, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, + + /* U+4F8B "例" */ + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x6, 0x30, + 0x0, 0x79, 0x0, 0x0, 0x42, 0x0, 0xa3, 0x0, + 0xc, 0x36, 0x7e, 0x66, 0x40, 0xa, 0x30, 0x1, + 0xc0, 0x5, 0x80, 0x0, 0xc2, 0xa3, 0x0, 0x8d, + 0x10, 0x93, 0x6, 0xd, 0xa, 0x30, 0xb, 0xd0, + 0xc, 0x66, 0xe2, 0xd0, 0xa3, 0x6, 0x2d, 0x4, + 0x60, 0x3b, 0xd, 0xa, 0x30, 0x50, 0xd0, 0x88, + 0x17, 0x60, 0xd0, 0xa3, 0x0, 0xd, 0x43, 0x48, + 0xd1, 0xd, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x5a, + 0x0, 0xd0, 0xa3, 0x0, 0xd, 0x0, 0xb, 0x10, + 0xb, 0xa, 0x30, 0x0, 0xd0, 0x6, 0x60, 0x0, + 0x0, 0xa3, 0x0, 0xd, 0x4, 0x70, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xe4, 0x40, 0x0, 0x0, 0x4a, + 0xf1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x0, + + /* U+4F9B "供" */ + 0x0, 0x0, 0x86, 0x2, 0x80, 0x9, 0x10, 0x0, + 0x0, 0x0, 0xe4, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x2, 0xa0, 0xd, 0x7, 0x20, + 0x0, 0x4e, 0x23, 0x77, 0xc6, 0x6e, 0x66, 0x40, + 0x0, 0xbd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x6, 0x2d, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x23, 0xd, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x26, 0x67, 0xc6, 0x6e, 0x68, 0xd1, + 0x0, 0xd, 0x2, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0xd0, 0x15, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x20, 0x3, 0xb2, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0x4f, 0x30, + 0x0, 0xe, 0x8, 0x20, 0x0, 0x0, 0x7, 0x70, + 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F9D "依" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd1, 0x0, 0x55, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0xc, 0x25, 0x66, 0x6c, 0x76, 0x6d, 0x60, + 0x0, 0x2d, 0x11, 0x0, 0x2e, 0x10, 0x0, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, + 0x1, 0x8d, 0x0, 0x4, 0x95, 0x0, 0x27, 0x0, + 0x7, 0x1d, 0x0, 0x1b, 0x3, 0x40, 0xc7, 0x0, + 0x13, 0xd, 0x0, 0xae, 0x10, 0x98, 0x20, 0x0, + 0x0, 0xd, 0x8, 0x3d, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0xd, 0x41, 0xd, 0x0, 0x58, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x2d, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x17, 0x14, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xe, 0xb0, 0x0, 0x7f, 0x90, + 0x0, 0xd, 0x0, 0xb, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FA1 "価" */ + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x73, 0x0, + 0x5, 0x94, 0x76, 0xd6, 0x6d, 0x66, 0x40, 0x0, + 0xc1, 0x0, 0xc, 0x0, 0xb0, 0x0, 0x0, 0x4f, + 0x30, 0x0, 0xc0, 0xb, 0x0, 0x0, 0xa, 0xc0, + 0xc, 0x6d, 0x66, 0xd6, 0xd3, 0x5, 0x3c, 0x0, + 0xd0, 0xc0, 0xb, 0xd, 0x1, 0x40, 0xc0, 0xd, + 0xc, 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, + 0xc0, 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, + 0x0, 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd0, 0xc0, + 0xb, 0xd, 0x0, 0x0, 0xc0, 0xd, 0xc, 0x0, + 0xb0, 0xd0, 0x0, 0xc, 0x0, 0xd6, 0x86, 0x68, + 0x6e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x4, 0x0, 0x30, 0x0, 0x0, 0x1, + 0x0, + + /* U+4FBF "便" */ + 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x2, 0xf7, 0x76, 0x67, 0x66, 0x69, 0xa0, + 0x0, 0x8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa6, 0x6c, 0x76, 0x6d, 0x20, + 0x0, 0x6b, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xbe, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x6, 0x3d, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, + 0x6, 0xd, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6c, 0x76, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x50, 0xc, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x6, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xcc, 0x40, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x59, 0x21, 0x9e, 0xb9, 0x81, + 0x0, 0x6, 0x35, 0x20, 0x0, 0x0, 0x37, 0x40, + + /* U+4FC2 "係" */ + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x0, 0x0, 0xf3, 0x2, 0x46, 0x9b, 0xdc, 0x40, + 0x0, 0x5, 0xa1, 0x43, 0x2b, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x89, 0x20, 0x90, 0x0, + 0x0, 0x3e, 0x20, 0x39, 0x40, 0xb, 0xb2, 0x0, + 0x0, 0xae, 0x0, 0xcb, 0x97, 0xd7, 0x0, 0x0, + 0x4, 0x6d, 0x0, 0x0, 0x29, 0x20, 0x44, 0x0, + 0x7, 0xd, 0x0, 0x17, 0x60, 0x0, 0xb, 0x20, + 0x0, 0xd, 0x0, 0xac, 0xa8, 0xd5, 0x48, 0xa0, + 0x0, 0xd, 0x0, 0x1, 0x0, 0xc1, 0x1, 0x30, + 0x0, 0xd, 0x0, 0x9, 0xa0, 0xc1, 0x92, 0x0, + 0x0, 0xd, 0x0, 0x3b, 0x0, 0xc0, 0x1d, 0x40, + 0x0, 0xd, 0x1, 0xa0, 0x0, 0xc0, 0x4, 0xd0, + 0x0, 0xd, 0x6, 0x1, 0x8a, 0xb0, 0x0, 0x30, + 0x0, 0x6, 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, + + /* U+4FDD "保" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x11, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x1, 0xe1, 0x3d, 0x66, 0x66, 0xd4, 0x0, + 0x0, 0x6, 0x80, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x5e, 0x10, 0x2b, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xad, 0x0, 0x3d, 0x6b, 0x66, 0xd0, 0x0, + 0x7, 0x2d, 0x0, 0x11, 0xb, 0x10, 0x0, 0x0, + 0x12, 0xd, 0x16, 0x66, 0x6d, 0x66, 0x69, 0xa0, + 0x0, 0xd, 0x1, 0x0, 0x8e, 0x51, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xab, 0x18, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x2b, 0x16, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x74, 0xb, 0x10, 0xb7, 0x0, + 0x0, 0xd, 0x4, 0x50, 0xb, 0x10, 0x1c, 0xb0, + 0x0, 0xe, 0x23, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+4FE1 "信" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x6, 0x93, 0x66, 0x67, 0xb6, 0x6a, 0x90, + 0x0, 0xc, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x26, 0x0, + 0x0, 0xbd, 0x0, 0x27, 0x66, 0x66, 0x65, 0x0, + 0x5, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x16, 0xd, 0x0, 0x47, 0x66, 0x66, 0x78, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FEE "修" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0xb8, 0x66, 0x7e, 0x20, + 0x0, 0x2b, 0x7, 0x5, 0x57, 0x0, 0xb5, 0x0, + 0x0, 0x9e, 0xc, 0x16, 0x1, 0xab, 0x50, 0x0, + 0x1, 0x9c, 0xc, 0x10, 0x2, 0xbc, 0x30, 0x0, + 0x8, 0x1c, 0xc, 0x0, 0x67, 0x3, 0xac, 0x82, + 0x12, 0xc, 0xc, 0x34, 0x0, 0x7c, 0x12, 0x30, + 0x0, 0xc, 0xc, 0x0, 0x19, 0x60, 0x41, 0x0, + 0x0, 0xc, 0xc, 0x4, 0x61, 0x6, 0xd4, 0x0, + 0x0, 0xc, 0xc, 0x0, 0x2, 0xa7, 0x2, 0x80, + 0x0, 0xc, 0xa, 0x2, 0x77, 0x10, 0x6d, 0x70, + 0x0, 0xc, 0x0, 0x13, 0x0, 0x5b, 0x80, 0x0, + 0x0, 0xc, 0x0, 0x3, 0x79, 0x50, 0x0, 0x0, + 0x0, 0x5, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, + + /* U+500B "個" */ + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0xb6, 0x66, 0x66, 0x66, 0xb0, + 0x0, 0x7, 0x80, 0xd0, 0x3, 0x30, 0x3, 0xa0, + 0x0, 0xd, 0x10, 0xd0, 0x5, 0x70, 0x3, 0xa0, + 0x0, 0x5e, 0x10, 0xd3, 0x69, 0xa7, 0x93, 0xa0, + 0x0, 0xbd, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, + 0x4, 0x4d, 0x0, 0xd0, 0x5, 0x60, 0x3, 0xa0, + 0x5, 0xd, 0x0, 0xd0, 0xa8, 0x8d, 0x33, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc0, 0xc, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xc6, 0x6d, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0x70, 0x5, 0x3, 0xa0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x67, 0xa0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+5011 "們" */ + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc1, 0xa6, 0x6c, 0x39, 0x66, 0xd0, + 0x0, 0xa, 0x51, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xe6, 0x7b, 0x3c, 0x66, 0xc0, + 0x0, 0x5e, 0x11, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x0, 0xad, 0x1, 0xd0, 0x2b, 0x3a, 0x1, 0xc0, + 0x2, 0x6d, 0x1, 0xe6, 0x79, 0x3a, 0x66, 0xc0, + 0x6, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x1, 0xd0, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0xe, 0x1, 0xd0, 0x0, 0x1, 0x7d, 0xa0, + 0x0, 0x4, 0x1, 0x30, 0x0, 0x0, 0x4, 0x10, + + /* U+5019 "候" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x4, 0xb0, 0x2, 0x86, 0x67, 0xd1, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x60, 0x50, + 0x0, 0x4d, 0xa, 0x27, 0xb7, 0x66, 0x66, 0x50, + 0x0, 0xad, 0xa, 0x20, 0xc2, 0x0, 0x1, 0x0, + 0x4, 0x5d, 0xa, 0x22, 0xb6, 0xa6, 0x78, 0x0, + 0x5, 0xd, 0xa, 0x27, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0xa, 0x21, 0x0, 0xe0, 0x2, 0x50, + 0x0, 0xd, 0xa, 0x27, 0x67, 0xd9, 0x66, 0x50, + 0x0, 0xd, 0xa, 0x20, 0x6, 0x77, 0x0, 0x0, + 0x0, 0xd, 0xa, 0x20, 0xc, 0x13, 0x80, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x95, 0x0, 0x98, 0x0, + 0x0, 0xe, 0x0, 0x8, 0x40, 0x0, 0xb, 0xd3, + 0x0, 0x7, 0x1, 0x50, 0x0, 0x0, 0x0, 0x20, + + /* U+501F "借" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x6, 0xa0, 0xd, 0x20, 0x0, + 0x0, 0x1, 0xd0, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0x6, 0x73, 0x69, 0xa6, 0x6e, 0x69, 0x70, + 0x0, 0xc, 0x10, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x6, 0x70, 0xd, 0x1, 0x60, + 0x7, 0x3d, 0x18, 0x66, 0x66, 0x66, 0x66, 0x71, + 0x24, 0xd, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xd5, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0xe, 0x0, 0xd6, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0x7, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, + + /* U+5024 "値" */ + 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x5, 0x90, 0x0, 0x10, + 0x0, 0x7, 0x76, 0x76, 0x6a, 0xb6, 0x67, 0xc1, + 0x0, 0xc, 0x10, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0x4e, 0x10, 0x8, 0x6c, 0x86, 0x6b, 0x0, + 0x0, 0xbd, 0x4, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x5, 0x3d, 0xd, 0x2d, 0x0, 0x0, 0x2a, 0x0, + 0x15, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x66, 0x66, 0x7b, 0x0, + 0x0, 0xd, 0xd, 0x9, 0x0, 0x0, 0x16, 0x20, + 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, 0x67, 0xf4, + 0x0, 0x8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+503C "值" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0xe, 0x0, 0x3, 0x0, + 0x0, 0x9, 0x57, 0x76, 0x6e, 0x66, 0x7b, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x10, 0x96, 0x6d, 0x66, 0xc2, 0x0, + 0x0, 0xbd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x5, 0x4d, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x6, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x10, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x46, 0xd6, 0x66, 0x66, 0xe8, 0xd1, + 0x0, 0x7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+505A "做" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x24, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x5, 0xa0, 0x48, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x37, 0x0, 0x57, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x37, 0x33, 0x83, 0x11, 0x60, + 0x0, 0x6c, 0x28, 0x8a, 0x65, 0xa5, 0x5e, 0x50, + 0x0, 0xba, 0x0, 0x37, 0x0, 0xa0, 0xc, 0x0, + 0x4, 0x7a, 0x0, 0x37, 0x5, 0x60, 0xb, 0x0, + 0x6, 0x2a, 0x9, 0x8a, 0xa4, 0x51, 0x39, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x25, 0x75, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xb1, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0xb1, 0x8, 0xa0, 0x0, + 0x0, 0x2a, 0xd, 0x66, 0xc1, 0x1c, 0xb0, 0x0, + 0x0, 0x2a, 0xc, 0x0, 0x82, 0xa2, 0x5b, 0x10, + 0x0, 0x3a, 0x6, 0x0, 0x47, 0x0, 0x6, 0xd2, + 0x0, 0x24, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+505C "停" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x5, 0x90, 0x2, 0x50, + 0x0, 0xb, 0x24, 0x76, 0x66, 0x66, 0x66, 0x60, + 0x0, 0x1b, 0x0, 0xa, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0x8d, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xbc, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x6, 0x3c, 0x2, 0x4, 0x0, 0x0, 0x20, 0x20, + 0x3, 0xc, 0xa, 0x66, 0x66, 0x66, 0x66, 0xe3, + 0x0, 0xc, 0x4a, 0x0, 0x0, 0x0, 0x25, 0x10, + 0x0, 0xc, 0x0, 0x67, 0x66, 0xb6, 0x77, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x7c, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5065 "健" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x1, 0x0, 0xc, 0x1, 0x0, + 0x0, 0x6, 0x85, 0x7e, 0x6, 0x6d, 0x6d, 0x20, + 0x0, 0xb, 0x10, 0x66, 0x0, 0xc, 0xc, 0x30, + 0x0, 0x3b, 0x0, 0xc1, 0x46, 0x6d, 0x6d, 0x62, + 0x0, 0x9e, 0x3, 0xa1, 0x0, 0xc, 0xc, 0x0, + 0x4, 0x5d, 0xa, 0x8b, 0x64, 0x6d, 0x69, 0x0, + 0x5, 0xd, 0x0, 0xa, 0x10, 0xc, 0x6, 0x0, + 0x0, 0xd, 0x3, 0xc, 0x6, 0x6d, 0x66, 0x20, + 0x0, 0xd, 0x6, 0xb, 0x0, 0xc, 0x1, 0x50, + 0x0, 0xd, 0x4, 0x87, 0x46, 0x6d, 0x66, 0x50, + 0x0, 0xd, 0x0, 0xd4, 0x0, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x7a, 0x82, 0x4, 0x0, 0x0, + 0x0, 0xd, 0x35, 0x0, 0x4a, 0xcc, 0xcd, 0xb1, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5074 "側" */ + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x70, + 0x0, 0x4, 0xc1, 0xb6, 0x6d, 0x10, 0x1, 0xc0, + 0x0, 0x9, 0x51, 0xb0, 0xc, 0xa, 0x31, 0xb0, + 0x0, 0xc, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x4d, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, + 0x0, 0xaa, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x3, 0x6a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x5, 0x1a, 0x1, 0xc6, 0x6c, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb0, 0xc, 0xc, 0x1, 0xb0, + 0x0, 0x1a, 0x1, 0xb6, 0x6a, 0x9, 0x1, 0xb0, + 0x0, 0x1a, 0x0, 0x75, 0x42, 0x0, 0x1, 0xb0, + 0x0, 0x1a, 0x2, 0xb1, 0xc, 0x20, 0x1, 0xa0, + 0x0, 0x2b, 0x8, 0x0, 0x7, 0x93, 0x8c, 0x90, + 0x0, 0x13, 0x20, 0x0, 0x1, 0x30, 0x6, 0x0, + + /* U+5099 "備" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x95, 0x2, 0xc0, 0xb, 0x40, 0x0, + 0x0, 0x1, 0xf3, 0x2, 0xb0, 0xb, 0x14, 0x0, + 0x0, 0x6, 0x91, 0x87, 0xc6, 0x6d, 0x68, 0x50, + 0x0, 0xc, 0x20, 0x2, 0xb0, 0xb, 0x10, 0x30, + 0x0, 0x3e, 0x17, 0x67, 0xc6, 0x6a, 0x67, 0xc3, + 0x0, 0xad, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x4, 0x4d, 0x0, 0x4e, 0x66, 0x86, 0x6d, 0x10, + 0x4, 0xd, 0x3, 0xbb, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x46, 0x2c, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2c, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x1, 0xc0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0x2b, 0x1, 0xb5, 0xaa, 0x0, + 0x0, 0x4, 0x0, 0x13, 0x0, 0x0, 0x41, 0x0, + + /* U+50B3 "傳" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xd4, 0x66, 0x6e, 0x66, 0x7e, 0x30, + 0x0, 0x9, 0x51, 0x30, 0xd, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0xd3, 0x0, + 0x0, 0x6e, 0x10, 0xd6, 0x6e, 0x66, 0xd1, 0x0, + 0x0, 0xad, 0x0, 0xd0, 0xd, 0x0, 0xc1, 0x0, + 0x6, 0x1d, 0x0, 0xd6, 0x6e, 0x66, 0xa1, 0x0, + 0x13, 0xd, 0x0, 0x0, 0xd, 0x1, 0x95, 0x0, + 0x0, 0xd, 0x9, 0xca, 0x88, 0x67, 0x3c, 0x0, + 0x0, 0xd, 0x1, 0x0, 0x0, 0xd, 0x14, 0x20, + 0x0, 0xd, 0x37, 0x86, 0x66, 0x6e, 0x67, 0x60, + 0x0, 0xd, 0x0, 0x5b, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x10, 0xd, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x27, 0xbc, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, + + /* U+50C5 "僅" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x8, 0x40, 0xa, 0x40, 0x0, + 0x0, 0x4, 0xb0, 0x9, 0x30, 0xb, 0x21, 0x20, + 0x0, 0xa, 0x57, 0x6b, 0x76, 0x6c, 0x79, 0x90, + 0x0, 0xd, 0x0, 0x9, 0x30, 0xb, 0x20, 0x0, + 0x0, 0x6d, 0x10, 0x9, 0x7c, 0x7b, 0x10, 0x0, + 0x0, 0xcd, 0x0, 0x30, 0xb, 0x20, 0x23, 0x0, + 0x4, 0x5d, 0x0, 0xd6, 0x6c, 0x76, 0xa8, 0x0, + 0x6, 0xd, 0x0, 0xd0, 0xb, 0x20, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6c, 0x76, 0x83, 0x0, + 0x0, 0xd, 0x0, 0x66, 0x6c, 0x76, 0xb6, 0x0, + 0x0, 0xd, 0x0, 0x20, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x56, 0x6c, 0x76, 0xd5, 0x0, + 0x0, 0xd, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xe, 0x16, 0x66, 0x6c, 0x76, 0x6a, 0xc0, + 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+50CD "働" */ + 0x0, 0xb, 0x40, 0x1, 0x50, 0x7, 0x30, 0x0, + 0x1, 0xf5, 0x6a, 0x97, 0x10, 0xb2, 0x0, 0x0, + 0x69, 0x0, 0xa2, 0x12, 0xa, 0x20, 0x0, 0xb, + 0x48, 0x6c, 0x77, 0x70, 0xa2, 0x20, 0x1, 0xf2, + 0x12, 0xa2, 0x42, 0x8c, 0x7c, 0x60, 0x8f, 0x2, + 0xcc, 0x7c, 0x50, 0xb2, 0xa2, 0xa, 0xb0, 0x2a, + 0xa2, 0xa2, 0xb, 0x1a, 0x15, 0x1b, 0x2, 0xcc, + 0x7c, 0x20, 0xc0, 0xb1, 0x0, 0xb0, 0x2c, 0xc7, + 0xc2, 0xc, 0xb, 0x0, 0xb, 0x1, 0x4a, 0x24, + 0x1, 0xa0, 0xc0, 0x0, 0xb0, 0x46, 0xc7, 0xb4, + 0x55, 0xc, 0x0, 0xb, 0x1, 0x1a, 0x20, 0x9, + 0x0, 0xc0, 0x0, 0xb1, 0x46, 0xc8, 0x54, 0x60, + 0xb, 0x0, 0xc, 0x1b, 0x61, 0x1, 0x70, 0x5d, + 0x80, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x30, + 0x0, + + /* U+50CF "像" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xd, 0x86, 0x6c, 0x60, 0x0, + 0x0, 0xa, 0x40, 0x84, 0x0, 0x47, 0x0, 0x0, + 0x0, 0x1d, 0x4, 0xd6, 0x67, 0xa6, 0x6e, 0x10, + 0x0, 0x8f, 0x23, 0xd0, 0x7, 0x50, 0xe, 0x0, + 0x1, 0x9e, 0x0, 0xd6, 0x6c, 0x86, 0x6e, 0x0, + 0x7, 0xe, 0x0, 0x60, 0x3a, 0x0, 0x15, 0x0, + 0x22, 0xe, 0x0, 0x3, 0xa7, 0x2, 0xd6, 0x0, + 0x0, 0xe, 0x1, 0x76, 0x1c, 0xaa, 0x10, 0x0, + 0x0, 0xe, 0x3, 0x3, 0xb2, 0xd4, 0x30, 0x0, + 0x0, 0xe, 0x1, 0x76, 0xa, 0xd5, 0xa0, 0x0, + 0x0, 0xe, 0x4, 0x2, 0xb4, 0x77, 0x6a, 0x0, + 0x0, 0xe, 0x0, 0x79, 0x10, 0x86, 0xc, 0xb1, + 0x0, 0xe, 0x36, 0x12, 0x7c, 0xe1, 0x1, 0x30, + 0x0, 0x4, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, + + /* U+50D5 "僕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xc1, 0xb3, 0x0, 0x0, + 0x0, 0x3, 0xb1, 0x30, 0xd0, 0xc0, 0x34, 0x0, + 0x0, 0x8, 0x50, 0xb1, 0xd0, 0xc0, 0xb7, 0x0, + 0x0, 0xc, 0x0, 0x62, 0xd0, 0xc5, 0x51, 0x10, + 0x0, 0x4e, 0x17, 0x66, 0xa6, 0xa8, 0x69, 0x90, + 0x0, 0xad, 0x0, 0x9, 0x30, 0xc, 0x10, 0x0, + 0x3, 0x6d, 0x0, 0x2, 0x80, 0x53, 0x34, 0x0, + 0x7, 0xd, 0x2, 0x66, 0x6c, 0x66, 0x66, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb, 0x1, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x47, 0x6c, 0x66, 0x62, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x7b, 0x66, 0x6b, 0x60, + 0x0, 0xd, 0x0, 0x0, 0xa1, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x30, 0x1a, 0x20, 0x0, + 0x0, 0xe, 0x3, 0x82, 0x0, 0x1, 0xbc, 0x80, + 0x0, 0x3, 0x33, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+50F9 "價" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x40, + 0x0, 0xb, 0x54, 0x76, 0xd6, 0x6d, 0x66, 0x50, + 0x0, 0xe, 0x0, 0x86, 0xd6, 0x6d, 0x6a, 0x10, + 0x0, 0x4c, 0x10, 0xb0, 0xc0, 0xb, 0xc, 0x0, + 0x0, 0xad, 0x0, 0xd6, 0xd6, 0x6d, 0x6d, 0x0, + 0x0, 0x9c, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, + 0x6, 0x2c, 0x0, 0x68, 0x66, 0x66, 0x96, 0x0, + 0x6, 0xc, 0x0, 0x65, 0x0, 0x0, 0x64, 0x0, + 0x10, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, + 0x0, 0xc, 0x0, 0x59, 0x66, 0x66, 0xa4, 0x0, + 0x0, 0xc, 0x0, 0x55, 0x0, 0x0, 0x64, 0x0, + 0x0, 0xc, 0x0, 0x58, 0x76, 0x67, 0x93, 0x0, + 0x0, 0xc, 0x0, 0x1b, 0x70, 0x3, 0x98, 0x20, + 0x0, 0xd, 0x3, 0x92, 0x0, 0x0, 0x6, 0xe1, + 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5104 "億" */ + 0x0, 0x3, 0xb0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x0, 0x0, 0xd0, 0x1, 0x30, 0x0, + 0xd, 0x21, 0x88, 0x67, 0x6b, 0x67, 0x0, 0x3, + 0xc0, 0x0, 0x58, 0x3, 0xa0, 0x0, 0x0, 0x9e, + 0x25, 0x66, 0xa6, 0xa6, 0x6b, 0x70, 0x19, 0xd0, + 0x22, 0x0, 0x0, 0x2, 0x0, 0x7, 0x1d, 0x0, + 0xb6, 0x66, 0x66, 0xe0, 0x1, 0x40, 0xd0, 0xb, + 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, 0xb1, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, 0xa, 0x66, + 0x76, 0x6a, 0x0, 0x0, 0xd, 0x0, 0x18, 0x38, + 0x40, 0x61, 0x0, 0x0, 0xd0, 0x53, 0xb2, 0x17, + 0x42, 0xd1, 0x0, 0xd, 0xd, 0x1b, 0x30, 0x9, + 0x17, 0x40, 0x0, 0xe1, 0x40, 0x7d, 0xcc, 0xd4, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+512A "優" */ + 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x6, 0xa1, 0x78, 0x6b, 0x66, 0x96, 0x20, + 0x0, 0xb, 0x30, 0xe, 0x55, 0x55, 0xe1, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x5c, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xbb, 0x8, 0x6d, 0x66, 0x66, 0xd6, 0xb0, + 0x3, 0x6b, 0x2b, 0x14, 0x49, 0x30, 0x14, 0x70, + 0x6, 0x1b, 0x12, 0x97, 0x51, 0x66, 0x67, 0x0, + 0x0, 0x1b, 0x8, 0x54, 0xca, 0xad, 0x5b, 0x0, + 0x0, 0x1b, 0x0, 0x6, 0x80, 0x0, 0x10, 0x0, + 0x0, 0x1b, 0x0, 0x2e, 0x86, 0x69, 0xe2, 0x0, + 0x0, 0x1b, 0x2, 0x91, 0x84, 0x6b, 0x10, 0x0, + 0x0, 0x1b, 0x3, 0x0, 0x2e, 0xd3, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x38, 0x81, 0x3a, 0xda, 0x60, + 0x0, 0x13, 0x15, 0x30, 0x0, 0x0, 0x15, 0x10, + + /* U+5143 "元" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x5, 0x76, 0x66, 0x66, 0x69, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x3, 0x76, 0x66, 0x86, 0x68, 0x66, 0x7c, 0x40, + 0x0, 0x0, 0x4, 0xb0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x30, 0xf, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2d, 0x0, 0xf, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xb5, 0x0, 0xf, 0x0, 0x0, 0x80, + 0x0, 0x8, 0x80, 0x0, 0xe, 0x20, 0x4, 0xc0, + 0x0, 0x95, 0x0, 0x0, 0x8, 0xdd, 0xde, 0xa0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5144 "兄" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0xe4, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0xe6, 0x6d, 0x67, 0xc6, 0xe1, + 0x0, 0x0, 0x70, 0x2c, 0x3, 0xc0, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0x3, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x3, 0xc0, 0x0, 0x20, 0x0, 0x0, + 0xc3, 0x3, 0xc0, 0x0, 0x50, 0x0, 0x3, 0xc0, + 0x3, 0xc0, 0x0, 0x71, 0x0, 0x2c, 0x20, 0x2, + 0xc0, 0x0, 0xb7, 0x4, 0x91, 0x0, 0x0, 0xcd, + 0xdd, 0xf8, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5145 "充" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x30, 0x6, 0x76, + 0x66, 0x68, 0x96, 0x66, 0x6b, 0x60, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xb1, 0x2, 0x50, 0x0, 0x0, 0x0, 0x6, 0x80, + 0x0, 0x3, 0xb3, 0x0, 0x0, 0xc, 0xb8, 0x88, + 0x87, 0x68, 0xf4, 0x0, 0x0, 0x65, 0x6c, 0x10, + 0xe0, 0x8, 0x80, 0x0, 0x0, 0x5, 0x90, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0xe, 0x0, + 0x0, 0x60, 0x0, 0x5, 0x90, 0x0, 0xe0, 0x0, + 0x8, 0x0, 0x4, 0xa0, 0x0, 0xe, 0x0, 0x2, + 0xc0, 0x6, 0x60, 0x0, 0x0, 0x9d, 0xdd, 0xea, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5148 "先" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x90, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0xa3, 0x0, 0x10, 0x0, 0x0, 0xd, + 0x86, 0x6c, 0x86, 0x6b, 0xa0, 0x0, 0x4, 0x90, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, + 0xa, 0x30, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x50, 0x7, 0x66, 0x69, 0x88, + 0x89, 0x66, 0x7a, 0x30, 0x0, 0x0, 0x95, 0x4, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x49, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x4, 0x90, + 0x0, 0x40, 0x0, 0x0, 0x85, 0x0, 0x49, 0x0, + 0x6, 0x10, 0x0, 0x5a, 0x0, 0x4, 0xa0, 0x0, + 0x85, 0x1, 0x86, 0x0, 0x0, 0xc, 0xcc, 0xcd, + 0x60, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5149 "光" */ + 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x90, 0x3, 0xa0, 0x8, 0xa0, 0x0, + 0x0, 0x0, 0x6c, 0x3, 0xa0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0xe, 0x13, 0xa0, 0x66, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x3, 0xa0, 0x80, 0x3, 0x20, + 0x5, 0x76, 0x67, 0xa6, 0x8b, 0x66, 0x69, 0x80, + 0x0, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x90, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x0, 0x59, 0x0, 0xd, 0x0, 0x0, 0x70, + 0x0, 0x3, 0xa0, 0x0, 0xc, 0x10, 0x0, 0xd1, + 0x0, 0x67, 0x0, 0x0, 0x6, 0xdc, 0xcd, 0xc1, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514B "克" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x31, 0x3, 0x76, + 0x66, 0x66, 0xd6, 0x66, 0x6a, 0x80, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x67, 0xc6, 0x6c, 0x40, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xe6, 0x88, 0x6a, + 0x6d, 0x10, 0x0, 0x0, 0x6, 0x9, 0x50, 0xb0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd1, 0xb, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x4a, 0x0, 0xb0, 0x0, + 0x6, 0x0, 0x0, 0x2c, 0x10, 0xb, 0x0, 0x1, + 0xa0, 0x2, 0x77, 0x0, 0x0, 0x9b, 0xbb, 0xdc, + 0x13, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514D "免" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x66, 0x6e, 0x80, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x80, 0x0, 0x60, 0x0, + 0x2, 0xab, 0x86, 0x6c, 0xa6, 0x66, 0xf2, 0x0, + 0x5, 0xa, 0x30, 0xa, 0x60, 0x0, 0xe0, 0x0, + 0x0, 0xa, 0x30, 0xc, 0x40, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x86, 0x6f, 0x8a, 0x66, 0xe0, 0x0, + 0x0, 0x3, 0x0, 0x2e, 0x3b, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x88, 0x3b, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x3, 0xe1, 0x3b, 0x0, 0x0, 0x80, + 0x0, 0x0, 0x4d, 0x30, 0x2b, 0x0, 0x3, 0xc0, + 0x0, 0x39, 0x70, 0x0, 0xe, 0xcc, 0xce, 0xb1, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5152 "兒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x74, 0x14, 0x76, 0x6e, 0x10, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd1, + 0x5, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, + 0x82, 0x18, 0x66, 0xe0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x7d, 0x66, + 0xe6, 0x6c, 0x0, 0x0, 0x1, 0x3, 0xa0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, + 0x0, 0x50, 0x0, 0x4, 0xa0, 0x0, 0xe0, 0x0, + 0x8, 0x0, 0x3, 0xa0, 0x0, 0xf, 0x21, 0x15, + 0xe1, 0x6, 0x70, 0x0, 0x0, 0x7a, 0xbb, 0xa7, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+515A "党" */ + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x30, 0xd0, 0xb, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0xd, 0x3, 0xb0, 0x0, 0x0, 0x4, + 0x0, 0x40, 0xd0, 0x80, 0x0, 0x60, 0x2, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0x8d, 0x40, 0xd5, 0x3, + 0x0, 0x0, 0x4, 0x5, 0x0, 0x1, 0x0, 0xc6, + 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, 0xb, 0x10, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0x9, 0x1c, 0xb, + 0x15, 0x0, 0x0, 0x0, 0x0, 0x4, 0x90, 0xb1, + 0x0, 0x3, 0x0, 0x0, 0x0, 0xb2, 0xb, 0x10, + 0x0, 0x61, 0x0, 0x0, 0x88, 0x0, 0xb1, 0x0, + 0x7, 0x60, 0x16, 0x83, 0x0, 0x6, 0xdc, 0xcc, + 0xe7, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5165 "入" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x6, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0xd6, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0x1a, 0x10, 0x0, 0x0, 0x6, 0xf7, 0x0, + 0x1, 0x91, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5167 "內" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x64, 0x0, + 0x0, 0x20, 0xa7, 0x66, 0x68, 0xb6, 0x66, 0x7e, + 0xa, 0x30, 0x0, 0x4d, 0x0, 0x2, 0xc0, 0xa3, + 0x0, 0x8, 0xc3, 0x0, 0x2c, 0xa, 0x30, 0x0, + 0xc2, 0x90, 0x2, 0xc0, 0xa3, 0x0, 0x57, 0xb, + 0x20, 0x2c, 0xa, 0x30, 0xb, 0x0, 0x5c, 0x2, + 0xc0, 0xa3, 0x8, 0x10, 0x0, 0xbb, 0x3c, 0xa, + 0x36, 0x20, 0x0, 0x1, 0xa5, 0xc0, 0xa3, 0x10, + 0x0, 0x0, 0x0, 0x2b, 0xa, 0x30, 0x0, 0x0, + 0x1, 0x13, 0xb0, 0xa2, 0x0, 0x0, 0x0, 0x28, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5168 "全" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x1b, 0x30, 0x0, 0x0, 0x4e, 0xd7, 0x30, + 0x3, 0x95, 0x76, 0x6d, 0x76, 0x65, 0x5d, 0x60, + 0x23, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, + 0x0, 0x7, 0x76, 0x6d, 0x76, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2, 0x0, + 0x4, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5169 "兩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x5, + 0x76, 0x66, 0x6a, 0x76, 0x66, 0x69, 0x70, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0xa, 0x20, 0x0, 0x2, 0x0, 0xe, 0x66, + 0x66, 0xc7, 0x66, 0x66, 0xe2, 0x0, 0xd0, 0x20, + 0xa, 0x22, 0x0, 0xd, 0x0, 0xd, 0x6, 0x10, + 0xa2, 0x16, 0x0, 0xd0, 0x0, 0xd0, 0xb, 0xa, + 0x20, 0x75, 0xd, 0x0, 0xd, 0x2, 0xe7, 0xa2, + 0xa, 0xd1, 0xd0, 0x0, 0xd0, 0x92, 0xea, 0x22, + 0x87, 0x9d, 0x0, 0xd, 0x35, 0xb, 0xb2, 0x80, + 0x2b, 0xd0, 0x0, 0xd5, 0x0, 0x1a, 0x60, 0x0, + 0x2d, 0x0, 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0xe0, 0x0, 0xd0, 0x0, 0xa, 0x20, 0x16, 0xec, + 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, 0x3, 0x10, + 0x0, + + /* U+516B "八" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x60, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc0, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x84, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0xb, 0x70, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x0, 0x2, 0xf5, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0x71, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+516C "公" */ + 0x0, 0x0, 0x12, 0x0, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xe1, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x8, 0x70, 0x0, 0x0, 0x7, 0x60, + 0x2, 0x0, 0xc, 0x50, 0x0, 0x4, 0x70, 0x0, + 0xba, 0x0, 0x2e, 0x81, 0x3, 0x60, 0x0, 0x2e, + 0x10, 0x0, 0x2d, 0x70, 0x20, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x80, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x1a, + 0x0, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x1, 0xd8, 0x77, 0x77, 0x65, 0xc9, + 0x0, 0x0, 0xa, 0x64, 0x20, 0x0, 0x4, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+516D "六" */ + 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x10, + 0x7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x90, 0x2, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0xa, 0x80, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x1, 0xf6, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5171 "共" */ + 0x0, 0x0, 0x8, 0x10, 0x0, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x2, 0x0, + 0x3, 0x76, 0x6e, 0x66, 0x66, 0xe6, 0x6b, 0x60, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x20, + 0x17, 0x66, 0x6d, 0x66, 0x66, 0xd6, 0x6b, 0xd2, + 0x1, 0x0, 0x4, 0x20, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x90, 0x4, 0x82, 0x0, 0x0, + 0x0, 0x1, 0xc6, 0x0, 0x0, 0x1b, 0x91, 0x0, + 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, 0xae, 0x0, + 0x3, 0x81, 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5176 "其" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x4, 0x0, + 0x1, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x7a, 0x30, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x5, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x6d, 0xc1, + 0x1, 0x0, 0x5, 0x40, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x80, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x6, 0xc2, 0x0, 0x0, 0x9, 0xe4, 0x0, + 0x1, 0x86, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+5177 "具" */ + 0x0, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0xb, 0x40, + 0x7, 0x66, 0x68, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x5e, 0x20, 0x0, 0x66, 0x0, 0x0, + 0x0, 0x8, 0xa1, 0x0, 0x0, 0x5, 0xd4, 0x0, + 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5185 "内" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x0, 0x39, 0x66, 0x67, 0xe6, 0x66, 0x7d, + 0x2, 0xb0, 0x0, 0x3b, 0x0, 0x3, 0xb0, 0x2b, + 0x0, 0x6, 0x90, 0x0, 0x3b, 0x2, 0xb0, 0x0, + 0xb9, 0x20, 0x3, 0xb0, 0x2b, 0x0, 0x2c, 0xb, + 0x70, 0x3b, 0x2, 0xb0, 0xb, 0x20, 0xc, 0x93, + 0xb0, 0x2b, 0x19, 0x20, 0x0, 0x2e, 0x3b, 0x2, + 0xd6, 0x0, 0x0, 0x0, 0x33, 0xb0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x2, 0xb0, 0x0, 0x0, + 0x2, 0x15, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x39, + 0xf6, 0x1, 0x30, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+5186 "円" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd, 0x66, + 0x66, 0xa6, 0x66, 0x68, 0xe0, 0xd1, 0x0, 0xd, + 0x0, 0x0, 0x3a, 0xc, 0x10, 0x0, 0xd0, 0x0, + 0x3, 0xa0, 0xc1, 0x0, 0xd, 0x0, 0x0, 0x3a, + 0xc, 0x10, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0xc6, + 0x66, 0x6e, 0x66, 0x66, 0x8a, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x3, 0xa0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xc, 0x10, 0x0, 0x0, 0x0, 0x3, + 0xa0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xa0, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xd, 0x10, 0x0, 0x0, + 0x5, 0xaf, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, + + /* U+518A "冊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x96, 0x69, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd6, 0x40, + 0x7, 0x6e, 0x66, 0xe6, 0x6e, 0x66, 0xe6, 0x60, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x10, 0x0, 0x6b, 0xd0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + + /* U+518D "再" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, + 0x28, 0x66, 0x66, 0xc6, 0x66, 0x68, 0x60, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x86, 0x66, 0xe6, 0x66, 0xb4, 0x0, 0x0, 0xd, + 0x10, 0xd, 0x0, 0xc, 0x20, 0x0, 0x0, 0xc1, + 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6d, 0x10, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc, 0x10, 0xd, + 0x0, 0xc, 0x11, 0x1, 0x66, 0xd6, 0x66, 0xe6, + 0x66, 0xd7, 0xf6, 0x2, 0xc, 0x10, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x7d, 0xf0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x0, + + /* U+5199 "写" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x91, 0x8, 0x86, + 0x66, 0x66, 0x66, 0x66, 0xf6, 0xe, 0x32, 0x30, + 0x0, 0x0, 0x6, 0x30, 0x25, 0x5, 0xb0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x7, 0xa6, 0x66, 0x66, + 0x7d, 0x20, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x2f, 0x66, 0x66, 0x66, 0x68, 0xc0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7, 0x60, 0x57, 0x66, 0x66, + 0x66, 0x8b, 0x29, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x31, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, + + /* U+51AC "冬" */ + 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x3, 0xd6, 0x66, 0x6a, 0xe1, 0x0, 0x0, 0x0, + 0xb6, 0x30, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x74, + 0x8, 0x21, 0xc4, 0x0, 0x0, 0x0, 0x54, 0x0, + 0xb, 0xc4, 0x0, 0x0, 0x0, 0x12, 0x0, 0x4, + 0xcc, 0x80, 0x0, 0x0, 0x0, 0x0, 0x19, 0x91, + 0x8, 0xd7, 0x10, 0x0, 0x1, 0x78, 0x21, 0x73, + 0x3, 0xaf, 0xb7, 0x5, 0x50, 0x0, 0x1, 0xca, + 0x0, 0x28, 0x10, 0x0, 0x0, 0x0, 0x0, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x97, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, + + /* U+51B7 "冷" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, + 0x6, 0x10, 0x0, 0x0, 0xac, 0x10, 0x0, 0x0, + 0x2, 0xe2, 0x2, 0x0, 0xe1, 0x80, 0x0, 0x0, + 0x0, 0xa7, 0x5, 0x7, 0x80, 0x74, 0x0, 0x0, + 0x0, 0x20, 0x41, 0xc, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x70, 0x93, 0x1c, 0x12, 0xe7, 0x0, + 0x0, 0x3, 0x46, 0x40, 0x9, 0x70, 0x3e, 0xb2, + 0x0, 0xa, 0x42, 0x0, 0x1, 0x11, 0x21, 0x0, + 0x0, 0x69, 0x0, 0x76, 0x66, 0x6c, 0xc0, 0x0, + 0x7, 0xf4, 0x0, 0x0, 0x0, 0x2c, 0x10, 0x0, + 0x0, 0xd1, 0x0, 0x2, 0x10, 0x92, 0x0, 0x0, + 0x1, 0xf1, 0x0, 0x0, 0x99, 0x30, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+51CD "凍" */ + 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2, + 0x70, 0x0, 0x0, 0xb, 0x10, 0x2, 0x20, 0x7, + 0xc0, 0x76, 0x66, 0xd6, 0x66, 0x87, 0x0, 0xb, + 0x10, 0x30, 0xb, 0x10, 0x3, 0x0, 0x0, 0x5, + 0xe, 0x66, 0xd6, 0x66, 0xe0, 0x0, 0x0, 0x50, + 0xd0, 0xb, 0x10, 0xd, 0x0, 0x0, 0x42, 0xd, + 0x66, 0xd6, 0x66, 0xd0, 0x0, 0x9, 0x0, 0xd0, + 0xb, 0x10, 0xd, 0x0, 0x15, 0x90, 0xe, 0x69, + 0xe9, 0x66, 0xc0, 0x4, 0xe5, 0x0, 0x21, 0xcb, + 0x71, 0x0, 0x0, 0xa, 0x30, 0x0, 0x94, 0xb2, + 0x90, 0x0, 0x0, 0xd3, 0x0, 0x57, 0xb, 0x15, + 0x80, 0x0, 0xf, 0x30, 0x47, 0x0, 0xb1, 0x9, + 0xb2, 0x0, 0x41, 0x34, 0x0, 0xb, 0x10, 0x9, + 0x80, 0x0, 0x1, 0x0, 0x0, 0x50, 0x0, 0x0, + 0x0, + + /* U+51DD "凝" */ + 0x0, 0x0, 0xc, 0x11, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x70, 0xc, 0x1b, 0x31, 0x76, 0x6e, 0x50, + 0x0, 0xd5, 0xc, 0x50, 0x30, 0x3, 0x53, 0x0, + 0x0, 0x41, 0x3c, 0x0, 0x90, 0x6, 0xb0, 0x0, + 0x0, 0x2, 0x28, 0xaa, 0x91, 0x0, 0xc0, 0x0, + 0x0, 0x6, 0xb, 0x20, 0x5, 0x76, 0x86, 0xc5, + 0x0, 0x7, 0x1c, 0x2, 0x40, 0x1, 0xb0, 0x80, + 0x0, 0x45, 0x76, 0xb7, 0x50, 0x91, 0xb0, 0x0, + 0x5, 0xd1, 0x40, 0x92, 0x10, 0xc1, 0xc6, 0xc1, + 0x3, 0xe1, 0x86, 0xb7, 0xb4, 0xc1, 0xb0, 0x0, + 0x2, 0xc0, 0x0, 0xc2, 0x0, 0xd1, 0xb0, 0x0, + 0x6, 0xb0, 0x2, 0xa8, 0x64, 0x88, 0xb0, 0x0, + 0x3, 0x70, 0xa, 0x11, 0xa8, 0x12, 0xc5, 0x10, + 0x0, 0x0, 0x72, 0x0, 0x26, 0x0, 0x19, 0xf5, + 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+51E6 "処" */ + 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x2, 0x0, 0x40, 0x0, + 0x0, 0xb, 0x20, 0x10, 0xe, 0x67, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0xb8, 0xd, 0x2, 0xb0, 0x0, + 0x0, 0x67, 0x0, 0xa2, 0xc, 0x2, 0xb0, 0x0, + 0x0, 0xb3, 0x0, 0xc0, 0x1b, 0x2, 0xb0, 0x0, + 0x4, 0x55, 0x1, 0xb0, 0x39, 0x2, 0xb0, 0x0, + 0x7, 0x6, 0x15, 0x70, 0x74, 0x2, 0xb0, 0x0, + 0x0, 0x1, 0x7b, 0x20, 0xb0, 0x2, 0xb0, 0x40, + 0x0, 0x0, 0x9b, 0x7, 0x40, 0x2, 0xb0, 0x80, + 0x0, 0x0, 0xac, 0x34, 0x0, 0x0, 0xdb, 0xe3, + 0x0, 0x7, 0x53, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x2b, 0xd8, 0x53, 0x33, 0x42, + 0x6, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xb0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+51FA "出" */ + 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x4, 0x70, 0x0, + 0xe0, 0x0, 0xc, 0x10, 0x49, 0x0, 0xe, 0x0, + 0x0, 0xe0, 0x4, 0x90, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x49, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x7, + 0xb6, 0x66, 0xe6, 0x66, 0x6e, 0x0, 0x1, 0x0, + 0xe, 0x0, 0x0, 0x60, 0x8, 0x20, 0x0, 0xe0, + 0x0, 0x4, 0x30, 0xc2, 0x0, 0xe, 0x0, 0x0, + 0x6a, 0xc, 0x10, 0x0, 0xe0, 0x0, 0x6, 0x80, + 0xc1, 0x0, 0xe, 0x0, 0x0, 0x68, 0xd, 0x10, + 0x0, 0xe0, 0x0, 0x6, 0x80, 0x96, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x10, + + /* U+5206 "分" */ + 0x0, 0x0, 0x4, 0x0, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd1, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x0, 0x4, 0xe5, 0x0, 0x8, 0x46, 0x67, + 0x76, 0x66, 0xe4, 0xec, 0x25, 0x10, 0x0, 0x77, + 0x0, 0x2b, 0x0, 0x20, 0x0, 0x0, 0xa, 0x40, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x28, 0x10, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, + + /* U+5207 "切" */ + 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, + 0xc, 0x10, 0x28, 0x68, 0xd6, 0x6c, 0x60, 0x0, + 0xc1, 0x1, 0x10, 0x4b, 0x0, 0xb3, 0x0, 0xc, + 0x55, 0xa8, 0x5, 0xa0, 0xb, 0x31, 0x66, 0xd2, + 0x0, 0x0, 0x78, 0x0, 0xc3, 0x0, 0xc, 0x10, + 0x0, 0x9, 0x60, 0xc, 0x20, 0x0, 0xc1, 0x0, + 0x0, 0xc3, 0x0, 0xd1, 0x0, 0xc, 0x10, 0x2, + 0xe, 0x0, 0xe, 0x10, 0x0, 0xc1, 0x17, 0x16, + 0x90, 0x0, 0xe0, 0x0, 0xd, 0x79, 0x0, 0xd1, + 0x0, 0xe, 0x0, 0x0, 0xe9, 0x0, 0x87, 0x0, + 0x2, 0xd0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x42, + 0x8a, 0x0, 0x0, 0x0, 0x65, 0x0, 0x2, 0xbf, + 0x30, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+520A "刊" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xa, 0x20, + 0x67, 0x69, 0x66, 0xa3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xb2, 0x0, 0x2, 0xb0, 0xe, 0x0, 0x0, + 0xb, 0x20, 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, + 0xb2, 0x0, 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, + 0x20, 0x46, 0x2c, 0x0, 0xe0, 0x18, 0x66, 0xd7, + 0x66, 0x52, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, + 0x2, 0xc0, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x2, + 0x60, 0xe, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x24, + 0x4d, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x5e, + 0x90, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, + 0x0, + + /* U+5217 "列" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, + 0x36, 0x66, 0x66, 0x6e, 0x50, 0x0, 0xe0, 0x0, + 0x10, 0x98, 0x0, 0x0, 0x10, 0xe, 0x0, 0x0, + 0xd, 0x20, 0x0, 0xd, 0x20, 0xe0, 0x0, 0x3, + 0xe6, 0x6a, 0x50, 0xd0, 0xe, 0x0, 0x0, 0xa4, + 0x0, 0xd3, 0xd, 0x0, 0xe0, 0x0, 0x2d, 0x30, + 0x1d, 0x0, 0xd0, 0xe, 0x0, 0x9, 0x1c, 0x17, + 0x80, 0xd, 0x0, 0xe0, 0x5, 0x20, 0x95, 0xd2, + 0x0, 0xd0, 0xe, 0x0, 0x20, 0x2, 0x69, 0x0, + 0xd, 0x0, 0xe0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0x1b, 0x20, 0x0, 0x1, + 0x0, 0xe0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x33, + 0x3f, 0x0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+521D "初" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x33, 0x24, 0x68, 0x76, 0x66, 0xe3, + 0x6, 0x76, 0x6d, 0x70, 0x9, 0x40, 0x0, 0xe0, + 0x0, 0x0, 0x3b, 0x0, 0xa, 0x30, 0x0, 0xd0, + 0x0, 0x0, 0xc1, 0x46, 0xb, 0x20, 0x1, 0xc0, + 0x0, 0x9, 0xd0, 0xb2, 0xd, 0x0, 0x2, 0xb0, + 0x0, 0x65, 0xd9, 0x20, 0xd, 0x0, 0x3, 0xa0, + 0x5, 0x40, 0xd4, 0xd2, 0x2a, 0x0, 0x4, 0x90, + 0x1, 0x0, 0xd0, 0x54, 0x66, 0x0, 0x6, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0x7, 0x60, + 0x0, 0x0, 0xd0, 0x5, 0x60, 0x0, 0x9, 0x50, + 0x0, 0x0, 0xd0, 0x19, 0x0, 0x31, 0x1c, 0x20, + 0x0, 0x0, 0xe1, 0x70, 0x0, 0x3a, 0xfb, 0x0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+5224 "判" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x20, 0xd, 0x0, 0x81, 0x0, 0xb, 0x10, 0x9, + 0x30, 0xd0, 0x3d, 0x21, 0x70, 0xb1, 0x0, 0x4e, + 0xd, 0xa, 0x10, 0x1b, 0xb, 0x10, 0x0, 0x90, + 0xd3, 0x30, 0x1, 0xb0, 0xb1, 0x1, 0x66, 0x6e, + 0x66, 0xd4, 0x1b, 0xb, 0x10, 0x2, 0x0, 0xc0, + 0x0, 0x1, 0xb0, 0xb1, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x1b, 0xb, 0x10, 0x56, 0x67, 0xd6, 0x6b, + 0xb2, 0xb0, 0xb1, 0x1, 0x0, 0x67, 0x0, 0x0, + 0x1b, 0xb, 0x10, 0x0, 0xb, 0x10, 0x0, 0x2, + 0xc0, 0xb1, 0x0, 0x6, 0x70, 0x0, 0x0, 0x2, + 0xb, 0x10, 0x3, 0x80, 0x0, 0x0, 0x0, 0x21, + 0xc1, 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xdd, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + + /* U+5225 "別" */ + 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x6, 0x10, + 0xd, 0x66, 0x66, 0xd5, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0xb, 0x10, 0x0, 0xc, 0x0, 0xd, + 0x0, 0x0, 0xb1, 0xc, 0x10, 0xc0, 0x0, 0xd6, + 0x66, 0x6d, 0x20, 0xd0, 0xc, 0x0, 0x8, 0x62, + 0x0, 0x50, 0xd, 0x0, 0xc0, 0x0, 0xc, 0x20, + 0x0, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xc6, 0x66, + 0xa3, 0xd, 0x0, 0xc0, 0x0, 0xd, 0x0, 0xd, + 0x0, 0xd0, 0xc, 0x0, 0x1, 0xb0, 0x0, 0xe0, + 0xd, 0x0, 0xc0, 0x0, 0x66, 0x0, 0x2c, 0x0, + 0x70, 0xc, 0x0, 0xb, 0x0, 0x5, 0x90, 0x0, + 0x0, 0xc0, 0x4, 0x60, 0x22, 0xa5, 0x0, 0x1, + 0x2e, 0x0, 0x80, 0x0, 0xbc, 0x0, 0x1, 0x6e, + 0xc0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x21, + 0x0, + + /* U+5229 "利" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xe5, 0x0, 0x0, 0xc3, 0x2, + 0x56, 0x8f, 0x53, 0x10, 0x0, 0xc, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0xb, 0x20, 0xc1, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xd0, 0xc, 0x10, 0x56, 0x66, + 0xe6, 0x7e, 0x2d, 0x0, 0xc1, 0x1, 0x0, 0x3f, + 0x0, 0x0, 0xd0, 0xc, 0x10, 0x0, 0xa, 0xf4, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x3, 0xce, 0x5c, + 0x30, 0xd0, 0xc, 0x10, 0x0, 0xb2, 0xe0, 0x5d, + 0xd, 0x0, 0xc1, 0x0, 0x84, 0xe, 0x0, 0x30, + 0xd0, 0xc, 0x10, 0x64, 0x0, 0xe0, 0x0, 0x6, + 0x0, 0xc1, 0x13, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x55, + 0xe1, 0x0, 0x0, 0xf, 0x0, 0x0, 0x2, 0xcd, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x0, + + /* U+5230 "到" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x29, 0x3, + 0x76, 0x69, 0x66, 0x95, 0x0, 0x2, 0xa0, 0x0, + 0x6, 0xd1, 0x0, 0x2, 0x90, 0x2a, 0x0, 0x1, + 0xa0, 0x24, 0x0, 0x3b, 0x2, 0xa0, 0x1, 0x80, + 0x0, 0x78, 0x2, 0xa0, 0x2a, 0x1, 0xeb, 0x8b, + 0x65, 0xd7, 0x2a, 0x2, 0xa0, 0x2, 0x0, 0xf1, + 0x4, 0x42, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x2a, 0x2, 0xa0, 0x26, 0x66, 0xe6, 0x6d, + 0x22, 0xa0, 0x2a, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x3a, 0x2, 0xa0, 0x0, 0x0, 0xe0, 0x0, 0x3, + 0x90, 0x2a, 0x0, 0x0, 0xe, 0x14, 0x63, 0x0, + 0x2, 0xa0, 0x46, 0x9b, 0xb7, 0x20, 0x0, 0x10, + 0x4a, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x3, 0x9f, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, + + /* U+5236 "制" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x93, 0x0, + 0x43, 0xc, 0x0, 0x0, 0x0, 0xa, 0x20, 0x9, + 0x50, 0xc0, 0x21, 0x0, 0x60, 0xa2, 0x0, 0xc6, + 0x6d, 0x68, 0x70, 0x1c, 0xa, 0x20, 0x43, 0x0, + 0xc0, 0x0, 0x0, 0xb0, 0xa2, 0x8, 0x66, 0x6d, + 0x66, 0xb7, 0xb, 0xa, 0x20, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xb0, 0xa2, 0x0, 0xa6, 0x6d, 0x66, + 0xc1, 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, + 0x0, 0xb0, 0xa2, 0x0, 0xc0, 0xc, 0x0, 0xc0, + 0xb, 0xa, 0x20, 0xc, 0x0, 0xc0, 0xc, 0x1, + 0x70, 0xa2, 0x0, 0xc0, 0xc, 0x49, 0xa0, 0x0, + 0xa, 0x20, 0x7, 0x0, 0xc0, 0x52, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0xc, 0x0, 0x0, 0x5, 0xcf, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x30, + + /* U+5238 "券" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0xe, 0x30, 0x33, 0x0, 0x0, + 0x0, 0x4, 0xc1, 0x2e, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x69, 0x5, 0x40, 0x10, 0x0, + 0x1, 0x66, 0x76, 0xc9, 0x68, 0x67, 0xf4, 0x0, + 0x0, 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x1b, 0x20, + 0x17, 0x66, 0x6e, 0x66, 0x6a, 0x76, 0x66, 0x40, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, 0x9, 0x96, 0x66, 0x66, 0x9e, 0xc7, 0x40, + 0x4, 0x71, 0x1, 0xd0, 0x0, 0xa4, 0x3c, 0x80, + 0x11, 0x0, 0x6, 0x80, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x1, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0x49, 0x30, 0x1, 0x9f, 0x80, 0x0, 0x0, + 0x3, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+523B "刻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0xc0, + 0x5, 0x66, 0x6b, 0x66, 0xb9, 0xa, 0x20, 0xc0, + 0x1, 0x10, 0x7a, 0x0, 0x0, 0xd, 0x0, 0xc0, + 0x0, 0x1, 0xc1, 0x7, 0x10, 0xd, 0x0, 0xc0, + 0x0, 0x9, 0x20, 0x2e, 0x30, 0xd, 0x0, 0xc0, + 0x0, 0xab, 0x75, 0xc4, 0x0, 0xd, 0x0, 0xc0, + 0x0, 0x21, 0x7, 0x80, 0xc3, 0xd, 0x0, 0xc0, + 0x0, 0x0, 0x68, 0x8, 0xa0, 0xd, 0x0, 0xc0, + 0x0, 0x7, 0x60, 0x5c, 0x0, 0xd, 0x0, 0xc0, + 0x2, 0x72, 0x3, 0xe3, 0x0, 0xb, 0x0, 0xc0, + 0x3, 0x0, 0x4b, 0x1a, 0x60, 0x0, 0x0, 0xc0, + 0x0, 0x7, 0x70, 0x1, 0xf1, 0x0, 0x1, 0xc0, + 0x4, 0x71, 0x0, 0x0, 0x50, 0x2, 0x8f, 0x90, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + + /* U+5247 "則" */ + 0x0, 0x20, 0x0, 0x4, 0x0, 0x0, 0x9, 0x20, + 0xe, 0x66, 0x66, 0xe2, 0x0, 0x0, 0xc0, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0x60, 0xc, 0x0, 0xd, + 0x66, 0x66, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, + 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, + 0xd0, 0xd, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6e, + 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, 0x0, 0xc0, + 0xd, 0x0, 0xc0, 0x0, 0x19, 0x22, 0x40, 0x0, + 0x40, 0xc, 0x0, 0x4, 0xb1, 0x8, 0x60, 0x0, + 0x0, 0xc0, 0x0, 0x90, 0x0, 0xd, 0x60, 0x0, + 0xd, 0x0, 0x70, 0x0, 0x0, 0x49, 0x1, 0x7e, + 0xd0, 0x11, 0x0, 0x0, 0x0, 0x10, 0x0, 0x21, + 0x0, + + /* U+524A "削" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd1, 0x0, 0x0, 0x0, 0x82, 0x26, 0x0, + 0xd0, 0x1d, 0x0, 0x0, 0xd0, 0x9, 0x80, 0xd0, + 0x83, 0x1, 0x0, 0xd0, 0x1, 0xb0, 0xd2, 0x40, + 0xd, 0x20, 0xd0, 0x9, 0x66, 0xe6, 0x6a, 0xd, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, + 0xe, 0x66, 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, + 0x0, 0x0, 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x66, + 0x66, 0x8a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, + 0x3a, 0xd, 0x0, 0xd0, 0xe, 0x0, 0x0, 0x3a, + 0x3, 0x0, 0xd0, 0xe, 0x0, 0x12, 0x6a, 0x0, + 0x21, 0xe0, 0xe, 0x0, 0x16, 0xf5, 0x0, 0x5e, + 0xc0, 0x3, 0x0, 0x0, 0x20, 0x0, 0x2, 0x10, + + /* U+524D "前" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x0, 0x0, 0x56, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x60, 0x4, 0x30, 0x8, 0x50, 0x57, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x65, 0x0, 0x12, 0x0, + 0x5, 0x0, 0x0, 0xa4, 0x0, 0x2, 0xc6, 0x67, + 0xc0, 0x1b, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, + 0x1, 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, + 0x1c, 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, + 0xc0, 0xc1, 0x0, 0x2, 0xc6, 0x67, 0xb0, 0x1c, + 0xc, 0x10, 0x0, 0x2a, 0x0, 0x2b, 0x1, 0xc0, + 0xc1, 0x0, 0x2, 0xa0, 0x2, 0xb0, 0x18, 0xc, + 0x10, 0x0, 0x2a, 0x0, 0x3a, 0x1, 0x54, 0xe0, + 0x0, 0x3, 0xa0, 0x3d, 0x70, 0x2, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, + + /* U+525B "剛" */ + 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, 0x81, 0xd6, + 0x66, 0x66, 0x6e, 0x30, 0x0, 0xd0, 0xd0, 0x81, + 0xb, 0xd, 0x0, 0x30, 0xd0, 0xd0, 0x4a, 0x36, + 0xd, 0x0, 0xd0, 0xd0, 0xd2, 0x47, 0x78, 0x4d, + 0x0, 0xc0, 0xd0, 0xd1, 0x32, 0xb2, 0x1d, 0x0, + 0xc0, 0xd0, 0xd0, 0x10, 0xa2, 0xd, 0x0, 0xc0, + 0xd0, 0xd0, 0xc0, 0xaa, 0x2d, 0x0, 0xc0, 0xd0, + 0xd0, 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd0, + 0xb0, 0xaa, 0x1d, 0x0, 0xc0, 0xd0, 0xd1, 0xb6, + 0x8c, 0xd, 0x0, 0x50, 0xd0, 0xd0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x10, 0xe0, 0xc0, 0x0, 0x6, 0xcd, 0x0, + 0x5d, 0xc0, 0x10, 0x0, 0x0, 0x42, 0x0, 0x1, + 0x20, + + /* U+5272 "割" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x92, 0x2, + 0x10, 0x37, 0x0, 0x30, 0x0, 0xc, 0x0, 0x86, + 0x67, 0x86, 0x6d, 0x50, 0x40, 0xc0, 0x2b, 0x0, + 0x2d, 0x2, 0x20, 0x1d, 0xc, 0x0, 0x36, 0x67, + 0xd6, 0x88, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, + 0x0, 0x0, 0xc, 0xc, 0x0, 0x16, 0x66, 0xd6, + 0xa3, 0x0, 0xc0, 0xc0, 0x0, 0x0, 0x1b, 0x0, + 0x11, 0xc, 0xc, 0x1, 0x86, 0x67, 0xd6, 0x68, + 0x80, 0xc0, 0xc0, 0x0, 0x10, 0x17, 0x3, 0x0, + 0x1c, 0xc, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x1, + 0x70, 0xc0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0xc, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, 0x17, 0xbe, + 0x0, 0x4, 0x0, 0x0, 0x10, 0x0, 0x2, 0x30, + + /* U+5275 "創" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x1, 0x90, + 0x0, 0x0, 0x5b, 0x62, 0x0, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0xc3, 0xa, 0xa0, 0x1, 0x0, 0xb0, + 0x0, 0x9, 0x35, 0x70, 0xb2, 0x2c, 0x0, 0xb0, + 0x0, 0x65, 0x0, 0xb0, 0x0, 0x1a, 0x0, 0xb0, + 0x5, 0x3b, 0x66, 0x66, 0xd0, 0x1a, 0x0, 0xb0, + 0x1, 0xc, 0x0, 0x0, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0xd, 0x66, 0x66, 0xc0, 0x1a, 0x0, 0xb0, + 0x0, 0x1c, 0x0, 0x0, 0x20, 0x1a, 0x0, 0xb0, + 0x0, 0x4e, 0x76, 0x66, 0xc2, 0x13, 0x0, 0xb0, + 0x0, 0x99, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xb0, + 0x1, 0x97, 0x50, 0x0, 0xc0, 0x0, 0x2, 0xb0, + 0x7, 0x17, 0x96, 0x66, 0xd0, 0x3, 0x9f, 0x80, + 0x12, 0x2, 0x0, 0x0, 0x10, 0x0, 0x3, 0x0, + + /* U+5283 "劃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x1, 0x80, + 0x0, 0x46, 0x6d, 0x66, 0xa0, 0x0, 0x1, 0xa0, + 0x0, 0x11, 0xc, 0x0, 0xc2, 0x1, 0x1, 0xa0, + 0x6, 0x76, 0x6d, 0x66, 0xd8, 0x2d, 0x1, 0xa0, + 0x0, 0x35, 0x5d, 0x55, 0xc0, 0xc, 0x1, 0xa0, + 0x0, 0x12, 0x1c, 0x12, 0x50, 0xc, 0x1, 0xa0, + 0x0, 0x47, 0x6d, 0x66, 0x52, 0xc, 0x1, 0xa0, + 0x6, 0x76, 0x69, 0x66, 0x69, 0x1c, 0x1, 0xa0, + 0x0, 0x96, 0x68, 0x66, 0xb0, 0xc, 0x1, 0xa0, + 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0xa0, + 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x5, 0x1, 0xa0, + 0x0, 0xc6, 0x6d, 0x66, 0xc0, 0x0, 0x1, 0xa0, + 0x0, 0x50, 0x0, 0x0, 0x62, 0x0, 0x2, 0xa0, + 0x5, 0x9a, 0x98, 0x75, 0x31, 0x4, 0xaf, 0x80, + 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+529B "力" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x3, 0x0, 0x6, 0x66, + 0x66, 0xf6, 0x66, 0x66, 0xf4, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x4, + 0xa0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x95, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x1, 0xc1, 0x0, 0x0, 0x0, + 0xc4, 0x0, 0x1, 0xb2, 0x0, 0x2, 0x74, 0x6e, + 0x0, 0x3, 0x81, 0x0, 0x0, 0x1, 0xdf, 0x50, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+529F "功" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x46, + 0x66, 0x6a, 0x70, 0xd, 0x0, 0x0, 0x1, 0x10, + 0xd0, 0x0, 0x0, 0xd0, 0x1, 0x0, 0x0, 0xd, + 0x0, 0x56, 0x6e, 0x66, 0xb8, 0x0, 0x0, 0xd0, + 0x0, 0x2, 0xb0, 0x8, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x49, 0x0, 0x94, 0x0, 0x0, 0xd0, 0x0, + 0x7, 0x60, 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, + 0xb3, 0x0, 0xb2, 0x0, 0x0, 0xd5, 0x64, 0x1c, + 0x0, 0xc, 0x10, 0x59, 0xc8, 0x20, 0x8, 0x50, + 0x0, 0xd0, 0x8, 0x60, 0x0, 0x4, 0xa0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x24, 0x24, + 0xc0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x3c, 0xf6, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, + + /* U+52A0 "加" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x20, 0x0, 0x20, 0x6, 0x67, + 0xd6, 0x6d, 0x1c, 0x66, 0x6c, 0x50, 0x0, 0x3a, + 0x0, 0xd0, 0xc0, 0x0, 0xa2, 0x0, 0x4, 0xa0, + 0xc, 0xc, 0x0, 0xa, 0x20, 0x0, 0x48, 0x0, + 0xc0, 0xc0, 0x0, 0xa2, 0x0, 0x6, 0x70, 0xb, + 0xc, 0x0, 0xa, 0x20, 0x0, 0x84, 0x1, 0xb0, + 0xc0, 0x0, 0xa2, 0x0, 0xb, 0x0, 0x29, 0xc, + 0x0, 0xa, 0x20, 0x2, 0xa0, 0x4, 0x80, 0xc0, + 0x0, 0xa2, 0x0, 0x92, 0x0, 0x76, 0xc, 0x66, + 0x6c, 0x30, 0x36, 0x18, 0xbe, 0x10, 0xc0, 0x0, + 0xa3, 0x6, 0x0, 0x6, 0x30, 0xb, 0x0, 0x5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52A9 "助" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xa6, 0x66, 0xc2, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd2, 0x86, 0xe6, 0x67, 0xd0, + 0x0, 0xd6, 0x66, 0xd0, 0x0, 0xd0, 0x1, 0xb0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xb0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xe0, 0x2, 0xa0, + 0x0, 0xd6, 0x66, 0xd0, 0x2, 0xc0, 0x3, 0xa0, + 0x0, 0xd0, 0x0, 0xd0, 0x6, 0x80, 0x3, 0x90, + 0x0, 0xd0, 0x0, 0xd1, 0x2c, 0x10, 0x4, 0x80, + 0x0, 0xd5, 0x87, 0x73, 0x76, 0x0, 0x6, 0x70, + 0x1f, 0xb6, 0x10, 0x5, 0x70, 0x35, 0x5d, 0x30, + 0x2, 0x0, 0x0, 0x64, 0x0, 0x3, 0xd8, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52AA "努" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x11, 0x76, 0x66, 0x98, 0x0, + 0x7, 0x6a, 0x96, 0xc6, 0x24, 0x0, 0xb5, 0x0, + 0x0, 0xb, 0x0, 0xd0, 0x7, 0x3, 0xb0, 0x0, + 0x0, 0x48, 0x4, 0x90, 0x2, 0x9c, 0x10, 0x0, + 0x0, 0x15, 0x8e, 0x60, 0x0, 0xbc, 0x10, 0x0, + 0x0, 0x1, 0xa5, 0xb7, 0x1a, 0x43, 0xd7, 0x30, + 0x0, 0x57, 0x10, 0x28, 0x60, 0x0, 0x18, 0x80, + 0x15, 0x10, 0x0, 0x1b, 0x70, 0x0, 0x10, 0x0, + 0x0, 0x37, 0x66, 0x6e, 0x76, 0x66, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x11, 0x7, 0x90, 0x0, + 0x0, 0x16, 0x92, 0x0, 0x7, 0xef, 0x20, 0x0, + 0x3, 0x41, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, + + /* U+52C9 "勉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, + 0x2b, 0x1, 0x30, 0x0, 0xc0, 0x0, 0x0, 0xa, + 0x76, 0xbc, 0x0, 0xc, 0x0, 0x0, 0x3, 0x90, + 0x9, 0x0, 0x0, 0xc0, 0x5, 0x0, 0x8b, 0x69, + 0x86, 0xd5, 0x5d, 0x55, 0xd1, 0x20, 0xc0, 0x94, + 0xc, 0x0, 0xb0, 0xc, 0x0, 0xc, 0x9, 0x30, + 0xc0, 0xb, 0x0, 0xc0, 0x0, 0xc5, 0xc6, 0x5d, + 0x2, 0x90, 0xc, 0x0, 0x8, 0x1c, 0xd1, 0x70, + 0x74, 0x0, 0xc0, 0x0, 0x2, 0xac, 0x0, 0xb, + 0x0, 0xb, 0x0, 0x0, 0x74, 0xc0, 0x7, 0x40, + 0x79, 0xa1, 0x0, 0x1b, 0xc, 0x3, 0x50, 0x0, + 0xa5, 0x20, 0x9, 0x10, 0xc0, 0x20, 0x0, 0x0, + 0x57, 0x7, 0x20, 0x8, 0xba, 0xaa, 0xaa, 0xac, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52D5 "動" */ + 0x0, 0x0, 0x0, 0x25, 0x0, 0x17, 0x0, 0x0, + 0x0, 0x46, 0x9a, 0xa8, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x7, 0x66, 0xc6, 0x69, 0x81, 0x2b, 0x11, 0x61, + 0x0, 0x10, 0xb1, 0x3, 0x7, 0x6c, 0x55, 0xd3, + 0x2, 0xc6, 0xc6, 0x6d, 0x10, 0x2a, 0x0, 0xc0, + 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0x48, 0x0, 0xc0, + 0x1, 0xa0, 0xb1, 0xc, 0x0, 0x66, 0x0, 0xc0, + 0x1, 0xc6, 0xc6, 0x6d, 0x0, 0xa2, 0x0, 0xc0, + 0x1, 0x40, 0xb1, 0x5, 0x0, 0xc0, 0x0, 0xc0, + 0x3, 0x66, 0xc6, 0x6c, 0x24, 0x70, 0x2, 0xa0, + 0x0, 0x10, 0xb1, 0x0, 0xa, 0x0, 0x5, 0x80, + 0x0, 0x13, 0xc8, 0x65, 0x74, 0x15, 0x3b, 0x40, + 0x9, 0xc7, 0x20, 0x3, 0x50, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, + + /* U+52D9 "務" */ + 0x0, 0x0, 0x0, 0x20, 0xb, 0x0, 0x0, 0x0, + 0x5, 0x76, 0x68, 0xe1, 0x5d, 0x66, 0x86, 0x0, + 0x0, 0x14, 0x18, 0x10, 0xa4, 0x0, 0xb4, 0x0, + 0x0, 0x6, 0xd0, 0x4, 0x37, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x95, 0x2, 0x1, 0xac, 0x10, 0x0, + 0x6, 0x76, 0x86, 0xa2, 0x1, 0xbc, 0x20, 0x0, + 0x0, 0x8, 0xf1, 0x91, 0x3a, 0x12, 0xda, 0x51, + 0x0, 0xc, 0xc1, 0x27, 0x58, 0x50, 0x6, 0x60, + 0x0, 0x56, 0xc1, 0x35, 0x6c, 0x86, 0x76, 0x0, + 0x0, 0xa0, 0xc1, 0x1, 0xc, 0x0, 0x76, 0x0, + 0x6, 0x20, 0xc1, 0x0, 0x49, 0x0, 0x84, 0x0, + 0x13, 0x0, 0xc1, 0x0, 0xb2, 0x0, 0xa2, 0x0, + 0x0, 0x32, 0xd0, 0x7, 0x60, 0x10, 0xd0, 0x0, + 0x0, 0x3b, 0xc0, 0x74, 0x0, 0x7e, 0xa0, 0x0, + 0x0, 0x1, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+52DD "勝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x6a, 0x13, 0x3, 0xc0, 0x45, 0x0, + 0x0, 0xc0, 0xc, 0x9, 0x53, 0xa0, 0xb4, 0x0, + 0x0, 0xc0, 0xc, 0x1, 0xa4, 0x86, 0x10, 0x0, + 0x0, 0xc0, 0xc, 0x7, 0x69, 0xa6, 0x8a, 0x0, + 0x0, 0xd6, 0x6c, 0x0, 0xa, 0x20, 0x1, 0x10, + 0x0, 0xc0, 0xc, 0x76, 0x6d, 0x76, 0x69, 0x80, + 0x0, 0xc0, 0xc, 0x0, 0x76, 0x7, 0x10, 0x0, + 0x0, 0xc3, 0x3c, 0x4, 0x88, 0x51, 0xb6, 0x10, + 0x0, 0xc3, 0x3c, 0x46, 0xa, 0x20, 0x4a, 0xc2, + 0x0, 0xa0, 0xc, 0x17, 0x6d, 0x66, 0xc3, 0x0, + 0x3, 0x80, 0xc, 0x0, 0x1a, 0x0, 0xb0, 0x0, + 0x5, 0x40, 0xc, 0x0, 0x93, 0x0, 0xc0, 0x0, + 0x7, 0x0, 0xc, 0x4, 0x70, 0x0, 0xc0, 0x0, + 0x6, 0x6, 0xe9, 0x46, 0x1, 0x8d, 0x80, 0x0, + 0x10, 0x0, 0x32, 0x20, 0x0, 0x5, 0x0, 0x0, + + /* U+52E4 "勤" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xa0, 0x0, 0x3c, 0x0, 0x0, + 0x5, 0x6e, 0x66, 0xc7, 0xd2, 0x3a, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x90, 0x0, 0x39, 0x0, 0x0, + 0x0, 0xe, 0x67, 0xb0, 0x0, 0x39, 0x0, 0x20, + 0x0, 0x14, 0x1a, 0x22, 0x28, 0x8b, 0x66, 0xe0, + 0x0, 0xd6, 0x6c, 0x6d, 0x40, 0x48, 0x1, 0xb0, + 0x0, 0xd0, 0x1a, 0xc, 0x0, 0x48, 0x1, 0xb0, + 0x0, 0xe6, 0x6c, 0x6d, 0x0, 0x56, 0x2, 0xb0, + 0x0, 0x40, 0x1a, 0x6, 0x20, 0x75, 0x2, 0xa0, + 0x1, 0x76, 0x6c, 0x66, 0x50, 0xb1, 0x3, 0x90, + 0x0, 0x56, 0x6c, 0x6b, 0x41, 0xb0, 0x4, 0x80, + 0x0, 0x10, 0x1a, 0x0, 0x8, 0x40, 0x6, 0x70, + 0x0, 0x13, 0x6c, 0x65, 0x78, 0x5, 0x5d, 0x40, + 0xb, 0xb7, 0x30, 0x3, 0x60, 0x1, 0xc9, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+52F5 "勵" */ + 0x2, 0x0, 0x0, 0x1, 0x50, 0x38, 0x0, 0x0, + 0x9, 0x76, 0x76, 0x66, 0x61, 0x3a, 0x0, 0x0, + 0x9, 0x20, 0xb0, 0x44, 0x10, 0x39, 0x0, 0x0, + 0x8, 0x77, 0xc6, 0x88, 0x80, 0x29, 0x0, 0x30, + 0x8, 0x20, 0x30, 0x22, 0x28, 0x8b, 0x66, 0xd0, + 0x8, 0x2b, 0x6a, 0x6c, 0x20, 0x48, 0x0, 0xc0, + 0x8, 0x1b, 0x6c, 0x6c, 0x0, 0x56, 0x0, 0xc0, + 0x9, 0x1b, 0xb, 0xa, 0x0, 0x74, 0x0, 0xc0, + 0xa, 0x9, 0x6c, 0x69, 0x0, 0xa2, 0x0, 0xb0, + 0xa, 0x36, 0x6c, 0x66, 0x60, 0xc0, 0x1, 0xa0, + 0x9, 0x55, 0xb, 0x12, 0xa1, 0xa0, 0x2, 0x90, + 0x7, 0x56, 0x5c, 0x68, 0x97, 0x40, 0x4, 0x80, + 0x31, 0x55, 0x50, 0x6, 0x99, 0x4, 0x2a, 0x40, + 0x30, 0x55, 0x0, 0x1c, 0xa1, 0x1, 0xcb, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x30, 0x0, 0x10, 0x0, + + /* U+5305 "包" */ + 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc9, 0x66, 0x66, 0x66, 0xc3, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1b, 0x10, 0x0, 0x1, 0x0, 0xd0, 0x0, + 0x0, 0x94, 0xc6, 0x66, 0x6d, 0x0, 0xd0, 0x0, + 0x6, 0x21, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, + 0x1, 0x1, 0xb0, 0x0, 0xc, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0x6a, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0x5, 0x25, 0xb0, 0x10, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x6e, 0x40, 0x60, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xe1, + 0x0, 0x0, 0x7c, 0xbb, 0xcc, 0xcc, 0xde, 0xa0, + + /* U+5316 "化" */ + 0x0, 0x0, 0x63, 0x0, 0x82, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x30, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xb4, 0x0, 0xc, 0x10, 0x9, 0x10, 0x0, 0x3e, + 0x10, 0x0, 0xc1, 0x8, 0xb2, 0x0, 0xb, 0xe4, + 0x0, 0xc, 0x15, 0xc0, 0x0, 0x3, 0x7b, 0x20, + 0x0, 0xc5, 0xc1, 0x0, 0x0, 0x80, 0xb2, 0x0, + 0xc, 0xb0, 0x0, 0x0, 0x30, 0xb, 0x20, 0x8, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x19, 0x3c, + 0x10, 0x0, 0x0, 0x0, 0xb, 0x45, 0x0, 0xc1, + 0x0, 0x6, 0x0, 0x0, 0xb2, 0x0, 0xc, 0x10, + 0x0, 0x71, 0x0, 0xb, 0x20, 0x0, 0xc2, 0x0, + 0x9, 0x70, 0x0, 0xc2, 0x0, 0x6, 0xed, 0xdd, + 0xe6, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5317 "北" */ + 0x0, 0x0, 0xa, 0x40, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0xd0, 0x0, 0x60, 0x5, 0x66, + 0x6d, 0x10, 0xd, 0x0, 0xbc, 0x20, 0x0, 0x0, + 0xc1, 0x0, 0xd2, 0xa5, 0x0, 0x0, 0x0, 0xc, + 0x10, 0xe, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0x10, 0x0, 0x0, 0x4d, 0x10, 0xd, + 0x0, 0x5, 0x1, 0x6a, 0x92, 0xc1, 0x0, 0xd0, + 0x0, 0x61, 0xa, 0x20, 0xc, 0x10, 0xe, 0x0, + 0x9, 0x60, 0x0, 0x0, 0xd2, 0x0, 0xbe, 0xdd, + 0xe6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+533B "医" */ + 0x1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0x1, + 0xd6, 0x66, 0x76, 0x66, 0x66, 0x99, 0x0, 0xd, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x2, 0xb0, 0x0, 0x5, 0x10, 0x0, 0xd, 0x0, + 0x78, 0x6b, 0x66, 0x85, 0x0, 0x0, 0xd0, 0x9, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x0, + 0xe, 0x0, 0x0, 0x10, 0x0, 0xd2, 0x76, 0x66, + 0xe6, 0x66, 0x6e, 0x30, 0xd, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x9, 0x88, + 0x40, 0x0, 0x0, 0xd, 0x0, 0x4, 0xa0, 0x8, + 0xd4, 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x5, + 0xf1, 0x0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x4, + 0x51, 0x2, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5340 "區" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0xe, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xd, 0x0, + 0x18, 0x66, 0x69, 0x40, 0x0, 0xd, 0x0, 0x1a, + 0x0, 0x8, 0x40, 0x0, 0xd, 0x0, 0x1a, 0x0, + 0x8, 0x40, 0x0, 0xd, 0x0, 0x1c, 0x66, 0x6b, + 0x40, 0x0, 0xd, 0x0, 0x3, 0x0, 0x3, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x90, 0x86, 0x69, 0x0, + 0xd, 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, + 0xd, 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, + 0x0, 0xb0, 0xc0, 0xc, 0x0, 0xd, 0xd, 0x66, + 0xb0, 0xd6, 0x6c, 0x0, 0xd, 0x3, 0x0, 0x10, + 0x20, 0x1, 0x10, 0x1e, 0x66, 0x66, 0x66, 0x66, + 0x67, 0xf3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5341 "十" */ + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0xa, 0x30, + 0x28, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + + /* U+5343 "千" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x69, 0xcc, 0xa8, 0x30, 0x0, + 0x0, 0x25, 0x54, 0x2c, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x7, 0x10, + 0x27, 0x66, 0x66, 0x6d, 0x86, 0x66, 0x69, 0x60, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + + /* U+5348 "午" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x66, 0x66, 0x66, 0xca, 0x0, 0x0, 0x1b, + 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0x20, 0x16, 0x66, 0x66, 0x6c, + 0x86, 0x66, 0x6e, 0x60, 0x10, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+534A "半" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0xc, 0x10, 0x8, 0x70, 0x0, + 0x0, 0x7, 0x70, 0xc, 0x10, 0x2d, 0x30, 0x0, + 0x0, 0x0, 0xb9, 0xc, 0x10, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xc, 0x16, 0x10, 0x0, 0x0, + 0x1, 0x66, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x8, 0x20, + 0x7, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x68, 0x60, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5352 "卒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x4, 0x50, 0x0, 0x67, + 0x69, 0x66, 0x66, 0x86, 0x66, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0xb, 0x69, + 0x0, 0xb5, 0x91, 0x0, 0x0, 0x7, 0x40, 0xa5, + 0x83, 0x5, 0xe0, 0x0, 0x3, 0x50, 0x2, 0x77, + 0x0, 0xa, 0x0, 0x0, 0x20, 0x0, 0x1, 0xe1, + 0x0, 0x3, 0x50, 0x67, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+5354 "協" */ + 0x0, 0x9, 0x10, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, 0x3, 0x0, + 0x0, 0xd, 0x0, 0x37, 0x6d, 0x66, 0x6d, 0x40, + 0x0, 0xd, 0x0, 0x0, 0x39, 0x0, 0xb, 0x0, + 0x6, 0x6e, 0x6b, 0x21, 0xa1, 0x0, 0x48, 0x0, + 0x1, 0xd, 0x0, 0x57, 0x0, 0x4a, 0xd1, 0x0, + 0x0, 0xd, 0x3, 0x23, 0x0, 0x2, 0x40, 0x0, + 0x0, 0xd, 0x1, 0x4b, 0x14, 0x0, 0xe0, 0x40, + 0x0, 0xd, 0x6, 0x99, 0x5c, 0x58, 0xd6, 0xc2, + 0x0, 0xd, 0x0, 0x83, 0xb, 0x3, 0x90, 0xa0, + 0x0, 0xd, 0x0, 0xb0, 0xb, 0x7, 0x60, 0xb0, + 0x0, 0xd, 0x2, 0x80, 0x29, 0xc, 0x10, 0xb0, + 0x0, 0xd, 0x8, 0x24, 0x85, 0x47, 0x0, 0xc0, + 0x0, 0xe, 0x44, 0x4, 0xc4, 0x70, 0x6b, 0xa0, + 0x0, 0x5, 0x20, 0x0, 0x13, 0x0, 0x5, 0x10, + + /* U+5357 "南" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x1, 0x76, + 0x66, 0x66, 0xe6, 0x66, 0x68, 0xc4, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, + 0x66, 0xe6, 0x66, 0x6a, 0x40, 0x0, 0xb1, 0x3, + 0x0, 0x8, 0x0, 0xb2, 0x0, 0xb, 0x10, 0x3c, + 0x3, 0xa0, 0xb, 0x20, 0x0, 0xb1, 0x0, 0x90, + 0x71, 0x60, 0xb2, 0x0, 0xb, 0x16, 0x76, 0xd6, + 0x67, 0x1b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, + 0x61, 0xb2, 0x0, 0xb, 0x38, 0x66, 0xd6, 0x66, + 0x4b, 0x20, 0x0, 0xb1, 0x0, 0xc, 0x0, 0x0, + 0xb2, 0x0, 0xb, 0x10, 0x0, 0xc0, 0x23, 0x2d, + 0x10, 0x0, 0xc1, 0x0, 0xa, 0x0, 0x5e, 0xc0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+5358 "単" */ + 0x0, 0x3, 0x0, 0x52, 0x0, 0x67, 0x0, 0x0, + 0x0, 0x89, 0x1, 0xd1, 0xc, 0x40, 0x0, 0x0, + 0x0, 0xd3, 0xb, 0x35, 0x60, 0x0, 0x0, 0x2, + 0x89, 0x66, 0x76, 0xa6, 0xb1, 0x0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, + 0x6e, 0x66, 0x6d, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x2c, 0x66, 0x6e, + 0x66, 0x6d, 0x0, 0x0, 0x1, 0x40, 0x0, 0xd0, + 0x0, 0x41, 0x30, 0x37, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0xac, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+5371 "危" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0x66, 0x67, 0x90, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x1b, + 0x10, 0x0, 0x55, 0x0, 0x2, 0x0, 0x28, 0xa6, + 0x66, 0x69, 0x66, 0x69, 0xb0, 0x4, 0xb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0xa, + 0x66, 0x66, 0xd0, 0x0, 0x0, 0xb, 0x20, 0xd0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0xd0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0xd0, 0xd, 0x1, 0x6d, + 0xa0, 0x50, 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x30, + 0x7, 0x10, 0xa, 0x20, 0xc, 0x10, 0x0, 0x0, + 0x95, 0x6, 0x30, 0x0, 0x6d, 0xcc, 0xcc, 0xce, + 0x61, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5373 "即" */ + 0x2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x10, 0xe, + 0x66, 0x6e, 0x30, 0xc6, 0x66, 0xe1, 0xd, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x66, 0x6e, + 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xd, 0x0, 0xd0, + 0x0, 0xd0, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, + 0xd0, 0xd, 0x0, 0x8, 0x0, 0xd0, 0x0, 0xd0, + 0xd, 0x3, 0x50, 0x0, 0xd0, 0x0, 0xd0, 0xd, + 0x0, 0x6a, 0x0, 0xd0, 0x0, 0xc0, 0xd, 0x1, + 0x5b, 0xa0, 0xd1, 0x8d, 0xa0, 0x1f, 0xa7, 0x11, + 0x90, 0xd0, 0x4, 0x0, 0x5, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+537B "卻" */ + 0x0, 0x3, 0x40, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x2d, 0x40, 0xa6, 0x66, 0xa1, + 0x0, 0x83, 0x0, 0x4, 0xc0, 0xd0, 0x0, 0xd0, + 0x5, 0x10, 0x3d, 0x0, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0x0, 0xb7, 0x70, 0x0, 0xd0, 0x0, 0xd0, + 0x0, 0x6, 0x60, 0x3c, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0x39, 0x0, 0x5, 0xd0, 0xd0, 0x0, 0xd0, + 0x2, 0x83, 0x0, 0x4, 0x70, 0xd0, 0x0, 0xd0, + 0x5, 0xe, 0x66, 0x6e, 0x20, 0xd0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd1, 0x79, 0xc0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x8, 0x30, + 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x9, 0x0, 0x5, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+539A "厚" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0x0, + 0xd0, 0xc, 0x66, 0x66, 0x6c, 0x0, 0x0, 0xd, + 0x0, 0xd0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd0, + 0xe, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xd, 0x0, + 0xe6, 0x66, 0x66, 0xd0, 0x0, 0x0, 0xd0, 0xa, + 0x0, 0x0, 0x8, 0x0, 0x0, 0xd, 0x5, 0x66, + 0x66, 0x66, 0xc2, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x13, 0x85, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xc, + 0x20, 0x2, 0x50, 0x5, 0x76, 0x66, 0x66, 0xe6, + 0x66, 0x77, 0x10, 0x92, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x0, 0x10, 0xd0, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x4, 0xdb, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+539F "原" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0xe6, 0x66, 0x68, 0x96, 0x66, 0x61, 0x0, 0xe0, + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0xe0, 0x1a, + 0x69, 0x66, 0x6c, 0x30, 0x0, 0xe0, 0xc, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xe0, 0xd, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0xd0, 0xc, 0x0, 0x0, 0xb, + 0x10, 0x0, 0xd0, 0xd, 0x66, 0x66, 0x6d, 0x10, + 0x0, 0xc0, 0x7, 0x0, 0xd0, 0x6, 0x0, 0x2, + 0xa0, 0x2, 0x50, 0xd1, 0x0, 0x0, 0x4, 0x70, + 0xd, 0x80, 0xd0, 0x77, 0x0, 0x9, 0x21, 0xb4, + 0x0, 0xd0, 0x6, 0xe3, 0x18, 0x18, 0x10, 0x57, + 0xe0, 0x0, 0x6a, 0x60, 0x10, 0x0, 0x8, 0x80, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+53B3 "厳" */ + 0x0, 0x0, 0x81, 0x6, 0x20, 0xb, 0x20, 0x0, + 0x0, 0x4, 0xc0, 0x1e, 0x5, 0x70, 0x0, 0x0, + 0x52, 0x26, 0x22, 0x62, 0x62, 0x6b, 0x0, 0xb, + 0x64, 0x44, 0x44, 0x4a, 0x44, 0x41, 0x0, 0xa3, + 0x67, 0x97, 0x1, 0xd0, 0x0, 0x0, 0xa, 0x30, + 0xa, 0x14, 0x64, 0x3, 0x40, 0x0, 0xa5, 0x8c, + 0x6d, 0x5c, 0x66, 0xe5, 0x0, 0xa, 0x22, 0xc6, + 0xd4, 0x62, 0xd, 0x0, 0x0, 0xb2, 0x2a, 0xc, + 0x20, 0x62, 0xa0, 0x0, 0xc, 0x2, 0xc6, 0xd0, + 0x9, 0x75, 0x0, 0x0, 0xc0, 0x2a, 0xc, 0x0, + 0x6d, 0x0, 0x0, 0x28, 0x15, 0xc7, 0xd6, 0x27, + 0xe1, 0x0, 0x6, 0x25, 0xa4, 0xc, 0x3, 0x84, + 0xd3, 0x0, 0x60, 0x0, 0x0, 0xb3, 0x60, 0x5, + 0xd3, 0x11, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, + + /* U+53BB "去" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x6d, 0x86, 0x6a, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x80, 0x8, 0x66, 0x66, 0x6d, + 0x66, 0x66, 0x7a, 0x40, 0x0, 0x0, 0x5, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x37, + 0x0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x3d, + 0x30, 0x0, 0x3, 0xd8, 0x77, 0x77, 0x76, 0x9f, + 0x20, 0x0, 0xb, 0x85, 0x32, 0x0, 0x0, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C2 "参" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x1, 0x50, 0x0, 0x0, + 0x0, 0x3, 0x74, 0x0, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0xd, 0xb9, 0xbc, 0x65, 0x54, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x23, 0x40, + 0x6, 0x66, 0x6a, 0xb6, 0x69, 0x66, 0x67, 0x70, + 0x0, 0x0, 0x2c, 0x1, 0x44, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0x1c, 0x90, 0x5b, 0x20, 0x0, + 0x0, 0x39, 0x12, 0xc5, 0x4, 0x13, 0xdc, 0x71, + 0x5, 0x50, 0x68, 0x10, 0x5e, 0x50, 0x6, 0x40, + 0x0, 0x16, 0x10, 0x8, 0xa1, 0x4, 0x30, 0x0, + 0x0, 0x0, 0x6, 0x93, 0x0, 0x7e, 0x60, 0x0, + 0x0, 0x15, 0x62, 0x0, 0x4c, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6c, 0x92, 0x0, 0x0, 0x0, + 0x1, 0x57, 0x88, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C3 "參" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x30, 0x2, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x86, 0x43, 0x4a, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0x0, 0xb4, 0x10, 0x0, + 0x0, 0xa, 0x5, 0x0, 0x19, 0x30, 0x34, 0x0, + 0x0, 0x71, 0x6, 0x52, 0x5f, 0xed, 0xbd, 0x0, + 0x1, 0xb7, 0x45, 0xbe, 0x65, 0x0, 0x9, 0x0, + 0x0, 0x0, 0x6, 0xb2, 0x36, 0x20, 0x0, 0x0, + 0x0, 0x5, 0x83, 0x7, 0xc1, 0x7b, 0xa8, 0x60, + 0x4, 0x40, 0x16, 0xa6, 0x27, 0x10, 0x37, 0x0, + 0x0, 0x25, 0x51, 0x5, 0xda, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xa7, 0x10, 0x6c, 0x10, 0x0, + 0x0, 0x57, 0x51, 0x0, 0x4c, 0xb4, 0x10, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xa3, 0x0, 0x0, 0x0, + 0x1, 0x67, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C8 "又" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x47, 0x76, 0x66, 0x66, 0x6a, 0xb0, 0x0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x80, 0x5, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x82, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x7b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x5, 0xd6, 0x0, 0x0, + 0x0, 0x3, 0x94, 0x0, 0x0, 0x2c, 0xe9, 0x51, + 0x2, 0x65, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x70, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53CA "及" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x6, 0x67, 0xb6, 0x66, 0xad, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x80, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0xb, 0x86, 0xc7, 0x0, + 0x0, 0x0, 0xd, 0x16, 0x0, 0x1, 0xe1, 0x0, + 0x0, 0x0, 0x48, 0x8, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x0, 0xa3, 0x3, 0x70, 0x2c, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xa4, 0xc3, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x1f, 0x70, 0x0, 0x0, + 0x0, 0x57, 0x0, 0x1, 0xb8, 0xd3, 0x0, 0x0, + 0x2, 0x70, 0x0, 0x79, 0x20, 0x3d, 0xa4, 0x0, + 0x15, 0x3, 0x67, 0x20, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53CB "友" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x9, 0x30, + 0x6, 0x76, 0x69, 0xc6, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6d, 0x80, 0x0, + 0x0, 0x0, 0x4a, 0x16, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x8, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x2, 0x91, 0xd1, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x7d, 0x50, 0x0, 0x0, + 0x0, 0x38, 0x0, 0x0, 0xac, 0xa1, 0x0, 0x0, + 0x0, 0x90, 0x0, 0x3b, 0x50, 0x5e, 0x82, 0x0, + 0x7, 0x10, 0x38, 0x70, 0x0, 0x2, 0xaf, 0xa1, + 0x11, 0x4, 0x20, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+53CD "反" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xa1, 0x0, + 0x0, 0x6, 0x46, 0x78, 0x9a, 0xa8, 0x73, 0x0, + 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xa, 0x86, 0x86, 0x66, 0x66, 0xf5, 0x0, + 0x0, 0xa, 0x30, 0x70, 0x0, 0x6, 0xc0, 0x0, + 0x0, 0xb, 0x20, 0x53, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x0, 0x89, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa4, 0xd0, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0x7f, 0x30, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x4, 0xc9, 0xc3, 0x0, 0x0, + 0x1, 0x90, 0x2, 0x98, 0x0, 0x3e, 0xb5, 0x0, + 0x7, 0x3, 0x76, 0x0, 0x0, 0x0, 0x8f, 0xc2, + 0x10, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+53D6 "取" */ + 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xd6, 0x66, 0xe6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xd3, 0x66, 0x66, 0x8b, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x22, 0x0, 0x89, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x0, 0xb4, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x7, 0x0, 0xe0, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x8, 0x4, 0xa0, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x5, 0x3a, 0x50, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x1, 0xad, 0x0, 0x0, + 0x0, 0xc0, 0x14, 0xe6, 0x30, 0xb7, 0x0, 0x0, + 0x17, 0xec, 0x84, 0xd0, 0x1, 0xdc, 0x0, 0x0, + 0x1a, 0x30, 0x0, 0xd0, 0xa, 0x25, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x83, 0x0, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0xd6, 0x20, 0x0, 0x5, 0x30, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+53D7 "受" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xb0, 0x0, + 0x0, 0x25, 0x66, 0x89, 0xa9, 0x87, 0x51, 0x0, + 0x0, 0x3, 0x0, 0x33, 0x0, 0xb, 0x60, 0x0, + 0x0, 0x5, 0xa0, 0xd, 0x30, 0x1c, 0x0, 0x0, + 0x0, 0x30, 0xe1, 0x9, 0x60, 0x82, 0x2, 0x0, + 0x0, 0xa6, 0x86, 0x67, 0x66, 0x76, 0x6c, 0xb0, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, + 0x6, 0x44, 0x66, 0x66, 0x66, 0xa8, 0x20, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x80, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x67, 0x99, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xb3, 0x4d, 0x94, 0x20, 0x0, + 0x0, 0x37, 0x83, 0x0, 0x0, 0x5b, 0xff, 0x91, + 0x4, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+53E3 "口" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, + 0x66, 0x66, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0xe, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0xe, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xe6, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53E4 "古" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x20, 0x47, 0x66, + 0x66, 0x6e, 0x66, 0x66, 0x9b, 0x10, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x66, 0x6e, + 0x66, 0x6b, 0x20, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x1, 0xe6, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+53E5 "句" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x76, 0x66, 0x66, 0x66, 0xb6, 0x0, 0xa, + 0x40, 0x0, 0x0, 0x0, 0xa, 0x30, 0x4, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x2, 0x71, 0x20, + 0x0, 0x6, 0x0, 0xa, 0x30, 0x50, 0x3d, 0x66, + 0x66, 0xf1, 0x0, 0xa3, 0x0, 0x2, 0xb0, 0x0, + 0xe, 0x0, 0xa, 0x30, 0x0, 0x2b, 0x0, 0x0, + 0xe0, 0x0, 0xa3, 0x0, 0x2, 0xd6, 0x66, 0x6e, + 0x0, 0xa, 0x30, 0x0, 0x3b, 0x0, 0x0, 0x80, + 0x0, 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + + /* U+53E6 "另" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0x7b, 0x0, 0x0, 0xc, 0x0, 0x94, 0x0, + 0x27, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x10, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x67, 0xe0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x3, 0xa0, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x6, 0x90, 0x0, + 0x12, 0xa, 0x60, 0x4, 0x73, 0x0, 0x0, 0x5, + 0xee, 0x10, 0x31, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, + + /* U+53EA "只" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1, 0xe6, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x17, 0x4, 0x0, + 0x20, 0x30, 0x0, 0x0, 0x7, 0xd1, 0x1, 0x91, + 0x0, 0x0, 0x2, 0xd2, 0x0, 0x3, 0xd3, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x93, + 0x0, 0x0, 0x0, 0xc, 0x90, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+53EB "叫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xb1, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0xd0, 0x1c, 0x66, + 0xc6, 0x3, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0xb2, + 0x2, 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, + 0xb0, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, + 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, + 0xd0, 0xd, 0x0, 0xb2, 0x2, 0xb0, 0x0, 0xd0, + 0xd, 0x0, 0xb2, 0x3, 0xb3, 0x76, 0xd0, 0xe, + 0x66, 0xd2, 0x3, 0xf7, 0x0, 0xd0, 0x1d, 0x0, + 0x91, 0x0, 0x10, 0x0, 0xd0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+53EF "可" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, + 0x1, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0xb, 0x66, 0x6c, 0x50, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x30, 0xc, 0x10, 0x0, + 0x0, 0xe, 0x0, 0x6, 0x10, 0xc, 0x10, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xcb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+53F0 "台" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x65, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x7b, 0x20, 0x8e, + 0x55, 0x66, 0x77, 0x66, 0xce, 0x16, 0xd9, 0x64, + 0x21, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0xc6, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, + 0x30, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+53F2 "史" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x3, 0x0, + 0x0, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x8d, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x3a, 0x0, + 0x0, 0xd, 0x66, 0x66, 0xe6, 0x66, 0x8b, 0x0, + 0x0, 0xa, 0x0, 0x0, 0xc0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x24, 0x2, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x46, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x80, 0x29, 0xeb, 0x86, 0x51, + 0x0, 0x48, 0x81, 0x0, 0x0, 0x5, 0x9c, 0x80, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53F3 "右" */ + 0x0, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8, 0x30, + 0x7, 0x66, 0x66, 0xd7, 0x66, 0x66, 0x67, 0x60, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xad, 0x66, 0x66, 0x66, 0xf2, 0x0, + 0x0, 0x6, 0x6c, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x38, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x70, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x0, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53F7 "号" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0xb3, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x10, 0x31, 0x56, 0x66, 0x89, 0x66, 0x66, 0x66, + 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x34, 0x0, 0x0, + 0x3, 0x96, 0x66, 0x66, 0xca, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xdf, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x0, + + /* U+53F8 "司" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x27, + 0x66, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x20, 0xd0, 0x46, 0x66, 0x66, 0x66, 0x76, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0xb6, 0x66, 0x6e, 0x20, 0xd, 0x0, 0xc, 0x10, + 0x0, 0xe0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0xe, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x0, 0xd, 0x0, + 0x8, 0x0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, + + /* U+5403 "吃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x20, 0x0, 0x0, 0x96, 0x6b, 0x50, + 0x77, 0x0, 0x0, 0x30, 0xd1, 0xb, 0x30, 0xc6, + 0x66, 0x66, 0xa4, 0xd1, 0xb, 0x36, 0x40, 0x0, + 0x0, 0x0, 0xc1, 0xb, 0x46, 0x0, 0x0, 0x30, + 0x0, 0xc1, 0xb, 0x54, 0x66, 0x67, 0xf5, 0x0, + 0xc1, 0xb, 0x30, 0x0, 0xc, 0x60, 0x0, 0xc1, + 0xb, 0x30, 0x0, 0xa8, 0x0, 0x0, 0xd6, 0x6c, + 0x30, 0x8, 0xa0, 0x0, 0x0, 0xd1, 0x5, 0x10, + 0x5c, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0xe1, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, + 0xf6, + + /* U+5404 "各" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x86, 0x66, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0x3, 0xd1, 0x0, 0x0, + 0x0, 0x7, 0x63, 0x40, 0xc, 0x30, 0x0, 0x0, + 0x0, 0x55, 0x0, 0x82, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x89, 0xb9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x50, 0x5, 0xdc, 0x74, 0x10, + 0x0, 0x7, 0xd6, 0x66, 0x66, 0xa8, 0xbe, 0x60, + 0x5, 0x61, 0xd1, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+5408 "合" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x37, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x7, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x8a, 0x10, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x38, 0xea, 0x40, + 0x4, 0x82, 0x76, 0x66, 0x66, 0x98, 0x2b, 0x91, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6f, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+540C "同" */ + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xc, 0x15, 0x66, 0x66, 0x6b, + 0x90, 0xe0, 0xc1, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xc, 0x10, 0x20, 0x0, 0x3, 0x0, 0xe0, 0xc1, + 0xd, 0x66, 0x66, 0xe1, 0xe, 0xc, 0x10, 0xd0, + 0x0, 0xd, 0x0, 0xe0, 0xc1, 0xd, 0x0, 0x0, + 0xd0, 0xe, 0xc, 0x10, 0xd6, 0x66, 0x6d, 0x0, + 0xe0, 0xc1, 0xc, 0x0, 0x0, 0xa0, 0xe, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd1, 0x0, + 0x0, 0x0, 0x22, 0x3e, 0xe, 0x10, 0x0, 0x0, + 0x1, 0x7f, 0xa0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, + + /* U+540D "名" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, + 0x86, 0x66, 0x6c, 0xb0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x3e, 0x10, 0x0, 0x4, 0x98, 0x10, 0x1, + 0xd4, 0x0, 0x0, 0x47, 0x3, 0xe1, 0x1d, 0x50, + 0x0, 0x1, 0x30, 0x0, 0x72, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xe7, 0x66, 0x66, 0xb2, 0x0, 0x5, + 0xae, 0x10, 0x0, 0x0, 0xe0, 0x5, 0x63, 0xc, + 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5411 "向" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x60, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6f, + 0x1c, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, + 0x3, 0x0, 0x0, 0x40, 0xe, 0xc, 0x10, 0xd6, + 0x66, 0x8d, 0x0, 0xe0, 0xc1, 0xc, 0x10, 0x3, + 0xa0, 0xe, 0xc, 0x10, 0xc1, 0x0, 0x3a, 0x0, + 0xe0, 0xc1, 0xd, 0x66, 0x68, 0xa0, 0xe, 0xc, + 0x10, 0xd1, 0x0, 0x39, 0x0, 0xe0, 0xc1, 0x1, + 0x0, 0x0, 0x0, 0xe, 0xc, 0x10, 0x0, 0x0, + 0x2, 0x34, 0xd0, 0xd1, 0x0, 0x0, 0x0, 0x15, + 0xea, 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5426 "否" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x18, + 0x66, 0x66, 0x9c, 0x66, 0x66, 0x85, 0x0, 0x0, + 0x1, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0x6c, 0x31, 0x0, 0x0, 0x0, 0x1, 0xc4, 0x2b, + 0x6, 0x94, 0x0, 0x0, 0x4b, 0x20, 0x2b, 0x0, + 0x1b, 0xc1, 0x17, 0x60, 0x0, 0x3b, 0x0, 0x0, + 0x89, 0x30, 0x0, 0x0, 0x26, 0x0, 0x1, 0x1, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x7e, 0x10, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0xf, 0x66, 0x66, + 0x66, 0x7c, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+5427 "吧" */ + 0x0, 0x0, 0x0, 0x95, 0x55, 0x55, 0xa1, 0x3, + 0xb6, 0x6d, 0xe, 0x11, 0xe1, 0x2c, 0x0, 0x2b, + 0x2, 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, + 0x2c, 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, + 0xc0, 0xe0, 0xe, 0x2, 0xc0, 0x2, 0xb0, 0x2c, + 0xe, 0x0, 0xe0, 0x2c, 0x0, 0x2b, 0x2, 0xc0, + 0xe6, 0x66, 0x67, 0xc0, 0x2, 0xb0, 0x2c, 0xe, + 0x0, 0x0, 0x1, 0x0, 0x3d, 0x67, 0xc0, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x2c, 0xe, 0x0, + 0x0, 0x0, 0x50, 0x38, 0x0, 0x10, 0xe0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x8d, 0xcc, 0xcc, + 0xdd, 0x20, + + /* U+5440 "呀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x2, + 0x0, 0x3, 0x27, 0x66, 0x69, 0x7b, 0x20, 0xb7, + 0x66, 0xe0, 0x30, 0x0, 0xe0, 0x0, 0xb, 0x20, + 0x1d, 0xb, 0x60, 0xe, 0x0, 0x0, 0xb2, 0x1, + 0xd0, 0xd0, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x1d, + 0x3a, 0x0, 0xe, 0x5, 0x30, 0xb2, 0x1, 0xd5, + 0x86, 0x7e, 0xe6, 0x65, 0xb, 0x20, 0x1d, 0x0, + 0x9, 0x7e, 0x0, 0x0, 0xb7, 0x66, 0xd0, 0x2, + 0xd0, 0xe0, 0x0, 0xb, 0x20, 0x9, 0x0, 0xc3, + 0xe, 0x0, 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x63, 0x2, 0x23, 0xe0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x16, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+544A "告" */ + 0x0, 0x2, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, + 0xc, 0x60, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0xe, 0x0, 0x46, 0x0, 0x0, 0xa6, 0x66, + 0x6e, 0x66, 0x65, 0x0, 0x5, 0x40, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x50, 0x47, 0x66, 0x66, 0x6a, 0x66, 0x67, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x66, 0x66, 0x66, 0xb6, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xc3, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5462 "呢" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x60, 0x86, + 0x6b, 0x21, 0xe6, 0x66, 0x66, 0xe1, 0xb2, 0xe, + 0x0, 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0xb2, 0xe, 0x0, 0xe6, + 0x66, 0x66, 0xe0, 0xb2, 0xe, 0x1, 0xc0, 0x20, + 0x0, 0x20, 0xb2, 0xe, 0x2, 0xb0, 0xe1, 0x1, + 0x40, 0xb2, 0xe, 0x4, 0x90, 0xd0, 0xb, 0xa0, + 0xb7, 0x6e, 0x7, 0x60, 0xd0, 0x96, 0x0, 0xb2, + 0xd, 0xb, 0x20, 0xe7, 0x30, 0x0, 0xc2, 0x2, + 0xc, 0x0, 0xe0, 0x0, 0x32, 0x10, 0x0, 0x75, + 0x0, 0xd0, 0x0, 0x44, 0x0, 0x0, 0x90, 0x0, + 0xe3, 0x11, 0x9a, 0x0, 0x7, 0x10, 0x0, 0x5a, + 0xaa, 0x93, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5468 "周" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0xd0, 0x0, 0x4, 0x0, 0x0, 0xd0, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0x0, + 0xd0, 0x0, 0xc, 0x7, 0x0, 0xc0, 0x0, 0xd, + 0x5, 0x76, 0xd6, 0x63, 0xc, 0x0, 0x0, 0xd0, + 0x0, 0xc, 0x0, 0x50, 0xc0, 0x0, 0xd, 0x47, + 0x66, 0x76, 0x67, 0x2c, 0x0, 0x1, 0xc0, 0x13, + 0x0, 0x6, 0x0, 0xc0, 0x0, 0x3a, 0x1, 0xd6, + 0x66, 0xe1, 0xc, 0x0, 0x5, 0x60, 0x1b, 0x0, + 0xd, 0x0, 0xc0, 0x0, 0x92, 0x1, 0xb0, 0x0, + 0xd0, 0xc, 0x0, 0xa, 0x0, 0x1d, 0x66, 0x6d, + 0x0, 0xc0, 0x6, 0x30, 0x1, 0x40, 0x0, 0x30, + 0x2c, 0x1, 0x50, 0x0, 0x0, 0x0, 0x3, 0x9f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+5473 "味" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x66, + 0xe2, 0x0, 0xd, 0x0, 0x71, 0x0, 0xd1, 0xe, + 0x6, 0x76, 0xe6, 0x66, 0x30, 0xc, 0x10, 0xe0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0xd0, 0x0, 0x51, 0xc, 0x10, 0xe5, 0x76, + 0x9f, 0x86, 0x68, 0x60, 0xc1, 0xe, 0x0, 0xd, + 0xf4, 0x20, 0x0, 0xc, 0x66, 0xe0, 0x5, 0x9d, + 0x9, 0x0, 0x0, 0xd1, 0xb, 0x1, 0xc0, 0xd0, + 0x75, 0x0, 0x7, 0x0, 0x0, 0xa2, 0xd, 0x0, + 0xd5, 0x0, 0x0, 0x0, 0x83, 0x0, 0xd0, 0x3, + 0xfa, 0x10, 0x0, 0x72, 0x0, 0xd, 0x0, 0x4, + 0x10, 0x0, 0x30, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+547C "呼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x1, + 0x0, 0x30, 0x1, 0x37, 0xac, 0xa7, 0x0, 0xb7, + 0x6e, 0x33, 0x42, 0x1e, 0x0, 0x0, 0xa, 0x20, + 0xe0, 0x41, 0x0, 0xe0, 0x9, 0x60, 0xa2, 0xe, + 0x0, 0xc1, 0xe, 0x2, 0xc0, 0xa, 0x20, 0xe0, + 0x8, 0x80, 0xe0, 0x91, 0x0, 0xa2, 0xe, 0x0, + 0x23, 0xe, 0x21, 0x1, 0xa, 0x20, 0xe4, 0x76, + 0x66, 0xe6, 0x69, 0xa0, 0xa2, 0xe, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xa, 0x76, 0xe0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xb2, 0xa, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+547D "命" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x18, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x4, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x1, 0x6d, 0x82, 0x0, + 0x0, 0x49, 0x37, 0x66, 0x66, 0x61, 0xaf, 0xb1, + 0x6, 0x40, 0x0, 0x10, 0x1, 0x0, 0x33, 0x0, + 0x0, 0xd, 0x66, 0xd2, 0xd, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0xe0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0xd, 0x5c, 0xc0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+548C "和" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x48, 0xca, 0x81, 0x10, 0x0, 0x10, 0x0, + 0x31, 0xd, 0x0, 0xc, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x2, 0x66, + 0x6e, 0x6a, 0x5c, 0x20, 0xb, 0x30, 0x0, 0x8, + 0xd0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0xde, + 0x50, 0xc, 0x20, 0xb, 0x30, 0x0, 0x68, 0xd4, + 0xd3, 0xc2, 0x0, 0xb3, 0x0, 0xb, 0xd, 0x4, + 0x8c, 0x20, 0xb, 0x30, 0x8, 0x20, 0xd0, 0x0, + 0xc2, 0x0, 0xb3, 0x4, 0x40, 0xd, 0x0, 0xc, + 0x76, 0x6c, 0x30, 0x30, 0x0, 0xd0, 0x0, 0xc2, + 0x0, 0xa3, 0x0, 0x0, 0xd, 0x0, 0x7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+54B2 "咲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0x0, 0x3, 0xb1, 0x0, 0x30, + 0x4, 0x0, 0x7b, 0x0, 0x97, 0x0, 0xe, 0x66, + 0xe2, 0x0, 0xe1, 0x9, 0x0, 0x0, 0xe0, 0xe, + 0x0, 0x2, 0x5, 0x11, 0x80, 0xe, 0x0, 0xe0, + 0x76, 0x6d, 0x76, 0x66, 0x20, 0xe0, 0xe, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0xe0, 0x0, + 0xe, 0x0, 0x0, 0x10, 0xe0, 0xe, 0x57, 0x66, + 0xe6, 0x66, 0xaa, 0xe, 0x0, 0xe0, 0x0, 0x2c, + 0x60, 0x0, 0x0, 0xe6, 0x6e, 0x0, 0x6, 0x84, + 0x30, 0x0, 0xb, 0x0, 0x30, 0x0, 0xb3, 0xa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0x10, 0x1, 0xe4, + 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x5, 0xfa, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+54C1 "品" */ + 0x0, 0x4, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, + 0xc, 0x76, 0x66, 0x69, 0xa0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x5, 0x80, 0x0, 0x0, 0xc, 0x76, 0x66, 0x69, + 0x80, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x10, + 0x0, 0x9, 0x66, 0x7a, 0x0, 0x96, 0x66, 0xb1, + 0xe, 0x0, 0x3c, 0x0, 0xd0, 0x0, 0xe0, 0xe, + 0x0, 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, + 0x3b, 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x0, 0x3c, + 0x0, 0xd0, 0x0, 0xe0, 0xe, 0x66, 0x8c, 0x0, + 0xe6, 0x66, 0xe0, 0xd, 0x0, 0x26, 0x1, 0xb0, + 0x0, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+54E1 "員" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x90, + 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xc1, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xe, 0x66, + 0x66, 0x66, 0x66, 0xd0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, + 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x40, + 0x2c, 0x20, 0x65, 0x1, 0x0, 0x0, 0x4c, 0x50, + 0x0, 0x5d, 0x91, 0x2, 0x75, 0x0, 0x0, 0x0, + 0xa, 0xb1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + + /* U+54EA "哪" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x17, 0x78, 0x6e, 0x1c, 0x68, 0xc0, 0xc6, + 0x7c, 0x2, 0x90, 0xd0, 0xc0, 0x85, 0xc, 0x2, + 0x90, 0x29, 0xd, 0xc, 0x9, 0x0, 0xc0, 0x29, + 0x37, 0xb6, 0xd0, 0xc1, 0x50, 0xc, 0x2, 0x90, + 0x29, 0xd, 0xc, 0x51, 0x0, 0xc0, 0x29, 0x3, + 0x80, 0xd0, 0xc0, 0x80, 0xc, 0x2, 0x90, 0x38, + 0xc, 0xc, 0x5, 0x50, 0xc6, 0x79, 0x5a, 0x96, + 0xd0, 0xc0, 0xb, 0xc, 0x2, 0x70, 0xa1, 0xd, + 0xc, 0x0, 0xc0, 0xb0, 0x0, 0x1a, 0x0, 0xc0, + 0xc5, 0x7c, 0x0, 0x0, 0x8, 0x20, 0x3a, 0xc, + 0xa, 0x20, 0x0, 0x4, 0x62, 0x9c, 0x50, 0xc0, + 0x0, 0x0, 0x3, 0x50, 0x2, 0x50, 0xc, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5546 "商" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x10, 0x5, + 0x66, 0x66, 0x6c, 0x86, 0x66, 0x9e, 0x20, 0x10, + 0x6, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x0, 0x8, 0x40, 0x0, 0x0, 0x8, 0x66, + 0xd6, 0x66, 0xa6, 0x6a, 0x40, 0x0, 0xd0, 0x2, + 0x20, 0x10, 0x0, 0xa2, 0x0, 0xd, 0x0, 0xb7, + 0x0, 0x9a, 0x1a, 0x20, 0x0, 0xd0, 0x75, 0x0, + 0x0, 0x87, 0xa2, 0x0, 0xd, 0x33, 0x96, 0x66, + 0xb3, 0xa, 0x20, 0x0, 0xd0, 0xd, 0x0, 0xb, + 0x10, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xb1, + 0xa, 0x20, 0x0, 0xd0, 0xd, 0x66, 0x6d, 0x10, + 0xa2, 0x0, 0xd, 0x0, 0xb0, 0x0, 0x60, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x3a, 0xf1, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + + /* U+554A "啊" */ + 0x0, 0x0, 0x53, 0x54, 0x0, 0x0, 0x25, 0x9, + 0x69, 0x2c, 0x3a, 0x65, 0x66, 0x6e, 0x50, 0xc0, + 0xc0, 0xc0, 0xa0, 0x0, 0x0, 0xd0, 0xc, 0xc, + 0xc, 0x8, 0x0, 0x0, 0xd, 0x0, 0xc0, 0xc0, + 0xc4, 0x30, 0xc6, 0xd1, 0xd0, 0xc, 0xc, 0xc, + 0x31, 0xc, 0xc, 0xd, 0x0, 0xc0, 0xc0, 0xc0, + 0x80, 0xc0, 0xc0, 0xd0, 0xc, 0xc, 0xc, 0x6, + 0x5c, 0xc, 0xd, 0x0, 0xc6, 0xd0, 0xc0, 0x57, + 0xd5, 0xd0, 0xd0, 0xc, 0x9, 0xc, 0x6b, 0x5a, + 0x6, 0xd, 0x0, 0x70, 0x0, 0xc1, 0x70, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x42, + 0xd0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x2, 0xd9, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+554F "問" */ + 0x1a, 0x66, 0x6a, 0x50, 0x96, 0x66, 0xa3, 0xd, + 0x0, 0x9, 0x50, 0xd0, 0x0, 0xc1, 0xd, 0x0, + 0x9, 0x40, 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, + 0x40, 0xd6, 0x66, 0xd1, 0xd, 0x0, 0x9, 0x40, + 0xd0, 0x0, 0xc1, 0xe, 0x66, 0x6b, 0x40, 0xd6, + 0x66, 0xd1, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0xd, 0x0, 0x96, 0x66, 0x6a, 0x0, 0xc1, + 0xd, 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, + 0x0, 0xd0, 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, + 0xd6, 0x66, 0x69, 0x0, 0xc1, 0xd, 0x0, 0xd0, + 0x0, 0x9, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x0, + 0x1, 0x22, 0xe0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+5566 "啦" */ + 0x0, 0x0, 0x2, 0x80, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0xb, 0x10, 0x0, 0x10, + 0x10, 0x2, 0xa0, 0x0, 0x88, 0x0, 0xc, 0x6c, + 0x60, 0x2a, 0x61, 0x14, 0x45, 0x40, 0xd0, 0xa3, + 0x88, 0xc5, 0x36, 0x55, 0x54, 0xd, 0xa, 0x20, + 0x2a, 0x0, 0x0, 0x7, 0x0, 0xd0, 0xa2, 0x2, + 0xa1, 0x44, 0x0, 0xf2, 0xd, 0xa, 0x20, 0x3d, + 0x50, 0x90, 0x2c, 0x0, 0xd0, 0xa6, 0xbb, 0xa0, + 0xa, 0x24, 0x80, 0xd, 0x6c, 0x34, 0x2a, 0x0, + 0x77, 0x73, 0x0, 0xd0, 0xa2, 0x2, 0xa0, 0x5, + 0x69, 0x0, 0x9, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x80, 0x0, 0x0, 0x1, 0x15, 0xa0, 0x0, 0x6, + 0x17, 0x0, 0x0, 0x28, 0xf6, 0x37, 0x66, 0x66, + 0x71, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5584 "善" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf0, 0x5, 0x60, 0x4, 0x0, + 0x0, 0x76, 0x66, 0x96, 0x98, 0x66, 0x7b, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x80, 0x0, + 0x0, 0x7, 0x76, 0x67, 0xd6, 0x66, 0x62, 0x0, + 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6b, 0xa0, + 0x0, 0x10, 0x80, 0x2, 0xb0, 0x8, 0x40, 0x0, + 0x0, 0x0, 0x78, 0x2, 0xb0, 0x1a, 0x10, 0x20, + 0x5, 0x66, 0x78, 0x67, 0xc6, 0x96, 0x68, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x69, 0xa0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x69, 0x80, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+5589 "喉" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x16, 0x6a, 0xa0, 0x0, 0x96, + 0x6d, 0x6, 0x60, 0x0, 0x94, 0x0, 0xa, 0x11, + 0xb0, 0xa0, 0x0, 0xc, 0x4, 0x30, 0xa1, 0x1b, + 0x1d, 0x38, 0xa6, 0x66, 0x64, 0xa, 0x11, 0xb7, + 0xc0, 0x4a, 0x0, 0x1, 0x0, 0xa1, 0x1b, 0x6c, + 0x9, 0x69, 0x67, 0x90, 0xa, 0x11, 0xb0, 0xc2, + 0x40, 0xc0, 0x0, 0x0, 0xa1, 0x1b, 0xc, 0x32, + 0x2d, 0x22, 0x45, 0xa, 0x66, 0xb0, 0xc4, 0x44, + 0xd8, 0x44, 0x30, 0xb1, 0x7, 0xc, 0x0, 0x2a, + 0x71, 0x0, 0x4, 0x0, 0x0, 0xc0, 0x8, 0x41, + 0xa0, 0x0, 0x0, 0x0, 0xc, 0x2, 0x90, 0x8, + 0x90, 0x0, 0x0, 0x0, 0xd2, 0x70, 0x0, 0xb, + 0x90, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+559C "喜" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6d, 0x66, 0x66, 0xd8, 0x0, + 0x0, 0x10, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x66, 0x6d, 0x66, 0x7d, 0x20, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x66, 0x68, 0x7b, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x9, 0x50, 0x1, 0x0, + 0x6, 0x66, 0x66, 0xb6, 0x69, 0x66, 0x6d, 0x80, + 0x1, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6d, 0x10, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+559D "喝" */ + 0x0, 0x0, 0x5, 0x76, 0x66, 0x6b, 0x30, 0x62, + 0x28, 0x6, 0x70, 0x0, 0xe, 0x0, 0xc4, 0x3e, + 0x16, 0xa6, 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x6, + 0x70, 0x0, 0xe, 0x0, 0xc1, 0xe, 0x6, 0xa6, + 0x66, 0x6e, 0x0, 0xc1, 0xe, 0x5, 0x97, 0x0, + 0x5, 0x0, 0xc1, 0xe, 0x0, 0xd3, 0x0, 0x0, + 0x41, 0xc1, 0xe, 0x9, 0x76, 0x97, 0x66, 0xd6, + 0xc6, 0x6d, 0x6c, 0x0, 0xd5, 0x0, 0xc2, 0xc1, + 0x6, 0x4c, 0x6, 0x78, 0x50, 0xd1, 0x60, 0x1, + 0xc, 0x36, 0x0, 0xc0, 0xe0, 0x0, 0x0, 0xc, + 0x10, 0x1, 0x60, 0xe0, 0x0, 0x0, 0x2a, 0x66, + 0x66, 0x52, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xae, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x0, + + /* U+55AE "單" */ + 0x0, 0x20, 0x4, 0x0, 0x30, 0x1, 0x20, 0x0, + 0xe, 0x66, 0xe2, 0xe, 0x66, 0x8a, 0x0, 0x0, + 0xd0, 0xd, 0x0, 0xd0, 0x4, 0x80, 0x0, 0xd, + 0x0, 0xd0, 0xd, 0x0, 0x48, 0x0, 0x0, 0xc6, + 0x6a, 0x0, 0xd6, 0x67, 0x60, 0x0, 0x5, 0x76, + 0x66, 0x76, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, + 0x68, 0x0, 0xc, 0x0, 0x0, 0x6, 0x96, 0x6a, + 0xb6, 0x66, 0xc0, 0x0, 0x0, 0x66, 0x0, 0x68, + 0x0, 0xc, 0x0, 0x0, 0x6, 0x60, 0x6, 0x80, + 0x0, 0xc0, 0x0, 0x0, 0x68, 0x66, 0xab, 0x66, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, + 0x3, 0x80, 0x57, 0x66, 0x66, 0xab, 0x66, 0x66, + 0x66, 0x10, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, 0x0, + + /* U+55B6 "営" */ + 0x0, 0x3, 0x10, 0x17, 0x0, 0x8, 0x0, 0x0, + 0x0, 0xc, 0x30, 0xa5, 0x4, 0xb1, 0x0, 0x0, + 0x0, 0x59, 0x5, 0x70, 0x90, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x40, 0x0, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0x6e, 0x70, 0x78, 0x5, + 0x66, 0x66, 0x6a, 0x31, 0x70, 0x6, 0x10, 0x75, + 0x0, 0x0, 0xa2, 0x10, 0x0, 0x0, 0x7, 0x50, + 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, 0x79, 0x66, + 0x66, 0xa2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, + 0x68, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x48, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x4, + 0x80, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0x88, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, + + /* U+55CE "嗎" */ + 0x30, 0x4, 0x6, 0x33, 0x33, 0x33, 0xa1, 0xe, + 0x66, 0xe1, 0xd3, 0x33, 0xd3, 0x33, 0x10, 0xd0, + 0xd, 0xd, 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, + 0xd0, 0xd6, 0x66, 0xe6, 0x66, 0x0, 0xd0, 0xd, + 0xd, 0x0, 0xd, 0x0, 0x20, 0xd, 0x0, 0xd0, + 0xd6, 0x66, 0xe6, 0x6a, 0x10, 0xd0, 0xd, 0xd, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd5, + 0x65, 0xd6, 0x67, 0xd0, 0xe6, 0x6e, 0x7, 0x0, + 0x0, 0x0, 0x1b, 0xd, 0x0, 0x20, 0x1, 0x3, + 0x5, 0x62, 0xa0, 0x20, 0x0, 0x6, 0x64, 0x1b, + 0xc, 0x79, 0x0, 0x0, 0x5, 0x61, 0xd0, 0xa3, + 0x69, 0x70, 0x0, 0x0, 0xd2, 0x9, 0x2, 0x0, + 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, + 0x0, + + /* U+55EF "嗯" */ + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, 0x8, + 0x66, 0xb1, 0xd6, 0x67, 0x66, 0x8c, 0x0, 0xb1, + 0xd, 0xd, 0x0, 0x69, 0x3, 0x90, 0xb, 0x10, + 0xd0, 0xd3, 0x69, 0x9a, 0x59, 0x0, 0xb1, 0xd, + 0xd, 0x0, 0x94, 0x3, 0x90, 0xb, 0x10, 0xd0, + 0xd0, 0x2b, 0x69, 0x39, 0x0, 0xb1, 0xd, 0xd, + 0x28, 0x0, 0x95, 0x90, 0xb, 0x66, 0xd0, 0xd6, + 0x55, 0x55, 0x7a, 0x0, 0xb1, 0xd, 0x8, 0x0, + 0x20, 0x2, 0x40, 0xc, 0x10, 0x10, 0x3, 0x5, + 0xa0, 0x11, 0x0, 0x30, 0x0, 0x60, 0xb7, 0xc, + 0x10, 0xa6, 0x0, 0x0, 0x1d, 0xb, 0x30, 0x0, + 0x51, 0xe1, 0x0, 0x8, 0x80, 0xb4, 0x0, 0xa, + 0x4, 0x0, 0x0, 0x0, 0x6, 0xdb, 0xbb, 0xd2, + 0x0, + + /* U+561B "嘛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x10, 0x20, 0x0, 0x57, 0x0, 0x50, 0xd, 0x6d, + 0x2c, 0x66, 0x76, 0x68, 0x78, 0x20, 0xd0, 0xd0, + 0xc1, 0xd, 0x0, 0x94, 0x0, 0xd, 0xd, 0xc, + 0x10, 0xc0, 0x9, 0x20, 0x0, 0xd0, 0xd0, 0xc6, + 0x6d, 0xa4, 0xc7, 0xb3, 0xd, 0xd, 0xd, 0x13, + 0xc0, 0xd, 0x70, 0x0, 0xd0, 0xd0, 0xd0, 0x8d, + 0x92, 0xf8, 0x0, 0xe, 0x6e, 0x1b, 0xc, 0xc6, + 0x9d, 0x81, 0x0, 0xd0, 0x84, 0x76, 0x5c, 0x9, + 0x94, 0x90, 0x6, 0x0, 0x83, 0x80, 0xc4, 0x49, + 0x2b, 0x40, 0x0, 0x8, 0x70, 0xc, 0x50, 0x92, + 0x38, 0x0, 0x6, 0x20, 0x0, 0xc0, 0x9, 0x20, + 0x0, 0x2, 0x30, 0x0, 0xc, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+56B4 "嚴" */ + 0x0, 0x3, 0x0, 0x4, 0x2, 0x0, 0x2, 0x0, + 0x0, 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xc0, 0x0, + 0xa, 0x30, 0xc, 0xb, 0x0, 0xb, 0x0, 0x0, + 0xb7, 0x66, 0xd0, 0xb6, 0x66, 0xb0, 0x0, 0x34, + 0x0, 0x2, 0x3, 0x0, 0x8, 0x20, 0xa, 0x76, + 0x66, 0x66, 0x68, 0x66, 0x64, 0x0, 0xa3, 0x18, + 0x6d, 0x10, 0xd4, 0x0, 0x0, 0xa, 0x20, 0x1, + 0xa1, 0x1b, 0x0, 0x41, 0x0, 0xb4, 0x7a, 0x68, + 0xb8, 0x86, 0xaa, 0x30, 0xc, 0x11, 0xc6, 0x88, + 0x85, 0x9, 0x30, 0x0, 0xd0, 0x1a, 0x4, 0x94, + 0x60, 0xc0, 0x0, 0xc, 0x1, 0xc6, 0x88, 0x2, + 0x9a, 0x0, 0x2, 0x80, 0x1a, 0x4, 0x83, 0xc, + 0x70, 0x0, 0x62, 0x37, 0xd8, 0x9a, 0x6, 0x6b, + 0x50, 0x7, 0x5, 0x61, 0x4, 0x85, 0x50, 0x1c, + 0x80, 0x10, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + + /* U+56DB "四" */ + 0x40, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd, 0x66, + 0x6e, 0x66, 0xe6, 0x66, 0xf1, 0xd1, 0x1, 0xc0, + 0xe, 0x0, 0xe, 0xd, 0x10, 0x1c, 0x0, 0xe0, + 0x0, 0xe0, 0xd1, 0x1, 0xb0, 0xe, 0x0, 0xe, + 0xd, 0x10, 0x3a, 0x0, 0xe0, 0x0, 0xe0, 0xd1, + 0x5, 0x80, 0xe, 0x0, 0xe, 0xd, 0x10, 0x85, + 0x0, 0xe0, 0x0, 0xe0, 0xd1, 0xc, 0x0, 0xd, + 0x10, 0xe, 0xd, 0x17, 0x50, 0x0, 0x7c, 0xd8, + 0xe0, 0xd6, 0x50, 0x0, 0x0, 0x0, 0xe, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, + + /* U+56DE "回" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xe1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xc1, 0x9, 0x66, 0x66, 0xb1, 0xd, + 0xc, 0x10, 0xd0, 0x0, 0xe, 0x0, 0xd0, 0xc1, + 0xd, 0x0, 0x0, 0xd0, 0xd, 0xc, 0x10, 0xd0, + 0x0, 0xd, 0x0, 0xd0, 0xc1, 0xd, 0x66, 0x66, + 0xe0, 0xd, 0xc, 0x10, 0xd0, 0x0, 0xb, 0x0, + 0xd0, 0xc1, 0x1, 0x0, 0x0, 0x0, 0xd, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xd0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6d, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+56E0 "因" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0xe, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xe2, 0xd, 0x0, + 0x0, 0xb4, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, 0xc1, + 0x1, 0x50, 0xe0, 0xd, 0x18, 0x66, 0xe6, 0x67, + 0x81, 0xe0, 0xd, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xe0, 0xd, 0x0, 0x1, 0xd7, 0x0, 0x0, 0xe0, + 0xd, 0x0, 0x7, 0x72, 0xc2, 0x0, 0xe0, 0xd, + 0x0, 0xc, 0x0, 0x5e, 0x10, 0xe0, 0xd, 0x0, + 0x93, 0x0, 0xc, 0x50, 0xe0, 0xd, 0x16, 0x20, + 0x0, 0x2, 0x10, 0xe0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0xe, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+56F0 "困" */ + 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1e, 0x0, + 0x0, 0x28, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x2, + 0xc0, 0x0, 0xe, 0xe, 0x0, 0x0, 0x2b, 0x0, + 0x10, 0xe0, 0xe1, 0x76, 0x69, 0xd6, 0x6d, 0x3e, + 0xe, 0x0, 0x2, 0xfb, 0x0, 0x0, 0xe0, 0xe0, + 0x0, 0x97, 0xd3, 0x0, 0xe, 0xe, 0x0, 0x3b, + 0x2b, 0x5b, 0x20, 0xe0, 0xe0, 0xa, 0x12, 0xb0, + 0x5f, 0x1e, 0xe, 0x8, 0x20, 0x2b, 0x0, 0x91, + 0xe0, 0xe5, 0x10, 0x2, 0xb0, 0x0, 0xe, 0xe, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x1, 0x20, 0x0, 0xe, 0xe, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, + + /* U+56F3 "図" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0x66, 0x67, 0xd0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd0, + 0x0, 0x1, 0x70, 0x2, 0x3, 0xb0, 0xd, 0x0, + 0x2a, 0x29, 0x61, 0xf2, 0x3b, 0x0, 0xd0, 0x6, + 0x4c, 0x36, 0x89, 0x3, 0xb0, 0xd, 0x0, 0x35, + 0x60, 0x1d, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x82, + 0xa, 0x50, 0x3, 0xb0, 0xd, 0x0, 0x1, 0xb5, + 0xa0, 0x0, 0x3b, 0x0, 0xd0, 0x0, 0x5, 0xf2, + 0x0, 0x3, 0xb0, 0xd, 0x0, 0x2, 0xa5, 0xd5, + 0x0, 0x3b, 0x0, 0xd0, 0x5, 0x80, 0x2, 0xdd, + 0x84, 0xb0, 0xd, 0x16, 0x30, 0x0, 0x0, 0x65, + 0x3b, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7b, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+56FD "国" */ + 0x96, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x1d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0xc1, 0x56, 0x66, + 0x66, 0x7d, 0x2e, 0xc, 0x11, 0x0, 0xc1, 0x0, + 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, 0x0, 0xe, + 0xc, 0x10, 0x0, 0xc1, 0x7, 0x20, 0xe0, 0xc1, + 0x46, 0x6d, 0x76, 0x64, 0xe, 0xc, 0x10, 0x0, + 0xc1, 0x96, 0x0, 0xe0, 0xc1, 0x0, 0xc, 0x10, + 0xe2, 0xe, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, + 0xe0, 0xc3, 0x86, 0x6b, 0x66, 0x8c, 0x3e, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xd6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+570B "國" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0xe6, 0x66, 0x66, 0x76, 0x66, 0x67, 0xc0, 0xd, + 0x0, 0x0, 0x6, 0xb8, 0x0, 0x3a, 0x0, 0xd0, + 0x0, 0x0, 0x56, 0x76, 0x33, 0xa0, 0xd, 0x28, + 0x66, 0x69, 0x96, 0x7b, 0x5a, 0x0, 0xd0, 0x0, + 0x0, 0x47, 0x0, 0x3, 0xa0, 0xd, 0xa, 0x66, + 0xc3, 0x80, 0x74, 0x3a, 0x0, 0xd0, 0xc0, 0xc, + 0xa, 0xc, 0x23, 0xa0, 0xd, 0xc, 0x0, 0xc0, + 0xb2, 0x90, 0x3a, 0x0, 0xd0, 0xc6, 0x6b, 0x8, + 0xc2, 0x3, 0xa0, 0xd, 0x3, 0x0, 0x32, 0x4e, + 0x2, 0x6a, 0x0, 0xd2, 0x89, 0x72, 0x2a, 0x6a, + 0x93, 0xa0, 0xd, 0x17, 0x0, 0x38, 0x0, 0x6f, + 0x4a, 0x0, 0xd0, 0x0, 0x13, 0x0, 0x0, 0x24, + 0xa0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7a, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+570D "圍" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, + 0x66, 0x66, 0x76, 0x66, 0x66, 0xd4, 0xd, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, + 0xc0, 0x6, 0x0, 0xc1, 0xd, 0x3, 0x78, 0xc6, + 0x6d, 0x10, 0xc1, 0xd, 0x23, 0x37, 0x93, 0x3c, + 0x75, 0xc1, 0xd, 0x24, 0x53, 0x33, 0x37, 0x32, + 0xc1, 0xd, 0x0, 0xc6, 0x66, 0x6d, 0x10, 0xc1, + 0xd, 0x0, 0xb5, 0x59, 0x5b, 0x0, 0xc1, 0xd, + 0x4, 0x66, 0x6e, 0x68, 0x80, 0xc1, 0xd, 0x1, + 0xc0, 0xd, 0x0, 0x10, 0xc1, 0xd, 0x7, 0xa6, + 0x6e, 0x67, 0xc0, 0xc1, 0xd, 0x0, 0x0, 0xd, + 0x0, 0x0, 0xc1, 0xd, 0x0, 0x0, 0x8, 0x0, + 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xd1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+5712 "園" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, + 0x66, 0x66, 0x96, 0x66, 0x66, 0xe2, 0xd, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x56, + 0xd6, 0x6d, 0x10, 0xd0, 0xd, 0x0, 0x10, 0xb1, + 0x0, 0x30, 0xd0, 0xd, 0x18, 0x66, 0x86, 0x66, + 0x93, 0xd0, 0xd, 0x0, 0x86, 0x66, 0x6a, 0x20, + 0xd0, 0xd, 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xd0, 0xd, + 0x0, 0x5b, 0x30, 0x4, 0x90, 0xd0, 0xd, 0x0, + 0x7d, 0x33, 0x7, 0x50, 0xd0, 0xd, 0x6, 0x58, + 0x13, 0xb8, 0x0, 0xd0, 0xd, 0x41, 0x8, 0x10, + 0x9, 0xc0, 0xd0, 0xd, 0x0, 0x5, 0x0, 0x0, + 0x50, 0xd0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+5718 "團" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xe, + 0x66, 0x66, 0x68, 0x66, 0x66, 0xc4, 0xd, 0x0, + 0x0, 0x1c, 0x0, 0x13, 0xb3, 0xd, 0x19, 0x77, + 0x7d, 0x77, 0x76, 0xb3, 0xd, 0x2, 0x86, 0x6d, + 0x66, 0xc0, 0xb3, 0xd, 0x2, 0xb4, 0x4d, 0x44, + 0xc0, 0xb3, 0xd, 0x2, 0xa2, 0x3c, 0x22, 0xc0, + 0xb3, 0xd, 0x2, 0xa6, 0x6d, 0x6a, 0x70, 0xb3, + 0xd, 0x3, 0x56, 0x7c, 0x57, 0xc4, 0xb3, 0xd, + 0x2, 0x52, 0x0, 0x86, 0x24, 0xb3, 0xd, 0x7, + 0x77, 0x66, 0xb9, 0x92, 0xb3, 0xd, 0x0, 0xa, + 0x10, 0x85, 0x0, 0xb3, 0xd, 0x0, 0x5, 0x56, + 0xc4, 0x0, 0xb3, 0xd, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0xb3, 0xe, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xc3, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+571F "土" */ + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x10, 0x0, + 0x1, 0x66, 0x66, 0x6d, 0x76, 0x66, 0xe6, 0x0, + 0x0, 0x20, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x3, 0x0, + 0x27, 0x66, 0x66, 0x6c, 0x76, 0x66, 0x6d, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5728 "在" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x8f, 0x40, + 0x1, 0x10, 0x7, 0x80, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x23, 0x0, + 0x0, 0x5f, 0x14, 0x76, 0x6e, 0x66, 0x88, 0x0, + 0x4, 0x6c, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x33, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x0, 0x1, 0x0, + 0x0, 0xc, 0x37, 0x66, 0x6d, 0x66, 0x6c, 0x90, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5730 "地" */ + 0x0, 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xc, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0x7, 0x0, + 0x0, 0xe, 0x1, 0xd, 0x1, 0xc6, 0x6e, 0x0, + 0x8, 0x6e, 0x7a, 0xd, 0x56, 0xc0, 0xc, 0x0, + 0x0, 0xe, 0x4, 0x6d, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x12, 0xd, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x1, 0xb5, 0x9b, 0x0, + 0x0, 0xe, 0x3, 0x2d, 0x2, 0xc0, 0x73, 0x40, + 0x0, 0x4f, 0x82, 0xd, 0x1, 0x40, 0x0, 0x70, + 0x2e, 0xa2, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc2, + 0x2, 0x0, 0x0, 0xa, 0xcc, 0xcc, 0xcd, 0xe3, + + /* U+5747 "均" */ + 0x0, 0xa, 0x20, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, 0x0, + 0xd0, 0x0, 0x88, 0x66, 0x66, 0xc6, 0x16, 0x6e, + 0x6b, 0x2a, 0x0, 0x0, 0xa, 0x30, 0x0, 0xd0, + 0x7, 0x23, 0x70, 0x0, 0xb2, 0x0, 0xd, 0x0, + 0x30, 0x9, 0x90, 0xb, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0x2e, 0x0, 0xc2, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x15, 0xd, 0x10, 0x0, 0xd1, 0x65, 0x0, + 0x58, 0x10, 0xe0, 0x1, 0x6e, 0x81, 0x6, 0xc5, + 0x0, 0xf, 0x3, 0xf9, 0x10, 0x9, 0xc1, 0x0, + 0x1, 0xe0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x21, + 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, + + /* U+574A "坊" */ + 0x0, 0x7, 0x20, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0xc1, 0x5, 0x66, 0x66, 0x66, 0xd6, 0x0, 0xc, + 0x17, 0x10, 0xb4, 0x0, 0x0, 0x0, 0x66, 0xd6, + 0x61, 0xc, 0x30, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xd7, 0x66, 0xa9, 0x0, 0x0, 0xc1, 0x0, + 0xf, 0x10, 0x9, 0x60, 0x0, 0xc, 0x10, 0x1, + 0xe0, 0x0, 0xa4, 0x0, 0x0, 0xc1, 0x34, 0x69, + 0x0, 0xc, 0x30, 0x1, 0x5e, 0x93, 0xc, 0x30, + 0x0, 0xd1, 0x2, 0xf9, 0x20, 0x5, 0x90, 0x0, + 0xe, 0x0, 0x1, 0x0, 0x2, 0xa0, 0x3, 0x4, + 0xc0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x4d, 0xf6, + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+5750 "坐" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0xa, 0x30, 0x2, 0x10, 0x0, + 0x0, 0x8, 0xc0, 0xa, 0x30, 0x8, 0xc0, 0x0, + 0x0, 0xc, 0x40, 0xa, 0x30, 0xd, 0x40, 0x0, + 0x0, 0x1f, 0x0, 0xa, 0x30, 0x3e, 0x20, 0x0, + 0x0, 0x87, 0xb3, 0xa, 0x30, 0x93, 0xa5, 0x0, + 0x0, 0xb0, 0x3f, 0x1a, 0x32, 0x90, 0x1f, 0x20, + 0x7, 0x20, 0x9, 0xa, 0x37, 0x0, 0x8, 0x10, + 0x23, 0x0, 0x0, 0xa, 0x51, 0x2, 0x30, 0x0, + 0x0, 0x27, 0x66, 0x6c, 0x86, 0x69, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x9, 0x20, + 0x28, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x70, + + /* U+578B "型" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x0, 0xc1, 0x6, 0x6b, + 0x6b, 0x87, 0x4, 0x10, 0xd0, 0x0, 0x1b, 0xb, + 0x10, 0xb, 0x30, 0xd0, 0x0, 0x1b, 0xb, 0x16, + 0xb, 0x10, 0xd0, 0x47, 0x7c, 0x6d, 0x78, 0x4b, + 0x10, 0xd0, 0x0, 0x48, 0xb, 0x10, 0xb, 0x10, + 0xd0, 0x0, 0x93, 0xb, 0x10, 0x6, 0x0, 0xd0, + 0x2, 0xa0, 0xb, 0x20, 0x2, 0x33, 0xd0, 0x18, + 0x0, 0x7, 0x62, 0x0, 0x5e, 0x80, 0x30, 0x0, + 0x0, 0xa5, 0x0, 0x3, 0x0, 0x0, 0x67, 0x66, + 0xc8, 0x66, 0x9c, 0x10, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x30, 0x46, 0x66, 0x66, 0xc8, 0x66, 0x67, + 0xf7, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+57DF "域" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x10, 0x0, 0x0, 0x76, 0x54, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0xc, 0x40, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x75, 0x2, 0x70, + 0x0, 0xe, 0x5, 0x76, 0x66, 0xa9, 0x67, 0x82, + 0x5, 0x6e, 0x98, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x1, 0xe, 0x0, 0xb6, 0x7c, 0x66, 0xb, 0x30, + 0x0, 0xe, 0x0, 0xc0, 0x29, 0x57, 0x1e, 0x0, + 0x0, 0xe, 0x0, 0xc0, 0x29, 0x49, 0x77, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x79, 0x1c, 0xc1, 0x0, + 0x0, 0xe, 0x44, 0x50, 0x1, 0xe, 0x90, 0x0, + 0x19, 0xc9, 0x20, 0x0, 0x45, 0x2e, 0x70, 0x4, + 0x7, 0x10, 0x2a, 0xb7, 0x20, 0xb4, 0xe3, 0x34, + 0x0, 0x0, 0x5, 0x0, 0x1a, 0x30, 0x4e, 0xb3, + 0x0, 0x0, 0x0, 0x3, 0x81, 0x0, 0x4, 0xe3, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x11, + + /* U+57F7 "執" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x1, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x10, 0x1, 0xc0, 0x0, 0x0, + 0x3, 0x66, 0xe6, 0xa2, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0xc0, 0x25, 0x0, + 0x0, 0x0, 0xd0, 0x24, 0x57, 0xd5, 0x8c, 0x0, + 0x7, 0xb6, 0x66, 0x95, 0x2, 0xb0, 0x57, 0x0, + 0x0, 0x69, 0x4, 0xb0, 0x45, 0xa0, 0x76, 0x0, + 0x0, 0x8, 0x7, 0x50, 0xa, 0xb0, 0x85, 0x0, + 0x5, 0x76, 0xe6, 0x63, 0x9, 0xcb, 0x84, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc, 0x8, 0x94, 0x0, + 0x7, 0x66, 0xe6, 0x99, 0x3a, 0x0, 0x85, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0xa1, 0x0, 0x58, 0x60, + 0x0, 0x0, 0xe0, 0x6, 0x50, 0x0, 0x1d, 0xb0, + 0x0, 0x0, 0xe0, 0x64, 0x0, 0x0, 0x4, 0xf1, + 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x11, + + /* U+57FA "基" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x18, 0x0, + 0x0, 0x66, 0x6d, 0x66, 0x66, 0xd7, 0x66, 0x20, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0x5, 0x0, + 0x6, 0x76, 0x6d, 0x66, 0x66, 0xb6, 0x7c, 0x90, + 0x0, 0x0, 0x2c, 0x9, 0x30, 0x91, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0xb, 0x20, 0x1b, 0x83, 0x0, + 0x0, 0x57, 0x46, 0x6c, 0x76, 0xd3, 0x7e, 0xb1, + 0x5, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x11, 0x0, + 0x0, 0x56, 0x66, 0x6c, 0x76, 0x66, 0xcc, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5831 "報" */ + 0x0, 0x0, 0xb0, 0x0, 0x30, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xd0, 0x10, 0xd6, 0x66, 0x6d, 0x30, + 0x3, 0x76, 0xe6, 0x91, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x15, 0x66, 0xe6, 0x98, 0xd0, 0x7, 0xe8, 0x0, + 0x1, 0x60, 0x4, 0x50, 0xd0, 0x0, 0x21, 0x0, + 0x0, 0x4b, 0x9, 0x20, 0xd7, 0x55, 0x5d, 0x50, + 0x3, 0x6c, 0x69, 0xa3, 0xd3, 0x20, 0x2d, 0x0, + 0x0, 0x10, 0xd0, 0x0, 0xd0, 0x80, 0x94, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x66, 0xb0, 0x0, + 0x17, 0x66, 0xe6, 0x98, 0xd0, 0xf, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x78, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd5, 0x40, 0x6d, 0x50, + 0x0, 0x0, 0xe0, 0x0, 0xd2, 0x0, 0x7, 0x60, + 0x0, 0x0, 0x40, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+5834 "場" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x9, 0x66, 0x66, 0x6b, 0x10, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xe, 0x0, + 0x18, 0x6e, 0x6b, 0x2e, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xe, 0x0, 0x8, 0x0, 0x0, 0x7, 0x10, + 0x0, 0xe, 0x2, 0x76, 0x76, 0x66, 0x66, 0xd3, + 0x0, 0xe, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x10, + 0x0, 0xe, 0x1, 0x2b, 0x7b, 0x79, 0x98, 0xb0, + 0x0, 0xe, 0x76, 0x92, 0x4a, 0xd, 0x26, 0x70, + 0x18, 0xc7, 0x4, 0x2, 0xa0, 0x78, 0x8, 0x40, + 0x9, 0x10, 0x0, 0x47, 0x4, 0xa0, 0xb, 0x20, + 0x0, 0x0, 0x2, 0x20, 0x58, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x40, 0x19, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x1, 0x60, 0x0, + + /* U+584A "塊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x30, 0x19, 0x0, 0x4, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x68, 0xc6, 0x6f, 0x10, + 0x0, 0xe, 0x0, 0xb1, 0x3, 0xa0, 0xe, 0x0, + 0x5, 0x6e, 0x88, 0xb6, 0x68, 0xc6, 0x6e, 0x0, + 0x1, 0xe, 0x0, 0xb1, 0x4, 0x90, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xb1, 0x6, 0x70, 0xe, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x6c, 0xd6, 0x6d, 0x0, + 0x0, 0xe, 0x0, 0x20, 0xd, 0xb1, 0x41, 0x0, + 0x0, 0xe, 0x66, 0x0, 0x68, 0xa1, 0xa1, 0x0, + 0x4, 0x9a, 0x10, 0x2, 0xc0, 0xa6, 0x28, 0x0, + 0xb, 0x40, 0x0, 0x1b, 0x20, 0xab, 0x79, 0x90, + 0x0, 0x0, 0x2, 0xa2, 0x0, 0xa2, 0x1, 0x90, + 0x0, 0x0, 0x55, 0x0, 0x0, 0x6c, 0xaa, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5869 "塩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2, 0xc0, 0x0, 0x2, 0x0, + 0x0, 0xc, 0x0, 0x8, 0x86, 0x66, 0x6c, 0x40, + 0x0, 0xc, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x7d, 0x78, 0x66, 0x76, 0x66, 0x7a, 0x0, + 0x0, 0xc, 0x0, 0x16, 0x60, 0x0, 0x39, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x60, 0x0, 0x39, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x96, 0x66, 0x89, 0x0, + 0x0, 0xc, 0x0, 0x12, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xd, 0x66, 0x4b, 0x6a, 0x6a, 0x6e, 0x20, + 0x4, 0xaa, 0x20, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x9, 0x40, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0xc, 0xc, 0xd, 0x0, + 0x0, 0x0, 0x4, 0x7c, 0x6d, 0x6d, 0x6e, 0xc2, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+5883 "境" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x10, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x2, 0x60, 0x26, 0x0, + 0x0, 0xe, 0x0, 0x48, 0x76, 0x69, 0x65, 0x10, + 0x0, 0xe, 0x0, 0x0, 0xb2, 0xb, 0x50, 0x0, + 0x6, 0x6e, 0x8a, 0x0, 0x62, 0x26, 0x4, 0x50, + 0x0, 0xe, 0x3, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xe, 0x0, 0xc, 0x66, 0x66, 0xc6, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0xe, 0x55, 0x2d, 0x0, 0x0, 0xb1, 0x0, + 0xb, 0xb6, 0x0, 0x9, 0xc9, 0xc7, 0x81, 0x20, + 0x2, 0x0, 0x0, 0x0, 0xd2, 0xa2, 0x0, 0x70, + 0x0, 0x0, 0x0, 0x8, 0x90, 0xa3, 0x0, 0xb0, + 0x0, 0x0, 0x26, 0x96, 0x0, 0x5d, 0xbc, 0xc1, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5897 "増" */ + 0x0, 0xb, 0x10, 0x5, 0x20, 0x0, 0x57, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd4, 0x0, 0xc5, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x68, 0x5, 0x30, 0x0, + 0x0, 0xe, 0x0, 0xc6, 0x66, 0x96, 0x66, 0xe0, + 0x4, 0x4e, 0x57, 0xd1, 0x0, 0xd0, 0x1, 0xd0, + 0x3, 0x2e, 0x21, 0xc6, 0x66, 0xe6, 0x66, 0xd0, + 0x0, 0xe, 0x0, 0xd1, 0x0, 0xd0, 0x1, 0xd0, + 0x0, 0xe, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0xd0, + 0x0, 0xe, 0x0, 0x32, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xe, 0x5, 0x1f, 0x66, 0x66, 0x6f, 0x10, + 0x0, 0x2f, 0x91, 0xe, 0x0, 0x0, 0xe, 0x0, + 0xc, 0xd3, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x4, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x66, 0x66, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x5, 0x0, + + /* U+589E "增" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb1, 0x0, 0x27, 0x0, 0xc, 0x30, 0x0, + 0xd, 0x0, 0x0, 0x96, 0x5, 0x60, 0x0, 0x0, + 0xd0, 0x8, 0x67, 0x86, 0xa6, 0x78, 0x0, 0xd, + 0x0, 0xc0, 0x0, 0xc0, 0x4, 0x70, 0x76, 0xe9, + 0x8c, 0x47, 0xc, 0xb, 0x77, 0x0, 0xd, 0x0, + 0xc0, 0xd2, 0xc3, 0x74, 0x70, 0x0, 0xd0, 0xc, + 0x4, 0xc, 0x30, 0x47, 0x0, 0xd, 0x0, 0xc6, + 0x66, 0x96, 0x68, 0x80, 0x0, 0xd0, 0x2, 0x30, + 0x0, 0x0, 0x60, 0x0, 0xd, 0x4, 0xe, 0x66, + 0x66, 0x7c, 0x0, 0x16, 0xd6, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x1e, 0x60, 0x0, 0xe, 0x66, 0x66, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x2, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x10, + + /* U+58CA "壊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x69, 0x90, + 0x0, 0xd, 0x0, 0x10, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x86, 0x68, 0xb7, 0x6b, 0x30, + 0x5, 0x6e, 0x79, 0xa1, 0xc, 0xc, 0xa, 0x10, + 0x1, 0xd, 0x0, 0xa1, 0xc, 0xc, 0xa, 0x10, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x6d, 0x6c, 0x20, + 0x0, 0xd, 0x0, 0x50, 0x2, 0x70, 0x4, 0x0, + 0x0, 0xd, 0x2, 0x66, 0x66, 0xd6, 0x6c, 0x30, + 0x0, 0xd, 0x5, 0x20, 0x97, 0x50, 0x3, 0x0, + 0x0, 0x2e, 0x70, 0x6, 0xd0, 0x35, 0x5b, 0x10, + 0xb, 0xd3, 0x0, 0x78, 0xc0, 0xb, 0x60, 0x0, + 0x4, 0x0, 0x36, 0x12, 0xc1, 0x42, 0xd5, 0x0, + 0x0, 0x0, 0x10, 0x4, 0xf7, 0x0, 0x3e, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, + + /* U+58D3 "壓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, + 0x0, 0xa2, 0x64, 0x44, 0x70, 0x8, 0x20, 0x0, + 0x0, 0xa2, 0xc6, 0x66, 0xd0, 0xc, 0x3a, 0x0, + 0x0, 0xa2, 0xc2, 0x22, 0xc0, 0xc, 0x6, 0x0, + 0x0, 0xb1, 0x84, 0x44, 0x84, 0x6d, 0x6b, 0x10, + 0x0, 0xc0, 0xb6, 0x66, 0xd1, 0xb, 0x50, 0x0, + 0x0, 0xc0, 0xd6, 0x66, 0xc0, 0x47, 0x70, 0x0, + 0x2, 0x90, 0xb0, 0x0, 0xc0, 0x91, 0x81, 0x0, + 0x6, 0x30, 0xd6, 0x66, 0xc2, 0x70, 0x3b, 0x0, + 0x8, 0x0, 0xc0, 0x6, 0xb6, 0x0, 0xa, 0x70, + 0x22, 0x0, 0x10, 0x2, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x67, 0xb6, 0x67, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0xb0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+58EB "士" */ + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x1, 0xb2, 0x7, 0x66, 0x66, + 0x6d, 0x86, 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x1, 0x0, 0x0, 0x46, 0x66, 0x6d, 0x86, 0x66, + 0xf6, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+58F0 "声" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x0, 0x37, + 0x66, 0x66, 0x6e, 0x66, 0x67, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x0, 0x76, + 0x66, 0x6b, 0x66, 0x8b, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0xc7, 0x66, + 0x6c, 0x66, 0x6d, 0x30, 0x0, 0xc, 0x20, 0x0, + 0xd0, 0x0, 0xc1, 0x0, 0x0, 0xc2, 0x0, 0xd, + 0x0, 0xc, 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, + 0x66, 0xb1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+58F2 "売" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, 0x1, + 0x76, 0x66, 0x6d, 0x76, 0x66, 0x63, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x60, 0x0, 0x0, 0x5, + 0x76, 0x66, 0x66, 0x67, 0x20, 0x0, 0x18, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xa1, 0x6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x30, 0xb2, 0x0, 0x82, + 0x1, 0x60, 0x4, 0x0, 0x0, 0x0, 0xc, 0x40, + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1c, + 0x0, 0x1, 0x0, 0x0, 0x5, 0x90, 0x1, 0xc0, + 0x0, 0x60, 0x0, 0x1, 0xc2, 0x0, 0x1d, 0x0, + 0x8, 0x10, 0x5, 0x92, 0x0, 0x0, 0xdc, 0xcc, + 0xd4, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5909 "変" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, 0xa0, 0x7, + 0x66, 0x6d, 0x76, 0x6d, 0x76, 0x67, 0x20, 0x0, + 0x41, 0xd2, 0x0, 0xe2, 0x10, 0x0, 0x0, 0x1d, + 0x5d, 0x20, 0xe, 0x25, 0xa4, 0x0, 0xa, 0x20, + 0xd2, 0x0, 0xe2, 0x2, 0xd7, 0x17, 0x10, 0xa, + 0x10, 0x6, 0x0, 0x2, 0x70, 0x0, 0x0, 0xb8, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x7c, 0x66, + 0x66, 0xcd, 0x0, 0x0, 0x0, 0x67, 0x71, 0x0, + 0x5e, 0x30, 0x0, 0x0, 0x63, 0x0, 0xa1, 0x5d, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x9c, 0x61, + 0x0, 0x0, 0x3, 0x78, 0x40, 0x0, 0x29, 0xee, + 0xc6, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x44, + 0x0, + + /* U+590F "夏" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x83, 0x0, + 0x4, 0x76, 0x66, 0xaa, 0x66, 0x66, 0x65, 0x0, + 0x0, 0xa, 0x66, 0x96, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x68, 0x86, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x4, 0xd, 0x20, 0x0, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x66, 0x68, 0xf4, 0x0, 0x0, + 0x0, 0x7, 0x60, 0x80, 0x2d, 0x30, 0x0, 0x0, + 0x0, 0x74, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x2, 0x99, 0x8b, 0x62, 0x0, 0x0, + 0x0, 0x26, 0x86, 0x10, 0x1, 0x8d, 0xfd, 0x60, + 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+5915 "夕" */ + 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3f, + 0x66, 0x66, 0x6d, 0xb0, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0x1f, 0x40, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x8c, 0x0, 0x0, 0xc, 0x94, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0x75, 0xc, 0x80, 0x8, 0xa0, 0x0, + 0x4, 0x60, 0x2, 0xf4, 0x2e, 0x20, 0x0, 0x4, + 0x0, 0x0, 0x72, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x30, + 0x0, 0x0, 0x0, 0x2, 0x78, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5916 "外" */ + 0x0, 0x0, 0x77, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x6c, 0x66, 0xb6, 0xe, 0x0, 0x0, 0x0, 0xb, + 0x30, 0xd, 0x70, 0xe0, 0x0, 0x0, 0x2, 0xb0, + 0x2, 0xe0, 0xe, 0x40, 0x0, 0x0, 0x98, 0x80, + 0x68, 0x0, 0xe3, 0xb7, 0x0, 0x26, 0x9, 0x8c, + 0x20, 0xe, 0x1, 0xca, 0x5, 0x0, 0x7, 0xa0, + 0x0, 0xe0, 0x1, 0x90, 0x0, 0x0, 0xb3, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x39, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+591A "多" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc1, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9a, + 0x66, 0x66, 0x8f, 0x60, 0x0, 0x39, 0x49, 0x30, + 0x3, 0xd4, 0x0, 0x6, 0x40, 0x3, 0xb0, 0x6b, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x8a, 0x10, 0x0, 0x0, + 0x25, 0x66, 0x20, 0xaa, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x1b, 0x96, 0x66, 0x69, 0xf2, 0x0, 0x4, + 0xb7, 0x0, 0x0, 0x2d, 0x30, 0x2, 0x74, 0x3, + 0xb0, 0x3, 0xc2, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x7a, 0x10, 0x0, 0x0, 0x0, 0x1, 0x7a, 0x40, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x30, 0x0, 0x0, + 0x0, 0x24, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+591C "夜" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x2, 0x0, + 0x8, 0x66, 0x76, 0x66, 0x86, 0x66, 0x6b, 0x70, + 0x0, 0x0, 0xe5, 0x5, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0xa, 0x50, 0x0, 0x60, 0x0, + 0x0, 0xc, 0x30, 0x1d, 0x66, 0x67, 0xf2, 0x0, + 0x0, 0x4f, 0x40, 0x85, 0x53, 0x6, 0x90, 0x0, + 0x0, 0xbc, 0x21, 0xb5, 0xe, 0x1b, 0x30, 0x0, + 0x7, 0x2b, 0x28, 0x17, 0x15, 0x2c, 0x0, 0x0, + 0x13, 0xb, 0x42, 0x1, 0x90, 0x95, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x59, 0xc0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x2f, 0x90, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x3, 0xb2, 0x8c, 0x50, 0x0, + 0x0, 0xb, 0x21, 0x87, 0x0, 0x4, 0xdf, 0x90, + 0x0, 0x6, 0x35, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+5920 "夠" */ + 0x0, 0x0, 0x85, 0x0, 0x1, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xd2, 0x25, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0x1b, 0x44, 0x6f, 0x3c, 0x10, 0x0, 0x50, + 0x1, 0x78, 0x50, 0xc4, 0x59, 0x66, 0x66, 0xe1, + 0x3, 0x1, 0x6a, 0x61, 0x90, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x96, 0x8, 0x10, 0x0, 0x20, 0xd0, + 0x0, 0x38, 0x7d, 0x10, 0x3c, 0x66, 0xd0, 0xd0, + 0x4, 0x30, 0xd8, 0x6c, 0x7a, 0x1, 0xc0, 0xd0, + 0x0, 0xa, 0x40, 0x2e, 0x4a, 0x1, 0xc1, 0xc0, + 0x0, 0x88, 0x40, 0x96, 0x2c, 0x66, 0xc1, 0xc0, + 0x4, 0x10, 0xd3, 0xc0, 0x37, 0x0, 0x72, 0xb0, + 0x0, 0x0, 0x2c, 0x20, 0x0, 0x0, 0x4, 0x90, + 0x0, 0x2, 0xb2, 0x0, 0x0, 0x22, 0x19, 0x70, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x26, 0xef, 0x20, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, + + /* U+5927 "大" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x10, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x27, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x3c, 0x20, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x20, + 0x2, 0x84, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x60, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5929 "天" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x28, 0x66, 0x69, 0x66, 0x69, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x3b, 0x0, + 0x6, 0x76, 0x66, 0x7e, 0x96, 0x66, 0x67, 0x30, + 0x0, 0x0, 0x0, 0x69, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x5d, 0x20, 0x0, + 0x0, 0x5, 0x60, 0x0, 0x0, 0x6, 0xf8, 0x20, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x91, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592A "太" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, 0x0, + 0x4, 0x76, 0x66, 0x6f, 0x86, 0x66, 0x7a, 0x50, + 0x0, 0x0, 0x0, 0x1d, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x26, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x54, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0xb, 0xa0, 0x9, 0xb0, 0x0, + 0x0, 0x2a, 0x10, 0x1, 0xf1, 0x0, 0xce, 0x60, + 0x4, 0x60, 0x0, 0x0, 0x20, 0x0, 0x1b, 0x61, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592B "夫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x6, 0x0, 0x0, 0x56, + 0x66, 0x6d, 0x86, 0x66, 0x83, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x20, 0x0, 0x2, 0x0, 0x56, 0x66, 0x66, + 0xe6, 0x66, 0x68, 0xf5, 0x1, 0x0, 0x0, 0x1d, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x81, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x8a, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x9d, + 0x50, 0x4, 0x72, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0x71, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+592E "央" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x20, 0x0, 0x0, 0xa, + 0x76, 0x6d, 0x86, 0x6d, 0x60, 0x0, 0x0, 0xa4, + 0x0, 0xb3, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, + 0xb, 0x20, 0xc, 0x30, 0x0, 0x0, 0xa4, 0x0, + 0xc1, 0x0, 0xc3, 0x0, 0x0, 0xa, 0x40, 0xd, + 0x10, 0xc, 0x4b, 0x10, 0x57, 0x66, 0x66, 0xe9, + 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x4a, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x2, 0xb2, + 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x3, 0xe8, + 0x10, 0x0, 0x58, 0x10, 0x0, 0x0, 0x2, 0xcf, + 0x61, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5931 "失" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x40, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x76, 0x6d, 0x86, 0x6a, 0xc1, 0x0, 0x1, 0x90, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0xe0, 0x0, 0x1, 0x80, 0x6, 0x76, 0x66, 0x7e, + 0x86, 0x66, 0x79, 0x40, 0x0, 0x0, 0x6, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x57, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0x10, 0x0, 0xa7, + 0x0, 0x0, 0x0, 0x3a, 0x10, 0x0, 0x0, 0xbc, + 0x30, 0x1, 0x66, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5947 "奇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x76, 0x66, 0x8d, 0x66, 0x68, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x76, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x30, 0x4, 0xda, 0x0, 0x0, + 0x0, 0x46, 0x60, 0x0, 0x0, 0xa, 0x27, 0x10, + 0x18, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x7a, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x66, 0x66, 0xe1, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xa, 0x0, 0x0, 0x50, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + + /* U+5951 "契" */ + 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x24, 0x1, 0x11, 0x16, 0x20, + 0x4, 0x76, 0xc7, 0x65, 0x36, 0xe5, 0x5c, 0x50, + 0x0, 0x56, 0xc7, 0xa3, 0x0, 0xd0, 0xc, 0x20, + 0x0, 0x10, 0xa2, 0x0, 0x4, 0x90, 0xd, 0x0, + 0x4, 0x66, 0xc7, 0x7b, 0xb, 0x10, 0xd, 0x0, + 0x1, 0x10, 0xa2, 0x0, 0x94, 0x33, 0x6b, 0x0, + 0x0, 0x0, 0xb3, 0x37, 0x10, 0x6, 0xe3, 0x0, + 0x0, 0x0, 0x51, 0xc, 0x20, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x8f, 0x40, + 0x1, 0x0, 0x0, 0x87, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x20, 0x0, 0xb8, 0x20, 0x0, + 0x0, 0x38, 0x70, 0x0, 0x0, 0x7, 0xfe, 0x80, + 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, + + /* U+5957 "套" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x76, 0x66, 0xf6, 0x68, 0x76, 0x66, 0x20, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x7c, 0x40, 0x0, + 0x0, 0x8, 0x4e, 0x66, 0x66, 0x95, 0xdc, 0x81, + 0x2, 0x61, 0xe, 0x0, 0x0, 0x80, 0x7, 0x50, + 0x2, 0x0, 0xe, 0x66, 0x66, 0x63, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x7b, 0x10, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x76, 0x6b, 0x79, 0x66, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xc4, 0x2, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x20, 0x0, 0x3c, 0x70, 0x0, + 0x0, 0x1, 0xeb, 0xa8, 0x76, 0x55, 0xd4, 0x0, + 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x11, 0x0, + + /* U+5973 "女" */ + 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0x0, 0x0, 0x2, 0x0, 0x56, 0x66, + 0x6d, 0x86, 0x66, 0x66, 0xdb, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xf1, 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, + 0x6a, 0x0, 0x0, 0x0, 0x0, 0x48, 0x61, 0xe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xc5, 0xdb, + 0x40, 0x0, 0x0, 0x0, 0x2b, 0x70, 0x0, 0x7f, + 0x70, 0x0, 0x5, 0x86, 0x10, 0x0, 0x0, 0x3b, + 0x0, 0x35, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5979 "她" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x2, 0x80, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x32, 0xa0, 0xd0, 0x3, 0x0, + 0x6, 0x7d, 0x6a, 0x82, 0xa0, 0xd5, 0x6f, 0x20, + 0x0, 0x2a, 0x8, 0x68, 0xc6, 0xd0, 0xd, 0x0, + 0x0, 0x57, 0xb, 0x12, 0xa0, 0xd0, 0xe, 0x0, + 0x0, 0x83, 0xd, 0x2, 0xa0, 0xd0, 0xe, 0x0, + 0x0, 0xb0, 0x1b, 0x2, 0xa0, 0xd0, 0x1d, 0x0, + 0x0, 0xc0, 0x57, 0x2, 0xa0, 0xd3, 0xc8, 0x0, + 0x0, 0x59, 0xc3, 0x2, 0xa0, 0xd1, 0x0, 0x30, + 0x0, 0x2, 0xbd, 0x52, 0xa0, 0x70, 0x0, 0x70, + 0x0, 0x9, 0x2, 0xc2, 0xb0, 0x0, 0x0, 0xc0, + 0x1, 0x81, 0x0, 0x0, 0xdb, 0xbb, 0xbc, 0xd2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+597D "好" */ + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x4, 0x66, 0x66, 0x99, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x26, 0x6e, 0x67, 0x80, 0x0, 0x7, 0x20, 0x0, + 0x0, 0x49, 0x6, 0x70, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x75, 0x9, 0x40, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0xa1, 0xc, 0x10, 0x0, 0xc1, 0x3, 0x30, + 0x0, 0xc0, 0xd, 0x36, 0x66, 0xd6, 0x68, 0x70, + 0x3, 0x90, 0x39, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x5, 0x80, 0x85, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x28, 0xf4, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x8, 0x7c, 0xa0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x66, 0x0, 0xa0, 0x0, 0xd1, 0x0, 0x0, + 0x7, 0x30, 0x0, 0x1, 0x7d, 0xe0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+5982 "如" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x0, 0x60, 0xb6, 0x66, 0xc4, 0x6, 0x7c, + 0x86, 0x8c, 0xd, 0x0, 0xb, 0x10, 0x0, 0xc0, + 0x5, 0x80, 0xd0, 0x0, 0xb1, 0x0, 0xc, 0x0, + 0x85, 0xd, 0x0, 0xb, 0x10, 0x3, 0x90, 0xb, + 0x20, 0xd0, 0x0, 0xb1, 0x0, 0x75, 0x0, 0xd0, + 0xd, 0x0, 0xb, 0x10, 0xb, 0x40, 0x3a, 0x0, + 0xd0, 0x0, 0xb1, 0x0, 0x4, 0x9c, 0x80, 0xd, + 0x0, 0xb, 0x10, 0x0, 0x3, 0xbb, 0xc0, 0xd6, + 0x66, 0xd1, 0x0, 0x3, 0xa0, 0x9, 0x2d, 0x0, + 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, 0x70, 0x0, + 0x20, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+59B3 "妳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x49, 0x0, 0x0, 0x10, + 0x5, 0x6e, 0x66, 0xa0, 0xa8, 0x66, 0x66, 0xe2, + 0x1, 0x3b, 0x3, 0xc0, 0xa0, 0x0, 0x5, 0x60, + 0x0, 0x76, 0x6, 0x86, 0x20, 0x18, 0x4, 0x0, + 0x0, 0xb1, 0x9, 0x43, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x33, 0x1c, 0x10, 0x0, + 0x4, 0x80, 0x2c, 0x0, 0x99, 0x1c, 0x28, 0x0, + 0x1, 0x77, 0x87, 0x0, 0xc0, 0x1c, 0x8, 0x90, + 0x0, 0x2, 0xfb, 0x16, 0x30, 0x1c, 0x0, 0xf1, + 0x0, 0x8, 0x67, 0xc3, 0x0, 0x1c, 0x0, 0x30, + 0x0, 0x58, 0x0, 0x20, 0x0, 0x2c, 0x0, 0x0, + 0x5, 0x50, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+59B9 "妹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x22, 0xd2, 0x38, 0x0, + 0x16, 0x7d, 0x68, 0x74, 0x54, 0xd4, 0x44, 0x10, + 0x2, 0x66, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xa2, 0xb, 0x20, 0x0, 0xd0, 0x1, 0x40, + 0x0, 0xc0, 0xd, 0x37, 0x6a, 0xe7, 0x67, 0x80, + 0x2, 0x90, 0x2a, 0x0, 0xd, 0xd6, 0x0, 0x0, + 0x7, 0x50, 0x66, 0x0, 0x48, 0xd6, 0x10, 0x0, + 0x5, 0x83, 0xb1, 0x0, 0xb1, 0xd1, 0xa0, 0x0, + 0x0, 0x8, 0xf3, 0x5, 0x60, 0xd0, 0x84, 0x0, + 0x0, 0x9, 0x4d, 0x29, 0x0, 0xd0, 0x1d, 0x40, + 0x0, 0x64, 0x2, 0x80, 0x0, 0xd0, 0x4, 0xb2, + 0x4, 0x40, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+59BB "妻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x12, 0x0, + 0x6, 0x76, 0x66, 0x6e, 0x66, 0x66, 0xbc, 0x20, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x4, 0x20, + 0x7, 0x66, 0x66, 0x6e, 0x66, 0x6e, 0x69, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x18, 0x66, 0xa8, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, 0x20, + 0x28, 0x66, 0x6c, 0x86, 0x66, 0xb6, 0x69, 0x80, + 0x0, 0x0, 0x2b, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x42, 0x2d, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8a, 0x20, 0x5b, 0xe2, 0x0, + 0x3, 0x56, 0x76, 0x10, 0x0, 0x0, 0x34, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59C9 "姉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2, + 0xc0, 0x0, 0x0, 0xd, 0x0, 0x20, 0x26, 0x9b, + 0x68, 0x68, 0x66, 0xe6, 0x69, 0x50, 0x29, 0x40, + 0x95, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0xc, + 0x13, 0x0, 0xd0, 0x5, 0x0, 0x2b, 0x0, 0xd0, + 0xd6, 0x6e, 0x66, 0xe1, 0x6, 0x60, 0x49, 0xc, + 0x0, 0xd0, 0xd, 0x0, 0xa1, 0x8, 0x50, 0xc0, + 0xd, 0x0, 0xd0, 0x7, 0x72, 0xd0, 0xc, 0x0, + 0xd0, 0xd, 0x0, 0x0, 0xae, 0x50, 0xc0, 0xd, + 0x0, 0xd0, 0x0, 0xb, 0x3c, 0x6d, 0x0, 0xd3, + 0x9d, 0x0, 0x9, 0x20, 0x3, 0x20, 0xd, 0x2, + 0x20, 0x6, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+59CB "始" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x3, 0xe1, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc, 0x10, 0x20, 0x0, + 0x5, 0x6e, 0x66, 0xa0, 0x56, 0x0, 0x76, 0x0, + 0x2, 0x49, 0x4, 0xa0, 0xa0, 0x0, 0xc, 0x60, + 0x0, 0x85, 0x7, 0x7a, 0xb9, 0x87, 0x68, 0xe0, + 0x0, 0xc0, 0xa, 0x34, 0x61, 0x0, 0x0, 0x60, + 0x1, 0xb0, 0xd, 0x0, 0x20, 0x0, 0x3, 0x0, + 0x5, 0x70, 0x2b, 0x0, 0xe6, 0x66, 0x6e, 0x30, + 0x4, 0x84, 0x86, 0x0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x8, 0x6b, 0xa0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x47, 0x0, 0x80, 0xe6, 0x66, 0x6e, 0x0, + 0x4, 0x50, 0x0, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, + + /* U+59D0 "姐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd6, 0x66, 0x6e, 0x10, + 0x0, 0xc, 0x20, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x16, 0x6e, 0x66, 0xa1, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x49, 0x2, 0xc0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x85, 0x6, 0x80, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0xc0, 0x9, 0x40, 0xe0, 0x0, 0xd, 0x0, + 0x1, 0xb0, 0xd, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x6, 0x50, 0x2b, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x5, 0x84, 0x85, 0x0, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x9, 0x47, 0xd0, 0xe0, 0x0, 0xd, 0x0, + 0x0, 0x66, 0x0, 0x60, 0xe0, 0x0, 0xd, 0x20, + 0x5, 0x40, 0x0, 0x76, 0xa6, 0x66, 0x6a, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59D4 "委" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x7c, 0x70, 0x0, + 0x0, 0x3, 0x56, 0x7a, 0xd5, 0x43, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x2, 0x30, + 0x4, 0x76, 0x66, 0x7b, 0xd8, 0x66, 0x69, 0xa0, + 0x0, 0x0, 0x2, 0xc5, 0xb4, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x22, 0xb0, 0x4c, 0x61, 0x0, + 0x0, 0x18, 0x60, 0x5, 0x90, 0x1, 0xaf, 0xc3, + 0x4, 0x40, 0x0, 0x7c, 0x0, 0x0, 0x2, 0x40, + 0x5, 0x66, 0x66, 0xe7, 0x66, 0x66, 0x6b, 0xd1, + 0x1, 0x0, 0xb, 0x40, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x30, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xcf, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x82, 0x8e, 0xb2, 0x0, + 0x0, 0x25, 0x78, 0x61, 0x0, 0x0, 0x8e, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5A18 "娘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc1, 0x0, 0x1, 0x91, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x0, 0x69, 0x1, 0x0, + 0x0, 0x8, 0x60, 0x0, 0xc6, 0x77, 0x6e, 0x0, + 0x4, 0x5d, 0x75, 0x91, 0xd0, 0x0, 0xd, 0x0, + 0x1, 0x1d, 0x1, 0xc0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x39, 0x4, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x75, 0x7, 0x50, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xb1, 0xa, 0x20, 0xd6, 0x86, 0x6d, 0x0, + 0x0, 0xc0, 0xc, 0x0, 0xd0, 0x80, 0x4, 0x80, + 0x0, 0x87, 0x69, 0x0, 0xd0, 0x55, 0x3a, 0x30, + 0x0, 0x2, 0xeb, 0x10, 0xd0, 0xc, 0x60, 0x0, + 0x0, 0x4, 0x97, 0xc0, 0xd0, 0x26, 0xb1, 0x0, + 0x0, 0x2a, 0x0, 0x40, 0xe9, 0x50, 0x7e, 0x71, + 0x2, 0x80, 0x0, 0x0, 0xd4, 0x0, 0x4, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5A5A "婚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x0, 0x27, 0xd9, 0x0, + 0x0, 0xd, 0x20, 0xb, 0x56, 0xe2, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x0, + 0x5, 0x7c, 0x69, 0x4c, 0x66, 0xd7, 0x67, 0xa0, + 0x0, 0x76, 0xa, 0x3c, 0x0, 0x59, 0x0, 0x0, + 0x0, 0xb2, 0xd, 0xc, 0x2, 0x2c, 0x40, 0x50, + 0x0, 0xc0, 0xc, 0xe, 0xa5, 0x2, 0xd7, 0x90, + 0x3, 0x90, 0x39, 0x5, 0x0, 0x0, 0x8, 0xd0, + 0x7, 0x40, 0x85, 0x9, 0x66, 0x66, 0x6d, 0x0, + 0x4, 0x84, 0xc0, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x8, 0xe4, 0xa, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xb, 0x2d, 0x3a, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x82, 0x2, 0x3a, 0x30, 0x0, 0xd, 0x0, + 0x6, 0x20, 0x0, 0xa, 0x76, 0x66, 0x6d, 0x0, + 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, + + /* U+5A66 "婦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x5, 0x66, 0x66, 0x6a, 0x0, + 0x0, 0xe, 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x3a, 0x0, 0x2, 0x86, 0x66, 0x6d, 0x0, + 0x14, 0x89, 0x48, 0x10, 0x0, 0x0, 0xd, 0x0, + 0x4, 0xb4, 0x2d, 0x26, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xc0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x30, + 0x2, 0xa0, 0x3a, 0xa6, 0x66, 0xd6, 0x68, 0xd1, + 0x6, 0x60, 0x68, 0xc0, 0x0, 0xd0, 0x4, 0x0, + 0xa, 0x10, 0xb2, 0xa, 0x66, 0xe6, 0x6c, 0x0, + 0x6, 0x73, 0xc0, 0xc, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xb, 0xd3, 0xc, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x1b, 0x3e, 0x2c, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x91, 0x2, 0x1c, 0x0, 0xd3, 0xb8, 0x0, + 0x6, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+5A92 "媒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x2, 0xa0, 0x0, 0xa3, 0x0, + 0x0, 0xa, 0x40, 0x1, 0xb0, 0x0, 0xd0, 0x10, + 0x0, 0xd, 0x0, 0x66, 0xd6, 0x66, 0xe7, 0xb1, + 0x3, 0x4d, 0x46, 0x51, 0xb0, 0x0, 0xd0, 0x0, + 0x3, 0x69, 0x28, 0x71, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0x84, 0xa, 0x31, 0xb0, 0x0, 0xd0, 0x0, + 0x0, 0xb0, 0xc, 0x2, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0xb0, 0xc, 0x1, 0x70, 0xa2, 0x40, 0x0, + 0x4, 0x70, 0x48, 0x0, 0x0, 0xd0, 0x4, 0x70, + 0x3, 0x84, 0x93, 0x67, 0x6d, 0xf9, 0x66, 0x51, + 0x0, 0x7, 0xf5, 0x0, 0x5a, 0xd7, 0x10, 0x0, + 0x0, 0xa, 0x4c, 0x42, 0xb0, 0xd1, 0xb1, 0x0, + 0x0, 0x56, 0x1, 0x5a, 0x0, 0xd0, 0x3e, 0x72, + 0x4, 0x60, 0x4, 0x60, 0x0, 0xe0, 0x3, 0x81, + 0x2, 0x0, 0x1, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+5ABD "媽" */ + 0x0, 0x8, 0x40, 0x3, 0x0, 0x0, 0x7, 0x10, + 0x0, 0xd, 0x20, 0xd, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x1d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0x0, + 0x16, 0x8b, 0x68, 0x4d, 0x55, 0xd5, 0x55, 0x0, + 0x2, 0x95, 0xa, 0x3d, 0x0, 0xd0, 0x1, 0x0, + 0x0, 0xc1, 0xc, 0xd, 0x66, 0xe6, 0x6b, 0x20, + 0x0, 0xc0, 0xc, 0xd, 0x0, 0xd0, 0x0, 0x0, + 0x4, 0x80, 0x39, 0xd, 0x0, 0xd0, 0x0, 0x50, + 0x8, 0x40, 0x75, 0xc, 0x66, 0x66, 0x66, 0xf1, + 0xa, 0x50, 0xc1, 0x0, 0x0, 0x20, 0x60, 0xe0, + 0x0, 0x3a, 0xe3, 0x4, 0x51, 0x94, 0x77, 0xd0, + 0x0, 0xa, 0x6d, 0x38, 0x38, 0x5b, 0x3b, 0xb0, + 0x0, 0x65, 0x1, 0xa7, 0x27, 0x2, 0x5, 0x90, + 0x4, 0x40, 0x0, 0x30, 0x0, 0x37, 0xae, 0x50, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, + + /* U+5ACC "嫌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0x27, 0x0, 0xb1, 0x0, 0x0, + 0x59, 0x0, 0x0, 0xb3, 0x37, 0x1, 0x0, 0x8, + 0x50, 0x27, 0x69, 0x6a, 0x68, 0xc1, 0x25, 0xc6, + 0x59, 0x0, 0x92, 0xb1, 0x0, 0x0, 0x2d, 0x13, + 0xa2, 0x6c, 0x7c, 0x6a, 0x30, 0x1, 0xb0, 0x57, + 0x0, 0x92, 0xb1, 0xb1, 0x0, 0x47, 0x8, 0x45, + 0x6b, 0x7c, 0x6c, 0xb5, 0x7, 0x30, 0xb0, 0x10, + 0x92, 0xb1, 0xb1, 0x0, 0xb0, 0xb, 0x3, 0x6c, + 0x7c, 0x6c, 0x10, 0x6, 0x88, 0x70, 0x3, 0xf2, + 0xb6, 0x50, 0x0, 0x0, 0xdc, 0x20, 0xbb, 0x2b, + 0x45, 0x0, 0x0, 0x65, 0x37, 0x74, 0x92, 0xb1, + 0xa2, 0x0, 0x28, 0x0, 0x54, 0x9, 0x2b, 0x12, + 0xe6, 0x16, 0x0, 0x33, 0x0, 0x92, 0xb1, 0x3, + 0x1, 0x0, 0x0, 0x0, 0x4, 0x3, 0x0, 0x0, + + /* U+5B09 "嬉" */ + 0x0, 0xb, 0x10, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, + 0x0, 0x58, 0x0, 0x57, 0x66, 0xe6, 0x66, 0x50, + 0x13, 0x97, 0x38, 0x14, 0x66, 0xe6, 0x8b, 0x0, + 0x15, 0xc4, 0x3d, 0x3, 0x10, 0x0, 0x3, 0x0, + 0x0, 0xc0, 0x2a, 0xb, 0x66, 0x66, 0x7d, 0x0, + 0x3, 0x90, 0x57, 0xb, 0x10, 0x0, 0x2b, 0x0, + 0x7, 0x50, 0x93, 0x8, 0x96, 0x66, 0x96, 0x0, + 0xb, 0x10, 0xc0, 0x0, 0x68, 0x5, 0x70, 0x10, + 0xb, 0x53, 0xa1, 0x75, 0x68, 0x57, 0x56, 0xa1, + 0x0, 0x2d, 0xc2, 0x7, 0x66, 0x66, 0x6a, 0x10, + 0x0, 0x3a, 0x3d, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xa1, 0x1, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x8, 0x20, 0x0, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x21, 0x0, 0x0, 0x5, 0x0, 0x0, 0x2, 0x0, + + /* U+5B50 "子" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x68, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0x1, 0x30, + 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xc1, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x14, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B57 "字" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x80, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x19, 0x10, + 0x1, 0xc2, 0x56, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0xa9, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd1, 0x0, 0x0, 0x10, + 0x6, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xae, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + + /* U+5B58 "存" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xa, 0x30, + 0x4, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x56, 0x66, 0x66, 0x99, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x4, 0xb3, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x0, 0x1b, 0xe0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xa1, 0xe0, 0x0, 0x0, 0xe0, 0x2, 0x80, + 0x7, 0x10, 0xe0, 0x76, 0x66, 0xe6, 0x66, 0x61, + 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x1, 0x8d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5B63 "季" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, 0x80, 0x0, + 0x0, 0x3, 0x45, 0x79, 0xd8, 0x64, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x20, + 0x6, 0x66, 0x66, 0x68, 0xd6, 0x66, 0x6a, 0xc1, + 0x0, 0x0, 0x1, 0xc6, 0xb6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x42, 0xb0, 0x79, 0x20, 0x0, + 0x0, 0x7, 0x91, 0x2, 0xb0, 0x4, 0xdd, 0xa3, + 0x5, 0x62, 0x56, 0x66, 0x66, 0x6c, 0x24, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x95, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd2, 0x0, 0x3, 0x20, + 0x6, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x6b, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B66 "学" */ + 0x0, 0x30, 0x3, 0x40, 0x0, 0x67, 0x0, 0x0, + 0x3, 0xc1, 0xd, 0x40, 0xc, 0x50, 0x0, 0x0, + 0xb, 0x80, 0x98, 0x3, 0x90, 0x0, 0x0, 0x40, + 0x43, 0x2, 0x10, 0x80, 0x0, 0x40, 0xa, 0x66, + 0x66, 0x66, 0x66, 0x66, 0xae, 0x11, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0x9, 0x0, 0x37, 0x18, 0x66, + 0x66, 0x68, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x40, 0x0, 0x20, 0x4, 0x66, 0x66, 0x66, 0xe6, + 0x66, 0x6d, 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, + + /* U+5B69 "孩" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x3, 0x66, 0x6c, 0x70, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x39, 0x56, 0x66, 0x97, 0x69, 0xc0, + 0x0, 0x1, 0x60, 0x0, 0x1d, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x86, 0x1, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x22, 0x70, 0x8, 0xb0, 0x0, + 0x0, 0xd, 0x57, 0x1c, 0x97, 0x6e, 0x10, 0x0, + 0x1, 0x7f, 0x40, 0x3, 0x0, 0xb4, 0x18, 0x0, + 0x3f, 0x7d, 0x0, 0x0, 0x8, 0x60, 0x99, 0x0, + 0x2, 0xd, 0x0, 0x0, 0x86, 0x6, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0x38, 0x20, 0x4e, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x30, 0x6, 0xa2, 0xb2, 0x0, + 0x1, 0xd, 0x0, 0x2, 0x96, 0x0, 0x3e, 0x20, + 0x2, 0xbc, 0x4, 0x75, 0x0, 0x0, 0x9, 0x50, + 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B6B "孫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0x0, + 0x5, 0x66, 0x6d, 0x55, 0x59, 0xb6, 0x42, 0x0, + 0x0, 0x0, 0x39, 0x10, 0xa, 0x80, 0x0, 0x0, + 0x0, 0x1, 0x70, 0x0, 0x58, 0x1, 0x80, 0x0, + 0x0, 0xe, 0x10, 0x7, 0x93, 0x4c, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x74, 0xa5, 0x0, 0x0, + 0x0, 0xd, 0x25, 0x0, 0x9, 0x40, 0x50, 0x0, + 0x0, 0x5e, 0x60, 0x4, 0x91, 0x0, 0x4a, 0x0, + 0x3e, 0x7d, 0x0, 0x2f, 0xa8, 0xe5, 0x49, 0x80, + 0x2, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x30, + 0x0, 0xd, 0x0, 0x7, 0x90, 0xd0, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0xd0, 0x2c, 0x20, + 0x1, 0xd, 0x1, 0x81, 0x0, 0xd0, 0x6, 0xd0, + 0x3, 0xdb, 0x4, 0x1, 0x8f, 0xb0, 0x0, 0x70, + 0x0, 0x20, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+5B78 "學" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x39, 0x31, 0xb2, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x30, 0xa, 0xb2, 0x76, 0xe2, 0x0, + 0x0, 0xc, 0x74, 0x32, 0x62, 0x66, 0xd0, 0x0, + 0x0, 0xb, 0x1, 0x21, 0xa2, 0x0, 0xc0, 0x0, + 0x0, 0xa, 0x77, 0xc, 0xa0, 0x66, 0xb0, 0x0, + 0x3, 0x9, 0x20, 0x52, 0x90, 0x1, 0xb0, 0x20, + 0x8, 0x77, 0x66, 0x66, 0x66, 0x66, 0x79, 0xd0, + 0xe, 0x10, 0x56, 0x66, 0x66, 0xa2, 0x8, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x1a, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x5, 0x10, + 0x6, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbf, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + + /* U+5B83 "它" */ + 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x2, + 0x96, 0x66, 0x67, 0xb6, 0x66, 0x6c, 0x10, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa1, 0x2f, 0x30, + 0x20, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0xc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x7, 0xc7, 0x20, 0x0, 0x0, 0x0, 0xc3, 0x78, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x8, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0xc3, 0x0, 0x0, 0x6, 0xdc, 0xcc, 0xcc, 0xcd, + 0x50, + + /* U+5B85 "宅" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x66, 0x67, 0xa6, 0x66, 0x6a, 0x60, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x30, 0xb, 0x30, + 0x0, 0xc2, 0x0, 0x2, 0x6b, 0xe8, 0x22, 0x0, + 0x0, 0x24, 0x56, 0x9d, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x7d, 0x20, + 0x0, 0x0, 0x0, 0x4d, 0x66, 0x66, 0x52, 0x0, + 0x6, 0x66, 0x65, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xcc, 0xcc, 0xcd, 0xa0, + + /* U+5B87 "宇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x66, 0x66, 0xa6, 0x66, 0x6b, 0x40, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x3, 0x51, 0x0, 0x0, 0x26, 0x66, + 0x68, 0x66, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x32, 0x4, 0x76, 0x66, 0x67, 0xd6, + 0x66, 0x6b, 0xa0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x15, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5B88 "守" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xa0, 0x0, 0x0, 0x0, 0x5, + 0x0, 0x0, 0x35, 0x0, 0x1, 0x70, 0x0, 0xb6, + 0x66, 0x66, 0x66, 0x66, 0xad, 0x20, 0x3f, 0x0, + 0x0, 0x0, 0xb3, 0x8, 0x0, 0x1, 0x10, 0x0, + 0x0, 0xd, 0x10, 0x1, 0x0, 0x56, 0x66, 0x66, + 0x66, 0xe6, 0x68, 0xe3, 0x1, 0x11, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + + /* U+5B89 "安" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x66, 0xa6, 0x66, 0x6c, 0x30, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0x0, 0xa2, 0x0, 0x77, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0xe6, 0x66, 0x66, 0x6e, 0x90, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x78, 0x8c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xda, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8a, 0x10, 0x29, 0xe6, 0x0, + 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x4e, 0x10, + 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B8C "完" */ + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x66, 0x67, 0x96, 0x66, 0x69, 0x70, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x1, 0x90, 0x0, 0x0, 0x0, 0x24, 0x3, 0x0, + 0x0, 0x3, 0x76, 0x66, 0x66, 0x66, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x56, 0x66, 0x66, 0x66, 0x66, 0x9e, 0x20, + 0x0, 0x10, 0x4, 0xa0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0xd, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x1d, 0x0, 0xd, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0x0, 0xc0, + 0x0, 0x49, 0x30, 0x0, 0x9, 0xdc, 0xcd, 0xb1, + 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B98 "官" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x66, 0x66, 0x96, 0x66, 0x69, 0xa0, 0x2d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa5, 0x7, 0x70, 0x96, + 0x66, 0x66, 0x6b, 0x23, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, + 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8, 0x50, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xb5, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+5B99 "宙" */ + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x84, 0x44, 0x47, 0x64, 0x44, 0x49, 0x0, 0x3a, + 0x22, 0x22, 0x62, 0x22, 0x25, 0xb2, 0xa, 0x60, + 0x0, 0xd, 0x30, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6b, 0x70, 0x0, 0x0, 0xe0, 0x0, + 0xd0, 0x0, 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, + 0x0, 0xa, 0x40, 0x0, 0x0, 0xe6, 0x66, 0xe6, + 0x66, 0xc4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, + 0xa, 0x40, 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x0, + 0xa4, 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0xa, + 0x40, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc4, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x4, 0x10, + 0x0, + + /* U+5B9A "定" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0x96, 0x66, 0x79, 0x66, 0x66, 0xb5, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x40, 0x1c, 0x10, + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x36, 0x66, + 0x66, 0x66, 0x66, 0xd9, 0x0, 0x0, 0x10, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x3, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x40, 0x3a, + 0x0, 0x15, 0x0, 0x0, 0x1, 0xe0, 0x3, 0xc6, + 0x67, 0x81, 0x0, 0x0, 0x6b, 0x30, 0x3a, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x16, 0x43, 0xa0, 0x0, + 0x0, 0x0, 0x5, 0x70, 0x7, 0xcc, 0x42, 0x11, + 0x23, 0x3, 0x60, 0x0, 0x1, 0x7b, 0xde, 0xff, + 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5B9E "实" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x66, + 0x66, 0x66, 0xb6, 0x66, 0x69, 0x50, 0xd, 0x0, + 0x0, 0x2, 0x0, 0x0, 0xc7, 0x7, 0xc0, 0x1a, + 0x40, 0x7c, 0x0, 0x42, 0x0, 0x0, 0x0, 0x3f, + 0x8, 0x80, 0x0, 0x0, 0x0, 0x6, 0x20, 0x50, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x40, 0xa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, 0xc2, + 0x0, 0x4, 0x20, 0x67, 0x66, 0x66, 0x6e, 0x66, + 0x66, 0xa9, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x8a, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xc3, 0x0, 0x2c, 0xe3, + 0x0, 0x1, 0x5a, 0x70, 0x0, 0x0, 0x9, 0xb0, + 0x4, 0x51, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+5B9F "実" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0xa, + 0x66, 0x66, 0x79, 0x66, 0x66, 0xc2, 0x4, 0xa0, + 0x0, 0x4, 0x0, 0x0, 0x49, 0x20, 0xb5, 0x0, + 0x0, 0xb4, 0x0, 0x4, 0x0, 0x0, 0x36, 0x66, + 0x6d, 0x76, 0x6b, 0xa0, 0x0, 0x0, 0x10, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, 0x6d, + 0x76, 0x6e, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0x1, 0x30, 0x4, 0x76, 0x66, 0x6e, 0x86, + 0x66, 0x9b, 0x10, 0x0, 0x0, 0x2, 0xd5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, 0x2c, 0x61, + 0x0, 0x0, 0x6, 0xa4, 0x0, 0x0, 0x1b, 0xfb, + 0x30, 0x35, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, + + /* U+5BA2 "客" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x7, 0x70, 0x0, 0x2, 0x0, + 0x1, 0xb6, 0x67, 0x66, 0x66, 0x66, 0x6e, 0x70, + 0xa, 0x70, 0x9, 0xa0, 0x0, 0x0, 0x57, 0x0, + 0x5, 0x0, 0x3f, 0x76, 0x66, 0xd7, 0x20, 0x0, + 0x0, 0x1, 0xb2, 0x60, 0x8, 0xb0, 0x0, 0x0, + 0x0, 0x9, 0x10, 0x38, 0x7a, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0xb, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xb4, 0x8, 0xc7, 0x30, 0x0, + 0x0, 0x4, 0xa6, 0x0, 0x0, 0x1c, 0xef, 0xa1, + 0x15, 0x63, 0xd6, 0x66, 0x66, 0x6e, 0x13, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+5BA4 "室" */ + 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x76, 0x66, 0x6b, 0x10, + 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, + 0x6, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x50, 0x0, + 0x0, 0x1, 0x0, 0xb5, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x20, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x8, 0xd6, 0x66, 0x66, 0x6e, 0x80, 0x0, + 0x0, 0x6, 0x95, 0x37, 0x20, 0x4, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x60, 0x1, 0x0, 0x0, + 0x0, 0x7, 0x66, 0x6c, 0x86, 0x6c, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x6e, 0x90, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5BB3 "害" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x57, 0x0, 0x0, 0x40, 0xa, 0x66, 0x66, + 0x67, 0x66, 0x66, 0xe4, 0x5b, 0x0, 0x0, 0x1e, + 0x0, 0x25, 0x10, 0x0, 0x56, 0x66, 0x6d, 0x66, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x31, + 0x0, 0x0, 0x56, 0x66, 0x6d, 0x66, 0x75, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x82, 0x57, + 0x66, 0x66, 0x7d, 0x66, 0x66, 0x64, 0x0, 0x3, + 0x0, 0x29, 0x0, 0x40, 0x0, 0x0, 0xe, 0x66, + 0x66, 0x66, 0xc5, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x51, 0x0, + + /* U+5BB6 "家" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x4, 0x90, 0x0, 0x2, 0x10, + 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x90, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0x2, 0x16, 0x0, + 0x0, 0x4, 0x66, 0x7a, 0x66, 0x6a, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xd4, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x5a, 0x29, 0x10, 0x3c, 0x70, 0x0, + 0x0, 0x47, 0x40, 0x4b, 0xb6, 0x90, 0x0, 0x0, + 0x3, 0x10, 0x6, 0x90, 0xb4, 0x70, 0x0, 0x0, + 0x0, 0x2, 0x95, 0x7, 0xe8, 0x36, 0x0, 0x0, + 0x2, 0x65, 0x0, 0x8a, 0x3b, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x2a, 0x50, 0x3b, 0x1, 0xd9, 0x30, + 0x0, 0x17, 0x70, 0x0, 0x59, 0x0, 0x1a, 0x50, + 0x5, 0x40, 0x0, 0x6c, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+5BB9 "容" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1, 0x0, 0x86, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xb0, 0x1e, 0x10, + 0x82, 0x0, 0x40, 0x0, 0x81, 0x1, 0x40, 0x6c, + 0x21, 0x71, 0x9a, 0x20, 0x0, 0x0, 0x59, 0x0, + 0xad, 0x0, 0x6f, 0x20, 0x0, 0x54, 0x0, 0x6b, + 0x17, 0x0, 0x63, 0x0, 0x0, 0x0, 0x6c, 0x0, + 0x3a, 0x10, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x2c, 0x94, 0x0, 0x1, 0x88, 0xb6, 0x66, 0x66, + 0xe9, 0xed, 0x24, 0x50, 0x2b, 0x0, 0x0, 0xe, + 0x0, 0x10, 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x3, 0xd6, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x13, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5BBF "宿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xc0, 0x0, 0x1, 0x0, 0xb, + 0x66, 0x66, 0x66, 0x66, 0x67, 0xf2, 0x6, 0xa0, + 0xb5, 0x0, 0x0, 0x0, 0x63, 0x0, 0x62, 0x2d, + 0x26, 0x66, 0x66, 0x66, 0xd4, 0x0, 0x9, 0x40, + 0x10, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe3, 0x0, + 0x0, 0x90, 0x1, 0x0, 0x0, 0x9d, 0x10, 0xd, + 0x68, 0x66, 0xe2, 0x0, 0x53, 0xc1, 0x0, 0xe0, + 0x0, 0xe, 0x0, 0x23, 0xc, 0x10, 0xe, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe6, 0x66, + 0x6e, 0x0, 0x0, 0xc, 0x10, 0xe, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xc1, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x0, 0xd, 0x10, 0xe, 0x66, 0x66, 0xf0, + 0x0, 0x0, 0x60, 0x0, 0x50, 0x0, 0x5, 0x0, + + /* U+5BC4 "寄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x6, 0x10, 0x0, 0x5, 0x0, 0xb, + 0x66, 0x66, 0x96, 0x66, 0x68, 0xd1, 0x8, 0x80, + 0x0, 0x3d, 0x0, 0x3, 0x40, 0x0, 0x0, 0x66, + 0x6d, 0x86, 0x66, 0x95, 0x0, 0x0, 0x0, 0x8, + 0x61, 0x78, 0x10, 0x0, 0x0, 0x0, 0x57, 0x30, + 0x0, 0x5b, 0x0, 0x40, 0x7, 0x76, 0x66, 0x66, + 0x66, 0x69, 0x6b, 0x70, 0x0, 0x30, 0x0, 0x30, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x66, 0x6d, 0x70, + 0xe, 0x0, 0x0, 0x0, 0xc1, 0x0, 0xb2, 0x0, + 0xe0, 0x0, 0x0, 0xc, 0x66, 0x6d, 0x40, 0xe, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x63, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, + + /* U+5BC6 "密" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0xa, 0x40, 0x0, 0x3, 0x10, 0xb, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xd8, 0x8, 0x90, + 0x0, 0x48, 0x0, 0x93, 0x25, 0x0, 0x10, 0x0, + 0xb2, 0xd0, 0x8c, 0x30, 0x0, 0x0, 0x8, 0xd, + 0x1, 0x99, 0x0, 0x94, 0x0, 0x9, 0x90, 0xd2, + 0xb5, 0x4, 0x1, 0xf2, 0x0, 0x60, 0x2e, 0x91, + 0x0, 0x84, 0x6, 0x0, 0x25, 0x77, 0x8b, 0xbb, + 0xba, 0x40, 0x0, 0x1, 0x0, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0xc0, 0x0, + 0x2c, 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0x2b, + 0x0, 0x0, 0x1b, 0x66, 0x67, 0x66, 0x67, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+5BCC "富" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x84, 0x0, 0x0, 0x30, 0xb, 0x66, 0x66, + 0x66, 0x66, 0x68, 0xe1, 0x79, 0x0, 0x0, 0x0, + 0x5, 0x46, 0x10, 0x0, 0x27, 0x66, 0x66, 0x66, + 0x50, 0x0, 0x0, 0x7, 0x66, 0x66, 0x6b, 0x40, + 0x0, 0x0, 0x9, 0x30, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x9, 0x76, 0x66, 0x6d, 0x20, 0x0, 0x0, + 0x23, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xd6, + 0x66, 0xc6, 0x66, 0xb7, 0x0, 0x0, 0xd1, 0x0, + 0xd0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x66, 0xe6, + 0x66, 0xb4, 0x0, 0x0, 0xd1, 0x0, 0xd0, 0x0, + 0x95, 0x0, 0x0, 0xd6, 0x66, 0x96, 0x66, 0xb5, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+5BD2 "寒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x8, 0x30, 0x0, 0x6, 0x10, 0x68, + 0x66, 0x86, 0x66, 0x86, 0x66, 0xd5, 0x1d, 0x10, + 0xd, 0x10, 0xe, 0x13, 0x22, 0x0, 0x5, 0x66, + 0xe6, 0x66, 0xe6, 0x95, 0x0, 0x0, 0x0, 0xd, + 0x0, 0xd, 0x4, 0x10, 0x0, 0x3, 0x66, 0xe6, + 0x66, 0xe6, 0x75, 0x0, 0x0, 0x0, 0xd, 0x0, + 0xd, 0x0, 0x1a, 0x11, 0x66, 0x66, 0xf6, 0x66, + 0xa6, 0x66, 0x74, 0x0, 0x0, 0x88, 0x16, 0x3, + 0x60, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x3e, 0x17, + 0xa2, 0x0, 0x0, 0x67, 0x2, 0x0, 0x40, 0x5, + 0xed, 0x41, 0x52, 0x0, 0x26, 0xa9, 0x40, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, + + /* U+5BDD "寝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x1, 0x90, 0x0, 0x2, 0x0, + 0x0, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x6d, 0x50, + 0x2, 0xd0, 0x50, 0x0, 0x0, 0x0, 0x53, 0x0, + 0x0, 0x10, 0xe1, 0x17, 0x66, 0x66, 0xe1, 0x0, + 0x2, 0x70, 0xd0, 0x4, 0x65, 0x55, 0xd0, 0x0, + 0x0, 0xc2, 0xd0, 0x16, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x50, 0xd0, 0x22, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x6, 0xd0, 0xb6, 0x66, 0x66, 0x6e, 0x30, + 0x5, 0xb2, 0xd7, 0x75, 0x66, 0x68, 0x82, 0x0, + 0x9, 0x10, 0xd0, 0x0, 0x50, 0xc, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x45, 0x95, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x5, 0x82, 0x3b, 0xca, 0x70, + 0x0, 0x0, 0x62, 0x41, 0x0, 0x0, 0x14, 0x10, + + /* U+5BDF "察" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x5, + 0x66, 0x66, 0x6b, 0x66, 0x66, 0x6c, 0x0, 0xc0, + 0x46, 0x0, 0x0, 0x0, 0x8, 0x50, 0x36, 0xb, + 0x70, 0x31, 0x30, 0x0, 0x70, 0x0, 0x5, 0xc6, + 0x6e, 0x58, 0x66, 0x8e, 0x30, 0x1, 0xb8, 0x46, + 0x90, 0x34, 0xa, 0x10, 0x0, 0x95, 0x19, 0xc1, + 0x0, 0x87, 0x10, 0x0, 0x40, 0xa2, 0xb9, 0x66, + 0x98, 0xb6, 0x0, 0x0, 0x4, 0xa2, 0x0, 0x0, + 0x1, 0xae, 0xa2, 0x4, 0xa6, 0x66, 0x67, 0x66, + 0xaa, 0x44, 0x4, 0x10, 0x4, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xc2, 0x2b, 0x6, 0x70, + 0x0, 0x0, 0x8, 0x70, 0x2, 0xb0, 0x4, 0xe3, + 0x0, 0x27, 0x20, 0x28, 0xd9, 0x0, 0x5, 0x90, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+5BE6 "實" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xa0, 0x9, 0x56, + 0x66, 0x66, 0x66, 0x69, 0x70, 0x0, 0x0, 0xa1, + 0x0, 0xb0, 0x4, 0x93, 0x90, 0x47, 0x6d, 0x66, + 0x8b, 0x66, 0xa9, 0x66, 0x10, 0x1, 0xc6, 0x67, + 0x86, 0x6a, 0x40, 0x0, 0x0, 0xa, 0x55, 0x55, + 0x55, 0x6a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, + 0x67, 0xa0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x68, + 0xa0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x7a, + 0x0, 0x0, 0x0, 0x23, 0xc1, 0x5, 0x75, 0x10, + 0x0, 0x0, 0x38, 0x82, 0x0, 0x1, 0x9e, 0x20, + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + + /* U+5BEB "寫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0xa, + 0x66, 0x66, 0x67, 0x66, 0x66, 0xd4, 0x8, 0x70, + 0x3, 0xb1, 0x0, 0x5, 0x28, 0x0, 0x61, 0xb5, + 0x41, 0x6, 0x76, 0xe3, 0x0, 0x0, 0xb, 0x10, + 0x50, 0x0, 0xd, 0x0, 0x0, 0x0, 0xb6, 0x65, + 0x3, 0x76, 0xe0, 0x0, 0x0, 0xc, 0x68, 0x76, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x43, 0xc0, 0x0, + 0x0, 0x41, 0x10, 0x0, 0x2, 0xb7, 0x66, 0x66, + 0x66, 0xb9, 0x0, 0x6, 0x71, 0x20, 0x14, 0x9, + 0x19, 0x30, 0x2, 0x14, 0x33, 0x80, 0xc1, 0x58, + 0xb1, 0x0, 0x1, 0xe1, 0xc, 0x5, 0x0, 0x1d, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x5, 0xab, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, + + /* U+5BFA "寺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x30, 0x0, + 0x0, 0x76, 0x66, 0x6e, 0x66, 0x67, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x5, 0x10, + 0x28, 0x66, 0x66, 0x6a, 0x66, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x4, 0x0, + 0x6, 0x76, 0x66, 0x66, 0x66, 0xf6, 0x7a, 0x30, + 0x0, 0x0, 0x72, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+5BFE "対" */ + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0x20, 0x71, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x76, 0x6e, 0x73, 0x56, 0x66, 0xe6, 0xd2, + 0x0, 0x0, 0xe, 0x0, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x40, 0x2b, 0x1, 0x40, 0x0, 0xe0, 0x0, + 0x0, 0x28, 0x77, 0x0, 0xa5, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0xf4, 0x0, 0x4e, 0x0, 0xe0, 0x0, + 0x0, 0x3, 0xce, 0x20, 0x9, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x17, 0xd0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x84, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x40, 0x0, 0x0, 0x4, 0x33, 0xd0, 0x0, + 0x12, 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5C04 "射" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0xc0, 0x0, + 0x0, 0x20, 0x80, 0x30, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xd6, 0x66, 0xe2, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x20, + 0x0, 0xc6, 0x66, 0xe3, 0x76, 0x67, 0xd8, 0xb1, + 0x0, 0xc1, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0xc6, 0x66, 0xe0, 0x40, 0x2, 0xb0, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0x3b, 0x2, 0xb0, 0x0, + 0x26, 0xd6, 0x66, 0xe0, 0xd, 0x42, 0xb0, 0x0, + 0x2, 0x0, 0xb4, 0xe0, 0x6, 0x2, 0xb0, 0x0, + 0x0, 0x5, 0x90, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0x0, 0x2, 0xb0, 0x0, + 0x1, 0x91, 0x10, 0xe0, 0x2, 0x3, 0xb0, 0x0, + 0x26, 0x0, 0x4d, 0xc0, 0x3, 0xaf, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5C07 "將" */ + 0x0, 0x0, 0xa, 0x10, 0x3, 0x80, 0x0, 0x0, + 0x2, 0x80, 0xd, 0x0, 0xb, 0x60, 0x3, 0x10, + 0x2, 0xa0, 0xd, 0x0, 0x6b, 0x66, 0x6e, 0xa0, + 0x2, 0xa0, 0xd, 0x3, 0x88, 0x70, 0x6b, 0x0, + 0x4, 0xc6, 0x6d, 0x36, 0x91, 0xb4, 0xb0, 0x0, + 0x0, 0x30, 0xd, 0x0, 0x74, 0x5a, 0x10, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x19, 0x70, 0xc2, 0x0, + 0x4, 0x66, 0x6d, 0x36, 0x61, 0x0, 0xd0, 0x30, + 0x1, 0x69, 0xd, 0x67, 0x66, 0x66, 0xe6, 0xa2, + 0x0, 0x59, 0xd, 0x3, 0x30, 0x0, 0xd0, 0x0, + 0x0, 0x77, 0xd, 0x0, 0xd2, 0x0, 0xd0, 0x0, + 0x0, 0xa3, 0xd, 0x0, 0x95, 0x0, 0xd0, 0x0, + 0x1, 0xa0, 0xd, 0x0, 0x12, 0x10, 0xd0, 0x0, + 0x8, 0x0, 0xd, 0x0, 0x2, 0x9f, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+5C08 "專" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x2, 0x0, 0x3, + 0x76, 0x66, 0x6e, 0x66, 0x69, 0xb1, 0x0, 0x0, + 0x10, 0x1, 0xd0, 0x1, 0x10, 0x0, 0x0, 0xe, + 0x66, 0x6e, 0x66, 0x9b, 0x0, 0x0, 0x0, 0xd0, + 0x1, 0xd0, 0x5, 0x80, 0x0, 0x0, 0xe, 0x66, + 0x6e, 0x66, 0x98, 0x0, 0x0, 0x1, 0xe6, 0x66, + 0xe6, 0x69, 0x80, 0x0, 0x0, 0x17, 0x0, 0x1d, + 0x2, 0x93, 0x0, 0x0, 0x16, 0x66, 0x78, 0xe7, + 0x68, 0xe4, 0x0, 0x0, 0x97, 0x43, 0x10, 0xb, + 0x13, 0x92, 0x3, 0x76, 0x66, 0x66, 0x66, 0xf6, + 0x6b, 0xb0, 0x0, 0x8, 0x40, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x7, 0xcd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, + + /* U+5C0D "對" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x2a, 0x20, 0x0, 0x0, 0xb3, 0x0, + 0x6, 0xc, 0xb, 0x7, 0x10, 0x0, 0xd0, 0x0, + 0x6, 0x8c, 0xb, 0x49, 0x0, 0x0, 0xd0, 0x0, + 0x1, 0x4c, 0xb, 0x52, 0x20, 0x0, 0xd0, 0x0, + 0x28, 0x69, 0x69, 0x68, 0x80, 0x0, 0xd3, 0x50, + 0x0, 0x63, 0x7, 0x60, 0x18, 0x66, 0xe6, 0x50, + 0x0, 0x1d, 0x9, 0x10, 0x12, 0x0, 0xd0, 0x0, + 0x5, 0x79, 0x87, 0xb6, 0xb, 0x30, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x4, 0xe0, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x40, 0x0, 0xc0, 0xd0, 0x0, + 0x2, 0x86, 0xc6, 0x73, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xb3, 0x54, 0x1, 0x10, 0xd0, 0x0, + 0x1b, 0xca, 0x73, 0x0, 0x1, 0x6e, 0xc0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+5C0E "導" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x10, 0x0, 0x94, 0x5, 0x80, 0x0, 0x0, + 0x4c, 0x0, 0x1, 0x70, 0x80, 0x28, 0x0, 0x0, + 0x70, 0x77, 0x6a, 0x76, 0x67, 0x61, 0x3, 0x69, + 0x40, 0xe5, 0x65, 0x56, 0xd0, 0x0, 0x0, 0xb1, + 0xd, 0x55, 0x55, 0x6b, 0x0, 0x0, 0xb, 0x10, + 0xd6, 0x66, 0x67, 0xb0, 0x0, 0x0, 0xb1, 0xd, + 0x22, 0x22, 0x3b, 0x0, 0x0, 0x29, 0x72, 0x93, + 0x33, 0x34, 0x60, 0x0, 0x3a, 0x0, 0x6a, 0xbb, + 0xcc, 0xcd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb1, 0x19, 0x0, 0x76, 0x66, 0x66, 0x66, 0x6e, + 0x68, 0xc6, 0x0, 0x0, 0x82, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x1, 0x7b, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, + + /* U+5C0F "小" */ + 0x0, 0x0, 0x0, 0x2a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x3, 0x90, 0x1d, + 0x4, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x1d, 0x1, + 0x90, 0x0, 0x0, 0x1e, 0x10, 0x1d, 0x0, 0x3c, + 0x10, 0x0, 0x86, 0x0, 0x1d, 0x0, 0x8, 0xd0, + 0x2, 0x90, 0x0, 0x1d, 0x0, 0x0, 0xe8, 0x8, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x89, 0x40, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x6d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+5C11 "少" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0xb3, 0x16, 0x0, 0x0, 0x0, 0x2, + 0xf3, 0xb, 0x30, 0x2c, 0x60, 0x0, 0x0, 0xa7, + 0x0, 0xb3, 0x0, 0x1d, 0xb0, 0x0, 0x3b, 0x0, + 0xb, 0x30, 0x0, 0x2f, 0x50, 0xa, 0x10, 0x0, + 0xb3, 0x0, 0x40, 0x62, 0x7, 0x20, 0x0, 0xb, + 0x30, 0x3f, 0xa0, 0x1, 0x10, 0x0, 0x0, 0x81, + 0x3e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9c, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x88, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C1A "尚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x10, 0x0, 0x0, 0x7, 0x30, 0x2, + 0xc0, 0x0, 0xc4, 0x0, 0xd, 0x70, 0x2c, 0x0, + 0x5d, 0x10, 0x0, 0x4f, 0x2, 0xc0, 0xb, 0x10, + 0x2, 0x0, 0x40, 0x2c, 0x7, 0x30, 0x30, 0xc7, + 0x66, 0x66, 0x86, 0x76, 0x6f, 0x3b, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xb2, 0xa, 0x76, 0x66, + 0xe0, 0xe, 0xb, 0x20, 0xa3, 0x0, 0xd, 0x0, + 0xe0, 0xb2, 0xa, 0x30, 0x0, 0xd0, 0xe, 0xb, + 0x20, 0xa7, 0x66, 0x6d, 0x0, 0xe0, 0xb2, 0xa, + 0x20, 0x0, 0xa0, 0xe, 0xb, 0x20, 0x10, 0x0, + 0x4, 0x55, 0xe0, 0xc2, 0x0, 0x0, 0x0, 0x4, + 0xe9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5C24 "尤" */ + 0x0, 0x0, 0x0, 0x95, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x2, 0xc9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x1e, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x2, 0x5, 0x20, + 0x6, 0x76, 0x66, 0xc7, 0x69, 0x66, 0x6a, 0x90, + 0x0, 0x0, 0x0, 0xb2, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x1c, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x59, 0x0, 0x1c, 0x0, 0x0, 0x70, + 0x0, 0x4, 0xa0, 0x0, 0x1d, 0x0, 0x0, 0xc1, + 0x0, 0x76, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xd2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C31 "就" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x90, 0x0, 0x8, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x9, 0x32, 0x80, 0x0, + 0x5, 0x66, 0x76, 0x6c, 0x29, 0x30, 0x87, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x9, 0x30, 0x12, 0x0, + 0x0, 0x86, 0x66, 0xa4, 0x6b, 0x86, 0x6a, 0x90, + 0x0, 0xd0, 0x0, 0xc1, 0x9, 0x3d, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xc0, 0x9, 0x3d, 0x0, 0x0, + 0x0, 0xd6, 0x86, 0xd1, 0xa, 0x2d, 0x0, 0x0, + 0x0, 0x40, 0xb0, 0x30, 0xc, 0xd, 0x0, 0x0, + 0x0, 0x93, 0xb2, 0x50, 0xc, 0xd, 0x0, 0x0, + 0x1, 0xb0, 0xb0, 0xa5, 0x47, 0xd, 0x0, 0x10, + 0x7, 0x20, 0xb0, 0x34, 0xa1, 0xd, 0x0, 0x60, + 0x15, 0x10, 0xc0, 0x5, 0x50, 0xd, 0x1, 0x90, + 0x0, 0x2b, 0xd0, 0x35, 0x0, 0x9, 0xcc, 0xb0, + 0x0, 0x0, 0x10, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+5C3A "尺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xa6, 0x66, 0x66, 0x66, 0xd3, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xd6, 0x66, 0x76, 0x66, 0xe1, 0x0, + 0x0, 0x4, 0xa0, 0x0, 0x60, 0x0, 0x70, 0x0, + 0x0, 0x4, 0x90, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x70, 0x0, 0x45, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0xb, 0xd5, 0x0, + 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5C40 "局" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0xd, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0x40, 0x0, 0xd0, 0x0, + 0x0, 0x2, 0x0, 0xd1, 0x0, 0xd, 0x2, 0xc6, + 0x66, 0xe0, 0xd, 0x10, 0x2, 0xa0, 0x1b, 0x0, + 0xd, 0x0, 0xd1, 0x0, 0x56, 0x1, 0xd6, 0x66, + 0xd0, 0xd, 0x10, 0xa, 0x0, 0x2a, 0x0, 0x7, + 0x0, 0xe0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x4e, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+5C45 "居" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x9a, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x98, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb4, 0x0, 0x22, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x76, 0x66, 0xd7, 0x66, 0x6b, 0x90, + 0x0, 0x1b, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x39, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x56, 0xc, 0x77, 0xb7, 0x77, 0xe1, 0x0, + 0x0, 0x82, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xa0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x50, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x0, 0xf, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C4A "届" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0xe6, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0xd, + 0x0, 0x0, 0x4, 0x0, 0x4, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xc, 0x3, + 0x0, 0xe, 0x0, 0x5, 0x10, 0x1, 0xb0, 0xd6, + 0x66, 0xe6, 0x66, 0xd5, 0x0, 0x3a, 0xd, 0x10, + 0xe, 0x0, 0xb, 0x20, 0x5, 0x70, 0xd6, 0x66, + 0xe6, 0x66, 0xd2, 0x0, 0x83, 0xc, 0x10, 0xe, + 0x0, 0xb, 0x20, 0xa, 0x0, 0xc1, 0x0, 0xe0, + 0x0, 0xb2, 0x3, 0x60, 0xd, 0x66, 0x6e, 0x66, + 0x6d, 0x30, 0x70, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0x92, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C4B "屋" */ + 0x0, 0x19, 0x66, 0x66, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0x66, 0x66, 0x7b, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x0, 0x1c, 0x47, 0x66, 0xa6, 0x66, 0x79, 0x10, + 0x0, 0x2b, 0x0, 0x5, 0xc3, 0x13, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0x76, 0x0, 0x6, 0xb1, 0x0, + 0x0, 0x49, 0xc, 0xda, 0x87, 0x65, 0xab, 0x0, + 0x0, 0x66, 0x2, 0x20, 0xd, 0x10, 0x4, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x45, 0x0, + 0x0, 0xb0, 0x6, 0x76, 0x6e, 0x66, 0x65, 0x0, + 0x4, 0x50, 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, + 0x7, 0x3, 0x66, 0x66, 0x6e, 0x66, 0x6a, 0xd1, + 0x11, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C55 "展" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, + 0x3, 0xc6, 0x66, 0x66, 0x66, 0x6d, 0x50, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x3, + 0xc6, 0x67, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x3a, + 0x0, 0xb5, 0x0, 0xd0, 0x10, 0x0, 0x3, 0xa0, + 0xb, 0x20, 0xd, 0x7, 0x0, 0x0, 0x3c, 0x66, + 0xd7, 0x66, 0xe6, 0x62, 0x0, 0x4, 0x90, 0xb, + 0x20, 0xd, 0x0, 0x30, 0x0, 0x5a, 0x68, 0xa7, + 0x76, 0xa6, 0x7b, 0x30, 0x8, 0x50, 0xa2, 0x7, + 0x0, 0x57, 0x0, 0x0, 0xb1, 0xa, 0x20, 0x47, + 0x59, 0x20, 0x0, 0xb, 0x0, 0xa2, 0x0, 0xa9, + 0x0, 0x0, 0x5, 0x40, 0xa, 0x57, 0x50, 0x9c, + 0x63, 0x10, 0x70, 0x0, 0xbb, 0x10, 0x0, 0x4c, + 0xe5, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C65 "履" */ + 0x0, 0x28, 0x66, 0x66, 0x66, 0x66, 0x6a, 0x20, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x1d, 0x66, 0x66, 0x76, 0x66, 0x6d, 0x10, + 0x0, 0x1b, 0x4, 0x90, 0xb6, 0x0, 0x6, 0x0, + 0x0, 0x1b, 0xa, 0x10, 0xc6, 0x66, 0x68, 0x30, + 0x0, 0x2a, 0x63, 0x55, 0xc6, 0x66, 0x6c, 0x0, + 0x0, 0x2a, 0x26, 0xb6, 0xa1, 0x0, 0xc, 0x0, + 0x0, 0x39, 0xc, 0x20, 0xa7, 0x66, 0x6c, 0x0, + 0x0, 0x47, 0x7e, 0x20, 0xa8, 0x66, 0x6c, 0x0, + 0x0, 0x67, 0x5c, 0x0, 0x1c, 0x50, 0x11, 0x0, + 0x0, 0x91, 0xc, 0x0, 0x7b, 0x66, 0xc9, 0x0, + 0x0, 0x90, 0xc, 0x4, 0x42, 0x76, 0x90, 0x0, + 0x4, 0x40, 0xc, 0x1, 0x1, 0xbd, 0x40, 0x0, + 0x5, 0x0, 0xb, 0x2, 0x78, 0x20, 0x8d, 0xb1, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x20, + + /* U+5C6C "屬" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x2, 0xd6, 0x66, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, 0x2, + 0xc6, 0x86, 0x69, 0x86, 0x9b, 0x30, 0x0, 0x2b, + 0x1, 0xa3, 0x75, 0x46, 0x20, 0x0, 0x2, 0xa7, + 0x85, 0x47, 0x44, 0x7a, 0x30, 0x0, 0x3a, 0x56, + 0x66, 0x86, 0x66, 0x94, 0x0, 0x3, 0x95, 0x60, + 0xa0, 0xb, 0xa, 0x10, 0x0, 0x58, 0x5a, 0x68, + 0x66, 0x86, 0xb1, 0x0, 0x6, 0x50, 0x9b, 0x66, + 0x66, 0x66, 0x90, 0x0, 0x92, 0x66, 0x0, 0xa0, + 0x1, 0x1a, 0x0, 0xb, 0x32, 0xb6, 0x6d, 0x67, + 0x92, 0x90, 0x1, 0x90, 0xb, 0x66, 0xd6, 0x77, + 0x38, 0x0, 0x62, 0x0, 0x33, 0x3c, 0x57, 0x75, + 0x60, 0x6, 0x0, 0x1a, 0x64, 0x10, 0x19, 0xc3, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, + + /* U+5C71 "山" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, 0xa, + 0x30, 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xa, + 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, + 0xd, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd0, + 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd, 0x0, 0x0, + 0xc1, 0xa, 0x30, 0x0, 0xd0, 0x0, 0xc, 0x10, + 0xa3, 0x0, 0xd, 0x0, 0x0, 0xc1, 0xd, 0x76, + 0x66, 0xa6, 0x66, 0x6d, 0x10, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x91, + + /* U+5CF6 "島" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x7, 0x0, 0x0, 0x51, 0x0, 0x0, 0xc, + 0x66, 0x66, 0x66, 0x6d, 0x30, 0x0, 0x0, 0xc6, + 0x66, 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0xc6, 0x66, + 0x66, 0x66, 0xd1, 0x0, 0x0, 0xc, 0x10, 0x0, + 0x0, 0x1, 0x2, 0x70, 0x0, 0xc6, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x10, 0xc, 0x66, 0x66, 0x66, + 0x66, 0x6a, 0x50, 0x0, 0x40, 0xa, 0x10, 0x0, + 0x0, 0x93, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xb1, + 0xb, 0x10, 0xc, 0x0, 0xd, 0x0, 0xd, 0x0, + 0xd0, 0x2, 0xc6, 0x66, 0x96, 0x66, 0xc0, 0x1c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xce, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + + /* U+5D4C "嵌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x6, 0x80, 0x0, 0x20, 0x0, 0x1, + 0xd0, 0x0, 0x66, 0x0, 0xb, 0x40, 0x0, 0x1b, + 0x0, 0x6, 0x60, 0x0, 0xb2, 0x0, 0x2, 0xb6, + 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, 0x19, 0x0, + 0xb2, 0x2, 0xe0, 0x0, 0x0, 0x1, 0xb0, 0xd, + 0x22, 0x78, 0x0, 0x21, 0x5, 0x7d, 0x66, 0xe7, + 0x6b, 0x66, 0x6c, 0x90, 0x1, 0xb0, 0xd, 0x5, + 0x77, 0x41, 0x70, 0x0, 0x1d, 0x66, 0xe0, 0x70, + 0xb6, 0x0, 0x0, 0x1, 0xb0, 0xd, 0x0, 0xd, + 0x50, 0x0, 0x0, 0x1b, 0x0, 0xd0, 0x3, 0xa6, + 0x20, 0x0, 0x1, 0xb0, 0xd, 0x0, 0x94, 0x1b, + 0x0, 0x0, 0x1d, 0x66, 0xe0, 0x48, 0x0, 0x7b, + 0x10, 0x2, 0x80, 0x5, 0x66, 0x0, 0x0, 0xbd, + 0x20, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x10, + + /* U+5DDD "川" */ + 0x0, 0x25, 0x0, 0x0, 0x0, 0x5, 0x50, 0x2, + 0xc0, 0x0, 0x40, 0x0, 0x78, 0x0, 0x2b, 0x0, + 0xd, 0x30, 0x7, 0x70, 0x2, 0xb0, 0x0, 0xc1, + 0x0, 0x77, 0x0, 0x3a, 0x0, 0xc, 0x10, 0x6, + 0x70, 0x3, 0xa0, 0x0, 0xc1, 0x0, 0x67, 0x0, + 0x39, 0x0, 0xc, 0x10, 0x6, 0x70, 0x5, 0x70, + 0x0, 0xc1, 0x0, 0x67, 0x0, 0x65, 0x0, 0xc, + 0x10, 0x6, 0x70, 0x9, 0x20, 0x0, 0xc1, 0x0, + 0x67, 0x0, 0xc0, 0x0, 0xd, 0x10, 0x6, 0x70, + 0x36, 0x0, 0x0, 0x80, 0x0, 0x67, 0x8, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x73, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, + + /* U+5DDE "州" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x0, 0xd2, 0x0, 0x93, 0x0, 0xb3, 0x0, 0x0, + 0xd0, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x0, 0xd0, + 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x10, 0xd0, 0x0, + 0xb1, 0x10, 0xb2, 0x0, 0x70, 0xd0, 0x90, 0xb1, + 0x82, 0xb2, 0x1, 0xc0, 0xd0, 0xa5, 0xb1, 0x4b, + 0xb2, 0x9, 0x91, 0xb0, 0x64, 0xb1, 0x7, 0xb2, + 0x1, 0x4, 0x90, 0x0, 0xb1, 0x0, 0xb2, 0x0, + 0x7, 0x60, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0xc, + 0x20, 0x0, 0xb1, 0x0, 0xb2, 0x0, 0x2b, 0x0, + 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xa2, 0x0, 0x0, + 0x91, 0x0, 0xb2, 0x6, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+5DE5 "工" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x28, 0x66, 0x66, 0xb7, 0x66, 0x68, 0x60, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x3, 0x1, 0x66, 0x66, 0x66, 0xd8, 0x66, + 0x68, 0xf6, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5DE6 "左" */ + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x96, 0x0, 0x37, + 0x66, 0xaa, 0x66, 0x66, 0x66, 0x50, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0x66, + 0x67, 0x66, 0xb9, 0x0, 0x0, 0x4, 0x80, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0xb, + 0x20, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0xb, 0x20, + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0x27, 0x0, 0x0, 0x66, 0x66, 0x67, 0x66, 0x67, + 0x82, + + /* U+5DEE "差" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0xa, 0x10, 0x10, 0x0, 0x56, + 0x67, 0x76, 0x68, 0x86, 0x6e, 0x90, 0x1, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x81, 0x0, 0x0, 0x66, 0x68, + 0xc6, 0x66, 0x67, 0x40, 0x0, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x4, 0x20, 0x46, 0x66, 0x6d, 0x66, + 0x66, 0x66, 0xa9, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xc6, 0x66, 0x66, + 0x6d, 0x30, 0x0, 0x0, 0xa1, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0x71, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x10, 0x40, 0x36, 0x66, 0x66, 0xe6, 0x66, 0xbd, + 0x10, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5DF1 "己" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x66, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xf0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0xe, 0x42, 0x22, 0x22, + 0x22, 0x26, 0xf3, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x70, + + /* U+5DF2 "已" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x18, + 0x66, 0x66, 0x66, 0x66, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x90, 0xe, 0x42, 0x22, 0x22, + 0x22, 0x27, 0xe1, 0x5, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x50, + + /* U+5E02 "市" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x20, 0x4, 0x66, + 0x66, 0x69, 0x76, 0x66, 0x6f, 0x80, 0x11, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0xb, 0x20, 0x0, 0x20, 0x0, 0x0, 0xd6, 0x66, + 0xd7, 0x66, 0x6f, 0x20, 0x0, 0xd, 0x10, 0xb, + 0x20, 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, + 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x0, + 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, + 0xe0, 0x0, 0x0, 0xd1, 0x0, 0xb2, 0x17, 0x9d, + 0x0, 0x0, 0xb, 0x0, 0xb, 0x20, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5E03 "布" */ + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x3, 0xa0, + 0x4, 0x66, 0x66, 0xf6, 0x66, 0x66, 0x66, 0x62, + 0x0, 0x0, 0x7, 0x70, 0x1b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xbe, 0x66, 0x6e, 0x66, 0x7e, 0x10, + 0x0, 0x7, 0x4d, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x64, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x4, 0x30, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x1, 0x0, 0xd, 0x0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x5, 0x6c, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x1d, 0x2, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + + /* U+5E0C "希" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0xba, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x86, 0x4c, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xcb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x83, 0x3, 0xbe, 0x30, 0x0, + 0x0, 0x25, 0x30, 0x9c, 0x0, 0x5, 0x61, 0x10, + 0x6, 0x66, 0x66, 0xf7, 0x66, 0x66, 0x6d, 0xb0, + 0x0, 0x0, 0xb, 0x40, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0xd0, 0x0, 0x30, 0x0, + 0x0, 0x7, 0xf6, 0x66, 0xe6, 0x66, 0xf2, 0x0, + 0x0, 0x74, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x16, 0x10, 0xe0, 0x0, 0xd0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xd0, 0x12, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x5e, 0x90, 0x0, + 0x0, 0x0, 0x30, 0x0, 0xe0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+5E2B "師" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x90, 0x2, 0x55, 0x55, 0x55, 0x5c, 0x19, 0x78, + 0x6b, 0x32, 0x11, 0xd1, 0x11, 0x10, 0xd0, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0xd, + 0x7, 0x66, 0xe6, 0x66, 0xb0, 0xd0, 0x0, 0xd0, + 0xd0, 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6b, 0xd, + 0x0, 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0x20, 0xd0, + 0xd, 0x0, 0x2a, 0xd, 0x66, 0x6e, 0x2d, 0x0, + 0xd0, 0x2, 0xa0, 0xd0, 0x0, 0xd0, 0xd0, 0xd, + 0x0, 0x2a, 0xd, 0x0, 0xd, 0xd, 0x0, 0xd0, + 0x24, 0xa0, 0xd0, 0x0, 0xd0, 0xb0, 0xd, 0x5, + 0xe6, 0xd, 0x66, 0x6d, 0x0, 0x0, 0xd0, 0x1, + 0x0, 0x90, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+5E2D "席" */ + 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x4, 0x60, + 0x0, 0xb7, 0x66, 0x76, 0x66, 0x96, 0x66, 0x50, + 0x0, 0xb2, 0x0, 0x75, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0xb3, 0x66, 0xa8, 0x66, 0xe6, 0x6d, 0x60, + 0x0, 0xb2, 0x0, 0x64, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x68, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x52, 0xb1, 0x70, 0x0, 0x0, + 0x0, 0xd0, 0x3, 0x0, 0xb1, 0x0, 0x5, 0x0, + 0x0, 0xd0, 0xe, 0x66, 0xd6, 0x66, 0x7c, 0x0, + 0x1, 0xa0, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, + 0x5, 0x50, 0xd, 0x0, 0xb1, 0x0, 0x2a, 0x0, + 0x8, 0x0, 0xd, 0x0, 0xb1, 0x28, 0xd8, 0x0, + 0x6, 0x0, 0x5, 0x0, 0xc2, 0x0, 0x50, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+5E2F "帯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x50, 0x1, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x7, 0x50, 0xb, 0x33, 0x0, + 0x4, 0x68, 0xb6, 0x6a, 0x96, 0x6d, 0x7c, 0x70, + 0x0, 0x3, 0x90, 0x7, 0x50, 0xb, 0x20, 0x0, + 0x0, 0x5, 0xb6, 0x69, 0x86, 0x6c, 0x20, 0x0, + 0x0, 0x40, 0x10, 0x0, 0x0, 0x3, 0x2, 0x10, + 0x2, 0xa6, 0x66, 0x68, 0x76, 0x66, 0x6b, 0xa0, + 0xb, 0x50, 0x0, 0x7, 0x70, 0x0, 0x7, 0x0, + 0x3, 0xb, 0x66, 0x6a, 0x96, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x50, 0x6c, 0x80, 0x0, + 0x0, 0x3, 0x0, 0x7, 0x50, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + + /* U+5E30 "帰" */ + 0x0, 0x7, 0x40, 0x56, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0x9, 0x30, 0x11, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0x9, 0x30, 0x36, 0x66, 0x66, 0x6c, 0x0, + 0x6, 0x29, 0x30, 0x1, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x9, 0x30, 0x66, 0x66, 0x66, 0x6c, 0x0, + 0xb, 0xa, 0x22, 0x0, 0x0, 0x0, 0x4, 0x10, + 0xb, 0xb, 0x1a, 0x66, 0x6a, 0x66, 0x66, 0xe1, + 0xb, 0xc, 0x5a, 0x0, 0xd, 0x0, 0x4, 0x30, + 0x7, 0xc, 0x11, 0x76, 0x6e, 0x66, 0x6a, 0x0, + 0x0, 0x2a, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0x65, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x0, 0xa0, 0x0, 0xd0, 0xd, 0x0, 0x1c, 0x0, + 0x3, 0x60, 0x0, 0xd0, 0xd, 0x6, 0xab, 0x0, + 0x6, 0x0, 0x0, 0x50, 0xd, 0x0, 0x62, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + + /* U+5E33 "帳" */ + 0x0, 0xb1, 0x0, 0x4, 0x0, 0x0, 0x71, 0x0, + 0xd, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x30, 0x10, + 0xd0, 0x30, 0xd, 0x22, 0x24, 0x70, 0xe, 0x6e, + 0x6e, 0x30, 0xd3, 0x33, 0x32, 0x0, 0xd0, 0xd0, + 0xd0, 0xc, 0x0, 0x1, 0x60, 0xd, 0xd, 0xd, + 0x0, 0xd6, 0x66, 0x65, 0x0, 0xd0, 0xd0, 0xd0, + 0xc, 0x0, 0x0, 0x17, 0xd, 0xd, 0xd, 0x47, + 0xd6, 0x96, 0x66, 0x61, 0xd0, 0xd0, 0xd0, 0x1b, + 0x6, 0x0, 0x84, 0xd, 0xd, 0x3d, 0x1, 0xb0, + 0x44, 0x6a, 0x20, 0x90, 0xd4, 0x80, 0x1b, 0x0, + 0xc4, 0x0, 0x0, 0xd, 0x0, 0x1, 0xb0, 0x5, + 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x76, 0x9, + 0xb2, 0x0, 0xe, 0x0, 0x4, 0xf5, 0x0, 0x9, + 0xd3, 0x0, 0x50, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E36 "帶" */ + 0x0, 0x1, 0xb0, 0x92, 0x18, 0xb, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0xc0, 0xb, 0xd, 0x4, 0x0, + 0x2, 0x66, 0xd6, 0xd6, 0x6d, 0x6e, 0x6b, 0x80, + 0x0, 0x4, 0x80, 0xc0, 0xb, 0xd, 0x0, 0x40, + 0x0, 0x1a, 0x0, 0xc6, 0x6c, 0xd, 0x57, 0xb0, + 0x1, 0x60, 0x0, 0x60, 0x4, 0x3, 0x55, 0x20, + 0x0, 0x96, 0x66, 0x67, 0x66, 0x66, 0x68, 0xb0, + 0x7, 0x50, 0x0, 0x6, 0xb0, 0x0, 0x7, 0x40, + 0xd, 0x18, 0x66, 0x69, 0xb6, 0x68, 0xb3, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x20, 0x6, 0x90, 0x4, 0x90, 0x0, + 0x0, 0xb, 0x10, 0x6, 0x91, 0x8c, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, + + /* U+5E38 "常" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x0, 0x93, 0x2, 0x60, 0x0, 0x0, 0x8, + 0xa0, 0xa2, 0xa, 0x60, 0x0, 0x2, 0x0, 0x90, + 0xa2, 0x43, 0x0, 0x30, 0xa, 0x66, 0x66, 0x76, + 0x66, 0x66, 0xe8, 0x78, 0x2, 0x10, 0x0, 0x4, + 0x2, 0x70, 0x61, 0x5, 0xa6, 0x66, 0x6d, 0x20, + 0x0, 0x0, 0x4, 0x70, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x5, 0xa6, 0xb7, 0x6c, 0x0, 0x0, 0x0, + 0x21, 0x0, 0xa2, 0x0, 0x3, 0x0, 0x0, 0xd6, + 0x66, 0xc7, 0x66, 0x8c, 0x0, 0x0, 0xd1, 0x0, + 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, + 0x0, 0x39, 0x0, 0x0, 0xd1, 0x0, 0xa2, 0x18, + 0xd8, 0x0, 0x0, 0x40, 0x0, 0xb3, 0x0, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+5E45 "幅" */ + 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0xc0, 0x4, 0x76, 0x66, 0x66, 0x96, 0x10, 0xc0, + 0x30, 0x0, 0x0, 0x1, 0x0, 0xc6, 0xd6, 0xd3, + 0xd, 0x66, 0x6d, 0x30, 0xc0, 0xc0, 0xc0, 0xd, + 0x0, 0xc, 0x0, 0xc0, 0xc0, 0xc0, 0xd, 0x66, + 0x6d, 0x0, 0xc0, 0xc0, 0xc0, 0xb, 0x0, 0x6, + 0x0, 0xc0, 0xc0, 0xc0, 0x86, 0x66, 0x66, 0xa2, + 0xc0, 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb2, 0xc0, + 0xc0, 0xc0, 0xd0, 0xc, 0x0, 0xb1, 0xc0, 0xc6, + 0xa0, 0xd6, 0x6d, 0x66, 0xd1, 0x10, 0xc0, 0x0, + 0xd0, 0xc, 0x0, 0xb1, 0x0, 0xc0, 0x0, 0xd6, + 0x6d, 0x66, 0xd1, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xb1, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, + 0x10, + + /* U+5E73 "平" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, + 0x0, 0x76, 0x66, 0x6b, 0x76, 0x66, 0x86, 0x0, + 0x0, 0x3, 0x0, 0xb, 0x30, 0x6, 0x30, 0x0, + 0x0, 0x6, 0x80, 0xb, 0x30, 0xe, 0x50, 0x0, + 0x0, 0x0, 0xd7, 0xb, 0x30, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x68, 0xb, 0x32, 0x50, 0x1, 0x0, + 0x26, 0x66, 0x66, 0x6d, 0x87, 0x66, 0x6e, 0x80, + 0x1, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E74 "年" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xc, 0x86, 0x66, 0x86, 0x66, 0x8c, 0x20, + 0x0, 0x67, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x1, 0x90, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x7, 0x4, 0x0, 0x1, 0xd0, 0x2, 0x90, 0x0, + 0x10, 0xb, 0x86, 0x66, 0xe6, 0x66, 0x62, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xd0, 0x0, 0x1, 0x0, + 0x27, 0x6c, 0x76, 0x66, 0xe6, 0x66, 0x6d, 0xa0, + 0x1, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + + /* U+5E78 "幸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x5, 0x0, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x76, 0x69, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x6c, 0x76, 0x66, 0xad, 0x10, + 0x0, 0x0, 0x6, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x90, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x50, 0x25, 0x4, 0x80, 0x0, + 0x0, 0x57, 0x66, 0x6d, 0x76, 0x66, 0x61, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x6f, 0x80, + 0x2, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+5E7E "幾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x4, 0xa0, 0xa, 0x30, 0x0, + 0x0, 0x2, 0xa0, 0x3, 0x90, 0x49, 0x0, 0x0, + 0x0, 0x18, 0x1, 0x72, 0xa2, 0x70, 0x9, 0x0, + 0x0, 0xc9, 0x6c, 0x61, 0xba, 0x96, 0xc7, 0x0, + 0x0, 0x10, 0x83, 0x0, 0xc0, 0x8, 0x41, 0x0, + 0x0, 0x7, 0x24, 0x50, 0xc2, 0x94, 0x2a, 0x20, + 0x0, 0x8c, 0x86, 0xc0, 0xc2, 0xc7, 0x45, 0x90, + 0x0, 0x0, 0xb2, 0x10, 0xb1, 0x1c, 0x2, 0x10, + 0x4, 0x66, 0xd6, 0x66, 0xb8, 0x69, 0x6e, 0x80, + 0x0, 0x0, 0xc0, 0x0, 0x57, 0x0, 0x81, 0x0, + 0x0, 0x4, 0xc8, 0x10, 0x1c, 0x9, 0xc3, 0x0, + 0x0, 0xa, 0x14, 0xb0, 0x9, 0xd8, 0x0, 0x31, + 0x0, 0x64, 0x0, 0x30, 0x5b, 0xc7, 0x0, 0x70, + 0x4, 0x50, 0x0, 0x58, 0x40, 0x7, 0xd9, 0xd0, + 0x2, 0x0, 0x15, 0x10, 0x0, 0x0, 0x5, 0x91, + + /* U+5E83 "広" */ + 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x10, 0x0, + 0x28, 0x66, 0x66, 0x78, 0x66, 0x7f, 0x50, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x2, 0xc0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x69, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x7, 0x50, 0x5, 0x60, + 0x0, 0x40, 0x0, 0x0, 0xa1, 0x0, 0xa0, 0x0, + 0x1, 0xc2, 0x0, 0xa, 0x0, 0xa2, 0x0, 0x0, + 0x5, 0xe1, 0x5, 0x30, 0x7e, 0xcc, 0xba, 0x98, + 0x7d, 0x80, 0x70, 0x2, 0x62, 0x0, 0x0, 0x0, + 0x44, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E95 "底" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xd3, 0x0, 0x6, 0x10, + 0x0, 0xb8, 0x66, 0x66, 0x76, 0x66, 0x68, 0x60, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, + 0x0, 0xb3, 0x4, 0x24, 0x7a, 0xcb, 0x93, 0x0, + 0x0, 0xb3, 0x1d, 0x32, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0xd, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0xe, 0x66, 0x6e, 0x76, 0x6e, 0x40, + 0x0, 0xc1, 0xd, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0xb0, 0xd, 0x0, 0x23, 0xd2, 0x0, 0x20, + 0x5, 0x60, 0xd, 0x49, 0x50, 0x5c, 0x0, 0x70, + 0x8, 0x0, 0x2f, 0xa3, 0xa2, 0x8, 0xd3, 0xa0, + 0x25, 0x0, 0x5, 0x0, 0x4c, 0x0, 0x6e, 0xd0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x50, + + /* U+5E97 "店" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x0, 0x0, 0xc3, 0x0, 0x9, 0x10, 0x3, + 0xd6, 0x66, 0x68, 0x66, 0x66, 0x85, 0x0, 0x2c, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x2, 0xc0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0xc6, 0x66, 0xab, 0x0, 0x3, 0xb0, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x5, 0x90, 0x96, 0x6d, + 0x66, 0x6b, 0x40, 0x0, 0x77, 0xd, 0x10, 0x0, + 0x0, 0xc3, 0x0, 0xa, 0x30, 0xc1, 0x0, 0x0, + 0xc, 0x20, 0x0, 0xb0, 0xc, 0x10, 0x0, 0x0, + 0xc2, 0x0, 0x54, 0x0, 0xd6, 0x66, 0x66, 0x6d, + 0x30, 0x6, 0x0, 0xd, 0x10, 0x0, 0x0, 0x92, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+5E9C "府" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xe1, 0x0, 0x5, 0x40, + 0x0, 0xb7, 0x66, 0x66, 0x76, 0x66, 0x67, 0x70, + 0x0, 0xb3, 0x0, 0xb5, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0xb3, 0x1, 0xe1, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0xb3, 0x8, 0x60, 0x0, 0x1, 0xb0, 0x60, + 0x0, 0xb2, 0xe, 0x45, 0x76, 0x66, 0xd6, 0x72, + 0x0, 0xc2, 0x7c, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0xd3, 0x5a, 0x21, 0xa2, 0x1, 0xb0, 0x0, + 0x0, 0xc4, 0xa, 0x20, 0x4e, 0x1, 0xb0, 0x0, + 0x0, 0xa0, 0xa, 0x20, 0x6, 0x1, 0xb0, 0x0, + 0x4, 0x50, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x8, 0x0, 0xa, 0x20, 0x0, 0x1, 0xb0, 0x0, + 0x14, 0x0, 0xb, 0x20, 0x0, 0x7c, 0x90, 0x0, + 0x10, 0x0, 0x5, 0x0, 0x0, 0x5, 0x10, 0x0, + + /* U+5EA6 "度" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x1, 0xc0, 0x0, 0x29, 0x0, 0xb, + 0x86, 0x68, 0x66, 0x67, 0x66, 0x62, 0x0, 0xa3, + 0x0, 0xd2, 0x0, 0xb4, 0x0, 0x0, 0xa, 0x66, + 0x6e, 0x66, 0x6c, 0x79, 0xc0, 0x0, 0xb3, 0x0, + 0xd0, 0x0, 0xa2, 0x0, 0x0, 0xb, 0x20, 0xd, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0xb6, + 0x66, 0xa1, 0x0, 0x0, 0xd, 0x1, 0x66, 0x66, + 0x66, 0xb1, 0x0, 0x0, 0xc0, 0x0, 0x51, 0x0, + 0x99, 0x0, 0x0, 0x38, 0x0, 0x0, 0x80, 0x5b, + 0x0, 0x0, 0x7, 0x30, 0x0, 0x1, 0xbb, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x1, 0x99, 0xc8, 0x20, + 0x0, 0x33, 0x0, 0x38, 0x82, 0x0, 0x6d, 0xeb, + 0x42, 0x2, 0x52, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+5EA7 "座" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xd0, 0x0, 0x26, 0x0, 0xa, + 0x86, 0x66, 0x68, 0x66, 0x68, 0x92, 0x0, 0xa4, + 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x83, 0xb, 0x20, 0x56, 0x0, 0x0, 0xa4, 0xd, + 0x10, 0xb1, 0xb, 0x60, 0x0, 0xa, 0x32, 0xc0, + 0xb, 0x11, 0xe4, 0x0, 0x0, 0xb3, 0x83, 0xc3, + 0xb1, 0x74, 0x7b, 0x0, 0xc, 0x27, 0x5, 0x8b, + 0x28, 0x0, 0xa3, 0x0, 0xd4, 0x0, 0x1, 0xb3, + 0x2, 0x91, 0x0, 0xb, 0x3, 0x76, 0x6d, 0x66, + 0x66, 0x20, 0x4, 0x60, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0x0, 0x80, 0x0, 0x0, 0xb, 0x10, 0x0, + 0x10, 0x15, 0x5, 0x66, 0x66, 0xd6, 0x66, 0x7f, + 0x61, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EAB "庫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x2, + 0xc6, 0x66, 0x67, 0x66, 0x66, 0xb5, 0x0, 0x2c, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x1, 0xb3, + 0x76, 0x66, 0xe6, 0x6a, 0x80, 0x0, 0x1b, 0x2, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x2, 0xb0, 0xa7, + 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x3a, 0xa, 0x20, + 0xd, 0x0, 0xd0, 0x0, 0x4, 0x80, 0xa7, 0x66, + 0xe6, 0x6e, 0x0, 0x0, 0x65, 0xa, 0x76, 0x6e, + 0x66, 0xe0, 0x0, 0xa, 0x10, 0x61, 0x0, 0xd0, + 0x4, 0x30, 0x0, 0x90, 0x76, 0x66, 0x6e, 0x66, + 0x6d, 0x70, 0x53, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+5EAD "庭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x9, 0x10, + 0x0, 0xe6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x30, + 0x0, 0xe0, 0x0, 0x40, 0x0, 0x2, 0x7a, 0x0, + 0x0, 0xe3, 0x78, 0xf3, 0x35, 0x8d, 0x52, 0x0, + 0x0, 0xe0, 0xb, 0x40, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0xd0, 0x78, 0x0, 0x0, 0x2b, 0x2, 0x0, + 0x0, 0xd3, 0xe6, 0xb8, 0x57, 0x7d, 0x6a, 0x60, + 0x0, 0xc0, 0x0, 0xc2, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0xc0, 0x61, 0xc0, 0x0, 0x2b, 0x0, 0x0, + 0x2, 0x90, 0x5c, 0x61, 0x66, 0x7d, 0x67, 0xb0, + 0x6, 0x30, 0x4e, 0x80, 0x10, 0x0, 0x0, 0x0, + 0x7, 0x2, 0xb1, 0x6c, 0x84, 0x21, 0x11, 0x21, + 0x23, 0x57, 0x0, 0x0, 0x59, 0xce, 0xff, 0xa1, + 0x11, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EB7 "康" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x47, 0x0, 0x8, 0x50, + 0x0, 0x3d, 0x66, 0x66, 0xa6, 0x66, 0x66, 0x50, + 0x0, 0x2b, 0x0, 0x0, 0xb3, 0x0, 0x40, 0x0, + 0x0, 0x2b, 0x18, 0x66, 0xc7, 0x66, 0xe0, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0xa2, 0x0, 0xc4, 0x60, + 0x0, 0x3b, 0x76, 0x66, 0xc7, 0x66, 0xd6, 0x50, + 0x0, 0x49, 0x16, 0x66, 0xc7, 0x66, 0xc0, 0x0, + 0x0, 0x57, 0x3, 0x0, 0xa7, 0x0, 0x56, 0x0, + 0x0, 0x75, 0x8, 0x90, 0xa4, 0x50, 0x88, 0x10, + 0x0, 0xa1, 0x0, 0x96, 0xc2, 0x97, 0x20, 0x0, + 0x0, 0xa0, 0x6, 0x91, 0xa2, 0x1c, 0x20, 0x0, + 0x5, 0x35, 0xe5, 0x11, 0xc2, 0x2, 0xea, 0x50, + 0x7, 0x0, 0x30, 0x2b, 0xd0, 0x0, 0x19, 0x30, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EE0 "廠" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x3, 0x90, 0x0, 0x29, 0x0, + 0x0, 0x98, 0x66, 0x66, 0x66, 0x66, 0x67, 0x30, + 0x0, 0x94, 0x0, 0x52, 0x10, 0x55, 0x0, 0x0, + 0x0, 0x93, 0x83, 0x50, 0xc3, 0x95, 0x0, 0x0, + 0x0, 0x93, 0x1a, 0x53, 0x40, 0xb3, 0x39, 0x10, + 0x0, 0xa2, 0x86, 0x97, 0xa5, 0xa2, 0x68, 0x10, + 0x0, 0xa1, 0xc0, 0x0, 0xa7, 0x70, 0x74, 0x0, + 0x0, 0xb0, 0xc2, 0xac, 0xa5, 0x52, 0x92, 0x0, + 0x0, 0xb0, 0xc2, 0x9b, 0xa2, 0x27, 0xb0, 0x0, + 0x0, 0x90, 0xc2, 0xbb, 0xa2, 0xc, 0x70, 0x0, + 0x5, 0x40, 0xc1, 0x44, 0xa2, 0x1c, 0xa0, 0x0, + 0x7, 0x0, 0xc0, 0x4, 0xc1, 0x91, 0x8a, 0x0, + 0x13, 0x0, 0x90, 0x4, 0x96, 0x10, 0x9, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+5EFA "建" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x31, 0x0, 0xd, 0x0, 0x20, 0x0, + 0x5, 0x66, 0xe4, 0x36, 0x6e, 0x66, 0xe3, 0x0, + 0x0, 0x5, 0x80, 0x0, 0xd, 0x0, 0xd3, 0x20, + 0x0, 0xc, 0x3, 0x66, 0x6e, 0x66, 0xe6, 0x60, + 0x0, 0x75, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x3, 0xd6, 0x7a, 0x46, 0x6e, 0x66, 0xa0, 0x0, + 0x0, 0x10, 0x66, 0x0, 0xd, 0x0, 0x30, 0x0, + 0x0, 0x20, 0x93, 0x46, 0x6e, 0x66, 0x70, 0x0, + 0x0, 0x60, 0xc0, 0x0, 0xd, 0x0, 0x6, 0x0, + 0x0, 0x38, 0xa4, 0x66, 0x6e, 0x66, 0x68, 0x20, + 0x0, 0xb, 0x80, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x7c, 0x63, 0x9, 0x0, 0x0, 0x21, + 0x5, 0x40, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F0F "式" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x6c, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xa4, 0x0, 0x17, 0x66, + 0x66, 0x66, 0xf6, 0x66, 0xda, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x56, 0x66, 0x6e, + 0x4a, 0x40, 0x0, 0x0, 0x1, 0x2, 0xb0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x4, + 0xb0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x11, 0x88, + 0x0, 0x60, 0x0, 0x3, 0xd8, 0x64, 0x1, 0xe4, + 0x8, 0x5, 0xbd, 0x94, 0x0, 0x0, 0x4, 0xe7, + 0xb0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + + /* U+5F15 "引" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x91, 0x37, 0x66, + 0x68, 0xd0, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, + 0x0, 0xe0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe0, + 0xc, 0x66, 0x68, 0xb0, 0x0, 0xe0, 0xd, 0x0, + 0x1, 0x30, 0x0, 0xe0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0xaa, 0x66, 0x66, 0xb3, 0x0, 0xe0, + 0x21, 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, + 0x2, 0xb0, 0x0, 0xe0, 0x0, 0x0, 0x6, 0x80, + 0x0, 0xe0, 0x0, 0x0, 0xa, 0x40, 0x0, 0xe0, + 0x0, 0x45, 0x6e, 0x0, 0x0, 0xe0, 0x0, 0x7, + 0xe4, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, + + /* U+5F1F "弟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x50, 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x61, 0x3, 0x0, 0x2, 0x76, 0x66, 0x7b, + 0x66, 0x6d, 0x50, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0xc, 0x20, 0x0, 0x41, 0x0, 0x2b, 0x0, 0xc, + 0x20, 0x0, 0xa9, 0x66, 0x7d, 0x66, 0x6c, 0x10, + 0x0, 0xe0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x6, + 0xd6, 0x66, 0xad, 0x66, 0x66, 0xc4, 0x0, 0x10, + 0x8, 0xbb, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x5b, + 0x2b, 0x0, 0x0, 0xe0, 0x0, 0x5, 0x90, 0x2b, + 0x0, 0x2, 0xc0, 0x0, 0x76, 0x0, 0x2b, 0x4, + 0xbd, 0x70, 0x36, 0x10, 0x0, 0x3c, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + + /* U+5F31 "弱" */ + 0x0, 0x0, 0x0, 0x60, 0x23, 0x33, 0x39, 0x0, + 0x17, 0x66, 0x6e, 0x13, 0x43, 0x33, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x6, + 0x66, 0x6e, 0x0, 0xb5, 0x55, 0xd0, 0x0, 0xa2, + 0x0, 0x70, 0x2b, 0x0, 0x4, 0x0, 0xc, 0x0, + 0x0, 0x5, 0x80, 0x0, 0x0, 0x2, 0xe6, 0x66, + 0xd2, 0xa9, 0x66, 0x6c, 0x50, 0x3, 0x0, 0xe, + 0x1, 0x30, 0x0, 0xb2, 0x0, 0xc, 0x20, 0xd0, + 0x3, 0xc0, 0xb, 0x20, 0x0, 0x65, 0xd, 0x0, + 0xa, 0x20, 0xb2, 0x0, 0x0, 0x65, 0xd0, 0x0, + 0x27, 0x4c, 0x20, 0x39, 0x91, 0x1b, 0x5, 0xb7, + 0x0, 0xd1, 0xb, 0x50, 0x4, 0x90, 0xa2, 0x10, + 0xe, 0x0, 0x0, 0x4b, 0xe3, 0x0, 0x1, 0x9f, + 0x90, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x40, + 0x0, + + /* U+5F35 "張" */ + 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x28, 0x0, + 0x4, 0x66, 0x6e, 0x1a, 0x76, 0x66, 0x66, 0x10, + 0x0, 0x0, 0xd, 0xa, 0x30, 0x0, 0x52, 0x0, + 0x0, 0x0, 0xd, 0xa, 0x76, 0x66, 0x64, 0x0, + 0x5, 0x86, 0x6e, 0xa, 0x30, 0x0, 0x34, 0x0, + 0x7, 0x60, 0x4, 0xa, 0x76, 0x66, 0x65, 0x0, + 0x8, 0x40, 0x0, 0xa, 0x30, 0x0, 0x4, 0x20, + 0xc, 0x20, 0x5, 0x7d, 0x69, 0x66, 0x67, 0x60, + 0x8, 0x66, 0x6d, 0x3d, 0x4, 0x20, 0x9, 0x0, + 0x0, 0x0, 0xd, 0xd, 0x0, 0x81, 0xa6, 0x10, + 0x0, 0x0, 0xc, 0xd, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xd, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x20, 0x85, 0xd, 0x48, 0x14, 0xe5, 0x0, + 0x0, 0x5e, 0xe0, 0xe, 0xa0, 0x0, 0x5f, 0x90, + 0x0, 0x4, 0x10, 0x3, 0x0, 0x0, 0x1, 0x0, + + /* U+5F37 "強" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x6, 0x66, 0x6e, 0x20, 0xc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x82, 0x0, 0x31, 0x0, + 0x0, 0x0, 0xd, 0x18, 0x20, 0x12, 0x3d, 0x60, + 0x6, 0x86, 0x6e, 0x2e, 0xb8, 0xa4, 0x22, 0xe0, + 0x8, 0x50, 0x3, 0x0, 0x0, 0xd1, 0x0, 0x10, + 0x9, 0x30, 0x0, 0x8, 0x66, 0xe6, 0x6a, 0x20, + 0xd, 0x10, 0x5, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x7, 0x66, 0x6d, 0x4d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x0, 0xd, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x0, 0x1d, 0x8, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xd0, 0x7, 0x0, + 0x0, 0x42, 0xc4, 0x13, 0x45, 0xe7, 0x68, 0xb0, + 0x0, 0x2e, 0xa0, 0x1d, 0x95, 0x30, 0x0, 0xc0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F53 "当" */ + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x2, + 0x30, 0x0, 0xb3, 0x0, 0x66, 0x0, 0x0, 0x99, + 0x0, 0xb2, 0x1, 0xe7, 0x0, 0x0, 0xd, 0x60, + 0xb2, 0x9, 0x40, 0x0, 0x0, 0x3, 0x20, 0xb2, + 0x42, 0x0, 0x0, 0x5, 0x66, 0x66, 0xd7, 0x66, + 0x66, 0xc2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, + 0x86, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x28, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x50, + + /* U+5F62 "形" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x13, 0x0, + 0x4, 0x68, 0x76, 0x68, 0xa8, 0x0, 0xab, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x0, 0x29, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x2, 0x50, 0x2, 0x0, + 0x0, 0x9, 0x40, 0x2a, 0x46, 0x0, 0x2e, 0x40, + 0x6, 0x6c, 0x86, 0x7c, 0x65, 0x1, 0xd6, 0x0, + 0x0, 0xb, 0x20, 0x2a, 0x0, 0x1b, 0x30, 0x0, + 0x0, 0xc, 0x10, 0x2a, 0x2, 0x81, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x2a, 0x3, 0x0, 0x7, 0xc0, + 0x0, 0x48, 0x0, 0x2a, 0x0, 0x0, 0x5d, 0x30, + 0x0, 0xa1, 0x0, 0x3a, 0x0, 0x6, 0xb1, 0x0, + 0x3, 0x60, 0x0, 0x3a, 0x0, 0x87, 0x0, 0x0, + 0x6, 0x0, 0x0, 0x25, 0x38, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+5F71 "影" */ + 0x0, 0x30, 0x0, 0x3, 0x10, 0x0, 0x21, 0x0, + 0x0, 0xe6, 0x66, 0x6b, 0x60, 0x0, 0xb9, 0x0, + 0x0, 0xd6, 0x66, 0x6b, 0x30, 0x7, 0x80, 0x0, + 0x0, 0xd0, 0x0, 0x9, 0x30, 0x46, 0x0, 0x0, + 0x0, 0xd6, 0x88, 0x6b, 0x33, 0x40, 0x1, 0x0, + 0x1, 0x11, 0x1c, 0x11, 0x80, 0x0, 0x1e, 0x50, + 0x6, 0x65, 0x55, 0x57, 0x52, 0x0, 0xb6, 0x0, + 0x0, 0xd6, 0x66, 0x6d, 0x30, 0x9, 0x40, 0x0, + 0x0, 0xd1, 0x0, 0xb, 0x11, 0x82, 0x0, 0x10, + 0x0, 0xd6, 0x68, 0x6d, 0x23, 0x0, 0x7, 0xd0, + 0x0, 0x43, 0xd, 0x13, 0x0, 0x0, 0x5c, 0x20, + 0x0, 0x3d, 0x1d, 0x4b, 0x20, 0x6, 0xa0, 0x0, + 0x1, 0xa1, 0xc, 0x6, 0x80, 0x97, 0x0, 0x0, + 0x6, 0x3, 0xca, 0x0, 0x67, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+5F79 "役" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe2, 0x3, 0x76, 0x6a, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x3, 0x90, 0xd, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x4, 0x90, 0xd, 0x0, 0x0, + 0x4, 0x60, 0x52, 0x6, 0x60, 0xd, 0x0, 0x0, + 0x13, 0x1, 0xe6, 0xb, 0x10, 0xe, 0x21, 0x30, + 0x0, 0xa, 0x60, 0x83, 0x0, 0x5, 0x88, 0x80, + 0x0, 0x5f, 0x15, 0x25, 0x66, 0x66, 0xb0, 0x0, + 0x3, 0x8c, 0x10, 0x1, 0x40, 0x6, 0x90, 0x0, + 0x26, 0xc, 0x10, 0x0, 0x70, 0xc, 0x20, 0x0, + 0x10, 0xc, 0x10, 0x0, 0x53, 0x4a, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xa, 0xc1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x3, 0xb3, 0x4d, 0x60, 0x0, + 0x0, 0xc, 0x12, 0x76, 0x0, 0x2, 0xbf, 0x80, + 0x0, 0x4, 0x12, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5F7C "彼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x1e, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x8, + 0x50, 0x7, 0x66, 0x6d, 0x66, 0xa7, 0x2, 0x70, + 0x91, 0x84, 0x0, 0xc0, 0xb, 0x30, 0x60, 0x3d, + 0x18, 0x40, 0xc, 0x3, 0x10, 0x0, 0xc, 0x40, + 0x84, 0x0, 0xc0, 0x0, 0x0, 0x5, 0xf0, 0x8, + 0x86, 0x6c, 0x69, 0x80, 0x1, 0xad, 0x0, 0x93, + 0x60, 0x0, 0xa3, 0x0, 0x70, 0xd0, 0xa, 0x22, + 0x60, 0x1c, 0x0, 0x10, 0xd, 0x0, 0xc0, 0xa, + 0x8, 0x40, 0x0, 0x0, 0xd0, 0xb, 0x0, 0x49, + 0xa0, 0x0, 0x0, 0xd, 0x4, 0x60, 0x2, 0xf5, + 0x0, 0x0, 0x0, 0xd0, 0x80, 0x6, 0x92, 0xc9, + 0x20, 0x0, 0xd, 0x33, 0x47, 0x20, 0x0, 0x9f, + 0x90, 0x0, 0x41, 0x20, 0x0, 0x0, 0x0, 0x10, + + /* U+5F80 "往" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x10, 0x4, 0x20, 0x0, 0x0, 0x0, + 0x9, 0x80, 0x0, 0xc, 0x40, 0x0, 0x0, 0x4, + 0x90, 0x0, 0x0, 0x68, 0x0, 0x0, 0x1, 0x80, + 0x11, 0x66, 0x66, 0x66, 0x9c, 0x0, 0x50, 0xe, + 0x42, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xa0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0xbe, 0x10, 0x0, + 0xe, 0x0, 0x52, 0x0, 0x73, 0xc1, 0x6, 0x76, + 0xe6, 0x66, 0x40, 0x32, 0xc, 0x10, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe0, 0x0, + 0x61, 0x0, 0xd, 0x28, 0x66, 0x68, 0x66, 0x68, + 0x60, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F85 "待" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, + 0xa0, 0x6, 0x66, 0xe6, 0x6c, 0x20, 0x0, 0x90, + 0x72, 0x0, 0xd, 0x0, 0x0, 0x0, 0x60, 0x1e, + 0x30, 0x0, 0xd0, 0x0, 0x10, 0x0, 0x9, 0x67, + 0x66, 0x6c, 0x66, 0x6b, 0x50, 0x3, 0xf1, 0x0, + 0x0, 0x0, 0x92, 0x0, 0x0, 0xad, 0x10, 0x0, + 0x0, 0xd, 0x7, 0x10, 0x71, 0xc1, 0x36, 0x66, + 0x66, 0xe6, 0x63, 0x10, 0xc, 0x10, 0x7, 0x30, + 0xd, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1e, 0x10, + 0xd0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x70, 0xd, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x17, 0xbd, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x4, 0x20, 0x0, + + /* U+5F88 "很" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + 0xc, 0x40, 0xd, 0x66, 0x66, 0xe3, 0x0, 0x5, + 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0x80, + 0x51, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x50, 0xe, + 0x30, 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x70, + 0xd, 0x0, 0x0, 0xd0, 0x0, 0x1, 0xf0, 0x0, + 0xd6, 0x66, 0x6e, 0x0, 0x0, 0x9e, 0x0, 0xd, + 0x6, 0x0, 0x53, 0x0, 0x62, 0xd0, 0x0, 0xd0, + 0x70, 0x1c, 0x70, 0x22, 0xd, 0x0, 0xd, 0x2, + 0x87, 0x10, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, + 0x20, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, 0x3c, + 0x40, 0x0, 0x0, 0xd0, 0x0, 0xe9, 0x70, 0x2e, + 0xa4, 0x0, 0xd, 0x0, 0xd, 0x30, 0x0, 0x8, + 0x30, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F8B "律" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x1d, 0x10, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xd, 0x0, 0x10, 0x0, + 0x0, 0xb0, 0x0, 0x86, 0x6e, 0x66, 0xd4, 0x0, + 0x7, 0x12, 0xc1, 0x0, 0xd, 0x0, 0xc2, 0x10, + 0x1, 0x8, 0x96, 0x76, 0x6e, 0x66, 0xda, 0x90, + 0x0, 0x1e, 0x0, 0x0, 0xd, 0x0, 0xc1, 0x0, + 0x0, 0x9e, 0x0, 0x76, 0x6e, 0x66, 0xd1, 0x0, + 0x4, 0x6e, 0x0, 0x0, 0xd, 0x0, 0x20, 0x0, + 0x15, 0xe, 0x2, 0x76, 0x6e, 0x66, 0xb7, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x26, 0x66, 0x6e, 0x66, 0x6d, 0x60, + 0x0, 0xe, 0x1, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+5F8C "後" */ + 0x0, 0x1, 0xb1, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x9, 0x90, 0x0, 0x79, 0x1, 0x50, 0x0, + 0x0, 0x49, 0x0, 0x7, 0x70, 0xc, 0xa0, 0x0, + 0x2, 0x80, 0x52, 0x8e, 0x76, 0xc5, 0x0, 0x0, + 0x15, 0x1, 0xe5, 0x11, 0x3a, 0x22, 0x40, 0x0, + 0x0, 0xa, 0x60, 0x7, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x5f, 0x10, 0xdd, 0xc7, 0x65, 0x4e, 0x0, + 0x2, 0x9d, 0x10, 0x11, 0xe3, 0x0, 0x2, 0x0, + 0x26, 0xc, 0x10, 0x9, 0xa6, 0x66, 0xd1, 0x0, + 0x0, 0xc, 0x10, 0x47, 0x60, 0x8, 0x90, 0x0, + 0x0, 0xc, 0x12, 0x70, 0x44, 0x3c, 0x0, 0x0, + 0x0, 0xc, 0x13, 0x0, 0xa, 0xd2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x4b, 0xa7, 0x10, 0x0, + 0x0, 0xd, 0x10, 0x49, 0x60, 0x6, 0xdc, 0x80, + 0x0, 0x6, 0x14, 0x20, 0x0, 0x0, 0x4, 0x10, + + /* U+5F92 "徒" */ + 0x0, 0x5, 0x80, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0xa, 0x30, 0x36, 0x0, + 0x2, 0x90, 0x61, 0x66, 0x6c, 0x86, 0x65, 0x0, + 0x7, 0x2, 0xf3, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xa, 0x30, 0x6, 0x30, + 0x0, 0x3f, 0x16, 0x66, 0x6c, 0x86, 0x66, 0x50, + 0x0, 0xad, 0x10, 0x32, 0xa, 0x50, 0x0, 0x0, + 0x7, 0x1c, 0x10, 0x79, 0xa, 0x30, 0x27, 0x0, + 0x21, 0xc, 0x10, 0x95, 0xa, 0x86, 0x66, 0x10, + 0x0, 0xc, 0x10, 0xc6, 0xa, 0x30, 0x0, 0x0, + 0x0, 0xc, 0x11, 0xa3, 0x6a, 0x30, 0x0, 0x0, + 0x0, 0xc, 0x18, 0x20, 0x3d, 0x83, 0x10, 0x10, + 0x0, 0xd, 0x44, 0x0, 0x0, 0x5a, 0xdf, 0x90, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F93 "従" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc3, 0x4, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x8, 0xb1, 0x5, 0xb0, 0x0, 0x99, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0xb7, 0x1, 0xa0, 0x0, + 0x1, 0xa0, 0x21, 0x0, 0x25, 0x6, 0x0, 0x0, + 0x6, 0x0, 0xba, 0x36, 0x66, 0x67, 0x6c, 0x80, + 0x0, 0x5, 0xb0, 0x1, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1e, 0x20, 0x4, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xae, 0x10, 0x1f, 0x20, 0xe0, 0x2, 0x0, + 0x7, 0x1c, 0x10, 0x1e, 0x0, 0xe6, 0x6a, 0x10, + 0x20, 0xc, 0x10, 0x2c, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x5c, 0x20, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa1, 0x93, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x12, 0x70, 0xa, 0xe3, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x0, 0x0, 0x5c, 0xec, 0xa1, + 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x25, 0x20, + + /* U+5F97 "得" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x3, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x5, 0xd2, 0xe, 0x66, 0x66, 0xa9, 0x0, + 0x0, 0x3b, 0x0, 0xd, 0x0, 0x0, 0x76, 0x0, + 0x3, 0x80, 0x1a, 0x1d, 0x66, 0x66, 0xa6, 0x0, + 0x4, 0x0, 0x8c, 0x1d, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x3, 0xd1, 0xe, 0x66, 0x66, 0xa7, 0x0, + 0x0, 0x1e, 0x20, 0x4, 0x0, 0x0, 0x25, 0x10, + 0x0, 0xae, 0x10, 0x76, 0x66, 0x67, 0xc6, 0x40, + 0x7, 0x1c, 0x10, 0x0, 0x0, 0x3, 0xa0, 0x50, + 0x10, 0xc, 0x16, 0x77, 0x66, 0x68, 0xc6, 0x71, + 0x0, 0xc, 0x10, 0x8, 0x40, 0x3, 0xa0, 0x0, + 0x0, 0xc, 0x10, 0x1, 0xe0, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x40, 0x3, 0xa0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2, 0x9d, 0x80, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+5F9E "從" */ + 0x0, 0x0, 0xa1, 0x5, 0x50, 0x1, 0x70, 0x0, + 0x0, 0x7, 0xc1, 0x9, 0x80, 0x3, 0xe1, 0x0, + 0x0, 0x2b, 0x0, 0xc, 0x20, 0x8, 0x60, 0x0, + 0x0, 0x90, 0x11, 0x1c, 0xa5, 0xc, 0x75, 0x0, + 0x5, 0x0, 0x9b, 0x64, 0x1e, 0x46, 0xc, 0x50, + 0x0, 0x3, 0xc1, 0x70, 0x1, 0x60, 0x2, 0x30, + 0x0, 0xd, 0x23, 0x0, 0x1, 0x60, 0x0, 0x0, + 0x0, 0xae, 0x10, 0x6, 0x10, 0xe0, 0x0, 0x0, + 0x7, 0x1d, 0x10, 0xf, 0x10, 0xd0, 0x24, 0x0, + 0x10, 0xd, 0x10, 0xd, 0x0, 0xe6, 0x65, 0x0, + 0x0, 0xd, 0x10, 0x2b, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x69, 0x81, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xa0, 0x1a, 0xe3, 0x0, 0x0, + 0x0, 0xd, 0x16, 0x20, 0x0, 0x4b, 0xec, 0xa2, + 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x14, 0x30, + + /* U+5FA1 "御" */ + 0x0, 0x2, 0xa0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x78, 0x6b, 0x5b, 0x66, 0xd0, + 0x3, 0x70, 0x51, 0x81, 0xa0, 0xd, 0x1, 0xa0, + 0x4, 0x1, 0xe6, 0x41, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0x9, 0x61, 0x1, 0xa3, 0x4d, 0x1, 0xa0, + 0x0, 0x4e, 0x4, 0x66, 0xc6, 0x5d, 0x1, 0xa0, + 0x1, 0x8d, 0x1, 0x51, 0xa0, 0xd, 0x1, 0xa0, + 0x6, 0xd, 0x1, 0xb1, 0xc8, 0x6d, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa1, 0xa0, 0xd, 0x1, 0xa0, + 0x0, 0xd, 0x1, 0xa4, 0xc5, 0x3d, 0x2b, 0x70, + 0x0, 0xd, 0xa, 0xd6, 0x0, 0xd, 0x1, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+5FA9 "復" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xb1, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0xd, 0x30, 0x0, 0x6, 0x10, + 0x0, 0x49, 0x0, 0x59, 0x66, 0x66, 0x66, 0x40, + 0x3, 0x90, 0x1, 0x77, 0x66, 0x66, 0x6a, 0x10, + 0x16, 0x0, 0xc5, 0xc, 0x10, 0x0, 0xd, 0x0, + 0x0, 0x6, 0xb0, 0xb, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x1f, 0x10, 0xb, 0x10, 0x0, 0xd, 0x0, + 0x0, 0xae, 0x0, 0xc, 0x9a, 0x66, 0x6c, 0x0, + 0x7, 0x2d, 0x0, 0x0, 0xb2, 0x0, 0x12, 0x0, + 0x10, 0xd, 0x0, 0x7, 0xb6, 0x66, 0xcb, 0x0, + 0x0, 0xd, 0x0, 0x45, 0x16, 0x5, 0xc0, 0x0, + 0x0, 0xd, 0x3, 0x30, 0x5, 0xac, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x8, 0xcb, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x72, 0x4, 0xeb, 0x80, + 0x0, 0x4, 0x2, 0x30, 0x0, 0x0, 0x5, 0x20, + + /* U+5FC3 "心" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xc, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x30, 0x43, 0x0, 0x0, 0x0, 0x0, 0x20, + 0xe1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x35, 0xe, + 0x10, 0x0, 0x0, 0x58, 0x0, 0x8, 0x50, 0xe1, + 0x0, 0x0, 0x0, 0xd6, 0x2, 0xf3, 0xe, 0x10, + 0x0, 0x2, 0x8, 0xc0, 0xac, 0x0, 0xe1, 0x0, + 0x0, 0x60, 0x37, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x8, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0x0, 0x9, 0xdb, 0xbb, 0xcf, + 0x70, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x0, + 0x0, + + /* U+5FC5 "必" */ + 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x3, 0x9, 0x90, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x1b, 0x7, 0x80, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x4, 0x0, + 0xd0, 0x0, 0x69, 0x5, 0x0, 0x0, 0x71, 0xd, + 0x0, 0xd, 0x10, 0x39, 0x0, 0xc, 0x0, 0xd0, + 0x8, 0x70, 0x0, 0xc5, 0x6, 0xe0, 0xd, 0x3, + 0xc0, 0x0, 0x6, 0xa0, 0x33, 0x0, 0xd1, 0xc2, + 0x0, 0x50, 0x12, 0x0, 0x0, 0xe, 0xb3, 0x0, + 0x6, 0x10, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x58, 0x5b, 0xee, 0xee, 0xee, + 0x60, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5FD8 "忘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x90, 0x0, 0x3, 0x0, 0x66, + 0x66, 0x66, 0x9a, 0x66, 0x68, 0xe5, 0x1, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x9, 0x10, 0x0, 0x1, 0xc6, 0x67, + 0x66, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0xd5, + 0x0, 0x40, 0x0, 0x6, 0x14, 0x90, 0x5, 0x20, + 0x13, 0xc2, 0x0, 0xd0, 0x49, 0x0, 0x0, 0x6, + 0x8, 0xb0, 0x9c, 0x4, 0xa0, 0x0, 0x0, 0xc0, + 0x16, 0x0, 0x0, 0x1d, 0xcc, 0xcc, 0xdc, 0x10, + 0x0, + + /* U+5FD9 "忙" */ + 0x0, 0xa, 0x10, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x20, 0x4, 0x70, + 0x1, 0xe, 0xa8, 0x6e, 0x66, 0x66, 0x66, 0x61, + 0x6, 0x2e, 0x4b, 0xe, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x3e, 0x2, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x0, 0x6, 0x10, + 0x0, 0xe, 0x0, 0x2a, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5FEB "快" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0x51, 0x0, + 0x0, 0xe, 0x40, 0x66, 0x6d, 0x66, 0xd5, 0x0, + 0x2, 0x2e, 0x6b, 0x0, 0x1c, 0x0, 0xc1, 0x0, + 0x7, 0x4e, 0xc, 0x0, 0x1b, 0x0, 0xc1, 0x0, + 0xe, 0x2e, 0x0, 0x0, 0x2b, 0x0, 0xc1, 0x0, + 0x2, 0xe, 0x5, 0x66, 0x8c, 0x66, 0xdb, 0xc1, + 0x0, 0xe, 0x1, 0x0, 0x77, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xb2, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x3, 0xb0, 0x37, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xb, 0x20, 0xb, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x94, 0x0, 0x2, 0xe7, 0x0, + 0x0, 0xf, 0x7, 0x30, 0x0, 0x0, 0x4f, 0xb1, + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+5FF5 "念" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd2, 0x9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x38, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x4, 0xb1, 0x7, 0x90, 0x7, 0xe9, 0x51, + 0x0, 0x76, 0x0, 0x2, 0x50, 0x1, 0x2a, 0x91, + 0x5, 0x10, 0x66, 0x66, 0x66, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x42, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x2d, 0x34, 0x0, 0x10, 0x0, + 0x0, 0x7, 0xd, 0x8, 0x60, 0x1, 0x48, 0x0, + 0x0, 0x87, 0xd, 0x0, 0x0, 0x7, 0xc, 0x70, + 0x2, 0xc1, 0xe, 0x0, 0x0, 0xc, 0x14, 0x50, + 0x0, 0x0, 0xc, 0xdc, 0xcc, 0xdd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+600E "怎" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xc, 0x79, + 0x66, 0x66, 0x69, 0xa0, 0x0, 0x75, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x70, 0xe, 0x66, 0x66, + 0xc7, 0x0, 0x16, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xe, 0x0, 0x0, 0xa, 0x10, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0x30, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x62, 0x47, 0x0, 0x1, 0x0, 0x2, 0x40, 0xe0, + 0xc, 0x40, 0x4, 0x90, 0x9, 0x20, 0xd0, 0x3, + 0x0, 0x50, 0x9a, 0x5e, 0x0, 0xe0, 0x0, 0x0, + 0x91, 0x19, 0x22, 0x0, 0xcc, 0xcc, 0xcc, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6012 "怒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x1, 0x76, 0x66, 0x8b, 0x0, + 0x6, 0x69, 0xa6, 0xa9, 0x13, 0x0, 0x96, 0x0, + 0x0, 0xa, 0x10, 0xb2, 0x7, 0x2, 0xd0, 0x0, + 0x0, 0x1b, 0x2, 0xb0, 0x2, 0x9c, 0x30, 0x0, + 0x0, 0x4, 0x8e, 0x80, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0xb6, 0x1b, 0x45, 0xd5, 0x0, + 0x0, 0x58, 0x10, 0x18, 0x71, 0x0, 0x2c, 0xc1, + 0x4, 0x10, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9, 0x13, 0xc1, 0x0, 0x50, 0x0, + 0x0, 0x16, 0xe, 0x0, 0xa6, 0x0, 0x6b, 0x10, + 0x0, 0xa5, 0xe, 0x0, 0x10, 0x5, 0xb, 0x70, + 0x2, 0xb0, 0xe, 0x0, 0x0, 0xb, 0x2, 0x10, + 0x0, 0x0, 0xa, 0xdd, 0xdd, 0xdb, 0x10, 0x0, + + /* U+6015 "怕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x3c, 0x10, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x80, 0x0, 0x20, 0x0, 0xa, + 0x70, 0xd, 0x67, 0x66, 0x6f, 0x10, 0x14, 0xa8, + 0xa0, 0xd0, 0x0, 0x0, 0xe0, 0x5, 0x6a, 0x3a, + 0xd, 0x0, 0x0, 0xe, 0x0, 0xc5, 0xa3, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0x5, 0xa, 0x30, 0xe, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa3, 0x0, 0xd0, + 0x0, 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xa3, 0x0, 0xd0, 0x0, + 0x0, 0xe0, 0x0, 0xa, 0x30, 0xd, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xa3, 0x0, 0xe6, 0x66, 0x66, + 0xe0, 0x0, 0xb, 0x40, 0xd, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x40, 0x0, 0x30, 0x0, 0x0, 0x10, + + /* U+601D "思" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0xd6, 0x66, 0xd7, 0x66, 0x8c, 0x0, 0x0, + 0xc, 0x10, 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, + 0xc1, 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xc, + 0x66, 0x6d, 0x76, 0x68, 0xa0, 0x0, 0x0, 0xc1, + 0x0, 0xb2, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x10, + 0xb, 0x20, 0x3, 0xa0, 0x0, 0x0, 0xd6, 0x66, + 0x86, 0x66, 0x8b, 0x0, 0x0, 0x5, 0x0, 0x47, + 0x0, 0x1, 0x10, 0x0, 0x3, 0x5, 0x80, 0x9a, + 0x0, 0x4, 0x0, 0x0, 0x90, 0x57, 0x0, 0x70, + 0x4, 0x2c, 0x30, 0x3e, 0x5, 0x70, 0x0, 0x0, + 0x80, 0x7c, 0x9, 0x70, 0x58, 0x0, 0x0, 0xd, + 0x30, 0x50, 0x0, 0x2, 0xdd, 0xdd, 0xdd, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6025 "急" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd9, 0x66, 0x6c, 0x20, 0x0, 0x0, 0x0, + 0x94, 0x0, 0x5, 0xb2, 0x0, 0x0, 0x0, 0x74, + 0x0, 0x1, 0x80, 0x3, 0x20, 0x0, 0x65, 0x76, + 0x66, 0x66, 0x66, 0xb9, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, 0x57, 0x66, + 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x4, 0x76, 0x66, 0x66, + 0x66, 0xb6, 0x0, 0x0, 0x0, 0x50, 0x77, 0x0, + 0x4, 0x10, 0x0, 0x5, 0xe, 0x10, 0xb5, 0x3, + 0x49, 0x10, 0x4, 0x70, 0xd0, 0x1, 0x0, 0x60, + 0x7c, 0x2, 0xe2, 0xe, 0x0, 0x0, 0x1c, 0x0, + 0x70, 0x1, 0x0, 0xcd, 0xcc, 0xce, 0xc1, 0x0, + 0x0, + + /* U+6027 "性" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x4, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x40, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x81, 0x1d, 0x0, 0xd0, 0x3, 0x0, + 0x2, 0x3e, 0x4b, 0x5a, 0x66, 0xe6, 0x6b, 0x50, + 0x7, 0x4e, 0x2, 0xa1, 0x0, 0xd0, 0x0, 0x0, + 0xe, 0x2e, 0x0, 0x80, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x4, 0x0, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0xe, 0x0, 0x18, 0x66, 0xe6, 0x78, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd0, 0x4, 0x80, + 0x0, 0xf, 0x5, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+606F "息" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x69, 0x86, 0x66, 0xb5, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, + 0x66, 0xd3, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xf, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, + 0xa, 0x0, 0x60, 0x0, 0x71, 0x0, 0x0, 0x0, + 0x60, 0x5d, 0x10, 0x0, 0x0, 0x0, 0x50, 0xe1, + 0xc, 0x10, 0x15, 0x70, 0x7, 0x50, 0xd0, 0x0, + 0x0, 0x70, 0xc7, 0x4f, 0x20, 0xd0, 0x0, 0x1, + 0xb0, 0x57, 0x12, 0x0, 0x9c, 0xcc, 0xcc, 0xa0, + 0x0, + + /* U+60A8 "您" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x10, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x80, 0xe, 0x30, 0x0, 0x1, 0x0, 0x1, + 0xe0, 0x5, 0xb6, 0x66, 0x68, 0xe2, 0x0, 0xae, + 0x1, 0x90, 0x6, 0x10, 0x94, 0x0, 0x65, 0xe0, + 0x60, 0x30, 0xd2, 0x2, 0x0, 0x14, 0xe, 0x0, + 0x4e, 0x2c, 0x16, 0x20, 0x0, 0x0, 0xe0, 0x1a, + 0x10, 0xc1, 0xc, 0x40, 0x0, 0xe, 0x7, 0x5, + 0x5e, 0x0, 0x3b, 0x0, 0x0, 0xd0, 0x0, 0x8, + 0xa0, 0x0, 0x10, 0x0, 0x0, 0x18, 0x19, 0x20, + 0x0, 0x10, 0x0, 0x2, 0x51, 0xd0, 0x3e, 0x0, + 0x26, 0x60, 0x0, 0xa4, 0x1d, 0x0, 0x50, 0x6, + 0xb, 0x70, 0x7e, 0x0, 0xd0, 0x0, 0x0, 0xd1, + 0x28, 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xcb, 0x10, + 0x0, + + /* U+60AA "悪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x7, + 0x66, 0x6d, 0x66, 0xd6, 0x66, 0x60, 0x0, 0x10, + 0xe, 0x0, 0xe0, 0x3, 0x0, 0x0, 0xe6, 0x6e, + 0x66, 0xe6, 0x6f, 0x20, 0x0, 0xe0, 0xe, 0x0, + 0xe0, 0xe, 0x0, 0x0, 0xe6, 0x6e, 0x66, 0xe6, + 0x6e, 0x0, 0x0, 0x60, 0xe, 0x0, 0xe0, 0x5, + 0x10, 0x26, 0x66, 0x6e, 0x66, 0xe6, 0x68, 0xf5, + 0x2, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x90, 0x4c, 0x10, 0x3, 0x10, 0x1, 0x64, + 0xa0, 0x9, 0x60, 0x20, 0xb1, 0x9, 0x54, 0xa0, + 0x0, 0x0, 0x70, 0x6a, 0x7e, 0x13, 0xa0, 0x0, + 0x0, 0xc2, 0x6, 0x1, 0x1, 0xed, 0xdd, 0xdd, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+60B2 "悲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc1, 0x0, 0x61, 0x1, 0x66, + 0x66, 0xd0, 0xc, 0x66, 0x66, 0x30, 0x0, 0x0, + 0xd, 0x0, 0xc1, 0x2, 0x30, 0x0, 0x36, 0x66, + 0xd0, 0xc, 0x66, 0x66, 0x0, 0x0, 0x0, 0xd, + 0x0, 0xc1, 0x0, 0x10, 0x3, 0x66, 0x66, 0xd0, + 0xc, 0x66, 0x6a, 0x80, 0x0, 0x0, 0xd, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x11, 0xb0, 0x1d, 0x20, + 0x5, 0x30, 0x0, 0x43, 0xd, 0x0, 0x86, 0x1, + 0xc, 0x50, 0xd, 0x20, 0xd0, 0x0, 0x0, 0x60, + 0x39, 0x6, 0xa0, 0xe, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0xdc, 0xcc, 0xcc, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+60C5 "情" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x20, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x10, 0x15, 0x0, + 0x0, 0xe, 0x0, 0x76, 0x6d, 0x66, 0x67, 0x10, + 0x2, 0xe, 0xb4, 0x0, 0xc, 0x10, 0x60, 0x0, + 0x7, 0x2d, 0x37, 0x17, 0x6d, 0x66, 0x63, 0x0, + 0xd, 0x2d, 0x0, 0x0, 0xc, 0x10, 0x5, 0x40, + 0x17, 0xd, 0x6, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xd, 0x0, 0x29, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x0, 0x2b, 0x0, 0x5a, 0xe0, 0x0, + 0x0, 0x5, 0x0, 0x14, 0x0, 0x4, 0x30, 0x0, + + /* U+60F3 "想" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc6, 0x66, 0x6e, 0x10, + 0x0, 0x0, 0xd0, 0x70, 0xd0, 0x0, 0xd, 0x0, + 0x4, 0x66, 0xf6, 0x62, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x6, 0xf6, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc, 0xe5, 0xd0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x74, 0xd0, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x3, 0x60, 0xd0, 0x0, 0xd6, 0x66, 0x6d, 0x0, + 0x4, 0x0, 0xd0, 0x0, 0xc0, 0x0, 0xa, 0x0, + 0x0, 0x0, 0x22, 0x9, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe, 0x20, 0xe4, 0x1, 0x33, 0x0, + 0x0, 0x46, 0xd, 0x0, 0x41, 0x5, 0xb, 0x60, + 0x1, 0xd4, 0xd, 0x0, 0x0, 0xb, 0x3, 0xa0, + 0x1, 0x50, 0xa, 0xcb, 0xbb, 0xbc, 0x10, 0x0, + + /* U+6108 "愈" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0x63, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x98, 0x0, 0x86, 0x0, 0x0, 0x0, 0x4, + 0x98, 0x66, 0x6b, 0xad, 0x83, 0x10, 0x46, 0x70, + 0x0, 0x40, 0x0, 0x4a, 0xe4, 0x0, 0xc, 0x66, + 0x6b, 0x7, 0xc, 0x20, 0x0, 0x0, 0xc5, 0x56, + 0x90, 0xb0, 0xc0, 0x0, 0x0, 0xc, 0x66, 0x69, + 0xb, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x2, 0x90, + 0x70, 0xc0, 0x0, 0x0, 0xc, 0x2, 0xb6, 0x0, + 0x8d, 0x0, 0x0, 0x0, 0x0, 0x91, 0x6a, 0x0, + 0x10, 0x0, 0x0, 0x14, 0xe, 0x0, 0xa2, 0x3, + 0x48, 0x0, 0xb, 0x40, 0xe0, 0x0, 0x2, 0x80, + 0x97, 0x2, 0x70, 0xc, 0xbb, 0xbb, 0xd9, 0x1, + 0x20, + + /* U+610F "意" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x66, 0x6c, 0x76, 0x6e, 0x40, 0x0, 0x0, + 0x0, 0x82, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x80, 0x28, 0x0, 0x7, 0x0, 0x76, 0x66, + 0x66, 0x67, 0x66, 0x67, 0x93, 0x0, 0x7, 0x66, + 0x66, 0x66, 0x6a, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x76, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xb, 0x76, 0x76, 0x66, + 0x6c, 0x0, 0x0, 0x1, 0x15, 0x32, 0xb3, 0x0, + 0x3, 0x0, 0x0, 0x80, 0x85, 0x4, 0x90, 0x30, + 0x6a, 0x0, 0x3c, 0x8, 0x40, 0x0, 0x7, 0x0, + 0xb6, 0x9, 0x40, 0x4d, 0xbb, 0xbb, 0xd4, 0x1, + 0x10, + + /* U+611B "愛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x47, 0xbc, 0x0, 0x1, 0x45, + 0x67, 0x97, 0x76, 0xb4, 0x10, 0x0, 0x9, 0x40, + 0x96, 0x6, 0x90, 0x0, 0x6, 0x68, 0xa6, 0x7b, + 0x6a, 0x66, 0xa3, 0x2d, 0x0, 0x30, 0x73, 0x0, + 0x1, 0xa3, 0x76, 0x70, 0xe0, 0x1e, 0x30, 0x46, + 0x40, 0x2, 0xc0, 0xd0, 0x3, 0x0, 0x90, 0xc7, + 0x6, 0x50, 0x9c, 0xcc, 0xcd, 0xa0, 0x26, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd6, 0x66, 0x6a, 0x10, 0x0, 0x0, 0x48, 0x35, + 0x0, 0x8c, 0x30, 0x0, 0x3, 0x50, 0x6, 0x89, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xde, 0x61, + 0x0, 0x0, 0x0, 0x36, 0x85, 0x1, 0x8e, 0xdb, + 0x91, 0x14, 0x10, 0x0, 0x0, 0x0, 0x25, 0x20, + + /* U+611F "感" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x66, 0x40, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x7, 0x50, 0xa1, 0x50, + 0x0, 0x3c, 0x66, 0x66, 0x69, 0xa6, 0x67, 0x71, + 0x0, 0x3a, 0x0, 0x0, 0x53, 0x90, 0x6, 0x0, + 0x0, 0x3a, 0x56, 0x66, 0x63, 0xb0, 0x6c, 0x10, + 0x0, 0x48, 0x27, 0x66, 0x91, 0xe2, 0xd1, 0x0, + 0x0, 0x66, 0x3a, 0x0, 0xd0, 0x9e, 0x40, 0x0, + 0x0, 0x92, 0x2a, 0x0, 0xd0, 0x9e, 0x20, 0x50, + 0x0, 0x90, 0x3c, 0x66, 0xb7, 0x54, 0xd4, 0x80, + 0x6, 0x10, 0x0, 0x2, 0x42, 0x0, 0x3d, 0xf1, + 0x2, 0x2, 0x39, 0x5, 0xb1, 0x0, 0x81, 0x32, + 0x0, 0x54, 0x3a, 0x0, 0x93, 0x4, 0x3d, 0x0, + 0x3, 0xe1, 0x2a, 0x0, 0x0, 0x18, 0xa, 0x10, + 0x2, 0x40, 0x1d, 0xbb, 0xbb, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+614B "態" */ + 0x0, 0x3a, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + 0x1b, 0x31, 0x20, 0x2b, 0x0, 0x83, 0x0, 0x58, + 0x21, 0x1a, 0x52, 0xb5, 0x75, 0x40, 0x7, 0xa7, + 0x53, 0x39, 0x2a, 0x0, 0x6, 0x30, 0xb, 0x55, + 0x5d, 0x21, 0xba, 0xaa, 0xa3, 0x0, 0xd6, 0x66, + 0xd0, 0x3c, 0x0, 0x52, 0x0, 0xd, 0x0, 0xd, + 0x2, 0xa2, 0x9b, 0x50, 0x0, 0xd6, 0x66, 0xd0, + 0x2b, 0x30, 0x4, 0x0, 0xd, 0x0, 0xd, 0x2, + 0xc1, 0x11, 0x93, 0x0, 0xc0, 0x4b, 0xa2, 0x8, + 0xaa, 0xa8, 0x10, 0x1, 0x8, 0x60, 0x4b, 0x10, + 0x11, 0x60, 0x0, 0x71, 0xa2, 0x0, 0x76, 0x5, + 0x8, 0x90, 0x6d, 0xa, 0x30, 0x0, 0x0, 0xa0, + 0x1d, 0x4, 0x20, 0x6d, 0xcc, 0xcc, 0xdc, 0x10, + 0x0, + + /* U+6163 "慣" */ + 0x0, 0xa, 0x10, 0x8, 0x66, 0x66, 0x6a, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x0, 0xd0, 0x1d, 0x0, + 0x0, 0xd, 0x15, 0x6e, 0x67, 0xd6, 0x7d, 0xc2, + 0x0, 0x4d, 0x81, 0x2b, 0x5, 0x80, 0x59, 0x0, + 0x4, 0x5d, 0x75, 0x6b, 0x6a, 0xa6, 0xa7, 0x0, + 0xb, 0x4d, 0x31, 0x12, 0x0, 0x0, 0x42, 0x0, + 0x6, 0xd, 0x0, 0xa6, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x90, 0x4, 0x94, 0x0, + 0x0, 0xe, 0x2, 0x93, 0x0, 0x0, 0x2e, 0x60, + 0x0, 0x3, 0x13, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+6167 "慧" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x6, + 0x66, 0xd6, 0xa3, 0x6c, 0x76, 0xc4, 0x0, 0x10, + 0xc, 0x1, 0x0, 0xb2, 0x2, 0x0, 0x3, 0x76, + 0xd7, 0x52, 0x7c, 0x76, 0x80, 0x2, 0x66, 0x6d, + 0x6a, 0x36, 0xc7, 0x67, 0x90, 0x2, 0x0, 0xc0, + 0x0, 0x1b, 0x20, 0x0, 0x0, 0x6, 0x76, 0x66, + 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x1, 0x86, 0x66, 0x66, + 0x66, 0xe0, 0x0, 0x0, 0x56, 0x66, 0x66, 0x66, + 0x6e, 0x0, 0x0, 0x1, 0x5, 0x7, 0x20, 0x0, + 0x50, 0x0, 0x0, 0x60, 0xd2, 0x1d, 0x2, 0x34, + 0x80, 0x0, 0x94, 0xd, 0x0, 0x20, 0x38, 0x7, + 0x90, 0x7, 0x0, 0x9c, 0xbb, 0xbd, 0x90, 0x3, + 0x0, + + /* U+616E "慮" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe6, 0x69, 0x80, 0x0, + 0x0, 0x14, 0x0, 0x0, 0xd0, 0x0, 0x5, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0xc6, 0x67, 0x6e, 0x60, + 0x0, 0x1c, 0x13, 0x55, 0xd5, 0x77, 0x44, 0x0, + 0x0, 0x1c, 0x4, 0x0, 0xd2, 0x22, 0x39, 0x0, + 0x0, 0x1b, 0x1, 0x0, 0x57, 0x88, 0xb3, 0x0, + 0x0, 0x2b, 0xe, 0x66, 0x99, 0x66, 0xe1, 0x0, + 0x0, 0x2a, 0xd, 0x66, 0x99, 0x66, 0xd0, 0x0, + 0x0, 0x48, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x0, + 0x0, 0x65, 0xe, 0x66, 0x77, 0x66, 0xc0, 0x0, + 0x0, 0x90, 0x13, 0x40, 0x5a, 0x20, 0x17, 0x0, + 0x0, 0x80, 0x90, 0xf1, 0x5, 0x51, 0x5, 0xc0, + 0x6, 0x1c, 0x80, 0xe0, 0x0, 0x6, 0x10, 0x50, + 0x5, 0x2, 0x0, 0xcc, 0xcc, 0xcd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61C9 "應" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x10, 0x0, + 0x96, 0x66, 0x66, 0xc6, 0x66, 0x6e, 0x80, 0xb, + 0x40, 0x24, 0x36, 0x37, 0x0, 0x0, 0x0, 0xb3, + 0xa, 0xa9, 0x90, 0x81, 0x4, 0x0, 0xb, 0x35, + 0xd1, 0xe6, 0x6c, 0x66, 0x70, 0x0, 0xb6, 0x7c, + 0x6d, 0x66, 0xd6, 0x95, 0x0, 0xc, 0x21, 0xc2, + 0xd0, 0xc, 0x1, 0x0, 0x0, 0xd0, 0x1c, 0xd, + 0x66, 0xd6, 0x95, 0x0, 0xd, 0x1, 0xc0, 0xd0, + 0xc, 0x0, 0x71, 0x0, 0xd0, 0x1c, 0xd, 0x66, + 0x66, 0x66, 0x30, 0x2b, 0x0, 0x30, 0x30, 0x0, + 0x0, 0x0, 0x5, 0x70, 0x26, 0x32, 0xb4, 0x0, + 0x28, 0x0, 0x92, 0x27, 0x75, 0x3, 0xd0, 0x40, + 0x79, 0x8, 0x1d, 0x47, 0x40, 0x0, 0x8, 0x21, + 0x84, 0x21, 0x50, 0x3d, 0xcc, 0xcc, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61F8 "懸" */ + 0x0, 0x66, 0x66, 0xa2, 0x0, 0x25, 0x9b, 0x0, + 0x0, 0x92, 0x0, 0xc0, 0x45, 0x9c, 0x31, 0x0, + 0x0, 0x97, 0x66, 0xd0, 0x16, 0x71, 0x88, 0x0, + 0x0, 0x97, 0x55, 0xd0, 0x3b, 0x8d, 0x81, 0x0, + 0x0, 0x97, 0x66, 0xd0, 0x5, 0x82, 0x8, 0x10, + 0x0, 0x92, 0x0, 0xc4, 0x6f, 0xcd, 0x78, 0xa0, + 0x7, 0xa6, 0xc6, 0x88, 0x55, 0xd, 0x0, 0x30, + 0x0, 0xc4, 0xc3, 0x70, 0x2d, 0x2d, 0x9, 0x30, + 0x7, 0x44, 0xd0, 0x95, 0x91, 0xc, 0x2, 0xe0, + 0x0, 0x5, 0x70, 0x2, 0x3, 0xc9, 0x0, 0x40, + 0x0, 0x10, 0xa4, 0x8, 0x70, 0x0, 0x32, 0x0, + 0x0, 0x80, 0xa2, 0x0, 0xc5, 0x4, 0xb, 0x50, + 0x6, 0xb0, 0xa3, 0x0, 0x10, 0xb, 0x3, 0xb0, + 0x6, 0x20, 0x6d, 0xcc, 0xcc, 0xda, 0x0, 0x0, + + /* U+6210 "成" */ + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0xa, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x2, 0xb2, 0x0, + 0x0, 0x87, 0x66, 0x66, 0xd8, 0x66, 0x6d, 0x50, + 0x0, 0x96, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x0, 0x77, 0x0, 0x63, 0x0, + 0x0, 0x95, 0x0, 0x41, 0x4a, 0x0, 0xd7, 0x0, + 0x0, 0x99, 0x66, 0xd6, 0x1d, 0x4, 0xd0, 0x0, + 0x0, 0xa3, 0x0, 0xc1, 0xd, 0x1b, 0x60, 0x0, + 0x0, 0xb2, 0x0, 0xc0, 0x8, 0xad, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xd0, 0x2, 0xf5, 0x0, 0x40, + 0x1, 0xa0, 0x78, 0xc0, 0x9, 0xbd, 0x10, 0x70, + 0x6, 0x40, 0xb, 0x40, 0x94, 0x8, 0xe6, 0xa0, + 0x8, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5d, 0xc0, + 0x20, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, + + /* U+6211 "我" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xa0, 0xd4, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xd9, 0x61, 0xd1, 0x8, 0x60, 0x0, + 0x1, 0x0, 0xb2, 0x0, 0xd1, 0x0, 0xd7, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0xc1, 0x0, 0x35, 0x0, + 0x16, 0x66, 0xd7, 0x66, 0xd7, 0x66, 0x7f, 0x30, + 0x2, 0x0, 0xb2, 0x0, 0xa3, 0x0, 0x10, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x85, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xb6, 0x63, 0x66, 0xb, 0x50, 0x0, + 0x1, 0x5a, 0xe5, 0x0, 0x49, 0x78, 0x0, 0x0, + 0x3f, 0x92, 0xb2, 0x0, 0xe, 0xb0, 0x0, 0x0, + 0x1, 0x0, 0xb2, 0x0, 0x5e, 0x70, 0x0, 0x40, + 0x0, 0x0, 0xb2, 0x8, 0x70, 0xc6, 0x0, 0x70, + 0x0, 0x43, 0xd5, 0x61, 0x0, 0x1c, 0xa4, 0x90, + 0x0, 0x1c, 0xc0, 0x0, 0x0, 0x0, 0x6d, 0xd0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+6216 "或" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0x1, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x18, 0x20, + 0x6, 0x66, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x10, 0xe, 0x0, 0x10, 0x0, + 0x0, 0xd6, 0x66, 0xe3, 0xd, 0x10, 0x99, 0x0, + 0x0, 0xd1, 0x0, 0xe0, 0xb, 0x30, 0xe3, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0x9, 0x53, 0xc0, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0x5, 0x9a, 0x50, 0x0, + 0x0, 0xc0, 0x0, 0x80, 0x0, 0xec, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x42, 0xe9, 0x0, 0x40, + 0x14, 0x68, 0xa9, 0x62, 0x2c, 0x4d, 0x50, 0x70, + 0x1e, 0x94, 0x0, 0x5, 0x91, 0x2, 0xe8, 0xa0, + 0x0, 0x0, 0x2, 0x63, 0x0, 0x0, 0x1a, 0xd0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+6226 "戦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x14, 0x60, 0x8, 0x10, 0x5b, 0x20, 0x0, 0xc, + 0x2c, 0x41, 0xb0, 0x4, 0xa4, 0x80, 0x0, 0x63, + 0x30, 0x52, 0x0, 0x4a, 0xd, 0x20, 0x1d, 0x66, + 0xa6, 0xe3, 0x4, 0xa0, 0x12, 0x0, 0xc0, 0x1b, + 0xd, 0x2, 0x6c, 0x55, 0x82, 0xd, 0x66, 0xc6, + 0xe3, 0x44, 0xa0, 0x33, 0x0, 0xc0, 0x1b, 0xd, + 0x0, 0x1b, 0xa, 0x90, 0x1c, 0x1, 0xb0, 0xd0, + 0x0, 0xd2, 0xd0, 0x1, 0xd6, 0x6c, 0x6d, 0x0, + 0xd, 0xa4, 0x0, 0x1, 0x1, 0xb0, 0x0, 0x0, + 0xba, 0x0, 0x5, 0x66, 0x6c, 0x67, 0xc1, 0x1d, + 0xb0, 0x4, 0x0, 0x1, 0xb0, 0x0, 0xc, 0x3c, + 0x53, 0x60, 0x0, 0x1b, 0x0, 0x1a, 0x30, 0x2e, + 0xb4, 0x0, 0x1, 0xb0, 0x38, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x24, + + /* U+6230 "戰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x7, 0x69, 0x18, 0x69, 0x20, 0xc5, 0x20, 0x0, + 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0x68, 0x0, + 0xb, 0xc, 0xc, 0xb, 0x0, 0xc2, 0xc, 0x0, + 0xc, 0x6d, 0xd, 0x6c, 0x0, 0xc2, 0x1, 0x0, + 0x5, 0x1, 0x2, 0x5, 0x0, 0xc6, 0x6a, 0x60, + 0x8, 0x86, 0xd6, 0x6d, 0x46, 0xc3, 0x3, 0x0, + 0x7, 0x40, 0xc0, 0x1b, 0x0, 0xa3, 0x2e, 0x30, + 0x7, 0x86, 0xd6, 0x6b, 0x0, 0x85, 0x96, 0x0, + 0x7, 0x40, 0xc0, 0x1b, 0x0, 0x69, 0xd0, 0x0, + 0x8, 0x86, 0xd6, 0x66, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0x0, 0xc0, 0x5, 0x10, 0x6f, 0x20, 0x30, + 0x8, 0x66, 0xd6, 0x66, 0x33, 0xa5, 0xc0, 0x80, + 0x0, 0x0, 0xc0, 0x0, 0x38, 0x0, 0xaa, 0xc0, + 0x0, 0x0, 0xd0, 0x4, 0x40, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x30, 0x10, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+623B "戻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x78, 0x66, 0x68, 0x66, 0x6d, 0x30, 0x0, 0x7, + 0x70, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x8, 0xa6, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xa5, 0x0, + 0x7, 0x20, 0x7, 0x0, 0x0, 0xb, 0x30, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x66, 0x6e, + 0x66, 0x6b, 0x90, 0x0, 0x2a, 0x1, 0x7, 0x76, + 0x0, 0x0, 0x0, 0x8, 0x40, 0x1, 0xd0, 0x27, + 0x0, 0x0, 0x0, 0xb0, 0x0, 0xb3, 0x0, 0x78, + 0x0, 0x0, 0x63, 0x0, 0x93, 0x0, 0x0, 0x9d, + 0x61, 0x6, 0x4, 0x71, 0x0, 0x0, 0x0, 0x6e, + 0x51, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+623F "房" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0xa0, 0x0, 0x32, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x66, 0x6b, 0x80, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0xd6, + 0x66, 0x66, 0x66, 0x6b, 0x50, 0x0, 0xd, 0x0, + 0x0, 0x84, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0xc0, 0x0, 0x20, 0x0, 0xd, 0x26, 0x68, + 0x86, 0x66, 0x6a, 0x50, 0x2, 0xa0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, 0xb, 0x96, + 0x66, 0xb7, 0x0, 0x9, 0x10, 0x1, 0xe0, 0x0, + 0xb, 0x30, 0x0, 0x90, 0x0, 0x97, 0x0, 0x0, + 0xd1, 0x0, 0x62, 0x0, 0x6a, 0x0, 0x0, 0xe, + 0x0, 0x15, 0x0, 0x77, 0x0, 0x1, 0x7c, 0xa0, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x50, 0x0, + + /* U+6240 "所" */ + 0x0, 0x0, 0x2, 0xa2, 0x0, 0x0, 0x4b, 0x40, + 0x0, 0x86, 0x78, 0x52, 0x85, 0x68, 0x75, 0x30, + 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0xc7, 0x66, 0xb1, 0xb3, 0x0, 0x0, 0x20, + 0x0, 0xc2, 0x0, 0xe0, 0xb8, 0x66, 0xa7, 0xa1, + 0x0, 0xc1, 0x0, 0xe0, 0xc3, 0x0, 0xd0, 0x0, + 0x0, 0xc1, 0x0, 0xe0, 0xd1, 0x0, 0xd0, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0xe0, 0x0, 0xd0, 0x0, + 0x0, 0xe0, 0x0, 0x23, 0xa0, 0x0, 0xd0, 0x0, + 0x0, 0xc0, 0x0, 0x9, 0x40, 0x0, 0xd0, 0x0, + 0x4, 0x70, 0x0, 0x1b, 0x0, 0x0, 0xd0, 0x0, + 0x8, 0x10, 0x0, 0x82, 0x0, 0x0, 0xd0, 0x0, + 0x16, 0x0, 0x4, 0x40, 0x0, 0x0, 0xe0, 0x0, + 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+624B "手" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0x80, 0x0, + 0x0, 0x35, 0x67, 0x8b, 0xba, 0x87, 0x60, 0x0, + 0x0, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x10, 0x0, + 0x0, 0x56, 0x66, 0x6e, 0x66, 0x6a, 0xe2, 0x0, + 0x0, 0x11, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x9, 0x30, + 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x68, 0x60, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x1e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+624D "才" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x6, 0x60, + 0x5, 0x76, 0x66, 0x66, 0xef, 0x66, 0x66, 0x60, + 0x0, 0x0, 0x0, 0x7, 0xbf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x70, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x65, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x6, 0x10, 0x0, 0x10, 0xf, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x4b, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, + + /* U+6253 "打" */ + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0x0, 0xe0, 0x4, 0x66, 0x6c, 0x67, 0x81, + 0x5, 0x66, 0xe6, 0xc3, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x61, 0x0, 0x1d, 0x0, 0x0, + 0x1, 0x5a, 0xe2, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0xb, 0x91, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x1, 0x21, 0xe0, 0x0, 0x11, 0x2d, 0x0, 0x0, + 0x0, 0x7f, 0xb0, 0x0, 0x17, 0xfa, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6255 "払" */ + 0x0, 0x0, 0x81, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x4, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x5, 0x66, 0xe6, 0xc2, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x61, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xe2, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0xc, 0xa2, 0xe0, 0x1, 0xa0, 0x0, 0x70, 0x0, + 0x1, 0x0, 0xe0, 0x6, 0x40, 0x0, 0x55, 0x0, + 0x0, 0x0, 0xe0, 0xa, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x0, 0xe0, 0x29, 0x0, 0x0, 0x9, 0x80, + 0x1, 0x11, 0xd0, 0xcb, 0x9a, 0x98, 0x69, 0xd0, + 0x0, 0x7f, 0xa0, 0x68, 0x41, 0x0, 0x4, 0xd0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+627E "找" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x1b, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1e, 0x8, 0x80, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0xb7, 0x0, + 0x5, 0x66, 0xe6, 0xc1, 0x1d, 0x0, 0x15, 0x0, + 0x1, 0x10, 0xe0, 0x13, 0x5e, 0x66, 0x7b, 0x50, + 0x0, 0x0, 0xe0, 0x24, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x61, 0xe, 0x0, 0x26, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0xd, 0x0, 0xca, 0x0, + 0x8, 0xe9, 0xe0, 0x0, 0xd, 0x18, 0xb0, 0x0, + 0x9, 0x20, 0xe0, 0x0, 0xa, 0xac, 0x10, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x8, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x6a, 0xd2, 0x0, 0x60, + 0x0, 0x0, 0xe0, 0x18, 0x40, 0x3d, 0x20, 0x90, + 0x2, 0x66, 0xd0, 0x40, 0x0, 0x4, 0xea, 0xb0, + 0x0, 0x2d, 0x60, 0x0, 0x0, 0x0, 0x2a, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6280 "技" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x6, 0x67, 0xd7, 0xa4, 0x66, 0xe6, 0x6a, 0x90, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xc6, 0x55, 0x66, 0xd6, 0x7b, 0x0, + 0x1, 0x6b, 0xd1, 0x0, 0x60, 0x0, 0x96, 0x0, + 0xb, 0x93, 0xb0, 0x0, 0x52, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x8, 0x8, 0x70, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x7, 0x7d, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x4, 0xf5, 0x0, 0x0, + 0x1, 0x3, 0xb0, 0x0, 0x89, 0x2c, 0x81, 0x0, + 0x1, 0x8f, 0x90, 0x68, 0x30, 0x0, 0x8f, 0xb2, + 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+628A "把" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x9, 0x66, 0x66, 0x6b, 0x30, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x6, 0x68, 0xc9, 0x8d, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0xd0, 0xe, 0x0, + 0x0, 0x3, 0xc7, 0x4d, 0x66, 0xa6, 0x6e, 0x0, + 0x3, 0x8c, 0xc0, 0xd, 0x0, 0x0, 0x4, 0x0, + 0xb, 0x73, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x70, + 0x1, 0x4, 0xa0, 0xd, 0x10, 0x0, 0x0, 0xc0, + 0x2, 0x9f, 0x80, 0x8, 0xdc, 0xcc, 0xcc, 0xd1, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6295 "投" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x11, 0x0, 0x40, 0x0, 0x0, + 0xb, 0x20, 0x3, 0xc6, 0x6e, 0x20, 0x0, 0x0, + 0xb2, 0x0, 0x3a, 0x0, 0xe0, 0x0, 0x16, 0x6d, + 0x7d, 0x45, 0x80, 0xe, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0xa2, 0x0, 0xd0, 0x0, 0x0, 0xb, 0x20, + 0x39, 0x0, 0x7, 0xaa, 0x80, 0x0, 0xb8, 0x78, + 0x66, 0x66, 0x89, 0x0, 0x5, 0xbe, 0x30, 0x1, + 0x40, 0x8, 0x80, 0x1, 0xb2, 0xb2, 0x0, 0x7, + 0x0, 0xd1, 0x0, 0x0, 0xb, 0x20, 0x0, 0x44, + 0x68, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xbc, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x2c, 0xc1, + 0x0, 0x0, 0x42, 0xd2, 0x0, 0x69, 0x13, 0xd8, + 0x20, 0x0, 0x9c, 0x4, 0x73, 0x0, 0x1, 0x9e, + 0x50, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+62BC "押" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0xd, 0x0, 0x2c, 0x66, 0xb6, 0x6f, 0x20, 0x0, + 0xd0, 0x2, 0xc0, 0xd, 0x0, 0xe0, 0x16, 0x5e, + 0x7c, 0x4c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd0, + 0x2, 0xd6, 0x6e, 0x66, 0xe0, 0x0, 0xd, 0x0, + 0x2c, 0x0, 0xd0, 0xe, 0x0, 0x0, 0xd6, 0x52, + 0xc0, 0xd, 0x0, 0xe0, 0x1, 0x8f, 0x20, 0x2c, + 0x0, 0xd0, 0xe, 0x4, 0xe5, 0xd0, 0x2, 0xd6, + 0x6e, 0x66, 0xe0, 0x2, 0xd, 0x0, 0x14, 0x0, + 0xd0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x21, 0xe0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x4, 0xdc, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+62C5 "担" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x40, 0x0, 0x5, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x10, + 0x4, 0x67, 0xd7, 0xb1, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x2, 0xb0, 0x10, 0xe6, 0x66, 0x6d, 0x0, + 0x0, 0x2, 0xc7, 0x40, 0xd0, 0x0, 0x1d, 0x0, + 0x0, 0x4b, 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0xb, 0xc4, 0xb0, 0x0, 0xd0, 0x0, 0x1d, 0x0, + 0x2, 0x2, 0xb0, 0x0, 0xe6, 0x66, 0x6e, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, 0x1c, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, 0x90, + 0x1, 0x8e, 0x80, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62C9 "拉" */ + 0x0, 0x1, 0xa1, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x7, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xf2, 0x0, 0x0, + 0x4, 0x55, 0xe6, 0xa0, 0x0, 0x50, 0x3, 0x0, + 0x1, 0x11, 0xd1, 0x15, 0x76, 0x66, 0x69, 0x50, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0xd4, 0x60, 0x50, 0x0, 0xc7, 0x0, + 0x0, 0x6, 0xe3, 0x0, 0x90, 0x0, 0xe1, 0x0, + 0x8, 0xd7, 0xd0, 0x0, 0x77, 0x2, 0xb0, 0x0, + 0x5, 0x20, 0xd0, 0x0, 0x4d, 0x5, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x2e, 0x9, 0x10, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x4, 0x9, 0x0, 0x0, + 0x0, 0x12, 0xd0, 0x0, 0x0, 0x16, 0x0, 0x60, + 0x0, 0x7f, 0xa0, 0x76, 0x66, 0x66, 0x67, 0x92, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62DB "招" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xa2, 0x5, 0x67, 0x86, 0x66, 0xd5, 0x0, + 0xa, 0x20, 0x0, 0x69, 0x0, 0xd, 0x1, 0x66, + 0xc7, 0xb4, 0x9, 0x50, 0x0, 0xe0, 0x0, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xa2, + 0x0, 0x58, 0x3, 0x25, 0xa0, 0x0, 0xa, 0x56, + 0x2a, 0x0, 0xa, 0xf4, 0x0, 0x5, 0xd7, 0x17, + 0x20, 0x0, 0x1, 0x20, 0x3e, 0x8b, 0x21, 0xd, + 0x66, 0x66, 0x7d, 0x0, 0x20, 0xa2, 0x0, 0xd0, + 0x0, 0x2, 0xb0, 0x0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xa2, 0x0, 0xd0, 0x0, + 0x2, 0xb0, 0x0, 0xb, 0x20, 0xd, 0x66, 0x66, + 0x7b, 0x0, 0x4c, 0xf0, 0x0, 0xc0, 0x0, 0x2, + 0x90, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+62E1 "拡" */ + 0x0, 0xb, 0x20, 0x0, 0x7, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x24, 0x22, 0x63, 0x25, 0x70, + 0x0, 0xe, 0x6, 0x3c, 0x44, 0x44, 0x44, 0x30, + 0x16, 0x6e, 0x66, 0x4b, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x3b, 0x0, 0x7b, 0x0, 0x0, + 0x0, 0xe, 0x5, 0x3b, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x1e, 0x80, 0x3a, 0x0, 0xd0, 0x0, 0x0, + 0x18, 0xdf, 0x0, 0x49, 0x5, 0x70, 0x0, 0x0, + 0x3b, 0x1e, 0x0, 0x58, 0xa, 0x0, 0x20, 0x0, + 0x0, 0xe, 0x0, 0x85, 0x18, 0x0, 0x28, 0x0, + 0x0, 0xe, 0x0, 0xc0, 0x81, 0x0, 0xa, 0x50, + 0x0, 0xe, 0x4, 0x72, 0xeb, 0xa8, 0x68, 0xd0, + 0x6, 0xdd, 0x8, 0x0, 0x51, 0x0, 0x1, 0x70, + 0x0, 0x31, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62EC "括" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x15, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x25, 0x8a, 0xca, 0x20, + 0x0, 0x2, 0xb0, 0x24, 0x42, 0xe0, 0x0, 0x0, + 0x6, 0x67, 0xd7, 0x90, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0xe0, 0x0, 0x40, + 0x0, 0x2, 0xb0, 0x67, 0x66, 0xe6, 0x67, 0x92, + 0x0, 0x2, 0xb4, 0x50, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x49, 0xd3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xd, 0xb5, 0xb0, 0xb, 0x66, 0xb6, 0x6d, 0x30, + 0x1, 0x2, 0xb0, 0xd, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x0, 0x2, 0xb0, 0xc, 0x10, 0x0, 0xe, 0x0, + 0x1, 0x35, 0xb0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x5f, 0x70, 0xd, 0x10, 0x0, 0xb, 0x0, + 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+62ED "拭" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x0, 0x0, 0xc4, 0x41, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xc3, 0x2e, 0x10, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xb3, 0x6, 0x10, + 0x26, 0x6d, 0x7c, 0x35, 0x66, 0xc7, 0x6c, 0x60, + 0x2, 0xb, 0x20, 0x1, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, 0xb, 0x36, 0x30, 0x4, 0x85, 0x0, 0x0, + 0x1, 0x5e, 0x81, 0x46, 0xe6, 0x77, 0x0, 0x0, + 0x4f, 0x8c, 0x20, 0x0, 0xe0, 0x3a, 0x0, 0x0, + 0x2, 0xb, 0x20, 0x0, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0xe0, 0xa, 0x40, 0x20, + 0x0, 0xb, 0x20, 0x3, 0xe7, 0x53, 0xd0, 0x60, + 0x0, 0xc, 0x23, 0xe9, 0x20, 0x0, 0x9b, 0x90, + 0x5, 0xce, 0x0, 0x10, 0x0, 0x0, 0x9, 0xc0, + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+62FF "拿" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc3, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xa1, 0x0, 0x98, 0x20, 0x0, 0x0, 0x58, + 0x46, 0x66, 0x69, 0x4a, 0xda, 0x62, 0x52, 0x8, + 0x66, 0x66, 0x6c, 0x21, 0x60, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xb, 0x76, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x30, 0x1, + 0x35, 0x99, 0x0, 0x0, 0x4, 0x45, 0x66, 0xe7, + 0x55, 0x41, 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x1a, 0x10, 0x0, 0x5, 0x76, 0x66, 0xe6, 0x66, + 0x63, 0x20, 0x28, 0x66, 0x66, 0x6e, 0x66, 0x66, + 0x9c, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xce, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + + /* U+6301 "持" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0xd0, 0x4, 0x66, 0xd7, 0x6a, 0x70, 0x16, 0x6e, + 0x6d, 0x20, 0xc, 0x20, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xc2, 0x0, 0x10, 0x0, 0xd, 0x4, + 0x76, 0x6a, 0x66, 0x6a, 0x60, 0x0, 0xd2, 0x61, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x5e, 0x60, 0x0, + 0x0, 0x59, 0x4, 0x1, 0xe8, 0xd0, 0x37, 0x66, + 0x69, 0xb6, 0x84, 0x1, 0xd, 0x0, 0x24, 0x0, + 0x59, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xa7, 0x5, + 0x90, 0x0, 0x0, 0xd, 0x0, 0x2, 0x90, 0x59, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x5, 0x90, + 0x0, 0x4, 0xce, 0x0, 0x0, 0x8, 0xe6, 0x0, + 0x0, 0x2, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+6307 "指" */ + 0x0, 0x27, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x3, 0xc0, 0x0, 0x66, 0x0, 0x0, + 0x2b, 0x0, 0x2b, 0x3, 0xba, 0x50, 0x4, 0x67, + 0xd7, 0xb4, 0xc5, 0x40, 0x0, 0x40, 0x11, 0x2b, + 0x0, 0x2b, 0x0, 0x0, 0x8, 0x0, 0x2, 0xb0, + 0x2, 0xe3, 0x22, 0x25, 0xe1, 0x0, 0x2b, 0x54, + 0x6, 0x88, 0x88, 0x84, 0x0, 0x3a, 0xc0, 0x1, + 0x86, 0x66, 0x6a, 0x20, 0xac, 0x4b, 0x0, 0x1d, + 0x0, 0x0, 0xe0, 0x2, 0x2, 0xb0, 0x0, 0xd0, + 0x0, 0xe, 0x0, 0x0, 0x2b, 0x0, 0xe, 0x66, + 0x66, 0xe0, 0x0, 0x2, 0xb0, 0x0, 0xd0, 0x0, + 0xe, 0x0, 0x11, 0x4b, 0x0, 0x1e, 0x66, 0x66, + 0xe0, 0x0, 0x6f, 0x70, 0x1, 0xc0, 0x0, 0xe, + 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+6319 "挙" */ + 0x0, 0x2, 0x0, 0x14, 0x0, 0x9, 0x20, 0x0, + 0x0, 0x3, 0xb0, 0xa, 0x60, 0x1e, 0x30, 0x0, + 0x0, 0x0, 0xa8, 0x4, 0xc0, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x21, 0x60, 0xa, 0x20, + 0x7, 0x66, 0x8c, 0x66, 0x69, 0x66, 0x67, 0x50, + 0x0, 0x0, 0xb3, 0x0, 0x2, 0x91, 0x0, 0x0, + 0x0, 0x8, 0x61, 0x46, 0xbe, 0x8c, 0x60, 0x0, + 0x0, 0x85, 0x34, 0x3d, 0x10, 0x2, 0xcf, 0x70, + 0x36, 0x46, 0x66, 0x6d, 0x66, 0x6c, 0x93, 0x0, + 0x0, 0x1, 0x0, 0xc, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x7f, 0x50, + 0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+6355 "捕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xc, 0x53, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x2, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x11, 0x1c, 0x11, 0x64, 0x70, + 0x5, 0x6e, 0x7b, 0x55, 0x5d, 0x55, 0x55, 0x50, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0x6f, 0x10, + 0x0, 0xd, 0x74, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x1, 0x8f, 0x10, 0xd6, 0x6d, 0x66, 0x6d, 0x0, + 0x2f, 0x6d, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6d, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xc, 0x0, 0xd, 0x0, + 0x5, 0xbd, 0x0, 0xd0, 0xd, 0x15, 0xab, 0x0, + 0x0, 0x21, 0x0, 0x50, 0x4, 0x0, 0x41, 0x0, + + /* U+6368 "捨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0xa, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5d, 0x40, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xc1, 0x72, 0x0, 0x0, + 0x2, 0x2d, 0x39, 0x9, 0x30, 0xb, 0x40, 0x0, + 0x4, 0x4d, 0x44, 0x84, 0x0, 0x6, 0xcb, 0x50, + 0x0, 0xd, 0x15, 0x33, 0x6c, 0x66, 0x38, 0x40, + 0x0, 0xd, 0x14, 0x10, 0xb, 0x10, 0x1, 0x0, + 0x0, 0x1d, 0x92, 0x76, 0x6d, 0x66, 0x7b, 0x10, + 0x1a, 0xce, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x7, 0xd, 0x10, 0x12, 0xb, 0x10, 0x41, 0x0, + 0x0, 0xd, 0x10, 0x2c, 0x66, 0x66, 0xd5, 0x0, + 0x0, 0xd, 0x10, 0x2a, 0x0, 0x0, 0xb2, 0x0, + 0x1, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xb2, 0x0, + 0x4, 0xdd, 0x0, 0x2c, 0x66, 0x66, 0xd3, 0x0, + 0x0, 0x21, 0x0, 0x13, 0x0, 0x0, 0x40, 0x0, + + /* U+6388 "授" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, 0x67, 0x0, + 0x0, 0xc, 0x10, 0x34, 0x56, 0x89, 0x87, 0x0, + 0x0, 0xc, 0x10, 0x11, 0x5, 0x0, 0x7b, 0x0, + 0x16, 0x6d, 0x7b, 0x1b, 0x17, 0x80, 0xc2, 0x0, + 0x0, 0xc, 0x10, 0x7, 0x53, 0x73, 0x60, 0x0, + 0x0, 0xc, 0x12, 0x86, 0x66, 0x6a, 0x69, 0x60, + 0x0, 0xc, 0x86, 0xa0, 0x0, 0x0, 0xa, 0x30, + 0x1, 0x9f, 0x15, 0x30, 0x0, 0x2, 0x51, 0x0, + 0x3e, 0x4c, 0x10, 0x7, 0x96, 0x6c, 0xb0, 0x0, + 0x2, 0xc, 0x10, 0x0, 0x70, 0x2d, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x29, 0xc2, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x1d, 0xb0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x3, 0xb3, 0x6c, 0x50, 0x0, + 0x5, 0xce, 0x2, 0x86, 0x0, 0x3, 0xbf, 0x90, + 0x0, 0x22, 0x13, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+6392 "排" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0xb4, 0xc, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x20, + 0x16, 0x6e, 0x89, 0x66, 0xd0, 0xd, 0x66, 0x90, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x1, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x72, 0x56, 0xd0, 0xd, 0x67, 0x90, + 0x17, 0xce, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x2b, 0x1d, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x5, 0x66, 0xd0, 0xd, 0x66, 0xc1, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x2, 0x1e, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x3, 0xca, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x20, 0x2, 0x0, 0x0, + + /* U+639B "掛" */ + 0x0, 0x9, 0x10, 0x0, 0x60, 0x0, 0x72, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x22, 0x66, 0xd7, 0x90, 0xd0, 0x0, + 0x6, 0x6e, 0x64, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x40, 0xd5, 0x0, + 0x0, 0xd, 0x4, 0x66, 0x76, 0x63, 0xd4, 0xc0, + 0x0, 0x1e, 0x60, 0x0, 0xd1, 0x0, 0xd0, 0xa5, + 0x18, 0xcd, 0x0, 0x0, 0xc0, 0x10, 0xd0, 0x11, + 0x8, 0xd, 0x2, 0x66, 0xd6, 0xa1, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x13, 0xd6, 0x52, 0xd0, 0x0, + 0x5, 0xda, 0x8, 0xe8, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+63A1 "採" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x2, 0x68, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x68, 0x99, 0x87, 0x10, + 0x0, 0xd, 0x0, 0x10, 0x12, 0x0, 0x5, 0x70, + 0x0, 0xd, 0x16, 0x65, 0xb, 0x40, 0xc, 0x40, + 0x16, 0x6e, 0x66, 0x1e, 0x34, 0xa0, 0x65, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x11, 0x41, 0x50, 0x0, + 0x0, 0xd, 0x4, 0x10, 0x2, 0xc0, 0x1, 0x20, + 0x0, 0xd, 0x82, 0x66, 0x6c, 0xd6, 0x68, 0x80, + 0x18, 0xce, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, + 0x1a, 0xd, 0x0, 0x0, 0xc4, 0xa8, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x52, 0xa2, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0x57, 0x2, 0xa0, 0x8a, 0x0, + 0x1, 0xd, 0x3, 0x60, 0x2, 0xa0, 0xb, 0xc3, + 0x5, 0xdd, 0x3, 0x0, 0x2, 0xb0, 0x0, 0x20, + 0x0, 0x21, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, + + /* U+63A2 "探" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x5, 0x0, 0x0, 0x0, 0x40, + 0x0, 0xd, 0x0, 0x2a, 0x66, 0x66, 0x68, 0xe1, + 0x0, 0xd, 0x0, 0x96, 0x21, 0x0, 0x7, 0x20, + 0x16, 0x6e, 0x6c, 0x40, 0xb9, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0x8d, 0x10, + 0x0, 0xd, 0x2, 0x57, 0x2, 0xc0, 0x9, 0x20, + 0x0, 0xd, 0x73, 0x30, 0x1, 0xb0, 0x0, 0x20, + 0x1, 0x8f, 0x12, 0x86, 0x6a, 0xd7, 0x68, 0xa0, + 0x2e, 0x5d, 0x0, 0x0, 0x5d, 0xb6, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x0, 0xc3, 0xb5, 0x40, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x51, 0xb0, 0xb2, 0x0, + 0x0, 0xd, 0x0, 0x67, 0x1, 0xb0, 0x3e, 0x50, + 0x0, 0xd, 0x5, 0x50, 0x1, 0xb0, 0x4, 0xb3, + 0x3, 0xbc, 0x11, 0x0, 0x2, 0xb0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A5 "接" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6, 0x70, 0x2, 0x0, + 0x0, 0xd, 0x1, 0x57, 0x66, 0x66, 0x6a, 0x20, + 0x16, 0x6e, 0x6c, 0x22, 0x70, 0xb, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa5, 0x1a, 0x0, 0x0, + 0x0, 0xd, 0x3, 0x66, 0x86, 0x97, 0x6a, 0x80, + 0x0, 0xd, 0x34, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x87, 0x0, 0x0, 0x0, + 0x4e, 0x6d, 0x16, 0x66, 0xe6, 0x66, 0x78, 0xb0, + 0x1, 0xd, 0x0, 0x6, 0x60, 0xa, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x79, 0xd6, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x0, 0x3c, 0x59, 0xc4, 0x0, + 0x3, 0xcc, 0x0, 0x49, 0x81, 0x0, 0x3e, 0x30, + 0x0, 0x11, 0x25, 0x30, 0x0, 0x0, 0x1, 0x10, + + /* U+63A7 "控" */ + 0x0, 0xa, 0x30, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5, 0xd1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x12, 0x0, 0x80, 0x0, 0x40, + 0x16, 0x6e, 0x89, 0x77, 0x55, 0x55, 0x58, 0xa0, + 0x0, 0xd, 0x10, 0xa1, 0x39, 0x3, 0x5, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xd5, 0x2, 0xb5, 0x0, + 0x0, 0xd, 0x56, 0x1a, 0x20, 0x0, 0x1e, 0x40, + 0x1, 0x7f, 0x51, 0x60, 0x0, 0x0, 0x16, 0x30, + 0x3f, 0x6d, 0x10, 0x26, 0x67, 0x96, 0x98, 0x0, + 0x1, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xa0, 0x2, 0x80, + 0x6, 0xae, 0x4, 0x76, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A8 "推" */ + 0x0, 0xa, 0x30, 0x2, 0xa0, 0x60, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x69, 0x3, 0xd0, 0x0, 0x0, + 0xc, 0x0, 0xa, 0x40, 0x8, 0x6, 0x11, 0x66, + 0xd6, 0xc3, 0xe6, 0x6d, 0x66, 0x74, 0x0, 0xc, + 0x0, 0x4f, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, + 0x18, 0xd0, 0xd, 0x1, 0x30, 0x0, 0xc, 0x75, + 0x5d, 0x66, 0xe6, 0x67, 0x0, 0x3a, 0xe0, 0x30, + 0xd0, 0xd, 0x0, 0x0, 0x4d, 0x2c, 0x0, 0xd, + 0x0, 0xd0, 0x3, 0x0, 0x10, 0xc0, 0x0, 0xd6, + 0x6e, 0x67, 0xa2, 0x0, 0xc, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0xd, + 0x0, 0x0, 0x1, 0xd, 0x0, 0xd, 0x66, 0xe6, + 0x6d, 0x60, 0x4c, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+63CF "描" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xc, 0x40, 0xa5, 0x0, 0x0, + 0xc, 0x10, 0x0, 0xd0, 0xa, 0x20, 0x0, 0x0, + 0xc1, 0x4, 0x4d, 0x44, 0xb5, 0xa4, 0x16, 0x6d, + 0x7c, 0x32, 0xd2, 0x2a, 0x42, 0x10, 0x10, 0xc1, + 0x0, 0xd, 0x0, 0xa2, 0x0, 0x0, 0xc, 0x10, + 0x0, 0x50, 0x3, 0x1, 0x0, 0x0, 0xc2, 0x49, + 0x66, 0x69, 0x66, 0xe2, 0x0, 0x3e, 0x80, 0xa3, + 0x0, 0xd0, 0xd, 0x2, 0xda, 0xd1, 0xa, 0x30, + 0xd, 0x0, 0xd0, 0x4, 0xc, 0x10, 0xa7, 0x66, + 0xe6, 0x6d, 0x0, 0x0, 0xc1, 0xa, 0x30, 0xd, + 0x0, 0xd0, 0x0, 0xc, 0x10, 0xa3, 0x0, 0xd0, + 0xd, 0x0, 0x31, 0xd1, 0xa, 0x76, 0x6e, 0x66, + 0xe0, 0x3, 0xcc, 0x0, 0xa2, 0x0, 0x0, 0xb, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63D0 "提" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x3, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0xd, 0x1, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x6, 0x6e, 0x6b, 0x1d, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x64, 0x6, 0x0, 0x0, 0x31, 0x10, + 0x2, 0x9f, 0x16, 0x76, 0x66, 0x96, 0x69, 0xa0, + 0x2e, 0x4d, 0x0, 0x43, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x87, 0x0, 0xd0, 0x7, 0x0, + 0x0, 0xd, 0x0, 0xc4, 0x0, 0xe6, 0x66, 0x20, + 0x0, 0xd, 0x2, 0x96, 0x40, 0xd0, 0x0, 0x0, + 0x3, 0x2d, 0x9, 0x0, 0x8b, 0xd2, 0x0, 0x10, + 0x2, 0xb9, 0x52, 0x0, 0x3, 0x9c, 0xef, 0x70, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63DB "換" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x96, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0xf7, 0x6b, 0x30, 0x0, + 0x0, 0xd, 0x0, 0x1a, 0x10, 0x4b, 0x20, 0x0, + 0x16, 0x6e, 0x86, 0x50, 0x0, 0x80, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x67, 0x66, 0x6e, 0x10, + 0x0, 0xd, 0x3, 0xd0, 0x87, 0x42, 0xd, 0x0, + 0x0, 0xd, 0x71, 0xd0, 0xb0, 0xb, 0x3d, 0x0, + 0x5, 0xbe, 0x0, 0xd6, 0x14, 0x24, 0x9d, 0x0, + 0xb, 0x2d, 0x0, 0xa0, 0x9, 0x70, 0xa, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x6d, 0x76, 0x67, 0xc1, + 0x0, 0xd, 0x1, 0x0, 0x4a, 0x42, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x9, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x2b, 0x30, 0x1, 0xd7, 0x30, + 0x5, 0xdb, 0x26, 0x60, 0x0, 0x0, 0x1b, 0xb2, + 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63EE "揮" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x12, 0x0, 0x0, 0x1, 0x40, + 0x0, 0xd, 0x0, 0x58, 0x66, 0x66, 0x6a, 0xc0, + 0x0, 0xd, 0x0, 0xd2, 0x0, 0xc1, 0x7, 0x0, + 0x0, 0xd, 0x33, 0x12, 0x22, 0xd2, 0x28, 0x10, + 0x16, 0x6e, 0x65, 0x25, 0x44, 0xd4, 0x44, 0x20, + 0x0, 0xd, 0x0, 0x18, 0x66, 0xe6, 0x6a, 0x20, + 0x0, 0xd, 0x4, 0x2b, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xe, 0x71, 0x1d, 0x66, 0xe6, 0x6e, 0x0, + 0x16, 0xcd, 0x0, 0x1b, 0x0, 0xd0, 0xd, 0x0, + 0x1c, 0x1d, 0x0, 0x2d, 0x66, 0xe6, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x20, + 0x0, 0xd, 0x1, 0x86, 0x66, 0xe6, 0x68, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x7, 0xda, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+63FA "揺" */ + 0x0, 0x9, 0x10, 0x0, 0x0, 0x2, 0x69, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x79, 0xaa, 0x98, 0x20, + 0x0, 0xd, 0x0, 0x20, 0x3, 0x0, 0xb, 0x50, + 0x0, 0xd, 0x23, 0x53, 0x8, 0x50, 0x2c, 0x10, + 0x6, 0x6e, 0x64, 0xd, 0x22, 0xd0, 0x81, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x10, 0x21, 0x22, 0x0, + 0x0, 0xd, 0x15, 0x47, 0x66, 0xa6, 0x7a, 0x10, + 0x0, 0x2e, 0x60, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2c, 0xbd, 0x4, 0x66, 0x66, 0xe6, 0x69, 0xb0, + 0x7, 0xd, 0x1, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa4, 0x0, 0xd0, 0x9, 0x20, + 0x0, 0xd, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xe, 0x0, 0xb0, 0x0, 0xd0, 0xd, 0x0, + 0x6, 0xec, 0x0, 0xc6, 0x66, 0x86, 0x6e, 0x0, + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+643A "携" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x19, 0x26, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x7, 0x90, 0xa6, 0x3, 0x0, 0x0, + 0xd0, 0x0, 0xd6, 0x6c, 0x66, 0x93, 0x17, 0x6e, + 0x89, 0x8d, 0x0, 0xc0, 0x6, 0x0, 0x0, 0xd0, + 0x35, 0xd6, 0x6d, 0x66, 0x50, 0x0, 0xd, 0x5, + 0xd, 0x66, 0xd6, 0x6a, 0x0, 0x0, 0xd8, 0x20, + 0xd0, 0xc, 0x0, 0x10, 0x4, 0xbf, 0x0, 0xe, + 0x66, 0xb6, 0x6a, 0x64, 0xe3, 0xd0, 0x0, 0x70, + 0x0, 0x3, 0x0, 0x1, 0xd, 0x0, 0x66, 0xe6, + 0x69, 0xb0, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x0, + 0xc8, 0x77, 0x0, 0xd, 0x0, 0x9, 0x50, 0x3, + 0x8, 0x60, 0x0, 0xd0, 0x5, 0xa0, 0x0, 0x0, + 0xc1, 0x5, 0xcc, 0x7, 0x60, 0x0, 0x19, 0xc9, + 0x0, 0x2, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+64C1 "擁" */ + 0x0, 0x7, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6, 0x90, 0x0, 0x40, + 0x0, 0xc, 0x3, 0x69, 0x66, 0x66, 0x66, 0x93, + 0x0, 0xc, 0x10, 0x1c, 0x2, 0xc9, 0x40, 0x0, + 0x6, 0x6d, 0x74, 0x72, 0x37, 0x90, 0xa0, 0x20, + 0x0, 0xc, 0x0, 0x62, 0xdd, 0x66, 0xa6, 0xa2, + 0x0, 0xc, 0x27, 0x8b, 0x6e, 0x10, 0xd0, 0x0, + 0x0, 0xe, 0x50, 0x36, 0x3c, 0x66, 0xe6, 0xa1, + 0x2, 0xcc, 0x0, 0x82, 0xbc, 0x10, 0xd0, 0x0, + 0xd, 0x5c, 0x9, 0x9a, 0x7c, 0x10, 0xd0, 0x0, + 0x1, 0xc, 0x3, 0x1b, 0xc, 0x66, 0xe6, 0xa0, + 0x0, 0xc, 0x0, 0x46, 0xc, 0x10, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x90, 0xc, 0x10, 0xd0, 0x40, + 0x5, 0xda, 0x6, 0x0, 0xc, 0x66, 0x76, 0x74, + 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+64C7 "擇" */ + 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xd, 0x0, 0xa6, 0x6b, 0x6c, 0x6d, 0x20, + 0x0, 0xd, 0x0, 0xa1, 0xb, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x22, 0xa6, 0x6b, 0x6c, 0x6d, 0x0, + 0x6, 0x6e, 0x65, 0x50, 0x1, 0xa0, 0x3, 0x0, + 0x0, 0xd, 0x0, 0x26, 0x66, 0xc6, 0xb5, 0x0, + 0x0, 0xd, 0x22, 0x2, 0x1, 0xa0, 0x0, 0x20, + 0x0, 0xd, 0x61, 0x86, 0x66, 0x96, 0x68, 0x90, + 0x0, 0x9e, 0x0, 0x0, 0xa3, 0x8, 0x60, 0x0, + 0xe, 0x6d, 0x0, 0x0, 0x49, 0x7, 0x24, 0x0, + 0x3, 0xd, 0x0, 0x57, 0x66, 0xc6, 0x65, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x66, 0xc6, 0x69, 0x90, + 0x0, 0xd, 0x1, 0x10, 0x1, 0xa0, 0x0, 0x0, + 0x5, 0xbc, 0x0, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, + + /* U+64D4 "擔" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x8a, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xe7, 0x67, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x8, 0x50, 0x0, + 0x0, 0xd, 0x14, 0x3d, 0x66, 0x69, 0x69, 0x90, + 0x6, 0x6e, 0x65, 0x4d, 0xc, 0x40, 0x85, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x62, 0x3a, 0x9, 0x10, + 0x0, 0xd, 0x16, 0xe, 0x66, 0x6a, 0x68, 0xb0, + 0x0, 0xd, 0x80, 0xc, 0x0, 0x0, 0x23, 0x0, + 0x3, 0xbe, 0x0, 0x2a, 0x27, 0x66, 0x65, 0x0, + 0x1e, 0x4d, 0x0, 0x47, 0x17, 0x66, 0x6a, 0x0, + 0x0, 0xd, 0x0, 0x83, 0x30, 0x0, 0x4, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x79, 0x66, 0x6e, 0x0, + 0x1, 0xd, 0x5, 0x20, 0x75, 0x0, 0xd, 0x0, + 0x3, 0xdc, 0x25, 0x0, 0x79, 0x66, 0x6c, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+64DA "據" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x66, 0x97, 0x0, + 0x0, 0xd, 0x0, 0x52, 0x2d, 0x22, 0x23, 0x30, + 0x0, 0xd, 0x23, 0xd4, 0x4b, 0x64, 0x49, 0x70, + 0x16, 0x6e, 0x65, 0xd0, 0x1c, 0x69, 0x43, 0x0, + 0x0, 0xd, 0x0, 0xc4, 0x4c, 0x0, 0x52, 0x0, + 0x0, 0xd, 0x13, 0xc0, 0x5, 0x99, 0x95, 0x0, + 0x0, 0xe, 0x70, 0xc5, 0x67, 0x86, 0x6a, 0x50, + 0x2, 0xbd, 0x0, 0xb0, 0x1d, 0x20, 0x48, 0x0, + 0x1e, 0x3d, 0x1, 0xa2, 0x74, 0xb4, 0x91, 0x0, + 0x0, 0xd, 0x4, 0x71, 0x58, 0x7a, 0x40, 0x0, + 0x0, 0xd, 0x8, 0x36, 0x36, 0xac, 0x73, 0x0, + 0x0, 0xd, 0x8, 0x3, 0x95, 0xc, 0xc, 0x90, + 0x6, 0xcb, 0x41, 0x43, 0x5, 0x8d, 0x0, 0x10, + 0x0, 0x41, 0x10, 0x0, 0x0, 0x42, 0x0, 0x0, + + /* U+652F "支" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x2a, 0x0, 0x76, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0x63, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x4, 0x10, 0x0, 0x0, 0x6, 0x86, + 0x66, 0x66, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0x80, 0x4d, 0xb5, + 0x10, 0x0, 0x3, 0x88, 0x10, 0x0, 0x6, 0xcf, + 0xf7, 0x15, 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x0, + + /* U+6539 "改" */ + 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x9, 0x70, 0x0, 0x0, 0x26, + 0x66, 0x6e, 0x30, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x4a, 0x0, 0x2, 0x50, 0x0, 0x0, + 0xd, 0xa, 0x86, 0x6a, 0x95, 0x0, 0x0, 0x0, + 0xd1, 0x85, 0x0, 0x94, 0x0, 0x1e, 0x66, 0x6c, + 0x70, 0x70, 0xb, 0x20, 0x0, 0xd0, 0x0, 0x2, + 0x8, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x63, 0x3a, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1, + 0xa9, 0x40, 0x0, 0xd, 0x0, 0x3, 0x40, 0x8, + 0xc0, 0x0, 0x0, 0xd0, 0x69, 0x30, 0x1, 0xcc, + 0x40, 0x0, 0x2f, 0xd4, 0x0, 0x3, 0xa1, 0x1d, + 0x60, 0x0, 0x70, 0x0, 0x17, 0x60, 0x0, 0x1c, + 0xc2, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+653E "放" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x2, 0xb, 0x30, 0x1, 0x10, + 0x6, 0x6a, 0x66, 0x6a, 0x2d, 0x66, 0x7b, 0x80, + 0x0, 0xe, 0x0, 0x0, 0x48, 0x0, 0x95, 0x0, + 0x0, 0xe, 0x0, 0x20, 0x86, 0x0, 0xb3, 0x0, + 0x0, 0xe, 0x66, 0xc5, 0x67, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xb1, 0x6, 0x23, 0xb0, 0x0, + 0x0, 0x2a, 0x0, 0xc0, 0x2, 0x88, 0x50, 0x0, + 0x0, 0x58, 0x0, 0xd0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x84, 0x0, 0xd0, 0x0, 0xab, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0xd0, 0x7, 0x79, 0x90, 0x0, + 0x4, 0x62, 0x8b, 0x80, 0x76, 0x0, 0xbb, 0x20, + 0x7, 0x0, 0x18, 0x27, 0x20, 0x0, 0x9, 0xb2, + 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+653F "政" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0xc, 0x40, 0x0, 0x0, + 0x7, 0x66, 0xa6, 0x89, 0x1e, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x4c, 0x66, 0x8a, 0x80, + 0x0, 0x10, 0xb1, 0x0, 0x84, 0x0, 0xb3, 0x0, + 0x0, 0xe1, 0xb1, 0x20, 0xa5, 0x0, 0xd1, 0x0, + 0x0, 0xd0, 0xb6, 0x96, 0x46, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0xb1, 0x5, 0x7, 0x3, 0xa0, 0x0, + 0x0, 0xd0, 0xb1, 0x0, 0x4, 0x58, 0x60, 0x0, + 0x0, 0xd0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0xd0, 0xb4, 0x65, 0x0, 0xba, 0x0, 0x0, + 0x3, 0xea, 0xb6, 0x0, 0x8, 0x9b, 0x50, 0x0, + 0x1d, 0x72, 0x0, 0x0, 0x95, 0x1, 0xd8, 0x10, + 0x0, 0x0, 0x0, 0x57, 0x10, 0x0, 0x1c, 0xb1, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6545 "故" */ + 0x0, 0x0, 0x81, 0x0, 0x2, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x6, 0xd, 0x11, 0x14, 0x50, + 0x6, 0x66, 0xe6, 0x66, 0x4d, 0x55, 0x9a, 0x40, + 0x0, 0x0, 0xd0, 0x0, 0x77, 0x0, 0x86, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x75, 0x0, 0xa3, 0x0, + 0x0, 0xa6, 0xc6, 0xc5, 0x3, 0x40, 0xd0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x81, 0xc0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xa7, 0x60, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x6e, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x1, 0xbd, 0x30, 0x0, + 0x0, 0xd6, 0x66, 0xe0, 0x2b, 0x42, 0xd5, 0x0, + 0x0, 0x90, 0x0, 0x27, 0x70, 0x0, 0x3d, 0xb1, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, + + /* U+6548 "效" */ + 0x0, 0x14, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x97, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x52, 0x1d, 0x0, 0x0, 0x2, 0x86, + 0x66, 0x66, 0x56, 0x70, 0x2, 0x60, 0x0, 0xa4, + 0x19, 0x20, 0xa6, 0x68, 0xc5, 0x0, 0x2c, 0x0, + 0x3e, 0x1d, 0x0, 0x57, 0x0, 0xa, 0x20, 0x2, + 0x66, 0x52, 0x8, 0x40, 0x6, 0x32, 0x2, 0xe1, + 0x51, 0x60, 0xc0, 0x0, 0x20, 0x36, 0x95, 0x0, + 0x9, 0x1b, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x8a, 0x50, 0x0, 0x0, 0xb, 0x8b, 0x0, 0x4, + 0xe0, 0x0, 0x0, 0x7, 0x60, 0xb6, 0x1, 0xbb, + 0x50, 0x0, 0x4, 0x60, 0x2, 0x52, 0x90, 0x1d, + 0x60, 0x4, 0x50, 0x0, 0x5, 0x60, 0x0, 0x2e, + 0xa1, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+6557 "敗" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0xa2, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0x6f, 0x12, 0xf1, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x5, 0x90, 0x0, 0x20, + 0x2, 0xa0, 0x0, 0xd, 0x9, 0x86, 0x69, 0xc3, + 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x0, 0xd, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x3a, 0x0, 0x2b, 0x0, + 0x2, 0xc6, 0x66, 0x6d, 0x72, 0x30, 0x58, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x40, 0x70, 0x94, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0x0, 0x70, 0xd0, 0x0, + 0x3, 0xc6, 0x66, 0x6d, 0x0, 0x3b, 0x80, 0x0, + 0x1, 0x26, 0x25, 0x11, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x2d, 0x21, 0xd4, 0x0, 0xa5, 0xd1, 0x0, + 0x0, 0xa2, 0x0, 0x37, 0x9, 0x20, 0x5d, 0x30, + 0x7, 0x10, 0x0, 0x2, 0x61, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, + + /* U+6559 "教" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x3, 0x20, 0xc4, 0x0, 0x0, + 0x0, 0x66, 0xe8, 0x8c, 0x60, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x78, 0x3, 0xb3, 0x37, 0x80, + 0x5, 0x66, 0xe6, 0xe8, 0xa8, 0x52, 0x6a, 0x20, + 0x0, 0x0, 0xb, 0x20, 0xa, 0x20, 0x67, 0x0, + 0x0, 0x66, 0xb9, 0x7a, 0x34, 0x50, 0x84, 0x0, + 0x0, 0x8, 0x31, 0x93, 0x50, 0x70, 0xb1, 0x0, + 0x1, 0x71, 0x39, 0x0, 0x0, 0x80, 0xc0, 0x0, + 0x3, 0x0, 0x4b, 0x35, 0x30, 0x59, 0x70, 0x0, + 0x4, 0x8a, 0xbb, 0x20, 0x0, 0x1f, 0x0, 0x0, + 0x3, 0x50, 0x49, 0x0, 0x0, 0xaa, 0x70, 0x0, + 0x0, 0x0, 0x49, 0x0, 0x9, 0x30, 0xc7, 0x0, + 0x0, 0x6, 0xb7, 0x4, 0x71, 0x0, 0x1c, 0xb1, + 0x0, 0x0, 0x60, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+6562 "敢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0x66, 0x6a, 0x90, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x70, 0x0, 0x0, + 0x26, 0x66, 0x6d, 0x6a, 0x8a, 0x76, 0x69, 0x90, + 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, 0x94, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x4b, 0x0, 0xb2, 0x0, + 0x0, 0xd6, 0x66, 0xd0, 0x83, 0x30, 0xd0, 0x0, + 0x0, 0xd0, 0x0, 0xd1, 0x50, 0x71, 0xc0, 0x0, + 0x0, 0xd6, 0x66, 0xd2, 0x0, 0x95, 0x80, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x7d, 0x20, 0x0, + 0x0, 0xd1, 0x35, 0xe6, 0x30, 0x4e, 0x0, 0x0, + 0x4c, 0xea, 0x62, 0xd0, 0x0, 0xb8, 0x90, 0x0, + 0x5, 0x0, 0x0, 0xd0, 0x9, 0x10, 0xaa, 0x10, + 0x0, 0x0, 0x0, 0xd1, 0x61, 0x0, 0x9, 0xb1, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+6570 "数" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x10, 0x1e, 0x3, 0x20, 0xd6, 0x0, 0x0, + 0x0, 0x93, 0xc, 0xb, 0x41, 0xe0, 0x0, 0x0, + 0x0, 0x3b, 0xc, 0x44, 0x5, 0x80, 0x0, 0x0, + 0x3, 0x68, 0x6d, 0x69, 0x9a, 0x86, 0x66, 0xd2, + 0x0, 0x10, 0xcd, 0x40, 0xd, 0x10, 0x4a, 0x0, + 0x0, 0x9, 0x3c, 0x7b, 0x56, 0x30, 0x58, 0x0, + 0x0, 0x82, 0xc, 0x4, 0x60, 0x60, 0x76, 0x0, + 0x4, 0x0, 0x67, 0x0, 0x0, 0x80, 0xa3, 0x0, + 0x3, 0x66, 0xd9, 0x6a, 0x10, 0x90, 0xd0, 0x0, + 0x1, 0x13, 0x90, 0x3b, 0x0, 0x68, 0xa0, 0x0, + 0x0, 0xb, 0x61, 0xb2, 0x0, 0x1f, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0xd8, 0x0, 0x9b, 0xa0, 0x0, + 0x0, 0x3, 0xa4, 0x8, 0x59, 0x50, 0x9c, 0x40, + 0x4, 0x65, 0x0, 0x4, 0x71, 0x0, 0x7, 0xb2, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+6574 "整" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x2, 0xd0, 0x0, 0x0, + 0x4, 0x66, 0xc8, 0x6a, 0x77, 0x70, 0x1, 0x30, + 0x1, 0x10, 0xa3, 0x1, 0xb, 0x66, 0xaa, 0x70, + 0x0, 0xb6, 0xc8, 0x6d, 0x3a, 0x30, 0xa3, 0x0, + 0x0, 0xc0, 0xa3, 0xc, 0x70, 0x71, 0xd0, 0x0, + 0x0, 0xc6, 0xe8, 0x6b, 0x10, 0x5b, 0x60, 0x0, + 0x0, 0x19, 0xd9, 0x91, 0x0, 0x6e, 0x50, 0x0, + 0x0, 0x84, 0xa3, 0x75, 0x18, 0x50, 0xba, 0x40, + 0x16, 0x10, 0x71, 0x4, 0x40, 0x0, 0x97, 0x70, + 0x0, 0x28, 0x66, 0x69, 0xb6, 0x66, 0x62, 0x0, + 0x0, 0x0, 0x72, 0x5, 0x90, 0x6, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x5, 0xb6, 0x66, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x5, 0x90, 0x0, 0x1, 0x0, + 0x4, 0x66, 0xe6, 0x69, 0xb6, 0x66, 0x6e, 0x60, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6587 "文" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x6, 0x10, + 0x5, 0x76, 0x67, 0x66, 0x66, 0x97, 0x6a, 0x80, + 0x0, 0x0, 0x6, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x20, 0x8, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x90, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x92, 0x5a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb4, 0x7c, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x20, 0x4, 0xdc, 0x73, 0x10, + 0x0, 0x57, 0x30, 0x0, 0x0, 0x5, 0xcf, 0x70, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+6599 "料" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd2, 0x0, + 0x1, 0x0, 0xd0, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0x60, 0xd0, 0xb4, 0x39, 0x0, 0xe0, 0x0, + 0x0, 0xe1, 0xd1, 0x80, 0x9, 0x70, 0xe0, 0x0, + 0x0, 0x60, 0xd5, 0x0, 0x1, 0x20, 0xe0, 0x0, + 0x3, 0x66, 0xe6, 0xb8, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x6, 0xe0, 0x0, 0x58, 0x0, 0xe0, 0x0, + 0x0, 0xc, 0xe9, 0x40, 0xa, 0x50, 0xe0, 0x0, + 0x0, 0x39, 0xd1, 0xd4, 0x1, 0x10, 0xe0, 0x91, + 0x0, 0xa1, 0xd0, 0x21, 0x1, 0x46, 0xe6, 0x51, + 0x5, 0x30, 0xd0, 0x37, 0x64, 0x10, 0xe0, 0x0, + 0x14, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+65AD "断" */ + 0x3, 0x0, 0x83, 0x0, 0x0, 0x0, 0x45, 0x1, + 0xe0, 0xb, 0x21, 0x3, 0x76, 0x88, 0x60, 0xc, + 0x71, 0xb2, 0x7a, 0x3a, 0x0, 0x0, 0x0, 0xc3, + 0xab, 0x2b, 0x13, 0xa0, 0x0, 0x0, 0xc, 0x5, + 0xb5, 0x20, 0x3a, 0x0, 0x0, 0x0, 0xc6, 0x6d, + 0x77, 0xa4, 0xc6, 0x66, 0xd4, 0xc, 0x3, 0xf4, + 0x0, 0x39, 0x1, 0xc0, 0x0, 0xc0, 0x8e, 0x69, + 0x3, 0x90, 0x1c, 0x0, 0xc, 0x9, 0xb2, 0x97, + 0x48, 0x1, 0xc0, 0x0, 0xc5, 0x2b, 0x21, 0x35, + 0x70, 0x1c, 0x0, 0xc, 0x40, 0xb2, 0x0, 0x93, + 0x1, 0xc0, 0x0, 0xc0, 0x9, 0x32, 0xb, 0x0, + 0x1c, 0x0, 0x4d, 0x66, 0x68, 0x88, 0x30, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x1c, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x10, + 0x0, + + /* U+65B0 "新" */ + 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x49, 0x3, 0x2, 0x56, 0xaa, 0x40, + 0x2, 0x86, 0x67, 0x89, 0x53, 0xa0, 0x0, 0x0, + 0x0, 0x38, 0x0, 0xb5, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xb, 0x21, 0x80, 0x2, 0xa0, 0x0, 0x0, + 0x5, 0x68, 0x69, 0x67, 0xc4, 0xc6, 0x69, 0xc0, + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xa0, 0xc1, 0x0, + 0x0, 0x0, 0x2a, 0x3, 0x23, 0x90, 0xc1, 0x0, + 0x1, 0x66, 0x7c, 0x68, 0x74, 0x80, 0xc1, 0x0, + 0x0, 0x16, 0x2a, 0x30, 0x6, 0x60, 0xc1, 0x0, + 0x0, 0x7a, 0x2a, 0x68, 0xa, 0x20, 0xc1, 0x0, + 0x0, 0xb0, 0x2a, 0xc, 0x1b, 0x0, 0xc1, 0x0, + 0x6, 0x31, 0x3a, 0x0, 0x81, 0x0, 0xc1, 0x0, + 0x3, 0x5, 0xe7, 0x5, 0x30, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0x10, 0x11, 0x0, 0x0, 0x40, 0x0, + + /* U+65B7 "斷" */ + 0x4, 0x13, 0x20, 0x15, 0x0, 0x0, 0x17, 0x20, + 0xb, 0x47, 0x20, 0x65, 0x8, 0x67, 0x86, 0x40, + 0xa, 0x59, 0xb3, 0xa9, 0x5a, 0x30, 0x0, 0x0, + 0xa, 0x35, 0x70, 0x48, 0x9, 0x30, 0x0, 0x0, + 0xa, 0x38, 0x63, 0x97, 0x39, 0x30, 0x0, 0x0, + 0xa, 0x58, 0x57, 0x74, 0x79, 0x86, 0x89, 0x90, + 0xa, 0x76, 0x66, 0x6a, 0x19, 0x30, 0xd0, 0x0, + 0xa, 0x26, 0x60, 0x66, 0x9, 0x30, 0xd0, 0x0, + 0xa, 0x28, 0x72, 0x77, 0x2a, 0x20, 0xd0, 0x0, + 0xa, 0x78, 0xa4, 0x9a, 0xb, 0x10, 0xd0, 0x0, + 0xa, 0x26, 0x50, 0x65, 0xb, 0x0, 0xd0, 0x0, + 0xa, 0x4b, 0x76, 0xc8, 0x5a, 0x0, 0xd0, 0x0, + 0xb, 0x20, 0x2, 0x73, 0x74, 0x0, 0xd0, 0x0, + 0x9, 0x66, 0x66, 0x64, 0x70, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, + + /* U+65B9 "方" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, 0x2, 0x60, + 0x7, 0x66, 0x66, 0x7b, 0x66, 0x66, 0x68, 0x81, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0x66, 0x69, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x8, 0x30, 0x3, 0x30, 0x7a, 0x0, 0x0, + 0x1, 0x62, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+65BC "於" */ + 0x0, 0x5, 0x40, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x46, 0x5, 0x98, 0x0, 0x0, + 0x6, 0x7e, 0x66, 0x65, 0xa, 0x46, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1c, 0x0, 0xc0, 0x0, + 0x0, 0xe, 0x0, 0x50, 0x74, 0x0, 0x7b, 0x0, + 0x0, 0xe, 0x66, 0xe4, 0x81, 0x0, 0xc, 0xc1, + 0x0, 0xd, 0x0, 0xd6, 0x2, 0xa9, 0x11, 0x30, + 0x0, 0x1b, 0x0, 0xd0, 0x0, 0x9, 0x80, 0x0, + 0x0, 0x49, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x1, 0xc0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x3, 0xa0, 0x18, 0xb7, 0x10, 0x0, + 0x2, 0x63, 0x5a, 0x60, 0x0, 0x2c, 0xe1, 0x0, + 0x7, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x92, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65BD "施" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x80, 0x30, 0x6b, 0x66, 0x69, 0xb0, + 0x5, 0x6a, 0x66, 0x96, 0xb0, 0x30, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x7, 0x20, 0xd3, 0x0, 0x0, + 0x0, 0x1b, 0x2, 0x22, 0xb1, 0xd0, 0x6, 0x0, + 0x0, 0x1d, 0x6b, 0x60, 0xd0, 0xd6, 0x6e, 0x10, + 0x0, 0x2a, 0x8, 0x42, 0xe7, 0xe0, 0xd, 0x0, + 0x0, 0x39, 0x9, 0x65, 0xd0, 0xd0, 0xd, 0x0, + 0x0, 0x57, 0x9, 0x30, 0xd0, 0xd0, 0xd, 0x0, + 0x0, 0x83, 0xa, 0x20, 0xd0, 0xd2, 0xb8, 0x0, + 0x0, 0xa0, 0xb, 0x10, 0xd0, 0xd0, 0x0, 0x50, + 0x3, 0x55, 0x5e, 0x0, 0xd0, 0x10, 0x0, 0xa0, + 0x6, 0x1, 0xc5, 0x0, 0xad, 0xcc, 0xcd, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65C1 "旁" */ + 0x0, 0x0, 0x0, 0x2a, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x93, 0x0, + 0x0, 0x47, 0x69, 0x66, 0x66, 0xa6, 0x64, 0x0, + 0x0, 0x0, 0x9, 0x70, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x40, 0x2, 0x80, 0x7, 0x0, 0x4, 0x0, + 0x0, 0xb6, 0x66, 0x68, 0x66, 0x66, 0x6f, 0x40, + 0x7, 0x80, 0x0, 0x8, 0x80, 0x0, 0x52, 0x0, + 0x3, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0x90, + 0x0, 0x10, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf6, 0x66, 0x6a, 0x60, 0x0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x31, 0x4c, 0x0, 0x0, + 0x0, 0x48, 0x20, 0x0, 0x1a, 0xf5, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+65C5 "旅" */ + 0x0, 0x8, 0x10, 0x0, 0x1b, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x5b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa0, 0x10, 0x93, 0x0, 0x5, 0x10, + 0x6, 0x68, 0x66, 0xa6, 0xb6, 0x66, 0x68, 0x50, + 0x0, 0x2b, 0x0, 0x5, 0x30, 0x0, 0x51, 0x0, + 0x0, 0x2b, 0x0, 0x44, 0x10, 0x5a, 0x94, 0x0, + 0x0, 0x2c, 0x66, 0xd0, 0xd5, 0x60, 0x0, 0x0, + 0x0, 0x39, 0x1, 0xb0, 0xd0, 0x60, 0xa, 0x10, + 0x0, 0x58, 0x2, 0xa0, 0xd0, 0x63, 0x94, 0x0, + 0x0, 0x75, 0x2, 0x90, 0xd0, 0x46, 0x0, 0x0, + 0x0, 0xb1, 0x4, 0x80, 0xd0, 0xb, 0x0, 0x0, + 0x1, 0x90, 0x6, 0x60, 0xd0, 0x7, 0x90, 0x0, + 0x7, 0x14, 0x9d, 0x10, 0xd5, 0x70, 0xbb, 0x30, + 0x14, 0x0, 0x63, 0x0, 0xe7, 0x0, 0x9, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+65CF "族" */ + 0x0, 0x16, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x40, 0x40, 0xd2, 0x22, 0x28, 0x50, + 0x5, 0x6c, 0x66, 0x76, 0x99, 0x44, 0x44, 0x30, + 0x0, 0xd, 0x0, 0x8, 0x7a, 0x0, 0x2, 0x0, + 0x0, 0xe, 0x6a, 0x51, 0xb6, 0x95, 0x6a, 0x10, + 0x0, 0xc, 0xc, 0x15, 0x40, 0xc0, 0x0, 0x0, + 0x0, 0x1c, 0xc, 0x5, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x2a, 0xc, 0x46, 0x66, 0xe6, 0x68, 0xd1, + 0x0, 0x58, 0xc, 0x11, 0x1, 0xc5, 0x0, 0x0, + 0x0, 0x83, 0xd, 0x0, 0x6, 0x76, 0x20, 0x0, + 0x0, 0xb0, 0xd, 0x0, 0x1c, 0x1, 0xb0, 0x0, + 0x4, 0x45, 0xc9, 0x1, 0xb2, 0x0, 0x6b, 0x10, + 0x6, 0x0, 0x51, 0x58, 0x10, 0x0, 0x8, 0xe3, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x10, + + /* U+65E2 "既" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0xc6, 0x66, 0xe1, 0x66, 0x6c, 0x67, 0x80, 0xd, + 0x0, 0xd, 0x6, 0x20, 0xd0, 0x0, 0x0, 0xd0, + 0x0, 0xd0, 0xb3, 0x1c, 0x0, 0x0, 0xd, 0x66, + 0x6d, 0xc, 0x2, 0xb0, 0x0, 0x0, 0xd0, 0x0, + 0xd0, 0xc0, 0x49, 0x0, 0x10, 0xd, 0x66, 0x6d, + 0x2d, 0x5a, 0xa5, 0x7a, 0x10, 0xd0, 0x0, 0x80, + 0x0, 0xa8, 0x0, 0x0, 0xd, 0x1, 0x0, 0x0, + 0xd, 0xc2, 0x0, 0x0, 0xd0, 0x9, 0x20, 0x4, + 0x8c, 0x0, 0x0, 0xd, 0x0, 0x6e, 0x10, 0xc1, + 0xc0, 0x3, 0x0, 0xd5, 0x92, 0xb4, 0x76, 0xc, + 0x0, 0x60, 0x1f, 0x90, 0x1, 0x57, 0x0, 0xc0, + 0xa, 0x0, 0x30, 0x0, 0x65, 0x0, 0x8, 0xcb, + 0xe3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+65E5 "日" */ + 0x20, 0x0, 0x0, 0x0, 0x30, 0xd6, 0x66, 0x66, + 0x66, 0xd5, 0xd1, 0x0, 0x0, 0x0, 0xb3, 0xc1, + 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, + 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc6, 0x66, + 0x66, 0x66, 0xc3, 0xc1, 0x0, 0x0, 0x0, 0xb3, + 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, 0x0, 0x0, + 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, 0xb3, 0xc1, + 0x0, 0x0, 0x0, 0xb3, 0xd6, 0x66, 0x66, 0x66, + 0xc3, 0xc0, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+65E9 "早" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x1, 0xa0, 0x0, 0xe0, 0x7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x1, 0x0, + 0x6, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+65F6 "时" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xe0, + 0x0, 0x0, 0xe0, 0x0, 0xc1, 0x2, 0xc0, 0x0, + 0x0, 0xe0, 0x81, 0xc1, 0x2, 0xc7, 0x66, 0x66, + 0xe6, 0x63, 0xc1, 0x2, 0xc0, 0x0, 0x0, 0xe0, + 0x0, 0xc6, 0x67, 0xc0, 0x82, 0x0, 0xe0, 0x0, + 0xc1, 0x2, 0xc0, 0x2e, 0x10, 0xe0, 0x0, 0xc1, + 0x2, 0xc0, 0xb, 0x30, 0xe0, 0x0, 0xc1, 0x2, + 0xc0, 0x1, 0x0, 0xe0, 0x0, 0xc6, 0x67, 0xc0, + 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x2, 0xb0, 0x0, + 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, 0x2, 0x34, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+6607 "昇" */ + 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc6, + 0x66, 0x76, 0x66, 0x6c, 0x0, 0x0, 0x1, 0x15, + 0xcd, 0x10, 0xa3, 0x0, 0x0, 0x3, 0x66, 0xe1, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xd1, 0x3, 0x0, 0x66, 0x66, 0xe6, 0x66, + 0x6e, 0x66, 0xd7, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x5, 0x91, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, + + /* U+660E "明" */ + 0x0, 0x0, 0x0, 0x74, 0x44, 0x4a, 0x18, 0x66, + 0x6a, 0xc, 0x32, 0x22, 0xd0, 0xd0, 0x1, 0xc0, + 0xc1, 0x0, 0xd, 0xd, 0x0, 0x1b, 0xc, 0x10, + 0x0, 0xd0, 0xd0, 0x1, 0xb0, 0xc7, 0x66, 0x6d, + 0xd, 0x66, 0x6b, 0xc, 0x10, 0x0, 0xd0, 0xd0, + 0x1, 0xb0, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x1b, + 0xd, 0x0, 0x0, 0xd0, 0xd6, 0x66, 0xb0, 0xe5, + 0x55, 0x5d, 0xd, 0x0, 0x1a, 0x1d, 0x0, 0x0, + 0xd0, 0x60, 0x0, 0x6, 0x70, 0x0, 0xd, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x92, 0x0, 0x43, 0x4c, 0x0, 0x2, 0x71, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+6613 "易" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0xc1, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd, 0x96, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x2, 0xe4, 0x0, 0x0, 0x10, + 0x0, 0x0, 0xa, 0xb6, 0x86, 0x68, 0x67, 0xd0, + 0x0, 0x68, 0x6, 0xa0, 0x5a, 0x4, 0xa0, 0x5, + 0x50, 0x1d, 0x10, 0xc3, 0x7, 0x70, 0x11, 0x1, + 0xb3, 0x5, 0xa0, 0xa, 0x40, 0x0, 0x58, 0x10, + 0x3c, 0x10, 0xd, 0x10, 0x4, 0x20, 0x5, 0xb1, + 0x20, 0x3c, 0x0, 0x0, 0x3, 0x74, 0x0, 0x2b, + 0xf5, 0x0, 0x0, 0x31, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+6614 "昔" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x1, 0xd0, 0x1, 0x0, + 0x0, 0x46, 0x6a, 0xa6, 0x66, 0xe6, 0x8e, 0x20, + 0x0, 0x11, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x0, 0x10, + 0x5, 0x66, 0x6a, 0xa6, 0x66, 0xe6, 0x6a, 0xd1, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xa6, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x1, 0xe6, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+661F "星" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x6b, 0x20, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xb7, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xb, + 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xb7, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0x6, 0x30, + 0xd, 0x30, 0x1, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0xe0, 0x0, 0x85, 0x0, 0x0, 0x3b, 0x66, 0x6e, + 0x66, 0x66, 0x50, 0x0, 0xa, 0x10, 0x0, 0xe0, + 0x0, 0x10, 0x0, 0x6, 0x24, 0x66, 0x6e, 0x66, + 0xac, 0x0, 0x0, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x34, 0x1, 0x86, 0x66, 0x66, 0xa6, 0x66, 0x6a, + 0xa1, + + /* U+6620 "映" */ + 0x0, 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x93, 0x0, 0x0, 0xa6, 0x6d, + 0x41, 0x10, 0x93, 0x3, 0x0, 0xb2, 0xd, 0x2, + 0xc6, 0xc8, 0x6d, 0x30, 0xa2, 0xd, 0x2, 0xa0, + 0x93, 0xc, 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xa2, + 0xc, 0x0, 0xa7, 0x6e, 0x2, 0xa0, 0xb1, 0xc, + 0x0, 0xa2, 0xd, 0x2, 0xa0, 0xc0, 0xc, 0x63, + 0xa2, 0xd, 0x36, 0x66, 0xd8, 0x66, 0x64, 0xa2, + 0xd, 0x0, 0x3, 0xa5, 0x0, 0x0, 0xa7, 0x6e, + 0x0, 0xa, 0x32, 0x60, 0x0, 0xb2, 0xa, 0x0, + 0x49, 0x0, 0x92, 0x0, 0x71, 0x0, 0x5, 0x90, + 0x0, 0x1d, 0x50, 0x0, 0x2, 0x75, 0x0, 0x0, + 0x3, 0xe7, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+6625 "春" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x55, 0x0, + 0x3, 0x66, 0x66, 0xc9, 0x66, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x8, 0x10, 0x0, + 0x0, 0x56, 0x69, 0xc6, 0x66, 0x66, 0x30, 0x0, + 0x26, 0x66, 0x6d, 0x86, 0x66, 0x66, 0x6d, 0x60, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x70, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x48, 0x0, 0x0, + 0x0, 0x85, 0xb7, 0x66, 0x66, 0xf7, 0xb4, 0x0, + 0x36, 0x10, 0xb3, 0x0, 0x0, 0xe0, 0x2c, 0xa1, + 0x0, 0x0, 0xa8, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6628 "昨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x20, 0xd, 0x30, 0x0, 0x0, 0xc, 0x66, + 0x7d, 0x2, 0xc0, 0x0, 0x4, 0x0, 0xb1, 0x2, + 0xb0, 0x88, 0xa6, 0x66, 0xa7, 0xb, 0x10, 0x2b, + 0xa, 0xe, 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb5, + 0x20, 0xe0, 0x0, 0x0, 0xb, 0x66, 0x7b, 0x40, + 0xe, 0x66, 0x9a, 0x0, 0xb1, 0x2, 0xb0, 0x0, + 0xe0, 0x0, 0x0, 0xb, 0x10, 0x2b, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xb1, 0x2, 0xb0, 0x0, 0xe4, + 0x45, 0xd3, 0xb, 0x10, 0x2b, 0x0, 0xe, 0x11, + 0x11, 0x10, 0xb6, 0x67, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xb, 0x10, 0x13, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+662F "是" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0xa5, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0xc, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x20, 0x35, 0x0, 0x76, 0x66, 0x66, + 0xb6, 0x66, 0x68, 0x81, 0x0, 0x1, 0xd2, 0xc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0xc7, + 0x66, 0x9c, 0x10, 0x0, 0xa, 0x90, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x82, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xb1, 0x0, 0x9e, 0x73, 0x21, + 0x12, 0x20, 0x82, 0x0, 0x0, 0x17, 0xbd, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+663C "昼" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xd1, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x86, 0xc0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x7, 0x50, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0xc, 0xa6, 0x66, 0x66, 0x6e, 0xc5, 0x0, + 0x0, 0x65, 0xa1, 0x0, 0x0, 0x1b, 0x1c, 0xd4, + 0x1, 0x80, 0xa7, 0x66, 0x66, 0x6b, 0x0, 0x40, + 0x5, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, + 0x0, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x50, + + /* U+6642 "時" */ + 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x52, + 0x26, 0x10, 0x0, 0xc0, 0x0, 0x0, 0xd4, 0x4c, + 0x40, 0x0, 0xc0, 0x6, 0x0, 0xd0, 0xb, 0x14, + 0x66, 0xd6, 0x66, 0x20, 0xd0, 0xb, 0x10, 0x0, + 0xc0, 0x0, 0x0, 0xd0, 0xb, 0x44, 0x44, 0xd5, + 0x45, 0xc2, 0xd6, 0x6d, 0x21, 0x11, 0x11, 0x83, + 0x10, 0xd0, 0xb, 0x10, 0x0, 0x0, 0xb2, 0x50, + 0xd0, 0xb, 0x67, 0x66, 0x66, 0xd6, 0x74, 0xd0, + 0xb, 0x10, 0x57, 0x0, 0xb1, 0x0, 0xd6, 0x6d, + 0x10, 0xa, 0x50, 0xb1, 0x0, 0xd0, 0xb, 0x10, + 0x1, 0x20, 0xb1, 0x0, 0x60, 0x1, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, + + /* U+6669 "晩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x30, + 0x4, 0x0, 0x1e, 0x20, 0x11, 0x0, 0xd, 0x66, + 0xe4, 0xa, 0x96, 0x6b, 0xa0, 0x0, 0xd0, 0xd, + 0x4, 0xa0, 0x1, 0x90, 0x0, 0xd, 0x0, 0xd1, + 0xb9, 0x66, 0xa6, 0x6b, 0x10, 0xd0, 0xd, 0x52, + 0xa0, 0xd, 0x0, 0xd0, 0xd, 0x66, 0xe0, 0x2a, + 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, 0x2, 0xc6, + 0x6e, 0x66, 0xd0, 0xd, 0x0, 0xd0, 0x27, 0xf, + 0x49, 0x4, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xf3, + 0x90, 0x0, 0xd, 0x66, 0xe0, 0x0, 0x6a, 0x39, + 0x0, 0x10, 0xd0, 0xa, 0x0, 0xd, 0x33, 0x90, + 0x5, 0x4, 0x0, 0x0, 0xb, 0x60, 0x29, 0x0, + 0x90, 0x0, 0x0, 0x48, 0x20, 0x1, 0xdb, 0xbd, + 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+666E "普" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x30, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf1, 0x7, 0x50, 0x2, 0x0, + 0x0, 0x66, 0x66, 0xd6, 0x6b, 0x66, 0x8d, 0x30, + 0x0, 0x3, 0x0, 0xe0, 0xe, 0x0, 0x70, 0x0, + 0x0, 0x6, 0x70, 0xe0, 0xe, 0x5, 0xb1, 0x0, + 0x0, 0x0, 0xf0, 0xe0, 0xe, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x30, 0xe0, 0xe, 0x22, 0x7, 0x70, + 0x17, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0xa6, 0x66, 0x66, 0x6c, 0x20, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6f, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+666F "景" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0x69, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x1, 0xd6, 0x69, 0x96, 0x6a, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x7, 0x50, + 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x66, 0x86, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x34, 0x0, 0xe0, 0x12, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x20, 0xe0, 0x39, 0x30, 0x0, + 0x0, 0x2a, 0x50, 0x0, 0xe0, 0x0, 0xbb, 0x0, + 0x5, 0x50, 0x0, 0x6b, 0xc0, 0x0, 0xa, 0x50, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+6674 "晴" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x86, 0x6a, + 0x36, 0x66, 0xc7, 0x68, 0xb0, 0xc0, 0xd, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x56, + 0xc7, 0x6c, 0x50, 0xc0, 0xd, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0xc1, 0x1d, 0x36, 0x66, 0xc7, 0x66, + 0xc6, 0xc5, 0x5d, 0x0, 0x10, 0x0, 0x2, 0x0, + 0xc0, 0xd, 0x0, 0xd6, 0x66, 0x6e, 0x20, 0xc0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x0, 0xc0, 0xd, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0xc6, 0x6e, 0x0, + 0xd6, 0x66, 0x6e, 0x0, 0xd0, 0xa, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0x20, 0x0, 0x0, 0xd0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x5, 0xae, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x32, 0x0, + + /* U+667A "智" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x66, 0x8b, 0x8, 0x66, 0x6b, 0x10, 0x9, + 0x12, 0xa0, 0x0, 0xd0, 0x0, 0xd0, 0x2, 0x30, + 0x48, 0x3, 0xd, 0x0, 0xd, 0x0, 0x76, 0x69, + 0xa6, 0xa4, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xb8, + 0x30, 0xd, 0x0, 0xd, 0x0, 0x0, 0x4a, 0x9, + 0xb0, 0xd6, 0x66, 0xd0, 0x0, 0x3a, 0x10, 0xa, + 0x15, 0x0, 0x3, 0x0, 0x55, 0xc, 0x66, 0x66, + 0x66, 0xd4, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6687 "暇" */ + 0x0, 0x0, 0x21, 0x14, 0x12, 0x22, 0x60, 0x8, + 0x66, 0xa5, 0x95, 0xc3, 0x44, 0x4d, 0x10, 0xc0, + 0xc, 0x46, 0xb, 0x0, 0x0, 0xc0, 0xc, 0x0, + 0xc4, 0x60, 0xb0, 0x0, 0xc, 0x0, 0xc0, 0xc, + 0x4a, 0x6d, 0x16, 0x66, 0xd0, 0xc, 0x66, 0xc4, + 0x60, 0x30, 0x0, 0x1, 0x0, 0xc0, 0xc, 0x46, + 0x2, 0x23, 0x33, 0x81, 0xc, 0x0, 0xc4, 0xa6, + 0x72, 0x73, 0x3e, 0x10, 0xc0, 0xc, 0x46, 0x0, + 0x6, 0x4, 0x90, 0xc, 0x66, 0xc4, 0xa6, 0xb2, + 0x44, 0xb3, 0x0, 0xc0, 0x8, 0x46, 0x0, 0x0, + 0xca, 0x0, 0x3, 0x0, 0x4, 0x60, 0x0, 0x2c, + 0xb0, 0x0, 0x0, 0x0, 0x56, 0x0, 0x39, 0x6, + 0xd5, 0x0, 0x0, 0x5, 0x60, 0x54, 0x0, 0x4, + 0x81, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+6691 "暑" */ + 0x0, 0x0, 0x96, 0x66, 0x66, 0x6b, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x10, 0x0, + 0x0, 0x0, 0x80, 0xd, 0x20, 0x6, 0xc9, 0x0, + 0x0, 0x3, 0x66, 0x6e, 0x6d, 0x2b, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1, 0xc6, 0x3, 0x0, + 0x5, 0x76, 0x66, 0x6c, 0x8d, 0x96, 0x6c, 0x80, + 0x0, 0x0, 0x0, 0x29, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xb7, 0x66, 0x6c, 0x70, 0x0, + 0x1, 0x57, 0x6b, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x12, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x1b, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0x2d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+6696 "暖" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0x60, 0x30, + 0x4, 0x24, 0x56, 0x87, 0x66, 0x30, 0xd6, 0x6d, + 0x41, 0x50, 0x74, 0xe, 0x20, 0xd0, 0xb, 0x10, + 0x94, 0x29, 0x54, 0x0, 0xd0, 0xb, 0x16, 0x87, + 0x66, 0x97, 0xb0, 0xd0, 0xb, 0x10, 0x8, 0x50, + 0x0, 0x0, 0xd5, 0x5d, 0x36, 0x6c, 0x86, 0x66, + 0xb6, 0xd0, 0xb, 0x12, 0xd, 0x0, 0x0, 0x0, + 0xd0, 0xb, 0x10, 0x2d, 0x66, 0x6a, 0x30, 0xd0, + 0xb, 0x10, 0x97, 0x40, 0x4c, 0x10, 0xd6, 0x6d, + 0x21, 0xa0, 0x82, 0xd2, 0x0, 0xd0, 0x8, 0x1a, + 0x10, 0x2f, 0x50, 0x0, 0xa0, 0x0, 0x62, 0x1, + 0xa8, 0xd4, 0x0, 0x0, 0x1, 0x10, 0x58, 0x10, + 0x3d, 0xd7, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x50, + + /* U+6697 "暗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x51, 0x15, + 0x0, 0x0, 0x58, 0x3, 0x30, 0xd5, 0x5d, 0x24, + 0x76, 0x66, 0x76, 0x50, 0xd0, 0xd, 0x0, 0x36, + 0x0, 0x97, 0x0, 0xd0, 0xd, 0x0, 0xb, 0x40, + 0xb0, 0x0, 0xd0, 0xd, 0x0, 0x4, 0x14, 0x30, + 0x72, 0xd6, 0x6e, 0x28, 0x66, 0x66, 0x66, 0x64, + 0xd0, 0xd, 0x0, 0x30, 0x0, 0x4, 0x0, 0xd0, + 0xd, 0x0, 0xe6, 0x66, 0x6e, 0x30, 0xd0, 0xd, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x0, + 0xd5, 0x55, 0x5e, 0x0, 0xd0, 0xb, 0x0, 0xd0, + 0x0, 0xd, 0x0, 0x40, 0x0, 0x0, 0xd6, 0x66, + 0x6e, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+66C7 "曇" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x4a, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x47, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x4a, 0x66, + 0x66, 0x66, 0xd0, 0x0, 0x0, 0x4a, 0x66, 0x66, + 0x66, 0xc0, 0x0, 0x0, 0x33, 0x22, 0x22, 0x22, + 0x84, 0x0, 0x2, 0x33, 0x33, 0xc4, 0x33, 0x33, + 0x21, 0xa, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc8, + 0x77, 0x46, 0x60, 0xb1, 0x36, 0x61, 0x50, 0x0, + 0x46, 0x60, 0x80, 0x36, 0x60, 0x0, 0x0, 0x37, + 0x66, 0x66, 0x68, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xa0, 0x57, 0x66, 0x6a, 0xa6, + 0x66, 0x66, 0x62, 0x0, 0x0, 0x59, 0x20, 0x7, + 0x40, 0x0, 0x0, 0x2b, 0xa6, 0x67, 0x66, 0xd5, + 0x0, 0x0, 0x18, 0x53, 0x10, 0x0, 0x13, 0x0, + + /* U+66DC "曜" */ + 0x0, 0x0, 0x1, 0x11, 0x50, 0x11, 0x51, 0x96, + 0x6b, 0x38, 0x55, 0xd3, 0x75, 0xc3, 0xd0, 0xd, + 0x3, 0xc0, 0xc0, 0x97, 0xb1, 0xc0, 0xd, 0x0, + 0x41, 0xc0, 0x5, 0xb1, 0xc0, 0xd, 0x5, 0x75, + 0xc2, 0x86, 0xc1, 0xc6, 0x6d, 0xa5, 0x30, 0x79, + 0x30, 0x70, 0xc0, 0xd, 0x0, 0xe5, 0xb, 0x40, + 0x0, 0xc0, 0xd, 0x6, 0xa6, 0x6b, 0x86, 0xc2, + 0xc0, 0xd, 0x1e, 0x30, 0xb, 0x1, 0x0, 0xc6, + 0x6d, 0x6a, 0x75, 0x5d, 0x5a, 0x60, 0xd0, 0xd, + 0xa, 0x30, 0xb, 0x1, 0x0, 0xc0, 0x2, 0xa, + 0x76, 0x6d, 0x68, 0x60, 0x10, 0x0, 0xa, 0x30, + 0xb, 0x0, 0x40, 0x0, 0x0, 0xa, 0x76, 0x68, + 0x66, 0x94, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, + + /* U+66F2 "曲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0xc, 0x20, 0x0, 0x0, 0x1, 0xc0, 0xd, + 0x0, 0x0, 0x0, 0x1, 0xc0, 0xd, 0x0, 0x0, + 0xa7, 0x66, 0xd6, 0x6e, 0x66, 0xc5, 0xb3, 0x1, + 0xc0, 0xd, 0x0, 0xc2, 0xb3, 0x1, 0xc0, 0xd, + 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, + 0xa8, 0x66, 0xd6, 0x6e, 0x66, 0xd2, 0xa3, 0x1, + 0xc0, 0xd, 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, + 0x0, 0xc2, 0xa3, 0x1, 0xc0, 0xd, 0x0, 0xc2, + 0xb3, 0x1, 0xc0, 0xd, 0x0, 0xc2, 0xb8, 0x66, + 0xc6, 0x6c, 0x66, 0xd2, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xa1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+66F4 "更" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x10, + 0x5, 0x76, 0x66, 0x67, 0xb6, 0x66, 0x68, 0x50, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x66, 0x67, 0xd6, 0x66, 0xf2, 0x0, + 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x67, 0xd6, 0x66, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x2, 0xb0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x3, 0xa0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x69, 0xb6, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0x12, 0x8, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x75, 0xc8, 0x42, 0x10, 0x10, + 0x1, 0x57, 0x71, 0x0, 0x5, 0x9c, 0xef, 0x80, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+66F8 "書" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0xe6, 0x66, 0x6b, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd1, 0x40, 0x47, 0x66, + 0x66, 0xe6, 0x66, 0x6e, 0x89, 0x10, 0x4, 0x66, + 0x6e, 0x66, 0x66, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x5, 0x0, 0x0, 0x36, 0x66, 0x6e, + 0x66, 0x66, 0xa7, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x75, 0x5, 0x76, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x50, 0x0, 0xc6, 0x66, 0x66, 0x66, + 0x6e, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x6d, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + + /* U+66FE "曾" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x10, 0x0, 0xb5, 0x0, 0x0, 0x4, 0xb0, 0x2, + 0xa0, 0x0, 0x9, 0x66, 0x96, 0x6a, 0x66, 0x88, + 0xd, 0x10, 0x0, 0xd0, 0x10, 0x67, 0xd, 0x1a, + 0x0, 0xd0, 0x97, 0x67, 0xd, 0x9, 0x60, 0xd1, + 0x90, 0x67, 0xd, 0x1, 0x10, 0xd3, 0x0, 0x67, + 0xd, 0x66, 0x66, 0x66, 0x66, 0x95, 0x0, 0x66, + 0x66, 0x66, 0x69, 0x20, 0x0, 0xa2, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xa7, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xa7, 0x66, 0x66, + 0x6e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, + + /* U+66FF "替" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0xd2, 0x40, 0xd, 0x5, 0x10, 0x3, 0x66, 0xd6, + 0x63, 0x6e, 0x66, 0x40, 0x0, 0x2, 0xa1, 0x30, + 0xd, 0x0, 0x50, 0x6, 0x69, 0xa6, 0x65, 0x7c, + 0x96, 0x71, 0x0, 0xb, 0x78, 0x0, 0x84, 0x71, + 0x0, 0x0, 0x57, 0x7, 0x75, 0x70, 0x1b, 0x30, + 0x4, 0x61, 0x0, 0x64, 0x0, 0x33, 0xd5, 0x22, + 0xe, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xe, 0x66, + 0x66, 0x66, 0xd2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xd3, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6700 "最" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x66, 0x66, 0x6b, 0x50, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x2, 0xe6, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x2, 0xd6, 0x66, 0x66, 0x6c, 0x21, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0xa0, + 0x1, 0xe, 0x0, 0xd, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x57, 0x66, 0xad, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x5, 0x0, 0xc4, 0x0, + 0x0, 0xe, 0x66, 0x6d, 0x4, 0x24, 0xb0, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x22, 0x9c, 0x10, 0x0, + 0x0, 0xe, 0x69, 0x8e, 0x30, 0x9a, 0x0, 0x0, + 0xb, 0xe9, 0x41, 0xd, 0x5, 0x68, 0xb3, 0x0, + 0x1, 0x0, 0x0, 0xd, 0x44, 0x0, 0x5e, 0xa1, + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + + /* U+6703 "會" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x30, 0x1a, 0x50, 0x0, 0x0, + 0x0, 0x3, 0xb8, 0x66, 0x6d, 0xed, 0x95, 0x31, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1, 0x9c, 0xb1, + 0x15, 0xb, 0x66, 0x69, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0xd, 0x9, 0x2c, 0x3, 0xb0, 0xd0, 0x0, + 0x0, 0xd, 0x2, 0xac, 0x9, 0x20, 0xd0, 0x0, + 0x0, 0xc, 0x66, 0x69, 0x67, 0x66, 0xb0, 0x0, + 0x0, 0x0, 0x86, 0x66, 0x66, 0x69, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7a, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x7b, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+6708 "月" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0xe3, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe6, 0x66, + 0x66, 0x6e, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x5, 0x90, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x57, + 0x0, 0x0, 0x21, 0x1f, 0x0, 0x37, 0x0, 0x0, + 0x2, 0x7f, 0xc0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, + + /* U+6709 "有" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x5, 0x10, + 0x6, 0x66, 0x66, 0xbb, 0x66, 0x66, 0x6c, 0x90, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0x5d, 0x66, 0x66, 0x6c, 0x60, 0x0, + 0x0, 0x2, 0xcc, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x29, 0x2d, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x2, 0x70, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x3, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x1d, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x5, 0xbf, 0x10, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+670B "朋" */ + 0x0, 0x10, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, + 0xb, 0x66, 0x6e, 0x11, 0xc6, 0x66, 0xf1, 0x0, + 0xb1, 0x0, 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, + 0x10, 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb6, + 0x66, 0xd0, 0x1d, 0x66, 0x6d, 0x0, 0xb, 0x10, + 0xd, 0x1, 0xc0, 0x0, 0xd0, 0x0, 0xb1, 0x0, + 0xd0, 0x1c, 0x0, 0xd, 0x0, 0xb, 0x66, 0x6d, + 0x1, 0xd6, 0x66, 0xd0, 0x0, 0xc0, 0x0, 0xd0, + 0x2b, 0x0, 0xd, 0x0, 0xc, 0x0, 0xd, 0x3, + 0x90, 0x0, 0xd0, 0x0, 0xb0, 0x0, 0xd0, 0x66, + 0x0, 0xd, 0x0, 0x46, 0x0, 0xd, 0xa, 0x10, + 0x0, 0xd0, 0x8, 0x0, 0x68, 0xc3, 0x60, 0x0, + 0xd, 0x2, 0x40, 0x0, 0x95, 0x70, 0x2, 0x8f, + 0xa0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x40, + 0x0, + + /* U+670D "服" */ + 0x0, 0x20, 0x3, 0x0, 0x30, 0x0, 0x21, 0x0, + 0x0, 0xd6, 0x6c, 0x60, 0xe6, 0x66, 0xc8, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xa3, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x0, 0xb2, 0x0, + 0x0, 0xd6, 0x6c, 0x20, 0xd0, 0x48, 0xe0, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd0, 0x4, 0x20, 0x0, + 0x0, 0xd0, 0xa, 0x20, 0xd6, 0x55, 0x7c, 0x0, + 0x0, 0xd6, 0x6c, 0x20, 0xd3, 0x30, 0x78, 0x0, + 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x70, 0xb2, 0x0, + 0x0, 0xc0, 0xa, 0x20, 0xd0, 0x74, 0xb0, 0x0, + 0x0, 0xb0, 0xa, 0x20, 0xd0, 0x1e, 0x30, 0x0, + 0x4, 0x60, 0xa, 0x20, 0xd0, 0x5a, 0xa0, 0x0, + 0x8, 0x4, 0x4c, 0x20, 0xd4, 0x60, 0x6e, 0x81, + 0x23, 0x0, 0x8c, 0x0, 0xe2, 0x0, 0x3, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+671B "望" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xc3, 0x0, 0x4a, 0x66, 0x6e, 0x30, 0x12, + 0x26, 0x25, 0x64, 0x80, 0x0, 0xd0, 0x3, 0x4d, + 0x44, 0x43, 0x4b, 0x66, 0x6e, 0x0, 0x0, 0xd0, + 0x0, 0x4, 0x70, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x34, 0x69, 0x66, 0x6e, 0x0, 0x1, 0xea, 0x93, + 0xa, 0x20, 0x0, 0xd0, 0x0, 0x1b, 0x30, 0x5, + 0x60, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x2, 0x80, 0x0, 0x76, 0x66, 0x67, 0xd6, + 0x66, 0x66, 0x10, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x24, 0x0, 0x0, 0x6, 0x76, 0x67, 0xd6, 0x67, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x4, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, + 0xc0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+671D "朝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa2, 0x2, 0x32, 0xb6, 0x6c, 0x60, 0x56, + 0x6c, 0x76, 0x76, 0x2b, 0x0, 0xa2, 0x0, 0x0, + 0xa2, 0x0, 0x1, 0xb0, 0xa, 0x20, 0xb, 0x6a, + 0x76, 0xe1, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, + 0xd, 0x1, 0xd6, 0x6c, 0x20, 0xd, 0x66, 0x66, + 0xd0, 0x1b, 0x0, 0xa2, 0x0, 0xd0, 0x0, 0xd, + 0x2, 0xa0, 0xa, 0x20, 0xd, 0x67, 0x66, 0xd0, + 0x3c, 0x66, 0xc2, 0x0, 0x70, 0xa2, 0x3, 0x5, + 0x80, 0xa, 0x21, 0x66, 0x6c, 0x76, 0xa6, 0x94, + 0x0, 0xa2, 0x0, 0x0, 0xa2, 0x0, 0xc, 0x0, + 0xa, 0x20, 0x0, 0xa, 0x20, 0x8, 0x30, 0x20, + 0xb2, 0x0, 0x0, 0xa3, 0x5, 0x40, 0x2, 0xbe, + 0x0, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, 0x10, + + /* U+671F "期" */ + 0x0, 0xa, 0x10, 0x94, 0x0, 0x0, 0x0, 0x20, + 0x0, 0xe, 0x0, 0xb2, 0x2, 0xc6, 0x67, 0xd0, + 0x4, 0x6e, 0x66, 0xd9, 0xb3, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x66, 0xd2, 0x1, 0xd6, 0x67, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb2, 0x1, 0xc0, 0x2, 0xb0, + 0x0, 0xe, 0x66, 0xd2, 0x2, 0xb0, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0xb3, 0x23, 0xd5, 0x57, 0xb0, + 0x5, 0x69, 0x66, 0x89, 0x86, 0x90, 0x2, 0xb0, + 0x0, 0x8, 0x70, 0x70, 0x9, 0x60, 0x2, 0xb0, + 0x0, 0x2d, 0x10, 0x5c, 0x1d, 0x0, 0x2, 0xb0, + 0x0, 0xa1, 0x0, 0x7, 0x93, 0x0, 0x3, 0xb0, + 0x7, 0x10, 0x0, 0x7, 0x30, 0x1, 0x7f, 0x80, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, 0x0, + + /* U+6728 "木" */ + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x6, 0x0, + 0x7, 0x66, 0x66, 0x9f, 0x86, 0x66, 0x8b, 0x40, + 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbd, 0x37, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x2d, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xd, 0x13, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xd, 0x10, 0x8a, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0xd, 0x10, 0xb, 0xd5, 0x0, + 0x3, 0x80, 0x0, 0xd, 0x10, 0x0, 0xaf, 0x80, + 0x24, 0x0, 0x0, 0xe, 0x20, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+672A "未" */ + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x8, 0x40, 0x0, 0x1, + 0x86, 0x66, 0xd8, 0x66, 0x65, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x40, 0x6, 0x66, 0x66, + 0x8e, 0x96, 0x66, 0x8b, 0x20, 0x0, 0x0, 0xd, + 0xe6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, 0x9b, + 0x39, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xb3, + 0x2b, 0x0, 0x0, 0x0, 0x3, 0xb0, 0xb, 0x30, + 0x6c, 0x20, 0x0, 0x5, 0x80, 0x0, 0xb3, 0x0, + 0x7f, 0x82, 0x6, 0x30, 0x0, 0xb, 0x30, 0x0, + 0x4d, 0x50, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+672B "末" */ + 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x3a, 0x0, 0x76, + 0x66, 0x66, 0xd8, 0x66, 0x66, 0x62, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x43, 0x0, 0x0, 0x37, 0x66, + 0xaf, 0xa6, 0x67, 0x70, 0x0, 0x0, 0x0, 0x1e, + 0xd5, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5b, + 0x38, 0x20, 0x0, 0x0, 0x0, 0x8, 0x70, 0xb3, + 0xc, 0x20, 0x0, 0x0, 0x7, 0x80, 0xb, 0x30, + 0x3e, 0x60, 0x0, 0x8, 0x50, 0x0, 0xb3, 0x0, + 0x3e, 0xe7, 0x16, 0x10, 0x0, 0xb, 0x30, 0x0, + 0x16, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+672C "本" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6c, 0x96, 0x66, 0x7e, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xec, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x7a, 0x46, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xa, 0x40, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0xa, 0x40, 0x4c, 0x10, 0x0, + 0x0, 0xa, 0x30, 0xa, 0x40, 0x7, 0xe4, 0x0, + 0x0, 0x93, 0x66, 0x6c, 0x86, 0xa8, 0x7f, 0x90, + 0x26, 0x0, 0x0, 0xa, 0x40, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, + + /* U+672D "札" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x5, 0x66, 0xe6, 0x9a, 0xd, 0x10, 0x0, 0x0, + 0x1, 0x0, 0xf1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xf2, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x9, 0xf9, 0x91, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xc, 0xe1, 0xba, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x74, 0xe1, 0x16, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xa0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x6, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x50, + 0x2, 0x0, 0xe1, 0x0, 0xd, 0x10, 0x0, 0x80, + 0x0, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2, 0xe1, + 0x0, 0x0, 0xe1, 0x0, 0x9, 0xdc, 0xcd, 0xb0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+673A "机" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x10, 0xe, 0x0, 0x0, + 0x0, 0xc, 0x17, 0xd, 0x10, 0xe, 0x0, 0x0, + 0x16, 0x6f, 0x66, 0x2c, 0x10, 0xe, 0x0, 0x0, + 0x0, 0x2f, 0x10, 0xc, 0x10, 0xe, 0x0, 0x0, + 0x0, 0x6f, 0x84, 0xc, 0x10, 0xe, 0x0, 0x0, + 0x0, 0xbe, 0x1c, 0x6c, 0x10, 0xe, 0x0, 0x0, + 0x1, 0x9c, 0x11, 0x4d, 0x0, 0xe, 0x0, 0x0, + 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe, 0x0, 0x0, + 0x6, 0xc, 0x10, 0x39, 0x0, 0xe, 0x0, 0x20, + 0x40, 0xc, 0x10, 0x84, 0x0, 0xe, 0x0, 0x60, + 0x0, 0xc, 0x10, 0xa0, 0x0, 0xe, 0x1, 0xa0, + 0x0, 0xd, 0x27, 0x10, 0x0, 0xa, 0xdd, 0xc0, + 0x0, 0xa, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6750 "材" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x5, 0x66, 0xf6, 0xc5, 0x46, 0x67, 0xe7, 0xd1, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x8, 0xd0, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x1e, 0xd0, 0x0, + 0x0, 0xc, 0xe3, 0xd1, 0x0, 0x89, 0xd0, 0x0, + 0x0, 0x3b, 0xe0, 0x95, 0x3, 0xc1, 0xd0, 0x0, + 0x0, 0xa3, 0xe0, 0x0, 0xb, 0x11, 0xd0, 0x0, + 0x2, 0x70, 0xe0, 0x0, 0x92, 0x1, 0xd0, 0x0, + 0x7, 0x0, 0xe0, 0x7, 0x20, 0x1, 0xd0, 0x0, + 0x10, 0x0, 0xf0, 0x20, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x2, 0x34, 0xd0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0x90, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+6751 "村" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x5, 0x66, 0xf6, 0xc4, 0x46, 0x66, 0xf7, 0xc1, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x8, 0xf4, 0x0, 0x20, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0xe6, 0xb0, 0x76, 0x0, 0xe0, 0x0, + 0x0, 0x39, 0xe0, 0xb5, 0xe, 0x30, 0xe0, 0x0, + 0x0, 0xa2, 0xe0, 0x11, 0x8, 0x40, 0xe0, 0x0, + 0x2, 0x70, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x7, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x1, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x3, 0x33, 0xe0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x5e, 0xb0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+675F "束" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x5, 0x20, 0x66, + 0x66, 0x66, 0xd7, 0x66, 0x66, 0x75, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0xd7, 0x66, 0x6e, 0x10, 0x0, 0xf, 0x0, + 0xc, 0x20, 0x1, 0xd0, 0x0, 0x0, 0xf0, 0x0, + 0xc2, 0x0, 0x1d, 0x0, 0x0, 0xf, 0x66, 0x6d, + 0x76, 0x66, 0xe0, 0x0, 0x0, 0xf0, 0xd, 0xe6, + 0x30, 0x19, 0x0, 0x0, 0x1, 0x9, 0x7c, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0xc2, 0x1b, + 0x10, 0x0, 0x0, 0x5, 0x90, 0xc, 0x20, 0x3d, + 0x60, 0x0, 0x7, 0x60, 0x0, 0xc2, 0x0, 0x2d, + 0xf7, 0x16, 0x20, 0x0, 0xd, 0x30, 0x0, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+6761 "条" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x86, 0x66, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x89, 0x30, 0x0, 0x9b, 0x0, 0x0, + 0x0, 0x4, 0x80, 0x71, 0x4, 0xe1, 0x0, 0x0, + 0x0, 0x27, 0x0, 0xb, 0x5e, 0x30, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x9, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb7, 0x5b, 0xd8, 0x42, 0x10, + 0x2, 0x57, 0x73, 0x0, 0xf2, 0x39, 0xdf, 0xa2, + 0x2, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x80, 0x0, + 0x0, 0x6, 0x76, 0x66, 0xf6, 0x66, 0x62, 0x0, + 0x0, 0x0, 0xd, 0x40, 0xe1, 0x61, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0xe0, 0x1c, 0x60, 0x0, + 0x0, 0x9, 0x50, 0x0, 0xe0, 0x1, 0xd9, 0x0, + 0x1, 0x72, 0x2, 0x8d, 0xc0, 0x0, 0x3a, 0x0, + 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, + + /* U+6765 "来" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6d, 0x86, 0x66, 0xca, 0x0, + 0x0, 0x23, 0x0, 0xb, 0x30, 0x6, 0x10, 0x0, + 0x0, 0x1, 0xc3, 0xb, 0x30, 0x2e, 0x40, 0x0, + 0x0, 0x0, 0x6c, 0xb, 0x30, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xb, 0x34, 0x40, 0xa, 0x30, + 0x28, 0x66, 0x66, 0xbf, 0xb6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x1, 0xed, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x5b, 0x36, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xb, 0x30, 0xb6, 0x0, 0x0, + 0x0, 0x6, 0x90, 0xb, 0x30, 0xc, 0xb2, 0x0, + 0x0, 0x76, 0x0, 0xb, 0x30, 0x0, 0xaf, 0x90, + 0x16, 0x20, 0x0, 0xc, 0x40, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+676F "杯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x46, 0x66, 0x66, 0x69, 0xb0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x0, 0x0, + 0x6, 0x66, 0xe6, 0x62, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xe2, 0x0, 0xd, 0xb1, 0x0, 0x0, + 0x0, 0xb, 0xe9, 0x50, 0x59, 0xe2, 0x0, 0x0, + 0x0, 0x2a, 0xe1, 0xe0, 0xc1, 0xd1, 0x92, 0x0, + 0x0, 0x91, 0xe0, 0x39, 0x30, 0xd0, 0x2e, 0x30, + 0x3, 0x60, 0xe0, 0x54, 0x0, 0xd0, 0x8, 0x80, + 0x5, 0x0, 0xe2, 0x30, 0x0, 0xd0, 0x0, 0x10, + 0x10, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+6771 "東" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x0, 0x57, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0x62, 0x0, 0x4, + 0x0, 0xd, 0x0, 0x1, 0x60, 0x0, 0x0, 0xd6, + 0x66, 0xe6, 0x66, 0x8d, 0x0, 0x0, 0xd, 0x10, + 0xd, 0x0, 0x3, 0xa0, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0x8a, 0x0, 0x0, 0xd, 0x10, 0xd, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0xd6, 0x6d, 0xfa, + 0x66, 0x78, 0x0, 0x0, 0x1, 0x4, 0xbd, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0xd0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0xa2, 0xd, 0x0, 0xa6, + 0x0, 0x0, 0x1, 0x92, 0x0, 0xd1, 0x0, 0x9d, + 0x62, 0x4, 0x70, 0x0, 0xd, 0x10, 0x0, 0x4c, + 0x51, 0x20, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+6790 "析" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, + 0xd, 0x10, 0x9, 0x65, 0x76, 0x53, 0x0, 0x0, + 0xc1, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x16, 0x6e, + 0x6c, 0x3a, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0xa, 0x86, 0x67, 0x6b, 0x70, 0x7, 0xf9, 0x80, + 0xa3, 0x0, 0xc1, 0x0, 0x0, 0xbd, 0x1d, 0x2a, + 0x20, 0xc, 0x10, 0x0, 0x27, 0xc1, 0x20, 0xc1, + 0x0, 0xc1, 0x0, 0x7, 0xc, 0x10, 0xd, 0x0, + 0xc, 0x10, 0x2, 0x20, 0xc1, 0x2, 0xb0, 0x0, + 0xc1, 0x0, 0x0, 0xd, 0x10, 0x75, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xd1, 0x1a, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xd, 0x27, 0x0, 0x0, 0xd, 0x20, + 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+6797 "林" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x4, 0x66, 0xe8, 0xb3, 0x66, 0xe6, 0x6d, 0x40, + 0x0, 0x1, 0xe0, 0x0, 0x8, 0xe3, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0xd, 0xe6, 0x0, 0x0, + 0x0, 0xb, 0xe9, 0x50, 0x3a, 0xe7, 0x0, 0x0, + 0x0, 0x2a, 0xe1, 0xe0, 0xa2, 0xe2, 0x70, 0x0, + 0x0, 0x91, 0xe0, 0x34, 0x70, 0xe0, 0xb2, 0x0, + 0x3, 0x50, 0xe0, 0x9, 0x0, 0xe0, 0x3e, 0x20, + 0x5, 0x0, 0xe0, 0x70, 0x0, 0xe0, 0x8, 0xc2, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+679C "果" */ + 0x0, 0x8, 0x66, 0x66, 0x66, 0x66, 0xa0, 0x0, + 0x0, 0xd1, 0x0, 0xd1, 0x0, 0x3c, 0x0, 0x0, + 0xc, 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, + 0xc6, 0x66, 0xe6, 0x66, 0x7b, 0x0, 0x0, 0xc, + 0x10, 0xd, 0x10, 0x3, 0xb0, 0x0, 0x0, 0xd1, + 0x0, 0xd1, 0x0, 0x3b, 0x0, 0x0, 0xd, 0x66, + 0x6e, 0x66, 0x67, 0xa0, 0x0, 0x0, 0x10, 0x0, + 0xd1, 0x0, 0x0, 0x70, 0x6, 0x76, 0x66, 0xcf, + 0x96, 0x66, 0x68, 0x30, 0x0, 0x0, 0x6a, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xd, 0x1a, + 0x40, 0x0, 0x0, 0x0, 0x4a, 0x0, 0xd1, 0xb, + 0x81, 0x0, 0x0, 0x76, 0x0, 0xe, 0x10, 0x8, + 0xe9, 0x31, 0x61, 0x0, 0x0, 0xe1, 0x0, 0x3, + 0x80, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, + + /* U+67D0 "某" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x10, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd1, 0x5, 0x20, + 0x3, 0x76, 0x6e, 0x66, 0x66, 0xd6, 0x68, 0x70, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x1, 0xc0, 0x40, 0x0, 0x10, + 0x5, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6a, 0xd2, + 0x0, 0x0, 0x0, 0xba, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb2, 0xc3, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x1, 0xc0, 0x6a, 0x20, 0x0, + 0x0, 0x9, 0x70, 0x2, 0xc0, 0x5, 0xfa, 0x61, + 0x5, 0x72, 0x0, 0x2, 0xc0, 0x0, 0x1a, 0x91, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + + /* U+67E5 "查" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x9, 0x30, + 0x3, 0x76, 0x66, 0x7f, 0xd9, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0xc7, 0xb4, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x52, 0xb0, 0x78, 0x0, 0x0, + 0x0, 0x3, 0xa2, 0x3, 0xb0, 0x7, 0xd7, 0x20, + 0x1, 0x66, 0xa6, 0x66, 0x66, 0x6b, 0x6b, 0x91, + 0x4, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x6, 0x2, 0x0, + 0x2, 0x66, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x60, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67F1 "柱" */ + 0x0, 0x9, 0x30, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xc, 0x17, 0x15, 0x55, 0x65, 0x5c, 0x80, + 0x18, 0x6e, 0x66, 0x23, 0x11, 0xe1, 0x11, 0x10, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x5f, 0x94, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xae, 0x2f, 0x20, 0x0, 0xe0, 0x7, 0x0, + 0x2, 0x9c, 0x15, 0x17, 0x66, 0xe6, 0x67, 0x20, + 0x7, 0x1c, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x23, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x10, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x3, 0x20, + 0x0, 0xd, 0x13, 0x76, 0x66, 0xa6, 0x69, 0x90, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67FB "査" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x6c, 0x86, 0x66, 0x7f, 0x40, + 0x1, 0x10, 0x0, 0xae, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x8a, 0x37, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xa, 0x40, 0x8a, 0x30, 0x0, + 0x0, 0x29, 0x30, 0xb, 0x30, 0x5, 0xed, 0x90, + 0x5, 0x50, 0x96, 0x67, 0x66, 0x6d, 0x35, 0x20, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0xe, 0x2, 0x0, + 0x15, 0x66, 0xd6, 0x66, 0x66, 0x6e, 0x6e, 0xa0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+67FF "柿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x8, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x90, 0x4, 0x10, + 0x0, 0xc, 0x16, 0x57, 0x66, 0xc6, 0x68, 0x60, + 0x16, 0x6f, 0x66, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1f, 0x10, 0x4, 0x0, 0xe0, 0x6, 0x0, + 0x0, 0x6f, 0x93, 0xe, 0x66, 0xe6, 0x6f, 0x10, + 0x0, 0xbe, 0x3e, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x1, 0x9c, 0x14, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x7, 0x2c, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x15, 0xc, 0x10, 0xd, 0x0, 0xe0, 0xe, 0x0, + 0x10, 0xd, 0x10, 0xd, 0x0, 0xe3, 0xad, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x0, 0xe0, 0x33, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+6821 "校" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xa, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x45, 0x55, 0xc5, 0x5c, 0x70, + 0x16, 0x6e, 0x6c, 0x51, 0x31, 0x11, 0x11, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xe6, 0x5, 0x50, 0x0, + 0x0, 0x2f, 0x93, 0x9, 0x60, 0x0, 0x9c, 0x10, + 0x0, 0x7f, 0x3d, 0x46, 0x0, 0x3, 0x1b, 0x60, + 0x0, 0xbd, 0x14, 0x42, 0x20, 0xa, 0xb1, 0x20, + 0x4, 0x6c, 0x10, 0x0, 0x60, 0xe, 0x20, 0x0, + 0x7, 0xc, 0x10, 0x0, 0x62, 0x78, 0x0, 0x0, + 0x22, 0xd, 0x10, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1c, 0xc1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x3, 0xa2, 0x5e, 0x82, 0x0, + 0x0, 0xd, 0x23, 0x75, 0x0, 0x1, 0x9f, 0xb1, + 0x0, 0x2, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+682A "株" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x1, 0xc2, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x6, 0x80, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x50, 0xd0, 0x3, 0x0, + 0x5, 0x6e, 0x7d, 0x2c, 0x66, 0xe6, 0x79, 0x10, + 0x1, 0xe, 0x10, 0x46, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x2f, 0x20, 0x50, 0x0, 0xd0, 0x0, 0x10, + 0x0, 0x7f, 0xa7, 0x56, 0x66, 0xe6, 0x68, 0xc1, + 0x0, 0xbd, 0x2d, 0x0, 0x1e, 0xd5, 0x0, 0x0, + 0x4, 0x6d, 0x10, 0x0, 0x88, 0xd7, 0x10, 0x0, + 0x8, 0xd, 0x10, 0x2, 0xc0, 0xd1, 0xa0, 0x0, + 0x22, 0xd, 0x10, 0xb, 0x10, 0xd0, 0x96, 0x0, + 0x0, 0xd, 0x10, 0x83, 0x0, 0xd0, 0xd, 0xa1, + 0x0, 0xd, 0x16, 0x20, 0x0, 0xd0, 0x2, 0x71, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+6839 "根" */ + 0x0, 0xa, 0x30, 0x2, 0x0, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x10, 0x1e, 0x66, 0x66, 0xe4, 0x0, + 0x0, 0xc, 0x10, 0xd, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x2d, 0x37, 0x2d, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x4e, 0x44, 0x2e, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x1f, 0x20, 0xd, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x6f, 0x95, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xad, 0x2e, 0xd, 0x6, 0x0, 0x56, 0x0, + 0x2, 0x7c, 0x13, 0xd, 0x6, 0x0, 0xca, 0x10, + 0x7, 0xd, 0x10, 0xd, 0x5, 0x58, 0x30, 0x0, + 0x22, 0xd, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x37, 0x19, 0xd4, 0x0, + 0x0, 0xd, 0x10, 0x2f, 0x80, 0x0, 0x7f, 0x90, + 0x0, 0x5, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, + + /* U+683C "格" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xe0, 0x0, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x8, 0xb6, 0x67, 0xe2, 0x0, + 0x5, 0x6e, 0x6c, 0x39, 0x60, 0x9, 0x60, 0x0, + 0x0, 0xf, 0x0, 0x71, 0x27, 0x4c, 0x0, 0x0, + 0x0, 0x3f, 0x21, 0x10, 0x9, 0xd1, 0x0, 0x0, + 0x0, 0x8f, 0x77, 0x0, 0x1c, 0xc4, 0x0, 0x0, + 0x0, 0xad, 0xc, 0x3, 0xa1, 0x1c, 0xa4, 0x0, + 0x3, 0x5d, 0x0, 0x79, 0x0, 0x0, 0x9d, 0xa1, + 0x7, 0xd, 0x25, 0xd, 0x66, 0x66, 0xf1, 0x0, + 0x22, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x7, 0x0, 0x7, 0x0, 0x0, 0x50, 0x0, + + /* U+6843 "桃" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0xa4, 0x2c, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0x1b, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x1b, 0x0, 0x0, + 0x5, 0x6e, 0x79, 0x50, 0xc0, 0x1b, 0xc, 0x20, + 0x0, 0xe, 0x0, 0x75, 0xc0, 0x1b, 0x66, 0x0, + 0x0, 0x2f, 0x20, 0x49, 0xc0, 0x1d, 0x40, 0x0, + 0x0, 0x7f, 0x87, 0x1, 0xc0, 0x1b, 0x0, 0x0, + 0x0, 0xbe, 0xc, 0x0, 0xd0, 0x1d, 0x60, 0x0, + 0x2, 0x8d, 0x0, 0x28, 0xe0, 0x1b, 0x5e, 0x20, + 0x8, 0xd, 0x6, 0xc0, 0xe0, 0x1b, 0x5, 0x40, + 0x23, 0xd, 0x2, 0x13, 0xa0, 0x1b, 0x0, 0x10, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x1b, 0x0, 0x50, + 0x0, 0xd, 0x0, 0x3a, 0x0, 0x1c, 0x2, 0x80, + 0x0, 0xd, 0x2, 0x90, 0x0, 0xc, 0xcd, 0xa0, + 0x0, 0x8, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6848 "案" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x4, 0x50, 0x0, 0x4, 0x0, + 0x0, 0x69, 0x66, 0x7c, 0x66, 0x66, 0x6e, 0x30, + 0x1, 0xd1, 0x0, 0x97, 0x0, 0x0, 0x46, 0x0, + 0x0, 0x66, 0x68, 0xc6, 0x66, 0xa6, 0x7b, 0x40, + 0x0, 0x0, 0x1c, 0x10, 0x6, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x67, 0xae, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0x63, 0x9e, 0x70, 0x0, + 0x0, 0x25, 0x66, 0x23, 0xa0, 0x1, 0x81, 0x0, + 0x2, 0x66, 0x66, 0x67, 0xd6, 0x66, 0x6c, 0xb0, + 0x0, 0x0, 0x0, 0x9a, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x82, 0xb1, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xa4, 0x3, 0xb0, 0x1b, 0xb5, 0x30, + 0x2, 0x66, 0x0, 0x3, 0xc0, 0x0, 0x5c, 0xb1, + 0x3, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+689D "條" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x1d, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x69, 0x0, 0x1, 0x0, + 0x0, 0xb, 0x40, 0x0, 0xc8, 0x66, 0xac, 0x0, + 0x0, 0x2d, 0x9, 0x4, 0x78, 0x2, 0xd1, 0x0, + 0x0, 0x9e, 0xd, 0x8, 0x5, 0x8c, 0x20, 0x0, + 0x2, 0x8d, 0xc, 0x10, 0x3, 0xea, 0x0, 0x0, + 0x7, 0xd, 0xc, 0x0, 0x68, 0x6, 0xe9, 0x51, + 0x0, 0xd, 0xc, 0x36, 0x20, 0xb3, 0x17, 0x80, + 0x0, 0xd, 0xc, 0x0, 0x0, 0xd0, 0x6, 0x20, + 0x0, 0xd, 0xd, 0x57, 0x66, 0xe6, 0x66, 0x40, + 0x0, 0xd, 0xd, 0x2, 0xa0, 0xd0, 0x40, 0x0, + 0x0, 0xd, 0x4, 0xa, 0x50, 0xd0, 0x4c, 0x20, + 0x0, 0xd, 0x0, 0x66, 0x0, 0xd0, 0x7, 0xc0, + 0x0, 0xe, 0x3, 0x40, 0x6b, 0xe0, 0x0, 0x50, + 0x0, 0x5, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+68B0 "械" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xa4, 0x62, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x1e, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa2, 0x4, 0x10, + 0x5, 0x6e, 0x97, 0x76, 0x66, 0xc7, 0x68, 0x80, + 0x1, 0x1d, 0x0, 0x51, 0x50, 0x93, 0x0, 0x0, + 0x0, 0x3e, 0x91, 0x93, 0xb2, 0x93, 0x8, 0x50, + 0x0, 0x8e, 0x4a, 0x92, 0xb0, 0x74, 0xd, 0x30, + 0x0, 0xad, 0x18, 0xb7, 0xd9, 0x86, 0x3b, 0x0, + 0x4, 0x5d, 0x1, 0xa1, 0xb0, 0x49, 0xa3, 0x0, + 0x7, 0xd, 0x0, 0xb0, 0xb0, 0x1d, 0xb0, 0x0, + 0x21, 0xd, 0x0, 0xa0, 0xb0, 0xe, 0x40, 0x40, + 0x0, 0xd, 0x4, 0x50, 0xc0, 0x98, 0xb0, 0x70, + 0x0, 0xe, 0x8, 0x0, 0x68, 0x30, 0x8a, 0xa0, + 0x0, 0xe, 0x31, 0x2, 0x71, 0x0, 0x8, 0xe0, + 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+68EE "森" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x65, 0x0, + 0x3, 0x76, 0x66, 0xcf, 0xb7, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x4, 0xcb, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x1a, 0x32, 0xc3, 0x0, 0x0, + 0x0, 0x6, 0x80, 0xa, 0x40, 0x3d, 0xc6, 0x10, + 0x2, 0x63, 0xa1, 0xb, 0x40, 0xd3, 0x6a, 0x30, + 0x1, 0x0, 0xd0, 0x52, 0x0, 0xd0, 0x6, 0x0, + 0x6, 0x68, 0xf6, 0x64, 0x6b, 0xf9, 0x67, 0x30, + 0x0, 0x9, 0xf6, 0x0, 0xd, 0xe7, 0x0, 0x0, + 0x0, 0x39, 0xd4, 0xd0, 0x95, 0xd3, 0xa0, 0x0, + 0x0, 0x90, 0xd0, 0x45, 0x70, 0xd0, 0x99, 0x0, + 0x6, 0x0, 0xd0, 0x36, 0x0, 0xd0, 0xc, 0x80, + 0x10, 0x0, 0xe0, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+691C "検" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x9, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x1e, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0xa6, 0x1a, 0x20, 0x0, + 0x14, 0x4d, 0x5b, 0x16, 0x70, 0x1, 0xc9, 0x30, + 0x2, 0x2e, 0x32, 0x66, 0x66, 0x66, 0xc9, 0x90, + 0x0, 0x2f, 0x41, 0x20, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x7f, 0x99, 0xb, 0x66, 0xd6, 0x6c, 0x10, + 0x0, 0xbd, 0x1c, 0xd, 0x1, 0xb0, 0xd, 0x0, + 0x2, 0x7c, 0x10, 0xd, 0x2, 0xa0, 0xd, 0x0, + 0x7, 0xd, 0x10, 0xe, 0x68, 0xd6, 0x6d, 0x0, + 0x23, 0xd, 0x10, 0x4, 0x9, 0x95, 0x1, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x2c, 0xa, 0x30, 0x0, + 0x0, 0xd, 0x10, 0x1, 0xb2, 0x1, 0xc6, 0x0, + 0x0, 0xd, 0x10, 0x39, 0x10, 0x0, 0x1c, 0xb1, + 0x0, 0x6, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+695A "楚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x10, 0x2, 0xb0, 0x0, 0x0, 0x66, + 0x6e, 0x6a, 0x36, 0x9c, 0x69, 0x60, 0x0, 0xa, + 0xe4, 0x0, 0x1e, 0xc1, 0x0, 0x0, 0x4, 0xad, + 0x5a, 0xa, 0x5b, 0x88, 0x0, 0x1, 0xa0, 0xd0, + 0x48, 0x42, 0xb0, 0xa5, 0x1, 0x70, 0xe, 0x6, + 0x20, 0x2b, 0x0, 0x0, 0x14, 0x66, 0x76, 0x66, + 0x66, 0x66, 0xa3, 0x0, 0x11, 0x0, 0x0, 0xd0, + 0x0, 0x48, 0x20, 0x0, 0x5, 0xc0, 0xd, 0x0, + 0x3, 0x0, 0x0, 0x0, 0xa6, 0x0, 0xd6, 0x66, + 0x87, 0x0, 0x0, 0x1c, 0x80, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x33, 0x91, 0xd0, 0x0, 0x0, + 0x0, 0x4, 0x60, 0x3, 0xce, 0x54, 0x34, 0x46, + 0x42, 0x60, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xc0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+696D "業" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0x0, 0xc1, 0xc, 0x30, 0x50, 0x0, + 0x0, 0xb, 0x80, 0xd0, 0xd, 0xa, 0x90, 0x0, + 0x0, 0x1, 0xd0, 0xd0, 0xd, 0x63, 0x0, 0x0, + 0x4, 0x66, 0x66, 0xd6, 0x6d, 0x66, 0x6a, 0xa0, + 0x0, 0x0, 0x19, 0x20, 0x6, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x90, 0x8, 0x0, 0x61, 0x0, + 0x0, 0x26, 0x66, 0x6a, 0x76, 0x66, 0x95, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x30, 0x5, 0x30, 0x0, + 0x0, 0x5, 0x66, 0x6c, 0x76, 0x66, 0x50, 0x0, + 0x3, 0x66, 0x66, 0x6c, 0x85, 0x55, 0x6d, 0x30, + 0x0, 0x0, 0x1, 0xce, 0x57, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x4a, 0x34, 0xa2, 0x0, 0x0, + 0x0, 0x6, 0xa1, 0xa, 0x30, 0x3c, 0xc7, 0x41, + 0x4, 0x73, 0x0, 0xa, 0x30, 0x0, 0x5b, 0x90, + 0x1, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+6975 "極" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x66, 0x66, 0xb4, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x15, 0x5e, 0x7a, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x86, 0x92, 0xc4, 0x66, 0x90, + 0x0, 0x2f, 0x40, 0xc0, 0xc0, 0xc0, 0x7, 0x60, + 0x0, 0x6f, 0x6a, 0xc0, 0xc0, 0xc4, 0x1c, 0x10, + 0x0, 0xbe, 0xa, 0xc0, 0xc0, 0xc0, 0x9b, 0x0, + 0x2, 0x9d, 0x0, 0xc0, 0xc0, 0xc0, 0x7c, 0x0, + 0x7, 0x1d, 0x0, 0xc6, 0xd0, 0xc0, 0x96, 0x90, + 0x14, 0xd, 0x0, 0xc0, 0x50, 0xc5, 0x20, 0x80, + 0x0, 0xd, 0x0, 0x20, 0x55, 0xc3, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x5, 0x66, 0x66, 0x66, 0x69, 0xd1, + 0x0, 0x6, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+697D "楽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7, 0x3, 0x0, 0x2, 0x0, 0x8, + 0xa1, 0xd6, 0x66, 0xd4, 0xa, 0x90, 0x0, 0x9, + 0x6c, 0x0, 0xc, 0x18, 0x30, 0x0, 0x0, 0x0, + 0xc6, 0x66, 0xd4, 0x20, 0x0, 0x0, 0x5, 0x5d, + 0x0, 0xc, 0x15, 0xb9, 0x10, 0x8b, 0x20, 0xd6, + 0x66, 0xd1, 0x0, 0x8a, 0x2, 0x0, 0xa, 0x6, + 0x28, 0x0, 0x0, 0x10, 0x56, 0x66, 0x66, 0xd7, + 0x66, 0x69, 0xe2, 0x1, 0x0, 0x0, 0xcf, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0xc1, 0xa2, + 0x0, 0x0, 0x0, 0x1, 0xa4, 0xc, 0x11, 0xc7, + 0x10, 0x0, 0x4, 0x81, 0x0, 0xc1, 0x0, 0x9f, + 0xb6, 0x26, 0x30, 0x0, 0xc, 0x10, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+6982 "概" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0xb6, 0xc4, 0x66, 0x97, 0x80, + 0x0, 0xc, 0x0, 0xc0, 0xb0, 0x0, 0xc0, 0x0, + 0x4, 0x5d, 0x95, 0xc0, 0xb0, 0x93, 0xc0, 0x0, + 0x1, 0x1d, 0x10, 0xd6, 0xc0, 0xb0, 0xc0, 0x0, + 0x0, 0x4e, 0x30, 0xc0, 0xb1, 0xa1, 0xb0, 0x0, + 0x0, 0x8e, 0x97, 0xc0, 0xb7, 0xb7, 0xc8, 0xb0, + 0x0, 0xbc, 0x1a, 0xd6, 0xb1, 0x16, 0x70, 0x0, + 0x3, 0x6c, 0x0, 0xc2, 0x10, 0xb, 0xe1, 0x0, + 0x8, 0xc, 0x0, 0xc0, 0xa1, 0x1b, 0xc0, 0x0, + 0x23, 0xc, 0x0, 0xc4, 0x98, 0x94, 0xc0, 0x0, + 0x0, 0xc, 0x0, 0xf6, 0x4, 0x90, 0xc0, 0x50, + 0x0, 0xd, 0x0, 0x40, 0x1a, 0x0, 0xc0, 0x80, + 0x0, 0xd, 0x0, 0x3, 0x70, 0x0, 0x9b, 0xd2, + 0x0, 0x4, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + + /* U+69CB "構" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x1, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x95, 0x8, 0x70, 0x0, + 0x0, 0xc, 0x0, 0x56, 0xb7, 0x6b, 0x8c, 0x70, + 0x0, 0xc, 0x0, 0x0, 0x92, 0x8, 0x41, 0x0, + 0x2, 0x2c, 0x29, 0x36, 0xb7, 0x6b, 0x9c, 0x20, + 0x4, 0x4d, 0x44, 0x20, 0x92, 0x8, 0x42, 0x40, + 0x0, 0x3e, 0x73, 0x66, 0x76, 0xc7, 0x67, 0x70, + 0x0, 0x7d, 0x78, 0x3, 0x0, 0xc0, 0x5, 0x0, + 0x0, 0xbc, 0x16, 0x1d, 0x66, 0xd6, 0x6d, 0x0, + 0x3, 0x8c, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x8, 0xc, 0x0, 0xb, 0x0, 0xc0, 0xc, 0x0, + 0x23, 0xc, 0x5, 0x6d, 0x66, 0xd6, 0x6e, 0xc1, + 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xb, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x7, 0xd9, 0x0, + 0x0, 0x2, 0x0, 0x2, 0x0, 0x0, 0x30, 0x0, + + /* U+69D8 "様" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x0, 0x92, 0x0, 0xb5, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x3d, 0x1, 0x91, 0x0, + 0x0, 0xc, 0x0, 0x26, 0x69, 0x98, 0x69, 0x80, + 0x2, 0x2c, 0x28, 0x0, 0x0, 0xd0, 0x1, 0x0, + 0x4, 0x4d, 0x44, 0x15, 0x66, 0xe6, 0x6b, 0x10, + 0x0, 0x1f, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x5f, 0x5a, 0x46, 0x66, 0xd6, 0x69, 0xb0, + 0x0, 0xad, 0x7, 0x0, 0x0, 0xb3, 0x3, 0x0, + 0x1, 0x9c, 0x2, 0x66, 0x92, 0xd3, 0x1c, 0x40, + 0x7, 0x1c, 0x0, 0x0, 0xd2, 0xd7, 0x60, 0x0, + 0x23, 0xc, 0x0, 0x5, 0x80, 0xd2, 0x80, 0x0, + 0x0, 0xc, 0x0, 0xb, 0x0, 0xd0, 0xa6, 0x0, + 0x0, 0xc, 0x0, 0x92, 0x0, 0xd0, 0xd, 0xa0, + 0x0, 0xd, 0x6, 0x10, 0x7d, 0xd0, 0x1, 0x20, + 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + + /* U+6A02 "樂" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x7, 0x60, 0x1, 0xd1, 0x0, + 0x0, 0x3a, 0x0, 0x7a, 0x6a, 0x16, 0x70, 0x0, + 0x0, 0x91, 0x84, 0xc0, 0xc, 0xa, 0xa, 0x30, + 0x5, 0x84, 0xd2, 0xc0, 0xc, 0x76, 0x4b, 0x0, + 0x6, 0x6a, 0x40, 0xc6, 0x6c, 0x76, 0xb2, 0x0, + 0x0, 0x18, 0x20, 0xc0, 0xc, 0x3, 0x73, 0x0, + 0x0, 0x80, 0x64, 0xc6, 0x6c, 0x9, 0x7, 0x50, + 0x8, 0xd9, 0x6c, 0x92, 0x17, 0x9c, 0x85, 0xd0, + 0x0, 0x0, 0x4, 0x6, 0xa0, 0x10, 0x9, 0x30, + 0x6, 0x76, 0x66, 0xaf, 0xb8, 0x66, 0x67, 0x40, + 0x0, 0x0, 0x4, 0xd8, 0x77, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x16, 0x70, 0xb5, 0x0, 0x0, + 0x0, 0x29, 0x50, 0x6, 0x70, 0xa, 0xd8, 0x50, + 0x5, 0x50, 0x0, 0x6, 0x70, 0x0, 0x4b, 0x50, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+6A19 "標" */ + 0x0, 0x9, 0x30, 0x0, 0x0, 0x0, 0x5, 0x30, + 0x0, 0xc, 0x0, 0x67, 0x6c, 0x6c, 0x66, 0x50, + 0x0, 0xc, 0x0, 0x0, 0xb, 0xb, 0x1, 0x0, + 0x16, 0x6d, 0x6c, 0x5b, 0x5c, 0x5c, 0x5d, 0x30, + 0x0, 0xf, 0x0, 0x1a, 0xb, 0xb, 0xc, 0x0, + 0x0, 0x4f, 0x60, 0x1a, 0xb, 0xb, 0xc, 0x0, + 0x0, 0x9f, 0x69, 0x2c, 0x66, 0x66, 0x69, 0x0, + 0x0, 0xac, 0x9, 0x5, 0x66, 0x66, 0x87, 0x0, + 0x6, 0x3c, 0x0, 0x1, 0x0, 0x0, 0x0, 0x20, + 0x6, 0xc, 0x1, 0x86, 0x66, 0x96, 0x66, 0xa1, + 0x20, 0xc, 0x0, 0x5, 0x50, 0xb2, 0x20, 0x0, + 0x0, 0xc, 0x0, 0x2c, 0x20, 0xb0, 0x69, 0x0, + 0x0, 0xc, 0x3, 0x90, 0x0, 0xb0, 0x9, 0x90, + 0x0, 0xc, 0x25, 0x0, 0x5a, 0xb0, 0x0, 0x50, + 0x0, 0x5, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + + /* U+6A21 "模" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0xc2, 0xd, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0xd, 0x5, 0x30, + 0x0, 0xd, 0x2, 0x66, 0xe6, 0x6e, 0x66, 0x50, + 0x16, 0x6e, 0x6d, 0x20, 0xa0, 0x9, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xd, 0x66, 0x66, 0xa8, 0x0, + 0x0, 0x4f, 0x30, 0xd, 0x0, 0x0, 0x85, 0x0, + 0x0, 0x9f, 0x79, 0xd, 0x66, 0x66, 0xb5, 0x0, + 0x0, 0xad, 0xd, 0xd, 0x0, 0x0, 0x85, 0x0, + 0x6, 0x3d, 0x1, 0xe, 0x6b, 0x86, 0xa4, 0x0, + 0x6, 0xd, 0x0, 0x1, 0xa, 0x30, 0x2, 0x30, + 0x20, 0xd, 0x6, 0x76, 0x6e, 0x96, 0x67, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x4a, 0x36, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x7, 0x91, 0x0, + 0x0, 0xd, 0x0, 0x49, 0x20, 0x0, 0x7f, 0xa0, + 0x0, 0x5, 0x14, 0x20, 0x0, 0x0, 0x2, 0x0, + + /* U+6A23 "樣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x92, 0x5, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x39, 0x7, 0x16, 0x0, + 0x0, 0xd, 0x0, 0x56, 0x66, 0xd6, 0x66, 0x10, + 0x16, 0x6e, 0x6c, 0x36, 0x66, 0xd6, 0x89, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x10, + 0x0, 0x5f, 0x60, 0x66, 0x66, 0xa6, 0x67, 0x90, + 0x0, 0xaf, 0x5b, 0x0, 0x5, 0xc1, 0x0, 0x0, + 0x1, 0xad, 0x9, 0x0, 0x0, 0x70, 0x0, 0x0, + 0x7, 0x3d, 0x0, 0x16, 0x66, 0xe1, 0xd, 0x20, + 0x6, 0xd, 0x3, 0x66, 0x83, 0xd5, 0x83, 0x0, + 0x20, 0xd, 0x0, 0x2, 0xd2, 0xc7, 0x30, 0x0, + 0x0, 0xd, 0x0, 0xb, 0x30, 0xc0, 0xc2, 0x0, + 0x0, 0xd, 0x0, 0x84, 0x0, 0xd0, 0x2e, 0x71, + 0x0, 0xd, 0x17, 0x20, 0x6b, 0xd0, 0x2, 0x50, + 0x0, 0x4, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, + + /* U+6A2A "横" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x90, 0xc, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x90, 0xd, 0x6, 0x0, + 0x0, 0xd, 0x2, 0x68, 0xb6, 0x6e, 0x66, 0x10, + 0x16, 0x6e, 0x87, 0x3, 0x90, 0xd, 0x0, 0x10, + 0x0, 0x3e, 0x7, 0x66, 0x89, 0x69, 0x67, 0x80, + 0x0, 0x6e, 0x10, 0x10, 0xa, 0x10, 0x2, 0x0, + 0x0, 0xad, 0x95, 0xc6, 0x6c, 0x66, 0x7c, 0x0, + 0x0, 0xad, 0x1b, 0xb0, 0xa, 0x10, 0x39, 0x0, + 0x6, 0x3d, 0x0, 0xb6, 0x6c, 0x66, 0x79, 0x0, + 0x8, 0xd, 0x0, 0xb0, 0xa, 0x10, 0x39, 0x0, + 0x21, 0xd, 0x0, 0xc6, 0x6b, 0x66, 0x79, 0x0, + 0x0, 0xd, 0x0, 0x71, 0x80, 0x14, 0x11, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x60, 0x2, 0xb5, 0x0, + 0x0, 0xe, 0x3, 0x82, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x5, 0x13, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+6A39 "樹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x4, 0x90, 0x0, 0xb, 0x10, + 0x0, 0xd, 0x0, 0x4, 0x81, 0x40, 0xc, 0x0, + 0x0, 0xd, 0x4, 0x68, 0xb6, 0x50, 0xc, 0x0, + 0x6, 0x6e, 0x86, 0x3, 0x81, 0x2, 0x2c, 0x70, + 0x0, 0x1d, 0x0, 0x66, 0x88, 0x54, 0x4d, 0x41, + 0x0, 0x4e, 0x10, 0x76, 0x69, 0x10, 0xc, 0x0, + 0x0, 0x9e, 0xa5, 0xc0, 0xc, 0x18, 0xc, 0x0, + 0x0, 0xbd, 0x18, 0xc0, 0xc, 0xa, 0x4c, 0x0, + 0x5, 0x5d, 0x0, 0xc6, 0x6b, 0x5, 0x3c, 0x0, + 0x8, 0xd, 0x0, 0x50, 0xb, 0x20, 0xc, 0x0, + 0x21, 0xd, 0x0, 0x75, 0x29, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0x25, 0x74, 0x50, 0xc, 0x0, + 0x0, 0xd, 0x7, 0xaa, 0x72, 0x0, 0xc, 0x0, + 0x0, 0xe, 0x5, 0x20, 0x0, 0x17, 0xdc, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+6A4B "橋" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x2, 0x6a, 0xf6, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x6d, 0x61, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x12, 0x3d, 0x22, 0x26, 0x30, + 0x6, 0x6e, 0x87, 0x34, 0xc5, 0x49, 0x44, 0x30, + 0x0, 0x1e, 0x0, 0x8, 0x60, 0x2, 0xb6, 0x0, + 0x0, 0x5e, 0x10, 0x76, 0xb6, 0x6b, 0x78, 0xc2, + 0x0, 0x9e, 0xa7, 0x2, 0x90, 0x9, 0x40, 0x0, + 0x0, 0xbd, 0x18, 0x2, 0x96, 0x69, 0x20, 0x0, + 0x5, 0x4d, 0x0, 0xc5, 0x55, 0x55, 0x56, 0xd0, + 0x7, 0xd, 0x0, 0xd0, 0x66, 0x69, 0x31, 0xa0, + 0x21, 0xd, 0x0, 0xd0, 0xb0, 0xc, 0x11, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0xb6, 0x6d, 0x1, 0xa0, + 0x0, 0xd, 0x0, 0xd0, 0x40, 0x2, 0x2, 0xa0, + 0x0, 0xe, 0x0, 0xd0, 0x0, 0x4, 0x9d, 0x80, + 0x0, 0x4, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, + + /* U+6A5F "機" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x8, 0x40, 0xd2, 0x49, 0x0, + 0x0, 0xd, 0x0, 0xb, 0x10, 0xd0, 0x93, 0x0, + 0x0, 0xd, 0x20, 0x62, 0x97, 0xc3, 0x65, 0x90, + 0x6, 0x6e, 0xa7, 0xda, 0xc0, 0xcb, 0xad, 0x20, + 0x0, 0x1d, 0x0, 0x8, 0x30, 0xc1, 0x45, 0x0, + 0x0, 0x4e, 0x10, 0x53, 0x55, 0xc2, 0x62, 0x90, + 0x0, 0x8e, 0xa5, 0xc7, 0x49, 0xc9, 0xa5, 0xb0, + 0x0, 0xad, 0x18, 0x9, 0x20, 0xb0, 0x65, 0x0, + 0x3, 0x5d, 0x2, 0x6d, 0x66, 0xd6, 0x6c, 0xd2, + 0x7, 0xd, 0x0, 0xc, 0x0, 0x92, 0x1, 0x0, + 0x13, 0xd, 0x0, 0xd, 0x0, 0x75, 0xe, 0x30, + 0x0, 0xd, 0x0, 0x38, 0xa3, 0x2b, 0xa9, 0x0, + 0x0, 0xd, 0x0, 0x91, 0x14, 0xd, 0xb0, 0x32, + 0x0, 0xd, 0x4, 0x60, 0x4, 0x94, 0xc8, 0x72, + 0x0, 0xd, 0x35, 0x0, 0x52, 0x0, 0x7, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B21 "次" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0xa, + 0x40, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x2f, + 0x23, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x91, + 0x50, 0xa9, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x42, + 0x1b, 0x3, 0x0, 0x1d, 0x50, 0x0, 0x7, 0x8, + 0x20, 0xc6, 0x6, 0x20, 0x0, 0x2, 0x52, 0x70, + 0xd, 0x40, 0x10, 0x0, 0x0, 0x80, 0x60, 0x0, + 0xd5, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x3a, + 0x60, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x8, 0x52, + 0x60, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0xa, + 0x0, 0x0, 0xa, 0x50, 0x0, 0x93, 0x0, 0x5a, + 0x0, 0x0, 0xc7, 0x0, 0x75, 0x0, 0x0, 0xba, + 0x0, 0x3, 0x21, 0x83, 0x0, 0x0, 0x0, 0xcb, + 0x10, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B32 "欲" */ + 0x0, 0x3, 0x1, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x4d, 0x3, 0xa2, 0x6, 0x90, 0x0, 0x0, + 0x1, 0xb1, 0x0, 0x6a, 0xa, 0x20, 0x0, 0x0, + 0x8, 0x10, 0xb3, 0x2, 0xd, 0x66, 0x69, 0xb0, + 0x10, 0x4, 0xe2, 0x0, 0x54, 0x10, 0xa, 0x20, + 0x0, 0xc, 0x27, 0xc2, 0x70, 0xd4, 0x31, 0x0, + 0x0, 0x93, 0x0, 0x5a, 0x10, 0xc4, 0x0, 0x0, + 0x6, 0x40, 0x0, 0x10, 0x0, 0xc5, 0x0, 0x0, + 0x21, 0xb6, 0x66, 0xe0, 0x2, 0xa7, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x6, 0x68, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xb, 0x15, 0x60, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x48, 0x0, 0xd0, 0x0, + 0x0, 0xc6, 0x66, 0xd1, 0xa0, 0x0, 0x7c, 0x10, + 0x0, 0x70, 0x0, 0x57, 0x0, 0x0, 0xc, 0xb1, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+6B4C "歌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x78, 0x0, 0x0, + 0x4, 0x76, 0x66, 0x6d, 0x61, 0xb4, 0x0, 0x0, + 0x0, 0x66, 0x68, 0xc, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x84, 0xb, 0xc, 0x5, 0x96, 0x66, 0xe3, + 0x0, 0x88, 0x6b, 0xc, 0x8, 0x5, 0x5, 0x60, + 0x0, 0x72, 0x6, 0x1b, 0x31, 0xf, 0x13, 0x0, + 0x6, 0x66, 0x66, 0x68, 0xb0, 0x1f, 0x10, 0x0, + 0x1, 0x0, 0x0, 0x3a, 0x0, 0x3b, 0x40, 0x0, + 0x1, 0xc6, 0x6c, 0x3a, 0x0, 0x68, 0x70, 0x0, + 0x0, 0xd0, 0xc, 0x3a, 0x0, 0xa4, 0x90, 0x0, + 0x0, 0xe6, 0x6c, 0x3a, 0x0, 0xc0, 0x64, 0x0, + 0x1, 0xb0, 0x5, 0x3a, 0x6, 0x60, 0x1c, 0x0, + 0x0, 0x0, 0x5, 0x7a, 0x29, 0x0, 0x9, 0xb0, + 0x0, 0x0, 0x1, 0xc5, 0x70, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+6B50 "歐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x16, 0x9, 0x60, 0x0, 0x0, + 0xc, 0x66, 0x66, 0x65, 0xc, 0x20, 0x0, 0x0, + 0xc, 0x6, 0x66, 0x85, 0xc, 0x0, 0x0, 0x0, + 0xc, 0x9, 0x10, 0x84, 0x5a, 0x66, 0x6d, 0x50, + 0xc, 0x9, 0x10, 0x83, 0x90, 0x51, 0x28, 0x0, + 0xc, 0xa, 0x66, 0xa5, 0x40, 0xa7, 0x30, 0x0, + 0xc, 0x3, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0xc, 0x46, 0xc4, 0x98, 0x60, 0xc6, 0x0, 0x0, + 0xc, 0x53, 0xd0, 0xb6, 0x40, 0xe7, 0x0, 0x0, + 0xc, 0x53, 0xd0, 0xb6, 0x42, 0xc5, 0x30, 0x0, + 0xc, 0x58, 0xe0, 0xca, 0x46, 0x71, 0xa0, 0x0, + 0xc, 0x41, 0x10, 0x51, 0xc, 0x10, 0xa4, 0x0, + 0xc, 0x0, 0x0, 0x50, 0x84, 0x0, 0x3f, 0x40, + 0x9, 0x66, 0x66, 0x6a, 0x40, 0x0, 0x7, 0xc1, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+6B61 "歡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x51, 0xb0, 0x0, 0x96, 0x0, 0x0, + 0x4, 0x7a, 0x86, 0xc8, 0x80, 0xd3, 0x0, 0x0, + 0x0, 0x6, 0x20, 0x80, 0x1, 0xd0, 0x0, 0x0, + 0x2, 0x96, 0xa8, 0x6b, 0x36, 0xb6, 0x69, 0xa0, + 0x2, 0xa2, 0x9a, 0xc, 0xa, 0x22, 0x9, 0x10, + 0x2, 0xa9, 0x87, 0x68, 0x26, 0x2d, 0x22, 0x0, + 0x0, 0x2d, 0x38, 0x0, 0x20, 0x3c, 0x0, 0x0, + 0x0, 0xa9, 0x6a, 0x69, 0x60, 0x4b, 0x0, 0x0, + 0x3, 0xd3, 0xc, 0x5, 0x0, 0x78, 0x30, 0x0, + 0x5, 0x88, 0x6d, 0x66, 0x10, 0xa3, 0x70, 0x0, + 0x0, 0x88, 0x6d, 0x69, 0x0, 0xd0, 0x90, 0x0, + 0x0, 0x83, 0xc, 0x2, 0x7, 0x60, 0x48, 0x0, + 0x0, 0x88, 0x69, 0x69, 0x59, 0x0, 0xd, 0x60, + 0x0, 0x92, 0x0, 0x4, 0x70, 0x0, 0x3, 0xc2, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+6B62 "止" */ + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0xd1, 0x0, 0x4, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x66, 0x8a, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x0, 0x1, 0x0, + 0x5, 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x6d, 0xc0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B63 "正" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x57, 0x66, 0x66, 0x96, 0x66, 0x6b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf2, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe6, 0x66, 0xd8, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xb, 0x30, + 0x6, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + + /* U+6B64 "此" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x10, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x40, 0xd, 0x0, 0xd, 0x0, 0x7, 0x10, + 0x0, 0xd3, 0xd, 0x0, 0xd, 0x0, 0x8e, 0x40, + 0x0, 0xc0, 0xd, 0x6b, 0x6d, 0x19, 0x60, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x60, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0xd, 0x3, 0x3d, 0x0, 0x0, 0x50, + 0x0, 0xc0, 0x4d, 0x72, 0xd, 0x0, 0x0, 0x70, + 0x17, 0xec, 0x60, 0x0, 0xd, 0x10, 0x4, 0xd0, + 0x2c, 0x40, 0x0, 0x0, 0x6, 0xbc, 0xcb, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B65 "步" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0xe6, 0x66, 0xa9, 0x0, 0x0, 0xd, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0xe0, 0x0, 0x0, 0x10, 0x56, 0x6d, 0x66, + 0x6d, 0x66, 0x66, 0xbc, 0x10, 0x0, 0x0, 0x0, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, 0xe, + 0x0, 0x0, 0x60, 0x0, 0x0, 0xc7, 0x0, 0xe0, + 0x0, 0xad, 0x20, 0x0, 0x69, 0x0, 0xe, 0x0, + 0x8c, 0x10, 0x0, 0x2a, 0x0, 0x0, 0xf0, 0xaa, + 0x0, 0x0, 0x17, 0x0, 0x0, 0x6, 0xc6, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x29, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x76, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B69 "歩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x72, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0xe6, 0x66, 0xd2, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x3, 0x20, + 0x6, 0x76, 0xa6, 0x66, 0xb6, 0x66, 0x6a, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xd0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x2, 0xb0, 0x4, 0xb4, 0x0, + 0x0, 0x4, 0xd2, 0x2, 0xb0, 0x1, 0x5e, 0x70, + 0x0, 0x1b, 0x10, 0x2, 0xb0, 0x1d, 0xc4, 0x90, + 0x1, 0x81, 0x0, 0x3, 0xb3, 0xe9, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x8d, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x88, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B6F "歯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0xa, 0x30, 0x2, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0xa, 0x86, 0x68, 0x70, 0x0, + 0x0, 0x0, 0xd0, 0xa, 0x30, 0x0, 0x1, 0x0, + 0x5, 0x66, 0xe6, 0x6c, 0x86, 0x66, 0x6e, 0x80, + 0x1, 0x0, 0x0, 0x6, 0x30, 0x11, 0x0, 0x0, + 0x0, 0x92, 0x2a, 0x9, 0x40, 0xa9, 0x5, 0x0, + 0x0, 0xd0, 0x7, 0x59, 0x34, 0x70, 0xe, 0x10, + 0x0, 0xd1, 0x66, 0x6b, 0x8a, 0x6d, 0x4e, 0x0, + 0x0, 0xd0, 0x20, 0x9e, 0x94, 0x0, 0xe, 0x0, + 0x0, 0xd0, 0x4, 0x89, 0x39, 0xb1, 0xe, 0x0, + 0x0, 0xd0, 0x38, 0x9, 0x30, 0x98, 0xe, 0x0, + 0x0, 0xd2, 0x40, 0x8, 0x20, 0x1, 0xe, 0x0, + 0x1, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+6B72 "歲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0xa, 0x76, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xc0, 0xa, 0x20, 0x0, 0x3, 0x20, + 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x7a, 0xa, 0x41, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x8c, 0x30, + 0x0, 0xa3, 0x0, 0x0, 0x2c, 0x0, 0x30, 0x0, + 0x0, 0xa4, 0x77, 0x7b, 0x1e, 0x0, 0xe7, 0x0, + 0x0, 0xb2, 0x15, 0x50, 0xb, 0x36, 0xb0, 0x0, + 0x0, 0xc1, 0xb7, 0x5a, 0x66, 0x9d, 0x20, 0x0, + 0x0, 0xd2, 0x75, 0xac, 0x11, 0xf5, 0x0, 0x10, + 0x1, 0xa3, 0x7, 0xe1, 0xb, 0xba, 0x0, 0x60, + 0x6, 0x30, 0x4a, 0x11, 0xb5, 0xa, 0xb3, 0x90, + 0x7, 0x17, 0x50, 0x68, 0x10, 0x0, 0x8f, 0xc0, + 0x20, 0x30, 0x5, 0x10, 0x0, 0x0, 0x0, 0x40, + + /* U+6B73 "歳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xa, 0x50, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0xa, 0x66, 0x6b, 0x60, 0x0, + 0x0, 0x0, 0xc0, 0xa, 0x10, 0x0, 0x6, 0x10, + 0x7, 0x66, 0x96, 0x68, 0x86, 0x76, 0x69, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0xb, 0x41, 0x0, + 0x0, 0x96, 0x66, 0x66, 0x9c, 0x67, 0x7c, 0x30, + 0x0, 0xc1, 0x0, 0x1, 0x2b, 0x0, 0x20, 0x0, + 0x0, 0xc5, 0x77, 0x79, 0x6e, 0x0, 0xe7, 0x0, + 0x0, 0xc0, 0x5, 0x60, 0xb, 0x36, 0xc0, 0x0, + 0x0, 0xc0, 0xc6, 0x69, 0x16, 0xad, 0x20, 0x0, + 0x0, 0xc5, 0x55, 0x64, 0xa1, 0xf5, 0x0, 0x0, + 0x2, 0xa5, 0x5, 0x60, 0x3b, 0xc9, 0x0, 0x50, + 0x6, 0x30, 0x6e, 0x21, 0xa4, 0xb, 0xa1, 0x80, + 0x8, 0x0, 0x1, 0x57, 0x0, 0x0, 0x9f, 0xb0, + 0x20, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x40, + + /* U+6B77 "歷" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0x20, + 0x0, 0xd6, 0x66, 0x68, 0x66, 0x66, 0x67, 0x40, + 0x0, 0xd1, 0x37, 0xbb, 0x21, 0x48, 0xc8, 0x0, + 0x0, 0xd2, 0x15, 0x70, 0x3, 0x2c, 0x0, 0x0, + 0x0, 0xd4, 0x69, 0xab, 0x36, 0x6d, 0x69, 0x70, + 0x0, 0xd0, 0xe, 0x91, 0x1, 0xcc, 0x60, 0x0, + 0x0, 0xd0, 0x5a, 0x8c, 0x18, 0x4c, 0x57, 0x0, + 0x0, 0xd1, 0x75, 0x71, 0x64, 0xc, 0x9, 0x90, + 0x0, 0xc5, 0x5, 0x62, 0x35, 0x9, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x3, 0x70, 0xd, 0x10, 0x1c, 0x66, 0xc3, 0x0, + 0x7, 0x20, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0x9, 0x0, 0xc, 0x0, 0x1b, 0x0, 0x0, 0x10, + 0x25, 0x56, 0x6d, 0x66, 0x6c, 0x66, 0x6b, 0xd1, + 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B7B "死" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x7, 0x66, 0x97, 0x66, 0x69, 0x66, 0x6a, 0x80, + 0x0, 0x0, 0xd2, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x5, 0x80, 0x15, 0xc, 0x10, 0xa, 0x20, + 0x0, 0xb, 0x76, 0x9d, 0xc, 0x10, 0x9b, 0x20, + 0x0, 0x2b, 0x0, 0x87, 0xc, 0x18, 0x60, 0x0, + 0x0, 0xa8, 0x50, 0xd2, 0xc, 0x72, 0x0, 0x0, + 0x4, 0x60, 0xe3, 0xc0, 0xc, 0x10, 0x0, 0x0, + 0x15, 0x0, 0x2a, 0x40, 0xc, 0x10, 0x0, 0x10, + 0x0, 0x0, 0x4b, 0x0, 0xc, 0x10, 0x0, 0x60, + 0x0, 0x1, 0xb1, 0x0, 0xc, 0x10, 0x1, 0x70, + 0x0, 0x1a, 0x10, 0x0, 0xc, 0x41, 0x16, 0xd1, + 0x3, 0x70, 0x0, 0x0, 0x5, 0xab, 0xba, 0x70, + 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B8A "殊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc1, 0x0, 0x0, + 0x5, 0x66, 0x6b, 0x64, 0xc0, 0xd0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x7, 0x70, 0xd0, 0x4, 0x0, + 0x0, 0x58, 0x0, 0xa, 0x66, 0xe6, 0x79, 0x10, + 0x0, 0x89, 0x6a, 0x38, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb1, 0xe, 0x60, 0x0, 0xd0, 0x0, 0x20, + 0x0, 0xc0, 0x2b, 0x56, 0x68, 0xe6, 0x69, 0xb1, + 0x5, 0x88, 0x58, 0x0, 0x1e, 0xd6, 0x0, 0x0, + 0x7, 0xa, 0x94, 0x0, 0x87, 0xd7, 0x10, 0x0, + 0x10, 0x0, 0xc0, 0x2, 0xc0, 0xd2, 0x80, 0x0, + 0x0, 0x5, 0x70, 0xa, 0x10, 0xd0, 0xa5, 0x0, + 0x0, 0xa, 0x0, 0x83, 0x0, 0xd0, 0x1e, 0x70, + 0x0, 0x72, 0x7, 0x20, 0x0, 0xe0, 0x4, 0xa2, + 0x4, 0x30, 0x20, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+6B8B "残" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x51, 0x0, 0x0, + 0x6, 0x67, 0x66, 0xc1, 0xa, 0x34, 0x90, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xa, 0x40, 0xa5, 0x0, + 0x0, 0x39, 0x0, 0x0, 0x9, 0x40, 0x16, 0x0, + 0x0, 0x75, 0x1, 0x54, 0x6b, 0x96, 0x67, 0x20, + 0x0, 0xb6, 0x69, 0xb1, 0x8, 0x50, 0x0, 0x0, + 0x1, 0xc0, 0x7, 0x50, 0x7, 0x62, 0x4b, 0x50, + 0x6, 0x4b, 0xb, 0x26, 0x69, 0xb3, 0x13, 0x0, + 0x6, 0xa, 0x3c, 0x0, 0x3, 0xa0, 0x6c, 0x0, + 0x10, 0x0, 0x57, 0x0, 0x0, 0xe3, 0xd1, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0x6, 0x50, 0x0, 0x5, 0xcd, 0x10, 0x50, + 0x0, 0x37, 0x0, 0x1, 0x97, 0x6, 0xc2, 0x80, + 0x2, 0x60, 0x2, 0x56, 0x10, 0x0, 0x6e, 0xd0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6BB5 "段" */ + 0x0, 0x0, 0x4, 0xa0, 0x10, 0x2, 0x0, 0x0, + 0x0, 0xa6, 0x86, 0x41, 0xc6, 0x6e, 0x30, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0x2, 0x0, 0xd0, 0xd, 0x0, 0x0, + 0x0, 0xc6, 0x68, 0x51, 0xb0, 0xc, 0x11, 0x0, + 0x0, 0xc0, 0x0, 0x8, 0x30, 0x6, 0xaa, 0x40, + 0x0, 0xc0, 0x3, 0x45, 0x22, 0x23, 0x80, 0x0, + 0x0, 0xc6, 0x66, 0x33, 0x73, 0x38, 0xb0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x60, 0xc, 0x30, 0x0, + 0x0, 0xc0, 0x14, 0x62, 0x17, 0x3b, 0x0, 0x0, + 0x27, 0xeb, 0x83, 0x0, 0x8, 0xc2, 0x0, 0x0, + 0x18, 0xd0, 0x0, 0x0, 0xa, 0xd3, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x3, 0xa3, 0x2d, 0x81, 0x0, + 0x0, 0xd1, 0x4, 0x75, 0x0, 0x1, 0xaf, 0x90, + 0x0, 0x30, 0x31, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+6BCD "母" */ + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x3, 0xd6, 0x66, 0x66, 0x67, 0xe1, 0x0, + 0x0, 0x5, 0xa0, 0x2a, 0x10, 0x3, 0xb0, 0x0, + 0x0, 0x6, 0x80, 0x8, 0xa0, 0x4, 0xa0, 0x0, + 0x0, 0x8, 0x60, 0x1, 0x80, 0x5, 0x90, 0x0, + 0x16, 0x6b, 0x96, 0x66, 0x66, 0x6a, 0xbb, 0xb0, + 0x1, 0xb, 0x30, 0x20, 0x0, 0x7, 0x70, 0x0, + 0x0, 0xd, 0x10, 0x1c, 0x20, 0x8, 0x60, 0x0, + 0x0, 0xf, 0x0, 0x8, 0xb0, 0xa, 0x50, 0x0, + 0x0, 0x1d, 0x0, 0x1, 0x60, 0xb, 0x40, 0x0, + 0x0, 0x5d, 0x66, 0x66, 0x66, 0x6d, 0x8c, 0x90, + 0x0, 0x14, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x32, 0x3e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+6BCE "毎" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf6, 0x66, 0x66, 0x66, 0xbb, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x83, 0x30, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x5, 0x22, 0xd6, 0x68, 0xc6, 0x6b, 0x90, 0x0, + 0x0, 0x4, 0xa0, 0x5, 0x80, 0x9, 0x40, 0x0, + 0x0, 0x5, 0x80, 0x7, 0x70, 0x9, 0x42, 0x0, + 0x26, 0x6a, 0xa6, 0x6b, 0x96, 0x6c, 0x8b, 0x80, + 0x0, 0xa, 0x40, 0xa, 0x30, 0xb, 0x20, 0x0, + 0x0, 0xc, 0x20, 0xc, 0x10, 0xc, 0x20, 0x0, + 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x14, 0x0, + 0x0, 0x3e, 0x66, 0x69, 0x66, 0x6e, 0x6a, 0x40, + 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+6BCF "每" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xe6, 0x66, 0x66, 0x66, 0xcb, 0x0, + 0x0, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x30, 0x0, 0x0, 0x4, 0x30, 0x0, + 0x6, 0x42, 0xd6, 0x77, 0x66, 0x6b, 0x80, 0x0, + 0x22, 0x3, 0xa0, 0xa, 0x80, 0x9, 0x40, 0x0, + 0x0, 0x5, 0x80, 0x1, 0xd0, 0xa, 0x32, 0x0, + 0x26, 0x6a, 0xa6, 0x66, 0x66, 0x6c, 0x8b, 0x90, + 0x0, 0x9, 0x40, 0x27, 0x0, 0xc, 0x20, 0x0, + 0x0, 0xb, 0x20, 0x8, 0xb0, 0xd, 0x10, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x90, 0xe, 0x4, 0x0, + 0x0, 0x2e, 0x66, 0x66, 0x66, 0x6f, 0x6a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xc9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+6BD4 "比" */ + 0x26, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x0, 0x2b, 0x0, 0x0, + 0xd, 0x0, 0x2f, 0x60, 0x2b, 0x0, 0x0, 0xd, + 0x1, 0xc5, 0x0, 0x2d, 0x66, 0x9b, 0xd, 0xa, + 0x30, 0x0, 0x2b, 0x0, 0x0, 0xe, 0x71, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x10, 0x2b, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x60, 0x2b, 0x4, 0x75, + 0xd, 0x0, 0x0, 0x80, 0x4e, 0xd6, 0x0, 0xf, + 0x21, 0x15, 0xe1, 0x9, 0x10, 0x0, 0x7, 0xbb, + 0xbb, 0x70, + + /* U+6BDB "毛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9d, 0xdb, 0x20, 0x0, + 0x0, 0x35, 0x67, 0x7e, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x5, 0x60, 0x0, + 0x0, 0x23, 0x46, 0x6e, 0x66, 0x66, 0x50, 0x0, + 0x0, 0x23, 0x10, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, 0x40, + 0x0, 0x0, 0x23, 0x5e, 0x66, 0x66, 0x66, 0x40, + 0x6, 0x65, 0x32, 0x1d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xdd, 0xb1, + + /* U+6C0F "氏" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, + 0x0, 0x3, 0x69, 0xee, 0x80, 0x0, 0xd, 0x66, + 0x67, 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x1a, 0x10, 0xe, 0x66, 0x66, 0xe6, 0x66, 0x66, + 0x30, 0xd, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x1e, 0x10, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x18, 0xb0, 0x0, 0x40, 0xd, 0x5, 0x92, + 0x0, 0xca, 0x0, 0x80, 0x1f, 0xd7, 0x0, 0x0, + 0xb, 0xd6, 0x90, 0x1d, 0x30, 0x0, 0x0, 0x0, + 0x6e, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, + + /* U+6C11 "民" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + 0xb7, 0x66, 0x66, 0x66, 0x6e, 0x30, 0x0, 0xb, + 0x20, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xb, 0x76, + 0x66, 0xc6, 0x66, 0xe0, 0x0, 0x0, 0xb2, 0x0, + 0xd, 0x0, 0x1, 0x0, 0x0, 0xb, 0x20, 0x0, + 0xb2, 0x0, 0x0, 0x50, 0x0, 0xb7, 0x66, 0x6b, + 0x86, 0x66, 0x89, 0x30, 0xb, 0x20, 0x0, 0x58, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x8, 0x80, + 0x0, 0x11, 0x0, 0xb2, 0x6, 0x50, 0xd, 0x60, + 0x5, 0x20, 0xc, 0xac, 0x30, 0x0, 0x2d, 0x91, + 0x92, 0x0, 0xc9, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x43, + 0x0, + + /* U+6C14 "气" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x7, 0xb6, 0x66, 0x66, 0x66, 0xaa, 0x10, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x83, 0x27, 0x66, 0x66, 0x69, 0x60, 0x0, + 0x3, 0x60, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x5, 0x7, 0x66, 0x66, 0x66, 0x8d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc1, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6C17 "気" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, 0x37, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x66, 0x66, 0x10, + 0x0, 0x2a, 0x46, 0x66, 0x66, 0x6a, 0x70, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x6, 0x26, 0x76, 0x66, 0x66, 0x6d, 0x50, 0x0, + 0x12, 0x0, 0x0, 0x0, 0xb5, 0xd, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x4, 0xd1, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x66, 0x2d, 0x20, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x0, 0x9, 0x7c, 0xa0, 0x8, 0x50, 0x10, + 0x0, 0x0, 0x95, 0x0, 0xd7, 0x3, 0xb0, 0x50, + 0x0, 0x18, 0x20, 0x0, 0x35, 0x0, 0xc4, 0x80, + 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+6C34 "水" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x2, 0xe6, 0x0, + 0x5, 0x66, 0x6d, 0x2c, 0x80, 0x2a, 0x20, 0x0, + 0x1, 0x0, 0x3c, 0xc, 0x67, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x87, 0xc, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0xc, 0x27, 0x40, 0x0, 0x0, + 0x0, 0x5, 0x90, 0xc, 0x21, 0xd1, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xc, 0x20, 0x7b, 0x0, 0x0, + 0x0, 0x76, 0x0, 0xc, 0x20, 0xb, 0xb0, 0x0, + 0x2, 0x80, 0x0, 0xc, 0x20, 0x1, 0xcd, 0x60, + 0x16, 0x0, 0x2, 0x1d, 0x20, 0x0, 0x9, 0x30, + 0x0, 0x0, 0x5, 0xde, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+6C37 "氷" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x0, 0xb3, 0x0, 0x3, 0x0, 0x0, 0xb, + 0xb0, 0xb, 0x40, 0x6, 0xd0, 0x0, 0x0, 0xc, + 0x30, 0xb9, 0x3, 0xb1, 0x0, 0x0, 0x0, 0x3, + 0x1b, 0xa4, 0x80, 0x0, 0x0, 0x57, 0x66, 0xd6, + 0xb5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb, + 0x3b, 0x10, 0x0, 0x0, 0x0, 0x8, 0x60, 0xb3, + 0x5a, 0x0, 0x0, 0x0, 0x1, 0xc0, 0xb, 0x30, + 0xc7, 0x0, 0x0, 0x0, 0xa3, 0x0, 0xb3, 0x2, + 0xf7, 0x0, 0x0, 0x76, 0x0, 0xb, 0x30, 0x5, + 0xfb, 0x30, 0x66, 0x0, 0x0, 0xc3, 0x0, 0x4, + 0xb3, 0x32, 0x0, 0x6, 0xdf, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + + /* U+6C38 "永" */ + 0x0, 0x0, 0x0, 0x39, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0x66, 0xe3, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x9b, 0x0, + 0x0, 0x0, 0x2, 0x0, 0xe6, 0x4, 0xb0, 0x0, + 0x2, 0x86, 0x6d, 0x70, 0xe7, 0x29, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0xe4, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0xe0, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x5b, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x0, 0xe0, 0xa, 0x90, 0x0, + 0x0, 0x57, 0x0, 0x0, 0xe0, 0x0, 0xdc, 0x30, + 0x2, 0x70, 0x2, 0x44, 0xd0, 0x0, 0x1b, 0xa1, + 0x4, 0x0, 0x0, 0x4e, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+6C42 "求" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x31, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x8, 0x42, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x8e, 0x20, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x10, 0xd, 0x70, 0x0, 0x80, 0x0, + 0x0, 0x5, 0xf2, 0xd, 0x71, 0x8, 0xc3, 0x0, + 0x0, 0x0, 0xb4, 0xd, 0x38, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x1a, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x49, 0x2d, 0x12, 0xd1, 0x0, 0x0, + 0x0, 0x4b, 0x70, 0xd, 0x10, 0x6d, 0x20, 0x0, + 0x2d, 0xc2, 0x0, 0xd, 0x10, 0x8, 0xf8, 0x20, + 0x6, 0x0, 0x1, 0x1e, 0x10, 0x0, 0x5e, 0x80, + 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+6C5A "汚" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x2d, 0x11, 0x86, 0x7d, 0x66, 0x65, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x67, 0x0, 0x0, 0x0, + 0x19, 0x10, 0x46, 0x66, 0xb9, 0x66, 0x67, 0xc1, + 0x5, 0xd0, 0x60, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x80, 0x60, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x5, 0xd6, 0x66, 0x6b, 0x10, + 0x0, 0x9, 0x0, 0x1, 0x40, 0x0, 0x4c, 0x0, + 0x2, 0x49, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x4, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x86, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x4, 0x13, 0xe0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x1, 0xbf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, + + /* U+6C60 "池" */ + 0x0, 0x71, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x3, 0xe0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x9, 0x10, 0x30, 0xd, 0x0, 0x0, 0x1, 0x0, + 0x4, 0xb, 0x30, 0xd0, 0x3, 0x10, 0x3a, 0x10, + 0x50, 0xb1, 0xd, 0x45, 0xb7, 0x0, 0x7a, 0x5, + 0x1c, 0x65, 0xd0, 0x8, 0x40, 0x1, 0x55, 0x34, + 0xb1, 0xd, 0x0, 0x84, 0x0, 0x0, 0x80, 0xb, + 0x10, 0xd0, 0x9, 0x30, 0x0, 0x17, 0x0, 0xb1, + 0xd, 0x0, 0xa3, 0x0, 0x9, 0x30, 0xb, 0x10, + 0xd4, 0xae, 0x0, 0x19, 0xf0, 0x0, 0xb1, 0xe, + 0x2, 0x33, 0x20, 0x1d, 0x0, 0xb, 0x10, 0x50, + 0x0, 0x44, 0x4, 0xd0, 0x0, 0xb3, 0x0, 0x0, + 0x7, 0xc0, 0x3c, 0x0, 0x4, 0xbc, 0xcc, 0xcc, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6C7A "決" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x43, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0xd4, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x5, + 0x60, 0x10, 0xe, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x53, 0x76, 0xe6, 0x6c, 0x60, 0x6, 0x60, 0x6, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0xc, 0x54, 0x20, + 0x0, 0xd0, 0xb, 0x30, 0x0, 0x43, 0x80, 0x0, + 0xd, 0x0, 0xb3, 0x0, 0x0, 0x27, 0x56, 0x66, + 0xd6, 0x6c, 0x9c, 0x10, 0x9, 0x11, 0x10, 0x49, + 0x50, 0x0, 0x0, 0x46, 0xb0, 0x0, 0x9, 0x48, + 0x10, 0x0, 0x0, 0xa8, 0x0, 0x1, 0xd0, 0x2b, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x95, 0x0, 0xa8, + 0x0, 0x0, 0xa7, 0x0, 0x68, 0x0, 0x1, 0xda, + 0x10, 0x4, 0x40, 0x57, 0x0, 0x0, 0x2, 0xdd, + 0x10, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C88 "沈" */ + 0x0, 0x10, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x20, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0xb6, 0x7c, 0x66, 0x6e, 0x30, + 0x15, 0x0, 0x48, 0x70, 0x3a, 0x0, 0x35, 0x0, + 0x8, 0x90, 0x52, 0x0, 0x49, 0x0, 0x10, 0x0, + 0x0, 0x63, 0x20, 0x0, 0x6d, 0x50, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x9c, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0xd8, 0x60, 0x0, 0x0, + 0x0, 0x65, 0x0, 0x3, 0xb7, 0x60, 0x0, 0x0, + 0x18, 0xf2, 0x0, 0xa, 0x37, 0x60, 0x0, 0x30, + 0x0, 0xf0, 0x0, 0x48, 0x7, 0x60, 0x0, 0x60, + 0x1, 0xf0, 0x2, 0x90, 0x6, 0x60, 0x0, 0xa0, + 0x3, 0xf0, 0x37, 0x0, 0x3, 0xdb, 0xbb, 0xc1, + 0x0, 0x31, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C92 "沒" */ + 0x0, 0x31, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x30, 0x7, 0x80, 0x0, 0x23, 0x0, + 0x0, 0x6, 0x71, 0xb, 0x66, 0x66, 0xaa, 0x0, + 0x0, 0x0, 0x5, 0x38, 0x0, 0x0, 0x85, 0x0, + 0x8, 0x20, 0x5, 0x90, 0x0, 0x0, 0xb2, 0x0, + 0x2, 0xe1, 0x47, 0x20, 0x0, 0x2b, 0xc0, 0x0, + 0x0, 0x81, 0x81, 0x66, 0x66, 0x67, 0x95, 0x0, + 0x0, 0x2, 0x60, 0x6, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x9, 0x10, 0x7, 0x0, 0x5, 0xa0, 0x0, + 0x4, 0x5a, 0x0, 0x2, 0x80, 0x1d, 0x10, 0x0, + 0x1, 0xc7, 0x0, 0x0, 0x95, 0xc4, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x3, 0xc5, 0xab, 0x40, 0x0, + 0x0, 0x74, 0x3, 0x98, 0x10, 0x5, 0xee, 0xa2, + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x5, 0x30, + + /* U+6CB9 "油" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x4a, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x1, + 0x14, 0x86, 0x6d, 0x66, 0x6b, 0x10, 0x60, 0x0, + 0x4d, 0x0, 0xb1, 0x0, 0xd0, 0x6, 0xb0, 0x50, + 0xd0, 0xb, 0x10, 0xd, 0x0, 0xa, 0x7, 0xd, + 0x0, 0xb1, 0x0, 0xd0, 0x0, 0x3, 0x60, 0xd0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0x91, 0xd, 0x66, + 0xd6, 0x66, 0xd0, 0x0, 0x1b, 0x0, 0xd0, 0xb, + 0x10, 0xd, 0x0, 0x7e, 0x70, 0xd, 0x0, 0xb1, + 0x0, 0xd0, 0x0, 0xc4, 0x0, 0xd0, 0xb, 0x10, + 0xd, 0x0, 0xd, 0x40, 0xd, 0x66, 0xc6, 0x66, + 0xd0, 0x0, 0xe4, 0x0, 0xd0, 0x0, 0x0, 0xd, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, + + /* U+6CBB "治" */ + 0x1, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, + 0x1c, 0x40, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, + 0x5b, 0x1, 0x7, 0x60, 0x1, 0x0, 0x0, 0x0, + 0x21, 0x31, 0x90, 0x0, 0x83, 0x0, 0x50, 0x0, + 0x50, 0x90, 0x0, 0x0, 0xc5, 0x3, 0xd1, 0x6, + 0xbc, 0xa8, 0x76, 0x67, 0xf0, 0xb, 0x33, 0x44, + 0x30, 0x0, 0x0, 0x7, 0x0, 0x0, 0x80, 0x3, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x19, 0x0, 0xe6, + 0x66, 0x67, 0xc0, 0x0, 0x8, 0x50, 0xd, 0x0, + 0x0, 0x2a, 0x0, 0x29, 0xf1, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x0, 0x1f, 0x0, 0xd, 0x0, 0x0, + 0x2a, 0x0, 0x3, 0xe0, 0x0, 0xd6, 0x66, 0x67, + 0xa0, 0x0, 0x3d, 0x0, 0xd, 0x0, 0x0, 0x2a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6CC1 "況" */ + 0x0, 0x30, 0x0, 0x30, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x1d, 0x20, 0xb7, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0x8, 0x61, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x5, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x27, 0x0, 0x41, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x8, 0x90, 0x60, 0xa2, 0x0, 0x0, 0x2b, 0x0, + 0x1, 0x92, 0x50, 0xb7, 0xd6, 0xe6, 0x7a, 0x0, + 0x0, 0x8, 0x0, 0x10, 0xd0, 0xd0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x24, 0xa4, 0x0, 0x2, 0xb0, 0xd0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x7, 0x60, 0xd0, 0x0, 0x20, + 0x0, 0xf0, 0x0, 0x1c, 0x0, 0xd0, 0x0, 0x60, + 0x3, 0xf0, 0x1, 0xb2, 0x0, 0xc0, 0x0, 0xb0, + 0x1, 0xa0, 0x38, 0x10, 0x0, 0x8c, 0xbb, 0xc1, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CCA "泊" */ + 0x1, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x1, + 0xb2, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x80, 0x0, 0x10, 0x0, 0x2, 0x5, + 0xc6, 0x76, 0x66, 0xd5, 0x41, 0x0, 0x51, 0xc0, + 0x0, 0x0, 0xd1, 0x1d, 0x30, 0x60, 0xc0, 0x0, + 0x0, 0xd1, 0x6, 0x84, 0x30, 0xc0, 0x0, 0x0, + 0xd1, 0x0, 0x8, 0x0, 0xd6, 0x66, 0x66, 0xe1, + 0x0, 0x27, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x0, + 0xa2, 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3b, 0xd0, + 0x0, 0xc0, 0x0, 0x0, 0xd1, 0x3, 0xb0, 0x0, + 0xc0, 0x0, 0x0, 0xd1, 0x5, 0xb0, 0x0, 0xd6, + 0x66, 0x66, 0xe1, 0x5, 0xb0, 0x1, 0xc0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x10, + + /* U+6CD5 "法" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x3d, 0x10, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x0, 0xa, 0x31, 0x0, 0xb, 0x10, 0x1, 0x0, + 0x0, 0x0, 0x5, 0x76, 0x6d, 0x66, 0x79, 0x0, + 0x37, 0x0, 0x50, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x9, 0x90, 0x60, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x1, 0x83, 0x40, 0x0, 0xb, 0x10, 0x1, 0x40, + 0x0, 0x8, 0x18, 0x66, 0x6d, 0x66, 0x67, 0x70, + 0x0, 0x18, 0x0, 0x0, 0x6d, 0x10, 0x0, 0x0, + 0x23, 0xb3, 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x9, 0x40, 0x6, 0x30, 0x0, + 0x0, 0xe0, 0x0, 0x56, 0x0, 0x0, 0xb5, 0x0, + 0x3, 0xe0, 0x7, 0xb6, 0x78, 0x76, 0x6e, 0x40, + 0x1, 0xa0, 0x9, 0xb6, 0x30, 0x0, 0x8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE2 "波" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0xa, 0x11, 0x20, 0x1, 0xb0, 0x2, 0x20, + 0x0, 0x0, 0x5, 0xd6, 0x66, 0xd6, 0x6c, 0xb0, + 0x19, 0x10, 0x23, 0xd0, 0x1, 0xb0, 0x17, 0x0, + 0x4, 0xd0, 0x60, 0xd0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x71, 0x60, 0xd5, 0x66, 0xd6, 0x6a, 0x0, + 0x0, 0x7, 0x10, 0xd0, 0x50, 0x0, 0x78, 0x0, + 0x0, 0xa, 0x0, 0xc0, 0x33, 0x0, 0xd0, 0x0, + 0x12, 0x86, 0x3, 0x90, 0x9, 0x9, 0x50, 0x0, + 0x5, 0xf2, 0x7, 0x40, 0x2, 0xc9, 0x0, 0x0, + 0x0, 0xe0, 0xb, 0x0, 0x4, 0xcb, 0x0, 0x0, + 0x0, 0xf0, 0x63, 0x0, 0x89, 0x5, 0xd5, 0x0, + 0x0, 0xb3, 0x50, 0x68, 0x30, 0x0, 0x3d, 0xc1, + 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE3 "泣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x10, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x40, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x66, 0x66, 0x66, 0xad, 0x10, + 0x8, 0x10, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe0, 0x50, 0x20, 0x0, 0xa, 0x60, 0x0, + 0x0, 0x90, 0x70, 0x52, 0x0, 0xd, 0x30, 0x0, + 0x0, 0x3, 0x50, 0xb, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x9, 0x10, 0xc, 0x30, 0x39, 0x0, 0x0, + 0x1, 0x3b, 0x0, 0x9, 0x80, 0x64, 0x0, 0x0, + 0x5, 0xe7, 0x0, 0x7, 0x80, 0x90, 0x0, 0x0, + 0x0, 0xa5, 0x0, 0x1, 0x10, 0x80, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0x3, 0x40, 0x7, 0x60, + 0x0, 0xa4, 0x37, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE8 "注" */ + 0x0, 0x20, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0x0, 0x4, 0xe2, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0xb, 0x30, 0x1, 0x0, 0x0, + 0x31, 0x56, 0x66, 0x66, 0x67, 0xf4, 0x32, 0x0, + 0x50, 0x20, 0xe, 0x0, 0x0, 0x0, 0xc6, 0x7, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x4, 0xb2, 0x50, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, 0x81, 0x0, + 0x0, 0xe0, 0x7, 0x30, 0x0, 0xa, 0x2, 0x86, + 0x6e, 0x66, 0x65, 0x0, 0x6, 0x70, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x29, 0xf2, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x8, 0x30, 0x4e, 0x4, 0x76, 0x66, 0x66, 0x66, + 0x75, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6CF3 "泳" */ + 0x0, 0x40, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x0, + 0x2, 0xd2, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x25, 0x76, 0xe4, 0x0, 0x20, 0x18, 0x10, + 0x50, 0x0, 0xe, 0x40, 0x5d, 0x10, 0x6d, 0x7, + 0x0, 0x30, 0xe6, 0x38, 0x0, 0x0, 0x82, 0x67, + 0x7f, 0x2e, 0x84, 0x0, 0x0, 0x0, 0x81, 0x3, + 0xa0, 0xe6, 0x30, 0x0, 0x0, 0xa, 0x0, 0x66, + 0xe, 0x19, 0x0, 0x0, 0x27, 0x80, 0xb, 0x10, + 0xe0, 0xb3, 0x0, 0x5, 0xf5, 0x3, 0x90, 0xe, + 0x3, 0xd1, 0x0, 0xe, 0x30, 0xa0, 0x0, 0xe0, + 0xa, 0xd3, 0x1, 0xf2, 0x62, 0x11, 0x1f, 0x0, + 0xb, 0x70, 0xc, 0x20, 0x0, 0x6f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, + + /* U+6D0B "洋" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x24, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x78, 0x0, 0xa, 0x80, 0xd, 0x20, 0x0, + 0x0, 0xd, 0x30, 0x2, 0xd0, 0x46, 0x0, 0x0, + 0x0, 0x3, 0x4, 0x66, 0x76, 0xa6, 0x7e, 0x30, + 0x13, 0x0, 0x22, 0x20, 0xc, 0x10, 0x0, 0x0, + 0x9, 0xa0, 0x60, 0x0, 0xc, 0x10, 0x10, 0x0, + 0x1, 0xd0, 0x70, 0x66, 0x6d, 0x66, 0xa8, 0x0, + 0x0, 0x3, 0x50, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x9, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1b, 0x5, 0x66, 0x6d, 0x66, 0x6c, 0x90, + 0x6, 0xd8, 0x1, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+6D17 "洗" */ + 0x0, 0x10, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, + 0x0, 0x88, 0x0, 0x38, 0xb, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x79, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x4, 0xb8, 0x6c, 0x66, 0xc9, 0x0, + 0x16, 0x0, 0x41, 0x90, 0xb, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x66, 0x10, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x90, 0x61, 0x0, 0xb, 0x0, 0x6, 0x30, + 0x0, 0x4, 0x47, 0x67, 0xc6, 0xb8, 0x66, 0x40, + 0x0, 0x9, 0x0, 0x3, 0xa0, 0x93, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0x5, 0x80, 0x93, 0x0, 0x0, + 0x6, 0xe9, 0x0, 0x9, 0x50, 0x93, 0x0, 0x20, + 0x0, 0x97, 0x0, 0xd, 0x0, 0x93, 0x0, 0x60, + 0x0, 0xd6, 0x0, 0xa5, 0x0, 0x94, 0x1, 0xa0, + 0x0, 0xc6, 0x19, 0x40, 0x0, 0x4d, 0xbc, 0xb0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D32 "洲" */ + 0x0, 0x41, 0x0, 0x13, 0x0, 0x0, 0x8, 0x20, + 0x1, 0xd2, 0x3, 0xc0, 0x9, 0x10, 0xb2, 0x0, + 0x7, 0x32, 0x2a, 0x0, 0xc0, 0xb, 0x10, 0x0, + 0x0, 0x42, 0xa0, 0xc, 0x0, 0xb1, 0x8, 0x30, + 0x50, 0x29, 0x0, 0xc0, 0xb, 0x10, 0x3f, 0x6, + 0x53, 0x97, 0xc, 0x43, 0xb1, 0x0, 0x50, 0x6b, + 0x49, 0x76, 0xc0, 0xdb, 0x10, 0x0, 0x65, 0xb5, + 0x74, 0x3c, 0x5, 0xb1, 0x0, 0xa, 0x0, 0x75, + 0x0, 0xc0, 0xb, 0x10, 0x36, 0x90, 0xa, 0x20, + 0xc, 0x0, 0xb1, 0x3, 0xe6, 0x0, 0xb0, 0x0, + 0xc0, 0xb, 0x10, 0xb, 0x40, 0x66, 0x0, 0xc, + 0x0, 0xb1, 0x0, 0xe4, 0xa, 0x0, 0x0, 0xd0, + 0xb, 0x10, 0xa, 0x37, 0x10, 0x0, 0x1, 0x0, + 0xb2, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+6D3B "活" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x70, 0x0, + 0x0, 0x2c, 0x10, 0x1, 0x47, 0xbe, 0xc5, 0x0, + 0x0, 0x8, 0x62, 0x55, 0x4d, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x17, 0x0, 0x40, 0x0, 0xc, 0x0, 0x0, 0x20, + 0x5, 0xc0, 0x56, 0x66, 0x6d, 0x66, 0x68, 0x80, + 0x0, 0xb1, 0x60, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x0, 0xa6, 0x6c, 0x66, 0xb6, 0x0, + 0x2, 0x58, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, + 0x4, 0xe4, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0xb3, 0x0, 0xd1, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0xd2, 0x0, 0xd6, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0xa2, 0x0, 0xd1, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x40, 0x0, + + /* U+6D3E "派" */ + 0x0, 0x33, 0x0, 0x0, 0x0, 0x1, 0x74, 0x0, + 0x0, 0xc, 0x50, 0x53, 0x56, 0x8a, 0x85, 0x0, + 0x0, 0x4, 0x60, 0x96, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x13, 0x94, 0x10, 0x16, 0xd9, 0x0, + 0x1b, 0x20, 0x50, 0x94, 0xc5, 0x82, 0x0, 0x0, + 0x5, 0xc0, 0x60, 0x94, 0xc0, 0x60, 0x7, 0x10, + 0x0, 0x42, 0x50, 0x93, 0xc0, 0x60, 0x8a, 0x30, + 0x0, 0x8, 0x0, 0xa2, 0xc0, 0x77, 0x20, 0x0, + 0x0, 0xa, 0x0, 0xc0, 0xc0, 0x45, 0x0, 0x0, + 0x15, 0xa7, 0x0, 0xc0, 0xc0, 0xb, 0x0, 0x0, + 0x2, 0xe4, 0x4, 0x70, 0xc0, 0x9, 0x40, 0x0, + 0x0, 0xe3, 0xa, 0x10, 0xc0, 0x12, 0xd3, 0x0, + 0x1, 0xf2, 0x46, 0x0, 0xd9, 0x50, 0x6f, 0x70, + 0x0, 0x82, 0x70, 0x0, 0xa3, 0x0, 0x6, 0x30, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D41 "流" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0xa, 0x30, 0x9, 0x10, + 0x0, 0xb, 0x53, 0x86, 0x6d, 0x66, 0x66, 0x30, + 0x0, 0x1, 0x2, 0x0, 0x86, 0x1, 0x0, 0x0, + 0x16, 0x0, 0x4, 0x5, 0x50, 0x7, 0x30, 0x0, + 0x7, 0xb0, 0x50, 0x79, 0x44, 0x45, 0xe2, 0x0, + 0x0, 0xa0, 0x70, 0x88, 0x53, 0x10, 0x84, 0x0, + 0x0, 0x3, 0x50, 0x95, 0x8, 0x9, 0x30, 0x0, + 0x0, 0x9, 0x0, 0xb2, 0xd, 0xc, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0xc1, 0xd, 0xc, 0x0, 0x0, + 0x7, 0xf6, 0x0, 0xd0, 0xd, 0xc, 0x0, 0x10, + 0x0, 0xc4, 0x1, 0xb0, 0xd, 0xc, 0x0, 0x50, + 0x0, 0xe3, 0x9, 0x30, 0xd, 0xc, 0x0, 0x80, + 0x0, 0xf3, 0x65, 0x0, 0xd, 0x9, 0xcb, 0xc1, + 0x0, 0x12, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+6D45 "浅" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0xe0, 0x88, 0x0, 0x0, 0x3, + 0xa0, 0x10, 0xe, 0x0, 0xd2, 0x0, 0x0, 0x0, + 0x40, 0x0, 0xe0, 0x1, 0x60, 0x8, 0x40, 0x6, + 0x34, 0x5e, 0x66, 0x67, 0x30, 0x1f, 0x31, 0x52, + 0x10, 0xd0, 0x0, 0x10, 0x0, 0x61, 0x70, 0x0, + 0xd, 0x13, 0x5c, 0x70, 0x0, 0x9, 0x46, 0x66, + 0xd5, 0x22, 0x0, 0x0, 0x5, 0x60, 0x0, 0x9, + 0x40, 0xb9, 0x0, 0x11, 0xc1, 0x0, 0x0, 0x59, + 0xa9, 0x0, 0x3, 0xcd, 0x0, 0x0, 0x1, 0xf8, + 0x0, 0x10, 0x5, 0xb0, 0x0, 0x3, 0xb9, 0xb0, + 0x6, 0x0, 0x89, 0x0, 0x17, 0x60, 0x9, 0xb2, + 0xa0, 0x8, 0x90, 0x33, 0x0, 0x0, 0x8, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, + + /* U+6D74 "浴" */ + 0x0, 0x40, 0x0, 0x0, 0x80, 0x3, 0x0, 0x0, + 0x0, 0x4d, 0x20, 0x7, 0xb0, 0x4, 0xb3, 0x0, + 0x0, 0xb, 0x41, 0x2b, 0x2, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x5, 0x80, 0xc, 0x80, 0x8, 0x0, + 0x19, 0x20, 0x44, 0x0, 0x5c, 0x70, 0x0, 0x0, + 0x4, 0xf0, 0x70, 0x1, 0xd1, 0x19, 0x0, 0x0, + 0x0, 0x80, 0x80, 0xb, 0x40, 0x4, 0xc2, 0x0, + 0x0, 0x4, 0x40, 0x97, 0x0, 0x0, 0x6f, 0xa2, + 0x0, 0xa, 0x17, 0x3d, 0x66, 0x66, 0xe6, 0x50, + 0x0, 0x2b, 0x20, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x5, 0xe8, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xa6, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe6, 0x0, 0xe, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xb6, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x20, 0x0, + + /* U+6D77 "海" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x69, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x1a, 0x0, 0xb6, 0x66, 0x66, 0x68, 0x40, + 0x10, 0x0, 0x33, 0x90, 0x0, 0x0, 0x20, 0x0, + 0xb, 0x10, 0x58, 0xa7, 0x66, 0x66, 0xe3, 0x0, + 0x6, 0x71, 0x70, 0xc1, 0x56, 0x0, 0xd0, 0x0, + 0x0, 0x15, 0x0, 0xe0, 0xc, 0x10, 0xd0, 0x0, + 0x0, 0x7, 0x57, 0xe6, 0x66, 0x66, 0xd6, 0xc2, + 0x0, 0x7, 0x4, 0x90, 0x41, 0x1, 0xb0, 0x0, + 0x1, 0x84, 0x6, 0x70, 0x2b, 0x1, 0xb0, 0x0, + 0x6, 0xf0, 0x9, 0x40, 0x7, 0x2, 0xa0, 0x30, + 0x0, 0xe0, 0xc, 0x66, 0x66, 0x68, 0xb6, 0x80, + 0x2, 0xf0, 0x0, 0x0, 0x2, 0x7, 0x70, 0x0, + 0x1, 0xc0, 0x0, 0x0, 0x3, 0xdf, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+6D88 "消" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x10, 0x2, 0xc2, + 0x6, 0x60, 0xe, 0x0, 0xd5, 0x0, 0x78, 0x0, + 0xc6, 0xe, 0x7, 0x60, 0x0, 0x1, 0x4, 0x44, + 0xe, 0x25, 0x0, 0x63, 0x0, 0x42, 0x96, 0x6e, + 0x66, 0xc1, 0x1e, 0x40, 0x60, 0xd0, 0x0, 0x0, + 0xe0, 0x6, 0x31, 0x60, 0xd0, 0x0, 0x0, 0xe0, + 0x0, 0x7, 0x10, 0xe6, 0x66, 0x66, 0xe0, 0x0, + 0xa, 0x0, 0xd0, 0x0, 0x0, 0xe0, 0x0, 0x67, + 0x0, 0xe6, 0x66, 0x66, 0xe0, 0x38, 0xf3, 0x0, + 0xd0, 0x0, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xd0, + 0x0, 0x0, 0xe0, 0x0, 0xf0, 0x0, 0xd0, 0x0, + 0x1, 0xd0, 0x0, 0xf0, 0x1, 0xd0, 0x1, 0x7f, + 0xa0, 0x0, 0x10, 0x0, 0x20, 0x0, 0x3, 0x0, + + /* U+6DBC "涼" */ + 0x0, 0x10, 0x0, 0x0, 0x9, 0x20, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x31, 0x56, 0x66, 0x96, 0x66, 0xd1, + 0x0, 0x3, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x0, 0x4, 0x9, 0x66, 0x66, 0x68, 0x0, + 0x8, 0x80, 0x60, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0xe0, 0x70, 0xd, 0x0, 0x0, 0x1b, 0x0, + 0x0, 0x14, 0x40, 0xd, 0x66, 0x66, 0x6b, 0x0, + 0x0, 0xa, 0x0, 0xa, 0x0, 0xd0, 0x16, 0x0, + 0x0, 0x48, 0x0, 0x5, 0x0, 0xd0, 0x30, 0x0, + 0x6, 0xf4, 0x0, 0x1e, 0x40, 0xd0, 0x57, 0x0, + 0x0, 0xc2, 0x0, 0xa3, 0x0, 0xd0, 0xa, 0x80, + 0x0, 0xe2, 0x6, 0x40, 0x0, 0xc0, 0x1, 0xf0, + 0x0, 0xc2, 0x33, 0x0, 0x7c, 0xa0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + + /* U+6DF1 "深" */ + 0x0, 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0xa, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0xc, 0x24, 0x90, 0x0, 0x0, 0x38, 0x0, 0x0, + 0x4, 0x31, 0x89, 0x1, 0x86, 0x0, 0x34, 0x0, + 0x50, 0x3a, 0x1, 0x0, 0xc7, 0x0, 0xb6, 0x24, + 0x16, 0x0, 0xa5, 0x1, 0x80, 0x2, 0x57, 0x2, + 0x0, 0xa, 0x30, 0x3, 0x0, 0x0, 0x80, 0x47, + 0x68, 0xd9, 0x66, 0xb6, 0x0, 0x36, 0x0, 0x0, + 0xdc, 0x82, 0x0, 0x0, 0xb, 0x20, 0x0, 0x87, + 0xa3, 0xa0, 0x0, 0x19, 0xf0, 0x0, 0x49, 0xa, + 0x35, 0x90, 0x0, 0x1e, 0x0, 0x49, 0x0, 0xa3, + 0xb, 0xb2, 0x4, 0xd0, 0x55, 0x0, 0xa, 0x30, + 0xb, 0x50, 0x3b, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+6DF7 "混" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x87, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x4, 0x92, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x11, 0x0, 0x5, 0x89, 0x66, 0x66, 0x6b, 0x0, + 0xa, 0x40, 0x4, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x2, 0xe0, 0x60, 0x85, 0x0, 0x0, 0x1b, 0x0, + 0x0, 0x40, 0x70, 0x77, 0x66, 0x96, 0x68, 0x0, + 0x0, 0x3, 0x50, 0x92, 0x0, 0xd3, 0x3, 0x0, + 0x0, 0x9, 0x0, 0xd0, 0x20, 0xd0, 0x4d, 0x40, + 0x4, 0x5a, 0x0, 0xd6, 0x94, 0xd7, 0x70, 0x0, + 0x2, 0xc7, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x20, + 0x0, 0x95, 0x0, 0xd0, 0x1, 0xd0, 0x0, 0x60, + 0x0, 0xb5, 0x0, 0xe9, 0x70, 0xd0, 0x0, 0xb0, + 0x0, 0x74, 0x0, 0x92, 0x0, 0x8c, 0xcc, 0xc1, + + /* U+6E05 "清" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0xd, 0x0, 0x27, 0x0, 0x0, + 0xc1, 0x47, 0x66, 0xe6, 0x66, 0x61, 0x0, 0x0, + 0x10, 0x46, 0x6e, 0x66, 0xc1, 0x1, 0xa2, 0x4, + 0x1, 0x10, 0xd0, 0x0, 0x0, 0x4, 0xe0, 0x66, + 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x5, 0x42, 0x10, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x7, 0x0, 0xc6, + 0x66, 0x66, 0xc5, 0x0, 0x0, 0x90, 0xd, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x56, 0x0, 0xd6, 0x66, + 0x66, 0xc2, 0x1, 0x8f, 0x30, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0xd1, 0x0, 0xd0, 0x0, 0x0, + 0xa2, 0x0, 0xf, 0x0, 0xd, 0x0, 0x0, 0xb, + 0x20, 0x1, 0xf0, 0x0, 0xd0, 0x0, 0x4b, 0xf0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x12, 0x0, + + /* U+6E07 "渇" */ + 0x0, 0x31, 0x0, 0x86, 0x66, 0x66, 0x93, 0x0, + 0x1, 0xd3, 0xc, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x6, 0x71, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x5c, 0x66, 0x66, 0x6c, 0x20, 0x8, 0x10, + 0x5, 0xc0, 0x0, 0x0, 0xb2, 0x0, 0x3e, 0x5, + 0x1c, 0x76, 0x66, 0x6c, 0x20, 0x0, 0x90, 0x70, + 0x6c, 0x60, 0x0, 0x20, 0x0, 0x0, 0x45, 0x6, + 0xc6, 0x66, 0x66, 0xb3, 0x0, 0xa, 0x3, 0xa0, + 0x0, 0x10, 0xd, 0x10, 0x46, 0x93, 0x6a, 0x50, + 0x8b, 0x0, 0xd0, 0x2, 0xd5, 0x20, 0xa7, 0x72, + 0x1, 0xd, 0x0, 0xa, 0x40, 0xa, 0x30, 0x0, + 0x70, 0xd0, 0x0, 0xc4, 0x0, 0x5b, 0xbb, 0xa4, + 0xd, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, 0x4c, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, + 0x0, + + /* U+6E08 "済" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, + 0xc2, 0x0, 0x0, 0x5a, 0x0, 0x33, 0x0, 0x7, + 0x71, 0x79, 0x66, 0x66, 0xe7, 0x50, 0x0, 0x0, + 0x20, 0x54, 0x0, 0x96, 0x0, 0x6, 0x20, 0x5, + 0x0, 0xb3, 0x79, 0x0, 0x0, 0x1e, 0x22, 0x30, + 0x2, 0xfc, 0x0, 0x0, 0x0, 0x83, 0x70, 0x6, + 0xa4, 0x7c, 0x73, 0x10, 0x0, 0x18, 0x57, 0xa0, + 0x0, 0x1c, 0xcb, 0x10, 0x7, 0x20, 0x2d, 0x66, + 0x66, 0xe0, 0x0, 0x34, 0xc0, 0x2, 0xa0, 0x0, + 0xd, 0x0, 0x1, 0xb9, 0x0, 0x4b, 0x66, 0x66, + 0xd0, 0x0, 0x7, 0x70, 0x7, 0x40, 0x0, 0xd, + 0x0, 0x0, 0x97, 0x0, 0xb0, 0x0, 0x0, 0xd0, + 0x0, 0x6, 0x60, 0x64, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+6E09 "渉" */ + 0x0, 0x31, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0x1d, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x6, 0x71, 0xb, 0x20, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x5, 0xc, 0x0, 0xd6, 0x68, 0x10, + 0x8, 0x20, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xe1, 0x55, 0x6d, 0x66, 0xe6, 0x66, 0xd2, + 0x0, 0x81, 0x81, 0x10, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0x60, 0x8, 0x70, 0xd0, 0x63, 0x0, + 0x0, 0x9, 0x0, 0xd, 0x10, 0xd0, 0xb, 0x70, + 0x4, 0x7a, 0x0, 0x56, 0x0, 0xd0, 0xc4, 0xc0, + 0x0, 0xb7, 0x0, 0x90, 0x0, 0xdb, 0x80, 0x0, + 0x0, 0x85, 0x3, 0x10, 0x2, 0xc6, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0x6b, 0x20, 0x0, 0x0, + 0x0, 0x53, 0x0, 0x69, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+6E1B "減" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x2b, 0x31, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0xb, 0x1d, 0x10, + 0x0, 0xe, 0x11, 0x10, 0x0, 0xc, 0x4, 0x70, + 0x0, 0x2, 0x6, 0xc6, 0x66, 0x6d, 0x66, 0x71, + 0x24, 0x0, 0x42, 0xb0, 0x0, 0xc, 0x0, 0x0, + 0xa, 0x70, 0x61, 0xb4, 0x6a, 0x9c, 0x4, 0x50, + 0x1, 0xc1, 0x51, 0xa0, 0x0, 0xb, 0xa, 0x60, + 0x0, 0x7, 0x12, 0xa7, 0x66, 0xbb, 0x1d, 0x0, + 0x0, 0x9, 0x2, 0x99, 0x31, 0xa8, 0x79, 0x0, + 0x0, 0x76, 0x4, 0x89, 0x31, 0xa5, 0xe2, 0x0, + 0x17, 0xf1, 0x6, 0x69, 0x86, 0xa4, 0xd0, 0x20, + 0x0, 0xe0, 0xa, 0x28, 0x21, 0x7c, 0xa4, 0x60, + 0x1, 0xf0, 0x1a, 0x0, 0x0, 0xa2, 0x2c, 0x90, + 0x1, 0xe0, 0x81, 0x0, 0x19, 0x10, 0x5, 0xf1, + 0x0, 0x1, 0x20, 0x0, 0x40, 0x0, 0x0, 0x31, + + /* U+6E21 "渡" */ + 0x0, 0x60, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x4c, 0x1, 0x0, 0x0, 0xd1, 0x0, 0x40, + 0x0, 0xb, 0x13, 0xc6, 0x66, 0x76, 0x66, 0x93, + 0x12, 0x0, 0x14, 0xa0, 0x2b, 0x1, 0xb0, 0x0, + 0xa, 0x50, 0x53, 0xa0, 0x1a, 0x1, 0xa2, 0x50, + 0x2, 0xd0, 0x62, 0xc6, 0x6c, 0x66, 0xc6, 0x50, + 0x0, 0x22, 0x53, 0x90, 0x1a, 0x1, 0xa0, 0x0, + 0x0, 0x8, 0x3, 0x90, 0x1a, 0x66, 0x80, 0x0, + 0x0, 0xa, 0x5, 0x72, 0x66, 0x66, 0x92, 0x0, + 0x14, 0x96, 0x7, 0x50, 0x33, 0x3, 0xc0, 0x0, + 0x2, 0xe3, 0x9, 0x20, 0x9, 0x2c, 0x20, 0x0, + 0x0, 0xd1, 0xc, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x0, 0xf2, 0x45, 0x0, 0x4b, 0x5c, 0x70, 0x0, + 0x0, 0x82, 0x80, 0x48, 0x60, 0x0, 0x9f, 0xc3, + 0x0, 0x2, 0x4, 0x10, 0x0, 0x0, 0x1, 0x30, + + /* U+6E29 "温" */ + 0x0, 0x40, 0x0, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x4c, 0x0, 0xd6, 0x66, 0x66, 0xf1, 0x0, + 0x0, 0x7, 0x1, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x31, 0xd6, 0x66, 0x66, 0xe0, 0x0, + 0x9, 0x20, 0x50, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x4, 0xb0, 0x60, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x23, 0x40, 0xe6, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x8, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xc, 0x66, 0x86, 0x96, 0x6d, 0x0, + 0x0, 0x58, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x7, 0xf5, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xd3, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xf2, 0xd, 0x1, 0xa0, 0xc0, 0xc, 0x0, + 0x0, 0xd4, 0x6e, 0x66, 0xc6, 0xd6, 0x6d, 0xd4, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E2F "港" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x8, 0x60, 0xd, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x8, 0x50, 0xd, 0x0, 0x0, + 0x0, 0xa, 0x12, 0x6b, 0x96, 0x6e, 0x6c, 0x10, + 0x2, 0x0, 0x40, 0x28, 0x50, 0xd, 0x0, 0x0, + 0x9, 0x70, 0x50, 0x8, 0x50, 0xd, 0x0, 0x20, + 0x1, 0xd1, 0x68, 0x6a, 0xa6, 0x6b, 0x66, 0xa1, + 0x0, 0x15, 0x10, 0xb, 0x40, 0x6, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x5b, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x8, 0x2, 0xcd, 0x66, 0x6c, 0x5d, 0x71, + 0x2, 0x85, 0x29, 0x1c, 0x0, 0xb, 0x2, 0x70, + 0x5, 0xf3, 0x50, 0xd, 0x66, 0x6c, 0x11, 0x0, + 0x0, 0xe0, 0x0, 0xc, 0x0, 0x2, 0x5, 0x0, + 0x1, 0xf0, 0x0, 0xc, 0x0, 0x0, 0x7, 0x30, + 0x0, 0xb0, 0x0, 0xb, 0xcc, 0xcc, 0xbc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E56 "湖" */ + 0x0, 0x20, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x60, 0x5, 0x70, 0xa, 0x66, 0xc3, 0x0, + 0x19, 0x20, 0x57, 0x0, 0xc0, 0xb, 0x0, 0x0, + 0x5, 0x59, 0xa9, 0x6c, 0x0, 0xb0, 0x28, 0x0, + 0x51, 0x57, 0x0, 0xb6, 0x6d, 0x0, 0x88, 0x15, + 0x5, 0x70, 0xb, 0x0, 0xb0, 0x1, 0x55, 0x12, + 0x57, 0x30, 0xb0, 0xb, 0x0, 0x0, 0x80, 0xd6, + 0x6d, 0xc, 0x0, 0xb0, 0x0, 0x8, 0xc, 0x0, + 0xc0, 0xd6, 0x6d, 0x1, 0x38, 0x50, 0xc0, 0xc, + 0xc, 0x0, 0xb0, 0x3, 0xe2, 0xd, 0x66, 0xc4, + 0x80, 0xb, 0x0, 0xd, 0x0, 0xc0, 0x7, 0xb1, + 0x0, 0xb0, 0x0, 0xf0, 0x8, 0x0, 0x65, 0x4, + 0x3c, 0x0, 0xa, 0x0, 0x0, 0x54, 0x0, 0x2c, + 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+6E90 "源" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x0, 0x6c, 0x2, 0xc6, 0x66, 0x78, 0x68, 0x90, + 0x0, 0xc, 0x5, 0xb0, 0x0, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x24, 0xb0, 0x86, 0xb6, 0x6b, 0x10, + 0x18, 0x10, 0x52, 0xb0, 0xd0, 0x0, 0xd, 0x0, + 0x6, 0xd0, 0x62, 0xb0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x92, 0x53, 0xb0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x7, 0x13, 0x90, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x9, 0x6, 0x80, 0xe6, 0x79, 0x6d, 0x0, + 0x4, 0x78, 0x9, 0x40, 0x30, 0x3a, 0x1, 0x0, + 0x2, 0xe5, 0xc, 0x0, 0xd4, 0x3a, 0x82, 0x0, + 0x0, 0xb3, 0x37, 0x8, 0x60, 0x3a, 0x1d, 0x50, + 0x0, 0xe3, 0x80, 0x55, 0x0, 0x4a, 0x5, 0xc0, + 0x0, 0x86, 0x22, 0x30, 0x7, 0xf7, 0x0, 0x40, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+6E96 "準" */ + 0x0, 0x72, 0x0, 0x1a, 0x4, 0x50, 0x0, 0x0, + 0x0, 0x2c, 0x1, 0x76, 0x0, 0xb0, 0x4, 0x0, + 0x2, 0x2, 0x41, 0xe6, 0x66, 0xa6, 0x69, 0x20, + 0x7, 0x70, 0x67, 0xd1, 0x0, 0xd0, 0x24, 0x0, + 0x0, 0x74, 0x63, 0xc6, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0x9, 0x10, 0xc1, 0x0, 0xd1, 0x25, 0x0, + 0x4, 0x97, 0x0, 0xc6, 0x66, 0xd5, 0x54, 0x0, + 0x0, 0x85, 0x0, 0xc1, 0x0, 0xd0, 0x7, 0x10, + 0x0, 0x66, 0x0, 0x88, 0x66, 0x66, 0x66, 0x30, + 0x0, 0x23, 0x0, 0xd, 0x40, 0x0, 0x0, 0x10, + 0x7, 0x66, 0x66, 0x6e, 0x76, 0x66, 0x67, 0xa0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+6E9D "溝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5, 0x70, 0xc, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x5, 0x60, 0xd, 0x4, 0x0, + 0x0, 0xd, 0x25, 0x79, 0xa6, 0x6e, 0x67, 0x40, + 0x0, 0x2, 0x4, 0x59, 0xa6, 0x6e, 0x6b, 0x10, + 0x33, 0x0, 0x40, 0x16, 0x60, 0xd, 0x0, 0x10, + 0xa, 0x70, 0x65, 0x78, 0x89, 0x6a, 0x68, 0x90, + 0x2, 0xb2, 0x50, 0x10, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x0, 0xd6, 0x6e, 0x66, 0xa9, 0x0, + 0x0, 0x9, 0x0, 0xd0, 0xd, 0x0, 0x76, 0x0, + 0x0, 0x85, 0x0, 0xd6, 0x6e, 0x66, 0xa6, 0x0, + 0x18, 0xf0, 0x26, 0xe6, 0x6e, 0x66, 0xaa, 0xa0, + 0x0, 0xe0, 0x1, 0xd0, 0x0, 0x0, 0x76, 0x0, + 0x2, 0xe0, 0x0, 0xd0, 0x0, 0x0, 0x76, 0x0, + 0x2, 0xd0, 0x0, 0xd0, 0x0, 0x29, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x70, 0x0, + + /* U+6EFF "滿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0x1, + 0xc2, 0x0, 0xd, 0x0, 0x1c, 0x5, 0x20, 0x7, + 0x75, 0x76, 0xe6, 0x66, 0xd6, 0x64, 0x0, 0x0, + 0x40, 0xd, 0x0, 0x1c, 0x0, 0x6, 0x20, 0x5, + 0x0, 0xe6, 0xc6, 0xc0, 0x0, 0xd, 0x32, 0x40, + 0x2, 0xd, 0x0, 0x0, 0x0, 0x65, 0x72, 0xb6, + 0x66, 0xe6, 0x67, 0xc0, 0x0, 0x8, 0x1b, 0x60, + 0xd, 0x50, 0x3a, 0x0, 0x5, 0x41, 0xb1, 0xb0, + 0xd1, 0xc3, 0xa0, 0x12, 0xc0, 0x1b, 0x3d, 0x8d, + 0x3d, 0xaa, 0x2, 0xbb, 0x1, 0xb7, 0x19, 0xd8, + 0x2b, 0xa0, 0x5, 0x90, 0x1c, 0x0, 0xd, 0x10, + 0x3a, 0x0, 0x89, 0x1, 0xb0, 0x0, 0xd0, 0x3, + 0xa0, 0x6, 0x80, 0x2b, 0x0, 0xd, 0x6, 0xa8, + 0x0, 0x0, 0x1, 0x50, 0x0, 0x20, 0x8, 0x10, + + /* U+6F22 "漢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0xa, 0x30, 0xb, 0x20, 0x0, + 0x0, 0x4b, 0x5, 0x6c, 0x66, 0x6d, 0x69, 0x80, + 0x0, 0xb, 0x31, 0xa, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x1, 0x4, 0xb, 0x68, 0x6d, 0x0, 0x0, + 0x7, 0x10, 0x6, 0x3, 0xc, 0x3, 0x0, 0x0, + 0x3, 0xd1, 0x44, 0xc6, 0x6d, 0x66, 0x98, 0x0, + 0x0, 0xa1, 0x71, 0xb0, 0xc, 0x0, 0x66, 0x0, + 0x0, 0x2, 0x61, 0xd6, 0x6d, 0x66, 0x96, 0x0, + 0x0, 0x9, 0x10, 0x20, 0xc, 0x0, 0x61, 0x0, + 0x2, 0x3a, 0x0, 0x76, 0x6d, 0x66, 0x63, 0x0, + 0x4, 0xd7, 0x5, 0x66, 0x6d, 0x66, 0x66, 0xa0, + 0x0, 0x95, 0x1, 0x0, 0x57, 0x61, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x3, 0xa0, 0xa, 0x60, 0x0, + 0x0, 0x94, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x91, + 0x0, 0x0, 0x15, 0x10, 0x0, 0x0, 0x2, 0x0, + + /* U+6F38 "漸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0xd, 0x10, 0x0, 0x0, 0x60, + 0x0, 0x3d, 0x0, 0xd, 0x3, 0x26, 0x79, 0x83, + 0x0, 0xa, 0x38, 0x6e, 0x68, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd, 0x5, 0x3a, 0x0, 0x0, + 0x9, 0x20, 0x4e, 0x6e, 0x6e, 0x4a, 0x0, 0x50, + 0x3, 0xe1, 0x5d, 0xd, 0xd, 0x2c, 0x5d, 0x63, + 0x0, 0x85, 0x1d, 0x6e, 0x6d, 0x29, 0xd, 0x0, + 0x0, 0x8, 0xd, 0xd, 0xd, 0x29, 0xd, 0x0, + 0x0, 0x9, 0xe, 0x6e, 0x6d, 0x39, 0xd, 0x0, + 0x1, 0x86, 0x4, 0xd, 0x3, 0x47, 0xd, 0x0, + 0x6, 0xf3, 0x67, 0x6e, 0x6a, 0x85, 0xd, 0x0, + 0x0, 0xe1, 0x0, 0xd, 0x0, 0xa1, 0xd, 0x0, + 0x0, 0xf1, 0x0, 0xd, 0x1, 0x90, 0xd, 0x0, + 0x0, 0xc0, 0x0, 0xe, 0x8, 0x10, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x21, 0x0, 0x7, 0x0, + + /* U+6FC3 "濃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xc0, 0xa3, 0x0, 0x0, + 0x0, 0x78, 0x2, 0x86, 0xd6, 0xc6, 0x6a, 0x0, + 0x0, 0xe, 0x24, 0x90, 0xb0, 0xa1, 0xd, 0x0, + 0x0, 0x2, 0x43, 0xb6, 0xd6, 0xc6, 0x6d, 0x0, + 0x8, 0x10, 0x63, 0x90, 0xb0, 0xa1, 0xd, 0x0, + 0x3, 0xe1, 0x63, 0x96, 0x66, 0x66, 0x68, 0x0, + 0x0, 0x96, 0x19, 0x76, 0x66, 0x66, 0x6a, 0x30, + 0x0, 0x9, 0x9, 0x40, 0x0, 0x0, 0x32, 0x0, + 0x0, 0x28, 0x9, 0x47, 0x66, 0x66, 0x64, 0x0, + 0x5, 0xc3, 0x9, 0x89, 0x67, 0x66, 0x67, 0x90, + 0x2, 0xf0, 0xa, 0x2d, 0x6, 0x1, 0xc3, 0x0, + 0x0, 0xe0, 0xc, 0xd, 0x2, 0x97, 0x20, 0x0, + 0x1, 0xf0, 0x28, 0xd, 0x14, 0x3b, 0x50, 0x0, + 0x0, 0x80, 0x80, 0xe, 0x81, 0x1, 0xaf, 0x91, + 0x0, 0x1, 0x10, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+6FDF "濟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x8, 0x10, 0x6, 0x20, + 0x0, 0x2d, 0x17, 0x66, 0xa6, 0x98, 0x66, 0x40, + 0x0, 0x1, 0x40, 0x1, 0x94, 0xa3, 0x29, 0x0, + 0x29, 0x10, 0x56, 0xca, 0x89, 0x37, 0x91, 0x0, + 0x6, 0xb3, 0x21, 0xa7, 0x4c, 0xb, 0x45, 0x0, + 0x0, 0x77, 0x7, 0x49, 0x3c, 0xb, 0x3c, 0x20, + 0x0, 0x8, 0x18, 0x4d, 0xb, 0x1b, 0x25, 0xa1, + 0x0, 0x54, 0x20, 0xd2, 0x0, 0x0, 0x96, 0x0, + 0x13, 0xd0, 0x0, 0xe6, 0x66, 0x66, 0xb5, 0x0, + 0x7, 0xc0, 0x0, 0xd0, 0x0, 0x0, 0x95, 0x0, + 0x2, 0xb0, 0x0, 0xc6, 0x66, 0x66, 0xb5, 0x0, + 0x5, 0xb0, 0x6, 0x50, 0x0, 0x0, 0x95, 0x0, + 0x2, 0x80, 0x48, 0x0, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x52, 0x0, + + /* U+7063 "灣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x9, 0x40, 0xa, 0x10, 0x57, 0x0, + 0x0, 0xa5, 0x26, 0x65, 0x79, 0x94, 0x65, 0x70, + 0x0, 0x2c, 0x88, 0xa0, 0x46, 0x76, 0x7b, 0x0, + 0x0, 0x2, 0x27, 0x32, 0x45, 0x50, 0x72, 0x50, + 0x46, 0x4, 0x99, 0x59, 0x54, 0x66, 0xb5, 0xb0, + 0xb, 0x66, 0x23, 0x21, 0xb6, 0xc2, 0x31, 0x30, + 0x3, 0x77, 0xa5, 0x6a, 0xb1, 0xb6, 0x5a, 0xb0, + 0x0, 0x35, 0x50, 0x22, 0x85, 0x86, 0x54, 0x20, + 0x0, 0x80, 0x6, 0x76, 0x66, 0x66, 0xe3, 0x0, + 0x1, 0xb0, 0x5, 0x86, 0x66, 0x66, 0xe0, 0x0, + 0x3c, 0x90, 0x8, 0x50, 0x0, 0x0, 0x34, 0x0, + 0x6, 0x80, 0x8, 0x66, 0x66, 0x66, 0x9c, 0x0, + 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x1, 0x53, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, + + /* U+706B "火" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x0, 0x30, 0x0, + 0x0, 0x2, 0x30, 0xc, 0x30, 0x4, 0xf2, 0x0, + 0x0, 0x9, 0x10, 0xd, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x4d, 0x0, 0xe, 0x60, 0x92, 0x0, 0x0, + 0x2, 0xf5, 0x0, 0x1e, 0x46, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x6, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xb0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x10, 0x0, 0x2d, 0x40, 0x0, + 0x0, 0x3, 0xb1, 0x0, 0x0, 0x3, 0xea, 0x30, + 0x1, 0x76, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x70, + 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+707D "災" */ + 0x0, 0x0, 0xa0, 0x2, 0x80, 0x0, 0x91, 0x0, + 0x0, 0x7, 0x70, 0xa, 0x50, 0x7, 0x80, 0x0, + 0x0, 0x27, 0x0, 0x45, 0x0, 0x18, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x80, 0x0, 0x80, 0x0, 0x0, + 0x0, 0x1b, 0x20, 0x4a, 0x10, 0x1a, 0x10, 0x0, + 0x0, 0x4, 0xb0, 0x6, 0xa0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x20, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x60, 0xd, 0x70, 0x7, 0x60, 0x0, + 0x0, 0x8, 0x60, 0xe, 0x51, 0x49, 0x10, 0x0, + 0x0, 0x4d, 0x10, 0x79, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd1, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x30, 0x0, 0x8c, 0x30, 0x0, + 0x0, 0x39, 0x91, 0x0, 0x0, 0x5, 0xec, 0x81, + 0x5, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+70B9 "点" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x3c, 0x66, 0x66, 0xd3, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x1, 0x0, 0x0, 0x1c, 0x66, 0x7a, 0x66, 0x6f, + 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1f, + 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x60, 0x6, 0x0, + 0x52, 0x6, 0x30, 0x3, 0x80, 0x9, 0x50, 0x1d, + 0x0, 0xd3, 0x2f, 0x30, 0x5, 0x70, 0xa, 0x0, + 0x77, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+70BA "為" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x71, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x67, 0x66, 0xab, 0x66, 0x6e, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb6, 0x66, 0x8a, 0x8a, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, 0xd7, 0xa0, + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x56, 0x11, 0x10, 0x51, 0x28, 0x6, 0x70, + 0x5, 0x40, 0x80, 0xa1, 0x1d, 0x18, 0x58, 0x50, + 0x1, 0x7, 0x80, 0x6a, 0x7, 0x21, 0x2a, 0x30, + 0x0, 0x1d, 0x20, 0x4, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+7121 "無" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x70, 0x0, 0x0, 0x5, 0x0, 0x0, 0x4f, 0x6b, + 0x66, 0xb6, 0xb7, 0x40, 0x1, 0x9d, 0xb, 0x0, + 0xb0, 0xd0, 0x0, 0x6, 0xd, 0xb, 0x0, 0xb0, + 0xd0, 0x0, 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, + 0x60, 0x7, 0x6e, 0x6d, 0x66, 0xd6, 0xe6, 0x83, + 0x0, 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, + 0xd, 0xb, 0x0, 0xb0, 0xd0, 0x0, 0x0, 0xd, + 0xb, 0x0, 0xb0, 0xd0, 0x83, 0x47, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0x0, 0x60, 0x34, 0x0, + 0x90, 0x6, 0x50, 0x6, 0x70, 0xc, 0x20, 0x5a, + 0x0, 0xd3, 0x5e, 0x10, 0x9, 0x60, 0xa, 0x0, + 0x74, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+7136 "然" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x1, 0xd2, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1, 0xd2, 0xa1, 0x0, + 0x0, 0x9, 0xa6, 0x6c, 0x11, 0xd0, 0x98, 0x0, + 0x0, 0xd, 0x0, 0x4b, 0x1, 0xc0, 0x25, 0x0, + 0x0, 0x77, 0xb3, 0x87, 0x87, 0xd6, 0x6b, 0x70, + 0x1, 0xb5, 0x27, 0xd1, 0x4, 0x96, 0x0, 0x0, + 0x7, 0xa, 0x55, 0x90, 0x7, 0x68, 0x0, 0x0, + 0x0, 0x2, 0x3c, 0x10, 0xc, 0x12, 0xa0, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x76, 0x0, 0x98, 0x0, + 0x0, 0x8, 0x50, 0x6, 0x60, 0x0, 0xd, 0xd2, + 0x2, 0x72, 0x0, 0x51, 0x0, 0x0, 0x1, 0x10, + 0x1, 0x6, 0x2, 0x60, 0x8, 0x0, 0x83, 0x0, + 0x0, 0x4a, 0x0, 0xd2, 0x7, 0xa0, 0x1e, 0x20, + 0x1, 0xe5, 0x0, 0xb4, 0x2, 0xc0, 0xa, 0x40, + 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7159 "煙" */ + 0x0, 0x8, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xd, 0x20, 0x67, 0x6c, 0x6c, 0x67, 0x60, + 0x0, 0xd, 0x10, 0x0, 0xd, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x1a, 0x4a, 0x6e, 0x6e, 0x6c, 0x30, + 0x2, 0x2c, 0x68, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x7, 0x3c, 0x60, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x2e, 0x1c, 0x0, 0xc, 0xd, 0xd, 0xd, 0x0, + 0x13, 0xd, 0x0, 0xd, 0x69, 0x69, 0x6c, 0x0, + 0x0, 0xe, 0x0, 0x4, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xe, 0x60, 0x0, 0x0, 0xd0, 0x2, 0x0, + 0x0, 0x2a, 0x4c, 0x17, 0x66, 0xe6, 0x78, 0x0, + 0x0, 0x75, 0xa, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x8, 0x20, 0x3, 0x66, 0x66, 0xe6, 0x67, 0xd1, + 0x22, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+71B1 "熱" */ + 0x0, 0x0, 0xb3, 0x0, 0x3, 0x80, 0x0, 0x0, + 0x0, 0xc, 0x4, 0x0, 0x39, 0x0, 0x0, 0x0, + 0x76, 0xd6, 0x73, 0x25, 0xb4, 0xa0, 0x0, 0x0, + 0xc, 0x1, 0x44, 0x69, 0x3b, 0x0, 0x6, 0x79, + 0x68, 0x76, 0x5, 0x72, 0xa0, 0x0, 0x9, 0x82, + 0xa, 0x82, 0x75, 0x2a, 0x0, 0x7, 0x40, 0xc3, + 0xb, 0x3d, 0x51, 0xb0, 0x1, 0x26, 0x6d, 0x6c, + 0x21, 0xce, 0x4d, 0x2, 0x0, 0x20, 0xc0, 0x0, + 0x83, 0x34, 0x86, 0x60, 0x2, 0x5e, 0x75, 0x66, + 0x0, 0x1, 0xd9, 0x8, 0xb5, 0x10, 0x4, 0x0, + 0x0, 0x2, 0x70, 0x1, 0x60, 0x16, 0x1, 0x90, + 0x8, 0x30, 0x0, 0xa3, 0x0, 0xa4, 0x7, 0x90, + 0x1e, 0x10, 0x9b, 0x0, 0x5, 0x60, 0x18, 0x0, + 0xa3, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+71DF "營" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x60, 0x0, 0x29, 0x0, 0x0, 0x0, + 0x6, 0x75, 0x95, 0x33, 0x83, 0xb0, 0x0, 0x9, + 0x49, 0x82, 0x2b, 0x5a, 0x60, 0x0, 0x0, 0x40, + 0xc7, 0x85, 0x3a, 0x57, 0x40, 0x0, 0x0, 0x83, + 0x6, 0x55, 0x70, 0xb, 0x70, 0x0, 0x41, 0x0, + 0x2, 0x40, 0x0, 0x18, 0x0, 0x2a, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xd2, 0xd, 0x30, 0xa6, 0x66, + 0x66, 0xd3, 0x60, 0x0, 0x20, 0xb, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x66, 0x66, + 0xd1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x1, + 0x50, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6d, + 0x50, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0xc, 0x66, 0x66, 0x66, 0x6d, 0x30, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x51, 0x0, + + /* U+722D "爭" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0x20, 0x0, + 0x4, 0x56, 0x78, 0x9a, 0x98, 0x73, 0x0, 0x0, + 0x31, 0x0, 0x81, 0x0, 0x1c, 0x10, 0x0, 0x0, + 0xc3, 0x2, 0xd0, 0x9, 0x40, 0x0, 0x0, 0x4, + 0x60, 0x6, 0x4, 0x50, 0x0, 0x0, 0x3, 0x66, + 0x66, 0x66, 0x76, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0xd, 0x0, 0x2, 0x66, 0x66, 0x67, + 0xc6, 0x66, 0xe6, 0xd3, 0x1, 0x0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0x0, 0x3, 0x66, 0x67, 0xc6, + 0x66, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x2a, 0x0, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, + + /* U+7236 "父" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x80, 0x2, 0x61, 0x0, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x1a, 0x70, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x84, 0x10, 0x0, 0x0, 0x43, 0x1d, 0x20, + 0x6, 0x10, 0x23, 0x0, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x50, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x4a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb3, 0x2d, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x10, 0x0, 0x8f, 0xb6, 0x30, + 0x0, 0x68, 0x30, 0x0, 0x0, 0x1, 0x8d, 0x81, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7238 "爸" */ + 0x0, 0x0, 0x6, 0x60, 0x0, 0x54, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0x30, 0x0, 0x5, 0xc4, 0x0, + 0x0, 0x7, 0x72, 0x40, 0x4, 0xc0, 0x3f, 0x0, + 0x1, 0x61, 0x0, 0x57, 0x4c, 0x10, 0x1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xb4, 0x8, 0xb8, 0x53, 0x31, + 0x4, 0x68, 0x92, 0x0, 0x0, 0x8, 0x8a, 0x91, + 0x0, 0x0, 0xd6, 0x67, 0xc6, 0x6e, 0x30, 0x0, + 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x3, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6a, 0x2, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xb, 0x10, + 0x0, 0x0, 0xbc, 0xcc, 0xcc, 0xcc, 0xcd, 0x30, + + /* U+7247 "片" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0xf, + 0x20, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xd1, 0x0, 0x10, 0x0, 0xe, 0x66, 0x66, 0xe6, + 0x66, 0xf5, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x66, 0x66, 0x6c, 0x30, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x67, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3, 0x90, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x9, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+725B "牛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x60, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x66, 0x6e, 0x66, 0x6b, 0xa0, 0x0, 0xa, 0x30, + 0x1, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x1, + 0xd0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x84, 0x4, 0x76, 0x66, 0x66, 0xe6, + 0x66, 0x69, 0x80, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+7260 "牠" */ + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x85, 0x0, 0x0, + 0x0, 0x10, 0xd0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xf4, 0xd0, 0x0, 0x90, 0xa2, 0x0, 0x0, + 0x1, 0xd0, 0xd0, 0x0, 0xc0, 0xa2, 0x5, 0x10, + 0x4, 0xb6, 0xe9, 0x80, 0xc0, 0xb7, 0x6c, 0x60, + 0x8, 0x20, 0xd0, 0x26, 0xd6, 0xb2, 0x9, 0x30, + 0x8, 0x0, 0xd0, 0x31, 0xc0, 0xa2, 0x9, 0x30, + 0x21, 0x0, 0xd0, 0x10, 0xc0, 0xa2, 0xa, 0x20, + 0x0, 0x0, 0xe7, 0x20, 0xc0, 0xa2, 0xc, 0x10, + 0x2, 0x79, 0xd0, 0x0, 0xc0, 0xa6, 0xcd, 0x0, + 0xb, 0x50, 0xd0, 0x0, 0xc0, 0xa2, 0x31, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xc0, 0x71, 0x0, 0x60, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xd0, 0x0, 0x9b, 0xbb, 0xbc, 0xb1, + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7269 "物" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x0, 0x50, 0xd0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xd0, 0x1, 0xd0, 0x0, 0x0, 0x30, + 0x2, 0xb0, 0xd3, 0x36, 0x99, 0x97, 0xb6, 0xe0, + 0x6, 0x96, 0xe6, 0x5a, 0xb, 0x25, 0x91, 0xc0, + 0x8, 0x0, 0xd0, 0x52, 0xc, 0x8, 0x62, 0xb0, + 0x13, 0x0, 0xd0, 0x30, 0x75, 0xd, 0x13, 0xb0, + 0x0, 0x0, 0xd5, 0x41, 0xb0, 0x2c, 0x4, 0xa0, + 0x0, 0x39, 0xe1, 0x8, 0x10, 0x86, 0x5, 0x90, + 0xb, 0xa1, 0xd0, 0x43, 0x1, 0xc0, 0x6, 0x70, + 0x1, 0x0, 0xd0, 0x20, 0xa, 0x30, 0x8, 0x60, + 0x0, 0x0, 0xd0, 0x0, 0x74, 0x0, 0xa, 0x40, + 0x0, 0x0, 0xd0, 0x5, 0x40, 0x53, 0x4e, 0x10, + 0x0, 0x0, 0xe0, 0x41, 0x0, 0xa, 0xf6, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+7279 "特" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x3, 0xd1, 0xd0, 0x18, 0x66, 0xe6, 0xa8, 0x0, + 0x5, 0x90, 0xd0, 0x10, 0x1, 0xd0, 0x0, 0x0, + 0x7, 0x86, 0xe7, 0xb0, 0x1, 0xd0, 0x0, 0x20, + 0x9, 0x0, 0xd0, 0x76, 0x66, 0xb6, 0x69, 0xb0, + 0x6, 0x0, 0xd0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x0, 0x0, 0xe6, 0x50, 0x0, 0x9, 0x51, 0x60, + 0x0, 0x28, 0xe1, 0x57, 0x66, 0x6b, 0x96, 0x71, + 0xa, 0xc4, 0xd0, 0x7, 0x0, 0x9, 0x50, 0x0, + 0x3, 0x0, 0xd0, 0x5, 0xc0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x9, 0x50, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x10, 0x9, 0x40, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x5, 0xdf, 0x20, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+72AC "犬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x0, 0xb9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x4, 0x3, 0x20, + 0x5, 0x76, 0x66, 0x7d, 0x76, 0x66, 0x6a, 0xa0, + 0x0, 0x0, 0x0, 0x59, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x1, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0x5d, 0x20, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x7, 0xf7, 0x10, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xb1, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+72AF "犯" */ + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x72, 0x8, 0xc2, 0xa6, 0x66, 0x6c, 0x20, + 0x0, 0x9, 0x7b, 0x0, 0xd0, 0x0, 0xe, 0x0, + 0x0, 0x3, 0xf0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x39, 0x84, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x4, 0x50, 0x49, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x3, 0xae, 0x0, 0xd0, 0x11, 0x1d, 0x0, + 0x0, 0x1a, 0xe, 0x0, 0xd0, 0x28, 0xfa, 0x0, + 0x0, 0x91, 0xe, 0x0, 0xd0, 0x0, 0x40, 0x0, + 0x6, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x2c, 0x0, 0xd0, 0x0, 0x0, 0x80, + 0x0, 0x0, 0x78, 0x0, 0xe0, 0x0, 0x0, 0xd3, + 0x0, 0x7d, 0xd1, 0x0, 0x7e, 0xdd, 0xdd, 0xd3, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72B6 "状" */ + 0x0, 0x0, 0xa3, 0x0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x1d, 0x4, 0x91, 0x0, + 0x1, 0x0, 0xd1, 0x0, 0xd, 0x0, 0x8c, 0x0, + 0x9, 0x30, 0xc1, 0x0, 0xd, 0x0, 0x6, 0x0, + 0x2, 0xe1, 0xc1, 0x0, 0xd, 0x0, 0x8, 0x20, + 0x0, 0xc1, 0xc4, 0x76, 0x6e, 0x86, 0x67, 0x50, + 0x0, 0x0, 0xc1, 0x0, 0x2b, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xe1, 0x0, 0x59, 0x70, 0x0, 0x0, + 0x0, 0x65, 0xc1, 0x0, 0x76, 0x45, 0x0, 0x0, + 0x1a, 0x70, 0xc1, 0x0, 0xc2, 0xb, 0x0, 0x0, + 0x29, 0x0, 0xc1, 0x2, 0xb0, 0xa, 0x40, 0x0, + 0x0, 0x0, 0xc1, 0xa, 0x40, 0x3, 0xd1, 0x0, + 0x0, 0x0, 0xd1, 0x39, 0x0, 0x0, 0xad, 0x20, + 0x0, 0x0, 0xd4, 0x90, 0x0, 0x0, 0xd, 0x90, + 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72C0 "狀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x10, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xc1, 0xd, 0x0, 0xb, 0x23, 0x70, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x97, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0xb, 0x20, 0x14, 0x0, + 0x0, 0xd0, 0xd, 0x13, 0x3c, 0x53, 0x35, 0xa0, + 0x3, 0xc6, 0x6d, 0x24, 0x3c, 0x93, 0x33, 0x31, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd, 0x44, 0x0, 0x0, + 0x4, 0x9a, 0x6d, 0x0, 0x3b, 0x1a, 0x0, 0x0, + 0x0, 0x77, 0xd, 0x0, 0x76, 0xb, 0x20, 0x0, + 0x0, 0xa4, 0xd, 0x0, 0xc1, 0x5, 0xb0, 0x0, + 0x0, 0xc0, 0xd, 0x3, 0xa0, 0x0, 0xc6, 0x0, + 0x5, 0x50, 0xd, 0xa, 0x20, 0x0, 0x3f, 0x70, + 0x7, 0x0, 0xe, 0x54, 0x0, 0x0, 0x5, 0xa2, + 0x10, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+72EC "独" */ + 0x0, 0x0, 0x5, 0x30, 0x0, 0xb1, 0x0, 0x0, + 0x2, 0x71, 0x1e, 0x40, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1a, 0xb5, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x9, 0xc0, 0xa, 0x66, 0xe6, 0x6b, 0x20, + 0x0, 0x84, 0xc2, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x6, 0x10, 0x96, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0x2, 0xe9, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0xa, 0x6b, 0xe, 0x0, 0xe0, 0xe, 0x0, + 0x0, 0x57, 0x2c, 0xf, 0x66, 0xe6, 0x6f, 0x0, + 0x3, 0x80, 0x2c, 0x8, 0x0, 0xe0, 0x4, 0x0, + 0x15, 0x0, 0x3b, 0x0, 0x0, 0xe0, 0x35, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xe0, 0x9, 0x50, + 0x0, 0x10, 0xa6, 0x46, 0x79, 0xe8, 0x64, 0xf0, + 0x0, 0x4e, 0xb0, 0x7a, 0x62, 0x0, 0x0, 0x80, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72ED "狭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x2, 0x60, 0x3b, 0x10, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xb0, 0x0, 0xe, 0x0, 0x7, 0x0, + 0x0, 0x1d, 0x60, 0x76, 0x6e, 0x66, 0x68, 0x20, + 0x1, 0x92, 0xb0, 0x30, 0xe, 0x0, 0x91, 0x0, + 0x15, 0x0, 0xe0, 0x49, 0xe, 0x2, 0xc0, 0x0, + 0x0, 0x4, 0xf3, 0xe, 0x1e, 0x8, 0x10, 0x0, + 0x0, 0xb, 0x95, 0x4, 0xe, 0x3, 0x3, 0x30, + 0x0, 0x83, 0x78, 0x86, 0x6d, 0x86, 0x68, 0x70, + 0x4, 0x50, 0x77, 0x0, 0x58, 0x50, 0x0, 0x0, + 0x23, 0x0, 0x86, 0x0, 0xa3, 0x17, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x3, 0xa0, 0x9, 0x40, 0x0, + 0x1, 0x33, 0xe0, 0x1b, 0x10, 0x0, 0xd6, 0x0, + 0x0, 0x6e, 0x44, 0x81, 0x0, 0x0, 0x2d, 0xb1, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+732B "猫" */ + 0x1, 0x0, 0x6, 0x20, 0x55, 0x6, 0x60, 0x0, + 0x2, 0x70, 0x1e, 0x50, 0x76, 0x8, 0x50, 0x0, + 0x0, 0x1a, 0xc4, 0x0, 0x75, 0x8, 0x51, 0x40, + 0x0, 0xa, 0xa2, 0x86, 0xa9, 0x6b, 0x97, 0x81, + 0x0, 0x82, 0xb1, 0x0, 0x75, 0x8, 0x50, 0x0, + 0x5, 0x0, 0x95, 0x0, 0x53, 0x5, 0x20, 0x0, + 0x0, 0x1, 0xe8, 0xc, 0x66, 0x86, 0x6d, 0x20, + 0x0, 0x9, 0x6a, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x47, 0x2a, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x2, 0x70, 0x2a, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x15, 0x0, 0x49, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x0, 0x77, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x44, 0xd2, 0xe, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x1c, 0x70, 0xc, 0x0, 0x0, 0x9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+733F "猿" */ + 0x0, 0x0, 0x4, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x5, 0x30, 0x5e, 0x10, 0xe, 0x0, 0x80, 0x0, + 0x0, 0x67, 0xd2, 0x27, 0x6e, 0x66, 0x62, 0x0, + 0x0, 0xe, 0x50, 0x0, 0xe, 0x0, 0x6, 0x50, + 0x0, 0x96, 0x85, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x16, 0x11, 0xd0, 0x1a, 0x66, 0x66, 0xd2, 0x0, + 0x0, 0x6, 0xf0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0xb3, 0x1d, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x82, 0xb3, 0x15, 0x86, 0x50, 0x37, 0x30, + 0x4, 0x50, 0xb4, 0x3, 0xb0, 0x80, 0x7a, 0x30, + 0x23, 0x0, 0xc3, 0x3e, 0x70, 0x3c, 0x20, 0x0, + 0x0, 0x0, 0xe5, 0x65, 0x50, 0xa, 0x70, 0x0, + 0x0, 0x15, 0xd0, 0x4, 0x77, 0x30, 0xcc, 0x50, + 0x0, 0x6f, 0x40, 0x6, 0xc1, 0x0, 0x9, 0x80, + 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+7372 "獲" */ + 0x0, 0x0, 0x3, 0x0, 0x63, 0x4, 0x80, 0x0, + 0x5, 0x30, 0x3e, 0x66, 0xb7, 0x68, 0xb8, 0xa0, + 0x0, 0x76, 0xc3, 0x11, 0x84, 0x14, 0x80, 0x0, + 0x0, 0xd, 0x60, 0x8, 0x40, 0xc1, 0x0, 0x0, + 0x0, 0x87, 0x80, 0x1e, 0x66, 0xa6, 0x6c, 0x10, + 0x7, 0x30, 0xc0, 0x9c, 0x0, 0xd0, 0x24, 0x0, + 0x10, 0x5, 0xf4, 0x2d, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0xc, 0xc2, 0xd, 0x55, 0xe5, 0x77, 0x0, + 0x0, 0x56, 0x93, 0xd, 0x66, 0xc6, 0x69, 0x60, + 0x2, 0x90, 0x94, 0x6, 0x0, 0x0, 0x40, 0x0, + 0x7, 0x0, 0xa3, 0x7, 0x96, 0x67, 0xe4, 0x0, + 0x10, 0x0, 0xb2, 0x0, 0x37, 0x1b, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x1, 0x8d, 0xa0, 0x2, 0x89, 0x4b, 0xa7, 0x60, + 0x0, 0x8, 0x14, 0x54, 0x0, 0x0, 0x37, 0x20, + + /* U+73A9 "玩" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x18, 0x6a, 0x6a, 0x54, 0x76, 0x66, 0x78, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x5, 0x6e, 0x7c, 0x37, 0x98, 0x6b, 0x67, 0x90, + 0x1, 0xd, 0x10, 0x0, 0xa4, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xb3, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xe0, 0xe, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x11, 0xd0, 0xe, 0x0, 0x0, + 0x0, 0xe, 0x86, 0x26, 0x80, 0xe, 0x0, 0x40, + 0x3c, 0xc5, 0x0, 0xd, 0x10, 0xe, 0x0, 0x70, + 0x6, 0x0, 0x0, 0xa4, 0x0, 0xe, 0x0, 0xb0, + 0x0, 0x0, 0x29, 0x30, 0x0, 0xc, 0xcc, 0xe2, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+73FE "現" */ + 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x0, + 0x7, 0x6a, 0x69, 0x3e, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x5, 0xd, 0x33, 0x33, 0x3c, 0x0, + 0x6, 0x7e, 0x67, 0x2d, 0x33, 0x33, 0x3c, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xe, 0x7b, 0x6c, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x58, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x14, 0x30, 0xa3, 0xd, 0x0, 0x10, + 0x16, 0x9b, 0x61, 0x2, 0xb0, 0xd, 0x0, 0x60, + 0x1a, 0x30, 0x0, 0x1b, 0x20, 0xd, 0x0, 0xa0, + 0x0, 0x0, 0x3, 0x92, 0x0, 0xc, 0xcc, 0xe3, + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7403 "球" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x40, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x1, 0xc0, 0x6a, 0x0, + 0x7, 0x6d, 0x68, 0x20, 0x1, 0xc0, 0x8, 0x10, + 0x0, 0xe, 0x0, 0x66, 0x66, 0xd6, 0x68, 0xc1, + 0x0, 0xe, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x56, 0x1, 0xe3, 0x8, 0x60, + 0x7, 0x6e, 0x6a, 0xc, 0x61, 0xc7, 0x3b, 0x20, + 0x0, 0xe, 0x0, 0x4, 0x51, 0xc8, 0x60, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x4, 0xc3, 0x80, 0x0, + 0x0, 0xe, 0x2, 0x32, 0x84, 0xc0, 0xb3, 0x0, + 0x0, 0x3e, 0x85, 0x9b, 0x11, 0xc0, 0x2e, 0x40, + 0x2d, 0xa2, 0x1, 0x90, 0x1, 0xc0, 0x6, 0xd3, + 0x3, 0x0, 0x0, 0x1, 0x12, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+7406 "理" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x7, 0xc, 0x66, 0x96, 0x6e, 0x0, + 0x7, 0x6d, 0x67, 0x2c, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x0, 0xd, 0x4, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x7, 0x6e, 0x69, 0x2c, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0xd6, 0x6c, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x0, 0xc0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x20, 0x0, 0xc0, 0x3, 0x0, + 0x0, 0xd, 0x87, 0x27, 0x66, 0xd6, 0x79, 0x10, + 0x1a, 0xd7, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x40, + 0x0, 0x0, 0x7, 0x66, 0x66, 0x86, 0x67, 0x80, + + /* U+74B0 "環" */ + 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x4, 0x0, + 0x7, 0x68, 0x7b, 0x3b, 0x6c, 0x6c, 0x6d, 0x0, + 0x0, 0xc, 0x0, 0x29, 0xb, 0xb, 0xb, 0x0, + 0x0, 0xc, 0x0, 0x2b, 0x69, 0x69, 0x6b, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x3, 0x4d, 0x68, 0x76, 0x66, 0x66, 0x66, 0x50, + 0x3, 0x3c, 0x21, 0x7, 0x66, 0x66, 0x95, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x66, 0x66, 0xa5, 0x0, + 0x0, 0xc, 0x0, 0x6, 0x4a, 0x50, 0x25, 0x80, + 0x0, 0x1d, 0x75, 0x2, 0xe1, 0x35, 0x78, 0x20, + 0x1d, 0xc4, 0x0, 0x3a, 0xc0, 0x7, 0x50, 0x0, + 0x2, 0x0, 0x5, 0x50, 0xb1, 0x50, 0x9b, 0x40, + 0x0, 0x0, 0x10, 0x0, 0xe9, 0x0, 0x6, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+7518 "甘" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x0, 0xc, 0x10, 0xb3, 0x37, 0x66, + 0xd6, 0x66, 0x66, 0xd6, 0x66, 0x40, 0x0, 0xc, + 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0xc6, 0x66, + 0x66, 0xd1, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0xd2, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x20, 0x0, + 0x0, + + /* U+751A "甚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x0, 0xe0, 0x24, 0x0, 0x37, + 0x6a, 0x96, 0x66, 0x6e, 0x67, 0x80, 0x0, 0x0, + 0x75, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, + 0x96, 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x7, 0x96, + 0x66, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xe0, 0x0, 0x2, 0x66, 0x6a, 0x96, 0x66, + 0x6e, 0x66, 0xc7, 0x1, 0xb, 0x20, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0xc, 0x80, 0x1a, + 0x50, 0x0, 0x0, 0xb, 0x26, 0x80, 0x0, 0x1e, + 0x60, 0x0, 0x0, 0xb6, 0x70, 0x0, 0x0, 0x37, + 0x0, 0x0, 0xd, 0xa6, 0x66, 0x66, 0x66, 0xc8, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+751F "生" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0xa, 0x40, 0x0, 0x82, 0x0, + 0x0, 0x6a, 0x66, 0x6c, 0x86, 0x66, 0x75, 0x0, + 0x0, 0xb0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x4, 0x50, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x7, 0x0, 0x0, 0xa, 0x40, 0x2, 0x30, 0x0, + 0x0, 0x6, 0x66, 0x6c, 0x86, 0x69, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x7, 0x20, + 0x18, 0x66, 0x66, 0x67, 0x66, 0x66, 0x69, 0x60, + + /* U+7522 "產" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0x6a, 0x76, 0x66, 0xa7, 0x0, 0x0, + 0x10, 0x34, 0x0, 0x3d, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x27, 0x75, 0xc5, 0x0, 0x0, 0x0, 0x30, 0x33, + 0x0, 0x0, 0xa0, 0x45, 0x0, 0xa, 0x86, 0x76, + 0x69, 0x66, 0x66, 0x50, 0x0, 0x94, 0xc, 0x30, + 0xd2, 0x0, 0x0, 0x0, 0xa, 0x33, 0xd6, 0x6e, + 0x66, 0x7b, 0x0, 0x0, 0xb1, 0x80, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x23, 0x0, 0xd, 0x0, + 0x61, 0x0, 0x0, 0xa1, 0x7, 0x66, 0xe6, 0x66, + 0x30, 0x0, 0x44, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, + 0x31, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7523 "産" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0x6a, 0x86, 0x66, 0xd8, 0x0, 0x0, + 0x10, 0x50, 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x90, 0x7, 0x60, 0x0, 0x0, 0x3, 0x0, + 0x7, 0x0, 0x70, 0x1, 0x40, 0x0, 0xa8, 0x66, + 0x66, 0x86, 0x66, 0x77, 0x0, 0xa, 0x30, 0x83, + 0xd, 0x20, 0x0, 0x0, 0x0, 0xa3, 0xd, 0x10, + 0xd0, 0x0, 0x30, 0x0, 0xb, 0x26, 0x96, 0x6e, + 0x66, 0x69, 0x30, 0x0, 0xb0, 0x80, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0x31, 0x56, 0x6e, 0x66, + 0xa8, 0x0, 0x0, 0x90, 0x1, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x54, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x7, 0x5, 0x66, 0x66, 0xe6, 0x66, 0x7e, + 0x20, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7528 "用" */ + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x3, 0xd6, 0x66, 0x6d, 0x66, 0x66, 0xe0, 0x0, + 0x2b, 0x0, 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x2, + 0xb0, 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x2d, + 0x66, 0x66, 0xd6, 0x66, 0x6c, 0x0, 0x2, 0xb0, + 0x0, 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x1, 0xb0, 0x0, 0x1c, 0x0, 0x4, 0xa0, 0x0, + 0x1b, 0x0, 0x1, 0xc0, 0x0, 0x5b, 0x66, 0x66, + 0xd6, 0x66, 0x6c, 0x0, 0x7, 0x60, 0x0, 0x1b, + 0x0, 0x1, 0xc0, 0x0, 0xa3, 0x0, 0x1, 0xb0, + 0x0, 0x1c, 0x0, 0xc, 0x0, 0x0, 0x1b, 0x0, + 0x1, 0xc0, 0x4, 0x50, 0x0, 0x1, 0xc0, 0x22, + 0x5c, 0x0, 0x80, 0x0, 0x0, 0x29, 0x1, 0x6f, + 0x80, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x0, + + /* U+7530 "田" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x86, + 0x66, 0x66, 0x66, 0x66, 0xb3, 0x2b, 0x0, 0x0, + 0xe0, 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, + 0x0, 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, + 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2b, + 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, 0xd6, 0x66, + 0x6e, 0x66, 0x66, 0xd1, 0x2b, 0x0, 0x0, 0xe0, + 0x0, 0xc, 0x12, 0xb0, 0x0, 0xe, 0x0, 0x0, + 0xc1, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0xc, 0x12, + 0xb0, 0x0, 0xe, 0x0, 0x0, 0xc1, 0x2d, 0x66, + 0x66, 0x66, 0x66, 0x6d, 0x22, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x40, + + /* U+7531 "由" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1, 0x20, 0x0, 0xd, 0x0, + 0x0, 0x60, 0x3d, 0x66, 0x66, 0xe6, 0x66, 0x6f, + 0x22, 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, + 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, 0xb0, 0x0, + 0xd, 0x0, 0x0, 0xe0, 0x2d, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x2, 0xb0, 0x0, 0xd, 0x0, 0x0, + 0xe0, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xe, 0x2, + 0xb0, 0x0, 0xd, 0x0, 0x0, 0xe0, 0x2b, 0x0, + 0x0, 0xd0, 0x0, 0xe, 0x3, 0xd6, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, + + /* U+7533 "申" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1, 0x96, 0x66, 0x6e, 0x66, + 0x66, 0xc1, 0x1d, 0x0, 0x0, 0xd0, 0x0, 0x1d, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0x1, 0xd0, 0xd, + 0x0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xe6, 0x66, + 0x6e, 0x66, 0x66, 0xd0, 0xd, 0x0, 0x0, 0xd0, + 0x0, 0x1d, 0x1, 0xd0, 0x0, 0xd, 0x0, 0x1, + 0xd0, 0x1e, 0x66, 0x66, 0xe6, 0x66, 0x6d, 0x1, + 0x70, 0x0, 0xd, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+7535 "电" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x0, 0xb7, 0x66, 0x6e, 0x66, 0x66, 0xf1, + 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0xa3, + 0x0, 0xd, 0x0, 0x1, 0xd0, 0xa, 0x86, 0x66, + 0xe6, 0x66, 0x6d, 0x0, 0xa3, 0x0, 0xd, 0x0, + 0x1, 0xd0, 0xa, 0x30, 0x0, 0xd0, 0x0, 0x1d, + 0x0, 0xb8, 0x66, 0x6e, 0x66, 0x66, 0xd0, 0xa, + 0x20, 0x0, 0xd0, 0x0, 0x3, 0x40, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0xb, 0xcc, 0xcc, + 0xce, 0x70, + + /* U+7537 "男" */ + 0x0, 0x86, 0x66, 0x66, 0x66, 0x6a, 0x0, 0x0, + 0xc0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc0, + 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0x6d, 0x0, 0x0, 0xc0, 0x0, 0xd0, + 0x0, 0x1d, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, + 0x1d, 0x0, 0x0, 0xd6, 0x66, 0xa6, 0x66, 0x6c, + 0x0, 0x0, 0x10, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x66, 0xf6, 0x66, 0x66, 0xc0, 0x1, + 0x0, 0x3, 0xa0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x7, 0x60, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x4, 0xc1, 0x2, + 0x41, 0x1d, 0x0, 0x2, 0x97, 0x0, 0x0, 0x3d, + 0xf7, 0x0, 0x43, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, + + /* U+753A "町" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, + 0x66, 0x66, 0xb5, 0x76, 0x68, 0x69, 0xa0, 0xb1, + 0x1c, 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, + 0xc0, 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, + 0xd, 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, + 0xd0, 0x0, 0xe, 0x0, 0x0, 0xb6, 0x6d, 0x6d, + 0x0, 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, + 0x0, 0xe, 0x0, 0x0, 0xb1, 0x1c, 0xd, 0x0, + 0x0, 0xe0, 0x0, 0xb, 0x11, 0xc0, 0xd0, 0x0, + 0xe, 0x0, 0x0, 0xc6, 0x6c, 0x6e, 0x0, 0x0, + 0xe0, 0x0, 0xc, 0x10, 0x0, 0xa0, 0x0, 0xe, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x1, 0x11, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xea, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, + + /* U+753B "画" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa6, + 0x69, 0x66, 0xe0, 0x0, 0x2, 0x3, 0xa0, 0xc, + 0x0, 0xc0, 0xa2, 0xe, 0x12, 0xa0, 0xc, 0x0, + 0xc0, 0xd0, 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, + 0xd0, 0xd, 0x2, 0xc6, 0x6d, 0x66, 0xc0, 0xd0, + 0xd, 0x2, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, + 0x3, 0xa0, 0xc, 0x0, 0xc0, 0xd0, 0xd, 0x3, + 0xc6, 0x6d, 0x66, 0xd0, 0xd0, 0xd, 0x3, 0x70, + 0x0, 0x0, 0x60, 0xd0, 0x2e, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xe0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+754C "界" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xb, 0x76, 0x6e, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0xa, 0x76, 0x6e, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0xa, 0x20, 0xd, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0xb, 0x76, 0x8b, 0x67, 0x67, 0xa0, 0x0, + 0x0, 0x3, 0x1, 0xd0, 0x8, 0x10, 0x10, 0x0, + 0x0, 0x0, 0xc, 0x50, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x3, 0xc6, 0xa0, 0x1, 0xa8, 0xea, 0x71, + 0x2, 0x77, 0x13, 0x60, 0x1, 0xc0, 0x17, 0x50, + 0x3, 0x0, 0x6, 0x20, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x37, 0x20, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+7559 "留" */ + 0x0, 0x0, 0x29, 0x90, 0x0, 0x0, 0x0, 0x9, + 0x57, 0x63, 0x17, 0x77, 0x66, 0xc4, 0xd, 0x0, + 0x10, 0x0, 0x77, 0x0, 0xc1, 0xd, 0x0, 0x3a, + 0x10, 0xa3, 0x0, 0xd0, 0xd, 0x0, 0x39, 0xc1, + 0xb0, 0x0, 0xd0, 0xe, 0x89, 0x30, 0x6a, 0x22, + 0x68, 0x90, 0xa, 0x40, 0x1, 0x72, 0x0, 0x3b, + 0x10, 0x0, 0xa6, 0x68, 0x66, 0x66, 0x6b, 0x20, + 0x0, 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, + 0xe0, 0x0, 0x3a, 0x0, 0xe, 0x0, 0x0, 0xf6, + 0x66, 0x8c, 0x66, 0x6e, 0x0, 0x0, 0xe0, 0x0, + 0x3a, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x3a, + 0x0, 0xe, 0x0, 0x0, 0xf6, 0x66, 0x67, 0x66, + 0x6e, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, + 0x0, + + /* U+756A "番" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, 0xc0, 0x0, + 0x0, 0x24, 0x56, 0x89, 0xe8, 0x66, 0x20, 0x0, + 0x0, 0x0, 0x35, 0x0, 0xd0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xd0, 0x81, 0x0, 0x20, + 0x4, 0x76, 0x68, 0x7a, 0xe7, 0x76, 0x68, 0x90, + 0x0, 0x0, 0x1, 0xc3, 0xd2, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x20, 0xd0, 0x3b, 0x40, 0x0, + 0x0, 0x18, 0x60, 0x0, 0xe0, 0x1, 0xae, 0xa2, + 0x4, 0x51, 0xb6, 0x66, 0xa6, 0x66, 0xd4, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0xe6, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+756B "畫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x6e, 0x66, 0x6b, 0x20, 0x0, 0x0, + 0x10, 0x0, 0xd0, 0x0, 0xd0, 0x70, 0x4, 0x76, + 0x66, 0x6e, 0x66, 0x6e, 0x66, 0x20, 0x0, 0x66, + 0x55, 0xe5, 0x55, 0xc0, 0x0, 0x0, 0x5, 0x66, + 0x6e, 0x66, 0x67, 0x80, 0x0, 0x0, 0x10, 0x0, + 0xd0, 0x0, 0x1, 0x30, 0x0, 0x76, 0x66, 0x67, + 0x66, 0x66, 0x66, 0x0, 0x0, 0xa6, 0x66, 0x76, + 0x66, 0xa6, 0x0, 0x0, 0xd, 0x0, 0xd, 0x0, + 0xa, 0x30, 0x0, 0x0, 0xd6, 0x66, 0xe6, 0x66, + 0xc3, 0x0, 0x0, 0xd, 0x66, 0x6e, 0x66, 0x6c, + 0x30, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x51, + 0x40, 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7f, + 0x60, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7570 "異" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x66, 0x6e, 0x20, 0x0, + 0xd, 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0xd6, 0x66, 0xd6, 0x66, 0x6d, 0x0, 0x0, 0xd, + 0x0, 0xb, 0x10, 0x0, 0xd0, 0x0, 0x0, 0xd6, + 0x66, 0x96, 0x66, 0x6d, 0x0, 0x0, 0x5, 0xa, + 0x10, 0xa, 0x20, 0x30, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0xd0, 0x1, 0x60, 0x0, 0x76, 0x6e, 0x66, + 0x6e, 0x66, 0x65, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0xd0, 0x0, 0x0, 0x6, 0x76, 0x6b, 0x66, 0x6b, + 0x66, 0x6a, 0x70, 0x0, 0x0, 0x87, 0x0, 0x36, + 0x20, 0x0, 0x0, 0x2, 0xb9, 0x20, 0x0, 0x19, + 0xc4, 0x0, 0x28, 0x71, 0x0, 0x0, 0x0, 0x4, + 0xf2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, + + /* U+7576 "當" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0xc3, 0x0, 0x30, 0x0, 0x0, 0x2b, + 0x10, 0xc0, 0x6, 0xc0, 0x0, 0x1, 0x7, 0x40, + 0xc0, 0x9, 0x0, 0x0, 0x9, 0x66, 0x66, 0xb6, + 0x86, 0x66, 0xd7, 0x2b, 0x0, 0x0, 0x0, 0x1, + 0x3, 0x80, 0x75, 0x8, 0x86, 0x66, 0x6c, 0x52, + 0x0, 0x0, 0x7, 0x40, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x7, 0x86, 0x66, 0x6c, 0x30, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0x76, 0x66, 0x7d, 0x0, 0x0, 0xd0, 0x0, + 0xa2, 0x0, 0x39, 0x0, 0x0, 0xd6, 0x66, 0xc7, + 0x66, 0x89, 0x0, 0x0, 0xd0, 0x0, 0xa2, 0x0, + 0x39, 0x0, 0x0, 0xe6, 0x66, 0xc7, 0x66, 0x8a, + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x26, 0x0, + + /* U+75B2 "疲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x87, 0x0, 0x3, 0x20, + 0x0, 0x8, 0x86, 0x66, 0x77, 0x66, 0x69, 0x70, + 0x4, 0x8, 0x40, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x7, 0x68, 0x40, 0x96, 0x6e, 0x66, 0x6b, 0x10, + 0x3, 0x98, 0x40, 0xc0, 0xd, 0x0, 0x67, 0x0, + 0x0, 0x8, 0x40, 0xc0, 0xd, 0x0, 0x30, 0x0, + 0x0, 0x5b, 0x40, 0xc0, 0xd, 0x0, 0x60, 0x0, + 0x2d, 0x3a, 0x21, 0xd6, 0x86, 0x67, 0xe2, 0x0, + 0x1, 0xb, 0x3, 0xa0, 0x60, 0xa, 0x50, 0x0, + 0x0, 0xb, 0x7, 0x60, 0x27, 0x4b, 0x0, 0x0, + 0x0, 0x66, 0xc, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0x0, 0xa0, 0x65, 0x0, 0x5b, 0x8a, 0x40, 0x0, + 0x6, 0x13, 0x60, 0x48, 0x50, 0x2, 0xaf, 0x90, + 0x1, 0x1, 0x3, 0x10, 0x0, 0x0, 0x1, 0x0, + + /* U+75C5 "病" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x76, 0x0, 0x5, 0x20, 0x0, + 0xc7, 0x66, 0x66, 0x66, 0x66, 0x64, 0x8, 0x2c, + 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x49, 0xc3, + 0x76, 0x66, 0xd6, 0x66, 0x82, 0x0, 0x1c, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x5, 0xd1, 0x86, + 0x66, 0xe6, 0x66, 0xb1, 0x2b, 0x2d, 0xd, 0x0, + 0x2b, 0x0, 0xe, 0x0, 0x30, 0xc0, 0xd0, 0x7, + 0x83, 0x0, 0xe0, 0x0, 0x1b, 0xc, 0x0, 0xc0, + 0x76, 0xe, 0x0, 0x4, 0x60, 0xc0, 0x83, 0x0, + 0xe1, 0xe0, 0x0, 0xa1, 0xc, 0x52, 0x0, 0x4, + 0xe, 0x0, 0x27, 0x0, 0xd0, 0x0, 0x1, 0x32, + 0xd0, 0x7, 0x0, 0xd, 0x0, 0x0, 0x5, 0xf9, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, + + /* U+75DB "痛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x2c, 0x0, 0x4, 0x50, + 0x0, 0x3, 0xc6, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x8, 0x23, 0xb0, 0x76, 0x66, 0x66, 0xa8, 0x0, + 0x4, 0xc2, 0xb0, 0x0, 0x33, 0x18, 0x73, 0x0, + 0x0, 0x82, 0xb0, 0x20, 0xc, 0x60, 0x3, 0x0, + 0x0, 0x2, 0xb0, 0xe6, 0x6c, 0x76, 0x6e, 0x20, + 0x0, 0x59, 0xa0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x2c, 0x74, 0x80, 0xe6, 0x6c, 0x76, 0x6e, 0x0, + 0x5, 0x7, 0x50, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0xb, 0x10, 0xd6, 0x6c, 0x76, 0x6e, 0x0, + 0x0, 0x2a, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x0, 0x91, 0x0, 0xd0, 0xa, 0x20, 0xd, 0x0, + 0x5, 0x30, 0x0, 0xd0, 0xa, 0x35, 0xcd, 0x0, + 0x1, 0x0, 0x0, 0x40, 0x1, 0x0, 0x21, 0x0, + + /* U+767A "発" */ + 0x0, 0x0, 0x0, 0x43, 0x0, 0x32, 0x0, 0x0, + 0x46, 0x66, 0x8d, 0x43, 0x2c, 0x40, 0x0, 0x0, + 0x73, 0xb, 0x30, 0x95, 0x1, 0x90, 0x0, 0x2, + 0x97, 0x70, 0x3, 0x71, 0xa5, 0x0, 0x0, 0x6, + 0x80, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x7, 0x60, + 0x0, 0x0, 0x19, 0xdc, 0x71, 0x36, 0x15, 0x7e, + 0x66, 0xe6, 0x50, 0x63, 0x0, 0x0, 0x0, 0xc0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0xd0, 0x0, 0x40, 0x0, 0x76, 0x66, 0xd6, 0x6e, + 0x66, 0x68, 0x30, 0x0, 0x0, 0x58, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, + 0x5, 0x0, 0x0, 0x9, 0x30, 0x0, 0xc0, 0x0, + 0x74, 0x1, 0x57, 0x0, 0x0, 0x8, 0xcb, 0xbd, + 0x50, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+767C "發" */ + 0x0, 0x0, 0x0, 0x51, 0x10, 0x32, 0x0, 0x0, + 0x3, 0x86, 0x6f, 0x55, 0xa, 0x20, 0x0, 0x0, + 0x38, 0x9, 0x70, 0x1a, 0x1, 0xc0, 0x0, 0x0, + 0x67, 0x80, 0x0, 0x38, 0x61, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x0, 0x3b, 0x73, 0x10, 0x47, 0x67, + 0xb6, 0x7, 0x76, 0xc7, 0xb4, 0x1, 0x0, 0xb, + 0x20, 0x93, 0xd, 0x0, 0x0, 0x3, 0x11, 0xb2, + 0xb, 0x0, 0xd0, 0x0, 0x0, 0xb6, 0x59, 0x12, + 0x80, 0x7, 0xbb, 0x70, 0xc, 0x10, 0x11, 0x63, + 0x33, 0x37, 0x10, 0x0, 0xc6, 0x6c, 0x70, 0x43, + 0x35, 0xc1, 0x0, 0x0, 0x0, 0xc1, 0x4, 0x30, + 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xca, + 0x0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x96, 0x6b, + 0x10, 0x0, 0x18, 0xc7, 0x4, 0x72, 0x0, 0x6b, + 0x0, 0x0, 0x5, 0x3, 0x10, 0x0, 0x0, 0x20, + + /* U+767D "白" */ + 0x0, 0x0, 0x1b, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, + 0x0, 0x20, 0xd, 0x67, 0x66, 0x66, 0x66, 0xd6, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, + 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0xe, 0x0, 0x0, 0x0, 0x0, 0xc1, + 0xe, 0x66, 0x66, 0x66, 0x66, 0xd1, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+767E "百" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x2, + 0x86, 0x66, 0x68, 0x96, 0x66, 0x68, 0x90, 0x0, + 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x66, 0x96, 0x66, 0x6c, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, + 0x66, 0x7c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, 0x7c, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7684 "的" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x2b, 0x10, 0x0, 0x0, 0xd0, 0x0, + 0x6, 0xc0, 0x0, 0x1, 0x44, 0x3, 0x0, 0xb3, + 0x0, 0x10, 0xe7, 0x66, 0xe4, 0x2d, 0x66, 0x6c, + 0x8d, 0x0, 0xd, 0x9, 0x30, 0x0, 0xb3, 0xd0, + 0x0, 0xd2, 0x60, 0x0, 0xb, 0x3d, 0x0, 0xd, + 0x41, 0x40, 0x0, 0xb3, 0xd6, 0x66, 0xd0, 0xa, + 0x40, 0xc, 0x2d, 0x0, 0xd, 0x0, 0x4b, 0x0, + 0xc2, 0xd0, 0x0, 0xd0, 0x0, 0x40, 0xd, 0x1d, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xd1, 0xd0, 0x0, + 0xd0, 0x0, 0x0, 0xe, 0xe, 0x66, 0x6e, 0x0, + 0x5, 0x25, 0xd0, 0xd0, 0x0, 0xa0, 0x0, 0x1a, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+7686 "皆" */ + 0x28, 0x0, 0x0, 0x1b, 0x0, 0x10, 0x0, 0x2a, + 0x0, 0x0, 0x1c, 0x2, 0xe6, 0x0, 0x2c, 0x66, + 0xa8, 0x1c, 0x3b, 0x40, 0x0, 0x2a, 0x0, 0x0, + 0x1d, 0x40, 0x0, 0x40, 0x2a, 0x0, 0x14, 0x1c, + 0x0, 0x0, 0x70, 0x3d, 0xa9, 0x50, 0xd, 0x0, + 0x1, 0xe2, 0x2a, 0x20, 0xb, 0x28, 0xbb, 0xbb, + 0x80, 0x1, 0x0, 0x37, 0x0, 0x2, 0x0, 0x0, + 0x5, 0xc6, 0x66, 0x66, 0x6c, 0x60, 0x0, 0x4, + 0xa0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x4, 0xc6, + 0x66, 0x66, 0x6c, 0x30, 0x0, 0x4, 0xa0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x5, 0xc6, 0x66, 0x66, 0x6c, + 0x30, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+76BF "皿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1c, 0x66, 0xa6, 0x6a, 0x66, 0xf2, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0x1c, 0x0, 0xd0, 0xd, 0x0, 0xe2, 0x90, + 0x6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, + + /* U+76D7 "盗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, + 0xc3, 0x1, 0x1e, 0x20, 0x0, 0x10, 0x0, 0x4, + 0x74, 0x29, 0x96, 0x66, 0x6e, 0x60, 0x0, 0x1, + 0x83, 0x90, 0x86, 0x4, 0x60, 0x0, 0x0, 0xb2, + 0x70, 0xd, 0x70, 0x20, 0x0, 0x6, 0xe6, 0x0, + 0x4, 0xb6, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xc3, 0xb, 0x20, 0x0, 0x0, 0xf0, 0x0, 0x95, + 0x0, 0x3e, 0x82, 0x0, 0x8, 0x4, 0x71, 0x0, + 0x0, 0x38, 0x10, 0x0, 0x96, 0x66, 0x66, 0x66, + 0x6d, 0x20, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0xd0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, + 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, + 0x0, 0x46, 0xe6, 0x6e, 0x66, 0xe6, 0x6e, 0xab, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+76EE "目" */ + 0x1, 0x0, 0x0, 0x0, 0x2, 0x1, 0xd6, 0x66, + 0x66, 0x67, 0xe1, 0x1e, 0x0, 0x0, 0x0, 0x3c, + 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0xf6, 0x66, 0x66, 0x67, + 0xc0, 0xe, 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, + 0x0, 0x0, 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, + 0x7c, 0x0, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0xe, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0xe0, 0x0, 0x0, + 0x3, 0xc0, 0xf, 0x66, 0x66, 0x66, 0x7c, 0x1, + 0xd0, 0x0, 0x0, 0x3, 0xc0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+76F4 "直" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, 0x37, 0x0, + 0x0, 0x76, 0x66, 0x6b, 0x86, 0x66, 0x66, 0x10, + 0x0, 0x0, 0x30, 0xb, 0x10, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x6, 0x40, + 0x6, 0x66, 0x76, 0x66, 0x66, 0x67, 0x67, 0x70, + + /* U+76F8 "相" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x96, 0x66, 0x6c, 0x30, 0x0, + 0xd, 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0xd0, 0x52, 0xd1, 0x0, 0xe, 0x0, 0x67, 0x6f, + 0x67, 0x4c, 0x10, 0x0, 0xe0, 0x0, 0x4, 0xf0, + 0x0, 0xc6, 0x66, 0x6e, 0x0, 0x0, 0x9f, 0x95, + 0xc, 0x10, 0x0, 0xe0, 0x0, 0xc, 0xd1, 0xe0, + 0xc1, 0x0, 0xe, 0x0, 0x6, 0x5d, 0x3, 0xc, + 0x66, 0x66, 0xe0, 0x0, 0xa0, 0xd0, 0x0, 0xc1, + 0x0, 0xe, 0x0, 0x62, 0xd, 0x0, 0xc, 0x10, + 0x0, 0xe0, 0x13, 0x0, 0xd0, 0x0, 0xc1, 0x0, + 0xe, 0x0, 0x0, 0xe, 0x0, 0xd, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0xe0, 0x0, 0xd1, 0x0, 0xd, + 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+770B "看" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xc0, 0x0, + 0x0, 0x55, 0x67, 0x7e, 0x97, 0x53, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x37, 0x66, 0xaa, 0x66, 0x68, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1, 0x30, + 0x7, 0x66, 0x69, 0xb6, 0x66, 0x66, 0x69, 0x90, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0x66, 0x66, 0x6c, 0x40, 0x0, + 0x0, 0x4, 0x8d, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x38, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x4, 0x50, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x1, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x0, 0x7, 0x10, 0x0, + + /* U+771F "真" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x6b, 0x96, 0x66, 0x6e, 0x30, + 0x0, 0x20, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0xc, 0x10, 0x7, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x5, 0x66, 0xd6, 0x66, 0x66, 0x6d, 0x68, 0xd1, + 0x1, 0x0, 0x6, 0x90, 0x3, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x10, 0x0, 0x3c, 0x60, 0x0, + 0x0, 0x28, 0x40, 0x0, 0x0, 0x1, 0xc7, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + + /* U+7720 "眠" */ + 0x0, 0x0, 0x5, 0x22, 0x22, 0x22, 0x70, 0xa, + 0x66, 0xc2, 0xb5, 0x44, 0x44, 0x4e, 0x0, 0xd0, + 0xd, 0xa, 0x20, 0x0, 0x0, 0xd0, 0xd, 0x0, + 0xd0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xd, + 0xa, 0x76, 0x7a, 0x66, 0xd0, 0xd, 0x66, 0xe0, + 0xa2, 0x3, 0xa0, 0x0, 0x0, 0xd0, 0xd, 0xa, + 0x20, 0x2a, 0x0, 0x21, 0xd, 0x0, 0xd0, 0xa7, + 0x56, 0xd5, 0x58, 0x50, 0xd6, 0x6e, 0xa, 0x20, + 0xd, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xa2, 0x0, + 0xa3, 0x0, 0x0, 0xd0, 0xd, 0xa, 0x20, 0x5, + 0xa0, 0x4, 0xd, 0x66, 0xe0, 0xa2, 0x45, 0xd, + 0x50, 0x50, 0xd0, 0x8, 0xb, 0xc6, 0x0, 0x3e, + 0x77, 0x1, 0x0, 0x0, 0x95, 0x0, 0x0, 0x3d, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+773E "眾" */ + 0x1, 0x86, 0x66, 0x66, 0x66, 0x69, 0x70, 0x1, + 0xc0, 0xc, 0x0, 0x30, 0x8, 0x60, 0x0, 0xc0, + 0xc, 0x0, 0x30, 0x8, 0x40, 0x0, 0xc0, 0xc, + 0x0, 0x30, 0x8, 0x40, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0x69, 0x30, 0x0, 0x10, 0x0, 0x0, 0x25, + 0x9c, 0x10, 0x4, 0x56, 0x78, 0x9c, 0x87, 0x54, + 0x10, 0x0, 0x3, 0x10, 0x29, 0x0, 0x50, 0x0, + 0x0, 0xa, 0x70, 0x29, 0x3, 0xe1, 0x0, 0x0, + 0x1e, 0x0, 0x29, 0x6, 0xc0, 0x0, 0x0, 0x88, + 0xb3, 0x29, 0xb, 0x85, 0x0, 0x3, 0xa0, 0x1e, + 0x49, 0x38, 0xc, 0x40, 0x37, 0x0, 0x4, 0x4a, + 0x70, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, + 0x0, + + /* U+7740 "着" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x83, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x6, 0x40, 0x3, 0x0, 0x28, + 0x66, 0x69, 0x96, 0x86, 0x68, 0xb1, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0x4, 0x0, 0x0, 0x0, 0x76, + 0x6a, 0xa6, 0x66, 0x93, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x66, 0xb9, + 0x66, 0x66, 0x66, 0x84, 0x0, 0x0, 0x3e, 0x66, + 0x66, 0x69, 0x40, 0x0, 0x0, 0x29, 0xd0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x38, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0x44, 0x0, 0xd0, 0x0, 0x0, + 0xa2, 0x0, 0x10, 0x0, 0xd, 0x66, 0x66, 0x6c, + 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x6c, 0x30, + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x40, 0x0, + + /* U+77E5 "知" */ + 0x0, 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x20, 0x10, 0x0, 0x2, 0x0, 0x1c, + 0x68, 0x7b, 0x1a, 0x76, 0x67, 0xd0, 0x7, 0x22, + 0xb0, 0x0, 0xa2, 0x0, 0x2a, 0x0, 0x70, 0x2b, + 0x0, 0xa, 0x20, 0x2, 0xa0, 0x20, 0x2, 0xb0, + 0x31, 0xa2, 0x0, 0x2a, 0x5, 0x76, 0x7c, 0x69, + 0x6a, 0x20, 0x2, 0xa0, 0x0, 0x5, 0x80, 0x0, + 0xa2, 0x0, 0x2a, 0x0, 0x0, 0x89, 0x50, 0xa, + 0x20, 0x2, 0xa0, 0x0, 0xd, 0x7, 0x90, 0xa2, + 0x0, 0x2b, 0x0, 0x6, 0x70, 0xc, 0x7a, 0x76, + 0x67, 0xb0, 0x2, 0xa0, 0x0, 0x37, 0xa2, 0x0, + 0x2b, 0x2, 0x80, 0x0, 0x0, 0x5, 0x0, 0x1, + 0x40, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+77ED "短" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0xe0, 0x0, 0x76, 0x66, 0x66, 0x89, 0x0, 0x58, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0x7c, + 0x67, 0x2, 0x0, 0x0, 0x30, 0x3, 0x70, 0xd0, + 0x0, 0xe6, 0x66, 0x6f, 0x10, 0x40, 0xd, 0x0, + 0xd, 0x0, 0x0, 0xd0, 0x1, 0x11, 0xd1, 0x81, + 0xd0, 0x0, 0xd, 0x0, 0x45, 0x5d, 0x44, 0x2e, + 0x66, 0x66, 0xd0, 0x0, 0x3, 0xb0, 0x0, 0xb0, + 0x0, 0x7, 0x0, 0x0, 0x59, 0x70, 0x3, 0x0, + 0xb, 0x60, 0x0, 0x9, 0x36, 0x90, 0x92, 0x0, + 0xe1, 0x0, 0x0, 0xb0, 0xc, 0x6, 0x90, 0x29, + 0x0, 0x0, 0x64, 0x0, 0x0, 0x24, 0x6, 0x10, + 0x40, 0x27, 0x0, 0x6, 0x76, 0x66, 0x86, 0x6a, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+77F3 "石" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0xb0, + 0x1, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x66, 0x66, 0x66, 0xc2, 0x0, + 0x0, 0x5, 0x9e, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x2a, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x80, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x15, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7802 "砂" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x16, 0x66, 0x69, 0xa0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0x2d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x5, 0xb0, 0xd0, 0x61, 0x0, + 0x0, 0x93, 0x0, 0x8, 0x60, 0xd0, 0x1d, 0x40, + 0x0, 0xd0, 0x4, 0xb, 0x0, 0xd0, 0x5, 0xd0, + 0x4, 0xf6, 0x6e, 0x38, 0x0, 0xe0, 0x0, 0x50, + 0x9, 0xd0, 0xd, 0x61, 0x0, 0xe0, 0x24, 0x0, + 0x34, 0xc0, 0xd, 0x40, 0x0, 0xe0, 0xbb, 0x0, + 0x10, 0xc0, 0xd, 0x0, 0x0, 0x37, 0xc0, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0xc6, 0x6d, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0xd0, 0x7, 0x2, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x3, 0x66, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7814 "研" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x50, + 0x4, 0x66, 0x6a, 0xa6, 0x7e, 0x66, 0xe6, 0x50, + 0x1, 0x1b, 0x20, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0x29, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0x7b, 0x6b, 0x50, 0xd, 0x0, 0xd0, 0x10, + 0x0, 0xda, 0xb, 0x37, 0x6e, 0x66, 0xe6, 0xd2, + 0x4, 0x7a, 0xb, 0x20, 0x1c, 0x0, 0xd0, 0x0, + 0x6, 0x2a, 0xb, 0x20, 0x2a, 0x0, 0xd0, 0x0, + 0x0, 0x2a, 0xb, 0x20, 0x57, 0x0, 0xd0, 0x0, + 0x0, 0x2c, 0x6c, 0x20, 0xb2, 0x0, 0xd0, 0x0, + 0x0, 0x3a, 0x9, 0x13, 0x90, 0x0, 0xd0, 0x0, + 0x0, 0x24, 0x0, 0x1a, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+7834 "破" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x1, 0x11, 0x17, 0x20, 0x0, 0xd0, 0x0, 0x0, + 0x7, 0x5e, 0x75, 0x29, 0x66, 0xe6, 0x6b, 0x50, + 0x0, 0xe, 0x0, 0xc, 0x0, 0xd0, 0xb, 0x20, + 0x0, 0x58, 0x0, 0xc, 0x0, 0xd0, 0x11, 0x0, + 0x0, 0xa2, 0x5, 0xc, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xf6, 0x6e, 0xc, 0x66, 0xe6, 0x97, 0x0, + 0x8, 0xe0, 0xd, 0xd, 0x5, 0x0, 0xa3, 0x0, + 0x26, 0xc0, 0xd, 0xd, 0x7, 0x0, 0xc0, 0x0, + 0x20, 0xc0, 0xd, 0x1c, 0x4, 0x45, 0x70, 0x0, + 0x0, 0xc0, 0xd, 0x48, 0x0, 0xbc, 0x10, 0x0, + 0x0, 0xc6, 0x6d, 0x82, 0x0, 0xac, 0x10, 0x0, + 0x0, 0xd0, 0x7, 0x70, 0x9, 0x54, 0xd6, 0x10, + 0x0, 0x70, 0x6, 0x16, 0x71, 0x0, 0x2c, 0xa0, + 0x0, 0x0, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+78BA "確" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x18, 0x79, 0x6a, 0x32, 0x0, 0xd1, 0x0, 0x40, + 0x0, 0x49, 0x0, 0x9, 0x68, 0xb6, 0x68, 0xc1, + 0x0, 0x65, 0x0, 0x2a, 0xa, 0x44, 0x4, 0x0, + 0x0, 0xa2, 0x2, 0x0, 0x2a, 0xb, 0x30, 0x0, + 0x0, 0xe5, 0x5e, 0x10, 0xc7, 0x6a, 0x78, 0x90, + 0x3, 0xf0, 0xc, 0x7, 0xc0, 0xd, 0x0, 0x0, + 0x8, 0xd0, 0xc, 0x56, 0xc0, 0xd, 0x4, 0x0, + 0x15, 0xc0, 0xc, 0x20, 0xd6, 0x6e, 0x66, 0x20, + 0x10, 0xc0, 0xc, 0x0, 0xc0, 0xd, 0x1, 0x0, + 0x0, 0xc6, 0x6c, 0x0, 0xd6, 0x6e, 0x6a, 0x20, + 0x0, 0xc0, 0x9, 0x0, 0xc0, 0xd, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0xc0, 0xd, 0x1, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+793A "示" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x66, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x6, 0x76, 0x66, 0x66, 0x86, 0x66, 0x68, 0xb2, + 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x3, 0xb0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x3, 0xb0, 0x19, 0x10, 0x0, + 0x0, 0x6, 0xb0, 0x3, 0xb0, 0x2, 0xd3, 0x0, + 0x0, 0x2c, 0x0, 0x3, 0xb0, 0x0, 0x4f, 0x20, + 0x0, 0xa1, 0x0, 0x3, 0xb0, 0x0, 0xb, 0x90, + 0x7, 0x10, 0x4, 0x37, 0xb0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x1, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + + /* U+793C "礼" */ + 0x0, 0x3, 0x30, 0x0, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x36, + 0x66, 0x6b, 0x12, 0xb0, 0x0, 0x0, 0x0, 0x10, + 0x8, 0xa0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xc0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd3, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xae, 0x97, + 0x2, 0xb0, 0x0, 0x0, 0x0, 0x92, 0xc1, 0xb5, + 0x2b, 0x0, 0x0, 0x1, 0x61, 0xc, 0x12, 0x22, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x2b, + 0x0, 0x4, 0x0, 0x0, 0xd, 0x10, 0x2, 0xb0, + 0x0, 0x51, 0x0, 0x0, 0xd1, 0x0, 0x1c, 0x0, + 0x8, 0x60, 0x0, 0xd, 0x10, 0x0, 0xad, 0xdd, + 0xd6, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+793E "社" */ + 0x0, 0x6, 0x20, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x71, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x4, 0x66, 0x6a, 0x90, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x30, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0xe0, 0x8, 0x20, + 0x0, 0x2, 0xe1, 0x7, 0x66, 0xe6, 0x66, 0x40, + 0x0, 0xc, 0xdb, 0x60, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x85, 0xc1, 0xd0, 0x0, 0xe0, 0x0, 0x0, + 0x5, 0x31, 0xc0, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x56, 0x66, 0xe6, 0x67, 0xe2, + 0x0, 0x2, 0xd0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7956 "祖" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xa, 0x80, 0xc, 0x66, 0x66, 0xe3, 0x0, + 0x0, 0x3, 0x50, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x7, 0x66, 0x9a, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd2, 0xd, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x7, 0x80, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x1e, 0x50, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x9e, 0x6b, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x5, 0x4d, 0xc, 0x1c, 0x10, 0x0, 0xe0, 0x0, + 0x23, 0xd, 0x0, 0xc, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x0, 0xe2, 0x60, + 0x0, 0xd, 0x7, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+795D "祝" */ + 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x9, 0x66, 0x66, 0x96, 0x0, + 0x0, 0x4, 0x50, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x7, 0x66, 0x7d, 0x1d, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x0, 0x96, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x2, 0xb0, 0xd, 0x0, 0x0, 0x74, 0x0, + 0x0, 0xc, 0x50, 0xe, 0x67, 0x68, 0xa5, 0x0, + 0x0, 0x7e, 0x89, 0x5, 0x48, 0x2b, 0x31, 0x0, + 0x4, 0x6b, 0x1d, 0x10, 0x48, 0x2b, 0x0, 0x0, + 0x25, 0xb, 0x11, 0x0, 0x75, 0x2b, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xb1, 0x2b, 0x0, 0x30, + 0x0, 0xb, 0x10, 0x3, 0x90, 0x2b, 0x0, 0x60, + 0x0, 0xc, 0x10, 0x1a, 0x0, 0x2b, 0x1, 0x90, + 0x0, 0xc, 0x22, 0x80, 0x0, 0xd, 0xbc, 0xb0, + 0x0, 0x5, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+795E "神" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x30, 0xd, 0x0, 0x40, 0x17, 0x66, + 0x7c, 0xd, 0x66, 0xe6, 0x6e, 0x20, 0x0, 0x9, + 0x50, 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x2, 0xa0, + 0xd, 0x66, 0xe6, 0x6e, 0x0, 0x0, 0xc8, 0x10, + 0xd0, 0xd, 0x0, 0xd0, 0x0, 0x8e, 0x2e, 0x1d, + 0x0, 0xd0, 0xd, 0x0, 0x63, 0xc0, 0x61, 0xd6, + 0x6e, 0x66, 0xe0, 0x32, 0xc, 0x0, 0xc, 0x0, + 0xd0, 0x9, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x4, 0x0, 0x0, + + /* U+796D "祭" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe6, 0x69, 0x58, 0x66, 0x7e, 0x20, + 0x0, 0xa, 0x70, 0xd, 0x26, 0x0, 0x96, 0x0, + 0x0, 0x39, 0x5b, 0x4a, 0x2, 0x64, 0x50, 0x0, + 0x0, 0xa7, 0x15, 0xc2, 0x0, 0xa6, 0x0, 0x0, + 0x6, 0x4, 0xa7, 0x70, 0x0, 0x1c, 0x10, 0x0, + 0x0, 0x0, 0x5b, 0x66, 0x66, 0xc5, 0xd6, 0x0, + 0x0, 0x5, 0x70, 0x20, 0x0, 0x0, 0x3d, 0xc1, + 0x1, 0x74, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, + 0x14, 0x7, 0x66, 0x66, 0xd6, 0x66, 0x73, 0x0, + 0x0, 0x0, 0x1e, 0x50, 0xd0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x0, 0xd0, 0x6, 0xc3, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0xd0, 0x0, 0x4e, 0x0, + 0x1, 0x60, 0x2, 0x7c, 0xb0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, + + /* U+7981 "禁" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xc0, 0x20, 0x0, 0xd0, 0x2, 0x0, 0x66, + 0x7e, 0x6a, 0x27, 0x8f, 0x66, 0xa3, 0x0, 0xc, + 0xf6, 0x10, 0xb, 0xf7, 0x0, 0x0, 0x5, 0x8c, + 0x3d, 0x5, 0x8d, 0x39, 0x0, 0x2, 0xa0, 0xc0, + 0x53, 0x80, 0xd0, 0x6d, 0x61, 0x70, 0xc, 0x11, + 0x50, 0xc, 0x0, 0x40, 0x0, 0x5, 0x66, 0x66, + 0x66, 0x6c, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x27, 0x66, 0x66, 0x69, 0x66, + 0x66, 0x6a, 0x60, 0x0, 0x6, 0x40, 0xc2, 0x4, + 0x0, 0x0, 0x0, 0x4, 0xd3, 0xc, 0x20, 0x2b, + 0x40, 0x0, 0x4, 0x90, 0x0, 0xc2, 0x0, 0x1d, + 0x60, 0x3, 0x40, 0x6, 0xcf, 0x0, 0x0, 0x27, + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, + + /* U+79C0 "秀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x46, 0x9d, 0xc0, 0x0, + 0x0, 0x4, 0x56, 0x67, 0xc2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x2, 0x30, + 0x3, 0x76, 0x66, 0x8b, 0xd8, 0x66, 0x68, 0x80, + 0x0, 0x0, 0x2, 0xd4, 0xb2, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x21, 0xb0, 0x59, 0x0, 0x0, + 0x0, 0x5, 0xa1, 0x2, 0x80, 0x4, 0xd8, 0x30, + 0x1, 0x75, 0x66, 0x86, 0x66, 0xd2, 0x19, 0xa2, + 0x3, 0x0, 0x0, 0xe0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0xd, 0x86, 0x97, 0x0, + 0x0, 0x0, 0x9, 0x50, 0x3, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xb1, 0x0, 0x2, 0x2, 0xc0, 0x0, + 0x0, 0x48, 0x10, 0x0, 0x4, 0xcf, 0x50, 0x0, + 0x2, 0x20, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+79C1 "私" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x7b, 0xb8, 0x20, 0x1e, 0x20, 0x0, + 0x1, 0x32, 0x1d, 0x0, 0x0, 0x4d, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x4, 0x50, 0xa3, 0x0, 0x0, + 0x4, 0x76, 0x7e, 0x66, 0x50, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0x10, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0xa8, 0x7, 0x40, 0x0, 0x0, + 0x0, 0x9, 0x4d, 0xd, 0x3a, 0x0, 0x60, 0x0, + 0x0, 0x56, 0xd, 0x2, 0x28, 0x0, 0x38, 0x0, + 0x3, 0x50, 0xd, 0x0, 0x62, 0x0, 0xc, 0x40, + 0x3, 0x0, 0xd, 0x0, 0xa0, 0x1, 0x29, 0xd0, + 0x0, 0x0, 0x1d, 0x6, 0xfd, 0x96, 0x33, 0xf1, + 0x0, 0x0, 0x1e, 0x0, 0x40, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79CB "秋" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x60, 0x2, 0xd1, 0x0, 0x0, + 0x0, 0x36, 0xca, 0x70, 0x2, 0xd0, 0x0, 0x0, + 0x1, 0x20, 0xe0, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x32, 0xc0, 0xd, 0x30, + 0x5, 0x66, 0xe6, 0xd3, 0x83, 0xd0, 0x98, 0x0, + 0x1, 0x13, 0xf0, 0x3, 0xb4, 0xe5, 0x70, 0x0, + 0x0, 0x8, 0xf0, 0xa, 0x65, 0xd4, 0x0, 0x0, + 0x0, 0xc, 0xe9, 0x50, 0x7, 0x95, 0x0, 0x0, + 0x0, 0x64, 0xe1, 0xe0, 0xa, 0x49, 0x0, 0x0, + 0x0, 0x90, 0xe0, 0x30, 0xd, 0x19, 0x10, 0x0, + 0x6, 0x0, 0xe0, 0x0, 0x4a, 0x4, 0x90, 0x0, + 0x10, 0x0, 0xe0, 0x0, 0xc1, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0xe0, 0x9, 0x30, 0x0, 0x3f, 0x50, + 0x0, 0x0, 0xe2, 0x82, 0x0, 0x0, 0x7, 0x91, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79CD "种" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x60, 0x0, 0x3b, 0x0, 0x0, + 0x1, 0x47, 0xba, 0x81, 0x0, 0x2a, 0x0, 0x0, + 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x41, 0x3a, 0x11, 0x70, + 0x6, 0x66, 0xe6, 0xd3, 0xe5, 0x6c, 0x56, 0xc0, + 0x0, 0x2, 0xd0, 0x0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0x7, 0xe6, 0x0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0xc, 0xd5, 0xd0, 0xd0, 0x2a, 0x2, 0xa0, + 0x0, 0x65, 0xd0, 0x80, 0xe6, 0x7c, 0x67, 0xb0, + 0x1, 0x90, 0xd0, 0x0, 0x80, 0x2a, 0x1, 0x30, + 0x7, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x10, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x13, 0x0, 0x0, + + /* U+79D1 "科" */ + 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x36, 0xbb, 0x81, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0x20, 0xd0, 0x0, 0x56, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0xb, 0x50, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x53, 0x2, 0x10, 0xd0, 0x0, + 0x7, 0x66, 0xf6, 0x64, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x57, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0xe8, 0x80, 0xd, 0x10, 0xd0, 0x0, + 0x0, 0x48, 0xd0, 0xd1, 0x2, 0x0, 0xd4, 0xd1, + 0x0, 0xa0, 0xd0, 0x10, 0x35, 0x66, 0xd3, 0x0, + 0x7, 0x10, 0xd0, 0x26, 0x30, 0x0, 0xd0, 0x0, + 0x11, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x80, 0x0, + + /* U+79D8 "秘" */ + 0x0, 0x0, 0x3, 0x40, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xbb, 0x80, 0x5, 0x90, 0x19, 0x0, + 0x3, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0x4d, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x18, 0x40, 0x78, 0x0, + 0x0, 0x0, 0xc0, 0x70, 0x1d, 0x0, 0xb4, 0x0, + 0x6, 0x68, 0xd6, 0x62, 0xc, 0x0, 0xf0, 0x0, + 0x0, 0x9, 0xd5, 0x2, 0xc, 0x4, 0xb6, 0x0, + 0x0, 0xc, 0xc8, 0x88, 0xc, 0xb, 0x56, 0x80, + 0x0, 0x74, 0xc0, 0x5d, 0x1c, 0x2d, 0x1, 0xf1, + 0x1, 0x80, 0xc0, 0x5c, 0xc, 0xc4, 0x0, 0x90, + 0x6, 0x0, 0xc0, 0x0, 0xf, 0xa0, 0x4, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x6d, 0x0, 0x7, 0x0, + 0x0, 0x0, 0xc0, 0x7, 0x7d, 0x0, 0xc, 0x20, + 0x0, 0x1, 0xd2, 0x62, 0xb, 0xcc, 0xcc, 0x20, + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79FB "移" */ + 0x0, 0x0, 0x3, 0x30, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x37, 0xbb, 0x70, 0x7, 0x80, 0x1, 0x0, + 0x2, 0x31, 0xd0, 0x0, 0x2b, 0x66, 0x6e, 0x50, + 0x0, 0x0, 0xd0, 0x0, 0x88, 0x30, 0x79, 0x0, + 0x0, 0x0, 0xd0, 0x74, 0x2, 0xa6, 0xa0, 0x0, + 0x7, 0x67, 0xe6, 0x62, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x7, 0xe0, 0x0, 0x18, 0x59, 0x10, 0x0, + 0x0, 0xc, 0xea, 0x54, 0x60, 0x8b, 0x10, 0x10, + 0x0, 0x47, 0xd1, 0xc0, 0x6, 0xc6, 0x67, 0xe1, + 0x0, 0xa0, 0xd0, 0x10, 0x6a, 0x0, 0xb, 0x50, + 0x5, 0x20, 0xd0, 0x6, 0x35, 0x80, 0x88, 0x0, + 0x3, 0x0, 0xe0, 0x10, 0x0, 0x88, 0x90, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x3, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x5, 0x87, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+7A0B "程" */ + 0x0, 0x0, 0x17, 0x70, 0x30, 0x0, 0x3, 0x0, + 0x3, 0x58, 0xd6, 0x40, 0xe6, 0x66, 0x6e, 0x30, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x5, 0x66, 0xd6, 0xc1, 0xe6, 0x66, 0x6e, 0x0, + 0x2, 0x6, 0xb0, 0x0, 0xc0, 0x0, 0x8, 0x0, + 0x0, 0xa, 0xd5, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0xd, 0xb7, 0x94, 0x76, 0x7c, 0x66, 0x40, + 0x0, 0x57, 0xb0, 0x80, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0xa1, 0xb0, 0x0, 0x0, 0x3a, 0x5, 0x0, + 0x4, 0x31, 0xb0, 0x1, 0x86, 0x7c, 0x66, 0x30, + 0x5, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x3a, 0x0, 0x30, + 0x0, 0x2, 0xc0, 0x47, 0x66, 0x68, 0x67, 0x91, + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A2E "種" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x25, 0xa4, 0x0, + 0x1, 0x48, 0xba, 0x14, 0x56, 0xe5, 0x31, 0x0, + 0x3, 0x1b, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x40, + 0x0, 0xb, 0x10, 0x57, 0x66, 0xe6, 0x66, 0x50, + 0x4, 0x5c, 0x6c, 0x23, 0x0, 0xd0, 0x3, 0x0, + 0x2, 0x2f, 0x21, 0xd, 0x66, 0xe6, 0x6e, 0x0, + 0x0, 0x4f, 0x81, 0xc, 0x0, 0xd0, 0x1c, 0x0, + 0x0, 0xae, 0x3b, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x1, 0x9b, 0x18, 0xc, 0x0, 0xd0, 0x1c, 0x0, + 0x8, 0x1b, 0x10, 0xc, 0x66, 0xe6, 0x6a, 0x0, + 0x23, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x4, 0x0, + 0x0, 0xb, 0x10, 0x28, 0x66, 0xe6, 0x69, 0x30, + 0x0, 0xb, 0x10, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x21, 0x66, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x4, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+7A4D "積" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x45, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x3, 0x6c, 0x96, 0x26, 0x66, 0xe6, 0x6b, 0x50, + 0x0, 0xc, 0x0, 0x2, 0x0, 0xd0, 0x2, 0x0, + 0x0, 0xc, 0x2, 0x3, 0x76, 0xe6, 0x67, 0x0, + 0x18, 0x6e, 0x7a, 0x10, 0x0, 0xd0, 0x3, 0x60, + 0x0, 0x2f, 0x30, 0x57, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x8f, 0x66, 0xb, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xbc, 0xc, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x5c, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, + 0x8, 0xc, 0x0, 0xc, 0x66, 0x66, 0x6d, 0x0, + 0x31, 0xc, 0x0, 0xc, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x76, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc7, 0x1, 0x66, 0x0, + 0x0, 0xc, 0x0, 0x58, 0x20, 0x0, 0x6, 0xb0, + 0x0, 0x1, 0x3, 0x10, 0x0, 0x0, 0x0, 0x50, + + /* U+7A76 "究" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x4b, 0x0, 0x0, 0x30, 0x0, 0x39, + 0x67, 0x66, 0x76, 0x66, 0x7e, 0x10, 0xc, 0x31, + 0xd4, 0x0, 0x65, 0x7, 0x20, 0x0, 0x33, 0xb3, + 0x63, 0x0, 0x5e, 0x70, 0x0, 0x5, 0x50, 0xb, + 0x30, 0x0, 0x2c, 0x0, 0x0, 0x6, 0x77, 0xe7, + 0x77, 0xc0, 0x0, 0x0, 0x0, 0x10, 0xd, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x3a, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0xa0, + 0x0, 0x20, 0x0, 0x8, 0x70, 0x0, 0x3a, 0x0, + 0x15, 0x0, 0x5, 0xa0, 0x0, 0x3, 0xa0, 0x3, + 0xb0, 0x5, 0x70, 0x0, 0x0, 0xc, 0xcc, 0xd8, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A7A "空" */ + 0x0, 0x0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x66, 0x66, 0x96, 0x66, 0x6a, 0x20, 0x2b, + 0x0, 0x41, 0x0, 0x0, 0x1, 0xc4, 0xa, 0x70, + 0x2e, 0x60, 0x4, 0x95, 0x41, 0x0, 0x0, 0x3c, + 0x30, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x67, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x41, 0x56, 0x66, + 0x66, 0x66, 0xd4, 0x10, 0x0, 0x1, 0x10, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x2, 0x0, 0x56, 0x66, 0x66, 0xd8, 0x66, 0x67, + 0xf4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7A93 "窓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0xe, 0x40, 0x0, 0x1, 0x0, 0x38, + 0x66, 0x66, 0x86, 0x66, 0x69, 0xd0, 0xd, 0x20, + 0x4c, 0x0, 0x47, 0x40, 0x81, 0x2, 0x51, 0x89, + 0x26, 0x70, 0x18, 0xe2, 0x0, 0x3, 0x50, 0x3, + 0xd5, 0x2, 0x4, 0x30, 0x0, 0x0, 0x4, 0xa1, + 0x0, 0x66, 0x0, 0x0, 0x0, 0xb, 0xb7, 0x77, + 0x66, 0xe4, 0x0, 0x0, 0x0, 0x88, 0x53, 0x10, + 0x6, 0x80, 0x0, 0x0, 0x2, 0x50, 0x84, 0x0, + 0x1, 0x0, 0x0, 0x5, 0x2d, 0x0, 0xe3, 0x2, + 0x46, 0x0, 0x3, 0x72, 0xb0, 0x4, 0x0, 0x60, + 0xa7, 0x4, 0xe2, 0x2c, 0x0, 0x0, 0x8, 0x43, + 0x90, 0x1, 0x0, 0xdd, 0xdd, 0xdd, 0xe6, 0x0, + 0x0, + + /* U+7ACB "立" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x15, 0x0, + 0x1, 0x86, 0x66, 0x66, 0x66, 0x66, 0x89, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x80, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc0, 0x8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xa0, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x10, + 0x16, 0x66, 0x66, 0x66, 0x96, 0x66, 0x6b, 0xd1, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7AD9 "站" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x44, 0x0, 0xd1, 0x13, 0x80, + 0x6, 0x66, 0x66, 0x77, 0x0, 0xd5, 0x55, 0x50, + 0x0, 0x10, 0x8, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x70, 0xc, 0x30, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x74, 0xd, 0x0, 0x96, 0xe6, 0x6c, 0x30, + 0x0, 0x5a, 0x19, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x3b, 0x43, 0x0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x2, 0x60, 0x33, 0xd0, 0x0, 0xd, 0x0, + 0x1, 0x48, 0xb7, 0x20, 0xd0, 0x0, 0xd, 0x0, + 0xa, 0xa3, 0x0, 0x0, 0xe6, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7AE5 "童" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x66, 0x66, 0xd6, 0x66, 0xc6, 0x0, + 0x0, 0x2, 0x6, 0x60, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x4, 0x40, 0x4, 0x0, + 0x2, 0x76, 0x55, 0x65, 0x57, 0x55, 0x59, 0x50, + 0x0, 0x1, 0x86, 0x66, 0x66, 0x66, 0xa1, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, + 0x0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xd6, 0x66, 0xe6, 0x66, 0xe0, 0x0, + 0x0, 0x1, 0x30, 0x0, 0xd0, 0x0, 0x33, 0x0, + 0x0, 0x18, 0x66, 0x66, 0xe6, 0x66, 0x7a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x40, + 0x6, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, 0xa5, + + /* U+7B11 "笑" */ + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x91, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x4, 0x5, 0xc0, 0x3, 0x10, + 0x0, 0x1d, 0x77, 0x69, 0x4c, 0x78, 0x69, 0x80, + 0x0, 0x93, 0xc, 0x10, 0x65, 0x5, 0xa0, 0x0, + 0x5, 0x40, 0x9, 0x32, 0x50, 0x1, 0xa0, 0x0, + 0x2, 0x0, 0x0, 0x14, 0x68, 0xcf, 0x50, 0x0, + 0x0, 0x4, 0x56, 0x6d, 0x62, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6e, 0x50, + 0x1, 0x0, 0x0, 0x3a, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x3d, 0x82, 0x0, + 0x1, 0x57, 0x10, 0x0, 0x0, 0x1, 0xaf, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+7B26 "符" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc1, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x2, 0x20, 0xd1, 0x0, 0x50, + 0x0, 0x1c, 0x69, 0x76, 0x57, 0x86, 0xb6, 0x72, + 0x0, 0x92, 0x1, 0xc0, 0x28, 0x0, 0x95, 0x0, + 0x5, 0x20, 0x7, 0x30, 0x70, 0x1, 0x31, 0x0, + 0x0, 0x0, 0x5c, 0x20, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x1, 0xd2, 0x56, 0x66, 0x67, 0xc6, 0xc5, + 0x0, 0xb, 0xc0, 0x11, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x76, 0xa0, 0x8, 0x10, 0x3, 0xa0, 0x0, + 0x6, 0x22, 0xa0, 0x3, 0xd0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0xc0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, 0x90, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x3, 0x9d, 0x80, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + + /* U+7B2C "第" */ + 0x0, 0x1, 0xb1, 0x0, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x70, 0x98, 0x0, 0x53, 0x0, + 0x4b, 0x7b, 0x66, 0x6b, 0x7b, 0x66, 0x40, 0x28, + 0x0, 0xa3, 0x18, 0x0, 0xb3, 0x0, 0x2, 0x5, + 0x68, 0x67, 0x66, 0x68, 0xb2, 0x0, 0x0, 0x10, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, + 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x99, 0x66, + 0x6e, 0x66, 0x6c, 0x0, 0x0, 0xd, 0x10, 0x0, + 0xd0, 0x0, 0x1, 0x0, 0x3, 0xd6, 0x66, 0xae, + 0x66, 0x66, 0xc7, 0x0, 0x1, 0x0, 0xb5, 0xd0, + 0x0, 0xc, 0x10, 0x0, 0x1, 0xa5, 0xd, 0x0, + 0x0, 0xe0, 0x0, 0x4, 0xa2, 0x0, 0xd0, 0x19, + 0xd9, 0x0, 0x47, 0x40, 0x0, 0xd, 0x0, 0x6, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + 0x0, + + /* U+7B46 "筆" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xd0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x5, 0x16, 0xa0, 0x0, 0x70, + 0x0, 0x2d, 0x6b, 0x66, 0x5c, 0x67, 0xb6, 0x72, + 0x0, 0xa2, 0x5, 0xc0, 0x74, 0x0, 0x7b, 0x0, + 0x6, 0x30, 0x0, 0xa3, 0xb0, 0x0, 0x1a, 0x0, + 0x1, 0x1, 0x86, 0x68, 0xc6, 0x66, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0xe4, 0x60, + 0x0, 0x76, 0x66, 0x68, 0xc6, 0x66, 0xe6, 0x50, + 0x0, 0x1, 0x66, 0x68, 0xc6, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x20, 0x3, 0xa0, 0x0, 0x40, 0x0, + 0x0, 0x3, 0x66, 0x68, 0xc6, 0x6a, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x8, 0x30, + 0x2, 0x86, 0x66, 0x68, 0xc6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, + + /* U+7B49 "等" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc1, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x6, 0x23, 0xd0, 0x0, 0x60, + 0x0, 0x2d, 0x79, 0x66, 0x4a, 0x6a, 0x76, 0x61, + 0x0, 0xa1, 0xc, 0x20, 0x44, 0x2, 0xc0, 0x0, + 0x6, 0x20, 0x7, 0x30, 0xe1, 0x0, 0x80, 0x0, + 0x0, 0x4, 0x76, 0x66, 0xe6, 0x66, 0x9a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x5, 0x76, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, + 0x0, 0x56, 0x66, 0x66, 0x66, 0x6e, 0x67, 0xc1, + 0x0, 0x10, 0x5, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xeb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + + /* U+7B54 "答" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xb0, 0x4, 0xa, 0x60, 0x2, 0x20, + 0x0, 0xd, 0x87, 0x67, 0x6b, 0x6a, 0x67, 0x50, + 0x0, 0x84, 0xc, 0x3, 0x61, 0x5, 0xa0, 0x0, + 0x3, 0x60, 0x8, 0x3e, 0x70, 0x0, 0xb0, 0x0, + 0x2, 0x0, 0x2, 0xd4, 0x46, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x20, 0x4, 0xa4, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x0, 0x89, 0xda, 0x72, + 0x3, 0x73, 0x37, 0x66, 0x66, 0x61, 0x17, 0x70, + 0x1, 0x0, 0x30, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+7B56 "策" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0xb, 0x50, 0x15, 0xd, 0x40, 0x6, 0x0, 0x5, + 0xa8, 0x86, 0x5a, 0x88, 0x96, 0x61, 0x2, 0x90, + 0xc, 0x3, 0x30, 0xd, 0x10, 0x0, 0x50, 0x0, + 0x40, 0xa4, 0x0, 0x40, 0x50, 0x6, 0x76, 0x66, + 0x6c, 0x76, 0x66, 0x6a, 0x40, 0x0, 0x20, 0x0, + 0xb2, 0x0, 0x4, 0x0, 0x0, 0xd, 0x66, 0x6c, + 0x76, 0x66, 0xe0, 0x0, 0x0, 0xc0, 0x0, 0xc2, + 0x0, 0xd, 0x0, 0x0, 0xc, 0x0, 0x7f, 0x70, + 0x56, 0xc0, 0x0, 0x0, 0xa0, 0x69, 0xb3, 0x70, + 0x85, 0x0, 0x0, 0x0, 0x87, 0xb, 0x22, 0xa2, + 0x0, 0x0, 0x2, 0x93, 0x0, 0xb2, 0x1, 0xab, + 0x63, 0x6, 0x50, 0x0, 0xb, 0x20, 0x0, 0x4b, + 0x31, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+7B97 "算" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xe1, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x9, 0x96, 0x6b, 0x65, 0xc6, 0x66, 0xc1, + 0x0, 0x19, 0x7, 0x60, 0x9, 0x0, 0x94, 0x0, + 0x0, 0x91, 0x21, 0x60, 0x40, 0x0, 0x66, 0x0, + 0x4, 0x10, 0xe6, 0x66, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0x90, 0xf0, 0x0, 0xe1, 0x50, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x0, 0x80, + 0x6, 0x76, 0x69, 0xc6, 0x66, 0xe6, 0x66, 0x73, + 0x0, 0x0, 0x1c, 0x20, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xa2, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x52, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+7BA1 "管" */ + 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0xa7, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x2e, 0x66, 0x88, 0x2d, 0x66, 0x6c, 0x20, 0xa, + 0x15, 0x40, 0x7, 0x3, 0x60, 0x0, 0x5, 0x20, + 0x1a, 0xa, 0x10, 0xb, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x62, 0x2, 0xb6, 0x66, + 0x66, 0x66, 0x66, 0x6e, 0x70, 0xc4, 0x9, 0x66, + 0x66, 0x6a, 0x43, 0x40, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, + 0x6c, 0x20, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x61, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x60, 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x1, 0xb0, + 0x0, 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6c, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+7BC0 "節" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0xb9, 0x66, 0xc5, 0xa9, 0x66, 0x9c, 0x10, 0x48, + 0x7, 0x80, 0x19, 0x2, 0x92, 0x0, 0x18, 0x0, + 0xa, 0x16, 0x0, 0x3, 0xd0, 0x5, 0x3, 0x0, + 0x5, 0x3, 0x0, 0x7, 0x0, 0x0, 0xd6, 0x66, + 0xe1, 0xd6, 0x66, 0xe1, 0x0, 0xd, 0x66, 0x6d, + 0xd, 0x0, 0xd, 0x0, 0x0, 0xc0, 0x0, 0xd0, + 0xd0, 0x0, 0xd0, 0x0, 0xc, 0x0, 0xd, 0xd, + 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, 0xa0, 0xd0, + 0x0, 0xd0, 0x0, 0xc, 0x1, 0x60, 0xd, 0x0, + 0xd, 0x0, 0x0, 0xc0, 0x8, 0x80, 0xd0, 0x3b, + 0xa0, 0x0, 0x1d, 0x78, 0x3f, 0x1d, 0x0, 0x20, + 0x0, 0x0, 0xc4, 0x0, 0x60, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + + /* U+7BC4 "範" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0x79, 0x0, 0x10, 0x0, + 0x4f, 0x76, 0x6d, 0x3d, 0x86, 0x6d, 0x30, 0xb, + 0x24, 0x80, 0x5, 0x60, 0x87, 0x0, 0x6, 0x30, + 0x49, 0x70, 0x70, 0x0, 0xb7, 0x1, 0x41, 0x1b, + 0x52, 0x70, 0x20, 0x5, 0x30, 0x2, 0x65, 0xc6, + 0x55, 0x1d, 0x66, 0xd3, 0x0, 0xa, 0x6c, 0x66, + 0xc1, 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, + 0xb, 0x0, 0xb0, 0x0, 0xc, 0x6c, 0x66, 0xb0, + 0xb0, 0xb, 0x0, 0x0, 0xc0, 0xa1, 0xb, 0xb, + 0x0, 0xc0, 0x0, 0xb, 0x6c, 0x66, 0x90, 0xb3, + 0x8c, 0x0, 0x4, 0x66, 0xc6, 0x6b, 0x2b, 0x0, + 0x3, 0x0, 0x11, 0xa, 0x10, 0x0, 0xb0, 0x0, + 0x70, 0x0, 0x0, 0xb2, 0x0, 0xc, 0xbb, 0xbe, + 0x40, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7C21 "簡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0xf4, 0x0, 0x10, 0x0, + 0x2e, 0x76, 0x7b, 0x6d, 0x76, 0x6c, 0x60, 0xa, + 0x23, 0xa0, 0x9, 0x4, 0xb2, 0x0, 0x6, 0x20, + 0x8, 0x23, 0x0, 0x5, 0x51, 0x0, 0xc, 0x66, + 0x6c, 0x19, 0x76, 0x67, 0xd0, 0x0, 0xd0, 0x0, + 0xb0, 0x92, 0x0, 0x1b, 0x0, 0xd, 0x66, 0x6c, + 0x9, 0x76, 0x66, 0xb0, 0x0, 0xd6, 0x66, 0xc0, + 0xa7, 0x66, 0x6b, 0x0, 0xd, 0x0, 0x21, 0x2, + 0x5, 0x1, 0xb0, 0x0, 0xd0, 0xd, 0x66, 0x66, + 0xe1, 0x1b, 0x0, 0xd, 0x0, 0xc6, 0x66, 0x6d, + 0x1, 0xb0, 0x0, 0xd0, 0xc, 0x0, 0x1, 0xd0, + 0x1b, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x6a, 0x1, + 0xb0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x26, 0xaa, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + + /* U+7C73 "米" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x0, 0xc, 0x20, 0xa, 0x90, 0x0, + 0x0, 0x5, 0xb0, 0xc, 0x20, 0x2e, 0x20, 0x0, + 0x0, 0x0, 0xe6, 0xc, 0x20, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x74, 0xc, 0x25, 0x50, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6d, 0x7a, 0x66, 0x6f, 0x50, + 0x1, 0x0, 0x0, 0xcf, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbc, 0x38, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x1c, 0x27, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0xc, 0x20, 0xc4, 0x0, 0x0, + 0x0, 0xa, 0x50, 0xc, 0x20, 0x2e, 0x80, 0x0, + 0x0, 0x93, 0x0, 0xc, 0x20, 0x2, 0xee, 0x70, + 0x16, 0x10, 0x0, 0xc, 0x20, 0x0, 0x1a, 0x20, + 0x10, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+7CBE "精" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x1, 0xa, 0x22, 0x10, 0x0, 0xd0, 0x5, 0x10, + 0x7, 0x3a, 0x29, 0x64, 0x76, 0xe6, 0x66, 0x30, + 0x1, 0xda, 0x38, 0x0, 0x0, 0xd0, 0x5, 0x0, + 0x0, 0x4a, 0x51, 0x1, 0x76, 0xe6, 0x65, 0x0, + 0x18, 0x6d, 0x7a, 0x60, 0x0, 0xd0, 0x2, 0x50, + 0x0, 0xf, 0x20, 0x7, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x5f, 0x95, 0x1, 0xa6, 0x66, 0x7b, 0x0, + 0x0, 0xac, 0x2e, 0x21, 0xc0, 0x0, 0x3a, 0x0, + 0x2, 0x8a, 0x23, 0x1, 0xd6, 0x66, 0x7a, 0x0, + 0x8, 0x1a, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x23, 0xa, 0x20, 0x1, 0xd6, 0x66, 0x7a, 0x0, + 0x10, 0xa, 0x20, 0x1, 0xc0, 0x0, 0x3a, 0x0, + 0x0, 0xb, 0x30, 0x1, 0xc0, 0x17, 0x99, 0x0, + 0x0, 0x5, 0x0, 0x1, 0x60, 0x0, 0x92, 0x0, + + /* U+7CD6 "糖" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x1, 0xb3, 0x0, 0x0, + 0x1, 0xc, 0x13, 0x3, 0x0, 0x34, 0x3, 0x60, + 0x8, 0x1c, 0x1d, 0x4e, 0x66, 0xb8, 0x66, 0x50, + 0x5, 0x8c, 0x66, 0xd, 0x0, 0xb1, 0x3, 0x0, + 0x2, 0x4c, 0x60, 0xd, 0x37, 0xd7, 0x6e, 0x0, + 0x6, 0x6d, 0x6b, 0x6d, 0x0, 0xb1, 0xd, 0x40, + 0x1, 0xf, 0x10, 0xc, 0x66, 0xd7, 0x6e, 0x61, + 0x0, 0x4f, 0x81, 0xc, 0x0, 0xb1, 0xd, 0x0, + 0x0, 0x9e, 0x4d, 0x1b, 0x37, 0xd7, 0x6c, 0x0, + 0x1, 0x9c, 0x16, 0x39, 0x10, 0x81, 0x3, 0x0, + 0x7, 0x1c, 0x10, 0x65, 0x87, 0x66, 0x6e, 0x10, + 0x14, 0xc, 0x10, 0xa0, 0x82, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x12, 0x60, 0x82, 0x0, 0xd, 0x0, + 0x0, 0xc, 0x17, 0x0, 0x87, 0x66, 0x6e, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x30, 0x0, 0x2, 0x0, + + /* U+7CFB "系" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x47, 0xcf, 0x30, 0x0, + 0x14, 0x56, 0x7b, 0xa6, 0x42, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xa1, 0x0, 0xb, 0x30, 0x0, 0x0, 0x28, + 0x93, 0x34, 0x5c, 0x71, 0x0, 0x0, 0x3, 0xe9, + 0x64, 0xa9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x92, 0x1, 0x61, 0x0, 0x0, 0x0, 0x6a, 0x40, + 0x0, 0x15, 0xe6, 0x0, 0x0, 0xdf, 0xa8, 0x8e, + 0x54, 0x35, 0xf0, 0x0, 0x2, 0x3, 0x0, 0xe0, + 0x10, 0x4, 0x0, 0x0, 0x2, 0xf5, 0xe, 0x5, + 0x82, 0x0, 0x0, 0x2, 0xc4, 0x0, 0xe0, 0x3, + 0xe9, 0x0, 0x4, 0x91, 0x12, 0x1e, 0x0, 0x2, + 0xf5, 0x5, 0x30, 0x0, 0x4e, 0xc0, 0x0, 0x5, + 0x30, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7D00 "紀" */ + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x4, 0x76, 0x66, 0x6e, 0x20, + 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x91, 0xa, 0x50, 0x0, 0x0, 0xe, 0x0, + 0xa, 0xa7, 0x7b, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x4, 0x41, 0xa1, 0x0, 0x86, 0x66, 0x6e, 0x0, + 0x0, 0xa, 0x15, 0x30, 0xe0, 0x0, 0x8, 0x0, + 0x2, 0xa2, 0x15, 0xe0, 0xe0, 0x0, 0x0, 0x0, + 0xa, 0xe9, 0x62, 0xc1, 0xe0, 0x0, 0x0, 0x0, + 0x2, 0x20, 0x2, 0x10, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0x16, 0x12, 0xa0, 0xe0, 0x0, 0x0, 0x30, + 0x6, 0x24, 0xa0, 0xd4, 0xe0, 0x0, 0x0, 0x60, + 0xc, 0x31, 0xe0, 0x61, 0xd1, 0x0, 0x2, 0xa0, + 0x19, 0x0, 0x20, 0x0, 0x8e, 0xdd, 0xde, 0xc0, + + /* U+7D04 "約" */ + 0x0, 0x0, 0x81, 0x0, 0x4, 0x80, 0x0, 0x0, + 0x0, 0x2c, 0x10, 0x0, 0x99, 0x0, 0x0, 0x0, + 0xa, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, 0x8, + 0x40, 0x87, 0x4, 0xc6, 0x66, 0xb9, 0x8, 0xb7, + 0x6d, 0x10, 0x91, 0x0, 0x8, 0x50, 0x47, 0x2a, + 0x20, 0x44, 0x0, 0x0, 0x94, 0x0, 0x9, 0x34, + 0x41, 0x10, 0x0, 0xa, 0x30, 0x1a, 0x30, 0x1e, + 0x10, 0xb5, 0x0, 0xb3, 0x9, 0xea, 0x85, 0xa4, + 0x2, 0xf4, 0xb, 0x20, 0x12, 0x0, 0x3, 0x0, + 0x7, 0x20, 0xc1, 0x0, 0x33, 0x30, 0xa1, 0x0, + 0x0, 0xd, 0x0, 0x45, 0xd, 0x6, 0xa0, 0x0, + 0x0, 0xe0, 0xc, 0x50, 0xd2, 0x29, 0x0, 0x0, + 0x2c, 0x0, 0xa1, 0x3, 0x0, 0x0, 0x5, 0xcf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x0, + + /* U+7D19 "紙" */ + 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x34, 0x0, + 0x0, 0xb5, 0x0, 0x30, 0x36, 0xbb, 0x70, 0x0, + 0x57, 0x0, 0xa, 0x64, 0xb2, 0x0, 0x0, 0x29, + 0x0, 0xc2, 0xa1, 0xa, 0x20, 0x0, 0x1e, 0x87, + 0xa8, 0xa, 0x10, 0xa2, 0x0, 0x0, 0x73, 0x49, + 0x0, 0xa1, 0x9, 0x20, 0x50, 0x0, 0x39, 0x7, + 0xa, 0x66, 0xb8, 0x68, 0x40, 0x59, 0x1, 0xa6, + 0xa1, 0x6, 0x60, 0x0, 0xe, 0xc9, 0x66, 0xaa, + 0x10, 0x39, 0x0, 0x0, 0x20, 0x0, 0x11, 0xa1, + 0x0, 0xd0, 0x0, 0x3, 0x5, 0xa, 0x2a, 0x10, + 0xb, 0x30, 0x40, 0x90, 0xb2, 0x4a, 0xa1, 0x11, + 0x3c, 0x8, 0x2d, 0x9, 0x50, 0x2b, 0x85, 0x0, + 0x8d, 0x95, 0x70, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7D20 "素" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x3, + 0x66, 0x66, 0x8c, 0x66, 0x68, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x0, 0x10, 0x0, 0x0, 0x28, + 0x66, 0x8c, 0x66, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0x1, 0x60, 0x67, 0x66, 0x6d, + 0xa6, 0x66, 0x66, 0x67, 0x10, 0x0, 0x29, 0x60, + 0x7, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0x97, 0x6c, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x20, 0x69, 0x20, + 0x57, 0x0, 0x0, 0x0, 0x38, 0xc7, 0x56, 0x76, + 0xac, 0x0, 0x0, 0x8, 0xc8, 0x55, 0xa0, 0x0, + 0xa0, 0x0, 0x0, 0x5, 0xd1, 0x3a, 0x17, 0x50, + 0x0, 0x0, 0x5, 0xb2, 0x3, 0xa0, 0x6, 0xe5, + 0x0, 0x17, 0x40, 0x39, 0xe9, 0x0, 0x4, 0xe0, + 0x1, 0x0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x0, + + /* U+7D30 "細" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x8, 0x66, 0x66, 0x6c, 0x30, 0x7, + 0x50, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x3, 0x80, + 0xd, 0x1d, 0x0, 0xd0, 0xd, 0x2, 0xe7, 0x7a, + 0x70, 0xd0, 0xd, 0x0, 0xd0, 0x8, 0x35, 0x80, + 0xd, 0x0, 0xd0, 0xd, 0x0, 0x3, 0x92, 0x40, + 0xd0, 0xd, 0x0, 0xd0, 0x4, 0xa0, 0xc, 0x2d, + 0x66, 0xe6, 0x6e, 0x1, 0xfb, 0x97, 0xa7, 0xd0, + 0xd, 0x0, 0xd0, 0x4, 0x0, 0x2, 0x1d, 0x0, + 0xd0, 0xd, 0x0, 0x20, 0x50, 0xa0, 0xd0, 0xd, + 0x0, 0xd0, 0x9, 0xb, 0x27, 0x9d, 0x0, 0xd0, + 0xd, 0x1, 0xd0, 0x87, 0x15, 0xd6, 0x6c, 0x66, + 0xe0, 0x48, 0x1, 0x0, 0xd, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, + + /* U+7D39 "紹" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x4c, 0x10, 0x56, 0x88, 0x66, 0xc7, 0x0, + 0xb, 0x10, 0x0, 0x9, 0x50, 0xc, 0x20, 0x8, + 0x20, 0x75, 0x0, 0xb2, 0x0, 0xd0, 0x9, 0x95, + 0x5d, 0x20, 0x1d, 0x0, 0xe, 0x0, 0x78, 0x3b, + 0x20, 0x7, 0x60, 0x1, 0xd0, 0x0, 0x9, 0x36, + 0x1, 0x90, 0x17, 0xaa, 0x0, 0xa, 0x30, 0x59, + 0x60, 0x0, 0x9, 0x30, 0xb, 0xd9, 0x86, 0xd0, + 0xc6, 0x66, 0x6d, 0x40, 0x22, 0x0, 0x32, 0xd, + 0x0, 0x0, 0xc1, 0x0, 0x34, 0x22, 0xb0, 0xd0, + 0x0, 0xc, 0x10, 0x26, 0x1d, 0xb, 0x5d, 0x0, + 0x0, 0xc1, 0xa, 0x60, 0xd0, 0x21, 0xe6, 0x66, + 0x6d, 0x10, 0x91, 0x0, 0x0, 0xc, 0x0, 0x0, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7D42 "終" */ + 0x0, 0x0, 0x80, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x3d, 0x0, 0x2, 0x0, + 0x0, 0x1b, 0x0, 0x0, 0xa7, 0x66, 0x8e, 0x10, + 0x0, 0x91, 0xa, 0x43, 0x95, 0x0, 0xa5, 0x0, + 0xa, 0xa7, 0x7b, 0x16, 0x8, 0x3, 0xb0, 0x0, + 0x5, 0x52, 0xa0, 0x0, 0x2, 0xac, 0x10, 0x0, + 0x0, 0xa, 0x16, 0x10, 0x0, 0xda, 0x0, 0x0, + 0x1, 0xa2, 0x4, 0xb0, 0xa, 0x48, 0xc3, 0x0, + 0xa, 0xd9, 0x74, 0xb3, 0x72, 0x40, 0x6f, 0xb2, + 0x2, 0x10, 0x3, 0x32, 0x0, 0x6d, 0x11, 0x10, + 0x2, 0x16, 0x6, 0x60, 0x0, 0x9, 0x20, 0x0, + 0x6, 0x25, 0x80, 0xf0, 0x28, 0x61, 0x0, 0x0, + 0xd, 0x23, 0xb0, 0x30, 0x0, 0x5e, 0x80, 0x0, + 0x1a, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + + /* U+7D44 "組" */ + 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x7, 0x90, 0x0, 0xd6, 0x66, 0x7e, 0x10, + 0x0, 0x1b, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x0, 0xa1, 0x9, 0x40, 0xe0, 0x0, 0x1c, 0x0, + 0xb, 0x97, 0x7c, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x6, 0x52, 0xb0, 0x0, 0xe6, 0x66, 0x6c, 0x0, + 0x0, 0x1a, 0x16, 0x20, 0xe0, 0x0, 0x1c, 0x0, + 0x2, 0xb1, 0x3, 0xd0, 0xe0, 0x0, 0x1c, 0x0, + 0xc, 0xd9, 0x74, 0xd1, 0xe0, 0x0, 0x1c, 0x0, + 0x2, 0x10, 0x3, 0x20, 0xe6, 0x66, 0x6c, 0x0, + 0x1, 0x25, 0x15, 0x80, 0xe0, 0x0, 0x1c, 0x0, + 0x4, 0x43, 0xa0, 0xe0, 0xe0, 0x0, 0x1c, 0x0, + 0xb, 0x41, 0xd0, 0x20, 0xe0, 0x0, 0x1c, 0x10, + 0xa, 0x0, 0x1, 0x66, 0xe6, 0x66, 0x6e, 0xe3, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7D4C "経" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x9, 0x60, 0x17, 0xa6, 0x66, 0x8f, 0x20, + 0x0, 0x2a, 0x0, 0x0, 0x62, 0x0, 0xb6, 0x0, + 0x0, 0x90, 0xa, 0x10, 0xa, 0x6, 0xa0, 0x0, + 0xa, 0x85, 0x79, 0x0, 0x5, 0xbb, 0x0, 0x0, + 0x7, 0x75, 0xb0, 0x0, 0x6, 0xdb, 0x10, 0x0, + 0x0, 0xa, 0x15, 0x0, 0x87, 0x5, 0xeb, 0x71, + 0x0, 0xa2, 0x7, 0x66, 0x10, 0xb4, 0x7, 0x30, + 0xb, 0xb9, 0x78, 0xa0, 0x0, 0xb2, 0x1, 0x0, + 0x4, 0x40, 0x1, 0x34, 0x76, 0xd7, 0x6b, 0x20, + 0x1, 0x15, 0x8, 0x30, 0x0, 0xb2, 0x0, 0x0, + 0x7, 0x25, 0x72, 0xd0, 0x0, 0xb2, 0x0, 0x0, + 0x1e, 0x13, 0xb0, 0x80, 0x0, 0xb2, 0x2, 0x70, + 0x18, 0x0, 0x10, 0x57, 0x66, 0x66, 0x66, 0x50, + + /* U+7D50 "結" */ + 0x0, 0x1, 0x70, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x2a, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0xa0, 0xa, 0x35, 0x66, 0xc7, 0x67, 0xc1, + 0xc, 0x86, 0x7b, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x7, 0x43, 0xa0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x2a, 0x6, 0x11, 0x66, 0xc7, 0x6c, 0x20, + 0x4, 0xa0, 0x16, 0xc0, 0x10, 0x0, 0x0, 0x0, + 0xd, 0xc9, 0x63, 0xd0, 0x96, 0x66, 0x6b, 0x10, + 0x1, 0x0, 0x4, 0x10, 0xd0, 0x0, 0xd, 0x0, + 0x2, 0x16, 0x23, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x6, 0x33, 0xb0, 0xd2, 0xd0, 0x0, 0xd, 0x0, + 0xd, 0x21, 0xc0, 0x20, 0xe6, 0x66, 0x6d, 0x0, + 0x18, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+7D61 "絡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x30, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x4c, 0x0, 0x0, 0x0, + 0x0, 0x29, 0x0, 0x0, 0xa8, 0x66, 0x6e, 0x20, + 0x0, 0x90, 0x9, 0x2, 0xc0, 0x0, 0x7a, 0x0, + 0xa, 0x63, 0x7a, 0x8, 0x18, 0x3, 0xc0, 0x0, + 0xa, 0x86, 0xb0, 0x31, 0x3, 0x9c, 0x10, 0x0, + 0x0, 0xa, 0x14, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x0, 0xa2, 0xa, 0x20, 0x59, 0x13, 0xd8, 0x30, + 0xc, 0xa8, 0x79, 0xa6, 0x40, 0x0, 0x19, 0xa2, + 0x7, 0x50, 0x2, 0x40, 0xe6, 0x66, 0x8c, 0x0, + 0x0, 0x12, 0x5, 0x0, 0xd0, 0x0, 0x2a, 0x0, + 0x2, 0x57, 0x27, 0x70, 0xd0, 0x0, 0x2a, 0x0, + 0x9, 0x45, 0x92, 0xa0, 0xd0, 0x0, 0x2a, 0x0, + 0x1e, 0x13, 0x50, 0x0, 0xe6, 0x66, 0x7b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x12, 0x0, + + /* U+7D66 "給" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x84, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0xf8, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x7, 0x86, 0x10, 0x0, + 0x0, 0x73, 0x9, 0x30, 0xc, 0x10, 0xa0, 0x0, + 0x5, 0xb6, 0x6b, 0x0, 0x93, 0x0, 0x5a, 0x0, + 0x3, 0x83, 0xb1, 0x6, 0x40, 0x0, 0x29, 0xd5, + 0x0, 0x8, 0x26, 0x43, 0x76, 0x66, 0xa4, 0x70, + 0x0, 0x94, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xea, 0x85, 0xd2, 0x96, 0x66, 0x6c, 0x10, + 0x0, 0x30, 0x2, 0x21, 0xb0, 0x0, 0xd, 0x0, + 0x0, 0x42, 0x56, 0x61, 0xb0, 0x0, 0xd, 0x0, + 0x4, 0x60, 0xd1, 0xf2, 0xb0, 0x0, 0xd, 0x0, + 0xd, 0x40, 0xd0, 0x42, 0xd6, 0x66, 0x6d, 0x0, + 0x5, 0x0, 0x0, 0x2, 0xb0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+7D71 "統" */ + 0x0, 0x5, 0x50, 0x0, 0x8, 0x40, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x36, 0x66, 0x96, 0x6c, 0x70, + 0x2, 0x80, 0x1c, 0x11, 0xb, 0x40, 0x0, 0x0, + 0x2e, 0x76, 0xb6, 0x0, 0x78, 0x2, 0x40, 0x0, + 0x8, 0x36, 0x70, 0x6, 0x60, 0x0, 0x96, 0x0, + 0x0, 0x38, 0x7, 0x2e, 0x97, 0x54, 0x4f, 0x0, + 0x5, 0x90, 0xa, 0x61, 0x62, 0x6, 0x14, 0x0, + 0x1f, 0xb9, 0x77, 0xa0, 0xb3, 0xd, 0x0, 0x0, + 0x3, 0x0, 0x5, 0x10, 0xc1, 0xd, 0x0, 0x0, + 0x4, 0x8, 0x8, 0x60, 0xd0, 0xd, 0x0, 0x10, + 0xa, 0xb, 0x22, 0xb3, 0xa0, 0xd, 0x0, 0x50, + 0x4c, 0x7, 0x10, 0x1b, 0x20, 0xd, 0x0, 0x80, + 0x11, 0x0, 0x3, 0x82, 0x0, 0x9, 0xdd, 0xc0, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D75 "絵" */ + 0x0, 0x4, 0x30, 0x0, 0x1, 0x90, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x7, 0xe1, 0x0, 0x0, + 0x0, 0x58, 0x0, 0x0, 0xd, 0x28, 0x0, 0x0, + 0x1, 0x90, 0xa, 0x0, 0x86, 0x5, 0x80, 0x0, + 0x1c, 0x55, 0x98, 0x4, 0x80, 0x0, 0x99, 0x0, + 0xa, 0x56, 0x90, 0x46, 0x0, 0x2, 0x6a, 0xd2, + 0x0, 0x39, 0x6, 0x20, 0x76, 0x66, 0x50, 0x10, + 0x4, 0x90, 0x9, 0x50, 0x0, 0x0, 0x2, 0x0, + 0x1f, 0xb9, 0x77, 0xa7, 0x67, 0x66, 0x6a, 0x40, + 0x4, 0x0, 0x2, 0x10, 0x9, 0x90, 0x0, 0x0, + 0x2, 0x7, 0xa, 0x30, 0x3c, 0x0, 0x10, 0x0, + 0x8, 0x8, 0x64, 0xc0, 0xb1, 0x0, 0x82, 0x0, + 0xd, 0x5, 0x70, 0x5a, 0x53, 0x45, 0x7e, 0x10, + 0x16, 0x0, 0x0, 0xc, 0x95, 0x31, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D93 "經" */ + 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xc, 0x10, 0x47, 0x66, 0x66, 0x6a, 0x60, + 0x0, 0x74, 0x0, 0x3, 0x50, 0x92, 0x28, 0x0, + 0x1, 0x80, 0x46, 0x9, 0x62, 0xc0, 0x96, 0x0, + 0x1b, 0x44, 0xb3, 0x29, 0x9, 0x13, 0x70, 0x0, + 0xa, 0x58, 0x60, 0x53, 0x8, 0x5, 0x60, 0x0, + 0x0, 0x29, 0x21, 0xc, 0x33, 0xc0, 0xa7, 0x0, + 0x1, 0xa0, 0xb, 0x6, 0x90, 0xc1, 0x19, 0x0, + 0xe, 0x99, 0x8d, 0x30, 0x10, 0x0, 0x3, 0x0, + 0x8, 0x40, 0x4, 0x17, 0x66, 0xb6, 0x68, 0x30, + 0x1, 0x4, 0x9, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x28, 0x36, 0x90, 0x0, 0xd0, 0x0, 0x0, + 0xc, 0x26, 0x81, 0x50, 0x0, 0xd0, 0x0, 0x10, + 0x1b, 0x1, 0x10, 0x46, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + + /* U+7D9A "続" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x30, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0xd0, 0x1, 0x10, + 0x0, 0x38, 0x0, 0x18, 0x66, 0xe6, 0x69, 0x80, + 0x0, 0x90, 0x18, 0x0, 0x0, 0xd0, 0x1, 0x0, + 0x9, 0x74, 0x95, 0x0, 0x76, 0xb6, 0x7a, 0x0, + 0x8, 0x66, 0x80, 0x2, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x9, 0x13, 0xa, 0x66, 0x66, 0x67, 0xe1, + 0x0, 0x91, 0xb, 0x4a, 0x23, 0x2, 0x7, 0x40, + 0xa, 0xb9, 0x7b, 0x51, 0x4c, 0xd, 0x22, 0x0, + 0x5, 0x50, 0x3, 0x10, 0x58, 0xd, 0x10, 0x0, + 0x1, 0x4, 0x8, 0x20, 0x75, 0xc, 0x10, 0x20, + 0x5, 0x26, 0x44, 0xb0, 0xb1, 0xc, 0x10, 0x50, + 0xa, 0x33, 0xa0, 0x66, 0x60, 0xc, 0x10, 0xa0, + 0x9, 0x0, 0x21, 0x75, 0x0, 0xa, 0xdc, 0xe1, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7DAD "維" */ + 0x0, 0x8, 0x10, 0x0, 0x67, 0x43, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0xa5, 0xe, 0x30, 0x0, + 0x0, 0x92, 0x0, 0x0, 0xe0, 0x6, 0x31, 0x20, + 0x4, 0x50, 0x76, 0x5, 0xd6, 0x6a, 0x68, 0x80, + 0x2c, 0x66, 0xd2, 0xb, 0xb0, 0x1c, 0x0, 0x0, + 0x8, 0x2a, 0x30, 0x46, 0xb0, 0x1c, 0x1, 0x0, + 0x0, 0x56, 0x42, 0x52, 0xc6, 0x6d, 0x6b, 0x50, + 0x5, 0x80, 0x1d, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0x2f, 0xa8, 0x6c, 0x32, 0xb0, 0x1c, 0x0, 0x0, + 0x5, 0x0, 0x12, 0x2, 0xc6, 0x6d, 0x6b, 0x50, + 0x3, 0x14, 0x1a, 0x12, 0xb0, 0x1c, 0x0, 0x0, + 0x8, 0xc, 0x18, 0x92, 0xb0, 0x1c, 0x0, 0x0, + 0x4b, 0xb, 0x31, 0x32, 0xb0, 0x1c, 0x3, 0x70, + 0x64, 0x1, 0x0, 0x2, 0xc6, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+7DB2 "網" */ + 0x0, 0x5, 0x10, 0x1, 0x0, 0x0, 0x0, 0x30, + 0x0, 0xc, 0x20, 0x1d, 0x66, 0x66, 0x76, 0xf2, + 0x0, 0x65, 0x0, 0x1b, 0x17, 0x1, 0xe1, 0xd0, + 0x1, 0x80, 0x48, 0x1b, 0x7, 0x77, 0x30, 0xd0, + 0xd, 0x76, 0xc2, 0x1b, 0x56, 0x8a, 0xa6, 0xd0, + 0x6, 0x27, 0x50, 0x1b, 0x13, 0x30, 0x0, 0xd0, + 0x0, 0x47, 0x24, 0x1b, 0x0, 0xc5, 0x0, 0xd0, + 0x4, 0x90, 0x1d, 0x3c, 0x56, 0x98, 0xb7, 0xd0, + 0xe, 0xc9, 0x6a, 0x5b, 0x1d, 0x0, 0x0, 0xd0, + 0x3, 0x0, 0x11, 0x1b, 0xd, 0x0, 0x0, 0xd0, + 0x4, 0x7, 0x29, 0x1b, 0x2e, 0x66, 0xc2, 0xd0, + 0x9, 0xc, 0xc, 0x5b, 0x3, 0x0, 0x0, 0xd0, + 0x3d, 0xb, 0x23, 0x2b, 0x0, 0x1, 0x11, 0xd0, + 0x34, 0x0, 0x0, 0x1b, 0x0, 0x1, 0x6f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+7DD1 "緑" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xc, 0x20, 0x7, 0x66, 0x66, 0xe2, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x2, 0x80, 0x48, 0x3, 0x76, 0x66, 0xe0, 0x0, + 0xd, 0x76, 0xb2, 0x0, 0x0, 0x0, 0xe1, 0x20, + 0x7, 0x27, 0x40, 0x37, 0x66, 0xa6, 0xa8, 0x90, + 0x0, 0x47, 0x24, 0x0, 0x0, 0xe2, 0x5, 0x0, + 0x4, 0x80, 0x1d, 0x2a, 0x30, 0xe4, 0x5b, 0x20, + 0xe, 0xb8, 0x5a, 0x43, 0xd0, 0xe7, 0x40, 0x0, + 0x2, 0x1, 0x33, 0x0, 0x35, 0xe4, 0x30, 0x0, + 0x4, 0x19, 0xd, 0x10, 0x83, 0xe0, 0xa0, 0x0, + 0xa, 0xb, 0x37, 0x7b, 0x20, 0xe0, 0x4c, 0x10, + 0x4d, 0x6, 0x20, 0x81, 0x0, 0xe0, 0x8, 0xb1, + 0x12, 0x0, 0x0, 0x0, 0x6d, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+7DD2 "緒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x20, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x6, 0x60, 0x9, 0x20, + 0x0, 0x73, 0x0, 0x5, 0x69, 0x9b, 0x7b, 0x0, + 0x2, 0x70, 0x58, 0x2, 0x5, 0x60, 0xc2, 0x0, + 0x1d, 0x66, 0xc2, 0x0, 0x5, 0x66, 0x80, 0x10, + 0x9, 0x48, 0x50, 0x76, 0x68, 0xae, 0x67, 0xc1, + 0x0, 0x37, 0x23, 0x0, 0x2, 0xb1, 0x0, 0x0, + 0x3, 0x90, 0xc, 0x10, 0x3b, 0x10, 0x4, 0x0, + 0xe, 0xb8, 0x7b, 0x55, 0xc6, 0x66, 0x6d, 0x0, + 0x4, 0x10, 0x2, 0x67, 0xa0, 0x0, 0xb, 0x0, + 0x3, 0x5, 0x38, 0x1, 0xc6, 0x66, 0x6b, 0x0, + 0x9, 0xc, 0xd, 0x21, 0xa0, 0x0, 0xb, 0x0, + 0x1d, 0xb, 0x36, 0x22, 0xa0, 0x0, 0xb, 0x0, + 0x35, 0x2, 0x0, 0x2, 0xc6, 0x66, 0x6b, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x2, 0x0, + + /* U+7DDA "線" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x4, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x2, 0x9, 0x10, 0x4, 0x0, + 0x0, 0x74, 0x0, 0xd, 0x66, 0x66, 0x6e, 0x0, + 0x2, 0x80, 0x44, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x1c, 0x44, 0xc3, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0xa, 0x59, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x38, 0x40, 0xd, 0x66, 0xa6, 0x6c, 0x0, + 0x2, 0x90, 0x48, 0x2, 0x0, 0xf0, 0x1, 0x10, + 0x1e, 0xa8, 0x7e, 0x57, 0x95, 0xd5, 0xb, 0x70, + 0x6, 0x20, 0x23, 0x0, 0xc5, 0xd8, 0x82, 0x0, + 0x4, 0x25, 0x49, 0x3, 0x90, 0xd4, 0x70, 0x0, + 0xa, 0xd, 0xd, 0xa, 0x10, 0xd0, 0xb4, 0x0, + 0x79, 0xb, 0x1, 0x82, 0x0, 0xd0, 0x1e, 0x90, + 0x31, 0x0, 0x15, 0x11, 0x7c, 0xc0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, + + /* U+7DE0 "締" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x10, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xc2, 0x5, 0x10, + 0x0, 0x65, 0x0, 0x57, 0x66, 0x66, 0x77, 0x50, + 0x1, 0x80, 0x46, 0x0, 0xa3, 0x3, 0xd0, 0x0, + 0xb, 0x44, 0xb4, 0x0, 0x49, 0x8, 0x20, 0x0, + 0xa, 0x58, 0x60, 0x76, 0x66, 0x68, 0x66, 0xe2, + 0x0, 0x28, 0x23, 0xe0, 0x0, 0xb0, 0x4, 0x30, + 0x2, 0xa0, 0xb, 0x20, 0x0, 0xc0, 0x1, 0x0, + 0xe, 0xa8, 0x7c, 0x2a, 0x66, 0xd6, 0x6d, 0x10, + 0x6, 0x30, 0x13, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x2, 0x22, 0x38, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x8, 0xc, 0xc, 0x3c, 0x0, 0xc2, 0x3b, 0x0, + 0x2c, 0xc, 0x23, 0x9, 0x0, 0xc1, 0xa6, 0x0, + 0x45, 0x1, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+7DE9 "緩" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x14, 0x8b, 0x10, + 0x0, 0xd, 0x40, 0x25, 0x68, 0x75, 0x63, 0x10, + 0x0, 0x58, 0x0, 0x6, 0x5, 0x60, 0x98, 0x0, + 0x1, 0x90, 0x47, 0x6, 0x70, 0xa0, 0xa0, 0x0, + 0xb, 0x55, 0xc4, 0x27, 0x76, 0x67, 0x7c, 0x30, + 0x7, 0x48, 0x60, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x38, 0x24, 0x56, 0x6d, 0x66, 0x67, 0xc1, + 0x3, 0x80, 0x1d, 0x31, 0x68, 0x0, 0x0, 0x0, + 0xe, 0xc9, 0x5a, 0x40, 0xa8, 0x66, 0x78, 0x0, + 0x2, 0x0, 0x11, 0x1, 0xc8, 0x0, 0xc5, 0x0, + 0x5, 0x8, 0x2a, 0x8, 0x42, 0x88, 0x80, 0x0, + 0xb, 0xb, 0x3c, 0x58, 0x0, 0xac, 0x0, 0x0, + 0x5b, 0x6, 0x24, 0x70, 0x7, 0x9a, 0xa1, 0x0, + 0x0, 0x0, 0x3, 0x2, 0x84, 0x0, 0x7f, 0xb2, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x20, + + /* U+7DF4 "練" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x40, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x0, 0xc0, 0x0, 0x20, + 0x0, 0x55, 0x0, 0x57, 0x66, 0xd6, 0x67, 0x80, + 0x1, 0x80, 0x39, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0xc, 0x76, 0xb3, 0xb, 0x66, 0xd6, 0x6d, 0x20, + 0x7, 0x36, 0x60, 0xc, 0x50, 0xc1, 0x9c, 0x0, + 0x0, 0x28, 0x14, 0xc, 0x49, 0xc6, 0x4c, 0x0, + 0x1, 0xa0, 0xb, 0x1c, 0x4, 0xc4, 0xc, 0x0, + 0xd, 0xb9, 0x7b, 0x5c, 0x6c, 0xe9, 0x6b, 0x0, + 0x4, 0x20, 0x3, 0x1, 0x2c, 0xc7, 0x0, 0x0, + 0x2, 0x5, 0xb, 0x10, 0xa3, 0xc2, 0x70, 0x0, + 0x7, 0x18, 0x47, 0x75, 0x60, 0xc0, 0x96, 0x0, + 0xd, 0x6, 0x81, 0x56, 0x0, 0xc0, 0xc, 0xb2, + 0x19, 0x0, 0x2, 0x40, 0x0, 0xd0, 0x1, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + + /* U+7E3D "總" */ + 0x0, 0x5, 0x30, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0x30, 0x64, 0x0, 0x40, 0x0, + 0x65, 0x0, 0xc, 0x56, 0xa5, 0x5e, 0x20, 0x18, + 0x3, 0x90, 0xc0, 0x9b, 0x68, 0xd0, 0xd, 0x87, + 0xc2, 0xc, 0x36, 0x6, 0x8d, 0x0, 0x62, 0x65, + 0x0, 0xc3, 0x39, 0xc0, 0xd0, 0x0, 0x29, 0x14, + 0xc, 0x2, 0xac, 0x6d, 0x0, 0x1a, 0x0, 0xb1, + 0xc3, 0x50, 0x5, 0xd0, 0xd, 0xa8, 0x7b, 0x5b, + 0x78, 0x77, 0x7b, 0x0, 0x42, 0x1, 0x21, 0x7, + 0x1b, 0x10, 0x20, 0x2, 0x22, 0x93, 0x41, 0xc0, + 0x69, 0x9, 0x60, 0x70, 0xc3, 0x9b, 0xc, 0x0, + 0x24, 0x1e, 0xd, 0xb, 0x5, 0xc0, 0xc0, 0x0, + 0x62, 0x14, 0x80, 0x0, 0x0, 0xd, 0xcc, 0xce, + 0x60, + + /* U+7E3E "績" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x40, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x36, 0x66, 0xe6, 0x6d, 0x50, + 0x0, 0x46, 0x0, 0x11, 0x0, 0xd0, 0x12, 0x0, + 0x0, 0x90, 0x28, 0x5, 0x76, 0xe6, 0x78, 0x0, + 0xa, 0x75, 0xa4, 0x22, 0x22, 0xd2, 0x25, 0x90, + 0x7, 0x56, 0x70, 0x56, 0x44, 0x44, 0x46, 0x41, + 0x0, 0x19, 0x13, 0xe, 0x66, 0x66, 0x6e, 0x30, + 0x1, 0xa1, 0xb, 0x1d, 0x66, 0x66, 0x6e, 0x0, + 0xb, 0xc9, 0x8b, 0x5d, 0x0, 0x0, 0xd, 0x0, + 0x4, 0x30, 0x2, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x1, 0x15, 0xa, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x6, 0x2a, 0x38, 0x66, 0x22, 0x2, 0x6, 0x0, + 0xd, 0x17, 0x61, 0x11, 0xd7, 0x2, 0xa7, 0x0, + 0x6, 0x0, 0x0, 0x2a, 0x30, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x40, + + /* U+7E54 "織" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x0, 0x6, 0x50, 0x9, 0x10, 0x0, + 0x0, 0x49, 0x0, 0x0, 0xa3, 0x2b, 0x20, 0x0, + 0x0, 0x90, 0x1, 0x96, 0x68, 0x4b, 0xb, 0x0, + 0x5, 0x30, 0x90, 0x73, 0xc, 0x2b, 0x8, 0x20, + 0x3b, 0x57, 0x90, 0x39, 0x26, 0xb, 0x0, 0x0, + 0x18, 0x3b, 0x4, 0x66, 0x96, 0x6c, 0x68, 0xb0, + 0x0, 0x82, 0x51, 0x30, 0x2, 0xa, 0x3, 0x0, + 0x6, 0x50, 0x85, 0xc6, 0x6d, 0x1a, 0xe, 0x10, + 0x3e, 0xa7, 0x79, 0xc0, 0xc, 0x9, 0x78, 0x0, + 0x5, 0x0, 0x11, 0xc6, 0x6c, 0x7, 0xe1, 0x0, + 0x2, 0x31, 0xa3, 0xc0, 0xc, 0x6, 0xb0, 0x20, + 0x9, 0x39, 0x59, 0xc0, 0xc, 0xb, 0xd0, 0x60, + 0x5b, 0xd, 0x1, 0xc6, 0x6b, 0x72, 0x6a, 0x90, + 0x43, 0x0, 0x0, 0x40, 0x6, 0x20, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+7E70 "繰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x20, 0x2, 0x96, 0x66, 0x90, 0x0, + 0x0, 0x2b, 0x0, 0x2, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0x91, 0x0, 0x2, 0xc0, 0x0, 0xa0, 0x0, + 0x4, 0x50, 0x74, 0x2, 0xa6, 0x66, 0x70, 0x0, + 0x1e, 0x86, 0xc0, 0x66, 0x69, 0x8, 0x69, 0x20, + 0x5, 0xa, 0x20, 0x92, 0xc, 0xc, 0xb, 0x10, + 0x0, 0x65, 0x43, 0x97, 0x6c, 0xd, 0x6c, 0x10, + 0x5, 0x80, 0x2d, 0x71, 0x5, 0x28, 0x5, 0x0, + 0xf, 0xb9, 0x6c, 0x10, 0x0, 0xd0, 0x7, 0x30, + 0x4, 0x0, 0x11, 0x47, 0x6c, 0xe7, 0x66, 0x60, + 0x2, 0x32, 0x47, 0x0, 0x59, 0xb8, 0x0, 0x0, + 0x9, 0xd, 0xd, 0x3, 0x90, 0xb3, 0xb1, 0x0, + 0x59, 0xc, 0x12, 0x57, 0x0, 0xc0, 0x7e, 0x71, + 0x42, 0x0, 0x5, 0x20, 0x0, 0xc0, 0x7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+7E7C "繼" */ + 0x0, 0x7, 0x0, 0x50, 0x20, 0x0, 0x10, 0x0, + 0x0, 0x2c, 0x0, 0xc1, 0xb2, 0x0, 0xb1, 0x0, + 0x0, 0x92, 0x0, 0xc6, 0x36, 0x87, 0x29, 0x40, + 0x4, 0x50, 0x83, 0xc9, 0x8a, 0xa, 0x88, 0x0, + 0x1d, 0x76, 0xb0, 0xc1, 0x84, 0x11, 0x83, 0x10, + 0x7, 0x19, 0x10, 0xca, 0x86, 0x9c, 0x74, 0xa0, + 0x0, 0x74, 0x51, 0xc1, 0x0, 0x12, 0x5, 0x30, + 0x6, 0x60, 0x4b, 0xc6, 0x76, 0x66, 0x88, 0x40, + 0x1f, 0xb8, 0x4c, 0xc0, 0xa3, 0x0, 0xa2, 0x0, + 0x3, 0x0, 0x0, 0xc5, 0x45, 0x76, 0x37, 0x50, + 0x3, 0x31, 0x81, 0xc7, 0x7a, 0xa, 0x98, 0x0, + 0x9, 0x29, 0x4a, 0xc0, 0x83, 0x3, 0x72, 0x60, + 0x4b, 0xd, 0x5, 0xc9, 0x86, 0x8c, 0x75, 0x90, + 0x42, 0x0, 0x0, 0xe6, 0x66, 0x86, 0x6b, 0xb0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+7E8C "續" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0xc1, 0x1, 0x0, + 0x0, 0x9, 0x70, 0x47, 0x66, 0xd6, 0x69, 0x80, + 0x0, 0x1a, 0x0, 0x3, 0x44, 0xd4, 0x59, 0x0, + 0x0, 0x91, 0x6, 0x4, 0x32, 0x22, 0x25, 0x0, + 0x7, 0x62, 0x79, 0xd, 0x6c, 0x6c, 0x6c, 0x40, + 0xa, 0x87, 0xb0, 0xc, 0xb, 0xb, 0xa, 0x10, + 0x0, 0xa, 0x13, 0xc, 0x68, 0x68, 0x6a, 0x10, + 0x0, 0x93, 0xa, 0x16, 0x76, 0x66, 0x6a, 0x0, + 0xa, 0xa8, 0x8b, 0x77, 0x60, 0x0, 0x1a, 0x0, + 0x5, 0x61, 0x2, 0x27, 0x96, 0x66, 0x7a, 0x0, + 0x1, 0x12, 0x24, 0x7, 0x95, 0x55, 0x6a, 0x0, + 0x7, 0xb, 0xc, 0x27, 0x96, 0x66, 0x7a, 0x0, + 0xd, 0xa, 0x46, 0x33, 0x8b, 0x2, 0x86, 0x0, + 0x29, 0x2, 0x0, 0x39, 0x60, 0x0, 0x9, 0xc0, + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x50, + + /* U+7EDF "统" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0xc, 0x40, 0x1, 0x0, 0xb, + 0x10, 0x17, 0x66, 0x96, 0x6a, 0xb0, 0x6, 0x50, + 0x5a, 0x0, 0x6a, 0x0, 0x0, 0x4, 0xa3, 0x4d, + 0x30, 0x19, 0x2, 0x0, 0x0, 0x59, 0x4a, 0x40, + 0x8, 0x0, 0xb, 0x70, 0x0, 0x7, 0x60, 0xb, + 0x98, 0x8b, 0x6d, 0x70, 0x6, 0x70, 0x1, 0x75, + 0xf0, 0xd0, 0x24, 0x4, 0xfb, 0x86, 0x20, 0x1d, + 0xd, 0x0, 0x0, 0x6, 0x0, 0x0, 0x2, 0xb0, + 0xd0, 0x0, 0x0, 0x0, 0x3, 0x50, 0x58, 0xd, + 0x0, 0x0, 0x49, 0xb8, 0x30, 0xb, 0x30, 0xd0, + 0x6, 0x4, 0x70, 0x0, 0x7, 0x90, 0xc, 0x0, + 0x90, 0x0, 0x0, 0x18, 0x50, 0x0, 0x8d, 0xcd, + 0x20, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F3A "缺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x60, 0x0, 0xd0, 0x3, 0x0, + 0x0, 0xa6, 0xc6, 0x74, 0x77, 0xe6, 0x6d, 0x0, + 0x2, 0x50, 0xc0, 0x0, 0x0, 0xd0, 0x1b, 0x0, + 0x3, 0x0, 0xc0, 0x2, 0x0, 0xc0, 0x1b, 0x0, + 0x7, 0x66, 0xd6, 0x8b, 0x10, 0xc0, 0x1b, 0x0, + 0x0, 0x10, 0xc0, 0x14, 0x76, 0xd6, 0x6b, 0xa6, + 0x0, 0xd0, 0xc0, 0xa3, 0x4, 0x86, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0xb1, 0x9, 0x46, 0x10, 0x0, + 0x0, 0xc0, 0xc0, 0xb1, 0xc, 0x1, 0x90, 0x0, + 0x1, 0xd8, 0xb6, 0xc1, 0x84, 0x0, 0xa4, 0x0, + 0x0, 0xa2, 0x0, 0x36, 0x70, 0x0, 0x2e, 0x50, + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x5, 0xd4, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F6E "置" */ + 0x0, 0x28, 0x77, 0x77, 0x77, 0x77, 0x98, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, + 0x0, 0x2b, 0x0, 0xe0, 0xc, 0x10, 0x78, 0x0, + 0x0, 0x3d, 0x77, 0x99, 0x79, 0x77, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x54, 0x0, + 0x0, 0x78, 0x77, 0x7d, 0x77, 0x77, 0x76, 0x0, + 0x0, 0x0, 0xa7, 0x7d, 0x77, 0x7d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x77, 0x77, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x10, + 0x6, 0x77, 0xf7, 0x77, 0x77, 0x7e, 0x7b, 0xd1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F8E "美" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x50, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0xb, 0x10, 0x10, 0x0, 0x27, + 0x66, 0xa7, 0x68, 0x76, 0x6e, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x3, 0x66, + 0x66, 0xe6, 0x66, 0xb8, 0x0, 0x0, 0x2, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xb1, 0x18, 0x66, 0x66, 0x6b, + 0x66, 0x66, 0x66, 0x30, 0x0, 0x0, 0x0, 0xf2, + 0x0, 0x4, 0x0, 0x4, 0x76, 0x66, 0x8c, 0x86, + 0x66, 0x94, 0x0, 0x0, 0x0, 0xb, 0x47, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0xa, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xb1, 0x0, 0x1b, 0x93, + 0x0, 0x0, 0x48, 0x60, 0x0, 0x0, 0x7, 0xef, + 0x71, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+7FA9 "義" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x90, 0x7, 0x30, 0x73, 0x0, + 0x0, 0x66, 0x66, 0x6b, 0x76, 0x66, 0x76, 0x0, + 0x0, 0x5, 0x66, 0x6c, 0x76, 0x69, 0xb0, 0x0, + 0x0, 0x1, 0x0, 0xa, 0x20, 0x0, 0x5, 0x0, + 0x3, 0x76, 0x66, 0x69, 0x66, 0x66, 0x7b, 0x30, + 0x0, 0x0, 0x0, 0x48, 0x1b, 0x27, 0x20, 0x0, + 0x0, 0x45, 0x7d, 0x86, 0x1e, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0xc, 0x0, 0xc, 0x10, 0x27, 0x40, + 0x8, 0x66, 0x6d, 0x66, 0x6b, 0x96, 0x76, 0x50, + 0x0, 0x0, 0xc, 0x4, 0x6, 0x70, 0xa9, 0x0, + 0x3, 0x57, 0xae, 0x61, 0x2, 0xc6, 0xc1, 0x0, + 0x4, 0xa4, 0xc, 0x0, 0x0, 0xdb, 0x0, 0x50, + 0x0, 0x3, 0x2c, 0x0, 0x4a, 0x7c, 0x51, 0x80, + 0x0, 0x2, 0xbb, 0x26, 0x30, 0x1, 0x8d, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7FD2 "習" */ + 0x26, 0x66, 0x6b, 0x14, 0x66, 0x69, 0x70, 0x40, + 0x0, 0xe0, 0x32, 0x0, 0x86, 0x3, 0xd3, 0xd, + 0x1, 0xc7, 0x8, 0x60, 0x5, 0x40, 0xd0, 0x1, + 0x60, 0x86, 0x0, 0x16, 0x5d, 0x0, 0x27, 0x8a, + 0x64, 0xa8, 0x0, 0xe0, 0x8d, 0x40, 0x85, 0x44, + 0x0, 0x2, 0xc4, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x46, 0x0, 0x0, 0x30, 0x0, 0xc6, 0x66, 0x66, + 0x66, 0x8d, 0x0, 0xc, 0x10, 0x0, 0x0, 0x3, + 0xb0, 0x0, 0xc6, 0x66, 0x66, 0x66, 0x7b, 0x0, + 0xc, 0x10, 0x0, 0x0, 0x3, 0xb0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0xd, 0x66, 0x66, + 0x66, 0x67, 0xb0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x12, 0x0, + + /* U+8001 "老" */ + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x2, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x12, 0x89, 0xb1, 0x0, + 0x0, 0x27, 0x66, 0x8c, 0x55, 0x8d, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x1, 0xd2, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x8c, 0x6c, 0xa6, 0x6d, 0x80, + 0x2, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x40, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xb1, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x4, 0xbe, 0x10, 0x4c, 0x71, 0x0, 0x0, + 0x4, 0x86, 0xd, 0x58, 0x50, 0x0, 0x40, 0x0, + 0x12, 0x0, 0xd, 0x30, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x0, 0x8, 0xed, 0xdd, 0xdd, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8003 "考" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x6, 0xd0, 0x0, + 0x0, 0x5, 0x66, 0x6e, 0x6c, 0x6d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x1c, 0x30, 0x1, 0x80, + 0x7, 0x66, 0x66, 0x67, 0xe6, 0x66, 0x66, 0x62, + 0x0, 0x0, 0x0, 0x2c, 0x20, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x5, 0xb9, 0x86, 0x66, 0x99, 0x0, + 0x0, 0x1, 0x95, 0x6, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x56, 0x0, 0xd, 0x76, 0x66, 0xb3, 0x0, + 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xae, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x72, 0x0, 0x0, + + /* U+8005 "者" */ + 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x1, 0x5, 0xd0, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x7e, 0x4e, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xa, 0x60, 0x4, 0x40, + 0x6, 0x76, 0x66, 0x68, 0xc9, 0x66, 0x68, 0x80, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xd8, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x29, 0x4e, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x5, 0x40, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, + + /* U+800C "而" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, + 0x86, 0x66, 0x66, 0x87, 0x66, 0x67, 0xc4, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x66, 0x96, 0x66, 0x66, 0xb3, 0x0, 0xb, 0x20, + 0x3a, 0x0, 0xd0, 0xe, 0x10, 0x0, 0xb2, 0x3, + 0xa0, 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, + 0xd, 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, + 0xd0, 0xe, 0x0, 0x0, 0xb2, 0x3, 0xa0, 0xd, + 0x0, 0xe0, 0x0, 0xb, 0x20, 0x3a, 0x0, 0xd0, + 0xe, 0x0, 0x0, 0xc2, 0x3, 0xa0, 0xd, 0x10, + 0xe0, 0x0, 0xb, 0x10, 0x12, 0x0, 0x35, 0xec, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, + + /* U+8033 "耳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x10, + 0x4, 0x76, 0xf6, 0x66, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd1, 0x17, 0x90, + 0x2, 0x45, 0xe5, 0x55, 0x55, 0xe6, 0x43, 0x10, + 0x4, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+805E "聞" */ + 0x19, 0x66, 0x68, 0x80, 0x96, 0x66, 0x7a, 0x0, + 0xc0, 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, + 0x66, 0x69, 0x70, 0xd6, 0x66, 0x7b, 0x0, 0xc0, + 0x0, 0x57, 0xd, 0x0, 0x2, 0xb0, 0xd, 0x66, + 0x69, 0x60, 0xd6, 0x66, 0x7b, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0xb0, 0xc, 0x6, 0x69, + 0x66, 0x78, 0xa6, 0x2b, 0x0, 0xc0, 0x1, 0xc0, + 0x5, 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1d, 0x66, + 0x98, 0x0, 0x2b, 0x0, 0xc0, 0x1, 0xd6, 0x69, + 0x80, 0x2, 0xb0, 0xc, 0x0, 0x1c, 0x0, 0x58, + 0x3, 0x2b, 0x0, 0xc2, 0x35, 0xd5, 0x59, 0xb6, + 0xa5, 0xb0, 0xc, 0x12, 0x10, 0x0, 0x58, 0x12, + 0x3a, 0x1, 0xc0, 0x0, 0x0, 0x4, 0x50, 0x6f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, + + /* U+806F "聯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xc5, 0x0, 0x56, 0x0, + 0x7, 0xa6, 0x6b, 0x95, 0x90, 0x10, 0xa0, 0x0, + 0x0, 0xd0, 0xd, 0x18, 0x8, 0x85, 0x31, 0xd1, + 0x0, 0xd0, 0xd, 0x7a, 0xa8, 0xd, 0x7b, 0x30, + 0x0, 0xd6, 0x6d, 0x2, 0x75, 0x2, 0x53, 0x50, + 0x0, 0xd0, 0xd, 0x27, 0x19, 0x46, 0x63, 0xc2, + 0x0, 0xd0, 0xd, 0x7a, 0x55, 0x56, 0x73, 0x62, + 0x0, 0xd6, 0x6d, 0x0, 0x2, 0x90, 0xb0, 0x0, + 0x0, 0xd0, 0xd, 0xb, 0x21, 0xa0, 0xc0, 0xb0, + 0x0, 0xd0, 0xd, 0x3c, 0x1, 0xa0, 0xc0, 0xc0, + 0x16, 0xea, 0x8d, 0xc, 0x57, 0xa0, 0xc0, 0xc0, + 0xb, 0x50, 0xd, 0x7, 0x44, 0x80, 0xd6, 0x90, + 0x0, 0x0, 0xd, 0x0, 0xa, 0x20, 0xc0, 0x0, + 0x0, 0x0, 0xe, 0x3, 0x84, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x3, 0x33, 0x0, 0x0, 0x40, 0x0, + + /* U+8072 "聲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x1, 0x6, 0x33, 0x70, 0x0, + 0x6, 0x76, 0xd6, 0x7a, 0x1b, 0x33, 0xc0, 0x0, + 0x1, 0x33, 0xc3, 0x61, 0x37, 0x0, 0xd7, 0x91, + 0x0, 0x73, 0x33, 0x53, 0x82, 0x22, 0x56, 0x30, + 0x0, 0xd6, 0xc6, 0xd3, 0x29, 0x44, 0xc5, 0x0, + 0x0, 0xc0, 0xc0, 0xb0, 0x1, 0x9a, 0x50, 0x0, + 0x1, 0xc6, 0x66, 0x60, 0x4, 0x7a, 0x83, 0x10, + 0x5, 0x50, 0x0, 0x3, 0x41, 0x0, 0x8a, 0x90, + 0x7, 0x37, 0xa8, 0x66, 0x66, 0x6d, 0x64, 0x0, + 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0x84, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x66, 0x66, 0x6c, 0x2, 0x40, + 0x2, 0x45, 0xa8, 0x66, 0x66, 0x6d, 0x57, 0x80, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, + + /* U+8077 "職" */ + 0x0, 0x0, 0x0, 0x40, 0x80, 0x4, 0x50, 0x0, + 0x7, 0xb6, 0x6b, 0x83, 0x75, 0x45, 0x82, 0x0, + 0x0, 0xc0, 0xc, 0x37, 0x66, 0x86, 0x88, 0x40, + 0x0, 0xc0, 0xc, 0x7, 0x2, 0xc4, 0x82, 0xa0, + 0x0, 0xd6, 0x6c, 0x7, 0x56, 0x24, 0x80, 0x0, + 0x0, 0xc0, 0xc, 0x57, 0x79, 0x68, 0xb8, 0xb0, + 0x0, 0xc0, 0xc, 0x12, 0x0, 0x13, 0x83, 0x50, + 0x0, 0xd6, 0x6c, 0xd, 0x69, 0x92, 0x98, 0x70, + 0x0, 0xc0, 0xc, 0xc, 0x5, 0x70, 0xab, 0x0, + 0x0, 0xc0, 0xc, 0x1d, 0x69, 0x70, 0xca, 0x0, + 0x4, 0xd9, 0x7d, 0x2c, 0x5, 0x70, 0xb4, 0x2, + 0x9, 0x50, 0xc, 0xd, 0x69, 0x73, 0xa9, 0x32, + 0x0, 0x0, 0xc, 0x8, 0x2, 0x38, 0xa, 0xc0, + 0x0, 0x0, 0xc, 0x0, 0x1, 0x60, 0x1, 0xd1, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+807D "聽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x4a, 0x0, 0x0, + 0x7, 0xb6, 0x6a, 0xaa, 0x44, 0x98, 0x47, 0xa0, + 0x0, 0xc6, 0x6b, 0x21, 0x10, 0x80, 0x1, 0x0, + 0x0, 0xc0, 0x9, 0x22, 0x96, 0xa7, 0x7b, 0x60, + 0x0, 0xc6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x0, 0xc0, 0x9, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x7, 0xa6, 0x6b, 0x21, 0xa1, 0xa5, 0x68, 0x40, + 0x0, 0x0, 0x49, 0x22, 0xb6, 0x66, 0x69, 0x20, + 0x5, 0x8b, 0x59, 0x22, 0x22, 0x22, 0x25, 0x90, + 0x0, 0x38, 0x39, 0x23, 0x53, 0x53, 0x33, 0x30, + 0x4, 0x8b, 0x59, 0x20, 0x29, 0x4a, 0x4, 0x10, + 0x0, 0x38, 0x9, 0x24, 0x4c, 0x8, 0x14, 0xd1, + 0x8, 0x97, 0x39, 0x3e, 0xc, 0x0, 0x7, 0x71, + 0x3, 0x0, 0xa, 0x32, 0xb, 0xbb, 0xbc, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8089 "肉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa, + 0x40, 0x0, 0x1, 0xd, 0x66, 0x66, 0xd7, 0x66, + 0x67, 0xf1, 0xe1, 0x0, 0xe, 0x0, 0x0, 0x1d, + 0xd, 0x10, 0x7, 0x99, 0x70, 0x1, 0xd0, 0xd1, + 0x3, 0xa0, 0x8, 0xe2, 0x1d, 0xd, 0x14, 0x70, + 0xa7, 0x9, 0x61, 0xd0, 0xd3, 0x20, 0xe, 0x20, + 0x0, 0x1d, 0xd, 0x10, 0x6, 0xb7, 0x10, 0x1, + 0xd0, 0xd1, 0x2, 0xc0, 0x1c, 0x80, 0x1d, 0xd, + 0x12, 0xa1, 0x0, 0x1e, 0x41, 0xd0, 0xe3, 0x50, + 0x0, 0x0, 0x31, 0x1d, 0xe, 0x10, 0x0, 0x0, + 0x5, 0x68, 0xd0, 0xe1, 0x0, 0x0, 0x0, 0x4, + 0xf7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+80A9 "肩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0xa0, 0x0, 0x14, 0x0, 0xe, 0x66, + 0x66, 0x66, 0x66, 0x9a, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0x68, 0x0, 0xd, 0x66, 0x66, 0x66, + 0x66, 0x98, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0xd, 0xc, 0x66, 0x66, 0x66, 0xe3, + 0x0, 0xd, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, + 0xd, 0xc, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x2a, + 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x75, 0xc, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0xb0, 0xc, 0x10, + 0x0, 0x0, 0xe0, 0x5, 0x40, 0xc, 0x10, 0x1, + 0x10, 0xe0, 0x16, 0x0, 0xd, 0x10, 0x1, 0x7f, + 0xc0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, + + /* U+80AF "肯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0xf2, 0x0, 0xe0, 0x0, 0x70, 0x0, 0x0, + 0x1e, 0x0, 0xf, 0x66, 0x67, 0x30, 0x0, 0x1, + 0xe0, 0x0, 0xe0, 0x0, 0x5, 0x2, 0x86, 0x6a, + 0x66, 0x6a, 0x66, 0x66, 0xa6, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xa8, 0x66, + 0x66, 0x66, 0xf4, 0x0, 0x0, 0xa, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, + 0x66, 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0x66, + 0xf0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x17, 0xee, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, + + /* U+80B2 "育" */ + 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x0, 0x1, 0x90, 0x47, 0x66, + 0x6d, 0xa6, 0x66, 0x66, 0x62, 0x0, 0x1, 0x98, + 0x10, 0x16, 0x20, 0x0, 0x0, 0x7a, 0x43, 0x34, + 0x46, 0xeb, 0x0, 0x0, 0x6a, 0x76, 0x43, 0x10, + 0xc, 0x20, 0x0, 0xa, 0x66, 0x66, 0x66, 0xc2, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x66, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x21, 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x4c, + 0xc0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, + 0x0, + + /* U+80CC "背" */ + 0x0, 0x0, 0x3, 0x90, 0xa, 0x10, 0x0, 0x0, + 0x2, 0x66, 0x67, 0xb0, 0xe, 0x0, 0x8d, 0x0, + 0x0, 0x10, 0x3, 0xb0, 0xe, 0x67, 0x51, 0x10, + 0x0, 0x2, 0x57, 0xb0, 0xe, 0x0, 0x0, 0x60, + 0xb, 0xc6, 0x23, 0xb0, 0xc, 0xca, 0xac, 0xd0, + 0x0, 0x0, 0x2, 0x60, 0x0, 0x34, 0x33, 0x0, + 0x0, 0x0, 0xb6, 0x66, 0x66, 0x6c, 0x80, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x40, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xf6, 0x66, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x16, 0xcf, 0x10, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x23, 0x0, 0x0, + + /* U+80F8 "胸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x3, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xd6, 0x6e, 0x21, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x7, 0x96, 0x66, 0x66, 0xb0, + 0x0, 0xd0, 0xd, 0xa, 0x0, 0x52, 0x0, 0xc0, + 0x0, 0xd6, 0x6e, 0x42, 0x50, 0xc6, 0x0, 0xc0, + 0x0, 0xd0, 0xd, 0x11, 0x44, 0xd0, 0x0, 0xc0, + 0x0, 0xd0, 0xd, 0xc, 0x1c, 0x70, 0xc0, 0xc0, + 0x0, 0xd0, 0xd, 0xc, 0xa, 0x40, 0xb0, 0xc0, + 0x0, 0xe6, 0x6e, 0xc, 0x19, 0xb0, 0xb0, 0xb0, + 0x0, 0xc0, 0xd, 0xc, 0x61, 0xb0, 0xb0, 0xb0, + 0x2, 0xa0, 0xd, 0xc, 0x30, 0x40, 0xb1, 0xb0, + 0x5, 0x60, 0xd, 0x9, 0x66, 0x66, 0xa2, 0xa0, + 0x8, 0x13, 0x3e, 0x0, 0x0, 0x14, 0x38, 0x80, + 0x6, 0x1, 0xba, 0x0, 0x0, 0x1, 0x8f, 0x30, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+80FD "能" */ + 0x0, 0x9, 0x10, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x6, 0xa1, 0x0, 0xc, 0x30, 0x21, 0x0, 0x2, + 0x90, 0x8, 0x0, 0xc1, 0x2d, 0x60, 0x3, 0x91, + 0x11, 0x7c, 0xc, 0x77, 0x10, 0x0, 0x6b, 0x85, + 0x42, 0xc1, 0xc1, 0x0, 0x23, 0x0, 0x40, 0x0, + 0x61, 0xb, 0x40, 0x5, 0x90, 0xe, 0x55, 0x5e, + 0x20, 0x4a, 0xaa, 0xa5, 0x0, 0xe6, 0x66, 0xe0, + 0x7, 0x10, 0x1, 0x0, 0xe, 0x0, 0xd, 0x0, + 0xe0, 0x9, 0xb0, 0x0, 0xe0, 0x0, 0xd0, 0xd, + 0x9, 0x70, 0x0, 0xe, 0x66, 0x6e, 0x0, 0xd5, + 0x0, 0x1, 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x60, 0xe, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x1a, 0x0, 0xe0, 0x4c, 0xd0, 0xa, 0xcc, 0xcd, + 0xb0, 0x3, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8131 "脱" */ + 0x0, 0x30, 0x4, 0x1, 0x20, 0x1, 0x90, 0x0, + 0x0, 0xd6, 0x6e, 0x10, 0xb2, 0x6, 0x70, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x77, 0x9, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0x5, 0x43, 0x37, 0x44, 0x0, + 0x0, 0xd6, 0x6d, 0xd, 0x44, 0x44, 0x87, 0x0, + 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, + 0x0, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x56, 0x0, + 0x0, 0xd6, 0x6d, 0xd, 0x6b, 0x5a, 0x96, 0x0, + 0x0, 0xc0, 0xd, 0x7, 0x1d, 0xc, 0x10, 0x0, + 0x0, 0xc0, 0xd, 0x0, 0x2b, 0xc, 0x0, 0x0, + 0x0, 0xa0, 0xd, 0x0, 0x49, 0xc, 0x0, 0x10, + 0x3, 0x60, 0xd, 0x0, 0x85, 0xc, 0x0, 0x50, + 0x7, 0x13, 0x4d, 0x2, 0xc0, 0xd, 0x0, 0xa0, + 0x6, 0x0, 0x89, 0x38, 0x10, 0xb, 0xbb, 0xb0, + 0x10, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+8155 "腕" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, + 0x0, 0xb6, 0x6d, 0x1, 0x0, 0x96, 0x0, 0x0, + 0x0, 0xd0, 0xd, 0xa, 0x66, 0x97, 0x67, 0xb0, + 0x0, 0xd0, 0xd, 0x49, 0x71, 0x0, 0x6, 0x20, + 0x0, 0xd3, 0x3d, 0x21, 0xd0, 0x0, 0x1, 0x0, + 0x0, 0xd2, 0x2d, 0x5, 0x82, 0x3a, 0x6d, 0x10, + 0x0, 0xd0, 0xd, 0xa, 0x6a, 0x9b, 0xc, 0x0, + 0x0, 0xd0, 0xd, 0x1a, 0x9, 0x4b, 0xc, 0x0, + 0x0, 0xe6, 0x6d, 0x67, 0x5c, 0x1b, 0xc, 0x0, + 0x0, 0xc0, 0xd, 0x10, 0x6b, 0xb, 0xc, 0x0, + 0x2, 0xa0, 0xd, 0x0, 0x84, 0xb, 0x99, 0x10, + 0x5, 0x60, 0xd, 0x2, 0xa0, 0xb, 0x0, 0x50, + 0x8, 0x11, 0x2c, 0x9, 0x0, 0xb, 0x0, 0xa0, + 0x7, 0x3, 0xc9, 0x71, 0x0, 0xc, 0xbb, 0xc2, + 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8166 "腦" */ + 0x0, 0x30, 0x4, 0x1, 0x90, 0x16, 0x4, 0x10, + 0xd, 0x66, 0xe1, 0x6a, 0x6, 0x90, 0xc5, 0x0, + 0xd0, 0xd, 0xa, 0x0, 0xa0, 0x28, 0x0, 0xd, + 0x0, 0xd4, 0x30, 0x62, 0x8, 0x0, 0x0, 0xd6, + 0x6d, 0xa, 0x21, 0xa2, 0x49, 0x10, 0xd, 0x0, + 0xd0, 0x4d, 0x33, 0xe0, 0x6c, 0x0, 0xd0, 0xd, + 0x0, 0x8b, 0x35, 0x0, 0x40, 0xd, 0x66, 0xd0, + 0xb6, 0x96, 0x66, 0xd3, 0x0, 0xc0, 0xd, 0xd, + 0x0, 0x4, 0x5c, 0x0, 0xc, 0x0, 0xd0, 0xd2, + 0x61, 0xc3, 0xc0, 0x0, 0xa0, 0xd, 0xd, 0x1, + 0xe8, 0xc, 0x0, 0x36, 0x0, 0xd0, 0xd0, 0x67, + 0xc5, 0xc0, 0x7, 0x10, 0xc, 0xd, 0x55, 0x2, + 0x9c, 0x0, 0x60, 0x6e, 0x90, 0xd6, 0x66, 0x66, + 0xd1, 0x20, 0x0, 0x30, 0x7, 0x0, 0x0, 0x6, + 0x0, + + /* U+8170 "腰" */ + 0x0, 0x30, 0x4, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0xe6, 0x6e, 0x57, 0x69, 0x69, 0x69, 0x90, + 0x0, 0xd0, 0xc, 0x0, 0xc, 0xc, 0x0, 0x0, + 0x0, 0xd0, 0xc, 0x3a, 0x6d, 0x6d, 0x6c, 0x30, + 0x0, 0xd6, 0x6c, 0x29, 0xc, 0xc, 0xb, 0x10, + 0x0, 0xd0, 0xc, 0x29, 0xc, 0xc, 0xb, 0x10, + 0x0, 0xd0, 0xc, 0x3b, 0x6a, 0x6a, 0x6d, 0x20, + 0x0, 0xd3, 0x3c, 0x13, 0xc, 0x30, 0x3, 0x0, + 0x0, 0xd3, 0x3c, 0x0, 0x2c, 0x0, 0x2, 0x70, + 0x0, 0xc0, 0xc, 0x66, 0xc7, 0x68, 0xb6, 0x61, + 0x1, 0xa0, 0xc, 0x2, 0xa0, 0x8, 0x30, 0x0, + 0x4, 0x60, 0xc, 0x5, 0x85, 0x3a, 0x0, 0x0, + 0x7, 0x11, 0x1c, 0x0, 0x4, 0xdb, 0x82, 0x0, + 0x7, 0x4, 0xe9, 0x2, 0x88, 0x0, 0x5e, 0x30, + 0x10, 0x0, 0x22, 0x44, 0x0, 0x0, 0x1, 0x20, + + /* U+819D "膝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xc6, 0xd5, 0x46, 0x66, 0xe6, 0x6d, 0x70, + 0x1, 0xb0, 0xc1, 0x11, 0x1c, 0xe3, 0x0, 0x0, + 0x1, 0xb0, 0xc1, 0x0, 0xa3, 0xc4, 0xb7, 0x0, + 0x1, 0xd6, 0xd1, 0x9, 0x22, 0x50, 0xc, 0x80, + 0x1, 0xb0, 0xc2, 0x70, 0xb, 0xc0, 0x1, 0x40, + 0x1, 0xb0, 0xc1, 0x0, 0x89, 0x9, 0x20, 0x0, + 0x1, 0xb0, 0xc1, 0x7, 0x80, 0x92, 0xb9, 0x30, + 0x1, 0xc6, 0xd1, 0x77, 0x0, 0xd0, 0x67, 0xc2, + 0x2, 0x90, 0xc3, 0x3, 0xb0, 0xd7, 0x82, 0x0, + 0x4, 0x70, 0xc1, 0x0, 0x35, 0xe2, 0x0, 0x0, + 0x7, 0x30, 0xc1, 0x4, 0x92, 0xd5, 0xb5, 0x0, + 0x8, 0x0, 0xc0, 0xab, 0x0, 0xd0, 0x1c, 0x60, + 0x6, 0x2a, 0xd0, 0x10, 0x4b, 0xc0, 0x1, 0x30, + 0x10, 0x0, 0x10, 0x0, 0x3, 0x30, 0x0, 0x0, + + /* U+81C9 "臉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x3, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x0, 0xd6, 0x7c, 0x0, 0xc, 0x63, 0x0, 0x0, + 0x0, 0xc0, 0x29, 0x0, 0x66, 0x7, 0x20, 0x0, + 0x0, 0xb0, 0x29, 0x2, 0x80, 0x1, 0xa4, 0x0, + 0x0, 0xd6, 0x79, 0x26, 0x56, 0x69, 0x6a, 0xb1, + 0x0, 0xb0, 0x29, 0x31, 0x2, 0x2, 0x0, 0x30, + 0x0, 0xb0, 0x29, 0xd, 0x6d, 0x1d, 0x67, 0xb0, + 0x0, 0xc4, 0x69, 0xb, 0xb, 0xb, 0x1, 0x90, + 0x0, 0xb1, 0x39, 0xc, 0x6c, 0xd, 0x66, 0x90, + 0x1, 0xa0, 0x29, 0x6, 0x43, 0x5, 0x52, 0x20, + 0x2, 0x70, 0x29, 0x2, 0xb0, 0x0, 0xd1, 0x0, + 0x6, 0x30, 0x29, 0x7, 0x91, 0x2, 0xd1, 0x0, + 0x7, 0x4, 0x78, 0x9, 0x1d, 0x1a, 0x28, 0x90, + 0x14, 0x2, 0xc2, 0x61, 0x2, 0x63, 0x0, 0xa1, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x10, 0x0, 0x0, + + /* U+81EA "自" */ + 0x0, 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x0, 0x0, 0x40, 0x9, 0x0, 0x0, 0x17, + 0xe, 0x66, 0x66, 0x66, 0x68, 0xd1, 0xe1, 0x0, + 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, 0x3, + 0xb0, 0xd6, 0x66, 0x66, 0x66, 0x8b, 0xd, 0x10, + 0x0, 0x0, 0x3, 0xb0, 0xd1, 0x0, 0x0, 0x0, + 0x3b, 0xd, 0x66, 0x66, 0x66, 0x68, 0xb0, 0xd1, + 0x0, 0x0, 0x0, 0x3b, 0xd, 0x10, 0x0, 0x0, + 0x3, 0xb0, 0xe1, 0x0, 0x0, 0x0, 0x3b, 0xe, + 0x66, 0x66, 0x66, 0x68, 0xc0, 0x70, 0x0, 0x0, + 0x0, 0x25, 0x0, + + /* U+81F3 "至" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, + 0x47, 0x66, 0x6a, 0xa6, 0x66, 0x68, 0x81, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x1, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x93, 0x0, 0x0, 0xab, 0x10, 0x0, 0x4, 0xa4, + 0x23, 0x45, 0x66, 0xde, 0x10, 0x0, 0x7e, 0xa7, + 0x5c, 0x50, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x2, 0x70, 0x0, 0x5, 0x76, 0x66, 0xd8, + 0x66, 0x88, 0x10, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x1c, 0x31, 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x64, + + /* U+81FA "臺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x3, 0x90, + 0x4, 0x76, 0x66, 0x66, 0xe6, 0x66, 0x76, 0x62, + 0x0, 0x7, 0x66, 0x66, 0xc6, 0x66, 0xb5, 0x0, + 0x0, 0x2, 0x86, 0x66, 0x66, 0x66, 0xc1, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x2, 0xc6, 0x66, 0x66, 0x66, 0xb0, 0x0, + 0x1, 0xa6, 0x66, 0x66, 0x66, 0x66, 0x66, 0xd1, + 0xb, 0x50, 0x0, 0x0, 0x0, 0x3, 0x65, 0x81, + 0x8, 0x6, 0x66, 0xcc, 0x66, 0x86, 0x52, 0x0, + 0x0, 0x1, 0x57, 0x30, 0x0, 0x19, 0x80, 0x0, + 0x0, 0x6, 0xeb, 0xa9, 0xe6, 0x54, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd0, 0x1, 0xa1, 0x0, + 0x0, 0x6, 0x66, 0x66, 0xe6, 0x66, 0x62, 0x0, + 0x2, 0x66, 0x66, 0x66, 0xe6, 0x66, 0x6c, 0x90, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8207 "與" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x29, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa6, 0xa7, 0xa3, 0x3, 0x66, 0xb8, 0x0, 0xe, + 0x0, 0xa, 0x76, 0x81, 0x8, 0x50, 0x0, 0xd0, + 0x50, 0xa3, 0x0, 0x0, 0x94, 0x0, 0xc, 0x66, + 0x3d, 0x76, 0xd4, 0x7c, 0x30, 0x0, 0xc1, 0x0, + 0x20, 0xd, 0x0, 0xa3, 0x0, 0xc, 0x15, 0x1c, + 0x20, 0xc0, 0xa, 0x20, 0x0, 0xb7, 0x63, 0xd0, + 0xc, 0x27, 0xc2, 0x0, 0xb, 0x20, 0xd, 0x0, + 0xc0, 0xb, 0x20, 0x16, 0xc6, 0x55, 0xd5, 0x5d, + 0x55, 0xdb, 0x60, 0x31, 0x11, 0x51, 0x11, 0x22, + 0x11, 0x10, 0x0, 0x0, 0xad, 0x20, 0x0, 0x69, + 0x40, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x1c, + 0xc1, 0x3, 0xa3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x61, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8208 "興" */ + 0x0, 0x0, 0x33, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x9, 0x96, 0xc6, 0x66, 0x98, 0x7b, 0x70, 0x0, + 0xd0, 0xc, 0x0, 0x56, 0x50, 0x93, 0x0, 0xc, + 0x32, 0xc5, 0x66, 0x85, 0xa, 0x20, 0x0, 0xb5, + 0x3c, 0x36, 0x87, 0x65, 0xd1, 0x0, 0xa, 0x10, + 0xc6, 0x5b, 0x65, 0xc, 0x10, 0x0, 0xa5, 0x3c, + 0x65, 0xb5, 0x50, 0xd0, 0x0, 0xa, 0x74, 0xc6, + 0x9c, 0x56, 0x7e, 0x0, 0x0, 0xa3, 0xc, 0x10, + 0x15, 0x50, 0xd0, 0x1, 0x6c, 0x86, 0xd6, 0x66, + 0x99, 0x6e, 0xd6, 0x1, 0x0, 0x6, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xd2, 0x0, 0x5, + 0xb6, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x1, + 0xce, 0x10, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8209 "舉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x22, 0x6d, 0x5c, 0x3, 0x12, 0x36, 0x0, + 0x0, 0x5a, 0x20, 0x1d, 0x68, 0x46, 0x7b, 0x0, + 0x0, 0x4a, 0x48, 0x1c, 0x0, 0x3, 0x68, 0x0, + 0x0, 0x2b, 0x33, 0x5d, 0x6c, 0x75, 0x86, 0x0, + 0x0, 0x2a, 0x7, 0x5, 0xb, 0x20, 0x65, 0x0, + 0x0, 0x1d, 0x66, 0x2d, 0xc, 0x47, 0xb4, 0x0, + 0x0, 0xc, 0x0, 0x1c, 0xc, 0x10, 0x86, 0x50, + 0x6, 0x76, 0x6d, 0x97, 0x76, 0x86, 0x66, 0x60, + 0x0, 0x0, 0x7b, 0x1, 0xa0, 0x8, 0x0, 0x0, + 0x0, 0x6, 0x96, 0x76, 0xb6, 0xb4, 0xb1, 0x0, + 0x1, 0x85, 0x0, 0x1, 0x90, 0x0, 0x6e, 0xa1, + 0x4, 0x6, 0x76, 0x66, 0xb6, 0x69, 0xb4, 0x20, + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+822A "航" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x11, 0x80, 0x10, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0xc7, 0x66, 0xe0, 0x0, 0x52, 0x5, 0x0, + 0x0, 0xc2, 0x0, 0xd5, 0x66, 0x66, 0x69, 0x30, + 0x0, 0xc1, 0xa0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc1, 0x91, 0xd0, 0x87, 0x66, 0xc0, 0x0, + 0x0, 0xc1, 0x0, 0xd0, 0x84, 0x1, 0xb0, 0x0, + 0x17, 0xd6, 0x66, 0xd0, 0x84, 0x1, 0xb0, 0x0, + 0x0, 0xc1, 0x50, 0xd0, 0x93, 0x1, 0xb0, 0x0, + 0x0, 0xb0, 0xa3, 0xd0, 0xa2, 0x1, 0xb0, 0x0, + 0x0, 0xa0, 0x42, 0xd0, 0xb0, 0x1, 0xb0, 0x0, + 0x3, 0x70, 0x0, 0xd0, 0xa0, 0x1, 0xb0, 0x60, + 0x7, 0x10, 0x33, 0xc5, 0x40, 0x1, 0xb0, 0xa0, + 0x15, 0x0, 0x3e, 0x86, 0x0, 0x0, 0xcc, 0xd1, + 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+822C "般" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x10, 0x0, 0x20, 0x0, + 0x0, 0x24, 0x40, 0x40, 0x3c, 0x66, 0xe1, 0x0, + 0x0, 0x98, 0x66, 0xe2, 0x39, 0x0, 0xd0, 0x0, + 0x0, 0x95, 0x50, 0xd0, 0x48, 0x0, 0xd0, 0x0, + 0x0, 0x93, 0xb2, 0xd0, 0x74, 0x0, 0xdc, 0xe4, + 0x0, 0x93, 0x41, 0xd0, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0xd6, 0x44, 0x44, 0x78, 0x0, + 0x7, 0xc8, 0x66, 0xd0, 0x26, 0x22, 0x99, 0x0, + 0x0, 0xa5, 0x40, 0xd0, 0x6, 0x0, 0xd1, 0x0, + 0x0, 0xb1, 0xc2, 0xd0, 0x5, 0x35, 0x90, 0x0, + 0x0, 0xc0, 0x51, 0xd0, 0x0, 0xbd, 0x10, 0x0, + 0x1, 0xa0, 0x0, 0xd0, 0x0, 0xbc, 0x10, 0x0, + 0x6, 0x30, 0x32, 0xc0, 0x1a, 0x44, 0xe6, 0x0, + 0x7, 0x0, 0x3d, 0x75, 0x81, 0x0, 0x2d, 0xd2, + 0x20, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x20, + + /* U+8239 "船" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x4, 0x0, 0x50, 0x0, + 0x0, 0x25, 0x40, 0x40, 0xd, 0x66, 0xe2, 0x0, + 0x0, 0xd6, 0x66, 0xe1, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd1, 0x20, 0xd0, 0xc, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0xb1, 0xd0, 0x2a, 0x0, 0xd0, 0x0, + 0x0, 0xd0, 0x51, 0xd0, 0x64, 0x0, 0xac, 0xd1, + 0x15, 0xe5, 0x55, 0xd2, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xd1, 0x11, 0xd3, 0x11, 0x0, 0x5, 0x0, + 0x0, 0xc1, 0x50, 0xd0, 0x2d, 0x66, 0x6e, 0x10, + 0x0, 0xb0, 0xb2, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x0, 0xa0, 0x31, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x4, 0x50, 0x0, 0xd0, 0x1b, 0x0, 0x1c, 0x0, + 0x8, 0x0, 0x44, 0xc0, 0x2d, 0x66, 0x6c, 0x0, + 0x15, 0x0, 0x1b, 0x50, 0x2b, 0x0, 0x1a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+826F "良" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0x0, 0x0, 0xb6, 0x66, 0x96, 0x66, + 0xe1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xb, + 0x76, 0x66, 0x66, 0x6d, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xb, 0x76, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0xb2, 0x6, 0x0, 0x0, 0x77, + 0x0, 0xb, 0x20, 0x26, 0x0, 0x7c, 0x70, 0x0, + 0xb2, 0x0, 0x87, 0x73, 0x0, 0x0, 0xb, 0x20, + 0x13, 0xb6, 0x0, 0x0, 0x0, 0xb5, 0x86, 0x0, + 0x9d, 0x84, 0x10, 0xc, 0xb1, 0x0, 0x0, 0x2a, + 0xfe, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+8272 "色" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x66, 0x6a, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xd2, 0x0, 0x2d, 0x50, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0x66, 0x68, 0x86, 0x66, 0xc1, 0x0, + 0x5, 0x4d, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x66, 0x67, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc1, + 0x0, 0xa, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xa0, + + /* U+82B1 "花" */ + 0x0, 0x0, 0x7, 0x50, 0x4, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x2, 0x10, + 0x7, 0x66, 0x6b, 0x96, 0x69, 0xb6, 0x6c, 0x90, + 0x0, 0x0, 0x8, 0x60, 0x5, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x20, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0xe, 0x0, 0x6d, 0x0, + 0x0, 0x6, 0xd0, 0x0, 0xd, 0x6, 0xc2, 0x0, + 0x0, 0x2b, 0xd0, 0x0, 0xe, 0xa8, 0x0, 0x0, + 0x1, 0x91, 0xd0, 0x0, 0x7e, 0x20, 0x0, 0x0, + 0x16, 0x0, 0xd0, 0x57, 0x2d, 0x0, 0x0, 0x20, + 0x0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0xe0, 0x0, 0xc, 0xdc, 0xcd, 0xd1, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+82E5 "若" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x1, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x60, 0x0, 0xd0, 0x5, 0x10, + 0x2, 0x76, 0x6a, 0xa6, 0x66, 0xe6, 0x68, 0x60, + 0x0, 0x0, 0x8, 0x64, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x1e, 0x50, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x1, 0x50, + 0x5, 0x66, 0x66, 0xd9, 0x66, 0x66, 0x68, 0x92, + 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x10, 0x0, 0x2, 0x40, 0x0, + 0x0, 0x1, 0xce, 0x66, 0x66, 0x69, 0xb0, 0x0, + 0x0, 0x2a, 0x3d, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x4, 0x60, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x1, 0x0, 0xe, 0x66, 0x66, 0x69, 0x90, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+82E6 "苦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x6, 0x40, + 0x17, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x67, 0x70, + 0x0, 0x0, 0xe, 0x3, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc, 0x40, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x8, 0x30, + 0x27, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x66, 0x6e, 0x66, 0x68, 0x70, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x6a, 0x60, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+82F1 "英" */ + 0x0, 0x0, 0xb, 0x20, 0x1, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x1, 0xc0, 0x7, 0x60, + 0x8, 0x66, 0x6e, 0x66, 0x66, 0xd6, 0x66, 0x50, + 0x0, 0x0, 0xd, 0x9, 0x31, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x6d, 0x66, 0x6b, 0x80, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0x8, 0x50, 0x0, + 0x0, 0xc, 0x0, 0xe, 0x0, 0x8, 0x54, 0x30, + 0x28, 0x68, 0x66, 0x8d, 0x86, 0x67, 0x68, 0x70, + 0x0, 0x0, 0x0, 0xa5, 0x26, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x10, 0x0, 0x5d, 0x61, 0x0, + 0x0, 0x48, 0x40, 0x0, 0x0, 0x2, 0xbf, 0x90, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+8336 "茶" */ + 0x0, 0x0, 0xb, 0x40, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xd0, 0x6, 0x80, + 0x6, 0x66, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x61, + 0x0, 0x0, 0xd, 0x8, 0xb0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x4c, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xc1, 0x4, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x2, 0x40, 0x3c, 0x71, 0x0, + 0x0, 0x47, 0x20, 0x3, 0xc0, 0x0, 0x9f, 0xc3, + 0x4, 0x26, 0x66, 0x68, 0xc6, 0x6a, 0xd2, 0x10, + 0x0, 0x2, 0x1, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x3, 0xa1, 0x83, 0x0, 0x0, + 0x0, 0x3, 0xb1, 0x3, 0xa0, 0xb, 0x80, 0x0, + 0x0, 0x39, 0x1, 0x4, 0xa0, 0x0, 0xc8, 0x0, + 0x2, 0x40, 0x0, 0x8f, 0x70, 0x0, 0x24, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+8377 "荷" */ + 0x0, 0x0, 0xa, 0x40, 0x5, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x7, 0x20, + 0x7, 0x66, 0x6d, 0x76, 0x69, 0xb6, 0x68, 0x60, + 0x0, 0x0, 0xb, 0x20, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x1, 0x10, 0x2, 0x10, + 0x0, 0x7, 0x84, 0x76, 0x66, 0x66, 0x9b, 0x90, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x9f, 0x33, 0x86, 0x6c, 0x10, 0xe0, 0x0, + 0x5, 0x5e, 0x4, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x24, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x3, 0xa0, 0xd, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x4, 0xc6, 0x6c, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x3, 0x60, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x1, 0x6b, 0xd0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + + /* U+83D3 "菓" */ + 0x0, 0x0, 0xb, 0x10, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x3b, 0x1, 0x90, 0x8, + 0x66, 0x6e, 0x66, 0x67, 0xc6, 0x67, 0x30, 0x0, + 0x0, 0xb0, 0x0, 0x29, 0x20, 0x0, 0x0, 0xc, + 0x66, 0x6a, 0x66, 0x6c, 0x70, 0x0, 0x0, 0xc0, + 0x0, 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xc, 0x66, + 0x6e, 0x66, 0x6c, 0x30, 0x0, 0x0, 0xc0, 0x0, + 0xe0, 0x0, 0xb3, 0x0, 0x0, 0xa, 0x66, 0x6e, + 0x66, 0x69, 0x20, 0x0, 0x26, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x70, 0x0, 0x10, 0x2, 0xce, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb1, 0xe0, 0x68, + 0x0, 0x0, 0x0, 0x6, 0x80, 0xe, 0x0, 0x6d, + 0x61, 0x0, 0x46, 0x20, 0x0, 0xe0, 0x0, 0x3c, + 0xe3, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+83DC "菜" */ + 0x0, 0x0, 0xa, 0x30, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0xe0, 0x1, 0xb2, 0x27, + 0x66, 0x6d, 0x76, 0x6e, 0x66, 0x66, 0x40, 0x0, + 0x0, 0x81, 0x0, 0x95, 0xa5, 0x0, 0x0, 0x35, + 0x56, 0x78, 0x98, 0x65, 0x30, 0x0, 0x0, 0x10, + 0x2, 0x70, 0x0, 0xa4, 0x0, 0x0, 0x7, 0x80, + 0x7, 0x70, 0x2c, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x62, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x42, 0x10, 0x1c, 0x23, 0x76, 0x66, 0x6e, 0xe9, + 0x76, 0x66, 0x64, 0x0, 0x0, 0x9, 0x6c, 0x18, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0xc1, 0x1b, + 0x20, 0x0, 0x0, 0x29, 0x30, 0xc, 0x10, 0x2c, + 0xa4, 0x10, 0x56, 0x0, 0x0, 0xd1, 0x0, 0x7, + 0xe5, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, + + /* U+843D "落" */ + 0x0, 0x0, 0x9, 0x20, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xc, 0x0, 0x6, 0x90, + 0x7, 0x66, 0x6e, 0x66, 0x6d, 0x66, 0x66, 0x61, + 0x0, 0x72, 0x6, 0x3, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x2, 0x9, 0x86, 0x67, 0x80, 0x0, + 0x0, 0x3, 0x4, 0x19, 0x50, 0xc, 0x30, 0x0, + 0x9, 0x30, 0x50, 0x81, 0x53, 0xa4, 0x0, 0x0, + 0x2, 0xb0, 0x73, 0x30, 0x1f, 0x90, 0x0, 0x0, + 0x0, 0x5, 0x40, 0x1, 0xb3, 0x7b, 0x40, 0x0, + 0x0, 0xb, 0x0, 0x5a, 0x10, 0x2, 0xde, 0xa2, + 0x5, 0xaa, 0x25, 0x4c, 0x66, 0x67, 0xd2, 0x30, + 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x97, 0x0, 0x2a, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x86, 0x0, 0x2c, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x20, 0x0, + + /* U+8449 "葉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x20, 0x1, 0xc0, 0x1, 0x0, + 0x6, 0x66, 0x6c, 0x66, 0x66, 0xd6, 0x6d, 0xa0, + 0x0, 0x0, 0xa, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x84, 0x0, 0x71, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0xa3, 0x0, 0xd0, 0x25, 0x0, + 0x1, 0x76, 0xe6, 0xc7, 0x66, 0xe6, 0x66, 0x0, + 0x0, 0x0, 0xd0, 0xa5, 0x44, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x52, 0x22, 0x70, 0x60, 0x0, + 0x0, 0x1, 0xb6, 0x6b, 0x96, 0x66, 0x61, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, 0x2b, 0x0, + 0x3, 0x66, 0x66, 0xef, 0xa9, 0x66, 0x66, 0x20, + 0x0, 0x0, 0xb, 0x8a, 0x54, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xb4, 0xa, 0x50, 0x4b, 0x50, 0x0, + 0x3, 0x65, 0x0, 0xa, 0x60, 0x1, 0xaf, 0x80, + 0x1, 0x0, 0x0, 0x6, 0x20, 0x0, 0x2, 0x0, + + /* U+8457 "著" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0xa, 0x60, 0x1, 0x0, + 0x3, 0x66, 0x6b, 0x86, 0x6c, 0x76, 0x6f, 0x60, + 0x0, 0x10, 0x9, 0x31, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x1c, 0x35, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x8, 0x5, 0xd2, 0x0, + 0x0, 0x3, 0x76, 0x6e, 0x66, 0x8d, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x7, 0xb1, 0x7, 0x50, + 0x4, 0x76, 0x66, 0x66, 0xe8, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x3a, 0x30, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x1e, 0x96, 0x66, 0x67, 0xd0, 0x0, + 0x0, 0x17, 0x8d, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x5, 0x40, 0xd, 0x66, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0xe, 0x66, 0x66, 0x67, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x30, 0x0, + + /* U+8535 "蔵" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x50, 0x6, 0x70, 0x1, 0x0, + 0x4, 0x66, 0x6c, 0x76, 0x69, 0xa6, 0x6e, 0xa0, + 0x1, 0x10, 0xa, 0x20, 0x6, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x4, 0x38, 0x70, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x4, 0xb0, 0x4a, 0x20, + 0x0, 0x3c, 0x66, 0x66, 0x67, 0xc6, 0x66, 0x40, + 0x0, 0x3a, 0x86, 0x87, 0xa2, 0xb0, 0x5, 0x0, + 0x0, 0x29, 0x81, 0x92, 0x10, 0xc0, 0x1f, 0x20, + 0x0, 0x39, 0x86, 0x86, 0xd2, 0xc0, 0x78, 0x0, + 0x0, 0x48, 0x81, 0x0, 0xc0, 0x94, 0xd1, 0x0, + 0x0, 0x66, 0x86, 0x96, 0xa0, 0x5e, 0x60, 0x0, + 0x0, 0x92, 0x81, 0x92, 0x40, 0x6f, 0x20, 0x60, + 0x0, 0x90, 0x86, 0x76, 0x88, 0x73, 0xd3, 0x80, + 0x5, 0x10, 0x0, 0x1, 0x73, 0x0, 0x3e, 0x90, + 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x40, + + /* U+8584 "薄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb0, 0x3, 0xb0, 0x0, 0x0, 0x16, + 0x66, 0x7c, 0x66, 0x7c, 0x66, 0xca, 0x0, 0x40, + 0x2, 0xa0, 0x3, 0x87, 0x30, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0xb3, 0x19, 0x51, 0x0, 0x9, 0x3, + 0x76, 0x6d, 0x66, 0x67, 0x50, 0x30, 0x2, 0x28, + 0x66, 0xd6, 0x69, 0x70, 0x1, 0xd1, 0x60, 0xa1, + 0xc, 0x10, 0x76, 0x0, 0x6, 0x16, 0xa, 0x76, + 0xd6, 0x6a, 0x60, 0x0, 0x7, 0x10, 0xa7, 0x6d, + 0x66, 0xa6, 0x0, 0x2, 0xa0, 0x8, 0x10, 0x90, + 0x55, 0x20, 0x4, 0xc8, 0x27, 0x66, 0x66, 0x6c, + 0x89, 0xa0, 0x6, 0x70, 0x2, 0x81, 0x0, 0xb2, + 0x0, 0x0, 0x97, 0x0, 0x5, 0x70, 0xb, 0x20, + 0x0, 0x9, 0x80, 0x0, 0x0, 0x5a, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, + + /* U+85AC "薬" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x40, 0xa, 0x40, 0x1, 0x0, + 0x6, 0x66, 0x6c, 0x76, 0x6d, 0x66, 0x6d, 0x90, + 0x1, 0x0, 0xa, 0x13, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x8, 0x78, 0x69, 0x60, 0x29, 0x0, + 0x0, 0xa, 0x4c, 0x0, 0x8, 0x36, 0xa4, 0x0, + 0x0, 0x0, 0x1c, 0x66, 0x6b, 0x61, 0x0, 0x0, + 0x1, 0x58, 0x5c, 0x0, 0x8, 0x47, 0x93, 0x0, + 0x9, 0x60, 0xc, 0x66, 0x6b, 0x40, 0x3e, 0x0, + 0x0, 0x0, 0x4, 0x7, 0x33, 0x0, 0x5, 0x0, + 0x7, 0x66, 0x66, 0x9d, 0x96, 0x66, 0x8c, 0x50, + 0x0, 0x0, 0x7, 0xba, 0x56, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xa7, 0x9, 0x30, 0x98, 0x20, 0x0, + 0x2, 0x66, 0x10, 0x9, 0x40, 0x5, 0xdf, 0x70, + 0x11, 0x0, 0x0, 0x5, 0x10, 0x0, 0x2, 0x0, + + /* U+85DD "藝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x2, 0xb0, 0x1, 0x20, + 0x7, 0x66, 0x6b, 0x86, 0x67, 0xc6, 0x6b, 0xa0, + 0x0, 0x0, 0x26, 0x20, 0x1, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0x40, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x76, 0xc6, 0x65, 0x56, 0xd6, 0xc1, 0x0, + 0x4, 0x76, 0xa6, 0x7b, 0x20, 0xb0, 0xd0, 0x0, + 0x0, 0x95, 0xa2, 0x76, 0x5, 0xb0, 0xd0, 0x0, + 0x6, 0x37, 0xd6, 0x77, 0x8, 0x99, 0xc1, 0x20, + 0x0, 0x0, 0xb3, 0x51, 0x46, 0x3, 0x7a, 0x60, + 0x0, 0xca, 0x73, 0x13, 0x31, 0x47, 0x9, 0x60, + 0x0, 0x1, 0x75, 0x55, 0x55, 0x54, 0x63, 0x0, + 0x2, 0x86, 0x66, 0x9b, 0x66, 0x66, 0x77, 0x0, + 0x0, 0x0, 0x6, 0x93, 0x2, 0x85, 0x0, 0x0, + 0x0, 0x6, 0xeb, 0xa9, 0x76, 0x5b, 0x80, 0x0, + 0x0, 0x2, 0x52, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+8607 "蘇" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x20, 0x3, 0x90, 0x0, 0x0, + 0x5, 0x66, 0x6c, 0x66, 0x67, 0xb6, 0x6b, 0xa0, + 0x1, 0x0, 0xa, 0x0, 0x2, 0x90, 0x0, 0x0, + 0x0, 0x8, 0x72, 0x0, 0x0, 0x11, 0x67, 0x0, + 0x0, 0x1e, 0x69, 0x70, 0x46, 0x9c, 0x64, 0x0, + 0x0, 0xa3, 0x8, 0x10, 0x0, 0x28, 0x0, 0x0, + 0x6, 0xd5, 0xa6, 0xc3, 0x56, 0x7b, 0x6c, 0x40, + 0x1, 0xb0, 0xb0, 0xb0, 0x22, 0xfd, 0x0, 0x0, + 0x0, 0xb6, 0xc6, 0xc0, 0x6, 0x99, 0x60, 0x0, + 0x0, 0xb0, 0xb0, 0xb0, 0xb, 0x38, 0x91, 0x0, + 0x0, 0xb6, 0xc6, 0xc0, 0x64, 0x28, 0x3b, 0x0, + 0x0, 0x30, 0x0, 0x32, 0x50, 0x28, 0x9, 0xb0, + 0x0, 0x57, 0x46, 0xa4, 0x0, 0x39, 0x0, 0x0, + 0x9, 0x68, 0x3a, 0x43, 0x0, 0x39, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+8655 "處" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x69, 0xb0, 0x0, + 0x0, 0x30, 0x0, 0xd, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x99, 0x66, 0x6c, 0x66, 0x66, 0x6c, 0x80, + 0x0, 0x94, 0x0, 0xe, 0x22, 0x4a, 0x26, 0x0, + 0x0, 0x86, 0x87, 0x7e, 0x53, 0x20, 0x4, 0x0, + 0x0, 0x84, 0x0, 0xd, 0x0, 0x0, 0x58, 0x0, + 0x0, 0x93, 0x9, 0x16, 0x9a, 0xaa, 0x94, 0x0, + 0x0, 0xa2, 0x3e, 0x66, 0x95, 0x75, 0xa0, 0x0, + 0x0, 0xb0, 0x93, 0x6, 0x86, 0x50, 0xc0, 0x10, + 0x0, 0xb2, 0x67, 0x1c, 0x9, 0x20, 0xc0, 0x60, + 0x2, 0x75, 0x3, 0xe5, 0x17, 0x0, 0xc9, 0xd0, + 0x6, 0x0, 0x1a, 0x6b, 0xa4, 0x20, 0x0, 0x0, + 0x23, 0x4, 0x71, 0x0, 0x38, 0xce, 0xff, 0xb1, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+884C "行" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd3, 0x2, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0xa3, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x63, + 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x21, 0x3, + 0xd2, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0xc3, + 0x37, 0x66, 0x68, 0x67, 0xb3, 0x0, 0x9d, 0x0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x66, 0xe0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x45, 0xd, 0x0, 0x0, + 0x2, 0xb0, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x3, 0x26, 0xa0, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x3a, 0xf7, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, + + /* U+8853 "術" */ + 0x0, 0x7, 0x50, 0x9, 0x20, 0x0, 0x0, 0x10, + 0x0, 0xc, 0x10, 0xd, 0x31, 0x4, 0x76, 0xb1, + 0x0, 0x83, 0x0, 0xd, 0xc, 0x20, 0x0, 0x0, + 0x3, 0x41, 0xb0, 0xd, 0x5, 0x10, 0x0, 0x0, + 0x2, 0x9, 0x84, 0x4d, 0x4a, 0x20, 0x0, 0x51, + 0x0, 0x2d, 0x3, 0x9f, 0x22, 0x17, 0x6e, 0x63, + 0x0, 0xae, 0x10, 0xbe, 0x30, 0x0, 0xd, 0x0, + 0x6, 0x2d, 0x0, 0xbd, 0x69, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x4, 0x6d, 0xa, 0x50, 0xd, 0x0, + 0x0, 0xd, 0x8, 0xd, 0x1, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x16, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x50, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x18, 0xdb, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x40, 0x0, + + /* U+8868 "表" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x26, 0x0, + 0x0, 0x76, 0x66, 0x6d, 0x66, 0x66, 0x77, 0x10, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x1, 0x40, 0x0, + 0x0, 0x6, 0x66, 0x6d, 0x66, 0x67, 0x81, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x3, 0x10, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0xb8, 0x50, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x9, 0x90, 0x90, 0x1b, 0x50, 0x0, + 0x0, 0x0, 0xae, 0x0, 0x39, 0x70, 0x0, 0x0, + 0x0, 0x2a, 0x6d, 0x0, 0x9, 0x50, 0x0, 0x0, + 0x16, 0x50, 0x1d, 0x0, 0x20, 0xa8, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x38, 0x40, 0x7, 0xfa, 0x71, + 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, 0x29, 0x40, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+88AB "被" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x3, 0x0, 0xd0, 0x2, 0x20, + 0x6, 0x76, 0xba, 0xe, 0x66, 0xe6, 0x6c, 0xa0, + 0x0, 0x0, 0xd1, 0xd, 0x0, 0xd0, 0x17, 0x0, + 0x0, 0x6, 0x74, 0x1d, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe, 0x1c, 0x2e, 0x66, 0xe6, 0x78, 0x0, + 0x0, 0x8e, 0x71, 0x1c, 0x31, 0x0, 0x88, 0x0, + 0x5, 0x3d, 0x77, 0x2a, 0x6, 0x0, 0xd1, 0x0, + 0x12, 0xd, 0xd, 0x48, 0x8, 0x16, 0x80, 0x0, + 0x0, 0xd, 0x1, 0x74, 0x1, 0xbc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x2, 0xd9, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x60, 0x4a, 0x16, 0xc4, 0x0, + 0x0, 0xd, 0x18, 0x27, 0x50, 0x0, 0x4d, 0xb1, + 0x0, 0x2, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+88CF "裏" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x6d, 0x66, 0x66, 0xc5, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x2c, 0x66, 0x6d, + 0x66, 0x6e, 0x0, 0x0, 0x2c, 0x66, 0x6d, 0x66, + 0x6d, 0x0, 0x0, 0x2a, 0x0, 0x1c, 0x0, 0xd, + 0x0, 0x0, 0x28, 0x66, 0x6d, 0x66, 0x66, 0x0, + 0x0, 0x76, 0x66, 0x6d, 0x66, 0x6b, 0x40, 0x0, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0x53, 0x28, 0x66, + 0x66, 0xf9, 0x66, 0x69, 0x64, 0x0, 0x0, 0x2c, + 0x67, 0x0, 0x6c, 0x30, 0x0, 0x18, 0xd7, 0x1, + 0xa8, 0x40, 0x0, 0x16, 0x71, 0x77, 0x5, 0x49, + 0xb7, 0x42, 0x0, 0x0, 0x9d, 0x92, 0x0, 0x28, + 0xc4, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+88DC "補" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0x0, 0xb4, 0x20, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xd0, 0xb4, 0x0, + 0x0, 0x0, 0x50, 0x0, 0x0, 0xd0, 0x38, 0x10, + 0x7, 0x66, 0xc8, 0x76, 0x66, 0xe6, 0x69, 0x70, + 0x0, 0x0, 0xd0, 0x2, 0x0, 0xd0, 0x4, 0x0, + 0x0, 0x6, 0x82, 0xe, 0x66, 0xe6, 0x6e, 0x20, + 0x0, 0xe, 0x1b, 0x4d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6d, 0x0, + 0x5, 0x4c, 0x95, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x33, 0xc, 0x1e, 0x2d, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xc, 0x4, 0xd, 0x66, 0xe6, 0x6d, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xd, 0x0, 0xc3, 0x9c, 0x0, + 0x0, 0x4, 0x0, 0x6, 0x0, 0x20, 0x32, 0x0, + + /* U+88E1 "裡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0xb, 0x66, 0x66, 0x6d, 0x10, + 0x0, 0x0, 0x50, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x7, 0x66, 0xc9, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x0, 0xe0, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x0, 0x7, 0x82, 0xc, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x1e, 0x1b, 0x4c, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0x9e, 0x56, 0xd, 0x66, 0xe6, 0x6c, 0x0, + 0x6, 0x3c, 0x95, 0xa, 0x0, 0xd0, 0x4, 0x0, + 0x33, 0xc, 0xe, 0x30, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x4, 0x37, 0x66, 0xe6, 0x6d, 0x20, + 0x0, 0xc, 0x0, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x10, + 0x0, 0xd, 0x13, 0x66, 0x66, 0xe6, 0x6a, 0xc0, + 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+88FD "製" */ + 0x0, 0x18, 0xb, 0x10, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x85, 0xc, 0x2, 0x50, 0x0, 0xd, 0x0, + 0x3, 0x86, 0x6d, 0x66, 0x60, 0xb3, 0xc, 0x0, + 0x6, 0x75, 0x5d, 0x56, 0xb2, 0xd0, 0xc, 0x0, + 0x0, 0x76, 0x6d, 0x66, 0x80, 0xd0, 0xc, 0x0, + 0x0, 0xc0, 0xc, 0x2, 0x90, 0xd0, 0xc, 0x0, + 0x0, 0xc0, 0xc, 0x37, 0x80, 0x20, 0xc, 0x0, + 0x0, 0xb0, 0xd, 0x9, 0x20, 0x6, 0xca, 0x0, + 0x0, 0x0, 0x3, 0x4, 0xa0, 0x0, 0x38, 0x0, + 0x6, 0x76, 0x66, 0xc7, 0x96, 0x66, 0x89, 0x50, + 0x0, 0x0, 0x2c, 0x40, 0x42, 0x6, 0xc1, 0x0, + 0x0, 0x18, 0x9d, 0x0, 0x6, 0x76, 0x0, 0x0, + 0x15, 0x50, 0xd, 0x16, 0x60, 0x8a, 0x40, 0x0, + 0x0, 0x0, 0xf, 0xb2, 0x0, 0x3, 0xbf, 0x70, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8907 "複" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0xe1, 0x0, 0x3, 0x40, + 0x0, 0x2, 0x40, 0x4, 0xb6, 0x66, 0x66, 0x60, + 0x6, 0x55, 0xc7, 0xa, 0xa6, 0x66, 0x6a, 0x10, + 0x0, 0x1, 0xe0, 0x43, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x7, 0x72, 0x30, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x1e, 0xb, 0x40, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x9d, 0x45, 0x0, 0xda, 0x86, 0x6b, 0x0, + 0x5, 0x4c, 0xa4, 0x0, 0x1c, 0x0, 0x13, 0x0, + 0x13, 0xc, 0xd, 0x20, 0x9a, 0x66, 0xba, 0x0, + 0x0, 0xc, 0x2, 0x6, 0x45, 0x11, 0xc0, 0x0, + 0x0, 0xc, 0x0, 0x21, 0x0, 0x9c, 0x20, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x5, 0xcb, 0x30, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x85, 0x2, 0xbc, 0x81, + 0x0, 0x3, 0x4, 0x30, 0x0, 0x0, 0x1, 0x10, + + /* U+897F "西" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x76, 0x66, 0x67, 0x66, 0x86, 0x66, 0xc5, 0x0, + 0x0, 0x3, 0xa0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x86, + 0x67, 0xc6, 0x6e, 0x66, 0x6c, 0x0, 0xd, 0x0, + 0x39, 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x5, + 0x80, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x75, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0xb, 0x10, + 0xd, 0x0, 0x1b, 0x0, 0xd, 0x4, 0x60, 0x0, + 0xcc, 0xd4, 0xb0, 0x0, 0xd1, 0x70, 0x0, 0x0, + 0x0, 0x1b, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0xd6, 0x66, 0x66, 0x66, 0x66, + 0x6c, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xa0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8981 "要" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, + 0x2, 0x76, 0x66, 0xc6, 0x6c, 0x66, 0x68, 0x40, + 0x0, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x66, 0xe6, 0x6e, 0x66, 0xe3, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xe, 0x66, 0x96, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0x1, 0x0, 0xd5, 0x0, 0x0, 0x1, 0x0, + 0x6, 0x66, 0x68, 0xd6, 0x66, 0x66, 0x6d, 0xa0, + 0x0, 0x0, 0xc, 0x20, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x10, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x68, 0xdd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x63, 0x9e, 0xa1, 0x0, + 0x0, 0x25, 0x88, 0x50, 0x0, 0x0, 0x8b, 0x0, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898B "見" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0xb, 0x86, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xa, 0x87, 0xa6, 0x6a, 0x6f, 0x0, 0x0, + 0x0, 0x8, 0x13, 0xb0, 0x1d, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x90, 0x1d, 0x0, 0x0, 0x40, + 0x0, 0x0, 0xb, 0x40, 0x1d, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x7a, 0x0, 0x1d, 0x0, 0x3, 0x90, + 0x0, 0x48, 0x60, 0x0, 0xd, 0xcc, 0xce, 0xb0, + 0x24, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898F "規" */ + 0x0, 0x9, 0x30, 0x2, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xb, 0x10, 0xe, 0x66, 0x66, 0x6e, 0x10, + 0x0, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x5, 0x6d, 0x7b, 0x1d, 0x66, 0x66, 0x6d, 0x0, + 0x1, 0xb, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xb, 0x10, 0xd, 0x33, 0x33, 0x3d, 0x0, + 0x26, 0x6d, 0x6a, 0x7d, 0x22, 0x22, 0x2d, 0x0, + 0x2, 0xc, 0x10, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x10, 0xe, 0x6b, 0x6a, 0x6d, 0x0, + 0x0, 0xd, 0x74, 0x6, 0x1d, 0xd, 0x2, 0x0, + 0x0, 0x29, 0xa, 0x70, 0x3b, 0xd, 0x0, 0x0, + 0x0, 0x82, 0x1, 0x90, 0x86, 0xd, 0x0, 0x40, + 0x2, 0x70, 0x0, 0x3, 0xa0, 0xd, 0x0, 0x80, + 0x16, 0x0, 0x0, 0x66, 0x0, 0xd, 0xcc, 0xd1, + 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8996 "視" */ + 0x0, 0x8, 0x0, 0x3, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x5, 0xb0, 0xe, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x0, 0x71, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x66, 0xab, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0xc2, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x6, 0x70, 0xd, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x2f, 0x30, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x9c, 0x88, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x7, 0x1b, 0x1b, 0x5e, 0x6b, 0x6a, 0x6d, 0x0, + 0x20, 0xb, 0x11, 0x15, 0x1d, 0xd, 0x2, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x4a, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0xa4, 0xd, 0x0, 0x40, + 0x0, 0xb, 0x10, 0x5, 0x80, 0xd, 0x0, 0x70, + 0x0, 0xc, 0x11, 0x65, 0x0, 0xd, 0xcc, 0xc0, + 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+899A "覚" */ + 0x0, 0x2, 0x0, 0x26, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0xc3, 0xa, 0x60, 0xc, 0x30, 0x0, + 0x0, 0x30, 0x57, 0x3, 0x50, 0x54, 0x2, 0x10, + 0x2, 0xa6, 0x66, 0x66, 0x66, 0x76, 0x6b, 0xb0, + 0xc, 0x50, 0x10, 0x0, 0x0, 0x3, 0x9, 0x0, + 0x5, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0xb8, 0x6c, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xe1, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x0, 0x9, 0x80, 0xd, 0x0, 0x2, 0x70, + 0x0, 0x26, 0x84, 0x0, 0xd, 0xcc, 0xce, 0xa0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89AA "親" */ + 0x0, 0x4, 0x50, 0x0, 0x20, 0x0, 0x3, 0x0, + 0x0, 0x0, 0xc2, 0x31, 0xc6, 0x66, 0x6b, 0x50, + 0x3, 0x86, 0x78, 0xa4, 0xb0, 0x0, 0x9, 0x10, + 0x0, 0x54, 0x6, 0x70, 0xb6, 0x66, 0x6b, 0x10, + 0x0, 0xd, 0x7, 0x0, 0xb0, 0x0, 0x9, 0x10, + 0x7, 0x67, 0x88, 0x79, 0xb6, 0x66, 0x6b, 0x10, + 0x0, 0x0, 0xc0, 0x0, 0xb0, 0x0, 0x9, 0x10, + 0x0, 0x0, 0xc0, 0x40, 0xb0, 0x0, 0x9, 0x20, + 0x3, 0x76, 0xd6, 0x73, 0xb7, 0xa6, 0xab, 0x20, + 0x0, 0x30, 0xc1, 0x0, 0x54, 0x81, 0xa2, 0x0, + 0x0, 0xb5, 0xc2, 0x80, 0x6, 0x61, 0xa0, 0x0, + 0x3, 0x70, 0xc0, 0x79, 0xa, 0x21, 0xa0, 0x40, + 0x7, 0x10, 0xc0, 0x6, 0x39, 0x1, 0xa0, 0x70, + 0x0, 0x3c, 0xb0, 0x4, 0x60, 0x0, 0xcb, 0xe2, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+89BA "覺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x23, 0x8a, 0x13, 0x49, 0x46, 0x96, 0x0, + 0x0, 0x3b, 0x0, 0x7, 0xc7, 0x10, 0x84, 0x0, + 0x0, 0x1c, 0x69, 0x31, 0x4, 0x37, 0xc2, 0x0, + 0x0, 0xb, 0x4, 0x6, 0x8a, 0x0, 0xb1, 0x0, + 0x0, 0xd, 0x65, 0x36, 0x98, 0x27, 0xd0, 0x0, + 0x5, 0x7b, 0x66, 0x66, 0x67, 0x66, 0xb8, 0xb0, + 0x1e, 0x10, 0x74, 0x44, 0x44, 0x48, 0x18, 0x10, + 0x2, 0x0, 0xd2, 0x22, 0x22, 0x2c, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, 0x0, + 0x0, 0x0, 0x50, 0xc1, 0xb, 0x4, 0x0, 0x50, + 0x0, 0x0, 0x8, 0x70, 0xb, 0x0, 0x0, 0x80, + 0x0, 0x15, 0x74, 0x0, 0xd, 0xbb, 0xbc, 0xd0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89C0 "觀" */ + 0x0, 0x47, 0x9, 0x10, 0x20, 0x0, 0x3, 0x0, + 0x0, 0x57, 0xc, 0x33, 0xc6, 0x66, 0x6c, 0x40, + 0x7, 0x9a, 0x6d, 0x64, 0xc0, 0x0, 0xa, 0x0, + 0x2, 0x36, 0x25, 0x12, 0xc6, 0x66, 0x6c, 0x0, + 0xb, 0x6c, 0x6a, 0x97, 0xc0, 0x0, 0xa, 0x0, + 0xb, 0x5c, 0x4a, 0x85, 0xc6, 0x66, 0x6c, 0x0, + 0x4, 0x74, 0x80, 0x0, 0xc0, 0x0, 0xa, 0x0, + 0x0, 0xc1, 0x72, 0x30, 0xc0, 0x0, 0xa, 0x10, + 0x7, 0xb6, 0xa6, 0x83, 0xc7, 0xa7, 0xac, 0x10, + 0x19, 0xb6, 0xc6, 0x91, 0x44, 0x82, 0x92, 0x0, + 0x3, 0x90, 0xb1, 0x0, 0x6, 0x62, 0x90, 0x0, + 0x3, 0xb6, 0xc6, 0xa1, 0xa, 0x22, 0x90, 0x40, + 0x3, 0x90, 0xb1, 0x40, 0x39, 0x2, 0x90, 0x70, + 0x3, 0xa6, 0x66, 0x67, 0x60, 0x0, 0xdb, 0xd1, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + + /* U+89D2 "角" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x76, 0x67, 0xc1, 0x0, 0x0, 0x0, + 0x9, 0x70, 0x0, 0x89, 0x10, 0x0, 0x0, 0x4, + 0xc0, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2, 0xcd, + 0x66, 0x6b, 0x66, 0x68, 0xe0, 0x3, 0x80, 0xd0, + 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x10, 0xe, 0x66, + 0x6e, 0x66, 0x68, 0xa0, 0x0, 0x0, 0xd0, 0x0, + 0xe0, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x0, 0xe, + 0x0, 0x3, 0xa0, 0x0, 0x1, 0xd6, 0x66, 0xe6, + 0x66, 0x8a, 0x0, 0x0, 0x48, 0x0, 0xe, 0x0, + 0x3, 0xa0, 0x0, 0x9, 0x30, 0x0, 0xe0, 0x0, + 0x3a, 0x0, 0x3, 0xa0, 0x0, 0xe, 0x0, 0x3, + 0xa0, 0x2, 0x80, 0x0, 0x0, 0xe0, 0x49, 0xd9, + 0x0, 0x40, 0x0, 0x0, 0x1, 0x0, 0x7, 0x10, + + /* U+89E3 "解" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x2, 0x10, + 0x0, 0xc, 0x20, 0x0, 0x66, 0xd6, 0x6b, 0x60, + 0x0, 0x3c, 0x6c, 0x70, 0x3, 0xb0, 0x9, 0x30, + 0x0, 0xa2, 0xa, 0x0, 0xa, 0x40, 0xb, 0x20, + 0x4, 0xd6, 0x97, 0xa3, 0x58, 0x4, 0x9d, 0x0, + 0x15, 0xc0, 0xc0, 0xc3, 0x33, 0xa, 0x31, 0x0, + 0x0, 0xc1, 0xc1, 0xc0, 0xe, 0x2d, 0x0, 0x0, + 0x0, 0xd5, 0xd5, 0xd0, 0x6b, 0x6e, 0x6c, 0x30, + 0x0, 0xc0, 0xc0, 0xc0, 0xa0, 0xd, 0x0, 0x0, + 0x0, 0xd6, 0xd6, 0xd3, 0x10, 0xd, 0x0, 0x40, + 0x0, 0xb0, 0xc0, 0xc4, 0x76, 0x6e, 0x66, 0x81, + 0x2, 0x80, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x20, 0xc0, 0xc0, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x0, 0x56, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x40, 0x0, 0x5, 0x0, 0x0, + + /* U+89E6 "触" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x0, 0x9, 0x10, 0x0, + 0x0, 0xc, 0x31, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x3c, 0x6c, 0x80, 0x0, 0xc, 0x0, 0x0, + 0x0, 0xb2, 0xa, 0x0, 0x20, 0xc, 0x3, 0x0, + 0x6, 0xd6, 0x97, 0xc3, 0xb6, 0x6d, 0x6c, 0x40, + 0x14, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc6, 0xc6, 0xd0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc0, 0xb0, 0xb0, 0xa1, 0xc, 0xa, 0x10, + 0x0, 0xc0, 0xb0, 0xb0, 0xb4, 0x3c, 0x3b, 0x10, + 0x0, 0xd6, 0xc6, 0xd0, 0x93, 0x3c, 0x37, 0x10, + 0x0, 0xb0, 0xb0, 0xb0, 0x0, 0xc, 0x11, 0x0, + 0x2, 0x80, 0xb0, 0xb0, 0x0, 0xc, 0x9, 0x10, + 0x7, 0x10, 0xb0, 0xb2, 0x45, 0x6d, 0x57, 0xb0, + 0x6, 0x0, 0x56, 0xe4, 0xb6, 0x30, 0x0, 0x90, + 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+8A00 "言" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x10, 0x36, 0x66, 0x66, + 0x78, 0x66, 0x67, 0xe3, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0x27, 0x66, 0x66, 0x66, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x37, 0x66, 0x66, 0x66, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0x66, 0x66, 0x66, 0xd4, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x1e, 0x66, 0x66, 0x66, + 0xe1, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+8A08 "計" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0xb, 0x10, 0x0, + 0x0, 0x0, 0xd3, 0x1, 0x0, 0xe, 0x0, 0x0, + 0x6, 0x66, 0xb6, 0x8c, 0x10, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x44, 0x44, 0xa0, 0x0, 0xd, 0x0, 0x30, + 0x0, 0x32, 0x22, 0x22, 0x86, 0x6e, 0x66, 0x94, + 0x0, 0x0, 0x0, 0x60, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x76, 0x66, 0x73, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xe1, 0x0, 0xd, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xd, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x2, 0xc6, 0x66, 0xd0, 0x0, 0xe, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0xd0, 0x0, 0x1e, 0x0, 0x0, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + + /* U+8A0A "訊" */ + 0x0, 0x7, 0x30, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x2, 0xf0, 0x17, 0xd7, 0x68, 0xc0, 0x0, + 0x6, 0x66, 0xc6, 0xa4, 0xb2, 0x3, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, + 0x1, 0x66, 0x68, 0x70, 0xb2, 0x3, 0x90, 0x0, + 0x0, 0x20, 0x0, 0x0, 0xb2, 0x3, 0x90, 0x0, + 0x0, 0x0, 0x4, 0x27, 0xd8, 0xc4, 0x90, 0x0, + 0x1, 0x76, 0x66, 0x40, 0xb2, 0x1, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0xb2, 0x0, 0xc0, 0x0, + 0x3, 0xc6, 0x68, 0xc0, 0xb2, 0x0, 0xd0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0xb2, 0x30, + 0x2, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x68, 0x70, + 0x2, 0xc6, 0x67, 0xa0, 0xb2, 0x0, 0xd, 0xc0, + 0x3, 0xa0, 0x3, 0xa0, 0xb2, 0x0, 0x3, 0xe0, + 0x1, 0x20, 0x0, 0x0, 0x10, 0x0, 0x0, 0x10, + + /* U+8A0E "討" */ + 0x0, 0x6, 0x20, 0x0, 0x0, 0x1, 0xb1, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x6, 0x66, 0xc6, 0xa8, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x50, + 0x1, 0x66, 0x68, 0x94, 0x65, 0x56, 0xe6, 0x83, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0x11, 0x70, 0x1, 0xe0, 0x0, + 0x1, 0x76, 0x67, 0x50, 0x6a, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0xe, 0x21, 0xe0, 0x0, + 0x3, 0xb6, 0x67, 0xd0, 0x3, 0x1, 0xe0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0x0, 0x1, 0xe0, 0x0, + 0x2, 0xc6, 0x67, 0xa0, 0x2, 0x2, 0xe0, 0x0, + 0x3, 0xa0, 0x3, 0xa0, 0x3, 0xaf, 0xc0, 0x0, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x6, 0x10, 0x0, + + /* U+8A13 "訓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x74, 0x2, 0x0, 0xb0, + 0x0, 0x5, 0xc0, 0x10, 0xa4, 0xd, 0x20, 0xd0, + 0x6, 0x67, 0x86, 0x94, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x10, 0x93, 0xd, 0x0, 0xd0, + 0x1, 0x76, 0x67, 0x70, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x93, 0xd, 0x0, 0xd0, + 0x0, 0x76, 0x69, 0x70, 0xa3, 0xd, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0xd, 0x0, 0xd0, + 0x2, 0x86, 0x67, 0x90, 0xc0, 0xd, 0x0, 0xd0, + 0x3, 0xa0, 0x3, 0xa0, 0xc0, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x3, 0xa3, 0x90, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x3, 0xa9, 0x30, 0xd, 0x0, 0xd0, + 0x3, 0xc6, 0x67, 0xa8, 0x0, 0x8, 0x0, 0xd0, + 0x2, 0x40, 0x1, 0x80, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+8A18 "記" */ + 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x6, 0xa0, 0x2, 0x76, 0x66, 0x6f, 0x30, + 0x7, 0x67, 0x96, 0xa5, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x1, 0x66, 0x66, 0xa0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x85, 0x55, 0x5e, 0x0, + 0x0, 0x0, 0x3, 0x30, 0xc1, 0x0, 0x9, 0x0, + 0x1, 0x76, 0x66, 0x50, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xc1, 0x0, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xe0, 0xc1, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x40, + 0x2, 0xa0, 0x0, 0xd0, 0xc1, 0x0, 0x0, 0x70, + 0x2, 0xc6, 0x66, 0xd0, 0xc2, 0x0, 0x0, 0xc0, + 0x3, 0xa0, 0x0, 0xd0, 0x5d, 0xdd, 0xde, 0xc1, + 0x1, 0x20, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8A2A "訪" */ + 0x0, 0x54, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xa9, 0x0, 0x0, + 0x37, 0x6b, 0x69, 0x70, 0x0, 0x37, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0x5b, 0x55, 0x58, 0x70, + 0x5, 0x66, 0x6a, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x1e, 0x66, 0x6e, 0x20, + 0x5, 0x66, 0x66, 0x0, 0x2a, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x57, 0x0, 0xd, 0x0, + 0xb, 0x66, 0x6e, 0x10, 0x83, 0x0, 0xc, 0x0, + 0xb, 0x10, 0xd, 0x0, 0xb0, 0x0, 0x2b, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x60, 0x0, 0x49, 0x0, + 0xb, 0x66, 0x6d, 0x9, 0x1, 0x30, 0x96, 0x0, + 0xc, 0x10, 0xc, 0x61, 0x0, 0x4e, 0xd0, 0x0, + 0x1, 0x0, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, + + /* U+8A2D "設" */ + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x96, 0x6b, 0x40, 0x0, + 0x0, 0xd, 0x22, 0x0, 0xe0, 0xb, 0x20, 0x0, + 0x37, 0x69, 0x69, 0x50, 0xd0, 0xb, 0x20, 0x0, + 0x0, 0x0, 0x1, 0x0, 0xc0, 0xb, 0x20, 0x0, + 0x6, 0x66, 0x69, 0x5, 0x70, 0xa, 0x42, 0x30, + 0x0, 0x0, 0x0, 0xa, 0x0, 0x4, 0xaa, 0x70, + 0x3, 0x66, 0x79, 0x56, 0x66, 0x66, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x50, 0x3, 0xf5, 0x0, + 0x3, 0x0, 0x4, 0x0, 0x60, 0xa, 0x90, 0x0, + 0xb, 0x66, 0x6d, 0x0, 0x27, 0x3d, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc2, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa, 0xc1, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x93, 0x4d, 0x40, 0x0, + 0xb, 0x10, 0x8, 0x38, 0x10, 0x4, 0xec, 0x71, + 0x1, 0x0, 0x2, 0x20, 0x0, 0x0, 0x18, 0x10, + + /* U+8A31 "許" */ + 0x0, 0x46, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x7, 0x70, 0x0, 0x0, 0x27, + 0x6a, 0x77, 0x80, 0xb1, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x6a, 0x67, 0x80, 0x4, 0x66, + 0x79, 0x7, 0x20, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x70, 0xc, 0x10, 0x0, 0x3, 0x66, 0x78, + 0x30, 0x0, 0xc1, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x22, 0x2d, 0x32, 0x95, 0x2, 0x0, 0x4, 0x5, + 0x33, 0xd4, 0x33, 0x30, 0xb6, 0x66, 0xe0, 0x0, + 0xc, 0x10, 0x0, 0xb, 0x10, 0x1c, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xb1, 0x1, 0xc0, 0x0, 0xc, + 0x10, 0x0, 0xb, 0x66, 0x6c, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xc1, 0x0, 0x90, 0x0, 0xd, 0x10, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, + + /* U+8A33 "訳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x1d, 0x1, 0x1a, 0x76, 0x66, 0x6e, 0x20, + 0x37, 0x67, 0x67, 0x5a, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x2, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x4, 0x76, 0x66, 0xa, 0x30, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x87, 0x66, 0x6e, 0x0, + 0x4, 0x66, 0x78, 0xa, 0x34, 0x20, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x21, 0x60, 0x0, 0x0, + 0x8, 0x66, 0x6a, 0xb, 0x10, 0x90, 0x0, 0x0, + 0xc, 0x0, 0xd, 0xc, 0x0, 0xa1, 0x0, 0x0, + 0xc, 0x0, 0xd, 0xb, 0x0, 0x49, 0x0, 0x0, + 0xc, 0x0, 0xd, 0x47, 0x0, 0xc, 0x40, 0x0, + 0xc, 0x66, 0x6d, 0x91, 0x0, 0x2, 0xe3, 0x0, + 0x7, 0x0, 0x4, 0x60, 0x0, 0x0, 0x6f, 0x90, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x10, + + /* U+8A34 "訴" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x29, 0x60, 0x0, + 0xd, 0x30, 0x10, 0xa7, 0x99, 0x64, 0x2, 0x76, + 0x86, 0x77, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x37, 0x66, + 0x80, 0xe, 0x66, 0x66, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xc, 0x20, 0x0, 0x37, 0x66, 0x90, + 0xd, 0x10, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x6e, 0x60, 0x0, 0x76, 0x66, 0xa1, 0x3a, + 0x0, 0xc9, 0xe3, 0xa, 0x20, 0xd, 0x5, 0x70, + 0xc, 0x25, 0x90, 0xa2, 0x0, 0xd0, 0xa2, 0x0, + 0xc2, 0x0, 0xa, 0x20, 0xd, 0x1b, 0x0, 0xc, + 0x20, 0x0, 0xa7, 0x66, 0xd8, 0x20, 0x0, 0xc2, + 0x0, 0x8, 0x10, 0x5, 0x50, 0x0, 0xc, 0x20, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x10, 0x0, + + /* U+8A55 "評" */ + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0xd, 0x40, 0x4, 0x66, 0xd6, 0x66, 0x20, + 0x27, 0x6a, 0x79, 0x64, 0x0, 0xc1, 0x8, 0x20, + 0x0, 0x0, 0x0, 0x5, 0x90, 0xc1, 0x1e, 0x20, + 0x4, 0x66, 0x78, 0x0, 0xe3, 0xc1, 0x66, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xa3, 0xc1, 0x80, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x0, 0xc2, 0x11, 0x10, + 0x5, 0x66, 0x64, 0x27, 0x66, 0xd6, 0x6a, 0x90, + 0x1, 0x0, 0x2, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xc, 0x66, 0x6e, 0x10, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0xb, 0x66, 0x6d, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc, 0x10, 0xd, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x2, 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, + + /* U+8A66 "試" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0xc, 0x19, 0x70, 0x26, + 0x6b, 0x68, 0x80, 0x0, 0xc1, 0xb, 0x0, 0x0, + 0x0, 0x4, 0x55, 0x5d, 0x55, 0xb4, 0x4, 0x66, + 0x78, 0x10, 0x0, 0xb1, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x12, + 0x24, 0x49, 0x94, 0x0, 0x0, 0x56, 0x66, 0x61, + 0x2d, 0x27, 0x60, 0x0, 0x0, 0x0, 0x1, 0x0, + 0xd0, 0x48, 0x0, 0x0, 0xb6, 0x66, 0xe0, 0xd, + 0x0, 0xc0, 0x0, 0xb, 0x10, 0x1c, 0x0, 0xd0, + 0x2b, 0x20, 0x20, 0xb1, 0x1, 0xc2, 0x7d, 0x60, + 0x4a, 0x24, 0xb, 0x66, 0x6c, 0x57, 0x0, 0x0, + 0xbc, 0x40, 0xb1, 0x1, 0xc0, 0x0, 0x0, 0x1, + 0xb7, 0x4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+8A71 "話" */ + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, + 0x0, 0xe, 0x20, 0x3, 0x57, 0x9b, 0xdc, 0x70, + 0x27, 0x6a, 0x68, 0x61, 0x11, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x3, 0x44, 0x56, 0x0, 0x0, 0xd0, 0x2, 0x70, + 0x2, 0x22, 0x21, 0x46, 0x66, 0xe6, 0x66, 0x50, + 0x0, 0x0, 0x13, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x5, 0x66, 0x64, 0x1, 0x0, 0xd0, 0x2, 0x0, + 0x1, 0x0, 0x2, 0xd, 0x66, 0x96, 0x7e, 0x0, + 0xb, 0x66, 0x7d, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x10, 0x1c, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0xb, 0x66, 0x6c, 0xd, 0x66, 0x66, 0x6c, 0x0, + 0xb, 0x10, 0x1b, 0xd, 0x0, 0x0, 0x1c, 0x0, + 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, + + /* U+8A72 "該" */ + 0x0, 0x52, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, + 0x0, 0x1e, 0x20, 0x0, 0x0, 0xe3, 0x0, 0x0, + 0x26, 0x6c, 0x68, 0x80, 0x0, 0x42, 0x1, 0x60, + 0x0, 0x0, 0x0, 0x17, 0x67, 0x96, 0x66, 0x71, + 0x4, 0x66, 0x78, 0x0, 0xa, 0x90, 0x10, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x78, 0x0, 0x8c, 0x0, + 0x0, 0x0, 0x12, 0xa, 0xa6, 0x77, 0xe3, 0x0, + 0x5, 0x66, 0x66, 0x7, 0x74, 0x2c, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0xb3, 0x1e, 0x30, + 0xb, 0x66, 0x6e, 0x0, 0x49, 0x10, 0xb9, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0x30, 0x9, 0x90, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xa8, 0x96, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x2b, 0x50, 0xa, 0xa0, + 0xc, 0x10, 0x1c, 0x7, 0x81, 0x0, 0x1, 0xf0, + 0x4, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x20, + + /* U+8A73 "詳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x45, 0x0, 0x1, 0x50, 0x0, 0xb7, 0x0, + 0x0, 0xe, 0x30, 0x10, 0x87, 0x1, 0xd1, 0x0, + 0x27, 0x69, 0x68, 0x80, 0x2d, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x36, 0x68, 0x6b, 0x6a, 0x90, + 0x4, 0x66, 0x79, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x1, 0x0, + 0x0, 0x0, 0x23, 0x4, 0x76, 0xe6, 0x8a, 0x0, + 0x5, 0x66, 0x64, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1, 0x0, 0x2, 0x0, 0x0, 0xe0, 0x0, 0x10, + 0xb, 0x65, 0x6e, 0x47, 0x66, 0xe6, 0x69, 0xa0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xb, 0x10, 0x9, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+8A8C "誌" */ + 0x0, 0x64, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x27, 0x6b, 0x68, 0x70, 0x0, 0xd0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x17, 0x55, 0xe5, 0x59, 0x70, + 0x4, 0x66, 0x78, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x13, 0x4, 0x76, 0x96, 0x79, 0x0, + 0x5, 0x66, 0x65, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x20, 0xb4, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4c, 0x6, 0x0, + 0xb, 0x10, 0x1c, 0x16, 0xd0, 0x1, 0x5, 0xd0, + 0xb, 0x10, 0x1c, 0x86, 0xd0, 0x0, 0x50, 0xb2, + 0xb, 0x66, 0x6c, 0xa1, 0xc2, 0x0, 0xa1, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x5b, 0xcc, 0xa1, 0x0, + 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A8D "認" */ + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xd, 0x30, 0x4, 0x77, 0x86, 0x6d, 0x40, + 0x27, 0x69, 0x68, 0x61, 0x6, 0x70, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x9, 0x50, 0xd, 0x0, + 0x4, 0x66, 0x78, 0x2d, 0xd, 0x0, 0xe, 0x0, + 0x1, 0x10, 0x0, 0x12, 0x68, 0x0, 0x3c, 0x0, + 0x0, 0x0, 0x12, 0x2, 0xb0, 0x38, 0xb7, 0x0, + 0x5, 0x66, 0x64, 0x17, 0x1, 0x43, 0x80, 0x0, + 0x2, 0x0, 0x2, 0x0, 0x20, 0x95, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xd2, 0x4a, 0x14, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0xd0, 0x0, 0x7, 0x80, + 0xb, 0x10, 0x1c, 0xa5, 0xd0, 0x0, 0x60, 0xc0, + 0xb, 0x66, 0x6c, 0x60, 0xc2, 0x0, 0xc1, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0x4b, 0xcc, 0xa1, 0x0, + 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A95 "誕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x4a, 0x4, 0x76, 0xd1, 0x15, 0xad, 0x50, + 0x27, 0x69, 0x97, 0x5, 0xa0, 0x43, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0xc0, 0x0, + 0x5, 0x66, 0xa1, 0x2c, 0x0, 0x60, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x20, 0xc0, 0xd8, 0x50, + 0x4, 0x66, 0xa2, 0xb6, 0xd6, 0xc0, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0xc0, 0xc0, 0x0, + 0x7, 0x66, 0xa5, 0x11, 0xd0, 0xc0, 0xc0, 0x0, + 0xa, 0x10, 0xa3, 0x86, 0x70, 0xc0, 0xc1, 0x0, + 0xa, 0x10, 0xa2, 0x5e, 0x11, 0xc6, 0x98, 0x60, + 0xa, 0x10, 0xa2, 0x6b, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0x66, 0xb4, 0x90, 0x5d, 0xa6, 0x43, 0x30, + 0x5, 0x0, 0x27, 0x0, 0x0, 0x5a, 0xdf, 0x60, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A98 "誘" */ + 0x0, 0x82, 0x0, 0x0, 0x0, 0x37, 0xc6, 0x0, + 0x0, 0x3b, 0x10, 0x5, 0x78, 0xe5, 0x43, 0x0, + 0x27, 0x68, 0x87, 0x0, 0x0, 0xd0, 0x2, 0x10, + 0x0, 0x0, 0x10, 0x66, 0x6a, 0xe7, 0x68, 0x70, + 0x5, 0x66, 0xa1, 0x0, 0x4b, 0xd6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xa0, 0xd0, 0xc3, 0x0, + 0x5, 0x65, 0xa1, 0x76, 0x0, 0xe0, 0x2d, 0x90, + 0x0, 0x0, 0x2, 0x15, 0x66, 0x86, 0x91, 0x10, + 0x8, 0x55, 0xa3, 0x2, 0x4a, 0x2, 0xc1, 0x0, + 0xb, 0x10, 0xb2, 0x0, 0x68, 0x8, 0x62, 0x20, + 0xb, 0x10, 0xb2, 0x0, 0xb4, 0x7, 0x6b, 0x90, + 0xb, 0x10, 0xb2, 0x2, 0xc0, 0x0, 0xa, 0x40, + 0xc, 0x66, 0xc2, 0x1b, 0x20, 0x0, 0xd, 0x10, + 0x6, 0x0, 0x14, 0x81, 0x0, 0x39, 0xc9, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x2, 0x60, 0x0, + + /* U+8A9E "語" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xe, 0x20, 0x37, 0x6b, 0x66, 0x79, 0x0, + 0x26, 0x6b, 0x6a, 0x30, 0x3c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0x55, 0xc1, 0x0, + 0x4, 0x66, 0x77, 0x0, 0x77, 0x0, 0xe0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x95, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x12, 0x11, 0xb5, 0x12, 0xd3, 0x90, + 0x5, 0x66, 0x65, 0x45, 0x55, 0x55, 0x55, 0x50, + 0x0, 0x0, 0x1, 0x4, 0x11, 0x11, 0x26, 0x0, + 0xb, 0x66, 0x6d, 0xb, 0x75, 0x55, 0x7c, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x30, 0x0, 0x3a, 0x0, + 0xb, 0x66, 0x6c, 0xb, 0x76, 0x66, 0x8b, 0x0, + 0xb, 0x10, 0xb, 0xb, 0x20, 0x0, 0x3a, 0x0, + 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAA "說" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x0, 0x0, 0xc, 0x27, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x69, 0x8, 0x10, 0x0, + 0x27, 0x6a, 0x69, 0x70, 0xc0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x7c, 0x20, + 0x4, 0x66, 0x79, 0x54, 0xa6, 0x66, 0x9e, 0x70, + 0x1, 0x0, 0x0, 0x10, 0xd0, 0x0, 0x75, 0x0, + 0x0, 0x0, 0x13, 0x0, 0xd0, 0x0, 0x75, 0x0, + 0x5, 0x66, 0x65, 0x0, 0xd0, 0x0, 0x76, 0x0, + 0x1, 0x0, 0x2, 0x0, 0xe9, 0x7a, 0xa5, 0x0, + 0xb, 0x66, 0x6f, 0x10, 0x1a, 0x2d, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0xc, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x2a, 0xd, 0x0, 0x40, + 0xb, 0x66, 0x6d, 0x0, 0x92, 0xd, 0x0, 0x70, + 0xb, 0x10, 0xc, 0x7, 0x30, 0xa, 0xbc, 0xa0, + 0x1, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAC "説" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0x0, 0x3, 0x40, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xb3, 0x5, 0xb0, 0x0, + 0x27, 0x6b, 0x6a, 0x30, 0x79, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x55, 0x58, 0x58, 0x0, + 0x5, 0x66, 0x6a, 0xd, 0x22, 0x22, 0x4b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x3a, 0x0, + 0x4, 0x66, 0x69, 0xd, 0x0, 0x0, 0x3a, 0x0, + 0x1, 0x10, 0x0, 0xd, 0x55, 0x55, 0x7a, 0x0, + 0x3, 0x0, 0x6, 0xb, 0x3b, 0x1d, 0x33, 0x0, + 0xb, 0x66, 0x6e, 0x0, 0x2a, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xd, 0x0, 0x48, 0xd, 0x0, 0x30, + 0xb, 0x10, 0xd, 0x0, 0xa3, 0xd, 0x0, 0x60, + 0xb, 0x66, 0x6d, 0x5, 0x80, 0xd, 0x0, 0xa0, + 0x9, 0x0, 0x4, 0x77, 0x0, 0xa, 0xbb, 0xd1, + 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAD "読" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x72, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x3a, 0x1, 0x0, 0x1, 0xd0, 0x2, 0x0, + 0x27, 0x68, 0x87, 0x57, 0x66, 0xe6, 0x6a, 0x60, + 0x0, 0x0, 0x10, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x5, 0x66, 0x93, 0x6, 0x66, 0xa6, 0x6a, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x10, + 0x5, 0x66, 0xa3, 0x68, 0x66, 0x66, 0x6a, 0xc0, + 0x0, 0x0, 0x0, 0xd1, 0x41, 0x3, 0x8, 0x10, + 0x8, 0x66, 0xa3, 0x0, 0xa6, 0xe, 0x10, 0x0, + 0xc, 0x10, 0xb2, 0x0, 0xb3, 0xd, 0x0, 0x0, + 0xb, 0x10, 0xb2, 0x0, 0xe0, 0xd, 0x0, 0x40, + 0xb, 0x10, 0xb2, 0x4, 0xa0, 0xd, 0x0, 0x50, + 0xc, 0x66, 0xc2, 0x1c, 0x10, 0xd, 0x2, 0x70, + 0x7, 0x0, 0x22, 0x92, 0x0, 0x9, 0xcd, 0xa0, + 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8AB0 "誰" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0x0, 0x0, 0x69, 0x53, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0xb3, 0xd, 0x40, 0x0, + 0x37, 0x6b, 0x6a, 0x61, 0xc0, 0x4, 0x14, 0x40, + 0x0, 0x0, 0x0, 0x6, 0xc6, 0x6d, 0x66, 0x50, + 0x5, 0x66, 0x78, 0xc, 0xb0, 0x1c, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x66, 0xb0, 0x1c, 0x4, 0x0, + 0x0, 0x0, 0x13, 0x52, 0xc6, 0x6d, 0x68, 0x50, + 0x6, 0x66, 0x65, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x66, 0x6e, 0x2, 0xc6, 0x6d, 0x6b, 0x50, + 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x2, 0xb0, 0x1c, 0x0, 0x0, + 0xb, 0x76, 0x6c, 0x2, 0xb0, 0x1c, 0x3, 0x70, + 0xb, 0x10, 0x1c, 0x2, 0xc6, 0x66, 0x66, 0x50, + 0x4, 0x0, 0x1, 0x1, 0x30, 0x0, 0x0, 0x0, + + /* U+8AB2 "課" */ + 0x0, 0x52, 0x0, 0x4, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x1f, 0x0, 0xd, 0x66, 0xe6, 0x7d, 0x0, + 0x27, 0x6b, 0x6a, 0x2d, 0x0, 0xd0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, + 0x5, 0x66, 0x88, 0xd, 0x0, 0xd0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0xe6, 0x7b, 0x0, + 0x4, 0x66, 0x87, 0x7, 0x0, 0xd0, 0x14, 0x0, + 0x1, 0x0, 0x0, 0x11, 0x11, 0xd1, 0x14, 0x70, + 0x7, 0x66, 0x69, 0x34, 0x3e, 0xe8, 0x33, 0x30, + 0xa, 0x20, 0x3a, 0x0, 0x4a, 0xd8, 0x0, 0x0, + 0xa, 0x20, 0x3a, 0x0, 0xc2, 0xd4, 0x70, 0x0, + 0xa, 0x20, 0x3a, 0x8, 0x50, 0xd0, 0xb3, 0x0, + 0xa, 0x76, 0x7a, 0x66, 0x0, 0xd0, 0x2e, 0x80, + 0x6, 0x10, 0x5, 0x30, 0x0, 0xe0, 0x2, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+8ABF "調" */ + 0x0, 0x83, 0x0, 0x4, 0x0, 0x0, 0x1, 0x60, + 0x0, 0x2f, 0x0, 0xe, 0x66, 0xa8, 0x67, 0xc0, + 0x27, 0x6a, 0x6a, 0x3d, 0x0, 0x84, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xd, 0x17, 0xb8, 0xa4, 0xa0, + 0x5, 0x76, 0x6a, 0xd, 0x0, 0x84, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x84, 0x44, 0xa0, + 0x2, 0x33, 0x37, 0xd, 0x66, 0x66, 0x66, 0xa0, + 0x2, 0x32, 0x22, 0xc, 0x8, 0x66, 0x93, 0xa0, + 0x3, 0x0, 0x4, 0xc, 0xc, 0x1, 0xb3, 0xa0, + 0xc, 0x66, 0x6e, 0x2b, 0xc, 0x1, 0xb3, 0xa0, + 0xb, 0x10, 0x1c, 0x48, 0xd, 0x66, 0xb3, 0xa0, + 0xb, 0x10, 0x1c, 0x83, 0x6, 0x0, 0x43, 0xa0, + 0xc, 0x66, 0x6a, 0xa0, 0x0, 0x3, 0x36, 0x90, + 0x4, 0x0, 0x5, 0x20, 0x0, 0x0, 0x5e, 0x50, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8AC7 "談" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, + 0x0, 0x2f, 0x1, 0x0, 0x5a, 0x30, 0x4e, 0x20, + 0x37, 0x69, 0x6a, 0x34, 0x8a, 0x39, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x3b, 0xb2, 0x0, 0x0, + 0x6, 0x66, 0x97, 0x1, 0x1f, 0x77, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x1, 0xb9, 0x0, + 0x5, 0x66, 0x96, 0x19, 0x58, 0x60, 0xb, 0x0, + 0x1, 0x0, 0x0, 0x20, 0x9, 0x60, 0x2, 0x0, + 0x3, 0x0, 0x5, 0x0, 0x7b, 0x70, 0x9e, 0x10, + 0xb, 0x66, 0x6e, 0x1c, 0x4d, 0x99, 0x40, 0x0, + 0xb, 0x10, 0x1c, 0x26, 0x2c, 0x72, 0x0, 0x0, + 0xb, 0x10, 0x1c, 0x0, 0xa5, 0x1b, 0x0, 0x0, + 0xb, 0x66, 0x6c, 0x4, 0xa0, 0x9, 0xa1, 0x0, + 0xc, 0x10, 0x9, 0x58, 0x0, 0x0, 0xce, 0x81, + 0x2, 0x0, 0x5, 0x30, 0x0, 0x0, 0x7, 0x20, + + /* U+8ACB "請" */ + 0x0, 0x63, 0x0, 0x0, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xd0, 0x3, 0x10, + 0x26, 0x5a, 0x5a, 0x47, 0x66, 0xe6, 0x68, 0x60, + 0x0, 0x0, 0x0, 0x5, 0x66, 0xe6, 0x6b, 0x10, + 0x5, 0x76, 0x7a, 0x1, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x66, 0xe6, 0x69, 0xc0, + 0x0, 0x0, 0x14, 0x11, 0x0, 0x0, 0x2, 0x0, + 0x5, 0x66, 0x65, 0xb, 0x66, 0x66, 0x6e, 0x10, + 0x1, 0x0, 0x2, 0xb, 0x21, 0x11, 0x1d, 0x0, + 0xb, 0x66, 0x6e, 0xb, 0x65, 0x55, 0x5d, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x76, 0x66, 0x6d, 0x0, + 0xb, 0x10, 0x1c, 0xb, 0x20, 0x0, 0xd, 0x0, + 0xb, 0x66, 0x6c, 0xb, 0x20, 0x0, 0xd, 0x0, + 0x8, 0x0, 0x6, 0xb, 0x20, 0x18, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x41, 0x0, + + /* U+8AD6 "論" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x61, 0x0, 0x0, 0x2, 0xc1, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x27, 0x6b, 0x6c, 0x30, 0x2d, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb3, 0x9, 0x30, 0x0, + 0x3, 0x44, 0x92, 0xa, 0x40, 0x3, 0xd5, 0x0, + 0x2, 0x22, 0x22, 0x93, 0x76, 0x6a, 0x7d, 0xb1, + 0x0, 0x0, 0x44, 0x2, 0x0, 0x0, 0x4, 0x10, + 0x5, 0x66, 0x62, 0xd, 0x6c, 0x6c, 0x6d, 0x20, + 0x1, 0x0, 0x20, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x65, 0xd5, 0xd, 0x6d, 0x6d, 0x6d, 0x0, + 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x10, 0xb1, 0xc, 0xc, 0xc, 0xc, 0x0, + 0xa, 0x66, 0xc1, 0xc, 0xb, 0x9, 0xc, 0x0, + 0xb, 0x10, 0xa1, 0xc, 0x0, 0x4, 0x9e, 0x0, + 0x3, 0x0, 0x10, 0x2, 0x0, 0x0, 0x34, 0x0, + + /* U+8AF8 "諸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0x1, 0x0, 0xd, 0x0, 0xb, 0x70, + 0x27, 0x68, 0x78, 0x26, 0x6e, 0x6c, 0x6d, 0x0, + 0x0, 0x0, 0x10, 0x2, 0xd, 0x0, 0xc3, 0x0, + 0x5, 0x66, 0xa2, 0x0, 0xd, 0x9, 0x61, 0x10, + 0x0, 0x0, 0x1, 0x76, 0x6a, 0xad, 0x69, 0x90, + 0x5, 0x66, 0xb1, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xa7, 0x0, 0x5, 0x0, + 0x3, 0x0, 0x40, 0x1d, 0x76, 0x66, 0x8d, 0x0, + 0xa, 0x76, 0xc8, 0x6b, 0x20, 0x0, 0x3a, 0x0, + 0xa, 0x20, 0xb2, 0xb, 0x76, 0x66, 0x7a, 0x0, + 0xa, 0x20, 0xb2, 0xb, 0x20, 0x0, 0x3a, 0x0, + 0xa, 0x75, 0xc2, 0xb, 0x76, 0x66, 0x7a, 0x0, + 0x7, 0x10, 0x61, 0xa, 0x10, 0x0, 0x28, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B02 "謂" */ + 0x0, 0x56, 0x0, 0x3, 0x0, 0x0, 0x1, 0x30, + 0x0, 0xe, 0x31, 0xe, 0x66, 0xe6, 0x69, 0xb0, + 0x37, 0x59, 0x58, 0x5d, 0x0, 0xd0, 0x5, 0x80, + 0x0, 0x0, 0x1, 0xd, 0x66, 0xe6, 0x69, 0x80, + 0x6, 0x66, 0x6a, 0xd, 0x0, 0xd0, 0x5, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x86, 0x69, 0x70, + 0x5, 0x66, 0x6b, 0x4, 0x10, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb6, 0x66, 0x6e, 0x10, + 0x7, 0x66, 0x6a, 0x4, 0xb5, 0x55, 0x5d, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xb, 0x10, 0xd, 0x4, 0xb6, 0x66, 0x6d, 0x0, + 0xb, 0x10, 0xd, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xc, 0x66, 0x6d, 0x4, 0x80, 0x0, 0xd, 0x0, + 0xa, 0x0, 0x9, 0x4, 0x80, 0x17, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, + + /* U+8B1B "講" */ + 0x0, 0x61, 0x0, 0x0, 0x83, 0x4, 0x60, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0xa2, 0x5, 0x62, 0x40, + 0x26, 0x5b, 0x69, 0x66, 0xc7, 0x69, 0xa6, 0x50, + 0x0, 0x0, 0x0, 0x16, 0xc7, 0x69, 0xa9, 0x30, + 0x5, 0x66, 0xb2, 0x2, 0xa2, 0x5, 0x60, 0x20, + 0x0, 0x0, 0x1, 0x76, 0x96, 0x77, 0x86, 0xa2, + 0x2, 0x33, 0x81, 0x2, 0x0, 0xd1, 0x4, 0x0, + 0x3, 0x33, 0x31, 0xc, 0x66, 0xd6, 0x6d, 0x0, + 0x4, 0x11, 0x60, 0xc, 0x0, 0xc0, 0xb, 0x0, + 0xc, 0x55, 0xd2, 0xc, 0x66, 0xd6, 0x6b, 0x0, + 0xc, 0x0, 0xc0, 0xc, 0x0, 0xc0, 0xb, 0x50, + 0xc, 0x0, 0xc1, 0x7d, 0x66, 0x76, 0x6d, 0x61, + 0xc, 0x66, 0xd0, 0xc, 0x0, 0x0, 0xb, 0x0, + 0x9, 0x0, 0x50, 0xc, 0x0, 0x6, 0xba, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x42, 0x0, + + /* U+8B1D "謝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x3, 0xa0, 0x0, 0x9, 0x0, + 0x0, 0x6a, 0x0, 0x6, 0x22, 0x0, 0xc, 0x0, + 0x26, 0x7a, 0x96, 0xc7, 0x6d, 0x10, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x20, + 0x5, 0x66, 0xa0, 0xc6, 0x6d, 0x47, 0x6e, 0x90, + 0x1, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x50, 0xc6, 0x6d, 0x34, 0xc, 0x0, + 0x5, 0x66, 0x61, 0xc0, 0xc, 0xb, 0x4c, 0x0, + 0x2, 0x0, 0x25, 0xb5, 0x8d, 0x5, 0x5c, 0x0, + 0xa, 0x66, 0xd1, 0x1, 0xcc, 0x0, 0xc, 0x0, + 0xa, 0x10, 0xc0, 0x9, 0x3c, 0x0, 0xc, 0x0, + 0xa, 0x10, 0xc0, 0x47, 0xc, 0x0, 0xc, 0x0, + 0xa, 0x66, 0xd3, 0x70, 0xc, 0x1, 0x1c, 0x0, + 0x7, 0x0, 0x44, 0x3, 0xbd, 0x5, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x20, 0x0, + + /* U+8B58 "識" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x0, 0x0, 0x80, 0x0, 0xa2, 0x0, 0x0, + 0xb5, 0x0, 0x8, 0x52, 0xb, 0x11, 0x2, 0x6a, + 0x7a, 0x57, 0x66, 0x93, 0xb0, 0xa4, 0x0, 0x0, + 0x1, 0x80, 0xd, 0x2b, 0x3, 0x80, 0x56, 0x78, + 0xb, 0x34, 0x50, 0xb0, 0x0, 0x0, 0x0, 0x5, + 0x86, 0xa6, 0x6d, 0x6c, 0x50, 0x22, 0x46, 0x11, + 0x0, 0x10, 0xb0, 0x61, 0x4, 0x44, 0x30, 0xd6, + 0x6d, 0xa, 0x1e, 0x20, 0x30, 0x15, 0xc, 0x0, + 0xc0, 0x97, 0xa0, 0xc, 0x55, 0xd0, 0xd6, 0x6c, + 0x6, 0xe3, 0x0, 0xc0, 0xc, 0xc, 0x0, 0xc0, + 0x5d, 0x2, 0xc, 0x0, 0xc0, 0xc0, 0xc, 0xd, + 0xd1, 0x60, 0xc6, 0x6c, 0xd, 0x66, 0xb8, 0x53, + 0xb9, 0xa, 0x0, 0x90, 0x40, 0x6, 0x50, 0x6, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x2, + + /* U+8B70 "議" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, 0x0, 0x0, 0x84, 0x2, 0xd0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x1d, 0x7, 0x25, 0x0, + 0x37, 0x69, 0x89, 0x37, 0x67, 0xc6, 0x67, 0x40, + 0x0, 0x0, 0x0, 0x2, 0x33, 0xc3, 0x64, 0x0, + 0x5, 0x66, 0xa0, 0x2, 0x43, 0xc3, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x55, 0xc5, 0x59, 0x90, + 0x4, 0x66, 0xa0, 0x0, 0x6, 0x37, 0x21, 0x0, + 0x1, 0x0, 0x0, 0x47, 0xe6, 0x49, 0x1c, 0x0, + 0x5, 0x22, 0x71, 0x0, 0xc0, 0x1a, 0x4, 0x50, + 0xc, 0x44, 0xd3, 0x76, 0xd6, 0x6d, 0x67, 0x70, + 0xc, 0x0, 0xc0, 0x0, 0xc5, 0x2b, 0x2d, 0x0, + 0xc, 0x0, 0xc1, 0xaa, 0xd0, 0x8, 0xc2, 0x0, + 0xc, 0x66, 0xd0, 0x20, 0xc0, 0x1b, 0xc1, 0x40, + 0x8, 0x0, 0x70, 0x39, 0xe4, 0x70, 0x4d, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x1, 0x70, + + /* U+8B77 "護" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x82, 0x0, 0x0, 0x85, 0x9, 0x40, 0x0, + 0x0, 0x2c, 0x1, 0x56, 0xa8, 0x6b, 0x87, 0xc0, + 0x37, 0x69, 0x79, 0x21, 0x75, 0x28, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0xd1, 0x3, 0x0, + 0x6, 0x65, 0xa1, 0x1f, 0x55, 0xc5, 0x5a, 0x30, + 0x0, 0x0, 0x0, 0x9d, 0x66, 0xd6, 0x78, 0x0, + 0x4, 0x55, 0xa5, 0x3c, 0x0, 0xc0, 0x13, 0x0, + 0x1, 0x11, 0x10, 0xc, 0x66, 0xd6, 0x67, 0x0, + 0x6, 0x33, 0x81, 0xc, 0x66, 0xa6, 0x69, 0x90, + 0xc, 0x22, 0xc1, 0x38, 0x66, 0x66, 0xa2, 0x0, + 0xc, 0x0, 0xc0, 0x1, 0x60, 0x4, 0xc3, 0x0, + 0xc, 0x0, 0xc0, 0x0, 0x28, 0x4a, 0x0, 0x0, + 0xc, 0x66, 0xd0, 0x0, 0xb, 0xe1, 0x0, 0x0, + 0xa, 0x0, 0x80, 0x6, 0xb4, 0x6e, 0x84, 0x20, + 0x0, 0x0, 0x5, 0x73, 0x0, 0x3, 0xae, 0x80, + + /* U+8B8A "變" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x10, 0x8, 0x40, 0x0, 0x86, 0x0, + 0x0, 0xa6, 0x12, 0x76, 0x6a, 0x22, 0xc1, 0x0, + 0x9, 0x80, 0xc1, 0x56, 0x6a, 0x4d, 0x17, 0x50, + 0x6, 0x38, 0x30, 0x20, 0x4, 0x25, 0x38, 0x0, + 0x0, 0x54, 0x61, 0x88, 0x78, 0x1, 0x91, 0x60, + 0x4, 0xb2, 0x28, 0x86, 0x6b, 0xc, 0x50, 0xb0, + 0x0, 0x10, 0x40, 0xa1, 0xb, 0x2, 0x1, 0x0, + 0x2, 0x49, 0x48, 0x96, 0x69, 0x7, 0x63, 0xb0, + 0x9, 0x17, 0x3a, 0x0, 0x0, 0x35, 0x85, 0x50, + 0x0, 0x0, 0xc9, 0x66, 0x66, 0xc8, 0x74, 0x0, + 0x0, 0x9, 0x34, 0x20, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x61, 0x0, 0x83, 0x3c, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xb6, 0x8c, 0x63, 0x10, 0x0, + 0x1, 0x57, 0x85, 0x0, 0x1, 0x8c, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B93 "讓" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x56, 0x66, 0xe6, 0x6a, 0xb0, + 0x38, 0x8a, 0xa7, 0x12, 0x2, 0x1, 0x2, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x6d, 0x2c, 0x6d, 0x20, + 0x5, 0x65, 0xa1, 0xc, 0x6c, 0xc, 0x6c, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x43, 0x6, 0x3, 0x0, + 0x0, 0x0, 0x50, 0x22, 0x85, 0x29, 0x59, 0x30, + 0x6, 0x66, 0x50, 0x44, 0x95, 0x4a, 0x54, 0x20, + 0x3, 0x0, 0x30, 0x7, 0xa7, 0x6b, 0x7a, 0x20, + 0xb, 0x66, 0xc3, 0x0, 0x72, 0x8, 0x22, 0x70, + 0xb, 0x0, 0xb0, 0x76, 0x9d, 0xa6, 0x6a, 0x50, + 0xb, 0x0, 0xb0, 0x3, 0xe1, 0x56, 0x85, 0x0, + 0xb, 0x66, 0xc1, 0x78, 0xa0, 0x3a, 0xa1, 0x0, + 0x6, 0x0, 0x5, 0x10, 0xba, 0x20, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, + + /* U+8BA1 "计" */ + 0x0, 0x42, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x3, 0xa0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x1, 0x66, 0xc4, + 0x36, 0x66, 0xd8, 0x66, 0xc7, 0x0, 0xd, 0x0, + 0x10, 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0xd, 0x5, 0x20, 0xb, + 0x30, 0x0, 0x0, 0x0, 0xd7, 0x60, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, + + /* U+8C50 "豐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x10, 0xb0, 0xc2, 0xa, 0x3, 0x0, 0x0, + 0xb1, 0x2d, 0x7c, 0x26, 0xd6, 0xc1, 0x0, 0xb, + 0x12, 0xb1, 0xc0, 0xb, 0x1c, 0x0, 0x0, 0xb2, + 0x7d, 0x5c, 0x37, 0xd6, 0xc0, 0x0, 0xb, 0x26, + 0xd7, 0xc2, 0x6d, 0x7c, 0x0, 0x0, 0xd0, 0x1b, + 0xc, 0x1, 0xb0, 0xc0, 0x0, 0x8, 0x66, 0x66, + 0x66, 0x66, 0x67, 0x0, 0x2, 0x76, 0x66, 0x66, + 0x66, 0x66, 0xa9, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x5, 0xb6, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0xb0, 0x0, 0x0, 0x6, 0xa8, 0x66, 0x67, 0x9a, + 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x79, 0x0, + 0x10, 0x5, 0x66, 0x68, 0xa6, 0x6b, 0x66, 0x6e, + 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8C61 "象" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xe6, 0x66, 0xab, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x29, 0x10, 0x0, 0x0, 0x8, 0xe6, + 0x66, 0x6b, 0x66, 0x6d, 0x10, 0x5, 0x1d, 0x0, + 0xa, 0x50, 0x0, 0xe0, 0x0, 0x0, 0xd6, 0x66, + 0xf6, 0x66, 0x6e, 0x0, 0x0, 0x9, 0x0, 0xaa, + 0x0, 0x0, 0x80, 0x0, 0x0, 0x1, 0xa5, 0x85, + 0x3, 0xc9, 0x10, 0x0, 0x5, 0x71, 0x6a, 0xb7, + 0x80, 0x0, 0x0, 0x4, 0x1, 0x97, 0x1c, 0x76, + 0x20, 0x0, 0x0, 0x16, 0x81, 0x1b, 0x6b, 0xc, + 0x20, 0x0, 0x14, 0x0, 0x6a, 0x13, 0xb0, 0x3e, + 0x71, 0x0, 0x5, 0x95, 0x10, 0x79, 0x0, 0x3d, + 0xa1, 0x46, 0x20, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + + /* U+8CA0 "負" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0x76, 0x6a, 0x80, 0x0, 0x0, 0x3, 0xd2, + 0x0, 0x1d, 0x50, 0x0, 0x0, 0x3b, 0x10, 0x0, + 0x82, 0x0, 0x0, 0x5, 0x76, 0x33, 0x35, 0x63, + 0x39, 0x0, 0x1, 0xd, 0x33, 0x33, 0x33, 0x3e, + 0x10, 0x0, 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0x7, 0x28, 0x0, + 0x5, 0x18, 0x0, 0x0, 0x3, 0xd7, 0x0, 0x1, + 0xab, 0x20, 0x0, 0x78, 0x10, 0x0, 0x0, 0x7, + 0xe0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+8CA1 "財" */ + 0x2, 0x0, 0x3, 0x0, 0x0, 0x1, 0xa0, 0x0, + 0xb, 0x76, 0x6d, 0x40, 0x0, 0x1, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x1, 0xc1, 0x70, + 0xa, 0x76, 0x6d, 0x16, 0x66, 0x6e, 0xd6, 0x61, + 0xa, 0x20, 0xc, 0x10, 0x0, 0x4c, 0xc0, 0x0, + 0xa, 0x76, 0x6d, 0x10, 0x0, 0xc3, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x7, 0x81, 0xc0, 0x0, + 0xa, 0x20, 0xc, 0x10, 0x3b, 0x1, 0xc0, 0x0, + 0xa, 0x76, 0x6d, 0x11, 0xa0, 0x1, 0xc0, 0x0, + 0x8, 0x20, 0x6, 0x18, 0x0, 0x1, 0xc0, 0x0, + 0x0, 0xb6, 0x37, 0x40, 0x0, 0x1, 0xc0, 0x0, + 0x5, 0x90, 0x9, 0x60, 0x0, 0x1, 0xc0, 0x0, + 0x28, 0x0, 0x2, 0x80, 0x2, 0x8e, 0xa0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, + + /* U+8CA7 "貧" */ + 0x0, 0x0, 0x37, 0x0, 0x25, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x40, 0x0, 0x73, 0x0, 0x0, 0x0, + 0x49, 0x10, 0x0, 0x0, 0xb9, 0x30, 0x1, 0x54, + 0x37, 0xc9, 0x66, 0x6e, 0x7c, 0xc2, 0x0, 0x0, + 0x79, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3, 0x94, + 0x0, 0x16, 0xb6, 0x0, 0x0, 0x4, 0x48, 0x66, + 0x66, 0x69, 0x6a, 0x0, 0x0, 0x1, 0xb0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x1, 0xc6, 0x76, 0x66, 0x66, + 0xa0, 0x0, 0x0, 0x1, 0x7d, 0x20, 0x5, 0x89, + 0x30, 0x0, 0x6, 0xa5, 0x0, 0x0, 0x0, 0x3d, + 0x50, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, + + /* U+8CA9 "販" */ + 0x1, 0x10, 0x0, 0x30, 0x0, 0x0, 0x39, 0x50, + 0x3, 0xc6, 0x66, 0xe0, 0x86, 0x79, 0x86, 0x40, + 0x2, 0xa0, 0x0, 0xd0, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xb4, 0x44, 0xd0, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xb1, 0x11, 0xd0, 0xd6, 0x66, 0x6a, 0x10, + 0x2, 0xa0, 0x0, 0xd0, 0xc3, 0x20, 0x1d, 0x0, + 0x2, 0xc6, 0x66, 0xd0, 0xc0, 0x60, 0x49, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xc0, 0x80, 0x84, 0x0, + 0x2, 0xa0, 0x0, 0xd0, 0xb0, 0x81, 0xd0, 0x0, + 0x2, 0xc6, 0x66, 0xd1, 0x90, 0x3b, 0x80, 0x0, + 0x2, 0x71, 0x20, 0x75, 0x50, 0xf, 0x20, 0x0, + 0x0, 0x6b, 0x2b, 0x8, 0x0, 0x96, 0xc0, 0x0, + 0x0, 0xb1, 0x9, 0x47, 0x8, 0x30, 0x6d, 0x20, + 0x7, 0x20, 0x0, 0x51, 0x61, 0x0, 0x7, 0xa1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CAC "責" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x1, 0x0, 0x2, + 0x66, 0x66, 0x6e, 0x66, 0x67, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x50, 0x0, 0x0, 0x27, + 0x66, 0x6e, 0x66, 0x68, 0x30, 0x0, 0x22, 0x22, + 0x22, 0xe2, 0x22, 0x25, 0xb0, 0x15, 0x55, 0x44, + 0x44, 0x44, 0x48, 0x44, 0x10, 0x3, 0xc6, 0x66, + 0x66, 0x66, 0xd3, 0x0, 0x0, 0x3c, 0x66, 0x66, + 0x66, 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x3c, 0x66, 0x66, 0x66, + 0x6d, 0x10, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x39, 0x6b, 0x66, 0x76, 0x69, + 0x10, 0x0, 0x0, 0x1b, 0xc2, 0x2, 0x8a, 0x71, + 0x0, 0x0, 0x7a, 0x30, 0x0, 0x0, 0x9, 0xe0, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8CB7 "買" */ + 0x3, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0xb7, + 0x67, 0xc6, 0x6e, 0x66, 0xe3, 0xb, 0x20, 0x3a, + 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x3, 0xa0, 0xd, + 0x0, 0xd0, 0x9, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0x0, 0x6, 0x66, 0x66, 0x66, 0x6c, 0x20, 0x0, + 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x9, 0x96, + 0x66, 0x66, 0x6e, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x9, 0x96, 0x66, 0x66, 0x6e, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x8, 0x88, 0x76, 0x66, 0x6a, 0x0, 0x0, 0x4, + 0xe8, 0x0, 0x38, 0x93, 0x0, 0x29, 0x81, 0x0, + 0x0, 0x2, 0xc6, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+8CB8 "貸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa9, 0xb, 0x48, 0x50, 0x0, 0x0, + 0x0, 0xa8, 0x0, 0x85, 0x1c, 0x2, 0x0, 0x0, + 0xae, 0x15, 0x58, 0xc6, 0x66, 0xc2, 0x4, 0x71, + 0xd0, 0x0, 0x9, 0x40, 0x0, 0x10, 0x10, 0xd, + 0x0, 0x0, 0x1c, 0x40, 0x4, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0x1c, 0xb8, 0x50, 0x0, 0x39, 0x66, + 0x66, 0x66, 0x6f, 0x96, 0x0, 0x3, 0xa0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3c, 0x66, 0x66, + 0x66, 0x6d, 0x0, 0x0, 0x3, 0xc6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x3, 0xb6, 0x86, 0x66, 0x66, + 0xa0, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x5, 0x98, + 0x20, 0x0, 0x7, 0xa4, 0x0, 0x0, 0x0, 0x5f, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+8CBB "費" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb2, 0xb, 0x10, 0x0, 0x0, 0x1, + 0x76, 0x6d, 0x66, 0xd6, 0x6c, 0x30, 0x0, 0x3, + 0x0, 0xc0, 0xc, 0x0, 0xc0, 0x0, 0x0, 0xe8, + 0x6d, 0x66, 0xd6, 0x69, 0x0, 0x0, 0x2e, 0x66, + 0xc6, 0x6d, 0x66, 0x66, 0xd0, 0x0, 0x1, 0xa2, + 0x0, 0xc0, 0x2, 0x68, 0x0, 0x15, 0x71, 0x0, + 0x8, 0x0, 0x7a, 0x10, 0x2, 0x1d, 0x66, 0x66, + 0x66, 0x7d, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x67, 0xb0, 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, 0x67, + 0xb0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, 0x7b, + 0x0, 0x0, 0x0, 0x4c, 0x50, 0x4, 0x78, 0x40, + 0x0, 0x1, 0x8a, 0x30, 0x0, 0x0, 0x2b, 0xa0, + 0x1, 0x51, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8CBF "貿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x40, 0x0, 0x0, 0x10, 0x2, 0xa6, + 0x40, 0x17, 0x88, 0x66, 0xc7, 0x2, 0xa0, 0x28, + 0x0, 0x85, 0x0, 0xb2, 0x2, 0xa0, 0x1a, 0x80, + 0xc1, 0x0, 0xd0, 0x4, 0xc9, 0x61, 0x48, 0x61, + 0x68, 0xb0, 0x1, 0x80, 0x0, 0x65, 0x0, 0x8, + 0x20, 0x0, 0x9, 0x67, 0x66, 0x66, 0x6c, 0x10, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xe, 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x66, 0x6e, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x68, 0x66, + 0x66, 0x6c, 0x0, 0x0, 0x1, 0xac, 0x10, 0x6, + 0xa7, 0x10, 0x0, 0x5a, 0x40, 0x0, 0x0, 0x7, + 0xe0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+8CC3 "賃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x25, 0x95, 0x0, 0x0, + 0x2d, 0x24, 0x57, 0xd7, 0x55, 0x40, 0x0, 0x1c, + 0xa0, 0x0, 0xc, 0x10, 0x2, 0x40, 0x19, 0x3b, + 0x56, 0x66, 0xd6, 0x66, 0x77, 0x1, 0x1, 0xb0, + 0x0, 0xc, 0x10, 0x3, 0x0, 0x0, 0x18, 0x6, + 0x66, 0x96, 0x67, 0x90, 0x0, 0x1, 0x96, 0x66, + 0x66, 0x66, 0xc1, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x1, 0xd6, 0x66, 0x66, + 0x66, 0xd0, 0x0, 0x0, 0x1d, 0x66, 0x66, 0x66, + 0x6d, 0x0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x1c, 0x67, 0x66, 0x66, 0x6b, + 0x0, 0x0, 0x0, 0x1b, 0xa0, 0x2, 0x69, 0x50, + 0x0, 0x0, 0x6a, 0x30, 0x0, 0x0, 0x19, 0xb0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+8CC7 "資" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x54, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x51, 0xd7, 0x66, 0x66, 0xa0, 0x0, 0x1, + 0x62, 0x57, 0x7, 0x40, 0x64, 0x0, 0x24, 0x84, + 0x19, 0x0, 0xe7, 0x2, 0x0, 0x0, 0x6a, 0x3, + 0x0, 0x88, 0x66, 0x0, 0x0, 0x5, 0x80, 0x0, + 0x79, 0x0, 0xaa, 0x41, 0x0, 0x68, 0x13, 0x73, + 0x0, 0x0, 0x9c, 0x50, 0x0, 0x2d, 0x66, 0x66, + 0x66, 0x7e, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, + 0x67, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x2, 0xd6, 0x66, 0x66, 0x67, + 0xc0, 0x0, 0x0, 0x2d, 0x76, 0x66, 0x66, 0x7c, + 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, 0x59, 0x71, + 0x0, 0x0, 0x7a, 0x40, 0x0, 0x0, 0x6, 0xe0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+8CEA "質" */ + 0x0, 0x0, 0x3, 0x80, 0x0, 0x17, 0x70, 0x0, + 0x96, 0x76, 0x51, 0xb6, 0x86, 0x40, 0x0, 0xa3, + 0x0, 0x51, 0xd0, 0x0, 0x61, 0x0, 0xb7, 0x6e, + 0x63, 0xe6, 0x9a, 0x63, 0x1, 0xc0, 0xc, 0x4, + 0x90, 0x57, 0x0, 0x9, 0x20, 0xd, 0x1a, 0x0, + 0x57, 0x0, 0x41, 0x28, 0x67, 0xa6, 0x66, 0xa3, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x2d, 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x2d, + 0x66, 0x66, 0x66, 0xd2, 0x0, 0x0, 0x2d, 0x66, + 0x66, 0x66, 0xc2, 0x0, 0x0, 0x1, 0x8b, 0x0, + 0x27, 0x83, 0x0, 0x0, 0x4a, 0x60, 0x0, 0x0, + 0x3d, 0x60, 0x4, 0x30, 0x0, 0x0, 0x0, 0x1, + 0x40, + + /* U+8CFD "賽" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x66, 0x66, 0x6a, 0x86, 0x66, 0x6a, 0x10, + 0x4, 0xc0, 0x6, 0x30, 0x9, 0x10, 0x57, 0x0, + 0x0, 0x37, 0x6b, 0x86, 0x6d, 0x67, 0x90, 0x0, + 0x0, 0x4, 0x4a, 0x74, 0x4d, 0x46, 0x60, 0x0, + 0x0, 0x3, 0x19, 0x41, 0x1c, 0x11, 0x26, 0x0, + 0x3, 0x76, 0x7e, 0x66, 0x69, 0x76, 0x66, 0x10, + 0x0, 0x3, 0xf3, 0x11, 0x11, 0xc6, 0x0, 0x0, + 0x2, 0x76, 0xc4, 0x44, 0x44, 0xba, 0xd9, 0x71, + 0x13, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x6, 0x30, + 0x0, 0x0, 0xc6, 0x66, 0x66, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x66, 0x66, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x57, 0x80, 0x4, 0x70, 0x0, 0x0, + 0x0, 0x3, 0x96, 0x0, 0x0, 0x3d, 0x70, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+8D64 "赤" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x66, 0x66, 0xe6, 0x66, 0xc7, 0x0, 0x0, 0x11, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x36, 0x66, 0x66, + 0x6e, 0x66, 0x66, 0x6e, 0x40, 0x10, 0x0, 0xe0, + 0x2, 0xb0, 0x0, 0x0, 0x0, 0x5c, 0xe, 0x0, + 0x2b, 0x50, 0x0, 0x0, 0xc, 0x51, 0xc0, 0x2, + 0xb1, 0xa2, 0x0, 0x5, 0x70, 0x59, 0x0, 0x2b, + 0x2, 0xe2, 0x1, 0x70, 0xb, 0x30, 0x2, 0xb0, + 0x9, 0x80, 0x40, 0x4, 0xa0, 0x0, 0x2b, 0x0, + 0x12, 0x0, 0x2, 0x90, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x5, 0x60, 0x0, 0x29, 0xf9, 0x0, 0x0, + 0x2, 0x10, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+8D70 "走" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x1, 0x0, 0x0, + 0x0, 0x16, 0x66, 0x6d, 0x76, 0x6d, 0x80, 0x0, + 0x0, 0x1, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x1, 0x0, + 0x16, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x8f, 0x30, + 0x1, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0xb, 0x20, 0x3, 0x70, 0x0, + 0x0, 0xa, 0x50, 0xb, 0x76, 0x66, 0x61, 0x0, + 0x0, 0xe, 0x60, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x9, 0x2b, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x1, 0xbf, 0x85, 0x43, 0x33, 0x40, + 0x8, 0x10, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0x20, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D77 "起" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x56, 0x6d, 0x6d, 0x17, 0x66, 0x6e, 0x10, + 0x0, 0x10, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x3, 0x66, 0x6d, 0x6b, 0x78, 0x66, 0x6e, 0x0, + 0x1, 0x10, 0xd, 0x10, 0xd, 0x0, 0x8, 0x0, + 0x0, 0x44, 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x79, 0xd, 0x7, 0xd, 0x0, 0x0, 0x50, + 0x0, 0x94, 0xd, 0x66, 0x2d, 0x0, 0x0, 0x70, + 0x0, 0xb4, 0xd, 0x0, 0xc, 0x21, 0x12, 0xd1, + 0x0, 0xb7, 0x3d, 0x0, 0x3, 0x9a, 0xa9, 0x60, + 0x2, 0x70, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x10, 0x6, 0xd9, 0x53, 0x22, 0x23, 0x42, + 0x6, 0x0, 0x0, 0x4, 0x8a, 0xce, 0xee, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D85 "超" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xd0, 0x0, 0x67, 0xb6, 0x6a, 0x80, + 0x3, 0x66, 0xe6, 0xb5, 0x0, 0xe0, 0x9, 0x50, + 0x0, 0x10, 0xd0, 0x0, 0x3, 0xa0, 0xa, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0x9, 0x30, 0xc, 0x10, + 0x5, 0x66, 0xe6, 0xb8, 0x38, 0x2, 0xcc, 0x0, + 0x2, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x71, 0xd0, 0x1, 0x3a, 0x66, 0x6d, 0x40, + 0x0, 0xe0, 0xd0, 0x26, 0x2b, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0xd6, 0x65, 0x3b, 0x0, 0xd, 0x0, + 0x2, 0xb0, 0xd0, 0x0, 0x2b, 0x0, 0xd, 0x0, + 0x4, 0x77, 0xd0, 0x0, 0x2d, 0x66, 0x6e, 0x0, + 0x8, 0x13, 0xe1, 0x0, 0x38, 0x0, 0x5, 0x0, + 0x7, 0x0, 0x2a, 0xa5, 0x31, 0x11, 0x1, 0x10, + 0x32, 0x0, 0x0, 0x26, 0x9b, 0xde, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D8A "越" */ + 0x0, 0x0, 0xa0, 0x0, 0x0, 0x83, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa2, 0x86, 0x0, + 0x3, 0x55, 0xd5, 0xc3, 0x0, 0xa2, 0x1b, 0x0, + 0x1, 0x21, 0xd1, 0x10, 0x96, 0xc7, 0x6b, 0x80, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x93, 0x0, 0x0, + 0x16, 0x66, 0xd6, 0x98, 0xd0, 0x84, 0xd, 0x10, + 0x0, 0x0, 0xb2, 0x0, 0xd0, 0x66, 0x5a, 0x0, + 0x0, 0xb3, 0xc1, 0x0, 0xd0, 0x3a, 0xb1, 0x0, + 0x0, 0xd1, 0xc6, 0xa7, 0xd2, 0x2e, 0x80, 0x30, + 0x0, 0xe0, 0xc1, 0x0, 0xe7, 0x1d, 0x80, 0x70, + 0x2, 0xd1, 0xc1, 0x0, 0x60, 0xa2, 0xb8, 0x80, + 0x5, 0x68, 0xd1, 0x0, 0x18, 0x10, 0xb, 0x90, + 0x8, 0x0, 0x7b, 0x73, 0x40, 0x0, 0x0, 0x30, + 0x16, 0x0, 0x1, 0x6b, 0xde, 0xee, 0xff, 0x80, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+8DA3 "趣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x12, 0x66, 0x66, 0xb5, 0x0, 0x0, 0x0, + 0xa2, 0x71, 0xc0, 0xc0, 0x0, 0x20, 0x5, 0x6c, + 0x65, 0xc, 0xc, 0x27, 0x6b, 0x60, 0x0, 0xa1, + 0x0, 0xd5, 0xd0, 0x0, 0xc0, 0x26, 0x6c, 0x69, + 0x7c, 0xc, 0x5, 0xc, 0x0, 0x10, 0x66, 0x0, + 0xc0, 0xc0, 0x39, 0x80, 0x4, 0x46, 0x50, 0xd, + 0x6d, 0x0, 0xb4, 0x0, 0x77, 0x69, 0xa3, 0xc0, + 0xc0, 0x1a, 0xb0, 0x8, 0x46, 0x50, 0xc, 0x6d, + 0x58, 0x2a, 0x40, 0xa4, 0x65, 0x1d, 0x82, 0xc2, + 0x40, 0x44, 0xa, 0x4b, 0x50, 0x0, 0xc, 0x10, + 0x0, 0x1, 0x60, 0x3a, 0x73, 0x10, 0x40, 0x0, + 0x12, 0x40, 0x0, 0x3, 0x8c, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DB3 "足" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x66, 0x66, 0x6c, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x67, 0xb6, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x2, 0xb0, 0x2, 0x0, 0x0, + 0x0, 0x2, 0x30, 0x2, 0xb0, 0x0, 0x20, 0x0, + 0x0, 0x6, 0xd0, 0x2, 0xd6, 0x67, 0xd3, 0x0, + 0x0, 0xa, 0x60, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x81, 0x2, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x1b, 0x42, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa0, 0x0, 0xad, 0xd5, 0x42, 0x23, 0x40, + 0x7, 0x10, 0x0, 0x2, 0x8b, 0xde, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DDF "跟" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0xe0, 0xc6, 0x66, 0x6f, 0x10, + 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0x1, 0xa0, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0xc0, 0x1, 0xa0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0xc6, 0xc7, 0x80, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0xd0, 0xc0, 0x40, 0xd0, 0x60, 0x6, 0x10, + 0x0, 0xc0, 0xc6, 0x82, 0xd0, 0x80, 0xb, 0x80, + 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0x56, 0x94, 0x0, + 0x0, 0xc0, 0xc0, 0x0, 0xd0, 0xc, 0x10, 0x0, + 0x0, 0xc0, 0xc6, 0x51, 0xd0, 0x24, 0xc1, 0x0, + 0x5, 0xeb, 0x70, 0x0, 0xd9, 0x40, 0x5e, 0x82, + 0xa, 0x40, 0x0, 0x0, 0xb4, 0x0, 0x2, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DEF "路" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0xb6, 0x68, 0x90, 0x3c, 0x0, 0x4, 0x0, + 0x0, 0xd0, 0x4, 0x70, 0x88, 0x66, 0x7e, 0x20, + 0x0, 0xd0, 0x4, 0x70, 0xa5, 0x0, 0x95, 0x0, + 0x0, 0xd0, 0x4, 0x75, 0x26, 0x34, 0xb0, 0x0, + 0x0, 0xe6, 0xc8, 0x66, 0x0, 0xbd, 0x10, 0x0, + 0x0, 0x10, 0xc0, 0x0, 0x2, 0xdc, 0x80, 0x0, + 0x1, 0x90, 0xd6, 0x70, 0x3a, 0x10, 0x8e, 0x82, + 0x0, 0xb0, 0xc1, 0x15, 0xc6, 0x66, 0x6c, 0x91, + 0x0, 0xb0, 0xc0, 0x41, 0xa3, 0x0, 0x1c, 0x0, + 0x0, 0xb0, 0xc0, 0x0, 0xa3, 0x0, 0x1c, 0x0, + 0x0, 0xb3, 0xd6, 0x40, 0xa3, 0x0, 0x1c, 0x0, + 0xa, 0xc6, 0x10, 0x0, 0xa7, 0x66, 0x6c, 0x0, + 0x1, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x1b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+8EAB "身" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x64, 0x0, 0x4, 0x0, 0x0, 0x0, + 0xd, 0x66, 0x66, 0x66, 0xe2, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, + 0x66, 0x66, 0x66, 0xe0, 0x40, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0xe, 0x1e, 0x50, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xeb, 0x50, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x1e, 0x60, 0x0, 0x36, 0x6d, 0x66, 0x66, + 0x6c, 0xf0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1b, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x20, + 0xe0, 0x0, 0x0, 0x0, 0x1, 0x97, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x7, 0x82, 0x0, 0x0, 0xe0, + 0x0, 0x3, 0x56, 0x10, 0x0, 0x17, 0xed, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+8ECA "車" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x32, 0x0, 0x27, + 0x66, 0x66, 0xd6, 0x66, 0x68, 0x70, 0x0, 0x1, + 0x0, 0xc, 0x0, 0x3, 0x20, 0x0, 0x0, 0xd6, + 0x66, 0xd6, 0x66, 0xb8, 0x0, 0x0, 0xd, 0x0, + 0xc, 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, + 0xd6, 0x66, 0xb4, 0x0, 0x0, 0xd, 0x0, 0xc, + 0x0, 0x9, 0x40, 0x0, 0x0, 0xd6, 0x66, 0xd6, + 0x66, 0xb4, 0x0, 0x0, 0xa, 0x0, 0xc, 0x0, + 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0xa2, 0x17, 0x66, 0x66, 0x6d, 0x66, 0x66, + 0x67, 0x50, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + + /* U+8EDF "軟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x22, 0x7, 0x70, 0x0, 0x0, + 0x4, 0x76, 0xd6, 0x77, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x20, 0x1d, 0x66, 0x69, 0xc0, + 0x2, 0xc6, 0xd6, 0xd4, 0x73, 0x83, 0x9, 0x30, + 0x1, 0xb0, 0xc0, 0xc0, 0x70, 0xc3, 0x2, 0x0, + 0x1, 0xd6, 0xd6, 0xd3, 0x0, 0xc4, 0x0, 0x0, + 0x1, 0xb0, 0xc0, 0xc0, 0x0, 0xd6, 0x0, 0x0, + 0x1, 0xd6, 0xd6, 0xd0, 0x1, 0xc7, 0x0, 0x0, + 0x1, 0x70, 0xc0, 0x50, 0x6, 0x88, 0x20, 0x0, + 0x5, 0x66, 0xd6, 0x7c, 0x1c, 0x13, 0x90, 0x0, + 0x1, 0x0, 0xc0, 0x0, 0x67, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0xc0, 0x4, 0x90, 0x0, 0x2e, 0x60, + 0x0, 0x0, 0xd0, 0x46, 0x0, 0x0, 0x4, 0xa2, + 0x0, 0x0, 0x40, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8EE2 "転" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc0, 0x13, 0x0, 0x0, 0x5, 0x0, + 0x4, 0x76, 0xd6, 0x77, 0x28, 0x66, 0x69, 0x20, + 0x0, 0x0, 0xc0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc6, 0xd6, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x0, 0x0, 0x30, + 0x1, 0xd6, 0xd6, 0xc3, 0x86, 0x76, 0x66, 0xa2, + 0x1, 0xb0, 0xc0, 0xa1, 0x0, 0x79, 0x0, 0x0, + 0x1, 0xd6, 0xd6, 0xc2, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0x80, 0xc0, 0x51, 0x4, 0x70, 0x10, 0x0, + 0x5, 0x66, 0xd6, 0x9b, 0x9, 0x0, 0x37, 0x0, + 0x1, 0x0, 0xc0, 0x0, 0x72, 0x0, 0x8, 0x70, + 0x0, 0x0, 0xc0, 0x3, 0xec, 0x98, 0x65, 0xe0, + 0x0, 0x0, 0xd0, 0x0, 0x30, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8EFD "軽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x15, 0x0, + 0x0, 0xa, 0x20, 0x54, 0x86, 0x66, 0xbb, 0x0, + 0x7, 0x6c, 0x76, 0x82, 0x32, 0x1, 0xc0, 0x0, + 0x1, 0xa, 0x20, 0x20, 0x8, 0xa, 0x30, 0x0, + 0xb, 0x7c, 0x76, 0xf1, 0x4, 0xc6, 0x0, 0x0, + 0xa, 0x2a, 0x20, 0xc0, 0x7, 0xaa, 0x10, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x84, 0x3, 0xda, 0x50, + 0xa, 0x2a, 0x20, 0xd5, 0x0, 0xc4, 0x6, 0x10, + 0xa, 0x7c, 0x76, 0xc0, 0x0, 0xd0, 0x1, 0x0, + 0x8, 0x1a, 0x20, 0x52, 0x75, 0xe5, 0x7b, 0x10, + 0x26, 0x6c, 0x76, 0xa7, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xd0, 0x3, 0x20, + 0x0, 0xa, 0x20, 0x27, 0x66, 0x96, 0x69, 0x70, + 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F03 "較" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x1, 0xa2, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x40, 0x0, 0x4b, 0x0, 0x0, + 0x7, 0x6c, 0x76, 0x92, 0x11, 0x13, 0x17, 0x20, + 0x0, 0xa, 0x20, 0x22, 0x68, 0x65, 0x55, 0x30, + 0xa, 0x7c, 0x76, 0xe2, 0xc, 0x60, 0x64, 0x0, + 0xa, 0x2a, 0x20, 0xc0, 0x58, 0x0, 0x8, 0xa0, + 0xa, 0x7c, 0x76, 0xc1, 0xa2, 0x0, 0x50, 0xc1, + 0xa, 0x2a, 0x20, 0xc7, 0x6, 0x0, 0xe3, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x7, 0x14, 0x90, 0x0, + 0x8, 0x1a, 0x20, 0x50, 0x2, 0x9b, 0x20, 0x0, + 0x26, 0x6c, 0x76, 0xb7, 0x0, 0xaa, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x4, 0xac, 0x40, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x77, 0x1, 0xd9, 0x30, + 0x0, 0xa, 0x20, 0x37, 0x20, 0x0, 0x9, 0x40, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F09 "載" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x3, 0xc3, 0x10, 0x0, + 0x0, 0x56, 0x6d, 0x6d, 0x33, 0xa0, 0xc3, 0x0, + 0x0, 0x10, 0xb, 0x0, 0x3, 0xa0, 0x43, 0x30, + 0x17, 0x66, 0x6a, 0x66, 0x67, 0xc6, 0x67, 0xb2, + 0x0, 0x0, 0x1c, 0x3, 0x12, 0xa0, 0x0, 0x0, + 0x2, 0x76, 0x6d, 0x68, 0x61, 0xa0, 0x4, 0x0, + 0x0, 0x86, 0x6d, 0x69, 0x30, 0xc0, 0xe, 0x40, + 0x0, 0xd0, 0xb, 0xc, 0x10, 0xd0, 0x4a, 0x0, + 0x0, 0xd6, 0x6d, 0x6d, 0x0, 0xc0, 0xc3, 0x0, + 0x0, 0xd0, 0xb, 0xc, 0x0, 0x8a, 0xa0, 0x0, + 0x0, 0xc6, 0x6d, 0x69, 0x0, 0x4f, 0x10, 0x0, + 0x5, 0x66, 0x6d, 0x69, 0xa1, 0xcc, 0x50, 0x5, + 0x1, 0x0, 0xb, 0x0, 0x2a, 0x21, 0xd5, 0x44, + 0x0, 0x0, 0x1c, 0x5, 0x70, 0x0, 0x1c, 0xe4, + 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x0, 0x43, + + /* U+8F15 "輕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xa, 0x20, 0x52, 0x76, 0x66, 0x6a, 0x70, + 0x17, 0x6c, 0x76, 0x82, 0x46, 0x57, 0xb, 0x30, + 0x1, 0xa, 0x20, 0x20, 0x93, 0xa3, 0x4b, 0x0, + 0xb, 0x7c, 0x76, 0xe3, 0x80, 0x60, 0x90, 0x0, + 0xa, 0x2a, 0x20, 0xc3, 0x51, 0x70, 0x92, 0x0, + 0xa, 0x7c, 0x76, 0xc0, 0x95, 0x77, 0x1e, 0x20, + 0xa, 0x2a, 0x20, 0xc0, 0x3b, 0x28, 0x6, 0x30, + 0xa, 0x4a, 0x32, 0xc0, 0x0, 0x0, 0x8, 0x0, + 0xa, 0x5b, 0x54, 0x80, 0x66, 0xd6, 0x66, 0x30, + 0x36, 0x6c, 0x76, 0x79, 0x0, 0xc1, 0x0, 0x0, + 0x1, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x0, 0xa, 0x20, 0x0, 0x0, 0xc1, 0x0, 0x10, + 0x0, 0xa, 0x20, 0x16, 0x66, 0xd6, 0x68, 0xe2, + 0x0, 0x9, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+8F2A "輪" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x1, 0xe2, 0x0, 0x0, + 0x0, 0xc, 0x5, 0x10, 0x6, 0xb2, 0x0, 0x0, + 0x7, 0x6d, 0x66, 0x40, 0xd, 0x29, 0x0, 0x0, + 0x1, 0xc, 0x2, 0x0, 0x87, 0x3, 0xb0, 0x0, + 0xc, 0x6d, 0x6d, 0x44, 0x80, 0x1, 0xae, 0x70, + 0xb, 0x1c, 0xc, 0x45, 0x37, 0x66, 0x54, 0x10, + 0xb, 0x6d, 0x6d, 0x12, 0x0, 0x0, 0x4, 0x0, + 0xb, 0x1c, 0xc, 0xc, 0x6c, 0x6c, 0x6d, 0x30, + 0xb, 0x6d, 0x6d, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x8, 0xc, 0x5, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x26, 0x6d, 0x6b, 0x7c, 0x6c, 0x6c, 0x6d, 0x0, + 0x1, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xc, 0xb, 0xb, 0xc, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x7, 0x6, 0x7d, 0x0, + 0x0, 0x5, 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, + + /* U+8F38 "輸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0xc, 0x2, 0x0, 0x9, 0xb4, 0x0, 0x0, + 0x17, 0x6d, 0x69, 0x50, 0x2e, 0x27, 0x10, 0x0, + 0x0, 0xc, 0x1, 0x0, 0xc5, 0x2, 0xb1, 0x0, + 0xb, 0x6d, 0x6d, 0x58, 0x77, 0x68, 0x8e, 0x70, + 0xc, 0x1c, 0xc, 0x54, 0x0, 0x10, 0x6, 0x20, + 0xb, 0x6d, 0x6d, 0xb, 0x66, 0xd1, 0xc, 0x0, + 0xb, 0x1c, 0xc, 0xc, 0x1, 0xba, 0x2b, 0x0, + 0xc, 0x6d, 0x6d, 0xc, 0x56, 0xbb, 0xb, 0x0, + 0x9, 0xc, 0x5, 0xc, 0x1, 0xbb, 0xb, 0x0, + 0x26, 0x6d, 0x6b, 0x8c, 0x66, 0xbb, 0xb, 0x0, + 0x1, 0xc, 0x0, 0xc, 0x1, 0xba, 0x1b, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x1, 0xb0, 0xb, 0x0, + 0x0, 0xc, 0x10, 0xc, 0x3b, 0x83, 0xab, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F9B "辛" */ + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf4, 0x0, 0x1, 0x0, 0x0, + 0x46, 0x66, 0x6c, 0x76, 0x68, 0xd1, 0x0, 0x0, + 0x2, 0x20, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x8, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0x0, 0xa0, 0x0, 0x10, 0x5, 0x66, 0x67, + 0x96, 0x88, 0x66, 0x7f, 0x40, 0x10, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x68, 0x0, 0x0, 0x47, 0x66, 0x6d, 0x86, + 0x66, 0x61, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, + + /* U+8F9E "辞" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x30, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xa0, 0x0, 0x92, 0x2, 0x0, + 0x3, 0x43, 0xd0, 0x5, 0x76, 0x66, 0x69, 0x30, + 0x0, 0x0, 0xd0, 0x0, 0x40, 0x0, 0x92, 0x0, + 0x0, 0x0, 0xd0, 0x51, 0x49, 0x2, 0xe1, 0x0, + 0x6, 0x66, 0xe6, 0x63, 0xe, 0x7, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x1, 0x12, 0x18, 0x13, 0x50, + 0x0, 0x10, 0xd0, 0x36, 0x54, 0xd4, 0x44, 0x40, + 0x1, 0xe6, 0x76, 0xe0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x6, 0x0, + 0x0, 0xd0, 0x1, 0xb5, 0x76, 0xe6, 0x66, 0x10, + 0x0, 0xd0, 0x1, 0xb0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0xe6, 0x66, 0xb0, 0x0, 0xd0, 0x0, 0x0, + 0x1, 0xb0, 0x0, 0x40, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+8FA6 "辦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x43, 0x0, 0xb, 0x20, 0x6, 0x50, 0x0, + 0x0, 0xe, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x5, 0x6b, 0x95, 0xc, 0x1, 0x66, 0x78, 0x90, + 0x1, 0x0, 0x72, 0x6d, 0x6d, 0x20, 0x5, 0x20, + 0x1, 0xa0, 0xc0, 0xb, 0xb, 0x19, 0xc, 0x30, + 0x0, 0xa4, 0x50, 0xb, 0xb, 0xc, 0x28, 0x0, + 0x7, 0x6b, 0x7a, 0x2a, 0xb, 0x56, 0x96, 0xd2, + 0x0, 0xc, 0x0, 0x47, 0x19, 0x10, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0x83, 0x28, 0x0, 0xc0, 0x0, + 0x5, 0x6c, 0x74, 0xb0, 0x47, 0x46, 0xd7, 0xa0, + 0x0, 0x38, 0x4, 0x60, 0x65, 0x10, 0xc0, 0x0, + 0x0, 0x83, 0xa, 0x0, 0xa2, 0x0, 0xc0, 0x0, + 0x1, 0x90, 0x72, 0x3c, 0xc0, 0x0, 0xc0, 0x0, + 0x7, 0x15, 0x30, 0x1, 0x0, 0x0, 0xd0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + + /* U+8FB2 "農" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0xd, 0x20, 0x10, 0x0, + 0x0, 0xe, 0x66, 0xd6, 0x6e, 0x66, 0xd3, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x66, 0xd6, 0x6e, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xb, 0x66, 0x76, 0x67, 0x66, 0xa0, 0x0, + 0x0, 0x9, 0x66, 0x66, 0x66, 0x66, 0xb8, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xd, 0x47, 0x66, 0x66, 0x68, 0x10, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x66, 0x66, 0x7d, 0x20, + 0x0, 0x1c, 0xb, 0x11, 0x50, 0x4, 0x60, 0x0, + 0x0, 0x67, 0xb, 0x10, 0x47, 0x3a, 0x20, 0x0, + 0x0, 0xb0, 0xb, 0x11, 0x43, 0xd5, 0x0, 0x0, + 0x7, 0x20, 0xe, 0xc6, 0x0, 0x19, 0xeb, 0x60, + 0x21, 0x0, 0x4, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+8FBA "辺" */ + 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x20, 0x0, 0x0, 0x0, 0x7, 0x0, + 0x0, 0xa, 0x34, 0x76, 0xb9, 0x66, 0x6d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x1b, 0x0, + 0x0, 0x7, 0x0, 0x0, 0xc1, 0x0, 0x2a, 0x0, + 0x27, 0x6e, 0x30, 0x0, 0xd0, 0x0, 0x39, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x90, 0x0, 0x48, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x40, 0x0, 0x67, 0x0, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0x82, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xd, 0x4, 0x50, 0x2, 0x56, 0xe0, 0x0, + 0x2, 0xa9, 0x74, 0x0, 0x0, 0x2d, 0x40, 0x0, + 0x2e, 0x30, 0x4b, 0x41, 0x0, 0x0, 0x1, 0x21, + 0x2, 0x0, 0x1, 0x8c, 0xef, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8FBC "込" */ + 0x0, 0x50, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x17, 0x6e, 0x50, 0x0, 0x79, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd0, 0xa0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x7, 0x60, 0x74, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x90, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0xd, 0x6, 0x0, 0x0, 0x0, 0xbd, 0x40, + 0x2, 0xaa, 0x80, 0x0, 0x0, 0x0, 0x8, 0x40, + 0x1e, 0x50, 0x4a, 0x41, 0x0, 0x0, 0x0, 0x10, + 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FCE "迎" */ + 0x0, 0x30, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x56, 0x84, 0x10, 0x1, 0x0, + 0x0, 0xf, 0x10, 0xd0, 0x0, 0xd6, 0x6d, 0x30, + 0x0, 0x2, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0x1, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x7, 0x6e, 0x20, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd0, 0x2, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd7, 0x70, 0xd0, 0xd, 0x0, + 0x0, 0xd, 0x1, 0xf6, 0x0, 0xd3, 0xad, 0x0, + 0x0, 0xd, 0x0, 0x10, 0x0, 0xd0, 0x11, 0x0, + 0x4, 0xb6, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2d, 0x10, 0x2a, 0x74, 0x32, 0x42, 0x24, 0x51, + 0x0, 0x0, 0x0, 0x37, 0xab, 0xcd, 0xdd, 0x30, + + /* U+8FD1 "近" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, + 0x0, 0x4b, 0x0, 0x16, 0x47, 0x9a, 0x85, 0x0, + 0x0, 0xc, 0x20, 0x1c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x1c, 0x0, 0x0, 0x2, 0x30, + 0x18, 0x6e, 0x30, 0x1d, 0x66, 0x6c, 0x67, 0x60, + 0x0, 0xd, 0x0, 0x1b, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x39, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x65, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x4, 0x50, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x5a, 0x43, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x9, 0x80, 0x49, 0x30, 0x0, 0x2, 0x0, 0x10, + 0x19, 0x0, 0x1, 0x8c, 0xde, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8FD4 "返" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, + 0x0, 0x3b, 0x0, 0x65, 0x78, 0x99, 0x82, 0x0, + 0x0, 0xc, 0x30, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x66, 0x66, 0xc2, 0x0, + 0x17, 0x6c, 0x30, 0xb2, 0x0, 0x2, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xc3, 0x10, 0x9, 0x50, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x47, 0x3c, 0x0, 0x0, + 0x0, 0xd, 0x1, 0xa0, 0x1, 0xf9, 0x0, 0x0, + 0x0, 0xd, 0x6, 0x30, 0x9, 0x68, 0xc1, 0x0, + 0x0, 0xd, 0x8, 0x0, 0x95, 0x0, 0x8b, 0x0, + 0x0, 0x1c, 0x40, 0x37, 0x10, 0x0, 0x5, 0x0, + 0x7, 0x90, 0x58, 0x51, 0x0, 0x0, 0x1, 0x20, + 0x19, 0x0, 0x1, 0x7c, 0xef, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FEB "迫" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x30, 0x10, 0x80, 0x0, 0x30, 0x0, + 0x0, 0x9, 0x20, 0xb7, 0x76, 0x66, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x14, 0x4a, 0x20, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x3, 0x1d, 0x10, 0xb7, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb3, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xb7, 0x66, 0x66, 0xe0, 0x0, + 0x1, 0x99, 0x80, 0x91, 0x0, 0x0, 0x90, 0x0, + 0x2e, 0x40, 0x3a, 0x64, 0x22, 0x22, 0x34, 0x50, + 0x3, 0x0, 0x0, 0x58, 0xbc, 0xde, 0xee, 0x30, + + /* U+8FFD "追" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x56, 0x0, 0x10, 0x0, + 0x0, 0x2f, 0x0, 0xb6, 0x86, 0x66, 0xe1, 0x0, + 0x0, 0x6, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xd0, 0x0, + 0x16, 0x6b, 0x30, 0xc6, 0x55, 0x55, 0xd0, 0x0, + 0x1, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x66, 0x66, 0x98, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x66, 0x66, 0xa6, 0x0, + 0x1, 0x99, 0x70, 0xd0, 0x0, 0x0, 0x64, 0x0, + 0x2e, 0x40, 0x3a, 0x61, 0x0, 0x0, 0x0, 0x20, + 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+9000 "退" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x4a, 0x66, 0x66, 0xe1, 0x0, + 0x0, 0x1f, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0x0, 0x3c, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x6, 0x6c, 0x30, 0x3a, 0x0, 0x0, 0xe0, 0x0, + 0x1, 0xe, 0x0, 0x3c, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x10, 0x0, 0x8a, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x6, 0x77, 0x30, 0x0, + 0x0, 0xe, 0x0, 0x3a, 0x1, 0x4b, 0x70, 0x0, + 0x0, 0xe, 0x0, 0x3c, 0x85, 0x0, 0xab, 0x0, + 0x2, 0x97, 0x80, 0x3d, 0x20, 0x0, 0x9, 0x0, + 0x1e, 0x20, 0x1a, 0x74, 0x21, 0x11, 0x23, 0x41, + 0x0, 0x0, 0x0, 0x59, 0xbd, 0xef, 0xff, 0x40, + + /* U+9001 "送" */ + 0x0, 0x20, 0x0, 0x14, 0x0, 0x7, 0x30, 0x0, + 0x0, 0x78, 0x0, 0x9, 0x60, 0xd, 0x20, 0x0, + 0x0, 0xf, 0x10, 0x3, 0xb0, 0x46, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x56, 0x66, 0xa6, 0x7c, 0x10, + 0x0, 0x0, 0x0, 0x10, 0xb, 0x20, 0x0, 0x0, + 0x27, 0x6d, 0x10, 0x0, 0xc, 0x10, 0x2, 0x10, + 0x0, 0xd, 0x6, 0x66, 0x6e, 0x66, 0x6a, 0x80, + 0x0, 0xd, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6b, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0xc1, 0x2c, 0x60, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x20, 0x1, 0xd7, 0x0, + 0x0, 0x8b, 0x62, 0x71, 0x0, 0x0, 0x28, 0x0, + 0x2d, 0x50, 0x5b, 0x40, 0x0, 0x0, 0x1, 0x21, + 0x4, 0x0, 0x1, 0x8c, 0xcd, 0xee, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9003 "逃" */ + 0x0, 0x10, 0x0, 0x0, 0x91, 0x92, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x0, 0x1f, 0x4, 0x10, 0xd0, 0xd0, 0x3e, 0x10, + 0x0, 0x4, 0x1, 0xd0, 0xd0, 0xd2, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0xa0, 0xd0, 0xd5, 0x0, 0x0, + 0x5, 0x6c, 0x20, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x1, 0xd, 0x0, 0x7, 0xe0, 0xd7, 0x92, 0x0, + 0x0, 0xd, 0x5, 0xa1, 0xd0, 0xd0, 0x6d, 0x0, + 0x0, 0xd, 0x1b, 0x13, 0xa0, 0xd0, 0x3, 0x20, + 0x0, 0xd, 0x0, 0x9, 0x30, 0xd0, 0x0, 0x60, + 0x0, 0xd, 0x0, 0x37, 0x0, 0xc3, 0x14, 0xb0, + 0x0, 0x4b, 0x42, 0x50, 0x0, 0x49, 0x99, 0x50, + 0xc, 0x70, 0x59, 0x41, 0x0, 0x0, 0x12, 0x31, + 0x3, 0x0, 0x1, 0x7b, 0xde, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+900F "透" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x60, 0x0, + 0x0, 0x93, 0x0, 0x45, 0x7d, 0x75, 0x30, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0xc, 0x0, 0x5, 0x10, + 0x0, 0x4, 0x7, 0x66, 0xce, 0x96, 0x67, 0x50, + 0x0, 0x0, 0x0, 0x7, 0x6c, 0x28, 0x0, 0x0, + 0x14, 0x4a, 0x10, 0x75, 0xc, 0x3, 0xc8, 0x40, + 0x3, 0x1d, 0x26, 0x76, 0x6a, 0x69, 0x28, 0x40, + 0x0, 0xd, 0x0, 0x12, 0xc0, 0xc, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x90, 0x7a, 0xa5, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x20, 0x10, 0xa3, 0x0, + 0x0, 0xd, 0x0, 0x38, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x6b, 0x32, 0x60, 0x2, 0x8b, 0x90, 0x0, + 0x1d, 0x50, 0x59, 0x30, 0x0, 0x17, 0x0, 0x10, + 0x5, 0x0, 0x2, 0x8c, 0xde, 0xee, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + + /* U+9010 "逐" */ + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x6a, 0x2, 0x76, 0x67, 0x76, 0x6a, 0xa0, + 0x0, 0xe, 0x10, 0x0, 0x1c, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1, 0xa7, 0x0, 0x9, 0x30, + 0x0, 0x0, 0x0, 0x37, 0x6, 0x50, 0x88, 0x10, + 0x16, 0x6c, 0x32, 0x20, 0x2b, 0xc7, 0x20, 0x0, + 0x0, 0xd, 0x0, 0x4, 0x80, 0x85, 0x0, 0x0, + 0x0, 0xd, 0x1, 0x64, 0x2, 0xeb, 0x70, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x3c, 0x5a, 0x3d, 0x20, + 0x0, 0xd, 0x0, 0x7, 0x90, 0x3a, 0x6, 0xc0, + 0x0, 0xd, 0x3, 0x73, 0x0, 0x68, 0x0, 0x60, + 0x0, 0x78, 0x61, 0x0, 0x5b, 0xe2, 0x0, 0x0, + 0x1d, 0x40, 0x39, 0x41, 0x3, 0x30, 0x0, 0x0, + 0x4, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xef, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+9019 "這" */ + 0x0, 0x70, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, + 0x0, 0xb, 0x3, 0x66, 0x67, 0x76, 0x8d, 0x10, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x26, 0x66, 0x67, 0xd1, 0x0, + 0x18, 0x6f, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x17, 0x66, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x39, 0x66, 0x66, 0xc4, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0x2a, 0x0, 0x0, 0xd0, 0x0, + 0x3, 0xb8, 0x70, 0x2c, 0x66, 0x66, 0xe0, 0x0, + 0x3e, 0x10, 0x2a, 0x76, 0x0, 0x0, 0x11, 0x31, + 0x1, 0x0, 0x0, 0x5a, 0xce, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+901A "通" */ + 0x0, 0x10, 0x0, 0x56, 0x66, 0x66, 0xa2, 0x0, + 0x0, 0xb4, 0x0, 0x11, 0x20, 0x8, 0x83, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x61, 0x0, 0x0, + 0x0, 0x3, 0x1, 0xa6, 0x6d, 0x86, 0x6c, 0x10, + 0x0, 0x0, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x17, 0x6d, 0x30, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x1, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xd6, 0x6e, 0x66, 0x6d, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0x6a, 0x51, 0xa0, 0x8, 0x5, 0xcb, 0x0, + 0x1c, 0x60, 0x49, 0x41, 0x0, 0x0, 0x22, 0x21, + 0x6, 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+901F "速" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x1, 0x91, 0x0, 0x0, 0xd, 0x0, 0x2, 0x0, + 0x0, 0x7c, 0x7, 0x66, 0x6e, 0x66, 0x6a, 0x30, + 0x0, 0x16, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa6, 0x6e, 0x66, 0xd4, 0x0, + 0x1, 0x16, 0x10, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x17, 0x5d, 0x20, 0xd0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x9f, 0x66, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x11, 0xbe, 0x51, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xa, 0x2d, 0x1a, 0xa1, 0x0, + 0x0, 0xd, 0x1, 0x81, 0xd, 0x0, 0x7d, 0x0, + 0x0, 0x7a, 0x65, 0x0, 0xe, 0x0, 0x4, 0x0, + 0x1d, 0x50, 0x49, 0x30, 0x8, 0x0, 0x1, 0x21, + 0x3, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9020 "造" */ + 0x0, 0x10, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x2b, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x5b, 0xd, 0x0, 0x81, 0x0, + 0x0, 0x4, 0x0, 0x96, 0x6e, 0x66, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x70, 0xd, 0x0, 0x0, 0x0, + 0x3, 0x39, 0x12, 0x0, 0xd, 0x0, 0x7, 0x40, + 0x5, 0x3d, 0x16, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0xd, 0x0, 0x9, 0x66, 0x66, 0xa2, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x2, 0xa9, 0x50, 0xe, 0x66, 0x66, 0xd0, 0x0, + 0x2e, 0x30, 0x5a, 0x43, 0x0, 0x0, 0x0, 0x11, + 0x2, 0x0, 0x1, 0x8b, 0xdd, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9023 "連" */ + 0x0, 0x50, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0xc, 0x0, 0x25, 0x0, + 0x0, 0xd, 0x13, 0x76, 0x6d, 0x66, 0x65, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x6d, 0x66, 0xa3, 0x0, + 0x0, 0x4, 0x0, 0xc0, 0xc, 0x0, 0xb1, 0x0, + 0x27, 0x5e, 0x40, 0xc6, 0x6d, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x6d, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x70, 0xc, 0x0, 0x50, 0x0, + 0x0, 0xd, 0x26, 0x66, 0x6d, 0x66, 0x6c, 0x50, + 0x0, 0x1e, 0x1, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x6, 0xc5, 0x91, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x2d, 0x10, 0x2b, 0x84, 0x27, 0x22, 0x34, 0x50, + 0x0, 0x0, 0x0, 0x38, 0xab, 0xcc, 0xcc, 0x20, + + /* U+902E "逮" */ + 0x0, 0x20, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0xd, 0x0, 0x50, 0x0, + 0x0, 0xe, 0x10, 0x76, 0x6e, 0x66, 0xe2, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xd, 0x0, 0xe3, 0x40, + 0x0, 0x0, 0x7, 0x66, 0x6e, 0x66, 0xe6, 0x50, + 0x17, 0x6e, 0x40, 0x56, 0x6e, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x1, 0x40, 0xd, 0x0, 0x40, 0x0, + 0x0, 0xd, 0x0, 0x7b, 0xd, 0x8, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x5, 0x3d, 0x73, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x58, 0x3d, 0x78, 0x20, 0x0, + 0x0, 0xd, 0xd, 0x70, 0xd, 0x1, 0xc8, 0x0, + 0x0, 0x87, 0x50, 0x7, 0x8d, 0x0, 0x7, 0x0, + 0x1c, 0x30, 0x49, 0x30, 0x86, 0x0, 0x0, 0x10, + 0x4, 0x0, 0x1, 0x8c, 0xdd, 0xde, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9031 "週" */ + 0x0, 0x71, 0x0, 0x40, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x2e, 0x20, 0xd6, 0x6a, 0xb6, 0x6e, 0x10, + 0x0, 0x8, 0x30, 0xc0, 0x7, 0x54, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc0, 0x7a, 0x97, 0x1c, 0x0, + 0x0, 0x6, 0x0, 0xc0, 0x7, 0x52, 0xc, 0x0, + 0x27, 0x6e, 0x30, 0xb4, 0x77, 0x68, 0x5c, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0x86, 0x6a, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xa0, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x2, 0x60, 0xc0, 0xb, 0xc, 0x0, + 0x0, 0xd, 0x6, 0x20, 0xd6, 0x6b, 0xc, 0x0, + 0x0, 0xd, 0x7, 0x0, 0x40, 0x0, 0xb, 0x0, + 0x3, 0xa8, 0x82, 0x0, 0x0, 0x15, 0xd8, 0x0, + 0x2e, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x10, 0x11, + 0x2, 0x0, 0x1, 0x7b, 0xde, 0xee, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9032 "進" */ + 0x0, 0x51, 0x0, 0x1a, 0x27, 0x30, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0x5c, 0x11, 0xe0, 0x0, 0x0, + 0x0, 0xa, 0x30, 0xa4, 0x0, 0x50, 0x26, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x66, 0xc6, 0x66, 0x10, + 0x0, 0x5, 0x7, 0xc2, 0x0, 0xc0, 0x10, 0x0, + 0x7, 0x6e, 0x57, 0x97, 0x66, 0xd6, 0xa6, 0x0, + 0x0, 0xd, 0x10, 0x92, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x97, 0x66, 0xd6, 0xb7, 0x0, + 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x92, 0x0, 0xc0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x97, 0x66, 0xc6, 0x8d, 0x20, + 0x3, 0xc8, 0x90, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x30, 0x3b, 0x62, 0x0, 0x0, 0x12, 0x31, + 0x2, 0x0, 0x0, 0x7c, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9045 "遅" */ + 0x0, 0x61, 0x0, 0x40, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x3d, 0x0, 0xd6, 0x66, 0x66, 0x6e, 0x30, + 0x0, 0xb, 0x20, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x3, 0x0, 0xd0, 0x75, 0x4, 0xb0, 0x0, + 0x18, 0x6e, 0x50, 0xc0, 0xc, 0x9, 0x27, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x76, 0xe6, 0x66, 0x10, + 0x0, 0xd, 0x1, 0x93, 0x66, 0xe6, 0x88, 0x0, + 0x0, 0xd, 0x5, 0x40, 0x10, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0x8, 0x47, 0x66, 0xe6, 0x69, 0xa0, + 0x0, 0xd, 0x23, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2, 0xb9, 0x90, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x2e, 0x40, 0x4b, 0x40, 0x0, 0x60, 0x0, 0x10, + 0x3, 0x0, 0x1, 0x7c, 0xdd, 0xdd, 0xef, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+904A "遊" */ + 0x0, 0x81, 0x0, 0x43, 0x0, 0x8, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0xe, 0x0, 0x3b, 0x10, 0x0, + 0x0, 0x9, 0x10, 0x3, 0x10, 0xa7, 0x46, 0xa0, + 0x0, 0x0, 0x7, 0xa6, 0x89, 0x82, 0x22, 0x20, + 0x0, 0x5, 0x0, 0xb0, 0x15, 0x46, 0x6a, 0x60, + 0x27, 0x6f, 0x30, 0xc6, 0xc5, 0x0, 0x38, 0x10, + 0x0, 0xd, 0x0, 0xc0, 0xb1, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x1, 0xa0, 0xc3, 0x66, 0xc7, 0xc1, + 0x0, 0xd, 0x5, 0x50, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x9, 0x0, 0xc0, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x43, 0x36, 0x80, 0x0, 0xa0, 0x0, + 0x3, 0xaa, 0x60, 0x2c, 0x10, 0x4c, 0x80, 0x0, + 0x2e, 0x20, 0x68, 0x20, 0x0, 0x2, 0x0, 0x11, + 0x1, 0x0, 0x2, 0x8b, 0xcd, 0xdd, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+904B "運" */ + 0x1, 0x70, 0x1, 0x40, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x7c, 0x5, 0x96, 0x66, 0x66, 0x7e, 0x40, + 0x0, 0xd, 0xd, 0x20, 0xb, 0x30, 0x51, 0x0, + 0x0, 0x0, 0x3, 0x76, 0x6d, 0x66, 0x97, 0x0, + 0x0, 0x1, 0x0, 0x30, 0xb, 0x0, 0x40, 0x0, + 0x17, 0x6e, 0x30, 0xb6, 0x6d, 0x66, 0xd3, 0x0, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xb0, 0xb, 0x0, 0xb0, 0x0, + 0x0, 0xd, 0x0, 0xb6, 0x6d, 0x66, 0xd1, 0x0, + 0x0, 0xd, 0x0, 0x30, 0xb, 0x0, 0x25, 0x0, + 0x0, 0xd, 0x7, 0x66, 0x6d, 0x66, 0x67, 0x40, + 0x2, 0xa9, 0x50, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x2e, 0x30, 0x59, 0x30, 0x9, 0x0, 0x0, 0x10, + 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xef, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+904E "過" */ + 0x0, 0x70, 0x0, 0x4, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x4d, 0x0, 0xf, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0xc, 0x10, 0xf, 0x66, 0x91, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x4, 0x81, 0xa0, 0x0, + 0x0, 0x5, 0x1, 0xe, 0x4, 0x71, 0xa2, 0x0, + 0x27, 0x6f, 0x2a, 0x78, 0x66, 0x76, 0x7d, 0x40, + 0x0, 0xd, 0xa, 0x20, 0x86, 0x69, 0x1c, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x9, 0x20, 0xd6, 0x6d, 0xc, 0x0, + 0x0, 0xd, 0xa, 0x30, 0x60, 0x4, 0xd, 0x0, + 0x3, 0xa9, 0x56, 0x10, 0x0, 0x2, 0x9b, 0x0, + 0x3e, 0x20, 0x5a, 0x41, 0x0, 0x0, 0x0, 0x20, + 0x2, 0x0, 0x1, 0x7c, 0xde, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9053 "道" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0x0, 0x7, 0x10, 0x6, 0x80, 0x0, + 0x0, 0x4d, 0x0, 0x3, 0xd0, 0xc, 0x20, 0x0, + 0x0, 0xc, 0x10, 0x0, 0x80, 0x53, 0x6, 0x40, + 0x0, 0x0, 0x6, 0x76, 0x6d, 0x66, 0x66, 0x50, + 0x0, 0x2, 0x0, 0x5, 0x29, 0x22, 0x72, 0x0, + 0x17, 0x6e, 0x40, 0x1d, 0x33, 0x33, 0xd2, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x66, 0x66, 0xe0, 0x0, + 0x4, 0xa3, 0x80, 0x1a, 0x0, 0x0, 0x90, 0x0, + 0xb, 0x10, 0x1a, 0x73, 0x10, 0x0, 0x12, 0x30, + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xee, 0xff, 0x60, + + /* U+9054 "達" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x56, 0x6c, 0x76, 0xd3, 0x0, + 0x0, 0x5, 0x10, 0x10, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x66, 0x6c, 0x76, 0x6c, 0x90, + 0x0, 0x7, 0x1, 0x6, 0x40, 0xa, 0x20, 0x0, + 0x28, 0x6e, 0x30, 0x1, 0xe0, 0x49, 0x4, 0x0, + 0x0, 0xd, 0x3, 0x76, 0x89, 0x96, 0x69, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x60, 0x0, + 0x0, 0xd, 0x0, 0x57, 0x6c, 0x76, 0x72, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xa, 0x20, 0x8, 0x10, + 0x0, 0xd, 0x6, 0x66, 0x6c, 0x76, 0x66, 0x30, + 0x5, 0xb8, 0x70, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x3e, 0x20, 0x4a, 0x41, 0x8, 0x10, 0x0, 0x10, + 0x1, 0x0, 0x1, 0x7c, 0xde, 0xef, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9055 "違" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x0, 0x57, 0xc6, 0x6b, 0x50, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x90, 0xa, 0x10, 0x0, + 0x0, 0x0, 0x5, 0x66, 0xb6, 0x6c, 0x6c, 0x60, + 0x0, 0x4, 0x1, 0x22, 0x0, 0x0, 0x40, 0x0, + 0x37, 0x6f, 0x30, 0x1c, 0x66, 0x67, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x1c, 0x66, 0x67, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x14, 0xc, 0x1, 0x50, 0x0, + 0x0, 0xd, 0x4, 0x76, 0x6d, 0x66, 0xa3, 0x0, + 0x0, 0xd, 0x0, 0x95, 0xc, 0x0, 0x3, 0x0, + 0x0, 0xd, 0x2, 0xe6, 0x6d, 0x66, 0x69, 0x50, + 0x4, 0xb9, 0x50, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x4e, 0x20, 0x79, 0x20, 0x7, 0x0, 0x0, 0x10, + 0x1, 0x0, 0x3, 0xad, 0xdd, 0xde, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9060 "遠" */ + 0x0, 0x30, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x8, 0x30, 0x70, 0x0, + 0x0, 0xb, 0x50, 0x76, 0x6b, 0x86, 0x63, 0x0, + 0x0, 0x1, 0x15, 0x66, 0x6b, 0x86, 0x69, 0x80, + 0x0, 0x1, 0x2, 0x20, 0x0, 0x0, 0x40, 0x0, + 0x28, 0x6f, 0x20, 0xc7, 0x66, 0x66, 0xe2, 0x0, + 0x0, 0xd, 0x0, 0xb1, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x7e, 0x66, 0xa0, 0x0, + 0x0, 0xd, 0x0, 0x12, 0xcd, 0x0, 0x78, 0x0, + 0x0, 0xd, 0x0, 0x69, 0x2c, 0x5a, 0x50, 0x0, + 0x0, 0xd, 0x25, 0x30, 0xc, 0x1, 0xa9, 0x0, + 0x3, 0xb9, 0x50, 0x0, 0x1d, 0x0, 0x8, 0x20, + 0x3e, 0x20, 0x49, 0x30, 0x6, 0x0, 0x0, 0x10, + 0x1, 0x0, 0x1, 0x7b, 0xcd, 0xee, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9069 "適" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x5, 0x40, 0x3, 0x0, + 0x0, 0x1e, 0x3, 0x77, 0x66, 0x69, 0x69, 0x50, + 0x0, 0x0, 0x0, 0x3, 0xa0, 0x1b, 0x10, 0x0, + 0x0, 0x3, 0x0, 0x96, 0xb6, 0xa7, 0x6a, 0x10, + 0x27, 0x6f, 0x40, 0xc0, 0x6, 0x70, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc3, 0x7a, 0x8a, 0x4c, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0x6, 0x41, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd7, 0x7d, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xc0, 0xc, 0xc, 0x0, + 0x0, 0xd, 0x0, 0xc0, 0xd6, 0x6c, 0xc, 0x0, + 0x3, 0xa9, 0x50, 0xa0, 0x30, 0x5, 0x7c, 0x0, + 0x3e, 0x20, 0x59, 0x30, 0x0, 0x0, 0x54, 0x11, + 0x2, 0x0, 0x1, 0x8c, 0xde, 0xee, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9078 "選" */ + 0x0, 0x71, 0x0, 0x20, 0x20, 0x30, 0x4, 0x0, + 0x0, 0x3e, 0x10, 0xc6, 0xa3, 0xb6, 0x6d, 0x0, + 0x0, 0xa, 0x20, 0xc6, 0xa1, 0xb6, 0x6b, 0x0, + 0x0, 0x0, 0x0, 0xb0, 0x22, 0xb0, 0x6, 0x30, + 0x0, 0x3, 0x0, 0xb6, 0x69, 0x87, 0x57, 0x80, + 0x27, 0x6f, 0x30, 0x3, 0x91, 0x17, 0x32, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2d, 0x17, 0x0, + 0x0, 0xd, 0x1, 0x76, 0xd6, 0x7c, 0x66, 0x20, + 0x0, 0xd, 0x0, 0x0, 0xc0, 0x2b, 0x1, 0x30, + 0x0, 0xd, 0x17, 0x66, 0x96, 0x77, 0x66, 0x70, + 0x0, 0xd, 0x0, 0x7, 0xc0, 0x29, 0x70, 0x0, + 0x4, 0xca, 0x61, 0x85, 0x0, 0x0, 0x8a, 0x0, + 0x3f, 0x30, 0x5b, 0x30, 0x0, 0x0, 0x2, 0x0, + 0x2, 0x0, 0x1, 0x8b, 0xcc, 0xdd, 0xde, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+907F "避" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x8, 0x30, 0x0, + 0x0, 0x79, 0x9, 0x66, 0xc3, 0x2, 0xb0, 0x40, + 0x0, 0xd, 0xa, 0x10, 0xc4, 0x76, 0x67, 0x60, + 0x0, 0x0, 0xa, 0x10, 0xc0, 0x70, 0xd, 0x10, + 0x0, 0x1, 0xa, 0x65, 0xd1, 0x67, 0x46, 0x0, + 0x17, 0x6f, 0x2b, 0x0, 0x24, 0x77, 0x96, 0xc2, + 0x0, 0xd, 0xb, 0x20, 0x22, 0x11, 0xa0, 0x0, + 0x0, 0xd, 0xa, 0xe6, 0xa7, 0x1, 0xa0, 0x0, + 0x0, 0xd, 0x26, 0xd0, 0x77, 0x77, 0xc6, 0xb1, + 0x0, 0xd, 0x60, 0xd0, 0x75, 0x1, 0xa0, 0x0, + 0x0, 0xd, 0x30, 0xe6, 0xa5, 0x1, 0xa0, 0x0, + 0x1, 0x97, 0x50, 0x80, 0x42, 0x2, 0xb0, 0x0, + 0xd, 0x20, 0x4a, 0x41, 0x0, 0x0, 0x20, 0x11, + 0x0, 0x0, 0x0, 0x7b, 0xde, 0xee, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9084 "還" */ + 0x0, 0x92, 0x0, 0x86, 0x66, 0x66, 0x6b, 0x10, + 0x0, 0x3e, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, + 0x0, 0xa, 0x10, 0xd0, 0xb0, 0xb, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xd6, 0x86, 0x68, 0x6a, 0x10, + 0x0, 0x2, 0x6, 0x65, 0x55, 0x55, 0x57, 0xa0, + 0x17, 0x6f, 0x20, 0x56, 0x66, 0x66, 0x85, 0x0, + 0x0, 0xd, 0x0, 0x84, 0x0, 0x0, 0x65, 0x0, + 0x0, 0xd, 0x0, 0x88, 0x87, 0x66, 0x95, 0x0, + 0x0, 0xd, 0x0, 0x25, 0xc1, 0x0, 0x95, 0x0, + 0x0, 0xd, 0x0, 0x5d, 0x55, 0x99, 0x40, 0x0, + 0x0, 0xd, 0x7, 0x65, 0x50, 0x4b, 0xc3, 0x0, + 0x0, 0x9a, 0x50, 0x7, 0xd9, 0x30, 0x5d, 0x0, + 0x1d, 0x40, 0x68, 0x32, 0x40, 0x0, 0x1, 0x0, + 0x16, 0x0, 0x2, 0x8c, 0xdd, 0xee, 0xef, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+908A "邊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x7, 0x60, 0x10, 0x0, + 0x0, 0x79, 0x0, 0xd, 0x67, 0x66, 0xd2, 0x0, + 0x0, 0xe, 0x40, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x4, 0x0, 0xd, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0xd1, 0x0, + 0x13, 0x3a, 0x10, 0x24, 0x5, 0x70, 0x32, 0x0, + 0x14, 0x3e, 0x25, 0x96, 0x86, 0x86, 0x6b, 0x70, + 0x0, 0xd, 0x7, 0x27, 0x86, 0x55, 0x94, 0x0, + 0x0, 0xd, 0x2, 0x75, 0x56, 0x95, 0x7c, 0x30, + 0x0, 0xd, 0x0, 0x0, 0xa8, 0x66, 0x93, 0x0, + 0x0, 0xd, 0x0, 0x6, 0x90, 0x0, 0xc1, 0x0, + 0x4, 0xc9, 0x80, 0x76, 0x0, 0x49, 0xa0, 0x0, + 0x3d, 0x10, 0x5d, 0x62, 0x0, 0x6, 0x11, 0x20, + 0x1, 0x0, 0x1, 0x8c, 0xee, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+90A3 "那" */ + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x2, 0x0, + 0x37, 0x6b, 0x66, 0xe3, 0xc6, 0x66, 0xf4, 0x0, + 0x0, 0xc1, 0xd, 0xc, 0x0, 0x3a, 0x0, 0x0, + 0xc, 0x10, 0xd0, 0xc0, 0x8, 0x20, 0x1, 0x66, + 0xd6, 0x6e, 0xc, 0x0, 0x80, 0x0, 0x2, 0xc, + 0x0, 0xd0, 0xc0, 0x23, 0x0, 0x0, 0x0, 0xc0, + 0xd, 0xc, 0x0, 0x70, 0x0, 0x0, 0xc, 0x0, + 0xd0, 0xc0, 0x2, 0x80, 0x3, 0x76, 0xd6, 0x6e, + 0xc, 0x0, 0xb, 0x10, 0x0, 0x37, 0x0, 0xd0, + 0xc0, 0x0, 0x94, 0x0, 0x8, 0x20, 0xd, 0xc, + 0x14, 0x4d, 0x40, 0x1, 0x90, 0x0, 0xd0, 0xc0, + 0x3d, 0xa0, 0x0, 0x91, 0x39, 0xcb, 0xc, 0x0, + 0x10, 0x0, 0x62, 0x0, 0x8, 0x10, 0xd1, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, + + /* U+90AA "邪" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, + 0x1, 0x76, 0x66, 0xa8, 0xa4, 0xb6, 0x6a, 0xd0, + 0x0, 0x10, 0x0, 0xd0, 0x2, 0xa0, 0xb, 0x40, + 0x0, 0x6a, 0x0, 0xd0, 0x2, 0xa0, 0x1a, 0x0, + 0x0, 0xb3, 0x0, 0xd0, 0x2, 0xa0, 0x62, 0x0, + 0x3, 0xe6, 0x66, 0xe7, 0xe5, 0xa0, 0x70, 0x0, + 0x0, 0x20, 0xd, 0xd0, 0x2, 0xa0, 0x61, 0x0, + 0x0, 0x0, 0x68, 0xd0, 0x2, 0xa0, 0x9, 0x0, + 0x0, 0x1, 0xc0, 0xd0, 0x2, 0xa0, 0x5, 0x60, + 0x0, 0x9, 0x30, 0xd0, 0x2, 0xa0, 0x2, 0xc0, + 0x0, 0x65, 0x0, 0xd0, 0x2, 0xa2, 0x27, 0xc0, + 0x5, 0x40, 0x0, 0xd0, 0x2, 0xa1, 0x9f, 0x50, + 0x12, 0x1, 0x66, 0xc0, 0x2, 0xa0, 0x1, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x3, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+90E8 "部" */ + 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x95, 0x55, 0x90, + 0x3, 0x66, 0x6b, 0x68, 0xb0, 0xd1, 0x17, 0x90, + 0x0, 0x11, 0x0, 0x25, 0x0, 0xd0, 0xb, 0x10, + 0x0, 0xb, 0x20, 0x79, 0x0, 0xd0, 0x19, 0x0, + 0x0, 0x6, 0x70, 0xa0, 0x0, 0xd0, 0x52, 0x0, + 0x16, 0x66, 0x67, 0x96, 0xb7, 0xd0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x18, 0x0, + 0x0, 0x86, 0x66, 0x6c, 0x20, 0xd0, 0x7, 0x40, + 0x0, 0xb2, 0x0, 0xd, 0x0, 0xd0, 0x2, 0xa0, + 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd0, 0x3, 0xc0, + 0x0, 0xa2, 0x0, 0xd, 0x0, 0xd4, 0xae, 0x60, + 0x0, 0xb7, 0x66, 0x6d, 0x0, 0xd0, 0x24, 0x0, + 0x0, 0xa1, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + + /* U+90F5 "郵" */ + 0x0, 0x0, 0x37, 0xc1, 0x2, 0x0, 0x2, 0x0, + 0x67, 0x9d, 0x64, 0x10, 0xc6, 0x6b, 0xd0, 0x0, + 0x0, 0xc0, 0x0, 0xc, 0x0, 0xc2, 0x4, 0x78, + 0x6d, 0x68, 0xa5, 0xc0, 0x37, 0x0, 0x0, 0xb0, + 0xc0, 0xc0, 0xc, 0x8, 0x0, 0x0, 0xb, 0xc, + 0xc, 0x0, 0xc0, 0x60, 0x0, 0x27, 0xd6, 0xd6, + 0xd8, 0x4c, 0x5, 0x30, 0x0, 0xb, 0xc, 0xc, + 0x0, 0xc0, 0x8, 0x20, 0x0, 0xb0, 0xc0, 0xc1, + 0xc, 0x0, 0xc, 0x5, 0x69, 0x6d, 0x69, 0x86, + 0xc0, 0x0, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0xc, + 0x0, 0xd, 0x30, 0x0, 0xc, 0x56, 0x50, 0xc3, + 0x8f, 0xc0, 0x2c, 0xda, 0x62, 0x0, 0xc, 0x0, + 0x30, 0x0, 0x40, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+90FD "都" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x65, 0x2, 0x90, 0xc6, 0x67, 0xe1, + 0x0, 0x76, 0xa9, 0xbb, 0xa0, 0xd0, 0x7, 0x70, + 0x0, 0x0, 0x65, 0x3d, 0x0, 0xd0, 0xb, 0x0, + 0x0, 0x0, 0x66, 0xc2, 0x31, 0xd0, 0x27, 0x0, + 0x7, 0x66, 0x6c, 0x96, 0x75, 0xd0, 0x60, 0x0, + 0x0, 0x0, 0x68, 0x1, 0x0, 0xd0, 0x44, 0x0, + 0x0, 0xb, 0xb6, 0x6d, 0x40, 0xd0, 0xa, 0x10, + 0x2, 0x7d, 0x0, 0xd, 0x0, 0xd0, 0x4, 0xa0, + 0x2, 0xd, 0x66, 0x6e, 0x0, 0xd0, 0x0, 0xe0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd2, 0x36, 0xd0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd0, 0x6f, 0x50, + 0x0, 0xd, 0x66, 0x6e, 0x10, 0xd0, 0x1, 0x0, + 0x0, 0xd, 0x0, 0x9, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + + /* U+914D "配" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x0, + 0x7, 0x67, 0x89, 0x69, 0x57, 0x66, 0x6d, 0x30, + 0x0, 0x5, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x2, 0x79, 0xad, 0x6a, 0x10, 0x0, 0xc, 0x10, + 0x3, 0xa5, 0x5c, 0xd, 0x0, 0x0, 0xc, 0x10, + 0x2, 0xa6, 0x4c, 0xd, 0x8, 0x66, 0x6d, 0x10, + 0x2, 0xa9, 0xc, 0xd, 0xd, 0x0, 0x8, 0x0, + 0x2, 0xb7, 0x9, 0xbd, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xc6, 0x66, 0x6d, 0xd, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x40, + 0x2, 0xa0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x60, + 0x2, 0xc6, 0x66, 0x6d, 0xc, 0x10, 0x0, 0xc0, + 0x3, 0xa0, 0x0, 0xd, 0x7, 0xcb, 0xbc, 0xc0, + 0x1, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+9152 "酒" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x77, 0x7, 0x66, 0x6a, 0x69, 0x67, 0x80, + 0x0, 0xc, 0x1, 0x0, 0x1b, 0x28, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x96, 0x6c, 0x7b, 0x6a, 0x20, + 0x8, 0x20, 0x51, 0xd0, 0x1a, 0x28, 0xd, 0x10, + 0x1, 0xe0, 0x70, 0xd0, 0x39, 0x28, 0xd, 0x0, + 0x0, 0x41, 0x70, 0xd0, 0x74, 0x19, 0xd, 0x0, + 0x0, 0x7, 0x20, 0xd0, 0x90, 0xc, 0x9e, 0x0, + 0x0, 0xb, 0x0, 0xd6, 0x10, 0x0, 0xd, 0x0, + 0x5, 0xba, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x68, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x58, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x69, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, + 0x0, 0x26, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+9154 "酔" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0xd1, 0x0, 0x0, + 0x27, 0x6a, 0x96, 0x79, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x56, 0xe6, 0xc4, 0x0, + 0x3, 0x1b, 0xa0, 0x51, 0x1, 0xb0, 0xa1, 0x0, + 0xb, 0x5c, 0xc6, 0xd3, 0x5, 0x70, 0xb0, 0x10, + 0xb, 0xa, 0xa0, 0xc0, 0xb, 0x0, 0xb0, 0x50, + 0xb, 0x18, 0xa0, 0xc0, 0x83, 0x13, 0xb7, 0xc1, + 0xb, 0x53, 0xa2, 0xc4, 0x20, 0x2b, 0x13, 0x20, + 0xb, 0x60, 0x39, 0xe0, 0x0, 0x28, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xc4, 0x76, 0x7b, 0x69, 0x70, + 0xb, 0x66, 0x66, 0xd0, 0x0, 0x18, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xc0, 0x0, 0x18, 0x0, 0x0, + 0xb, 0x66, 0x66, 0xd0, 0x0, 0x29, 0x0, 0x0, + 0xb, 0x0, 0x0, 0xb0, 0x0, 0x29, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x10, 0x0, 0x11, 0x0, 0x0, + + /* U+9178 "酸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x27, 0x68, 0x86, 0x95, 0x8, 0x70, 0x31, 0x0, + 0x0, 0xb, 0xb0, 0x1, 0x73, 0x1, 0x3c, 0x30, + 0x3, 0xb, 0xb0, 0x55, 0xeb, 0x86, 0x46, 0xa0, + 0xb, 0x7c, 0xc6, 0xd0, 0x16, 0x20, 0x62, 0x10, + 0xa, 0x2a, 0xb0, 0xc0, 0x5a, 0x20, 0x1c, 0x80, + 0xa, 0x38, 0xb0, 0xc4, 0x54, 0xa0, 0x0, 0xd0, + 0xa, 0x64, 0x99, 0xc1, 0xb, 0x96, 0x69, 0x10, + 0xa, 0x70, 0x1, 0xc0, 0x49, 0x0, 0x87, 0x0, + 0xa, 0x10, 0x0, 0xc1, 0x87, 0x1, 0xc0, 0x0, + 0xa, 0x66, 0x66, 0xc5, 0x3, 0x6a, 0x40, 0x0, + 0xa, 0x10, 0x0, 0xc0, 0x0, 0xba, 0x0, 0x0, + 0xa, 0x66, 0x66, 0xc0, 0x6, 0x9b, 0x50, 0x0, + 0xb, 0x10, 0x0, 0xb1, 0x84, 0x0, 0xbd, 0x80, + 0x4, 0x0, 0x0, 0x34, 0x0, 0x0, 0x6, 0x20, + + /* U+91AB "醫" */ + 0x0, 0x96, 0x66, 0x8a, 0x8, 0x66, 0xb0, 0x0, + 0x0, 0xc1, 0xa0, 0x10, 0xc, 0x0, 0xb0, 0x0, + 0x0, 0xc7, 0x7a, 0x74, 0x37, 0x0, 0xa8, 0x30, + 0x0, 0xc6, 0x6c, 0x79, 0x56, 0x66, 0x92, 0x0, + 0x0, 0xc0, 0x68, 0x40, 0x5, 0x12, 0xb1, 0x0, + 0x0, 0xc2, 0x60, 0x81, 0x1, 0x9e, 0x70, 0x0, + 0x2, 0xd8, 0x66, 0x6a, 0x57, 0x70, 0x79, 0x0, + 0x5, 0x66, 0x66, 0x66, 0x96, 0x66, 0x66, 0xc1, + 0x1, 0x1, 0x0, 0xd0, 0xc, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x66, 0xe6, 0x6d, 0x66, 0xd3, 0x0, + 0x0, 0xb, 0x6, 0x60, 0xc, 0x33, 0xb0, 0x0, + 0x0, 0xb, 0x33, 0x0, 0x3, 0x55, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x66, 0x66, 0x66, 0xd0, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + + /* U+91CD "重" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0x10, 0x0, + 0x2, 0x45, 0x67, 0xe7, 0x54, 0x31, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x35, 0x0, 0x57, + 0x66, 0x66, 0xe6, 0x66, 0x67, 0x70, 0x0, 0x3, + 0x0, 0xd, 0x0, 0x5, 0x0, 0x0, 0x0, 0xb8, + 0x66, 0xe6, 0x66, 0xe2, 0x0, 0x0, 0xa, 0x30, + 0xd, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa8, 0x66, + 0xe6, 0x66, 0xe0, 0x0, 0x0, 0xa, 0x30, 0xd, + 0x0, 0xd, 0x0, 0x0, 0x0, 0xa7, 0x66, 0xe6, + 0x66, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x2, 0x60, 0x0, 0x6, 0x76, 0x66, 0xe6, 0x66, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x5, 0x13, 0x76, 0x66, 0x66, 0xa6, 0x66, 0x66, + 0xa7, + + /* U+91CE "野" */ + 0x1, 0x20, 0x0, 0x4, 0x0, 0x0, 0x4, 0x0, + 0x1, 0xd6, 0xc7, 0x6e, 0x37, 0x66, 0x7e, 0x60, + 0x1, 0xb0, 0xa2, 0xd, 0x1, 0x40, 0x81, 0x0, + 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0x5e, 0x20, 0x0, + 0x1, 0xb0, 0xa2, 0xd, 0x0, 0x9, 0x60, 0x10, + 0x1, 0xb0, 0xa2, 0xd, 0x57, 0x69, 0x68, 0xe1, + 0x1, 0xd6, 0xc7, 0x6e, 0x0, 0xd, 0x8, 0x30, + 0x1, 0x70, 0xa2, 0x7, 0x0, 0xd, 0x3, 0x0, + 0x0, 0x0, 0xa2, 0x2, 0x0, 0xd, 0x0, 0x0, + 0x3, 0x76, 0xc7, 0x6c, 0x50, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x24, 0x40, 0xd, 0x0, 0x0, + 0x6, 0x8a, 0xb8, 0x40, 0x0, 0xd, 0x0, 0x0, + 0xa, 0x51, 0x0, 0x0, 0x6, 0xde, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + + /* U+91CF "量" */ + 0x0, 0x6, 0x66, 0x66, 0x66, 0x6b, 0x10, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x9, 0x86, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x7, 0x10, 0x0, 0x0, 0x5, 0x2, 0x30, + 0x27, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x70, + 0x0, 0x8, 0x66, 0x66, 0x66, 0x69, 0x30, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, + 0x0, 0xc, 0x66, 0x6e, 0x66, 0x6c, 0x20, 0x0, + 0x0, 0xc, 0x0, 0xd, 0x0, 0xa, 0x20, 0x0, + 0x0, 0xb, 0x66, 0x6e, 0x66, 0x69, 0x10, 0x0, + 0x0, 0x46, 0x66, 0x6e, 0x66, 0x67, 0xc1, 0x0, + 0x0, 0x11, 0x0, 0xd, 0x0, 0x0, 0x1, 0x0, + 0x5, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x6d, 0x90, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+91D1 "金" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xba, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xd0, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x30, 0xb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x1, 0xc7, 0x0, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0x0, 0x3a, 0xe9, 0x50, + 0x5, 0x70, 0x67, 0x6b, 0x66, 0x93, 0x4b, 0x50, + 0x11, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x70, 0x0, + 0x0, 0x57, 0x66, 0x6e, 0x66, 0x66, 0x61, 0x0, + 0x0, 0x3, 0x70, 0xe, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x9a, 0xe, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xe, 0x5, 0x50, 0x0, 0x0, + 0x16, 0x66, 0x67, 0x6e, 0x6a, 0x66, 0x6c, 0x80, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+91DD "針" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1d, 0x20, 0x0, + 0x0, 0x4, 0xe3, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xb, 0x37, 0xb1, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x49, 0x0, 0x86, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xa0, 0x1, 0x10, 0x0, 0xd, 0x0, 0x0, + 0x7, 0x36, 0xa7, 0x60, 0x0, 0xd, 0x0, 0x80, + 0x1, 0x0, 0xd0, 0x2, 0x86, 0x6e, 0x66, 0x62, + 0x0, 0x0, 0xd0, 0x70, 0x0, 0xd, 0x0, 0x0, + 0x1, 0x86, 0xe6, 0x62, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x60, 0xd0, 0xb3, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x94, 0xd1, 0xb0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x65, 0xd5, 0x11, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x25, 0xe8, 0x62, 0x0, 0xe, 0x0, 0x0, + 0x4, 0xd6, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, + + /* U+9244 "鉄" */ + 0x0, 0x1, 0xb2, 0x0, 0x0, 0x74, 0x0, 0x0, + 0x0, 0x6, 0xd2, 0x0, 0x41, 0x94, 0x0, 0x0, + 0x0, 0xd, 0x28, 0xa0, 0xe4, 0x93, 0x0, 0x0, + 0x0, 0x67, 0x0, 0xa6, 0xc0, 0x93, 0x7, 0x0, + 0x1, 0x90, 0x4, 0x26, 0x96, 0xb8, 0x67, 0x20, + 0x7, 0x37, 0xe6, 0x3a, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x13, 0x0, 0xb1, 0x0, 0x10, + 0x2, 0x66, 0xe6, 0xa6, 0x75, 0xd7, 0x57, 0xb1, + 0x0, 0x20, 0xd0, 0x30, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x90, 0xd1, 0xe1, 0x5, 0x88, 0x0, 0x0, + 0x0, 0xa3, 0xd6, 0x40, 0xc, 0x14, 0x80, 0x0, + 0x0, 0x51, 0xd5, 0x52, 0x67, 0x0, 0xb5, 0x0, + 0x4, 0x9b, 0xa5, 0x13, 0x80, 0x0, 0x2e, 0x80, + 0x4, 0x60, 0x0, 0x45, 0x0, 0x0, 0x3, 0xa2, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+925B "鉛" */ + 0x0, 0x1, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xd2, 0x0, 0x58, 0x66, 0xa4, 0x0, + 0x0, 0xd, 0x18, 0xb0, 0x59, 0x0, 0xb1, 0x0, + 0x0, 0x66, 0x0, 0x94, 0x58, 0x0, 0xb1, 0x0, + 0x1, 0xa1, 0x15, 0x10, 0x66, 0x0, 0xb1, 0x0, + 0x7, 0x26, 0xd5, 0x20, 0xa1, 0x0, 0xb2, 0x0, + 0x0, 0x0, 0xd0, 0x3, 0x70, 0x0, 0x5b, 0xb0, + 0x2, 0x55, 0xd6, 0xc5, 0x10, 0x0, 0x1, 0x0, + 0x0, 0x21, 0xd1, 0x30, 0xd6, 0x66, 0x8d, 0x0, + 0x0, 0x80, 0xd1, 0xe1, 0xd0, 0x0, 0x2a, 0x0, + 0x0, 0xa3, 0xd6, 0x40, 0xd0, 0x0, 0x2a, 0x0, + 0x0, 0x61, 0xd4, 0x42, 0xd0, 0x0, 0x2a, 0x0, + 0x3, 0x8a, 0xb6, 0x10, 0xd6, 0x66, 0x7a, 0x0, + 0x4, 0x70, 0x0, 0x0, 0xd0, 0x0, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+9280 "銀" */ + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x9, 0x66, 0x66, 0xa3, 0x0, + 0x0, 0xa5, 0x6b, 0x1c, 0x10, 0x0, 0xd1, 0x0, + 0x2, 0xa0, 0x8, 0x7c, 0x10, 0x0, 0xd0, 0x0, + 0xa, 0x10, 0x22, 0xc, 0x66, 0x66, 0xe0, 0x0, + 0x42, 0x7d, 0x64, 0xc, 0x10, 0x0, 0xd0, 0x0, + 0x0, 0xc, 0x0, 0xc, 0x43, 0x33, 0xd0, 0x0, + 0x5, 0x6d, 0x6c, 0x2c, 0x27, 0x11, 0x65, 0x0, + 0x2, 0xc, 0x3, 0xc, 0x16, 0x10, 0x7a, 0x10, + 0x8, 0xc, 0xd, 0x3c, 0x11, 0x96, 0x40, 0x0, + 0x7, 0x7c, 0x36, 0xc, 0x10, 0x86, 0x0, 0x0, + 0x3, 0x3c, 0x45, 0x3c, 0x13, 0x2b, 0x91, 0x0, + 0x28, 0xba, 0x61, 0xd, 0xa3, 0x0, 0x8f, 0x70, + 0x18, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, + + /* U+9322 "錢" */ + 0x0, 0x1, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x50, 0x0, 0xb6, 0xb, 0x40, 0x0, + 0x0, 0x5c, 0x72, 0x0, 0x69, 0x25, 0x9b, 0x10, + 0x0, 0xb2, 0x1d, 0x46, 0x6e, 0x31, 0x40, 0x0, + 0x5, 0x60, 0x3, 0x30, 0xb, 0x4a, 0xb1, 0x0, + 0x18, 0x56, 0x7a, 0x0, 0x6, 0xf7, 0x0, 0x20, + 0x20, 0x1a, 0x20, 0x3, 0x88, 0x7d, 0x40, 0x70, + 0x0, 0xa, 0x21, 0x53, 0x72, 0x66, 0xce, 0xc0, + 0x6, 0x6c, 0x7d, 0x30, 0x95, 0x2c, 0x4, 0x30, + 0x1, 0xa, 0x23, 0x0, 0x59, 0x36, 0x6b, 0x30, + 0x7, 0x1a, 0x2b, 0x78, 0x7e, 0x20, 0x10, 0x0, + 0x4, 0x9a, 0x3a, 0x0, 0xc, 0x25, 0xd0, 0x0, + 0x1, 0x4a, 0x53, 0x40, 0x5, 0xbd, 0x10, 0x0, + 0x4, 0x7d, 0x95, 0x0, 0x3, 0xf7, 0x0, 0x50, + 0xd, 0x60, 0x0, 0x1, 0x77, 0x2d, 0x93, 0x80, + 0x0, 0x0, 0x0, 0x34, 0x10, 0x0, 0x7c, 0xd0, + + /* U+932F "錯" */ + 0x0, 0xb, 0x40, 0x0, 0x85, 0xa, 0x30, 0x0, + 0x0, 0x4e, 0x40, 0x0, 0x95, 0xc, 0x20, 0x0, + 0x0, 0xb3, 0x5c, 0x36, 0xb9, 0x6d, 0x9b, 0x0, + 0x5, 0x70, 0x7, 0x50, 0x95, 0xc, 0x20, 0x0, + 0x19, 0x33, 0x55, 0x0, 0x95, 0xc, 0x20, 0x0, + 0x30, 0x4c, 0x32, 0x56, 0xb9, 0x6d, 0x7b, 0x80, + 0x0, 0xb, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3c, 0x5c, 0x4, 0x0, 0x0, 0x43, 0x0, + 0x4, 0x3c, 0x44, 0xb, 0x76, 0x66, 0xb8, 0x0, + 0x7, 0xb, 0x1c, 0x4b, 0x30, 0x0, 0x95, 0x0, + 0x6, 0x7b, 0x38, 0xb, 0x76, 0x66, 0xb5, 0x0, + 0x3, 0x5b, 0x54, 0x3b, 0x30, 0x0, 0x95, 0x0, + 0x17, 0xab, 0x72, 0xb, 0x76, 0x66, 0xb5, 0x0, + 0xa, 0x10, 0x0, 0xb, 0x20, 0x0, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+9332 "録" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0x20, 0x5, 0x76, 0x66, 0xc5, 0x0, + 0x0, 0xb3, 0x89, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x4, 0x80, 0xa, 0x40, 0x66, 0x66, 0xe0, 0x0, + 0xa, 0x22, 0x45, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x41, 0x5d, 0x32, 0x36, 0x66, 0x66, 0xe9, 0x90, + 0x0, 0xd, 0x0, 0x1, 0x0, 0xd0, 0x1, 0x0, + 0x16, 0x6e, 0x6d, 0x17, 0x40, 0xe0, 0x2e, 0x20, + 0x2, 0xd, 0x3, 0x0, 0xe0, 0xd6, 0x81, 0x0, + 0x8, 0xd, 0xd, 0x40, 0x21, 0xd7, 0x0, 0x0, + 0x7, 0x6d, 0x37, 0x0, 0x63, 0xd2, 0xa0, 0x0, + 0x3, 0x3d, 0x45, 0x4a, 0x20, 0xd0, 0x7b, 0x10, + 0x28, 0xba, 0x61, 0x94, 0x0, 0xd0, 0xa, 0x60, + 0x17, 0x0, 0x0, 0x0, 0x6e, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+9577 "長" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x66, 0x71, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6a, 0x30, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x66, 0x66, 0x6c, 0x50, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, 0x70, + 0x6, 0x76, 0xe6, 0x6a, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x1, 0xd0, 0x2, 0x60, 0x8, 0xb0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x75, 0x85, 0x10, 0x0, + 0x0, 0x1, 0xd0, 0x3, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xd4, 0x82, 0x0, 0x8c, 0x51, 0x0, + 0x0, 0x3, 0xf9, 0x0, 0x0, 0x3, 0xbf, 0xa1, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+9589 "閉" */ + 0x50, 0x0, 0x70, 0x4, 0x0, 0x7, 0xe, 0x66, + 0x6e, 0x10, 0xe6, 0x66, 0xf2, 0xe0, 0x0, 0xd0, + 0xd, 0x0, 0xe, 0xe, 0x66, 0x6d, 0x0, 0xd6, + 0x66, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x4, 0x1, 0x60, 0x0, 0xe0, 0xe0, + 0x0, 0x0, 0xd1, 0x0, 0xe, 0xe, 0x5, 0x66, + 0x6e, 0x67, 0xa0, 0xe0, 0xe0, 0x10, 0x1c, 0xe0, + 0x0, 0xe, 0xe, 0x0, 0xb, 0x3d, 0x0, 0x0, + 0xe0, 0xe0, 0x19, 0x20, 0xd0, 0x0, 0xe, 0xe, + 0x26, 0x0, 0xd, 0x0, 0x0, 0xe0, 0xe0, 0x0, + 0x3b, 0xd0, 0x0, 0xd, 0xe, 0x0, 0x0, 0x11, + 0x1, 0x8e, 0xa0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, + + /* U+958B "開" */ + 0x40, 0x0, 0x60, 0x4, 0x0, 0x6, 0xf, 0x66, + 0x6e, 0x10, 0xe6, 0x66, 0xf1, 0xe6, 0x66, 0xd0, + 0xe, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xe0, + 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x3, 0x0, 0x60, 0x0, 0xe0, 0xe0, + 0x16, 0x66, 0x66, 0xb2, 0xe, 0xe, 0x0, 0x2c, + 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x0, 0xc0, 0x2a, + 0x2, 0xe, 0xe, 0x7, 0x6d, 0x67, 0xc7, 0xa0, + 0xe0, 0xe0, 0x0, 0xc0, 0x2a, 0x0, 0xe, 0xe, + 0x0, 0x57, 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x49, + 0x0, 0x2a, 0x0, 0xd, 0xe, 0x13, 0x0, 0x1, + 0x11, 0x7d, 0xb0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x41, 0x0, + + /* U+9593 "間" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x66, + 0x6b, 0x0, 0x96, 0x66, 0xc1, 0xe0, 0x1, 0xc0, + 0xd, 0x0, 0xe, 0xe, 0x66, 0x6c, 0x0, 0xd6, + 0x66, 0xe0, 0xe0, 0x1, 0xc0, 0xd, 0x0, 0xe, + 0xe, 0x66, 0x6c, 0x0, 0xd6, 0x66, 0xe0, 0xe0, + 0x0, 0x10, 0x4, 0x0, 0xe, 0xe, 0x0, 0x96, + 0x66, 0x97, 0x0, 0xe0, 0xe0, 0xd, 0x10, 0x8, + 0x50, 0xe, 0xe, 0x0, 0xd1, 0x0, 0x85, 0x0, + 0xe0, 0xe0, 0xd, 0x66, 0x6b, 0x50, 0xe, 0xe, + 0x0, 0xd1, 0x0, 0x85, 0x0, 0xe0, 0xe0, 0xd, + 0x66, 0x6b, 0x50, 0xe, 0xe, 0x0, 0x80, 0x0, + 0x42, 0x0, 0xd0, 0xe0, 0x0, 0x0, 0x0, 0x18, + 0xdb, 0x5, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + + /* U+95A2 "関" */ + 0xa6, 0x66, 0xb1, 0xa, 0x66, 0x6c, 0x1e, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0xe0, 0xe6, 0x66, 0xd0, + 0xd, 0x66, 0x6e, 0xe, 0x0, 0xd, 0x0, 0xd0, + 0x0, 0xe0, 0xe6, 0x66, 0xd0, 0xe, 0x66, 0x6e, + 0xe, 0x0, 0x34, 0x0, 0x70, 0x0, 0xe0, 0xe0, + 0x0, 0xc1, 0x1b, 0x0, 0xe, 0xe, 0x2, 0x68, + 0x69, 0x69, 0x40, 0xe0, 0xe0, 0x2, 0x7, 0x60, + 0x0, 0xe, 0xe, 0x6, 0x76, 0xb8, 0x66, 0xa0, + 0xe0, 0xe0, 0x0, 0x1d, 0x73, 0x0, 0xe, 0xe, + 0x0, 0x1b, 0x20, 0x7d, 0x10, 0xe0, 0xe0, 0x58, + 0x10, 0x0, 0x31, 0xe, 0xe, 0x0, 0x0, 0x0, + 0x1, 0x7b, 0xd0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x52, 0x0, + + /* U+95DC "關" */ + 0x96, 0x66, 0xa1, 0x8, 0x66, 0x6b, 0x3d, 0x0, + 0xb, 0x0, 0xd0, 0x0, 0xd0, 0xe6, 0x66, 0xc0, + 0xd, 0x66, 0x6e, 0xd, 0x66, 0x6c, 0x0, 0xd6, + 0x66, 0xe0, 0xd0, 0x1, 0x70, 0x6, 0x70, 0xd, + 0xd, 0x0, 0x73, 0x11, 0x92, 0x30, 0xd0, 0xd0, + 0xa9, 0xb6, 0x97, 0xa9, 0xd, 0xd, 0x2, 0x63, + 0x42, 0x72, 0x50, 0xd0, 0xd0, 0x98, 0x69, 0x69, + 0x59, 0xd, 0xd, 0x9, 0x15, 0x65, 0x70, 0x60, + 0xd0, 0xd0, 0xc6, 0x86, 0x4a, 0x6d, 0xd, 0xd, + 0x2, 0x6, 0x44, 0x70, 0x50, 0xd0, 0xd0, 0x3, + 0x80, 0x57, 0x0, 0xd, 0xd, 0x1, 0x30, 0x1, + 0x10, 0x6c, 0xc0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x21, 0x0, + + /* U+9644 "附" */ + 0x20, 0x3, 0x0, 0x73, 0x0, 0x82, 0x0, 0xe6, + 0x6e, 0x10, 0xd1, 0x0, 0xd0, 0x0, 0xd0, 0x56, + 0x4, 0x80, 0x0, 0xc0, 0x0, 0xd0, 0x90, 0xa, + 0x10, 0x0, 0xc0, 0x0, 0xd0, 0x80, 0x2f, 0x25, + 0x66, 0xd7, 0xa0, 0xd0, 0x50, 0x7c, 0x1, 0x0, + 0xc0, 0x0, 0xd0, 0x55, 0x2c, 0x2, 0x0, 0xc0, + 0x0, 0xd0, 0xa, 0xc, 0x3, 0xb1, 0xc0, 0x0, + 0xd0, 0xd, 0xc, 0x0, 0x85, 0xc0, 0x0, 0xd3, + 0x4c, 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd4, 0xd3, + 0xc, 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, + 0x0, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x21, 0xd0, 0x0, 0xd0, 0x0, 0xb, 0x0, 0x2c, + 0xc0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+964D "降" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + 0x4, 0x0, 0x68, 0x0, 0x0, 0x0, 0xe6, 0x6f, + 0x30, 0xb7, 0x66, 0xaa, 0x0, 0xd0, 0x39, 0x2, + 0xc1, 0x2, 0xd1, 0x0, 0xd0, 0x72, 0x8, 0x18, + 0x1c, 0x20, 0x0, 0xd0, 0x60, 0x32, 0x3, 0xe3, + 0x0, 0x0, 0xd0, 0x60, 0x0, 0x2a, 0x6b, 0x61, + 0x0, 0xd0, 0x18, 0x5, 0x80, 0x83, 0x7d, 0xa1, + 0xd0, 0xa, 0x51, 0x0, 0xc1, 0x6, 0x0, 0xd0, + 0x8, 0x67, 0x66, 0xd6, 0x66, 0x10, 0xd5, 0x3d, + 0x3c, 0x20, 0xc0, 0x0, 0x0, 0xd2, 0xe7, 0x3a, + 0x0, 0xc0, 0x1, 0x60, 0xd0, 0x0, 0x57, 0x66, + 0xd6, 0x66, 0x50, 0xd0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, + + /* U+9650 "限" */ + 0x2, 0x0, 0x30, 0x20, 0x0, 0x3, 0x10, 0x0, + 0xe6, 0x7d, 0xd, 0x66, 0x66, 0xc6, 0x0, 0xd, + 0x6, 0x60, 0xd0, 0x0, 0xb, 0x30, 0x0, 0xd0, + 0x90, 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x7, + 0x0, 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0x50, + 0xd, 0x0, 0x0, 0xb3, 0x0, 0xd, 0x6, 0x20, + 0xd6, 0x66, 0x6c, 0x30, 0x0, 0xd0, 0xa, 0xd, + 0x6, 0x0, 0x45, 0x0, 0xd, 0x0, 0xc0, 0xd0, + 0x61, 0x8, 0xd2, 0x0, 0xd2, 0x2e, 0xd, 0x2, + 0x88, 0x50, 0x0, 0xd, 0x4f, 0x90, 0xd0, 0xa, + 0x40, 0x0, 0x0, 0xd0, 0x20, 0xd, 0x1, 0x3d, + 0x30, 0x0, 0xd, 0x0, 0x0, 0xd8, 0x60, 0x2e, + 0xa4, 0x0, 0xe0, 0x0, 0xd, 0x50, 0x0, 0x2c, + 0x60, 0x5, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+9662 "院" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x1, + 0xc6, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xb, + 0x3, 0x72, 0x96, 0x6a, 0x66, 0xa6, 0x0, 0xb0, + 0x70, 0x86, 0x0, 0x0, 0x8, 0x0, 0xb, 0x5, + 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb0, 0x30, + 0x2, 0x86, 0x66, 0x50, 0x0, 0xb, 0x5, 0x30, + 0x0, 0x0, 0x0, 0x10, 0x0, 0xb0, 0xb, 0x38, + 0x67, 0x68, 0x6b, 0x30, 0xb, 0x0, 0xb2, 0x3, + 0x91, 0xb0, 0x0, 0x0, 0xb2, 0x3d, 0x20, 0x57, + 0x1b, 0x0, 0x0, 0xb, 0x1c, 0x80, 0x9, 0x41, + 0xb0, 0x2, 0x0, 0xb0, 0x0, 0x0, 0xd0, 0x1b, + 0x0, 0x60, 0xb, 0x0, 0x0, 0xa4, 0x1, 0xb0, + 0xb, 0x1, 0xb0, 0x2, 0x82, 0x0, 0xc, 0xbc, + 0xc1, 0x15, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9664 "除" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x1, 0x10, 0x2, 0xd1, 0x0, 0x0, 0xa7, 0x6c, + 0x80, 0xa, 0x94, 0x0, 0x0, 0x92, 0xd, 0x0, + 0x3c, 0x8, 0x20, 0x0, 0x92, 0x55, 0x0, 0xb2, + 0x0, 0xc3, 0x0, 0x92, 0x70, 0x8, 0x40, 0x0, + 0x2d, 0xa3, 0x92, 0x60, 0x63, 0x76, 0x86, 0xb3, + 0x95, 0x92, 0x28, 0x0, 0x0, 0xc1, 0x0, 0x0, + 0x92, 0xb, 0x20, 0x0, 0xc1, 0x1, 0x40, 0x92, + 0x9, 0x68, 0x66, 0xd6, 0x67, 0x70, 0x96, 0x5d, + 0x30, 0x60, 0xc1, 0x20, 0x0, 0x93, 0xb6, 0x6, + 0xd1, 0xc1, 0x28, 0x0, 0x92, 0x0, 0x2b, 0x0, + 0xc1, 0x3, 0xd1, 0xa2, 0x1, 0x80, 0x0, 0xc0, + 0x0, 0x96, 0xa2, 0x2, 0x1, 0x6c, 0xe0, 0x0, + 0x10, 0x40, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + + /* U+9678 "陸" */ + 0x11, 0x0, 0x20, 0x0, 0xc, 0x10, 0x0, 0x3, + 0xc6, 0x6d, 0x50, 0x0, 0xd0, 0x0, 0x0, 0x2a, + 0x1, 0xb0, 0x66, 0x6e, 0x66, 0xc2, 0x2, 0xa0, + 0x72, 0x1, 0x0, 0xd0, 0x0, 0x0, 0x2a, 0x6, + 0x0, 0x0, 0xd, 0x0, 0x5, 0x2, 0xa0, 0x51, + 0x86, 0x76, 0x76, 0x66, 0x82, 0x2a, 0x5, 0x30, + 0xc, 0x70, 0x39, 0x40, 0x2, 0xa0, 0xb, 0x9, + 0x50, 0xc1, 0x1d, 0x30, 0x2a, 0x0, 0xe4, 0x10, + 0xd, 0x0, 0x21, 0x2, 0xc6, 0xa9, 0x0, 0x0, + 0xd0, 0x5, 0x0, 0x2a, 0x28, 0x1, 0x86, 0x6e, + 0x66, 0x72, 0x2, 0xa0, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x3, 0x3, 0xa0, 0x7, 0x66, 0x66, 0xa6, 0x67, + 0xa2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+967D "陽" */ + 0x40, 0x1, 0x40, 0x52, 0x22, 0x26, 0x10, 0xc6, + 0x6a, 0xb0, 0xd4, 0x44, 0x4d, 0x20, 0xb1, 0xb, + 0x10, 0xd6, 0x66, 0x6e, 0x0, 0xb1, 0x27, 0x0, + 0xd0, 0x0, 0xd, 0x0, 0xb1, 0x60, 0x0, 0xe6, + 0x66, 0x6e, 0x0, 0xb1, 0x51, 0x0, 0x70, 0x0, + 0x4, 0x0, 0xb1, 0xa, 0x27, 0x66, 0x66, 0x66, + 0xb4, 0xb1, 0x8, 0x40, 0x2d, 0x0, 0x0, 0x0, + 0xb1, 0x7, 0x70, 0xb8, 0x86, 0x86, 0xd3, 0xb6, + 0x7d, 0x39, 0x42, 0xb2, 0xb0, 0xd0, 0xb1, 0x85, + 0x62, 0xb, 0x19, 0x50, 0xd0, 0xb1, 0x0, 0x1, + 0x92, 0x4a, 0x2, 0xb0, 0xb1, 0x0, 0x15, 0x3, + 0xa0, 0x5, 0x90, 0xb1, 0x0, 0x0, 0x66, 0x5, + 0xbe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, + 0x0, + + /* U+968E "階" */ + 0x12, 0x0, 0x41, 0x60, 0x0, 0x90, 0x0, 0x3, + 0xb6, 0x6e, 0x4d, 0x0, 0xd, 0x3, 0x10, 0x29, + 0x4, 0x70, 0xd0, 0x51, 0xd2, 0xc5, 0x2, 0x90, + 0x90, 0xe, 0x66, 0x3e, 0x60, 0x10, 0x29, 0x24, + 0x0, 0xd0, 0x1, 0xd0, 0x5, 0x2, 0x90, 0x70, + 0xd, 0x76, 0xe, 0x0, 0xa0, 0x29, 0x4, 0x71, + 0xc3, 0x11, 0x8b, 0xba, 0x12, 0x90, 0xd, 0x0, + 0x7, 0x80, 0x0, 0x0, 0x29, 0x11, 0xe0, 0xa6, + 0xa6, 0x66, 0xb1, 0x2, 0x95, 0xf6, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x29, 0x0, 0x0, 0xd6, 0x66, + 0x66, 0xd0, 0x2, 0x90, 0x0, 0xd, 0x0, 0x0, + 0xd, 0x0, 0x39, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xd0, 0x3, 0x90, 0x0, 0xd, 0x66, 0x66, 0x6d, + 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, 0x20, + 0x0, + + /* U+969B "際" */ + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x5, + 0x0, 0x44, 0xd, 0x50, 0x40, 0x0, 0x0, 0xc8, + 0x7d, 0x82, 0xf6, 0xa8, 0x66, 0xc3, 0xc, 0x1, + 0xc0, 0xa6, 0xc, 0x43, 0x1b, 0x0, 0xc0, 0x63, + 0x38, 0x95, 0xa0, 0x67, 0x10, 0xc, 0x6, 0x7, + 0x93, 0xa2, 0x7, 0x60, 0x0, 0xc0, 0x60, 0x2, + 0x57, 0x0, 0xc, 0x50, 0xc, 0x2, 0x80, 0x47, + 0x0, 0x2, 0x4c, 0x90, 0xc0, 0xb, 0x43, 0x18, + 0x66, 0x64, 0x0, 0xc, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x6, 0x0, 0xc4, 0xad, 0x6, 0x76, 0x6e, + 0x66, 0x62, 0xc, 0x3, 0x10, 0x6, 0x40, 0xd0, + 0x50, 0x0, 0xc0, 0x0, 0x4, 0xc3, 0xd, 0x3, + 0xc2, 0xc, 0x0, 0x5, 0x70, 0x0, 0xd0, 0x5, + 0xd0, 0xd0, 0x2, 0x20, 0x17, 0xdb, 0x0, 0x4, + 0x4, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + + /* U+969C "障" */ + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0xb6, + 0x8d, 0x0, 0x0, 0xc0, 0x6, 0x0, 0xc1, 0x76, + 0x7, 0x97, 0x66, 0xd6, 0x30, 0xb1, 0xa0, 0x0, + 0xc, 0x4, 0x90, 0x0, 0xb1, 0x71, 0x66, 0x6c, + 0x6a, 0x66, 0xc5, 0xb2, 0x40, 0x22, 0x0, 0x0, + 0x3, 0x0, 0xb1, 0x43, 0xb, 0x76, 0x66, 0x6c, + 0x50, 0xb1, 0xb, 0xb, 0x20, 0x0, 0xb, 0x20, + 0xb1, 0xd, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb5, + 0x4e, 0xb, 0x76, 0x66, 0x6c, 0x20, 0xb3, 0xd5, + 0x5, 0x0, 0xd0, 0x4, 0x30, 0xb1, 0x2, 0x86, + 0x66, 0xe6, 0x66, 0xa6, 0xb1, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, + + /* U+96A3 "隣" */ + 0x20, 0x3, 0x0, 0x20, 0x29, 0x3, 0x0, 0xc, + 0x66, 0xe5, 0x8, 0x62, 0xb0, 0xd5, 0x0, 0xc0, + 0x3a, 0x0, 0x7, 0x2b, 0x64, 0x0, 0xc, 0x9, + 0x10, 0x67, 0x7a, 0xd9, 0x69, 0x60, 0xc2, 0x40, + 0x0, 0x1b, 0x4b, 0x72, 0x0, 0xc, 0x7, 0x0, + 0x58, 0x2, 0xb0, 0xac, 0x70, 0xc0, 0x37, 0x32, + 0x20, 0x29, 0x2, 0x21, 0xc, 0x0, 0xc0, 0x5c, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0xd, 0x1c, 0x78, + 0xc4, 0x7d, 0x69, 0xc, 0x4e, 0x88, 0x70, 0x95, + 0x51, 0xc0, 0x0, 0xc0, 0x13, 0x4a, 0x2c, 0xc, + 0x1c, 0x5, 0xc, 0x0, 0x0, 0x3a, 0x41, 0x86, + 0xd6, 0x61, 0xc0, 0x0, 0x7, 0x70, 0x0, 0xc, + 0x0, 0xd, 0x0, 0x7, 0x40, 0x0, 0x0, 0xd0, + 0x0, 0x30, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, + + /* U+96A8 "隨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x11, 0x50, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xc5, + 0x7d, 0x30, 0x46, 0x6e, 0x66, 0xa3, 0xc, 0x7, + 0x34, 0x91, 0x19, 0x30, 0x2, 0x0, 0xc0, 0x70, + 0xc, 0x8, 0x96, 0xb6, 0x80, 0xc, 0x22, 0x0, + 0x5, 0x66, 0x6d, 0x67, 0x70, 0xc0, 0x90, 0x3, + 0x1, 0x10, 0x0, 0x10, 0xc, 0x4, 0x87, 0xd5, + 0x2b, 0x66, 0x6d, 0x0, 0xc0, 0xd, 0xc, 0x1, + 0xa0, 0x0, 0xc0, 0xc, 0x1, 0xd0, 0xc0, 0x1c, + 0x66, 0x6c, 0x0, 0xc5, 0xe4, 0xc, 0x1, 0xc6, + 0x66, 0xc0, 0xc, 0x0, 0x0, 0xc0, 0x2a, 0x0, + 0xc, 0x0, 0xc0, 0x0, 0x1a, 0x22, 0xa0, 0x38, + 0xa0, 0xc, 0x0, 0x3a, 0x6, 0x84, 0x10, 0x42, + 0x10, 0xb0, 0x5, 0x20, 0x2, 0x9d, 0xee, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96BB "隻" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0xd, 0x0, 0x0, 0x10, 0x0, 0x3, + 0xf6, 0x66, 0x76, 0x66, 0x9c, 0x10, 0x1, 0xac, + 0x0, 0xe, 0x0, 0x2, 0x0, 0x1, 0x71, 0xd6, + 0x66, 0xe6, 0x66, 0xa1, 0x0, 0x20, 0xc, 0x0, + 0xe, 0x0, 0x6, 0x0, 0x0, 0x0, 0xd6, 0x66, + 0xe6, 0x66, 0x62, 0x0, 0x0, 0xd, 0x66, 0x6e, + 0x66, 0x66, 0xd2, 0x0, 0x0, 0x60, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x77, 0x66, 0x66, 0x67, + 0xf3, 0x0, 0x0, 0x0, 0x8, 0x10, 0x2, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x56, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x10, 0x0, + 0x0, 0x0, 0x47, 0x85, 0x0, 0x6b, 0xcb, 0xa9, + 0x13, 0x41, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, + + /* U+96C6 "集" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x5, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xc2, 0x0, 0x2, 0x0, + 0x0, 0x4, 0xe6, 0x66, 0xa6, 0x66, 0x6b, 0x10, + 0x0, 0x1d, 0xa0, 0x0, 0xc0, 0x0, 0x20, 0x0, + 0x0, 0x94, 0xc6, 0x66, 0xd6, 0x66, 0x93, 0x0, + 0x6, 0x12, 0xa0, 0x0, 0xc0, 0x0, 0x60, 0x0, + 0x0, 0x2, 0xc6, 0x66, 0xd6, 0x66, 0x62, 0x0, + 0x0, 0x3, 0xc6, 0x66, 0xd6, 0x66, 0x7b, 0x0, + 0x0, 0x3, 0x90, 0x1, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0x66, 0x66, 0x66, 0xd6, 0x66, 0x66, 0xd2, + 0x1, 0x0, 0x0, 0x98, 0xb5, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x51, 0xb0, 0x94, 0x0, 0x0, + 0x0, 0x4, 0x92, 0x1, 0xb0, 0x9, 0xb5, 0x20, + 0x3, 0x64, 0x0, 0x2, 0xc0, 0x0, 0x3b, 0xd3, + 0x1, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + + /* U+96D1 "雑" */ + 0x0, 0xa, 0x10, 0x0, 0x2, 0x5, 0x0, 0x0, + 0x0, 0xd, 0x2, 0x0, 0x3e, 0x9, 0x60, 0x0, + 0x3, 0x6e, 0x6e, 0x10, 0x66, 0x4, 0x52, 0x0, + 0x0, 0x1b, 0xb, 0x0, 0xb7, 0x6a, 0x69, 0x60, + 0x0, 0x65, 0x38, 0x42, 0xf2, 0xd, 0x0, 0x0, + 0x2, 0x90, 0x2b, 0xb9, 0xc2, 0xd, 0x0, 0x0, + 0x15, 0x1, 0xb0, 0x5, 0xa7, 0x6e, 0x6b, 0x20, + 0x0, 0x1, 0xb0, 0x20, 0xa2, 0xd, 0x0, 0x0, + 0x6, 0x66, 0xd6, 0x84, 0xa2, 0xd, 0x0, 0x0, + 0x0, 0x31, 0xb2, 0x0, 0xa7, 0x6e, 0x6c, 0x20, + 0x0, 0xd4, 0xb4, 0x80, 0xa2, 0xd, 0x0, 0x0, + 0x5, 0x51, 0xb0, 0x88, 0xa2, 0xd, 0x0, 0x0, + 0x17, 0x1, 0xb0, 0x4, 0xb2, 0xd, 0x2, 0x50, + 0x0, 0x3a, 0xa0, 0x0, 0xb7, 0x66, 0x66, 0x50, + 0x0, 0x3, 0x10, 0x0, 0x50, 0x0, 0x0, 0x0, + + /* U+96D6 "雖" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, + 0x86, 0x66, 0xd3, 0x7, 0xb7, 0xa0, 0x0, 0x8, + 0x20, 0xc, 0x0, 0xb2, 0xa, 0x1, 0x0, 0x82, + 0x0, 0xc0, 0x1d, 0x66, 0x86, 0xb2, 0x9, 0x7a, + 0x6d, 0x17, 0xc0, 0x1b, 0x0, 0x0, 0x20, 0xc0, + 0x0, 0x7c, 0x1, 0xb0, 0x0, 0x28, 0x6d, 0x66, + 0xb0, 0xd6, 0x6c, 0x6b, 0x2, 0x90, 0xc0, 0x4a, + 0xc, 0x1, 0xb0, 0x0, 0x29, 0xc, 0x4, 0xa0, + 0xc0, 0x1b, 0x0, 0x2, 0xb6, 0xd6, 0x8a, 0xd, + 0x66, 0xc6, 0xb0, 0x13, 0xc, 0x3, 0x10, 0xc0, + 0x1b, 0x0, 0x0, 0x0, 0xc0, 0x73, 0xc, 0x1, + 0xb0, 0x0, 0x45, 0x7d, 0x88, 0xc0, 0xc0, 0x1b, + 0x6, 0x26, 0x95, 0x10, 0xc, 0xd, 0x66, 0x66, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+96D9 "雙" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x28, 0x0, 0x27, 0x39, 0x0, 0x0, + 0x0, 0x4c, 0xa, 0x10, 0x78, 0xa, 0x3, 0x0, + 0x0, 0xd7, 0x68, 0x85, 0xc6, 0x6a, 0x68, 0x20, + 0x7, 0xe0, 0x1a, 0x23, 0xf0, 0x1a, 0x2, 0x0, + 0x13, 0xc6, 0x6c, 0x76, 0xc6, 0x6c, 0x66, 0x0, + 0x0, 0xc0, 0x1a, 0x20, 0xc0, 0x1a, 0x2, 0x0, + 0x0, 0xc6, 0x6c, 0x62, 0xc6, 0x6c, 0x66, 0x0, + 0x0, 0xc3, 0x4b, 0x54, 0xc0, 0x1a, 0x5, 0x10, + 0x0, 0xa3, 0x33, 0x32, 0xa6, 0x66, 0x66, 0x30, + 0x0, 0x56, 0x76, 0x66, 0x66, 0x6b, 0x50, 0x0, + 0x0, 0x0, 0x26, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x82, 0x5a, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x78, 0x50, 0x17, 0xbb, 0x98, 0x83, + 0x4, 0x52, 0x0, 0x0, 0x0, 0x1, 0x46, 0x50, + + /* U+96E2 "離" */ + 0x0, 0x8, 0x0, 0x0, 0x24, 0x11, 0x0, 0x0, + 0x0, 0x84, 0x5, 0x16, 0xc0, 0xb1, 0x0, 0x46, + 0x66, 0x97, 0x62, 0x93, 0x7, 0x40, 0x0, 0x93, + 0x6b, 0x36, 0xd, 0x66, 0x86, 0xb2, 0xb, 0xa, + 0x80, 0xc3, 0xf0, 0xd, 0x0, 0x0, 0xc4, 0x9, + 0xc, 0x6d, 0x0, 0xd0, 0x0, 0x2c, 0x68, 0x66, + 0xc1, 0xd6, 0x6e, 0x6a, 0x0, 0x0, 0xc2, 0x2, + 0xd, 0x0, 0xd0, 0x0, 0x2a, 0x6b, 0x55, 0xd2, + 0xd0, 0xd, 0x0, 0x2, 0x97, 0x15, 0xb, 0xd, + 0x66, 0xe6, 0xb0, 0x2b, 0xc8, 0xa4, 0xb0, 0xd0, + 0xd, 0x0, 0x2, 0x94, 0x1, 0xb, 0xd, 0x0, + 0xd0, 0x0, 0x29, 0x0, 0x0, 0xb0, 0xd0, 0xd, + 0x5, 0x2, 0x90, 0x5, 0xcb, 0xd, 0x66, 0x66, + 0x63, 0x13, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, + 0x0, + + /* U+96E3 "難" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x2, 0x60, 0x4, 0xc5, 0x40, 0x0, + 0x0, 0x29, 0x2, 0xb0, 0x7, 0xa0, 0xe1, 0x0, + 0x5, 0x8b, 0x67, 0xd8, 0x5b, 0x20, 0x50, 0x60, + 0x0, 0x29, 0x2, 0xb0, 0x1f, 0x66, 0xd6, 0x72, + 0x0, 0x28, 0xc7, 0x70, 0x6e, 0x0, 0xc0, 0x0, + 0x0, 0x86, 0xd6, 0x69, 0x6d, 0x0, 0xc0, 0x0, + 0x0, 0xc0, 0xc0, 0xb, 0xd, 0x66, 0xd6, 0x90, + 0x0, 0xd6, 0xd6, 0x6b, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0x30, 0xc0, 0x5, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0x76, 0xd6, 0x66, 0xd, 0x66, 0xd6, 0xa0, + 0x5, 0x76, 0xd6, 0x6a, 0x4d, 0x0, 0xc0, 0x0, + 0x0, 0x1, 0x93, 0x10, 0xd, 0x0, 0xc0, 0x0, + 0x0, 0xa, 0x21, 0xd3, 0xd, 0x0, 0xc0, 0x40, + 0x1, 0x82, 0x0, 0x44, 0xd, 0x66, 0x76, 0x73, + 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + + /* U+96E8 "雨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x67, + 0x66, 0x66, 0x86, 0x66, 0x68, 0xc1, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xd0, 0x0, 0x5, 0x0, 0xd, 0x66, 0x66, 0xe6, + 0x66, 0x6e, 0x20, 0xc, 0x16, 0x20, 0xd1, 0x50, + 0xe, 0x0, 0xc, 0x11, 0xe3, 0xd0, 0x6c, 0xe, + 0x0, 0xc, 0x10, 0x53, 0xd0, 0x8, 0xe, 0x0, + 0xc, 0x10, 0x0, 0xd0, 0x0, 0xe, 0x0, 0xc, + 0x1a, 0x50, 0xd1, 0x93, 0xe, 0x0, 0xc, 0x11, + 0xe0, 0xd0, 0x2e, 0xe, 0x0, 0xc, 0x10, 0x10, + 0xd0, 0x3, 0xe, 0x0, 0xc, 0x10, 0x0, 0xd0, + 0x15, 0x5f, 0x0, 0xc, 0x10, 0x0, 0x90, 0x2, + 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, + + /* U+96EA "雪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, 0x0, + 0x4, 0x76, 0x66, 0xd6, 0x66, 0x66, 0x0, 0x1, + 0x20, 0x0, 0xd, 0x0, 0x0, 0x5, 0x10, 0x59, + 0x66, 0x66, 0xe6, 0x66, 0x66, 0xe5, 0xd, 0x45, + 0x66, 0x1d, 0x5, 0x66, 0x42, 0x0, 0x30, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x66, + 0x1d, 0x5, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x70, 0x0, 0x10, 0x0, 0x0, 0x37, 0x66, 0x66, + 0x66, 0x6b, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x6, 0x66, 0x66, 0x66, + 0x6a, 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x60, 0x0, 0x6, 0x76, 0x66, 0x66, 0x66, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, + + /* U+96F2 "雲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x66, 0x66, 0x66, 0x98, 0x0, 0x0, 0x20, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x9, 0x66, 0x66, + 0xc8, 0x66, 0x66, 0xb1, 0x59, 0x0, 0x0, 0xa3, + 0x0, 0x1, 0xc3, 0x82, 0x56, 0x60, 0xa3, 0x56, + 0x64, 0x10, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x56, 0x60, 0xa2, 0x56, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x76, 0x66, 0x66, 0x66, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x70, 0x47, 0x66, 0x6b, + 0x76, 0x66, 0x66, 0x83, 0x0, 0x0, 0x8b, 0x40, + 0x35, 0x0, 0x0, 0x0, 0x49, 0x30, 0x0, 0x4, + 0xd4, 0x0, 0x5, 0xfc, 0xba, 0x87, 0x65, 0x7e, + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x4, 0x0, + + /* U+96FB "電" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x66, 0x66, 0x66, 0x99, 0x0, 0x2, 0x10, + 0x0, 0xe0, 0x0, 0x0, 0x10, 0x9, 0x66, 0x66, + 0xe6, 0x66, 0x66, 0xd5, 0x5a, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x90, 0x42, 0x46, 0x60, 0xe0, 0x26, + 0x65, 0x20, 0x0, 0x45, 0x50, 0xd0, 0x26, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0x96, 0x66, 0x7e, 0x0, 0x0, + 0xd0, 0x0, 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, + 0x66, 0xe6, 0x66, 0x6b, 0x0, 0x0, 0xd0, 0x0, + 0xe0, 0x0, 0x1b, 0x0, 0x0, 0xd6, 0x66, 0xe6, + 0x66, 0x6b, 0x40, 0x0, 0x40, 0x0, 0xe0, 0x0, + 0x1, 0x72, 0x0, 0x0, 0x0, 0xbd, 0xbb, 0xbb, + 0xd6, + + /* U+9700 "需" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x20, 0x0, + 0x5, 0x66, 0x68, 0xb6, 0x66, 0x64, 0x0, 0x7, + 0x66, 0x66, 0x8b, 0x66, 0x66, 0x7c, 0x11, 0xd0, + 0x0, 0x4, 0x90, 0x0, 0x7, 0x20, 0x13, 0x6, + 0x63, 0x49, 0x46, 0x63, 0x10, 0x0, 0x1, 0x66, + 0x34, 0x94, 0x66, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x61, 0x0, 0x76, 0x66, 0x6d, + 0x66, 0x66, 0x66, 0x40, 0x0, 0x30, 0x4, 0x30, + 0x0, 0x0, 0x40, 0x0, 0xe, 0x66, 0xe6, 0x6e, + 0x66, 0x7c, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, + 0x2, 0xa0, 0x0, 0xd, 0x0, 0xd0, 0xd, 0x0, + 0x2a, 0x0, 0x0, 0xd0, 0xd, 0x0, 0xd0, 0x2, + 0xa0, 0x0, 0xd, 0x0, 0x90, 0x7, 0x5, 0xc9, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, + + /* U+9707 "震" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x66, 0x66, 0x66, 0xd6, 0x0, 0x0, + 0x21, 0x10, 0xa, 0x20, 0x0, 0x2, 0x0, 0x9, + 0x66, 0x66, 0xc7, 0x66, 0x66, 0xf3, 0x3, 0xd2, + 0x66, 0x3a, 0x25, 0x66, 0x53, 0x0, 0x11, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x66, + 0x38, 0x15, 0x66, 0x50, 0x0, 0x3, 0xb6, 0x66, + 0x66, 0x66, 0x6a, 0x40, 0x0, 0x3a, 0x16, 0x66, + 0x66, 0x6a, 0x50, 0x0, 0x3, 0xa0, 0x20, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x3c, 0x69, 0x67, 0x66, + 0x66, 0x6b, 0x30, 0x5, 0x80, 0xd0, 0x25, 0x0, + 0xb4, 0x0, 0x0, 0x84, 0xd, 0x0, 0x66, 0x84, + 0x0, 0x0, 0xb, 0x0, 0xd0, 0x52, 0x7a, 0x30, + 0x0, 0x6, 0x20, 0xe, 0xa1, 0x0, 0x3b, 0xfc, + 0x70, 0x20, 0x0, 0x30, 0x0, 0x0, 0x1, 0x40, + + /* U+9752 "青" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x58, 0x0, + 0x5, 0x76, 0x66, 0x6e, 0x66, 0x66, 0x66, 0x10, + 0x0, 0x26, 0x66, 0x6e, 0x66, 0x68, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x10, + 0x6, 0x66, 0x66, 0x6d, 0x66, 0x66, 0x6b, 0xc0, + 0x1, 0x0, 0x20, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x6, 0xce, 0x0, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x43, 0x0, 0x0, + + /* U+9759 "静" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x91, 0x0, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x11, 0xc1, 0x42, 0x1d, 0x0, 0x60, 0x0, + 0x3, 0x65, 0xd5, 0x53, 0x87, 0x68, 0xd2, 0x0, + 0x1, 0x66, 0xd6, 0xa4, 0x60, 0x8, 0x10, 0x0, + 0x0, 0x10, 0xc0, 0x3, 0x76, 0x97, 0x6d, 0x30, + 0x7, 0x66, 0xa6, 0x79, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0x30, 0x0, 0x40, 0x0, 0xc0, 0xc, 0x70, + 0x0, 0xd6, 0x66, 0xd4, 0x76, 0xd6, 0x6d, 0x52, + 0x0, 0xd6, 0x66, 0xb0, 0x0, 0xc0, 0xc, 0x0, + 0x0, 0xc0, 0x0, 0xb1, 0x66, 0xd6, 0x6d, 0x0, + 0x0, 0xd6, 0x66, 0xb0, 0x10, 0xc0, 0x4, 0x0, + 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x0, + 0x0, 0xc0, 0x5a, 0x90, 0x59, 0xd0, 0x0, 0x0, + 0x0, 0x40, 0x6, 0x10, 0x5, 0x40, 0x0, 0x0, + + /* U+975E "非" */ + 0x0, 0x0, 0x0, 0x91, 0xa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x0, + 0x4, 0x76, 0x66, 0xe0, 0xd, 0x66, 0x6a, 0x50, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x56, 0x66, 0xe0, 0xd, 0x66, 0x6c, 0x20, + 0x0, 0x10, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x1, 0x50, + 0x7, 0x66, 0x66, 0xe0, 0xd, 0x66, 0x66, 0x70, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x3, 0x0, 0x0, 0x0, + + /* U+9762 "面" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa0, + 0x18, 0x66, 0x66, 0x6f, 0x76, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x61, 0x0, 0x0, 0x5, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x6d, 0x66, 0x6e, 0x10, + 0x0, 0xd1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xd6, 0x6e, 0x0, 0xd, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, + 0x0, 0xc1, 0x0, 0xc0, 0xd, 0x0, 0xe, 0x0, + 0x0, 0xd6, 0x66, 0xd6, 0x6e, 0x66, 0x6e, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+9769 "革" */ + 0x0, 0x0, 0xa, 0x20, 0x0, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x8, 0x10, + 0x2, 0x86, 0x6e, 0x66, 0x66, 0xe6, 0x66, 0x30, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x6b, 0x76, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, + 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xf1, 0x0, + 0x0, 0xd, 0x10, 0xb, 0x20, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x66, 0x6d, 0x76, 0x66, 0xe0, 0x0, + 0x0, 0x8, 0x0, 0xb, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x3, 0x90, + 0x7, 0x66, 0x66, 0x6d, 0x76, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + + /* U+9774 "靴" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x66, 0x7, 0x40, 0x8, 0x17, 0x10, 0x0, + 0x0, 0x66, 0x8, 0x52, 0xe, 0x1c, 0x0, 0x0, + 0x6, 0xa9, 0x6b, 0x84, 0x48, 0xc, 0x0, 0x0, + 0x0, 0x66, 0x8, 0x40, 0x81, 0xc, 0x4, 0xa0, + 0x0, 0x68, 0xc9, 0x30, 0xa0, 0xc, 0xb, 0x30, + 0x0, 0x20, 0xc0, 0x53, 0xe2, 0xc, 0x48, 0x0, + 0x0, 0xd6, 0xd6, 0xd6, 0xb0, 0xc, 0x90, 0x0, + 0x0, 0xc0, 0xc0, 0xc1, 0xb0, 0xd, 0x20, 0x0, + 0x0, 0xd6, 0xd6, 0xc0, 0xb0, 0x7d, 0x0, 0x0, + 0x0, 0x30, 0xc0, 0x10, 0xb3, 0x1c, 0x0, 0x0, + 0x5, 0x66, 0xd6, 0xa6, 0xb0, 0xc, 0x0, 0x10, + 0x1, 0x0, 0xc0, 0x0, 0xb0, 0xc, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x0, 0xb0, 0xb, 0x0, 0x90, + 0x0, 0x0, 0xd0, 0x0, 0xc1, 0x8, 0xcb, 0xe2, + 0x0, 0x0, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+97F3 "音" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0x70, 0x0, 0x3, + 0x76, 0x76, 0x66, 0x68, 0x68, 0x30, 0x0, 0x0, + 0xa, 0x20, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x60, 0x8, 0x0, 0x1b, 0x30, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, + 0x66, 0xe2, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, + 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe, 0x66, 0x66, 0x66, 0xe0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+97FF "響" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x1, 0x28, 0x10, 0x0, 0x10, 0x0, 0xb4, + 0xb, 0x66, 0xc3, 0xc6, 0xc3, 0x28, 0x15, 0x7b, + 0x66, 0xc0, 0xb2, 0x60, 0x49, 0x86, 0xb, 0x0, + 0xb0, 0xb4, 0x20, 0x5, 0x34, 0x8b, 0x68, 0x70, + 0xb0, 0x92, 0xa, 0x6b, 0x2b, 0x36, 0xa0, 0xb2, + 0x75, 0x0, 0x68, 0x9, 0x80, 0x40, 0xb3, 0xa0, + 0x36, 0x40, 0x0, 0x46, 0x0, 0x36, 0x0, 0x1, + 0x76, 0xb9, 0x66, 0xb8, 0x66, 0x10, 0x0, 0x0, + 0x18, 0x3, 0x81, 0x0, 0x71, 0x56, 0x58, 0x55, + 0x55, 0x55, 0x85, 0x53, 0x0, 0xd, 0x66, 0x66, + 0x66, 0xd2, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, + 0xd0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, 0xd0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x30, 0x0, + + /* U+9803 "頃" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, + 0xa1, 0x0, 0x7, 0x66, 0xe6, 0x66, 0x50, 0xd, + 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x2, 0xb6, 0x76, 0x6d, 0x30, 0xd, 0x0, + 0x20, 0x2b, 0x0, 0x0, 0xd0, 0x0, 0xd6, 0x69, + 0x21, 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, + 0x1b, 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0x1, + 0xd6, 0x66, 0x6e, 0x0, 0xd, 0x0, 0x0, 0x1b, + 0x0, 0x0, 0xd0, 0x0, 0xd0, 0x5, 0x31, 0xb0, + 0x0, 0xd, 0x0, 0xd, 0x5a, 0x20, 0x2a, 0x76, + 0x66, 0xa0, 0x0, 0xfa, 0x0, 0x0, 0xd, 0x30, + 0x71, 0x0, 0x3, 0x0, 0x0, 0xa, 0x50, 0x1, + 0xd3, 0x0, 0x0, 0x0, 0x17, 0x20, 0x0, 0x5, + 0xa0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+9805 "項" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x0, 0x4, 0x7, 0x66, 0xd6, 0x66, 0x50, + 0x6, 0x7c, 0x67, 0x20, 0x1, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0x97, 0x76, 0x6c, 0x30, + 0x0, 0xd, 0x0, 0x3, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xa0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x0, 0x2, 0xc6, 0x66, 0x6e, 0x0, + 0x0, 0xd, 0x36, 0x32, 0xa0, 0x0, 0xd, 0x0, + 0x15, 0xac, 0x50, 0x3, 0xb6, 0x66, 0x6c, 0x0, + 0x1d, 0x50, 0x0, 0x0, 0xc, 0x30, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x2c, 0x20, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, + + /* U+9808 "須" */ + 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x9a, 0x6, 0x66, 0xb8, 0x66, 0x73, 0x0, + 0x5a, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x48, + 0x0, 0x0, 0xa6, 0x96, 0x66, 0xd0, 0x43, 0x0, + 0x20, 0xd, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x1e, + 0x40, 0xe6, 0x66, 0x67, 0xb0, 0x0, 0xb, 0x50, + 0xd, 0x0, 0x0, 0x2b, 0x0, 0x1a, 0x30, 0x0, + 0xd0, 0x0, 0x2, 0xb0, 0x36, 0x0, 0x0, 0xe, + 0x66, 0x66, 0x7b, 0x0, 0x0, 0x3, 0xd1, 0xd0, + 0x0, 0x2, 0xb0, 0x0, 0x2, 0xd4, 0xd, 0x66, + 0x66, 0x79, 0x0, 0x3, 0xb2, 0x0, 0x8, 0x60, + 0x71, 0x0, 0x5, 0x70, 0x0, 0x5, 0xc1, 0x2, + 0xc2, 0x2, 0x10, 0x0, 0x6, 0x70, 0x0, 0x6, + 0xa0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x2, + 0x0, + + /* U+9817 "頗" */ + 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x4, 0x76, 0xa8, 0x66, 0x82, + 0x0, 0x10, 0xc0, 0x20, 0x0, 0xb2, 0x0, 0x0, + 0x1, 0xc6, 0xd6, 0xc6, 0x96, 0x96, 0x67, 0xc0, + 0x1, 0xb0, 0xc0, 0x80, 0xd0, 0x0, 0x2, 0xa0, + 0x1, 0xb0, 0xc0, 0x20, 0xd4, 0x44, 0x45, 0xa0, + 0x1, 0xc6, 0xd6, 0xb2, 0xd2, 0x22, 0x24, 0xa0, + 0x2, 0xa0, 0x0, 0xc0, 0xd0, 0x0, 0x2, 0xa0, + 0x3, 0x92, 0x4, 0x70, 0xd6, 0x66, 0x67, 0xa0, + 0x4, 0x71, 0x8b, 0x20, 0xd0, 0x0, 0x2, 0xb0, + 0x6, 0x40, 0x6d, 0x0, 0xd6, 0x66, 0x67, 0x90, + 0x8, 0x2, 0x98, 0x80, 0x8, 0x80, 0x61, 0x0, + 0x6, 0x28, 0x0, 0x80, 0x4c, 0x10, 0x1c, 0x40, + 0x22, 0x40, 0x0, 0x5, 0x70, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x20, + + /* U+9818 "領" */ + 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x8, 0x90, 0x6, 0x66, 0xc7, 0x66, 0x60, + 0x0, 0xd, 0x66, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x0, 0x49, 0x8, 0x90, 0xa6, 0x86, 0x6c, 0x30, + 0x0, 0xa3, 0x0, 0xd2, 0xd0, 0x0, 0xc, 0x0, + 0x5, 0x40, 0xb1, 0x20, 0xd6, 0x66, 0x6d, 0x0, + 0x15, 0x0, 0x74, 0x0, 0xd0, 0x0, 0xc, 0x0, + 0x1, 0x55, 0x55, 0xa0, 0xd0, 0x0, 0xc, 0x0, + 0x0, 0x31, 0x15, 0xb1, 0xd6, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0xa, 0x0, 0xd0, 0x0, 0xc, 0x10, + 0x0, 0x71, 0x53, 0x0, 0xc6, 0x66, 0x6c, 0x0, + 0x0, 0xb, 0x80, 0x0, 0xa, 0x50, 0x62, 0x0, + 0x0, 0x1, 0xe3, 0x0, 0x79, 0x0, 0xc, 0x40, + 0x0, 0x0, 0x53, 0x6, 0x50, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x20, + + /* U+982D "頭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x5, + 0x76, 0x66, 0xa7, 0x76, 0x7c, 0x66, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x96, + 0x66, 0xb2, 0x2a, 0x75, 0x55, 0xe1, 0xd, 0x0, + 0xd, 0x2, 0xb0, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0xd0, 0x2c, 0x66, 0x66, 0xd0, 0xd, 0x0, 0xd, + 0x2, 0xb0, 0x0, 0xd, 0x0, 0xb6, 0x66, 0x80, + 0x2b, 0x0, 0x0, 0xd0, 0x3, 0x0, 0x35, 0x2, + 0xc6, 0x66, 0x6d, 0x0, 0x64, 0x8, 0x60, 0x2b, + 0x0, 0x0, 0xd0, 0x2, 0xb0, 0x90, 0x2, 0xb6, + 0x66, 0x6b, 0x0, 0x4, 0x29, 0x54, 0x1, 0xd2, + 0x53, 0x0, 0x8d, 0xa7, 0x30, 0x0, 0xb5, 0x0, + 0xa6, 0x1, 0x0, 0x0, 0x2, 0x82, 0x0, 0x1, + 0xf0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x3, + 0x0, + + /* U+983C "頼" */ + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0xc0, 0x0, 0x67, 0x6d, 0x66, 0x72, + 0x4, 0x66, 0xd6, 0x6c, 0x10, 0xa, 0x0, 0x0, + 0x1, 0x10, 0xc0, 0x0, 0xa, 0x77, 0x66, 0xd1, + 0x1, 0x41, 0xc1, 0x15, 0xd, 0x0, 0x0, 0xd0, + 0x1, 0xb4, 0xd4, 0x5c, 0xe, 0x66, 0x66, 0xd0, + 0x1, 0xa0, 0xc0, 0x2b, 0xd, 0x0, 0x0, 0xd0, + 0x1, 0xa1, 0xc1, 0x2b, 0xc, 0x0, 0x0, 0xd0, + 0x2, 0x99, 0xf5, 0x56, 0xd, 0x66, 0x66, 0xd0, + 0x0, 0xb, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xd0, + 0x0, 0x38, 0xc0, 0xc6, 0xd, 0x66, 0x66, 0xb0, + 0x0, 0x90, 0xc0, 0x19, 0x1, 0xd2, 0x53, 0x0, + 0x6, 0x0, 0xc0, 0x0, 0x9, 0x60, 0xa, 0x70, + 0x0, 0x0, 0xc0, 0x0, 0x64, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x30, 0x1, 0x10, 0x0, 0x0, 0x20, + + /* U+984C "題" */ + 0x0, 0x30, 0x0, 0x60, 0x0, 0x0, 0x1, 0x40, + 0x0, 0xc6, 0x66, 0xd2, 0x76, 0x79, 0x66, 0x70, + 0x0, 0xb0, 0x0, 0xc0, 0x0, 0x54, 0x1, 0x0, + 0x0, 0xc6, 0x66, 0xc0, 0x2b, 0x76, 0x6e, 0x10, + 0x0, 0xc1, 0x11, 0xc0, 0x1a, 0x0, 0xc, 0x0, + 0x0, 0xb5, 0x55, 0x90, 0x1c, 0x66, 0x6c, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x1b, 0x22, 0x2c, 0x0, + 0x5, 0x76, 0xd6, 0x66, 0x3b, 0x44, 0x4c, 0x0, + 0x0, 0xa0, 0xc0, 0x0, 0x1c, 0x55, 0x5c, 0x0, + 0x0, 0xb0, 0xc6, 0x88, 0x14, 0x40, 0x12, 0x0, + 0x2, 0xc0, 0xc0, 0x0, 0x8, 0x80, 0x85, 0x0, + 0x5, 0x57, 0xc0, 0x0, 0x56, 0x0, 0xd, 0x10, + 0x8, 0x1, 0xd6, 0x11, 0x20, 0x0, 0x2, 0x21, + 0x5, 0x0, 0x6, 0xcd, 0xdd, 0xde, 0xef, 0x90, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9854 "顔" */ + 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x76, 0x6, 0x76, 0x6c, 0x66, 0x72, + 0x2, 0x96, 0x66, 0xd6, 0x10, 0x28, 0x0, 0x0, + 0x0, 0xa, 0x2, 0xb0, 0x39, 0x86, 0x66, 0xd0, + 0x0, 0x8, 0x36, 0x12, 0x2a, 0x0, 0x1, 0xb0, + 0x3, 0xb6, 0x67, 0x69, 0x5c, 0x66, 0x66, 0xb0, + 0x2, 0x90, 0x0, 0xa2, 0x2a, 0x0, 0x1, 0xb0, + 0x2, 0x90, 0x2a, 0x50, 0x2c, 0x66, 0x66, 0xb0, + 0x3, 0x83, 0x40, 0x49, 0x2a, 0x0, 0x1, 0xc0, + 0x3, 0x80, 0x5, 0xc3, 0x2a, 0x0, 0x1, 0xc0, + 0x4, 0x62, 0x65, 0x2, 0x3b, 0x66, 0x66, 0x90, + 0x7, 0x21, 0x0, 0x6e, 0x32, 0xe1, 0x63, 0x0, + 0x7, 0x0, 0x2a, 0x80, 0xb, 0x30, 0xb, 0x60, + 0x13, 0x25, 0x61, 0x0, 0x82, 0x0, 0x2, 0xd0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+9858 "願" */ + 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x6, 0x20, + 0x8, 0x76, 0x86, 0x96, 0x76, 0xc8, 0x66, 0x40, + 0x8, 0x30, 0xa1, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x8, 0x57, 0x96, 0xa1, 0xb6, 0x86, 0x6d, 0x40, + 0x8, 0x58, 0x0, 0xb0, 0xd0, 0x0, 0xb, 0x10, + 0x8, 0x4b, 0x66, 0xc0, 0xd6, 0x66, 0x6d, 0x10, + 0x8, 0x48, 0x0, 0xb0, 0xc0, 0x0, 0xb, 0x10, + 0x9, 0x3b, 0x76, 0xc0, 0xc6, 0x66, 0x6d, 0x10, + 0xa, 0x11, 0x92, 0x10, 0xc0, 0x0, 0xb, 0x10, + 0x9, 0x18, 0x93, 0x10, 0xd0, 0x0, 0xb, 0x10, + 0x7, 0x75, 0x92, 0xa0, 0xc6, 0x66, 0x6b, 0x10, + 0x42, 0x70, 0x92, 0x86, 0xb, 0x60, 0x64, 0x0, + 0x23, 0x13, 0xb2, 0x22, 0x69, 0x0, 0xa, 0x70, + 0x0, 0x7, 0xd0, 0x4, 0x60, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, + + /* U+985E "類" */ + 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x70, + 0x3, 0x70, 0xd0, 0xb5, 0x67, 0x6d, 0x76, 0x62, + 0x0, 0xb3, 0xd2, 0x90, 0x0, 0xa, 0x0, 0x10, + 0x5, 0x76, 0xea, 0x6d, 0x2c, 0x67, 0x56, 0xe1, + 0x2, 0x1d, 0xe7, 0x30, 0xd, 0x0, 0x0, 0xc0, + 0x0, 0xa3, 0xd0, 0xb6, 0xe, 0x66, 0x66, 0xc0, + 0x7, 0x10, 0xd0, 0x14, 0xd, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x73, 0xa0, 0xd, 0x66, 0x66, 0xc0, + 0x0, 0x0, 0xd2, 0x53, 0xd, 0x0, 0x0, 0xc0, + 0x8, 0x76, 0xe6, 0x6c, 0x4d, 0x0, 0x0, 0xd0, + 0x0, 0x3, 0xc3, 0x0, 0xc, 0x66, 0x66, 0xa0, + 0x0, 0xa, 0x46, 0xb2, 0x0, 0xd4, 0x64, 0x0, + 0x0, 0x48, 0x0, 0x58, 0x9, 0x60, 0xa, 0x70, + 0x4, 0x60, 0x0, 0x0, 0x73, 0x0, 0x1, 0xe0, + 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, + + /* U+986F "顯" */ + 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x71, + 0x0, 0xd6, 0x66, 0x6e, 0x67, 0x6d, 0x76, 0x63, + 0x0, 0xd6, 0x66, 0x6c, 0x0, 0xb, 0x0, 0x10, + 0x0, 0xc0, 0x0, 0xc, 0xc, 0x78, 0x67, 0xe1, + 0x0, 0xd6, 0x66, 0x6a, 0xc, 0x0, 0x0, 0xc0, + 0x0, 0x47, 0x0, 0x53, 0xd, 0x66, 0x66, 0xc0, + 0x0, 0x82, 0x21, 0x84, 0x1c, 0x0, 0x0, 0xc0, + 0x7, 0x5b, 0x49, 0x6b, 0x2d, 0x66, 0x66, 0xc0, + 0x0, 0x84, 0x2, 0x74, 0xc, 0x0, 0x0, 0xc0, + 0xc, 0x87, 0xad, 0x78, 0x6c, 0x0, 0x0, 0xc0, + 0x2, 0x0, 0x41, 0x1, 0x3c, 0x66, 0x66, 0xa0, + 0x0, 0x56, 0x17, 0x18, 0x10, 0xd3, 0x72, 0x0, + 0x7, 0x64, 0x85, 0x85, 0x86, 0x70, 0xc, 0x40, + 0x8, 0x11, 0x20, 0x10, 0x46, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x10, + + /* U+98A8 "風" */ + 0x0, 0x9, 0x66, 0x66, 0x66, 0x67, 0x90, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x14, 0x80, 0x0, + 0x0, 0xd, 0x0, 0x35, 0x9c, 0xc5, 0x80, 0x0, + 0x0, 0xd, 0x36, 0x5d, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0x0, 0xd, 0x0, 0x4, 0x80, 0x0, + 0x0, 0xd, 0xb, 0x6e, 0x66, 0xc4, 0x80, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x2, 0xa4, 0x80, 0x0, + 0x0, 0xd, 0xd, 0xd, 0x2, 0xa3, 0x80, 0x0, + 0x0, 0xc, 0xe, 0x6e, 0x67, 0xa3, 0x80, 0x0, + 0x0, 0x1b, 0x3, 0xd, 0x1, 0x21, 0xa0, 0x0, + 0x0, 0x48, 0x0, 0xd, 0x0, 0x92, 0xc0, 0x20, + 0x0, 0x93, 0x23, 0x5e, 0x98, 0x8c, 0xa3, 0x70, + 0x1, 0x90, 0xda, 0x62, 0x0, 0xb, 0x3c, 0xa0, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+98DB "飛" */ + 0x0, 0x56, 0x66, 0x66, 0x69, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x10, 0x7, 0x20, 0xa2, 0x0, + 0x0, 0x0, 0x37, 0xa5, 0x7, 0x1a, 0x82, 0x0, + 0x0, 0x3, 0xe6, 0xa1, 0x7, 0x82, 0x0, 0x0, + 0x0, 0x7b, 0x90, 0xa1, 0x5, 0x66, 0xa1, 0x0, + 0x2, 0x12, 0x90, 0xa1, 0x1, 0xd1, 0x43, 0x60, + 0x0, 0x2, 0x90, 0xa1, 0x3, 0x7e, 0x74, 0x80, + 0x8, 0x67, 0xb6, 0xc7, 0x6d, 0x25, 0xdf, 0xc0, + 0x0, 0x3, 0x80, 0xa1, 0xc, 0x2, 0x82, 0x40, + 0x0, 0x5, 0x70, 0xa1, 0xc, 0x57, 0x30, 0x0, + 0x0, 0x7, 0x40, 0xa1, 0xa, 0x4a, 0x50, 0x0, + 0x0, 0xb, 0x0, 0xa1, 0x7, 0x51, 0xc0, 0x20, + 0x0, 0x37, 0x0, 0xa2, 0x1, 0xc0, 0x0, 0x70, + 0x1, 0x80, 0x0, 0xa2, 0x0, 0x4b, 0x40, 0xa0, + 0x6, 0x0, 0x0, 0x60, 0x0, 0x2, 0x8c, 0xc0, + + /* U+98DF "食" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb0, 0x19, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xa, 0x21, 0xb7, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x5, 0x90, 0xa, 0xfa, 0x72, + 0x3, 0x72, 0xd6, 0x66, 0x76, 0x8c, 0x29, 0x80, + 0x1, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x8a, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x89, 0x30, 0x0, + 0x0, 0x0, 0xe0, 0x25, 0x10, 0xa, 0x90, 0x0, + 0x0, 0x0, 0xe0, 0x1, 0x89, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x47, 0x31, 0xad, 0x50, 0x0, + 0x0, 0x0, 0xfc, 0x40, 0x0, 0x5, 0xf2, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+98EF "飯" */ + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x4, 0xd1, 0x0, 0x54, 0x68, 0xaa, 0x40, + 0x0, 0xb, 0x27, 0x91, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x74, 0x60, 0x69, 0x93, 0x0, 0x0, 0x0, + 0x3, 0x60, 0x76, 0x1, 0x93, 0x0, 0x1, 0x0, + 0x14, 0x96, 0x67, 0xb1, 0x98, 0x66, 0x6b, 0x80, + 0x0, 0xc0, 0x0, 0xc0, 0x93, 0x40, 0xb, 0x10, + 0x0, 0xc6, 0x66, 0xd0, 0x93, 0x50, 0xb, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x60, 0x56, 0x0, + 0x0, 0xc6, 0x66, 0xb0, 0xb0, 0x35, 0xb0, 0x0, + 0x0, 0xc0, 0x8, 0x0, 0xb0, 0xb, 0x60, 0x0, + 0x0, 0xc0, 0x19, 0xa1, 0x90, 0x3c, 0x90, 0x0, + 0x0, 0xda, 0x80, 0xa6, 0x21, 0x90, 0x97, 0x0, + 0x0, 0x93, 0x0, 0x5, 0x17, 0x0, 0xc, 0xa1, + 0x0, 0x0, 0x0, 0x20, 0x40, 0x0, 0x0, 0x30, + + /* U+98F2 "飲" */ + 0x0, 0x0, 0xa2, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x0, 0x4, 0xe1, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0xb, 0x28, 0x90, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x65, 0x50, 0x79, 0x3c, 0x66, 0x6c, 0x60, + 0x2, 0x70, 0x75, 0x1, 0x81, 0x10, 0xc, 0x10, + 0x14, 0x86, 0x77, 0xa3, 0x70, 0xf2, 0x35, 0x0, + 0x0, 0xc0, 0x0, 0xc5, 0x0, 0xf1, 0x40, 0x0, + 0x0, 0xc6, 0x66, 0xd0, 0x1, 0xe3, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0x3, 0xa5, 0x0, 0x0, + 0x0, 0xc6, 0x66, 0xb0, 0x6, 0x77, 0x0, 0x0, + 0x0, 0xc0, 0x8, 0x0, 0xa, 0x28, 0x20, 0x0, + 0x0, 0xc0, 0x28, 0xa0, 0x1b, 0x2, 0xb0, 0x0, + 0x0, 0xdb, 0x70, 0x90, 0x81, 0x0, 0x89, 0x0, + 0x0, 0x72, 0x0, 0x6, 0x20, 0x0, 0xb, 0xc2, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, + + /* U+9928 "館" */ + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x74, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x20, 0xe, 0x20, 0x20, + 0x0, 0xc, 0x3a, 0x62, 0x96, 0x68, 0x66, 0xe3, + 0x0, 0x86, 0x30, 0xce, 0x30, 0x0, 0x4, 0x50, + 0x4, 0x60, 0xb1, 0x0, 0x41, 0x11, 0x28, 0x0, + 0x14, 0x96, 0x96, 0xa0, 0xb5, 0x44, 0x5c, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1b, 0x0, + 0x0, 0xd6, 0x66, 0xc0, 0xa7, 0x66, 0x6b, 0x0, + 0x0, 0xc0, 0x0, 0xc0, 0xa2, 0x0, 0x1, 0x0, + 0x0, 0xd6, 0x66, 0xa0, 0xa7, 0x66, 0x6c, 0x60, + 0x0, 0xc0, 0x7, 0x0, 0xa2, 0x0, 0xa, 0x20, + 0x0, 0xc0, 0x19, 0x90, 0xa2, 0x0, 0xa, 0x20, + 0x1, 0xeb, 0x70, 0xa0, 0xa7, 0x66, 0x6c, 0x20, + 0x0, 0xa2, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+9996 "首" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xa0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x8, 0x0, 0x8, 0x30, + 0x6, 0x66, 0x66, 0x6e, 0x66, 0x66, 0x67, 0x50, + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x86, 0x66, 0x6d, 0x30, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x66, 0x66, 0x6e, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+9999 "香" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x49, 0xe5, 0x0, 0x0, + 0x14, 0x56, 0x7d, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x10, 0x5, 0x66, + 0x66, 0x6d, 0x66, 0x66, 0x6e, 0x30, 0x10, 0x0, + 0x3c, 0xd4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0x1c, 0x16, 0x70, 0x0, 0x0, 0x0, 0x3a, 0x10, + 0xc1, 0x6, 0xc5, 0x0, 0x0, 0x57, 0x20, 0x7, + 0x0, 0x8, 0xcf, 0x71, 0x52, 0xd, 0x66, 0x66, + 0x66, 0xe1, 0x30, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0xd, 0x66, 0x66, 0x66, + 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xd6, 0x66, 0x66, 0x6d, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+99C4 "駄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x96, 0x66, 0x6b, 0x0, 0x97, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x0, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x23, 0x0, 0x93, 0x0, 0x0, + 0x0, 0xe6, 0xc6, 0x64, 0x0, 0x92, 0x0, 0x30, + 0x0, 0xd0, 0xa1, 0x12, 0x76, 0xc9, 0x67, 0x80, + 0x0, 0xd6, 0xc6, 0x75, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0xd0, 0xa1, 0x0, 0x0, 0xc7, 0x0, 0x0, + 0x0, 0xe5, 0x95, 0x5e, 0x10, 0xb6, 0x10, 0x0, + 0x0, 0x90, 0x0, 0xd, 0x3, 0x84, 0x50, 0x0, + 0x0, 0x24, 0x29, 0xc, 0x8, 0x30, 0xa0, 0x0, + 0x5, 0x54, 0xc7, 0x3a, 0xb, 0x0, 0xb1, 0x0, + 0xb, 0x46, 0x30, 0x58, 0x57, 0x60, 0x5a, 0x0, + 0x4, 0x1, 0x21, 0xb4, 0x90, 0x77, 0xe, 0x50, + 0x0, 0x0, 0x5f, 0x97, 0x10, 0x16, 0x4, 0xd2, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + + /* U+99C5 "駅" */ + 0x0, 0x53, 0x33, 0x38, 0x13, 0x0, 0x0, 0x50, + 0x0, 0xd3, 0xb5, 0x33, 0x2d, 0x66, 0x67, 0xc0, + 0x0, 0xc0, 0xa2, 0x31, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xd6, 0xc7, 0x63, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xc0, 0xa2, 0x20, 0x1c, 0x0, 0x2, 0xa0, + 0x0, 0xd6, 0xc7, 0x74, 0xd, 0x68, 0x67, 0xa0, + 0x0, 0xc0, 0xa2, 0x0, 0xc, 0x6, 0x0, 0x0, + 0x0, 0xd5, 0x95, 0x6d, 0x2b, 0x7, 0x0, 0x0, + 0x0, 0x80, 0x0, 0x2a, 0x39, 0x8, 0x0, 0x0, + 0x1, 0x23, 0x39, 0x49, 0x56, 0x6, 0x50, 0x0, + 0x7, 0x45, 0xc4, 0x87, 0x82, 0x1, 0xc0, 0x0, + 0xd, 0x37, 0x30, 0x84, 0xa0, 0x0, 0x98, 0x0, + 0x4, 0x0, 0x10, 0xd4, 0x50, 0x0, 0xd, 0x80, + 0x0, 0x0, 0x5f, 0x77, 0x0, 0x0, 0x2, 0xa3, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+9A12 "騒" */ + 0x0, 0x30, 0x0, 0x32, 0x12, 0x22, 0x27, 0x0, + 0x0, 0xe6, 0xd6, 0x63, 0x48, 0x44, 0x6e, 0x20, + 0x0, 0xd0, 0xc0, 0x20, 0x4, 0x40, 0x96, 0x0, + 0x0, 0xe6, 0xd6, 0x83, 0x0, 0xa5, 0xc0, 0x0, + 0x0, 0xd0, 0xc0, 0x0, 0x0, 0x3f, 0x40, 0x0, + 0x0, 0xd6, 0xd6, 0xa2, 0x4, 0x94, 0xca, 0x50, + 0x0, 0xd0, 0xc0, 0x1, 0x54, 0xd, 0x6, 0x71, + 0x0, 0xe5, 0xc5, 0x6b, 0x56, 0x6e, 0x69, 0x30, + 0x0, 0x40, 0x0, 0x39, 0x66, 0xd, 0xc, 0x10, + 0x0, 0x23, 0x38, 0x48, 0x66, 0xd, 0xc, 0x0, + 0x6, 0x36, 0xa8, 0x76, 0x79, 0x6e, 0x6d, 0x0, + 0xc, 0x29, 0x30, 0x84, 0x10, 0xd, 0x23, 0x0, + 0x14, 0x0, 0x0, 0xc1, 0x0, 0xd, 0x3c, 0x60, + 0x0, 0x2, 0x7e, 0x81, 0xdc, 0xa7, 0x41, 0xc0, + 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+9A13 "験" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x50, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0xd6, 0xd6, 0x62, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x20, 0x7, 0x80, 0x80, 0x0, + 0x0, 0xd6, 0xd6, 0x71, 0x59, 0x0, 0x4d, 0x61, + 0x0, 0xc0, 0xc0, 0x5, 0x88, 0x6a, 0x78, 0x60, + 0x0, 0xd6, 0xd6, 0x91, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x0, 0xb6, 0x6e, 0x6d, 0x20, + 0x0, 0xd5, 0xc5, 0x96, 0xc0, 0xd, 0xc, 0x0, + 0x0, 0x60, 0x0, 0x84, 0xc0, 0xd, 0xc, 0x0, + 0x1, 0x24, 0x29, 0x93, 0xc6, 0x6d, 0x6d, 0x0, + 0xa, 0x55, 0xa8, 0xb2, 0x30, 0x4b, 0x2, 0x0, + 0x2d, 0x36, 0x20, 0xb1, 0x0, 0xb3, 0x60, 0x0, + 0x12, 0x0, 0x1, 0xc0, 0x8, 0x50, 0x85, 0x0, + 0x0, 0x2, 0x7e, 0x62, 0x83, 0x0, 0xb, 0xb1, + 0x0, 0x0, 0x1, 0x13, 0x0, 0x0, 0x0, 0x10, + + /* U+9A57 "驗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x50, 0x0, 0x77, 0x0, 0x0, + 0x0, 0xd6, 0xc6, 0x71, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0xc0, 0xc0, 0x10, 0x8, 0x44, 0x70, 0x0, + 0x0, 0xd6, 0xd6, 0x80, 0x38, 0x0, 0x99, 0x0, + 0x0, 0xc0, 0xc0, 0x3, 0x86, 0x66, 0xaa, 0xc2, + 0x0, 0xd6, 0xd6, 0x83, 0x0, 0x0, 0x1, 0x0, + 0x0, 0xc0, 0xc0, 0x1, 0xc6, 0xc6, 0x8c, 0x40, + 0x0, 0xd5, 0xc4, 0xa5, 0xb0, 0xb5, 0x49, 0x10, + 0x0, 0xa0, 0x0, 0xb2, 0xb0, 0xb5, 0x49, 0x10, + 0x1, 0x23, 0x26, 0xb1, 0xd6, 0xa6, 0x8b, 0x10, + 0x7, 0x63, 0xa8, 0xc0, 0x2c, 0x10, 0x65, 0x0, + 0xc, 0x54, 0x40, 0xc0, 0x5a, 0x0, 0xa2, 0x0, + 0x13, 0x0, 0x2, 0xb0, 0xb5, 0x70, 0xa9, 0x10, + 0x0, 0x1, 0x7f, 0x48, 0x30, 0xa7, 0x13, 0x90, + 0x0, 0x0, 0x1, 0x21, 0x0, 0x12, 0x0, 0x10, + + /* U+9AD4 "體" */ + 0x0, 0x10, 0x3, 0x0, 0x1, 0xb0, 0xb0, 0x0, + 0x0, 0xc6, 0x6d, 0x30, 0x1, 0xc0, 0xc0, 0x30, + 0x0, 0xc6, 0x7b, 0x0, 0xd6, 0xd5, 0xd7, 0xc0, + 0x0, 0xc3, 0x7b, 0x0, 0xd4, 0xd3, 0xc6, 0x90, + 0x3, 0xc3, 0x7b, 0x20, 0xd3, 0xc2, 0xc5, 0x90, + 0xb, 0x76, 0x67, 0xc5, 0xd4, 0xd3, 0xc6, 0xa0, + 0x47, 0x86, 0x69, 0x60, 0x71, 0x11, 0x12, 0x60, + 0x0, 0xd0, 0xa, 0x25, 0x76, 0x66, 0x66, 0x72, + 0x0, 0xd6, 0x6c, 0x10, 0x67, 0x66, 0x6a, 0x50, + 0x0, 0xd0, 0xa, 0x10, 0x84, 0x0, 0x9, 0x30, + 0x0, 0xd6, 0x6c, 0x10, 0x88, 0x66, 0x6b, 0x30, + 0x0, 0xd0, 0xa, 0x10, 0x46, 0x0, 0x77, 0x0, + 0x0, 0xd0, 0xa, 0x10, 0x4, 0x80, 0xa1, 0x0, + 0x0, 0xd1, 0x8e, 0x16, 0x66, 0x86, 0xa6, 0xc3, + 0x0, 0x30, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+9AD8 "高" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x63, 0x0, 0x0, 0x15, 0x6, 0x76, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x0, 0x8, + 0x66, 0x66, 0x66, 0x80, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x68, 0x80, 0x0, 0x0, 0x0, 0x90, 0x0, + 0x0, 0x24, 0x0, 0x0, 0xa, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xd2, 0x0, 0xd0, 0x2, 0x0, 0x0, + 0x30, 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x7d, + 0x0, 0xe0, 0x0, 0xd0, 0xd, 0x0, 0x1, 0xb0, + 0xe, 0x0, 0xd, 0x0, 0xe6, 0x66, 0x6b, 0x0, + 0xe0, 0x0, 0xd0, 0x9, 0x0, 0x1, 0x60, 0xe, + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xd0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + + /* U+9AEA "髪" */ + 0x0, 0x2, 0x0, 0x4, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xe, 0x66, 0x66, 0x10, 0x6, 0xc3, 0x0, + 0x0, 0xe, 0x66, 0x6a, 0x3, 0xa6, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x14, 0x24, 0x0, 0x5b, 0x0, + 0x0, 0xe, 0x55, 0x55, 0x10, 0x29, 0x71, 0x0, + 0x5, 0x7a, 0x96, 0x67, 0x95, 0x50, 0x4, 0x60, + 0x0, 0x8, 0x80, 0x73, 0x0, 0x3, 0xa9, 0x40, + 0x0, 0xcb, 0x76, 0x5c, 0x16, 0x75, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x77, 0x10, 0x0, 0x3, 0x0, + 0x6, 0x65, 0x56, 0xd7, 0x55, 0x55, 0x6a, 0x70, + 0x0, 0x0, 0x9, 0xa6, 0x66, 0x68, 0x10, 0x0, + 0x0, 0x0, 0x78, 0x60, 0x0, 0xa9, 0x10, 0x0, + 0x0, 0x7, 0x60, 0x8, 0x5c, 0x50, 0x0, 0x0, + 0x1, 0x73, 0x0, 0x29, 0xab, 0x40, 0x0, 0x0, + 0x3, 0x2, 0x67, 0x61, 0x1, 0x7c, 0xca, 0x70, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x14, 0x10, + + /* U+9B5A "魚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc1, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x3, 0xc6, 0x66, 0xbc, 0x20, 0x0, 0x0, 0x3, + 0xa0, 0x0, 0x9, 0x0, 0x10, 0x0, 0x3, 0x9b, + 0x66, 0x6b, 0x66, 0x6e, 0x50, 0x4, 0x41, 0xb0, + 0x0, 0xe0, 0x0, 0xd1, 0x0, 0x0, 0x1b, 0x0, + 0xe, 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, + 0xe6, 0x66, 0xe1, 0x0, 0x0, 0x1b, 0x0, 0xe, + 0x0, 0xd, 0x10, 0x0, 0x1, 0xd6, 0x66, 0xd6, + 0x66, 0xe1, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x0, 0x6, 0x4, 0x30, 0x56, 0x1, + 0x92, 0x0, 0x5, 0xa0, 0xe, 0x0, 0xc5, 0x2, + 0xf4, 0x3, 0xe2, 0x0, 0xd2, 0x6, 0x70, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9CE5 "鳥" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x3, 0x50, 0x0, 0x30, 0x0, 0x0, 0x0, + 0xd6, 0x66, 0x66, 0x6c, 0x50, 0x0, 0x0, 0xd, + 0x66, 0x66, 0x66, 0xc2, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0xd, 0x66, + 0x66, 0x66, 0xc3, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x2, 0x0, 0x62, 0x0, 0xd, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x40, 0x0, 0xd6, 0x66, 0x66, + 0x66, 0x67, 0xc0, 0x0, 0x6, 0x0, 0x0, 0x3, + 0x0, 0x4a, 0x0, 0x3, 0x4, 0x4, 0x70, 0x3b, + 0x6, 0x80, 0x0, 0x80, 0xa4, 0xa, 0x60, 0x96, + 0x85, 0x0, 0x78, 0x5, 0x80, 0x24, 0x11, 0x1c, + 0x30, 0x9, 0x10, 0x1, 0x0, 0x3, 0x9d, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, + + /* U+9E97 "麗" */ + 0x2, 0x33, 0x33, 0x54, 0x23, 0x33, 0x38, 0x10, + 0x2, 0x73, 0x33, 0x62, 0x27, 0x33, 0x63, 0x10, + 0x0, 0xc6, 0x86, 0xd0, 0xe, 0x86, 0xd2, 0x0, + 0x0, 0xc0, 0x81, 0xc0, 0xd, 0x29, 0xc0, 0x0, + 0x0, 0xa0, 0x10, 0x96, 0x6a, 0x2, 0x94, 0x0, + 0x0, 0x79, 0x66, 0xa6, 0x79, 0x66, 0x79, 0x20, + 0x0, 0x76, 0x0, 0xc0, 0x9, 0x20, 0x23, 0x0, + 0x0, 0x7a, 0x66, 0xd6, 0x6b, 0x76, 0x9a, 0x0, + 0x0, 0x7a, 0x66, 0xc6, 0x6b, 0x76, 0x97, 0x0, + 0x0, 0x85, 0xb, 0x0, 0x8, 0x40, 0x21, 0x0, + 0x0, 0xa3, 0xd, 0x68, 0x89, 0x25, 0xc8, 0x0, + 0x0, 0xc0, 0xc, 0x0, 0x9, 0x73, 0x0, 0x50, + 0x2, 0x70, 0xc, 0x47, 0x48, 0x20, 0x0, 0xb0, + 0x7, 0x0, 0x1d, 0x60, 0x5, 0xdc, 0xcd, 0xc0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EBC "麼" */ + 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0xb2, 0x0, 0x8, 0x40, + 0x0, 0xd6, 0x66, 0x96, 0x66, 0x68, 0x66, 0x50, + 0x0, 0xc0, 0x0, 0xd1, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0xc3, 0x77, 0xd7, 0x57, 0x8d, 0x68, 0x40, + 0x0, 0xc0, 0xa, 0xd7, 0x10, 0xba, 0x70, 0x0, + 0x0, 0xc0, 0x65, 0xc3, 0x77, 0x6a, 0x4a, 0x20, + 0x0, 0xc5, 0x30, 0xc0, 0x33, 0x29, 0x5, 0x70, + 0x0, 0xb0, 0x0, 0x27, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xb0, 0x4, 0x73, 0x0, 0x5e, 0x20, 0x0, + 0x1, 0x90, 0x9d, 0x97, 0x6b, 0x81, 0x0, 0x0, + 0x4, 0x50, 0x0, 0x6, 0x71, 0x2, 0x60, 0x0, + 0x8, 0x0, 0x37, 0x73, 0x34, 0x55, 0xb6, 0x0, + 0x6, 0x0, 0x9d, 0xa7, 0x53, 0x10, 0x2b, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EC4 "黄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0xc, 0x10, 0x72, 0x0, 0x7, + 0x66, 0xe6, 0x66, 0xd6, 0x66, 0x40, 0x0, 0x0, + 0xd, 0x0, 0xc, 0x10, 0x4, 0x3, 0x76, 0x66, + 0xa6, 0xa6, 0x96, 0x66, 0xa6, 0x0, 0x1, 0x0, + 0xd, 0x0, 0x2, 0x0, 0x0, 0x0, 0xc6, 0x66, + 0xe6, 0x66, 0xc5, 0x0, 0x0, 0xc, 0x10, 0xd, + 0x0, 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xe6, + 0x66, 0xc2, 0x0, 0x0, 0xc, 0x10, 0xd, 0x0, + 0xb, 0x20, 0x0, 0x0, 0xc6, 0x66, 0xd6, 0x66, + 0xc2, 0x0, 0x0, 0x6, 0x2c, 0x30, 0x4, 0x44, + 0x0, 0x0, 0x0, 0x3d, 0x70, 0x0, 0x3, 0xb9, + 0x10, 0x0, 0x89, 0x10, 0x0, 0x0, 0x0, 0x9d, + 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, + + /* U+9ED2 "黒" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0xe6, 0x66, 0x7b, 0x66, 0x6e, 0x40, 0x0, 0xd0, + 0x0, 0x2a, 0x0, 0xd, 0x0, 0x0, 0xd6, 0x66, + 0x7c, 0x66, 0x6e, 0x0, 0x0, 0xd0, 0x0, 0x2a, + 0x0, 0xd, 0x0, 0x0, 0xe6, 0x66, 0x7c, 0x66, + 0x6e, 0x0, 0x0, 0x60, 0x0, 0x2a, 0x0, 0x3, + 0x0, 0x4, 0x66, 0x66, 0x7c, 0x66, 0x6d, 0x70, + 0x1, 0x10, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0x1, 0xd3, 0x57, 0x66, + 0x66, 0x66, 0x66, 0x67, 0x64, 0x0, 0x60, 0x35, + 0x0, 0x90, 0x8, 0x20, 0x3, 0x90, 0xd, 0x0, + 0x87, 0x4, 0xd0, 0xd, 0x50, 0xa, 0x10, 0x36, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9EDE "點" */ + 0x3, 0x0, 0x0, 0x30, 0x0, 0xa3, 0x0, 0x0, + 0x9, 0x66, 0xc6, 0xd2, 0x0, 0xd0, 0x0, 0x0, + 0x9, 0x42, 0xb8, 0xc0, 0x0, 0xd0, 0x0, 0x0, + 0x9, 0x2a, 0xc4, 0xc0, 0x0, 0xd5, 0x56, 0xa0, + 0x9, 0x67, 0xd6, 0xd0, 0x0, 0xd0, 0x0, 0x0, + 0x6, 0x1, 0xb0, 0x50, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x11, 0xb1, 0x70, 0x0, 0xd0, 0x0, 0x0, + 0x4, 0x65, 0xc5, 0x51, 0x96, 0xe6, 0x6b, 0x10, + 0x0, 0x1, 0xb0, 0x41, 0xc0, 0x0, 0xd, 0x0, + 0x4, 0x69, 0xa5, 0x10, 0xc0, 0x0, 0xd, 0x0, + 0xb, 0x50, 0x0, 0x40, 0xc0, 0x0, 0xd, 0x0, + 0x2, 0x6, 0x9, 0x38, 0xc0, 0x0, 0xd, 0x0, + 0x9, 0x9, 0x2a, 0x8, 0xd6, 0x66, 0x6d, 0x0, + 0x2a, 0x2, 0x0, 0x0, 0xc0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, + + /* U+9EE8 "黨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x50, 0xb, 0x30, 0x18, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xb, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x95, 0x58, 0x5b, 0x57, 0x75, 0x5a, 0x70, + 0x6, 0x70, 0x47, 0x66, 0x66, 0x91, 0x18, 0x10, + 0x8, 0x10, 0x56, 0x0, 0x0, 0xc0, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0x66, 0x66, 0xc0, 0x0, 0x0, + 0x0, 0xa, 0x66, 0x66, 0x66, 0x66, 0xb2, 0x0, + 0x0, 0xd, 0x8, 0x18, 0x30, 0x90, 0xc0, 0x0, + 0x0, 0xd, 0x3, 0x48, 0x35, 0x20, 0xc0, 0x0, + 0x0, 0xd, 0x66, 0x6b, 0x86, 0x66, 0xa0, 0x0, + 0x0, 0x47, 0x55, 0x5b, 0x85, 0x55, 0x97, 0x0, + 0x5, 0x66, 0x66, 0x6b, 0x86, 0x66, 0x6b, 0x80, + 0x1, 0x13, 0x2, 0x30, 0x5, 0x0, 0x13, 0x0, + 0x0, 0x94, 0x0, 0xb0, 0x9, 0x20, 0xb, 0x10, + 0x2, 0x70, 0x0, 0x30, 0x2, 0x0, 0x3, 0x0, + + /* U+9F13 "鼓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x20, 0xd, 0x0, 0x0, + 0x7, 0x66, 0xd6, 0x67, 0x60, 0xd, 0x0, 0x20, + 0x0, 0x0, 0xc0, 0x0, 0x57, 0x6e, 0x66, 0xa1, + 0x1, 0x86, 0xb6, 0x6a, 0x30, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd6, 0x66, 0x6e, 0x38, 0x69, 0x6b, 0x90, + 0x0, 0xd1, 0x0, 0x1b, 0x4, 0x10, 0xd, 0x10, + 0x0, 0xd6, 0x66, 0x6c, 0x0, 0x70, 0x59, 0x0, + 0x0, 0x70, 0x0, 0x25, 0x0, 0x81, 0xc1, 0x0, + 0x0, 0x26, 0x1, 0xd0, 0x0, 0x2e, 0x60, 0x0, + 0x0, 0xb, 0x4, 0x20, 0x0, 0x6d, 0x80, 0x0, + 0x0, 0x14, 0x48, 0x76, 0x47, 0x70, 0x9b, 0x10, + 0x1e, 0xc8, 0x41, 0x2, 0x73, 0x0, 0x8, 0xd3, + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + + /* U+9F3B "鼻" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x1, 0x0, 0x0, 0x0, + 0xb, 0x67, 0x76, 0x66, 0xe1, 0x0, 0x0, 0x0, + 0xc6, 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc6, + 0x66, 0x66, 0x6c, 0x0, 0x0, 0x0, 0xc, 0x66, + 0x66, 0x66, 0xc0, 0x0, 0x0, 0xb, 0x65, 0x55, + 0x85, 0x55, 0xb5, 0x0, 0x0, 0xd6, 0x66, 0x6d, + 0x66, 0x6c, 0x20, 0x0, 0xc, 0x0, 0x0, 0xb0, + 0x0, 0xa2, 0x0, 0x0, 0xd6, 0x66, 0x68, 0x66, + 0x6c, 0x20, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x67, 0xc1, 0x11, 0x0, 0xa5, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x3a, 0x20, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 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, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 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, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 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, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FF08 "(" */ + 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, 0x73, 0x0, + 0x65, 0x0, 0x2b, 0x0, 0x8, 0x50, 0x0, 0xb3, + 0x0, 0xc, 0x20, 0x0, 0xa3, 0x0, 0x6, 0x70, + 0x0, 0xb, 0x0, 0x0, 0x29, 0x0, 0x0, 0x28, + 0x0, 0x0, 0x2, + + /* U+FF09 ")" */ + 0x0, 0x0, 0x2, 0x60, 0x0, 0x2, 0x80, 0x0, + 0x4, 0x80, 0x0, 0xb, 0x30, 0x0, 0x59, 0x0, + 0x2, 0xd0, 0x0, 0x1e, 0x0, 0x2, 0xb0, 0x0, + 0x68, 0x0, 0x1d, 0x10, 0xa, 0x30, 0x8, 0x30, + 0x2, 0x0, 0x0, + + /* U+FF0C "," */ + 0x4, 0x91, 0xb, 0xf6, 0x1, 0xc3, 0x2, 0x90, + 0x5, 0x0, + + /* U+FF11 "1" */ + 0x1, 0x74, 0x0, 0x26, 0xd5, 0x0, 0x0, 0xb5, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xb5, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb5, 0x0, + 0x0, 0xb5, 0x0, 0x1, 0xc7, 0x0, 0x45, 0x55, + 0x50, + + /* U+FF12 "2" */ + 0x0, 0x4, 0x41, 0x0, 0x5, 0x92, 0x3c, 0x60, + 0xf, 0x40, 0x5, 0xf0, 0xc, 0x60, 0x5, 0xf0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x3d, 0x10, + 0x0, 0x1, 0xc2, 0x0, 0x0, 0xa, 0x20, 0x0, + 0x0, 0x93, 0x0, 0x0, 0x8, 0x30, 0x0, 0x70, + 0x2f, 0xdd, 0xdd, 0x80, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 128, .box_w = 2, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 27, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 75, .adv_w = 128, .box_w = 6, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 120, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 168, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 226, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 266, .adv_w = 128, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 306, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 388, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 392, .adv_w = 128, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 395, .adv_w = 128, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 507, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 543, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 585, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 627, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 675, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 717, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 765, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 855, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 903, .adv_w = 128, .box_w = 2, .box_h = 8, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 911, .adv_w = 128, .box_w = 2, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 921, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 960, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 976, .adv_w = 128, .box_w = 6, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1015, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1063, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1111, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1159, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1207, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1255, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1303, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1351, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1399, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1447, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1495, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1531, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1587, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1635, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1683, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1731, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1779, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1875, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1931, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1979, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2075, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2123, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2171, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2219, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2267, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2315, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2363, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 2393, .adv_w = 128, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2446, .adv_w = 128, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2476, .adv_w = 128, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 2482, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2486, .adv_w = 128, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 2490, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2522, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2574, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 128, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2654, .adv_w = 128, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2730, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2770, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2818, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 128, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2896, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2944, .adv_w = 128, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2980, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3012, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3044, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3076, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3116, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3156, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3188, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3212, .adv_w = 128, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3277, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3309, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3341, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3373, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3413, .adv_w = 128, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3437, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3469, .adv_w = 128, .box_w = 2, .box_h = 18, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3487, .adv_w = 128, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3519, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 3535, .adv_w = 128, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3535, .adv_w = 256, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3548, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3558, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3612, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 10, .ofs_y = -1}, + {.bitmap_index = 3640, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3668, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 3723, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3807, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3842, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 3896, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 3955, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 3999, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4071, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4149, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4240, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4331, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4396, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4481, .adv_w = 256, .box_w = 7, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 4530, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4607, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4685, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4783, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4838, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4923, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4982, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5066, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5131, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5196, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5287, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5400, .adv_w = 256, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5472, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5570, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5642, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5740, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5818, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5909, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5975, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6010, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6075, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6159, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6225, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6303, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6362, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6434, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6512, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6573, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6651, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6742, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6820, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6898, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6996, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7081, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7159, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7257, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7355, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7427, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7505, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7583, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7635, .adv_w = 256, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7700, .adv_w = 256, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 7759, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7831, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7915, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7999, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8058, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8143, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8209, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8287, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8346, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8401, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8492, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8537, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8615, .adv_w = 256, .box_w = 8, .box_h = 9, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8651, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8705, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8770, .adv_w = 256, .box_w = 8, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8822, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8887, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8978, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9043, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9128, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9200, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9285, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 9335, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9413, .adv_w = 256, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9457, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9522, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9594, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 9629, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 9683, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9768, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9840, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9931, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10003, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10081, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10151, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10235, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10313, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10398, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 10443, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 10515, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10599, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10704, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10776, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10848, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10909, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11000, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11066, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11151, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11211, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11283, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11381, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11459, .adv_w = 256, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11500, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11560, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11626, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11724, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 11770, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 11829, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11907, .adv_w = 256, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 11959, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12037, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12098, .adv_w = 256, .box_w = 13, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12144, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12214, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 12284, .adv_w = 256, .box_w = 9, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12334, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12389, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12455, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12521, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12619, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12717, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 12794, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 12871, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12937, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13021, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13087, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13141, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 13189, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13250, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13316, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13376, .adv_w = 256, .box_w = 11, .box_h = 10, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13431, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13516, .adv_w = 256, .box_w = 10, .box_h = 7, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13551, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13583, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13644, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13704, .adv_w = 256, .box_w = 7, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 13750, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13820, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13870, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13920, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13986, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14052, .adv_w = 256, .box_w = 10, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 14097, .adv_w = 256, .box_w = 15, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 14120, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 14136, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14248, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14353, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14473, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14577, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14689, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14794, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14907, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15035, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15387, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15492, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 15596, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15701, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15821, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15933, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16046, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16151, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16271, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16384, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16489, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16587, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 16700, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16828, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16948, .adv_w = 256, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17148, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17260, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17372, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17500, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17620, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17740, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17860, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18108, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18228, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18356, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18476, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18604, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18724, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18980, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 19078, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19206, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19334, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19574, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19694, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19822, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19942, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20190, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20310, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20438, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20814, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20927, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21055, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21175, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21303, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21431, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21559, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21679, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21799, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21912, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22032, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22160, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22273, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23393, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23513, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23769, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23897, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24017, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24137, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24265, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24393, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24521, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24634, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24762, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24890, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25018, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25131, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25251, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25371, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25476, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25596, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25716, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25836, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25956, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26084, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26204, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26317, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26437, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 26541, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26669, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 26782, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26902, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27015, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27135, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27255, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27383, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27503, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 27607, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 27705, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27825, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27938, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28050, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28163, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28291, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28524, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28644, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28742, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28855, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28968, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29081, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29194, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29322, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29442, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29675, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29788, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29908, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30036, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30164, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30277, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30389, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30509, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 30614, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30734, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30862, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30990, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31110, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31230, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31350, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31470, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31598, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31718, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31838, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31958, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32086, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32214, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32334, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32446, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32559, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32672, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32785, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32890, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33010, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33130, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33250, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33378, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33498, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33618, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33738, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33851, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33971, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34076, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34196, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34309, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34414, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34527, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34647, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34783, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34919, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35039, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35159, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35287, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35407, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35527, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35647, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 35719, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35839, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35959, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36064, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36162, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36387, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36491, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36619, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36739, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36844, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 36942, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37047, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37175, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37303, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37401, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37513, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37617, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37722, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37820, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 37933, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38038, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38143, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38256, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38376, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38489, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38617, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38850, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 38955, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39059, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39172, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39292, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39405, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39510, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39623, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39751, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 39864, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39992, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40097, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40217, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40330, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40443, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 40548, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40668, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40788, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 40886, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 40984, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41089, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 41187, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41307, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 41405, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41525, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41637, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41749, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41861, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41973, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42101, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42213, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42326, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42439, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42551, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42663, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42791, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42919, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43047, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43167, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43295, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43423, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43551, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43679, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43799, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43919, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44047, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44175, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44280, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44400, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44513, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44626, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44746, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 44851, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44964, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 45076, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45204, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45324, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45452, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45572, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45700, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45820, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45940, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46060, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46188, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46308, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46436, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 46549, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46677, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46797, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46910, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47038, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47166, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 47302, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47422, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47550, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47678, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47798, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47926, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48054, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48182, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48430, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48550, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48670, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48790, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48918, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49046, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49166, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49279, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49399, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49519, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49647, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49752, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49872, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49992, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50112, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50240, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50360, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50480, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50593, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50706, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50826, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50946, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51074, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51194, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51306, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51434, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 51554, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51674, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51794, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51914, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52026, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52146, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52274, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52394, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 52514, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52634, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52762, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52882, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53010, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53130, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53250, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53378, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53498, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 53603, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53716, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 53820, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53940, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54068, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54188, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54301, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54421, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54534, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54654, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54767, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54887, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55007, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55098, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55218, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55338, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55436, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55541, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55639, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55744, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55864, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 55962, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 56060, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56180, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56428, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 56548, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56668, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56796, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56916, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57029, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57149, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57261, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 57366, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57486, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57614, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57742, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57870, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57983, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58111, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58231, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58359, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58479, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58599, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58719, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58847, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58975, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59103, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59231, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59351, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 59441, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59553, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59666, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59786, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59914, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60019, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60139, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60259, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60387, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60507, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60627, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60747, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60867, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60995, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61115, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61235, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61363, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61491, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61611, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61731, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61859, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61964, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62069, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62182, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62302, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62558, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62670, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62790, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62910, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63023, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63136, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63264, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63369, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63482, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63587, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63707, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63835, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63955, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64068, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64181, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64293, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64421, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64526, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64646, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64759, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 64895, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65023, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65135, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65255, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65383, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65503, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 65623, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65759, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65879, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65999, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66119, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66239, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66367, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66487, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66607, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 66743, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66871, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66999, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67119, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67479, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67592, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67712, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67840, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67968, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68088, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68208, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 68321, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68441, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68569, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68697, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68825, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68953, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69073, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69193, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69321, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69449, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69569, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69682, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69802, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69930, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70058, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70186, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70306, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70426, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70546, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70666, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70794, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70922, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71035, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71148, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71276, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71524, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71637, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71757, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71885, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72013, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72141, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72269, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72389, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72517, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 72630, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72750, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72870, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72990, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73110, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73238, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73358, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73478, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73598, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 73711, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 73786, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73906, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74018, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74131, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 74229, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74334, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74462, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74567, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74672, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74800, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 74920, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75033, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75145, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75250, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75370, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75498, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75618, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75850, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75963, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76083, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76188, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76300, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76412, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76517, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 76613, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76733, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 76853, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 76949, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77061, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77189, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77317, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77543, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77656, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77776, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77889, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78009, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78129, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78249, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78362, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78475, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78603, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78731, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78859, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78987, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79115, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79235, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79363, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79491, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79619, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79739, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79859, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79987, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80100, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80228, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80356, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80476, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80604, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80732, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80860, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80988, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81108, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81236, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81364, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81492, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81620, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81748, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81876, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82004, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 82132, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82260, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82388, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82508, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82636, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82892, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83020, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83140, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83268, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83396, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83524, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83652, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83780, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 83916, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 84036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84156, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84284, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84412, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84540, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84652, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84892, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 85012, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85140, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85268, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85396, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85524, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85644, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85892, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86020, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86140, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86260, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86388, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86516, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 86614, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86726, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 86831, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 86944, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87072, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87200, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87328, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87448, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87568, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87816, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87929, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88049, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88169, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88289, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88409, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88522, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88642, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 88747, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88875, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89003, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89131, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89244, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89357, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89485, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89605, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89718, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89838, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89958, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90086, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 90206, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90326, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90454, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 90566, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90686, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90799, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90911, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91031, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91144, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91264, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91384, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91512, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91632, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91752, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91880, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91993, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92113, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92233, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92361, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 92481, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92609, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92737, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92865, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92993, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93121, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93249, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93369, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93481, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93609, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 93721, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93849, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93969, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94082, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94202, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94315, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94435, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94547, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94659, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 94779, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94899, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95027, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95155, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95283, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95403, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95523, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95651, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95771, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95899, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96019, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96139, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96259, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96379, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96499, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96627, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96739, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96859, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96972, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97092, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97212, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97332, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97452, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97565, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 97656, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 97754, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 97858, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 97956, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98061, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98174, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98279, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98399, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98504, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98632, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98752, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98865, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 98977, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99105, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99225, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99353, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 99466, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99586, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99676, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 99789, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99893, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 99998, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 100094, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100214, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 100297, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100417, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100537, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100665, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100793, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 100906, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101011, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101131, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101244, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 101364, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101484, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101612, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101732, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101980, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102100, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102213, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102333, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102453, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102573, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102693, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102821, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102941, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103069, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103189, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103317, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103445, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103565, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103685, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103805, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103925, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104045, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104173, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 104293, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104406, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 104519, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104639, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104759, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104999, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105127, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105240, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105368, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105496, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105624, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105744, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105872, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105992, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 106112, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106232, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106352, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106480, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106608, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106736, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106856, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106968, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107081, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107194, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 107314, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107434, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107547, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107667, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107787, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107899, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108019, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108147, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108267, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108387, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108507, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108627, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108755, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108875, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108995, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109115, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109243, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109371, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109499, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109619, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109747, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110108, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110236, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110356, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110484, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 110604, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110732, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110852, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110972, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 111108, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111206, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111326, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111574, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111687, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111807, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111920, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112048, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112176, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112296, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112424, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 112528, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112640, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112760, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 112865, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112985, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113113, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 113226, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113346, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113466, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113579, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113827, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113955, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 114038, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114143, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114271, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114391, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114504, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114632, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114760, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114888, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115016, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 115120, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115240, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115360, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115488, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115616, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115736, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115856, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115976, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116089, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116202, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116322, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116450, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116578, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116706, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 116826, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116954, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117082, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117210, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117338, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117451, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117571, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117827, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117939, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118067, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118195, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118443, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118556, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118676, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118796, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118916, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119156, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119276, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119524, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119644, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119764, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119892, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 120004, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120124, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120244, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120364, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120492, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120612, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120732, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120860, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120973, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121101, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121221, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121341, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121454, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121574, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121694, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121822, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121942, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122062, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122190, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122814, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122942, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123062, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123182, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123686, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123806, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123926, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124054, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124174, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124302, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124430, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 124566, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124694, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124807, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124927, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125047, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125159, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125279, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125392, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125512, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125632, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125730, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125850, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 125970, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126082, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126202, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126322, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126427, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126555, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 126675, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126803, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 126939, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 127075, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127195, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127443, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127563, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127691, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127811, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127931, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128059, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128187, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128315, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128443, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128571, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128699, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128827, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128955, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129068, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129196, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129324, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129452, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129572, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129692, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 129804, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129924, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130044, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 130156, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130284, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 130396, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130516, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130636, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130756, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130876, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130996, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131116, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131236, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131356, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 131468, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131588, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131708, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131828, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131948, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132068, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132188, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132308, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 132428, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132556, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132684, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132804, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132932, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133052, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133180, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133428, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133541, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133661, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133781, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 133894, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134022, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134142, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134262, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134390, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134518, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134638, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 134743, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134863, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134983, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135111, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135479, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 135591, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135719, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135839, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135959, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136079, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136177, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136275, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136379, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136477, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136575, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136680, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136792, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 136905, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137018, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137130, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137243, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137348, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137461, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137581, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137686, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137799, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 137919, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138039, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138167, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138287, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138400, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138528, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138641, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138769, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 138874, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138987, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 139099, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 139204, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 139317, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139437, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139565, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139693, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139813, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139933, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140053, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140181, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140301, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140413, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140526, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140646, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 140759, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140879, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140999, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141112, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141232, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141352, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141472, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141592, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141712, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141832, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141952, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142072, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142200, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142320, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142440, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142560, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142688, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142808, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 142936, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143056, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143176, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143304, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143432, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143552, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 143672, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143800, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143920, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144040, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144160, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144280, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144400, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 144505, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144625, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144753, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144881, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 145001, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145137, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145233, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145345, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145441, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 145507, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145635, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145763, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145889, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146017, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 146125, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146253, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 146309, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 146393, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146537, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 146633, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146721, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 146801, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 146927, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147032, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147130, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 147210, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 147322, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147392, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147462, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147560, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 147588, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 147696, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147856, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 148016, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148144, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 148214, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 148284, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148424, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 148520, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148648, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 148793, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148898, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149010, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149108, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149206, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 149302, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 149398, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149510, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149622, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 149730, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 149892, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149988, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150138, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150238, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150338, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150438, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150538, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 150638, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150785, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 150881, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150993, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 151138, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 151258, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151354, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 151448, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 151483, .adv_w = 256, .box_w = 5, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 151518, .adv_w = 256, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 151528, .adv_w = 256, .box_w = 6, .box_h = 11, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 151561, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, + 0x43, 0x45, 0x46, 0x47 +}; + +static const uint8_t glyph_id_ofs_list_4[] = { + 0, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 7, + 8, 9, 0, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 0, + 30, 31, 32, 0, 33, 34, 0, 35, + 36, 37, 38, 39, 40, 0, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 0, + 65, 66, 67, 68, 69, 70, 71 +}; + +static const uint16_t unicode_list_5[] = { + 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, + 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, + 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, + 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, + 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, + 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, + 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, + 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, + 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, + 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, + 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, + 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, + 0x2015, 0x203b, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, 0x205c, + 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, 0x207c, + 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, 0x209b, + 0x209e, 0x20aa, 0x20bd, 0x20c8, 0x20de, 0x20ee, 0x20f7, 0x210b, + 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, 0x2136, 0x213a, + 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, 0x215e, 0x216c, + 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, 0x21ba, 0x21bb, + 0x21da, 0x21e6, 0x21ea, 0x21ee, 0x21f5, 0x2206, 0x2216, 0x2227, + 0x2228, 0x224c, 0x2251, 0x2252, 0x2254, 0x2259, 0x225b, 0x2263, + 0x2265, 0x2268, 0x2269, 0x2282, 0x2284, 0x228c, 0x22ab, 0x22b0, + 0x22c4, 0x22cc, 0x22d3, 0x22d4, 0x22d9, 0x22db, 0x22dc, 0x22de, + 0x22e7, 0x22e8, 0x22f4, 0x22f5, 0x22f6, 0x22f7, 0x22fb, 0x22fc, + 0x2300, 0x2301, 0x2303, 0x2304, 0x2308, 0x2309, 0x2314, 0x2315, + 0x2319, 0x231d, 0x231e, 0x2322, 0x2337, 0x2338, 0x2351, 0x235b, + 0x2373, 0x2379, 0x2384, 0x238d, 0x238e, 0x239d, 0x23c3, 0x23d2, + 0x23f2, 0x23fb, 0x2457, 0x245b, 0x2460, 0x2477, 0x2495, 0x249a, + 0x24ad, 0x24ae, 0x24bf, 0x24c7, 0x24df, 0x2500, 0x252c, 0x25c5, + 0x25ec, 0x25ef, 0x25f1, 0x2601, 0x2604, 0x260e, 0x261c, 0x261e, + 0x2623, 0x2629, 0x2630, 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, + 0x269c, 0x26f0, 0x2708, 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, + 0x2794, 0x27a8, 0x27af, 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, + 0x281a, 0x2820, 0x2826, 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, + 0x283a, 0x283b, 0x283c, 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, + 0x2884, 0x288a, 0x288e, 0x2893, 0x28c4, 0x28ca, 0x28cc, 0x28da, + 0x28dc, 0x28e1, 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, + 0x29dd, 0x2a1a, 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, + 0x2a7c, 0x2a89, 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, + 0x2aa9, 0x2aaa, 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, + 0x2ac7, 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, + 0x2af0, 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, + 0x2b1e, 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, + 0x2b51, 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, + 0x2c07, 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, + 0x2d03, 0x2d13, 0x2d14, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, + 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, + 0x2d94, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, 0x2dbe, + 0x2dc8, 0x2df1, 0x2e0b, 0x2e20, 0x2e26, 0x2e30, 0x2e42, 0x2e46, + 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, 0x2e91, 0x2e96, + 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, 0x2eaf, 0x2eb2, + 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, 0x2f06, 0x2f1f, + 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, 0x2fb9, 0x2fbb, + 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302c, 0x3030, 0x305c, + 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, 0x3121, 0x3122, 0x3127, + 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, 0x315c, 0x315e, 0x3164, + 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, 0x31cd, 0x31d6, 0x31da, + 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, 0x3212, 0x3218, 0x322a, + 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, 0x32b2, 0x32b3, 0x32b6, + 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, 0x32ff, 0x330b, 0x334b, + 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, 0x344a, 0x344f, 0x3450, + 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, 0x3481, 0x3485, 0x3498, + 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, 0x34cd, 0x34ce, 0x34d2, + 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34fa, 0x3507, 0x3518, 0x351f, + 0x3524, 0x3525, 0x3530, 0x3531, 0x3536, 0x3539, 0x3540, 0x354d, + 0x3553, 0x357a, 0x357f, 0x3580, 0x3585, 0x358b, 0x3598, 0x35a2, + 0x35a7, 0x35a8, 0x35d8, 0x35ed, 0x3603, 0x3605, 0x3609, 0x360f, + 0x3610, 0x3611, 0x3614, 0x3619, 0x361a, 0x361c, 0x361e, 0x362c, + 0x362e, 0x3630, 0x3639, 0x363b, 0x363c, 0x363d, 0x363e, 0x364b, + 0x3661, 0x3662, 0x3670, 0x3672, 0x3676, 0x3680, 0x3682, 0x36a1, + 0x36a8, 0x36ad, 0x36e1, 0x36f6, 0x3702, 0x370c, 0x3710, 0x3732, + 0x373b, 0x374a, 0x374d, 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, + 0x382d, 0x386b, 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, + 0x3913, 0x392a, 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, + 0x3a32, 0x3a43, 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, + 0x3a76, 0x3a7a, 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, + 0x3a9c, 0x3ac6, 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, + 0x3b22, 0x3b25, 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, + 0x3b71, 0x3b8b, 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, + 0x3be6, 0x3bf3, 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, + 0x3c4c, 0x3c4f, 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, + 0x3d02, 0x3d08, 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, + 0x3d3a, 0x3d40, 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, + 0x3e49, 0x3ed4, 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, + 0x4032, 0x4047, 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, + 0x4158, 0x416c, 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, + 0x41d1, 0x41fd, 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, + 0x4314, 0x4317, 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, + 0x4439, 0x4441, 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, + 0x445d, 0x446a, 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, + 0x44ec, 0x458b, 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, + 0x45e8, 0x45ff, 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, + 0x4651, 0x46f6, 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, + 0x484b, 0x484d, 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, + 0x48d1, 0x48d2, 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, + 0x493f, 0x495e, 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, + 0x4a22, 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, + 0x4ab2, 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, + 0x4c11, 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, + 0x4c5d, 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, + 0x4cbe, 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, + 0x4d4e, 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, + 0x4e7f, 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, + 0x4f44, 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, + 0x4fc0, 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x5066, 0x5077, + 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, + 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x51c2, 0x51f6, + 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, 0x535a, + 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, 0x575d, + 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, 0x5818, + 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, 0x58cb, + 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, 0x591f, + 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, 0x5966, + 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, 0x59a9, + 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, 0x59d8, + 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, 0x5a81, + 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5b61, 0x5b72, 0x5bb1, 0x5bb2, + 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, 0x5bd0, 0x5bd4, + 0x5bd8, 0x5bfb, 0x5c0e, 0x5c75, 0x5c81, 0x5c88, 0x5c96, 0x5c9b, + 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, 0x5ddb, 0x5df0, 0x5df3, + 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, 0x5e49, 0x5eac, 0x5eaf, + 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, 0x5ee2, 0x5ee5, 0x5efc, + 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, 0x5f21, 0x5f2a, 0x5f2b, + 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, 0x5f43, 0x5f56, 0x5f5b, + 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, 0x5f71, 0x5f7a, 0x5f89, + 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, 0x5ff9, 0x6006, 0x600e, + 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, 0x60de, 0x60df, 0x60e0, + 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, 0x6233, 0x6240, 0x6243, + 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, 0x64ed, 0x6555, 0x655e, + 0x6561, 0x6573, 0x6575, 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, + 0x65b4, 0x65b9, 0x65cc, 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, + 0x65f4, 0x65f9, 0x65fb, 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, + 0x666a, 0x666f, 0x6673, 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, + 0x6716, 0x6719, 0x6728, 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, + 0x6769, 0x676f, 0x6780, 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, + 0x6839, 0x68a7, 0x68aa, 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, + 0x69e5, 0x69e9, 0x69fb, 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, + 0x6de3, 0x6def, 0x6df9, 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, + 0xbf1d, 0xbf1e, 0xbf22, 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, + 0xbf37, 0xbf38, 0xbf39, 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, + 0xbf5e, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, + 0xbf81, 0xbf82, 0xbf85, 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, + 0xbfa6, 0xbfd5, 0xbfd6, 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, + 0xc004, 0xc02d, 0xc035, 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, + 0xc154, 0xc155, 0xc198, 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, + 0xc7b3, 0xce19, 0xce1a, 0xce1d, 0xce22, 0xce23 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12289, .range_length = 72, .glyph_id_start = 97, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 12362, .range_length = 24, .glyph_id_start = 109, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12387, .range_length = 43, .glyph_id_start = 133, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12431, .range_length = 95, .glyph_id_start = 176, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 12527, .range_length = 52772, .glyph_id_start = 248, + .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1166, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 6, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_simsun_16_cjk = { +#else +lv_font_t lv_font_simsun_16_cjk = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 19, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_SIMSUN_16_CJK*/ diff --git a/libraries/lvgl/src/font/lv_font_unscii_16.c b/libraries/lvgl/src/font/lv_font_unscii_16.c new file mode 100644 index 0000000..b95d51a --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_unscii_16.c @@ -0,0 +1,641 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 16 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 1 +#endif + +#if LV_FONT_UNSCII_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + + /* U+0022 "\"" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, + + /* U+0023 "#" */ + 0x3c, 0xf0, 0xf3, 0xc3, 0xcf, 0xf, 0x3c, 0xff, + 0xff, 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xf0, 0xf3, + 0xc0, + + /* U+0024 "$" */ + 0xf, 0x0, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0025 "%" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0x3, + 0xc0, 0xf, 0x0, 0xf0, 0x3, 0xc0, 0x3c, 0x3c, + 0xf0, 0xff, 0x3, 0xfc, 0xf, + + /* U+0026 "&" */ + 0xf, 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xf3, 0xcf, 0xcf, 0xf3, 0xf3, + 0xcf, 0xcf, 0xf, 0x3c, 0x3c, 0x3f, 0x3c, 0xfc, + 0xf0, + + /* U+0027 "'" */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+0028 "(" */ + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0029 ")" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, + + /* U+002A "*" */ + 0x3c, 0x3c, 0x3c, 0x3c, 0xf, 0xf0, 0xf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xf0, 0xf, 0xf0, + 0x3c, 0x3c, 0x3c, 0x3c, + + /* U+002B "+" */ + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, 0xff, + 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+002C "," */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+002D "-" */ + 0xff, 0xff, 0xff, + + /* U+002E "." */ + 0xff, 0xff, + + /* U+002F "/" */ + 0x0, 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf0, 0x0, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf0, 0x0, 0xf0, 0x0, + + /* U+0030 "0" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf3, 0xff, + 0x3f, 0xfc, 0xff, 0xcf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0031 "1" */ + 0xf, 0x0, 0xf0, 0x3f, 0x3, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+0032 "2" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0033 "3" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0xf, 0xc0, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0034 "4" */ + 0x3, 0xf0, 0xf, 0xc0, 0xff, 0x3, 0xfc, 0x3c, + 0xf0, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3, + 0xc0, + + /* U+0035 "5" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0036 "6" */ + 0xf, 0xc0, 0xfc, 0x3c, 0x3, 0xc0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0038 "8" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0039 "9" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3, + 0xc0, 0x3c, 0x3f, 0x3, 0xf0, + + /* U+003A ":" */ + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + + /* U+003B ";" */ + 0x3c, 0xf3, 0xcf, 0x0, 0x0, 0x0, 0x3c, 0xf3, + 0xcf, 0xf3, 0xc0, + + /* U+003C "<" */ + 0x3, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, + 0xc0, 0xf0, + + /* U+003D "=" */ + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, + + /* U+003E ">" */ + 0xf0, 0x3c, 0x3, 0xc0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0xf, 0x3, 0xc3, 0xc0, 0xf0, 0xf0, + 0x3c, 0x0, + + /* U+003F "?" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0x0, 0xf0, + + /* U+0040 "@" */ + 0x3f, 0xf0, 0xff, 0xcf, 0x3, 0xfc, 0xf, 0xf3, + 0xff, 0xcf, 0xff, 0x3f, 0xfc, 0xff, 0xf3, 0xff, + 0xcf, 0xff, 0x0, 0x3c, 0x0, 0x3f, 0xf0, 0xff, + 0xc0, + + /* U+0041 "A" */ + 0xf, 0x0, 0xf0, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0042 "B" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0043 "C" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0044 "D" */ + 0xff, 0xf, 0xf0, 0xf3, 0xcf, 0x3c, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0xff, 0xf, 0xf0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0047 "G" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf3, 0xff, 0x3f, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0048 "H" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0049 "I" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+004A "J" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+004B "K" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0xf3, + 0xc3, 0xcf, 0xf, 0xf0, 0x3f, 0xc0, 0xf3, 0xc3, + 0xcf, 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004C "L" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+004D "M" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xcf, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004E "N" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xc3, 0xff, 0xf, 0xff, + 0x3f, 0xfc, 0xff, 0x3f, 0xfc, 0xff, 0xf0, 0xff, + 0xc3, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004F "O" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0050 "P" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0051 "Q" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0x3c, 0xf3, 0xcf, + + /* U+0052 "R" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf3, 0xcf, 0x3c, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0053 "S" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0055 "U" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0056 "V" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0x3f, + 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0057 "W" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, + 0x3f, 0xc0, 0xff, 0x33, 0xfc, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0x3f, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+0058 "X" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0xf0, 0xf, 0xf0, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf0, 0xf, 0xf0, 0xf, + + /* U+0059 "Y" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, + + /* U+005A "Z" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+005B "[" */ + 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, + + /* U+005C "\\" */ + 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf, 0x0, 0xf, 0x0, 0x3, 0xc0, 0x3, 0xc0, + 0x0, 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf, 0x0, 0xf, + + /* U+005D "]" */ + 0xff, 0xff, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0xf, 0xf, 0xff, 0xff, + + /* U+005E "^" */ + 0x3, 0x0, 0xc, 0x0, 0xfc, 0x3, 0xf0, 0x3c, + 0xf0, 0xf3, 0xcf, 0x3, 0xfc, 0xf, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0061 "a" */ + 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0062 "b" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0063 "c" */ + 0x3f, 0xcf, 0xff, 0x3, 0xc0, 0xf0, 0x3c, 0xf, + 0x3, 0xc0, 0x3f, 0xcf, 0xf0, + + /* U+0064 "d" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0065 "e" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, 0xfc, + + /* U+0066 "f" */ + 0xf, 0xc3, 0xf3, 0xc0, 0xf0, 0xff, 0xff, 0xf3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, + 0xf, 0x0, + + /* U+0067 "g" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, + + /* U+0068 "h" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0069 "i" */ + 0x3c, 0xf, 0x0, 0x0, 0x0, 0xfc, 0x3f, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006A "j" */ + 0x3, 0xc0, 0xf0, 0x0, 0x0, 0x3, 0xc0, 0xf0, + 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xff, 0xf3, 0xfc, + + /* U+006B "k" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, + 0xf, 0xf3, 0xcf, 0x3c, 0xff, 0xf, 0xf0, 0xf3, + 0xcf, 0x3c, 0xf0, 0xff, 0xf, + + /* U+006C "l" */ + 0xfc, 0x3f, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006D "m" */ + 0xf0, 0xf3, 0xc3, 0xcf, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xcc, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+006E "n" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+006F "o" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0070 "p" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, + + /* U+0071 "q" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, + + /* U+0072 "r" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0073 "s" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, + 0xfc, 0x0, 0xf0, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0074 "t" */ + 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0xff, 0xff, + 0xff, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, + 0x3, 0xc0, 0xf, 0xf0, 0xff, + + /* U+0075 "u" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0076 "v" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0077 "w" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf3, + 0x3f, 0xcc, 0xf3, 0xff, 0xf, 0xfc, 0x3c, 0xf0, + 0xf3, 0xc0, + + /* U+0078 "x" */ + 0xf0, 0x3f, 0xc0, 0xf3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+0079 "y" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3f, + 0xc3, 0xfc, + + /* U+007A "z" */ + 0xff, 0xff, 0xff, 0x3, 0xc0, 0x3c, 0xf, 0x0, + 0xf0, 0x3c, 0x3, 0xc0, 0xff, 0xff, 0xff, + + /* U+007B "{" */ + 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0x3, 0xf0, 0x3f, + + /* U+007C "|" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+007D "}" */ + 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xfc, 0xf, 0xc0, + + /* U+007E "~" */ + 0x3f, 0x3c, 0xfc, 0xff, 0x3f, 0x3c, 0xfc, + + /* U+007F "" */ + 0xf0, 0x3, 0xc0, 0xc, 0xc0, 0x33, 0x0, 0xcc, + 0xff, 0x33, 0xfc, 0xc3, 0x33, 0xc, 0xf0, 0x33, + 0xc0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, + 0xc0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 256, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 1, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 8, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 17, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 63, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 84, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 109, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 10}, + {.bitmap_index = 114, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 128, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 142, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 162, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 177, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 182, .adv_w = 256, .box_w = 12, .box_h = 2, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 185, .adv_w = 256, .box_w = 4, .box_h = 4, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 187, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 215, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 236, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 257, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 278, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 299, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 324, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 345, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 366, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 387, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 408, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 429, .adv_w = 256, .box_w = 4, .box_h = 12, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 435, .adv_w = 256, .box_w = 6, .box_h = 14, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 446, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 464, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 473, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 491, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 512, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 537, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 558, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 579, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 600, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 621, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 642, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 663, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 684, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 705, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 726, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 747, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 772, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 793, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 818, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 843, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 864, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 885, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 906, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 927, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 948, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 969, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 990, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1011, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1064, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1092, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1113, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1127, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1155, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1169, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1183, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1187, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 6, .ofs_y = 10}, + {.bitmap_index = 1193, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1208, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1229, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1242, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1263, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1278, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1296, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1314, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1335, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1353, .adv_w = 256, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1373, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1394, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1412, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1430, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1445, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1460, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1478, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1511, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1526, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1547, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1562, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1577, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1595, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1613, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1631, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1646, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1667, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 1674, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1695, .adv_w = 256, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1702, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_unscii_16 = { +#else +lv_font_t lv_font_unscii_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 17, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_UNSCII_16*/ diff --git a/libraries/lvgl/src/font/lv_font_unscii_8.c b/libraries/lvgl/src/font/lv_font_unscii_8.c new file mode 100644 index 0000000..26b92fb --- /dev/null +++ b/libraries/lvgl/src/font/lv_font_unscii_8.c @@ -0,0 +1,477 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 8 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 1 +#endif + +#if LV_FONT_UNSCII_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xcc, + + /* U+0022 "\"" */ + 0xcf, 0x3c, 0xc0, + + /* U+0023 "#" */ + 0x6c, 0xdb, 0xfb, 0x6f, 0xed, 0x9b, 0x0, + + /* U+0024 "$" */ + 0x31, 0xfc, 0x1e, 0xf, 0xe3, 0x0, + + /* U+0025 "%" */ + 0xc7, 0x98, 0x61, 0x86, 0x78, 0xc0, + + /* U+0026 "&" */ + 0x38, 0xd8, 0xe3, 0xbd, 0xd9, 0x9d, 0x80, + + /* U+0027 "'" */ + 0x6f, 0x0, + + /* U+0028 "(" */ + 0x36, 0xcc, 0xc6, 0x30, + + /* U+0029 ")" */ + 0xc6, 0x33, 0x36, 0xc0, + + /* U+002A "*" */ + 0x66, 0x3c, 0xff, 0x3c, 0x66, + + /* U+002B "+" */ + 0x30, 0xcf, 0xcc, 0x30, + + /* U+002C "," */ + 0x6f, 0x0, + + /* U+002D "-" */ + 0xfc, + + /* U+002E "." */ + 0xf0, + + /* U+002F "/" */ + 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, + + /* U+0030 "0" */ + 0x7b, 0x3d, 0xfb, 0xcf, 0x37, 0x80, + + /* U+0031 "1" */ + 0x31, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+0032 "2" */ + 0x7b, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+0033 "3" */ + 0x7b, 0x30, 0xce, 0xf, 0x37, 0x80, + + /* U+0034 "4" */ + 0x1c, 0x79, 0xb6, 0x6f, 0xe1, 0x83, 0x0, + + /* U+0035 "5" */ + 0xff, 0xf, 0x83, 0xf, 0x37, 0x80, + + /* U+0036 "6" */ + 0x39, 0x8c, 0x3e, 0xcf, 0x37, 0x80, + + /* U+0037 "7" */ + 0xfc, 0x30, 0xc6, 0x30, 0xc3, 0x0, + + /* U+0038 "8" */ + 0x7b, 0x3c, 0xde, 0xcf, 0x37, 0x80, + + /* U+0039 "9" */ + 0x7b, 0x3c, 0xdf, 0xc, 0x67, 0x0, + + /* U+003A ":" */ + 0xf0, 0xf0, + + /* U+003B ";" */ + 0x6c, 0x6, 0xf0, + + /* U+003C "<" */ + 0x19, 0x99, 0x86, 0x18, 0x60, + + /* U+003D "=" */ + 0xfc, 0xf, 0xc0, + + /* U+003E ">" */ + 0xc3, 0xc, 0x33, 0x33, 0x0, + + /* U+003F "?" */ + 0x7b, 0x30, 0xc6, 0x30, 0x3, 0x0, + + /* U+0040 "@" */ + 0x7d, 0x8f, 0x7e, 0xfd, 0xf8, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x31, 0xec, 0xf3, 0xff, 0x3c, 0xc0, + + /* U+0042 "B" */ + 0xfb, 0x3c, 0xfe, 0xcf, 0x3f, 0x80, + + /* U+0043 "C" */ + 0x7b, 0x3c, 0x30, 0xc3, 0x37, 0x80, + + /* U+0044 "D" */ + 0xf3, 0x6c, 0xf3, 0xcf, 0x6f, 0x0, + + /* U+0045 "E" */ + 0xff, 0xc, 0x3e, 0xc3, 0xf, 0xc0, + + /* U+0046 "F" */ + 0xff, 0xc, 0x3e, 0xc3, 0xc, 0x0, + + /* U+0047 "G" */ + 0x7b, 0x3c, 0x37, 0xcf, 0x37, 0xc0, + + /* U+0048 "H" */ + 0xcf, 0x3c, 0xff, 0xcf, 0x3c, 0xc0, + + /* U+0049 "I" */ + 0xfc, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+004A "J" */ + 0xc, 0x30, 0xc3, 0xf, 0x37, 0x80, + + /* U+004B "K" */ + 0xc7, 0x9b, 0x67, 0x8d, 0x99, 0xb1, 0x80, + + /* U+004C "L" */ + 0xc3, 0xc, 0x30, 0xc3, 0xf, 0xc0, + + /* U+004D "M" */ + 0xc7, 0xdf, 0xfe, 0xbc, 0x78, 0xf1, 0x80, + + /* U+004E "N" */ + 0xc7, 0xcf, 0xde, 0xfc, 0xf8, 0xf1, 0x80, + + /* U+004F "O" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0050 "P" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0xc, 0x0, + + /* U+0051 "Q" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x66, 0xc0, + + /* U+0052 "R" */ + 0xfb, 0x3c, 0xfe, 0xdb, 0x3c, 0xc0, + + /* U+0053 "S" */ + 0x7b, 0x3c, 0x1e, 0xf, 0x37, 0x80, + + /* U+0054 "T" */ + 0xfc, 0xc3, 0xc, 0x30, 0xc3, 0x0, + + /* U+0055 "U" */ + 0xcf, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0056 "V" */ + 0xcf, 0x3c, 0xf3, 0xcd, 0xe3, 0x0, + + /* U+0057 "W" */ + 0xc7, 0x8f, 0x1e, 0xbf, 0xfd, 0xf1, 0x80, + + /* U+0058 "X" */ + 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, + + /* U+0059 "Y" */ + 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, + + /* U+005A "Z" */ + 0xfc, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+005B "[" */ + 0xfc, 0xcc, 0xcc, 0xf0, + + /* U+005C "\\" */ + 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, + + /* U+005D "]" */ + 0xf3, 0x33, 0x33, 0xf0, + + /* U+005E "^" */ + 0x10, 0x71, 0xb6, 0x30, + + /* U+005F "_" */ + 0xff, + + /* U+0060 "`" */ + 0xc6, 0x30, + + /* U+0061 "a" */ + 0x78, 0x37, 0xf3, 0x7c, + + /* U+0062 "b" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3f, 0x80, + + /* U+0063 "c" */ + 0x7e, 0x31, 0x87, 0x80, + + /* U+0064 "d" */ + 0xc, 0x37, 0xf3, 0xcf, 0x37, 0xc0, + + /* U+0065 "e" */ + 0x7b, 0x3f, 0xf0, 0x78, + + /* U+0066 "f" */ + 0x3b, 0x3e, 0xc6, 0x31, 0x80, + + /* U+0067 "g" */ + 0x7f, 0x3c, 0xdf, 0xf, 0xe0, + + /* U+0068 "h" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3c, 0xc0, + + /* U+0069 "i" */ + 0x60, 0x38, 0xc6, 0x31, 0xe0, + + /* U+006A "j" */ + 0x18, 0x6, 0x31, 0x8c, 0x7e, + + /* U+006B "k" */ + 0xc3, 0xc, 0xf6, 0xf3, 0x6c, 0xc0, + + /* U+006C "l" */ + 0xe3, 0x18, 0xc6, 0x31, 0xe0, + + /* U+006D "m" */ + 0xcd, 0xff, 0x5e, 0xbc, 0x60, + + /* U+006E "n" */ + 0xfb, 0x3c, 0xf3, 0xcc, + + /* U+006F "o" */ + 0x7b, 0x3c, 0xf3, 0x78, + + /* U+0070 "p" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0x0, + + /* U+0071 "q" */ + 0x7f, 0x3c, 0xdf, 0xc, 0x30, + + /* U+0072 "r" */ + 0xfb, 0x3c, 0x30, 0xc0, + + /* U+0073 "s" */ + 0x7f, 0x7, 0x83, 0xf8, + + /* U+0074 "t" */ + 0x61, 0x8f, 0xd8, 0x61, 0x83, 0xc0, + + /* U+0075 "u" */ + 0xcf, 0x3c, 0xf3, 0x7c, + + /* U+0076 "v" */ + 0xcf, 0x3c, 0xde, 0x30, + + /* U+0077 "w" */ + 0xc7, 0x8f, 0x5b, 0xe6, 0xc0, + + /* U+0078 "x" */ + 0xc6, 0xd8, 0xe3, 0x6c, 0x60, + + /* U+0079 "y" */ + 0xcf, 0x3c, 0xdf, 0xd, 0xe0, + + /* U+007A "z" */ + 0xfc, 0x63, 0x18, 0xfc, + + /* U+007B "{" */ + 0x1c, 0xc3, 0x38, 0x30, 0xc1, 0xc0, + + /* U+007C "|" */ + 0xff, 0xfc, + + /* U+007D "}" */ + 0xe0, 0xc3, 0x7, 0x30, 0xce, 0x0, + + /* U+007E "~" */ + 0x77, 0xb8, + + /* U+007F "" */ + 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 128, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 19, .adv_w = 128, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 34, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 38, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 42, .adv_w = 128, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 51, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 53, .adv_w = 128, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 54, .adv_w = 128, .box_w = 2, .box_h = 2, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 55, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 62, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 68, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 74, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 80, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 86, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 93, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 99, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 105, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 111, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 117, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 123, .adv_w = 128, .box_w = 2, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 125, .adv_w = 128, .box_w = 3, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 128, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 133, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 136, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 141, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 147, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 154, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 160, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 166, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 172, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 178, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 184, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 190, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 196, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 202, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 208, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 214, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 221, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 227, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 234, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 241, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 247, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 253, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 259, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 265, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 271, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 277, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 283, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 289, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 296, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 303, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 310, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 316, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 320, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 327, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 331, .adv_w = 128, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 335, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 336, .adv_w = 128, .box_w = 4, .box_h = 3, .ofs_x = 3, .ofs_y = 5}, + {.bitmap_index = 338, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 348, .adv_w = 128, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 352, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 358, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 362, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 367, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 372, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 383, .adv_w = 128, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 388, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 394, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 399, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 404, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 408, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 412, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 417, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 422, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 426, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 430, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 436, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 440, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 444, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 449, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 454, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 463, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 469, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 471, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 477, .adv_w = 128, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 479, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_unscii_8 = { +#else +lv_font_t lv_font_unscii_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 9, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_UNSCII_8*/ diff --git a/libraries/lvgl/src/font/lv_symbol_def.h b/libraries/lvgl/src/font/lv_symbol_def.h new file mode 100644 index 0000000..7c23658 --- /dev/null +++ b/libraries/lvgl/src/font/lv_symbol_def.h @@ -0,0 +1,352 @@ +#ifndef LV_SYMBOL_DEF_H +#define LV_SYMBOL_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../lv_conf_internal.h" + +/*------------------------------- + * Symbols from "normal" font + *-----------------------------*/ +#if !defined LV_SYMBOL_BULLET +#define LV_SYMBOL_BULLET "\xE2\x80\xA2" /*20042, 0x2022*/ +#endif + +/*------------------------------- + * Symbols from FontAwesome font + *-----------------------------*/ + +/*In the font converter use this list as range: + 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468, + 61473, 61478, 61479, 61480, 61502, 61507, 61512, 61515, 61516, 61517, + 61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, + 61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61641, + 61664, 61671, 61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, + 62018, 62019, 62020, 62087, 62099, 62189, 62212, 62810, 63426, 63650 +*/ + +/* These symbols can be prefined in the lv_conf.h file. + * If they are not predefined, they will use the following values + */ + +#if !defined LV_SYMBOL_AUDIO +#define LV_SYMBOL_AUDIO "\xEF\x80\x81" /*61441, 0xF001*/ +#endif + +#if !defined LV_SYMBOL_VIDEO +#define LV_SYMBOL_VIDEO "\xEF\x80\x88" /*61448, 0xF008*/ +#endif + +#if !defined LV_SYMBOL_LIST +#define LV_SYMBOL_LIST "\xEF\x80\x8B" /*61451, 0xF00B*/ +#endif + +#if !defined LV_SYMBOL_OK +#define LV_SYMBOL_OK "\xEF\x80\x8C" /*61452, 0xF00C*/ +#endif + +#if !defined LV_SYMBOL_CLOSE +#define LV_SYMBOL_CLOSE "\xEF\x80\x8D" /*61453, 0xF00D*/ +#endif + +#if !defined LV_SYMBOL_POWER +#define LV_SYMBOL_POWER "\xEF\x80\x91" /*61457, 0xF011*/ +#endif + +#if !defined LV_SYMBOL_SETTINGS +#define LV_SYMBOL_SETTINGS "\xEF\x80\x93" /*61459, 0xF013*/ +#endif + +#if !defined LV_SYMBOL_HOME +#define LV_SYMBOL_HOME "\xEF\x80\x95" /*61461, 0xF015*/ +#endif + +#if !defined LV_SYMBOL_DOWNLOAD +#define LV_SYMBOL_DOWNLOAD "\xEF\x80\x99" /*61465, 0xF019*/ +#endif + +#if !defined LV_SYMBOL_DRIVE +#define LV_SYMBOL_DRIVE "\xEF\x80\x9C" /*61468, 0xF01C*/ +#endif + +#if !defined LV_SYMBOL_REFRESH +#define LV_SYMBOL_REFRESH "\xEF\x80\xA1" /*61473, 0xF021*/ +#endif + +#if !defined LV_SYMBOL_MUTE +#define LV_SYMBOL_MUTE "\xEF\x80\xA6" /*61478, 0xF026*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MID +#define LV_SYMBOL_VOLUME_MID "\xEF\x80\xA7" /*61479, 0xF027*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MAX +#define LV_SYMBOL_VOLUME_MAX "\xEF\x80\xA8" /*61480, 0xF028*/ +#endif + +#if !defined LV_SYMBOL_IMAGE +#define LV_SYMBOL_IMAGE "\xEF\x80\xBE" /*61502, 0xF03E*/ +#endif + +#if !defined LV_SYMBOL_TINT +#define LV_SYMBOL_TINT "\xEF\x81\x83" /*61507, 0xF043*/ +#endif + +#if !defined LV_SYMBOL_PREV +#define LV_SYMBOL_PREV "\xEF\x81\x88" /*61512, 0xF048*/ +#endif + +#if !defined LV_SYMBOL_PLAY +#define LV_SYMBOL_PLAY "\xEF\x81\x8B" /*61515, 0xF04B*/ +#endif + +#if !defined LV_SYMBOL_PAUSE +#define LV_SYMBOL_PAUSE "\xEF\x81\x8C" /*61516, 0xF04C*/ +#endif + +#if !defined LV_SYMBOL_STOP +#define LV_SYMBOL_STOP "\xEF\x81\x8D" /*61517, 0xF04D*/ +#endif + +#if !defined LV_SYMBOL_NEXT +#define LV_SYMBOL_NEXT "\xEF\x81\x91" /*61521, 0xF051*/ +#endif + +#if !defined LV_SYMBOL_EJECT +#define LV_SYMBOL_EJECT "\xEF\x81\x92" /*61522, 0xF052*/ +#endif + +#if !defined LV_SYMBOL_LEFT +#define LV_SYMBOL_LEFT "\xEF\x81\x93" /*61523, 0xF053*/ +#endif + +#if !defined LV_SYMBOL_RIGHT +#define LV_SYMBOL_RIGHT "\xEF\x81\x94" /*61524, 0xF054*/ +#endif + +#if !defined LV_SYMBOL_PLUS +#define LV_SYMBOL_PLUS "\xEF\x81\xA7" /*61543, 0xF067*/ +#endif + +#if !defined LV_SYMBOL_MINUS +#define LV_SYMBOL_MINUS "\xEF\x81\xA8" /*61544, 0xF068*/ +#endif + +#if !defined LV_SYMBOL_EYE_OPEN +#define LV_SYMBOL_EYE_OPEN "\xEF\x81\xAE" /*61550, 0xF06E*/ +#endif + +#if !defined LV_SYMBOL_EYE_CLOSE +#define LV_SYMBOL_EYE_CLOSE "\xEF\x81\xB0" /*61552, 0xF070*/ +#endif + +#if !defined LV_SYMBOL_WARNING +#define LV_SYMBOL_WARNING "\xEF\x81\xB1" /*61553, 0xF071*/ +#endif + +#if !defined LV_SYMBOL_SHUFFLE +#define LV_SYMBOL_SHUFFLE "\xEF\x81\xB4" /*61556, 0xF074*/ +#endif + +#if !defined LV_SYMBOL_UP +#define LV_SYMBOL_UP "\xEF\x81\xB7" /*61559, 0xF077*/ +#endif + +#if !defined LV_SYMBOL_DOWN +#define LV_SYMBOL_DOWN "\xEF\x81\xB8" /*61560, 0xF078*/ +#endif + +#if !defined LV_SYMBOL_LOOP +#define LV_SYMBOL_LOOP "\xEF\x81\xB9" /*61561, 0xF079*/ +#endif + +#if !defined LV_SYMBOL_DIRECTORY +#define LV_SYMBOL_DIRECTORY "\xEF\x81\xBB" /*61563, 0xF07B*/ +#endif + +#if !defined LV_SYMBOL_UPLOAD +#define LV_SYMBOL_UPLOAD "\xEF\x82\x93" /*61587, 0xF093*/ +#endif + +#if !defined LV_SYMBOL_CALL +#define LV_SYMBOL_CALL "\xEF\x82\x95" /*61589, 0xF095*/ +#endif + +#if !defined LV_SYMBOL_CUT +#define LV_SYMBOL_CUT "\xEF\x83\x84" /*61636, 0xF0C4*/ +#endif + +#if !defined LV_SYMBOL_COPY +#define LV_SYMBOL_COPY "\xEF\x83\x85" /*61637, 0xF0C5*/ +#endif + +#if !defined LV_SYMBOL_SAVE +#define LV_SYMBOL_SAVE "\xEF\x83\x87" /*61639, 0xF0C7*/ +#endif + +#if !defined LV_SYMBOL_BARS +#define LV_SYMBOL_BARS "\xEF\x83\x89" /*61641, 0xF0C9*/ +#endif + +#if !defined LV_SYMBOL_ENVELOPE +#define LV_SYMBOL_ENVELOPE "\xEF\x83\xA0" /*61664, 0xF0E0*/ +#endif + +#if !defined LV_SYMBOL_CHARGE +#define LV_SYMBOL_CHARGE "\xEF\x83\xA7" /*61671, 0xF0E7*/ +#endif + +#if !defined LV_SYMBOL_PASTE +#define LV_SYMBOL_PASTE "\xEF\x83\xAA" /*61674, 0xF0EA*/ +#endif + +#if !defined LV_SYMBOL_BELL +#define LV_SYMBOL_BELL "\xEF\x83\xB3" /*61683, 0xF0F3*/ +#endif + +#if !defined LV_SYMBOL_KEYBOARD +#define LV_SYMBOL_KEYBOARD "\xEF\x84\x9C" /*61724, 0xF11C*/ +#endif + +#if !defined LV_SYMBOL_GPS +#define LV_SYMBOL_GPS "\xEF\x84\xA4" /*61732, 0xF124*/ +#endif + +#if !defined LV_SYMBOL_FILE +#define LV_SYMBOL_FILE "\xEF\x85\x9B" /*61787, 0xF158*/ +#endif + +#if !defined LV_SYMBOL_WIFI +#define LV_SYMBOL_WIFI "\xEF\x87\xAB" /*61931, 0xF1EB*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_FULL +#define LV_SYMBOL_BATTERY_FULL "\xEF\x89\x80" /*62016, 0xF240*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_3 +#define LV_SYMBOL_BATTERY_3 "\xEF\x89\x81" /*62017, 0xF241*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_2 +#define LV_SYMBOL_BATTERY_2 "\xEF\x89\x82" /*62018, 0xF242*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_1 +#define LV_SYMBOL_BATTERY_1 "\xEF\x89\x83" /*62019, 0xF243*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_EMPTY +#define LV_SYMBOL_BATTERY_EMPTY "\xEF\x89\x84" /*62020, 0xF244*/ +#endif + +#if !defined LV_SYMBOL_USB +#define LV_SYMBOL_USB "\xEF\x8a\x87" /*62087, 0xF287*/ +#endif + +#if !defined LV_SYMBOL_BLUETOOTH +#define LV_SYMBOL_BLUETOOTH "\xEF\x8a\x93" /*62099, 0xF293*/ +#endif + +#if !defined LV_SYMBOL_TRASH +#define LV_SYMBOL_TRASH "\xEF\x8B\xAD" /*62189, 0xF2ED*/ +#endif + +#if !defined LV_SYMBOL_EDIT +#define LV_SYMBOL_EDIT "\xEF\x8C\x84" /*62212, 0xF304*/ +#endif + +#if !defined LV_SYMBOL_BACKSPACE +#define LV_SYMBOL_BACKSPACE "\xEF\x95\x9A" /*62810, 0xF55A*/ +#endif + +#if !defined LV_SYMBOL_SD_CARD +#define LV_SYMBOL_SD_CARD "\xEF\x9F\x82" /*63426, 0xF7C2*/ +#endif + +#if !defined LV_SYMBOL_NEW_LINE +#define LV_SYMBOL_NEW_LINE "\xEF\xA2\xA2" /*63650, 0xF8A2*/ +#endif + +#if !defined LV_SYMBOL_DUMMY +/** Invalid symbol at (U+F8FF). If written before a string then `lv_img` will show it as a label*/ +#define LV_SYMBOL_DUMMY "\xEF\xA3\xBF" +#endif + +/* + * The following list is generated using + * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ _LV_STR_\1,/p' + */ +enum { + _LV_STR_SYMBOL_BULLET, + _LV_STR_SYMBOL_AUDIO, + _LV_STR_SYMBOL_VIDEO, + _LV_STR_SYMBOL_LIST, + _LV_STR_SYMBOL_OK, + _LV_STR_SYMBOL_CLOSE, + _LV_STR_SYMBOL_POWER, + _LV_STR_SYMBOL_SETTINGS, + _LV_STR_SYMBOL_HOME, + _LV_STR_SYMBOL_DOWNLOAD, + _LV_STR_SYMBOL_DRIVE, + _LV_STR_SYMBOL_REFRESH, + _LV_STR_SYMBOL_MUTE, + _LV_STR_SYMBOL_VOLUME_MID, + _LV_STR_SYMBOL_VOLUME_MAX, + _LV_STR_SYMBOL_IMAGE, + _LV_STR_SYMBOL_TINT, + _LV_STR_SYMBOL_PREV, + _LV_STR_SYMBOL_PLAY, + _LV_STR_SYMBOL_PAUSE, + _LV_STR_SYMBOL_STOP, + _LV_STR_SYMBOL_NEXT, + _LV_STR_SYMBOL_EJECT, + _LV_STR_SYMBOL_LEFT, + _LV_STR_SYMBOL_RIGHT, + _LV_STR_SYMBOL_PLUS, + _LV_STR_SYMBOL_MINUS, + _LV_STR_SYMBOL_EYE_OPEN, + _LV_STR_SYMBOL_EYE_CLOSE, + _LV_STR_SYMBOL_WARNING, + _LV_STR_SYMBOL_SHUFFLE, + _LV_STR_SYMBOL_UP, + _LV_STR_SYMBOL_DOWN, + _LV_STR_SYMBOL_LOOP, + _LV_STR_SYMBOL_DIRECTORY, + _LV_STR_SYMBOL_UPLOAD, + _LV_STR_SYMBOL_CALL, + _LV_STR_SYMBOL_CUT, + _LV_STR_SYMBOL_COPY, + _LV_STR_SYMBOL_SAVE, + _LV_STR_SYMBOL_BARS, + _LV_STR_SYMBOL_ENVELOPE, + _LV_STR_SYMBOL_CHARGE, + _LV_STR_SYMBOL_PASTE, + _LV_STR_SYMBOL_BELL, + _LV_STR_SYMBOL_KEYBOARD, + _LV_STR_SYMBOL_GPS, + _LV_STR_SYMBOL_FILE, + _LV_STR_SYMBOL_WIFI, + _LV_STR_SYMBOL_BATTERY_FULL, + _LV_STR_SYMBOL_BATTERY_3, + _LV_STR_SYMBOL_BATTERY_2, + _LV_STR_SYMBOL_BATTERY_1, + _LV_STR_SYMBOL_BATTERY_EMPTY, + _LV_STR_SYMBOL_USB, + _LV_STR_SYMBOL_BLUETOOTH, + _LV_STR_SYMBOL_TRASH, + _LV_STR_SYMBOL_EDIT, + _LV_STR_SYMBOL_BACKSPACE, + _LV_STR_SYMBOL_SD_CARD, + _LV_STR_SYMBOL_NEW_LINE, + _LV_STR_SYMBOL_DUMMY, +}; + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYMBOL_DEF_H*/ diff --git a/libraries/lvgl/src/indev/lv_indev.c b/libraries/lvgl/src/indev/lv_indev.c new file mode 100644 index 0000000..5582f4f --- /dev/null +++ b/libraries/lvgl/src/indev/lv_indev.c @@ -0,0 +1,1647 @@ +/** + * @file lv_indev.c + * + */ + +/********************* + * INCLUDES + ********************/ +#include "lv_indev_private.h" +#include "lv_indev_scroll.h" +#include "../display/lv_display_private.h" +#include "../core/lv_global.h" +#include "../core/lv_obj.h" +#include "../core/lv_group.h" +#include "../core/lv_refr.h" + +#include "../tick/lv_tick.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_math.h" +#include "../misc/lv_profiler.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +/*Drag threshold in pixels*/ +#define LV_INDEV_DEF_SCROLL_LIMIT 10 + +/*Drag throw slow-down in [%]. Greater value -> faster slow-down*/ +#define LV_INDEV_DEF_SCROLL_THROW 10 + +/*Long press time in milliseconds. + *Time to send `LV_EVENT_LONG_PRESSSED`)*/ +#define LV_INDEV_DEF_LONG_PRESS_TIME 400 + +/*Repeated trigger period in long press [ms] + *Time between `LV_EVENT_LONG_PRESSED_REPEAT*/ +#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 + +/*Gesture threshold in pixels*/ +#define LV_INDEV_DEF_GESTURE_LIMIT 50 + +/*Gesture min velocity at release before swipe (pixels)*/ +#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3 + +/**< Rotary diff count will be multiplied by this and divided by 256 */ +#define LV_INDEV_DEF_ROTARY_SENSITIVITY 256 + +#if LV_INDEV_DEF_SCROLL_THROW <= 0 + #warning "LV_INDEV_DEF_SCROLL_THROW must be greater than 0" +#endif + +#define indev_act LV_GLOBAL_DEFAULT()->indev_active +#define indev_obj_act LV_GLOBAL_DEFAULT()->indev_obj_active +#define indev_ll_head &(LV_GLOBAL_DEFAULT()->indev_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_proc_press(lv_indev_t * indev); +static void indev_proc_release(lv_indev_t * indev); +static void indev_proc_pointer_diff(lv_indev_t * indev); +static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p); +static void indev_proc_reset_query_handler(lv_indev_t * indev); +static void indev_click_focus(lv_indev_t * indev); +static void indev_gesture(lv_indev_t * indev); +static bool indev_reset_check(lv_indev_t * indev); +static void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data); +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj); +static lv_result_t send_event(lv_event_code_t code, void * param); + +static void indev_scroll_throw_anim_start(lv_indev_t * indev); +static void indev_scroll_throw_anim_cb(void * var, int32_t v); +static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim); +static inline void indev_scroll_throw_anim_reset(lv_indev_t * indev) +{ + if(indev) { + indev->pointer.scroll_throw_vect.x = 0; + indev->pointer.scroll_throw_vect.y = 0; + indev->scroll_throw_anim = NULL; + } +} + +/********************** + * STATIC VARIABLES + **********************/ +static char IndevReadFromTimerCallback = 0; //A fix by SquareLine Team: sometimes timer callback calls indev_gesture beside SDL-event based with the same coordinate (0 difference), resetting accumulated distance +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_INDEV + #define LV_TRACE_INDEV(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_INDEV(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_indev_create(void) +{ + lv_display_t * disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("no display was created so far"); + } + + lv_indev_t * indev = _lv_ll_ins_head(indev_ll_head); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + return NULL; + } + + lv_memzero(indev, sizeof(lv_indev_t)); + indev->reset_query = 1; + indev->enabled = 1; + + indev->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_DEF_REFR_PERIOD, indev); + + indev->disp = lv_display_get_default(); + indev->type = LV_INDEV_TYPE_NONE; + indev->mode = LV_INDEV_MODE_TIMER; + indev->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; + indev->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; + indev->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; + indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; + indev->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT; + indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; + indev->rotary_sensitvity = LV_INDEV_DEF_ROTARY_SENSITIVITY; + return indev; +} + +void lv_indev_delete(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + + lv_indev_send_event(indev, LV_EVENT_DELETE, NULL); + lv_event_remove_all(&(indev->event_list)); + + /*Clean up the read timer first*/ + if(indev->read_timer) lv_timer_delete(indev->read_timer); + + /*Remove the input device from the list*/ + _lv_ll_remove(indev_ll_head, indev); + /*Free the memory of the input device*/ + lv_free(indev); +} + +lv_indev_t * lv_indev_get_next(lv_indev_t * indev) +{ + if(indev == NULL) + return _lv_ll_get_head(indev_ll_head); + else + return _lv_ll_get_next(indev_ll_head, indev); +} + +void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_PROFILER_BEGIN; + lv_memzero(data, sizeof(lv_indev_data_t)); + + /* For touchpad sometimes users don't set the last pressed coordinate on release. + * So be sure a coordinates are initialized to the last point */ + if(indev->type == LV_INDEV_TYPE_POINTER) { + data->point.x = indev->pointer.last_raw_point.x; + data->point.y = indev->pointer.last_raw_point.y; + } + /*Similarly set at least the last key in case of the user doesn't set it on release*/ + else if(indev->type == LV_INDEV_TYPE_KEYPAD) { + data->key = indev->keypad.last_key; + } + /*For compatibility assume that used button was enter (encoder push)*/ + else if(indev->type == LV_INDEV_TYPE_ENCODER) { + data->key = LV_KEY_ENTER; + } + + if(indev->read_cb) { + LV_TRACE_INDEV("calling indev_read_cb"); + indev->read_cb(indev, data); + } + else { + LV_LOG_WARN("indev_read_cb is not registered"); + } + LV_PROFILER_END; +} + +void lv_indev_read_timer_cb(lv_timer_t * timer) +{ IndevReadFromTimerCallback = 1; + lv_indev_read(timer->user_data); +} + +void lv_indev_read(lv_indev_t * indev) +{ + if(indev == NULL) return; + + LV_TRACE_INDEV("begin"); + + indev_act = indev; + + /*Read and process all indevs*/ + if(indev->disp == NULL) return; /*Not assigned to any displays*/ + + /*Handle reset query before processing the point*/ + indev_proc_reset_query_handler(indev); + + if((indev->enabled == 0) || + (indev->disp->prev_scr != NULL)) return; /*Input disabled or screen animation active*/ + + LV_PROFILER_BEGIN; + + bool continue_reading; + lv_indev_data_t data; + + do { + /*Read the data*/ + indev_read_core(indev, &data); + continue_reading = indev->mode != LV_INDEV_MODE_EVENT && data.continue_reading; + + /*The active object might be deleted even in the read function*/ + indev_proc_reset_query_handler(indev); + indev_obj_act = NULL; + + indev->state = data.state; + + /*Save the last activity time*/ + if(indev->state == LV_INDEV_STATE_PRESSED) { + indev->disp->last_activity_time = lv_tick_get(); + } + else if(indev->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { + indev->disp->last_activity_time = lv_tick_get(); + } + + if(indev->type == LV_INDEV_TYPE_POINTER) { + indev_pointer_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_KEYPAD) { + indev_keypad_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_ENCODER) { + indev_encoder_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_BUTTON) { + indev_button_proc(indev, &data); + } + /*Handle reset query if it happened in during processing*/ + indev_proc_reset_query_handler(indev); + } while(continue_reading); + + /*End of indev processing, so no act indev*/ + indev_act = NULL; + indev_obj_act = NULL; + + LV_TRACE_INDEV("finished"); + LV_PROFILER_END; +} + +void lv_indev_enable(lv_indev_t * indev, bool enable) +{ + if(indev) { + indev->enabled = (uint8_t) enable; + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + i->enabled = (uint8_t) enable; + i = lv_indev_get_next(i); + } + } +} + +lv_indev_t * lv_indev_active(void) +{ + return indev_act; +} + +void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type) +{ + if(indev == NULL) return; + + indev->type = indev_type; + indev->reset_query = 1; +} + +void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb) +{ + if(indev == NULL) return; + + indev->read_cb = read_cb; +} + +void lv_indev_set_user_data(lv_indev_t * indev, void * user_data) +{ + if(indev == NULL) return; + indev->user_data = user_data; +} + +void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data) +{ + if(indev == NULL) return; + indev->driver_data = driver_data; +} + +lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev) +{ + if(indev == NULL) { + LV_LOG_WARN("lv_indev_get_read_cb: indev was NULL"); + return NULL; + } + + return indev->read_cb; +} + +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev) +{ + if(indev == NULL) return LV_INDEV_TYPE_NONE; + + return indev->type; +} + +lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev) +{ + if(indev == NULL) return LV_INDEV_STATE_RELEASED; + + return indev->state; +} + +lv_group_t * lv_indev_get_group(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->group; +} + +lv_display_t * lv_indev_get_display(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->disp; +} + +void lv_indev_set_display(lv_indev_t * indev, lv_display_t * disp) +{ + if(indev == NULL) return; + + indev->disp = disp; +} + +void * lv_indev_get_user_data(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + return indev->user_data; +} + +void * lv_indev_get_driver_data(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->driver_data; +} + +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj) +{ + if(indev) { + indev_reset_core(indev, obj); + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + indev_reset_core(i, obj); + i = lv_indev_get_next(i); + } + indev_obj_act = NULL; + } +} + +void lv_indev_reset_long_press(lv_indev_t * indev) +{ + indev->long_pr_sent = 0; + indev->longpr_rep_timestamp = lv_tick_get(); + indev->pr_timestamp = lv_tick_get(); +} + +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) +{ + if(indev->type != LV_INDEV_TYPE_POINTER) return; + + indev->cursor = cur_obj; + lv_obj_set_parent(indev->cursor, lv_display_get_layer_sys(indev->disp)); + lv_obj_set_pos(indev->cursor, indev->pointer.act_point.x, indev->pointer.act_point.y); + lv_obj_remove_flag(indev->cursor, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(indev->cursor, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING); +} + +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) +{ + if(indev && (indev->type == LV_INDEV_TYPE_KEYPAD || indev->type == LV_INDEV_TYPE_ENCODER)) { + indev->group = group; + } +} + +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]) +{ + if(indev && indev->type == LV_INDEV_TYPE_BUTTON) { + indev->btn_points = points; + } +} + +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) +{ + if(indev == NULL) { + point->x = 0; + point->y = 0; + } + else if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) { + point->x = -1; + point->y = -1; + } + else { + point->x = indev->pointer.act_point.x; + point->y = indev->pointer.act_point.y; + } +} + +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev) +{ + return indev->pointer.gesture_dir; +} + +uint32_t lv_indev_get_key(const lv_indev_t * indev) +{ + uint32_t key = 0; + + if(indev && indev->type == LV_INDEV_TYPE_KEYPAD) + key = indev->keypad.last_key; + + return key; +} + +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev) +{ + if(indev == NULL) return false; + if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return false; + return indev->pointer.scroll_dir; +} + +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return NULL; + return indev->pointer.scroll_obj; +} + +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) +{ + point->x = 0; + point->y = 0; + + if(indev == NULL) return; + + if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_BUTTON) { + point->x = indev->pointer.vect.x; + point->y = indev->pointer.vect.y; + } +} + +void lv_indev_wait_release(lv_indev_t * indev) +{ + if(indev == NULL)return; + indev->wait_until_release = 1; +} + +lv_obj_t * lv_indev_get_active_obj(void) +{ + return indev_obj_act; +} + +lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev) +{ + if(indev == NULL) { + LV_LOG_WARN("lv_indev_get_read_timer: indev was NULL"); + return NULL; + } + + return indev->read_timer; +} + +lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev) +{ + if(indev) return indev->mode; + return LV_INDEV_MODE_NONE; +} + +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode) +{ + if(indev == NULL || indev->mode == mode) + return; + + indev->mode = mode; + if(indev->read_timer) { + if(mode == LV_INDEV_MODE_EVENT) { + lv_timer_pause(indev->read_timer); + } + else if(mode == LV_INDEV_MODE_TIMER) { + /* use default timer mode*/ + lv_timer_set_cb(indev->read_timer, lv_indev_read_timer_cb); + lv_timer_resume(indev->read_timer); + } + } +} + +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) +{ + lv_obj_t * found_p = NULL; + + /*If this obj is hidden the children are hidden too so return immediately*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + + lv_point_t p_trans = *point; + lv_obj_transform_point(obj, &p_trans, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); + + bool hit_test_ok = lv_obj_hit_test(obj, &p_trans); + + /*If the point is on this object check its children too*/ + lv_area_t obj_coords = obj->coords; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj); + lv_area_increase(&obj_coords, ext_draw_size, ext_draw_size); + } + if(_lv_area_is_point_on(&obj_coords, &p_trans, 0)) { + int32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + + /*If a child matches use it*/ + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_indev_search_obj(child, &p_trans); + if(found_p) return found_p; + } + } + + /*If not return earlier for a clicked child and this obj's hittest was ok use it + *else return NULL*/ + if(hit_test_ok) return obj; + else return NULL; +} + +void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_NULL(indev); + + lv_event_add(&indev->event_list, event_cb, filter, user_data); +} + +uint32_t lv_indev_get_event_count(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + return lv_event_get_count(&indev->event_list); +} + +lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index) +{ + LV_ASSERT_NULL(indev); + return lv_event_get_dsc(&indev->event_list, index); + +} + +bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index) +{ + LV_ASSERT_NULL(indev); + + return lv_event_remove(&indev->event_list, index); +} + +uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(indev); + + uint32_t event_cnt = lv_indev_get_event_count(indev); + uint32_t removed_count = 0; + int32_t i; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_indev_get_event_dsc(indev, i); + if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { + lv_indev_remove_event(indev, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param) +{ + + lv_event_t e; + lv_memzero(&e, sizeof(e)); + e.code = code; + e.current_target = indev; + e.original_target = indev; + e.param = param; + lv_result_t res; + res = lv_event_send(&indev->event_list, &e, true); + if(res != LV_RESULT_OK) return res; + + res = lv_event_send(&indev->event_list, &e, false); + if(res != LV_RESULT_OK) return res; + + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Process a new point from LV_INDEV_TYPE_POINTER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + lv_display_t * disp = i->disp; + /*Save the raw points so they can be used again in indev_read_core*/ + i->pointer.last_raw_point.x = data->point.x; + i->pointer.last_raw_point.y = data->point.y; + + if(disp->rotation == LV_DISPLAY_ROTATION_180 || disp->rotation == LV_DISPLAY_ROTATION_270) { + data->point.x = disp->hor_res - data->point.x - 1; + data->point.y = disp->ver_res - data->point.y - 1; + } + if(disp->rotation == LV_DISPLAY_ROTATION_90 || disp->rotation == LV_DISPLAY_ROTATION_270) { + int32_t tmp = data->point.y; + data->point.y = data->point.x; + data->point.x = disp->ver_res - tmp - 1; + } + + /*Simple sanity check*/ + if(data->point.x < 0) { + LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x); + } + if(data->point.x >= lv_display_get_horizontal_resolution(i->disp)) { + LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x); + } + if(data->point.y < 0) { + LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y); + } + if(data->point.y >= lv_display_get_vertical_resolution(i->disp)) { + LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y); + } + + /*Move the cursor if set and moved*/ + if(i->cursor != NULL && + (i->pointer.last_point.x != data->point.x || i->pointer.last_point.y != data->point.y)) { + lv_obj_set_pos(i->cursor, data->point.x, data->point.y); + } + + i->pointer.act_point.x = data->point.x; + i->pointer.act_point.y = data->point.y; + i->pointer.diff = data->enc_diff; + + /*Process the diff first as scrolling will be processed in indev_proc_release*/ + indev_proc_pointer_diff(i); + + if(i->state == LV_INDEV_STATE_PRESSED) { + indev_proc_press(i); + } + else { + indev_proc_release(i); + } + + i->pointer.last_point.x = i->pointer.act_point.x; + i->pointer.last_point.y = i->pointer.act_point.y; + +} + +/** + * Process a new point from LV_INDEV_TYPE_KEYPAD input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; + + if(i->wait_until_release) { + i->wait_until_release = 0; + i->pr_timestamp = 0; + i->long_pr_sent = 0; + i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + /*Save the last key. *It must be done here else `lv_indev_get_key` will return the last key in events*/ + uint32_t prev_key = i->keypad.last_key; + i->keypad.last_key = data->key; + + lv_group_t * g = i->group; + if(g == NULL) return; + + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + /*Save the previous state so we can detect state changes below and also set the last state now + *so if any event handler on the way returns `LV_RESULT_INVALID` the last state is remembered + *for the next time*/ + uint32_t prev_state = i->keypad.last_state; + i->keypad.last_state = data->state; + + /*Key press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("%" LV_PRIu32 " key is pressed", data->key); + i->pr_timestamp = lv_tick_get(); + + /*Move the focus on NEXT*/ + if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + /*Move the focus on PREV*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + else if(is_enabled) { + /*Simulate a press on the object if ENTER was pressed*/ + if(data->key == LV_KEY_ENTER) { + /*Send the ENTER as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ENTER); + if(indev_reset_check(i)) return; + + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ESC); + if(indev_reset_check(i)) return; + + if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + } + } + /*Pressing*/ + else if(is_enabled && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) { + + if(data->key == LV_KEY_ENTER) { + if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; + } + + /*Long press time has elapsed?*/ + if(i->long_pr_sent == 0 && lv_tick_elaps(i->pr_timestamp) > i->long_press_time) { + i->long_pr_sent = 1; + if(data->key == LV_KEY_ENTER) { + i->longpr_rep_timestamp = lv_tick_get(); + + if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + /*Long press repeated time has elapsed?*/ + else if(i->long_pr_sent != 0 && + lv_tick_elaps(i->longpr_rep_timestamp) > i->long_press_repeat_time) { + + i->longpr_rep_timestamp = lv_tick_get(); + + /*Send LONG_PRESS_REP on ENTER*/ + if(data->key == LV_KEY_ENTER) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + /*Move the focus on NEXT again*/ + else if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + /*Move the focus on PREV again*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + /*Just send other keys again to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + } + } + /*Release happened*/ + else if(is_enabled && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key); + /*The user might clear the key when it was released. Always release the pressed key*/ + data->key = prev_key; + if(data->key == LV_KEY_ENTER) { + + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + + if(i->long_pr_sent == 0) { + if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + + } + i->pr_timestamp = 0; + i->long_pr_sent = 0; + } + indev_obj_act = NULL; +} + +/** + * Process a new point from LV_INDEV_TYPE_ENCODER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; + + if(i->wait_until_release) { + i->wait_until_release = 0; + i->pr_timestamp = 0; + i->long_pr_sent = 0; + i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + /*Save the last keys before anything else. + *They need to be already saved if the function returns for any reason*/ + lv_indev_state_t last_state = i->keypad.last_state; + i->keypad.last_state = data->state; + i->keypad.last_key = data->key; + + lv_group_t * g = i->group; + if(g == NULL) return; + + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + /*Process the steps they are valid only with released button*/ + if(data->state != LV_INDEV_STATE_RELEASED) { + data->enc_diff = 0; + } + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + /*Button press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("pressed"); + + i->pr_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + if(lv_group_get_editing(g) == true || editable_or_scrollable == false) { + + if(is_enabled) { + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ESC); + if(indev_reset_check(i)) return; + + if(is_enabled) { + if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; + } + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + } + /*Pressing*/ + else if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_PRESSED) { + /*Long press*/ + if(i->long_pr_sent == 0 && lv_tick_elaps(i->pr_timestamp) > i->long_press_time) { + + i->long_pr_sent = 1; + i->longpr_rep_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*On enter long press toggle edit mode.*/ + if(editable_or_scrollable) { + /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ + if(lv_group_get_obj_count(g) > 1) { + LV_LOG_INFO("toggling edit mode"); + lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ + lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If not editable then just send a long press event*/ + else { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + } + + i->long_pr_sent = 1; + } + /*Long press repeated time has elapsed?*/ + else if(i->long_pr_sent != 0 && lv_tick_elaps(i->longpr_rep_timestamp) > i->long_press_repeat_time) { + + i->longpr_rep_timestamp = lv_tick_get(); + + if(data->key == LV_KEY_ENTER) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + + } + + } + /*Release happened*/ + else if(data->state == LV_INDEV_STATE_RELEASED && last_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("released"); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*The button was released on a non-editable object. Just send enter*/ + if(editable_or_scrollable == false) { + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + } + + if(i->long_pr_sent == 0 && is_enabled) { + if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + if(is_enabled) { + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + } + /*An object is being edited and the button is released.*/ + else if(lv_group_get_editing(g)) { + /*Ignore long pressed enter release because it comes from mode switch*/ + if(!i->long_pr_sent || lv_group_get_obj_count(g) <= 1) { + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + lv_group_send_data(g, LV_KEY_ENTER); + if(indev_reset_check(i)) return; + } + else { + lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If the focused object is editable and now in navigate mode then on enter switch edit + mode*/ + else if(!i->long_pr_sent) { + LV_LOG_INFO("entering edit mode"); + lv_group_set_editing(g, true); /*Set edit mode*/ + } + } + + i->pr_timestamp = 0; + i->long_pr_sent = 0; + } + indev_obj_act = NULL; + + /*if encoder steps or simulated steps via left/right keys*/ + if(data->enc_diff != 0) { + /*In edit mode send LEFT/RIGHT keys*/ + if(lv_group_get_editing(g)) { + LV_LOG_INFO("rotated by %+d (edit)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_LEFT); + if(indev_reset_check(i)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_RIGHT); + if(indev_reset_check(i)) return; + } + } + } + /*In navigate mode focus on the next/prev objects*/ + else { + LV_LOG_INFO("rotated by %+d (nav)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + } + } + } +} + +/** + * Process new points from an input device. indev->state.pressed has to be set + * @param indev pointer to an input device state + * @param x x coordinate of the next point + * @param y y coordinate of the next point + */ +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + /*Die gracefully if i->btn_points is NULL*/ + if(i->btn_points == NULL) { + LV_LOG_WARN("btn_points is NULL"); + return; + } + + int32_t x = i->btn_points[data->btn_id].x; + int32_t y = i->btn_points[data->btn_id].y; + + if(LV_INDEV_STATE_RELEASED != data->state) { + if(data->state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("button %" LV_PRIu32 " is pressed (x:%d y:%d)", data->btn_id, (int)x, (int)y); + } + else { + LV_LOG_INFO("button %" LV_PRIu32 " is released (x:%d y:%d)", data->btn_id, (int)x, (int)y); + } + } + + /*If a new point comes always make a release*/ + if(data->state == LV_INDEV_STATE_PRESSED) { + if(i->pointer.last_point.x != x || + i->pointer.last_point.y != y) { + indev_proc_release(i); + } + } + + if(indev_reset_check(i)) return; + + /*Save the new points*/ + i->pointer.act_point.x = x; + i->pointer.act_point.y = y; + + if(data->state == LV_INDEV_STATE_PRESSED) indev_proc_press(i); + else indev_proc_release(i); + + if(indev_reset_check(i)) return; + + i->pointer.last_point.x = i->pointer.act_point.x; + i->pointer.last_point.y = i->pointer.act_point.y; +} + +/** + * Process the pressed state of LV_INDEV_TYPE_POINTER input devices + * @param indev pointer to an input device 'proc' + */ +static void indev_proc_press(lv_indev_t * indev) +{ + LV_LOG_INFO("pressed at x:%d y:%d", (int)indev->pointer.act_point.x, + (int)indev->pointer.act_point.y); + indev_obj_act = indev->pointer.act_obj; + + if(indev->wait_until_release != 0) return; + + lv_display_t * disp = indev_act->disp; + bool new_obj_searched = false; + + /*If there is no last object then search*/ + if(indev_obj_act == NULL) { + indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); + new_obj_searched = true; + } + /*If there is an active object it's not scrolled and not protected also search*/ + else if(indev->pointer.scroll_obj == NULL && + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_PRESS_LOCK) == false) { + indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); + new_obj_searched = true; + } + + /*The scroll object might have scroll throw. Stop it manually*/ + if(new_obj_searched && indev->pointer.scroll_obj) { + + /*Attempt to stop scroll throw animation firstly*/ + if(indev->scroll_throw_anim) { + lv_anim_delete(indev, indev_scroll_throw_anim_cb); + indev->scroll_throw_anim = NULL; + } + + _lv_indev_scroll_throw_handler(indev); + if(indev_reset_check(indev)) return; + } + + /*If a new object was found reset some variables and send a pressed event handler*/ + if(indev_obj_act != indev->pointer.act_obj) { + indev->pointer.last_point.x = indev->pointer.act_point.x; + indev->pointer.last_point.y = indev->pointer.act_point.y; + + /*If a new object found the previous was lost, so send a PRESS_LOST event*/ + if(indev->pointer.act_obj != NULL) { + /*Save the obj because in special cases `act_obj` can change in the event */ + lv_obj_t * last_obj = indev->pointer.act_obj; + + lv_obj_send_event(last_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(indev)) return; + + /*Do nothing until release and a new press*/ + #ifndef LV_SQUARELINE_MOD__SWIPE + lv_indev_reset(indev, NULL); + lv_indev_wait_release(indev); + return; + #else + #if (LV_SQUARELINE_MOD__SWIPE == 0) + lv_indev_reset(indev, NULL); + lv_indev_wait_release(indev); + return; + #endif + #endif + } + + indev->pointer.act_obj = indev_obj_act; /*Save the pressed object*/ + indev->pointer.last_obj = indev_obj_act; + + if(indev_obj_act != NULL) { + + /*Save the time when the obj pressed to count long press time.*/ + indev->pr_timestamp = lv_tick_get(); + indev->long_pr_sent = 0; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + indev->pointer.gesture_dir = LV_DIR_NONE; + indev->pointer.gesture_sent = 0; + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + indev->pointer.vect.x = 0; + indev->pointer.vect.y = 0; + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + if(is_enabled) { + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + + if(indev_act->wait_until_release) return; + + /*Handle focus*/ + indev_click_focus(indev_act); + if(indev_reset_check(indev)) return; + + } + } + + /*Calculate the vector and apply a low pass filter: new value = 0.5 * old_value + 0.5 * new_value*/ + indev->pointer.vect.x = indev->pointer.act_point.x - indev->pointer.last_point.x; + indev->pointer.vect.y = indev->pointer.act_point.y - indev->pointer.last_point.y; + + indev->pointer.scroll_throw_vect.x = (indev->pointer.scroll_throw_vect.x + indev->pointer.vect.x) / 2; + indev->pointer.scroll_throw_vect.y = (indev->pointer.scroll_throw_vect.y + indev->pointer.vect.y) / 2; + + indev->pointer.scroll_throw_vect_ori = indev->pointer.scroll_throw_vect; + + if(indev_obj_act) { + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + if(is_enabled) { + if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; + } + + if(indev_act->wait_until_release) return; + + _lv_indev_scroll_handler(indev); + if(indev_reset_check(indev)) return; + indev_gesture(indev); + if(indev_reset_check(indev)) return; + + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && lv_timer_get_paused(indev->read_timer)) { + lv_timer_resume(indev->read_timer); + } + + /*If there is no scrolling then check for long press time*/ + if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 0) { + /*Send a long press event if enough time elapsed*/ + if(lv_tick_elaps(indev->pr_timestamp) > indev_act->long_press_time) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + /*Mark it to do not send the event again*/ + indev->long_pr_sent = 1; + + /*Save the long press time stamp for the long press repeat handler*/ + indev->longpr_rep_timestamp = lv_tick_get(); + } + } + + if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 1) { + if(lv_tick_elaps(indev->longpr_rep_timestamp) > indev_act->long_press_repeat_time) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + indev->longpr_rep_timestamp = lv_tick_get(); + } + } + } +} + +/** + * Process the released state of LV_INDEV_TYPE_POINTER input devices + * @param proc pointer to an input device 'proc' + */ +static void indev_proc_release(lv_indev_t * indev) +{ + if(indev->wait_until_release) { + lv_obj_send_event(indev->pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(indev)) return; + + indev->pointer.act_obj = NULL; + indev->pointer.last_obj = NULL; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + indev->wait_until_release = 0; + } + indev_obj_act = indev->pointer.act_obj; + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && !lv_timer_get_paused(indev->read_timer)) { + lv_timer_pause(indev->read_timer); + } + + if(indev_obj_act) { + LV_LOG_INFO("released"); + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + } + + if(is_enabled) { + if(scroll_obj == NULL) { + if(indev->long_pr_sent == 0) { + if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + else { + if(send_event(LV_EVENT_SCROLL_THROW_BEGIN, indev_act) == LV_RESULT_INVALID) return; + } + } + indev->pointer.act_obj = NULL; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + + /*Get the transformed vector with this object*/ + if(scroll_obj) { + int16_t angle = 0; + int16_t scale_x = 256; + int16_t scale_y = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, 0); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_x * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + if(angle != 0 || scale_y != LV_SCALE_NONE || scale_x != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_transform(&indev->pointer.scroll_throw_vect, angle, scale_x, scale_y, &pivot, false); + lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, scale_x, scale_y, &pivot, false); + } + } + } + + if(scroll_obj) { + if(!indev->scroll_throw_anim) { + indev_scroll_throw_anim_start(indev); + } + + if(indev_reset_check(indev)) return; + } +} + +static void indev_proc_pointer_diff(lv_indev_t * indev) +{ + lv_obj_t * obj = indev->pointer.last_pressed; + if(obj == NULL) return; + if(indev->pointer.diff == 0) return; + + indev_obj_act = obj; + + bool editable = lv_obj_is_editable(obj); + + if(editable) { + uint32_t indev_sensitivity = indev->rotary_sensitvity; + uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(indev_obj_act, 0); + int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; + send_event(LV_EVENT_ROTARY, &diff); + } + else { + + int32_t vect = indev->pointer.diff > 0 ? indev->scroll_limit : -indev->scroll_limit; + indev->pointer.vect.y = vect; + indev->pointer.act_obj = obj; + lv_obj_t * scroll_obj = lv_indev_find_scroll_obj(indev); + if(scroll_obj == NULL) return; + uint32_t indev_sensitivity = indev->rotary_sensitvity; + uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(scroll_obj, 0); + int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; + + indev->pointer.scroll_throw_vect.y = diff; + indev->pointer.scroll_throw_vect_ori.y = diff; + _lv_indev_scroll_handler(indev); + } + +} + +static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p) +{ + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_sys(disp), p); + if(indev_obj_act) return indev_obj_act; + + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_top(disp), p); + if(indev_obj_act) return indev_obj_act; + + /* Search the object in the active screen */ + indev_obj_act = lv_indev_search_obj(lv_display_get_screen_active(disp), p); + if(indev_obj_act) return indev_obj_act; + + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_bottom(disp), p); + return indev_obj_act; +} + +/** + * Process a new point from LV_INDEV_TYPE_BUTTON input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + * Reset input device if a reset query has been sent to it + * @param indev pointer to an input device + */ +static void indev_proc_reset_query_handler(lv_indev_t * indev) +{ + if(indev->reset_query) { + indev->pointer.act_obj = NULL; + indev->pointer.last_obj = NULL; + indev->pointer.scroll_obj = NULL; + indev->long_pr_sent = 0; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + indev->pointer.scroll_throw_vect.x = 0; + indev->pointer.scroll_throw_vect.y = 0; + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + indev->reset_query = 0; + indev_obj_act = NULL; + } +} + +/** + * Handle focus/defocus on click for POINTER input devices + * @param proc pointer to the state of the indev + */ +static void indev_click_focus(lv_indev_t * indev) +{ + /*Handle click focus*/ + if(lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_CLICK_FOCUSABLE) == false) { + return; + } + + lv_group_t * g_act = lv_obj_get_group(indev_obj_act); + lv_group_t * g_prev = indev->pointer.last_pressed ? lv_obj_get_group(indev->pointer.last_pressed) : NULL; + + /*If both the last and act. obj. are in the same group (or have no group)*/ + if(g_act == g_prev) { + /*The objects are in a group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(indev)) return; + } + /*The object are not in group*/ + else { + if(indev->pointer.last_pressed != indev_obj_act) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + + lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + } + } + /*The object are not in the same group (in different groups or one has no group)*/ + else { + /*If the prev. obj. is not in a group then defocus it.*/ + if(g_prev == NULL && indev->pointer.last_pressed) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + /*Focus on a non-group object*/ + else { + if(indev->pointer.last_pressed) { + /*If the prev. object also wasn't in a group defocus it*/ + if(g_prev == NULL) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + /*If the prev. object also was in a group at least "LEAVE" it instead of defocus*/ + else { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_LEAVE, indev_act); + if(indev_reset_check(indev)) return; + } + } + } + + /*Focus to the act. in its group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(indev)) return; + } + else { + lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + } + indev->pointer.last_pressed = indev_obj_act; +} + +/** +* Handle the gesture of indev_proc_p->pointer.act_obj +* @param indev pointer to an input device state +*/ +void indev_gesture(lv_indev_t * indev) +{ + if(indev->pointer.scroll_obj) return; + if(indev->pointer.gesture_sent) return; + + lv_obj_t * gesture_obj = indev->pointer.act_obj; + + /*If gesture parent is active check recursively the gesture attribute*/ + while(gesture_obj && lv_obj_has_flag(gesture_obj, LV_OBJ_FLAG_GESTURE_BUBBLE)) { + gesture_obj = lv_obj_get_parent(gesture_obj); + } + + if(gesture_obj == NULL) return; + + if((LV_ABS(indev->pointer.vect.x) < indev_act->gesture_min_velocity) && + (LV_ABS(indev->pointer.vect.y) < indev_act->gesture_min_velocity) && !( indev->mode==LV_INDEV_MODE_EVENT && IndevReadFromTimerCallback && !indev->pointer.vect.x && !indev->pointer.vect.y ) ) { + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + } IndevReadFromTimerCallback = 0; + + /*Count the movement by gesture*/ + indev->pointer.gesture_sum.x += indev->pointer.vect.x; + indev->pointer.gesture_sum.y += indev->pointer.vect.y; + + if((LV_ABS(indev->pointer.gesture_sum.x) > indev_act->gesture_limit) || + (LV_ABS(indev->pointer.gesture_sum.y) > indev_act->gesture_limit)) { + + indev->pointer.gesture_sent = 1; + + if(LV_ABS(indev->pointer.gesture_sum.x) > LV_ABS(indev->pointer.gesture_sum.y)) { + if(indev->pointer.gesture_sum.x > 0) + indev->pointer.gesture_dir = LV_DIR_RIGHT; + else + indev->pointer.gesture_dir = LV_DIR_LEFT; + } + else { + if(indev->pointer.gesture_sum.y > 0) + indev->pointer.gesture_dir = LV_DIR_BOTTOM; + else + indev->pointer.gesture_dir = LV_DIR_TOP; + } + + lv_obj_send_event(gesture_obj, LV_EVENT_GESTURE, indev_act); + if(indev_reset_check(indev)) return; + + lv_indev_send_event(indev_act, LV_EVENT_LONG_PRESSED, gesture_obj); + if(indev_reset_check(indev_act)) return; + } +} + +/** + * Checks if the reset_query flag has been set. If so, perform necessary global indev cleanup actions + * @param proc pointer to an input device 'proc' + * @return true if indev query should be immediately truncated. + */ +static bool indev_reset_check(lv_indev_t * indev) +{ + if(indev->reset_query) { + indev_obj_act = NULL; + } + + return indev->reset_query; +} + +/** + * Reset the indev and send event to active obj and scroll obj + * @param indev pointer to an input device + * @param obj pointer to obj +*/ +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj) +{ + lv_obj_t * act_obj = NULL; + lv_obj_t * scroll_obj = NULL; + + indev->reset_query = 1; + if(indev_act == indev) indev_obj_act = NULL; + if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_KEYPAD) { + if(obj == NULL || indev->pointer.last_pressed == obj) { + indev->pointer.last_pressed = NULL; + } + if(obj == NULL || indev->pointer.act_obj == obj) { + if(indev->pointer.act_obj) { + /* Avoid recursive calls */ + act_obj = indev->pointer.act_obj; + indev->pointer.act_obj = NULL; + lv_obj_send_event(act_obj, LV_EVENT_INDEV_RESET, indev); + lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, act_obj); + act_obj = NULL; + } + } + if(obj == NULL || indev->pointer.last_obj == obj) { + indev->pointer.last_obj = NULL; + } + if(obj == NULL || indev->pointer.scroll_obj == obj) { + if(indev->pointer.scroll_obj) { + /* Avoid recursive calls */ + scroll_obj = indev->pointer.scroll_obj; + indev->pointer.scroll_obj = NULL; + lv_obj_send_event(scroll_obj, LV_EVENT_INDEV_RESET, indev); + lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, act_obj); + scroll_obj = NULL; + } + } + } +} + +static lv_result_t send_event(lv_event_code_t code, void * param) +{ + lv_obj_send_event(indev_obj_act, code, param); + if(indev_reset_check(indev_act)) return LV_RESULT_INVALID; + + if(code == LV_EVENT_PRESSED || + code == LV_EVENT_CLICKED || + code == LV_EVENT_RELEASED || + code == LV_EVENT_LONG_PRESSED || + code == LV_EVENT_LONG_PRESSED_REPEAT || + code == LV_EVENT_ROTARY) { + lv_indev_send_event(indev_act, code, indev_obj_act); + if(indev_reset_check(indev_act)) return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +static void indev_scroll_throw_anim_cb(void * var, int32_t v) +{ + LV_ASSERT_NULL(var); + LV_UNUSED(v); + lv_indev_t * indev = (lv_indev_t *)var; + + _lv_indev_scroll_throw_handler(indev); + + if(indev->pointer.scroll_dir == LV_DIR_NONE || indev->pointer.scroll_obj == NULL) { + if(indev->scroll_throw_anim) { + LV_LOG_INFO("stop animation"); + lv_anim_delete(indev, indev_scroll_throw_anim_cb); + } + } +} + +static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim) +{ + if(anim) { + indev_scroll_throw_anim_reset((lv_indev_t *)anim->var); + } +} + +static void indev_scroll_throw_anim_start(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, indev); + lv_anim_set_duration(&a, 1024); + lv_anim_set_values(&a, 0, 1024); + lv_anim_set_exec_cb(&a, indev_scroll_throw_anim_cb); + lv_anim_set_completed_cb(&a, indev_scroll_throw_anim_completed_cb); + lv_anim_set_deleted_cb(&a, indev_scroll_throw_anim_completed_cb); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + indev->scroll_throw_anim = lv_anim_start(&a); +} diff --git a/libraries/lvgl/src/indev/lv_indev.h b/libraries/lvgl/src/indev/lv_indev.h new file mode 100644 index 0000000..ea5794f --- /dev/null +++ b/libraries/lvgl/src/indev/lv_indev.h @@ -0,0 +1,378 @@ +/** + * @file lv_indev.h + * + */ + +#ifndef LV_INDEV_H +#define LV_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_group.h" +#include "../misc/lv_area.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Possible input device types*/ +typedef enum { + LV_INDEV_TYPE_NONE, /**< Uninitialized state*/ + LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/ + LV_INDEV_TYPE_KEYPAD, /**< Keypad or keyboard*/ + LV_INDEV_TYPE_BUTTON, /**< External (hardware button) which is assigned to a specific point of the screen*/ + LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/ +} lv_indev_type_t; + +/** States for input devices*/ +typedef enum { + LV_INDEV_STATE_RELEASED = 0, + LV_INDEV_STATE_PRESSED +} lv_indev_state_t; + +typedef enum { + LV_INDEV_MODE_NONE = 0, + LV_INDEV_MODE_TIMER, + LV_INDEV_MODE_EVENT, +} lv_indev_mode_t; + +/** Data structure passed to an input driver to fill*/ +typedef struct { + lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ + uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/ + uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/ + int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/ + + lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/ + bool continue_reading; /**< If set to true, the read callback is invoked again, unless the device is in event-driven mode*/ +} lv_indev_data_t; + +typedef void (*lv_indev_read_cb_t)(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an indev + * @return Pointer to the created indev or NULL when allocation failed + */ +lv_indev_t * lv_indev_create(void); + +/** + * Remove the provided input device. Make sure not to use the provided input device afterwards anymore. + * @param indev pointer to delete + */ +void lv_indev_delete(lv_indev_t * indev); + +/** + * Get the next input device. + * @param indev pointer to the current input device. NULL to initialize. + * @return the next input device or NULL if there are no more. Provide the first input device when + * the parameter is NULL + */ +lv_indev_t * lv_indev_get_next(lv_indev_t * indev); + +/** + * Read data from an input device. + * @param indev pointer to an input device + */ +void lv_indev_read(lv_indev_t * indev); + +/** + * Called periodically to read the input devices + * @param timer pointer to a timer to read + */ +void lv_indev_read_timer_cb(lv_timer_t * timer); + +/** + * Enable or disable one or all input devices (default enabled) + * @param indev pointer to an input device or NULL to enable/disable all of them + * @param enable true to enable, false to disable + */ +void lv_indev_enable(lv_indev_t * indev, bool enable); + +/** + * Get the currently processed input device. Can be used in action functions too. + * @return pointer to the currently processed input device or NULL if no input device processing + * right now + */ +lv_indev_t * lv_indev_active(void); + +/** + * Set the type of an input device + * @param indev pointer to an input device + * @param indev_type the type of the input device from `lv_indev_type_t` (`LV_INDEV_TYPE_...`) + */ +void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type); + +/** + * Set a callback function to read input device data to the indev + * @param indev pointer to an input device + * @param read_cb pointer to callback function to read input device data + */ +void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb); + +/** + * Set user data to the indev + * @param indev pointer to an input device + * @param user_data pointer to user data + */ +void lv_indev_set_user_data(lv_indev_t * indev, void * user_data); + +/** + * Set driver data to the indev + * @param indev pointer to an input device + * @param driver_data pointer to driver data + */ +void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data); + +/** + * Assign a display to the indev + * @param indev pointer to an input device + * @param disp pointer to an display + */ +void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp); + +/** + * Get the type of an input device + * @param indev pointer to an input device + * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) + */ +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev); + +/** + * Get the callback function to read input device data to the indev + * @param indev pointer to an input device + * @return Pointer to callback function to read input device data or NULL if indev is NULL + */ +lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev); + +/** + * Get the indev state + * @param indev pointer to an input device + * @return Indev state or LV_INDEV_STATE_RELEASED if indev is NULL + */ +lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev); + +/** + * Get the indev assigned group + * @param indev pointer to an input device + * @return Pointer to indev assigned group or NULL if indev is NULL + */ +lv_group_t * lv_indev_get_group(const lv_indev_t * indev); + +/** + * Get a pointer to the assigned display of the indev + * @param indev pointer to an input device + * @return pointer to the assigned display or NULL if indev is NULL + */ +lv_display_t * lv_indev_get_display(const lv_indev_t * indev); + +/** + * Get a pointer to the user data of the indev + * @param indev pointer to an input device + * @return pointer to the user data or NULL if indev is NULL + */ +void * lv_indev_get_user_data(const lv_indev_t * indev); + +/** + * Get a pointer to the driver data of the indev + * @param indev pointer to an input device + * @return pointer to the driver data or NULL if indev is NULL + */ +void * lv_indev_get_driver_data(const lv_indev_t * indev); + +/** + * Reset one or all input devices + * @param indev pointer to an input device to reset or NULL to reset all of them + * @param obj pointer to an object which triggers the reset. + */ +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj); + +/** + * Reset the long press state of an input device + * @param indev pointer to an input device + */ +void lv_indev_reset_long_press(lv_indev_t * indev); + +/** + * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) + * @param indev pointer to an input device + * @param cur_obj pointer to an object to be used as cursor + */ +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj); + +/** + * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @param group pointer to a group + */ +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group); + +/** + * Set the an array of points for LV_INDEV_TYPE_BUTTON. + * These points will be assigned to the buttons to press a specific point on the screen + * @param indev pointer to an input device + * @param points array of points + */ +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]); + +/** + * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the result + */ +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point); + +/** +* Get the current gesture direct +* @param indev pointer to an input device +* @return current gesture direct +*/ +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev); + +/** + * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @return the last pressed key (0 on error) + */ +uint32_t lv_indev_get_key(const lv_indev_t * indev); + +/** + * Check the current scroll direction of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return LV_DIR_NONE: no scrolling now + * LV_DIR_HOR/VER + */ +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev); + +/** + * Get the currently scrolled object (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return pointer to the currently scrolled object or NULL if no scrolling by this indev + */ +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev); + +/** + * Get the movement vector of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the types.pointer.vector + */ +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); + +/** + * Do nothing until the next release + * @param indev pointer to an input device + */ +void lv_indev_wait_release(lv_indev_t * indev); + +/** + * Gets a pointer to the currently active object in the currently processed input device. + * @return pointer to currently active object or NULL if no active object + */ +lv_obj_t * lv_indev_get_active_obj(void); + +/** + * Get a pointer to the indev read timer to + * modify its parameters with `lv_timer_...` functions. + * @param indev pointer to an input device + * @return pointer to the indev read refresher timer. (NULL on error) + */ +lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev); + +/** +* Set the input device's event model: event-driven mode or timer mode. +* @param indev pointer to an input device +* @param mode the mode of input device +*/ +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode); + +/** + * Get the input device's running mode. + * @param indev pointer to an input device + * @return the running mode for the specified input device. + */ +lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev); + +/** + * Search the most top, clickable object by a point + * @param obj pointer to a start object, typically the screen + * @param point pointer to a point for searching the most top child + * @return pointer to the found object or NULL if there was no suitable object + */ +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point); + +/** + * Add an event handler to the indev + * @param indev pointer to an indev + * @param event_cb an event callback + * @param filter event code to react or `LV_EVENT_ALL` + * @param user_data optional user_data + */ +void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the number of event attached to an indev + * @param indev pointer to an indev + * @return number of events + */ +uint32_t lv_indev_get_event_count(lv_indev_t * indev); + +/** + * Get an event descriptor for an event + * @param indev pointer to an indev + * @param index the index of the event + * @return the event descriptor + */ +lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index); + +/** + * Remove an event + * @param indev pointer to an indev + * @param index the index of the event to remove + * @return true: and event was removed; false: no event was removed + */ +bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index); + +/** + * Remove an event_cb with user_data + * @param indev pointer to a indev + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data); + +/** + * Send an event to an indev + * @param indev pointer to an indev + * @param code an event code. LV_EVENT_... + * @param param optional param + * @return LV_RESULT_OK: indev wasn't deleted in the event. + */ +lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_H*/ diff --git a/libraries/lvgl/src/indev/lv_indev_private.h b/libraries/lvgl/src/indev/lv_indev_private.h new file mode 100644 index 0000000..96ba473 --- /dev/null +++ b/libraries/lvgl/src/indev/lv_indev_private.h @@ -0,0 +1,131 @@ +/** + * @file lv_indev_private.h + * + */ + +#ifndef LV_INDEV_PRIVATE_H +#define LV_INDEV_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_indev.h" +#include "../misc/lv_anim.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_indev_t { + /**< Input device type*/ + lv_indev_type_t type; + + /**< Function pointer to read input device data.*/ + lv_indev_read_cb_t read_cb; + + lv_indev_state_t state; /**< Current state of the input device.*/ + lv_indev_mode_t mode; + + /*Flags*/ + uint8_t long_pr_sent : 1; + uint8_t reset_query : 1; + uint8_t enabled : 1; + uint8_t wait_until_release : 1; + + uint32_t pr_timestamp; /**< Pressed time stamp*/ + uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/ + + void * driver_data; + void * user_data; + + /**< Pointer to the assigned display*/ + lv_display_t * disp; + + /**< Timer to periodically read the input device*/ + lv_timer_t * read_timer; + + /**< Number of pixels to slide before actually drag the object*/ + uint8_t scroll_limit; + + /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/ + uint8_t scroll_throw; + + /**< At least this difference should be between two points to evaluate as gesture*/ + uint8_t gesture_min_velocity; + + /**< At least this difference should be to send a gesture*/ + uint8_t gesture_limit; + + /**< Long press time in milliseconds*/ + uint16_t long_press_time; + + /**< Repeated trigger period in long press [ms]*/ + uint16_t long_press_repeat_time; + + /**< Rotary diff count will be multiplied by this value and divided by 256*/ + int32_t rotary_sensitvity; + + struct { + /*Pointer and button data*/ + lv_point_t act_point; /**< Current point of input device.*/ + lv_point_t last_point; /**< Last point of input device.*/ + lv_point_t last_raw_point; /**< Last point read from read_cb. */ + lv_point_t vect; /**< Difference between `act_point` and `last_point`.*/ + lv_point_t scroll_sum; /*Count the dragged pixels to check LV_INDEV_DEF_SCROLL_LIMIT*/ + lv_point_t scroll_throw_vect; + lv_point_t scroll_throw_vect_ori; + lv_obj_t * act_obj; /*The object being pressed*/ + lv_obj_t * last_obj; /*The last object which was pressed*/ + lv_obj_t * scroll_obj; /*The object being scrolled*/ + lv_obj_t * last_pressed; /*The lastly pressed object*/ + lv_area_t scroll_area; + lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/ + int32_t diff; + + /*Flags*/ + lv_dir_t scroll_dir : 4; + lv_dir_t gesture_dir : 4; + uint8_t gesture_sent : 1; + } pointer; + struct { + /*Keypad data*/ + lv_indev_state_t last_state; + uint32_t last_key; + } keypad; + + lv_obj_t * cursor; /**< Cursor for LV_INPUT_TYPE_POINTER*/ + lv_group_t * group; /**< Keypad destination group*/ + const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed + here by the buttons*/ + lv_event_list_t event_list; + lv_anim_t * scroll_throw_anim; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Find a scrollable object based on the current scroll vector in the indev. + * In handles scroll propagation to the parent if needed, and scroll directions too. + * @param indev pointer to an indev + * @return the found scrollable object or NULL if not found. + */ +lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_PRIVATE_H*/ diff --git a/libraries/lvgl/src/indev/lv_indev_scroll.c b/libraries/lvgl/src/indev/lv_indev_scroll.c new file mode 100644 index 0000000..947bda5 --- /dev/null +++ b/libraries/lvgl/src/indev/lv_indev_scroll.c @@ -0,0 +1,659 @@ +/** + * @file lv_indev_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_indev.h" +#include "lv_indev_private.h" +#include "lv_indev_scroll.h" + +/********************* + * DEFINES + *********************/ +#define ELASTIC_SLOWNESS_FACTOR 4 /*Scrolling on elastic parts are slower by this factor*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void init_scroll_limits(lv_indev_t * indev); +static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); +static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); +static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y); +static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, + lv_dir_t dir); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_indev_scroll_handler(lv_indev_t * indev) +{ + if(indev->pointer.vect.x == 0 && indev->pointer.vect.y == 0) { + return; + } + + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + /*If there is no scroll object yet try to find one*/ + if(scroll_obj == NULL) { + scroll_obj = lv_indev_find_scroll_obj(indev); + if(scroll_obj == NULL) return; + + init_scroll_limits(indev); + + lv_obj_remove_state(indev->pointer.act_obj, LV_STATE_PRESSED); + lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(indev->reset_query) return; + } + + /*Set new position or scroll if the vector is not zero*/ + int16_t angle = 0; + int16_t scale_x = 256; + int16_t scale_y = 256; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, 0); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_t pivot = { 0, 0 }; + lv_point_transform(&indev->pointer.vect, angle, scale_x, scale_y, &pivot, false); + } + + int32_t diff_x = 0; + int32_t diff_y = 0; + if(indev->pointer.scroll_dir == LV_DIR_HOR) { + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + diff_x = elastic_diff(scroll_obj, indev->pointer.vect.x, sl, sr, LV_DIR_HOR); + } + else { + int32_t st = lv_obj_get_scroll_top(scroll_obj); + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + diff_y = elastic_diff(scroll_obj, indev->pointer.vect.y, st, sb, LV_DIR_VER); + } + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); + if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; + + /*Respect the scroll limit area*/ + scroll_limit_diff(indev, &diff_x, &diff_y); + + _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + if(indev->reset_query) return; + indev->pointer.scroll_sum.x += diff_x; + indev->pointer.scroll_sum.y += diff_y; +} + +void _lv_indev_scroll_throw_handler(lv_indev_t * indev) +{ + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + if(scroll_obj == NULL) return; + if(indev->pointer.scroll_dir == LV_DIR_NONE) return; + + int32_t scroll_throw = indev->scroll_throw; + + if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_MOMENTUM) == false) { + indev->pointer.scroll_throw_vect.y = 0; + indev->pointer.scroll_throw_vect.x = 0; + } + + lv_scroll_snap_t align_x = lv_obj_get_scroll_snap_x(scroll_obj); + lv_scroll_snap_t align_y = lv_obj_get_scroll_snap_y(scroll_obj); + + if(indev->pointer.scroll_dir == LV_DIR_VER) { + indev->pointer.scroll_throw_vect.x = 0; + /*If no snapping "throw"*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + indev->pointer.scroll_throw_vect.y = + indev->pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100; + + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + int32_t st = lv_obj_get_scroll_top(scroll_obj); + + indev->pointer.scroll_throw_vect.y = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.y, st, sb, + LV_DIR_VER); + + _lv_obj_scroll_by_raw(scroll_obj, 0, indev->pointer.scroll_throw_vect.y); + if(indev->reset_query) return; + } + /*With snapping find the nearest snap point and scroll there*/ + else { + int32_t diff_y = lv_indev_scroll_throw_predict(indev, LV_DIR_VER); + indev->pointer.scroll_throw_vect.y = 0; + scroll_limit_diff(indev, NULL, &diff_y); + int32_t y = find_snap_point_y(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_y); + lv_obj_scroll_by(scroll_obj, 0, diff_y + y, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + else if(indev->pointer.scroll_dir == LV_DIR_HOR) { + indev->pointer.scroll_throw_vect.y = 0; + /*If no snapping "throw"*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + indev->pointer.scroll_throw_vect.x = + indev->pointer.scroll_throw_vect.x * (100 - scroll_throw) / 100; + + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + + indev->pointer.scroll_throw_vect.x = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.x, sl, sr, + LV_DIR_HOR); + + _lv_obj_scroll_by_raw(scroll_obj, indev->pointer.scroll_throw_vect.x, 0); + if(indev->reset_query) return; + } + /*With snapping find the nearest snap point and scroll there*/ + else { + int32_t diff_x = lv_indev_scroll_throw_predict(indev, LV_DIR_HOR); + indev->pointer.scroll_throw_vect.x = 0; + scroll_limit_diff(indev, &diff_x, NULL); + int32_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x); + lv_obj_scroll_by(scroll_obj, x + diff_x, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + + /*Check if the scroll has finished*/ + if(indev->pointer.scroll_throw_vect.x == 0 && indev->pointer.scroll_throw_vect.y == 0) { + /*Revert if scrolled in*/ + /*If vertically scrollable and not controlled by snap*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + int32_t st = lv_obj_get_scroll_top(scroll_obj); + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + if(st > 0 || sb > 0) { + if(st < 0) { + lv_obj_scroll_by(scroll_obj, 0, st, LV_ANIM_ON); + if(indev->reset_query) return; + } + else if(sb < 0) { + lv_obj_scroll_by(scroll_obj, 0, -sb, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + } + + /*If horizontally scrollable and not controlled by snap*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + if(sl > 0 || sr > 0) { + if(sl < 0) { + lv_obj_scroll_by(scroll_obj, sl, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + else if(sr < 0) { + lv_obj_scroll_by(scroll_obj, -sr, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + } + + lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_END, indev); + if(indev->reset_query) return; + + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + } +} + +int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir) +{ + if(indev == NULL) return 0; + int32_t v; + switch(dir) { + case LV_DIR_VER: + v = indev->pointer.scroll_throw_vect_ori.y; + break; + case LV_DIR_HOR: + v = indev->pointer.scroll_throw_vect_ori.x; + break; + default: + return 0; + } + + int32_t scroll_throw = indev->scroll_throw; + int32_t sum = 0; + while(v) { + sum += v; + v = v * (100 - scroll_throw) / 100; + } + + return sum; +} + +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p) +{ + p->x = find_snap_point_x(obj, obj->coords.x1, obj->coords.x2, 0); + p->y = find_snap_point_y(obj, obj->coords.y1, obj->coords.y2, 0); +} + +lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev) +{ + lv_obj_t * obj_candidate = NULL; + lv_dir_t dir_candidate = LV_DIR_NONE; + int32_t scroll_limit = indev->scroll_limit; + + /*Go until find a scrollable object in the current direction + *More precisely: + * 1. Check the pressed object and all of its ancestors and try to find an object which is scrollable + * 2. Scrollable means it has some content out of its area + * 3. If an object can be scrolled into the current direction then use it ("real match"") + * 4. If can be scrolled on the current axis (hor/ver) save it as candidate (at least show an elastic scroll effect) + * 5. Use the last candidate. Always the "deepest" parent or the object from point 3*/ + lv_obj_t * obj_act = indev->pointer.act_obj; + + /*Decide if it's a horizontal or vertical scroll*/ + bool hor_en = false; + bool ver_en = false; + indev->pointer.scroll_sum.x += indev->pointer.vect.x; + indev->pointer.scroll_sum.y += indev->pointer.vect.y; + + while(obj_act) { + /*Get the transformed scroll_sum with this object*/ + int16_t angle = 0; + int32_t scale_x = 256; + int32_t scale_y = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = obj_act; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, 0); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + lv_point_t obj_scroll_sum = indev->pointer.scroll_sum; + if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_transform(&obj_scroll_sum, angle, scale_x, scale_y, &pivot, false); + } + + if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) { + hor_en = true; + } + else { + ver_en = true; + } + + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + obj_act = lv_obj_get_parent(obj_act); + continue; + } + + /*Consider both up-down or left/right scrollable according to the current direction*/ + bool up_en = ver_en; + bool down_en = ver_en; + bool left_en = hor_en; + bool right_en = hor_en; + + /*The object might have disabled some directions.*/ + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(obj_act); + if((scroll_dir & LV_DIR_LEFT) == 0) left_en = false; + if((scroll_dir & LV_DIR_RIGHT) == 0) right_en = false; + if((scroll_dir & LV_DIR_TOP) == 0) up_en = false; + if((scroll_dir & LV_DIR_BOTTOM) == 0) down_en = false; + + /*The object is scrollable to a direction if its content overflow in that direction.*/ + int32_t st = lv_obj_get_scroll_top(obj_act); + int32_t sb = lv_obj_get_scroll_bottom(obj_act); + int32_t sl = lv_obj_get_scroll_left(obj_act); + int32_t sr = lv_obj_get_scroll_right(obj_act); + + /*If this object is scrollable into the current scroll direction then save it as a candidate. + *It's important only to be scrollable on the current axis (hor/ver) because if the scroll + *is propagated to this object it can show at least elastic scroll effect. + *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ + if((st > 0 || sb > 0) && + ((up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_VER; + } + + if((sl > 0 || sr > 0) && + ((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_HOR; + } + + if(st <= 0) up_en = false; + if(sb <= 0) down_en = false; + if(sl <= 0) left_en = false; + if(sr <= 0) right_en = false; + + /*If the object really can be scrolled into the current direction then use it.*/ + if((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit) || + (up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit)) { + indev->pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; + break; + } + + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + /*Try the parent*/ + obj_act = lv_obj_get_parent(obj_act); + } + + /*Use the last candidate*/ + if(obj_candidate) { + indev->pointer.scroll_dir = dir_candidate; + indev->pointer.scroll_obj = obj_candidate; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + } + + return obj_candidate; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void init_scroll_limits(lv_indev_t * indev) +{ + lv_obj_t * obj = indev->pointer.scroll_obj; + /*If there no STOP allow scrolling anywhere*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ONE) == false) { + lv_area_set(&indev->pointer.scroll_area, LV_COORD_MIN, LV_COORD_MIN, LV_COORD_MAX, LV_COORD_MAX); + } + /*With STOP limit the scrolling to the perv and next snap point*/ + else { + switch(lv_obj_get_scroll_snap_y(obj)) { + case LV_SCROLL_SNAP_START: + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y1 + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y1 - 1, 0); + break; + case LV_SCROLL_SNAP_END: + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y2, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + int32_t y_mid = obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, y_mid + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, y_mid - 1, 0); + break; + } + default: + indev->pointer.scroll_area.y1 = LV_COORD_MIN; + indev->pointer.scroll_area.y2 = LV_COORD_MAX; + break; + } + + switch(lv_obj_get_scroll_snap_x(obj)) { + case LV_SCROLL_SNAP_START: + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x1, 0); + break; + case LV_SCROLL_SNAP_END: + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x2, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + int32_t x_mid = obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, x_mid + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, x_mid - 1, 0); + break; + } + default: + indev->pointer.scroll_area.x1 = LV_COORD_MIN; + indev->pointer.scroll_area.x2 = LV_COORD_MAX; + break; + } + } + + /*Allow scrolling on the edges. It will be reverted to the edge due to snapping anyway*/ + if(indev->pointer.scroll_area.x1 == 0) indev->pointer.scroll_area.x1 = LV_COORD_MIN; + if(indev->pointer.scroll_area.x2 == 0) indev->pointer.scroll_area.x2 = LV_COORD_MAX; + if(indev->pointer.scroll_area.y1 == 0) indev->pointer.scroll_area.y1 = LV_COORD_MIN; + if(indev->pointer.scroll_area.y2 == 0) indev->pointer.scroll_area.y2 = LV_COORD_MAX; +} + +/** + * Search for snap point in the `min` - `max` range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful the get a snap point in an imagined case + * what if children are already moved by this value + * @return the distance of the snap point. + */ +static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_x(obj); + if(align == LV_SCROLL_SNAP_NONE) return 0; + + int32_t dist = LV_COORD_MAX; + + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + int32_t x_child = 0; + int32_t x_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + x_child = child->coords.x1; + x_parent = obj->coords.x1 + pad_left; + break; + case LV_SCROLL_SNAP_END: + x_child = child->coords.x2; + x_parent = obj->coords.x2 - pad_right; + break; + case LV_SCROLL_SNAP_CENTER: + x_child = child->coords.x1 + lv_area_get_width(&child->coords) / 2; + x_parent = obj->coords.x1 + pad_left + (lv_area_get_width(&obj->coords) - pad_left - pad_right) / 2; + break; + default: + continue; + } + + x_child += ofs; + if(x_child >= min && x_child <= max) { + int32_t x = x_child - x_parent; + if(LV_ABS(x) < LV_ABS(dist)) dist = x; + } + } + } + + return dist == LV_COORD_MAX ? 0 : -dist; +} + +/** + * Search for snap point in the `min` - `max` range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful to get a snap point in an imagined case + * what if children are already moved by this value + * @return the distance of the snap point. + */ +static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_y(obj); + if(align == LV_SCROLL_SNAP_NONE) return 0; + + int32_t dist = LV_COORD_MAX; + + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + int32_t y_child = 0; + int32_t y_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + y_child = child->coords.y1; + y_parent = obj->coords.y1 + pad_top; + break; + case LV_SCROLL_SNAP_END: + y_child = child->coords.y2; + y_parent = obj->coords.y2 - pad_bottom; + break; + case LV_SCROLL_SNAP_CENTER: + y_child = child->coords.y1 + lv_area_get_height(&child->coords) / 2; + y_parent = obj->coords.y1 + pad_top + (lv_area_get_height(&obj->coords) - pad_top - pad_bottom) / 2; + break; + default: + continue; + } + + y_child += ofs; + if(y_child >= min && y_child <= max) { + int32_t y = y_child - y_parent; + if(LV_ABS(y) < LV_ABS(dist)) dist = y; + } + } + } + + return dist == LV_COORD_MAX ? 0 : -dist; +} + +static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y) +{ + if(diff_y) { + if(indev->pointer.scroll_sum.y + *diff_y < indev->pointer.scroll_area.y1) { + *diff_y = indev->pointer.scroll_area.y1 - indev->pointer.scroll_sum.y; + } + + if(indev->pointer.scroll_sum.y + *diff_y > indev->pointer.scroll_area.y2) { + *diff_y = indev->pointer.scroll_area.y2 - indev->pointer.scroll_sum.y; + } + } + + if(diff_x) { + if(indev->pointer.scroll_sum.x + *diff_x < indev->pointer.scroll_area.x1) { + *diff_x = indev->pointer.scroll_area.x1 - indev->pointer.scroll_sum.x; + } + + if(indev->pointer.scroll_sum.x + *diff_x > indev->pointer.scroll_area.x2) { + *diff_x = indev->pointer.scroll_area.x2 - indev->pointer.scroll_sum.x; + } + } +} + +static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, + lv_dir_t dir) +{ + if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_ELASTIC)) { + /*If there is snapping in the current direction don't use the elastic factor because + *it's natural that the first and last items are scrolled (snapped) in.*/ + lv_scroll_snap_t snap; + snap = dir == LV_DIR_HOR ? lv_obj_get_scroll_snap_x(scroll_obj) : lv_obj_get_scroll_snap_y(scroll_obj); + + lv_obj_t * act_obj = lv_indev_get_active_obj(); + int32_t snap_point = 0; + int32_t act_obj_point = 0; + + if(dir == LV_DIR_HOR) { + int32_t pad_left = lv_obj_get_style_pad_left(scroll_obj, LV_PART_MAIN); + int32_t pad_right = lv_obj_get_style_pad_right(scroll_obj, LV_PART_MAIN); + + switch(snap) { + case LV_SCROLL_SNAP_CENTER: + snap_point = pad_left + (lv_area_get_width(&scroll_obj->coords) - pad_left - pad_right) / 2 + scroll_obj->coords.x1; + act_obj_point = lv_area_get_width(&act_obj->coords) / 2 + act_obj->coords.x1; + break; + case LV_SCROLL_SNAP_START: + snap_point = scroll_obj->coords.x1 + pad_left; + act_obj_point = act_obj->coords.x1; + break; + case LV_SCROLL_SNAP_END: + snap_point = scroll_obj->coords.x2 - pad_right; + act_obj_point = act_obj->coords.x2; + break; + } + } + else { + int32_t pad_top = lv_obj_get_style_pad_top(scroll_obj, LV_PART_MAIN); + int32_t pad_bottom = lv_obj_get_style_pad_bottom(scroll_obj, LV_PART_MAIN); + + switch(snap) { + case LV_SCROLL_SNAP_CENTER: + snap_point = pad_top + (lv_area_get_height(&scroll_obj->coords) - pad_top - pad_bottom) / 2 + scroll_obj->coords.y1; + act_obj_point = lv_area_get_height(&act_obj->coords) / 2 + act_obj->coords.y1; + break; + case LV_SCROLL_SNAP_START: + snap_point = scroll_obj->coords.y1 + pad_top; + act_obj_point = act_obj->coords.y1; + break; + case LV_SCROLL_SNAP_END: + snap_point = scroll_obj->coords.y2 - pad_bottom; + act_obj_point = act_obj->coords.y2; + break; + } + } + + if(scroll_end < 0) { + if(snap != LV_SCROLL_SNAP_NONE && act_obj_point > snap_point) return diff; + + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + else if(scroll_start < 0) { + if(snap != LV_SCROLL_SNAP_NONE && act_obj_point < snap_point) return diff; + + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + } + else { + /*Scroll back to the boundary if required*/ + if(scroll_end + diff < 0) diff = - scroll_end; + if(scroll_start - diff < 0) diff = scroll_start; + } + + return diff; +} diff --git a/libraries/lvgl/src/indev/lv_indev_scroll.h b/libraries/lvgl/src/indev/lv_indev_scroll.h new file mode 100644 index 0000000..64d1d01 --- /dev/null +++ b/libraries/lvgl/src/indev/lv_indev_scroll.h @@ -0,0 +1,65 @@ +/** + * @file lv_indev_scroll.h + * + */ + +#ifndef LV_INDEV_SCROLL_H +#define LV_INDEV_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Handle scrolling. Called by LVGL during input device processing + * @param indev pointer to an input device + */ +void _lv_indev_scroll_handler(lv_indev_t * indev); + +/** + * Handle throwing after scrolling. Called by LVGL during input device processing + * @param indev pointer to an input device + */ +void _lv_indev_scroll_throw_handler(lv_indev_t * indev); + +/** + * Predict where would a scroll throw end + * @param indev pointer to an input device + * @param dir ` LV_DIR_VER` or `LV_DIR_HOR` + * @return the difference compared to the current position when the throw would be finished + */ +int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir); + +/** + * Get the distance of the nearest snap point + * @param obj the object on which snap points should be found + * @param p save the distance of the found snap point there + */ +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_SCROLL_H*/ diff --git a/libraries/lvgl/src/layouts/flex/lv_flex.c b/libraries/lvgl/src/layouts/flex/lv_flex.c new file mode 100644 index 0000000..168f9de --- /dev/null +++ b/libraries/lvgl/src/layouts/flex/lv_flex.c @@ -0,0 +1,538 @@ +/** + * @file lv_flex.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_flex.h" +#include "../lv_layout.h" +#include "../../core/lv_obj.h" + +#if LV_USE_FLEX + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_flex_align_t main_place; + lv_flex_align_t cross_place; + lv_flex_align_t track_place; + uint8_t row : 1; + uint8_t wrap : 1; + uint8_t rev : 1; +} flex_t; + +typedef struct { + lv_obj_t * item; + int32_t min_size; + int32_t max_size; + int32_t final_size; + uint32_t grow_value; + uint32_t clamped : 1; +} grow_dsc_t; + +typedef struct { + int32_t track_cross_size; + int32_t track_main_size; /*For all items*/ + int32_t track_fix_main_size; /*For non grow items*/ + uint32_t item_cnt; + grow_dsc_t * grow_dsc; + uint32_t grow_item_cnt; + uint32_t grow_dsc_calc : 1; +} track_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flex_update(lv_obj_t * cont, void * user_data); +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, + int32_t item_gap, track_t * t); +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, + int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t); +static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, + int32_t * start_pos, int32_t * gap); +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id); +static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj); +static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT + #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_LAYOUT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_flex_init(void) +{ + layout_list_def[LV_LAYOUT_FLEX].cb = flex_update; + layout_list_def[LV_LAYOUT_FLEX].user_data = NULL; + +} + +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) +{ + lv_obj_set_style_flex_flow(obj, flow, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_place) +{ + lv_obj_set_style_flex_main_place(obj, main_place, 0); + lv_obj_set_style_flex_cross_place(obj, cross_place, 0); + lv_obj_set_style_flex_track_place(obj, track_place, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow) +{ + lv_obj_set_style_flex_grow(obj, grow, 0); + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flex_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + flex_t f; + lv_flex_flow_t flow = lv_obj_get_style_flex_flow(cont, LV_PART_MAIN); + f.row = flow & _LV_FLEX_COLUMN ? 0 : 1; + f.wrap = flow & _LV_FLEX_WRAP ? 1 : 0; + f.rev = flow & _LV_FLEX_REVERSE ? 1 : 0; + f.main_place = lv_obj_get_style_flex_main_place(cont, LV_PART_MAIN); + f.cross_place = lv_obj_get_style_flex_cross_place(cont, LV_PART_MAIN); + f.track_place = lv_obj_get_style_flex_track_place(cont, LV_PART_MAIN); + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + int32_t track_gap = !f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, + LV_PART_MAIN); + int32_t item_gap = f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, + LV_PART_MAIN); + int32_t max_main_size = (f.row ? lv_obj_get_content_width(cont) : lv_obj_get_content_height(cont)); + int32_t abs_y = cont->coords.y1 + lv_obj_get_style_space_top(cont, + LV_PART_MAIN) - lv_obj_get_scroll_y(cont); + int32_t abs_x = cont->coords.x1 + lv_obj_get_style_space_left(cont, + LV_PART_MAIN) - lv_obj_get_scroll_x(cont); + + lv_flex_align_t track_cross_place = f.track_place; + int32_t * cross_pos = (f.row ? &abs_y : &abs_x); + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + /*Content sized objects should squeeze the gap between the children, therefore any alignment will look like `START`*/ + if((f.row && h_set == LV_SIZE_CONTENT && cont->h_layout == 0) || + (!f.row && w_set == LV_SIZE_CONTENT && cont->w_layout == 0)) { + track_cross_place = LV_FLEX_ALIGN_START; + } + + if(rtl && !f.row) { + if(track_cross_place == LV_FLEX_ALIGN_START) track_cross_place = LV_FLEX_ALIGN_END; + else if(track_cross_place == LV_FLEX_ALIGN_END) track_cross_place = LV_FLEX_ALIGN_START; + } + + int32_t total_track_cross_size = 0; + int32_t gap = 0; + uint32_t track_cnt = 0; + int32_t track_first_item; + int32_t next_track_first_item; + + if(track_cross_place != LV_FLEX_ALIGN_START) { + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + track_t t; + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + /*Search the first item of the next row*/ + t.grow_dsc_calc = 0; + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + total_track_cross_size += t.track_cross_size + track_gap; + track_cnt++; + track_first_item = next_track_first_item; + } + + if(track_cnt) total_track_cross_size -= track_gap; /*No gap after the last track*/ + + /*Place the tracks to get the start position*/ + int32_t max_cross_size = (f.row ? lv_obj_get_content_height(cont) : lv_obj_get_content_width(cont)); + place_content(track_cross_place, max_cross_size, total_track_cross_size, track_cnt, cross_pos, &gap); + } + + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + + if(rtl && !f.row) { + *cross_pos += total_track_cross_size; + } + + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + track_t t; + t.grow_dsc_calc = 1; + /*Search the first item of the next row*/ + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + + if(rtl && !f.row) { + *cross_pos -= t.track_cross_size; + } + children_repos(cont, &f, track_first_item, next_track_first_item, abs_x, abs_y, max_main_size, item_gap, &t); + track_first_item = next_track_first_item; + lv_free(t.grow_dsc); + t.grow_dsc = NULL; + if(rtl && !f.row) { + *cross_pos -= gap + track_gap; + } + else { + *cross_pos += t.track_cross_size + gap + track_gap; + } + } + LV_ASSERT_MEM_INTEGRITY(); + + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Find the last item of a track + */ +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, + int32_t item_gap, track_t * t) +{ + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + /*Can't wrap if the size is auto (i.e. the size depends on the children)*/ + if(f->wrap && ((f->row && w_set == LV_SIZE_CONTENT) || (!f->row && h_set == LV_SIZE_CONTENT))) { + f->wrap = false; + } + int32_t(*get_main_size)(const lv_obj_t *) = (f->row ? lv_obj_get_width_with_margin : lv_obj_get_height_with_margin); + int32_t(*get_cross_size)(const lv_obj_t *) = (!f->row ? lv_obj_get_width_with_margin : + lv_obj_get_height_with_margin); + + t->track_main_size = 0; + t->track_fix_main_size = 0; + t->grow_item_cnt = 0; + t->track_cross_size = 0; + t->item_cnt = 0; + t->grow_dsc = NULL; + + int32_t item_id = item_start_id; + + lv_obj_t * item = lv_obj_get_child(cont, item_id); + while(item) { + if(item_id != item_start_id && lv_obj_has_flag(item, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)) break; + + if(!lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + uint8_t grow_value = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_value) { + t->grow_item_cnt++; + t->track_fix_main_size += item_gap; + if(t->grow_dsc_calc) { + grow_dsc_t * new_dsc = lv_realloc(t->grow_dsc, sizeof(grow_dsc_t) * (t->grow_item_cnt)); + LV_ASSERT_MALLOC(new_dsc); + if(new_dsc == NULL) return item_id; + + new_dsc[t->grow_item_cnt - 1].item = item; + new_dsc[t->grow_item_cnt - 1].min_size = f->row ? lv_obj_get_style_min_width(item, LV_PART_MAIN) + : lv_obj_get_style_min_height(item, LV_PART_MAIN); + new_dsc[t->grow_item_cnt - 1].max_size = f->row ? lv_obj_get_style_max_width(item, LV_PART_MAIN) + : lv_obj_get_style_max_height(item, LV_PART_MAIN); + new_dsc[t->grow_item_cnt - 1].grow_value = grow_value; + new_dsc[t->grow_item_cnt - 1].clamped = 0; + t->grow_dsc = new_dsc; + } + } + else { + int32_t item_size = get_main_size(item); + if(f->wrap && t->track_fix_main_size + item_size > max_main_size) break; + t->track_fix_main_size += item_size + item_gap; + } + + t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); + t->item_cnt++; + } + + item_id += f->rev ? -1 : +1; + if(item_id < 0) break; + item = lv_obj_get_child(cont, item_id); + } + + if(t->track_fix_main_size > 0) t->track_fix_main_size -= item_gap; /*There is no gap after the last item*/ + + /*If there is at least one "grow item" the track takes the full space*/ + t->track_main_size = t->grow_item_cnt ? max_main_size : t->track_fix_main_size; + + /*Have at least one item in a row*/ + if(item && item_id == item_start_id) { + item = cont->spec_attr->children[item_id]; + get_next_item(cont, f->rev, &item_id); + if(item) { + t->track_cross_size = get_cross_size(item); + t->track_main_size = get_main_size(item); + t->item_cnt = 1; + } + } + + return item_id; +} + +/** + * Position the children in the same track + */ +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, + int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t) +{ + void (*area_set_main_size)(lv_area_t *, int32_t) = (f->row ? lv_area_set_width : lv_area_set_height); + int32_t (*area_get_main_size)(const lv_area_t *) = (f->row ? lv_area_get_width : lv_area_get_height); + int32_t (*area_get_cross_size)(const lv_area_t *) = (!f->row ? lv_area_get_width : lv_area_get_height); + + typedef int32_t (*margin_func_t)(const lv_obj_t *, uint32_t); + margin_func_t get_margin_main_start = (f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); + margin_func_t get_margin_main_end = (f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); + margin_func_t get_margin_cross_start = (!f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); + margin_func_t get_margin_cross_end = (!f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); + + /*Calculate the size of grow items first*/ + uint32_t i; + bool grow_reiterate = true; + while(grow_reiterate && t->grow_item_cnt) { + grow_reiterate = false; + int32_t grow_value_sum = 0; + int32_t grow_max_size = t->track_main_size - t->track_fix_main_size; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + grow_value_sum += t->grow_dsc[i].grow_value; + } + else { + grow_max_size -= t->grow_dsc[i].final_size; + } + } + int32_t grow_unit; + + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + LV_ASSERT(grow_value_sum != 0); + grow_unit = grow_max_size / grow_value_sum; + int32_t size = grow_unit * t->grow_dsc[i].grow_value; + int32_t size_clamp = LV_CLAMP(t->grow_dsc[i].min_size, size, t->grow_dsc[i].max_size); + + if(size_clamp != size) { + t->grow_dsc[i].clamped = 1; + grow_reiterate = true; + } + t->grow_dsc[i].final_size = size_clamp; + grow_value_sum -= t->grow_dsc[i].grow_value; + grow_max_size -= t->grow_dsc[i].final_size; + } + } + } + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + int32_t main_pos = 0; + + int32_t place_gap = 0; + place_content(f->main_place, max_main_size, t->track_main_size, t->item_cnt, &main_pos, &place_gap); + if(f->row && rtl) main_pos += lv_obj_get_content_width(cont); + + lv_obj_t * item = lv_obj_get_child(cont, item_first_id); + /*Reposition the children*/ + while(item && item_first_id != item_last_id) { + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + item = get_next_item(cont, f->rev, &item_first_id); + continue; + } + int32_t grow_size = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_size) { + int32_t s = 0; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].item == item) { + s = t->grow_dsc[i].final_size; + break; + } + } + + if(f->row) { + item->w_layout = 1; + item->h_layout = 0; + } + else { + item->h_layout = 1; + item->w_layout = 0; + } + + if(s != area_get_main_size(&item->coords)) { + lv_obj_invalidate(item); + + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + area_set_main_size(&item->coords, s); + lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + lv_obj_invalidate(item); + } + } + else { + item->w_layout = 0; + item->h_layout = 0; + } + + int32_t cross_pos = 0; + switch(f->cross_place) { + case LV_FLEX_ALIGN_CENTER: + /*Round up the cross size to avoid rounding error when dividing by 2 + *The issue comes up e,g, with column direction with center cross direction if an element's width changes*/ + cross_pos = (((t->track_cross_size + 1) & (~1)) - area_get_cross_size(&item->coords)) / 2; + cross_pos += (get_margin_cross_start(item, LV_PART_MAIN) - get_margin_cross_end(item, LV_PART_MAIN)) / 2; + break; + case LV_FLEX_ALIGN_END: + cross_pos = t->track_cross_size - area_get_cross_size(&item->coords); + cross_pos -= get_margin_cross_end(item, LV_PART_MAIN); + break; + default: + cross_pos += get_margin_cross_start(item, LV_PART_MAIN); + break; + } + + if(f->row && rtl) main_pos -= area_get_main_size(&item->coords); + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + int32_t w = lv_obj_get_width(item); + int32_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + int32_t diff_x = abs_x - item->coords.x1 + tr_x; + int32_t diff_y = abs_y - item->coords.y1 + tr_y; + diff_x += f->row ? main_pos + get_margin_main_start(item, LV_PART_MAIN) : cross_pos; + diff_y += f->row ? cross_pos : main_pos + get_margin_main_start(item, LV_PART_MAIN); + + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } + + if(!(f->row && rtl)) main_pos += area_get_main_size(&item->coords) + item_gap + place_gap + + get_margin_main_start(item, LV_PART_MAIN) + + get_margin_main_end(item, LV_PART_MAIN); + else main_pos -= item_gap + place_gap; + + item = get_next_item(cont, f->rev, &item_first_id); + } +} + +/** + * Tell a start coordinate and gap for a placement type. + */ +static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, + int32_t * start_pos, int32_t * gap) +{ + if(item_cnt <= 1) { + switch(place) { + case LV_FLEX_ALIGN_SPACE_BETWEEN: + case LV_FLEX_ALIGN_SPACE_AROUND: + case LV_FLEX_ALIGN_SPACE_EVENLY: + place = LV_FLEX_ALIGN_CENTER; + break; + default: + break; + } + } + + switch(place) { + case LV_FLEX_ALIGN_CENTER: + *gap = 0; + *start_pos += (max_size - content_size) / 2; + break; + case LV_FLEX_ALIGN_END: + *gap = 0; + *start_pos += max_size - content_size; + break; + case LV_FLEX_ALIGN_SPACE_BETWEEN: + *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt - 1); + break; + case LV_FLEX_ALIGN_SPACE_AROUND: + *gap += (int32_t)(max_size - content_size) / (int32_t)(item_cnt); + *start_pos += *gap / 2; + break; + case LV_FLEX_ALIGN_SPACE_EVENLY: + *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt + 1); + *start_pos += *gap; + break; + default: + *gap = 0; + } +} + +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id) +{ + if(rev) { + (*item_id)--; + if(*item_id >= 0) return cont->spec_attr->children[*item_id]; + else return NULL; + } + else { + (*item_id)++; + if((*item_id) < (int32_t)cont->spec_attr->child_cnt) return cont->spec_attr->children[*item_id]; + else return NULL; + } +} + +static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj) +{ + return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + + lv_obj_get_width(obj) + + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); +} + +static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj) +{ + return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + + lv_obj_get_height(obj) + + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); +} + +#endif /*LV_USE_FLEX*/ diff --git a/libraries/lvgl/src/layouts/flex/lv_flex.h b/libraries/lvgl/src/layouts/flex/lv_flex.h new file mode 100644 index 0000000..17e6279 --- /dev/null +++ b/libraries/lvgl/src/layouts/flex/lv_flex.h @@ -0,0 +1,103 @@ +/** + * @file lv_flex.h + * + */ + +#ifndef LV_FLEX_H +#define LV_FLEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_area.h" + +#if LV_USE_FLEX + +/********************* + * DEFINES + *********************/ + +#define _LV_FLEX_COLUMN (1 << 0) +#define _LV_FLEX_WRAP (1 << 2) +#define _LV_FLEX_REVERSE (1 << 3) + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +typedef enum { + LV_FLEX_ALIGN_START, + LV_FLEX_ALIGN_END, + LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_SPACE_EVENLY, + LV_FLEX_ALIGN_SPACE_AROUND, + LV_FLEX_ALIGN_SPACE_BETWEEN, +} lv_flex_align_t; + +typedef enum { + LV_FLEX_FLOW_ROW = 0x00, + LV_FLEX_FLOW_COLUMN = _LV_FLEX_COLUMN, + LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP, + LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP, + LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | _LV_FLEX_WRAP | _LV_FLEX_REVERSE, +} lv_flex_flow_t; + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a flex layout the default values + * @param flex pointer to a flex layout descriptor + */ +void lv_flex_init(void); + +/** + * Set how the item should flow + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param flow an element of `lv_flex_flow_t`. + */ +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow); + +/** + * Set how to place (where to align) the items and tracks + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param main_place where to place the items on main axis (in their track). Any value of `lv_flex_align_t`. + * @param cross_place where to place the item in their track on the cross axis. `LV_FLEX_ALIGN_START/END/CENTER` + * @param track_cross_place where to place the tracks in the cross direction. Any value of `lv_flex_align_t`. + */ +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_cross_place); + +/** + * Sets the width or height (on main axis) to grow the object in order fill the free space + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param grow a value to set how much free space to take proportionally to other growing items. + */ +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FLEX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FLEX_H*/ diff --git a/libraries/lvgl/src/layouts/grid/lv_grid.c b/libraries/lvgl/src/layouts/grid/lv_grid.c new file mode 100644 index 0000000..e5da882 --- /dev/null +++ b/libraries/lvgl/src/layouts/grid/lv_grid.c @@ -0,0 +1,663 @@ +/** + * @file lv_grid.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_grid.h" + +#if LV_USE_GRID + +#include "../../stdlib/lv_string.h" +#include "../lv_layout.h" +#include "../../core/lv_obj.h" +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/** + * Some helper defines + */ +#define IS_FR(x) (x >= LV_COORD_MAX - 100) +#define IS_CONTENT(x) (x == LV_COORD_MAX - 101) +#define GET_FR(x) (x - (LV_COORD_MAX - 100)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t col; + uint32_t row; + lv_point_t grid_abs; +} item_repos_hint_t; + +typedef struct { + int32_t * x; + int32_t * y; + int32_t * w; + int32_t * h; + uint32_t col_num; + uint32_t row_num; + int32_t grid_w; + int32_t grid_h; +} _lv_grid_calc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void grid_update(lv_obj_t * cont, void * user_data); +static void calc(lv_obj_t * obj, _lv_grid_calc_t * calc); +static void calc_free(_lv_grid_calc_t * calc); +static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c); +static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c); +static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint); +static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, + uint32_t track_num, + int32_t * size_array, int32_t * pos_array, bool reverse); +static uint32_t count_tracks(const int32_t * templ); + +static inline const int32_t * get_col_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_dsc_array(obj, 0); +} +static inline const int32_t * get_row_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_dsc_array(obj, 0); +} +static inline int32_t get_col_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_pos(obj, 0); +} +static inline int32_t get_row_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_pos(obj, 0); +} +static inline int32_t get_col_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_span(obj, 0); +} +static inline int32_t get_row_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_span(obj, 0); +} +static inline lv_grid_align_t get_cell_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_x_align(obj, 0); +} +static inline lv_grid_align_t get_cell_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_y_align(obj, 0); +} +static inline lv_grid_align_t get_grid_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_align(obj, 0); +} +static inline lv_grid_align_t get_grid_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_align(obj, 0); +} +static inline int32_t get_margin_hor(lv_obj_t * obj) +{ + return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); +} +static inline int32_t get_margin_ver(lv_obj_t * obj) +{ + return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); +} + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT + #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_LAYOUT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_grid_init(void) +{ + layout_list_def[LV_LAYOUT_GRID].cb = grid_update; + layout_list_def[LV_LAYOUT_GRID].user_data = NULL; +} + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]) +{ + lv_obj_set_style_grid_column_dsc_array(obj, col_dsc, 0); + lv_obj_set_style_grid_row_dsc_array(obj, row_dsc, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_GRID, 0); +} + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align) +{ + lv_obj_set_style_grid_column_align(obj, column_align, 0); + lv_obj_set_style_grid_row_align(obj, row_align, 0); + +} + +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, int32_t col_pos, int32_t col_span, + lv_grid_align_t y_align, int32_t row_pos, int32_t row_span) + +{ + lv_obj_set_style_grid_cell_column_pos(obj, col_pos, 0); + lv_obj_set_style_grid_cell_row_pos(obj, row_pos, 0); + lv_obj_set_style_grid_cell_x_align(obj, x_align, 0); + lv_obj_set_style_grid_cell_column_span(obj, col_span, 0); + lv_obj_set_style_grid_cell_row_span(obj, row_span, 0); + lv_obj_set_style_grid_cell_y_align(obj, y_align, 0); + + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void grid_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + // const int32_t * col_templ = get_col_dsc(cont); + // const int32_t * row_templ = get_row_dsc(cont); + // if(col_templ == NULL || row_templ == NULL) return; + + _lv_grid_calc_t c; + calc(cont, &c); + + item_repos_hint_t hint; + lv_memzero(&hint, sizeof(hint)); + + /*Calculate the grids absolute x and y coordinates. + *It will be used as helper during item repositioning to avoid calculating this value for every children*/ + int32_t pad_left = lv_obj_get_style_space_left(cont, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_space_top(cont, LV_PART_MAIN); + hint.grid_abs.x = pad_left + cont->coords.x1 - lv_obj_get_scroll_x(cont); + hint.grid_abs.y = pad_top + cont->coords.y1 - lv_obj_get_scroll_y(cont); + + uint32_t i; + for(i = 0; i < cont->spec_attr->child_cnt; i++) { + lv_obj_t * item = cont->spec_attr->children[i]; + item_repos(item, &c, &hint); + } + calc_free(&c); + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Calculate the grid cells coordinates + * @param cont an object that has a grid + * @param calc store the calculated cells sizes here + * @note `_lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore + */ +static void calc(lv_obj_t * cont, _lv_grid_calc_t * calc_out) +{ + if(lv_obj_get_child(cont, 0) == NULL) { + lv_memzero(calc_out, sizeof(_lv_grid_calc_t)); + return; + } + + calc_rows(cont, calc_out); + calc_cols(cont, calc_out); + + int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + + bool rev = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + bool auto_w = w_set == LV_SIZE_CONTENT && !cont->w_layout; + int32_t cont_w = lv_obj_get_content_width(cont); + calc_out->grid_w = grid_align(cont_w, auto_w, get_grid_col_align(cont), col_gap, calc_out->col_num, calc_out->w, + calc_out->x, rev); + + bool auto_h = h_set == LV_SIZE_CONTENT && !cont->h_layout; + int32_t cont_h = lv_obj_get_content_height(cont); + calc_out->grid_h = grid_align(cont_h, auto_h, get_grid_row_align(cont), row_gap, calc_out->row_num, calc_out->h, + calc_out->y, false); + + LV_ASSERT_MEM_INTEGRITY(); +} + +/** + * Free the a grid calculation's data + * @param calc pointer to the calculated grid cell coordinates + */ +static void calc_free(_lv_grid_calc_t * calc) +{ + lv_free(calc->x); + lv_free(calc->y); + lv_free(calc->w); + lv_free(calc->h); +} + +static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) +{ + + const int32_t * col_templ; + col_templ = get_col_dsc(cont); + bool subgrid = false; + if(col_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + col_templ = get_col_dsc(parent); + if(col_templ == NULL) { + LV_LOG_WARN("No col descriptor found even on the parent"); + return; + } + + int32_t pos = get_col_pos(cont); + int32_t span = get_col_span(cont); + + int32_t * col_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); + lv_memcpy(col_templ_sub, &col_templ[pos], sizeof(int32_t) * span); + col_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + col_templ = col_templ_sub; + subgrid = true; + } + + int32_t cont_w = lv_obj_get_content_width(cont); + + c->col_num = count_tracks(col_templ); + c->x = lv_malloc(sizeof(int32_t) * c->col_num); + c->w = lv_malloc(sizeof(int32_t) * c->col_num); + + /*Set sizes for CONTENT cells*/ + uint32_t i; + for(i = 0; i < c->col_num; i++) { + int32_t size = LV_COORD_MIN; + if(IS_CONTENT(col_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t col_span = get_col_span(item); + if(col_span != 1) continue; + + uint32_t col_pos = get_col_pos(item); + if(col_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_width(item)); + } + if(size >= 0) c->w[i] = size; + else c->w[i] = 0; + } + } + + uint32_t col_fr_cnt = 0; + int32_t grid_w = 0; + + for(i = 0; i < c->col_num; i++) { + int32_t x = col_templ[i]; + if(IS_FR(x)) { + col_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_w += c->w[i]; + } + else { + c->w[i] = x; + grid_w += x; + } + } + + int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + cont_w -= col_gap * (c->col_num - 1); + int32_t free_w = cont_w - grid_w; + if(free_w < 0) free_w = 0; + + int32_t last_fr_i = -1; + int32_t last_fr_x = 0; + for(i = 0; i < c->col_num; i++) { + int32_t x = col_templ[i]; + if(IS_FR(x)) { + int32_t f = GET_FR(x); + c->w[i] = (free_w * f) / col_fr_cnt; + last_fr_i = i; + last_fr_x = f; + } + } + + /*To avoid rounding errors set the last FR track to the remaining size */ + if(last_fr_i >= 0) { + c->w[last_fr_i] = free_w - ((free_w * (col_fr_cnt - last_fr_x)) / col_fr_cnt); + } + + if(subgrid) { + lv_free((void *)col_templ); + } +} + +static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) +{ + const int32_t * row_templ; + row_templ = get_row_dsc(cont); + bool subgrid = false; + if(row_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + row_templ = get_row_dsc(parent); + if(row_templ == NULL) { + LV_LOG_WARN("No row descriptor found even on the parent"); + return; + } + + int32_t pos = get_row_pos(cont); + int32_t span = get_row_span(cont); + + int32_t * row_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); + lv_memcpy(row_templ_sub, &row_templ[pos], sizeof(int32_t) * span); + row_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + row_templ = row_templ_sub; + subgrid = true; + } + + c->row_num = count_tracks(row_templ); + c->y = lv_malloc(sizeof(int32_t) * c->row_num); + c->h = lv_malloc(sizeof(int32_t) * c->row_num); + /*Set sizes for CONTENT cells*/ + uint32_t i; + for(i = 0; i < c->row_num; i++) { + int32_t size = LV_COORD_MIN; + if(IS_CONTENT(row_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t row_span = get_row_span(item); + if(row_span != 1) continue; + + uint32_t row_pos = get_row_pos(item); + if(row_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_height(item)); + } + if(size >= 0) c->h[i] = size; + else c->h[i] = 0; + } + } + + uint32_t row_fr_cnt = 0; + int32_t grid_h = 0; + + for(i = 0; i < c->row_num; i++) { + int32_t x = row_templ[i]; + if(IS_FR(x)) { + row_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_h += c->h[i]; + } + else { + c->h[i] = x; + grid_h += x; + } + } + + int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t cont_h = lv_obj_get_content_height(cont) - row_gap * (c->row_num - 1); + int32_t free_h = cont_h - grid_h; + if(free_h < 0) free_h = 0; + + int32_t last_fr_i = -1; + int32_t last_fr_x = 0; + for(i = 0; i < c->row_num; i++) { + int32_t x = row_templ[i]; + if(IS_FR(x)) { + int32_t f = GET_FR(x); + c->h[i] = (free_h * f) / row_fr_cnt; + last_fr_i = i; + last_fr_x = f; + } + } + + /*To avoid rounding errors set the last FR track to the remaining size */ + if(last_fr_i >= 0) { + c->h[last_fr_i] = free_h - ((free_h * (row_fr_cnt - last_fr_x)) / row_fr_cnt); + } + + if(subgrid) { + lv_free((void *)row_templ); + } +} + +/** + * Reposition a grid item in its cell + * @param item a grid item to reposition + * @param calc the calculated grid of `cont` + * @param child_id_ext helper value if the ID of the child is know (order from the oldest) else -1 + * @param grid_abs helper value, the absolute position of the grid, NULL if unknown + */ +static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * hint) +{ + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) return; + uint32_t col_span = get_col_span(item); + uint32_t row_span = get_row_span(item); + if(row_span == 0 || col_span == 0) return; + + uint32_t col_pos = get_col_pos(item); + uint32_t row_pos = get_row_pos(item); + lv_grid_align_t col_align = get_cell_col_align(item); + lv_grid_align_t row_align = get_cell_row_align(item); + + int32_t col_x1 = c->x[col_pos]; + int32_t col_x2 = c->x[col_pos + col_span - 1] + c->w[col_pos + col_span - 1]; + int32_t col_w = col_x2 - col_x1; + + int32_t row_y1 = c->y[row_pos]; + int32_t row_y2 = c->y[row_pos + row_span - 1] + c->h[row_pos + row_span - 1]; + int32_t row_h = row_y2 - row_y1; + + /*If the item has RTL base dir switch start and end*/ + if(lv_obj_get_style_base_dir(item, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(col_align == LV_GRID_ALIGN_START) col_align = LV_GRID_ALIGN_END; + else if(col_align == LV_GRID_ALIGN_END) col_align = LV_GRID_ALIGN_START; + } + + int32_t x; + int32_t y; + int32_t item_w = lv_area_get_width(&item->coords); + int32_t item_h = lv_area_get_height(&item->coords); + + switch(col_align) { + default: + case LV_GRID_ALIGN_START: + x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); + item->w_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); + item_w = col_w - get_margin_hor(item); + item->w_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + x = c->x[col_pos] + (col_w - item_w) / 2 + (lv_obj_get_style_margin_left(item, LV_PART_MAIN) - + lv_obj_get_style_margin_right(item, LV_PART_MAIN)) / 2; + item->w_layout = 0; + break; + case LV_GRID_ALIGN_END: + x = c->x[col_pos] + col_w - lv_obj_get_width(item) - lv_obj_get_style_margin_right(item, LV_PART_MAIN); + item->w_layout = 0; + break; + } + + switch(row_align) { + default: + case LV_GRID_ALIGN_START: + y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); + item->h_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); + item_h = row_h - get_margin_ver(item); + item->h_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + y = c->y[row_pos] + (row_h - item_h) / 2 + (lv_obj_get_style_margin_top(item, LV_PART_MAIN) - + lv_obj_get_style_margin_bottom(item, LV_PART_MAIN)) / 2; + item->h_layout = 0; + break; + case LV_GRID_ALIGN_END: + y = c->y[row_pos] + row_h - lv_obj_get_height(item) - lv_obj_get_style_margin_bottom(item, LV_PART_MAIN); + item->h_layout = 0; + break; + } + + /*Set a new size if required*/ + if(lv_obj_get_width(item) != item_w || lv_obj_get_height(item) != item_h) { + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + lv_obj_invalidate(item); + lv_area_set_width(&item->coords, item_w); + lv_area_set_height(&item->coords, item_h); + lv_obj_invalidate(item); + lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + + } + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + int32_t w = lv_obj_get_width(item); + int32_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + x += tr_x; + y += tr_y; + + int32_t diff_x = hint->grid_abs.x + x - item->coords.x1; + int32_t diff_y = hint->grid_abs.y + y - item->coords.y1; + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } +} + +/** + * Place the grid track according to align methods. It keeps the track sizes but sets their position. + * It can process both columns or rows according to the passed parameters. + * @param cont_size size of the containers content area (width/height) + * @param auto_size true: the container has auto size in the current direction + * @param align align method + * @param gap grid gap + * @param track_num number of tracks + * @param size_array array with the track sizes + * @param pos_array write the positions of the tracks here + * @return the total size of the grid + */ +static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, + uint32_t track_num, + int32_t * size_array, int32_t * pos_array, bool reverse) +{ + int32_t grid_size = 0; + uint32_t i; + + if(auto_size) { + pos_array[0] = 0; + } + else { + /*With spaced alignment gap will be calculated from the remaining space*/ + if(align == LV_GRID_ALIGN_SPACE_AROUND || align == LV_GRID_ALIGN_SPACE_BETWEEN || align == LV_GRID_ALIGN_SPACE_EVENLY) { + gap = 0; + if(track_num == 1) align = LV_GRID_ALIGN_CENTER; + } + + /*Get the full grid size with gap*/ + for(i = 0; i < track_num; i++) { + grid_size += size_array[i] + gap; + } + grid_size -= gap; + + /*Calculate the position of the first item and set gap is necessary*/ + switch(align) { + case LV_GRID_ALIGN_START: + pos_array[0] = 0; + break; + case LV_GRID_ALIGN_CENTER: + pos_array[0] = (cont_size - grid_size) / 2; + break; + case LV_GRID_ALIGN_END: + pos_array[0] = cont_size - grid_size; + break; + case LV_GRID_ALIGN_SPACE_BETWEEN: + pos_array[0] = 0; + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num - 1); + break; + case LV_GRID_ALIGN_SPACE_AROUND: + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num); + pos_array[0] = gap / 2; + break; + case LV_GRID_ALIGN_SPACE_EVENLY: + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num + 1); + pos_array[0] = gap; + break; + default: + break; + } + } + + /*Set the position of all tracks from the start position, gaps and track sizes*/ + for(i = 0; i < track_num - 1; i++) { + pos_array[i + 1] = pos_array[i] + size_array[i] + gap; + } + + int32_t total_gird_size = pos_array[track_num - 1] + size_array[track_num - 1] - pos_array[0]; + + if(reverse) { + for(i = 0; i < track_num; i++) { + pos_array[i] = cont_size - pos_array[i] - size_array[i]; + } + + } + + /*Return the full size of the grid*/ + return total_gird_size; +} + +static uint32_t count_tracks(const int32_t * templ) +{ + uint32_t i; + for(i = 0; templ[i] != LV_GRID_TEMPLATE_LAST; i++); + + return i; +} + +#endif /*LV_USE_GRID*/ diff --git a/libraries/lvgl/src/layouts/grid/lv_grid.h b/libraries/lvgl/src/layouts/grid/lv_grid.h new file mode 100644 index 0000000..3c64177 --- /dev/null +++ b/libraries/lvgl/src/layouts/grid/lv_grid.h @@ -0,0 +1,102 @@ +/** + * @file lv_grid.h + * + */ + +#ifndef LV_GRID_H +#define LV_GRID_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_area.h" + +#if LV_USE_GRID + +/********************* + * DEFINES + *********************/ +/** + * Can be used track size to make the track fill the free space. + * @param x how much space to take proportionally to other FR tracks + * @return a special track size + */ +#define LV_GRID_FR(x) (LV_COORD_MAX - 100 + x) + +#define LV_GRID_CONTENT (LV_COORD_MAX - 101) +LV_EXPORT_CONST_INT(LV_GRID_CONTENT); + +#define LV_GRID_TEMPLATE_LAST (LV_COORD_MAX) +LV_EXPORT_CONST_INT(LV_GRID_TEMPLATE_LAST); + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +typedef enum { + LV_GRID_ALIGN_START, + LV_GRID_ALIGN_CENTER, + LV_GRID_ALIGN_END, + LV_GRID_ALIGN_STRETCH, + LV_GRID_ALIGN_SPACE_EVENLY, + LV_GRID_ALIGN_SPACE_AROUND, + LV_GRID_ALIGN_SPACE_BETWEEN, +} lv_grid_align_t; + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_grid_init(void); + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]); + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align); + +/** + * Set the cell of an object. The object's parent needs to have grid layout, else nothing will happen + * @param obj pointer to an object + * @param column_align the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param col_pos column ID + * @param col_span number of columns to take (>= 1) + * @param row_align the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param row_pos row ID + * @param row_span number of rows to take (>= 1) + */ +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t column_align, int32_t col_pos, int32_t col_span, + lv_grid_align_t row_align, int32_t row_pos, int32_t row_span); + +/** + * Just a wrapper to `LV_GRID_FR` for bindings. + */ +static inline int32_t lv_grid_fr(uint8_t x) +{ + return LV_GRID_FR(x); +} + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GRID*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRID_H*/ diff --git a/libraries/lvgl/src/layouts/lv_layout.c b/libraries/lvgl/src/layouts/lv_layout.c new file mode 100644 index 0000000..a14c121 --- /dev/null +++ b/libraries/lvgl/src/layouts/lv_layout.c @@ -0,0 +1,79 @@ +/** + * @file lv_layout.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_layout.h" +#include "../core/lv_global.h" +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ +#define layout_cnt LV_GLOBAL_DEFAULT()->layout_count +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_layout_init(void) +{ + /*Malloc a list for the built in layouts*/ + layout_list_def = lv_malloc(layout_cnt * sizeof(lv_layout_dsc_t)); + +#if LV_USE_FLEX + lv_flex_init(); +#endif + +#if LV_USE_GRID + lv_grid_init(); +#endif +} + +void _lv_layout_deinit(void) +{ + lv_free(layout_list_def); +} + +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data) +{ + layout_list_def = lv_realloc(layout_list_def, (layout_cnt + 1) * sizeof(lv_layout_dsc_t)); + LV_ASSERT_MALLOC(layout_list_def); + + layout_list_def[layout_cnt].cb = cb; + layout_list_def[layout_cnt].user_data = user_data; + return layout_cnt++; +} + +void _lv_layout_apply(lv_obj_t * obj) +{ + lv_layout_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id <= layout_cnt) { + void * user_data = layout_list_def[layout_id].user_data; + layout_list_def[layout_id].cb(obj, user_data); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/layouts/lv_layout.h b/libraries/lvgl/src/layouts/lv_layout.h new file mode 100644 index 0000000..f8258b5 --- /dev/null +++ b/libraries/lvgl/src/layouts/lv_layout.h @@ -0,0 +1,85 @@ +/** + * @file lv_layouts.h + * + */ + +#ifndef LV_LAYOUTS_H +#define LV_LAYOUTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_layout_update_cb_t)(lv_obj_t *, void * user_data); +typedef struct { + lv_layout_update_cb_t cb; + void * user_data; +} lv_layout_dsc_t; + +typedef enum { + LV_LAYOUT_NONE = 0, + +#if LV_USE_FLEX + LV_LAYOUT_FLEX, +#endif + +#if LV_USE_GRID + LV_LAYOUT_GRID, +#endif + + _LV_LAYOUT_LAST +} lv_layout_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void _lv_layout_init(void); + +void _lv_layout_deinit(void); + +/** + * Register a new layout + * @param cb the layout update callback + * @param user_data custom data that will be passed to `cb` + * @return the ID of the new layout + */ +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data); + +/** + * Update the layout of a widget + * @param obj pointer to a widget + */ +void _lv_layout_apply(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#if LV_USE_FLEX +#include "flex/lv_flex.h" +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +#include "grid/lv_grid.h" +#endif /* LV_USE_GRID */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LAYOUTS_H*/ diff --git a/libraries/lvgl/src/libs/barcode/code128.c b/libraries/lvgl/src/libs/barcode/code128.c new file mode 100644 index 0000000..4fc00cb --- /dev/null +++ b/libraries/lvgl/src/libs/barcode/code128.c @@ -0,0 +1,582 @@ +// Copyright (c) 2013, LKC Technologies, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. Redistributions in binary +// form must reproduce the above copyright notice, this list of conditions and +// the following disclaimer in the documentation and/or other materials +// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT +// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "../../../lvgl.h" +#if LV_USE_BARCODE + +#include "code128.h" +#include + +#define CODE128_MALLOC lv_malloc +#define CODE128_REALLOC lv_realloc +#define CODE128_FREE lv_free +#define CODE128_MEMSET lv_memset +#define CODE128_STRLEN lv_strlen +#define CODE128_ASSERT LV_ASSERT + +#define CODE128_QUIET_ZONE_LEN 10 +#define CODE128_CHAR_LEN 11 +#define CODE128_STOP_CODE_LEN 13 + +#define CODE128_START_CODE_A 103 +#define CODE128_START_CODE_B 104 +#define CODE128_START_CODE_C 105 + +#define CODE128_MODE_A 'a' +#define CODE128_MODE_B 'b' +#define CODE128_MODE_C 'c' + +#define CODE128_MIN_ENCODE_LEN (CODE128_QUIET_ZONE_LEN * 2 + CODE128_CHAR_LEN * 2 + CODE128_STOP_CODE_LEN) + +static const int code128_pattern[] = { + // value: pattern, bar/space widths + 1740, // 0: 11011001100, 212222 + 1644, // 1: 11001101100, 222122 + 1638, // 2: 11001100110, 222221 + 1176, // 3: 10010011000, 121223 + 1164, // 4: 10010001100, 121322 + 1100, // 5: 10001001100, 131222 + 1224, // 6: 10011001000, 122213 + 1220, // 7: 10011000100, 122312 + 1124, // 8: 10001100100, 132212 + 1608, // 9: 11001001000, 221213 + 1604, // 10: 11001000100, 221312 + 1572, // 11: 11000100100, 231212 + 1436, // 12: 10110011100, 112232 + 1244, // 13: 10011011100, 122132 + 1230, // 14: 10011001110, 122231 + 1484, // 15: 10111001100, 113222 + 1260, // 16: 10011101100, 123122 + 1254, // 17: 10011100110, 123221 + 1650, // 18: 11001110010, 223211 + 1628, // 19: 11001011100, 221132 + 1614, // 20: 11001001110, 221231 + 1764, // 21: 11011100100, 213212 + 1652, // 22: 11001110100, 223112 + 1902, // 23: 11101101110, 312131 + 1868, // 24: 11101001100, 311222 + 1836, // 25: 11100101100, 321122 + 1830, // 26: 11100100110, 321221 + 1892, // 27: 11101100100, 312212 + 1844, // 28: 11100110100, 322112 + 1842, // 29: 11100110010, 322211 + 1752, // 30: 11011011000, 212123 + 1734, // 31: 11011000110, 212321 + 1590, // 32: 11000110110, 232121 + 1304, // 33: 10100011000, 111323 + 1112, // 34: 10001011000, 131123 + 1094, // 35: 10001000110, 131321 + 1416, // 36: 10110001000, 112313 + 1128, // 37: 10001101000, 132113 + 1122, // 38: 10001100010, 132311 + 1672, // 39: 11010001000, 211313 + 1576, // 40: 11000101000, 231113 + 1570, // 41: 11000100010, 231311 + 1464, // 42: 10110111000, 112133 + 1422, // 43: 10110001110 + 1134, // 44: 10001101110 + 1496, // 45: 10111011000, 113123 + 1478, // 46: 10111000110, 113321 + 1142, // 47: 10001110110, 133121 + 1910, // 48: 11101110110, 313121 + 1678, // 49: 11010001110, 211331 + 1582, // 50: 11000101110, 231131 + 1768, // 51: 11011101000, 213113 + 1762, // 52: 11011100010, 213311 + 1774, // 53: 11011101110, 213131 + 1880, // 54: 11101011000, 311123 + 1862, // 55: 11101000110, 311321 + 1814, // 56: 11100010110, 331121 + 1896, // 57: 11101101000, 312113 + 1890, // 58: 11101100010, 312311 + 1818, // 59: 11100011010, 332111 + 1914, // 60: 11101111010, 314111 + 1602, // 61: 11001000010, 221411 + 1930, // 62: 11110001010, 431111 + 1328, // 63: 10100110000, 111224 + 1292, // 64: 10100001100, 111422 + 1200, // 65: 10010110000, 121124 + 1158, // 66: 10010000110, 121421 + 1068, // 67: 10000101100, 141122 + 1062, // 68: 10000100110, 141221 + 1424, // 69: 10110010000, 112214 + 1412, // 70: 10110000100, 112412 + 1232, // 71: 10011010000, 122114 + 1218, // 72: 10011000010, 122411 + 1076, // 73: 10000110100, 142112 + 1074, // 74: 10000110010, 142211 + 1554, // 75: 11000010010, 241211 + 1616, // 76: 11001010000, 221114 + 1978, // 77: 11110111010, 413111 + 1556, // 78: 11000010100, 241112 + 1146, // 79: 10001111010, 134111 + 1340, // 80: 10100111100, 111242 + 1212, // 81: 10010111100, 121142 + 1182, // 82: 10010011110, 121241 + 1508, // 83: 10111100100, 114212 + 1268, // 84: 10011110100, 124112 + 1266, // 85: 10011110010, 124211 + 1956, // 86: 11110100100, 411212 + 1940, // 87: 11110010100, 421112 + 1938, // 88: 11110010010, 421211 + 1758, // 89: 11011011110, 212141 + 1782, // 90: 11011110110, 214121 + 1974, // 91: 11110110110, 412121 + 1400, // 92: 10101111000, 111143 + 1310, // 93: 10100011110, 111341 + 1118, // 94: 10001011110, 131141 + 1512, // 95: 10111101000, 114113 + 1506, // 96: 10111100010, 114311 + 1960, // 97: 11110101000, 411113 + 1954, // 98: 11110100010, 411311 + 1502, // 99: 10111011110, 113141 + 1518, // 100: 10111101110, 114131 + 1886, // 101: 11101011110, 311141 + 1966, // 102: 11110101110, 411131 + 1668, // 103: 11010000100, 211412 + 1680, // 104: 11010010000, 211214 + 1692 // 105: 11010011100, 211232 +}; + +static const int code128_stop_pattern = 6379; // 1100011101011, 2331112 + +struct code128_step { + int prev_ix; // Index of previous step, if any + const char * next_input; // Remaining input + unsigned short len; // The length of the pattern so far (includes this step) + char mode; // State for the current encoding + signed char code; // What code should be written for this step +}; + +struct code128_state { + struct code128_step * steps; + int allocated_steps; + int current_ix; + int todo_ix; + int best_ix; + + size_t maxlength; +}; + +size_t code128_estimate_len(const char * s) +{ + return CODE128_QUIET_ZONE_LEN + + CODE128_CHAR_LEN // start code + + CODE128_CHAR_LEN * (CODE128_STRLEN(s) * 11 / 10) // contents + 10% padding + + CODE128_CHAR_LEN // checksum + + CODE128_STOP_CODE_LEN + + CODE128_QUIET_ZONE_LEN; +} + +static void code128_append_pattern(int pattern, int pattern_length, char * out) +{ + // All patterns have their first bit set by design + CODE128_ASSERT(pattern & (1 << (pattern_length - 1))); + + int i; + for(i = pattern_length - 1; i >= 0; i--) { + // cast avoids warning: implicit conversion from 'int' to 'char' changes value from 255 to -1 [-Wconstant-conversion] + *out++ = (unsigned char)((pattern & (1 << i)) ? 255 : 0); + } +} + +static int code128_append_code(int code, char * out) +{ + CODE128_ASSERT(code >= 0 && code < (int)(sizeof(code128_pattern) / sizeof(code128_pattern[0]))); + code128_append_pattern(code128_pattern[code], CODE128_CHAR_LEN, out); + return CODE128_CHAR_LEN; +} + +static int code128_append_stop_code(char * out) +{ + code128_append_pattern(code128_stop_pattern, CODE128_STOP_CODE_LEN, out); + return CODE128_STOP_CODE_LEN; +} + +static signed char code128_switch_code(char from_mode, char to_mode) +{ + switch(from_mode) { + case CODE128_MODE_A: + switch(to_mode) { + case CODE128_MODE_B: + return 100; + case CODE128_MODE_C: + return 99; + } + break; + + case CODE128_MODE_B: + switch(to_mode) { + case CODE128_MODE_A: + return 101; + case CODE128_MODE_C: + return 99; + } + break; + + case CODE128_MODE_C: + switch(to_mode) { + case CODE128_MODE_B: + return 100; + case CODE128_MODE_A: + return 101; + } + break; + default: + break; + } + + CODE128_ASSERT(0); // Invalid mode switch + return -1; +} + +static signed char code128a_ascii_to_code(signed char value) +{ + if(value >= ' ' && value <= '_') + return (signed char)(value - ' '); + else if(value >= 0 && value < ' ') + return (signed char)(value + 64); + else if(value == (signed char)CODE128_FNC1) + return 102; + else if(value == (signed char)CODE128_FNC2) + return 97; + else if(value == (signed char)CODE128_FNC3) + return 96; + else if(value == (signed char)CODE128_FNC4) + return 101; + else + return -1; +} + +static signed char code128b_ascii_to_code(signed char value) +{ + if(value >= ' ') // value <= 127 is implied + return (signed char)(value - ' '); + else if(value == (signed char)CODE128_FNC1) + return 102; + else if(value == (signed char)CODE128_FNC2) + return 97; + else if(value == (signed char)CODE128_FNC3) + return 96; + else if(value == (signed char)CODE128_FNC4) + return 100; + else + return -1; +} + +static signed char code128c_ascii_to_code(const char * values) +{ + if(values[0] == CODE128_FNC1) + return 102; + + if(values[0] >= '0' && values[0] <= '9' && + values[1] >= '0' && values[1] <= '9') { + char code = 10 * (values[0] - '0') + (values[1] - '0'); + return code; + } + + return -1; +} + +static int code128_do_a_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128a_ascii_to_code(value); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + step->mode = CODE128_MODE_A; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static int code128_do_b_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128b_ascii_to_code(value); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + step->mode = CODE128_MODE_B; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static int code128_do_c_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128c_ascii_to_code(previous_step->next_input); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + + // Mode C consumes 2 characters for codes 0-99 + if(step->code < 100) + step->next_input++; + + step->mode = CODE128_MODE_C; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static struct code128_step * code128_alloc_step(struct code128_state * state) +{ + if(state->todo_ix >= state->allocated_steps) { + state->allocated_steps += 1024; + state->steps = (struct code128_step *) CODE128_REALLOC(state->steps, + state->allocated_steps * sizeof(struct code128_step)); + } + + struct code128_step * step = &state->steps[state->todo_ix]; + + CODE128_MEMSET(step, 0, sizeof(*step)); + return step; +} + +static void code128_do_step(struct code128_state * state) +{ + struct code128_step * step = &state->steps[state->current_ix]; + if(*step->next_input == 0) { + // Done, so see if we have a new shortest encoding. + if((step->len < state->maxlength) || + (state->best_ix < 0 && step->len == state->maxlength)) { + state->best_ix = state->current_ix; + + // Update maxlength to avoid considering anything longer + state->maxlength = step->len; + } + return; + } + + // Don't try if we're already at or beyond the max acceptable + // length; + if(step->len >= state->maxlength) + return; + char mode = step->mode; + + code128_alloc_step(state); + int mode_c_worked = 0; + + // Always try mode C + if(code128_do_c_step(state->steps, state->current_ix, state->todo_ix)) { + state->todo_ix++; + code128_alloc_step(state); + mode_c_worked = 1; + } + + if(mode == CODE128_MODE_A) { + // If A works, stick with A. There's no advantage to switching + // to B proactively if A still works. + if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix) || + code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } + else if(mode == CODE128_MODE_B) { + // The same logic applies here. There's no advantage to switching + // proactively to A if B still works. + if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix) || + code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } + else if(!mode_c_worked) { + // In mode C. If mode C worked and we're in mode C, trying anything + // else is pointless since the mode C encoding will be shorter and + // there won't be any mode switches. + + // If we're leaving mode C, though, try both in case one ends up + // better than the other. + if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) { + state->todo_ix++; + code128_alloc_step(state); + } + if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } +} + +size_t code128_encode_raw(const char * s, char * out, size_t maxlength) +{ + struct code128_state state; + + const size_t overhead = CODE128_QUIET_ZONE_LEN + + CODE128_CHAR_LEN // checksum + + CODE128_STOP_CODE_LEN + + CODE128_QUIET_ZONE_LEN; + if(maxlength < overhead + CODE128_CHAR_LEN + CODE128_CHAR_LEN) { + // Need space to encode the start character and one additional + // character. + return 0; + } + + state.allocated_steps = 256; + state.steps = (struct code128_step *) CODE128_MALLOC(state.allocated_steps * sizeof(struct code128_step)); + state.current_ix = 0; + state.todo_ix = 0; + state.maxlength = maxlength - overhead; + state.best_ix = -1; + + // Initialize the first 3 steps for the 3 encoding routes (A, B, C) + state.steps[0].prev_ix = -1; + state.steps[0].next_input = s; + state.steps[0].len = CODE128_CHAR_LEN; + state.steps[0].mode = CODE128_MODE_C; + state.steps[0].code = CODE128_START_CODE_C; + + state.steps[1].prev_ix = -1; + state.steps[1].next_input = s; + state.steps[1].len = CODE128_CHAR_LEN; + state.steps[1].mode = CODE128_MODE_A; + state.steps[1].code = CODE128_START_CODE_A; + + state.steps[2].prev_ix = -1; + state.steps[2].next_input = s; + state.steps[2].len = CODE128_CHAR_LEN; + state.steps[2].mode = CODE128_MODE_B; + state.steps[2].code = CODE128_START_CODE_B; + + state.todo_ix = 3; + + // Keep going until no more work + do { + code128_do_step(&state); + state.current_ix++; + } while(state.current_ix != state.todo_ix); + + // If no best_step, then fail. + if(state.best_ix < 0) { + CODE128_FREE(state.steps); + return 0; + } + + // Determine the list of codes + size_t num_codes = state.maxlength / CODE128_CHAR_LEN; + char * codes = CODE128_MALLOC(num_codes); + CODE128_ASSERT(codes); + + struct code128_step * step = &state.steps[state.best_ix]; + size_t i; + for(i = num_codes - 1; i > 0; --i) { + struct code128_step * prev_step = &state.steps[step->prev_ix]; + codes[i] = step->code; + if(step->mode != prev_step->mode) { + --i; + codes[i] = code128_switch_code(prev_step->mode, step->mode); + } + step = prev_step; + } + codes[0] = step->code; + + // Encode everything up to the checksum + size_t actual_length = state.maxlength + overhead; + CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); + out += CODE128_QUIET_ZONE_LEN; + for(i = 0; i < num_codes; i++) + out += code128_append_code(codes[i], out); + + // Compute the checksum + int sum = codes[0]; + for(i = 1; i < num_codes; i++) + sum += (int)(codes[i] * i); + out += code128_append_code(sum % 103, out); + + // Finalize the code. + out += code128_append_stop_code(out); + CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); + + CODE128_FREE(codes); + CODE128_FREE(state.steps); + return actual_length; +} + +/** + * @brief Encode the GS1 string + * + * This converts [FNC1] sequences to raw FNC1 characters and + * removes spaces before encoding the barcodes. + * + * @return the length of barcode data in bytes + */ +size_t code128_encode_gs1(const char * s, char * out, size_t maxlength) +{ + size_t raw_size = CODE128_STRLEN(s) + 1; + char * raw = CODE128_MALLOC(raw_size); + CODE128_ASSERT(raw); + if(!raw) { + return 0; + } + + char * p = raw; + for(; *s != '\0'; s++) { + if(strncmp(s, "[FNC1]", 6) == 0) { + *p++ = CODE128_FNC1; + s += 5; + } + else if(*s != ' ') { + *p++ = *s; + } + } + *p = '\0'; + + size_t length = code128_encode_raw(raw, out, maxlength); + + CODE128_FREE(raw); + + return length; +} + +#endif /*LV_USE_BARCODE*/ diff --git a/libraries/lvgl/src/libs/barcode/code128.h b/libraries/lvgl/src/libs/barcode/code128.h new file mode 100644 index 0000000..51d53d0 --- /dev/null +++ b/libraries/lvgl/src/libs/barcode/code128.h @@ -0,0 +1,47 @@ +// Copyright (c) 2013-15, LKC Technologies, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. Redistributions in binary +// form must reproduce the above copyright notice, this list of conditions and +// the following disclaimer in the documentation and/or other materials +// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT +// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CODE128_H +#define CODE128_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Since the FNCn characters are not ASCII, define versions here to +// simplify encoding strings that include them. +#define CODE128_FNC1 '\xf1' +#define CODE128_FNC2 '\xf2' +#define CODE128_FNC3 '\xf3' +#define CODE128_FNC4 '\xf4' + +size_t code128_estimate_len(const char * s); +size_t code128_encode_gs1(const char * s, char * out, size_t maxlength); +size_t code128_encode_raw(const char * s, char * out, size_t maxlength); + +#ifdef __cplusplus +} +#endif + +#endif // CODE128_H diff --git a/libraries/lvgl/src/libs/barcode/lv_barcode.c b/libraries/lvgl/src/libs/barcode/lv_barcode.c new file mode 100644 index 0000000..16eebcd --- /dev/null +++ b/libraries/lvgl/src/libs/barcode/lv_barcode.c @@ -0,0 +1,227 @@ +/** + * @file lv_barcode.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_barcode.h" +#include "../../lvgl.h" + +#if LV_USE_BARCODE + +#include "code128.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_barcode_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_barcode_class = { + .constructor_cb = lv_barcode_constructor, + .destructor_cb = lv_barcode_destructor, + .width_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_barcode_t), + .base_class = &lv_canvas_class, + .name = "barcode", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_barcode_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->dark_color = color; +} + +void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->light_color = color; +} + +void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(scale == 0) { + scale = 1; + } + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->scale = scale; +} + +void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->direction = direction; +} + +lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(data); + + lv_result_t res = LV_RESULT_INVALID; + lv_barcode_t * barcode = (lv_barcode_t *)obj; + + if(data == NULL || lv_strlen(data) == 0) { + LV_LOG_WARN("data is empty"); + return LV_RESULT_INVALID; + } + + size_t len = code128_estimate_len(data); + LV_LOG_INFO("data: %s, len = %zu", data, len); + + char * out_buf = lv_malloc(len); + LV_ASSERT_MALLOC(out_buf); + if(!out_buf) { + LV_LOG_ERROR("malloc failed for out_buf"); + return LV_RESULT_INVALID; + } + + int32_t barcode_w = (int32_t) code128_encode_gs1(data, out_buf, len); + LV_LOG_INFO("barcode width = %d", (int)barcode_w); + + LV_ASSERT(barcode->scale > 0); + uint16_t scale = barcode->scale; + + int32_t buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : 1; + int32_t buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : 1; + + if(!lv_barcode_change_buf_size(obj, buf_w, buf_h)) { + goto failed; + } + + lv_canvas_set_palette(obj, 0, lv_color_to_32(barcode->dark_color, 0xff)); + lv_canvas_set_palette(obj, 1, lv_color_to_32(barcode->light_color, 0xff)); + + for(int32_t x = 0; x < barcode_w; x++) { + lv_color_t color; + color = lv_color_hex(out_buf[x] ? 0 : 1); + for(uint16_t i = 0; i < scale; i++) { + if(barcode->direction == LV_DIR_HOR) { + lv_canvas_set_px(obj, x * scale + i, 0, color, LV_OPA_COVER); + } + else { + lv_canvas_set_px(obj, 0, x * scale + i, color, LV_OPA_COVER); + } + } + } + + res = LV_RESULT_OK; + +failed: + lv_free(out_buf); + return res; +} + +lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->dark_color; +} + +lv_color_t lv_barcode_get_light_color(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->light_color; +} + +uint16_t lv_barcode_get_scale(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->scale; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->dark_color = lv_color_black(); + barcode->light_color = lv_color_white(); + barcode->scale = 1; + barcode->direction = LV_DIR_HOR; + lv_image_set_inner_align(obj, LV_IMAGE_ALIGN_TILE); +} + +static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) return; + lv_image_cache_drop(draw_buf); + + /*@fixme destroy buffer in cache free_cb.*/ + lv_draw_buf_destroy(draw_buf); +} + +static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT(w > 0); + + lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); + lv_draw_buf_t * new_buf = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); + if(new_buf == NULL) { + LV_LOG_ERROR("malloc failed for canvas buffer"); + return false; + } + + lv_canvas_set_draw_buf(obj, new_buf); + LV_LOG_INFO("set canvas buffer: %p, width = %d", (void *)new_buf, (int)w); + + if(old_buf != NULL) lv_draw_buf_destroy(old_buf); + return true; +} + +#endif /*LV_USE_BARCODE*/ diff --git a/libraries/lvgl/src/libs/barcode/lv_barcode.h b/libraries/lvgl/src/libs/barcode/lv_barcode.h new file mode 100644 index 0000000..4f7b446 --- /dev/null +++ b/libraries/lvgl/src/libs/barcode/lv_barcode.h @@ -0,0 +1,120 @@ +/** + * @file lv_barcode.c + * + */ + +#ifndef LV_BARCODE_H +#define LV_BARCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_color.h" +#include "../../widgets/canvas/lv_canvas.h" + +#if LV_USE_BARCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of barcode*/ +typedef struct { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; + uint16_t scale; + lv_dir_t direction; +} lv_barcode_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_barcode_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty barcode (an `lv_canvas`) object. + * @param parent point to an object where to create the barcode + * @return pointer to the created barcode object + */ +lv_obj_t * lv_barcode_create(lv_obj_t * parent); + +/** + * Set the dark color of a barcode object + * @param obj pointer to barcode object + * @param color dark color of the barcode + */ +void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the light color of a barcode object + * @param obj pointer to barcode object + * @param color light color of the barcode + */ +void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the scale of a barcode object + * @param obj pointer to barcode object + * @param scale scale factor + */ +void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale); + +/** + * Set the direction of a barcode object + * @param obj pointer to barcode object + * @param direction draw direction (`LV_DIR_HOR` or `LB_DIR_VER`) + */ +void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction); + +/** + * Set the data of a barcode object + * @param obj pointer to barcode object + * @param data data to display + * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error + */ +lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data); + +/** + * Get the dark color of a barcode object + * @param obj pointer to barcode object + * @return dark color of the barcode + */ +lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj); + +/** + * Get the light color of a barcode object + * @param obj pointer to barcode object + * @return light color of the barcode + */ +lv_color_t lv_barcode_get_light_color(lv_obj_t * obj); + +/** + * Get the scale of a barcode object + * @param obj pointer to barcode object + * @return scale factor + */ +uint16_t lv_barcode_get_scale(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BARCODE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BARCODE_H*/ diff --git a/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.c b/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.c new file mode 100644 index 0000000..b6a44c8 --- /dev/null +++ b/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.c @@ -0,0 +1,1139 @@ +/** + * @file lv_image_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bin_decoder.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_buf.h" +#include "../../stdlib/lv_string.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../libs/rle/lv_rle.h" + +#if LV_USE_LZ4_EXTERNAL + #include +#endif + +#if LV_USE_LZ4_INTERNAL + #include "../../libs/lz4/lz4.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data format for compressed image data. + */ + +typedef struct _lv_image_compressed_t { + uint32_t method: 4; /*Compression method, see `lv_image_compress_t`*/ + uint32_t reserved : 28; /*Reserved to be used later*/ + uint32_t compressed_size; /*Compressed data size in byte*/ + uint32_t decompressed_size; /*Decompressed data size in byte*/ + const uint8_t * data; /*Compressed data*/ +} lv_image_compressed_t; + +typedef struct { + lv_fs_file_t * f; + lv_color32_t * palette; + lv_opa_t * opa; + lv_image_compressed_t compressed; + lv_draw_buf_t * decoded; /*A draw buf to store decoded image*/ + lv_draw_buf_t * decompressed; /*Decompressed data could be used directly, thus must also be draw buf*/ + lv_draw_buf_t c_array; /*An C-array image that need to be converted to a draw buf*/ + lv_draw_buf_t * decoded_partial; /*A draw buf for decoded image via get_area_cb*/ +} decoder_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc); +static void free_decoder_data(lv_image_decoder_dsc_t * dsc); +static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +#if LV_BIN_DECODER_RAM_LOAD + static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +#endif +static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, + int32_t w_px, const uint8_t * in, lv_color32_t * out); +static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br); + +static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the lvgl binary image decoder module + */ +void lv_bin_decoder_init(void) +{ + lv_image_decoder_t * decoder; + + decoder = lv_image_decoder_create(); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) { + LV_LOG_WARN("Out of memory"); + return; + } + + lv_image_decoder_set_info_cb(decoder, lv_bin_decoder_info); + lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open); + lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area); + lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close); + lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/ +} + +lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_image_src_t src_type = lv_image_src_get_type(src); + if(src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)src; + lv_memcpy(header, &image->header, sizeof(lv_image_header_t)); + } + else if(src_type == LV_IMAGE_SRC_FILE) { + /*Support only "*.bin" files*/ + if(lv_strcmp(lv_fs_get_ext(src), "bin")) return LV_RESULT_INVALID; + + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, src, LV_FS_MODE_RD); + if(res == LV_FS_RES_OK) { + uint32_t rn; + res = lv_fs_read(&f, header, sizeof(lv_image_header_t), &rn); + lv_fs_close(&f); + if(res != LV_FS_RES_OK || rn != sizeof(lv_image_header_t)) { + LV_LOG_WARN("Read file header failed: %d", res); + return LV_RESULT_INVALID; + } + + /** + * @todo + * This is a temp backward compatibility solution after adding + * magic in image header. + */ + if(header->magic != LV_IMAGE_HEADER_MAGIC) { + LV_LOG_WARN("Legacy bin image detected: %s", (char *)src); + header->cf = header->magic; + header->magic = LV_IMAGE_HEADER_MAGIC; + } + + /*File is always read to buf, thus data can be modified.*/ + header->flags |= LV_IMAGE_FLAGS_MODIFIABLE; + } + } + else if(src_type == LV_IMAGE_SRC_SYMBOL) { + /*The size depend on the font but it is unknown here. It should be handled outside of the + *function*/ + header->w = 1; + header->h = 1; + /*Symbols always have transparent parts. Important because of cover check in the draw + *function. The actual value doesn't matter because lv_draw_label will draw it*/ + header->cf = LV_COLOR_FORMAT_A8; + } + else { + LV_LOG_WARN("Image get info found unknown src type"); + return LV_RESULT_INVALID; + } + + /*For backward compatibility, all images are not premultiplied for now.*/ + if(header->magic != LV_IMAGE_HEADER_MAGIC) { + header->flags &= ~LV_IMAGE_FLAGS_PREMULTIPLIED; + } + + return LV_RESULT_OK; +} + +/** + * Decode an image from a binary file + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + lv_fs_res_t res = LV_RESULT_INVALID; + bool use_directly = false; /*If the image is already decoded and can be used directly*/ + + /*Open the file if it's a file*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + /*Support only "*.bin" files*/ + if(lv_strcmp(lv_fs_get_ext(dsc->src), "bin")) return LV_RESULT_INVALID; + + /*If the file was open successfully save the file descriptor*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + dsc->user_data = decoder_data; + lv_fs_file_t * f = lv_malloc(sizeof(*f)); + if(f == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + res = lv_fs_open(f, dsc->src, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("Open file failed: %d", res); + lv_free(f); + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + decoder_data->f = f; /*Now free_decoder_data will take care of the file*/ + + lv_color_format_t cf = dsc->header.cf; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + res = decode_compressed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + if(dsc->args.use_indexed) { + /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ + res = load_indexed(decoder, dsc); + } + else { + res = decode_indexed(decoder, dsc); + } + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + res = decode_alpha_only(decoder, dsc); + } +#if LV_BIN_DECODER_RAM_LOAD + else if(cf == LV_COLOR_FORMAT_ARGB8888 \ + || cf == LV_COLOR_FORMAT_XRGB8888 \ + || cf == LV_COLOR_FORMAT_RGB888 \ + || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_RGB565A8 \ + || cf == LV_COLOR_FORMAT_ARGB8565) { + res = decode_rgb(decoder, dsc); + } +#else + else { + /* decode them in get_area_cb */ + res = LV_RESULT_OK; + } +#endif + } + + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + /*The variables should have valid data*/ + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + if(image->data == NULL) { + return LV_RESULT_INVALID; + } + + lv_color_format_t cf = image->header.cf; + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + res = decode_compressed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + /*Need decoder data to store converted image*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + if(dsc->args.use_indexed) { + /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ + res = load_indexed(decoder, dsc); + use_directly = true; /*If draw unit supports indexed image, it can be used directly.*/ + } + else { + res = decode_indexed(decoder, dsc); + } + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + /*Alpha only image will need decoder data to store pointer to decoded image, to free it when decoder closes*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + res = decode_alpha_only(decoder, dsc); + } + else { + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + + decoder_data_t * decoder_data = get_decoder_data(dsc); + lv_draw_buf_t * decoded; + if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + decoded = (lv_draw_buf_t *)image; + } + else { + decoded = &decoder_data->c_array; + lv_draw_buf_from_image(decoded, image); + } + + dsc->decoded = decoded; + + if(decoded->header.stride == 0) { + /*Use the auto calculated value from decoder_info callback*/ + decoded->header.stride = dsc->header.stride; + } + + res = LV_RESULT_OK; + use_directly = true; /*A variable image that can be used directly.*/ + } + } + + if(res != LV_RESULT_OK) { + free_decoder_data(dsc); + return res; + } + + if(dsc->decoded == NULL) return LV_RESULT_OK; /*Need to read via get_area_cb*/ + + lv_draw_buf_t * decoded = (lv_draw_buf_t *)dsc->decoded; + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + use_directly = false; /*Cannot use original image directly*/ + free_decoder_data(dsc); + decoder_data_t * decoder_data = get_decoder_data(dsc); + decoder_data->decoded = adjusted; /*Now this new buffer need to be free'd on decoder close*/ + } + dsc->decoded = adjusted; + + if(use_directly || dsc->args.no_cache) return LV_RESULT_OK; /*Do not put image to cache if it can be used directly.*/ + +#if LV_CACHE_DEF_SIZE > 0 + + /*Add it to cache*/ + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = dsc->decoded->data_size; + + lv_cache_entry_t * cache_entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, dsc->user_data); + if(cache_entry == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + dsc->cache_entry = cache_entry; + decoder_data_t * decoder_data = get_decoder_data(dsc); + decoder_data->decoded = NULL; /*Cache will take care of it*/ +#endif + + return LV_RESULT_OK; +} + +void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data && decoder_data->decoded_partial) { + lv_draw_buf_destroy(decoder_data->decoded_partial); + decoder_data->decoded_partial = NULL; + } + + free_decoder_data(dsc); + + if(dsc->cache_entry) { + /*Decoded data is in cache, release it from cache's callback*/ + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); + } + +} + +lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_color_format_t cf = dsc->header.cf; + /*Check if cf is supported*/ + + bool supported = LV_COLOR_FORMAT_IS_INDEXED(cf) + || cf == LV_COLOR_FORMAT_ARGB8888 \ + || cf == LV_COLOR_FORMAT_XRGB8888 \ + || cf == LV_COLOR_FORMAT_RGB888 \ + || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_ARGB8565 \ + || cf == LV_COLOR_FORMAT_RGB565A8; + if(!supported) { + LV_LOG_WARN("CF: %d is not supported", cf); + return LV_RESULT_INVALID; + } + + lv_result_t res = LV_RESULT_INVALID; + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data == NULL) { + LV_LOG_ERROR("Unexpected null decoder data"); + return LV_RESULT_INVALID; + } + + lv_fs_file_t * f = decoder_data->f; + uint32_t bpp = lv_color_format_get_bpp(cf); + int32_t w_px = lv_area_get_width(full_area); + uint8_t * img_data = NULL; + lv_draw_buf_t * decoded = NULL; + uint32_t offset = dsc->src_type == LV_IMAGE_SRC_FILE ? sizeof(lv_image_header_t) : 0; /*Skip the image header*/ + + /*We only support read line by line for now*/ + if(decoded_area->y1 == LV_COORD_MIN) { + /*Indexed image is converted to ARGB888*/ + uint32_t len = LV_COLOR_FORMAT_IS_INDEXED(cf) ? sizeof(lv_color32_t) * 8 : bpp; + lv_color_format_t cf_decoded = LV_COLOR_FORMAT_IS_INDEXED(cf) ? LV_COLOR_FORMAT_ARGB8888 : cf; + + len = (len * w_px) / 8; + decoded = decoder_data->decoded_partial; + if(decoded && decoded->header.w == w_px) { + /*Use existing one directly*/ + } + else { + decoded = lv_draw_buf_create(w_px, 1, cf_decoded, LV_STRIDE_AUTO); + if(decoded == NULL) + return LV_RESULT_INVALID; + } + + *decoded_area = *full_area; + decoded_area->y2 = decoded_area->y1; + decoder_data->decoded_partial = decoded; /*Free on decoder close*/ + } + else { + decoded_area->y1++; + decoded_area->y2++; + decoded = decoder_data->decoded_partial; /*Already alloced*/ + } + + img_data = decoded->data; /*Get the buffer to operate on*/ + + if(decoded_area->y1 > full_area->y2) { + return LV_RESULT_INVALID; + } + + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + int32_t x_fraction = decoded_area->x1 % (8 / bpp); + uint32_t len = (w_px * bpp + 7) / 8 + 1; /*10px for 1bpp may across 3bytes*/ + uint8_t * buf = NULL; + + offset += dsc->palette_size * 4; /*Skip palette*/ + offset += decoded_area->y1 * dsc->header.stride; + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + buf = lv_malloc(len); + LV_ASSERT_NULL(buf); + if(buf == NULL) + return LV_RESULT_INVALID; + + res = fs_read_file_at(f, offset, buf, len, NULL); + if(res != LV_FS_RES_OK) { + lv_free(buf); + return LV_RESULT_INVALID; + } + } + else { + const lv_image_dsc_t * image = dsc->src; + buf = (void *)(image->data + offset); + } + + decode_indexed_line(cf, dsc->palette, x_fraction, w_px, buf, (lv_color32_t *)img_data); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)buf); + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + if(cf == LV_COLOR_FORMAT_ARGB8888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_RGB888 + || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_ARGB8565) { + uint32_t len = (w_px * bpp) / 8; + offset += decoded_area->y1 * dsc->header.stride; + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data, len, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + if(cf == LV_COLOR_FORMAT_RGB565A8) { + bpp = 16; /* RGB565 + A8 mask*/ + uint32_t len = decoded->header.stride; + offset += decoded_area->y1 * dsc->header.stride; /*Move to y1*/ + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data, len, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + /*Now the A8 mask*/ + offset = sizeof(lv_image_header_t); + offset += dsc->header.h * dsc->header.stride; /*Move to A8 map*/ + offset += decoded_area->y1 * (dsc->header.stride / 2); /*Move to y1*/ + offset += decoded_area->x1 * 1; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data + len, w_px * 1, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc) +{ + decoder_data_t * data = dsc->user_data; + if(data == NULL) { + data = lv_malloc_zeroed(sizeof(decoder_data_t)); + LV_ASSERT_MALLOC(data); + if(data == NULL) { + LV_LOG_ERROR("Out of memory"); + return NULL; + } + + dsc->user_data = data; + } + + return data; +} + +static void free_decoder_data(lv_image_decoder_dsc_t * dsc) +{ + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data == NULL) return; + + if(decoder_data->f) { + lv_fs_close(decoder_data->f); + lv_free(decoder_data->f); + } + + if(decoder_data->decoded) lv_draw_buf_destroy(decoder_data->decoded); + if(decoder_data->decompressed) lv_draw_buf_destroy(decoder_data->decompressed); + lv_free(decoder_data->palette); + lv_free(decoder_data); + dsc->user_data = NULL; +} + +static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_result_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + lv_fs_file_t * f = decoder_data->f; + lv_color_format_t cf = dsc->header.cf; + uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); + const lv_color32_t * palette; + const uint8_t * indexed_data = NULL; + lv_draw_buf_t * draw_buf_indexed = NULL; + uint32_t stride = dsc->header.stride; + + bool is_compressed = dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED; + if(is_compressed) { + uint8_t * data = decoder_data->decompressed->data; + palette = (lv_color32_t *)data; + indexed_data = data + palette_len; + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + /*read palette for indexed image*/ + palette = lv_malloc(palette_len); + LV_ASSERT_MALLOC(palette); + if(palette == NULL) { + LV_LOG_ERROR("Out of memory"); + return LV_RESULT_INVALID; + } + + res = fs_read_file_at(f, sizeof(lv_image_header_t), (uint8_t *)palette, palette_len, &rn); + if(res != LV_FS_RES_OK || rn != palette_len) { + LV_LOG_WARN("Read palette failed: %d", res); + lv_free((void *)palette); + return LV_RESULT_INVALID; + } + + decoder_data->palette = (void *)palette; /*Need to free when decoder closes*/ + +#if LV_BIN_DECODER_RAM_LOAD + draw_buf_indexed = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride); + if(draw_buf_indexed == NULL) { + LV_LOG_ERROR("Draw buffer alloc failed"); + goto exit_with_buf; + } + + indexed_data = draw_buf_indexed->data; + + uint32_t data_len = 0; + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get file to size"); + goto exit_with_buf; + } + + uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; + data_len -= data_offset; + res = fs_read_file_at(f, data_offset, (uint8_t *)indexed_data, data_len, &rn); + if(res != LV_FS_RES_OK || rn != data_len) { + LV_LOG_WARN("Read indexed image failed: %d", res); + goto exit_with_buf; + } +#endif + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + palette = (lv_color32_t *)image->data; + indexed_data = image->data + palette_len; + } + else { + return LV_RESULT_INVALID; + } + + dsc->palette = palette; + dsc->palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); + +#if LV_BIN_DECODER_RAM_LOAD + /*Convert to ARGB8888, since sw renderer cannot render it directly even it's in RAM*/ + lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_ARGB8888, + 0); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for indexed image"); + goto exit_with_buf; + } + + stride = decoded->header.stride; + uint8_t * img_data = decoded->data; + + const uint8_t * in = indexed_data; + uint8_t * out = img_data; + for(uint32_t y = 0; y < dsc->header.h; y++) { + decode_indexed_line(cf, dsc->palette, 0, dsc->header.w, in, (lv_color32_t *)out); + in += dsc->header.stride; + out += stride; + } + + dsc->decoded = decoded; + decoder_data->decoded = decoded; /*Free when decoder closes*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { + decoder_data->palette = (void *)palette; /*Free decoder data on close*/ + lv_draw_buf_destroy(draw_buf_indexed); + } + + return LV_RESULT_OK; +exit_with_buf: + if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { + lv_free((void *)palette); + decoder_data->palette = NULL; + } + + if(draw_buf_indexed) lv_draw_buf_destroy(draw_buf_indexed); + return LV_RESULT_INVALID; +#else + LV_UNUSED(stride); + LV_UNUSED(indexed_data); + LV_UNUSED(draw_buf_indexed); + /*It needs to be read by get_area_cb later*/ + return LV_RESULT_OK; +#endif +} + +static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ +#if LV_BIN_DECODER_RAM_LOAD == 0 + LV_UNUSED(decoder); /*Unused*/ + LV_UNUSED(dsc); /*Unused*/ + LV_LOG_ERROR("LV_BIN_DECODER_RAM_LOAD is disabled"); + return LV_RESULT_INVALID; +#else + + LV_UNUSED(decoder); /*Unused*/ + + lv_result_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + /*The decompressed image is already loaded to RAM*/ + dsc->decoded = decoder_data->decompressed; + + /*Transfer ownership to decoded pointer because it's the final data we use.*/ + decoder_data->decoded = decoder_data->decompressed; + decoder_data->decompressed = NULL; + return LV_RESULT_OK; + } + + if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + lv_draw_buf_t * decoded; + if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + decoded = (lv_draw_buf_t *)image; + } + else { + decoded = &decoder_data->c_array; + lv_draw_buf_from_image(decoded, image); + } + + dsc->decoded = decoded; + + if(decoded->header.stride == 0) { + /*Use the auto calculated value from decoder_info callback*/ + decoded->header.stride = dsc->header.stride; + } + + return LV_RESULT_OK; + } + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + lv_color_format_t cf = dsc->header.cf; + lv_fs_file_t * f = decoder_data->f; + lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride); + if(decoded == NULL) { + LV_LOG_ERROR("Draw buffer alloc failed"); + return LV_RESULT_INVALID; + } + + uint8_t * data = decoded->data; + uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); + res = fs_read_file_at(f, sizeof(lv_image_header_t), data, palette_len, &rn); + if(res != LV_FS_RES_OK || rn != palette_len) { + LV_LOG_WARN("Read palette failed: %d", res); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + uint32_t data_len = 0; + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get file to size"); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; + data_len -= data_offset; + data += palette_len; + res = fs_read_file_at(f, data_offset, data, data_len, &rn); + if(res != LV_FS_RES_OK || rn != data_len) { + LV_LOG_WARN("Read indexed image failed: %d", res); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + decoder_data->decoded = decoded; + dsc->decoded = decoded; + return LV_RESULT_OK; + } + + LV_LOG_ERROR("Unknown src type: %d", dsc->src_type); + return LV_RESULT_INVALID; +#endif +} + +#if LV_BIN_DECODER_RAM_LOAD +static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_result_t res; + decoder_data_t * decoder_data = dsc->user_data; + lv_fs_file_t * f = decoder_data->f; + lv_color_format_t cf = dsc->header.cf; + + uint32_t len = dsc->header.stride * dsc->header.h; + if(cf == LV_COLOR_FORMAT_RGB565A8) { + len += (dsc->header.stride / 2) * dsc->header.h; /*A8 mask*/ + } + + lv_draw_buf_t * decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, cf, dsc->header.stride); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for rgb file read"); + return LV_RESULT_INVALID; + } + + uint8_t * img_data = decoded->data; + + uint32_t rn; + res = fs_read_file_at(f, sizeof(lv_image_header_t), img_data, len, &rn); + if(res != LV_FS_RES_OK || rn != len) { + LV_LOG_WARN("Read rgb file failed: %d", res); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; + decoder_data->decoded = decoded; /*Free when decoder closes*/ + return LV_RESULT_OK; +} +#endif + +/** + * Extend A1/2/4 to A8 with interpolation to reduce rounding error. + */ +static inline uint8_t bit_extend(uint8_t value, uint8_t bpp) +{ + if(value == 0) return 0; + + uint8_t res = value; + uint8_t bpp_now = bpp; + while(bpp_now < 8) { + res |= value << (8 - bpp_now); + bpp_now += bpp; + }; + + return res; +} + +static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_result_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + uint8_t bpp = lv_color_format_get_bpp(dsc->header.cf); + uint32_t w = (dsc->header.stride * 8) / bpp; + uint32_t buf_stride = (w * 8 + 7) >> 3; /*stride for img_data*/ + uint32_t buf_len = w * dsc->header.h; /*always decode to A8 format*/ + lv_draw_buf_t * decoded; + uint32_t file_len = (uint32_t)dsc->header.stride * dsc->header.h; + + decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8, buf_stride); + if(decoded == NULL) { + LV_LOG_ERROR("Out of memory"); + return LV_RESULT_INVALID; + } + + uint8_t * img_data = decoded->data; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + /*Copy from image data*/ + lv_memcpy(img_data, decoder_data->decompressed->data, file_len); + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + res = fs_read_file_at(decoder_data->f, sizeof(lv_image_header_t), img_data, file_len, &rn); + if(res != LV_FS_RES_OK || rn != file_len) { + LV_LOG_WARN("Read header failed: %d", res); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + /*Copy from image data*/ + lv_memcpy(img_data, ((lv_image_dsc_t *)dsc->src)->data, file_len); + } + + if(dsc->header.cf != LV_COLOR_FORMAT_A8) { + /*Convert A1/2/4 to A8 from last pixel to first pixel*/ + uint8_t * in = img_data + file_len - 1; + uint8_t * out = img_data + buf_len - 1; + uint8_t mask = (1 << bpp) - 1; + uint8_t shift = 0; + for(uint32_t i = 0; i < buf_len; i++) { + /** + * Rounding error: + * Take bpp = 4 as example, alpha value of 0x0 to 0x0F should be + * mapped to 0x00 to 0xFF. Using below equation will give us 0x00 to 0xF0 + * thus causes error. We can simply interpolate the value to fix it. + * + * Equation: *out = ((*in >> shift) & mask) << (8 - bpp); + * Ideal: *out = ((*in >> shift) & mask) * 255 / ((1L << bpp) - 1) + */ + uint8_t value = ((*in >> shift) & mask); + *out = bit_extend(value, bpp); + shift += bpp; + if(shift >= 8) { + shift = 0; + in--; + } + out--; + } + } + + decoder_data->decoded = decoded; + dsc->decoded = decoded; + return LV_RESULT_OK; +} + +static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ +#if LV_BIN_DECODER_RAM_LOAD + uint32_t rn; + uint32_t len; + uint32_t compressed_len; + decoder_data_t * decoder_data = get_decoder_data(dsc); + lv_result_t res; + uint8_t * file_buf = NULL; + lv_image_compressed_t * compressed = &decoder_data->compressed; + + lv_memzero(compressed, sizeof(lv_image_compressed_t)); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + lv_fs_file_t * f = decoder_data->f; + + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &compressed_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get compressed file len"); + return LV_RESULT_INVALID; + } + + compressed_len -= sizeof(lv_image_header_t); + compressed_len -= 12; + + /*Read compress header*/ + len = 12; + res = fs_read_file_at(f, sizeof(lv_image_header_t), compressed, len, &rn); + if(res != LV_FS_RES_OK || rn != len) { + LV_LOG_WARN("Read compressed header failed: %d", res); + return LV_RESULT_INVALID; + } + + if(compressed->compressed_size != compressed_len) { + LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); + return LV_RESULT_INVALID; + } + + file_buf = lv_malloc(compressed_len); + if(file_buf == NULL) { + LV_LOG_WARN("No memory for compressed file"); + return LV_RESULT_INVALID; + + } + + /*Continue to read the compressed data following compression header*/ + res = lv_fs_read(f, file_buf, compressed_len, &rn); + if(res != LV_FS_RES_OK || rn != compressed_len) { + LV_LOG_WARN("Read compressed file failed: %d", res); + lv_free(file_buf); + return LV_RESULT_INVALID; + } + + /*Decompress the image*/ + compressed->data = file_buf; + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + compressed_len = image->data_size; + + /*Read compress header*/ + len = 12; + compressed_len -= len; + lv_memcpy(compressed, image->data, len); + compressed->data = image->data + len; + if(compressed->compressed_size != compressed_len) { + LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); + return LV_RESULT_INVALID; + } + } + else { + LV_LOG_WARN("Compressed image only support file or variable"); + return LV_RESULT_INVALID; + } + + res = decompress_image(dsc, compressed); + compressed->data = NULL; /*No need to store the data any more*/ + lv_free(file_buf); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Decompress failed"); + return LV_RESULT_INVALID; + } + + /*Depends on the cf, need to further decode image like an C-array image*/ + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + if(image->data == NULL) { + return LV_RESULT_INVALID; + } + + lv_color_format_t cf = dsc->header.cf; + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + if(dsc->args.use_indexed) res = load_indexed(decoder, dsc); + else res = decode_indexed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + res = decode_alpha_only(decoder, dsc); + } + else { + /*The decompressed data is the original image data.*/ + dsc->decoded = decoder_data->decompressed; + + /*Transfer ownership of decompressed to `decoded` since it can be used directly*/ + decoder_data->decoded = decoder_data->decompressed; + decoder_data->decompressed = NULL; + res = LV_RESULT_OK; + } + + return res; +#else + LV_UNUSED(decompress_image); + LV_UNUSED(decoder); + LV_UNUSED(dsc); + LV_LOG_ERROR("Need LV_BIN_DECODER_RAM_LOAD to be enabled"); + return LV_RESULT_INVALID; +#endif +} + +static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, + int32_t w_px, const uint8_t * in, lv_color32_t * out) +{ + uint8_t px_size; + uint16_t mask; + + int8_t shift = 0; + switch(color_format) { + case LV_COLOR_FORMAT_I1: + px_size = 1; + in += x / 8; /*8pixel per byte*/ + shift = 7 - (x & 0x7); + break; + case LV_COLOR_FORMAT_I2: + px_size = 2; + in += x / 4; /*4pixel per byte*/ + shift = 6 - 2 * (x & 0x3); + break; + case LV_COLOR_FORMAT_I4: + px_size = 4; + in += x / 2; /*2pixel per byte*/ + shift = 4 - 4 * (x & 0x1); + break; + case LV_COLOR_FORMAT_I8: + px_size = 8; + in += x; + shift = 0; + break; + default: + return LV_RESULT_INVALID; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + int32_t i; + for(i = 0; i < w_px; i++) { + uint8_t val_act = (*in >> shift) & mask; + out[i] = palette[val_act]; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + in++; + } + } + return LV_RESULT_OK; +} + +static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res; + if(br) *br = 0; + + res = lv_fs_seek(f, pos, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return res; + } + + res |= lv_fs_read(f, buff, btr, br); + if(res != LV_FS_RES_OK) { + return res; + } + + return LV_FS_RES_OK; +} + +static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed) +{ + /*Need to store decompressed data to decoder to free on close*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + uint8_t * img_data; + uint32_t out_len = compressed->decompressed_size; + uint32_t input_len = compressed->compressed_size; + LV_UNUSED(input_len); + LV_UNUSED(out_len); + + lv_draw_buf_t * decompressed = lv_draw_buf_create(dsc->header.w, dsc->header.h, dsc->header.cf, + dsc->header.stride); + if(decompressed == NULL) { + LV_LOG_WARN("No memory for decompressed image, input: %" LV_PRIu32 ", output: %" LV_PRIu32, input_len, out_len); + return LV_RESULT_INVALID; + } + + img_data = decompressed->data; + + if(compressed->method == LV_IMAGE_COMPRESS_RLE) { +#if LV_USE_RLE + /*Compress always happen on byte*/ + uint32_t pixel_byte; + if(dsc->header.cf == LV_COLOR_FORMAT_RGB565A8) + pixel_byte = 2; + else + pixel_byte = (lv_color_format_get_bpp(dsc->header.cf) + 7) >> 3; + const uint8_t * input = compressed->data; + uint8_t * output = img_data; + uint32_t len; + len = lv_rle_decompress(input, input_len, output, out_len, pixel_byte); + if(len != compressed->decompressed_size) { + LV_LOG_WARN("Decompress failed: %" LV_PRIu32 ", got: %" LV_PRIu32, out_len, len); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; + } +#else + LV_LOG_WARN("RLE decompress is not enabled"); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; +#endif + } + else if(compressed->method == LV_IMAGE_COMPRESS_LZ4) { +#if LV_USE_LZ4 + const char * input = (const char *)compressed->data; + char * output = (char *)img_data; + int len; + len = LZ4_decompress_safe(input, output, input_len, out_len); + if(len < 0 || (uint32_t)len != compressed->decompressed_size) { + LV_LOG_WARN("Decompress failed: %" LV_PRId32 ", got: %" LV_PRId32, out_len, len); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; + } +#else + LV_LOG_WARN("LZ4 decompress is not enabled"); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; +#endif + } + else { + LV_UNUSED(img_data); + LV_LOG_WARN("Unknown compression method: %d", compressed->method); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; + } + + decoder_data->decompressed = decompressed; /*Free on decoder close*/ + return LV_RESULT_OK; +} diff --git a/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.h b/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.h new file mode 100644 index 0000000..2966dac --- /dev/null +++ b/libraries/lvgl/src/libs/bin_decoder/lv_bin_decoder.h @@ -0,0 +1,70 @@ +/** + * @file lv_bin_decoder.h + * + */ + +#ifndef LV_BIN_DECODER_H +#define LV_BIN_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the binary image decoder module + */ +void lv_bin_decoder_init(void); + +/** + * Get info about a lvgl binary image + * @param decoder the decoder where this function belongs + * @param src the image source: pointer to an `lv_image_dsc_t` variable, a file path or a symbol + * @param header store the image data here + * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. + */ +lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); + +lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +/** + * Open a lvgl binary image + * @param decoder the decoder where this function belongs + * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. + * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. + */ +lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIN_DECODER_H*/ diff --git a/libraries/lvgl/src/libs/bmp/lv_bmp.c b/libraries/lvgl/src/libs/bmp/lv_bmp.c new file mode 100644 index 0000000..c36f2cc --- /dev/null +++ b/libraries/lvgl/src/libs/bmp/lv_bmp.c @@ -0,0 +1,235 @@ +/** + * @file lv_bmp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_BMP + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_fs_file_t f; + unsigned int px_offset; + int px_width; + int px_height; + unsigned int bpp; + int row_size_bytes; +} bmp_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_bmp_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_get_area_cb(dec, decoder_get_area); + lv_image_decoder_set_close_cb(dec, decoder_close); +} + +void lv_bmp_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a BMP image + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + lv_image_src_t src_type = lv_image_src_get_type(src); /*Get the source type*/ + + /*If it's a BMP file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + if(lv_strcmp(lv_fs_get_ext(fn), "bmp") == 0) { /*Check the extension*/ + /*Save the data in the header*/ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, src, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + uint8_t headers[54]; + + lv_fs_read(&f, headers, 54, NULL); + uint32_t w; + uint32_t h; + lv_memcpy(&w, headers + 18, 4); + lv_memcpy(&h, headers + 22, 4); + header->w = w; + header->h = h; + lv_fs_close(&f); + + uint16_t bpp; + lv_memcpy(&bpp, headers + 28, 2); + switch(bpp) { + case 16: + header->cf = LV_COLOR_FORMAT_RGB565; + break; + case 24: + header->cf = LV_COLOR_FORMAT_RGB888; + break; + case 32: + header->cf = LV_COLOR_FORMAT_ARGB8888; + break; + default: + LV_LOG_WARN("Not supported bpp: %d", bpp); + return LV_RESULT_OK; + } + return LV_RESULT_OK; + } + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(src_type == LV_IMAGE_SRC_VARIABLE) { + return LV_RESULT_INVALID; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a BMP image and return the decided image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + /*If it's a BMP file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + + if(lv_strcmp(lv_fs_get_ext(fn), "bmp") != 0) { + return LV_RESULT_INVALID; /*Check the extension*/ + } + + bmp_dsc_t b; + lv_memset(&b, 0x00, sizeof(b)); + + lv_fs_res_t res = lv_fs_open(&b.f, dsc->src, LV_FS_MODE_RD); + if(res == LV_RESULT_OK) return LV_RESULT_INVALID; + + uint8_t header[54]; + lv_fs_read(&b.f, header, 54, NULL); + + if(0x42 != header[0] || 0x4d != header[1]) { + lv_fs_close(&b.f); + return LV_RESULT_INVALID; + } + + lv_memcpy(&b.px_offset, header + 10, 4); + lv_memcpy(&b.px_width, header + 18, 4); + lv_memcpy(&b.px_height, header + 22, 4); + lv_memcpy(&b.bpp, header + 28, 2); + b.row_size_bytes = ((b.bpp * b.px_width + 31) / 32) * 4; + + dsc->user_data = lv_malloc(sizeof(bmp_dsc_t)); + LV_ASSERT_MALLOC(dsc->user_data); + if(dsc->user_data == NULL) return LV_RESULT_INVALID; + lv_memcpy(dsc->user_data, &b, sizeof(b)); + return LV_RESULT_OK; + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + return LV_RESULT_INVALID; + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); + bmp_dsc_t * b = dsc->user_data; + lv_draw_buf_t * decoded = (void *)dsc->decoded; + + if(decoded_area->y1 == LV_COORD_MIN) { + *decoded_area = *full_area; + decoded_area->y2 = decoded_area->y1; + if(decoded == NULL) decoded = lv_draw_buf_create(lv_area_get_width(full_area), 1, dsc->header.cf, LV_STRIDE_AUTO); + dsc->decoded = decoded; + } + else { + decoded_area->y1++; + decoded_area->y2++; + } + + if(decoded_area->y1 > full_area->y2) { + return LV_RESULT_INVALID; + } + else { + int32_t y = (b->px_height - 1) - (decoded_area->y1); /*BMP images are stored upside down*/ + uint32_t p = b->px_offset + b->row_size_bytes * y; + p += (decoded_area->x1) * (b->bpp / 8); + lv_fs_seek(&b->f, p, LV_FS_SEEK_SET); + uint32_t line_width_byte = lv_area_get_width(full_area) * (b->bpp / 8); + lv_fs_read(&b->f, decoded->data, line_width_byte, NULL); + + return LV_RESULT_OK; + } +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + bmp_dsc_t * b = dsc->user_data; + lv_fs_close(&b->f); + lv_free(dsc->user_data); + if(dsc->decoded) lv_draw_buf_destroy((void *)dsc->decoded); + +} + +#endif /*LV_USE_BMP*/ diff --git a/libraries/lvgl/src/libs/bmp/lv_bmp.h b/libraries/lvgl/src/libs/bmp/lv_bmp.h new file mode 100644 index 0000000..a7dbe27 --- /dev/null +++ b/libraries/lvgl/src/libs/bmp/lv_bmp.h @@ -0,0 +1,43 @@ +/** + * @file lv_bmp.h + * + */ + +#ifndef LV_BMP_H +#define LV_BMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_BMP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_bmp_init(void); +void lv_bmp_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BMP*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BMP_H*/ diff --git a/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.c b/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.c new file mode 100644 index 0000000..29d6749 --- /dev/null +++ b/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.c @@ -0,0 +1,860 @@ +/** + * @file lv_ffmpeg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ffmpeg.h" +#if LV_USE_FFMPEG != 0 + +#include +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_DEPTH == 8 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB8 +#elif LV_COLOR_DEPTH == 16 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB565LE +#elif LV_COLOR_DEPTH == 32 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_BGR0 +#else + #error Unsupported LV_COLOR_DEPTH +#endif + +#define MY_CLASS (&lv_ffmpeg_player_class) + +#define FRAME_DEF_REFR_PERIOD 33 /*[ms]*/ + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s { + AVFormatContext * fmt_ctx; + AVCodecContext * video_dec_ctx; + AVStream * video_stream; + uint8_t * video_src_data[4]; + uint8_t * video_dst_data[4]; + struct SwsContext * sws_ctx; + AVFrame * frame; + AVPacket * pkt; + int video_stream_idx; + int video_src_linesize[4]; + int video_dst_linesize[4]; + enum AVPixelFormat video_dst_pix_fmt; + bool has_alpha; + lv_draw_buf_t draw_buf; +}; + +#pragma pack(1) + +struct lv_image_pixel_color_s { + lv_color_t c; + uint8_t alpha; +}; + +#pragma pack() + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); + +static struct ffmpeg_context_s * ffmpeg_open_file(const char * path); +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_get_image_header(const char * path, lv_image_header_t * header); +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx); +static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt); +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt); + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_ffmpeg_player_class = { + .constructor_cb = lv_ffmpeg_player_constructor, + .destructor_cb = lv_ffmpeg_player_destructor, + .instance_size = sizeof(lv_ffmpeg_player_t), + .base_class = &lv_image_class, + .name = "ffmpeg-player", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_ffmpeg_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + +#if LV_FFMPEG_AV_DUMP_FORMAT == 0 + av_log_set_level(AV_LOG_QUIET); +#endif +} + +int lv_ffmpeg_get_frame_num(const char * path) +{ + int ret = -1; + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); + + if(ffmpeg_ctx) { + ret = ffmpeg_ctx->video_stream->nb_frames; + ffmpeg_close(ffmpeg_ctx); + } + + return ret; +} + +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_result_t res = LV_RESULT_INVALID; + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->ffmpeg_ctx) { + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + } + + lv_timer_pause(player->timer); + + player->ffmpeg_ctx = ffmpeg_open_file(path); + + if(!player->ffmpeg_ctx) { + LV_LOG_ERROR("ffmpeg file open failed: %s", path); + goto failed; + } + + if(ffmpeg_image_allocate(player->ffmpeg_ctx) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(player->ffmpeg_ctx); + goto failed; + } + + bool has_alpha = player->ffmpeg_ctx->has_alpha; + int width = player->ffmpeg_ctx->video_dec_ctx->width; + int height = player->ffmpeg_ctx->video_dec_ctx->height; + uint32_t data_size = 0; + + data_size = width * height * 4; + + player->imgdsc.header.w = width; + player->imgdsc.header.h = height; + player->imgdsc.data_size = data_size; + player->imgdsc.header.cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; + player->imgdsc.header.stride = width * lv_color_format_get_size(player->imgdsc.header.cf); + player->imgdsc.data = ffmpeg_get_image_data(player->ffmpeg_ctx); + + lv_image_set_src(&player->img.obj, &(player->imgdsc)); + + int period = ffmpeg_get_frame_refr_period(player->ffmpeg_ctx); + + if(period > 0) { + LV_LOG_INFO("frame refresh period = %d ms, rate = %d fps", + period, 1000 / period); + lv_timer_set_period(player->timer, period); + } + else { + LV_LOG_WARN("unable to get frame refresh period"); + } + + res = LV_RESULT_OK; + +failed: + return res; +} + +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + LV_LOG_ERROR("ffmpeg_ctx is NULL"); + return; + } + + lv_timer_t * timer = player->timer; + + switch(cmd) { + case LV_FFMPEG_PLAYER_CMD_START: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player start"); + break; + case LV_FFMPEG_PLAYER_CMD_STOP: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player stop"); + break; + case LV_FFMPEG_PLAYER_CMD_PAUSE: + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player pause"); + break; + case LV_FFMPEG_PLAYER_CMD_RESUME: + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player resume"); + break; + default: + LV_LOG_ERROR("Error cmd: %d", cmd); + break; + } +} + +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + player->auto_restart = en; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + /* Get the source type */ + lv_image_src_t src_type = lv_image_src_get_type(src); + + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + + if(ffmpeg_get_image_header(fn, header) < 0) { + LV_LOG_ERROR("ffmpeg can't get image header"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + } + + /* If didn't succeeded earlier then it's an error */ + return LV_RESULT_INVALID; +} + +/** + * Decode an image using ffmpeg library + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * path = dsc->src; + + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path); + + if(ffmpeg_ctx == NULL) { + return LV_RESULT_INVALID; + } + + if(ffmpeg_image_allocate(ffmpeg_ctx) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(ffmpeg_ctx); + return LV_RESULT_INVALID; + } + + if(ffmpeg_update_next_frame(ffmpeg_ctx) < 0) { + ffmpeg_close(ffmpeg_ctx); + LV_LOG_ERROR("ffmpeg update frame failed"); + return LV_RESULT_INVALID; + } + + ffmpeg_close_src_ctx(ffmpeg_ctx); + uint8_t * img_data = ffmpeg_get_image_data(ffmpeg_ctx); + + dsc->user_data = ffmpeg_ctx; + lv_draw_buf_t * decoded = &ffmpeg_ctx->draw_buf; + decoded->header = dsc->header; + decoded->header.flags |= LV_IMAGE_FLAGS_MODIFIABLE; + decoded->data = img_data; + decoded->data_size = (uint32_t)dsc->header.stride * dsc->header.h; + decoded->unaligned_data = NULL; + dsc->decoded = decoded; + + /* The image is fully decoded. Return with its pointer */ + return LV_RESULT_OK; + } + + /* If not returned earlier then it failed */ + return LV_RESULT_INVALID; +} + +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + struct ffmpeg_context_s * ffmpeg_ctx = dsc->user_data; + ffmpeg_close(ffmpeg_ctx); +} + +static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx) +{ + uint8_t * img_data = ffmpeg_ctx->video_dst_data[0]; + + if(img_data == NULL) { + LV_LOG_ERROR("ffmpeg video dst data is NULL"); + } + + return img_data; +} + +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + if(pix_fmt == AV_PIX_FMT_PAL8) { + return true; + } + + return desc->flags & AV_PIX_FMT_FLAG_ALPHA; +} + +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2; +} + +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = -1; + + int width = ffmpeg_ctx->video_dec_ctx->width; + int height = ffmpeg_ctx->video_dec_ctx->height; + AVFrame * frame = ffmpeg_ctx->frame; + + if(frame->width != width + || frame->height != height + || frame->format != ffmpeg_ctx->video_dec_ctx->pix_fmt) { + + /* To handle this change, one could call av_image_alloc again and + * decode the following frames into another rawvideo file. + */ + LV_LOG_ERROR("Width, height and pixel format have to be " + "constant in a rawvideo file, but the width, height or " + "pixel format of the input video changed:\n" + "old: width = %d, height = %d, format = %s\n" + "new: width = %d, height = %d, format = %s\n", + width, + height, + av_get_pix_fmt_name(ffmpeg_ctx->video_dec_ctx->pix_fmt), + frame->width, frame->height, + av_get_pix_fmt_name(frame->format)); + goto failed; + } + + LV_LOG_TRACE("video_frame coded_n:%d", frame->coded_picture_number); + + /* copy decoded frame to destination buffer: + * this is required since rawvideo expects non aligned data + */ + av_image_copy(ffmpeg_ctx->video_src_data, ffmpeg_ctx->video_src_linesize, + (const uint8_t **)(frame->data), frame->linesize, + ffmpeg_ctx->video_dec_ctx->pix_fmt, width, height); + + if(ffmpeg_ctx->sws_ctx == NULL) { + int swsFlags = SWS_BILINEAR; + + if(ffmpeg_pix_fmt_is_yuv(ffmpeg_ctx->video_dec_ctx->pix_fmt)) { + + /* When the video width and height are not multiples of 8, + * and there is no size change in the conversion, + * a blurry screen will appear on the right side + * This problem was discovered in 2012 and + * continues to exist in version 4.1.3 in 2019 + * This problem can be avoided by increasing SWS_ACCURATE_RND + */ + if((width & 0x7) || (height & 0x7)) { + LV_LOG_WARN("The width(%d) and height(%d) the image " + "is not a multiple of 8, " + "the decoding speed may be reduced", + width, height); + swsFlags |= SWS_ACCURATE_RND; + } + } + + ffmpeg_ctx->sws_ctx = sws_getContext( + width, height, ffmpeg_ctx->video_dec_ctx->pix_fmt, + width, height, ffmpeg_ctx->video_dst_pix_fmt, + swsFlags, + NULL, NULL, NULL); + } + + if(!ffmpeg_ctx->has_alpha) { + int lv_linesize = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE) * width; + int dst_linesize = ffmpeg_ctx->video_dst_linesize[0]; + if(dst_linesize != lv_linesize) { + LV_LOG_WARN("ffmpeg linesize = %d, but lvgl image require %d", + dst_linesize, + lv_linesize); + ffmpeg_ctx->video_dst_linesize[0] = lv_linesize; + } + } + + ret = sws_scale( + ffmpeg_ctx->sws_ctx, + (const uint8_t * const *)(ffmpeg_ctx->video_src_data), + ffmpeg_ctx->video_src_linesize, + 0, + height, + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize); + +failed: + return ret; +} + +static int ffmpeg_decode_packet(AVCodecContext * dec, const AVPacket * pkt, + struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + /* submit the packet to the decoder */ + ret = avcodec_send_packet(dec, pkt); + if(ret < 0) { + LV_LOG_ERROR("Error submitting a packet for decoding (%s)", + av_err2str(ret)); + return ret; + } + + /* get all the available frames from the decoder */ + while(ret >= 0) { + ret = avcodec_receive_frame(dec, ffmpeg_ctx->frame); + if(ret < 0) { + + /* those two return values are special and mean there is + * no output frame available, + * but there were no errors during decoding + */ + if(ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { + return 0; + } + + LV_LOG_ERROR("Error during decoding (%s)", av_err2str(ret)); + return ret; + } + + /* write the frame data to output file */ + if(dec->codec->type == AVMEDIA_TYPE_VIDEO) { + ret = ffmpeg_output_video_frame(ffmpeg_ctx); + } + + av_frame_unref(ffmpeg_ctx->frame); + if(ret < 0) { + LV_LOG_WARN("ffmpeg_decode_packet ended %d", ret); + return ret; + } + } + + return 0; +} + +static int ffmpeg_open_codec_context(int * stream_idx, + AVCodecContext ** dec_ctx, AVFormatContext * fmt_ctx, + enum AVMediaType type) +{ + int ret; + int stream_index; + AVStream * st; + const AVCodec * dec = NULL; + AVDictionary * opts = NULL; + + ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); + if(ret < 0) { + LV_LOG_ERROR("Could not find %s stream in input file", + av_get_media_type_string(type)); + return ret; + } + else { + stream_index = ret; + st = fmt_ctx->streams[stream_index]; + + /* find decoder for the stream */ + dec = avcodec_find_decoder(st->codecpar->codec_id); + if(dec == NULL) { + LV_LOG_ERROR("Failed to find %s codec", + av_get_media_type_string(type)); + return AVERROR(EINVAL); + } + + /* Allocate a codec context for the decoder */ + *dec_ctx = avcodec_alloc_context3(dec); + if(*dec_ctx == NULL) { + LV_LOG_ERROR("Failed to allocate the %s codec context", + av_get_media_type_string(type)); + return AVERROR(ENOMEM); + } + + /* Copy codec parameters from input stream to output codec context */ + if((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) { + LV_LOG_ERROR( + "Failed to copy %s codec parameters to decoder context", + av_get_media_type_string(type)); + return ret; + } + + /* Init the decoders */ + if((ret = avcodec_open2(*dec_ctx, dec, &opts)) < 0) { + LV_LOG_ERROR("Failed to open %s codec", + av_get_media_type_string(type)); + return ret; + } + + *stream_idx = stream_index; + } + + return 0; +} + +static int ffmpeg_get_image_header(const char * filepath, + lv_image_header_t * header) +{ + int ret = -1; + + AVFormatContext * fmt_ctx = NULL; + AVCodecContext * video_dec_ctx = NULL; + int video_stream_idx; + + /* open input file, and allocate format context */ + if(avformat_open_input(&fmt_ctx, filepath, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", filepath); + goto failed; + } + + /* retrieve stream information */ + if(avformat_find_stream_info(fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context(&video_stream_idx, &video_dec_ctx, + fmt_ctx, AVMEDIA_TYPE_VIDEO) + >= 0) { + bool has_alpha = ffmpeg_pix_fmt_has_alpha(video_dec_ctx->pix_fmt); + + /* allocate image where the decoded image will be put */ + header->w = video_dec_ctx->width; + header->h = video_dec_ctx->height; + header->cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; + header->stride = header->w * lv_color_format_get_size(header->cf); + + ret = 0; + } + +failed: + avcodec_free_context(&video_dec_ctx); + avformat_close_input(&fmt_ctx); + + return ret; +} + +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int avg_frame_rate_num = ffmpeg_ctx->video_stream->avg_frame_rate.num; + if(avg_frame_rate_num > 0) { + int period = 1000 * (int64_t)ffmpeg_ctx->video_stream->avg_frame_rate.den + / avg_frame_rate_num; + return period; + } + + return -1; +} + +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + while(1) { + + /* read frames from the file */ + if(av_read_frame(ffmpeg_ctx->fmt_ctx, ffmpeg_ctx->pkt) >= 0) { + bool is_image = false; + + /* check if the packet belongs to a stream we are interested in, + * otherwise skip it + */ + if(ffmpeg_ctx->pkt->stream_index == ffmpeg_ctx->video_stream_idx) { + ret = ffmpeg_decode_packet(ffmpeg_ctx->video_dec_ctx, + ffmpeg_ctx->pkt, ffmpeg_ctx); + is_image = true; + } + + av_packet_unref(ffmpeg_ctx->pkt); + + if(ret < 0) { + LV_LOG_WARN("video frame is empty %d", ret); + break; + } + + /* Used to filter data that is not an image */ + if(is_image) { + break; + } + } + else { + ret = -1; + break; + } + } + + return ret; +} + +struct ffmpeg_context_s * ffmpeg_open_file(const char * path) +{ + if(path == NULL || lv_strlen(path) == 0) { + LV_LOG_ERROR("file path is empty"); + return NULL; + } + + struct ffmpeg_context_s * ffmpeg_ctx = calloc(1, sizeof(struct ffmpeg_context_s)); + + if(ffmpeg_ctx == NULL) { + LV_LOG_ERROR("ffmpeg_ctx malloc failed"); + goto failed; + } + + /* open input file, and allocate format context */ + + if(avformat_open_input(&(ffmpeg_ctx->fmt_ctx), path, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", path); + goto failed; + } + + /* retrieve stream information */ + + if(avformat_find_stream_info(ffmpeg_ctx->fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context( + &(ffmpeg_ctx->video_stream_idx), + &(ffmpeg_ctx->video_dec_ctx), + ffmpeg_ctx->fmt_ctx, AVMEDIA_TYPE_VIDEO) + >= 0) { + ffmpeg_ctx->video_stream = ffmpeg_ctx->fmt_ctx->streams[ffmpeg_ctx->video_stream_idx]; + + ffmpeg_ctx->has_alpha = ffmpeg_pix_fmt_has_alpha(ffmpeg_ctx->video_dec_ctx->pix_fmt); + + ffmpeg_ctx->video_dst_pix_fmt = (ffmpeg_ctx->has_alpha ? AV_PIX_FMT_BGRA : AV_PIX_FMT_TRUE_COLOR); + } + +#if LV_FFMPEG_AV_DUMP_FORMAT != 0 + /* dump input information to stderr */ + av_dump_format(ffmpeg_ctx->fmt_ctx, 0, path, 0); +#endif + + if(ffmpeg_ctx->video_stream == NULL) { + LV_LOG_ERROR("Could not find video stream in the input, aborting"); + goto failed; + } + + return ffmpeg_ctx; + +failed: + ffmpeg_close(ffmpeg_ctx); + return NULL; +} + +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret; + + /* allocate image where the decoded image will be put */ + ret = av_image_alloc( + ffmpeg_ctx->video_src_data, + ffmpeg_ctx->video_src_linesize, + ffmpeg_ctx->video_dec_ctx->width, + ffmpeg_ctx->video_dec_ctx->height, + ffmpeg_ctx->video_dec_ctx->pix_fmt, + 4); + + if(ret < 0) { + LV_LOG_ERROR("Could not allocate src raw video buffer"); + return ret; + } + + LV_LOG_INFO("alloc video_src_bufsize = %d", ret); + + ret = av_image_alloc( + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize, + ffmpeg_ctx->video_dec_ctx->width, + ffmpeg_ctx->video_dec_ctx->height, + ffmpeg_ctx->video_dst_pix_fmt, + 4); + + if(ret < 0) { + LV_LOG_ERROR("Could not allocate dst raw video buffer"); + return ret; + } + + LV_LOG_INFO("allocate video_dst_bufsize = %d", ret); + + ffmpeg_ctx->frame = av_frame_alloc(); + + if(ffmpeg_ctx->frame == NULL) { + LV_LOG_ERROR("Could not allocate frame"); + return -1; + } + + /* allocate packet, set data to NULL, let the demuxer fill it */ + + ffmpeg_ctx->pkt = av_packet_alloc(); + if(ffmpeg_ctx->pkt == NULL) { + LV_LOG_ERROR("av_packet_alloc failed"); + return -1; + } + ffmpeg_ctx->pkt->data = NULL; + ffmpeg_ctx->pkt->size = 0; + + return 0; +} + +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + avcodec_free_context(&(ffmpeg_ctx->video_dec_ctx)); + avformat_close_input(&(ffmpeg_ctx->fmt_ctx)); + av_frame_free(&(ffmpeg_ctx->frame)); + if(ffmpeg_ctx->video_src_data[0] != NULL) { + av_free(ffmpeg_ctx->video_src_data[0]); + ffmpeg_ctx->video_src_data[0] = NULL; + } +} + +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx->video_dst_data[0] != NULL) { + av_free(ffmpeg_ctx->video_dst_data[0]); + ffmpeg_ctx->video_dst_data[0] = NULL; + } +} + +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx == NULL) { + LV_LOG_WARN("ffmpeg_ctx is NULL"); + return; + } + + sws_freeContext(ffmpeg_ctx->sws_ctx); + ffmpeg_close_src_ctx(ffmpeg_ctx); + ffmpeg_close_dst_ctx(ffmpeg_ctx); + free(ffmpeg_ctx); + + LV_LOG_INFO("ffmpeg_ctx closed"); +} + +static void lv_ffmpeg_player_frame_update_cb(lv_timer_t * timer) +{ + lv_obj_t * obj = (lv_obj_t *)timer->user_data; + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + return; + } + + int has_next = ffmpeg_update_next_frame(player->ffmpeg_ctx); + + if(has_next < 0) { + lv_ffmpeg_player_set_cmd(obj, player->auto_restart ? LV_FFMPEG_PLAYER_CMD_START : LV_FFMPEG_PLAYER_CMD_STOP); + return; + } + + lv_image_cache_drop(lv_image_get_src(obj)); + + lv_obj_invalidate(obj); +} + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + player->auto_restart = false; + player->ffmpeg_ctx = NULL; + player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb, + FRAME_DEF_REFR_PERIOD, obj); + lv_timer_pause(player->timer); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->timer) { + lv_timer_delete(player->timer); + player->timer = NULL; + } + + lv_image_cache_drop(lv_image_get_src(obj)); + + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif /*LV_USE_FFMPEG*/ diff --git a/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.h b/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.h new file mode 100644 index 0000000..51203e5 --- /dev/null +++ b/libraries/lvgl/src/libs/ffmpeg/lv_ffmpeg.h @@ -0,0 +1,105 @@ +/** + * @file lv_ffmpeg.h + * + */ +#ifndef LV_FFMPEG_H +#define LV_FFMPEG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../widgets/image/lv_image.h" +#if LV_USE_FFMPEG != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_ffmpeg_player_class; + +typedef struct { + lv_image_t img; + lv_timer_t * timer; + lv_image_dsc_t imgdsc; + bool auto_restart; + struct ffmpeg_context_s * ffmpeg_ctx; +} lv_ffmpeg_player_t; + +typedef enum { + LV_FFMPEG_PLAYER_CMD_START, + LV_FFMPEG_PLAYER_CMD_STOP, + LV_FFMPEG_PLAYER_CMD_PAUSE, + LV_FFMPEG_PLAYER_CMD_RESUME, + _LV_FFMPEG_PLAYER_CMD_LAST +} lv_ffmpeg_player_cmd_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register FFMPEG image decoder + */ +void lv_ffmpeg_init(void); + +/** + * Get the number of frames contained in the file + * @param path image or video file name + * @return Number of frames, less than 0 means failed + */ +int lv_ffmpeg_get_frame_num(const char * path); + +/** + * Create ffmpeg_player object + * @param parent pointer to an object, it will be the parent of the new player + * @return pointer to the created ffmpeg_player + */ +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent); + +/** + * Set the path of the file to be played + * @param obj pointer to a ffmpeg_player object + * @param path video file path + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info. + */ +lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path); + +/** + * Set command control video player + * @param obj pointer to a ffmpeg_player object + * @param cmd control commands + */ +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd); + +/** + * Set the video to automatically replay + * @param obj pointer to a ffmpeg_player object + * @param en true: enable the auto restart + */ +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FFMPEG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FFMPEG_H*/ diff --git a/libraries/lvgl/src/libs/freetype/arial.ttf b/libraries/lvgl/src/libs/freetype/arial.ttf new file mode 100644 index 0000000..886789b Binary files /dev/null and b/libraries/lvgl/src/libs/freetype/arial.ttf differ diff --git a/libraries/lvgl/src/libs/freetype/ftmodule.h b/libraries/lvgl/src/libs/freetype/ftmodule.h new file mode 100644 index 0000000..b804b6e --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/ftmodule.h @@ -0,0 +1,33 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/`) based on information + * from `/modules.cfg`. + * + * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile + * FreeType without GNU make. + * + */ + +/* FT_USE_MODULE( FT_Module_Class, autofit_module_class ) */ +FT_USE_MODULE(FT_Driver_ClassRec, tt_driver_class) +/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ +/* FT_USE_MODULE( FT_Module_Class, psaux_module_class ) */ +/* FT_USE_MODULE( FT_Module_Class, psnames_module_class ) */ +/* FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) */ +FT_USE_MODULE(FT_Module_Class, sfnt_module_class) +FT_USE_MODULE(FT_Renderer_Class, ft_smooth_renderer_class) +/* FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_bitmap_sdf_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_svg_renderer_class ) */ + +/* EOF */ diff --git a/libraries/lvgl/src/libs/freetype/ftoption.h b/libraries/lvgl/src/libs/freetype/ftoption.h new file mode 100644 index 0000000..141278b --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/ftoption.h @@ -0,0 +1,964 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2022 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + +#include + +FT_BEGIN_HEADER + +/************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + +/************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * When this macro is not defined, FreeType offers alternative LCD + * rendering technology that produces excellent output. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + +/************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + +/************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + +/************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + +/************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + +/************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + +/************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + * + * If you use the GNU make build system directly (that is, without the + * `configure` script) and you define this macro, you also have to pass + * `SYSTEM_ZLIB=yes` as an argument to make. + */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + +/************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + +/************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +/************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_PNG */ + +/************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + +/************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BROTLI */ + +/************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + +/************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +/************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +/* #define FT_CONFIG_OPTION_MAC_FONTS */ + +/************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS + #define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + +/************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + +/************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + +/************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + +/************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + +/************************************************************************** + * + * Logging + * + * Compiling FreeType in debug or trace mode makes FreeType write error + * and trace log messages to `stderr`. Enabling this macro + * automatically forces the `FT_DEBUG_LEVEL_ERROR` and + * `FT_DEBUG_LEVEL_TRACE` macros and allows FreeType to write error and + * trace log messages to a file instead of `stderr`. For writing logs + * to a file, FreeType uses an the external `dlg` library (the source + * code is in `src/dlg`). + * + * This option needs a C99 compiler. + */ +/* #define FT_DEBUG_LOGGING */ + +/************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * _af_debug_disable_horz_hints + * _af_debug_disable_vert_hints + * _af_debug_disable_blue_hints + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * _af_debug_hints + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + +/************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + +/************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +/************************************************************************** + * + * OpenType SVG Glyph Support + * + * Setting this macro enables support for OpenType SVG glyphs. By + * default, FreeType can only fetch SVG documents. However, it can also + * render them if external rendering hook functions are plugged in at + * runtime. + * + * More details on the hooks can be found in file `otsvg.h`. + */ +#define FT_CONFIG_OPTION_SVG + +/************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +#define FT_CONFIG_OPTION_ERROR_STRINGS + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** S F N T D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. + * + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + +/************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on the LEAN option. + * + * There are three possible values. + * + * Value 1: + * This value is associated with the 'Infinality' moniker, contributed by + * an individual nicknamed Infinality with the goal of making TrueType + * fonts render better than on Windows. A high amount of configurability + * and flexibility, down to rules for single glyphs in fonts, but also + * very slow. Its experimental and slow nature and the original + * developer losing interest meant that this option was never enabled in + * default builds. + * + * The corresponding interpreter version is v38. + * + * Value 2: + * The new default mode for the TrueType driver. The Infinality code + * base was stripped to the bare minimum and all configurability removed + * in the name of speed and simplicity. The configurability was mainly + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean + * black-and-white bitmaps. The new mode focuses on applying a minimal + * set of rules to all fonts indiscriminately so that modern and web + * fonts render well while legacy fonts render okay. + * + * The corresponding interpreter version is v40. + * + * Value 3: + * Compile both, making both v38 and v40 available (the latter is the + * default). + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + +/************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES + #define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + +/************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + +/************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + +/************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + +/************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + +/************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** C F F D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + +/************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** P C F D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + +/************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. + */ +#ifdef AF_CONFIG_OPTION_CJK + #define AF_CONFIG_OPTION_INDIC +#endif + +/************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + +/* */ + +/* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + +/* + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + #define TT_USE_BYTECODE_INTERPRETER + + #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING + #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 + #define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + #endif + + #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 + #define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + #endif + #endif +#endif + +/* + * The TT_SUPPORT_COLRV1 macro is defined to indicate to clients that this + * version of FreeType has support for 'COLR' v1 API. This definition is + * useful to FreeType clients that want to build in support for 'COLR' v1 + * depending on a tip-of-tree checkout before it is officially released in + * FreeType, and while the feature cannot yet be tested against using + * version macros. Don't change this macro. This may be removed once the + * feature is in a FreeType release version and version macros can be used + * to test for availability. + */ +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS + #define TT_SUPPORT_COLRV1 +#endif + +/* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 + #error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + +#endif /* FTOPTION_H_ */ + +/* END */ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype.c b/libraries/lvgl/src/libs/freetype/lv_freetype.c new file mode 100644 index 0000000..9372919 --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype.c @@ -0,0 +1,405 @@ +/** + * @file lv_freetype.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_freetype.h" + +#if LV_USE_FREETYPE + +#include "lv_freetype_private.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define ft_ctx LV_GLOBAL_DEFAULT()->ft_context +#define LV_FREETYPE_OUTLINE_REF_SIZE_DEF 128 + +/**< This value is from the FreeType's function `FT_GlyphSlot_Oblique` in `ftsynth.c` */ +#define LV_FREETYPE_OBLIQUE_SLANT_DEF 0x0366A + +#if LV_FREETYPE_CACHE_FT_GLYPH_CNT <= 0 + #error "LV_FREETYPE_CACHE_FT_GLYPH_CNT must be greater than 0" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/* Use the pointer storing pathname as the unique request ID of the face */ +typedef struct { + char * pathname; + int ref_cnt; +} face_id_node_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_freetype_cleanup(lv_freetype_context_t * ctx); +static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname); +static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id); +static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt); +static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc); + +static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data); +static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data); +static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, + const lv_freetype_cache_node_t * rhs); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_freetype_init(uint32_t max_glyph_cnt) +{ + if(ft_ctx) { + LV_LOG_WARN("freetype already initialized"); + return LV_RESULT_INVALID; + } + + ft_ctx = lv_malloc_zeroed(sizeof(lv_freetype_context_t)); + LV_ASSERT_MALLOC(ft_ctx); + if(!ft_ctx) { + LV_LOG_ERROR("malloc failed for lv_freetype_context_t"); + return LV_RESULT_INVALID; + } + + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + ctx->max_glyph_cnt = max_glyph_cnt; + + FT_Error error; + + error = FT_Init_FreeType(&ctx->library); + if(error) { + FT_ERROR_MSG("FT_Init_FreeType", error); + return LV_RESULT_INVALID; + } + + _lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t)); + + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)cache_node_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)cache_node_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)cache_node_cache_free_cb, + }; + ctx->cache_node_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_cache_node_t), INT32_MAX, ops); + + return LV_RESULT_OK; +} + +void lv_freetype_uninit(void) +{ + lv_freetype_context_t * ctx = lv_freetype_get_context(); + lv_freetype_cleanup(ctx); + + lv_free(ft_ctx); + ft_ctx = NULL; +} + +lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, + lv_freetype_font_style_t style) +{ + LV_ASSERT_NULL(pathname); + LV_ASSERT(size > 0); + + size_t pathname_len = lv_strlen(pathname); + LV_ASSERT(pathname_len > 0); + + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + lv_freetype_cache_node_t search_key = { + .pathname = lv_freetype_req_face_id(ctx, pathname), + .style = style, + .render_mode = render_mode, + }; + + bool cache_hitting = true; + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(ctx->cache_node_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + cache_hitting = false; + cache_node_entry = lv_cache_acquire_or_create(ctx->cache_node_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + lv_freetype_drop_face_id(ctx, (FTC_FaceID)search_key.pathname); + LV_LOG_ERROR("cache node creating failed"); + return NULL; + } + } + + lv_freetype_font_dsc_t * dsc = lv_malloc_zeroed(sizeof(lv_freetype_font_dsc_t)); + LV_ASSERT_MALLOC(dsc); + + dsc->face_id = (FTC_FaceID)search_key.pathname; + dsc->render_mode = render_mode; + dsc->context = ctx; + dsc->size = size; + dsc->style = style; + dsc->magic_num = LV_FREETYPE_FONT_DSC_MAGIC_NUM; + dsc->cache_node = lv_cache_entry_get_data(cache_node_entry); + dsc->cache_node_entry = cache_node_entry; + + if(cache_hitting == false && freetype_on_font_create(dsc, ctx->max_glyph_cnt) == false) { + lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); + lv_freetype_drop_face_id(ctx, dsc->face_id); + lv_free(dsc); + return NULL; + } + freetype_on_font_set_cbs(dsc); + + FT_Face face = dsc->cache_node->face; + FT_Set_Pixel_Sizes(face, 0, size); + + lv_font_t * font = &dsc->font; + font->dsc = dsc; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = FT_F26DOT6_TO_INT(face->size->metrics.height); + font->base_line = -FT_F26DOT6_TO_INT(face->size->metrics.descender); + + FT_Fixed scale = face->size->metrics.y_scale; + int8_t thickness = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_thickness)); + font->underline_position = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_position)); + font->underline_thickness = thickness < 1 ? 1 : thickness; + + return font; +} + +void lv_freetype_font_delete(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)(font->dsc); + LV_ASSERT_NULL(dsc); + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); + if(lv_cache_entry_get_ref(dsc->cache_node_entry) == 0) { + lv_cache_drop(ctx->cache_node_cache, dsc->cache_node, NULL); + } + + lv_freetype_drop_face_id(dsc->context, dsc->face_id); + + /* invalidate magic number */ + lv_memzero(dsc, sizeof(lv_freetype_font_dsc_t)); + lv_free(dsc); +} + +lv_freetype_context_t * lv_freetype_get_context(void) +{ + return LV_GLOBAL_DEFAULT()->ft_context; +} + +void lv_freetype_italic_transform(FT_Face face) +{ + LV_ASSERT_NULL(face); + FT_Matrix matrix; + matrix.xx = FT_INT_TO_F16DOT16(1); + matrix.xy = LV_FREETYPE_OBLIQUE_SLANT_DEF; + matrix.yx = 0; + matrix.yy = FT_INT_TO_F16DOT16(1); + FT_Set_Transform(face, &matrix, NULL); +} + +int32_t lv_freetype_italic_transform_on_pos(lv_point_t point) +{ + return point.x + FT_F16DOT16_TO_INT(point.y * LV_FREETYPE_OBLIQUE_SLANT_DEF); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt) +{ + /* + * Glyph info uses a small amount of memory, and uses glyph info more frequently, + * so it plans to use twice the maximum number of caches here to + * get a better info acquisition performance.*/ + lv_cache_t * glyph_cache = lv_freetype_create_glyph_cache(max_glyph_cnt * 2); + if(glyph_cache == NULL) { + LV_LOG_ERROR("glyph cache creating failed"); + return false; + } + dsc->cache_node->glyph_cache = glyph_cache; + + lv_cache_t * draw_data_cache = NULL; + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + draw_data_cache = lv_freetype_create_draw_data_image(max_glyph_cnt); + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + draw_data_cache = lv_freetype_create_draw_data_outline(max_glyph_cnt); + } + else { + LV_LOG_ERROR("unknown render mode"); + return false; + } + + if(draw_data_cache == NULL) { + LV_LOG_ERROR("draw data cache creating failed"); + return false; + } + + dsc->cache_node->draw_data_cache = draw_data_cache; + + return true; +} + +static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc) +{ + lv_freetype_set_cbs_glyph(dsc); + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + lv_freetype_set_cbs_image_font(dsc); + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + lv_freetype_set_cbs_outline_font(dsc); + } +} + +static void lv_freetype_cleanup(lv_freetype_context_t * ctx) +{ + LV_ASSERT_NULL(ctx); + if(ctx->cache_node_cache) { + lv_cache_destroy(ctx->cache_node_cache, NULL); + ctx->cache_node_cache = NULL; + } + + if(ctx->library) { + FT_Done_FreeType(ctx->library); + ctx->library = NULL; + } +} + +static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname) +{ + size_t len = lv_strlen(pathname); + LV_ASSERT(len > 0); + + lv_ll_t * ll_p = &ctx->face_id_ll; + face_id_node_t * node; + + /* search cache */ + _LV_LL_READ(ll_p, node) { + if(strcmp(node->pathname, pathname) == 0) { + node->ref_cnt++; + LV_LOG_INFO("reuse face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); + return node->pathname; + } + } + + /* insert new cache */ + node = _lv_ll_ins_tail(ll_p); + LV_ASSERT_MALLOC(node); + +#if LV_USE_FS_MEMFS + if(pathname[0] == LV_FS_MEMFS_LETTER) { +#if !LV_FREETYPE_USE_LVGL_PORT + LV_LOG_WARN("LV_FREETYPE_USE_LVGL_PORT is not enabled"); +#endif + node->pathname = lv_malloc(sizeof(lv_fs_path_ex_t)); + LV_ASSERT_MALLOC(node->pathname); + lv_memcpy(node->pathname, pathname, sizeof(lv_fs_path_ex_t)); + } + else +#endif + { + node->pathname = lv_strdup(pathname); + LV_ASSERT_NULL(node->pathname); + } + + LV_LOG_INFO("add face_id: %s", node->pathname); + + node->ref_cnt = 1; + return node->pathname; +} + +static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id) +{ + lv_ll_t * ll_p = &ctx->face_id_ll; + face_id_node_t * node; + _LV_LL_READ(ll_p, node) { + if(face_id == node->pathname) { + LV_LOG_INFO("found face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); + node->ref_cnt--; + if(node->ref_cnt == 0) { + LV_LOG_INFO("drop face_id: %s", node->pathname); + _lv_ll_remove(ll_p, node); + lv_free(node->pathname); + lv_free(node); + } + return; + } + } + + LV_ASSERT_MSG(false, "face_id not found"); +} + +/*----------------- + * Cache Node Cache Callbacks + *----------------*/ + +static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data) +{ + LV_UNUSED(user_data); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + /* Cache miss, load face */ + FT_Face face; + FT_Error error = FT_New_Face(ctx->library, node->pathname, 0, &face); + if(error) { + FT_ERROR_MSG("FT_New_Face", error); + return false; + } + + node->ref_size = LV_FREETYPE_OUTLINE_REF_SIZE_DEF; + + if(node->style & LV_FREETYPE_FONT_STYLE_ITALIC) { + lv_freetype_italic_transform(face); + } + + node->face = face; + + return true; +} +static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data) +{ + FT_Done_Face(node->face); + + if(node->glyph_cache) { + lv_cache_destroy(node->glyph_cache, user_data); + node->glyph_cache = NULL; + } + if(node->draw_data_cache) { + lv_cache_destroy(node->draw_data_cache, user_data); + node->draw_data_cache = NULL; + } +} +static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, + const lv_freetype_cache_node_t * rhs) +{ + if(lhs->render_mode != rhs->render_mode) { + return lhs->render_mode > rhs->render_mode ? 1 : -1; + } + if(lhs->style != rhs->style) { + return lhs->style > rhs->style ? 1 : -1; + } + + int32_t cmp_res = lv_strcmp(lhs->pathname, rhs->pathname); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype.h b/libraries/lvgl/src/libs/freetype/lv_freetype.h new file mode 100644 index 0000000..7104e2f --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype.h @@ -0,0 +1,143 @@ +/** + * @file lv_freetype.h + * + */ +#ifndef LV_FREETYPE_H +#define LV_FREETYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_event.h" +#include + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +#define LV_FREETYPE_F26DOT6_TO_INT(x) ((x) >> 6) +#define LV_FREETYPE_F26DOT6_TO_FLOAT(x) ((float)(x) / 64) + +#define FT_FONT_STYLE_NORMAL LV_FREETYPE_FONT_STYLE_NORMAL +#define FT_FONT_STYLE_ITALIC LV_FREETYPE_FONT_STYLE_ITALIC +#define FT_FONT_STYLE_BOLD LV_FREETYPE_FONT_STYLE_BOLD + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_FREETYPE_FONT_STYLE_NORMAL = 0, + LV_FREETYPE_FONT_STYLE_ITALIC = 1 << 0, + LV_FREETYPE_FONT_STYLE_BOLD = 1 << 1, +}; + +typedef uint16_t lv_freetype_font_style_t; +typedef lv_freetype_font_style_t LV_FT_FONT_STYLE; + +enum { + LV_FREETYPE_FONT_RENDER_MODE_BITMAP = 0, + LV_FREETYPE_FONT_RENDER_MODE_OUTLINE = 1, +}; + +typedef uint16_t lv_freetype_font_render_mode_t; + +typedef void * lv_freetype_outline_t; + +typedef enum { + LV_FREETYPE_OUTLINE_END, + LV_FREETYPE_OUTLINE_MOVE_TO, + LV_FREETYPE_OUTLINE_LINE_TO, + LV_FREETYPE_OUTLINE_CUBIC_TO, + LV_FREETYPE_OUTLINE_CONIC_TO, +} lv_freetype_outline_type_t; + +typedef struct { + int32_t x; + int32_t y; +} lv_freetype_outline_vector_t; + +typedef struct { + lv_freetype_outline_t outline; + lv_freetype_outline_type_t type; + lv_freetype_outline_vector_t to; + lv_freetype_outline_vector_t control1; + lv_freetype_outline_vector_t control2; +} lv_freetype_outline_event_param_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the freetype library. + * @return LV_RESULT_OK on success, otherwise LV_RESULT_INVALID. + */ +lv_result_t lv_freetype_init(uint32_t max_glyph_cnt); + +/** + * Uninitialize the freetype library + */ +void lv_freetype_uninit(void); + +/** + * Create a freetype font. + * @param pathname font file path. + * @param render_mode font render mode(see @lv_freetype_font_render_mode_t for details). + * @param size font size. + * @param style font style(see lv_freetype_font_style_t for details). + * @return Created font, or NULL on failure. + */ +lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, + lv_freetype_font_style_t style); + +/** + * Delete a freetype font. + * @param font freetype font to be deleted. + */ +void lv_freetype_font_delete(lv_font_t * font); + +/** + * Register a callback function to generate outlines for FreeType fonts. + * + * @param cb The callback function to be registered. + * @param user_data User data to be passed to the callback function. + * @return The ID of the registered callback function, or a negative value on failure. + */ +void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the scale of a FreeType font. + * + * @param font The FreeType font to get the scale of. + * @return The scale of the FreeType font. + */ +uint32_t lv_freetype_outline_get_scale(const lv_font_t * font); + +/** + * Check if the font is an outline font. + * + * @param font The FreeType font. + * @return Is outline font on success, otherwise false. + */ +bool lv_freetype_is_outline_font(const lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FREETYPE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_FREETYPE_H */ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype_glyph.c b/libraries/lvgl/src/libs/freetype/lv_freetype_glyph.c new file mode 100644 index 0000000..e0bbcd7 --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype_glyph.c @@ -0,0 +1,194 @@ +/** + * @file lv_freetype_glyph.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_freetype_glyph_cache_data_t { + uint32_t unicode; + uint32_t size; + + lv_font_glyph_dsc_t glyph_dsc; +} lv_freetype_glyph_cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + uint32_t unicode_letter_next); + +static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); +static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); +static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, + const lv_freetype_glyph_cache_data_t * rhs); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size) +{ + lv_cache_ops_t ops = { + .create_cb = (lv_cache_create_cb_t)freetype_glyph_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_glyph_free_cb, + .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_compare_cb, + }; + + lv_cache_t * glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_glyph_cache_data_t), + cache_size, ops); + + return glyph_cache; +} + +void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_dsc = freetype_get_glyph_dsc_cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + LV_ASSERT_NULL(font); + LV_ASSERT_NULL(g_dsc); + + if(unicode_letter < 0x20) { + g_dsc->adv_w = 0; + g_dsc->box_h = 0; + g_dsc->box_w = 0; + g_dsc->ofs_x = 0; + g_dsc->ofs_y = 0; + g_dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + return true; + } + + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + lv_freetype_glyph_cache_data_t search_key = { + .unicode = unicode_letter, + .size = dsc->size, + }; + + lv_cache_t * glyph_cache = dsc->cache_node->glyph_cache; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(glyph_cache, &search_key, dsc); + if(entry == NULL) { + LV_LOG_ERROR("glyph lookup failed for unicode = 0x%" LV_PRIx32, unicode_letter); + return false; + } + lv_freetype_glyph_cache_data_t * data = lv_cache_entry_get_data(entry); + *g_dsc = data->glyph_dsc; + + if((dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) && (unicode_letter_next == '\0')) { + g_dsc->adv_w = g_dsc->box_w + g_dsc->ofs_x; + } + + g_dsc->entry = NULL; + + lv_cache_release(glyph_cache, entry, NULL); + return true; +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) +{ + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; + + FT_Error error; + + lv_font_glyph_dsc_t * dsc_out = &data->glyph_dsc; + + FT_Face face = dsc->cache_node->face; + FT_UInt glyph_index = FT_Get_Char_Index(face, data->unicode); + + FT_Set_Pixel_Sizes(face, 0, dsc->size); + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_COMPUTE_METRICS | FT_LOAD_NO_BITMAP); + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + return false; + } + + FT_GlyphSlot glyph = face->glyph; + + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->metrics.horiAdvance); + dsc_out->box_h = FT_F26DOT6_TO_INT(glyph->metrics.height); /*Height of the bitmap in [px]*/ + dsc_out->box_w = FT_F26DOT6_TO_INT(glyph->metrics.width); /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingX); /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingY - + glyph->metrics.height); /*Y offset of the bitmap measured from the as line*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_VECTOR; + + /*Transform the glyph to italic if required*/ + if(dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) { + dsc_out->box_w = lv_freetype_italic_transform_on_pos((lv_point_t) { + dsc_out->box_w, dsc_out->box_h + }); + } + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + FT_Bitmap * glyph_bitmap = &face->glyph->bitmap; + + dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->advance.x); /*Width of the glyph in [pf]*/ + dsc_out->box_h = glyph_bitmap->rows; /*Height of the bitmap in [px]*/ + dsc_out->box_w = glyph_bitmap->width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = glyph->bitmap_left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = glyph->bitmap_top - + dsc_out->box_h; /*Y offset of the bitmap measured from the as line*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; + } + + dsc_out->is_placeholder = glyph_index == 0; + dsc_out->glyph_index = glyph_index; + + return true; +} +static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) +{ + LV_UNUSED(data); + LV_UNUSED(user_data); +} +static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, + const lv_freetype_glyph_cache_data_t * rhs) +{ + if(lhs->unicode != rhs->unicode) { + return lhs->unicode > rhs->unicode ? 1 : -1; + } + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + return 0; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype_image.c b/libraries/lvgl/src/libs/freetype/lv_freetype_image.c new file mode 100644 index 0000000..7a7b04d --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype_image.c @@ -0,0 +1,180 @@ +/** + * @file lv_freetype_image.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_freetype_image_cache_data_t { + FT_UInt glyph_index; + uint32_t size; + + lv_draw_buf_t * draw_buf; +} lv_freetype_image_cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, + lv_draw_buf_t * draw_buf); + +static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data); +static void freetype_image_free_cb(lv_freetype_image_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, + const lv_freetype_image_cache_data_t * rhs); + +static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size) +{ + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)freetype_image_compare_cb, + .create_cb = (lv_cache_create_cb_t)freetype_image_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_image_free_cb, + }; + + lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_image_cache_data_t), + cache_size, ops); + + return draw_data_cache; +} + +void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; + dsc->font.release_glyph = freetype_image_release_cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, + lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(unicode_letter); + LV_UNUSED(draw_buf); + const lv_font_t * font = g_dsc->resolved_font; + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + FT_Face face = dsc->cache_node->face; + FT_UInt glyph_index = FT_Get_Char_Index(face, unicode_letter); + + lv_cache_t * cache = dsc->cache_node->draw_data_cache; + + lv_freetype_image_cache_data_t search_key = { + .glyph_index = glyph_index, + .size = dsc->size, + }; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache, &search_key, dsc); + + g_dsc->entry = entry; + lv_freetype_image_cache_data_t * cache_node = lv_cache_entry_get_data(entry); + + return cache_node->draw_buf; +} + +static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); + g_dsc->entry = NULL; +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data) +{ + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; + + FT_Error error; + + FT_Face face = dsc->cache_node->face; + FT_Set_Pixel_Sizes(face, 0, dsc->size); + error = FT_Load_Glyph(face, data->glyph_index, FT_LOAD_RENDER | FT_LOAD_TARGET_NORMAL); + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + return false; + } + error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + if(error) { + FT_ERROR_MSG("FT_Render_Glyph", error); + return false; + } + + FT_Glyph glyph; + error = FT_Get_Glyph(face->glyph, &glyph); + if(error) { + FT_ERROR_MSG("FT_Get_Glyph", error); + return false; + } + + FT_BitmapGlyph glyph_bitmap = (FT_BitmapGlyph)glyph; + + uint16_t box_h = glyph_bitmap->bitmap.rows; /*Height of the bitmap in [px]*/ + uint16_t box_w = glyph_bitmap->bitmap.width; /*Width of the bitmap in [px]*/ + + uint32_t stride = lv_draw_buf_width_to_stride(box_w, LV_COLOR_FORMAT_A8); + data->draw_buf = lv_draw_buf_create(box_w, box_h, LV_COLOR_FORMAT_A8, stride); + + for(int y = 0; y < box_h; ++y) { + lv_memcpy((uint8_t *)(data->draw_buf->data) + y * stride, glyph_bitmap->bitmap.buffer + y * box_w, + box_w); + } + + FT_Done_Glyph(glyph); + + return true; +} +static void freetype_image_free_cb(lv_freetype_image_cache_data_t * data, void * user_data) +{ + LV_UNUSED(user_data); + lv_draw_buf_destroy(data->draw_buf); +} +static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, + const lv_freetype_image_cache_data_t * rhs) +{ + if(lhs->glyph_index != rhs->glyph_index) { + return lhs->glyph_index > rhs->glyph_index ? 1 : -1; + } + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + return 0; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype_outline.c b/libraries/lvgl/src/libs/freetype/lv_freetype_outline.c new file mode 100644 index 0000000..43c66cc --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype_outline.c @@ -0,0 +1,369 @@ +/** + * @file lv_freetype_outline.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_freetype_outline_node_t { + FT_UInt glyph_index; + lv_freetype_outline_t outline; +} lv_freetype_outline_node_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_freetype_outline_t outline_create(lv_freetype_context_t * ctx, FT_Face face, FT_UInt glyph_index, + uint32_t size, uint32_t strength); +static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline); +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, + lv_draw_buf_t * draw_buf); +static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); + +static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, uint32_t unicode_letter); + +/*glyph dsc cache lru callbacks*/ +static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); +static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); +static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, + const lv_freetype_outline_node_t * node_b); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size) +{ + lv_cache_ops_t glyph_outline_cache_ops = { + .create_cb = (lv_cache_create_cb_t)freetype_glyph_outline_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_glyph_outline_free_cb, + .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_outline_cmp_cb, + }; + + lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_outline_node_t), + cache_size, + glyph_outline_cache_ops); + + return draw_data_cache; +} + +void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; + dsc->font.release_glyph = freetype_release_glyph_cb; +} + +void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_UNUSED(user_data); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + LV_UNUSED(filter); + ctx->event_cb = event_cb; +} + +uint32_t lv_freetype_outline_get_scale(const lv_font_t * font) +{ + LV_ASSERT_NULL(font); + const lv_freetype_font_dsc_t * dsc = font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + return FT_INT_TO_F26DOT6(dsc->size) / dsc->cache_node->ref_size; +} + +bool lv_freetype_is_outline_font(const lv_font_t * font) +{ + LV_ASSERT_NULL(font); + const lv_freetype_font_dsc_t * dsc = font->dsc; + if(!LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc)) { + return false; + } + + return dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*------------------- + * OUTLINE CACHE + *------------------*/ + +static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) +{ + lv_freetype_outline_t outline; + outline = outline_create(dsc->context, + dsc->cache_node->face, + node->glyph_index, + dsc->cache_node->ref_size, + dsc->style & LV_FREETYPE_FONT_STYLE_BOLD ? 1 : 0); + + if(!outline) { + return false; + } + + LV_LOG_INFO("glyph_index = 0x%" LV_PRIx32, (uint32_t)node->glyph_index); + + node->outline = outline; + return true; +} + +static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) +{ + LV_UNUSED(dsc); + + lv_freetype_outline_t outline = node->outline; + lv_freetype_context_t * ctx = lv_freetype_get_context(); + outline_delete(ctx, outline); +} + +static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, + const lv_freetype_outline_node_t * node_b) +{ + if(node_a->glyph_index == node_b->glyph_index) { + return 0; + } + return node_a->glyph_index > node_b->glyph_index ? 1 : -1; +} + +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, + lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + const lv_font_t * font = g_dsc->resolved_font; + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + lv_cache_entry_t * entry = lv_freetype_outline_lookup(dsc, unicode_letter); + if(entry == NULL) { + return NULL; + } + lv_freetype_outline_node_t * node = lv_cache_entry_get_data(entry); + + g_dsc->entry = entry; + + return node ? node->outline : NULL; +} + +static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + + if(g_dsc->entry == NULL) { + return; + } + lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); + g_dsc->entry = NULL; +} + +static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, uint32_t unicode_letter) +{ + lv_freetype_cache_node_t * cache_node = dsc->cache_node; + + FT_Face face = cache_node->face; + FT_UInt glyph_index = FT_Get_Char_Index(face, unicode_letter); + + lv_freetype_outline_node_t tmp_node; + tmp_node.glyph_index = glyph_index; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache_node->draw_data_cache, &tmp_node, dsc); + if(!entry) { + LV_LOG_ERROR("glyph outline lookup failed for glyph_index = 0x%" LV_PRIx32, (uint32_t)glyph_index); + return NULL; + } + return entry; +} + +static void ft_vector_to_lv_vector(lv_freetype_outline_vector_t * dest, const FT_Vector * src) +{ + dest->x = src ? src->x : 0; + dest->y = src ? src->y : 0; +} + +static lv_result_t outline_send_event(lv_freetype_context_t * ctx, lv_event_code_t code, + lv_freetype_outline_event_param_t * param) +{ + if(!ctx->event_cb) { + LV_LOG_ERROR("event_cb is not set"); + return LV_RESULT_INVALID; + } + + lv_event_t e; + lv_memzero(&e, sizeof(e)); + e.code = code; + e.param = param; + e.user_data = NULL; + + ctx->event_cb(&e); + + return LV_RESULT_OK; +} + +static lv_result_t outline_push_point( + lv_freetype_outline_t outline, + lv_freetype_outline_type_t type, + const FT_Vector * control1, + const FT_Vector * control2, + const FT_Vector * to) +{ + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + lv_freetype_outline_event_param_t param; + lv_memzero(¶m, sizeof(param)); + param.outline = outline; + param.type = type; + ft_vector_to_lv_vector(¶m.control1, control1); + ft_vector_to_lv_vector(¶m.control2, control2); + ft_vector_to_lv_vector(¶m.to, to); + + return outline_send_event(ctx, LV_EVENT_INSERT, ¶m); +} + +static int outline_move_to_cb( + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_MOVE_TO, NULL, NULL, to); + return FT_Err_Ok; +} + +static int outline_line_to_cb( + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_LINE_TO, NULL, NULL, to); + return FT_Err_Ok; +} + +static int outline_conic_to_cb( + const FT_Vector * control, + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_CONIC_TO, control, NULL, to); + return FT_Err_Ok; +} + +static int outline_cubic_to_cb( + const FT_Vector * control1, + const FT_Vector * control2, + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_CUBIC_TO, control1, control2, to); + return FT_Err_Ok; +} + +static lv_freetype_outline_t outline_create( + lv_freetype_context_t * ctx, + FT_Face face, + FT_UInt glyph_index, + uint32_t size, + uint32_t strength) +{ + LV_ASSERT_NULL(ctx); + FT_Error error; + + error = FT_Set_Pixel_Sizes(face, 0, size); + if(error) { + FT_ERROR_MSG("FT_Set_Char_Size", error); + return NULL; + } + + /* Load glyph */ + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP); + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + return NULL; + } + + if(strength > 0) { + error = FT_Outline_Embolden(&face->glyph->outline, FT_INT_TO_F26DOT6(strength)); + if(error) { + FT_ERROR_MSG("FT_Outline_Embolden", error); + } + } + + lv_result_t res; + lv_freetype_outline_event_param_t param; + + lv_memzero(¶m, sizeof(param)); + res = outline_send_event(ctx, LV_EVENT_CREATE, ¶m); + + lv_freetype_outline_t outline = param.outline; + + if(res != LV_RESULT_OK || !outline) { + LV_LOG_ERROR("Outline object create failed"); + return NULL; + } + + FT_Outline_Funcs outline_funcs = { + .move_to = outline_move_to_cb, + .line_to = outline_line_to_cb, + .conic_to = outline_conic_to_cb, + .cubic_to = outline_cubic_to_cb, + .shift = 0, + .delta = 0 + }; + + /* Run outline decompose again to fill outline data */ + error = FT_Outline_Decompose(&face->glyph->outline, &outline_funcs, outline); + if(error) { + FT_ERROR_MSG("FT_Outline_Decompose", error); + outline_delete(ctx, outline); + return NULL; + } + + /* close outline */ + res = outline_push_point(outline, LV_FREETYPE_OUTLINE_END, NULL, NULL, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Outline object close failed"); + outline_delete(ctx, outline); + return NULL; + } + + return outline; +} + +static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline) +{ + lv_freetype_outline_event_param_t param; + lv_memzero(¶m, sizeof(param)); + param.outline = outline; + + return outline_send_event(ctx, LV_EVENT_DELETE, ¶m); +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/libraries/lvgl/src/libs/freetype/lv_freetype_private.h b/libraries/lvgl/src/libs/freetype/lv_freetype_private.h new file mode 100644 index 0000000..976e54f --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_freetype_private.h @@ -0,0 +1,132 @@ +/** + * @file lv_freetype_private.h + * + */ + +#ifndef LV_FREETYPE_PRIVATE_H +#define LV_FREETYPE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" + +#if LV_USE_FREETYPE + +#include "ft2build.h" +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_CACHE_H +#include FT_SIZES_H +#include FT_IMAGE_H +#include FT_OUTLINE_H + +/********************* + * DEFINES + *********************/ + +#ifdef FT_CONFIG_OPTION_ERROR_STRINGS +#define FT_ERROR_MSG(msg, error_code) \ + LV_LOG_ERROR(msg " error(0x%x): %s", (int)error_code, FT_Error_String(error_code)) +#else +#define FT_ERROR_MSG(msg, error_code) \ + LV_LOG_ERROR(msg " error(0x%x)", (int)error_code) +#endif + +#define LV_FREETYPE_FONT_DSC_MAGIC_NUM 0x5F5F4654 /* '__FT' */ +#define LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc) ((dsc)->magic_num == LV_FREETYPE_FONT_DSC_MAGIC_NUM) +#define LV_ASSERT_FREETYPE_FONT_DSC(dsc) \ + do { \ + LV_ASSERT_NULL(dsc); \ + LV_ASSERT_MSG(LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc), "Invalid font descriptor"); \ + } while (0) + +#define FT_INT_TO_F26DOT6(x) ((x) << 6) +#define FT_F26DOT6_TO_INT(x) ((x) >> 6) + +#define FT_INT_TO_F16DOT16(x) ((x) << 16) +#define FT_F16DOT16_TO_INT(x) ((x) >> 16) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_freetype_cache_node_t lv_freetype_cache_node_t; + +struct _lv_freetype_cache_node_t { + const char * pathname; + lv_freetype_font_style_t style; + lv_freetype_font_render_mode_t render_mode; + + uint32_t ref_size; /**< Reference size for calculating outline glyph's real size.*/ + + FT_Face face; + + /*glyph cache*/ + lv_cache_t * glyph_cache; + + /*draw data cache*/ + lv_cache_t * draw_data_cache; +}; + +typedef struct _lv_freetype_context_t { + FT_Library library; + lv_ll_t face_id_ll; + lv_event_cb_t event_cb; + + uint32_t max_glyph_cnt; + + lv_cache_t * cache_node_cache; +} lv_freetype_context_t; + +typedef struct _lv_freetype_font_dsc_t { + uint32_t magic_num; + lv_font_t font; + uint32_t size; + lv_freetype_font_style_t style; + lv_freetype_font_render_mode_t render_mode; + lv_freetype_context_t * context; + lv_freetype_cache_node_t * cache_node; + lv_cache_entry_t * cache_node_entry; + FTC_FaceID face_id; +} lv_freetype_font_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the FreeType context. + * + * @return A pointer to the FreeType context used by LittlevGL. + */ +lv_freetype_context_t * lv_freetype_get_context(void); + +void lv_freetype_italic_transform(FT_Face face); +int32_t lv_freetype_italic_transform_on_pos(lv_point_t point); + +lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size); +void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc); + +lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size); +void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc); + +lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size); +void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FREETYPE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FREETYPE_PRIVATE_H*/ diff --git a/libraries/lvgl/src/libs/freetype/lv_ftsystem.c b/libraries/lvgl/src/libs/freetype/lv_ftsystem.c new file mode 100644 index 0000000..ee0e836 --- /dev/null +++ b/libraries/lvgl/src/libs/freetype/lv_ftsystem.c @@ -0,0 +1,291 @@ +/** + * @file lv_ftsystem.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_FREETYPE && LV_FREETYPE_USE_LVGL_PORT + +#include +#include FT_CONFIG_CONFIG_H +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/* The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT io + +/* We use the macro STREAM_FILE for convenience to extract the */ +/* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (lv_fs_file_t*)stream->descriptor.pointer ) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +FT_CALLBACK_DEF(unsigned long) +ft_lv_fs_stream_io(FT_Stream stream, + unsigned long offset, + unsigned char * buffer, + unsigned long count); +FT_CALLBACK_DEF(void) +ft_lv_fs_stream_close(FT_Stream stream); +FT_CALLBACK_DEF(void *) +ft_alloc(FT_Memory memory, + long size); +FT_CALLBACK_DEF(void *) +ft_realloc(FT_Memory memory, + long cur_size, + long new_size, + void * block); +FT_CALLBACK_DEF(void) +ft_free(FT_Memory memory, + void * block); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init(FT_Memory memory); + + extern void + ft_mem_debug_done(FT_Memory memory); + +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + +/* documentation is in ftstream.h */ + +FT_BASE_DEF(FT_Error) +FT_Stream_Open(FT_Stream stream, + const char * filepathname) +{ + lv_fs_file_t file; + + if(!stream) + return FT_THROW(Invalid_Stream_Handle); + + stream->descriptor.pointer = NULL; + stream->pathname.pointer = (char *)filepathname; + stream->base = NULL; + stream->pos = 0; + stream->read = NULL; + stream->close = NULL; + + lv_fs_res_t res = lv_fs_open(&file, filepathname, LV_FS_MODE_RD); + + if(res != LV_FS_RES_OK) { + FT_ERROR(("FT_Stream_Open:" + " could not open `%s'\n", filepathname)); + + return FT_THROW(Cannot_Open_Resource); + } + + lv_fs_seek(&file, 0, LV_FS_SEEK_END); + + uint32_t pos; + res = lv_fs_tell(&file, &pos); + if(res != LV_FS_RES_OK) { + FT_ERROR(("FT_Stream_Open:")); + FT_ERROR((" opened `%s' but zero-sized\n", filepathname)); + lv_fs_close(&file); + return FT_THROW(Cannot_Open_Stream); + } + stream->size = pos; + lv_fs_seek(&file, 0, LV_FS_SEEK_SET); + + lv_fs_file_t * file_p = lv_malloc(sizeof(lv_fs_file_t)); + LV_ASSERT_MALLOC(file_p); + + if(!file_p) { + FT_ERROR(("FT_Stream_Open: malloc failed for file_p")); + lv_fs_close(&file); + return FT_THROW(Cannot_Open_Stream); + } + + *file_p = file; + + stream->descriptor.pointer = file_p; + stream->read = ft_lv_fs_stream_io; + stream->close = ft_lv_fs_stream_close; + + FT_TRACE1(("FT_Stream_Open:")); + FT_TRACE1((" opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size)); + + return FT_Err_Ok; +} + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +/* documentation is in ftobjs.h */ + +FT_BASE_DEF(FT_Memory) +FT_New_Memory(void) +{ + FT_Memory memory; + + memory = (FT_Memory)lv_malloc(sizeof(*memory)); + if(memory) { + memory->user = NULL; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init(memory); +#endif + } + + return memory; +} + +/* documentation is in ftobjs.h */ + +FT_BASE_DEF(void) +FT_Done_Memory(FT_Memory memory) +{ +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done(memory); +#endif + lv_free(memory); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * The memory allocation function. + * @param memory A pointer to the memory object. + * @param size The requested size in bytes. + * @return The address of newly allocated block. + */ +FT_CALLBACK_DEF(void *) +ft_alloc(FT_Memory memory, + long size) +{ + FT_UNUSED(memory); + + return lv_malloc((size_t)size); +} + +/** + * The memory reallocation function. + * @param memory A pointer to the memory object. + * @param cur_size The current size of the allocated memory block. + * @param new_size The newly requested size in bytes. + * @param block The current address of the block in memory. + * @return The address of the reallocated memory block. + */ +FT_CALLBACK_DEF(void *) +ft_realloc(FT_Memory memory, + long cur_size, + long new_size, + void * block) +{ + FT_UNUSED(memory); + FT_UNUSED(cur_size); + + return lv_realloc(block, (size_t)new_size); +} + +/** + * The memory release function. + * @param memory A pointer to the memory object. + * @param block The address of block in memory to be freed. + */ +FT_CALLBACK_DEF(void) +ft_free(FT_Memory memory, + void * block) +{ + FT_UNUSED(memory); + + lv_free(block); +} + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + +/** + * The function to close a stream. + * @param stream A pointer to the stream object. + */ +FT_CALLBACK_DEF(void) +ft_lv_fs_stream_close(FT_Stream stream) +{ + lv_fs_file_t * file_p = STREAM_FILE(stream); + lv_fs_close(file_p); + lv_free(file_p); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; +} + +/** + * The function to open a stream. + * @param stream A pointer to the stream object. + * @param offset The position in the data stream to start reading. + * @param buffer The address of buffer to store the read data. + * @param count The number of bytes to read from the stream. + * @return The number of bytes actually read. If `count' is zero (this is, + * the function is used for seeking), a non-zero return value + * indicates an error. + */ +FT_CALLBACK_DEF(unsigned long) +ft_lv_fs_stream_io(FT_Stream stream, + unsigned long offset, + unsigned char * buffer, + unsigned long count) +{ + lv_fs_file_t * file_p; + + if(!count && offset > stream->size) + return 1; + + file_p = STREAM_FILE(stream); + + if(stream->pos != offset) + lv_fs_seek(file_p, (long)offset, LV_FS_SEEK_SET); + + if(count == 0) + return 0; + + uint32_t br; + lv_fs_res_t res = lv_fs_read(file_p, buffer, count, &br); + + return res == LV_FS_RES_OK ? br : 0; +} + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +#endif/*LV_FREETYPE_USE_LV_FTSYSTEM*/ diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_cbfs.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_cbfs.c new file mode 100644 index 0000000..6f1245b --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_cbfs.c @@ -0,0 +1,10 @@ +// this file should not exist +#ifdef __GNUC__ + #define IS_NOT_USED __attribute__ ((unused)) +#else + #define IS_NOT_USED +#endif +IS_NOT_USED static void nothing(void) +{ + // do nothing +} diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_fatfs.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_fatfs.c new file mode 100644 index 0000000..e434322 --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_fatfs.c @@ -0,0 +1,291 @@ +/** + * @file lv_fs_fatfs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_FATFS +#include "ff.h" + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ + +#if LV_FS_FATFS_LETTER == '\0' + #error "LV_FS_FATFS_LETTER must be an upper case ASCII letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_fatfs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->fatfs_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_FATFS_LETTER; + fs_drv_p->cache_size = LV_FS_FATFS_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /*Initialize the SD card and FatFS itself. + *Better to do it in your code to keep this library untouched for easy updating*/ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + uint8_t flags = 0; + + if(mode == LV_FS_MODE_WR) flags = FA_WRITE | FA_OPEN_ALWAYS; + else if(mode == LV_FS_MODE_RD) flags = FA_READ; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; + + FIL * f = lv_malloc(sizeof(FIL)); + if(f == NULL) return NULL; + + FRESULT res = f_open(f, path, flags); + if(res == FR_OK) { + return f; + } + else { + lv_free(f); + return NULL; + } +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + f_close(file_p); + lv_free(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + FRESULT res = f_read(file_p, buf, btr, (UINT *)br); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + FRESULT res = f_write(file_p, buf, btw, (UINT *)bw); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence only LV_SEEK_SET is supported + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + switch(whence) { + case LV_FS_SEEK_SET: + f_lseek(file_p, pos); + break; + case LV_FS_SEEK_CUR: + f_lseek(file_p, f_tell((FIL *)file_p) + pos); + break; + case LV_FS_SEEK_END: + f_lseek(file_p, f_size((FIL *)file_p) + pos); + break; + default: + break; + } + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = f_tell((FIL *)file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + DIR * d = lv_malloc(sizeof(DIR)); + if(d == NULL) return NULL; + + FRESULT res = f_opendir(d, path); + if(res != FR_OK) { + lv_free(d); + d = NULL; + } + return d; +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + FRESULT res; + FILINFO fno; + fn[0] = '\0'; + + do { + res = f_readdir(dir_p, &fno); + if(res != FR_OK) return LV_FS_RES_UNKNOWN; + + if(fno.fname[0] == 0) break; /* End of the directory */ + + if(fno.fattrib & AM_DIR) { + lv_snprintf(fn, fn_len, "/%s", fno.fname); + } + else lv_strncpy(fn, fno.fname, fn_len); + + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + f_closedir(dir_p); + lv_free(dir_p); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_FATFS == 0*/ + +#if defined(LV_FS_FATFS_LETTER) && LV_FS_FATFS_LETTER != '\0' + #warning "LV_USE_FS_FATFS is not enabled but LV_FS_FATFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_littlefs.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_littlefs.c new file mode 100644 index 0000000..3ac5233 --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_littlefs.c @@ -0,0 +1,188 @@ +#include "../../../lvgl.h" +#if LV_USE_FS_LITTLEFS + +#include "lfs.h" +#include "../../core/lv_global.h" + +typedef struct LittleFile { + lfs_file_t file; +} LittleFile; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +void lv_littlefs_set_handler(lfs_t * lfs) +{ + lv_fs_drv_t * drv = lv_fs_get_drv(LV_FS_LITTLEFS_LETTER); + drv->user_data = lfs; +} + +/** + * Register a driver for the LittleFS File System interface + */ +void lv_fs_littlefs_init(void) +{ + lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->littlefs_fs_drv); + lv_fs_drv_init(fs_drv); + + fs_drv->letter = LV_FS_LITTLEFS_LETTER; + fs_drv->open_cb = fs_open; + fs_drv->close_cb = fs_close; + fs_drv->read_cb = fs_read; + fs_drv->write_cb = fs_write; + fs_drv->seek_cb = fs_seek; + fs_drv->tell_cb = fs_tell; + + fs_drv->dir_close_cb = NULL; + fs_drv->dir_open_cb = NULL; + fs_drv->dir_read_cb = NULL; + + lv_fs_drv_register(fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + int flags; + if(mode == LV_FS_MODE_WR) + flags = LFS_O_WRONLY; + else if(mode == LV_FS_MODE_RD) + flags = LFS_O_RDONLY; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) + flags = LFS_O_RDWR; + + LittleFile * lf = (LittleFile *)lv_malloc(sizeof(LittleFile)); + LV_ASSERT_NULL(lf); + + lfs_t * lfs = (lfs_t *)drv->user_data; + int err = lfs_file_open(lfs, &lf->file, path, flags); + if(err) { + return NULL; + } + + return (void *)lf; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + LittleFile * lf = (LittleFile *)file_p; + + lfs_t * lfs = (lfs_t *)drv->user_data; + lfs_file_close(lfs, &lf->file); + lv_free(lf); + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + LittleFile * lf = (LittleFile *)file_p; + + lfs_t * lfs = (lfs_t *)drv->user_data; + *br = lfs_file_read(lfs, &lf->file, (uint8_t *)buf, btr); + + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + LittleFile * lf = (LittleFile *)file_p; + + lfs_t * lfs = (lfs_t *)drv->user_data; + *bw = lfs_file_write(lfs, &lf->file, (uint8_t *)buf, btw); + + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + int mode; + if(whence == LV_FS_SEEK_SET) + mode = LFS_SEEK_SET; + else if(whence == LV_FS_SEEK_CUR) + mode = LFS_SEEK_CUR; + else if(whence == LV_FS_SEEK_END) + mode = LFS_SEEK_END; + + LittleFile * lf = (LittleFile *)file_p; + + lfs_t * lfs = (lfs_t *)drv->user_data; + int rc = lfs_file_seek(lfs, &lf->file, pos, mode); + + return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_p variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + LittleFile * lf = (LittleFile *)file_p; + + lfs_t * lfs = (lfs_t *)drv->user_data; + *pos_p = lfs_file_tell(lfs, &lf->file); + + return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +#endif diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_memfs.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_memfs.c new file mode 100644 index 0000000..52379be --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_memfs.c @@ -0,0 +1,214 @@ +/** + * @file lv_fs_memfs.c + * + * File System Interface driver for memory-mapped files + * + * This driver allows using a memory area as a file that can be read by normal file operations. It can + * be used, e.g., to store font files in slow flash memory, and load them into RAM on demand. + * + * You can enable it in lv_conf.h: + * + * #define LV_USE_FS_MEMFS 1 + * + * The actual implementation uses the built-in cache mechanism of the file system interface. + * + * Since this is not an actual file system, file write and directories are not supported. + * + * The default drive letter is 'M', but this can be changed in lv_conf.h: + * + * #define LV_FS_MEMFS_LETTER 'M' + * + * To use it seamlessly with the file system interface a new extended path object has been introduced: + * + * lv_fs_path_ex_t mempath; + * + * This structure can be initialized with the helper function: + * + * lv_fs_make_path_ex(&mempath, (const uint8_t *) & my_mem_buffer, sizeof(my_mem_buffer)); + * + * Then the "file" can be opened with: + * + * lv_fs_file_t file; + * lv_fs_res_t res = lv_fs_open(&file, (const char *) & mempath, LV_FS_MODE_RD); + * + * The path object can be used at any place where a file path is required, e.g.: + * + * lv_font_t* my_font = lv_binfont_create((const char *) & mempath); + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_MEMFS + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_memfs_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_MEMFS_LETTER; + fs_drv.cache_size = LV_FS_CACHE_FROM_BUFFER; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = NULL; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = NULL; + fs_drv.dir_open_cb = NULL; + fs_drv.dir_read_cb = NULL; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path pointer to an extended path object containing the memory buffer address and size + * @param mode read: FS_MODE_RD (currently only reading from the buffer is supported) + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + LV_UNUSED(mode); + return (void *)path; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + LV_UNUSED(buf); + LV_UNUSED(btr); + *br = 0; + return LV_FS_RES_OK; +} + +/** + * Set the read pointer. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + /* NOTE: this function is only called to determine the end of the buffer when LV_FS_SEEK_END was given to lv_fs_seek() */ + LV_UNUSED(drv); + lv_fs_file_t * fp = (lv_fs_file_t *)file_p; + switch(whence) { + case LV_FS_SEEK_SET: { + fp->cache->file_position = pos; + break; + } + case LV_FS_SEEK_CUR: { + fp->cache->file_position += pos; + break; + } + case LV_FS_SEEK_END: { + fp->cache->file_position = fp->cache->end - pos; + break; + } + } + if(fp->cache->file_position < fp->cache->start) + fp->cache->file_position = fp->cache->start; + else if(fp->cache->file_position > fp->cache->end) + fp->cache->file_position = fp->cache->end; + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = ((lv_fs_file_t *)file_p)->cache->file_position; + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_MEMFS == 0*/ + +#if defined(LV_FS_MEMFS_LETTER) && LV_FS_MEMFS_LETTER != '\0' + #warning "LV_USE_FS_MEMFS is not enabled but LV_FS_MEMFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_MEMFS*/ diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_posix.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_posix.c new file mode 100644 index 0000000..839742f --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_posix.c @@ -0,0 +1,278 @@ +/** + * @file lv_fs_posix.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_POSIX + +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#if LV_FS_POSIX_LETTER == '\0' + #error "LV_FS_POSIX_LETTER must be an upper case ASCII letter" +#endif + +/** The reason for 'fd + 1' is because open() may return a legal fd with a value of 0, + * preventing it from being judged as NULL when converted to a pointer type. + */ +#define FILEP2FD(file_p) ((lv_uintptr_t)file_p - 1) +#define FD2FILEP(fd) ((void *)(lv_uintptr_t)(fd + 1)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_posix_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->posix_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_POSIX_LETTER; + fs_drv_p->cache_size = LV_FS_POSIX_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file handle or -1 in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + uint32_t flags = 0; + if(mode == LV_FS_MODE_WR) flags = O_WRONLY | O_CREAT; + else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR | O_CREAT; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + + int f = open(buf, flags, 0666); + if(f < 0) return NULL; + + return FD2FILEP(f); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + close(FILEP2FD(file_p)); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + *br = read(FILEP2FD(file_p), buf, btr); + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + *bw = write(FILEP2FD(file_p), buf, btw); + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + int w; + switch(whence) { + case LV_FS_SEEK_SET: + w = SEEK_SET; + break; + case LV_FS_SEEK_CUR: + w = SEEK_CUR; + break; + case LV_FS_SEEK_END: + w = SEEK_END; + break; + default: + return LV_FS_RES_INV_PARAM; + } + + off_t offset = lseek(FILEP2FD(file_p), pos, w); + return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + off_t offset = lseek(FILEP2FD(file_p), 0, SEEK_CUR); + *pos_p = offset; + return offset < 0 ? LV_FS_RES_FS_ERR : LV_FS_RES_OK; +} + +/** + * Initialize a 'fs_read_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + return opendir(buf); +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + + struct dirent * entry; + do { + entry = readdir(dir_p); + if(entry) { + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strncpy(fn, entry->d_name, fn_len); + } + else { + lv_strncpy(fn, "", fn_len); + } + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + + closedir(dir_p); + return LV_FS_RES_OK; +} +#else /*LV_USE_FS_POSIX == 0*/ + +#if defined(LV_FS_POSIX_LETTER) && LV_FS_POSIX_LETTER != '\0' + #warning "LV_USE_FS_POSIX is not enabled but LV_FS_POSIX_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_stdio.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_stdio.c new file mode 100644 index 0000000..020749d --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_stdio.c @@ -0,0 +1,344 @@ +/** + * @file lv_fs_stdio.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_STDIO != '\0' + +#include +#ifndef WIN32 + #include + #include +#else + #include +#endif + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define MAX_PATH_LEN 256 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { +#ifdef WIN32 + HANDLE dir_p; + char next_fn[MAX_PATH_LEN]; +#else + DIR * dir_p; +#endif +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_stdio_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->stdio_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_STDIO_LETTER; + fs_drv_p->cache_size = LV_FS_STDIO_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + const char * flags = ""; + + if(mode == LV_FS_MODE_WR) flags = "wb"; + else if(mode == LV_FS_MODE_RD) flags = "rb"; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "rb+"; + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + + return fopen(buf, flags); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + fclose(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + *br = fread(buf, 1, btr, file_p); + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + *bw = fwrite(buf, 1, btw, file_p); + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + int w; + switch(whence) { + case LV_FS_SEEK_SET: + w = SEEK_SET; + break; + case LV_FS_SEEK_CUR: + w = SEEK_CUR; + break; + case LV_FS_SEEK_END: + w = SEEK_END; + break; + default: + return LV_FS_RES_INV_PARAM; + } + + fseek(file_p, pos, w); + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = ftell(file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); +#ifndef WIN32 + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + handle->dir_p = opendir(buf); + if(handle->dir_p == NULL) { + lv_free(handle); + return NULL; + } + return handle; +#else + handle->dir_p = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s\\*", path); + + lv_strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + do { + if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_free(handle); + return INVALID_HANDLE_VALUE; + } + return handle; +#endif +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + struct dirent * entry; + do { + entry = readdir(handle->dir_p); + if(entry) { + /*Note, DT_DIR is not defined in C99*/ + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strncpy(fn, entry->d_name, fn_len); + } + else { + lv_strncpy(fn, "", fn_len); + } + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); +#else + lv_strncpy(fn, handle->next_fn, fn_len); + + lv_strncpy(handle->next_fn, "", fn_len); + WIN32_FIND_DATAA fdata; + + if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK; + do { + if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + +#endif + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + closedir(handle->dir_p); +#else + FindClose(handle->dir_p); +#endif + lv_free(handle); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_STDIO == 0*/ + +#if defined(LV_FS_STDIO_LETTER) && LV_FS_STDIO_LETTER != '\0' + #warning "LV_USE_FS_STDIO is not enabled but LV_FS_STDIO_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fs_win32.c b/libraries/lvgl/src/libs/fsdrv/lv_fs_win32.c new file mode 100644 index 0000000..e021219 --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fs_win32.c @@ -0,0 +1,468 @@ +/** + * @file lv_fs_win32.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_WIN32 != '\0' + +#include +#include +#include + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define MAX_PATH_LEN 256 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + HANDLE dir_p; + char next_fn[MAX_PATH_LEN]; + lv_fs_res_t next_error; +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool is_dots_name(const char * name); +static lv_fs_res_t fs_error_from_win32(DWORD error); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_win32_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple driver to open images*/ + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->win32_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_WIN32_LETTER; + fs_drv_p->cache_size = LV_FS_WIN32_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Check the dots name + * @param name file or dir name + * @return true if the name is dots name + */ +static bool is_dots_name(const char * name) +{ + return name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])); +} + +/** + * Convert Win32 error code to error from lv_fs_res_t enum + * @param error Win32 error code + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_error_from_win32(DWORD error) +{ + lv_fs_res_t res; + + switch(error) { + case ERROR_SUCCESS: + res = LV_FS_RES_OK; + break; + case ERROR_BAD_UNIT: + case ERROR_NOT_READY: + case ERROR_CRC: + case ERROR_SEEK: + case ERROR_NOT_DOS_DISK: + case ERROR_WRITE_FAULT: + case ERROR_READ_FAULT: + case ERROR_GEN_FAILURE: + case ERROR_WRONG_DISK: + res = LV_FS_RES_HW_ERR; + break; + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_TARGET_HANDLE: + res = LV_FS_RES_FS_ERR; + break; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_DRIVE: + case ERROR_NO_MORE_FILES: + case ERROR_SECTOR_NOT_FOUND: + case ERROR_BAD_NETPATH: + case ERROR_BAD_NET_NAME: + case ERROR_BAD_PATHNAME: + case ERROR_FILENAME_EXCED_RANGE: + res = LV_FS_RES_NOT_EX; + break; + case ERROR_DISK_FULL: + res = LV_FS_RES_FULL; + break; + case ERROR_SHARING_VIOLATION: + case ERROR_LOCK_VIOLATION: + case ERROR_DRIVE_LOCKED: + res = LV_FS_RES_LOCKED; + break; + case ERROR_ACCESS_DENIED: + case ERROR_CURRENT_DIRECTORY: + case ERROR_WRITE_PROTECT: + case ERROR_NETWORK_ACCESS_DENIED: + case ERROR_CANNOT_MAKE: + case ERROR_FAIL_I24: + case ERROR_SEEK_ON_DEVICE: + case ERROR_NOT_LOCKED: + case ERROR_LOCK_FAILED: + res = LV_FS_RES_DENIED; + break; + case ERROR_BUSY: + res = LV_FS_RES_BUSY; + break; + case ERROR_TIMEOUT: + res = LV_FS_RES_TOUT; + break; + case ERROR_NOT_SAME_DEVICE: + case ERROR_DIRECT_ACCESS_HANDLE: + res = LV_FS_RES_NOT_IMP; + break; + case ERROR_TOO_MANY_OPEN_FILES: + case ERROR_ARENA_TRASHED: + case ERROR_NOT_ENOUGH_MEMORY: + case ERROR_INVALID_BLOCK: + case ERROR_OUT_OF_PAPER: + case ERROR_SHARING_BUFFER_EXCEEDED: + case ERROR_NOT_ENOUGH_QUOTA: + res = LV_FS_RES_OUT_OF_MEM; + break; + case ERROR_INVALID_FUNCTION: + case ERROR_INVALID_ACCESS: + case ERROR_INVALID_DATA: + case ERROR_BAD_COMMAND: + case ERROR_BAD_LENGTH: + case ERROR_INVALID_PARAMETER: + case ERROR_NEGATIVE_SEEK: + res = LV_FS_RES_INV_PARAM; + break; + default: + res = LV_FS_RES_UNKNOWN; + break; + } + + return res; +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + DWORD desired_access = 0; + + if(mode & LV_FS_MODE_RD) { + desired_access |= GENERIC_READ; + } + + if(mode & LV_FS_MODE_WR) { + desired_access |= GENERIC_WRITE; + } + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[MAX_PATH]; + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path); + + return (void *)CreateFileA( + buf, + desired_access, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + return CloseHandle((HANDLE)file_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + return ReadFile((HANDLE)file_p, buf, btr, (LPDWORD)br, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + return WriteFile((HANDLE)file_p, buf, btw, (LPDWORD)bw, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + + DWORD move_method = (DWORD) -1; + if(whence == LV_FS_SEEK_SET) { + move_method = FILE_BEGIN; + } + else if(whence == LV_FS_SEEK_CUR) { + move_method = FILE_CURRENT; + } + else if(whence == LV_FS_SEEK_END) { + move_method = FILE_END; + } + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = pos; + return SetFilePointerEx((HANDLE)file_p, distance_to_move, NULL, move_method) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + + if(!pos_p) { + return LV_FS_RES_INV_PARAM; + } + + LARGE_INTEGER file_pointer; + file_pointer.QuadPart = 0; + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = 0; + if(SetFilePointerEx( + (HANDLE)file_p, + distance_to_move, + &file_pointer, + FILE_CURRENT)) { + if(file_pointer.QuadPart > LONG_MAX) { + return LV_FS_RES_INV_PARAM; + } + else { + *pos_p = file_pointer.LowPart; + return LV_FS_RES_OK; + } + } + else { + return fs_error_from_win32(GetLastError()); + } +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); + handle->dir_p = INVALID_HANDLE_VALUE; + handle->next_error = LV_FS_RES_OK; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[MAX_PATH_LEN]; +#ifdef LV_FS_WIN32_PATH + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s\\*", path); +#else + lv_snprintf(buf, sizeof(buf), "%s\\*", path); +#endif + + lv_strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + do { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_free(handle); + handle->next_error = fs_error_from_win32(GetLastError()); + return INVALID_HANDLE_VALUE; + } + else { + handle->next_error = LV_FS_RES_OK; + return handle; + } +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; + lv_strcpy(fn, handle->next_fn); + lv_fs_res_t current_error = handle->next_error; + lv_strcpy(handle->next_fn, ""); + + WIN32_FIND_DATAA fdata; + + while(FindNextFileA(handle->dir_p, &fdata)) { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } + + if(handle->next_fn[0] == '\0') { + handle->next_error = fs_error_from_win32(GetLastError()); + } + + return current_error; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; + lv_fs_res_t res = FindClose(handle->dir_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); + lv_free(handle); + return res; +} + +#else /*LV_USE_FS_WIN32 == 0*/ + +#if defined(LV_FS_WIN32_LETTER) && LV_FS_WIN32_LETTER != '\0' + #warning "LV_USE_FS_WIN32 is not enabled but LV_FS_WIN32_LETTER is set" +#endif + +#endif diff --git a/libraries/lvgl/src/libs/fsdrv/lv_fsdrv.h b/libraries/lvgl/src/libs/fsdrv/lv_fsdrv.h new file mode 100644 index 0000000..993a967 --- /dev/null +++ b/libraries/lvgl/src/libs/fsdrv/lv_fsdrv.h @@ -0,0 +1,62 @@ +/** + * @file lv_fsdrv.h + * + */ + +#ifndef LV_FSDRV_H +#define LV_FSDRV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_FS_FATFS +void lv_fs_fatfs_init(void); +#endif + +#if LV_USE_FS_STDIO +void lv_fs_stdio_init(void); +#endif + +#if LV_USE_FS_POSIX +void lv_fs_posix_init(void); +#endif + +#if LV_USE_FS_WIN32 +void lv_fs_win32_init(void); +#endif + +#if LV_USE_FS_MEMFS +void lv_fs_memfs_init(void); +#endif + +#if LV_USE_FS_LITTLEFS +void lv_fs_littlefs_init(void); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_FSDRV_H*/ diff --git a/libraries/lvgl/src/libs/gif/gifdec.c b/libraries/lvgl/src/libs/gif/gifdec.c new file mode 100644 index 0000000..b35a573 --- /dev/null +++ b/libraries/lvgl/src/libs/gif/gifdec.c @@ -0,0 +1,796 @@ +#include "gifdec.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_color.h" +#if LV_USE_GIF + +#include +#include +#include + +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +typedef struct Entry { + uint16_t length; + uint16_t prefix; + uint8_t suffix; +} Entry; + +typedef struct Table { + int bulk; + int nentries; + Entry * entries; +} Table; + +#if LV_GIF_CACHE_DECODE_DATA +#define LZW_MAXBITS 12 +#define LZW_TABLE_SIZE (1 << LZW_MAXBITS) +#define LZW_CACHE_SIZE (LZW_TABLE_SIZE * 4) +#endif + +static gd_GIF * gif_open(gd_GIF * gif); +static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file); +static void f_gif_read(gd_GIF * gif, void * buf, size_t len); +static int f_gif_seek(gd_GIF * gif, size_t pos, int k); +static void f_gif_close(gd_GIF * gif); + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "gifdec_mve.h" +#endif + +static uint16_t +read_num(gd_GIF * gif) +{ + uint8_t bytes[2]; + + f_gif_read(gif, bytes, 2); + return bytes[0] + (((uint16_t) bytes[1]) << 8); +} + +gd_GIF * +gd_open_gif_file(const char * fname) +{ + gd_GIF gif_base; + memset(&gif_base, 0, sizeof(gif_base)); + + bool res = f_gif_open(&gif_base, fname, true); + if(!res) return NULL; + + return gif_open(&gif_base); +} + +gd_GIF * +gd_open_gif_data(const void * data) +{ + gd_GIF gif_base; + memset(&gif_base, 0, sizeof(gif_base)); + + bool res = f_gif_open(&gif_base, data, false); + if(!res) return NULL; + + return gif_open(&gif_base); +} + +static gd_GIF * gif_open(gd_GIF * gif_base) +{ + uint8_t sigver[3]; + uint16_t width, height, depth; + uint8_t fdsz, bgidx, aspect; + uint8_t * bgcolor; + int gct_sz; + gd_GIF * gif = NULL; + + /* Header */ + f_gif_read(gif_base, sigver, 3); + if(memcmp(sigver, "GIF", 3) != 0) { + LV_LOG_WARN("invalid signature\n"); + goto fail; + } + /* Version */ + f_gif_read(gif_base, sigver, 3); + if(memcmp(sigver, "89a", 3) != 0) { + LV_LOG_WARN("invalid version\n"); + goto fail; + } + /* Width x Height */ + width = read_num(gif_base); + height = read_num(gif_base); + /* FDSZ */ + f_gif_read(gif_base, &fdsz, 1); + /* Presence of GCT */ + if(!(fdsz & 0x80)) { + LV_LOG_WARN("no global color table\n"); + goto fail; + } + /* Color Space's Depth */ + depth = ((fdsz >> 4) & 7) + 1; + /* Ignore Sort Flag. */ + /* GCT Size */ + gct_sz = 1 << ((fdsz & 0x07) + 1); + /* Background Color Index */ + f_gif_read(gif_base, &bgidx, 1); + /* Aspect Ratio */ + f_gif_read(gif_base, &aspect, 1); + /* Create gd_GIF Structure. */ +#if LV_GIF_CACHE_DECODE_DATA + gif = lv_malloc(sizeof(gd_GIF) + 5 * width * height + LZW_CACHE_SIZE); + #else + gif = lv_malloc(sizeof(gd_GIF) + 5 * width * height); + #endif + if(!gif) goto fail; + memcpy(gif, gif_base, sizeof(gd_GIF)); + gif->width = width; + gif->height = height; + gif->depth = depth; + /* Read GCT */ + gif->gct.size = gct_sz; + f_gif_read(gif, gif->gct.colors, 3 * gif->gct.size); + gif->palette = &gif->gct; + gif->bgindex = bgidx; + gif->canvas = (uint8_t *) &gif[1]; + gif->frame = &gif->canvas[4 * width * height]; + if(gif->bgindex) { + memset(gif->frame, gif->bgindex, gif->width * gif->height); + } + bgcolor = &gif->palette->colors[gif->bgindex * 3]; + #if LV_GIF_CACHE_DECODE_DATA + gif->lzw_cache = gif->frame + width * height; + #endif + +#ifdef GIFDEC_FILL_BG + GIFDEC_FILL_BG(gif->canvas, gif->width * gif->height, 1, gif->width * gif->height, bgcolor, 0xff); +#else + for(int i = 0; i < gif->width * gif->height; i++) { + gif->canvas[i * 4 + 0] = *(bgcolor + 2); + gif->canvas[i * 4 + 1] = *(bgcolor + 1); + gif->canvas[i * 4 + 2] = *(bgcolor + 0); + gif->canvas[i * 4 + 3] = 0xff; + } +#endif + gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->loop_count = -1; + goto ok; +fail: + f_gif_close(gif_base); +ok: + return gif; +} + +static void +discard_sub_blocks(gd_GIF * gif) +{ + uint8_t size; + + do { + f_gif_read(gif, &size, 1); + f_gif_seek(gif, size, LV_FS_SEEK_CUR); + } while(size); +} + +static void +read_plain_text_ext(gd_GIF * gif) +{ + if(gif->plain_text) { + uint16_t tx, ty, tw, th; + uint8_t cw, ch, fg, bg; + size_t sub_block; + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); /* block size = 12 */ + tx = read_num(gif); + ty = read_num(gif); + tw = read_num(gif); + th = read_num(gif); + f_gif_read(gif, &cw, 1); + f_gif_read(gif, &ch, 1); + f_gif_read(gif, &fg, 1); + f_gif_read(gif, &bg, 1); + sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->plain_text(gif, tx, ty, tw, th, cw, ch, fg, bg); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + } + else { + /* Discard plain text metadata. */ + f_gif_seek(gif, 13, LV_FS_SEEK_CUR); + } + /* Discard plain text sub-blocks. */ + discard_sub_blocks(gif); +} + +static void +read_graphic_control_ext(gd_GIF * gif) +{ + uint8_t rdit; + + /* Discard block size (always 0x04). */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + f_gif_read(gif, &rdit, 1); + gif->gce.disposal = (rdit >> 2) & 3; + gif->gce.input = rdit & 2; + gif->gce.transparency = rdit & 1; + gif->gce.delay = read_num(gif); + f_gif_read(gif, &gif->gce.tindex, 1); + /* Skip block terminator. */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); +} + +static void +read_comment_ext(gd_GIF * gif) +{ + if(gif->comment) { + size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->comment(gif); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + } + /* Discard comment sub-blocks. */ + discard_sub_blocks(gif); +} + +static void +read_application_ext(gd_GIF * gif) +{ + char app_id[8]; + char app_auth_code[3]; + uint16_t loop_count; + + /* Discard block size (always 0x0B). */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + /* Application Identifier. */ + f_gif_read(gif, app_id, 8); + /* Application Authentication Code. */ + f_gif_read(gif, app_auth_code, 3); + if(!strncmp(app_id, "NETSCAPE", sizeof(app_id))) { + /* Discard block size (0x03) and constant byte (0x01). */ + f_gif_seek(gif, 2, LV_FS_SEEK_CUR); + loop_count = read_num(gif); + if(gif->loop_count < 0) { + if(loop_count == 0) { + gif->loop_count = 0; + } + else { + gif->loop_count = loop_count + 1; + } + } + /* Skip block terminator. */ + f_gif_seek(gif, 1, LV_FS_SEEK_CUR); + } + else if(gif->application) { + size_t sub_block = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->application(gif, app_id, app_auth_code); + f_gif_seek(gif, sub_block, LV_FS_SEEK_SET); + discard_sub_blocks(gif); + } + else { + discard_sub_blocks(gif); + } +} + +static void +read_ext(gd_GIF * gif) +{ + uint8_t label; + + f_gif_read(gif, &label, 1); + switch(label) { + case 0x01: + read_plain_text_ext(gif); + break; + case 0xF9: + read_graphic_control_ext(gif); + break; + case 0xFE: + read_comment_ext(gif); + break; + case 0xFF: + read_application_ext(gif); + break; + default: + LV_LOG_WARN("unknown extension: %02X\n", label); + } +} + +static uint16_t +get_key(gd_GIF *gif, int key_size, uint8_t *sub_len, uint8_t *shift, uint8_t *byte) +{ + int bits_read; + int rpad; + int frag_size; + uint16_t key; + + key = 0; + for (bits_read = 0; bits_read < key_size; bits_read += frag_size) { + rpad = (*shift + bits_read) % 8; + if (rpad == 0) { + /* Update byte. */ + if (*sub_len == 0) { + f_gif_read(gif, sub_len, 1); /* Must be nonzero! */ + if (*sub_len == 0) return 0x1000; + } + f_gif_read(gif, byte, 1); + (*sub_len)--; + } + frag_size = MIN(key_size - bits_read, 8 - rpad); + key |= ((uint16_t) ((*byte) >> rpad)) << bits_read; + } + /* Clear extra bits to the left. */ + key &= (1 << key_size) - 1; + *shift = (*shift + key_size) % 8; + return key; +} + +#if LV_GIF_CACHE_DECODE_DATA +static int +read_image_data(gd_GIF *gif, int interlace) +{ + uint8_t sub_len, shift, byte; + int ret = 0; + int key_size; + int y, pass, linesize; + uint8_t *ptr = NULL; + uint8_t *ptr_row_start = NULL; + uint8_t *ptr_base = NULL; + size_t start, end; + uint16_t key, clear_code, stop_code, curr_code; + int frm_off, frm_size,curr_size,top_slot,new_codes,slot; + /* The first value of the value sequence corresponding to key */ + int first_value; + int last_key; + uint8_t *sp = NULL; + uint8_t *p_stack = NULL; + uint8_t *p_suffix = NULL; + uint16_t *p_prefix = NULL; + + /* get initial key size and clear code, stop code */ + f_gif_read(gif, &byte, 1); + key_size = (int) byte; + clear_code = 1 << key_size; + stop_code = clear_code + 1; + key = 0; + + start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + discard_sub_blocks(gif); + end = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + f_gif_seek(gif, start, LV_FS_SEEK_SET); + + linesize = gif->width; + ptr_base = &gif->frame[gif->fy * linesize + gif->fx]; + ptr_row_start = ptr_base; + ptr = ptr_row_start; + sub_len = shift = 0; + /* decoder */ + pass = 0; + y = 0; + p_stack = gif->lzw_cache; + p_suffix = gif->lzw_cache + LZW_TABLE_SIZE; + p_prefix = (uint16_t*)(gif->lzw_cache + LZW_TABLE_SIZE * 2); + frm_off = 0; + frm_size = gif->fw * gif->fh; + curr_size = key_size + 1; + top_slot = 1 << curr_size; + new_codes = clear_code + 2; + slot = new_codes; + first_value = -1; + last_key = -1; + sp = p_stack; + + while (frm_off < frm_size) { + /* copy data to frame buffer */ + while (sp > p_stack) { + *ptr++ = *(--sp); + frm_off += 1; + /* read one line */ + if ((ptr - ptr_row_start) == gif->fw) { + if (interlace) { + switch(pass) { + case 0: + case 1: + y += 8; + ptr_row_start += linesize * 8; + break; + case 2: + y += 4; + ptr_row_start += linesize * 4; + break; + case 3: + y += 2; + ptr_row_start += linesize * 2; + break; + default: + break; + } + while (y >= gif->fh) { + y = 4 >> pass; + ptr_row_start = ptr_base + linesize * y; + pass++; + } + } else { + ptr_row_start += linesize; + } + ptr = ptr_row_start; + } + } + + key = get_key(gif, curr_size, &sub_len, &shift, &byte); + + if (key == stop_code || key >= LZW_TABLE_SIZE) + break; + + if (key == clear_code) { + curr_size = key_size + 1; + slot = new_codes; + top_slot = 1 << curr_size; + first_value = last_key = -1; + sp = p_stack; + continue; + } + + curr_code = key; + /* + * If the current code is a code that will be added to the decoding + * dictionary, it is composed of the data list corresponding to the + * previous key and its first data. + * */ + if (curr_code == slot && first_value >= 0) { + *sp++ = first_value; + curr_code = last_key; + }else if(curr_code >= slot) + break; + + while (curr_code >= new_codes) { + *sp++ = p_suffix[curr_code]; + curr_code = p_prefix[curr_code]; + } + *sp++ = curr_code; + + /* Add code to decoding dictionary */ + if (slot < top_slot && last_key >= 0) { + p_suffix[slot] = curr_code; + p_prefix[slot++] = last_key; + } + first_value = curr_code; + last_key = key; + if (slot >= top_slot) { + if (curr_size < LZW_MAXBITS) { + top_slot <<= 1; + curr_size += 1; + } + } + } + + if (key == stop_code) f_gif_read(gif, &sub_len, 1); /* Must be zero! */ + f_gif_seek(gif, end, LV_FS_SEEK_SET); + return ret; +} +#else +static Table * +new_table(int key_size) +{ + int key; + int init_bulk = MAX(1 << (key_size + 1), 0x100); + Table * table = lv_malloc(sizeof(*table) + sizeof(Entry) * init_bulk); + if(table) { + table->bulk = init_bulk; + table->nentries = (1 << key_size) + 2; + table->entries = (Entry *) &table[1]; + for(key = 0; key < (1 << key_size); key++) + table->entries[key] = (Entry) { + 1, 0xFFF, key + }; + } + return table; +} + +/* Add table entry. Return value: + * 0 on success + * +1 if key size must be incremented after this addition + * -1 if could not realloc table */ +static int +add_entry(Table ** tablep, uint16_t length, uint16_t prefix, uint8_t suffix) +{ + Table * table = *tablep; + if(table->nentries == table->bulk) { + table->bulk *= 2; + table = lv_realloc(table, sizeof(*table) + sizeof(Entry) * table->bulk); + if(!table) return -1; + table->entries = (Entry *) &table[1]; + *tablep = table; + } + table->entries[table->nentries] = (Entry) { + length, prefix, suffix + }; + table->nentries++; + if((table->nentries & (table->nentries - 1)) == 0) + return 1; + return 0; +} + +/* Compute output index of y-th input line, in frame of height h. */ +static int +interlaced_line_index(int h, int y) +{ + int p; /* number of lines in current pass */ + + p = (h - 1) / 8 + 1; + if(y < p) /* pass 1 */ + return y * 8; + y -= p; + p = (h - 5) / 8 + 1; + if(y < p) /* pass 2 */ + return y * 8 + 4; + y -= p; + p = (h - 3) / 4 + 1; + if(y < p) /* pass 3 */ + return y * 4 + 2; + y -= p; + /* pass 4 */ + return y * 2 + 1; +} + +/* Decompress image pixels. + * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table). */ +static int +read_image_data(gd_GIF * gif, int interlace) +{ + uint8_t sub_len, shift, byte; + int init_key_size, key_size, table_is_full = 0; + int frm_off, frm_size, str_len = 0, i, p, x, y; + uint16_t key, clear, stop; + int ret; + Table * table; + Entry entry = {0}; + size_t start, end; + + f_gif_read(gif, &byte, 1); + key_size = (int) byte; + start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + discard_sub_blocks(gif); + end = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + f_gif_seek(gif, start, LV_FS_SEEK_SET); + clear = 1 << key_size; + stop = clear + 1; + table = new_table(key_size); + key_size++; + init_key_size = key_size; + sub_len = shift = 0; + key = get_key(gif, key_size, &sub_len, &shift, &byte); /* clear code */ + frm_off = 0; + ret = 0; + frm_size = gif->fw * gif->fh; + while(frm_off < frm_size) { + if(key == clear) { + key_size = init_key_size; + table->nentries = (1 << (key_size - 1)) + 2; + table_is_full = 0; + } + else if(!table_is_full) { + ret = add_entry(&table, str_len + 1, key, entry.suffix); + if(ret == -1) { + lv_free(table); + return -1; + } + if(table->nentries == 0x1000) { + ret = 0; + table_is_full = 1; + } + } + key = get_key(gif, key_size, &sub_len, &shift, &byte); + if(key == clear) continue; + if(key == stop || key == 0x1000) break; + if(ret == 1) key_size++; + entry = table->entries[key]; + str_len = entry.length; + for(i = 0; i < str_len; i++) { + p = frm_off + entry.length - 1; + x = p % gif->fw; + y = p / gif->fw; + if(interlace) + y = interlaced_line_index((int) gif->fh, y); + gif->frame[(gif->fy + y) * gif->width + gif->fx + x] = entry.suffix; + if(entry.prefix == 0xFFF) + break; + else + entry = table->entries[entry.prefix]; + } + frm_off += str_len; + if(key < table->nentries - 1 && !table_is_full) + table->entries[table->nentries - 1].suffix = entry.suffix; + } + lv_free(table); + if(key == stop) f_gif_read(gif, &sub_len, 1); /* Must be zero! */ + f_gif_seek(gif, end, LV_FS_SEEK_SET); + return 0; +} + +#endif + +/* Read image. + * Return 0 on success or -1 on out-of-memory (w.r.t. LZW code table). */ +static int +read_image(gd_GIF * gif) +{ + uint8_t fisrz; + int interlace; + + /* Image Descriptor. */ + gif->fx = read_num(gif); + gif->fy = read_num(gif); + gif->fw = read_num(gif); + gif->fh = read_num(gif); + f_gif_read(gif, &fisrz, 1); + interlace = fisrz & 0x40; + /* Ignore Sort Flag. */ + /* Local Color Table? */ + if(fisrz & 0x80) { + /* Read LCT */ + gif->lct.size = 1 << ((fisrz & 0x07) + 1); + f_gif_read(gif, gif->lct.colors, 3 * gif->lct.size); + gif->palette = &gif->lct; + } + else + gif->palette = &gif->gct; + /* Image Data. */ + return read_image_data(gif, interlace); +} + +static void +render_frame_rect(gd_GIF * gif, uint8_t * buffer) +{ + int i = gif->fy * gif->width + gif->fx; +#ifdef GIFDEC_RENDER_FRAME + GIFDEC_RENDER_FRAME(&buffer[i * 4], gif->fw, gif->fh, gif->width, + &gif->frame[i], gif->palette->colors, + gif->gce.transparency ? gif->gce.tindex : 0x100); +#else + int j, k; + uint8_t index, * color; + + for(j = 0; j < gif->fh; j++) { + for(k = 0; k < gif->fw; k++) { + index = gif->frame[(gif->fy + j) * gif->width + gif->fx + k]; + color = &gif->palette->colors[index * 3]; + if(!gif->gce.transparency || index != gif->gce.tindex) { + buffer[(i + k) * 4 + 0] = *(color + 2); + buffer[(i + k) * 4 + 1] = *(color + 1); + buffer[(i + k) * 4 + 2] = *(color + 0); + buffer[(i + k) * 4 + 3] = 0xFF; + } + } + i += gif->width; + } +#endif +} + +static void +dispose(gd_GIF * gif) +{ + int i; + uint8_t * bgcolor; + switch(gif->gce.disposal) { + case 2: /* Restore to background color. */ + bgcolor = &gif->palette->colors[gif->bgindex * 3]; + + uint8_t opa = 0xff; + if(gif->gce.transparency) opa = 0x00; + + i = gif->fy * gif->width + gif->fx; +#ifdef GIFDEC_FILL_BG + GIFDEC_FILL_BG(&(gif->canvas[i * 4]), gif->fw, gif->fh, gif->width, bgcolor, opa); +#else + int j, k; + for(j = 0; j < gif->fh; j++) { + for(k = 0; k < gif->fw; k++) { + gif->canvas[(i + k) * 4 + 0] = *(bgcolor + 2); + gif->canvas[(i + k) * 4 + 1] = *(bgcolor + 1); + gif->canvas[(i + k) * 4 + 2] = *(bgcolor + 0); + gif->canvas[(i + k) * 4 + 3] = opa; + } + i += gif->width; + } +#endif + break; + case 3: /* Restore to previous, i.e., don't update canvas.*/ + break; + default: + /* Add frame non-transparent pixels to canvas. */ + render_frame_rect(gif, gif->canvas); + } +} + +/* Return 1 if got a frame; 0 if got GIF trailer; -1 if error. */ +int +gd_get_frame(gd_GIF * gif) +{ + char sep; + + dispose(gif); + f_gif_read(gif, &sep, 1); + while(sep != ',') { + if(sep == ';') { + f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); + if(gif->loop_count == 1 || gif->loop_count < 0) { + return 0; + } + else if(gif->loop_count > 1) { + gif->loop_count--; + } + } + else if(sep == '!') + read_ext(gif); + else return -1; + f_gif_read(gif, &sep, 1); + } + if(read_image(gif) == -1) + return -1; + return 1; +} + +void +gd_render_frame(gd_GIF * gif, uint8_t * buffer) +{ + render_frame_rect(gif, buffer); +} + +void +gd_rewind(gd_GIF * gif) +{ + gif->loop_count = -1; + f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); +} + +void +gd_close_gif(gd_GIF * gif) +{ + f_gif_close(gif); + lv_free(gif); +} + +static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file) +{ + gif->f_rw_p = 0; + gif->data = NULL; + gif->is_file = is_file; + + if(is_file) { + lv_fs_res_t res = lv_fs_open(&gif->fd, path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return false; + else return true; + } + else { + gif->data = path; + return true; + } +} + +static void f_gif_read(gd_GIF * gif, void * buf, size_t len) +{ + if(gif->is_file) { + lv_fs_read(&gif->fd, buf, len, NULL); + } + else { + memcpy(buf, &gif->data[gif->f_rw_p], len); + gif->f_rw_p += len; + } +} + +static int f_gif_seek(gd_GIF * gif, size_t pos, int k) +{ + if(gif->is_file) { + lv_fs_seek(&gif->fd, pos, k); + uint32_t x; + lv_fs_tell(&gif->fd, &x); + return x; + } + else { + if(k == LV_FS_SEEK_CUR) gif->f_rw_p += pos; + else if(k == LV_FS_SEEK_SET) gif->f_rw_p = pos; + return gif->f_rw_p; + } +} + +static void f_gif_close(gd_GIF * gif) +{ + if(gif->is_file) { + lv_fs_close(&gif->fd); + } +} + +#endif /*LV_USE_GIF*/ diff --git a/libraries/lvgl/src/libs/gif/gifdec.h b/libraries/lvgl/src/libs/gif/gifdec.h new file mode 100644 index 0000000..3fd60bf --- /dev/null +++ b/libraries/lvgl/src/libs/gif/gifdec.h @@ -0,0 +1,71 @@ +#ifndef GIFDEC_H +#define GIFDEC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "../../misc/lv_fs.h" + +#if LV_USE_GIF + +typedef struct _gd_Palette { + int size; + uint8_t colors[0x100 * 3]; +} gd_Palette; + +typedef struct _gd_GCE { + uint16_t delay; + uint8_t tindex; + uint8_t disposal; + int input; + int transparency; +} gd_GCE; + + + +typedef struct _gd_GIF { + lv_fs_file_t fd; + const char * data; + uint8_t is_file; + uint32_t f_rw_p; + int32_t anim_start; + uint16_t width, height; + uint16_t depth; + int32_t loop_count; + gd_GCE gce; + gd_Palette * palette; + gd_Palette lct, gct; + void (*plain_text)( + struct _gd_GIF * gif, uint16_t tx, uint16_t ty, + uint16_t tw, uint16_t th, uint8_t cw, uint8_t ch, + uint8_t fg, uint8_t bg + ); + void (*comment)(struct _gd_GIF * gif); + void (*application)(struct _gd_GIF * gif, char id[8], char auth[3]); + uint16_t fx, fy, fw, fh; + uint8_t bgindex; + uint8_t * canvas, * frame; + #if LV_GIF_CACHE_DECODE_DATA + uint8_t *lzw_cache; + #endif +} gd_GIF; + +gd_GIF * gd_open_gif_file(const char * fname); + +gd_GIF * gd_open_gif_data(const void * data); + +void gd_render_frame(gd_GIF * gif, uint8_t * buffer); + +int gd_get_frame(gd_GIF * gif); +void gd_rewind(gd_GIF * gif); +void gd_close_gif(gd_GIF * gif); + +#endif /*LV_USE_GIF*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* GIFDEC_H */ diff --git a/libraries/lvgl/src/libs/gif/gifdec_mve.h b/libraries/lvgl/src/libs/gif/gifdec_mve.h new file mode 100644 index 0000000..6d83393 --- /dev/null +++ b/libraries/lvgl/src/libs/gif/gifdec_mve.h @@ -0,0 +1,140 @@ +/** + * @file gifdec_mve.h + * + */ + +#ifndef GIFDEC_MVE_H +#define GIFDEC_MVE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +#define GIFDEC_FILL_BG(dst, w, h, stride, color, opa) \ + _gifdec_fill_bg_mve(dst, w, h, stride, color, opa) + +#define GIFDEC_RENDER_FRAME(dst, w, h, stride, frame, pattern, tindex) \ + _gifdec_render_frame_mve(dst, w, h, stride, frame, pattern, tindex) + +/********************** + * MACROS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline void _gifdec_fill_bg_mve(uint8_t * dst, uint16_t w, uint16_t h, uint16_t stride, uint8_t * color, + uint8_t opa) +{ + lv_color32_t c = lv_color32_make(*(color + 0), *(color + 1), *(color + 2), opa); + uint32_t color_32 = *(uint32_t *)&c; + + __asm volatile( + ".p2align 2 \n" + "vdup.32 q0, %[src] \n" + "3: \n" + "mov r0, %[dst] \n" + + "wlstp.32 lr, %[w], 1f \n" + "2: \n" + + "vstrw.32 q0, [r0], #16 \n" + "letp lr, 2b \n" + "1: \n" + "add %[dst], %[iTargetStride] \n" + "subs %[h], #1 \n" + "bne 3b \n" + : [dst] "+r"(dst), + [h] "+r"(h) + : [src] "r"(color_32), + [w] "r"(w), + [iTargetStride] "r"(stride * sizeof(uint32_t)) + : "r0", "q0", "memory", "r14", "cc"); +} + +static inline void _gifdec_render_frame_mve(uint8_t * dst, uint16_t w, uint16_t h, uint16_t stride, uint8_t * frame, + uint8_t * pattern, uint16_t tindex) +{ + if(w == 0 || h == 0) { + return; + } + + __asm volatile( + "vmov.u16 q3, #255 \n" + "vshl.u16 q3, q3, #8 \n" /* left shift 8 for a*/ + + "mov r0, #2 \n" + "vidup.u16 q6, r0, #4 \n" /* [2, 6, 10, 14, 18, 22, 26, 30] */ + "mov r0, #0 \n" + "vidup.u16 q7, r0, #4 \n" /* [0, 4, 8, 12, 16, 20, 24, 28] */ + + "3: \n" + "mov r1, %[dst] \n" + "mov r2, %[frame] \n" + + "wlstp.16 lr, %[w], 1f \n" + "2: \n" + + "mov r0, #3 \n" + "vldrb.u16 q4, [r2], #8 \n" + "vmul.u16 q5, q4, r0 \n" + + "mov r0, #1 \n" + "vldrb.u16 q2, [%[pattern], q5] \n" /* load 8 pixel r*/ + + "vadd.u16 q5, q5, r0 \n" + "vldrb.u16 q1, [%[pattern], q5] \n" /* load 8 pixel g*/ + + "vadd.u16 q5, q5, r0 \n" + "vldrb.u16 q0, [%[pattern], q5] \n" /* load 8 pixel b*/ + + "vshl.u16 q1, q1, #8 \n" /* left shift 8 for g*/ + + "vorr.u16 q0, q0, q1 \n" /* make 8 pixel gb*/ + "vorr.u16 q1, q2, q3 \n" /* make 8 pixel ar*/ + + "vcmp.i16 ne, q4, %[tindex] \n" + "vpstt \n" + "vstrht.16 q0, [r1, q7] \n" + "vstrht.16 q1, [r1, q6] \n" + "add r1, r1, #32 \n" + + "letp lr, 2b \n" + + "1: \n" + "mov r0, %[stride], LSL #2 \n" + "add %[dst], r0 \n" + "add %[frame], %[stride] \n" + "subs %[h], #1 \n" + "bne 3b \n" + + : [dst] "+r"(dst), + [frame] "+r"(frame), + [h] "+r"(h) + : [pattern] "r"(pattern), + [w] "r"(w), + [stride] "r"(stride), + [tindex] "r"(tindex) + : "r0", "r1", "r2", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "memory", "r14", "cc"); +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*GIFDEC_MVE_H*/ diff --git a/libraries/lvgl/src/libs/gif/lv_gif.c b/libraries/lvgl/src/libs/gif/lv_gif.c new file mode 100644 index 0000000..e1eab06 --- /dev/null +++ b/libraries/lvgl/src/libs/gif/lv_gif.c @@ -0,0 +1,181 @@ +/** + * @file lv_gifenc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gif.h" +#if LV_USE_GIF + +#include "gifdec.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_gif_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_gif_class = { + .constructor_cb = lv_gif_constructor, + .destructor_cb = lv_gif_destructor, + .instance_size = sizeof(lv_gif_t), + .base_class = &lv_image_class, + .name = "gif", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_gif_create(lv_obj_t * parent) +{ + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_gif_set_src(lv_obj_t * obj, const void * src) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + + /*Close previous gif if any*/ + if(gifobj->gif) { + lv_image_cache_drop(lv_image_get_src(obj)); + + gd_close_gif(gifobj->gif); + gifobj->gif = NULL; + gifobj->imgdsc.data = NULL; + } + + if(lv_image_src_get_type(src) == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + gifobj->gif = gd_open_gif_data(img_dsc->data); + } + else if(lv_image_src_get_type(src) == LV_IMAGE_SRC_FILE) { + gifobj->gif = gd_open_gif_file(src); + } + if(gifobj->gif == NULL) { + LV_LOG_WARN("Couldn't load the source"); + return; + } + + gifobj->imgdsc.data = gifobj->gif->canvas; + gifobj->imgdsc.header.cf = LV_COLOR_FORMAT_ARGB8888; + gifobj->imgdsc.header.h = gifobj->gif->height; + gifobj->imgdsc.header.w = gifobj->gif->width; + gifobj->last_call = lv_tick_get(); + + lv_image_set_src(obj, &gifobj->imgdsc); + + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); + + next_frame_task_cb(gifobj->timer); + +} + +void lv_gif_restart(lv_obj_t * obj) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(gifobj->gif == NULL) { + LV_LOG_WARN("Gif resource not loaded correctly"); + return; + } + + gd_rewind(gifobj->gif); + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); +} + +void lv_gif_pause(lv_obj_t * obj) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + lv_timer_pause(gifobj->timer); +} + +void lv_gif_resume(lv_obj_t * obj) +{ + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(gifobj->gif == NULL) { + LV_LOG_WARN("Gif resource not loaded correctly"); + return; + } + + lv_timer_resume(gifobj->timer); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_gif_t * gifobj = (lv_gif_t *) obj; + + gifobj->gif = NULL; + gifobj->timer = lv_timer_create(next_frame_task_cb, 10, obj); + lv_timer_pause(gifobj->timer); +} + +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + lv_image_cache_drop(lv_image_get_src(obj)); + + if(gifobj->gif) + gd_close_gif(gifobj->gif); + lv_timer_delete(gifobj->timer); +} + +static void next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = t->user_data; + lv_gif_t * gifobj = (lv_gif_t *) obj; + uint32_t elaps = lv_tick_elaps(gifobj->last_call); + if(elaps < gifobj->gif->gce.delay * 10) return; + + gifobj->last_call = lv_tick_get(); + + int has_next = gd_get_frame(gifobj->gif); + if(has_next == 0) { + /*It was the last repeat*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + if(res != LV_FS_RES_OK) return; + } + + gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); + + lv_image_cache_drop(lv_image_get_src(obj)); + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_GIF*/ diff --git a/libraries/lvgl/src/libs/gif/lv_gif.h b/libraries/lvgl/src/libs/gif/lv_gif.h new file mode 100644 index 0000000..9228bf5 --- /dev/null +++ b/libraries/lvgl/src/libs/gif/lv_gif.h @@ -0,0 +1,87 @@ +/** + * @file lv_gif.h + * + */ + +#ifndef LV_GIF_H +#define LV_GIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_GIF + +#include "gifdec.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_image_t img; + gd_GIF * gif; + lv_timer_t * timer; + lv_draw_buf_t imgdsc; + uint32_t last_call; +} lv_gif_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_gif_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a gif object + * @param parent pointer to an object, it will be the parent of the new gif. + * @return pointer to the gif obj + */ +lv_obj_t * lv_gif_create(lv_obj_t * parent); + +/** + * Set the gif data to display on the object + * @param obj pointer to a gif object + * @param src 1) pointer to an ::lv_image_dsc_t descriptor (which contains gif raw data) or + * 2) path to a gif file (e.g. "S:/dir/anim.gif") + */ +void lv_gif_set_src(lv_obj_t * obj, const void * src); + +/** + * Restart a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_restart(lv_obj_t * obj); + +/** + * Pause a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_pause(lv_obj_t * obj); + +/** + * Resume a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_resume(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GIF*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_GIF_H*/ diff --git a/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c b/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c new file mode 100644 index 0000000..f3ac140 --- /dev/null +++ b/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c @@ -0,0 +1,597 @@ +/** + * @file lv_libjpeg_turbo.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_LIBJPEG_TURBO + +#include "lv_libjpeg_turbo.h" +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#define JPEG_PIXEL_SIZE 3 /* RGB888 */ +#define JPEG_SIGNATURE 0xFFD8FF +#define IS_JPEG_SIGNATURE(x) (((x) & 0x00FFFFFF) == JPEG_SIGNATURE) + +/********************** + * TYPEDEFS + **********************/ +typedef struct error_mgr_s { + struct jpeg_error_mgr pub; + jmp_buf jb; +} error_mgr_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_draw_buf_t * decode_jpeg_file(const char * filename); +static uint8_t * read_file(const char * filename, uint32_t * size); +static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation); +static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height); +static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation); +static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle); +static void error_exit(j_common_ptr cinfo); +/********************** + * STATIC VARIABLES + **********************/ +const int JPEG_EXIF = 0x45786966; /* Exif data structure tag */ +const int JPEG_BIG_ENDIAN_TAG = 0x4d4d; +const int JPEG_LITTLE_ENDIAN_TAG = 0x4949; + +/********************** + * MACROS + **********************/ +#define TRANS_32_VALUE(big_endian, data) big_endian ? \ + ((*(data) << 24) | (*((data) + 1) << 16) | (*((data) + 2) << 8) | *((data) + 3)) : \ + (*(data) | (*((data) + 1) << 8) | (*((data) + 2) << 16) | (*((data) + 3) << 24)) +#define TRANS_16_VALUE(big_endian, data) big_endian ? \ + ((*(data) << 8) | *((data) + 1)) : (*(data) | (*((data) + 1) << 8)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the JPEG decoder functions in LVGL + */ +void lv_libjpeg_turbo_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/ +} + +void lv_libjpeg_turbo_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a JPEG image + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_image_src_t src_type = lv_image_src_get_type(src); /*Get the source type*/ + + /*If it's a JPEG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("Can't open file: %s", fn); + return LV_RESULT_INVALID; + } + + uint32_t jpg_signature = 0; + uint32_t rn; + lv_fs_read(&f, &jpg_signature, sizeof(jpg_signature), &rn); + lv_fs_close(&f); + + if(rn != sizeof(jpg_signature)) { + LV_LOG_WARN("file: %s signature len = %" LV_PRIu32 " error", fn, rn); + return LV_RESULT_INVALID; + } + + bool is_jpeg_ext = (lv_strcmp(lv_fs_get_ext(fn), "jpg") == 0) + || (lv_strcmp(lv_fs_get_ext(fn), "jpeg") == 0); + + if(!IS_JPEG_SIGNATURE(jpg_signature)) { + if(is_jpeg_ext) { + LV_LOG_WARN("file: %s signature = 0X%" LV_PRIX32 " error", fn, jpg_signature); + } + return LV_RESULT_INVALID; + } + + uint32_t width; + uint32_t height; + uint32_t orientation = 0; + + if(!get_jpeg_head_info(fn, &width, &height, &orientation)) { + return LV_RESULT_INVALID; + } + + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_RGB888; + header->w = (orientation % 180) ? height : width; + header->h = (orientation % 180) ? width : height; + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a JPEG image and return the decided image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + /*If it's a JPEG file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + lv_draw_buf_t * decoded = decode_jpeg_file(fn); + if(decoded == NULL) { + LV_LOG_WARN("decode jpeg file failed"); + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) return LV_RES_OK; + +#if LV_CACHE_DEF_SIZE > 0 + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; +#endif + return LV_RESULT_OK; /*If not returned earlier then it failed*/ + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || LV_CACHE_DEF_SIZE == 0) + lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); + else + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); +} + +static uint8_t * read_file(const char * filename, uint32_t * size) +{ + uint8_t * data = NULL; + lv_fs_file_t f; + uint32_t data_size; + uint32_t rn; + lv_fs_res_t res; + + *size = 0; + + res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("can't open %s", filename); + return NULL; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_END); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_tell(&f, &data_size); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + goto failed; + } + + /*Read file to buffer*/ + data = lv_malloc(data_size); + if(data == NULL) { + LV_LOG_WARN("malloc failed for data"); + goto failed; + } + + res = lv_fs_read(&f, data, data_size, &rn); + + if(res == LV_FS_RES_OK && rn == data_size) { + *size = rn; + } + else { + LV_LOG_WARN("read file failed"); + lv_free(data); + data = NULL; + } + +failed: + lv_fs_close(&f); + + return data; +} + +static lv_draw_buf_t * decode_jpeg_file(const char * filename) +{ + /* This struct contains the JPEG decompression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + */ + struct jpeg_decompress_struct cinfo; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + error_mgr_t jerr; + + /* More stuff */ + JSAMPARRAY buffer; /* Output row buffer */ + + int row_stride; /* physical row width in output buffer */ + uint32_t image_angle = 0; /* image rotate angle */ + + lv_draw_buf_t * decoded = NULL; + + /* In this example we want to open the input file before doing anything else, + * so that the setjmp() error recovery below can assume the file is open. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to read binary files. + */ + + uint32_t data_size; + uint8_t * data = read_file(filename, &data_size); + if(data == NULL) { + LV_LOG_WARN("can't load file %s", filename); + return NULL; + } + + /* allocate and initialize JPEG decompression object */ + + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + /* Establish the setjmp return context for my_error_exit to use. */ + if(setjmp(jerr.jb)) { + + LV_LOG_WARN("decoding error"); + + if(decoded) { + lv_draw_buf_destroy(decoded); + } + + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + lv_free(data); + return NULL; + } + + /* Get rotate angle from Exif data */ + if(!get_jpeg_direction(data, data_size, &image_angle)) { + LV_LOG_WARN("read jpeg orientation failed."); + } + + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); + + /* specify data source (eg, a file or buffer) */ + + jpeg_mem_src(&cinfo, data, data_size); + + /* read file parameters with jpeg_read_header() */ + + jpeg_read_header(&cinfo, TRUE); + + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.doc for more info. + */ + + /* set parameters for decompression */ + + cinfo.out_color_space = JCS_EXT_BGR; + + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Start decompressor */ + + jpeg_start_decompress(&cinfo); + + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + uint32_t buf_width = (image_angle % 180) ? cinfo.output_height : cinfo.output_width; + uint32_t buf_height = (image_angle % 180) ? cinfo.output_width : cinfo.output_height; + decoded = lv_draw_buf_create(buf_width, buf_height, LV_COLOR_FORMAT_RGB888, LV_STRIDE_AUTO); + if(decoded != NULL) { + uint32_t line_index = 0; + /* while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while(cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + jpeg_read_scanlines(&cinfo, buffer, 1); + + /* Assume put_scanline_someplace wants a pointer and sample count. */ + rotate_buffer(decoded, buffer[0], line_index, image_angle); + + line_index++; + } + } + + /* Finish decompression */ + + jpeg_finish_decompress(&cinfo); + + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + lv_free(data); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ + return decoded; +} + +static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation) +{ + uint8_t * data = NULL; + uint32_t data_size; + data = read_file(filename, &data_size); + if(data == NULL) { + return false; + } + + if(!get_jpeg_size(data, data_size, width, height)) { + LV_LOG_WARN("read jpeg size failed."); + } + + if(!get_jpeg_direction(data, data_size, orientation)) { + LV_LOG_WARN("read jpeg orientation failed."); + } + + lv_free(data); + + return JPEG_HEADER_OK; +} + +static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height) +{ + struct jpeg_decompress_struct cinfo; + error_mgr_t jerr; + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + + if(setjmp(jerr.jb)) { + LV_LOG_WARN("read jpeg head failed"); + jpeg_destroy_decompress(&cinfo); + return false; + } + + jpeg_create_decompress(&cinfo); + + jpeg_mem_src(&cinfo, data, data_size); + + int ret = jpeg_read_header(&cinfo, TRUE); + + if(ret == JPEG_HEADER_OK) { + *width = cinfo.image_width; + *height = cinfo.image_height; + } + else { + LV_LOG_WARN("read jpeg head failed: %d", ret); + } + + jpeg_destroy_decompress(&cinfo); + + return JPEG_HEADER_OK; +} + +static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation) +{ + struct jpeg_decompress_struct cinfo; + error_mgr_t jerr; + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + + if(setjmp(jerr.jb)) { + LV_LOG_WARN("read jpeg orientation failed"); + jpeg_destroy_decompress(&cinfo); + return false; + } + + jpeg_create_decompress(&cinfo); + + jpeg_mem_src(&cinfo, data, data_size); + + jpeg_save_markers(&cinfo, JPEG_APP0 + 1, 0xFFFF); + + cinfo.marker->read_markers(&cinfo); + + jpeg_saved_marker_ptr marker = cinfo.marker_list; + while(marker != NULL) { + if(marker->marker == JPEG_APP0 + 1) { + JOCTET FAR * app1_data = marker->data; + if(TRANS_32_VALUE(true, app1_data) == JPEG_EXIF) { + uint16_t endian_tag = TRANS_16_VALUE(true, app1_data + 4 + 2); + if(!(endian_tag == JPEG_LITTLE_ENDIAN_TAG || endian_tag == JPEG_BIG_ENDIAN_TAG)) { + jpeg_destroy_decompress(&cinfo); + return false; + } + bool is_big_endian = endian_tag == JPEG_BIG_ENDIAN_TAG; + /* first ifd offset addr : 4bytes(Exif) + 2bytes(0x00) + 2bytes(align) + 2bytes(tag mark) */ + unsigned int offset = TRANS_32_VALUE(is_big_endian, app1_data + 8 + 2); + /* ifd base : 4bytes(Exif) + 2bytes(0x00) */ + unsigned char * ifd = 0; + do { + /* ifd start: 4bytes(Exif) + 2bytes(0x00) + offset value(2bytes(align) + 2bytes(tag mark) + 4bytes(offset size)) */ + unsigned int entry_offset = 4 + 2 + offset + 2; + if(entry_offset >= marker->data_length) { + jpeg_destroy_decompress(&cinfo); + return false; + } + ifd = app1_data + entry_offset; + unsigned short num_entries = TRANS_16_VALUE(is_big_endian, ifd - 2); + if(entry_offset + num_entries * 12 >= marker->data_length) { + jpeg_destroy_decompress(&cinfo); + return false; + } + for(int i = 0; i < num_entries; i++) { + unsigned short tag = TRANS_16_VALUE(is_big_endian, ifd); + if(tag == 0x0112) { + /* ifd entry: 12bytes = 2bytes(tag number) + 2bytes(kind of data) + 4bytes(number of components) + 4bytes(data) + * orientation kind(0x03) of data is unsigned short */ + int dirc = TRANS_16_VALUE(is_big_endian, ifd + 2 + 2 + 4); + switch(dirc) { + case 1: + *orientation = 0; + break; + case 3: + *orientation = 180; + break; + case 6: + *orientation = 90; + break; + case 8: + *orientation = 270; + break; + default: + *orientation = 0; + } + } + ifd += 12; + } + offset = TRANS_32_VALUE(is_big_endian, ifd); + } while(offset != 0); + } + break; + } + marker = marker->next; + } + + jpeg_destroy_decompress(&cinfo); + + return JPEG_HEADER_OK; +} + +static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle) +{ + if(angle == 90) { + for(uint32_t x = 0; x < decoded->header.h; x++) { + uint32_t dst_index = x * decoded->header.stride + (decoded->header.w - line_index - 1) * JPEG_PIXEL_SIZE; + lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + } + else if(angle == 180) { + for(uint32_t x = 0; x < decoded->header.w; x++) { + uint32_t dst_index = (decoded->header.h - line_index - 1) * decoded->header.stride + x * JPEG_PIXEL_SIZE; + lv_memcpy(decoded->data + dst_index, buffer + (decoded->header.w - x - 1) * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + } + else if(angle == 270) { + for(uint32_t x = 0; x < decoded->header.h; x++) { + uint32_t dst_index = (decoded->header.h - x - 1) * decoded->header.stride + line_index * JPEG_PIXEL_SIZE; + lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + } + else { + lv_memcpy(decoded->data + line_index * decoded->header.stride, buffer, decoded->header.stride); + } +} + +static void error_exit(j_common_ptr cinfo) +{ + error_mgr_t * myerr = (error_mgr_t *)cinfo->err; + (*cinfo->err->output_message)(cinfo); + longjmp(myerr->jb, 1); +} + +#endif /*LV_USE_LIBJPEG_TURBO*/ diff --git a/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h b/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h new file mode 100644 index 0000000..177c83a --- /dev/null +++ b/libraries/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h @@ -0,0 +1,48 @@ +/** + * @file lv_libjpeg_turbo.h + * + */ + +#ifndef LV_LIBJPEG_TURBO_H +#define LV_LIBJPEG_TURBO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LIBJPEG_TURBO + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the JPEG-Turbo decoder functions in LVGL + */ +void lv_libjpeg_turbo_init(void); + +void lv_libjpeg_turbo_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIBJPEG_TURBO*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LIBJPEG_TURBO_H*/ diff --git a/libraries/lvgl/src/libs/libpng/lv_libpng.c b/libraries/lvgl/src/libs/libpng/lv_libpng.c new file mode 100644 index 0000000..8f539b8 --- /dev/null +++ b/libraries/lvgl/src/libs/libpng/lv_libpng.c @@ -0,0 +1,287 @@ +/** + * @file lv_libpng.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_LIBPNG + +#include "lv_libpng.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_draw_buf_t * decode_png_file(const char * filename); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_libpng_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/ +} + +void lv_libpng_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param src can be file name or pointer to a C array + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_image_src_t src_type = lv_image_src_get_type(src); /*Get the source type*/ + + /*If it's a PNG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + + /* Read the width and height from the file. They have a constant location: + * [16..19]: width + * [20..23]: height + */ + uint8_t buf[24]; + uint32_t rn; + lv_fs_read(&f, buf, sizeof(buf), &rn); + lv_fs_close(&f); + + if(rn != sizeof(buf)) return LV_RESULT_INVALID; + + const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + if(memcmp(buf, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; + + uint32_t * size = (uint32_t *)&buf[16]; + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_ARGB8888; + /*The width and height are stored in Big endian format so convert them to little endian*/ + header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a PNG image and return the decided image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + /*If it's a PNG file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + lv_draw_buf_t * decoded = decode_png_file(fn); + if(decoded == NULL) { + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + lv_draw_buf_destroy(decoded); + decoded = adjusted; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) return LV_RES_OK; + +#if LV_CACHE_DEF_SIZE > 0 + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; +#endif + return LV_RESULT_OK; /*The image is fully decoded. Return with its pointer*/ + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || LV_CACHE_DEF_SIZE == 0) + lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); + else + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); +} + +static uint8_t * alloc_file(const char * filename, uint32_t * size) +{ + uint8_t * data = NULL; + lv_fs_file_t f; + uint32_t data_size; + uint32_t rn; + lv_fs_res_t res; + + *size = 0; + + res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("can't open %s", filename); + return NULL; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_END); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_tell(&f, &data_size); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + goto failed; + } + + /*Read file to buffer*/ + data = lv_malloc(data_size); + if(data == NULL) { + LV_LOG_WARN("malloc failed for data"); + goto failed; + } + + res = lv_fs_read(&f, data, data_size, &rn); + + if(res == LV_FS_RES_OK && rn == data_size) { + *size = rn; + } + else { + LV_LOG_WARN("read file failed"); + lv_free(data); + data = NULL; + } + +failed: + lv_fs_close(&f); + + return data; +} + +static lv_draw_buf_t * decode_png_file(const char * filename) +{ + int ret; + + /*Prepare png_image*/ + png_image image; + lv_memzero(&image, sizeof(image)); + image.version = PNG_IMAGE_VERSION; + + uint32_t data_size; + uint8_t * data = alloc_file(filename, &data_size); + if(data == NULL) { + LV_LOG_WARN("can't load file: %s", filename); + return NULL; + } + + /*Ready to read file*/ + ret = png_image_begin_read_from_memory(&image, data, data_size); + if(!ret) { + LV_LOG_ERROR("png file: %s read failed: %d", filename, ret); + lv_free(data); + return NULL; + } + + /*Set color format*/ + image.format = PNG_FORMAT_BGRA; + + /*Alloc image buffer*/ + lv_draw_buf_t * decoded; + decoded = lv_draw_buf_create(image.width, image.height, LV_COLOR_FORMAT_ARGB8888, PNG_IMAGE_ROW_STRIDE(image)); + if(decoded == NULL) { + LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), filename); + lv_free(data); + return NULL; + } + + /*Start decoding*/ + ret = png_image_finish_read(&image, NULL, decoded->data, 0, NULL); + png_image_free(&image); + lv_free(data); + if(!ret) { + LV_LOG_ERROR("png decode failed: %d", ret); + lv_draw_buf_destroy(decoded); + return NULL; + } + + return decoded; +} + +#endif /*LV_USE_LIBPNG*/ diff --git a/libraries/lvgl/src/libs/libpng/lv_libpng.h b/libraries/lvgl/src/libs/libpng/lv_libpng.h new file mode 100644 index 0000000..1279458 --- /dev/null +++ b/libraries/lvgl/src/libs/libpng/lv_libpng.h @@ -0,0 +1,48 @@ +/** + * @file lv_libpng.h + * + */ + +#ifndef LV_LIBPNG_H +#define LV_LIBPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LIBPNG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_libpng_init(void); + +void lv_libpng_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIBPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LIBPNG_H*/ diff --git a/libraries/lvgl/src/libs/lodepng/lodepng.c b/libraries/lvgl/src/libs/lodepng/lodepng.c new file mode 100644 index 0000000..385cf45 --- /dev/null +++ b/libraries/lvgl/src/libs/lodepng/lodepng.c @@ -0,0 +1,7053 @@ +/* +LodePNG version 20201017 + +Copyright (c) 2005-2020 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" +#if LV_USE_LODEPNG + +#ifdef LODEPNG_COMPILE_DISK + #include /* LONG_MAX */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ALLOCATORS + #include /* allocations */ +#endif /* LODEPNG_COMPILE_ALLOCATORS */ + +#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ + #pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ + #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ + +const char * LODEPNG_VERSION_STRING = "20201017"; + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void * lodepng_malloc(size_t size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_malloc(size); +} + +/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ +static void * lodepng_realloc(void * ptr, size_t new_size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(new_size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_realloc(ptr, new_size); +} + +static void lodepng_free(void * ptr) +{ + lv_free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +/* TODO: support giving additional void* payload to the custom allocators */ +void * lodepng_malloc(size_t size); +void * lodepng_realloc(void * ptr, size_t new_size); +void lodepng_free(void * ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* convince the compiler to inline a function, for use when this measurably improves performance */ +/* inline is not available in C90, but use it when supported by the compiler */ +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define LODEPNG_INLINE inline +#else + #define LODEPNG_INLINE /* not available */ +#endif + +/* restrict is not available in C90, but use it when supported by the compiler */ +#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ + (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ + (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) + #define LODEPNG_RESTRICT __restrict +#else + #define LODEPNG_RESTRICT /* not available */ +#endif + +/* Replacements for C library functions such as memcpy and strlen, to support platforms +where a full C library is not available. The compiler can recognize them and compile +to something as fast. */ + +static void lodepng_memcpy(void * LODEPNG_RESTRICT dst, + const void * LODEPNG_RESTRICT src, size_t size) +{ + lv_memcpy(dst, src, size); +} + +static void lodepng_memset(void * LODEPNG_RESTRICT dst, + int value, size_t num) +{ + lv_memset(dst, value, num); +} + +/* does not check memory out of bounds, do not use on untrusted data */ +static size_t lodepng_strlen(const char * a) +{ + const char * orig = a; + /* avoid warning about unused function in case of disabled COMPILE... macros */ + (void)(&lodepng_strlen); + while(*a) a++; + return (size_t)(a - orig); +} + +#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define LODEPNG_ABS(x) ((x) < 0 ? -(x) : (x)) + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) +/* Safely check if adding two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_addofl(size_t a, size_t b, size_t * result) +{ + *result = a + b; /* Unsigned addition is well defined and safe in C90 */ + return *result < a; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ + +#ifdef LODEPNG_COMPILE_DECODER +/* Safely check if multiplying two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_mulofl(size_t a, size_t b, size_t * result) +{ + *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ + return (a != 0 && *result / a != b); +} + +#ifdef LODEPNG_COMPILE_ZLIB +/* Safely check if a + b > c, even if overflow could happen. */ +static int lodepng_gtofl(size_t a, size_t b, size_t c) +{ + size_t d; + if(lodepng_addofl(a, b, &d)) return 1; + return d > c; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code){\ + errorvar = code;\ + break;\ + } + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code){\ + errorvar = code;\ + return code;\ + } + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call){\ + unsigned error = call;\ + if(error) return error;\ + } + +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code){\ + errorvar = code;\ + return;\ + } + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*dynamic vector of unsigned ints*/ +typedef struct uivector { + unsigned * data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void * p) +{ + ((uivector *)p)->size = ((uivector *)p)->allocsize = 0; + lodepng_free(((uivector *)p)->data); + ((uivector *)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector * p, size_t size) +{ + size_t allocsize = size * sizeof(unsigned); + if(allocsize > p->allocsize) { + size_t newsize = allocsize + (p->allocsize >> 1u); + void * data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned *)data; + } + else return 0; /*error: not enough memory*/ + } + p->size = size; + return 1; /*success*/ +} + +static void uivector_init(uivector * p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector * p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector { + unsigned char * data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector * p, size_t size) +{ + if(size > p->allocsize) { + size_t newsize = size + (p->allocsize >> 1u); + void * data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned char *)data; + } + else return 0; /*error: not enough memory*/ + } + p->size = size; + return 1; /*success*/ +} + +static ucvector ucvector_init(unsigned char * buffer, size_t size) +{ + ucvector v; + v.data = buffer; + v.allocsize = v.size = size; + return v; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +/*free string pointer and set it to NULL*/ +static void string_cleanup(char ** out) +{ + lodepng_free(*out); + *out = NULL; +} + +/*also appends null termination character*/ +static char * alloc_string_sized(const char * in, size_t insize) +{ + char * out = (char *)lodepng_malloc(insize + 1); + if(out) { + lodepng_memcpy(out, in, insize); + out[insize] = 0; + } + return out; +} + +/* dynamically allocates a new string with a copy of the null terminated input text */ +static char * alloc_string(const char * in) +{ + return alloc_string_sized(in, lodepng_strlen(in)); +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) +static unsigned lodepng_read32bitInt(const unsigned char * buffer) +{ + return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | + ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); +} +#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char * buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +/* returns negative value on error. This should be pure C compatible, so no fstat. */ +static long lodepng_filesize(const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return -1; + uint32_t size = 0; + if(lv_fs_seek(&f, 0, LV_FS_SEEK_END) != 0) { + lv_fs_close(&f); + return -1; + } + + lv_fs_tell(&f, &size); + lv_fs_close(&f); + return size; +} + +/* load file into buffer that already has the correct allocated size. Returns error code.*/ +static unsigned lodepng_buffer_file(unsigned char * out, size_t size, const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return 78; + + uint32_t br; + res = lv_fs_read(&f, out, size, &br); + lv_fs_close(&f); + + if(res != LV_FS_RES_OK) return 78; + if(br != size) return 78; + + return 0; +} + +unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename) +{ + long size = lodepng_filesize(filename); + if(size < 0) return 78; + *outsize = (size_t)size; + + *out = (unsigned char *)lodepng_malloc((size_t)size); + if(!(*out) && size > 0) return 83; /*the above malloc failed*/ + + return lodepng_buffer_file(*out, (size_t)size, filename); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_WR); + if(res != LV_FS_RES_OK) return 79; + + uint32_t bw; + res = lv_fs_write(&f, buffer, buffersize, &bw); + lv_fs_close(&f); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER + +typedef struct { + ucvector * data; + unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ +} LodePNGBitWriter; + +static void LodePNGBitWriter_init(LodePNGBitWriter * writer, ucvector * data) +{ + writer->data = data; + writer->bp = 0; +} + +/*TODO: this ignores potential out of memory errors*/ +#define WRITEBIT(writer, bit){\ + /* append new byte */\ + if(((writer->bp) & 7u) == 0) {\ + if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ + writer->data->data[writer->data->size - 1] = 0;\ + }\ + (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ + ++writer->bp;\ + } + +/* LSB of value is written first, and LSB of bytes is used first */ +static void writeBits(LodePNGBitWriter * writer, unsigned value, size_t nbits) +{ + if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ + WRITEBIT(writer, value); + } + else { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + size_t i; + for(i = 0; i != nbits; ++i) { + WRITEBIT(writer, (unsigned char)((value >> i) & 1)); + } + } +} + +/* This one is to use for adding huffman symbol, the value bits are written MSB first */ +static void writeBitsReversed(LodePNGBitWriter * writer, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); + } +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +typedef struct { + const unsigned char * data; + size_t size; /*size of data in bytes*/ + size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ + size_t bp; + unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ +} LodePNGBitReader; + +/* data size argument is in bytes. Returns error if size too large causing overflow */ +static unsigned LodePNGBitReader_init(LodePNGBitReader * reader, const unsigned char * data, size_t size) +{ + size_t temp; + reader->data = data; + reader->size = size; + /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ + if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; + /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and + trying to ensure 32 more bits*/ + if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; + reader->bp = 0; + reader->buffer = 0; + return 0; /*ok*/ +} + +/* +ensureBits functions: +Ensures the reader can at least read nbits bits in one or more readBits calls, +safely even if not enough bits are available. +Returns 1 if there are enough bits available, 0 if not. +*/ + +/*See ensureBits documentation above. This one ensures exactly 1 bit */ +/*static unsigned ensureBits1(LodePNGBitReader* reader) { + if(reader->bp >= reader->bitsize) return 0; + reader->buffer = (unsigned)reader->data[reader->bp >> 3u] >> (reader->bp & 7u); + return 1; +}*/ + +/*See ensureBits documentation above. This one ensures up to 9 bits */ +static unsigned ensureBits9(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 1u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 17 bits */ +static unsigned ensureBits17(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 2u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 25 bits */ +static LODEPNG_INLINE unsigned ensureBits25(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 3u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + return 1; + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/*See ensureBits documentation above. This one ensures up to 32 bits */ +static LODEPNG_INLINE unsigned ensureBits32(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 4u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); + return 1; + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + return reader->bp + nbits <= reader->bitsize; + } +} + +/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ +static unsigned peekBits(LodePNGBitReader * reader, size_t nbits) +{ + /* The shift allows nbits to be only up to 31. */ + return reader->buffer & ((1u << nbits) - 1u); +} + +/* Must have enough bits available with ensureBits */ +static void advanceBits(LodePNGBitReader * reader, size_t nbits) +{ + reader->buffer >>= nbits; + reader->bp += nbits; +} + +/* Must have enough bits available with ensureBits */ +static unsigned readBits(LodePNGBitReader * reader, size_t nbits) +{ + unsigned result = peekBits(reader, nbits); + advanceBits(reader, nbits); + return result; +} + +#if 0 /*Disable because tests fail due to unused declaration*/ +/* Public for testing only. steps and result must have numsteps values. */ +static unsigned lode_png_test_bitreader(const unsigned char * data, size_t size, + size_t numsteps, const size_t * steps, unsigned * result) +{ + size_t i; + LodePNGBitReader reader; + unsigned error = LodePNGBitReader_init(&reader, data, size); + if(error) return 0; + for(i = 0; i < numsteps; i++) { + size_t step = steps[i]; + unsigned ok; + if(step > 25) ok = ensureBits32(&reader, step); + else if(step > 17) ok = ensureBits25(&reader, step); + else if(step > 9) ok = ensureBits17(&reader, step); + else ok = ensureBits9(&reader, step); + if(!ok) return 0; + result[i] = readBits(&reader, step); + } + return 1; +} +#endif + +#endif /*LODEPNG_COMPILE_DECODER*/ + +static unsigned reverseBits(unsigned bits, unsigned num) +{ + /*TODO: implement faster lookup table based version when needed*/ + unsigned i, result = 0; + for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; + return result; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258 + }; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0 + }; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 + }; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 + }; + +/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman +tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree { + unsigned * codes; /*the huffman codes (bit patterns representing the symbols)*/ + unsigned * lengths; /*the lengths of the huffman codes*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ + /* for reading only */ + unsigned char * table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ + unsigned short * table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ +} HuffmanTree; + +static void HuffmanTree_init(HuffmanTree * tree) +{ + tree->codes = 0; + tree->lengths = 0; + tree->table_len = 0; + tree->table_value = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree * tree) +{ + lodepng_free(tree->codes); + lodepng_free(tree->lengths); + lodepng_free(tree->table_len); + lodepng_free(tree->table_value); +} + +/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ +/* values 8u and 9u work the fastest */ +#define FIRSTBITS 9u + +/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, +which is possible in case of only 0 or 1 present symbols. */ +#define INVALIDSYMBOL 65535u + +/* make table for huffman decoding */ +static unsigned HuffmanTree_makeTable(HuffmanTree * tree) +{ + static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ + static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; + size_t i, numpresent, pointer, size; /*total table size*/ + unsigned * maxlens = (unsigned *)lodepng_malloc(headsize * sizeof(unsigned)); + if(!maxlens) return 83; /*alloc fail*/ + + /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ + lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); + for(i = 0; i < tree->numcodes; i++) { + unsigned symbol = tree->codes[i]; + unsigned l = tree->lengths[i]; + unsigned index; + if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ + /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ + index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); + maxlens[index] = LODEPNG_MAX(maxlens[index], l); + } + /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ + size = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l > FIRSTBITS) size += (1u << (l - FIRSTBITS)); + } + tree->table_len = (unsigned char *)lodepng_malloc(size * sizeof(*tree->table_len)); + tree->table_value = (unsigned short *)lodepng_malloc(size * sizeof(*tree->table_value)); + if(!tree->table_len || !tree->table_value) { + lodepng_free(maxlens); + /* freeing tree->table values is done at a higher scope */ + return 83; /*alloc fail*/ + } + /*initialize with an invalid length to indicate unused entries*/ + for(i = 0; i < size; ++i) tree->table_len[i] = 16; + + /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ + pointer = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l <= FIRSTBITS) continue; + tree->table_len[i] = l; + tree->table_value[i] = pointer; + pointer += (1u << (l - FIRSTBITS)); + } + lodepng_free(maxlens); + + /*fill in the first table for short symbols, or secondary table for long symbols*/ + numpresent = 0; + for(i = 0; i < tree->numcodes; ++i) { + unsigned l = tree->lengths[i]; + unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ + /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ + unsigned reverse = reverseBits(symbol, l); + if(l == 0) continue; + numpresent++; + + if(l <= FIRSTBITS) { + /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ + unsigned num = 1u << (FIRSTBITS - l); + unsigned j; + for(j = 0; j < num; ++j) { + /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ + unsigned index = reverse | (j << l); + if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + tree->table_len[index] = l; + tree->table_value[index] = i; + } + } + else { + /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ + /*the FIRSTBITS MSBs of the symbol are the first table index*/ + unsigned index = reverse & mask; + unsigned maxlen = tree->table_len[index]; + /*log2 of secondary table length, should be >= l - FIRSTBITS*/ + unsigned tablelen = maxlen - FIRSTBITS; + unsigned start = tree->table_value[index]; /*starting index in secondary table*/ + unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ + unsigned j; + if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + for(j = 0; j < num; ++j) { + unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ + unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); + tree->table_len[index2] = l; + tree->table_value[index2] = i; + } + } + } + + if(numpresent < 2) { + /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, + but deflate uses 1 bit instead. In case of 0 symbols, no symbols can + appear at all, but such huffman tree could still exist (e.g. if distance + codes are never used). In both cases, not all symbols of the table will be + filled in. Fill them in with an invalid symbol value so returning them from + huffmanDecodeSymbol will cause error. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) { + /* As length, use a value smaller than FIRSTBITS for the head table, + and a value larger than FIRSTBITS for the secondary table, to ensure + valid behavior for advanceBits when reading this symbol. */ + tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); + tree->table_value[i] = INVALIDSYMBOL; + } + } + } + else { + /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + If that is not the case (due to too long length codes), the table will not + have been fully used, and this is an error (not all bit combinations can be + decoded): an oversubscribed huffman tree, indicated by error 55. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) return 55; + } + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree * tree) +{ + unsigned * blcount; + unsigned * nextcode; + unsigned error = 0; + unsigned bits, n; + + tree->codes = (unsigned *)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + blcount = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + nextcode = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ + + if(!error) { + for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; ++bits) { + nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; + } + /*step 3: generate all the codes*/ + for(n = 0; n != tree->numcodes; ++n) { + if(tree->lengths[n] != 0) { + tree->codes[n] = nextcode[tree->lengths[n]]++; + /*remove superfluous bits from the code*/ + tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); + } + } + } + + lodepng_free(blcount); + lodepng_free(nextcode); + + if(!error) error = HuffmanTree_makeTable(tree); + return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree * tree, const unsigned * bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", +Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ + +/*chain node for boundary package merge*/ +typedef struct BPMNode { + int weight; /*the sum of all weights in this chain*/ + unsigned index; /*index of this leaf node (called "count" in the paper)*/ + struct BPMNode * tail; /*the next nodes in this chain (null if last)*/ + int in_use; +} BPMNode; + +/*lists of chains*/ +typedef struct BPMLists { + /*memory pool*/ + unsigned memsize; + BPMNode * memory; + unsigned numfree; + unsigned nextfree; + BPMNode ** freelist; + /*two heads of lookahead chains per list*/ + unsigned listsize; + BPMNode ** chains0; + BPMNode ** chains1; +} BPMLists; + +/*creates a new chain node with the given parameters, from the memory in the lists */ +static BPMNode * bpmnode_create(BPMLists * lists, int weight, unsigned index, BPMNode * tail) +{ + unsigned i; + BPMNode * result; + + /*memory full, so garbage collect*/ + if(lists->nextfree >= lists->numfree) { + /*mark only those that are in use*/ + for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; + for(i = 0; i != lists->listsize; ++i) { + BPMNode * node; + for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; + for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; + } + /*collect those that are free*/ + lists->numfree = 0; + for(i = 0; i != lists->memsize; ++i) { + if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; + } + lists->nextfree = 0; + } + + result = lists->freelist[lists->nextfree++]; + result->weight = weight; + result->index = index; + result->tail = tail; + return result; +} + +/*sort the leaves with stable mergesort*/ +static void bpmnode_sort(BPMNode * leaves, size_t num) +{ + BPMNode * mem = (BPMNode *)lodepng_malloc(sizeof(*leaves) * num); + size_t width, counter = 0; + for(width = 1; width < num; width *= 2) { + BPMNode * a = (counter & 1) ? mem : leaves; + BPMNode * b = (counter & 1) ? leaves : mem; + size_t p; + for(p = 0; p < num; p += 2 * width) { + size_t q = (p + width > num) ? num : (p + width); + size_t r = (p + 2 * width > num) ? num : (p + 2 * width); + size_t i = p, j = q, k; + for(k = p; k < r; k++) { + if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; + else b[k] = a[j++]; + } + } + counter++; + } + if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); + lodepng_free(mem); +} + +/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ +static void boundaryPM(BPMLists * lists, BPMNode * leaves, size_t numpresent, int c, int num) +{ + unsigned lastindex = lists->chains1[c]->index; + + if(c == 0) { + if(lastindex >= numpresent) return; + lists->chains0[c] = lists->chains1[c]; + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); + } + else { + /*sum of the weights of the head nodes of the previous lookahead chains.*/ + int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; + lists->chains0[c] = lists->chains1[c]; + if(lastindex < numpresent && sum > leaves[lastindex].weight) { + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); + return; + } + lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); + /*in the end we are only interested in the chain of the last list, so no + need to recurse if we're at the last one (this gives measurable speedup)*/ + if(num + 1 < (int)(2 * numpresent - 2)) { + boundaryPM(lists, leaves, numpresent, c - 1, num); + boundaryPM(lists, leaves, numpresent, c - 1, num); + } + } +} + +unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + unsigned i; + size_t numpresent = 0; /*number of symbols with non-zero frequency*/ + BPMNode * leaves; /*the symbols, only those with > 0 frequency*/ + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ + + leaves = (BPMNode *)lodepng_malloc(numcodes * sizeof(*leaves)); + if(!leaves) return 83; /*alloc fail*/ + + for(i = 0; i != numcodes; ++i) { + if(frequencies[i] > 0) { + leaves[numpresent].weight = (int)frequencies[i]; + leaves[numpresent].index = i; + ++numpresent; + } + } + + lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } + else if(numpresent == 1) { + lengths[leaves[0].index] = 1; + lengths[leaves[0].index == 0 ? 1 : 0] = 1; + } + else { + BPMLists lists; + BPMNode * node; + + bpmnode_sort(leaves, numpresent); + + lists.listsize = maxbitlen; + lists.memsize = 2 * maxbitlen * (maxbitlen + 1); + lists.nextfree = 0; + lists.numfree = lists.memsize; + lists.memory = (BPMNode *)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); + lists.freelist = (BPMNode **)lodepng_malloc(lists.memsize * sizeof(BPMNode *)); + lists.chains0 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); + lists.chains1 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); + if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ + + if(!error) { + for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; + + bpmnode_create(&lists, leaves[0].weight, 1, 0); + bpmnode_create(&lists, leaves[1].weight, 2, 0); + + for(i = 0; i != lists.listsize; ++i) { + lists.chains0[i] = &lists.memory[0]; + lists.chains1[i] = &lists.memory[1]; + } + + /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ + for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); + + for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { + for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; + } + } + + lodepng_free(lists.memory); + lodepng_free(lists.freelist); + lodepng_free(lists.chains0); + lodepng_free(lists.chains1); + } + + lodepng_free(leaves); + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree * tree, const unsigned * frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ + tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree * tree) +{ + unsigned i, error = 0; + unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree * tree) +{ + unsigned i, error = 0; + unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code. The bit reader must already have been ensured at least 15 bits +*/ +static unsigned huffmanDecodeSymbol(LodePNGBitReader * reader, const HuffmanTree * codetree) +{ + unsigned short code = peekBits(reader, FIRSTBITS); + unsigned short l = codetree->table_len[code]; + unsigned short value = codetree->table_value[code]; + if(l <= FIRSTBITS) { + advanceBits(reader, l); + return value; + } + else { + unsigned index2; + advanceBits(reader, FIRSTBITS); + index2 = value + peekBits(reader, l - FIRSTBITS); + advanceBits(reader, codetree->table_len[index2] - FIRSTBITS); + return codetree->table_value[index2]; + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification +Returns error code.*/ +static unsigned getTreeInflateFixed(HuffmanTree * tree_ll, HuffmanTree * tree_d) +{ + unsigned error = generateFixedLitLenTree(tree_ll); + if(error) return error; + return generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree * tree_ll, HuffmanTree * tree_d, + LodePNGBitReader * reader) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned * bitlen_ll = 0; /*lit,len code lengths*/ + unsigned * bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned * bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if(!ensureBits17(reader, 14)) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBits(reader, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBits(reader, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBits(reader, 4) + 4; + + bitlen_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) return 83 /*alloc fail*/; + + HuffmanTree_init(&tree_cl); + + while(!error) { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { + ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ + } + for(i = 0; i != HCLEN; ++i) { + ensureBits9(reader, 3); /*out of bounds already checked above */ + bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); + } + for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { + bitlen_cl[CLCL_ORDER[i]] = 0; + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); + lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) { + unsigned code; + ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ + code = huffmanDecodeSymbol(reader, &tree_cl); + if(code <= 15) { /*a length code*/ + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + ++i; + } + else if(code == 16) { /*repeat previous*/ + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + replength += readBits(reader, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + ++i; + } + } + else if(code == 17) { /*repeat "0" 3-10 times*/ + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else if(code == 18) { /*repeat "0" 11-138 times*/ + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else { /*if(code == INVALIDSYMBOL)*/ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ +static unsigned inflateHuffmanBlock(ucvector * out, LodePNGBitReader * reader, + unsigned btype, size_t max_output_size) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); + else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); + + while(!error) { /*decode all symbols until end reached, breaks at end code*/ + /*code_ll is literal, length or end code*/ + unsigned code_ll; + ensureBits25(reader, 20); /* up to 15 for the huffman symbol, up to 5 for the length extra bits */ + code_ll = huffmanDecodeSymbol(reader, &tree_ll); + if(code_ll <= 255) { /*literal symbol*/ + if(!ucvector_resize(out, out->size + 1)) ERROR_BREAK(83 /*alloc fail*/); + out->data[out->size - 1] = (unsigned char)code_ll; + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) { /*length code*/ + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if(numextrabits_l != 0) { + /* bits already ensured above */ + length += readBits(reader, numextrabits_l); + } + + /*part 3: get distance code*/ + ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ + code_d = huffmanDecodeSymbol(reader, &tree_d); + if(code_d > 29) { + if(code_d <= 31) { + ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ + } + else { /* if(code_d == INVALIDSYMBOL) */ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if(numextrabits_d != 0) { + /* bits already ensured above */ + distance += readBits(reader, numextrabits_d); + } + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = out->size; + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + + if(!ucvector_resize(out, out->size + length)) ERROR_BREAK(83 /*alloc fail*/); + if(distance < length) { + size_t forward; + lodepng_memcpy(out->data + start, out->data + backward, distance); + start += distance; + for(forward = distance; forward < length; ++forward) { + out->data[start++] = out->data[backward++]; + } + } + else { + lodepng_memcpy(out->data + start, out->data + backward, length); + } + } + else if(code_ll == 256) { + break; /*end code, break the loop*/ + } + else { /*if(code_ll == INVALIDSYMBOL)*/ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ + } + if(max_output_size && out->size > max_output_size) { + ERROR_BREAK(109); /*error, larger than max size*/ + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector * out, LodePNGBitReader * reader, + const LodePNGDecompressSettings * settings) +{ + size_t bytepos; + size_t size = reader->size; + unsigned LEN, NLEN, error = 0; + + /*go to first boundary of byte*/ + bytepos = (reader->bp + 7u) >> 3u; + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ + LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); + bytepos += 2; + NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); + bytepos += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(!settings->ignore_nlen && LEN + NLEN != 65535) { + return 21; /*error: NLEN is not one's complement of LEN*/ + } + + if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ + + lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); + bytepos += LEN; + + reader->bp = bytepos << 3u; + + return error; +} + +static unsigned lodepng_inflatev(ucvector * out, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + unsigned BFINAL = 0; + LodePNGBitReader reader; + unsigned error = LodePNGBitReader_init(&reader, in, insize); + + if(error) return error; + + while(!BFINAL) { + unsigned BTYPE; + if(!ensureBits9(&reader, 3)) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBits(&reader, 1); + BTYPE = readBits(&reader, 2); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ + else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/ + if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109; + if(error) break; + } + + return error; +} + +unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflatev(ucvector * out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + if(settings->custom_inflate) { + unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); + out->allocsize = out->size; + if(error) { + /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && out->size > settings->max_output_size) error = 109; + } + return error; + } + else { + return lodepng_inflatev(out, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned * array, size_t array_size, size_t value) +{ + /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ + size_t left = 1; + size_t right = array_size - 1; + + while(left <= right) { + size_t mid = (left + right) >> 1; + if(array[mid] >= value) right = mid - 1; + else left = mid + 1; + } + if(left >= array_size || array[left] > value) left--; + return left; +} + +static void addLengthDistance(uivector * values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + size_t pos = values->size; + /*TODO: return error when this fails (out of memory)*/ + unsigned ok = uivector_resize(values, values->size + 4); + if(ok) { + values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; + values->data[pos + 1] = extra_length; + values->data[pos + 2] = dist_code; + values->data[pos + 3] = extra_distance; + } +} + +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ + +typedef struct Hash { + int * head; /*hash value to head circular pos - can be outdated if went around window*/ + /*circular pos to prev circular pos*/ + unsigned short * chain; + int * val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int * headz; /*similar to head, but for chainz*/ + unsigned short * chainz; /*those with same amount of zeros*/ + unsigned short * zeros; /*length of zeros streak, used as a second hash chain*/ +} Hash; + +static unsigned hash_init(Hash * hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int *)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int *)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + + hash->zeros = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int *)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz || !hash->chainz || !hash->zeros) { + return 83; /*alloc fail*/ + } + + /*initialize hash table*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash * hash) +{ + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); +} + + + +static unsigned getHash(const unsigned char * data, size_t size, size_t pos) +{ + unsigned result = 0; + if(pos + 2 < size) { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= ((unsigned)data[pos + 0] << 0u); + result ^= ((unsigned)data[pos + 1] << 4u); + result ^= ((unsigned)data[pos + 2] << 8u); + } + else { + size_t amount, i; + if(pos >= size) return 0; + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char * data, size_t size, size_t pos) +{ + const unsigned char * start = data + pos; + const unsigned char * end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while(data != end && *data == 0) ++data; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash * hash, size_t wpos, unsigned hashval, unsigned short numzeros) +{ + hash->val[wpos] = (int)hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = (int)wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = (int)wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector * out, Hash * hash, + const unsigned char * in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) +{ + size_t pos; + unsigned i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; + unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + unsigned prev_offset; + const unsigned char * lastptr, * foreptr, * backptr; + unsigned hashpos; + + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; ++pos) { + size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else { + numzeros = 0; + } + + updateHashChain(hash, wpos, hashval, numzeros); + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + hashpos = hash->chain[wpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + prev_offset = 0; + for(;;) { + if(chainlength++ >= maxchainlength) break; + current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; + if(current_offset > 0) { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(numzeros >= 3) { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) { /*maximum supported length by deflate is max length*/ + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + if(numzeros >= 3 && length > numzeros) { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } + else { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } + } + + if(lazymatching) { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + hash->headz[numzeros] = -1; /*idem*/ + --pos; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) { /*only lengths of 3 or higher are supported as length/distance pair*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else if(length < minmatch || (length == 3 && offset > 4096)) { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else { + addLengthDistance(out, length, offset); + for(i = 1; i < length; ++i) { + ++pos; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else { + numzeros = 0; + } + updateHashChain(hash, wpos, hashval, numzeros); + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector * out, const unsigned char * data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; + unsigned datapos = 0; + for(i = 0; i != numdeflateblocks; ++i) { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + size_t pos = out->size; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + LEN = 65535; + if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); + out->data[pos + 0] = firstbyte; + out->data[pos + 1] = (unsigned char)(LEN & 255); + out->data[pos + 2] = (unsigned char)(LEN >> 8u); + out->data[pos + 3] = (unsigned char)(NLEN & 255); + out->data[pos + 4] = (unsigned char)(NLEN >> 8u); + lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); + datapos += LEN; + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(LodePNGBitWriter * writer, const uivector * lz77_encoded, + const HuffmanTree * tree_ll, const HuffmanTree * tree_d) +{ + size_t i = 0; + for(i = 0; i != lz77_encoded->size; ++i) { + unsigned val = lz77_encoded->data[i]; + writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); + if(val > 256) { /*for a length code, 3 more things have to be added*/ + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + writeBits(writer, length_extra_bits, n_length_extra_bits); + writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); + writeBits(writer, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(LodePNGBitWriter * writer, Hash * hash, + const unsigned char * data, size_t datapos, size_t dataend, + const LodePNGCompressSettings * settings, unsigned final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lengths used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + unsigned * frequencies_ll = 0; /*frequency of lit,len codes*/ + unsigned * frequencies_d = 0; /*frequency of dist codes*/ + unsigned * frequencies_cl = 0; /*frequency of code length codes*/ + unsigned * bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ + unsigned * bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ + size_t datasize = dataend - datapos; + + /* + If we could call "bitlen_cl" the the code length code lengths ("clcl"), that is the bit lengths of codes to represent + tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are + some analogies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t i; + size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + /* could fit on stack, but >1KB is on the larger side so allocate instead */ + frequencies_ll = (unsigned *)lodepng_malloc(286 * sizeof(*frequencies_ll)); + frequencies_d = (unsigned *)lodepng_malloc(30 * sizeof(*frequencies_d)); + frequencies_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) { + lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); + lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); + lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(settings->use_lz77) { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } + else { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; + ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i != lz77_encoded.size; ++i) { + unsigned symbol = lz77_encoded.data[i]; + ++frequencies_ll[symbol]; + if(symbol > 256) { + unsigned dist = lz77_encoded.data[i + 2]; + ++frequencies_d[dist]; + i += 3; + } + } + frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); + if(error) break; + + numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); + numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); + /*store the code lengths of both generated trees in bitlen_lld*/ + numcodes_lld = numcodes_ll + numcodes_d; + bitlen_lld = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); + /*numcodes_lld_e never needs more size than bitlen_lld*/ + bitlen_lld_e = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); + if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ + numcodes_lld_e = 0; + + for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; + for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i != numcodes_lld; ++i) { + unsigned j = 0; /*amount of repetitions*/ + while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; + + if(bitlen_lld[i] == 0 && j >= 2) { /*repeat code for zeroes*/ + ++j; /*include the first zero*/ + if(j <= 10) { /*repeat code 17 supports max 10 zeroes*/ + bitlen_lld_e[numcodes_lld_e++] = 17; + bitlen_lld_e[numcodes_lld_e++] = j - 3; + } + else { /*repeat code 18 supports max 138 zeroes*/ + if(j > 138) j = 138; + bitlen_lld_e[numcodes_lld_e++] = 18; + bitlen_lld_e[numcodes_lld_e++] = j - 11; + } + i += (j - 1); + } + else if(j >= 3) { /*repeat code for value other than zero*/ + size_t k; + unsigned num = j / 6u, rest = j % 6u; + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + for(k = 0; k < num; ++k) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = 6 - 3; + } + if(rest >= 3) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = rest - 3; + } + else j -= rest; + i += j; + } + else { /*too short to benefit from repeat code*/ + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + for(i = 0; i != numcodes_lld_e; ++i) { + ++frequencies_cl[bitlen_lld_e[i]]; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e[i] >= 16) ++i; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, + NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*compute amount of code-length-code-lengths to output*/ + numcodes_cl = NUM_CODE_LENGTH_CODES; + /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ + while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { + numcodes_cl--; + } + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + writeBits(writer, BFINAL, 1); + writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ + writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies + or in the loop for numcodes_cl above, which saves space. */ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)(numcodes_cl - 4); + writeBits(writer, HLIT, 5); + writeBits(writer, HDIST, 5); + writeBits(writer, HCLEN, 4); + + /*write the code lengths of the code length alphabet ("bitlen_cl")*/ + for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); + + /*write the lengths of the lit/len AND the dist alphabet*/ + for(i = 0; i != numcodes_lld_e; ++i) { + writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); + /*extra bits of repeat codes*/ + if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); + else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); + else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); + + /*write the end code*/ + writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + lodepng_free(frequencies_ll); + lodepng_free(frequencies_d); + lodepng_free(frequencies_cl); + lodepng_free(bitlen_lld); + lodepng_free(bitlen_lld_e); + + return error; +} + +static unsigned deflateFixed(LodePNGBitWriter * writer, Hash * hash, + const unsigned char * data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings * settings, unsigned final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + error = generateFixedLitLenTree(&tree_ll); + if(!error) error = generateFixedDistanceTree(&tree_d); + + if(!error) { + writeBits(writer, BFINAL, 1); + writeBits(writer, 1, 1); /*first bit of BTYPE*/ + writeBits(writer, 0, 1); /*second bit of BTYPE*/ + + if(settings->use_lz77) { /*LZ77 encoded*/ + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else { /*no LZ77, but still will be Huffman compressed*/ + for(i = datapos; i < dataend; ++i) { + writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); + } + } + /*add END code*/ + if(!error) writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); + } + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector * out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + Hash hash; + LodePNGBitWriter writer; + + LodePNGBitWriter_init(&writer, out); + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else { /*if(settings->btype == 2)*/ + /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ + blocksize = insize / 8u + 8; + if(blocksize < 65536) blocksize = 65536; + if(blocksize > 262144) blocksize = 262144; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + + if(!error) { + for(i = 0; i != numdeflateblocks && !error; ++i) { + unsigned final = (i == numdeflateblocks - 1); + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); + } + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + if(settings->custom_deflate) { + unsigned error = settings->custom_deflate(out, outsize, in, insize, settings); + /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } + else { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char * data, unsigned len) +{ + unsigned s1 = adler & 0xffffu; + unsigned s2 = (adler >> 16u) & 0xffffu; + + while(len != 0u) { + unsigned i; + /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5552u ? 5552u : len; + len -= amount; + for(i = 0; i != amount; ++i) { + s1 += (*data++); + s2 += s1; + } + s1 %= 65521u; + s2 %= 65521u; + } + + return (s2 << 16u) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char * data, unsigned len) +{ + return update_adler32(1u, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +static unsigned lodepng_zlib_decompressv(ucvector * out, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflatev(out, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(out->data, (unsigned)(out->size)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + + +unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGDecompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ +static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, + const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) +{ + unsigned error; + if(settings->custom_zlib) { + error = settings->custom_zlib(out, outsize, in, insize, settings); + if(error) { + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && *outsize > settings->max_output_size) error = 109; + } + } + else { + ucvector v = ucvector_init(*out, *outsize); + if(expected_size) { + /*reserve the memory to avoid intermediate reallocations*/ + ucvector_resize(&v, *outsize + expected_size); + v.size = *outsize; + } + error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + } + return error; +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + size_t i; + unsigned error; + unsigned char * deflatedata = 0; + size_t deflatesize = 0; + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + *out = NULL; + *outsize = 0; + if(!error) { + *outsize = deflatesize + 6; + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!*out) error = 83; /*alloc fail*/ + } + + if(!error) { + unsigned ADLER32 = adler32(in, (unsigned)insize); + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + (*out)[0] = (unsigned char)(CMFFLG >> 8); + (*out)[1] = (unsigned char)(CMFFLG & 255); + for(i = 0; i != deflatesize; ++i)(*out)[i + 2] = deflatedata[i]; + lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); + } + + lodepng_free(deflatedata); + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + if(settings->custom_zlib) { + unsigned error = settings->custom_zlib(out, outsize, in, insize, settings); + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } + else { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, + const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + LV_UNUSED(expected_size); + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings * settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings) +{ + settings->ignore_adler32 = 0; + settings->ignore_nlen = 0; + settings->max_output_size = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifndef LODEPNG_NO_COMPILE_CRC +/* CRC polynomial: 0xedb88320 */ +static unsigned lodepng_crc32_table[256] = { + 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, + 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, + 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, + 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, + 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, + 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, + 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, + 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, + 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, + 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, + 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, + 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, + 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, + 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, + 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, + 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, + 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, + 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, + 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, + 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, + 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, + 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, + 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, + 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, + 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, + 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, + 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, + 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, + 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, + 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, + 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, + 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u +}; + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char * data, size_t length) +{ + unsigned r = 0xffffffffu; + size_t i; + for(i = 0; i < length; ++i) { + r = lodepng_crc32_table[(r ^ data[i]) & 0xffu] ^ (r >> 8u); + } + return r ^ 0xffffffffu; +} +#else /* !LODEPNG_NO_COMPILE_CRC */ +unsigned lodepng_crc32(const unsigned char * data, size_t length); +#endif /* !LODEPNG_NO_COMPILE_CRC */ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing PNG color channel bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, +so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ + +static unsigned char readBitFromReversedStream(size_t * bitpointer, const unsigned char * bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + ++(*bitpointer); + return result; +} + +/* TODO: make this faster */ +static unsigned readBitsFromReversedStream(size_t * bitpointer, const unsigned char * bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = 0 ; i < nbits; ++i) { + result <<= 1u; + result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); + } + return result; +} + +static void setBitOfReversedStream(size_t * bitpointer, unsigned char * bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); + else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); + ++(*bitpointer); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char * chunk) +{ + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char * chunk) +{ + unsigned i; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type) +{ + if(lodepng_strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char * chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char * chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char * lodepng_chunk_data(unsigned char * chunk) +{ + return &chunk[8]; +} + +const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char * chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char * chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end) +{ + if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } + else { + size_t total_chunk_length; + unsigned char * result; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + result = chunk + total_chunk_length; + if(result < chunk) return end; /*pointer overflow*/ + return result; + } +} + +const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end) +{ + if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } + else { + size_t total_chunk_length; + const unsigned char * result; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + result = chunk + total_chunk_length; + if(result < chunk) return end; /*pointer overflow*/ + return result; + } +} + +unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]) +{ + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next(chunk, end); + } + + return 0; /*Shouldn't reach this*/ +} + +const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, + const char type[5]) +{ + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next_const(chunk, end); + } + + return 0; /*Shouldn't reach this*/ +} + +unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk) +{ + unsigned i; + size_t total_chunk_length, new_length; + unsigned char * chunk_start, * new_buffer; + + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; + if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; + + new_buffer = (unsigned char *)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outsize) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; + + return 0; +} + +/*Sets length and name and allocates the space for data and crc but does not +set data or crc yet. Returns the start of the chunk in chunk. The start of +the data is at chunk + 8. To finalize chunk, add the data, then use +lodepng_chunk_generate_crc */ +static unsigned lodepng_chunk_init(unsigned char ** chunk, + ucvector * out, + unsigned length, const char * type) +{ + size_t new_length = out->size; + if(lodepng_addofl(new_length, length, &new_length)) return 77; + if(lodepng_addofl(new_length, 12, &new_length)) return 77; + if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ + *chunk = out->data + new_length - length - 12u; + + /*1: length*/ + lodepng_set32bitInt(*chunk, length); + + /*2: chunk name (4 letters)*/ + lodepng_memcpy(*chunk + 4, type, 4); + + return 0; +} + +/* like lodepng_chunk_create but with custom allocsize */ +static unsigned lodepng_chunk_createv(ucvector * out, + unsigned length, const char * type, const unsigned char * data) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); + + /*3: the data*/ + lodepng_memcpy(chunk + 8, data, length); + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, + unsigned length, const char * type, const unsigned char * data) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_chunk_createv(&v, length, type, data); + *out = v.data; + *outsize = v.size; + return error; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types, channels, bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. +Return value is a LodePNG error code.*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) +{ + switch(colortype) { + case LCT_GREY: + if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; + break; + case LCT_RGB: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_PALETTE: + if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8)) return 37; + break; + case LCT_GREY_ALPHA: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_RGBA: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_MAX_OCTET_VALUE: + return 31; /* invalid color type */ + default: + return 31; /* invalid color type */ + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) { + case LCT_GREY: + return 1; + case LCT_RGB: + return 3; + case LCT_PALETTE: + return 1; + case LCT_GREY_ALPHA: + return 2; + case LCT_RGBA: + return 4; + case LCT_MAX_OCTET_VALUE: + return 0; /* invalid color type */ + default: + return 0; /*invalid color type*/ + } +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode * info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +/*allocates palette memory if needed, and initializes all colors to black*/ +static void lodepng_color_mode_alloc_palette(LodePNGColorMode * info) +{ + size_t i; + /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ + /*the palette must have room for up to 256 colors with 4 bytes each.*/ + if(!info->palette) info->palette = (unsigned char *)lodepng_malloc(1024); + if(!info->palette) return; /*alloc fail*/ + for(i = 0; i != 256; ++i) { + /*Initialize all unused colors with black, the value used for invalid palette indices. + This is an error according to the PNG spec, but common PNG decoders make it black instead. + That makes color conversion slightly faster due to no error handling needed.*/ + info->palette[i * 4 + 0] = 0; + info->palette[i * 4 + 1] = 0; + info->palette[i * 4 + 2] = 0; + info->palette[i * 4 + 3] = 255; + } +} + +void lodepng_color_mode_cleanup(LodePNGColorMode * info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source) +{ + lodepng_color_mode_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); + if(source->palette) { + dest->palette = (unsigned char *)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); + } + return 0; +} + +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) +{ + LodePNGColorMode result; + lodepng_color_mode_init(&result); + result.colortype = colortype; + result.bitdepth = bitdepth; + return result; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode * a, const LodePNGColorMode * b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i != a->palettesize * 4; ++i) { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode * info) +{ + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode * info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(!info->palette) { /*allocate palette if empty*/ + lodepng_color_mode_alloc_palette(info); + if(!info->palette) return 83; /*alloc fail*/ + } + if(info->palettesize >= 256) { + return 108; /*too many palette values*/ + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + ++info->palettesize; + return 0; +} + +/*calculate bits per pixel out of colortype and bitdepth*/ +unsigned lodepng_get_bpp(const LodePNGColorMode * info) +{ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode * info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode * info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode * info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info) +{ + size_t i; + for(i = 0; i != info->palettesize; ++i) { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode * info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); + size_t n = (size_t)w * (size_t)h; + return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color) +{ + return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); +} + + +#ifdef LODEPNG_COMPILE_PNG + +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, +and in addition has one extra byte per line: the filter byte. So this gives a larger +result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) +{ + /* + 1 for the filter byte, and possibly plus padding bits per line. */ + /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ + size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; + return (size_t)h * line; +} + +#ifdef LODEPNG_COMPILE_DECODER +/*Safely checks whether size_t overflow can be caused due to amount of pixels. +This check is overcautious rather than precise. If this check indicates no overflow, +you can safely compute in a size_t (but not an unsigned): +-(size_t)w * (size_t)h * 8 +-amount of bytes in IDAT (including filter, padding and Adam7 bytes) +-amount of bytes in raw color model +Returns 1 if overflow possible, 0 if not. +*/ +static int lodepng_pixel_overflow(unsigned w, unsigned h, + const LodePNGColorMode * pngcolor, const LodePNGColorMode * rawcolor) +{ + size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); + size_t numpixels, total; + size_t line; /* bytes per line in worst case */ + + if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; + if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ + + /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ + if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; + if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; + + if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ + if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ + + return 0; /* no overflow */ +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo * info) +{ + unsigned i; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo * info) +{ + unsigned i; + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo * dest, const LodePNGInfo * src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i != 3; ++i) { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char *)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; ++j) { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo * info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo * info) +{ + size_t i; + for(i = 0; i != info->text_num; ++i) { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + size_t i = 0; + dest->text_keys = NULL; + dest->text_strings = NULL; + dest->text_num = 0; + for(i = 0; i != source->text_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +static unsigned lodepng_add_text_sized(LodePNGInfo * info, const char * key, const char * str, size_t size) +{ + char ** new_keys = (char **)(lodepng_realloc(info->text_keys, sizeof(char *) * (info->text_num + 1))); + char ** new_strings = (char **)(lodepng_realloc(info->text_strings, sizeof(char *) * (info->text_num + 1))); + + if(new_keys) info->text_keys = new_keys; + if(new_strings) info->text_strings = new_strings; + + if(!new_keys || !new_strings) return 83; /*alloc fail*/ + + ++info->text_num; + info->text_keys[info->text_num - 1] = alloc_string(key); + info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); + if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ + + return 0; +} + +unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str) +{ + return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); +} + +void lodepng_clear_text(LodePNGInfo * info) +{ + LodePNGText_cleanup(info); +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo * info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo * info) +{ + size_t i; + for(i = 0; i != info->itext_num; ++i) { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + size_t i = 0; + dest->itext_keys = NULL; + dest->itext_langtags = NULL; + dest->itext_transkeys = NULL; + dest->itext_strings = NULL; + dest->itext_num = 0; + for(i = 0; i != source->itext_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo * info) +{ + LodePNGIText_cleanup(info); +} + +static unsigned lodepng_add_itext_sized(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str, size_t size) +{ + char ** new_keys = (char **)(lodepng_realloc(info->itext_keys, sizeof(char *) * (info->itext_num + 1))); + char ** new_langtags = (char **)(lodepng_realloc(info->itext_langtags, sizeof(char *) * (info->itext_num + 1))); + char ** new_transkeys = (char **)(lodepng_realloc(info->itext_transkeys, sizeof(char *) * (info->itext_num + 1))); + char ** new_strings = (char **)(lodepng_realloc(info->itext_strings, sizeof(char *) * (info->itext_num + 1))); + + if(new_keys) info->itext_keys = new_keys; + if(new_langtags) info->itext_langtags = new_langtags; + if(new_transkeys) info->itext_transkeys = new_transkeys; + if(new_strings) info->itext_strings = new_strings; + + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ + + ++info->itext_num; + + info->itext_keys[info->itext_num - 1] = alloc_string(key); + info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); + info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); + info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); + + return 0; +} + +unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str) +{ + return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); +} + +/* same as set but does not delete */ +static unsigned lodepng_assign_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, + unsigned profile_size) +{ + if(profile_size == 0) return 100; /*invalid ICC profile size*/ + + info->iccp_name = alloc_string(name); + info->iccp_profile = (unsigned char *)lodepng_malloc(profile_size); + + if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ + + lodepng_memcpy(info->iccp_profile, profile, profile_size); + info->iccp_profile_size = profile_size; + + return 0; /*ok*/ +} + +unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size) +{ + if(info->iccp_name) lodepng_clear_icc(info); + info->iccp_defined = 1; + + return lodepng_assign_icc(info, name, profile, profile_size); +} + +void lodepng_clear_icc(LodePNGInfo * info) +{ + string_cleanup(&info->iccp_name); + lodepng_free(info->iccp_profile); + info->iccp_profile = NULL; + info->iccp_profile_size = 0; + info->iccp_defined = 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo * info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + info->gama_defined = 0; + info->chrm_defined = 0; + info->srgb_defined = 0; + info->iccp_defined = 0; + info->iccp_name = NULL; + info->iccp_profile = NULL; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo * info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + lodepng_clear_icc(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + lodepng_info_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + if(source->iccp_defined) { + CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); + } + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char * out, size_t index, unsigned bits, unsigned in) +{ + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index & m; + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8u] = in; + else out[index * bits / 8u] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree { + ColorTree * children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree * tree) +{ + lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree * tree) +{ + int i; + for(i = 0; i != 16; ++i) { + if(tree->children[i]) { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + int bit = 0; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") +Returns error code, or 0 if ok*/ +static unsigned color_tree_add(ColorTree * tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) +{ + int bit; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) { + tree->children[i] = (ColorTree *)lodepng_malloc(sizeof(ColorTree)); + if(!tree->children[i]) return 83; /*alloc fail*/ + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = (int)index; + return 0; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char * out, size_t i, + const LodePNGColorMode * mode, ColorTree * tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) out[i] = gray; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; + else { + /*take the most significant bits of gray*/ + gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); + addColorBits(out, i, mode->bitdepth, gray); + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, (unsigned)index); + } + else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) { + out[i * 2 + 0] = gray; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) { + out[i * 4 + 0] = out[i * 4 + 1] = gray; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static void rgba16ToPixel(unsigned char * out, size_t i, + const LodePNGColorMode * mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->colortype == LCT_GREY) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 2 + 0] = (gray >> 8) & 255; + out[i * 2 + 1] = gray & 255; + } + else if(mode->colortype == LCT_RGB) { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 4 + 0] = (gray >> 8) & 255; + out[i * 4 + 1] = gray & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static void getPixelColorRGBA8(unsigned char * r, unsigned char * g, + unsigned char * b, unsigned char * a, + const unsigned char * in, size_t i, + const LodePNGColorMode * mode) +{ + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + *r = in[i * 3 + 0]; + *g = in[i * 3 + 1]; + *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } + else { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to the common case of RGBA with 8 bit per channel. buffer must be RGBA with +enough memory.*/ +static void getPixelColorsRGBA8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char * LODEPNG_RESTRICT in, + const LodePNGColorMode * mode) +{ + unsigned num_channels = 4; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r) buffer[3] = 0; + } + } + } + else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 3], 3); + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r && buffer[1] == mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; + } + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } + else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + buffer[3] = in[i * 2 + 1]; + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + buffer[3] = in[i * 4 + 2]; + } + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 4); + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + buffer[3] = in[i * 8 + 6]; + } + } + } +} + +/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ +static void getPixelColorsRGB8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char * LODEPNG_RESTRICT in, + const LodePNGColorMode * mode) +{ + const unsigned num_channels = 3; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + } + } + else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + } + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + } + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 3); + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + } + } + } + else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } + else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + } + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 4], 3); + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + } + } + } +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static void getPixelColorRGBA16(unsigned short * r, unsigned short * g, unsigned short * b, unsigned short * a, + const unsigned char * in, size_t i, const LodePNGColorMode * mode) +{ + if(mode->colortype == LCT_GREY) { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) { + *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined + && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) { + *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; + } +} + +unsigned lodepng_convert(unsigned char * out, const unsigned char * in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, + unsigned w, unsigned h) +{ + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { + return 107; /* error: must provide palette if input mode is palette */ + } + + if(lodepng_color_mode_equal(mode_out, mode_in)) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + + if(mode_out->colortype == LCT_PALETTE) { + size_t palettesize = mode_out->palettesize; + const unsigned char * palette = mode_out->palette; + size_t palsize = (size_t)1u << mode_out->bitdepth; + /*if the user specified output palette but did not give the values, assume + they want the values of the input color type (assuming that one is palette). + Note that we never create a new palette ourselves.*/ + if(palettesize == 0) { + palettesize = mode_in->palettesize; + palette = mode_in->palette; + /*if the input was also palette with same bitdepth, then the color types are also + equal, so copy literally. This to preserve the exact indices that were in the PNG + even in case there are duplicate colors in the palette.*/ + if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + } + if(palettesize < palsize) palsize = palettesize; + color_tree_init(&tree); + for(i = 0; i != palsize; ++i) { + const unsigned char * p = &palette[i * 4]; + error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); + if(error) break; + } + } + + if(!error) { + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { + for(i = 0; i != numpixels; ++i) { + unsigned short r = 0, g = 0, b = 0, a = 0; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); + } + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { + getPixelColorsRGBA8(out, numpixels, in, mode_in); + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { + getPixelColorsRGB8(out, numpixels, in, mode_in); + } + else { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if(error) break; + } + } + } + + if(mode_out->colortype == LCT_PALETTE) { + color_tree_cleanup(&tree); + } + + return error; +} + + +/* Converts a single rgb color without alpha from one type to another, color bits truncated to +their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow +function, do not use to process all pixels of an image. Alpha channel not supported on purpose: +this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the +specification it looks like bKGD should ignore the alpha values of the palette since it can use +any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ +static unsigned lodepng_convert_rgb( + unsigned * r_out, unsigned * g_out, unsigned * b_out, + unsigned r_in, unsigned g_in, unsigned b_in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in) +{ + unsigned r = 0, g = 0, b = 0; + unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ + unsigned shift = 16 - mode_out->bitdepth; + + if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { + r = g = b = r_in * mul; + } + else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { + r = r_in * mul; + g = g_in * mul; + b = b_in * mul; + } + else if(mode_in->colortype == LCT_PALETTE) { + if(r_in >= mode_in->palettesize) return 82; + r = mode_in->palette[r_in * 4 + 0] * 257u; + g = mode_in->palette[r_in * 4 + 1] * 257u; + b = mode_in->palette[r_in * 4 + 2] * 257u; + } + else { + return 31; + } + + /* now convert to output format */ + if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { + *r_out = r >> shift ; + } + else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { + *r_out = r >> shift ; + *g_out = g >> shift ; + *b_out = b >> shift ; + } + else if(mode_out->colortype == LCT_PALETTE) { + unsigned i; + /* a 16-bit color cannot be in the palette */ + if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; + for(i = 0; i < mode_out->palettesize; i++) { + unsigned j = i * 4; + if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && + (b >> 8) == mode_out->palette[j + 2]) { + *r_out = i; + return 0; + } + } + return 82; + } + else { + return 31; + } + + return 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +void lodepng_color_stats_init(LodePNGColorStats * stats) +{ + /*stats*/ + stats->colored = 0; + stats->key = 0; + stats->key_r = stats->key_g = stats->key_b = 0; + stats->alpha = 0; + stats->numcolors = 0; + stats->bits = 1; + stats->numpixels = 0; + /*settings*/ + stats->allow_palette = 1; + stats->allow_greyscale = 1; +} + +/*function used for debug purposes with C++*/ +/*void printColorStats(LodePNGColorStats* p) { + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +static unsigned getValueRequiredBits(unsigned char value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*stats must already have been inited. */ +unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, + const unsigned char * in, unsigned w, unsigned h, + const LodePNGColorMode * mode_in) +{ + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + /* mark things as done already if it would be impossible to have a more expensive case */ + unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode_in); + unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; + unsigned sixteen = 0; /* whether the input image is 16 bit */ + unsigned maxnumcolors = 257; + if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); + + stats->numpixels += numpixels; + + /*if palette not allowed, no need to compute numcolors*/ + if(!stats->allow_palette) numcolors_done = 1; + + color_tree_init(&tree); + + /*If the stats was already filled in from previous data, fill its palette in tree + and mark things as done already if we know they are the most expensive case already*/ + if(stats->alpha) alpha_done = 1; + if(stats->colored) colored_done = 1; + if(stats->bits == 16) numcolors_done = 1; + if(stats->bits >= bpp) bits_done = 1; + if(stats->numcolors >= maxnumcolors) numcolors_done = 1; + + if(!numcolors_done) { + for(i = 0; i < stats->numcolors; i++) { + const unsigned char * color = &stats->palette[i * 4]; + error = color_tree_add(&tree, color[0], color[1], color[2], color[3], i); + if(error) goto cleanup; + } + } + + /*Check if the 16-bit input is truly 16-bit*/ + if(mode_in->bitdepth == 16 && !sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) { /*first and second byte differ*/ + stats->bits = 16; + sixteen = 1; + bits_done = 1; + numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + break; + } + } + } + + if(sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } + else if(a == 65535 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + } + } + else { /* < 16-bit */ + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + + if(!bits_done && stats->bits < 8) { + /*only r is checked, < 8 bits is only relevant for grayscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > stats->bits) stats->bits = bits; + } + bits_done = (stats->bits >= bpp); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 255 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } + else if(a == 255 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + + if(!numcolors_done) { + if(!color_tree_has(&tree, r, g, b, a)) { + error = color_tree_add(&tree, r, g, b, a, stats->numcolors); + if(error) goto cleanup; + if(stats->numcolors < 256) { + unsigned char * p = stats->palette; + unsigned n = stats->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; + } + ++stats->numcolors; + numcolors_done = stats->numcolors >= maxnumcolors; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + } + + /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ + stats->key_r += (stats->key_r << 8); + stats->key_g += (stats->key_g << 8); + stats->key_b += (stats->key_b << 8); + } + +cleanup: + color_tree_cleanup(&tree); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit +(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for +all pixels of an image but only for a few additional values. */ +static unsigned lodepng_color_stats_add(LodePNGColorStats * stats, + unsigned r, unsigned g, unsigned b, unsigned a) +{ + unsigned error = 0; + unsigned char image[8]; + LodePNGColorMode mode; + lodepng_color_mode_init(&mode); + image[0] = r >> 8; + image[1] = r; + image[2] = g >> 8; + image[3] = g; + image[4] = b >> 8; + image[5] = b; + image[6] = a >> 8; + image[7] = a; + mode.bitdepth = 16; + mode.colortype = LCT_RGBA; + error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); + lodepng_color_mode_cleanup(&mode); + return error; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. +The stats should be computed with lodepng_compute_color_stats. +mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. +Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, +e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... +This is used if auto_convert is enabled (it is by default). +*/ +static unsigned auto_choose_color(LodePNGColorMode * mode_out, + const LodePNGColorMode * mode_in, + const LodePNGColorStats * stats) +{ + unsigned error = 0; + unsigned palettebits; + size_t i, n; + size_t numpixels = stats->numpixels; + unsigned palette_ok, gray_ok; + + unsigned alpha = stats->alpha; + unsigned key = stats->key; + unsigned bits = stats->bits; + + mode_out->key_defined = 0; + + if(key && numpixels <= 16) { + alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + key = 0; + if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + + gray_ok = !stats->colored; + if(!stats->allow_greyscale) gray_ok = 0; + if(!gray_ok && bits < 8) bits = 8; + + n = stats->numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ + if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ + if(!stats->allow_palette) palette_ok = 0; + + if(palette_ok) { + const unsigned char * p = stats->palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != stats->numcolors; ++i) { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_copy(mode_out, mode_in); + } + } + else { /*8-bit or 16-bit per channel*/ + mode_out->bitdepth = bits; + mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) + : (gray_ok ? LCT_GREY : LCT_RGB); + if(key) { + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ + mode_out->key_r = stats->key_r & mask; + mode_out->key_g = stats->key_g & mask; + mode_out->key_b = stats->key_b & mask; + mode_out->key_defined = 1; + } + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predictor, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) +{ + short pa = LODEPNG_ABS(b - c); + short pb = LODEPNG_ABS(a - c); + short pc = LODEPNG_ABS(a + b - c - c); + /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ + if(pb < pa) { + a = b; + pa = pb; + } + return (pc < pa) ? c : a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i != 7; ++i) { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i != 7; ++i) { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned * w, unsigned * h, LodePNGState * state, + const unsigned char * in, size_t insize) +{ + unsigned width, height; + LodePNGInfo * info = &state->info_png; + if(insize == 0 || in == 0) { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 33) { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + /* TODO: remove this. One should use a new LodePNGState for new sessions */ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(lodepng_chunk_length(in + 8) != 13) { + CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ + } + if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + width = lodepng_read32bitInt(&in[16]); + height = lodepng_read32bitInt(&in[20]); + /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ + if(w) *w = width; + if(h) *h = height; + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + /*errors returned only after the parsing so other values are still output*/ + + /*error: invalid image size*/ + if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); + /*error: invalid colortype or bitdepth combination*/ + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + if(state->error) return state->error; + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + if(!state->decoder.ignore_crc) { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + return state->error; +} + +static unsigned unfilterScanline(unsigned char * recon, const unsigned char * scanline, const unsigned char * precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) { + case 0: + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) { + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; + } + else { + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) >> 1u); + } + else { + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + (recon[i - bytewidth] >> 1u); + } + break; + case 4: + if(precon) { + for(i = 0; i != bytewidth; ++i) { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + + /* Unroll independent paths of the paeth predictor. A 6x and 8x version would also be possible but that + adds too much code. Whether this actually speeds anything up at all depends on compiler and settings. */ + if(bytewidth >= 4) { + for(; i + 3 < length; i += 4) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2], q3 = precon[j + 3]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + recon[i + 2] = s2 + paethPredictor(r2, p2, q2); + recon[i + 3] = s3 + paethPredictor(r3, p3, q3); + } + } + else if(bytewidth >= 3) { + for(; i + 2 < length; i += 3) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1], q2 = precon[j + 2]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + recon[i + 2] = s2 + paethPredictor(r2, p2, q2); + } + } + else if(bytewidth >= 2) { + for(; i + 1 < length; i += 2) { + size_t j = i - bytewidth; + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; + unsigned char q0 = precon[j + 0], q1 = precon[j + 1]; + recon[i + 0] = s0 + paethPredictor(r0, p0, q0); + recon[i + 1] = s1 + paethPredictor(r1, p1, q1); + } + } + + for(; i != length; ++i) { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else { + for(i = 0; i != bytewidth; ++i) { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; ++i) { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: + return 36; /*error: invalid filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char * prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + for(y = 0; y < h; ++y) { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w + + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char * out, const unsigned char * in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; ++y) { + size_t x; + for(x = 0; x < olinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char * out, unsigned char * in, + unsigned w, unsigned h, const LodePNGInfo * info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) { + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); + } + /*we can immediately filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else { /*interlace_method is 1 (Adam7)*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i != 7; ++i) { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) +{ + unsigned pos = 0, i; + color->palettesize = chunkLength / 3u; + if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ + lodepng_color_mode_alloc_palette(color); + if(!color->palette && color->palettesize) { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + + for(i = 0; i != color->palettesize; ++i) { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) +{ + unsigned i; + if(color->colortype == LCT_PALETTE) { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 39; + + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; + } + else if(color->colortype == LCT_GREY) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; + } + else if(color->colortype == LCT_RGB) { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(info->color.colortype == LCT_PALETTE) { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ + if(data[0] >= info->color.palettesize) return 103; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } + else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 44; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + /*error: this chunk must be 6 bytes for grayscale image*/ + if(chunkLength != 6) return 45; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + char * key = 0, * str = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) ++length; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); + str = (char *)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(str, data + string2_begin, length); + str[length] = 0; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + char * key = 0; + unsigned char * str = 0; + size_t size = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[string2_begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(error) break; + error = lodepng_add_text_sized(info, key, (char *)str, size); + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, begin, compressed; + char * key = 0, * langtag = 0, * transkey = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + langtag = (char *)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(langtag, data + begin, length); + langtag[length] = 0; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + transkey = (char *)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(transkey, data + begin, length); + transkey[length] = 0; + + /*read the actual text*/ + begin += length + 1; + + length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; + + if(compressed) { + unsigned char * str = 0; + size_t size = 0; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)str, size); + lodepng_free(str); + } + else { + error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)(data + begin), length); + } + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256u * data[0] + data[1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} + +static unsigned readChunk_gAMA(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ + + info->gama_defined = 1; + info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + + return 0; /* OK */ +} + +static unsigned readChunk_cHRM(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ + + info->chrm_defined = 1; + info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; + info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; + info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; + info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; + info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; + info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; + info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; + info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; + + return 0; /* OK */ +} + +static unsigned readChunk_sRGB(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ + + info->srgb_defined = 1; + info->srgb_intent = data[0]; + + return 0; /* OK */ +} + +static unsigned readChunk_iCCP(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + size_t size = 0; + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + + info->iccp_defined = 1; + if(info->iccp_name) lodepng_clear_icc(info); + + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ + if(length < 1 || length > 79) return 89; /*keyword too short or long*/ + + info->iccp_name = (char *)lodepng_malloc(length + 1); + if(!info->iccp_name) return 83; /*alloc fail*/ + + info->iccp_name[length] = 0; + for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; + + if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_icc_size; + error = zlib_decompress(&info->iccp_profile, &size, 0, + &data[string2_begin], + length, &zlibsettings); + /*error: ICC profile larger than decoder->max_icc_size*/ + if(error && size > zlibsettings.max_output_size) error = 113; + info->iccp_profile_size = size; + if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ + return error; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, + const unsigned char * in, size_t insize) +{ + const unsigned char * chunk = in + pos; + unsigned chunkLength; + const unsigned char * data; + unsigned unhandled = 0; + unsigned error = 0; + + if(pos + 4 > insize) return 30; + chunkLength = lodepng_chunk_length(chunk); + if(chunkLength > 2147483647) return 63; + data = lodepng_chunk_data_const(chunk); + if(data + chunkLength + 4 > in + insize) return 30; + + if(lodepng_chunk_type_equals(chunk, "PLTE")) { + error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + error = readChunk_tRNS(&state->info_png.color, data, chunkLength); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + } + else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + error = readChunk_bKGD(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + error = readChunk_tEXt(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) { + error = readChunk_tIME(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + error = readChunk_pHYs(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + error = readChunk_gAMA(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + error = readChunk_cHRM(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + error = readChunk_sRGB(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else { + /* unhandled chunk is ok (is not an error) */ + unhandled = 1; + } + + if(!error && !unhandled && !state->decoder.ignore_crc) { + if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ + } + + return error; +} + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char * chunk; + unsigned char * idat; /*the data from idat chunks, zlib compressed*/ + size_t idatsize = 0; + unsigned char * scanlines = 0; + size_t scanlines_size = 0, expected_size = 0; + size_t outsize = 0; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { + CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ + } + + /*the input filesize is a safe upper bound for the sum of idat chunks size*/ + idat = (unsigned char *)lodepng_malloc(insize); + if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ + + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) { + unsigned chunkLength; + const unsigned char * data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 30); + } + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 63); + } + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + unknown = 0; + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) { + size_t newsize; + if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); + if(newsize > insize) CERROR_BREAK(state->error, 95); + lodepng_memcpy(idat + idatsize, data, chunkLength); + idatsize += chunkLength; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else if(lodepng_chunk_type_equals(chunk, "IEND")) { + /*IEND chunk*/ + IEND = 1; + } + else if(lodepng_chunk_type_equals(chunk, "PLTE")) { + /*palette chunk (PLTE)*/ + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled + in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that + affects the alpha channel of pixels. */ + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + } + else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + /*text chunk (tEXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + /*compressed text chunk (zTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + /*international text chunk (iTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + state->error = readChunk_gAMA(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + state->error = readChunk_cHRM(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + state->error = readChunk_sRGB(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else { /*it's not an implemented chunk type, so ignore it: skip over the data*/ + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { + CERROR_BREAK(state->error, 69); + } + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) { /*check CRC if wanted, only on known chunk types*/ + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); + } + + if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { + state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ + } + + if(!state->error) { + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) { + size_t bpp = lodepng_get_bpp(&state->info_png.color); + expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); + } + else { + size_t bpp = lodepng_get_bpp(&state->info_png.color); + /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ + expected_size = 0; + expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); + if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); + if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); + if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); + } + + state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, + &state->decoder.zlibsettings); + } + if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ + lodepng_free(idat); + + if(!state->error) { + lv_draw_buf_t * decoded = lv_draw_buf_create(*w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); + if(decoded) { + *out = (unsigned char*)decoded; + outsize = decoded->data_size; + } + else state->error = 83; /*alloc fail*/ + } + if(!state->error) { + lv_draw_buf_t * decoded = (lv_draw_buf_t *)*out; + lodepng_memset(decoded->data, 0, outsize); + state->error = postProcessScanlines(decoded->data, scanlines, *w, *h, &state->info_png); + } + lodepng_free(scanlines); +} + +unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize) +{ + *out = NULL; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else { /*color conversion needed*/ + lv_draw_buf_t * old_buf = (lv_draw_buf_t *)*out; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) { + return 56; /*unsupported color mode conversion*/ + } + + lv_draw_buf_t * new_buf = lv_draw_buf_create(*w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); + if(new_buf == NULL) { + state->error = 83; /*alloc fail*/ + } + else { + state->error = lodepng_convert(new_buf->data, old_buf->data, + &state->info_raw, &state->info_png.color, *w, *h); + + if (state->error) { + lv_draw_buf_destroy(new_buf); + new_buf = NULL; + } + } + + *out = (unsigned char*)new_buf; + lv_draw_buf_destroy(old_buf); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*disable reading things that this function doesn't output*/ + state.decoder.read_text_chunks = 0; + state.decoder.remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer = 0; + size_t buffersize; + unsigned error; + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; + settings->max_text_size = 16777216; + settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + settings->ignore_critical = 0; + settings->ignore_end = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState * state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState * state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); + if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); + if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +static unsigned writeSignature(ucvector * out) +{ + size_t pos = out->size; + const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; + /*8 bytes PNG signature, aka the magic bytes*/ + if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ + lodepng_memcpy(out->data + pos, signature, 8); + return 0; +} + +static unsigned addChunk_IHDR(ucvector * out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned char * chunk, * data; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); + data = chunk + 8; + + lodepng_set32bitInt(data + 0, w); /*width*/ + lodepng_set32bitInt(data + 4, h); /*height*/ + data[8] = (unsigned char)bitdepth; /*bit depth*/ + data[9] = (unsigned char)colortype; /*color type*/ + data[10] = 0; /*compression method*/ + data[11] = 0; /*filter method*/ + data[12] = interlace_method; /*interlace method*/ + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +/* only adds the chunk if needed (there is a key or palette with alpha) */ +static unsigned addChunk_PLTE(ucvector * out, const LodePNGColorMode * info) +{ + unsigned char * chunk; + size_t i, j = 8; + + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); + + for(i = 0; i != info->palettesize; ++i) { + /*add all channels except alpha channel*/ + chunk[j++] = info->palette[i * 4 + 0]; + chunk[j++] = info->palette[i * 4 + 1]; + chunk[j++] = info->palette[i * 4 + 2]; + } + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tRNS(ucvector * out, const LodePNGColorMode * info) +{ + unsigned char * chunk = 0; + + if(info->colortype == LCT_PALETTE) { + size_t i, amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i != 0; --i) { + if(info->palette[4 * (i - 1) + 3] != 255) break; + --amount; + } + if(amount) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); + /*add the alpha channel values from the palette*/ + for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; + } + } + else if(info->colortype == LCT_GREY) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + } + } + else if(info->colortype == LCT_RGB) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + chunk[10] = (unsigned char)(info->key_g >> 8); + chunk[11] = (unsigned char)(info->key_g & 255); + chunk[12] = (unsigned char)(info->key_b >> 8); + chunk[13] = (unsigned char)(info->key_b & 255); + } + } + + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_IDAT(ucvector * out, const unsigned char * data, size_t datasize, + LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * zlib = 0; + size_t zlibsize = 0; + + error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); + if(!error) { + error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); + } + lodepng_free(zlib); + return error; +} + +static unsigned addChunk_IEND(ucvector * out) +{ + return lodepng_chunk_createv(out, 0, "IEND", 0); +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector * out, const char * keyword, const char * textstring) +{ + unsigned char * chunk = 0; + size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); + size_t size = keysize + 1 + textsize; + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_zTXt(ucvector * out, const char * keyword, const char * textstring, + LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword); + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char *)textstring, textsize, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "zTXt"); + } + if(!error) { + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_iTXt(ucvector * out, unsigned compress, const char * keyword, const char * langtag, + const char * transkey, const char * textstring, LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + if(compress) { + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char *)textstring, textsize, zlibsettings); + } + if(!error) { + size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); + error = lodepng_chunk_init(&chunk, out, size, "iTXt"); + } + if(!error) { + size_t pos = 8; + lodepng_memcpy(chunk + pos, keyword, keysize); + pos += keysize; + chunk[pos++] = 0; /*null termination char*/ + chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ + chunk[pos++] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + pos, langtag, langsize); + pos += langsize; + chunk[pos++] = 0; /*null termination char*/ + lodepng_memcpy(chunk + pos, transkey, transsize); + pos += transsize; + chunk[pos++] = 0; /*null termination char*/ + if(compress) { + lodepng_memcpy(chunk + pos, compressed, compressedsize); + } + else { + lodepng_memcpy(chunk + pos, textstring, textsize); + } + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_bKGD(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk = 0; + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + chunk[10] = (unsigned char)(info->background_g >> 8); + chunk[11] = (unsigned char)(info->background_g & 255); + chunk[12] = (unsigned char)(info->background_b >> 8); + chunk[13] = (unsigned char)(info->background_b & 255); + } + else if(info->color.colortype == LCT_PALETTE) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); + chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ + } + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tIME(ucvector * out, const LodePNGTime * time) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); + chunk[8] = (unsigned char)(time->year >> 8); + chunk[9] = (unsigned char)(time->year & 255); + chunk[10] = (unsigned char)time->month; + chunk[11] = (unsigned char)time->day; + chunk[12] = (unsigned char)time->hour; + chunk[13] = (unsigned char)time->minute; + chunk[14] = (unsigned char)time->second; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_pHYs(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); + lodepng_set32bitInt(chunk + 8, info->phys_x); + lodepng_set32bitInt(chunk + 12, info->phys_y); + chunk[16] = info->phys_unit; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_gAMA(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); + lodepng_set32bitInt(chunk + 8, info->gama_gamma); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_cHRM(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); + lodepng_set32bitInt(chunk + 8, info->chrm_white_x); + lodepng_set32bitInt(chunk + 12, info->chrm_white_y); + lodepng_set32bitInt(chunk + 16, info->chrm_red_x); + lodepng_set32bitInt(chunk + 20, info->chrm_red_y); + lodepng_set32bitInt(chunk + 24, info->chrm_green_x); + lodepng_set32bitInt(chunk + 28, info->chrm_green_y); + lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); + lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_sRGB(ucvector * out, const LodePNGInfo * info) +{ + unsigned char data = info->srgb_intent; + return lodepng_chunk_createv(out, 1, "sRGB", &data); +} + +static unsigned addChunk_iCCP(ucvector * out, const LodePNGInfo * info, LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t keysize = lodepng_strlen(info->iccp_name); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + error = zlib_compress(&compressed, &compressedsize, + info->iccp_profile, info->iccp_profile_size, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "iCCP"); + } + if(!error) { + lodepng_memcpy(chunk + 8, info->iccp_name, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char * out, const unsigned char * scanline, const unsigned char * prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) { + case 0: /*None*/ + for(i = 0; i != length; ++i) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; + break; + case 2: /*Up*/ + if(prevline) { + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; + } + else { + for(i = 0; i != length; ++i) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); + } + else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); + } + break; + case 4: /*Paeth*/ + if(prevline) { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: + return; /*invalid filter type given*/ + } +} + +/* integer binary logarithm, max return value is 31 */ +static size_t ilog2(size_t i) +{ + size_t result = 0; + if(i >= 65536) { + result += 16; + i >>= 16; + } + if(i >= 256) { + result += 8; + i >>= 8; + } + if(i >= 16) { + result += 4; + i >>= 4; + } + if(i >= 4) { + result += 2; + i >>= 2; + } + if(i >= 2) { + result += 1; /*i >>= 1;*/ + } + return result; +} + +/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ +static size_t ilog2i(size_t i) +{ + size_t l; + if(i == 0) return 0; + l = ilog2(i); + /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) + linearly approximates the missing fractional part multiplied by i */ + return i * l + ((i - (1u << l)) << 1u); +} + +static unsigned filter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, + const LodePNGColorMode * color, const LodePNGEncoderSettings * settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(color); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + const unsigned char * prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { + unsigned char type = (unsigned char)strategy; + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_MINSUM) { + /*adaptive filtering*/ + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned char type, bestType = 0; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + if(type == 0) { + for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); + } + else { + for(x = 0; x != linebytes; ++x) { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + unsigned char s = attempt[type][x]; + sum += s < 128 ? s : (255U - s); + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum < smallest) { + bestType = type; + smallest = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_ENTROPY) { + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t bestSum = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + lodepng_memset(count, 0, 256 * sizeof(*count)); + for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ + for(x = 0; x != 256; ++x) { + sum += ilog2i(count[x]); + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum > bestSum) { + bestType = type; + bestSum = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_PREDEFINED) { + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned char type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_BRUTE_FORCE) { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char * dummy; + LodePNGCompressSettings zlibsettings; + lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + if(!error) { + for(y = 0; y != h; ++y) { /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + unsigned testsize = (unsigned)linebytes; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char * out, const unsigned char * in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y != h; ++y) { + size_t x; + for(x = 0; x < ilinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char ** out, size_t * outsize, const unsigned char * in, + unsigned w, unsigned h, + const LodePNGInfo * info_png, const LodePNGEncoderSettings * settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) { + *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + unsigned char * padded = (unsigned char *)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) { + addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } + else { + /*we can immediately filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else { /*interlace_method is 1 (Adam7)*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char * adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char *)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error && adam7) { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i != 7; ++i) { + if(bpp < 8) { + unsigned char * padded = (unsigned char *)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } + else { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector * out, unsigned char * data, size_t datasize) +{ + unsigned char * inchunk = data; + while((size_t)(inchunk - data) < datasize) { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk, data + datasize); + } + return 0; +} + +static unsigned isGrayICCProfile(const unsigned char * profile, unsigned size) +{ + /* + It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 + are "RGB ". We do not perform any full parsing of the ICC profile here, other + than check those 4 bytes to grayscale profile. Other than that, validity of + the profile is not checked. This is needed only because the PNG specification + requires using a non-gray color model if there is an ICC profile with "RGB " + (sadly limiting compression opportunities if the input data is grayscale RGB + data), and requires using a gray color model if it is "GRAY". + */ + if(size < 20) return 0; + return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; +} + +static unsigned isRGBICCProfile(const unsigned char * profile, unsigned size) +{ + /* See comment in isGrayICCProfile*/ + if(size < 20) return 0; + return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGState * state) +{ + unsigned char * data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + ucvector outv = ucvector_init(NULL, 0); + LodePNGInfo info; + const LodePNGInfo * info_png = &state->info_png; + + lodepng_info_init(&info); + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + /*check input values validity*/ + if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + goto cleanup; + } + if(state->encoder.zlibsettings.btype > 2) { + state->error = 61; /*error: invalid btype*/ + goto cleanup; + } + if(info_png->interlace_method > 1) { + state->error = 71; /*error: invalid interlace mode*/ + goto cleanup; + } + state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + + /* color convert and compute scanline filter types */ + lodepng_info_copy(&info, &state->info_png); + if(state->encoder.auto_convert) { + LodePNGColorStats stats; + lodepng_color_stats_init(&stats); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined && + isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use palette with a GRAY ICC profile, even + if the palette has only gray colors, so disallow it.*/ + stats.allow_palette = 0; + } + if(info_png->iccp_defined && + isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ + stats.allow_greyscale = 0; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->background_defined) { + /*the background chunk's color must be taken into account as well*/ + unsigned r = 0, g = 0, b = 0; + LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); + lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, + &info_png->color); + state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); + if(state->error) goto cleanup; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = auto_choose_color(&info.color, &state->info_raw, &stats); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*also convert the background chunk*/ + if(info_png->background_defined) { + if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, + info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { + state->error = 104; + goto cleanup; + } + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined) { + unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; + if(!gray_icc && !rgb_icc) { + state->error = 100; /* Disallowed profile color type for PNG */ + goto cleanup; + } + if(gray_icc != gray_png) { + /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, + or in case of auto_convert, it wasn't possible to find appropriate model*/ + state->error = state->encoder.auto_convert ? 102 : 101; + goto cleanup; + } + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { + unsigned char * converted; + size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; + + converted = (unsigned char *)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) { + state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + } + lodepng_free(converted); + if(state->error) goto cleanup; + } + else { + state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + if(state->error) goto cleanup; + } + + /* output all PNG chunks */ { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + state->error = writeSignature(&outv); + if(state->error) goto cleanup; + /*IHDR*/ + state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) goto cleanup; + } + /*color profile chunks must come before PLTE */ + if(info.iccp_defined) { + state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + if(info.srgb_defined) { + state->error = addChunk_sRGB(&outv, &info); + if(state->error) goto cleanup; + } + if(info.gama_defined) { + state->error = addChunk_gAMA(&outv, &info); + if(state->error) goto cleanup; + } + if(info.chrm_defined) { + state->error = addChunk_cHRM(&outv, &info); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) { + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { + /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + /*tRNS (this will only add if when necessary) */ + state->error = addChunk_tRNS(&outv, &info.color); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) { + state->error = addChunk_bKGD(&outv, &info); + if(state->error) goto cleanup; + } + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) { + state->error = addChunk_pHYs(&outv, &info); + if(state->error) goto cleanup; + } + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) { + state->error = addChunk_tIME(&outv, &info.time); + if(state->error) goto cleanup; + } + /*tEXt and/or zTXt*/ + for(i = 0; i != info.text_num; ++i) { + if(lodepng_strlen(info.text_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.text_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + if(state->encoder.text_compression) { + state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + else { + state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + if(state->error) goto cleanup; + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) { + unsigned already_added_id_text = 0; + for(i = 0; i != info.text_num; ++i) { + const char * k = info.text_keys[i]; + /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ + if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && + k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { + already_added_id_text = 1; + break; + } + } + if(already_added_id_text == 0) { + state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + if(state->error) goto cleanup; + } + } + /*iTXt*/ + for(i = 0; i != info.itext_num; ++i) { + if(lodepng_strlen(info.itext_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.itext_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + state->error = addChunk_iTXt( + &outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + state->error = addChunk_IEND(&outv); + if(state->error) goto cleanup; + } + +cleanup: + lodepng_info_cleanup(&info); + lodepng_free(data); + + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, const unsigned char * image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char * filename, const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = 1; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char * lodepng_error_text(unsigned code) +{ + switch(code) { + case 0: + return "no error, everything went ok"; + case 1: + return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: + return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: + return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: + return "problem while processing dynamic deflate block"; + case 14: + return "problem while processing dynamic deflate block"; + case 15: + return "problem while processing dynamic deflate block"; + /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ + case 16: + return "invalid code while processing dynamic deflate block"; + case 17: + return "end of out buffer memory reached while inflating"; + case 18: + return "invalid distance code while inflating"; + case 19: + return "end of out buffer memory reached while inflating"; + case 20: + return "invalid deflate block BTYPE encountered while decoding"; + case 21: + return "NLEN is not ones complement of LEN in a deflate block"; + + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: + return "end of out buffer memory reached while inflating"; + case 23: + return "end of in buffer memory reached while inflating"; + case 24: + return "invalid FCHECK in zlib header"; + case 25: + return "invalid compression method in zlib header"; + case 26: + return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: + return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: + return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: + return "first chunk is not the header chunk"; + case 30: + return "chunk length too large, chunk broken off at end of file"; + case 31: + return "illegal PNG color type or bpp"; + case 32: + return "illegal PNG compression method"; + case 33: + return "illegal PNG filter method"; + case 34: + return "illegal PNG interlace method"; + case 35: + return "chunk length of a chunk is too large or the chunk too small"; + case 36: + return "illegal PNG filter type encountered"; + case 37: + return "illegal bit depth for this color type given"; + case 38: + return "the palette is too small or too big"; /*0, or more than 256 colors*/ + case 39: + return "tRNS chunk before PLTE or has more entries than palette size"; + case 40: + return "tRNS chunk has wrong size for grayscale image"; + case 41: + return "tRNS chunk has wrong size for RGB image"; + case 42: + return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: + return "bKGD chunk has wrong size for palette image"; + case 44: + return "bKGD chunk has wrong size for grayscale image"; + case 45: + return "bKGD chunk has wrong size for RGB image"; + case 48: + return "empty input buffer given to decoder. Maybe caused by non-existing file?"; + case 49: + return "jumped past memory while generating dynamic huffman tree"; + case 50: + return "jumped past memory while generating dynamic huffman tree"; + case 51: + return "jumped past memory while inflating huffman block"; + case 52: + return "jumped past memory while inflating"; + case 53: + return "size of zlib data too small"; + case 54: + return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: + return "jumped past tree while generating huffman tree"; + case 56: + return "given output image colortype or bitdepth not supported for color conversion"; + case 57: + return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: + return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: + return "requested color conversion not supported"; + case 60: + return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: + return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ + case 62: + return "conversion from color to grayscale not supported"; + /*(2^31-1)*/ + case 63: + return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: + return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: + return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: + return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: + return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: + return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: + return "invalid interlace mode given to encoder (must be 0 or 1)"; + case 72: + return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: + return "invalid tIME chunk size"; + case 74: + return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: + return "no null termination char found while decoding text chunk"; + case 76: + return "iTXt chunk too short to contain required bytes"; + case 77: + return "integer overflow in buffer size"; + case 78: + return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: + return "failed to open file for writing"; + case 80: + return "tried creating a tree of 0 symbols"; + case 81: + return "lazy matching at pos 0 is impossible"; + case 82: + return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; + case 83: + return "memory allocation failed"; + case 84: + return "given image too small to contain all pixels to be encoded"; + case 86: + return "impossible offset in lz77 encoding (internal bug)"; + case 87: + return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: + return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: + return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: + return "windowsize must be a power of two"; + case 91: + return "invalid decompressed idat size"; + case 92: + return "integer overflow due to too many pixels"; + case 93: + return "zero width or height is invalid"; + case 94: + return "header chunk must have a size of 13 bytes"; + case 95: + return "integer overflow with combined idat chunk size"; + case 96: + return "invalid gAMA chunk size"; + case 97: + return "invalid cHRM chunk size"; + case 98: + return "invalid sRGB chunk size"; + case 99: + return "invalid sRGB rendering intent"; + case 100: + return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; + case 101: + return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; + case 102: + return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; + case 103: + return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; + case 104: + return "invalid bKGD color while encoding (e.g. palette index out of range)"; + case 105: + return "integer overflow of bitsize"; + case 106: + return "PNG file must have PLTE chunk if color type is palette"; + case 107: + return "color convert from palette mode requested without setting the palette data in it"; + case 108: + return "tried to add more than 256 values to a palette"; + /*this limit can be configured in LodePNGDecompressSettings*/ + case 109: + return "tried to decompress zlib or deflate data larger than desired max_output_size"; + case 110: + return "custom zlib or inflate decompression failed"; + case 111: + return "custom zlib or deflate compression failed"; + /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large text sizes.*/ + case 112: + return "compressed text unreasonably large"; + /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large ICC profile*/ + case 113: + return "ICC profile unreasonably large"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +unsigned load_file(std::vector & buffer, const std::string & filename) +{ + long size = lodepng_filesize(filename.c_str()); + if(size < 0) return 78; + buffer.resize((size_t)size); + return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned save_file(const std::vector & buffer, const std::string & filename) +{ + return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); +} +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings & settings) +{ + unsigned char * buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector & out, const std::vector & in, + const LodePNGDecompressSettings & settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings & settings) +{ + unsigned char * buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector & out, const std::vector & in, + const LodePNGCompressSettings & settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State & other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State & State::operator=(const State & other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, const unsigned char * in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer = 0; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::vector & in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const unsigned char * in, size_t insize) +{ + unsigned char * buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const std::vector & in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector & out, unsigned & w, unsigned & h, const std::string & filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + /* safe output values in case error happens */ + w = h = 0; + unsigned error = load_file(buffer, filename); + if(error) return error; + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DECODER */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector & out, const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + State & state) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + State & state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string & filename, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) error = save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string & filename, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_PNG */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +#endif /*LV_USE_LODEPNG*/ diff --git a/libraries/lvgl/src/libs/lodepng/lodepng.h b/libraries/lvgl/src/libs/lodepng/lodepng.h new file mode 100644 index 0000000..de9eec5 --- /dev/null +++ b/libraries/lvgl/src/libs/lodepng/lodepng.h @@ -0,0 +1,1994 @@ +/* +LodePNG version 20201017 + +Copyright (c) 2005-2020 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include /*for size_t*/ + +#include "../../../lvgl.h" +#if LV_USE_LODEPNG +LV_ATTRIBUTE_EXTERN_DATA extern const char * LODEPNG_VERSION_STRING; + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to +allow implementing a custom lodepng_crc32. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB + #define LODEPNG_COMPILE_ZLIB +#endif + +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG + #define LODEPNG_COMPILE_PNG +#endif + +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER + #define LODEPNG_COMPILE_DECODER +#endif + +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER + #define LODEPNG_COMPILE_ENCODER +#endif + +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK + #define LODEPNG_COMPILE_DISK +#endif + +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS + #define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif + +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT + #define LODEPNG_COMPILE_ERROR_TEXT +#endif + +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS + #define LODEPNG_COMPILE_ALLOCATORS +#endif + +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus + #ifndef LODEPNG_NO_COMPILE_CPP + #define LODEPNG_COMPILE_CPP + #endif +#endif + +#ifdef LODEPNG_COMPILE_CPP + #include + #include +#endif /*LODEPNG_COMPILE_CPP*/ + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw image).*/ +typedef enum _LodePNGColorType { + LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ + LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ + /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid + byte value from 0 to 255 that could be present in an invalid PNG file header. Do + not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use + the valid color type names above, or numeric values like 1 or 7 when checking for + particular disallowed color type byte values, or cast to integer to print it.*/ + LCT_MAX_OCTET_VALUE = 255 +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const unsigned char * in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::vector & in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::string & filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string & filename, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string & filename, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT + /*Returns an English description of the numerical error code.*/ + const char * lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct _LodePNGDecompressSettings LodePNGDecompressSettings; +struct _LodePNGDecompressSettings { + /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ + + /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding, + return an error, output a data size > max_output_size and all the data up to that point. This is + not hard limit nor a guarantee, but can prevent excessive memory usage. This setting is + ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones. + Set to 0 to impose no limit (the default).*/ + size_t max_output_size; + + /*use custom zlib decoder instead of built in one (default: null). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned(*custom_zlib)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGDecompressSettings *); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned(*custom_inflate)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGDecompressSettings *); + + const void * custom_context; /*optional custom settings for custom functions*/ +}; + +LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct _LodePNGCompressSettings LodePNGCompressSettings; +struct _LodePNGCompressSettings { /*deflate = compress*/ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ + unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned(*custom_zlib)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGCompressSettings *); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned(*custom_deflate)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGCompressSettings *); + + const void * custom_context; /*optional custom settings for custom functions*/ +}; + +LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings * settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct _LodePNGColorMode { + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + This field may not be allocated directly, use lodepng_color_mode_init first, + then lodepng_palette_add per color to correctly initialize it (to ensure size + of exactly 1024 bytes). + + The alpha channels must be set as well, set them to 255 for opaque images. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char * palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ + size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For grayscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/grayscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode * info); +void lodepng_color_mode_cleanup(LodePNGColorMode * info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source); +/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); + +void lodepng_palette_clear(LodePNGColorMode * info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode * info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode * info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode * info); +/*is it a grayscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode * info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode * info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode * info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct _LodePNGTime { + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct _LodePNGInfo { + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + Suggested background color chunk (bKGD) + + This uses the same color mode and bit depth as the PNG (except no alpha channel), + with values truncated to the bit depth in the unsigned integer. + + For grayscale and palette PNGs, the value is stored in background_r. The values + in background_g and background_b are then unused. + + So when decoding, you may get these in a different color mode than the one you requested + for the raw pixels. + + When encoding with auto_convert, you must use the color model defined in info_png.color for + these values. The encoder normally ignores info_png.color when auto_convert is on, but will + use it to interpret these values (and convert copies of them to its chosen color model). + + When encoding, avoid setting this to an expensive color, such as a non-gray value + when the image is gray, or the compression will be worse since it will be forced to + write the PNG with a more expensive color mode (when auto_convert is on). + + The decoder does not use this background color to edit the color of pixels. This is a + completely optional metadata feature. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red/gray/palette component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + Non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + All the string fields below including strings, keys, names and language tags are null terminated. + The PNG specification uses null characters for the keys, names and tags, and forbids null + characters to appear in the main text which is why we can use null termination everywhere here. + + A keyword is minimum 1 character and maximum 79 characters long (plus the + additional null terminator). It's discouraged to use a single line length + longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + + Standard text chunk keywords and strings are encoded using Latin-1. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char ** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char ** text_strings; /*the actual text*/ + + /* + International text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys", and the following text encodings are used: + keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8. + keys must be 1-79 characters (plus the additional null terminator), the other + strings are any length. + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char ** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char ** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char ** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char ** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + Color profile related chunks: gAMA, cHRM, sRGB, iCPP + + LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color + profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please + use these values with a color management library. + + See the PNG, ICC and sRGB specifications for more information about the meaning of these values. + */ + + /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ + unsigned gama_gamma; /* Gamma exponent times 100000 */ + + /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ + unsigned chrm_white_x; /* White Point x times 100000 */ + unsigned chrm_white_y; /* White Point y times 100000 */ + unsigned chrm_red_x; /* Red x times 100000 */ + unsigned chrm_red_y; /* Red y times 100000 */ + unsigned chrm_green_x; /* Green x times 100000 */ + unsigned chrm_green_y; /* Green y times 100000 */ + unsigned chrm_blue_x; /* Blue x times 100000 */ + unsigned chrm_blue_y; /* Blue y times 100000 */ + + /* + sRGB chunk: optional. May not appear at the same time as iCCP. + If gAMA is also present gAMA must contain value 45455. + If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. + */ + unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ + unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ + + /* + iCCP chunk: optional. May not appear at the same time as sRGB. + + LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a + separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color + management and conversions. + + For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC + profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and + enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. + + For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray + PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure + the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is + enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder + error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel + data if the pixels could be encoded as grayscale but the ICC profile is RGB. + + To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so + make sure you compute it carefully to avoid the above problems. + */ + unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ + char * iccp_name; /* Null terminated string with profile name, 1-79 bytes */ + /* + The ICC profile in iccp_profile_size bytes. + Don't allocate this buffer yourself. Use the init/cleanup functions + correctly and use lodepng_set_icc and lodepng_clear_icc. + */ + unsigned char * iccp_profile; + unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ + + /* End of color profile related chunks */ + + + /* + unknown chunks: chunks not known by LodePNG, passed on byte for byte. + + There are 3 buffers, one for each position in the PNG where unknown chunks can appear. + Each buffer contains all unknown chunks for that position consecutively. + The 3 positions are: + 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. + + For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag + above in here, since the encoder will blindly follow this and could then encode an invalid PNG file + (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use + this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), + or any non-standard PNG chunk. + + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char * unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo * info); +void lodepng_info_cleanup(LodePNGInfo * info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str); /*push back both texts at once*/ +void lodepng_clear_text(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ + +unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str); /*push back the 4 texts of 1 chunk at once*/ +void lodepng_clear_itext(LodePNGInfo * info); /*use this to clear the itexts again after you filled them in*/ + +/*replaces if exists*/ +unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size); +void lodepng_clear_icc(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code +*/ +unsigned lodepng_convert(unsigned char * out, const unsigned char * in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, + unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct _LodePNGDecoderSettings { + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ + unsigned ignore_crc; /*ignore CRC checksums*/ + unsigned ignore_critical; /*ignore unknown critical chunks*/ + unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ + /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable + errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some + strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters + in string keys, etc... */ + + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; + + /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned, + unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size. + By default it is a value that prevents unreasonably large strings from hogging memory. */ + size_t max_text_size; + + /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to + 0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any + legitimate profile could be to hog memory. */ + size_t max_icc_size; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum _LodePNGFilterStrategy { + /*every filter at zero*/ + LFS_ZERO = 0, + /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ + LFS_ONE = 1, + LFS_TWO = 2, + LFS_THREE = 3, + LFS_FOUR = 4, + /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), +which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct _LodePNGColorStats { + unsigned colored; /*not grayscale*/ + unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ + unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ + unsigned char + palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ + size_t numpixels; + + /*user settings for computing/using the stats*/ + unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ + unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ +} LodePNGColorStats; + +void lodepng_color_stats_init(LodePNGColorStats * stats); + +/*Get a LodePNGColorStats of the image. The stats must already have been inited. +Returns error code (e.g. alloc fail) or 0 if ok.*/ +unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, + const unsigned char * image, unsigned w, unsigned h, + const LodePNGColorMode * mode_in); + +/*Settings for the encoder.*/ +typedef struct _LodePNGEncoderSettings { + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char * predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct _LodePNGState { +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState * state); +void lodepng_state_cleanup(LodePNGState * state); +void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the IHDR chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* +Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it +read in the state. Returns error code on failure. +Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const +to find the desired chunk type, and if non null use lodepng_inspect_chunk (with +chunk_pointer - start_of_file as pos). +Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). +Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). +Requirements: &in[pos] must point to start of a chunk, must use regular +lodepng_inspect first since format of most other chunks depends on IHDR, and if +there is a PLTE chunk, that one must be inspected before tRNS or bKGD. +*/ +unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, + const unsigned char * in, size_t insize); + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGState * state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +The chunk pointer always points to the beginning of the chunk itself, that is +the first byte of the 4 length bytes. + +In the PNG file format, chunks have the following format: +-4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) +-4 bytes chunk type (ASCII a-z,A-Z only, see below) +-length bytes of data (may be 0 bytes if length was 0) +-4 bytes of CRC, computed on chunk name + data + +The first chunk starts at the 8th byte of the PNG file, the entire rest of the file +exists out of concatenated chunks with the above format. + +PNG standard chunk ASCII naming conventions: +-First byte: uppercase = critical, lowercase = ancillary +-Second byte: uppercase = public, lowercase = private +-Third byte: must be uppercase +-Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ +unsigned lodepng_chunk_length(const unsigned char * chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char * chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char * chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char * chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char * lodepng_chunk_data(unsigned char * chunk); +const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char * chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char * chunk); + +/* +Iterate to next chunks, allows iterating through all chunks of the PNG file. +Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, +or the 8th byte of a PNG file which always has the first chunk), or alternatively may +point to the first byte of the PNG file (which is not a chunk but the magic header, the +function will then skip over it and return the first real chunk). +Will output pointer to the start of the next chunk, or at or beyond end of the file if there +is no more chunk after this or possibly if the chunk is corrupt. +Start this process at the 8th byte of the PNG file. +In a non-corrupt PNG file, the last chunk should have name "IEND". +*/ +unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end); +const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end); + +/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ +unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]); +const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, + const char type[5]); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outsize are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outsize are updated to reflect the new reallocated buffer. +Return error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, unsigned length, + const char * type, const unsigned char * data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char * buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK + /* + Load a file from disk into buffer. The function allocates the out buffer, and + after usage you should free it. + out: output parameter, contains pointer to loaded buffer. + outsize: output parameter, size of the allocated out buffer + filename: the path to the file to load + return value: error code (0 means ok) + */ + unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename); + + /* + Save a file from buffer to disk. Warning, if it exists, this function overwrites + the file without warning! + buffer: the buffer to write + buffersize: size of the buffer to write + filename: the path to the file to save to + return value: error code (0 means ok) + */ + unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State & other); + ~State(); + State & operator=(const State & other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +/* Same as other lodepng::decode, but using a State for more settings and information. */ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const unsigned char * in, size_t insize); +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const std::vector & in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Same as other lodepng::encode, but using a State for more settings and information. */ +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + State & state); +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + State & state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK + /* + Load a file from disk into an std::vector. + return value: error code (0 means ok) + */ + unsigned load_file(std::vector & buffer, const std::string & filename); + + /* + Save the binary data in an std::vector to a file on disk. The file is overwritten + without warning. + */ + unsigned save_file(const std::vector & buffer, const std::string & filename); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_PNG */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +/* Zlib-decompress an unsigned char buffer */ +unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); + +/* Zlib-decompress an std::vector */ +unsigned decompress(std::vector & out, const std::vector & in, + const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Zlib-compress an unsigned char buffer */ +unsigned compress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings & settings = lodepng_default_compress_settings); + +/* Zlib-compress an std::vector */ +unsigned compress(std::vector & out, const std::vector & in, + const LodePNGCompressSettings & settings = lodepng_default_compress_settings); +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with various compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[X] support color profile chunk types (but never let them touch RGB values by default) +[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) +[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... +[ ] error messages with line numbers (and version) +[ ] errors in state instead of as return code? +[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... +[ ] allow user to give data (void*) to custom allocator +[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) +*/ + +#endif /*LV_USE_LODEPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. state settings reference + 12. changes + 13. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color modelete,translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, + plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + cHRM: RGB chromaticities + gAMA: RGB gamma correction + iCCP: ICC color profile + sRGB: rendering intent + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG: + sBIT + hIST + sPLT + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to grayscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, grayscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to grayscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: grayscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: grayscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters colortype and bitdepth of the simple decoding function. + +If, when encoding, you use another color type than the default in the raw input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). + +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +Non supported color conversions: +-color to grayscale when non-gray pixels are present: no error is thrown, but +the result will look ugly because only the red channel is taken (it assumes all +three channels are the same in this case so ignores green and blue). The reason +no error is given is to allow converting from three-channel grayscale images to +one-channel even if there are numerical imprecisions. +-anything to palette when the palette does not have an exact match for a from-color +in it: in this case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any gray or gray+alpha, to gray or gray+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done (e.g. for speed or control): +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +false. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + +It is not recommended to use the numerical values to programmatically make +different decisions based on error types as the numbers are not guaranteed to +stay backwards compatible. They are for human consumption only. Programmatically +only 0 or non-0 matter. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outsize. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distinction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +It is compatible with C90 and up, and C++03 and up. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Clang + +Fully supported and warning-free. + +*) Mingw + +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. + +*) Visual Studio and Visual C++ Express Edition + +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +This is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. + +*) Other Compilers + +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards compliant. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) { + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) { + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + +11. state settings reference +---------------------------- + +A quick reference of some settings to set on the LodePNGState + +For decoding: + +state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums +state.decoder.zlibsettings.custom_...: use custom inflate function +state.decoder.ignore_crc: ignore CRC checksums +state.decoder.ignore_critical: ignore unknown critical chunks +state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors +state.decoder.color_convert: convert internal PNG color to chosen one +state.decoder.read_text_chunks: whether to read in text metadata chunks +state.decoder.remember_unknown_chunks: whether to read in unknown chunks +state.info_raw.colortype: desired color type for decoded image +state.info_raw.bitdepth: desired bit depth for decoded image +state.info_raw....: more color settings, see struct LodePNGColorMode +state.info_png....: no settings for decoder but output, see struct LodePNGInfo + +For encoding: + +state.encoder.zlibsettings.btype: disable compression by setting it to 0 +state.encoder.zlibsettings.use_lz77: use LZ77 in compression +state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize +state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match +state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching +state.encoder.zlibsettings.lazymatching: try one more LZ77 matching +state.encoder.zlibsettings.custom_...: use custom deflate function +state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png +state.encoder.filter_palette_zero: PNG filter strategy for palette +state.encoder.filter_strategy: PNG filter strategy to encode with +state.encoder.force_palette: add palette even if not encoding to one +state.encoder.add_id: add LodePNG identifier and version as a text chunk +state.encoder.text_compression: use compressed text chunks for metadata +state.info_raw.colortype: color type of raw input image you provide +state.info_raw.bitdepth: bit depth of raw input image you provide +state.info_raw: more color settings, see struct LodePNGColorMode +state.info_png.color.colortype: desired color type if auto_convert is false +state.info_png.color.bitdepth: desired bit depth if auto_convert is false +state.info_png.color....: more color settings, see struct LodePNGColorMode +state.info_png....: more PNG related settings, see struct LodePNGInfo + + +12. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +Not all changes are listed here, the commit history in github lists more: +https://github.com/lvandeve/lodepng + +*) 17 okt 2020: prevent decoding too large text/icc chunks by default. +*) 06 mar 2020: simplified some of the dynamic memory allocations. +*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct + overflow checks. +*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. +*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette + if gray ICC profile) and non-ICC LodePNGColorProfile renamed to + LodePNGColorStats. +*) 30 dec 2018: code style changes only: removed newlines before opening braces. +*) 10 sep 2018: added way to inspect metadata chunks without full decoding. +*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use + palette index in case of palette. +*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This + change is backwards compatible unless you relied on unknown_chunks for those. +*) 11 jun 2018: less restrictive check for pixel size integer overflow +*) 14 jan 2018: allow optionally ignoring a few more recoverable errors +*) 17 sep 2017: fix memory leak for some encoder input error cases +*) 27 nov 2016: grey+alpha auto color model detection bugfix +*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). +*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within + the limits of pure C90). +*) 08 dec 2015: Made load_file function return error if file can't be opened. +*) 24 okt 2015: Bugfix with decoding to palette output. +*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. +*) 24 aug 2014: Moved to github +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrunk the implementation code. Made new samples. +*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011: (!) changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also various fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +13. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2020 Lode Vandevenne +*/ diff --git a/libraries/lvgl/src/libs/lodepng/lv_lodepng.c b/libraries/lvgl/src/libs/lodepng/lv_lodepng.c new file mode 100644 index 0000000..34b3bef --- /dev/null +++ b/libraries/lvgl/src/libs/lodepng/lv_lodepng.c @@ -0,0 +1,272 @@ +/** + * @file lv_lodepng.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_LODEPNG + +#include "lv_lodepng.h" +#include "lodepng.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); +static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt); +static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_lodepng_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); +} + +void lv_lodepng_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param decoder pointer to the decoder where this function belongs + * @param src can be file name or pointer to a C array + * @param header image information is set in header parameter + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + (void) decoder; /*Unused*/ + lv_image_src_t src_type = lv_image_src_get_type(src); /*Get the source type*/ + + /*If it's a PNG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + if(lv_strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/ + + /* Read the width and height from the file. They have a constant location: + * [16..23]: width + * [24..27]: height + */ + uint32_t size[2]; + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + + lv_fs_seek(&f, 16, LV_FS_SEEK_SET); + + uint32_t rn; + lv_fs_read(&f, &size, 8, &rn); + lv_fs_close(&f); + + if(rn != 8) return LV_RESULT_INVALID; + + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_ARGB8888; + /*The width and height are stored in Big endian format so convert them to little endian*/ + header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + + return LV_RESULT_OK; + } + } + /*If it's a PNG file in a C array...*/ + else if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + const uint32_t data_size = img_dsc->data_size; + const uint32_t * size = ((uint32_t *)img_dsc->data) + 4; + const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + if(data_size < sizeof(magic)) return LV_RESULT_INVALID; + if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RESULT_INVALID; + + header->cf = LV_COLOR_FORMAT_ARGB8888; + + if(img_dsc->header.w) { + header->w = img_dsc->header.w; /*Save the image width*/ + } + else { + header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + } + + if(img_dsc->header.h) { + header->h = img_dsc->header.h; /*Save the color height*/ + } + else { + header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + } + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a PNG image and decode it into dsc.decoded + * @param decoder pointer to the decoder where this function belongs + * @param dsc decoded image descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + const uint8_t * png_data = NULL; + size_t png_data_size = 0; + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + if(lv_strcmp(lv_fs_get_ext(fn), "png") == 0) { /*Check the extension*/ + unsigned error; + error = lodepng_load_file((void *)&png_data, &png_data_size, fn); /*Load the file*/ + if(error) { + if(png_data != NULL) { + lv_free((void *)png_data); + } + LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + return LV_RESULT_INVALID; + } + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = dsc->src; + png_data = img_dsc->data; + png_data_size = img_dsc->data_size; + } + else { + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * decoded = decode_png_data(png_data, png_data_size); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)png_data); + + if(!decoded) { + LV_LOG_WARN("Error decoding PNG\n"); + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + lv_draw_buf_destroy(decoded); + decoded = adjusted; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) return LV_RES_OK; + +#if LV_CACHE_DEF_SIZE > 0 + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; +#endif + + return LV_RESULT_OK; /*If not returned earlier then it failed*/ +} + +/** + * Close PNG image and free data + * @param decoder pointer to the decoder where this function belongs + * @param dsc decoded image descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + if(dsc->args.no_cache || LV_CACHE_DEF_SIZE == 0) + lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); + else + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); +} + +static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size) +{ + unsigned png_width; /*Not used, just required by the decoder*/ + unsigned png_height; /*Not used, just required by the decoder*/ + lv_draw_buf_t * decoded = NULL; + + /*Decode the image in ARGB8888 */ + unsigned error = lodepng_decode32((unsigned char **)&decoded, &png_width, &png_height, png_data, png_data_size); + if(error) { + if(decoded != NULL) lv_draw_buf_destroy(decoded); + return NULL; + } + + /*Convert the image to the system's color depth*/ + convert_color_depth(decoded->data, png_width * png_height); + + return decoded; +} + +/** + * If the display is not in 32 bit format (ARGB888) then convert the image to the current color depth + * @param img the ARGB888 image + * @param px_cnt number of pixels in `img` + */ +static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt) +{ + lv_color32_t * img_argb = (lv_color32_t *)img_p; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + uint8_t blue = img_argb[i].blue; + img_argb[i].blue = img_argb[i].red; + img_argb[i].red = blue; + } +} + +#endif /*LV_USE_LODEPNG*/ diff --git a/libraries/lvgl/src/libs/lodepng/lv_lodepng.h b/libraries/lvgl/src/libs/lodepng/lv_lodepng.h new file mode 100644 index 0000000..f3dc4b7 --- /dev/null +++ b/libraries/lvgl/src/libs/lodepng/lv_lodepng.h @@ -0,0 +1,48 @@ +/** + * @file lv_lodepng.h + * + */ + +#ifndef LV_LODEPNG_H +#define LV_LODEPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LODEPNG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_lodepng_init(void); + +void lv_lodepng_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LODEPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LODEPNG_H*/ diff --git a/libraries/lvgl/src/libs/lz4/LICENSE b/libraries/lvgl/src/libs/lz4/LICENSE new file mode 100644 index 0000000..4884916 --- /dev/null +++ b/libraries/lvgl/src/libs/lz4/LICENSE @@ -0,0 +1,24 @@ +LZ4 Library +Copyright (c) 2011-2020, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/libraries/lvgl/src/libs/lz4/lz4.c b/libraries/lvgl/src/libs/lz4/lz4.c new file mode 100644 index 0000000..145f5fb --- /dev/null +++ b/libraries/lvgl/src/libs/lz4/lz4.c @@ -0,0 +1,2761 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_LZ4_INTERNAL + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how stateless compression functions like `LZ4_compress_default()` + * allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * LZ4_ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define LZ4_ACCELERATION_DEFAULT 1 +/* + * LZ4_ACCELERATION_MAX : + * Any "acceleration" value higher than this threshold + * get treated as LZ4_ACCELERATION_MAX instead (fix #876) + */ +#define LZ4_ACCELERATION_MAX 65537 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && \ + ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ + || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) || defined(_MSC_VER) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ +# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + + +/*-************************************ +* Dependency +**************************************/ +/* + * LZ4_SRC_INCLUDED: + * Amalgamation flag, whether lz4.c is included + */ +#ifndef LZ4_SRC_INCLUDED +# define LZ4_SRC_INCLUDED 1 +#endif + +#ifndef LZ4_STATIC_LINKING_ONLY +#define LZ4_STATIC_LINKING_ONLY +#endif + +#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS +#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ +#endif + +#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Visual Studio 2005+ */ +# include /* only present in VS2005+ */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ +#endif /* _MSC_VER */ + +#ifndef LZ4_FORCE_INLINE +# ifdef _MSC_VER /* Visual Studio */ +# define LZ4_FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# ifdef __GNUC__ +# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define LZ4_FORCE_INLINE static inline +# endif +# else +# define LZ4_FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* LZ4_FORCE_INLINE */ + +/* LZ4_FORCE_O2 and LZ4_FORCE_INLINE + * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, + * together with a simple 8-byte copy loop as a fall-back path. + * However, this optimization hurts the decompression speed by >30%, + * because the execution does not go to the optimized loop + * for typical compressible data, and all of the preamble checks + * before going to the fall-back path become useless overhead. + * This optimization happens only with the -O3 flag, and -O2 generates + * a simple 8-byte copy loop. + * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 + * functions are annotated with __attribute__((optimize("O2"))), + * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute + * of LZ4_wildCopy8 does not affect the compression speed. + */ +#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) +# define LZ4_FORCE_O2 __attribute__((optimize("O2"))) +# undef LZ4_FORCE_INLINE +# define LZ4_FORCE_INLINE static __inline __attribute__((optimize("O2"),always_inline)) +#else +# define LZ4_FORCE_O2 +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#ifndef likely +#define likely(expr) expect((expr) != 0, 1) +#endif +#ifndef unlikely +#define unlikely(expr) expect((expr) != 0, 0) +#endif + +/* Should the alignment test prove unreliable, for some reason, + * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ +#ifndef LZ4_ALIGN_TEST /* can be externally provided */ +# define LZ4_ALIGN_TEST 1 +#endif + + +/*-************************************ +* Memory routines +**************************************/ + +/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : + * Disable relatively high-level LZ4/HC functions that use dynamic memory + * allocation functions (malloc(), calloc(), free()). + * + * Note that this is a compile-time switch. And since it disables + * public/stable LZ4 v1 API functions, we don't recommend using this + * symbol to generate a library for distribution. + * + * The following public functions are removed when this symbol is defined. + * - lz4 : LZ4_createStream, LZ4_freeStream, + * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) + * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, + * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) + * - lz4frame, lz4file : All LZ4F_* functions + */ +#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +# define ALLOC(s) lz4_error_memory_allocation_is_disabled +# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled +# define FREEMEM(p) lz4_error_memory_allocation_is_disabled +#elif defined(LZ4_USER_MEMORY_FUNCTIONS) +/* memory management functions can be customized by user project. + * Below functions must exist somewhere in the Project + * and be available at link time */ +void* LZ4_malloc(size_t s); +void* LZ4_calloc(size_t n, size_t s); +void LZ4_free(void* p); +# define ALLOC(s) LZ4_malloc(s) +# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) +# define FREEMEM(p) LZ4_free(p) +#else +# include /* malloc, calloc, free */ +# define ALLOC(s) malloc(s) +# define ALLOC_AND_ZERO(s) calloc(1,s) +# define FREEMEM(p) free(p) +#endif + +#if ! LZ4_FREESTANDING +# include /* memset, memcpy */ +#endif +#if !defined(LZ4_memset) +# define LZ4_memset(p,v,s) memset((p),(v),(s)) +#endif +#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) + + +/*-************************************ +* Common Constants +**************************************/ +#define MINMATCH 4 + +#define WILDCOPYLENGTH 8 +#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ +#define FASTLOOP_SAFE_DISTANCE 64 +static const int LZ4_minLength = (MFLIMIT+1); + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 +#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ +# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" +#endif + +#define ML_BITS 4 +#define ML_MASK ((1U<=1) +# include +#else +# ifndef assert +# define assert(condition) ((void)0) +# endif +#endif + +#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) +# include + static int g_debuglog_enable = 1; +# define DEBUGLOG(l, ...) { \ + if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ + fprintf(stderr, __FILE__ " %i: ", __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + +static int LZ4_isAligned(const void* ptr, size_t alignment) +{ + return ((size_t)ptr & (alignment -1)) == 0; +} + + +/*-************************************ +* Types +**************************************/ +#include +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else +# if UINT_MAX != 4294967295UL +# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" +# endif + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +typedef enum { + notLimited = 0, + limitedOutput = 1, + fillOutput = 2 +} limitedOutput_directive; + + +/*-************************************ +* Reading and writing into memory +**************************************/ + +/** + * LZ4 relies on memcpy with a constant size being inlined. In freestanding + * environments, the compiler can't assume the implementation of memcpy() is + * standard compliant, so it can't apply its specialized memcpy() inlining + * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze + * memcpy() as if it were standard compliant, so it can inline it in freestanding + * environments. This is needed when decompressing the Linux Kernel, for example. + */ +#if !defined(LZ4_memcpy) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) +# else +# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) +# endif +#endif + +#if !defined(LZ4_memmove) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memmove __builtin_memmove +# else +# define LZ4_memmove memmove +# endif +#endif + +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) +#define LZ4_PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) +#elif defined(_MSC_VER) +#define LZ4_PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop)) +#endif + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +LZ4_PACK(typedef struct { U16 u16; }) LZ4_unalign16; +LZ4_PACK(typedef struct { U32 u32; }) LZ4_unalign32; +LZ4_PACK(typedef struct { reg_t uArch; }) LZ4_unalignST; + +static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; } + +#else /* safe and portable access using memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +LZ4_FORCE_INLINE +void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ +LZ4_FORCE_INLINE void +LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH + * - there is at least 8 bytes available to write after dstEnd */ +LZ4_FORCE_INLINE void +LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + BYTE v[8]; + + assert(dstEnd >= dstPtr + MINMATCH); + + switch(offset) { + case 1: + MEM_INIT(v, *srcPtr, 8); + break; + case 2: + LZ4_memcpy(v, srcPtr, 2); + LZ4_memcpy(&v[2], srcPtr, 2); +#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ +# pragma warning(push) +# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ +#endif + LZ4_memcpy(&v[4], v, 4); +#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ +# pragma warning(pop) +#endif + break; + case 4: + LZ4_memcpy(v, srcPtr, 4); + LZ4_memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; + } + + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + while (dstPtr < dstEnd) { + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + } +} +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (reg_t val) +{ + assert(val != 0); + if (LZ4_isLittleEndian()) { + if (sizeof(val) == 8) { +# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) +/*-************************************************************************************************* +* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. +* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics +* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. +****************************************************************************************************/ +# if defined(__clang__) && (__clang_major__ < 10) + /* Avoid undefined clang-cl intrinsics issue. + * See https://github.com/lz4/lz4/pull/1017 for details. */ + return (unsigned)__builtin_ia32_tzcnt_u64(val) >> 3; +# else + /* x64 CPUS without BMI support interpret `TZCNT` as `REP BSF` */ + return (unsigned)_tzcnt_u64(val) >> 3; +# endif +# elif defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64(&r, (U64)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctzll((U64)val) >> 3; +# else + const U64 m = 0x0101010101010101ULL; + val ^= val - 1; + return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctz((U32)val) >> 3; +# else + const U32 m = 0x01010101; + return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clzll((U64)val) >> 3; +# else +#if 1 + /* this method is probably faster, + * but adds a 128 bytes lookup table */ + static const unsigned char ctz7_tab[128] = { + 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + }; + U64 const mask = 0x0101010101010101ULL; + U64 const t = (((val >> 8) - mask) | val) & mask; + return ctz7_tab[(t * 0x0080402010080402ULL) >> 57]; +#else + /* this method doesn't consume memory space like the previous one, + * but it contains several branches, + * that may end up slowing execution */ + static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. + Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. + Note that this code path is never triggered in 32-bits mode. */ + unsigned r; + if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +#endif +# endif + } else /* 32 bits */ { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clz((U32)val) >> 3; +# else + val >>= 8; + val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) | + (val + 0x00FF0000)) >> 24; + return (unsigned)val ^ 3; +# endif + } + } +} + + +#define STEPSIZE sizeof(reg_t) +LZ4_FORCE_INLINE +unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + if (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { + pIn+=STEPSIZE; pMatch+=STEPSIZE; + } else { + return LZ4_NbCommonBytes(diff); + } } + + while (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + pIn += LZ4_NbCommonBytes(diff); + return (unsigned)(pIn - pStart); + } + + if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; + +/** + * This enum distinguishes several different modes of accessing previous + * content in the stream. + * + * - noDict : There is no preceding content. + * - withPrefix64k : Table entries up to ctx->dictSize before the current blob + * blob being compressed are valid and refer to the preceding + * content (of length ctx->dictSize), which is available + * contiguously preceding in memory the content currently + * being compressed. + * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere + * else in memory, starting at ctx->dictionary with length + * ctx->dictSize. + * - usingDictCtx : Everything concerning the preceding content is + * in a separate context, pointed to by ctx->dictCtx. + * ctx->dictionary, ctx->dictSize, and table entries + * in the current context that refer to positions + * preceding the beginning of the current compression are + * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx + * ->dictSize describe the location and size of the preceding + * content, and matches are found by looking in the ctx + * ->dictCtx->hashTable. + */ +typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } + + +/*-**************************************** +* Internal Definitions, used only in Tests +*******************************************/ +#if defined (__cplusplus) +extern "C" { +#endif + +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); + +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize); +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize); +#if defined (__cplusplus) +} +#endif + +/*-****************************** +* Compression functions +********************************/ +LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) { + const U64 prime5bytes = 889523592379ULL; + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + } else { + const U64 prime8bytes = 11400714785074694791ULL; + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); + } +} + +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } + case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } + } +} + +/* LZ4_putPosition*() : only used in byPtr mode */ +LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, + void* tableBase, tableType_t const tableType) +{ + const BYTE** const hashTable = (const BYTE**)tableBase; + assert(tableType == byPtr); (void)tableType; + hashTable[h] = p; +} + +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType); +} + +/* LZ4_getIndexOnHash() : + * Index of match position registered in hash table. + * hash position must be calculated by using base+index, or dictBase+index. + * Assumption 1 : only valid if tableType == byU32 or byU16. + * Assumption 2 : h is presumed valid (within limits of hash table) + */ +LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); + if (tableType == byU32) { + const U32* const hashTable = (const U32*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + return hashTable[h]; + } + if (tableType == byU16) { + const U16* const hashTable = (const U16*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + return hashTable[h]; + } + assert(0); return 0; /* forbidden case */ +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + assert(tableType == byPtr); (void)tableType; + { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } +} + +LZ4_FORCE_INLINE const BYTE* +LZ4_getPosition(const BYTE* p, + const void* tableBase, tableType_t tableType) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType); +} + +LZ4_FORCE_INLINE void +LZ4_prepareTable(LZ4_stream_t_internal* const cctx, + const int inputSize, + const tableType_t tableType) { + /* If the table hasn't been used, it's guaranteed to be zeroed out, and is + * therefore safe to use no matter what mode we're in. Otherwise, we figure + * out if it's safe to leave as is or whether it needs to be reset. + */ + if ((tableType_t)cctx->tableType != clearedTable) { + assert(inputSize >= 0); + if ((tableType_t)cctx->tableType != tableType + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) + { + DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); + MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); + cctx->currentOffset = 0; + cctx->tableType = (U32)clearedTable; + } else { + DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); + } + } + + /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, + * is faster than compressing without a gap. + * However, compressing with currentOffset == 0 is faster still, + * so we preserve that case. + */ + if (cctx->currentOffset != 0 && tableType == byU32) { + DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); + cctx->currentOffset += 64 KB; + } + + /* Finally, clear history */ + cctx->dictCtx = NULL; + cctx->dictionary = NULL; + cctx->dictSize = 0; +} + +/** LZ4_compress_generic_validated() : + * inlined, to ensure branches are decided at compilation time. + * The following conditions are presumed already validated: + * - source != NULL + * - inputSize > 0 + */ +LZ4_FORCE_INLINE int LZ4_compress_generic_validated( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + int* inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + int result; + const BYTE* ip = (const BYTE*)source; + + U32 const startIndex = cctx->currentOffset; + const BYTE* base = (const BYTE*)source - startIndex; + const BYTE* lowLimit; + + const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; + const BYTE* const dictionary = + dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; + const U32 dictSize = + dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; + const U32 dictDelta = + (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with indexes in current context */ + + int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); + U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ + const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE* const matchlimit = iend - LASTLITERALS; + + /* the dictCtx currentOffset is indexed on the start of the dictionary, + * while a dictionary in the current context precedes the currentOffset */ + const BYTE* dictBase = (dictionary == NULL) ? NULL : + (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 offset = 0; + U32 forwardH; + + DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); + assert(ip != NULL); + if (tableType == byU16) assert(inputSize= 1); + + lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + + /* Update context state */ + if (dictDirective == usingDictCtx) { + /* Subsequent linked blocks can't use the dictionary. */ + /* Instead, they use the block we just compressed. */ + cctx->dictCtx = NULL; + cctx->dictSize = (U32)inputSize; + } else { + cctx->dictSize += (U32)inputSize; + } + cctx->currentOffset += (U32)inputSize; + cctx->tableType = (U32)tableType; + + if (inputSizehashTable, byPtr); + } else { + LZ4_putIndexOnHash(startIndex, h, cctx->hashTable, tableType); + } } + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + const BYTE* filledIp; + + /* Find a match */ + if (tableType == byPtr) { + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType); + + } while ( (match+LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + + } else { /* byU32, byU16 */ + + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + U32 const current = (U32)(forwardIp - base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex <= current); + assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + matchIndex += dictDelta; /* make dictCtx index comparable with current context */ + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else if (dictDirective == usingExtDict) { + if (matchIndex < startIndex) { + DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); + assert(startIndex - matchIndex >= MINMATCH); + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else { /* single continuous memory segment */ + match = base + matchIndex; + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + + DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); + if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ + assert(matchIndex < current); + if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex+LZ4_DISTANCE_MAX < current)) { + continue; + } /* too far */ + assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ + + if (LZ4_read32(match) == LZ4_read32(ip)) { + if (maybe_extMem) offset = current - matchIndex; + break; /* match found */ + } + + } while(1); + } + + /* Catch up */ + filledIp = ip; + assert(ip > anchor); /* this is always true as ip has been advanced before entering the main loop */ + if ((match > lowLimit) && unlikely(ip[-1] == match[-1])) { + do { ip--; match--; } while (((ip > anchor) & (match > lowLimit)) && (unlikely(ip[-1] == match[-1]))); + } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + if ((outputDirective == fillOutput) && + (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + op--; + goto _last_literals; + } + if (litLength >= RUN_MASK) { + int len = (int)(litLength - RUN_MASK); + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< olimit)) { + /* the match was too close to the end, rewind and go to last literals */ + op = token; + goto _last_literals; + } + + /* Encode Offset */ + if (maybe_extMem) { /* static test */ + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + assert(offset <= LZ4_DISTANCE_MAX && offset > 0); + LZ4_writeLE16(op, (U16)offset); op+=2; + } else { + DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); + assert(ip-match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + } + + /* Encode MatchLength */ + { unsigned matchCode; + + if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) + && (lowLimit==dictionary) /* match within extDict */ ) { + const BYTE* limit = ip + (dictEnd-match); + assert(dictEnd > match); + if (limit > matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += (size_t)matchCode + MINMATCH; + if (ip==limit) { + unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += (size_t)matchCode + MINMATCH; + DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + } + + if ((outputDirective) && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + if (outputDirective == fillOutput) { + /* Match description too long : reduce it */ + U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; + ip -= matchCode - newMatchCode; + assert(newMatchCode < matchCode); + matchCode = newMatchCode; + if (unlikely(ip <= filledIp)) { + /* We have already filled up to filledIp so if ip ends up less than filledIp + * we have positions in the hash table beyond the current position. This is + * a problem if we reuse the hash table. So we have to remove these positions + * from the hash table. + */ + const BYTE* ptr; + DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); + for (ptr = ip; ptr <= filledIp; ++ptr) { + U32 const h = LZ4_hashPosition(ptr, tableType); + LZ4_clearHash(h, cctx->hashTable, tableType); + } + } + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) { + op+=4; + LZ4_write32(op, 0xFFFFFFFF); + matchCode -= 4*255; + } + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + /* Ensure we have enough space for the last literals. */ + assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); + + anchor = ip; + + /* Test end of chunk */ + if (ip >= mflimitPlusOne) break; + + /* Fill table */ + { U32 const h = LZ4_hashPosition(ip-2, tableType); + if (tableType == byPtr) { + LZ4_putPositionOnHash(ip-2, h, cctx->hashTable, byPtr); + } else { + U32 const idx = (U32)((ip-2) - base); + LZ4_putIndexOnHash(idx, h, cctx->hashTable, tableType); + } } + + /* Test next position */ + if (tableType == byPtr) { + + match = LZ4_getPosition(ip, cctx->hashTable, tableType); + LZ4_putPosition(ip, cctx->hashTable, tableType); + if ( (match+LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + } else { /* byU32, byU16 */ + + U32 const h = LZ4_hashPosition(ip, tableType); + U32 const current = (U32)(ip-base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex < current); + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + matchIndex += dictDelta; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else { /* single memory segment */ + match = base + matchIndex; + } + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + assert(matchIndex < current); + if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip)) ) { + token=op++; + *token=0; + if (maybe_extMem) offset = current - matchIndex; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + goto _next_match; + } + } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRun = (size_t)(iend - anchor); + if ( (outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + if (outputDirective == fillOutput) { + /* adapt lastRun to fill 'dst' */ + assert(olimit >= op); + lastRun = (size_t)(olimit-op) - 1/*token*/; + lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun< 0); + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); + return result; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time; + * takes care of src == (NULL, 0) + * and forward the rest to LZ4_compress_generic_validated */ +LZ4_FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const src, + char* const dst, + const int srcSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int dstCapacity, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", + srcSize, dstCapacity); + + if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ + if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ + if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ + DEBUGLOG(5, "Generating an empty block"); + assert(outputDirective == notLimited || dstCapacity >= 1); + assert(dst != NULL); + dst[0] = 0; + if (outputDirective == fillOutput) { + assert (inputConsumed != NULL); + *inputConsumed = 0; + } + return 1; + } + assert(src != NULL); + + return LZ4_compress_generic_validated(cctx, src, dst, srcSize, + inputConsumed, /* only written into if outputDirective == fillOutput */ + dstCapacity, outputDirective, + tableType, dictDirective, dictIssue, acceleration); +} + + +int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; + assert(ctx != NULL); + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + +/** + * LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of + * "correctly initialized"). + */ +int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t_internal* const ctx = &((LZ4_stream_t*)state)->internal_donotuse; + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + assert(ctx != NULL); + + if (dstCapacity >= LZ4_compressBound(srcSize)) { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + + +int LZ4_compress_fast(const char* src, char* dest, int srcSize, int dstCapacity, int acceleration) +{ + int result; +#if (LZ4_HEAPMODE) + LZ4_stream_t* const ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctxPtr == NULL) return 0; +#else + LZ4_stream_t ctx; + LZ4_stream_t* const ctxPtr = &ctx; +#endif + result = LZ4_compress_fast_extState(ctxPtr, src, dest, srcSize, dstCapacity, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast(src, dst, srcSize, dstCapacity, 1); +} + + +/* Note!: This function leaves the stream in an unclean/broken state! + * It is not safe to subsequently use the same state with a _fastReset() or + * _continue() call without resetting it. */ +static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ + void* const s = LZ4_initStream(state, sizeof (*state)); + assert(s != NULL); (void)s; + + if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) { + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); + } else { + tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); + } } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* const ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctx == NULL) return 0; +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* const ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); + LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); + DEBUGLOG(4, "LZ4_createStream %p", lz4s); + if (lz4s == NULL) return NULL; + LZ4_initStream(lz4s, sizeof(*lz4s)); + return lz4s; +} +#endif + +static size_t LZ4_stream_t_alignment(void) +{ +#if LZ4_ALIGN_TEST + typedef struct { char c; LZ4_stream_t t; } t_a; + return sizeof(t_a) - sizeof(LZ4_stream_t); +#else + return 1; /* effectively disabled */ +#endif +} + +LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) +{ + DEBUGLOG(5, "LZ4_initStream"); + if (buffer == NULL) { return NULL; } + if (size < sizeof(LZ4_stream_t)) { return NULL; } + if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; + MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); + return (LZ4_stream_t*)buffer; +} + +/* resetStream is now deprecated, + * prefer initStream() which is more general */ +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); +} + +void LZ4_resetStream_fast(LZ4_stream_t* ctx) { + LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); + FREEMEM(LZ4_stream); + return (0); +} +#endif + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + const tableType_t tableType = byU32; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + U32 idx32; + + DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); + + /* It's necessary to reset the context, + * and not just continue it with prepareTable() + * to avoid any risk of generating overflowing matchIndex + * when compressing using this dictionary */ + LZ4_resetStream(LZ4_dict); + + /* We always increment the offset by 64 KB, since, if the dict is longer, + * we truncate it to the last 64k, and if it's shorter, we still want to + * advance by a whole window length so we can provide the guarantee that + * there are only valid offsets in the window, which allows an optimization + * in LZ4_compress_fast_continue() where it uses noDictIssue even when the + * dictionary isn't a full 64k. */ + dict->currentOffset += 64 KB; + + if (dictSize < (int)HASH_UNIT) { + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->tableType = (U32)tableType; + idx32 = dict->currentOffset - dict->dictSize; + + while (p <= dictEnd-HASH_UNIT) { + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); + p+=3; idx32+=3; + } + + return (int)dict->dictSize; +} + +void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) +{ + const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : + &(dictionaryStream->internal_donotuse); + + DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", + workingStream, dictionaryStream, + dictCtx != NULL ? dictCtx->dictSize : 0); + + if (dictCtx != NULL) { + /* If the current offset is zero, we will never look in the + * external dictionary context, since there is no value a table + * entry can take that indicate a miss. In that case, we need + * to bump the offset to something non-zero. + */ + if (workingStream->internal_donotuse.currentOffset == 0) { + workingStream->internal_donotuse.currentOffset = 64 KB; + } + + /* Don't actually attach an empty dictionary. + */ + if (dictCtx->dictSize == 0) { + dictCtx = NULL; + } + } + workingStream->internal_donotuse.dictCtx = dictCtx; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) +{ + assert(nextSize >= 0); + if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + DEBUGLOG(4, "LZ4_renormDictT"); + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, + const char* source, char* dest, + int inputSize, int maxOutputSize, + int acceleration) +{ + const tableType_t tableType = byU32; + LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; + const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; + + DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); + + LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + /* invalidate tiny dictionaries */ + if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ + && (dictEnd != source) /* prefix mode */ + && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ + && (streamPtr->dictCtx == NULL) /* usingDictCtx */ + ) { + DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); + /* remove dictionary existence from history, to employ faster prefix mode */ + streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)source; + dictEnd = source; + } + + /* Check overlapping input/dictionary space */ + { const char* const sourceEnd = source + inputSize; + if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == source) { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); + else + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); + } + + /* external dictionary mode */ + { int result; + if (streamPtr->dictCtx) { + /* We depend here on the fact that dictCtx'es (produced by + * LZ4_loadDict) guarantee that their tables contain no references + * to offsets between dictCtx->currentOffset - 64 KB and + * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe + * to use noDictIssue even when the dict isn't a full 64 KB. + */ + if (inputSize > 4 KB) { + /* For compressing large blobs, it is faster to pay the setup + * cost to copy the dictionary's tables into the active context, + * so that the compression loop is only looking into one table. + */ + LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); + } + } else { /* small data <= 4 KB */ + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } + } + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force-test external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) +{ + LZ4_stream_t_internal* const streamPtr = &LZ4_dict->internal_donotuse; + int result; + + LZ4_renormDictT(streamPtr, srcSize); + + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + } + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)srcSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, + * one can therefore call LZ4_compress_fast_continue() right after. + * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + + DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); + + if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } + + if (safeBuffer == NULL) assert(dictSize == 0); + if (dictSize > 0) { + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + assert(dict->dictionary); + LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); + } + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-******************************* + * Decompression functions + ********************************/ + +typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; + +#undef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + + +/* variant for decompress_unsafe() + * does not know end of input + * presumes input is well formed + * note : will consume at least one byte */ +static size_t read_long_length_no_check(const BYTE** pp) +{ + size_t b, l = 0; + do { b = **pp; (*pp)++; l += b; } while (b==255); + DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) + return l; +} + +/* core decoder variant for LZ4_decompress_fast*() + * for legacy support only : these entry points are deprecated. + * - Presumes input is correctly formed (no defense vs malformed inputs) + * - Does not know input size (presume input buffer is "large enough") + * - Decompress a full block (only) + * @return : nb of bytes read from input. + * Note : this variant is not optimized for speed, just for maintenance. + * the goal is to remove support of decompress_fast*() variants by v2.0 +**/ +LZ4_FORCE_INLINE int +LZ4_decompress_unsafe_generic( + const BYTE* const istart, + BYTE* const ostart, + int decompressedSize, + + size_t prefixSize, + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note: =0 if dictStart==NULL */ + ) +{ + const BYTE* ip = istart; + BYTE* op = (BYTE*)ostart; + BYTE* const oend = ostart + decompressedSize; + const BYTE* const prefixStart = ostart - prefixSize; + + DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); + if (dictStart == NULL) assert(dictSize == 0); + + while (1) { + /* start new sequence */ + unsigned token = *ip++; + + /* literals */ + { size_t ll = token >> ML_BITS; + if (ll==15) { + /* long literal length */ + ll += read_long_length_no_check(&ip); + } + if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ + LZ4_memmove(op, ip, ll); /* support in-place decompression */ + op += ll; + ip += ll; + if ((size_t)(oend-op) < MFLIMIT) { + if (op==oend) break; /* end of block */ + DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); + /* incorrect end of block : + * last match must start at least MFLIMIT==12 bytes before end of output block */ + return -1; + } } + + /* match */ + { size_t ml = token & 15; + size_t const offset = LZ4_readLE16(ip); + ip+=2; + + if (ml==15) { + /* long literal length */ + ml += read_long_length_no_check(&ip); + } + ml += MINMATCH; + + if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ + + { const BYTE* match = op - offset; + + /* out of range */ + if (offset > (size_t)(op - prefixStart) + dictSize) { + DEBUGLOG(6, "offset out of range"); + return -1; + } + + /* check special case : extDict */ + if (offset > (size_t)(op - prefixStart)) { + /* extDict scenario */ + const BYTE* const dictEnd = dictStart + dictSize; + const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); + size_t const extml = (size_t)(dictEnd - extMatch); + if (extml > ml) { + /* match entirely within extDict */ + LZ4_memmove(op, extMatch, ml); + op += ml; + ml = 0; + } else { + /* match split between extDict & prefix */ + LZ4_memmove(op, extMatch, extml); + op += extml; + ml -= extml; + } + match = prefixStart; + } + + /* match copy - slow variant, supporting overlap copy */ + { size_t u; + for (u=0; u= ipmax before start of loop. Returns initial_error if so. + * @error (output) - error code. Must be set to 0 before call. +**/ +typedef size_t Rvl_t; +static const Rvl_t rvl_error = (Rvl_t)(-1); +LZ4_FORCE_INLINE Rvl_t +read_variable_length(const BYTE** ip, const BYTE* ilimit, + int initial_check) +{ + Rvl_t s, length = 0; + assert(ip != NULL); + assert(*ip != NULL); + assert(ilimit != NULL); + if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ + return rvl_error; + } + do { + s = **ip; + (*ip)++; + length += s; + if (unlikely((*ip) > ilimit)) { /* read limit reached */ + return rvl_error; + } + /* accumulator overflow detection (32-bit mode only) */ + if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { + return rvl_error; + } + } while (s==255); + + return length; +} + +/*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +LZ4_FORCE_INLINE int +LZ4_decompress_generic( + const char* const src, + char* const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + if ((src == NULL) || (outputSize < 0)) { return -1; } + + { const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + outputSize; + BYTE* cpy; + + const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + + const int checkOffset = (dictSize < (int)(64 KB)); + + + /* Set up the "end" pointers for the shortcut. */ + const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; + const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; + + const BYTE* match; + size_t offset; + unsigned token; + size_t length; + + + DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); + + /* Special cases */ + assert(lowPrefix <= op); + if (unlikely(outputSize==0)) { + /* Empty output buffer */ + if (partialDecoding) return 0; + return ((srcSize==1) && (*ip==0)) ? 0 : -1; + } + if (unlikely(srcSize==0)) { return -1; } + + /* LZ4_FAST_DEC_LOOP: + * designed for modern OoO performance cpus, + * where copying reliably 32-bytes is preferable to an unpredictable branch. + * note : fast loop may show a regression for some client arm chips. */ +#if LZ4_FAST_DEC_LOOP + if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(6, "skip fast decode loop"); + goto safe_decode; + } + + /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ + DEBUGLOG(6, "using fast decode loop"); + while (1) { + /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ + assert(oend - op >= FASTLOOP_SAFE_DISTANCE); + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { + DEBUGLOG(6, "error reading long literal length"); + goto _output_error; + } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + + /* copy literals */ + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((op+length>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + LZ4_wildCopy32(op, ip, op+length); + ip += length; op += length; + } else if (ip <= iend-(16 + 1/*max lit + offset + nextToken*/)) { + /* We don't need to check oend, since we check it once for each loop below */ + DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); + /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ + LZ4_memcpy(op, ip, 16); + ip += length; op += length; + } else { + goto safe_literal_copy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + DEBUGLOG(6, " offset = %zu", offset); + match = op - offset; + assert(match <= op); /* overflow check */ + + /* get matchlength */ + length = token & ML_MASK; + + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { + DEBUGLOG(6, "error reading long match length"); + goto _output_error; + } + length += addl; + length += MINMATCH; + if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + } else { + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + + /* Fastpath check: skip LZ4_wildCopy32 when true */ + if ((dict == withPrefix64k) || (match >= lowPrefix)) { + if (offset >= 8) { + assert(match >= lowPrefix); + assert(match <= op); + assert(op + 18 <= oend); + + LZ4_memcpy(op, match, 8); + LZ4_memcpy(op+8, match+8, 8); + LZ4_memcpy(op+16, match+16, 2); + op += length; + continue; + } } } + + if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) { + DEBUGLOG(6, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); + goto _output_error; + } + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) { + DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); + length = MIN(length, (size_t)(oend-op)); + } else { + DEBUGLOG(6, "end-of-block condition violated") + goto _output_error; + } } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) { *op++ = *copyFrom++; } + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + + assert((op <= oend) && (oend-op >= 32)); + if (unlikely(offset<16)) { + LZ4_memcpy_using_offset(op, match, cpy, offset); + } else { + LZ4_wildCopy32(op, match, cpy); + } + + op = cpy; /* wildcopy correction */ + } + safe_decode: +#endif + + /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ + DEBUGLOG(6, "using safe decode loop"); + while (1) { + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + + /* A two-stage shortcut for the most common case: + * 1) If the literal length is 0..14, and there is enough space, + * enter the shortcut and copy 16 bytes on behalf of the literals + * (in the fast mode, only 8 bytes can be safely copied this way). + * 2) Further if the match length is 4..18, copy 18 bytes in a similar + * manner; but we ensure that there's enough space in the output for + * those 18 bytes earlier, upon entering the shortcut (in other words, + * there is a combined check for both stages). + */ + if ( (length != RUN_MASK) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((ip < shortiend) & (op <= shortoend)) ) { + /* Copy the literals */ + LZ4_memcpy(op, ip, 16); + op += length; ip += length; + + /* The second stage: prepare for match copying, decode full info. + * If it doesn't work out, the info won't be wasted. */ + length = token & ML_MASK; /* match length */ + offset = LZ4_readLE16(ip); ip += 2; + match = op - offset; + assert(match <= op); /* check overflow */ + + /* Do not deal with overlapping matches. */ + if ( (length != ML_MASK) + && (offset >= 8) + && (dict==withPrefix64k || match >= lowPrefix) ) { + /* Copy the match. */ + LZ4_memcpy(op + 0, match + 0, 8); + LZ4_memcpy(op + 8, match + 8, 8); + LZ4_memcpy(op +16, match +16, 2); + op += length + MINMATCH; + /* Both stages worked, load the next token. */ + continue; + } + + /* The second stage didn't work out, but the info is ready. + * Propel it right to the point of match copying. */ + goto _copy_match; + } + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + } + +#if LZ4_FAST_DEC_LOOP + safe_literal_copy: +#endif + /* copy literals */ + cpy = op+length; + + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { + /* We've either hit the input parsing restriction or the output parsing restriction. + * In the normal scenario, decoding a full block, it must be the last sequence, + * otherwise it's an error (invalid input or dimensions). + * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. + */ + if (partialDecoding) { + /* Since we are partial decoding we may be in this block because of the output parsing + * restriction, which is not valid since the output buffer is allowed to be undersized. + */ + DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") + DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); + DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); + DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); + /* Finishing in the middle of a literals segment, + * due to lack of input. + */ + if (ip+length > iend) { + length = (size_t)(iend-ip); + cpy = op + length; + } + /* Finishing in the middle of a literals segment, + * due to lack of output space. + */ + if (cpy > oend) { + cpy = oend; + assert(op<=oend); + length = (size_t)(oend-op); + } + } else { + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((ip+length != iend) || (cpy > oend)) { + DEBUGLOG(6, "should have been last run of literals") + DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); + DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); + goto _output_error; + } + } + LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ + ip += length; + op += length; + /* Necessarily EOF when !partialDecoding. + * When partialDecoding, it is EOF if we've either + * filled the output buffer or + * can't proceed with reading an offset for following match. + */ + if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { + break; + } + } else { + LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + + /* get matchlength */ + length = token & ML_MASK; + + _copy_match: + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + +#if LZ4_FAST_DEC_LOOP + safe_match_copy: +#endif + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + else goto _output_error; /* doesn't respect parsing restriction */ + } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + assert(match >= lowPrefix); + + /* copy match within block */ + cpy = op + length; + + /* partialDecoding : may end anywhere within the block */ + assert(op<=oend); + if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend-op)); + const BYTE* const matchEnd = match + mlen; + BYTE* const copyEnd = op + mlen; + if (matchEnd > op) { /* overlap copy */ + while (op < copyEnd) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, mlen); + } + op = copyEnd; + if (op == oend) { break; } + continue; + } + + if (unlikely(offset<8)) { + LZ4_write32(op, 0); /* silence msan warning when offset==0 */ + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += inc32table[offset]; + LZ4_memcpy(op+4, match, 4); + match -= dec64table[offset]; + } else { + LZ4_memcpy(op, match, 8); + match += 8; + } + op += 8; + + if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy8(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op < cpy) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, 8); + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + } + op = cpy; /* wildcopy correction */ + } + + /* end of decoding */ + DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); + return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ + + /* Overflow error detected */ + _output_error: + return (int) (-(((const char*)ip)-src))-1; + } +} + + +/*===== Instantiate the API decoding functions. =====*/ + +LZ4_FORCE_O2 +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, + decode_full_block, noDict, + (BYTE*)dest, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, + partial_decode, + noDict, (BYTE*)dst, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + DEBUGLOG(5, "LZ4_decompress_fast"); + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, NULL, 0); +} + +/*===== Instantiate a few more decoding cases, used more than once. =====*/ + +LZ4_FORCE_O2 /* Exported, an obsolete API function. */ +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/* Another obsolete API function, paired with the previous one. */ +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, + size_t prefixSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize) +{ + DEBUGLOG(5, "LZ4_decompress_safe_forceExtDict"); + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, (const BYTE*)dictStart, dictSize); +} + +/* The "double dictionary" mode, for use with e.g. ring buffers: the first part + * of the dictionary is passed as prefix, and the second via dictStart + dictSize. + * These routines are used only once, in LZ4_decompress_*_continue(). + */ +LZ4_FORCE_INLINE +int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +/*===== streaming decompression functions =====*/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); + return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} +#endif + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * @return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t)dictSize; + if (dictSize) { + assert(dictionary != NULL); + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + } else { + lz4sd->prefixEnd = (const BYTE*) dictionary; + } + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/*! LZ4_decoderRingBufferSize() : + * when setting a ring buffer for streaming decompression (optional scenario), + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * Note : in a ring buffer scenario, + * blocks are presumed decompressed next to each other. + * When not enough space remains for next block (remainingSize < maxBlockSize), + * decoding resumes from beginning of ring buffer. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +int LZ4_decoderRingBufferSize(int maxBlockSize) +{ + if (maxBlockSize < 0) return 0; + if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; + if (maxBlockSize < 16) maxBlockSize = 16; + return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +LZ4_FORCE_O2 +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixSize == 0) { + /* The first call, no dictionary yet. */ + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + /* They're rolling the current segment. */ + if (lz4sd->prefixSize >= 64 KB - 1) + result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + else if (lz4sd->extDictSize == 0) + result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize); + else + result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)result; + lz4sd->prefixEnd += result; + } else { + /* The buffer wraps around, or they're switching to another buffer. */ + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +LZ4_FORCE_O2 int +LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* const lz4sd = + (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); + int result; + + DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); + assert(originalSize >= 0); + + if (lz4sd->prefixSize == 0) { + DEBUGLOG(5, "first invocation : no prefix nor extDict"); + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_fast(source, dest, originalSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + DEBUGLOG(5, "continue using existing prefix"); + result = LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + lz4sd->prefixSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)originalSize; + lz4sd->prefixEnd += originalSize; + } else { + DEBUGLOG(5, "prefix becomes extDict"); + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_fast_extDict(source, dest, originalSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + if (dictSize==0 || dictStart+dictSize == dest) + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + (size_t)dictSize, NULL, 0); + assert(dictSize >= 0); + return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_default(source, dest, inputSize, maxOutputSize); +} +int LZ4_compress(const char* src, char* dest, int srcSize) +{ + return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); +} +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); +} +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); +} +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); +} +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) +{ + return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); +} + +/* +These decompression functions are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) +{ + return LZ4_decompress_fast(source, dest, outputSize); +} +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) +{ + return LZ4_decompress_safe(source, dest, isize, maxOutputSize); +} + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + (void)inputBuffer; + LZ4_resetStream((LZ4_stream_t*)state); + return 0; +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +void* LZ4_create (char* inputBuffer) +{ + (void)inputBuffer; + return LZ4_createStream(); +} +#endif + +char* LZ4_slideInputBuffer (void* state) +{ + /* avoid const char * -> char * conversion warning */ + return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; +} + +#endif /* LZ4_COMMONDEFS_ONLY */ + +#endif /* LV_USE_LZ4_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/lz4/lz4.h b/libraries/lvgl/src/libs/lz4/lz4.h new file mode 100644 index 0000000..7208023 --- /dev/null +++ b/libraries/lvgl/src/libs/lz4/lz4.h @@ -0,0 +1,877 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-2020, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_LZ4_INTERNAL +#if defined (__cplusplus) +extern "C" { +#endif + +/** + * LVGL's porting + */ +#include "../../lvgl.h" +#define LZ4_FREESTANDING 1 +#define LZ4_memset lv_memset +#define LZ4_memcpy lv_memcpy +#define LZ4_memmove lv_memmove + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*! LZ4_FREESTANDING : + * When this macro is set to 1, it enables "freestanding mode" that is + * suitable for typical freestanding environment which doesn't support + * standard C library. + * + * - LZ4_FREESTANDING is a compile-time switch. + * - It requires the following macros to be defined: + * LZ4_memcpy, LZ4_memmove, LZ4_memset. + * - It only enables LZ4/HC functions which don't use heap. + * All LZ4F_* functions are not supported. + * - See tests/freestanding.c to check its basic setup. + */ +#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) +# define LZ4_HEAPMODE 0 +# define LZ4HC_HEAPMODE 0 +# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 +# if !defined(LZ4_memcpy) +# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." +# endif +# if !defined(LZ4_memset) +# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." +# endif +# if !defined(LZ4_memmove) +# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." +# endif +#elif ! defined(LZ4_FREESTANDING) +# define LZ4_FREESTANDING 0 +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 5 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ + + +/*-************************************ +* Tuning parameter +**************************************/ +#define LZ4_MEMORY_USAGE_MIN 10 +#define LZ4_MEMORY_USAGE_DEFAULT 14 +#define LZ4_MEMORY_USAGE_MAX 20 + +/*! + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; ) + * Increasing memory usage improves compression ratio, at the cost of speed. + * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT +#endif + +#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) +# error "LZ4_MEMORY_USAGE is too small !" +#endif + +#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) +# error "LZ4_MEMORY_USAGE is too large !" +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ +LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); + +/*! LZ4_decompress_safe() : + * @compressedSize : is the exact complete size of the compressed block. + * @dstCapacity : is the size of destination buffer (which must be already allocated), + * is an upper bound of decompressed size. + * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows selection of "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'targetDestSize'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ +LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); + + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/** + Note about RC_INVOKED + + - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). + https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros + + - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) + and reports warning "RC4011: identifier truncated". + + - To eliminate the warning, we surround long preprocessor symbol with + "#if !defined(RC_INVOKED) ... #endif" block that means + "skip this block when rc.exe is trying to read it". +*/ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (e.g., LZ4_compress_fast_continue()). + * + * An LZ4_stream_t must be initialized once before usage. + * This is automatically done when created by LZ4_createStream(). + * However, should the LZ4_stream_t be simply declared on stack (for example), + * it's necessary to initialize it first, using LZ4_initStream(). + * + * After init, start any new stream with LZ4_resetStream_fast(). + * A same LZ4_stream_t can be re-used multiple times consecutively + * and compress multiple streams, + * provided that it starts each new stream with LZ4_resetStream_fast(). + * + * LZ4_resetStream_fast() is much faster than LZ4_initStream(), + * but is not compatible with memory regions containing garbage data. + * + * Note: it's only useful to call LZ4_resetStream_fast() + * in the context of streaming compression. + * The *extState* functions perform their own resets. + * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. + */ +LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * The dictionary must remain available during compression. + * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. + * The same dictionary will have to be loaded on decompression side for successful decoding. + * Dictionary are useful for better compression of small data (KB range). + * While LZ4 accept any input as dictionary, + * results are generally better when using Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * Each block has precise boundaries. + * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. + * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. + * + * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! + * + * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. + * + * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_safe_continue() : + * This decoding function allows decompression of consecutive blocks in "streaming" mode. + * The difference with the usual independent blocks is that + * new blocks are allowed to find references into former blocks. + * A block is an unsplittable entity, and must be presented entirely to the decompression function. + * LZ4_decompress_safe_continue() only accepts one block at a time. + * It's modeled after `LZ4_decompress_safe()` and behaves similarly. + * + * @LZ4_streamDecode : decompression state, tracking the position in memory of past data + * @compressedSize : exact complete size of one compressed block. + * @dstCapacity : size of destination buffer (which must be already allocated), + * must be an upper bound of decompressed size. + * @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * + * The last 64KB of previously decoded data *must* remain available and unmodified + * at the memory position where they were previously decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. +*/ +LZ4LIB_API int +LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* src, char* dst, + int srcSize, int dstCapacity); + + +/*! LZ4_decompress_safe_usingDict() : + * Works the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() + * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_usingDict(const char* src, char* dst, + int srcSize, int dstCapacity, + const char* dictStart, int dictSize); + +/*! LZ4_decompress_safe_partial_usingDict() : + * Behaves the same as LZ4_decompress_safe_partial() + * with the added ability to specify a memory segment for past data. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, + int compressedSize, + int targetOutputSize, int maxOutputSize, + const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * statically linked against the library. + * + * To protect against unsafe usage, not only are the declarations guarded, + * the definitions are hidden by default + * when building LZ4 as a shared/dynamic library. + * + * In order to access these declarations, + * define LZ4_STATIC_LINKING_ONLY in your application + * before including LZ4's headers. + * + * In order to make their implementations accessible dynamically, you must + * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. + ******************************************************************************/ + +#ifdef LZ4_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +#define LZ4LIB_STATIC_API LZ4LIB_API +#else +#define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * It is only safe to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_attach_dictionary() : + * This is an experimental API that allows + * efficient use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDict() should + * be expected to work. + * + * Alternatively, the provided dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the first compression call on the stream. + */ +LZ4LIB_STATIC_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly constrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * Private Definitions + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose user code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef int8_t LZ4_i8; + typedef uint8_t LZ4_byte; + typedef uint16_t LZ4_u16; + typedef uint32_t LZ4_u32; +#else + typedef signed char LZ4_i8; + typedef unsigned char LZ4_byte; + typedef unsigned short LZ4_u16; + typedef unsigned int LZ4_u32; +#endif + +/*! LZ4_stream_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_stream_t object. +**/ + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; + const LZ4_byte* dictionary; + const LZ4_stream_t_internal* dictCtx; + LZ4_u32 currentOffset; + LZ4_u32 tableType; + LZ4_u32 dictSize; + /* Implicit padding to ensure structure is aligned */ +}; + +#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ +union LZ4_stream_u { + char minStateSize[LZ4_STREAM_MINSIZE]; + LZ4_stream_t_internal internal_donotuse; +}; /* previously typedef'd to LZ4_stream_t */ + + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * and will @return a pointer of proper type upon initialization. + * + * Note : initialization fails if size and alignment conditions are not respected. + * In which case, the function will @return NULL. + * Note2: An LZ4_stream_t structure guarantees correct alignment and size. + * Note3: Before v1.9.0, use LZ4_resetStream() instead +**/ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); + + +/*! LZ4_streamDecode_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. +**/ +typedef struct { + const LZ4_byte* externalDict; + const LZ4_byte* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#define LZ4_STREAMDECODE_MINSIZE 32 +union LZ4_streamDecode_u { + char minStateSize[LZ4_STREAMDECODE_MINSIZE]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc + * or _CRT_SECURE_NO_WARNINGS in Visual. + * + * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS + * before including the header file. + */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# else +# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") +# define LZ4_DEPRECATED(message) /* disabled */ +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/*! Obsolete compression functions (since v1.7.3) */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/*! Obsolete decompression functions (since v1.8.0) */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions (since v1.7.0) + * degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/*! Obsolete streaming decoding functions (since v1.7.0) */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : + * These functions used to be faster than LZ4_decompress_safe(), + * but this is no longer the case. They are now slower. + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. + * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. + * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. + * + * The last remaining LZ4_decompress_fast() specificity is that + * it can decompress a block without knowing its compressed size. + * Such functionality can be achieved in a more secure manner + * by employing LZ4_decompress_safe_partial(). + * + * Parameters: + * originalSize : is the uncompressed size to regenerate. + * `dst` must be already allocated, its size must be >= 'originalSize' bytes. + * @return : number of bytes read from source buffer (== compressed size). + * The function expects to finish at block's end exactly. + * If the source stream is detected malformed, the function stops decoding and returns a negative result. + * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. + * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. + * Also, since match offsets are not validated, match reads from 'src' may underflow too. + * These issues never happen if input (compressed) data is correct. + * But they may happen if input data is invalid (error or intentional tampering). + * As a consequence, use these functions in trusted environments with trusted data **only**. + */ +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure must be initialized at least once. + * This is done with LZ4_initStream(), or LZ4_resetStream(). + * Consider switching to LZ4_initStream(), + * invoking LZ4_resetStream() will trigger deprecation warnings in the future. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + + +#endif /* LZ4_H_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* LV_USE_LZ4_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/qrcode/lv_qrcode.c b/libraries/lvgl/src/libs/qrcode/lv_qrcode.c new file mode 100644 index 0000000..08f44b3 --- /dev/null +++ b/libraries/lvgl/src/libs/qrcode/lv_qrcode.c @@ -0,0 +1,231 @@ +/** + * @file lv_qrcode.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +#if LV_USE_QRCODE + +#include "qrcodegen.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_qrcode_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_qrcode_class = { + .constructor_cb = lv_qrcode_constructor, + .destructor_cb = lv_qrcode_destructor, + .instance_size = sizeof(lv_qrcode_t), + .base_class = &lv_canvas_class, + .name = "qrcode", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_qrcode_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_qrcode_set_size(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); + lv_draw_buf_t * new_buf = lv_draw_buf_create(size, size, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); + if(new_buf == NULL) { + LV_LOG_ERROR("malloc failed for canvas buffer"); + return; + } + + lv_canvas_set_draw_buf(obj, new_buf); + LV_LOG_INFO("set canvas buffer: %p, size = %d", (void *)new_buf, (int)size); + + /*Clear canvas buffer*/ + lv_canvas_fill_bg(obj, lv_color_white(), LV_OPA_COVER); + + if(old_buf != NULL) lv_draw_buf_destroy(old_buf); +} + +void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + qrcode->dark_color = color; +} + +void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + qrcode->light_color = color; +} + +lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) { + LV_LOG_ERROR("canvas draw buffer is NULL"); + return LV_RESULT_INVALID; + } + + lv_canvas_set_palette(obj, 0, lv_color_to_32(qrcode->dark_color, 0xff)); + lv_canvas_set_palette(obj, 1, lv_color_to_32(qrcode->light_color, 0xff)); + lv_color_t c = lv_color_hex(1); + lv_canvas_fill_bg(obj, c, LV_OPA_COVER); + + if(data_len > qrcodegen_BUFFER_LEN_MAX) return LV_RESULT_INVALID; + + int32_t qr_version = qrcodegen_getMinFitVersion(qrcodegen_Ecc_MEDIUM, data_len); + if(qr_version <= 0) return LV_RESULT_INVALID; + int32_t qr_size = qrcodegen_version2size(qr_version); + if(qr_size <= 0) return LV_RESULT_INVALID; + int32_t scale = draw_buf->header.w / qr_size; + if(scale <= 0) return LV_RESULT_INVALID; + + /* Pick the largest QR code that still maintains scale. */ + for(int32_t i = qr_version + 1; i < qrcodegen_VERSION_MAX; i++) { + if(qrcodegen_version2size(i) * scale > draw_buf->header.w) + break; + + qr_version = i; + } + qr_size = qrcodegen_version2size(qr_version); + + uint8_t * qr0 = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(qr0); + uint8_t * data_tmp = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(data_tmp); + lv_memcpy(data_tmp, data, data_len); + + bool ok = qrcodegen_encodeBinary(data_tmp, data_len, + qr0, qrcodegen_Ecc_MEDIUM, + qr_version, qr_version, + qrcodegen_Mask_AUTO, true); + + if(!ok) { + lv_free(qr0); + lv_free(data_tmp); + return LV_RESULT_INVALID; + } + + int32_t obj_w = draw_buf->header.w; + qr_size = qrcodegen_getSize(qr0); + scale = obj_w / qr_size; + int scaled = qr_size * scale; + int margin = (obj_w - scaled) / 2; + uint8_t * buf_u8 = (uint8_t *)draw_buf->data + 8; /*+8 skip the palette*/ + + /* Copy the qr code canvas: + * A simple `lv_canvas_set_px` would work but it's slow for so many pixels. + * So buffer 1 byte (8 px) from the qr code and set it in the canvas image */ + uint32_t row_byte_cnt = draw_buf->header.stride; + int y; + for(y = margin; y < scaled + margin; y += scale) { + uint8_t b = 0; + uint8_t p = 0; + bool aligned = false; + int x; + for(x = margin; x < scaled + margin; x++) { + bool a = qrcodegen_getModule(qr0, (x - margin) / scale, (y - margin) / scale); + + if(aligned == false && (x & 0x7) == 0) aligned = true; + + if(aligned == false) { + c = lv_color_hex(a ? 0 : 1); + lv_canvas_set_px(obj, x, y, c, LV_OPA_COVER); + } + else { + if(!a) b |= (1 << (7 - p)); + p++; + if(p == 8) { + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = b; + b = 0; + p = 0; + } + } + } + + /*Process the last byte of the row*/ + if(p) { + /*Make the rest of the bits white*/ + b |= (1 << (8 - p)) - 1; + + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = b; + } + + /*The Qr is probably scaled so simply to the repeated rows*/ + int s; + const uint8_t * row_ori = buf_u8 + row_byte_cnt * y; + for(s = 1; s < scale; s++) { + lv_memcpy((uint8_t *)buf_u8 + row_byte_cnt * (y + s), row_ori, row_byte_cnt); + } + } + + lv_free(qr0); + lv_free(data_tmp); + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + /*Set default size*/ + lv_qrcode_set_size(obj, LV_DPI_DEF); + + /*Set default color*/ + lv_qrcode_set_dark_color(obj, lv_color_black()); + lv_qrcode_set_light_color(obj, lv_color_white()); +} + +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) return; + lv_image_cache_drop(draw_buf); + + /*@fixme destroy buffer in cache free_cb.*/ + lv_draw_buf_destroy(draw_buf); +} + +#endif /*LV_USE_QRCODE*/ diff --git a/libraries/lvgl/src/libs/qrcode/lv_qrcode.h b/libraries/lvgl/src/libs/qrcode/lv_qrcode.h new file mode 100644 index 0000000..aed84fd --- /dev/null +++ b/libraries/lvgl/src/libs/qrcode/lv_qrcode.h @@ -0,0 +1,87 @@ +/** + * @file lv_qrcode + * + */ + +#ifndef LV_QRCODE_H +#define LV_QRCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_QRCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of qrcode*/ +typedef struct { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; +} lv_qrcode_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_qrcode_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty QR code (an `lv_canvas`) object. + * @param parent point to an object where to create the QR code + * @return pointer to the created QR code object + */ +lv_obj_t * lv_qrcode_create(lv_obj_t * parent); + +/** + * Set QR code size. + * @param obj pointer to a QR code object + * @param size width and height of the QR code + */ +void lv_qrcode_set_size(lv_obj_t * obj, int32_t size); + +/** + * Set QR code dark color. + * @param obj pointer to a QR code object + * @param color dark color of the QR code + */ +void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set QR code light color. + * @param obj pointer to a QR code object + * @param color light color of the QR code + */ +void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the data of a QR code object + * @param obj pointer to a QR code object + * @param data data to display + * @param data_len length of data in bytes + * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error + */ +lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_QRCODE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_QRCODE_H*/ diff --git a/libraries/lvgl/src/libs/qrcode/qrcodegen.c b/libraries/lvgl/src/libs/qrcode/qrcodegen.c new file mode 100644 index 0000000..8f71f47 --- /dev/null +++ b/libraries/lvgl/src/libs/qrcode/qrcodegen.c @@ -0,0 +1,1113 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#include +#include +#include +#include "qrcodegen.h" +#include "../../misc/lv_assert.h" + +#ifndef QRCODEGEN_TEST + #define testable static // Keep functions private +#else + #define testable // Expose private functions +#endif + + +/*---- Forward declarations for private functions ----*/ + +// Regarding all public and private functions defined in this source file: +// - They require all pointer/array arguments to be not null unless the array length is zero. +// - They only read input scalar/array arguments, write to output pointer/array +// arguments, and return scalar values; they are "pure" functions. +// - They don't read mutable global variables or write to any global variables. +// - They don't perform I/O, read the clock, print to console, etc. +// - They allocate a small and constant amount of stack memory. +// - They don't allocate or free any memory on the heap. +// - They don't recurse or mutually recurse. All the code +// could be inlined into the top-level public functions. +// - They run in at most quadratic time with respect to input arguments. +// Most functions run in linear time, and some in constant time. +// There are no unbounded loops or non-obvious termination conditions. +// - They are completely thread-safe if the caller does not give the +// same writable buffer to concurrent calls to these functions. + +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen); + +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]); +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl); +testable int getNumRawDataModules(int ver); + +testable void calcReedSolomonGenerator(int degree, uint8_t result[]); +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]); +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y); + +testable void initializeFunctionModules(int version, uint8_t qrcode[]); +static void drawWhiteFunctionModules(uint8_t qrcode[], int version); +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]); +testable int getAlignmentPatternPositions(int version, uint8_t result[7]); +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]); + +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]); +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask); +static long getPenaltyScore(const uint8_t qrcode[]); +static void addRunToHistory(unsigned char run, unsigned char history[7]); +static bool hasFinderLikePattern(const unsigned char runHistory[7]); + +testable bool getModule(const uint8_t qrcode[], int x, int y); +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack); +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack); +static bool getBit(int x, int i); + +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars); +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version); +static int numCharCountBits(enum qrcodegen_Mode mode, int version); + + + +/*---- Private tables of constants ----*/ + +// The set of all legal characters in alphanumeric mode, where each character +// value maps to the index in the string. For checking text and encoding segments. +static const char * ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; + +// For generating error correction codes. +testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low + {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium + {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile + {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High +}; + +#define qrcodegen_REED_SOLOMON_DEGREE_MAX 30 // Based on the table above + +// For generating error correction codes. +testable const int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low + {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium + {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile + {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High +}; + +// For automatic mask pattern selection. +static const int PENALTY_N1 = 3; +static const int PENALTY_N2 = 3; +static const int PENALTY_N3 = 40; +static const int PENALTY_N4 = 10; + + + +/*---- High-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) +{ + + size_t textLen = strlen(text); + if(textLen == 0) + return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); + + struct qrcodegen_Segment seg; + if(qrcodegen_isNumeric(text)) { + if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeNumeric(text, tempBuffer); + } + else if(qrcodegen_isAlphanumeric(text)) { + if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_ALPHANUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeAlphanumeric(text, tempBuffer); + } + else { + if(textLen > bufLen) + goto fail; + for(size_t i = 0; i < textLen; i++) + tempBuffer[i] = (uint8_t)text[i]; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, textLen); + if(seg.bitLength == -1) + goto fail; + seg.numChars = (int)textLen; + seg.data = tempBuffer; + } + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + +fail: + qrcode[0] = 0; // Set size to invalid value for safety + return false; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) +{ + + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + if(seg.bitLength == -1) { + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + seg.numChars = (int)dataLen; + seg.data = dataAndTemp; + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode); +} + + +// Appends the given number of low-order bits of the given value to the given byte-based +// bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen) +{ + LV_ASSERT(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); + for(int i = numBits - 1; i >= 0; i--, (*bitLen)++) + buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); +} + + + +/*---- Low-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]) +{ + return qrcodegen_encodeSegmentsAdvanced(segs, len, ecl, + qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, -1, true, tempBuffer, qrcode); +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) +{ + LV_ASSERT(segs != NULL || len == 0); + LV_ASSERT(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); + + // Find the minimal version number to use + int version, dataUsedBits; + for(version = minVersion; ; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + dataUsedBits = getTotalBits(segs, len, version); + if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + break; // This version number is found to be suitable + if(version >= maxVersion) { // All versions in the range could not fit the given data + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + } + LV_ASSERT(dataUsedBits != -1); + + // Increase the error correction level while the data still fits in the current version number + for(int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high + if(boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) + ecl = (enum qrcodegen_Ecc)i; + } + + // Concatenate all segments to create the data bit string + memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); + int bitLen = 0; + for(size_t i = 0; i < len; i++) { + const struct qrcodegen_Segment * seg = &segs[i]; + appendBitsToBuffer((int)seg->mode, 4, qrcode, &bitLen); + appendBitsToBuffer(seg->numChars, numCharCountBits(seg->mode, version), qrcode, &bitLen); + for(int j = 0; j < seg->bitLength; j++) + appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); + } + LV_ASSERT(bitLen == dataUsedBits); + + // Add terminator and pad up to a byte if applicable + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; + LV_ASSERT(bitLen <= dataCapacityBits); + int terminatorBits = dataCapacityBits - bitLen; + if(terminatorBits > 4) + terminatorBits = 4; + appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); + appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); + LV_ASSERT(bitLen % 8 == 0); + + // Pad with alternating bytes until data capacity is reached + for(uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) + appendBitsToBuffer(padByte, 8, qrcode, &bitLen); + + // Draw function and data codeword modules + addEccAndInterleave(qrcode, version, ecl, tempBuffer); + initializeFunctionModules(version, qrcode); + drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); + drawWhiteFunctionModules(qrcode, version); + initializeFunctionModules(version, tempBuffer); + + // Handle masking + if(mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask + long minPenalty = LONG_MAX; + for(int i = 0; i < 8; i++) { + enum qrcodegen_Mask msk = (enum qrcodegen_Mask)i; + applyMask(tempBuffer, qrcode, msk); + drawFormatBits(ecl, msk, qrcode); + long penalty = getPenaltyScore(qrcode); + if(penalty < minPenalty) { + mask = msk; + minPenalty = penalty; + } + applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR + } + } + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); + applyMask(tempBuffer, qrcode, mask); + drawFormatBits(ecl, mask, qrcode); + return true; +} + + + +/*---- Error correction code generation functions ----*/ + +// Appends error correction bytes to each block of the given data array, then interleaves +// bytes from the blocks and stores them in the result array. data[0 : dataLen] contains +// the input data. data[dataLen : rawCodewords] is used as a temporary work area and will +// be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) +{ + // Calculate parameter numbers + LV_ASSERT(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; + int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; + int rawCodewords = getNumRawDataModules(version) / 8; + int dataLen = getNumDataCodewords(version, ecl); + int numShortBlocks = numBlocks - rawCodewords % numBlocks; + int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; + + // Split data into blocks, calculate ECC, and interleave + // (not concatenate) the bytes into a single sequence + uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; + calcReedSolomonGenerator(blockEccLen, generator); + const uint8_t * dat = data; + for(int i = 0; i < numBlocks; i++) { + int datLen = shortBlockDataLen + (i < numShortBlocks ? 0 : 1); + uint8_t * ecc = &data[dataLen]; // Temporary storage + calcReedSolomonRemainder(dat, datLen, generator, blockEccLen, ecc); + for(int j = 0, k = i; j < datLen; j++, k += numBlocks) { // Copy data + if(j == shortBlockDataLen) + k -= numShortBlocks; + result[k] = dat[j]; + } + for(int j = 0, k = dataLen + i; j < blockEccLen; j++, k += numBlocks) // Copy ECC + result[k] = ecc[j]; + dat += datLen; + } +} + + +// Returns the number of 8-bit codewords that can be used for storing data (not ECC), +// for the given version number and error correction level. The result is in the range [9, 2956]. +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) +{ + int v = version, e = (int)ecl; + LV_ASSERT(0 <= e && e < 4); + return getNumRawDataModules(v) / 8 + - ECC_CODEWORDS_PER_BLOCK [e][v] + * NUM_ERROR_CORRECTION_BLOCKS[e][v]; +} + + +// Returns the number of data bits that can be stored in a QR Code of the given version number, after +// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. +// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. +testable int getNumRawDataModules(int ver) +{ + LV_ASSERT(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); + int result = (16 * ver + 128) * ver + 64; + if(ver >= 2) { + int numAlign = ver / 7 + 2; + result -= (25 * numAlign - 10) * numAlign - 55; + if(ver >= 7) + result -= 36; + } + return result; +} + + + +/*---- Reed-Solomon ECC generator functions ----*/ + +// Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. +testable void calcReedSolomonGenerator(int degree, uint8_t result[]) +{ + // Start with the monomial x^0 + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + result[degree - 1] = 1; + + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), + // drop the highest term, and store the rest of the coefficients in order of descending powers. + // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). + uint8_t root = 1; + for(int i = 0; i < degree; i++) { + // Multiply the current product by (x - r^i) + for(int j = 0; j < degree; j++) { + result[j] = finiteFieldMultiply(result[j], root); + if(j + 1 < degree) + result[j] ^= result[j + 1]; + } + root = finiteFieldMultiply(root, 0x02); + } +} + + +// Calculates the remainder of the polynomial data[0 : dataLen] when divided by the generator[0 : degree], where all +// polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]) +{ + + // Perform polynomial division + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + for(int i = 0; i < dataLen; i++) { + uint8_t factor = data[i] ^ result[0]; + memmove(&result[0], &result[1], (degree - 1) * sizeof(result[0])); + result[degree - 1] = 0; + for(int j = 0; j < degree; j++) + result[j] ^= finiteFieldMultiply(generator[j], factor); + } +} + +#undef qrcodegen_REED_SOLOMON_DEGREE_MAX + + +// Returns the product of the two given field elements modulo GF(2^8/0x11D). +// All inputs are valid. This could be implemented as a 256*256 lookup table. +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) +{ + // Russian peasant multiplication + uint8_t z = 0; + for(int i = 7; i >= 0; i--) { + z = (z << 1) ^ ((z >> 7) * 0x11D); + z ^= ((y >> i) & 1) * x; + } + return z; +} + + + +/*---- Drawing function modules ----*/ + +// Clears the given QR Code grid with white modules for the given +// version's size, then marks every function module as black. +testable void initializeFunctionModules(int version, uint8_t qrcode[]) +{ + // Initialize QR Code + int qrsize = version * 4 + 17; + memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); + qrcode[0] = (uint8_t)qrsize; + + // Fill horizontal and vertical timing patterns + fillRectangle(6, 0, 1, qrsize, qrcode); + fillRectangle(0, 6, qrsize, 1, qrcode); + + // Fill 3 finder patterns (all corners except bottom right) and format bits + fillRectangle(0, 0, 9, 9, qrcode); + fillRectangle(qrsize - 8, 0, 8, 9, qrcode); + fillRectangle(0, qrsize - 8, 9, 8, qrcode); + + // Fill numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for(int i = 0; i < numAlign; i++) { + for(int j = 0; j < numAlign; j++) { + // Don't draw on the three finder corners + if(!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) + fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); + } + } + + // Fill version blocks + if(version >= 7) { + fillRectangle(qrsize - 11, 0, 3, 6, qrcode); + fillRectangle(0, qrsize - 11, 6, 3, qrcode); + } +} + + +// Draws white function modules and possibly some black modules onto the given QR Code, without changing +// non-function modules. This does not draw the format bits. This requires all function modules to be previously +// marked black (namely by initializeFunctionModules()), because this may skip redrawing black function modules. +static void drawWhiteFunctionModules(uint8_t qrcode[], int version) +{ + // Draw horizontal and vertical timing patterns + int qrsize = qrcodegen_getSize(qrcode); + for(int i = 7; i < qrsize - 7; i += 2) { + setModule(qrcode, 6, i, false); + setModule(qrcode, i, 6, false); + } + + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) + for(int dy = -4; dy <= 4; dy++) { + for(int dx = -4; dx <= 4; dx++) { + int dist = abs(dx); + if(abs(dy) > dist) + dist = abs(dy); + if(dist == 2 || dist == 4) { + setModuleBounded(qrcode, 3 + dx, 3 + dy, false); + setModuleBounded(qrcode, qrsize - 4 + dx, 3 + dy, false); + setModuleBounded(qrcode, 3 + dx, qrsize - 4 + dy, false); + } + } + } + + // Draw numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for(int i = 0; i < numAlign; i++) { + for(int j = 0; j < numAlign; j++) { + if((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0)) + continue; // Don't draw on the three finder corners + for(int dy = -1; dy <= 1; dy++) { + for(int dx = -1; dx <= 1; dx++) + setModule(qrcode, alignPatPos[i] + dx, alignPatPos[j] + dy, dx == 0 && dy == 0); + } + } + } + + // Draw version blocks + if(version >= 7) { + // Calculate error correction code and pack bits + int rem = version; // version is uint6, in the range [7, 40] + for(int i = 0; i < 12; i++) + rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); + long bits = (long)version << 12 | rem; // uint18 + LV_ASSERT(bits >> 18 == 0); + + // Draw two copies + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 3; j++) { + int k = qrsize - 11 + j; + setModule(qrcode, k, i, (bits & 1) != 0); + setModule(qrcode, i, k, (bits & 1) != 0); + bits >>= 1; + } + } + } +} + + +// Draws two copies of the format bits (with its own error correction code) based +// on the given mask and error correction level. This always draws all modules of +// the format bits, unlike drawWhiteFunctionModules() which might skip black modules. +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) +{ + // Calculate error correction code and pack bits + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); + static const int table[] = {1, 0, 3, 2}; + int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 + int rem = data; + for(int i = 0; i < 10; i++) + rem = (rem << 1) ^ ((rem >> 9) * 0x537); + int bits = (data << 10 | rem) ^ 0x5412; // uint15 + LV_ASSERT(bits >> 15 == 0); + + // Draw first copy + for(int i = 0; i <= 5; i++) + setModule(qrcode, 8, i, getBit(bits, i)); + setModule(qrcode, 8, 7, getBit(bits, 6)); + setModule(qrcode, 8, 8, getBit(bits, 7)); + setModule(qrcode, 7, 8, getBit(bits, 8)); + for(int i = 9; i < 15; i++) + setModule(qrcode, 14 - i, 8, getBit(bits, i)); + + // Draw second copy + int qrsize = qrcodegen_getSize(qrcode); + for(int i = 0; i < 8; i++) + setModule(qrcode, qrsize - 1 - i, 8, getBit(bits, i)); + for(int i = 8; i < 15; i++) + setModule(qrcode, 8, qrsize - 15 + i, getBit(bits, i)); + setModule(qrcode, 8, qrsize - 8, true); // Always black +} + + +// Calculates and stores an ascending list of positions of alignment patterns +// for this version number, returning the length of the list (in the range [0,7]). +// Each position is in the range [0,177), and are used on both the x and y axes. +// This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. +testable int getAlignmentPatternPositions(int version, uint8_t result[7]) +{ + if(version == 1) + return 0; + int numAlign = version / 7 + 2; + int step = (version == 32) ? 26 : + (version * 4 + numAlign * 2 + 1) / (numAlign * 2 - 2) * 2; + for(int i = numAlign - 1, pos = version * 4 + 10; i >= 1; i--, pos -= step) + result[i] = pos; + result[0] = 6; + return numAlign; +} + + +// Sets every pixel in the range [left : left + width] * [top : top + height] to black. +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]) +{ + for(int dy = 0; dy < height; dy++) { + for(int dx = 0; dx < width; dx++) + setModule(qrcode, left + dx, top + dy, true); + } +} + + + +/*---- Drawing data modules and masking ----*/ + +// Draws the raw codewords (including data and ECC) onto the given QR Code. This requires the initial state of +// the QR Code to be black at function modules and white at codeword modules (including unused remainder bits). +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) +{ + int qrsize = qrcodegen_getSize(qrcode); + int i = 0; // Bit index into the data + // Do the funny zigzag scan + for(int right = qrsize - 1; right >= 1; right -= 2) { // Index of right column in each column pair + if(right == 6) + right = 5; + for(int vert = 0; vert < qrsize; vert++) { // Vertical counter + for(int j = 0; j < 2; j++) { + int x = right - j; // Actual x coordinate + bool upward = ((right + 1) & 2) == 0; + int y = upward ? qrsize - 1 - vert : vert; // Actual y coordinate + if(!getModule(qrcode, x, y) && i < dataLen * 8) { + bool black = getBit(data[i >> 3], 7 - (i & 7)); + setModule(qrcode, x, y, black); + i++; + } + // If this QR Code has any remainder bits (0 to 7), they were assigned as + // 0/false/white by the constructor and are left unchanged by this method + } + } + } + LV_ASSERT(i == dataLen * 8); +} + + +// XORs the codeword modules in this QR Code with the given mask pattern. +// The function modules must be marked and the codeword bits must be drawn +// before masking. Due to the arithmetic of XOR, calling applyMask() with +// the same mask value a second time will undo the mask. A final well-formed +// QR Code needs exactly one (not zero, two, etc.) mask applied. +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) +{ + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO + int qrsize = qrcodegen_getSize(qrcode); + for(int y = 0; y < qrsize; y++) { + for(int x = 0; x < qrsize; x++) { + if(getModule(functionModules, x, y)) + continue; + bool invert; + switch((int)mask) { + case 0: + invert = (x + y) % 2 == 0; + break; + case 1: + invert = y % 2 == 0; + break; + case 2: + invert = x % 3 == 0; + break; + case 3: + invert = (x + y) % 3 == 0; + break; + case 4: + invert = (x / 3 + y / 2) % 2 == 0; + break; + case 5: + invert = x * y % 2 + x * y % 3 == 0; + break; + case 6: + invert = (x * y % 2 + x * y % 3) % 2 == 0; + break; + case 7: + invert = ((x + y) % 2 + x * y % 3) % 2 == 0; + break; + default: + LV_ASSERT(false); + return; + } + bool val = getModule(qrcode, x, y); + setModule(qrcode, x, y, val ^ invert); + } + } +} + + +// Calculates and returns the penalty score based on state of the given QR Code's current modules. +// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. +static long getPenaltyScore(const uint8_t qrcode[]) +{ + int qrsize = qrcodegen_getSize(qrcode); + long result = 0; + + // Adjacent modules in row having same color, and finder-like patterns + for(int y = 0; y < qrsize; y++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runX = 0; + for(int x = 0; x < qrsize; x++) { + if(getModule(qrcode, x, y) == color) { + runX++; + if(runX == 5) + result += PENALTY_N1; + else if(runX > 5) + result++; + } + else { + addRunToHistory(runX, runHistory); + if(!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runX = 1; + } + } + addRunToHistory(runX, runHistory); + if(color) + addRunToHistory(0, runHistory); // Dummy run of white + if(hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + // Adjacent modules in column having same color, and finder-like patterns + for(int x = 0; x < qrsize; x++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runY = 0; + for(int y = 0; y < qrsize; y++) { + if(getModule(qrcode, x, y) == color) { + runY++; + if(runY == 5) + result += PENALTY_N1; + else if(runY > 5) + result++; + } + else { + addRunToHistory(runY, runHistory); + if(!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runY = 1; + } + } + addRunToHistory(runY, runHistory); + if(color) + addRunToHistory(0, runHistory); // Dummy run of white + if(hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + + // 2*2 blocks of modules having same color + for(int y = 0; y < qrsize - 1; y++) { + for(int x = 0; x < qrsize - 1; x++) { + bool color = getModule(qrcode, x, y); + if(color == getModule(qrcode, x + 1, y) && + color == getModule(qrcode, x, y + 1) && + color == getModule(qrcode, x + 1, y + 1)) + result += PENALTY_N2; + } + } + + // Balance of black and white modules + int black = 0; + for(int y = 0; y < qrsize; y++) { + for(int x = 0; x < qrsize; x++) { + if(getModule(qrcode, x, y)) + black++; + } + } + int total = qrsize * qrsize; // Note that size is odd, so black/total != 1/2 + // Compute the smallest integer k >= 0 such that (45-5k)% <= black/total <= (55+5k)% + int k = (int)((labs(black * 20L - total * 10L) + total - 1) / total) - 1; + result += k * PENALTY_N4; + return result; +} + + +// Inserts the given value to the front of the given array, which shifts over the +// existing values and deletes the last value. A helper function for getPenaltyScore(). +static void addRunToHistory(unsigned char run, unsigned char history[7]) +{ + memmove(&history[1], &history[0], 6 * sizeof(history[0])); + history[0] = run; +} + + +// Tests whether the given run history has the pattern of ratio 1:1:3:1:1 in the middle, and +// surrounded by at least 4 on either or both ends. A helper function for getPenaltyScore(). +// Must only be called immediately after a run of white modules has ended. +static bool hasFinderLikePattern(const unsigned char runHistory[7]) +{ + unsigned char n = runHistory[1]; + // The maximum QR Code size is 177, hence the run length n <= 177. + // Arithmetic is promoted to int, so n*4 will not overflow. + return n > 0 && runHistory[2] == n && runHistory[4] == n && runHistory[5] == n + && runHistory[3] == n * 3 && (runHistory[0] >= n * 4 || runHistory[6] >= n * 4); +} + + + +/*---- Basic QR Code information ----*/ + +// Public function - see documentation comment in header file. +int qrcodegen_getSize(const uint8_t qrcode[]) +{ + LV_ASSERT(qrcode != NULL); + int result = qrcode[0]; + LV_ASSERT((qrcodegen_VERSION_MIN * 4 + 17) <= result + && result <= (qrcodegen_VERSION_MAX * 4 + 17)); + return result; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) +{ + LV_ASSERT(qrcode != NULL); + int qrsize = qrcode[0]; + return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); +} + + +// Gets the module at the given coordinates, which must be in bounds. +testable bool getModule(const uint8_t qrcode[], int x, int y) +{ + int qrsize = qrcode[0]; + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + return getBit(qrcode[(index >> 3) + 1], index & 7); +} + + +// Sets the module at the given coordinates, which must be in bounds. +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) +{ + int qrsize = qrcode[0]; + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + int bitIndex = index & 7; + int byteIndex = (index >> 3) + 1; + if(isBlack) + qrcode[byteIndex] |= 1 << bitIndex; + else + qrcode[byteIndex] &= (1 << bitIndex) ^ 0xFF; +} + + +// Sets the module at the given coordinates, doing nothing if out of bounds. +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) +{ + int qrsize = qrcode[0]; + if(0 <= x && x < qrsize && 0 <= y && y < qrsize) + setModule(qrcode, x, y, isBlack); +} + + +// Returns true iff the i'th bit of x is set to 1. Requires x >= 0 and 0 <= i <= 14. +static bool getBit(int x, int i) +{ + return ((x >> i) & 1) != 0; +} + + + +/*---- Segment handling ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_isAlphanumeric(const char * text) +{ + LV_ASSERT(text != NULL); + for(; *text != '\0'; text++) { + if(strchr(ALPHANUMERIC_CHARSET, *text) == NULL) + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_isNumeric(const char * text) +{ + LV_ASSERT(text != NULL); + for(; *text != '\0'; text++) { + if(*text < '0' || *text > '9') + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars) +{ + int temp = calcSegmentBitLength(mode, numChars); + if(temp == -1) + return SIZE_MAX; + LV_ASSERT(0 <= temp && temp <= INT16_MAX); + return ((size_t)temp + 7) / 8; +} + + +// Returns the number of data bits needed to represent a segment +// containing the given number of characters using the given mode. Notes: +// - Returns -1 on failure, i.e. numChars > INT16_MAX or +// the number of needed bits exceeds INT16_MAX (i.e. 32767). +// - Otherwise, all valid results are in the range [0, INT16_MAX]. +// - For byte mode, numChars measures the number of bytes, not Unicode code points. +// - For ECI mode, numChars must be 0, and the worst-case number of bits is returned. +// An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) +{ + // All calculations are designed to avoid overflow on all platforms + if(numChars > (unsigned int)INT16_MAX) + return -1; + long result = (long)numChars; + if(mode == qrcodegen_Mode_NUMERIC) + result = (result * 10 + 2) / 3; // ceil(10/3 * n) + else if(mode == qrcodegen_Mode_ALPHANUMERIC) + result = (result * 11 + 1) / 2; // ceil(11/2 * n) + else if(mode == qrcodegen_Mode_BYTE) + result *= 8; + else if(mode == qrcodegen_Mode_KANJI) + result *= 13; + else if(mode == qrcodegen_Mode_ECI && numChars == 0) + result = 3 * 8; + else { // Invalid argument + LV_ASSERT(false); + return -1; + } + LV_ASSERT(result >= 0); + if((unsigned int)result > (unsigned int)INT16_MAX) + return -1; + return (int)result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) +{ + LV_ASSERT(data != NULL || len == 0); + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_BYTE; + result.bitLength = calcSegmentBitLength(result.mode, len); + LV_ASSERT(result.bitLength != -1); + result.numChars = (int)len; + if(len > 0) + memcpy(buf, data, len * sizeof(buf[0])); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]) +{ + LV_ASSERT(digits != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(digits); + result.mode = qrcodegen_Mode_NUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + LV_ASSERT(bitLen != -1); + result.numChars = (int)len; + if(bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for(; *digits != '\0'; digits++) { + char c = *digits; + LV_ASSERT('0' <= c && c <= '9'); + accumData = accumData * 10 + (unsigned int)(c - '0'); + accumCount++; + if(accumCount == 3) { + appendBitsToBuffer(accumData, 10, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if(accumCount > 0) // 1 or 2 digits remaining + appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); + LV_ASSERT(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]) +{ + LV_ASSERT(text != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(text); + result.mode = qrcodegen_Mode_ALPHANUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + LV_ASSERT(bitLen != -1); + result.numChars = (int)len; + if(bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for(; *text != '\0'; text++) { + const char * temp = strchr(ALPHANUMERIC_CHARSET, *text); + LV_ASSERT(temp != NULL); + accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); + accumCount++; + if(accumCount == 2) { + appendBitsToBuffer(accumData, 11, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if(accumCount > 0) // 1 character remaining + appendBitsToBuffer(accumData, 6, buf, &result.bitLength); + LV_ASSERT(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) +{ + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_ECI; + result.numChars = 0; + result.bitLength = 0; + if(assignVal < 0) { + LV_ASSERT(false); + } + else if(assignVal < (1 << 7)) { + memset(buf, 0, 1 * sizeof(buf[0])); + appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); + } + else if(assignVal < (1 << 14)) { + memset(buf, 0, 2 * sizeof(buf[0])); + appendBitsToBuffer(2, 2, buf, &result.bitLength); + appendBitsToBuffer(assignVal, 14, buf, &result.bitLength); + } + else if(assignVal < 1000000L) { + memset(buf, 0, 3 * sizeof(buf[0])); + appendBitsToBuffer(6, 3, buf, &result.bitLength); + appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); + appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); + } + else { + LV_ASSERT(false); + } + result.data = buf; + return result; +} + + +// Calculates the number of bits needed to encode the given segments at the given version. +// Returns a non-negative number if successful. Otherwise returns -1 if a segment has too +// many characters to fit its length field, or the total bits exceeds INT16_MAX. +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) +{ + LV_ASSERT(segs != NULL || len == 0); + long result = 0; + for(size_t i = 0; i < len; i++) { + int numChars = segs[i].numChars; + int bitLength = segs[i].bitLength; + LV_ASSERT(0 <= numChars && numChars <= INT16_MAX); + LV_ASSERT(0 <= bitLength && bitLength <= INT16_MAX); + int ccbits = numCharCountBits(segs[i].mode, version); + LV_ASSERT(0 <= ccbits && ccbits <= 16); + if(numChars >= (1L << ccbits)) + return -1; // The segment's length doesn't fit the field's bit width + result += 4L + ccbits + bitLength; + if(result > INT16_MAX) + return -1; // The sum might overflow an int type + } + LV_ASSERT(0 <= result && result <= INT16_MAX); + return (int)result; +} + + +// Returns the bit width of the character count field for a segment in the given mode +// in a QR Code at the given version number. The result is in the range [0, 16]. +static int numCharCountBits(enum qrcodegen_Mode mode, int version) +{ + LV_ASSERT(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int i = (version + 7) / 17; + switch(mode) { + case qrcodegen_Mode_NUMERIC : { + static const int temp[] = {10, 12, 14}; + return temp[i]; + } + case qrcodegen_Mode_ALPHANUMERIC: { + static const int temp[] = { 9, 11, 13}; + return temp[i]; + } + case qrcodegen_Mode_BYTE : { + static const int temp[] = { 8, 16, 16}; + return temp[i]; + } + case qrcodegen_Mode_KANJI : { + static const int temp[] = { 8, 10, 12}; + return temp[i]; + } + case qrcodegen_Mode_ECI : + return 0; + default: + LV_ASSERT(false); + return -1; // Dummy value + } +} + +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen) +{ + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + seg.numChars = (int)dataLen; + + for(int version = qrcodegen_VERSION_MIN; version <= qrcodegen_VERSION_MAX; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + int dataUsedBits = getTotalBits(&seg, 1, version); + if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + return version; + } + return -1; +} + +int qrcodegen_version2size(int version) +{ + if(version < qrcodegen_VERSION_MIN || version > qrcodegen_VERSION_MAX) { + return -1; + } + + return ((version - 1) * 4 + 21); +} diff --git a/libraries/lvgl/src/libs/qrcode/qrcodegen.h b/libraries/lvgl/src/libs/qrcode/qrcodegen.h new file mode 100644 index 0000000..986bada --- /dev/null +++ b/libraries/lvgl/src/libs/qrcode/qrcodegen.h @@ -0,0 +1,319 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#pragma once + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * This library creates QR Code symbols, which is a type of two-dimension barcode. + * Invented by Denso Wave and described in the ISO/IEC 18004 standard. + * A QR Code structure is an immutable square grid of black and white cells. + * The library provides functions to create a QR Code from text or binary data. + * The library covers the QR Code Model 2 specification, supporting all versions (sizes) + * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. + * + * Ways to create a QR Code object: + * - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary(). + * - Low level: Custom-make the list of segments and call + * qrcodegen_encodeSegments() or qrcodegen_encodeSegmentsAdvanced(). + * (Note that all ways require supplying the desired error correction level and various byte buffers.) + */ + + +/*---- Enum and struct types----*/ + +/* + * The error correction level in a QR Code symbol. + */ +enum qrcodegen_Ecc { + // Must be declared in ascending order of error protection + // so that an internal qrcodegen function works properly + qrcodegen_Ecc_LOW = 0, // The QR Code can tolerate about 7% erroneous codewords + qrcodegen_Ecc_MEDIUM, // The QR Code can tolerate about 15% erroneous codewords + qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords + qrcodegen_Ecc_HIGH, // The QR Code can tolerate about 30% erroneous codewords +}; + + +/* + * The mask pattern used in a QR Code symbol. + */ +enum qrcodegen_Mask { + // A special value to tell the QR Code encoder to + // automatically select an appropriate mask pattern + qrcodegen_Mask_AUTO = -1, + // The eight actual mask patterns + qrcodegen_Mask_0 = 0, + qrcodegen_Mask_1, + qrcodegen_Mask_2, + qrcodegen_Mask_3, + qrcodegen_Mask_4, + qrcodegen_Mask_5, + qrcodegen_Mask_6, + qrcodegen_Mask_7, +}; + + +/* + * Describes how a segment's data bits are interpreted. + */ +enum qrcodegen_Mode { + qrcodegen_Mode_NUMERIC = 0x1, + qrcodegen_Mode_ALPHANUMERIC = 0x2, + qrcodegen_Mode_BYTE = 0x4, + qrcodegen_Mode_KANJI = 0x8, + qrcodegen_Mode_ECI = 0x7, +}; + + +/* + * A segment of character/binary/control data in a QR Code symbol. + * The mid-level way to create a segment is to take the payload data + * and call a factory function such as qrcodegen_makeNumeric(). + * The low-level way to create a segment is to custom-make the bit buffer + * and initialize a qrcodegen_Segment struct with appropriate values. + * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. + * Any segment longer than this is meaningless for the purpose of generating QR Codes. + * Moreover, the maximum allowed bit length is 32767 because + * the largest QR Code (version 40) has 31329 modules. + */ +struct qrcodegen_Segment { + // The mode indicator of this segment. + enum qrcodegen_Mode mode; + + // The length of this segment's unencoded data. Measured in characters for + // numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. + // Always zero or positive. Not the same as the data's bit length. + int numChars; + + // The data bits of this segment, packed in bitwise big endian. + // Can be null if the bit length is zero. + uint8_t * data; + + // The number of valid data bits used in the buffer. Requires + // 0 <= bitLength <= 32767, and bitLength <= (capacity of data array) * 8. + // The character count (numChars) must agree with the mode and the bit buffer length. + int bitLength; +}; + + + +/*---- Macro constants and functions ----*/ + +#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard +#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard + +// Calculates the number of bytes needed to store any QR Code up to and including the given version number, +// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];' +// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16). +// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX. +#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1) + +// The worst-case number of bytes needed to store one QR Code, up to and including +// version 40. This value equals 3918, which is just under 4 kilobytes. +// Use this more convenient value to avoid calculating tighter memory bounds for buffers. +#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX) + + + +/*---- Functions (high level) to generate QR Codes ----*/ + +/* + * Encodes the given text string to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input text must be encoded in UTF-8 and contain no NULs. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays tempBuffer and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, tempBuffer contains no useful data. + * - If successful, the resulting QR Code may use numeric, + * alphanumeric, or byte mode to encode the text. + * - In the most optimistic case, a QR Code at version 40 with low ECC + * can hold any UTF-8 string up to 2953 bytes, or any alphanumeric string + * up to 4296 characters, or any digit string up to 7089 characters. + * These numbers represent the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/* + * Encodes the given binary data to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input array range dataAndTemp[0 : dataLen] should normally be + * valid UTF-8 text, but is not required by the QR Code standard. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays dataAndTemp and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, the contents of dataAndTemp may have changed, + * and does not represent useful data anymore. + * - If successful, the resulting QR Code will use byte mode to encode the data. + * - In the most optimistic case, a QR Code at version 40 with low ECC can hold any byte + * sequence up to length 2953. This is the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/*---- Functions (low level) to generate QR Codes ----*/ + +/* + * Renders a QR Code representing the given segments at the given error correction level. + * The smallest possible QR Code version is automatically chosen for the output. Returns true if + * QR Code creation succeeded, or false if the data is too long to fit in any version. The ECC level + * of the result may be higher than the ecl argument if it can be done without increasing the version. + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Renders a QR Code representing the given segments with the given encoding parameters. + * Returns true if QR Code creation succeeded, or false if the data is too long to fit in the range of versions. + * The smallest possible QR Code version within the given range is automatically + * chosen for the output. Iff boostEcl is true, then the ECC level of the result + * may be higher than the ecl argument if it can be done without increasing the + * version. The mask number is either between 0 to 7 (inclusive) to force that + * mask, or -1 to automatically choose an appropriate mask (which may be slow). + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Tests whether the given string can be encoded as a segment in alphanumeric mode. + * A string is encodable iff each character is in the following set: 0 to 9, A to Z + * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +bool qrcodegen_isAlphanumeric(const char * text); + + +/* + * Tests whether the given string can be encoded as a segment in numeric mode. + * A string is encodable iff each character is in the range 0 to 9. + */ +bool qrcodegen_isNumeric(const char * text); + + +/* + * Returns the number of bytes (uint8_t) needed for the data buffer of a segment + * containing the given number of characters using the given mode. Notes: + * - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or + * the number of needed bits exceeds INT16_MAX (i.e. 32767). + * - Otherwise, all valid results are in the range [0, ceil(INT16_MAX / 8)], i.e. at most 4096. + * - It is okay for the user to allocate more bytes for the buffer than needed. + * - For byte mode, numChars measures the number of bytes, not Unicode code points. + * - For ECI mode, numChars must be 0, and the worst-case number of bytes is returned. + * An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. + */ +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars); + + +/* + * Returns a segment representing the given binary data encoded in + * byte mode. All input byte arrays are acceptable. Any text string + * can be converted to UTF-8 bytes and encoded as a byte mode segment. + */ +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]); + + +/* + * Returns a segment representing the given string of decimal digits encoded in numeric mode. + */ +struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]); + + +/* + * Returns a segment representing the given text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]); + + +/* + * Returns a segment representing an Extended Channel Interpretation + * (ECI) designator with the given assignment value. + */ +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]); + + +/*---- Functions to extract raw data from QR Codes ----*/ + +/* + * Returns the side length of the given QR Code, assuming that encoding succeeded. + * The result is in the range [21, 177]. Note that the length of the array buffer + * is related to the side length - every 'uint8_t qrcode[]' must have length at least + * qrcodegen_BUFFER_LEN_FOR_VERSION(version), which equals ceil(size^2 / 8 + 1). + */ +int qrcodegen_getSize(const uint8_t qrcode[]); + + +/* + * Returns the color of the module (pixel) at the given coordinates, which is false + * for white or true for black. The top left corner has the coordinates (x=0, y=0). + * If the given coordinates are out of bounds, then false (white) is returned. + */ +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y); + +/* + * Returns the qrcode size of the specified version. Returns -1 on failure + */ +int qrcodegen_version2size(int version); +/* + * Returns the min version of the data that can be stored. Returns -1 on failure + */ +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen); + +#ifdef __cplusplus +} +#endif diff --git a/libraries/lvgl/src/libs/rle/lv_rle.c b/libraries/lvgl/src/libs/rle/lv_rle.c new file mode 100644 index 0000000..e715b7c --- /dev/null +++ b/libraries/lvgl/src/libs/rle/lv_rle.c @@ -0,0 +1,112 @@ +/** + * @file lv_rle.c + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../stdlib/lv_string.h" +#include "lv_rle.h" + +#if LV_USE_RLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_rle_decompress(const uint8_t * input, + uint32_t input_buff_len, uint8_t * output, + uint32_t output_buff_len, uint8_t blk_size) +{ + uint32_t ctrl_byte; + uint32_t rd_len = 0; + uint32_t wr_len = 0; + + while(rd_len < input_buff_len) { + ctrl_byte = input[0]; + rd_len++; + input++; + if(rd_len > input_buff_len) + return 0; + + if(ctrl_byte & 0x80) { + /* copy directly from input to output */ + uint32_t bytes = blk_size * (ctrl_byte & 0x7f); + rd_len += bytes; + if(rd_len > input_buff_len) + return 0; + + wr_len += bytes; + if(wr_len > output_buff_len) { + if(wr_len > output_buff_len + blk_size) + return 0; /* Error */ + lv_memcpy(output, input, output_buff_len - (wr_len - bytes)); + return output_buff_len; + } + + lv_memcpy(output, input, bytes); + output += bytes; + input += bytes; + } + else { + rd_len += blk_size; + if(rd_len > input_buff_len) + return 0; + + wr_len += blk_size * ctrl_byte; + if(wr_len > output_buff_len) { + if(wr_len > output_buff_len + blk_size) + return 0; /* Error happened */ + + /* Skip the last pixel, which could overflow output buffer.*/ + for(uint32_t i = 0; i < ctrl_byte - 1; i++) { + lv_memcpy(output, input, blk_size); + output += blk_size; + } + return output_buff_len; + } + + if(blk_size == 1) { + /* optimize the most common case. */ + lv_memset(output, input[0], ctrl_byte); + output += ctrl_byte; + } + else { + for(uint32_t i = 0; i < ctrl_byte; i++) { + lv_memcpy(output, input, blk_size); + output += blk_size; + } + } + input += blk_size; + } + } + + return wr_len; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_RLE*/ diff --git a/libraries/lvgl/src/libs/rle/lv_rle.h b/libraries/lvgl/src/libs/rle/lv_rle.h new file mode 100644 index 0000000..02ab6a3 --- /dev/null +++ b/libraries/lvgl/src/libs/rle/lv_rle.h @@ -0,0 +1,46 @@ +/** + * @file lv_rle.h + * + */ + +#ifndef LV_RLE_H +#define LV_RLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_RLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +uint32_t lv_rle_decompress(const uint8_t * input, + uint32_t input_buff_len, uint8_t * output, + uint32_t output_buff_len, uint8_t blk_size); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_RLE_H*/ diff --git a/libraries/lvgl/src/libs/rlottie/lv_rlottie.c b/libraries/lvgl/src/libs/rlottie/lv_rlottie.c new file mode 100644 index 0000000..f595215 --- /dev/null +++ b/libraries/lvgl/src/libs/rlottie/lv_rlottie.c @@ -0,0 +1,241 @@ +/** + * @file lv_rlottie.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" +#if LV_USE_RLOTTIE + +#include + +/********************* +* DEFINES +*********************/ +#define MY_CLASS (&lv_rlottie_class) +#define LV_ARGB32 32 + +/********************** +* TYPEDEFS +**********************/ +#define LV_ARGB32 32 + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_rlottie_class = { + .constructor_cb = lv_rlottie_constructor, + .destructor_cb = lv_rlottie_destructor, + .instance_size = sizeof(lv_rlottie_t), + .base_class = &lv_image_class, + .name = "rlottie", +}; + +typedef struct { + int32_t width; + int32_t height; + const char * rlottie_desc; + const char * path; +} lv_rlottie_create_info_t; + +/*Only used in lv_obj_class_create_obj, no affect multiple instances*/ +static lv_rlottie_create_info_t create_info; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path) +{ + create_info.width = width; + create_info.height = height; + create_info.path = path; + create_info.rlottie_desc = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, const char * rlottie_desc) +{ + create_info.width = width; + create_info.height = height; + create_info.rlottie_desc = rlottie_desc; + create_info.path = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +void lv_rlottie_set_play_mode(lv_obj_t * obj, const lv_rlottie_ctrl_t ctrl) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->play_ctrl = ctrl; + + if(rlottie->task && (rlottie->dest_frame != rlottie->current_frame || + (rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PLAY)) { + lv_timer_resume(rlottie->task); + } +} + +void lv_rlottie_set_current_frame(lv_obj_t * obj, const size_t goto_frame) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->current_frame = goto_frame < rlottie->total_frames ? goto_frame : rlottie->total_frames - 1; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(create_info.rlottie_desc) { + rlottie->animation = lottie_animation_from_data(create_info.rlottie_desc, create_info.rlottie_desc, ""); + } + else if(create_info.path) { + rlottie->animation = lottie_animation_from_file(create_info.path); + } + if(rlottie->animation == NULL) { + LV_LOG_WARN("The aniamtion can't be opened"); + return; + } + + rlottie->total_frames = lottie_animation_get_totalframe(rlottie->animation); + rlottie->framerate = (size_t)lottie_animation_get_framerate(rlottie->animation); + rlottie->current_frame = 0; + + rlottie->scanline_width = create_info.width * LV_ARGB32 / 8; + + size_t allocaled_buf_size = (create_info.width * create_info.height * LV_ARGB32 / 8); + rlottie->allocated_buf = lv_malloc(allocaled_buf_size); + if(rlottie->allocated_buf != NULL) { + rlottie->allocated_buffer_size = allocaled_buf_size; + memset(rlottie->allocated_buf, 0, allocaled_buf_size); + } + + rlottie->imgdsc.header.cf = LV_COLOR_FORMAT_ARGB8888; + rlottie->imgdsc.header.h = create_info.height; + rlottie->imgdsc.header.w = create_info.width; + rlottie->imgdsc.data = (void *)rlottie->allocated_buf; + rlottie->imgdsc.data_size = allocaled_buf_size; + + lv_image_set_src(obj, &rlottie->imgdsc); + + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD | LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_LOOP; + rlottie->dest_frame = rlottie->total_frames; /* invalid destination frame so it's possible to pause on frame 0 */ + + rlottie->task = lv_timer_create(next_frame_task_cb, 1000 / rlottie->framerate, obj); + + lv_obj_update_layout(obj); +} + +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(rlottie->animation) { + lottie_animation_destroy(rlottie->animation); + rlottie->animation = 0; + rlottie->current_frame = 0; + rlottie->framerate = 0; + rlottie->scanline_width = 0; + rlottie->total_frames = 0; + } + + if(rlottie->task) { + lv_timer_delete(rlottie->task); + rlottie->task = NULL; + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD; + rlottie->dest_frame = 0; + } + + lv_image_cache_drop(&rlottie->imgdsc); + + if(rlottie->allocated_buf) { + lv_free(rlottie->allocated_buf); + rlottie->allocated_buf = NULL; + rlottie->allocated_buffer_size = 0; + } + +} + +static void next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = t->user_data; + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PAUSE) { + if(rlottie->current_frame == rlottie->dest_frame) { + /* Pause the timer too when it has run once to avoid CPU consumption */ + lv_timer_pause(t); + return; + } + rlottie->dest_frame = rlottie->current_frame; + } + else { + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_BACKWARD) == LV_RLOTTIE_CTRL_BACKWARD) { + if(rlottie->current_frame > 0) + --rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = rlottie->total_frames - 1; + else { + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + else { + if(rlottie->current_frame < rlottie->total_frames) + ++rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = 0; + else { + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + } + + lottie_animation_render( + rlottie->animation, + rlottie->current_frame, + rlottie->allocated_buf, + rlottie->imgdsc.header.w, + rlottie->imgdsc.header.h, + rlottie->scanline_width + ); + + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_RLOTTIE*/ diff --git a/libraries/lvgl/src/libs/rlottie/lv_rlottie.h b/libraries/lvgl/src/libs/rlottie/lv_rlottie.h new file mode 100644 index 0000000..f9ab93f --- /dev/null +++ b/libraries/lvgl/src/libs/rlottie/lv_rlottie.h @@ -0,0 +1,75 @@ +/** + * @file lv_rlottie.h + * + */ + +#ifndef LV_RLOTTIE_H +#define LV_RLOTTIE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_RLOTTIE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_RLOTTIE_CTRL_FORWARD = 0, + LV_RLOTTIE_CTRL_BACKWARD = 1, + LV_RLOTTIE_CTRL_PAUSE = 2, + LV_RLOTTIE_CTRL_PLAY = 0, /* Yes, play = 0 is the default mode */ + LV_RLOTTIE_CTRL_LOOP = 8, +} lv_rlottie_ctrl_t; + +/** definition in lottieanimation_capi.c */ +struct Lottie_Animation_S; +typedef struct { + lv_image_t img_ext; + struct Lottie_Animation_S * animation; + lv_timer_t * task; + lv_image_dsc_t imgdsc; + size_t total_frames; + size_t current_frame; + size_t framerate; + uint32_t * allocated_buf; + size_t allocated_buffer_size; + size_t scanline_width; + lv_rlottie_ctrl_t play_ctrl; + size_t dest_frame; +} lv_rlottie_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_rlottie_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path); + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, + const char * rlottie_desc); + +void lv_rlottie_set_play_mode(lv_obj_t * rlottie, const lv_rlottie_ctrl_t ctrl); +void lv_rlottie_set_current_frame(lv_obj_t * rlottie, const size_t goto_frame); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLOTTIE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_RLOTTIE_H*/ diff --git a/libraries/lvgl/src/libs/thorvg/add_lvgl_if.sh b/libraries/lvgl/src/libs/thorvg/add_lvgl_if.sh new file mode 100644 index 0000000..43ce903 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/add_lvgl_if.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +#Add LVGL #if LV_USE_THORVG_INTERNAL guard +#Usage +# find -name "*.cpp" | xargs ./add_lvgl_if.sh +# find -name "t*.h" | xargs ./add_lvgl_if.sh + +sed '0,/\*\/$/ {/\*\/$/ {n; s|^|\n#include "../../lv_conf_internal.h"\n#if LV_USE_THORVG_INTERNAL\n|}}' $@ -i + +sed -i -e '$a\ +\ +#endif /* LV_USE_THORVG_INTERNAL */\ +' $@ -i diff --git a/libraries/lvgl/src/libs/thorvg/config.h b/libraries/lvgl/src/libs/thorvg/config.h new file mode 100644 index 0000000..abeed94 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/config.h @@ -0,0 +1,15 @@ +/* + * Autogenerated by the Meson build system. + * Do not edit, your changes will be lost. + */ + +#pragma once + +#define THORVG_CAPI_BINDING_SUPPORT 1 + +#define THORVG_SVG_LOADER_SUPPORT 1 + +#define THORVG_SW_RASTER_SUPPORT 1 + +#define THORVG_VERSION_STRING "0.11.99" + diff --git a/libraries/lvgl/src/libs/thorvg/thorvg.h b/libraries/lvgl/src/libs/thorvg/thorvg.h new file mode 100644 index 0000000..7f5a84b --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/thorvg.h @@ -0,0 +1,1925 @@ +/*! + * @file thorvg.h + * + * The main APIs enabling the TVG initialization, preparation of the canvas and provisioning of its content: + * - drawing shapes: line, arc, curve, path, polygon... + * - drawing pictures: tvg, svg, png, jpg, bitmap... + * - drawing fillings: solid, linear and radial gradient... + * - drawing stroking: continuous stroking with arbitrary width, join, cap, dash styles. + * - drawing composition: blending, masking, path clipping... + * - drawing scene graph & affine transformation (translation, rotation, scale, ...) + * and finally drawing the canvas and TVG termination. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + + +#ifndef _THORVG_H_ +#define _THORVG_H_ + +#include +#include +#include +#include + +#ifdef TVG_API + #undef TVG_API +#endif + +#ifndef TVG_STATIC + #ifdef _WIN32 + #if TVG_BUILD + #define TVG_API __declspec(dllexport) + #else + #define TVG_API __declspec(dllimport) + #endif + #elif (defined(__SUNPRO_C) || defined(__SUNPRO_CC)) + #define TVG_API __global + #else + #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__INTEL_COMPILER) + #define TVG_API __attribute__ ((visibility("default"))) + #else + #define TVG_API + #endif + #endif +#else + #define TVG_API +#endif + +#ifdef TVG_DEPRECATED + #undef TVG_DEPRECATED +#endif + +#ifdef _WIN32 + #define TVG_DEPRECATED __declspec(deprecated) +#elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + #define TVG_DEPRECATED __attribute__ ((__deprecated__)) +#else + #define TVG_DEPRECATED +#endif + +#define _TVG_DECLARE_PRIVATE(A) \ + struct Impl; \ + Impl* pImpl; \ +protected: \ + A(const A&) = delete; \ + const A& operator=(const A&) = delete; \ + A() + +#define _TVG_DISABLE_CTOR(A) \ + A() = delete; \ + ~A() = delete + +#define _TVG_DECLARE_ACCESSOR(A) \ + friend A + +namespace tvg +{ + +class RenderMethod; +class Animation; + +/** + * @defgroup ThorVG ThorVG + * @brief ThorVG classes and enumerations providing C++ APIs. + */ + +/**@{*/ + +/** + * @brief Enumeration specifying the result from the APIs. + */ +enum class Result +{ + Success = 0, ///< The value returned in case of a correct request execution. + InvalidArguments, ///< The value returned in the event of a problem with the arguments given to the API - e.g. empty paths or null pointers. + InsufficientCondition, ///< The value returned in case the request cannot be processed - e.g. asking for properties of an object, which does not exist. + FailedAllocation, ///< The value returned in case of unsuccessful memory allocation. + MemoryCorruption, ///< The value returned in the event of bad memory handling - e.g. failing in pointer releasing or casting + NonSupport, ///< The value returned in case of choosing unsupported options. + Unknown ///< The value returned in all other cases. +}; + + +/** + * @brief Enumeration specifying the values of the path commands accepted by TVG. + * + * Not to be confused with the path commands from the svg path element (like M, L, Q, H and many others). + * TVG interprets all of them and translates to the ones from the PathCommand values. + */ +enum class PathCommand +{ + Close = 0, ///< Ends the current sub-path and connects it with its initial point. This command doesn't expect any points. + MoveTo, ///< Sets a new initial point of the sub-path and a new current point. This command expects 1 point: the starting position. + LineTo, ///< Draws a line from the current point to the given point and sets a new value of the current point. This command expects 1 point: the end-position of the line. + CubicTo ///< Draws a cubic Bezier curve from the current point to the given point using two given control points and sets a new value of the current point. This command expects 3 points: the 1st control-point, the 2nd control-point, the end-point of the curve. +}; + + +/** + * @brief Enumeration determining the ending type of a stroke in the open sub-paths. + */ +enum class StrokeCap +{ + Square = 0, ///< The stroke is extended in both end-points of a sub-path by a rectangle, with the width equal to the stroke width and the length equal to the half of the stroke width. For zero length sub-paths the square is rendered with the size of the stroke width. + Round, ///< The stroke is extended in both end-points of a sub-path by a half circle, with a radius equal to the half of a stroke width. For zero length sub-paths a full circle is rendered. + Butt ///< The stroke ends exactly at each of the two end-points of a sub-path. For zero length sub-paths no stroke is rendered. +}; + + +/** + * @brief Enumeration determining the style used at the corners of joined stroked path segments. + */ +enum class StrokeJoin +{ + Bevel = 0, ///< The outer corner of the joined path segments is bevelled at the join point. The triangular region of the corner is enclosed by a straight line between the outer corners of each stroke. + Round, ///< The outer corner of the joined path segments is rounded. The circular region is centered at the join point. + Miter ///< The outer corner of the joined path segments is spiked. The spike is created by extension beyond the join point of the outer edges of the stroke until they intersect. In case the extension goes beyond the limit, the join style is converted to the Bevel style. +}; + + +/** + * @brief Enumeration specifying how to fill the area outside the gradient bounds. + */ +enum class FillSpread +{ + Pad = 0, ///< The remaining area is filled with the closest stop color. + Reflect, ///< The gradient pattern is reflected outside the gradient area until the expected region is filled. + Repeat ///< The gradient pattern is repeated continuously beyond the gradient area until the expected region is filled. +}; + + +/** + * @brief Enumeration specifying the algorithm used to establish which parts of the shape are treated as the inside of the shape. + */ +enum class FillRule +{ + Winding = 0, ///< A line from the point to a location outside the shape is drawn. The intersections of the line with the path segment of the shape are counted. Starting from zero, if the path segment of the shape crosses the line clockwise, one is added, otherwise one is subtracted. If the resulting sum is non zero, the point is inside the shape. + EvenOdd ///< A line from the point to a location outside the shape is drawn and its intersections with the path segments of the shape are counted. If the number of intersections is an odd number, the point is inside the shape. +}; + + +/** + * @brief Enumeration indicating the method used in the composition of two objects - the target and the source. + * + * Notation: S(Source), T(Target), SA(Source Alpha), TA(Target Alpha) + * + * @see Paint::composite() + */ +enum class CompositeMethod +{ + None = 0, ///< No composition is applied. + ClipPath, ///< The intersection of the source and the target is determined and only the resulting pixels from the source are rendered. + AlphaMask, ///< Alpha Masking using the compositing target's pixels as an alpha value. + InvAlphaMask, ///< Alpha Masking using the complement to the compositing target's pixels as an alpha value. + LumaMask, ///< Alpha Masking using the grayscale (0.2125R + 0.7154G + 0.0721*B) of the compositing target's pixels. @since 0.9 + InvLumaMask, ///< Alpha Masking using the grayscale (0.2125R + 0.7154G + 0.0721*B) of the complement to the compositing target's pixels. + AddMask, ///< Combines the target and source objects pixels using target alpha. (T * TA) + (S * (255 - TA)) @BETA_API + SubtractMask, ///< Subtracts the source color from the target color while considering their respective target alpha. (T * TA) - (S * (255 - TA)) @BETA_API + IntersectMask, ///< Computes the result by taking the minimum value between the target alpha and the source alpha and multiplies it with the target color. (T * min(TA, SA)) @BETA_API + DifferenceMask ///< Calculates the absolute difference between the target color and the source color multiplied by the complement of the target alpha. abs(T - S * (255 - TA)) @BETA_API +}; + + +/** + * @brief Enumeration indicates the method used for blending paint. Please refer to the respective formulas for each method. + * + * Notation: S(source paint as the top layer), D(destination as the bottom layer), Sa(source paint alpha), Da(destination alpha) + * + * @see Paint::blend() + * + * @BETA_API + */ +enum class BlendMethod : uint8_t +{ + Normal = 0, ///< Perform the alpha blending(default). S if (Sa == 255), otherwise (Sa * S) + (255 - Sa) * D + Add, ///< Simply adds pixel values of one layer with the other. (S + D) + Screen, ///< The values of the pixels in the two layers are inverted, multiplied, and then inverted again. (S + D) - (S * D) + Multiply, ///< Takes the RGB channel values from 0 to 255 of each pixel in the top layer and multiples them with the values for the corresponding pixel from the bottom layer. (S * D) + Overlay, ///< Combines Multiply and Screen blend modes. (2 * S * D) if (2 * D < Da), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) + Difference, ///< Subtracts the bottom layer from the top layer or the other way around, to always get a non-negative value. (S - D) if (S > D), otherwise (D - S) + Exclusion, ///< The result is twice the product of the top and bottom layers, subtracted from their sum. s + d - (2 * s * d) + SrcOver, ///< Replace the bottom layer with the top layer. + Darken, ///< Creates a pixel that retains the smallest components of the top and bottom layer pixels. min(S, D) + Lighten, ///< Only has the opposite action of Darken Only. max(S, D) + ColorDodge, ///< Divides the bottom layer by the inverted top layer. D / (255 - S) + ColorBurn, ///< Divides the inverted bottom layer by the top layer, and then inverts the result. 255 - (255 - D) / S + HardLight, ///< The same as Overlay but with the color roles reversed. (2 * S * D) if (S < Sa), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) + SoftLight ///< The same as Overlay but with applying pure black or white does not result in pure black or white. (1 - 2 * S) * (D ^ 2) + (2 * S * D) +}; + + +/** + * @brief Enumeration specifying the engine type used for the graphics backend. For multiple backends bitwise operation is allowed. + */ +enum class CanvasEngine +{ + Sw = (1 << 1), ///< CPU rasterizer. + Gl = (1 << 2), ///< OpenGL rasterizer. + Wg = (1 << 3), ///< WebGPU rasterizer. @BETA_API +}; + + +/** + * @brief A data structure representing a point in two-dimensional space. + */ +struct Point +{ + float x, y; +}; + + +/** + * @brief A data structure representing a three-dimensional matrix. + * + * The elements e11, e12, e21 and e22 represent the rotation matrix, including the scaling factor. + * The elements e13 and e23 determine the translation of the object along the x and y-axis, respectively. + * The elements e31 and e32 are set to 0, e33 is set to 1. + */ +struct Matrix +{ + float e11, e12, e13; + float e21, e22, e23; + float e31, e32, e33; +}; + + +/** + * @brief A data structure representing a texture mesh vertex + * + * @param pt The vertex coordinate + * @param uv The normalized texture coordinate in the range (0.0..1.0, 0.0..1.0) + * + * @BETA_API + */ +struct Vertex +{ + Point pt; + Point uv; +}; + + +/** + * @brief A data structure representing a triange in a texture mesh + * + * @param vertex The three vertices that make up the polygon + * + * @BETA_API + */ +struct Polygon +{ + Vertex vertex[3]; +}; + + +/** + * @class Paint + * + * @brief An abstract class for managing graphical elements. + * + * A graphical element in TVG is any object composed into a Canvas. + * Paint represents such a graphical object and its behaviors such as duplication, transformation and composition. + * TVG recommends the user to regard a paint as a set of volatile commands. They can prepare a Paint and then request a Canvas to run them. + */ +class TVG_API Paint +{ +public: + virtual ~Paint(); + + /** + * @brief Sets the angle by which the object is rotated. + * + * The angle in measured clockwise from the horizontal axis. + * The rotational axis passes through the point on the object with zero coordinates. + * + * @param[in] degree The value of the angle in degrees. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result rotate(float degree) noexcept; + + /** + * @brief Sets the scale value of the object. + * + * @param[in] factor The value of the scaling factor. The default value is 1. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result scale(float factor) noexcept; + + /** + * @brief Sets the values by which the object is moved in a two-dimensional space. + * + * The origin of the coordinate system is in the upper left corner of the canvas. + * The horizontal and vertical axes point to the right and down, respectively. + * + * @param[in] x The value of the horizontal shift. + * @param[in] y The value of the vertical shift. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result translate(float x, float y) noexcept; + + /** + * @brief Sets the matrix of the affine transformation for the object. + * + * The augmented matrix of the transformation is expected to be given. + * + * @param[in] m The 3x3 augmented matrix. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result transform(const Matrix& m) noexcept; + + /** + * @brief Gets the matrix of the affine transformation of the object. + * + * The values of the matrix can be set by the transform() API, as well by the translate(), + * scale() and rotate(). In case no transformation was applied, the identity matrix is returned. + * + * @return The augmented transformation matrix. + * + * @since 0.4 + */ + Matrix transform() noexcept; + + /** + * @brief Sets the opacity of the object. + * + * @param[in] o The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. + * + * @return Result::Success when succeed. + * + * @note Setting the opacity with this API may require multiple render pass for composition. It is recommended to avoid changing the opacity if possible. + * @note ClipPath won't use the opacity value. (see: enum class CompositeMethod::ClipPath) + */ + Result opacity(uint8_t o) noexcept; + + /** + * @brief Sets the composition target object and the composition method. + * + * @param[in] target The paint of the target object. + * @param[in] method The method used to composite the source object with the target. + * + * @return Result::Success when succeed, Result::InvalidArguments otherwise. + */ + Result composite(std::unique_ptr target, CompositeMethod method) noexcept; + + /** + * @brief Sets the blending method for the paint object. + * + * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. + * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. + * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. + * + * @param[in] method The blending method to be set. + * + * @return Result::Success when the blending method is successfully set. + * + * @BETA_API + */ + Result blend(BlendMethod method) const noexcept; + + /** + * @brief Gets the bounding box of the paint object before any transformation. + * + * @param[out] x The x coordinate of the upper left corner of the object. + * @param[out] y The y coordinate of the upper left corner of the object. + * @param[out] w The width of the object. + * @param[out] h The height of the object. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * + * @note The bounding box doesn't indicate the final rendered region. It's the smallest rectangle that encloses the object. + * @see Paint::bounds(float* x, float* y, float* w, float* h, bool transformed); + * @deprecated Use bounds(float* x, float* y, float* w, float* h, bool transformed) instead + */ + TVG_DEPRECATED Result bounds(float* x, float* y, float* w, float* h) const noexcept; + + /** + * @brief Gets the axis-aligned bounding box of the paint object. + * + * In case @p transform is @c true, all object's transformations are applied first, and then the bounding box is established. Otherwise, the bounding box is determined before any transformations. + * + * @param[out] x The x coordinate of the upper left corner of the object. + * @param[out] y The y coordinate of the upper left corner of the object. + * @param[out] w The width of the object. + * @param[out] h The height of the object. + * @param[in] transformed If @c true, the paint's transformations are taken into account, otherwise they aren't. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * + * @note The bounding box doesn't indicate the actual drawing region. It's the smallest rectangle that encloses the object. + */ + Result bounds(float* x, float* y, float* w, float* h, bool transformed) const noexcept; + + /** + * @brief Duplicates the object. + * + * Creates a new object and sets its all properties as in the original object. + * + * @return The created object when succeed, @c nullptr otherwise. + */ + Paint* duplicate() const noexcept; + + /** + * @brief Gets the opacity value of the object. + * + * @return The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. + */ + uint8_t opacity() const noexcept; + + /** + * @brief Gets the composition target object and the composition method. + * + * @param[out] target The paint of the target object. + * + * @return The method used to composite the source object with the target. + * + * @since 0.5 + */ + CompositeMethod composite(const Paint** target) const noexcept; + + /** + * @brief Gets the blending method of the object. + * + * @return The blending method + * + * @BETA_API + */ + BlendMethod blend() const noexcept; + + /** + * @brief Return the unique id value of the paint instance. + * + * This method can be called for checking the current concrete instance type. + * + * @return The type id of the Paint instance. + */ + uint32_t identifier() const noexcept; + + _TVG_DECLARE_PRIVATE(Paint); +}; + + +/** + * @class Fill + * + * @brief An abstract class representing the gradient fill of the Shape object. + * + * It contains the information about the gradient colors and their arrangement + * inside the gradient bounds. The gradients bounds are defined in the LinearGradient + * or RadialGradient class, depending on the type of the gradient to be used. + * It specifies the gradient behavior in case the area defined by the gradient bounds + * is smaller than the area to be filled. + */ +class TVG_API Fill +{ +public: + /** + * @brief A data structure storing the information about the color and its relative position inside the gradient bounds. + */ + struct ColorStop + { + float offset; /**< The relative position of the color. */ + uint8_t r; /**< The red color channel value in the range [0 ~ 255]. */ + uint8_t g; /**< The green color channel value in the range [0 ~ 255]. */ + uint8_t b; /**< The blue color channel value in the range [0 ~ 255]. */ + uint8_t a; /**< The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. */ + }; + + virtual ~Fill(); + + /** + * @brief Sets the parameters of the colors of the gradient and their position. + * + * @param[in] colorStops An array of ColorStop data structure. + * @param[in] cnt The count of the @p colorStops array equal to the colors number used in the gradient. + * + * @return Result::Success when succeed. + */ + Result colorStops(const ColorStop* colorStops, uint32_t cnt) noexcept; + + /** + * @brief Sets the FillSpread value, which specifies how to fill the area outside the gradient bounds. + * + * @param[in] s The FillSpread value. + * + * @return Result::Success when succeed. + */ + Result spread(FillSpread s) noexcept; + + /** + * @brief Sets the matrix of the affine transformation for the gradient fill. + * + * The augmented matrix of the transformation is expected to be given. + * + * @param[in] m The 3x3 augmented matrix. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result transform(const Matrix& m) noexcept; + + /** + * @brief Gets the parameters of the colors of the gradient, their position and number. + * + * @param[out] colorStops A pointer to the memory location, where the array of the gradient's ColorStop is stored. + * + * @return The number of colors used in the gradient. This value corresponds to the length of the @p colorStops array. + */ + uint32_t colorStops(const ColorStop** colorStops) const noexcept; + + /** + * @brief Gets the FillSpread value of the fill. + * + * @return The FillSpread value of this Fill. + */ + FillSpread spread() const noexcept; + + /** + * @brief Gets the matrix of the affine transformation of the gradient fill. + * + * In case no transformation was applied, the identity matrix is returned. + * + * @retval The augmented transformation matrix. + */ + Matrix transform() const noexcept; + + /** + * @brief Creates a copy of the Fill object. + * + * Return a newly created Fill object with the properties copied from the original. + * + * @return A copied Fill object when succeed, @c nullptr otherwise. + */ + Fill* duplicate() const noexcept; + + /** + * @brief Return the unique id value of the Fill instance. + * + * This method can be called for checking the current concrete instance type. + * + * @return The type id of the Fill instance. + */ + uint32_t identifier() const noexcept; + + _TVG_DECLARE_PRIVATE(Fill); +}; + + +/** + * @class Canvas + * + * @brief An abstract class for drawing graphical elements. + * + * A canvas is an entity responsible for drawing the target. It sets up the drawing engine and the buffer, which can be drawn on the screen. It also manages given Paint objects. + * + * @note A Canvas behavior depends on the raster engine though the final content of the buffer is expected to be identical. + * @warning The Paint objects belonging to one Canvas can't be shared among multiple Canvases. + */ +class TVG_API Canvas +{ +public: + Canvas(RenderMethod*); + virtual ~Canvas(); + + /** + * @brief Sets the size of the container, where all the paints pushed into the Canvas are stored. + * + * If the number of objects pushed into the Canvas is known in advance, calling the function + * prevents multiple memory reallocation, thus improving the performance. + * + * @param[in] n The number of objects for which the memory is to be reserved. + * + * @return Result::Success when succeed. + */ + TVG_DEPRECATED Result reserve(uint32_t n) noexcept; + + /** + * @brief Returns the list of the paints that currently held by the Canvas. + * + * This function provides the list of paint nodes, allowing users a direct opportunity to modify the scene tree. + * + * @warning Please avoid accessing the paints during Canvas update/draw. You can access them after calling sync(). + * @see Canvas::sync() + * + * @BETA_API + */ + std::list& paints() noexcept; + + /** + * @brief Passes drawing elements to the Canvas using Paint objects. + * + * Only pushed paints in the canvas will be drawing targets. + * They are retained by the canvas until you call Canvas::clear(). + * + * @param[in] paint A Paint object to be drawn. + * + * @retval Result::Success When succeed. + * @retval Result::MemoryCorruption In case a @c nullptr is passed as the argument. + * @retval Result::InsufficientCondition An internal error. + * + * @note The rendering order of the paints is the same as the order as they were pushed into the canvas. Consider sorting the paints before pushing them if you intend to use layering. + * @see Canvas::paints() + * @see Canvas::clear() + */ + virtual Result push(std::unique_ptr paint) noexcept; + + /** + * @brief Clear the internal canvas resources that used for the drawing. + * + * This API sets the total number of paints pushed into the canvas to zero. + * Depending on the value of the @p free argument, the paints are either freed or retained. + * So if you need to update paint properties while maintaining the existing scene structure, you can set @p free = false. + * + * @param[in] free If @c true, the memory occupied by paints is deallocated, otherwise it is not. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * + * @see Canvas::push() + * @see Canvas::paints() + */ + virtual Result clear(bool free = true) noexcept; + + /** + * @brief Request the canvas to update the paint objects. + * + * If a @c nullptr is passed all paint objects retained by the Canvas are updated, + * otherwise only the paint to which the given @p paint points. + * + * @param[in] paint A pointer to the Paint object or @c nullptr. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * + * @note The Update behavior can be asynchronous if the assigned thread number is greater than zero. + */ + virtual Result update(Paint* paint = nullptr) noexcept; + + /** + * @brief Requests the canvas to draw the Paint objects. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * + * @note Drawing can be asynchronous if the assigned thread number is greater than zero. To guarantee the drawing is done, call sync() afterwards. + * @see Canvas::sync() + */ + virtual Result draw() noexcept; + + /** + * @brief Guarantees that drawing task is finished. + * + * The Canvas rendering can be performed asynchronously. To make sure that rendering is finished, + * the sync() must be called after the draw() regardless of threading. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + * @see Canvas::draw() + */ + virtual Result sync() noexcept; + + _TVG_DECLARE_PRIVATE(Canvas); +}; + + +/** + * @class LinearGradient + * + * @brief A class representing the linear gradient fill of the Shape object. + * + * Besides the APIs inherited from the Fill class, it enables setting and getting the linear gradient bounds. + * The behavior outside the gradient bounds depends on the value specified in the spread API. + */ +class TVG_API LinearGradient final : public Fill +{ +public: + ~LinearGradient(); + + /** + * @brief Sets the linear gradient bounds. + * + * The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing + * the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking + * (@p x1, @p y1) and (@p x2, @p y2). + * + * @param[in] x1 The horizontal coordinate of the first point used to determine the gradient bounds. + * @param[in] y1 The vertical coordinate of the first point used to determine the gradient bounds. + * @param[in] x2 The horizontal coordinate of the second point used to determine the gradient bounds. + * @param[in] y2 The vertical coordinate of the second point used to determine the gradient bounds. + * + * @return Result::Success when succeed. + * + * @note In case the first and the second points are equal, an object filled with such a gradient fill is not rendered. + */ + Result linear(float x1, float y1, float x2, float y2) noexcept; + + /** + * @brief Gets the linear gradient bounds. + * + * The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing + * the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking + * (@p x1, @p y1) and (@p x2, @p y2). + * + * @param[out] x1 The horizontal coordinate of the first point used to determine the gradient bounds. + * @param[out] y1 The vertical coordinate of the first point used to determine the gradient bounds. + * @param[out] x2 The horizontal coordinate of the second point used to determine the gradient bounds. + * @param[out] y2 The vertical coordinate of the second point used to determine the gradient bounds. + * + * @return Result::Success when succeed. + */ + Result linear(float* x1, float* y1, float* x2, float* y2) const noexcept; + + /** + * @brief Creates a new LinearGradient object. + * + * @return A new LinearGradient object. + */ + static std::unique_ptr gen() noexcept; + + /** + * @brief Return the unique id value of this class. + * + * This method can be referred for identifying the LinearGradient class type. + * + * @return The type id of the LinearGradient class. + */ + static uint32_t identifier() noexcept; + + _TVG_DECLARE_PRIVATE(LinearGradient); +}; + + +/** + * @class RadialGradient + * + * @brief A class representing the radial gradient fill of the Shape object. + * + */ +class TVG_API RadialGradient final : public Fill +{ +public: + ~RadialGradient(); + + /** + * @brief Sets the radial gradient bounds. + * + * The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. + * + * @param[in] cx The horizontal coordinate of the center of the bounding circle. + * @param[in] cy The vertical coordinate of the center of the bounding circle. + * @param[in] radius The radius of the bounding circle. + * + * @return Result::Success when succeed, Result::InvalidArguments in case the @p radius value is zero or less. + */ + Result radial(float cx, float cy, float radius) noexcept; + + /** + * @brief Gets the radial gradient bounds. + * + * The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. + * + * @param[out] cx The horizontal coordinate of the center of the bounding circle. + * @param[out] cy The vertical coordinate of the center of the bounding circle. + * @param[out] radius The radius of the bounding circle. + * + * @return Result::Success when succeed. + */ + Result radial(float* cx, float* cy, float* radius) const noexcept; + + /** + * @brief Creates a new RadialGradient object. + * + * @return A new RadialGradient object. + */ + static std::unique_ptr gen() noexcept; + + /** + * @brief Return the unique id value of this class. + * + * This method can be referred for identifying the RadialGradient class type. + * + * @return The type id of the RadialGradient class. + */ + static uint32_t identifier() noexcept; + + _TVG_DECLARE_PRIVATE(RadialGradient); +}; + + +/** + * @class Shape + * + * @brief A class representing two-dimensional figures and their properties. + * + * A shape has three major properties: shape outline, stroking, filling. The outline in the Shape is retained as the path. + * Path can be composed by accumulating primitive commands such as moveTo(), lineTo(), cubicTo(), or complete shape interfaces such as appendRect(), appendCircle(), etc. + * Path can consists of sub-paths. One sub-path is determined by a close command. + * + * The stroke of Shape is an optional property in case the Shape needs to be represented with/without the outline borders. + * It's efficient since the shape path and the stroking path can be shared with each other. It's also convenient when controlling both in one context. + */ +class TVG_API Shape final : public Paint +{ +public: + ~Shape(); + + /** + * @brief Resets the properties of the shape path. + * + * The transformation matrix, the color, the fill and the stroke properties are retained. + * + * @return Result::Success when succeed. + * + * @note The memory, where the path data is stored, is not deallocated at this stage for caching effect. + */ + Result reset() noexcept; + + /** + * @brief Sets the initial point of the sub-path. + * + * The value of the current point is set to the given point. + * + * @param[in] x The horizontal coordinate of the initial point of the sub-path. + * @param[in] y The vertical coordinate of the initial point of the sub-path. + * + * @return Result::Success when succeed. + */ + Result moveTo(float x, float y) noexcept; + + /** + * @brief Adds a new point to the sub-path, which results in drawing a line from the current point to the given end-point. + * + * The value of the current point is set to the given end-point. + * + * @param[in] x The horizontal coordinate of the end-point of the line. + * @param[in] y The vertical coordinate of the end-point of the line. + * + * @return Result::Success when succeed. + * + * @note In case this is the first command in the path, it corresponds to the moveTo() call. + */ + Result lineTo(float x, float y) noexcept; + + /** + * @brief Adds new points to the sub-path, which results in drawing a cubic Bezier curve starting + * at the current point and ending at the given end-point (@p x, @p y) using the control points (@p cx1, @p cy1) and (@p cx2, @p cy2). + * + * The value of the current point is set to the given end-point. + * + * @param[in] cx1 The horizontal coordinate of the 1st control point. + * @param[in] cy1 The vertical coordinate of the 1st control point. + * @param[in] cx2 The horizontal coordinate of the 2nd control point. + * @param[in] cy2 The vertical coordinate of the 2nd control point. + * @param[in] x The horizontal coordinate of the end-point of the curve. + * @param[in] y The vertical coordinate of the end-point of the curve. + * + * @return Result::Success when succeed. + * + * @note In case this is the first command in the path, no data from the path are rendered. + */ + Result cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept; + + /** + * @brief Closes the current sub-path by drawing a line from the current point to the initial point of the sub-path. + * + * The value of the current point is set to the initial point of the closed sub-path. + * + * @return Result::Success when succeed. + * + * @note In case the sub-path does not contain any points, this function has no effect. + */ + Result close() noexcept; + + /** + * @brief Appends a rectangle to the path. + * + * The rectangle with rounded corners can be achieved by setting non-zero values to @p rx and @p ry arguments. + * The @p rx and @p ry values specify the radii of the ellipse defining the rounding of the corners. + * + * The position of the rectangle is specified by the coordinates of its upper left corner - @p x and @p y arguments. + * + * The rectangle is treated as a new sub-path - it is not connected with the previous sub-path. + * + * The value of the current point is set to (@p x + @p rx, @p y) - in case @p rx is greater + * than @p w/2 the current point is set to (@p x + @p w/2, @p y) + * + * @param[in] x The horizontal coordinate of the upper left corner of the rectangle. + * @param[in] y The vertical coordinate of the upper left corner of the rectangle. + * @param[in] w The width of the rectangle. + * @param[in] h The height of the rectangle. + * @param[in] rx The x-axis radius of the ellipse defining the rounded corners of the rectangle. + * @param[in] ry The y-axis radius of the ellipse defining the rounded corners of the rectangle. + * + * @return Result::Success when succeed. + * + * @note For @p rx and @p ry greater than or equal to the half of @p w and the half of @p h, respectively, the shape become an ellipse. + */ + Result appendRect(float x, float y, float w, float h, float rx = 0, float ry = 0) noexcept; + + /** + * @brief Appends an ellipse to the path. + * + * The position of the ellipse is specified by the coordinates of its center - @p cx and @p cy arguments. + * + * The ellipse is treated as a new sub-path - it is not connected with the previous sub-path. + * + * The value of the current point is set to (@p cx, @p cy - @p ry). + * + * @param[in] cx The horizontal coordinate of the center of the ellipse. + * @param[in] cy The vertical coordinate of the center of the ellipse. + * @param[in] rx The x-axis radius of the ellipse. + * @param[in] ry The y-axis radius of the ellipse. + * + * @return Result::Success when succeed. + */ + Result appendCircle(float cx, float cy, float rx, float ry) noexcept; + + /** + * @brief Appends a circular arc to the path. + * + * The arc is treated as a new sub-path - it is not connected with the previous sub-path. + * The current point value is set to the end-point of the arc in case @p pie is @c false, and to the center of the arc otherwise. + * + * @param[in] cx The horizontal coordinate of the center of the arc. + * @param[in] cy The vertical coordinate of the center of the arc. + * @param[in] radius The radius of the arc. + * @param[in] startAngle The start angle of the arc given in degrees, measured counter-clockwise from the horizontal line. + * @param[in] sweep The central angle of the arc given in degrees, measured counter-clockwise from @p startAngle. + * @param[in] pie Specifies whether to draw radii from the arc's center to both of its end-point - drawn if @c true. + * + * @return Result::Success when succeed. + * + * @note Setting @p sweep value greater than 360 degrees, is equivalent to calling appendCircle(cx, cy, radius, radius). + */ + Result appendArc(float cx, float cy, float radius, float startAngle, float sweep, bool pie) noexcept; + + /** + * @brief Appends a given sub-path to the path. + * + * The current point value is set to the last point from the sub-path. + * For each command from the @p cmds array, an appropriate number of points in @p pts array should be specified. + * If the number of points in the @p pts array is different than the number required by the @p cmds array, the shape with this sub-path will not be displayed on the screen. + * + * @param[in] cmds The array of the commands in the sub-path. + * @param[in] cmdCnt The number of the sub-path's commands. + * @param[in] pts The array of the two-dimensional points. + * @param[in] ptsCnt The number of the points in the @p pts array. + * + * @return Result::Success when succeed, Result::InvalidArguments otherwise. + * + * @note The interface is designed for optimal path setting if the caller has a completed path commands already. + */ + Result appendPath(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) noexcept; + + /** + * @brief Sets the stroke width for all of the figures from the path. + * + * @param[in] width The width of the stroke. The default value is 0. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result stroke(float width) noexcept; + + /** + * @brief Sets the color of the stroke for all of the figures from the path. + * + * @param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result stroke(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) noexcept; + + /** + * @brief Sets the gradient fill of the stroke for all of the figures from the path. + * + * @param[in] f The gradient fill. + * + * @retval Result::Success When succeed. + * @retval Result::FailedAllocation An internal error with a memory allocation for an object to be filled. + * @retval Result::MemoryCorruption In case a @c nullptr is passed as the argument. + */ + Result stroke(std::unique_ptr f) noexcept; + + /** + * @brief Sets the dash pattern of the stroke. + * + * @param[in] dashPattern The array of consecutive pair values of the dash length and the gap length. + * @param[in] cnt The length of the @p dashPattern array. + * + * @retval Result::Success When succeed. + * @retval Result::FailedAllocation An internal error with a memory allocation for an object to be dashed. + * @retval Result::InvalidArguments In case @p dashPattern is @c nullptr and @p cnt > 0, @p cnt is zero, any of the dash pattern values is zero or less. + * + * @note To reset the stroke dash pattern, pass @c nullptr to @p dashPattern and zero to @p cnt. + * @warning @p cnt must be greater than 1 if the dash pattern is valid. + */ + Result stroke(const float* dashPattern, uint32_t cnt) noexcept; + + /** + * @brief Sets the cap style of the stroke in the open sub-paths. + * + * @param[in] cap The cap style value. The default value is @c StrokeCap::Square. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result stroke(StrokeCap cap) noexcept; + + /** + * @brief Sets the join style for stroked path segments. + * + * The join style is used for joining the two line segment while stroking the path. + * + * @param[in] join The join style value. The default value is @c StrokeJoin::Bevel. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + Result stroke(StrokeJoin join) noexcept; + + + /** + * @brief Sets the stroke miterlimit. + * + * @param[in] miterlimit The miterlimit imposes a limit on the extent of the stroke join, when the @c StrokeJoin::Miter join style is set. The default value is 4. + * + * @return Result::Success when succeed, Result::NonSupport unsupported value, Result::FailedAllocation otherwise. + * + * @since 0.11 + */ + Result strokeMiterlimit(float miterlimit) noexcept; + + /** + * @brief Sets the solid color for all of the figures from the path. + * + * The parts of the shape defined as inner are colored. + * + * @param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. + * @param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. + * + * @return Result::Success when succeed. + * + * @note Either a solid color or a gradient fill is applied, depending on what was set as last. + * @note ClipPath won't use the fill values. (see: enum class CompositeMethod::ClipPath) + */ + Result fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) noexcept; + + /** + * @brief Sets the gradient fill for all of the figures from the path. + * + * The parts of the shape defined as inner are filled. + * + * @param[in] f The unique pointer to the gradient fill. + * + * @return Result::Success when succeed, Result::MemoryCorruption otherwise. + * + * @note Either a solid color or a gradient fill is applied, depending on what was set as last. + */ + Result fill(std::unique_ptr f) noexcept; + + /** + * @brief Sets the fill rule for the Shape object. + * + * @param[in] r The fill rule value. The default value is @c FillRule::Winding. + * + * @return Result::Success when succeed. + */ + Result fill(FillRule r) noexcept; + + + /** + * @brief Sets the rendering order of the stroke and the fill. + * + * @param[in] strokeFirst If @c true the stroke is rendered before the fill, otherwise the stroke is rendered as the second one (the default option). + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + * + * @since 0.10 + */ + Result order(bool strokeFirst) noexcept; + + + /** + * @brief Gets the commands data of the path. + * + * @param[out] cmds The pointer to the array of the commands from the path. + * + * @return The length of the @p cmds array when succeed, zero otherwise. + */ + uint32_t pathCommands(const PathCommand** cmds) const noexcept; + + /** + * @brief Gets the points values of the path. + * + * @param[out] pts The pointer to the array of the two-dimensional points from the path. + * + * @return The length of the @p pts array when succeed, zero otherwise. + */ + uint32_t pathCoords(const Point** pts) const noexcept; + + /** + * @brief Gets the pointer to the gradient fill of the shape. + * + * @return The pointer to the gradient fill of the stroke when succeed, @c nullptr in case no fill was set. + */ + const Fill* fill() const noexcept; + + /** + * @brief Gets the solid color of the shape. + * + * @param[out] r The red color channel value in the range [0 ~ 255]. + * @param[out] g The green color channel value in the range [0 ~ 255]. + * @param[out] b The blue color channel value in the range [0 ~ 255]. + * @param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. + * + * @return Result::Success when succeed. + */ + Result fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a = nullptr) const noexcept; + + /** + * @brief Gets the fill rule value. + * + * @return The fill rule value of the shape. + */ + FillRule fillRule() const noexcept; + + /** + * @brief Gets the stroke width. + * + * @return The stroke width value when succeed, zero if no stroke was set. + */ + float strokeWidth() const noexcept; + + /** + * @brief Gets the color of the shape's stroke. + * + * @param[out] r The red color channel value in the range [0 ~ 255]. + * @param[out] g The green color channel value in the range [0 ~ 255]. + * @param[out] b The blue color channel value in the range [0 ~ 255]. + * @param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + */ + Result strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a = nullptr) const noexcept; + + /** + * @brief Gets the pointer to the gradient fill of the stroke. + * + * @return The pointer to the gradient fill of the stroke when succeed, @c nullptr otherwise. + */ + const Fill* strokeFill() const noexcept; + + /** + * @brief Gets the dash pattern of the stroke. + * + * @param[out] dashPattern The pointer to the memory, where the dash pattern array is stored. + * + * @return The length of the @p dashPattern array. + */ + uint32_t strokeDash(const float** dashPattern) const noexcept; + + /** + * @brief Gets the cap style used for stroking the path. + * + * @return The cap style value of the stroke. + */ + StrokeCap strokeCap() const noexcept; + + /** + * @brief Gets the join style value used for stroking the path. + * + * @return The join style value of the stroke. + */ + StrokeJoin strokeJoin() const noexcept; + + /** + * @brief Gets the stroke miterlimit. + * + * @return The stroke miterlimit value when succeed, 4 if no stroke was set. + * + * @since 0.11 + */ + float strokeMiterlimit() const noexcept; + + /** + * @brief Creates a new Shape object. + * + * @return A new Shape object. + */ + static std::unique_ptr gen() noexcept; + + /** + * @brief Return the unique id value of this class. + * + * This method can be referred for identifying the Shape class type. + * + * @return The type id of the Shape class. + */ + static uint32_t identifier() noexcept; + + _TVG_DECLARE_PRIVATE(Shape); +}; + + +/** + * @class Picture + * + * @brief A class representing an image read in one of the supported formats: raw, svg, png, jpg, lottie(json) and etc. + * Besides the methods inherited from the Paint, it provides methods to load & draw images on the canvas. + * + * @note Supported formats are depended on the available TVG loaders. + * @note See Animation class if the picture data is animatable. + */ +class TVG_API Picture final : public Paint +{ +public: + ~Picture(); + + /** + * @brief Loads a picture data directly from a file. + * + * @param[in] path A path to the picture file. + * + * @retval Result::Success When succeed. + * @retval Result::InvalidArguments In case the @p path is invalid. + * @retval Result::NonSupport When trying to load a file with an unknown extension. + * @retval Result::Unknown If an error occurs at a later stage. + * + * @note The Load behavior can be asynchronous if the assigned thread number is greater than zero. + * @see Initializer::init() + */ + Result load(const std::string& path) noexcept; + + /** + * @brief Loads a picture data from a memory block of a given size. + * + * @param[in] data A pointer to a memory location where the content of the picture file is stored. + * @param[in] size The size in bytes of the memory occupied by the @p data. + * @param[in] copy Decides whether the data should be copied into the engine local buffer. + * + * @retval Result::Success When succeed. + * @retval Result::InvalidArguments In case no data are provided or the @p size is zero or less. + * @retval Result::NonSupport When trying to load a file with an unknown extension. + * @retval Result::Unknown If an error occurs at a later stage. + * + * @warning: you have responsibility to release the @p data memory if the @p copy is true + * @deprecated Use load(const char* data, uint32_t size, const std::string& mimeType, bool copy) instead. + * @see Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept + */ + TVG_DEPRECATED Result load(const char* data, uint32_t size, bool copy = false) noexcept; + + /** + * @brief Loads a picture data from a memory block of a given size. + * + * @param[in] data A pointer to a memory location where the content of the picture file is stored. + * @param[in] size The size in bytes of the memory occupied by the @p data. + * @param[in] mimeType Mimetype or extension of data such as "jpg", "jpeg", "lottie", "svg", "svg+xml", "png", etc. In case an empty string or an unknown type is provided, the loaders will be tried one by one. + * @param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. + * + * @retval Result::Success When succeed. + * @retval Result::InvalidArguments In case no data are provided or the @p size is zero or less. + * @retval Result::NonSupport When trying to load a file with an unknown extension. + * @retval Result::Unknown If an error occurs at a later stage. + * + * @warning: It's the user responsibility to release the @p data memory if the @p copy is @c true. + * + * @note If you are unsure about the MIME type, you can provide an empty value like @c "", and thorvg will attempt to figure it out. + * @since 0.5 + */ + Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept; + + /** + * @brief Resizes the picture content to the given width and height. + * + * The picture content is resized while keeping the default size aspect ratio. + * The scaling factor is established for each of dimensions and the smaller value is applied to both of them. + * + * @param[in] w A new width of the image in pixels. + * @param[in] h A new height of the image in pixels. + * + * @return Result::Success when succeed, Result::InsufficientCondition otherwise. + */ + Result size(float w, float h) noexcept; + + /** + * @brief Gets the size of the image. + * + * @param[out] w The width of the image in pixels. + * @param[out] h The height of the image in pixels. + * + * @return Result::Success when succeed. + */ + Result size(float* w, float* h) const noexcept; + + /** + * @brief Loads a raw data from a memory block with a given size. + * + * @retval Result::Success When succeed, Result::InsufficientCondition otherwise. + * @retval Result::FailedAllocation An internal error possibly with memory allocation. + * + * @since 0.9 + */ + Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept; + + /** + * @brief Sets or removes the triangle mesh to deform the image. + * + * If a mesh is provided, the transform property of the Picture will apply to the triangle mesh, and the + * image data will be used as the texture. + * + * If @p triangles is @c nullptr, or @p triangleCnt is 0, the mesh will be removed. + * + * Only raster image types are supported at this time (png, jpg). Vector types like svg and tvg do not support. + * mesh deformation. However, if required you should be able to render a vector image to a raster image and then apply a mesh. + * + * @param[in] triangles An array of Polygons(triangles) that make up the mesh, or null to remove the mesh. + * @param[in] triangleCnt The number of Polygons(triangles) provided, or 0 to remove the mesh. + * + * @retval Result::Success When succeed. + * @retval Result::Unknown If fails + * + * @note The Polygons are copied internally, so modifying them after calling Mesh::mesh has no affect. + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + Result mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept; + + /** + * @brief Return the number of triangles in the mesh, and optionally get a pointer to the array of triangles in the mesh. + * + * @param[out] triangles Optional. A pointer to the array of Polygons used by this mesh. + * + * @return uint32_t The number of polygons in the array. + * + * @note Modifying the triangles returned by this method will modify them directly within the mesh. + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + uint32_t mesh(const Polygon** triangles) const noexcept; + + /** + * @brief Creates a new Picture object. + * + * @return A new Picture object. + */ + static std::unique_ptr gen() noexcept; + + /** + * @brief Return the unique id value of this class. + * + * This method can be referred for identifying the Picture class type. + * + * @return The type id of the Picture class. + */ + static uint32_t identifier() noexcept; + + _TVG_DECLARE_ACCESSOR(Animation); + _TVG_DECLARE_PRIVATE(Picture); +}; + + +/** + * @class Scene + * + * @brief A class to composite children paints. + * + * As the traditional graphics rendering method, TVG also enables scene-graph mechanism. + * This feature supports an array function for managing the multiple paints as one group paint. + * + * As a group, the scene can be transformed, made translucent and composited with other target paints, + * its children will be affected by the scene world. + */ +class TVG_API Scene final : public Paint +{ +public: + ~Scene(); + + /** + * @brief Passes drawing elements to the Scene using Paint objects. + * + * Only the paints pushed into the scene will be the drawn targets. + * The paints are retained by the scene until Scene::clear() is called. + * + * @param[in] paint A Paint object to be drawn. + * + * @return Result::Success when succeed, Result::MemoryCorruption otherwise. + * + * @note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. + * @see Scene::paints() + * @see Scene::clear() + */ + Result push(std::unique_ptr paint) noexcept; + + /** + * @brief Sets the size of the container, where all the paints pushed into the Scene are stored. + * + * If the number of objects pushed into the scene is known in advance, calling the function + * prevents multiple memory reallocation, thus improving the performance. + * + * @param[in] size The number of objects for which the memory is to be reserved. + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + */ + TVG_DEPRECATED Result reserve(uint32_t size) noexcept; + + /** + * @brief Returns the list of the paints that currently held by the Scene. + * + * This function provides the list of paint nodes, allowing users a direct opportunity to modify the scene tree. + * + * @warning Please avoid accessing the paints during Scene update/draw. You can access them after calling Canvas::sync(). + * @see Canvas::sync() + * @see Scene::push() + * @see Scene::clear() + * + * @BETA_API + */ + std::list& paints() noexcept; + + /** + * @brief Sets the total number of the paints pushed into the scene to be zero. + * Depending on the value of the @p free argument, the paints are freed or not. + * + * @param[in] free If @c true, the memory occupied by paints is deallocated, otherwise it is not. + * + * @return Result::Success when succeed + * + * @warning If you don't free the paints they become dangled. They are supposed to be reused, otherwise you are responsible for their lives. Thus please use the @p free argument only when you know how it works, otherwise it's not recommended. + * + * @since 0.2 + */ + Result clear(bool free = true) noexcept; + + /** + * @brief Creates a new Scene object. + * + * @return A new Scene object. + */ + static std::unique_ptr gen() noexcept; + + /** + * @brief Return the unique id value of this class. + * + * This method can be referred for identifying the Scene class type. + * + * @return The type id of the Scene class. + */ + static uint32_t identifier() noexcept; + + _TVG_DECLARE_PRIVATE(Scene); +}; + + +/** + * @class SwCanvas + * + * @brief A class for the rendering graphical elements with a software raster engine. + */ +class TVG_API SwCanvas final : public Canvas +{ +public: + ~SwCanvas(); + + /** + * @brief Enumeration specifying the methods of combining the 8-bit color channels into 32-bit color. + */ + enum Colorspace + { + ABGR8888 = 0, ///< The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. (a << 24 | b << 16 | g << 8 | r) + ARGB8888, ///< The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. (a << 24 | r << 16 | g << 8 | b) + ABGR8888S, ///< @BETA_API The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. + ARGB8888S, ///< @BETA_API The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. + }; + + /** + * @brief Enumeration specifying the methods of Memory Pool behavior policy. + * @since 0.4 + */ + enum MempoolPolicy + { + Default = 0, ///< Default behavior that ThorVG is designed to. + Shareable, ///< Memory Pool is shared among the SwCanvases. + Individual ///< Allocate designated memory pool that is only used by current instance. + }; + + /** + * @brief Sets the target buffer for the rasterization. + * + * The buffer of a desirable size should be allocated and owned by the caller. + * + * @param[in] buffer A pointer to a memory block of the size @p stride x @p h, where the raster data are stored. + * @param[in] stride The stride of the raster image - greater than or equal to @p w. + * @param[in] w The width of the raster image. + * @param[in] h The height of the raster image. + * @param[in] cs The value specifying the way the 32-bits colors should be read/written. + * + * @retval Result::Success When succeed. + * @retval Result::MemoryCorruption When casting in the internal function implementation failed. + * @retval Result::InvalidArguments In case no valid pointer is provided or the width, or the height or the stride is zero. + * @retval Result::NonSupport In case the software engine is not supported. + * + * @warning Do not access @p buffer during Canvas::draw() - Canvas::sync(). It should not be accessed while TVG is writing on it. + */ + Result target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Colorspace cs) noexcept; + + /** + * @brief Set sw engine memory pool behavior policy. + * + * Basically ThorVG draws a lot of shapes, it allocates/deallocates a few chunk of memory + * while processing rendering. It internally uses one shared memory pool + * which can be reused among the canvases in order to avoid memory overhead. + * + * Thus ThorVG suggests using a memory pool policy to satisfy user demands, + * if it needs to guarantee the thread-safety of the internal data access. + * + * @param[in] policy The method specifying the Memory Pool behavior. The default value is @c MempoolPolicy::Default. + * + * @retval Result::Success When succeed. + * @retval Result::InsufficientCondition If the canvas contains some paints already. + * @retval Result::NonSupport In case the software engine is not supported. + * + * @note When @c policy is set as @c MempoolPolicy::Individual, the current instance of canvas uses its own individual + * memory data, which is not shared with others. This is necessary when the canvas is accessed on a worker-thread. + * + * @warning It's not allowed after pushing any paints. + * + * @since 0.4 + */ + Result mempool(MempoolPolicy policy) noexcept; + + /** + * @brief Creates a new SwCanvas object. + * @return A new SwCanvas object. + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(SwCanvas); +}; + + +/** + * @class GlCanvas + * + * @brief A class for the rendering graphic elements with a GL raster engine. + * + * @warning Please do not use it. This class is not fully supported yet. + * + * @BETA_API + */ +class TVG_API GlCanvas final : public Canvas +{ +public: + ~GlCanvas(); + + /** + * @brief Sets the target buffer for the rasterization. + * + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + Result target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h) noexcept; + + /** + * @brief Creates a new GlCanvas object. + * + * @return A new GlCanvas object. + * + * @BETA_API + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(GlCanvas); +}; + + +/** + * @class WgCanvas + * + * @brief A class for the rendering graphic elements with a WebGPU raster engine. + * + * @warning Please do not use it. This class is not fully supported yet. + * + * @BETA_API + */ +class TVG_API WgCanvas final : public Canvas +{ +public: + ~WgCanvas(); + + /** + * @brief Sets the target window for the rasterization. + * + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + Result target(void* window, uint32_t w, uint32_t h) noexcept; + + /** + * @brief Creates a new WgCanvas object. + * + * @return A new WgCanvas object. + * + * @BETA_API + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(WgCanvas); +}; + + +/** + * @class Initializer + * + * @brief A class that enables initialization and termination of the TVG engines. + */ +class TVG_API Initializer final +{ +public: + /** + * @brief Initializes TVG engines. + * + * TVG requires the running-engine environment. + * TVG runs its own task-scheduler for parallelizing rendering tasks efficiently. + * You can indicate the number of threads, the count of which is designated @p threads. + * In the initialization step, TVG will generate/spawn the threads as set by @p threads count. + * + * @param[in] engine The engine types to initialize. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed. + * @param[in] threads The number of additional threads. Zero indicates only the main thread is to be used. + * + * @retval Result::Success When succeed. + * @retval Result::FailedAllocation An internal error possibly with memory allocation. + * @retval Result::InvalidArguments If unknown engine type chosen. + * @retval Result::NonSupport In case the engine type is not supported on the system. + * @retval Result::Unknown Others. + * + * @note The Initializer keeps track of the number of times it was called. Threads count is fixed at the first init() call. + * @see Initializer::term() + */ + static Result init(CanvasEngine engine, uint32_t threads) noexcept; + + /** + * @brief Terminates TVG engines. + * + * @param[in] engine The engine types to terminate. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed + * + * @retval Result::Success When succeed. + * @retval Result::InsufficientCondition In case there is nothing to be terminated. + * @retval Result::InvalidArguments If unknown engine type chosen. + * @retval Result::NonSupport In case the engine type is not supported on the system. + * @retval Result::Unknown Others. + * + * @note Initializer does own reference counting for multiple calls. + * @see Initializer::init() + */ + static Result term(CanvasEngine engine) noexcept; + + _TVG_DISABLE_CTOR(Initializer); +}; + + +/** + * @class Animation + * + * @brief The Animation class enables manipulation of animatable images. + * + * This class supports the display and control of animation frames. + * + * @BETA_API + */ + +class TVG_API Animation +{ +public: + ~Animation(); + + /** + * @brief Specifies the current frame in the animation. + * + * @param[in] no The index of the animation frame to be displayed. The index should be less than the totalFrame(). + * + * @retval Result::Success Successfully set the frame. + * @retval Result::InsufficientCondition No animatable data loaded from the Picture. + * @retval Result::NonSupport The Picture data does not support animations. + * + * @see totalFrame() + * + * @BETA_API + */ + Result frame(uint32_t no) noexcept; + + /** + * @brief Retrieves a picture instance associated with this animation instance. + * + * This function provides access to the picture instance that can be used to load animation formats, such as Lottie(json). + * After setting up the picture, it can be pushed to the designated canvas, enabling control over animation frames + * with this Animation instance. + * + * @return A picture instance that is tied to this animation. + * + * @warning The picture instance is owned by Animation. It should not be deleted manually. + * + * @BETA_API + */ + Picture* picture() const noexcept; + + /** + * @brief Retrieves the current frame number of the animation. + * + * @return The current frame number of the animation, between 0 and totalFrame() - 1. + * + * @note If the Picture is not properly configured, this function will return 0. + * + * @see Animation::frame(uint32_t no) + * @see Animation::totalFrame() + * + * @BETA_API + */ + uint32_t curFrame() const noexcept; + + /** + * @brief Retrieves the total number of frames in the animation. + * + * @return The total number of frames in the animation. + * + * @note Frame numbering starts from 0. + * @note If the Picture is not properly configured, this function will return 0. + * + * @BETA_API + */ + uint32_t totalFrame() const noexcept; + + /** + * @brief Retrieves the duration of the animation in seconds. + * + * @return The duration of the animation in seconds. + * + * @note If the Picture is not properly configured, this function will return 0. + * + * @BETA_API + */ + float duration() const noexcept; + + /** + * @brief Creates a new Animation object. + * + * @return A new Animation object. + * + * @BETA_API + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(Animation); +}; + + +/** + * @class Saver + * + * @brief A class for exporting a paint object into a specified file, from which to recover the paint data later. + * + * ThorVG provides a feature for exporting & importing paint data. The Saver role is to export the paint data to a file. + * It's useful when you need to save the composed scene or image from a paint object and recreate it later. + * + * The file format is decided by the extension name(i.e. "*.tvg") while the supported formats depend on the TVG packaging environment. + * If it doesn't support the file format, the save() method returns the @c Result::NonSuppport result. + * + * Once you export a paint to the file successfully, you can recreate it using the Picture class. + * + * @see Picture::load() + * + * @since 0.5 + */ +class TVG_API Saver final +{ +public: + ~Saver(); + + /** + * @brief Exports the given @p paint data to the given @p path + * + * If the saver module supports any compression mechanism, it will optimize the data size. + * This might affect the encoding/decoding time in some cases. You can turn off the compression + * if you wish to optimize for speed. + * + * @param[in] paint The paint to be saved with all its associated properties. + * @param[in] path A path to the file, in which the paint data is to be saved. + * @param[in] compress If @c true then compress data if possible. + * + * @retval Result::Success When succeed. + * @retval Result::InsufficientCondition If currently saving other resources. + * @retval Result::NonSupport When trying to save a file with an unknown extension or in an unsupported format. + * @retval Result::MemoryCorruption An internal error. + * @retval Result::Unknown In case an empty paint is to be saved. + * + * @note Saving can be asynchronous if the assigned thread number is greater than zero. To guarantee the saving is done, call sync() afterwards. + * @see Saver::sync() + * + * @since 0.5 + */ + Result save(std::unique_ptr paint, const std::string& path, bool compress = true) noexcept; + + /** + * @brief Guarantees that the saving task is finished. + * + * The behavior of the Saver works on a sync/async basis, depending on the threading setting of the Initializer. + * Thus, if you wish to have a benefit of it, you must call sync() after the save() in the proper delayed time. + * Otherwise, you can call sync() immediately. + * + * @retval Result::Success when succeed. + * @retval Result::InsufficientCondition otherwise. + * + * @note The asynchronous tasking is dependent on the Saver module implementation. + * @see Saver::save() + * + * @since 0.5 + */ + Result sync() noexcept; + + /** + * @brief Creates a new Saver object. + * + * @return A new Saver object. + * + * @since 0.5 + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(Saver); +}; + + +/** + * @class Accessor + * + * @brief The Accessor is a utility class to debug the Scene structure by traversing the scene-tree. + * + * The Accessor helps you search specific nodes to read the property information, figure out the structure of the scene tree and its size. + * + * @warning We strongly warn you not to change the paints of a scene unless you really know the design-structure. + * + * @since 0.10 + */ +class TVG_API Accessor final +{ +public: + ~Accessor(); + + /** + * @brief Set the access function for traversing the Picture scene tree nodes. + * + * @param[in] picture The picture node to traverse the internal scene-tree. + * @param[in] func The callback function calling for every paint nodes of the Picture. + * + * @return Return the given @p picture instance. + * + * @note The bitmap based picture might not have the scene-tree. + */ + std::unique_ptr set(std::unique_ptr picture, std::function func) noexcept; + + /** + * @brief Creates a new Accessor object. + * + * @return A new Accessor object. + */ + static std::unique_ptr gen() noexcept; + + _TVG_DECLARE_PRIVATE(Accessor); +}; + + +/** + * @brief The cast() function is a utility function used to cast a 'Paint' to type 'T'. + * @since 0.11 + */ +template +std::unique_ptr cast(Paint* paint) +{ + return std::unique_ptr(static_cast(paint)); +} + + +/** + * @brief The cast() function is a utility function used to cast a 'Fill' to type 'T'. + * @since 0.11 + */ +template +std::unique_ptr cast(Fill* fill) +{ + return std::unique_ptr(static_cast(fill)); +} + + +/** @}*/ + +} //namespace + +#endif //_THORVG_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/thorvg_capi.h b/libraries/lvgl/src/libs/thorvg/thorvg_capi.h new file mode 100644 index 0000000..c4db0cd --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/thorvg_capi.h @@ -0,0 +1,2334 @@ +/*! +* \file thorvg_capi.h +* +* \brief The module provides C bindings for the ThorVG library. +* Please refer to src/examples/Capi.cpp to find the thorvg_capi usage examples. +* +* The thorvg_capi module allows to implement the ThorVG client and provides +* the following functionalities: +* - drawing shapes: line, arc, curve, polygon, circle, user-defined, ... +* - filling: solid, linear and radial gradient +* - scene graph & affine transformation (translation, rotation, scale, ...) +* - stroking: width, join, cap, dash +* - composition: blending, masking, path clipping +* - pictures: SVG, PNG, JPG, bitmap +* +*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef __THORVG_CAPI_H__ +#define __THORVG_CAPI_H__ + +#include +#include + +#ifdef TVG_API + #undef TVG_API +#endif + +#ifndef TVG_STATIC + #ifdef _WIN32 + #if TVG_BUILD + #define TVG_API __declspec(dllexport) + #else + #define TVG_API __declspec(dllimport) + #endif + #elif (defined(__SUNPRO_C) || defined(__SUNPRO_CC)) + #define TVG_API __global + #else + #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__INTEL_COMPILER) + #define TVG_API __attribute__ ((visibility("default"))) + #else + #define TVG_API + #endif + #endif +#else + #define TVG_API +#endif + +#ifdef TVG_DEPRECATED + #undef TVG_DEPRECATED +#endif + +#ifdef _WIN32 + #define TVG_DEPRECATED __declspec(deprecated) +#elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + #define TVG_DEPRECATED __attribute__ ((__deprecated__)) +#else + #define TVG_DEPRECATED +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** +* \defgroup ThorVG_CAPI ThorVG_CAPI +* \brief ThorVG C language binding APIs. +* +* \{ +*/ + + +/** +* \brief A structure responsible for managing and drawing graphical elements. +* +* It sets up the target buffer, which can be drawn on the screen. It stores the Tvg_Paint objects (Shape, Scene, Picture). +*/ +typedef struct _Tvg_Canvas Tvg_Canvas; + + +/** +* \brief A structure representing a graphical element. +* +* \warning The TvgPaint objects can not be shared between Canvases. +*/ +typedef struct _Tvg_Paint Tvg_Paint; + + +/** +* \brief A structure representing a gradient fill of a Tvg_Paint object. +*/ +typedef struct _Tvg_Gradient Tvg_Gradient; + + +/** +* \brief A structure representing an object that enables to save a Tvg_Paint object into a file. +*/ +typedef struct _Tvg_Saver Tvg_Saver; + +/** +* \brief A structure representing an animation controller object. (BETA_API) +*/ +typedef struct _Tvg_Animation Tvg_Animation; + + +/** +* \brief Enumeration specifying the engine type used for the graphics backend. For multiple backends bitwise operation is allowed. +* +* \ingroup ThorVGCapi_Initializer +*/ +typedef enum { + TVG_ENGINE_SW = (1 << 1), ///< CPU rasterizer. + TVG_ENGINE_GL = (1 << 2) ///< OpenGL rasterizer. +} Tvg_Engine; + + +/** + * \brief Enumeration specifying the result from the APIs. + */ +typedef enum { + TVG_RESULT_SUCCESS = 0, ///< The value returned in case of a correct request execution. + TVG_RESULT_INVALID_ARGUMENT, ///< The value returned in the event of a problem with the arguments given to the API - e.g. empty paths or null pointers. + TVG_RESULT_INSUFFICIENT_CONDITION, ///< The value returned in case the request cannot be processed - e.g. asking for properties of an object, which does not exist. + TVG_RESULT_FAILED_ALLOCATION, ///< The value returned in case of unsuccessful memory allocation. + TVG_RESULT_MEMORY_CORRUPTION, ///< The value returned in the event of bad memory handling - e.g. failing in pointer releasing or casting + TVG_RESULT_NOT_SUPPORTED, ///< The value returned in case of choosing unsupported options. + TVG_RESULT_UNKNOWN ///< The value returned in all other cases. +} Tvg_Result; + + +/** + * \brief Enumeration indicating the method used in the composition of two objects - the target and the source. + * + * \ingroup ThorVGCapi_Paint + */ +typedef enum { + TVG_COMPOSITE_METHOD_NONE = 0, ///< No composition is applied. + TVG_COMPOSITE_METHOD_CLIP_PATH, ///< The intersection of the source and the target is determined and only the resulting pixels from the source are rendered. + TVG_COMPOSITE_METHOD_ALPHA_MASK, ///< The pixels of the source and the target are alpha blended. As a result, only the part of the source, which intersects with the target is visible. + TVG_COMPOSITE_METHOD_INVERSE_ALPHA_MASK, ///< The pixels of the source and the complement to the target's pixels are alpha blended. As a result, only the part of the source which is not covered by the target is visible. + TVG_COMPOSITE_METHOD_LUMA_MASK, ///< The source pixels are converted to grayscale (luma value) and alpha blended with the target. As a result, only the part of the source which intersects with the target is visible. \since 0.9 + TVG_COMPOSITE_METHOD_INVERSE_LUMA_MASK ///< The source pixels are converted to grayscale (luma value) and complement to the target's pixels are alpha blended. As a result, only the part of the source which is not covered by the target is visible. \BETA_API +} Tvg_Composite_Method; + +/** + * @brief Enumeration indicates the method used for blending paint. Please refer to the respective formulas for each method. + * + * \ingroup ThorVGCapi_Paint + * + * @BETA_API + */ +typedef enum { + TVG_BLEND_METHOD_NORMAL = 0, ///< Perform the alpha blending(default). S if (Sa == 255), otherwise (Sa * S) + (255 - Sa) * D + TVG_BLEND_METHOD_ADD, ///< Simply adds pixel values of one layer with the other. (S + D) + TVG_BLEND_METHOD_SCREEN, ///< The values of the pixels in the two layers are inverted, multiplied, and then inverted again. (S + D) - (S * D) + TVG_BLEND_METHOD_MULTIPLY, ///< Takes the RGB channel values from 0 to 255 of each pixel in the top layer and multiples them with the values for the corresponding pixel from the bottom layer. (S * D) + TVG_BLEND_METHOD_OVERLAY, ///< Combines Multiply and Screen blend modes. (2 * S * D) if (2 * D < Da), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) + TVG_BLEND_METHOD_DIFFERENCE, ///< Subtracts the bottom layer from the top layer or the other way around, to always get a non-negative value. (S - D) if (S > D), otherwise (D - S) + TVG_BLEND_METHOD_EXCLUSION, ///< The result is twice the product of the top and bottom layers, subtracted from their sum. s + d - (2 * s * d) + TVG_BLEND_METHOD_SRCOVER, ///< Replace the bottom layer with the top layer. + TVG_BLEND_METHOD_DARKEN, ///< Creates a pixel that retains the smallest components of the top and bottom layer pixels. min(S, D) + TVG_BLEND_METHOD_LIGHTEN, ///< Only has the opposite action of Darken Only. max(S, D) + TVG_BLEND_METHOD_COLORDODGE, ///< Divides the bottom layer by the inverted top layer. D / (255 - S) + TVG_BLEND_METHOD_COLORBURN, ///< Divides the inverted bottom layer by the top layer, and then inverts the result. 255 - (255 - D) / S + TVG_BLEND_METHOD_HARDLIGHT, ///< The same as Overlay but with the color roles reversed. (2 * S * D) if (S < Sa), otherwise (Sa * Da) - 2 * (Da - S) * (Sa - D) + TVG_BLEND_METHOD_SOFTLIGHT ///< The same as Overlay but with applying pure black or white does not result in pure black or white. (1 - 2 * S) * (D ^ 2) + (2 * S * D) +} Tvg_Blend_Method; + + +/** + * \brief Enumeration indicating the ThorVG class type. + * + * \ingroup ThorVGCapi_Paint + * + * \since 0.9 + */ +typedef enum { + TVG_IDENTIFIER_UNDEF = 0, ///< Undefined type. + TVG_IDENTIFIER_SHAPE, ///< A shape type paint. + TVG_IDENTIFIER_SCENE, ///< A scene type paint. + TVG_IDENTIFIER_PICTURE, ///< A picture type paint. + TVG_IDENTIFIER_LINEAR_GRAD, ///< A linear gradient type. + TVG_IDENTIFIER_RADIAL_GRAD ///< A radial gradient type. +} Tvg_Identifier; + + +/** + * \addtogroup ThorVGCapi_Shape + * \{ + */ + +/** + * \brief Enumeration specifying the values of the path commands accepted by TVG. + * + * Not to be confused with the path commands from the svg path element (like M, L, Q, H and many others). + * TVG interprets all of them and translates to the ones from the PathCommand values. + */ +typedef enum { + TVG_PATH_COMMAND_CLOSE = 0, ///< Ends the current sub-path and connects it with its initial point - corresponds to Z command in the svg path commands. + TVG_PATH_COMMAND_MOVE_TO, ///< Sets a new initial point of the sub-path and a new current point - corresponds to M command in the svg path commands. + TVG_PATH_COMMAND_LINE_TO, ///< Draws a line from the current point to the given point and sets a new value of the current point - corresponds to L command in the svg path commands. + TVG_PATH_COMMAND_CUBIC_TO ///< Draws a cubic Bezier curve from the current point to the given point using two given control points and sets a new value of the current point - corresponds to C command in the svg path commands. +} Tvg_Path_Command; + + +/** + * \brief Enumeration determining the ending type of a stroke in the open sub-paths. + */ +typedef enum { + TVG_STROKE_CAP_SQUARE = 0, ///< The stroke is extended in both endpoints of a sub-path by a rectangle, with the width equal to the stroke width and the length equal to the half of the stroke width. For zero length sub-paths the square is rendered with the size of the stroke width. + TVG_STROKE_CAP_ROUND, ///< The stroke is extended in both endpoints of a sub-path by a half circle, with a radius equal to the half of a stroke width. For zero length sub-paths a full circle is rendered. + TVG_STROKE_CAP_BUTT ///< The stroke ends exactly at each of the two endpoints of a sub-path. For zero length sub-paths no stroke is rendered. +} Tvg_Stroke_Cap; + + +/** + * \brief Enumeration specifying how to fill the area outside the gradient bounds. + */ +typedef enum { + TVG_STROKE_JOIN_BEVEL = 0, ///< The outer corner of the joined path segments is bevelled at the join point. The triangular region of the corner is enclosed by a straight line between the outer corners of each stroke. + TVG_STROKE_JOIN_ROUND, ///< The outer corner of the joined path segments is rounded. The circular region is centered at the join point. + TVG_STROKE_JOIN_MITER ///< The outer corner of the joined path segments is spiked. The spike is created by extension beyond the join point of the outer edges of the stroke until they intersect. In case the extension goes beyond the limit, the join style is converted to the Bevel style. +} Tvg_Stroke_Join; + + +/** + * \brief Enumeration specifying how to fill the area outside the gradient bounds. + */ +typedef enum { + TVG_STROKE_FILL_PAD = 0, ///< The remaining area is filled with the closest stop color. + TVG_STROKE_FILL_REFLECT, ///< The gradient pattern is reflected outside the gradient area until the expected region is filled. + TVG_STROKE_FILL_REPEAT ///< The gradient pattern is repeated continuously beyond the gradient area until the expected region is filled. +} Tvg_Stroke_Fill; + + +/** + * \brief Enumeration specifying the algorithm used to establish which parts of the shape are treated as the inside of the shape. + */ +typedef enum { + TVG_FILL_RULE_WINDING = 0, ///< A line from the point to a location outside the shape is drawn. The intersections of the line with the path segment of the shape are counted. Starting from zero, if the path segment of the shape crosses the line clockwise, one is added, otherwise one is subtracted. If the resulting sum is non zero, the point is inside the shape. + TVG_FILL_RULE_EVEN_ODD ///< A line from the point to a location outside the shape is drawn and its intersections with the path segments of the shape are counted. If the number of intersections is an odd number, the point is inside the shape. +} Tvg_Fill_Rule; + +/** \} */ // end addtogroup ThorVGCapi_Shape + + +/*! +* \addtogroup ThorVGCapi_Gradient +* \{ +*/ + +/*! +* \brief A data structure storing the information about the color and its relative position inside the gradient bounds. +*/ +typedef struct +{ + float offset; /**< The relative position of the color. */ + uint8_t r; /**< The red color channel value in the range [0 ~ 255]. */ + uint8_t g; /**< The green color channel value in the range [0 ~ 255]. */ + uint8_t b; /**< The blue color channel value in the range [0 ~ 255]. */ + uint8_t a; /**< The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. */ +} Tvg_Color_Stop; + +/** \} */ // end addtogroup ThorVGCapi_Gradient + + +/** + * \brief A data structure representing a point in two-dimensional space. + */ +typedef struct +{ + float x, y; +} Tvg_Point; + + +/** + * \brief A data structure representing a three-dimensional matrix. + * + * The elements e11, e12, e21 and e22 represent the rotation matrix, including the scaling factor. + * The elements e13 and e23 determine the translation of the object along the x and y-axis, respectively. + * The elements e31 and e32 are set to 0, e33 is set to 1. + */ +typedef struct +{ + float e11, e12, e13; + float e21, e22, e23; + float e31, e32, e33; +} Tvg_Matrix; + + +/** +* \defgroup ThorVGCapi_Initializer Initializer +* \brief A module enabling initialization and termination of the TVG engines. +* +* \{ +*/ + +/************************************************************************/ +/* Engine API */ +/************************************************************************/ +/*! +* \brief Initializes TVG engines. +* +* TVG requires the running-engine environment. +* TVG runs its own task-scheduler for parallelizing rendering tasks efficiently. +* You can indicate the number of threads, the count of which is designated @p threads. +* In the initialization step, TVG will generate/spawn the threads as set by @p threads count. +* +* \code +* tvg_engine_init(TVG_ENGINE_SW, 0); //Initialize software renderer and use the main thread only +* \endcode +* +* \param[in] engine_method The engine types to initialize. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed. +* - TVG_ENGINE_SW: CPU rasterizer +* - TVG_ENGINE_GL: OpenGL rasterizer (not supported yet) +* \param[in] threads The number of additional threads used to perform rendering. Zero indicates only the main thread is to be used. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error possibly with memory allocation. +* \retval TVG_RESULT_INVALID_ARGUMENT Unknown engine type. +* \retval TVG_RESULT_NOT_SUPPORTED Unsupported engine type. +* \retval TVG_RESULT_UNKNOWN Other error. +* +* \note The Initializer keeps track of the number of times it was called. Threads count is fixed at the first init() call. +* \see tvg_engine_term() +* \see Tvg_Engine +*/ +TVG_API Tvg_Result tvg_engine_init(Tvg_Engine engine_method, unsigned threads); + + +/*! +* \brief Terminates TVG engines. +* +* It should be called in case of termination of the TVG client with the same engine types as were passed when tvg_engine_init() was called. +* +* \code +* tvg_engine_init(TVG_ENGINE_SW, 0); +* //define canvas and shapes, update shapes, general rendering calls +* tvg_engine_term(TVG_ENGINE_SW); +* \endcode +* +* \param engine_method The engine types to terminate. This is relative to the Canvas types, in which it will be used. For multiple backends bitwise operation is allowed +* - TVG_ENGINE_SW: CPU rasterizer +* - TVG_ENGINE_GL: OpenGL rasterizer (not supported yet) +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION Nothing to be terminated. +* \retval TVG_RESULT_INVALID_ARGUMENT Unknown engine type. +* \retval TVG_RESULT_NOT_SUPPORTED Unsupported engine type. +* \retval TVG_RESULT_UNKNOWN An internal error. +* +* \see tvg_engine_init() +* \see Tvg_Engine +*/ +TVG_API Tvg_Result tvg_engine_term(Tvg_Engine engine_method); + + +/** \} */ // end defgroup ThorVGCapi_Initializer + + +/** +* \defgroup ThorVGCapi_Canvas Canvas +* \brief A module for managing and drawing graphical elements. +* +* A canvas is an entity responsible for drawing the target. It sets up the drawing engine and the buffer, which can be drawn on the screen. It also manages given Paint objects. +* +* \note A Canvas behavior depends on the raster engine though the final content of the buffer is expected to be identical. +* \warning The Paint objects belonging to one Canvas can't be shared among multiple Canvases. +\{ +*/ + + +/** +* \defgroup ThorVGCapi_SwCanvas SwCanvas +* \ingroup ThorVGCapi_Canvas +* +* \brief A module for rendering the graphical elements using the software engine. +* +* \{ +*/ + +/************************************************************************/ +/* SwCanvas API */ +/************************************************************************/ + +/** + * \brief Enumeration specifying the methods of Memory Pool behavior policy. + */ +typedef enum { + TVG_MEMPOOL_POLICY_DEFAULT = 0, ///< Default behavior that ThorVG is designed to. + TVG_MEMPOOL_POLICY_SHAREABLE, ///< Memory Pool is shared among canvases. + TVG_MEMPOOL_POLICY_INDIVIDUAL ///< Allocate designated memory pool that is used only by the current canvas instance. +} Tvg_Mempool_Policy; + + +/** + * \brief Enumeration specifying the methods of combining the 8-bit color channels into 32-bit color. + */ +typedef enum { + TVG_COLORSPACE_ABGR8888 = 0, ///< The 8-bit color channels are combined into 32-bit color in the order: alpha, blue, green, red. + TVG_COLORSPACE_ARGB8888 ///< The 8-bit color channels are combined into 32-bit color in the order: alpha, red, green, blue. +} Tvg_Colorspace; + + +/*! +* \brief Creates a Canvas object. +* +* \code +* Tvg_Canvas *canvas = NULL; +* +* tvg_engine_init(TVG_ENGINE_SW, 4); +* canvas = tvg_swcanvas_create(); +* +* //set up the canvas buffer +* uint32_t *buffer = NULL; +* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); +* if (!buffer) return; +* +* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); +* +* //set up paints and add them into the canvas before drawing it +* +* tvg_canvas_destroy(canvas); +* tvg_engine_term(TVG_ENGINE_SW); +* \endcode +* +* \return A new Tvg_Canvas object. +*/ +TVG_API Tvg_Canvas* tvg_swcanvas_create(void); + + +/*! +* \brief Sets the buffer used in the rasterization process and defines the used colorspace. +* +* For optimisation reasons TVG does not allocate memory for the output buffer on its own. +* The buffer of a desirable size should be allocated and owned by the caller. +* +* \param[in] canvas The Tvg_Canvas object managing the @p buffer. +* \param[in] buffer A pointer to the allocated memory block of the size @p stride x @p h. +* \param[in] stride The stride of the raster image - in most cases same value as @p w. +* \param[in] w The width of the raster image. +* \param[in] h The height of the raster image. +* \param[in] cs The colorspace value defining the way the 32-bits colors should be read/written. +* - TVG_COLORSPACE_ABGR8888 +* - TVG_COLORSPACE_ARGB8888 +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_MEMORY_CORRUPTION Casting in the internal function implementation failed. +* \retval TVG_RESULT_INVALID_ARGUMENTS An invalid canvas or buffer pointer passed or one of the @p stride, @p w or @p h being zero. +* \retval TVG_RESULT_NOT_SUPPORTED The software engine is not supported. +* +* \warning Do not access @p buffer during tvg_canvas_draw() - tvg_canvas_sync(). It should not be accessed while TVG is writing on it. +* +* \see Tvg_Colorspace +*/ +TVG_API Tvg_Result tvg_swcanvas_set_target(Tvg_Canvas* canvas, uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Tvg_Colorspace cs); + + +/*! +* \brief Sets the software engine memory pool behavior policy. +* +* ThorVG draws a lot of shapes, it allocates/deallocates a few chunk of memory +* while processing rendering. It internally uses one shared memory pool +* which can be reused among the canvases in order to avoid memory overhead. +* +* Thus ThorVG suggests using a memory pool policy to satisfy user demands, +* if it needs to guarantee the thread-safety of the internal data access. +* +* \param[in] canvas The Tvg_Canvas object of which the Memory Pool behavior is to be specified. +* \param[in] policy The method specifying the Memory Pool behavior. The default value is @c TVG_MEMPOOL_POLICY_DEFAULT. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENTS An invalid canvas pointer passed. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION The canvas contains some paints already. +* \retval TVG_RESULT_NOT_SUPPORTED The software engine is not supported. +* +* \note When @c policy is set as @c TVG_MEMPOOL_POLICY_INDIVIDUAL, the current instance of canvas uses its own individual +* memory data, which is not shared with others. This is necessary when the canvas is accessed on a worker-thread. +* +* \warning It's not allowed after pushing any paints. +*/ +TVG_API Tvg_Result tvg_swcanvas_set_mempool(Tvg_Canvas* canvas, Tvg_Mempool_Policy policy); + +/** \} */ // end defgroup ThorVGCapi_SwCanvas + + +/************************************************************************/ +/* Common Canvas API */ +/************************************************************************/ +/*! +* \brief Clears the canvas internal data, releases all paints stored by the canvas and destroys the canvas object itself. +* +* \code +* static Tvg_Canvas *canvas = NULL; +* static uint32_t *buffer = NULL; +* +* static void _init() { +* canvas = tvg_swcanvas_create(); +* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); +* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); +* } +* +* //a task called from main function in a loop +* static void _job(const int cmd) { +* //define a valid rectangle shape +* switch (cmd) { +* case CMD_EXIT: return 0; +* case CMD_ADD_RECT: +* tvg_canvas_push(canvas, rect); +* break; +* case CMD_DEL_RECT: +* tvg_paint_del(rect); +* //now to safely delete Tvg_Canvas, tvg_canvas_clear() API have to be used +* break; +* default: +* break; +* } +* } +* +* int main(int argc, char **argv) { +* int cmd = 0; +* int stop = 1; +* +* tvg_engine_init(TVG_ENGINE_SW, 4); +* +* while (stop) { +* //wait for a command e.g. from a console +* stop = _job(cmd); +* } +* tvg_canvas_clear(canvas, false); +* tvg_canvas_destroy(canvas); +* tvg_engine_term(TVG_ENGINE_SW); +* return 0; +* } +* +* tvg_canvas_destroy(canvas); +* tvg_engine_term(TVG_ENGINE_SW) +* \endcode +* +* \param[in] canvas The Tvg_Canvas object to be destroyed. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer to the Tvg_Canvas object is passed. +* +* \note If the paints from the canvas should not be released, the tvg_canvas_clear() with a @c free argument value set to @c false should be called. +* Please be aware that in such a case TVG is not responsible for the paints release anymore and it has to be done manually in order to avoid memory leaks. +* +* \see tvg_paint_del(), tvg_canvas_clear() +*/ +TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas); + + +/*! +* \brief Inserts a drawing element into the canvas using a Tvg_Paint object. +* +* \param[in] canvas The Tvg_Canvas object managing the @p paint. +* \param[in] paint The Tvg_Paint object to be drawn. +* +* Only the paints pushed into the canvas will be drawing targets. +* They are retained by the canvas until you call tvg_canvas_clear(). +* If you know the number of the pushed objects in advance, please call tvg_canvas_reserve(). +* +* \return Tvg_Result return values: +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +* +* \note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. +* \see tvg_canvas_clear() +*/ +TVG_API Tvg_Result tvg_canvas_push(Tvg_Canvas* canvas, Tvg_Paint* paint); + + +/*! +* \brief Reserves a memory block where the objects pushed into a canvas are stored. +* +* If the number of Tvg_Paints to be stored in a canvas is known in advance, calling this function reduces the multiple +* memory allocations thus improves the performance. +* +* \code +* Tvg_Canvas *canvas = NULL; +* +* tvg_engine_init(TVG_ENGINE_SW, 4); +* canvas = tvg_swcanvas_create(); +* +* uint32_t *buffer = NULL; +* buffer = (uint32_t*) malloc(sizeof(uint32_t) * 100 * 100); +* if (!buffer) return; +* +* tvg_swcanvas_set_target(canvas, buffer, 100, 100, 100, TVG_COLORSPACE_ARGB8888); +* +* tvg_canvas_destroy(canvas); +* tvg_engine_term(TVG_ENGINE_SW) +* \endcode +* +* \param[in] canvas The Tvg_Canvas object managing the reserved memory. +* \param[in] n The number of objects for which the memory is to be reserved. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. +*/ +TVG_DEPRECATED TVG_API Tvg_Result tvg_canvas_reserve(Tvg_Canvas* canvas, uint32_t n); + + +/*! +* \brief Sets the total number of the paints pushed into the canvas to be zero. +* Tvg_Paint objects stored in the canvas are released if @p free is set to @c true, otherwise the memory is not deallocated and +* all paints should be released manually in order to avoid memory leaks. +* +* \param[in] canvas The Tvg_Canvas object to be cleared. +* \param[in] free If @c true the memory occupied by paints is deallocated, otherwise it is not. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +* +* \warning Please use the @p free argument only when you know how it works, otherwise it's not recommended. +* +* \see tvg_canvas_destroy() +*/ +TVG_API Tvg_Result tvg_canvas_clear(Tvg_Canvas* canvas, bool free); + + +/*! +* \brief Updates all paints in a canvas. +* +* Should be called before drawing in order to prepare paints for the rendering. +* +* \code +* //A frame drawing example. Thread safety and events implementation is skipped to show only TVG code. +* +* static Tvg_Canvas *canvas = NULL; +* static Tvg_Paint *rect = NULL; +* +* int _frame_render(void) { +* tvg_canvas_update(canvas); +* tvg_canvas_draw(canvas); +* tvg_canvas_sync(canvas); +* } +* +* //event handler from your code or third party library +* void _event_handler(event *event_data) { +* if (!event_data) return NULL; +* switch(event_data.type) { +* case EVENT_RECT_ADD: +* if (!rect) { +* tvg_shape_append_rect(rect, 10, 10, 50, 50, 0, 0); +* tvg_shape_set_stroke_width(rect, 1.0f); +* tvg_shape_set_stroke_color(rect, 255, 0, 0, 255); +* tvg_canvas_push(canvas, rect); +* } +* break; +* case EVENT_RECT_MOVE: +* if (rect) tvg_paint_translate(rect, 10.0, 10.0); +* break; +* default: +* break; +* } +* } +* +* int main(int argc, char **argv) { +* //example handler from your code or third party lib +* event_handler_add(handler, _event_handler); +* +* //create frame rendering process which calls _frame_render() function. +* app_loop_begin(_frame_render); +* app_loop_finish(); +* cleanup(); +* } +* \endcode +* +* \param[in] canvas The Tvg_Canvas object to be updated. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +* +* \see tvg_canvas_update_paint() +*/ +TVG_API Tvg_Result tvg_canvas_update(Tvg_Canvas* canvas); + + +/*! +* \brief Updates the given Tvg_Paint object from the canvas before the rendering. +* +* If a client application using the TVG library does not update the entire canvas with tvg_canvas_update() in the frame +* rendering process, Tvg_Paint objects previously added to the canvas should be updated manually with this function. +* +* \param[in] canvas The Tvg_Canvas object to which the @p paint belongs. +* \param[in] paint The Tvg_Paint object to be updated. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. +* +* \see tvg_canvas_update() +*/ +TVG_API Tvg_Result tvg_canvas_update_paint(Tvg_Canvas* canvas, Tvg_Paint* paint); + + +/*! +* \brief Requests the canvas to draw the Tvg_Paint objects. +* +* All paints from the given canvas will be rasterized to the buffer. +* +* \param[in] canvas The Tvg_Canvas object containing elements to be drawn. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +* +* \note Drawing can be asynchronous based on the assigned thread number. To guarantee the drawing is done, call tvg_canvas_sync() afterwards. +* \see tvg_canvas_sync() +*/ +TVG_API Tvg_Result tvg_canvas_draw(Tvg_Canvas* canvas); + + +/*! +* \brief Guarantees that the drawing process is finished. +* +* Since the canvas rendering can be performed asynchronously, it should be called after the tvg_canvas_draw(). +* +* \param[in] canvas The Tvg_Canvas object containing elements which were drawn. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +* +* \see tvg_canvas_draw() +*/ +TVG_API Tvg_Result tvg_canvas_sync(Tvg_Canvas* canvas); + + +/** \} */ // end defgroup ThorVGCapi_Canvas + + +/** +* \defgroup ThorVGCapi_Paint Paint +* \brief A module for managing graphical elements. It enables duplication, transformation and composition. +* +* \{ +*/ + +/************************************************************************/ +/* Paint API */ +/************************************************************************/ +/*! +* \brief Releases the given Tvg_Paint object. +* +* \code +* //example of cleanup function +* Tvg_Paint *rect = NULL; //rectangle shape added in other function +* +* //rectangle delete API +* int rectangle_delete(void) { +* if (rect) tvg_paint_del(rect); +* rect = NULL; +* } +* +* int cleanup(void) { +* tvg_canvas_clear(canvas, false); +* tvg_canvas_destroy(canvas); +* canvas = NULL; +* } +* \endcode +* +* \param[in] paint The Tvg_Paint object to be released. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \warning If this function is used, tvg_canvas_clear() with the @c free argument value set to @c false should be used in order to avoid unexpected behaviours. +* +* \see tvg_canvas_clear(), tvg_canvas_destroy() +*/ +TVG_API Tvg_Result tvg_paint_del(Tvg_Paint* paint); + + +/*! +* \brief Scales the given Tvg_Paint object by the given factor. +* +* \param[in] paint The Tvg_Paint object to be scaled. +* \param[in] factor The value of the scaling factor. The default value is 1. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. +*/ +TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor); + + +/*! +* \brief Rotates the given Tvg_Paint by the given angle. +* +* The angle in measured clockwise from the horizontal axis. +* The rotational axis passes through the point on the object with zero coordinates. +* +* \param[in] paint The Tvg_Paint object to be rotated. +* \param[in] degree The value of the rotation angle in degrees. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. +*/ +TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree); + + +/*! +* \brief Moves the given Tvg_Paint in a two-dimensional space. +* +* The origin of the coordinate system is in the upper left corner of the canvas. +* The horizontal and vertical axes point to the right and down, respectively. +* +* \param[in] paint The Tvg_Paint object to be shifted. +* \param[in] x The value of the horizontal shift. +* \param[in] y The value of the vertical shift. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. +*/ +TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y); + + +/*! +* \brief Transforms the given Tvg_Paint using the augmented transformation matrix. +* +* The augmented matrix of the transformation is expected to be given. +* +* \param[in] paint The Tvg_Paint object to be transformed. +* \param[in] m The 3x3 augmented matrix. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with memory allocation. +*/ +TVG_API Tvg_Result tvg_paint_set_transform(Tvg_Paint* paint, const Tvg_Matrix* m); + + +/*! +* \brief Gets the matrix of the affine transformation of the given Tvg_Paint object. +* +* In case no transformation was applied, the identity matrix is returned. +* +* \param[in] paint The Tvg_Paint object of which to get the transformation matrix. +* \param[out] m The 3x3 augmented matrix. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. +*/ +TVG_API Tvg_Result tvg_paint_get_transform(Tvg_Paint* paint, Tvg_Matrix* m); + + +/*! +* \brief Sets the opacity of the given Tvg_Paint. +* +* \param[in] paint The Tvg_Paint object of which the opacity value is to be set. +* \param[in] opacity The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note Setting the opacity with this API may require multiple renderings using a composition. It is recommended to avoid changing the opacity if possible. +*/ +TVG_API Tvg_Result tvg_paint_set_opacity(Tvg_Paint* paint, uint8_t opacity); + + +/*! +* \brief Gets the opacity of the given Tvg_Paint. +* +* \param[in] paint The Tvg_Paint object of which to get the opacity value. +* \param[out] opacity The opacity value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. +*/ +TVG_API Tvg_Result tvg_paint_get_opacity(const Tvg_Paint* paint, uint8_t* opacity); + + +/*! +* \brief Duplicates the given Tvg_Paint object. +* +* Creates a new object and sets its all properties as in the original object. +* +* \param[in] paint The Tvg_Paint object to be copied. +* +* \return A copied Tvg_Paint object if succeed, @c nullptr otherwise. +*/ +TVG_API Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint); + + +/*! +* \brief Gets the axis-aligned bounding box of the Tvg_Paint object. +* +* \param[in] paint The Tvg_Paint object of which to get the bounds. +* \param[out] x The x coordinate of the upper left corner of the object. +* \param[out] y The y coordinate of the upper left corner of the object. +* \param[out] w The width of the object. +* \param[out] h The height of the object. +* \param[in] transformed If @c true, the transformation of the paint is taken into account, otherwise it isn't. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION Other errors. +* +* \note The bounding box doesn't indicate the actual drawing region. It's the smallest rectangle that encloses the object. +*/ +TVG_API Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, float* y, float* w, float* h, bool transformed); + + +/*! +* \brief Sets the composition target object and the composition method. +* +* \param[in] paint The source object of the composition. +* \param[in] target The target object of the composition. +* \param[in] method The method used to composite the source object with the target. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid @p paint or @p target object or the @p method equal to TVG_COMPOSITE_METHOD_NONE. +*/ +TVG_API Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method); + + +/** +* \brief Gets the composition target object and the composition method. +* +* \param[in] paint The source object of the composition. +* \param[out] target The target object of the composition. +* \param[out] method The method used to composite the source object with the target. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. +*/ +TVG_API Tvg_Result tvg_paint_get_composite_method(const Tvg_Paint* paint, const Tvg_Paint** target, Tvg_Composite_Method* method); + + +/** +* \brief Gets the unique id value of the paint instance indicating the instance type. +* +* \param[in] paint The Tvg_Paint object of which to get the identifier value. +* \param[out] identifier The unique identifier of the paint instance type. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. +* +* \since 0.9 +*/ +TVG_API Tvg_Result tvg_paint_get_identifier(const Tvg_Paint* paint, Tvg_Identifier* identifier); + + +/** + * @brief Sets the blending method for the paint object. + * + * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. + * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. + * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. + * + * \param[in] paint The Tvg_Paint object of which to get the identifier value. + * \param[in] method The blending method to be set. + * + * \return Tvg_Result enumeration. + * \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. + * + * @BETA_API + */ +TVG_API Tvg_Result tvg_paint_set_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method method); + + +/** + * @brief Gets the blending method for the paint object. + * + * The blending feature allows you to combine colors to create visually appealing effects, including transparency, lighting, shading, and color mixing, among others. + * its process involves the combination of colors or images from the source paint object with the destination (the lower layer image) using blending operations. + * The blending operation is determined by the chosen @p BlendMethod, which specifies how the colors or images are combined. + * + * \param[in] paint The Tvg_Paint object of which to get the identifier value. + * \param[out] method The blending method of the paint. + * + * \return Tvg_Result enumeration. + * \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. + * + * @BETA_API + */ +TVG_API Tvg_Result tvg_paint_get_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method* method); + + +/** \} */ // end defgroup ThorVGCapi_Paint + +/** +* \defgroup ThorVGCapi_Shape Shape +* +* \brief A module for managing two-dimensional figures and their properties. +* +* A shape has three major properties: shape outline, stroking, filling. The outline in the shape is retained as the path. +* Path can be composed by accumulating primitive commands such as tvg_shape_move_to(), tvg_shape_line_to(), tvg_shape_cubic_to() or complete shape interfaces such as tvg_shape_append_rect(), tvg_shape_append_circle(), etc. +* Path can consists of sub-paths. One sub-path is determined by a close command. +* +* The stroke of a shape is an optional property in case the shape needs to be represented with/without the outline borders. +* It's efficient since the shape path and the stroking path can be shared with each other. It's also convenient when controlling both in one context. +* +* \{ +*/ + +/************************************************************************/ +/* Shape API */ +/************************************************************************/ +/*! +* \brief Creates a new shape object. +* +* \return A new shape object. +*/ +TVG_API Tvg_Paint* tvg_shape_new(void); + + +/*! +* \brief Resets the shape path properties. +* +* The color, the fill and the stroke properties are retained. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note The memory, where the path data is stored, is not deallocated at this stage for caching effect. +*/ +TVG_API Tvg_Result tvg_shape_reset(Tvg_Paint* paint); + + +/*! +* \brief Sets the initial point of the sub-path. +* +* The value of the current point is set to the given point. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] x The horizontal coordinate of the initial point of the sub-path. +* \param[in] y The vertical coordinate of the initial point of the sub-path. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_API Tvg_Result tvg_shape_move_to(Tvg_Paint* paint, float x, float y); + + +/*! +* \brief Adds a new point to the sub-path, which results in drawing a line from the current point to the given end-point. +* +* The value of the current point is set to the given end-point. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] x The horizontal coordinate of the end-point of the line. +* \param[in] y The vertical coordinate of the end-point of the line. + +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note In case this is the first command in the path, it corresponds to the tvg_shape_move_to() call. +*/ +TVG_API Tvg_Result tvg_shape_line_to(Tvg_Paint* paint, float x, float y); + + +/*! +* \brief Adds new points to the sub-path, which results in drawing a cubic Bezier curve. +* +* The Bezier curve starts at the current point and ends at the given end-point (@p x, @p y). Two control points (@p cx1, @p cy1) and (@p cx2, @p cy2) are used to determine the shape of the curve. +* The value of the current point is set to the given end-point. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] cx1 The horizontal coordinate of the 1st control point. +* \param[in] cy1 The vertical coordinate of the 1st control point. +* \param[in] cx2 The horizontal coordinate of the 2nd control point. +* \param[in] cy2 The vertical coordinate of the 2nd control point. +* \param[in] x The horizontal coordinate of the endpoint of the curve. +* \param[in] y The vertical coordinate of the endpoint of the curve. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note In case this is the first command in the path, no data from the path are rendered. +*/ +TVG_API Tvg_Result tvg_shape_cubic_to(Tvg_Paint* paint, float cx1, float cy1, float cx2, float cy2, float x, float y); + + +/*! +* \brief Closes the current sub-path by drawing a line from the current point to the initial point of the sub-path. +* +* The value of the current point is set to the initial point of the closed sub-path. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note In case the sub-path does not contain any points, this function has no effect. +*/ +TVG_API Tvg_Result tvg_shape_close(Tvg_Paint* paint); + + +/*! +* \brief Appends a rectangle to the path. +* +* The rectangle with rounded corners can be achieved by setting non-zero values to @p rx and @p ry arguments. +* The @p rx and @p ry values specify the radii of the ellipse defining the rounding of the corners. +* +* The position of the rectangle is specified by the coordinates of its upper left corner - @p x and @p y arguments. +* +* The rectangle is treated as a new sub-path - it is not connected with the previous sub-path. +* +* The value of the current point is set to (@p x + @p rx, @p y) - in case @p rx is greater +* than @p w/2 the current point is set to (@p x + @p w/2, @p y) +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] x The horizontal coordinate of the upper left corner of the rectangle. +* \param[in] y The vertical coordinate of the upper left corner of the rectangle. +* \param[in] w The width of the rectangle. +* \param[in] h The height of the rectangle. +* \param[in] rx The x-axis radius of the ellipse defining the rounded corners of the rectangle. +* \param[in] ry The y-axis radius of the ellipse defining the rounded corners of the rectangle. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +& \note For @p rx and @p ry greater than or equal to the half of @p w and the half of @p h, respectively, the shape become an ellipse. +*/ +TVG_API Tvg_Result tvg_shape_append_rect(Tvg_Paint* paint, float x, float y, float w, float h, float rx, float ry); + + +/*! +* \brief Appends an ellipse to the path. +* +* The position of the ellipse is specified by the coordinates of its center - @p cx and @p cy arguments. +* +* The ellipse is treated as a new sub-path - it is not connected with the previous sub-path. +* +* The value of the current point is set to (@p cx, @p cy - @p ry). +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] cx The horizontal coordinate of the center of the ellipse. +* \param[in] cy The vertical coordinate of the center of the ellipse. +* \param[in] rx The x-axis radius of the ellipse. +* \param[in] ry The y-axis radius of the ellipse. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_API Tvg_Result tvg_shape_append_circle(Tvg_Paint* paint, float cx, float cy, float rx, float ry); + + +/*! +* \brief Appends a circular arc to the path. +* +* The arc is treated as a new sub-path - it is not connected with the previous sub-path. +* The current point value is set to the end-point of the arc in case @p pie is @c false, and to the center of the arc otherwise. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] cx The horizontal coordinate of the center of the arc. +* \param[in] cy The vertical coordinate of the center of the arc. +* \param[in] radius The radius of the arc. +* \param[in] startAngle The start angle of the arc given in degrees, measured counter-clockwise from the horizontal line. +* \param[in] sweep The central angle of the arc given in degrees, measured counter-clockwise from @p startAngle. +* \param[in] pie Specifies whether to draw radii from the arc's center to both of its end-point - drawn if @c true. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note Setting @p sweep value greater than 360 degrees, is equivalent to calling tvg_shape_append_circle(paint, cx, cy, radius, radius). +*/ +TVG_API Tvg_Result tvg_shape_append_arc(Tvg_Paint* paint, float cx, float cy, float radius, float startAngle, float sweep, uint8_t pie); + + +/*! +* \brief Appends a given sub-path to the path. +* +* The current point value is set to the last point from the sub-path. +* For each command from the @p cmds array, an appropriate number of points in @p pts array should be specified. +* If the number of points in the @p pts array is different than the number required by the @p cmds array, the shape with this sub-path will not be displayed on the screen. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] cmds The array of the commands in the sub-path. +* \param[in] cmdCnt The length of the @p cmds array. +* \param[in] pts The array of the two-dimensional points. +* \param[in] ptsCnt The length of the @p pts array. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument or @p cmdCnt or @p ptsCnt equal to zero. +*/ +TVG_API Tvg_Result tvg_shape_append_path(Tvg_Paint* paint, const Tvg_Path_Command* cmds, uint32_t cmdCnt, const Tvg_Point* pts, uint32_t ptsCnt); + + +/*! +* \brief Gets the points values of the path. +* +* The function does not allocate any data, it operates on internal memory. There is no need to free the @p pts array. +* +* \code +* Tvg_Shape *shape = tvg_shape_new(); +* Tvg_Point *coords = NULL; +* uint32_t len = 0; +* +* tvg_shape_append_circle(shape, 10, 10, 50, 50); +* tvg_shape_get_path_coords(shape, (const Tvg_Point**)&coords, &len); +* //TVG approximates a circle by four Bezier curves. In the example above the coords array stores their coordinates. +* \endcode +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] pts The pointer to the array of the two-dimensional points from the path. +* \param[out] cnt The length of the @p pts array. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +*/ +TVG_API Tvg_Result tvg_shape_get_path_coords(const Tvg_Paint* paint, const Tvg_Point** pts, uint32_t* cnt); + + +/*! +* \brief Gets the commands data of the path. +* +* The function does not allocate any data. There is no need to free the @p cmds array. +* +* \code +* Tvg_Shape *shape = tvg_shape_new(); +* Tvg_Path_Command *cmds = NULL; +* uint32_t len = 0; +* +* tvg_shape_append_circle(shape, 10, 10, 50, 50); +* tvg_shape_get_path_commands(shape, (const Tvg_Path_Command**)&cmds, &len); +* //TVG approximates a circle by four Bezier curves. In the example above the cmds array stores the commands of the path data. +* \endcode +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] cmds The pointer to the array of the commands from the path. +* \param[out] cnt The length of the @p cmds array. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +*/ +TVG_API Tvg_Result tvg_shape_get_path_commands(const Tvg_Paint* paint, const Tvg_Path_Command** cmds, uint32_t* cnt); + + +/*! +* \brief Sets the stroke width for all of the figures from the @p paint. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] width The width of the stroke. The default value is 0. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_width(Tvg_Paint* paint, float width); + + +/*! +* \brief Gets the shape's stroke width. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] width The stroke width. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_width(const Tvg_Paint* paint, float* width); + + +/*! +* \brief Sets the shape's stroke color. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a); + + +/*! +* \brief Gets the shape's stroke color. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] r The red color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] g The green color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] b The blue color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION No stroke was set. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); + + +/*! +* \brief Sets the linear gradient fill of the stroke for all of the figures from the path. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] grad The linear gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); + + +/*! +* \brief Sets the radial gradient fill of the stroke for all of the figures from the path. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] grad The radial gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); + + +/*! +* \brief Gets the gradient fill of the shape's stroke. +* +* The function does not allocate any memory. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] grad The gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_gradient(const Tvg_Paint* paint, Tvg_Gradient** grad); + + +/*! +* \brief Sets the shape's stroke dash pattern. +* +* \code +* //dash pattern examples +* float dashPattern[2] = {20, 10}; // -- -- -- +* float dashPattern[2] = {40, 20}; // ---- ---- ---- +* float dashPattern[4] = {10, 20, 30, 40} // - --- - --- +* \endcode +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] dashPattern The array of consecutive pair values of the dash length and the gap length. +* \param[in] cnt The size of the @p dashPattern array. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument and @p cnt > 0, the given length of the array is less than two or any of the @p dashPattern values is zero or less. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* +* \note To reset the stroke dash pattern, pass @c nullptr to @p dashPattern and zero to @p cnt. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_dash(Tvg_Paint* paint, const float* dashPattern, uint32_t cnt); + + +/*! +* \brief Gets the dash pattern of the stroke. +* +* The function does not allocate any memory. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] dashPattern The array of consecutive pair values of the dash length and the gap length. +* \param[out] cnt The size of the @p dashPattern array. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_dash(const Tvg_Paint* paint, const float** dashPattern, uint32_t* cnt); + + +/*! +* \brief Sets the cap style used for stroking the path. +* +* The cap style specifies the shape to be used at the end of the open stroked sub-paths. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] cap The cap style value. The default value is @c TVG_STROKE_CAP_SQUARE. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_cap(Tvg_Paint* paint, Tvg_Stroke_Cap cap); + + +/*! +* \brief Gets the stroke cap style used for stroking the path. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] cap The cap style value. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_cap(const Tvg_Paint* paint, Tvg_Stroke_Cap* cap); + + +/*! +* \brief Sets the join style for stroked path segments. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] join The join style value. The default value is @c TVG_STROKE_JOIN_BEVEL. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_join(Tvg_Paint* paint, Tvg_Stroke_Join join); + + +/*! +* \brief The function gets the stroke join method +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] join The join style value. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_join(const Tvg_Paint* paint, Tvg_Stroke_Join* join); + + +/*! +* \brief Sets the stroke miterlimit. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] miterlimit The miterlimit imposes a limit on the extent of the stroke join when the @c TVG_STROKE_JOIN_MITER join style is set. The default value is 4. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_NOT_SUPPORTED Unsupported value. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* +* \since 0.11 +*/ +TVG_API Tvg_Result tvg_shape_set_stroke_miterlimit(Tvg_Paint* paint, float miterlimit); + + +/*! +* \brief The function gets the stroke miterlimit. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] miterlimit The stroke miterlimit. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +* +* \since 0.11 +*/ +TVG_API Tvg_Result tvg_shape_get_stroke_miterlimit(const Tvg_Paint* paint, float* miterlimit); + + +/*! +* \brief Sets the shape's solid color. +* +* The parts of the shape defined as inner are colored. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] r The red color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] g The green color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] b The blue color channel value in the range [0 ~ 255]. The default value is 0. +* \param[in] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +* \see tvg_shape_set_fill_rule() +*/ +TVG_API Tvg_Result tvg_shape_set_fill_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a); + + +/*! +* \brief Gets the shape's solid color. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] r The red color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] g The green color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] b The blue color channel value in the range [0 ~ 255]. The default value is 0. +* \param[out] a The alpha channel value in the range [0 ~ 255], where 0 is completely transparent and 255 is opaque. The default value is 0. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_API Tvg_Result tvg_shape_get_fill_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a); + + +/*! +* \brief Sets the shape's fill rule. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] rule The fill rule value. The default value is @c TVG_FILL_RULE_WINDING. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_API Tvg_Result tvg_shape_set_fill_rule(Tvg_Paint* paint, Tvg_Fill_Rule rule); + + +/*! +* \brief Gets the shape's fill rule. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] rule shape's fill rule +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_fill_rule(const Tvg_Paint* paint, Tvg_Fill_Rule* rule); + + +/*! +* \brief Sets the rendering order of the stroke and the fill. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] strokeFirst If @c true the stroke is rendered before the fill, otherwise the stroke is rendered as the second one (the default option). +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* +* \since 0.10 +*/ +TVG_API Tvg_Result tvg_shape_set_paint_order(Tvg_Paint* paint, bool strokeFirst); + + +/*! +* \brief Sets the linear gradient fill for all of the figures from the path. +* +* The parts of the shape defined as inner are filled. +* +* \code +* Tvg_Gradient* grad = tvg_linear_gradient_new(); +* tvg_linear_gradient_set(grad, 700, 700, 800, 800); +* Tvg_Color_Stop color_stops[4] = +* { +* {0.0 , 0, 0, 0, 255}, +* {0.25, 255, 0, 0, 255}, +* {0.5 , 0, 255, 0, 255}, +* {1.0 , 0, 0, 255, 255} +* }; +* tvg_gradient_set_color_stops(grad, color_stops, 4); +* tvg_shape_set_linear_gradient(shape, grad); +* \endcode +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] grad The linear gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +* \see tvg_shape_set_fill_rule() +*/ +TVG_API Tvg_Result tvg_shape_set_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); + + +/*! +* \brief Sets the radial gradient fill for all of the figures from the path. +* +* The parts of the shape defined as inner are filled. +* +* \code +* Tvg_Gradient* grad = tvg_radial_gradient_new(); +* tvg_radial_gradient_set(grad, 550, 550, 50); +* Tvg_Color_Stop color_stops[4] = +* { +* {0.0 , 0, 0, 0, 255}, +* {0.25, 255, 0, 0, 255}, +* {0.5 , 0, 255, 0, 255}, +* {1.0 , 0, 0, 255, 255} +* }; +* tvg_gradient_set_color_stops(grad, color_stops, 4); +* tvg_shape_set_radial_gradient(shape, grad); +* \endcode +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[in] grad The radial gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_MEMORY_CORRUPTION An invalid Tvg_Gradient pointer. +* +* \note Either a solid color or a gradient fill is applied, depending on what was set as last. +* \see tvg_shape_set_fill_rule() +*/ +TVG_API Tvg_Result tvg_shape_set_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* grad); + + +/*! +* \brief Gets the gradient fill of the shape. +* +* The function does not allocate any data. +* +* \param[in] paint A Tvg_Paint pointer to the shape object. +* \param[out] grad The gradient fill. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid pointer passed as an argument. +*/ +TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** grad); + + +/** \} */ // end defgroup ThorVGCapi_Shape + + +/** +* \defgroup ThorVGCapi_Gradient Gradient +* \brief A module managing the gradient fill of objects. +* +* The module enables to set and to get the gradient colors and their arrangement inside the gradient bounds, +* to specify the gradient bounds and the gradient behavior in case the area defined by the gradient bounds +* is smaller than the area to be filled. +* +* \{ +*/ + +/************************************************************************/ +/* Gradient API */ +/************************************************************************/ +/*! +* \brief Creates a new linear gradient object. +* +* \code +* Tvg_Paint* shape = tvg_shape_new(); +* tvg_shape_append_rect(shape, 700, 700, 100, 100, 20, 20); +* Tvg_Gradient* grad = tvg_linear_gradient_new(); +* tvg_linear_gradient_set(grad, 700, 700, 800, 800); +* Tvg_Color_Stop color_stops[2] = +* { +* {0.0, 0, 0, 0, 255}, +* {1.0, 0, 255, 0, 255}, +* }; +* tvg_gradient_set_color_stops(grad, color_stops, 2); +* tvg_shape_set_linear_gradient(shape, grad); +* \endcode +* +* \return A new linear gradient object. +*/ +TVG_API Tvg_Gradient* tvg_linear_gradient_new(void); + + +/*! +* \brief Creates a new radial gradient object. +* +* \code +* Tvg_Paint* shape = tvg_shape_new(); +* tvg_shape_append_rect(shape, 700, 700, 100, 100, 20, 20); +* Tvg_Gradient* grad = tvg_radial_gradient_new(); +* tvg_radial_gradient_set(grad, 550, 550, 50); +* Tvg_Color_Stop color_stops[2] = +* { +* {0.0, 0, 0, 0, 255}, +* {1.0, 0, 255, 0, 255}, +* }; +* tvg_gradient_set_color_stops(grad, color_stops, 2); +* tvg_shape_set_radial_gradient(shape, grad); +* \endcode +* +* \return A new radial gradient object. +*/ +TVG_API Tvg_Gradient* tvg_radial_gradient_new(void); + + +/*! +* \brief Sets the linear gradient bounds. +* +* The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing +* the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking +* (@p x1, @p y1) and (@p x2, @p y2). +* +* \param[in] grad The Tvg_Gradient object of which bounds are to be set. +* @param[in] x1 The horizontal coordinate of the first point used to determine the gradient bounds. +* @param[in] y1 The vertical coordinate of the first point used to determine the gradient bounds. +* @param[in] x2 The horizontal coordinate of the second point used to determine the gradient bounds. +* @param[in] y2 The vertical coordinate of the second point used to determine the gradient bounds. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +* +* \note In case the first and the second points are equal, an object filled with such a gradient fill is not rendered. +*/ +TVG_API Tvg_Result tvg_linear_gradient_set(Tvg_Gradient* grad, float x1, float y1, float x2, float y2); + + +/*! +* \brief Gets the linear gradient bounds. +* +* The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing +* the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking +* (@p x1, @p y1) and (@p x2, @p y2). +* +* \param[in] grad The Tvg_Gradient object of which to get the bounds. +* \param[out] x1 The horizontal coordinate of the first point used to determine the gradient bounds. +* \param[out] y1 The vertical coordinate of the first point used to determine the gradient bounds. +* \param[out] x2 The horizontal coordinate of the second point used to determine the gradient bounds. +* \param[out] y2 The vertical coordinate of the second point used to determine the gradient bounds. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +*/ +TVG_API Tvg_Result tvg_linear_gradient_get(Tvg_Gradient* grad, float* x1, float* y1, float* x2, float* y2); + + +/*! +* \brief Sets the radial gradient bounds. +* +* The radial gradient bounds are defined as a circle centered in a given point (@p cx, @p cy) of a given radius. +* +* \param[in] grad The Tvg_Gradient object of which bounds are to be set. +* \param[in] cx The horizontal coordinate of the center of the bounding circle. +* \param[in] cy The vertical coordinate of the center of the bounding circle. +* \param[in] radius The radius of the bounding circle. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer or the @p radius value less than zero. +*/ +TVG_API Tvg_Result tvg_radial_gradient_set(Tvg_Gradient* grad, float cx, float cy, float radius); + + +/*! +* \brief The function gets radial gradient center point ant radius +* +* \param[in] grad The Tvg_Gradient object of which bounds are to be set. +* \param[out] cx The horizontal coordinate of the center of the bounding circle. +* \param[out] cy The vertical coordinate of the center of the bounding circle. +* \param[out] radius The radius of the bounding circle. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +*/ +TVG_API Tvg_Result tvg_radial_gradient_get(Tvg_Gradient* grad, float* cx, float* cy, float* radius); + + +/*! +* \brief Sets the parameters of the colors of the gradient and their position. +* +* \param[in] grad The Tvg_Gradient object of which the color information is to be set. +* \param[in] color_stop An array of Tvg_Color_Stop data structure. +* \param[in] cnt The size of the @p color_stop array equal to the colors number used in the gradient. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +*/ +TVG_API Tvg_Result tvg_gradient_set_color_stops(Tvg_Gradient* grad, const Tvg_Color_Stop* color_stop, uint32_t cnt); + + +/*! +* \brief Gets the parameters of the colors of the gradient, their position and number +* +* The function does not allocate any memory. +* +* \param[in] grad The Tvg_Gradient object of which to get the color information. +* \param[out] color_stop An array of Tvg_Color_Stop data structure. +* \param[out] cnt The size of the @p color_stop array equal to the colors number used in the gradient. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +*/ +TVG_API Tvg_Result tvg_gradient_get_color_stops(const Tvg_Gradient* grad, const Tvg_Color_Stop** color_stop, uint32_t* cnt); + + +/*! +* \brief Sets the Tvg_Stroke_Fill value, which specifies how to fill the area outside the gradient bounds. +* +* \param[in] grad The Tvg_Gradient object. +* \param[in] spread The FillSpread value. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +*/ +TVG_API Tvg_Result tvg_gradient_set_spread(Tvg_Gradient* grad, const Tvg_Stroke_Fill spread); + + +/*! +* \brief Gets the FillSpread value of the gradient object. +* +* \param[in] grad The Tvg_Gradient object. +* \param[out] spread The FillSpread value. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +*/ +TVG_API Tvg_Result tvg_gradient_get_spread(const Tvg_Gradient* grad, Tvg_Stroke_Fill* spread); + + +/*! +* \brief Sets the matrix of the affine transformation for the gradient object. +* +* The augmented matrix of the transformation is expected to be given. +* +* \param[in] grad The Tvg_Gradient object to be transformed. +* \param[in] m The 3x3 augmented matrix. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +*/ +TVG_API Tvg_Result tvg_gradient_set_transform(Tvg_Gradient* grad, const Tvg_Matrix* m); + + +/*! +* \brief Gets the matrix of the affine transformation of the gradient object. +* +* In case no transformation was applied, the identity matrix is set. +* +* \param[in] grad The Tvg_Gradient object of which to get the transformation matrix. +* \param[out] m The 3x3 augmented matrix. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr is passed as the argument. +*/ +TVG_API Tvg_Result tvg_gradient_get_transform(const Tvg_Gradient* grad, Tvg_Matrix* m); + +/** +* \brief Gets the unique id value of the gradient instance indicating the instance type. +* +* \param[in] grad The Tvg_Gradient object of which to get the identifier value. +* \param[out] identifier The unique identifier of the gradient instance type. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument. +* +* \since 0.9 +*/ +TVG_API Tvg_Result tvg_gradient_get_identifier(const Tvg_Gradient* grad, Tvg_Identifier* identifier); + + +/*! +* \brief Duplicates the given Tvg_Gradient object. +* +* Creates a new object and sets its all properties as in the original object. +* +* \param[in] grad The Tvg_Gradient object to be copied. +* +* \return A copied Tvg_Gradient object if succeed, @c nullptr otherwise. +*/ +TVG_API Tvg_Gradient* tvg_gradient_duplicate(Tvg_Gradient* grad); + + +/*! +* \brief Deletes the given gradient object. +* +* \param[in] grad The gradient object to be deleted. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Gradient pointer. +*/ +TVG_API Tvg_Result tvg_gradient_del(Tvg_Gradient* grad); + + +/** \} */ // end defgroup ThorVGCapi_Gradient + + +/** +* \defgroup ThorVGCapi_Picture Picture +* +* \brief A module enabling to create and to load an image in one of the supported formats: svg, png, jpg, lottie and raw. +* +* +* \{ +*/ + +/************************************************************************/ +/* Picture API */ +/************************************************************************/ +/*! +* \brief Creates a new picture object. +* +* \return A new picture object. +*/ +TVG_API Tvg_Paint* tvg_picture_new(void); + + +/*! +* \brief Loads a picture data directly from a file. +* +* \param[in] paint A Tvg_Paint pointer to the picture object. +* \param[in] path The absolute path to the image file. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer or an empty @p path. +* \retval TVG_RESULT_NOT_SUPPORTED A file with an unknown extension. +* \retval TVG_RESULT_UNKNOWN An error at a later stage. +*/ +TVG_API Tvg_Result tvg_picture_load(Tvg_Paint* paint, const char* path); + + +/*! +* \brief Loads a picture data from a memory block of a given size. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer or no data are provided or the @p width or @p height value is zero or less. +* \retval TVG_RESULT_FAILED_ALLOCATION A problem with memory allocation occurs. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An error occurs at a later stage. +* +* \since 0.9 +*/ +TVG_API Tvg_Result tvg_picture_load_raw(Tvg_Paint* paint, uint32_t *data, uint32_t w, uint32_t h, bool copy); + + +/*! +* \brief Loads a picture data from a memory block of a given size. +* +* \param[in] paint A Tvg_Paint pointer to the picture object. +* \param[in] data A pointer to a memory location where the content of the picture file is stored. +* \param[in] size The size in bytes of the memory occupied by the @p data. +* \param[in] mimetype Mimetype or extension of data such as "jpg", "jpeg", "svg", "svg+xml", "lottie", "png", etc. In case an empty string or an unknown type is provided, the loaders will be tried one by one. +* \param[in] copy If @c true the data are copied into the engine local buffer, otherwise they are not. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT In case a @c nullptr is passed as the argument or the @p size is zero or less. +* \retval TVG_RESULT_NOT_SUPPORTED A file with an unknown extension. +* \retval TVG_RESULT_UNKNOWN An error at a later stage. +* +* \warning: It's the user responsibility to release the @p data memory if the @p copy is @c true. +*/ +TVG_API Tvg_Result tvg_picture_load_data(Tvg_Paint* paint, const char *data, uint32_t size, const char *mimetype, bool copy); + + +/*! +* \brief Resizes the picture content to the given width and height. +* +* The picture content is resized while keeping the default size aspect ratio. +* The scaling factor is established for each of dimensions and the smaller value is applied to both of them. +* +* \param[in] paint A Tvg_Paint pointer to the picture object. +* \param[in] w A new width of the image in pixels. +* \param[in] h A new height of the image in pixels. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION An internal error. +*/ +TVG_API Tvg_Result tvg_picture_set_size(Tvg_Paint* paint, float w, float h); + + +/*! +* \brief Gets the size of the loaded picture. +* +* \param[in] paint A Tvg_Paint pointer to the picture object. +* \param[out] w A width of the image in pixels. +* \param[out] h A height of the image in pixels. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_API Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float* h); + + +/** \} */ // end defgroup ThorVGCapi_Picture + + +/** +* \defgroup ThorVGCapi_Scene Scene +* \brief A module managing the multiple paints as one group paint. +* +* As a group, scene can be transformed, translucent, composited with other target paints, +* its children will be affected by the scene world. +* +* \{ +*/ + +/************************************************************************/ +/* Scene API */ +/************************************************************************/ +/*! +* \brief Creates a new scene object. +* +* A scene object is used to group many paints into one object, which can be manipulated using TVG APIs. +* +* \return A new scene object. +*/ +TVG_API Tvg_Paint* tvg_scene_new(void); + + +/*! +* \brief Sets the size of the container, where all the paints pushed into the scene are stored. +* +* If the number of objects pushed into the scene is known in advance, calling the function +* prevents multiple memory reallocation, thus improving the performance. +* +* \param[in] scene A Tvg_Paint pointer to the scene object. +* \param[in] size The number of objects for which the memory is to be reserved. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_FAILED_ALLOCATION An internal error with a memory allocation. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Paint pointer. +*/ +TVG_DEPRECATED TVG_API Tvg_Result tvg_scene_reserve(Tvg_Paint* scene, uint32_t size); + + +/*! +* \brief Passes drawing elements to the scene using Tvg_Paint objects. +* +* Only the paints pushed into the scene will be the drawn targets. +* The paints are retained by the scene until the tvg_scene_clear() is called. +* If you know the number of pushed objects in advance, please call tvg_scene_reserve(). +* +* \param[in] scene A Tvg_Paint pointer to the scene object. +* \param[in] paint A graphical object to be drawn. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +* \retval TVG_RESULT_MEMORY_CORRUPTION An internal error. +* +* \note The rendering order of the paints is the same as the order as they were pushed. Consider sorting the paints before pushing them if you intend to use layering. +*/ +TVG_API Tvg_Result tvg_scene_push(Tvg_Paint* scene, Tvg_Paint* paint); + + +/*! +* \brief Clears a Tvg_Scene objects from pushed paints. +* +* Tvg_Paint objects stored in the scene are released if @p free is set to @c true, otherwise the memory is not deallocated and +* all paints should be released manually in order to avoid memory leaks. +* +* \param[in] scene The Tvg_Scene object to be cleared. +* \param[in] free If @c true the memory occupied by paints is deallocated, otherwise it is not. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Canvas pointer. +* +* \warning Please use the @p free argument only when you know how it works, otherwise it's not recommended. +*/ +TVG_API Tvg_Result tvg_scene_clear(Tvg_Paint* scene, bool free); + +/** \} */ // end defgroup ThorVGCapi_Scene + + +/** +* \defgroup ThorVGCapi_Saver Saver +* \brief A module for exporting a paint object into a specified file. +* +* The module enables to save the composed scene and/or image from a paint object. +* Once it's successfully exported to a file, it can be recreated using the Picture module. +* +* \{ +*/ + +/************************************************************************/ +/* Saver API */ +/************************************************************************/ +/*! +* \brief Creates a new Tvg_Saver object. +* +* \return A new Tvg_Saver object. +*/ +TVG_API Tvg_Saver* tvg_saver_new(void); + + +/*! +* \brief Exports the given @p paint data to the given @p path +* +* If the saver module supports any compression mechanism, it will optimize the data size. +* This might affect the encoding/decoding time in some cases. You can turn off the compression +* if you wish to optimize for speed. +* +* \param[in] saver The Tvg_Saver object connected with the saving task. +* \param[in] paint The paint to be saved with all its associated properties. +* \param[in] path A path to the file, in which the paint data is to be saved. +* \param[in] compress If @c true then compress data if possible. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION Currently saving other resources. +* \retval TVG_RESULT_NOT_SUPPORTED Trying to save a file with an unknown extension or in an unsupported format. +* \retval TVG_RESULT_MEMORY_CORRUPTION An internal error. +* \retval TVG_RESULT_UNKNOWN An empty paint is to be saved. +* +* \note Saving can be asynchronous if the assigned thread number is greater than zero. To guarantee the saving is done, call tvg_saver_sync() afterwards. +* \see tvg_saver_sync() +*/ +TVG_API Tvg_Result tvg_saver_save(Tvg_Saver* saver, Tvg_Paint* paint, const char* path, bool compress); + + +/*! +* \brief Guarantees that the saving task is finished. +* +* The behavior of the Saver module works on a sync/async basis, depending on the threading setting of the Initializer. +* Thus, if you wish to have a benefit of it, you must call tvg_saver_sync() after the tvg_saver_save() in the proper delayed time. +* Otherwise, you can call tvg_saver_sync() immediately. +* +* \param[in] saver The Tvg_Saver object connected with the saving task. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT A @c nullptr passed as the argument. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION No saving task is running. +* +* \note The asynchronous tasking is dependent on the Saver module implementation. +* \see tvg_saver_save() +*/ +TVG_API Tvg_Result tvg_saver_sync(Tvg_Saver* saver); + + +/*! +* \brief Deletes the given Tvg_Saver object. +* +* \param[in] saver The Tvg_Saver object to be deleted. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Saver pointer. +*/ +TVG_API Tvg_Result tvg_saver_del(Tvg_Saver* saver); + + +/** \} */ // end defgroup ThorVGCapi_Saver + + +/** +* \defgroup ThorVGCapi_Animation Animation +* \brief A module for manipulation of animatable images. +* +* The module supports the display and control of animation frames. +* +* \{ +*/ + +/************************************************************************/ +/* Animation API */ +/************************************************************************/ + +/*! +* \brief Creates a new Animation object. (BETA_API) +* +* \return Tvg_Animation A new Tvg_Animation object. +*/ +TVG_API Tvg_Animation* tvg_animation_new(void); + + +/*! +* \brief Specifies the current frame in the animation. (BETA_API) +* +* \param[in] animation A Tvg_Animation pointer to the animation object. +* \param[in] no The index of the animation frame to be displayed. The index should be less than the tvg_animatio_total_frame(). +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer. +* \retval TVG_RESULT_INSUFFICIENT_CONDITION No animatable data loaded from the Picture. +* \retval TVG_RESULT_NOT_SUPPORTED The picture data does not support animations. +* +* \see tvg_animation_get_total_frame() +*/ +TVG_API Tvg_Result tvg_animation_set_frame(Tvg_Animation* animation, uint32_t no); + + +/*! +* \brief Retrieves a picture instance associated with this animation instance. (BETA_API) +* +* This function provides access to the picture instance that can be used to load animation formats, such as Lottie(json). +* After setting up the picture, it can be pushed to the designated canvas, enabling control over animation frames +* with this Animation instance. +* +* \param[in] animation A Tvg_Animation pointer to the animation object. +* +* \return A picture instance that is tied to this animation. +* +* \warning The picture instance is owned by Animation. It should not be deleted manually. +*/ +TVG_API Tvg_Paint* tvg_animation_get_picture(Tvg_Animation* animation); + + +/*! +* \brief Retrieves the current frame number of the animation. (BETA_API) +* +* \param[in] animation A Tvg_Animation pointer to the animation object. +* \param[in] no The current frame number of the animation, between 0 and totalFrame() - 1. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p no +* +* \see tvg_animation_get_total_frame() +* \see tvg_animation_set_frame() +*/ +TVG_API Tvg_Result tvg_animation_get_frame(Tvg_Animation* animation, uint32_t* no); + + +/*! +* \brief Retrieves the total number of frames in the animation. (BETA_API) +* +* \param[in] animation A Tvg_Animation pointer to the animation object. +* \param[in] cnt The total number of frames in the animation. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p cnt. +* +* \note Frame numbering starts from 0. +* \note If the Picture is not properly configured, this function will return 0. +*/ +TVG_API Tvg_Result tvg_animation_get_total_frame(Tvg_Animation* animation, uint32_t* cnt); + + +/*! +* \brief Retrieves the duration of the animation in seconds. (BETA_API) +* +* \param[in] animation A Tvg_Animation pointer to the animation object. +* \param[in] duration The duration of the animation in seconds. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer or @p duration. +* +* \note If the Picture is not properly configured, this function will return 0. +*/ +TVG_API Tvg_Result tvg_animation_get_duration(Tvg_Animation* animation, float* duration); + + +/*! +* \brief Deletes the given Tvg_Animation object. +* +* \param[in] animation The Tvg_Animation object to be deleted. +* +* \return Tvg_Result enumeration. +* \retval TVG_RESULT_SUCCESS Succeed. +* \retval TVG_RESULT_INVALID_ARGUMENT An invalid Tvg_Animation pointer. +*/ +TVG_API Tvg_Result tvg_animation_del(Tvg_Animation* animation); + + +/** \} */ // end defgroup ThorVG_CAPI + + +#ifdef __cplusplus +} +#endif + +#endif //_THORVG_CAPI_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgAnimation.cpp b/libraries/lvgl/src/libs/thorvg/tvgAnimation.cpp new file mode 100644 index 0000000..ae5e8f9 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgAnimation.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgCommon.h" +#include "tvgFrameModule.h" +#include "tvgPaint.h" +#include "tvgPicture.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct Animation::Impl +{ + Picture* picture = nullptr; + + Impl() + { + picture = Picture::gen().release(); + PP(picture)->ref(); + } + + ~Impl() + { + if (PP(picture)->unref() == 0) { + delete(picture); + } + } +}; + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Animation::~Animation() +{ + delete(pImpl); +} + + +Animation::Animation() : pImpl(new Impl) +{ +} + + +Result Animation::frame(uint32_t no) noexcept +{ + auto loader = pImpl->picture->pImpl->loader.get(); + + if (!loader) return Result::InsufficientCondition; + if (!loader->animatable()) return Result::NonSupport; + + if (static_cast(loader)->frame(no)) return Result::Success; + return Result::InsufficientCondition; +} + + +Picture* Animation::picture() const noexcept +{ + return pImpl->picture; +} + + +uint32_t Animation::curFrame() const noexcept +{ + auto loader = pImpl->picture->pImpl->loader.get(); + + if (!loader) return 0; + if (!loader->animatable()) return 0; + + return static_cast(loader)->curFrame(); +} + + +uint32_t Animation::totalFrame() const noexcept +{ + auto loader = pImpl->picture->pImpl->loader.get(); + + if (!loader) return 0; + if (!loader->animatable()) return 0; + + return static_cast(loader)->totalFrame(); +} + + +float Animation::duration() const noexcept +{ + auto loader = pImpl->picture->pImpl->loader.get(); + + if (!loader) return 0; + if (!loader->animatable()) return 0; + + return static_cast(loader)->duration(); +} + + +unique_ptr Animation::gen() noexcept +{ + return unique_ptr(new Animation); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgArray.h b/libraries/lvgl/src/libs/thorvg/tvgArray.h new file mode 100644 index 0000000..41accc1 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgArray.h @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_ARRAY_H_ +#define _TVG_ARRAY_H_ + +#include +#include + +namespace tvg +{ + +template +struct Array +{ + T* data = nullptr; + uint32_t count = 0; + uint32_t reserved = 0; + + Array(){} + + Array(const Array& rhs) + { + reset(); + *this = rhs; + } + + void push(T element) + { + if (count + 1 > reserved) { + reserved = count + (count + 2) / 2; + data = static_cast(realloc(data, sizeof(T) * reserved)); + } + data[count++] = element; + } + + void push(Array& rhs) + { + grow(rhs.count); + memcpy(data + count, rhs.data, rhs.count * sizeof(T)); + count += rhs.count; + } + + bool reserve(uint32_t size) + { + if (size > reserved) { + reserved = size; + data = static_cast(realloc(data, sizeof(T) * reserved)); + } + return true; + } + + bool grow(uint32_t size) + { + return reserve(count + size); + } + + const T& operator[](size_t idx) const + { + return data[idx]; + } + + T& operator[](size_t idx) + { + return data[idx]; + } + + T* end() + { + return data + count; + } + + const T* end() const + { + return data + count; + } + + const T& last() const + { + return data[count - 1]; + } + + const T& first() const + { + return data[0]; + } + + T& last() + { + return data[count - 1]; + } + + T& first() + { + return data[0]; + } + + void pop() + { + if (count > 0) --count; + } + + void reset() + { + free(data); + data = nullptr; + count = reserved = 0; + } + + void clear() + { + count = 0; + } + + bool empty() const + { + return count == 0; + } + + template + void sort() + { + qsort(data, 0, static_cast(count) - 1); + } + + void operator=(const Array& rhs) + { + reserve(rhs.count); + if (rhs.count > 0) memcpy(data, rhs.data, sizeof(T) * rhs.count); + count = rhs.count; + } + + ~Array() + { + free(data); + } + +private: + template + void qsort(T* arr, int32_t low, int32_t high) + { + if (low < high) { + int32_t i = low; + int32_t j = high; + T tmp = arr[low]; + while (i < j) { + while (i < j && !COMPARE{}(arr[j], tmp)) --j; + if (i < j) { + arr[i] = arr[j]; + ++i; + } + while (i < j && COMPARE{}(arr[i], tmp)) ++i; + if (i < j) { + arr[j] = arr[i]; + --j; + } + } + arr[i] = tmp; + qsort(arr, low, i - 1); + qsort(arr, i + 1, high); + } + } +}; + +} + +#endif //_TVG_ARRAY_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgBezier.cpp b/libraries/lvgl/src/libs/thorvg/tvgBezier.cpp new file mode 100644 index 0000000..e00fc18 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgBezier.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgBezier.h" + +#define BEZIER_EPSILON 1e-4f + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static float _lineLength(const Point& pt1, const Point& pt2) +{ + /* approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. + With alpha = 1, beta = 3/8, giving results with the largest error less + than 7% compared to the exact value. */ + Point diff = {pt2.x - pt1.x, pt2.y - pt1.y}; + if (diff.x < 0) diff.x = -diff.x; + if (diff.y < 0) diff.y = -diff.y; + return (diff.x > diff.y) ? (diff.x + diff.y * 0.375f) : (diff.y + diff.x * 0.375f); +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +namespace tvg +{ + +void bezSplit(const Bezier&cur, Bezier& left, Bezier& right) +{ + auto c = (cur.ctrl1.x + cur.ctrl2.x) * 0.5f; + left.ctrl1.x = (cur.start.x + cur.ctrl1.x) * 0.5f; + right.ctrl2.x = (cur.ctrl2.x + cur.end.x) * 0.5f; + left.start.x = cur.start.x; + right.end.x = cur.end.x; + left.ctrl2.x = (left.ctrl1.x + c) * 0.5f; + right.ctrl1.x = (right.ctrl2.x + c) * 0.5f; + left.end.x = right.start.x = (left.ctrl2.x + right.ctrl1.x) * 0.5f; + + c = (cur.ctrl1.y + cur.ctrl2.y) * 0.5f; + left.ctrl1.y = (cur.start.y + cur.ctrl1.y) * 0.5f; + right.ctrl2.y = (cur.ctrl2.y + cur.end.y) * 0.5f; + left.start.y = cur.start.y; + right.end.y = cur.end.y; + left.ctrl2.y = (left.ctrl1.y + c) * 0.5f; + right.ctrl1.y = (right.ctrl2.y + c) * 0.5f; + left.end.y = right.start.y = (left.ctrl2.y + right.ctrl1.y) * 0.5f; +} + + +float bezLength(const Bezier& cur) +{ + Bezier left, right; + auto len = _lineLength(cur.start, cur.ctrl1) + _lineLength(cur.ctrl1, cur.ctrl2) + _lineLength(cur.ctrl2, cur.end); + auto chord = _lineLength(cur.start, cur.end); + + if (fabsf(len - chord) > BEZIER_EPSILON) { + bezSplit(cur, left, right); + return bezLength(left) + bezLength(right); + } + return len; +} + + +void bezSplitLeft(Bezier& cur, float at, Bezier& left) +{ + left.start = cur.start; + + left.ctrl1.x = cur.start.x + at * (cur.ctrl1.x - cur.start.x); + left.ctrl1.y = cur.start.y + at * (cur.ctrl1.y - cur.start.y); + + left.ctrl2.x = cur.ctrl1.x + at * (cur.ctrl2.x - cur.ctrl1.x); //temporary holding spot + left.ctrl2.y = cur.ctrl1.y + at * (cur.ctrl2.y - cur.ctrl1.y); //temporary holding spot + + cur.ctrl2.x = cur.ctrl2.x + at * (cur.end.x - cur.ctrl2.x); + cur.ctrl2.y = cur.ctrl2.y + at * (cur.end.y - cur.ctrl2.y); + + cur.ctrl1.x = left.ctrl2.x + at * (cur.ctrl2.x - left.ctrl2.x); + cur.ctrl1.y = left.ctrl2.y + at * (cur.ctrl2.y - left.ctrl2.y); + + left.ctrl2.x = left.ctrl1.x + at * (left.ctrl2.x - left.ctrl1.x); + left.ctrl2.y = left.ctrl1.y + at * (left.ctrl2.y - left.ctrl1.y); + + left.end.x = cur.start.x = left.ctrl2.x + at * (cur.ctrl1.x - left.ctrl2.x); + left.end.y = cur.start.y = left.ctrl2.y + at * (cur.ctrl1.y - left.ctrl2.y); +} + + +float bezAt(const Bezier& bz, float at, float length) +{ + auto biggest = 1.0f; + auto smallest = 0.0f; + auto t = 0.5f; + + //just in case to prevent an infinite loop + if (at <= 0) return 0.0f; + if (at >= length) return 1.0f; + + while (true) { + auto right = bz; + Bezier left; + bezSplitLeft(right, t, left); + length = bezLength(left); + if (fabsf(length - at) < BEZIER_EPSILON || fabsf(smallest - biggest) < BEZIER_EPSILON) { + break; + } + if (length < at) { + smallest = t; + t = (t + biggest) * 0.5f; + } else { + biggest = t; + t = (smallest + t) * 0.5f; + } + } + return t; +} + + +void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right) +{ + right = cur; + auto t = bezAt(right, at, bezLength(right)); + bezSplitLeft(right, t, left); +} + + +Point bezPointAt(const Bezier& bz, float t) +{ + Point cur; + auto it = 1.0f - t; + + auto ax = bz.start.x * it + bz.ctrl1.x * t; + auto bx = bz.ctrl1.x * it + bz.ctrl2.x * t; + auto cx = bz.ctrl2.x * it + bz.end.x * t; + ax = ax * it + bx * t; + bx = bx * it + cx * t; + cur.x = ax * it + bx * t; + + float ay = bz.start.y * it + bz.ctrl1.y * t; + float by = bz.ctrl1.y * it + bz.ctrl2.y * t; + float cy = bz.ctrl2.y * it + bz.end.y * t; + ay = ay * it + by * t; + by = by * it + cy * t; + cur.y = ay * it + by * t; + + return cur; +} + + +float bezAngleAt(const Bezier& bz, float t) +{ + if (t < 0 || t > 1) return 0; + + //derivate + // p'(t) = 3 * (-(1-2t+t^2) * p0 + (1 - 4 * t + 3 * t^2) * p1 + (2 * t - 3 * + // t^2) * p2 + t^2 * p3) + float mt = 1.0f - t; + float d = t * t; + float a = -mt * mt; + float b = 1 - 4 * t + 3 * d; + float c = 2 * t - 3 * d; + + Point pt ={a * bz.start.x + b * bz.ctrl1.x + c * bz.ctrl2.x + d * bz.end.x, a * bz.start.y + b * bz.ctrl1.y + c * bz.ctrl2.y + d * bz.end.y}; + pt.x *= 3; + pt.y *= 3; + + return atan2(pt.x, pt.y) * 180.0f / 3.141592f; +} + + +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgBezier.h b/libraries/lvgl/src/libs/thorvg/tvgBezier.h new file mode 100644 index 0000000..24f70f3 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgBezier.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_BEZIER_H_ +#define _TVG_BEZIER_H_ + +#include "tvgCommon.h" + +namespace tvg +{ + +struct Bezier +{ + Point start; + Point ctrl1; + Point ctrl2; + Point end; +}; + +void bezSplit(const Bezier&cur, Bezier& left, Bezier& right); +float bezLength(const Bezier& cur); +void bezSplitLeft(Bezier& cur, float at, Bezier& left); +float bezAt(const Bezier& bz, float at, float length); +void bezSplitAt(const Bezier& cur, float at, Bezier& left, Bezier& right); +Point bezPointAt(const Bezier& bz, float t); +float bezAngleAt(const Bezier& bz, float t); + +} + +#endif //_TVG_BEZIER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCanvas.cpp b/libraries/lvgl/src/libs/thorvg/tvgCanvas.cpp new file mode 100644 index 0000000..4da0e5e --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCanvas.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgCanvas.h" + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Canvas::Canvas(RenderMethod *pRenderer):pImpl(new Impl(pRenderer)) +{ +} + + +Canvas::~Canvas() +{ + delete(pImpl); +} + + +Result Canvas::reserve(TVG_UNUSED uint32_t n) noexcept +{ + return Result::NonSupport; +} + + +list& Canvas::paints() noexcept +{ + return pImpl->paints; +} + + +Result Canvas::push(unique_ptr paint) noexcept +{ + return pImpl->push(std::move(paint)); +} + + +Result Canvas::clear(bool free) noexcept +{ + return pImpl->clear(free); +} + + +Result Canvas::draw() noexcept +{ + TVGLOG("COMMON", "Draw S. -------------------------------- Canvas(%p)", this); + auto ret = pImpl->draw(); + TVGLOG("COMMON", "Draw E. -------------------------------- Canvas(%p)", this); + + return ret; +} + + +Result Canvas::update(Paint* paint) noexcept +{ + TVGLOG("COMMON", "Update S. ------------------------------ Canvas(%p)", this); + auto ret = pImpl->update(paint, false); + TVGLOG("COMMON", "Update E. ------------------------------ Canvas(%p)", this); + + return ret; +} + + +Result Canvas::sync() noexcept +{ + return pImpl->sync(); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCanvas.h b/libraries/lvgl/src/libs/thorvg/tvgCanvas.h new file mode 100644 index 0000000..852f7db --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCanvas.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_CANVAS_IMPL_H_ +#define _TVG_CANVAS_IMPL_H_ + +#include "tvgPaint.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct Canvas::Impl +{ + list paints; + RenderMethod* renderer; + bool refresh = false; //if all paints should be updated by force. + bool drawing = false; //on drawing condition? + + Impl(RenderMethod* pRenderer):renderer(pRenderer) + { + } + + ~Impl() + { + clear(true); + delete(renderer); + } + + Result push(unique_ptr paint) + { + //You can not push paints during rendering. + if (drawing) return Result::InsufficientCondition; + + auto p = paint.release(); + if (!p) return Result::MemoryCorruption; + PP(p)->ref(); + paints.push_back(p); + + return update(p, true); + } + + Result clear(bool free) + { + //Clear render target before drawing + if (!renderer || !renderer->clear()) return Result::InsufficientCondition; + + //Free paints + if (free) { + for (auto paint : paints) { + P(paint)->unref(); + if (paint->pImpl->dispose(*renderer) && P(paint)->refCnt == 0) { + delete(paint); + } + } + paints.clear(); + } + drawing = false; + + return Result::Success; + } + + void needRefresh() + { + refresh = true; + } + + Result update(Paint* paint, bool force) + { + if (paints.empty() || drawing || !renderer) return Result::InsufficientCondition; + + Array clips; + auto flag = RenderUpdateFlag::None; + if (refresh || force) flag = RenderUpdateFlag::All; + + //Update single paint node + if (paint) { + //Optimize Me: Can we skip the searching? + for (auto paint2 : paints) { + if (paint2 == paint) { + paint->pImpl->update(*renderer, nullptr, clips, 255, flag); + return Result::Success; + } + } + return Result::InvalidArguments; + //Update all retained paint nodes + } else { + for (auto paint : paints) { + paint->pImpl->update(*renderer, nullptr, clips, 255, flag); + } + } + + refresh = false; + + return Result::Success; + } + + Result draw() + { + if (drawing || paints.empty() || !renderer || !renderer->preRender()) return Result::InsufficientCondition; + + bool rendered = false; + for (auto paint : paints) { + if (paint->pImpl->render(*renderer)) rendered = true; + } + + if (!rendered || !renderer->postRender()) return Result::InsufficientCondition; + + drawing = true; + + return Result::Success; + } + + Result sync() + { + if (!drawing) return Result::InsufficientCondition; + + if (renderer->sync()) { + drawing = false; + return Result::Success; + } + + return Result::InsufficientCondition; + } +}; + +#endif /* _TVG_CANVAS_IMPL_H_ */ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCapi.cpp b/libraries/lvgl/src/libs/thorvg/tvgCapi.cpp new file mode 100644 index 0000000..203a11d --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCapi.cpp @@ -0,0 +1,784 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include "thorvg.h" +#include "thorvg_capi.h" + +using namespace std; +using namespace tvg; + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************/ +/* Engine API */ +/************************************************************************/ + +TVG_API Tvg_Result tvg_engine_init(Tvg_Engine engine_method, unsigned threads) +{ + return (Tvg_Result) Initializer::init(CanvasEngine(engine_method), threads); +} + + +TVG_API Tvg_Result tvg_engine_term(Tvg_Engine engine_method) +{ + return (Tvg_Result) Initializer::term(CanvasEngine(engine_method)); +} + + +/************************************************************************/ +/* Canvas API */ +/************************************************************************/ + +TVG_API Tvg_Canvas* tvg_swcanvas_create() +{ + return (Tvg_Canvas*) SwCanvas::gen().release(); +} + + +TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + delete(reinterpret_cast(canvas)); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_swcanvas_set_mempool(Tvg_Canvas* canvas, Tvg_Mempool_Policy policy) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->mempool(static_cast(policy)); +} + + +TVG_API Tvg_Result tvg_swcanvas_set_target(Tvg_Canvas* canvas, uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Tvg_Colorspace cs) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->target(buffer, stride, w, h, static_cast(cs)); +} + + +TVG_API Tvg_Result tvg_canvas_push(Tvg_Canvas* canvas, Tvg_Paint* paint) +{ + if (!canvas || !paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->push(unique_ptr((Paint*)paint)); +} + + +TVG_API Tvg_Result tvg_canvas_reserve(Tvg_Canvas* canvas, uint32_t n) +{ + return TVG_RESULT_NOT_SUPPORTED; +} + + +TVG_API Tvg_Result tvg_canvas_clear(Tvg_Canvas* canvas, bool free) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->clear(free); +} + + +TVG_API Tvg_Result tvg_canvas_update(Tvg_Canvas* canvas) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->update(nullptr); +} + + +TVG_API Tvg_Result tvg_canvas_update_paint(Tvg_Canvas* canvas, Tvg_Paint* paint) +{ + if (!canvas || !paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->update((Paint*) paint); +} + + +TVG_API Tvg_Result tvg_canvas_draw(Tvg_Canvas* canvas) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->draw(); +} + + +TVG_API Tvg_Result tvg_canvas_sync(Tvg_Canvas* canvas) +{ + if (!canvas) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(canvas)->sync(); +} + + +/************************************************************************/ +/* Paint API */ +/************************************************************************/ + +TVG_API Tvg_Result tvg_paint_del(Tvg_Paint* paint) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + delete(reinterpret_cast(paint)); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_paint_scale(Tvg_Paint* paint, float factor) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->scale(factor); +} + + +TVG_API Tvg_Result tvg_paint_rotate(Tvg_Paint* paint, float degree) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->rotate(degree); +} + + +TVG_API Tvg_Result tvg_paint_translate(Tvg_Paint* paint, float x, float y) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->translate(x, y); +} + + +TVG_API Tvg_Result tvg_paint_set_transform(Tvg_Paint* paint, const Tvg_Matrix* m) +{ + if (!paint || !m) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->transform(*(reinterpret_cast(m))); +} + + +TVG_API Tvg_Result tvg_paint_get_transform(Tvg_Paint* paint, Tvg_Matrix* m) +{ + if (!paint || !m) return TVG_RESULT_INVALID_ARGUMENT; + *reinterpret_cast(m) = reinterpret_cast(paint)->transform(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint) +{ + if (!paint) return nullptr; + return (Tvg_Paint*) reinterpret_cast(paint)->duplicate(); +} + + +TVG_API Tvg_Result tvg_paint_set_opacity(Tvg_Paint* paint, uint8_t opacity) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->opacity(opacity); +} + + +TVG_API Tvg_Result tvg_paint_get_opacity(const Tvg_Paint* paint, uint8_t* opacity) +{ + if (!paint || !opacity) return TVG_RESULT_INVALID_ARGUMENT; + *opacity = reinterpret_cast(paint)->opacity(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, float* y, float* w, float* h, bool transformed) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->bounds(x, y, w, h, transformed); +} + + +TVG_API Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->composite(unique_ptr((Paint*)(target)), (CompositeMethod)method); +} + + +TVG_API Tvg_Result tvg_paint_get_composite_method(const Tvg_Paint* paint, const Tvg_Paint** target, Tvg_Composite_Method* method) +{ + if (!paint || !target || !method) return TVG_RESULT_INVALID_ARGUMENT; + *reinterpret_cast(method) = reinterpret_cast(paint)->composite(reinterpret_cast(target)); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_paint_set_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method method) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->blend((BlendMethod)method); +} + + +TVG_API Tvg_Result tvg_paint_get_blend_method(const Tvg_Paint* paint, Tvg_Blend_Method* method) +{ + if (!paint || !method) return TVG_RESULT_INVALID_ARGUMENT; + *method = static_cast(reinterpret_cast(paint)->blend()); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_paint_get_identifier(const Tvg_Paint* paint, Tvg_Identifier* identifier) +{ + if (!paint || !identifier) return TVG_RESULT_INVALID_ARGUMENT; + *identifier = static_cast(reinterpret_cast(paint)->identifier()); + return TVG_RESULT_SUCCESS; +} + +/************************************************************************/ +/* Shape API */ +/************************************************************************/ + +TVG_API Tvg_Paint* tvg_shape_new() +{ + return (Tvg_Paint*) Shape::gen().release(); +} + + +TVG_API Tvg_Result tvg_shape_reset(Tvg_Paint* paint) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->reset(); +} + + +TVG_API Tvg_Result tvg_shape_move_to(Tvg_Paint* paint, float x, float y) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->moveTo(x, y); +} + + +TVG_API Tvg_Result tvg_shape_line_to(Tvg_Paint* paint, float x, float y) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->lineTo(x, y); +} + + +TVG_API Tvg_Result tvg_shape_cubic_to(Tvg_Paint* paint, float cx1, float cy1, float cx2, float cy2, float x, float y) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->cubicTo(cx1, cy1, cx2, cy2, x, y); +} + + +TVG_API Tvg_Result tvg_shape_close(Tvg_Paint* paint) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->close(); +} + + +TVG_API Tvg_Result tvg_shape_append_rect(Tvg_Paint* paint, float x, float y, float w, float h, float rx, float ry) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->appendRect(x, y, w, h, rx, ry); +} + + +TVG_API Tvg_Result tvg_shape_append_arc(Tvg_Paint* paint, float cx, float cy, float radius, float startAngle, float sweep, uint8_t pie) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->appendArc(cx, cy, radius, startAngle, sweep, pie); +} + + +TVG_API Tvg_Result tvg_shape_append_circle(Tvg_Paint* paint, float cx, float cy, float rx, float ry) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->appendCircle(cx, cy, rx, ry); +} + + +TVG_API Tvg_Result tvg_shape_append_path(Tvg_Paint* paint, const Tvg_Path_Command* cmds, uint32_t cmdCnt, const Tvg_Point* pts, uint32_t ptsCnt) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->appendPath((const PathCommand*)cmds, cmdCnt, (const Point*)pts, ptsCnt); +} + + +TVG_API Tvg_Result tvg_shape_get_path_coords(const Tvg_Paint* paint, const Tvg_Point** pts, uint32_t* cnt) +{ + if (!paint || !pts || !cnt) return TVG_RESULT_INVALID_ARGUMENT; + *cnt = reinterpret_cast(paint)->pathCoords((const Point**)pts); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_get_path_commands(const Tvg_Paint* paint, const Tvg_Path_Command** cmds, uint32_t* cnt) +{ + if (!paint || !cmds || !cnt) return TVG_RESULT_INVALID_ARGUMENT; + *cnt = reinterpret_cast(paint)->pathCommands((const PathCommand**)cmds); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_width(Tvg_Paint* paint, float width) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke(width); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_width(const Tvg_Paint* paint, float* width) +{ + if (!paint || !width) return TVG_RESULT_INVALID_ARGUMENT; + *width = reinterpret_cast(paint)->strokeWidth(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke(r, g, b, a); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->strokeColor(r, g, b, a); +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke(unique_ptr((LinearGradient*)(gradient))); +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke(unique_ptr((RadialGradient*)(gradient))); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient) +{ + if (!paint || !gradient) return TVG_RESULT_INVALID_ARGUMENT; + *gradient = (Tvg_Gradient*)(reinterpret_cast(paint)->strokeFill()); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_dash(Tvg_Paint* paint, const float* dashPattern, uint32_t cnt) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke(dashPattern, cnt); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_dash(const Tvg_Paint* paint, const float** dashPattern, uint32_t* cnt) +{ + if (!paint || !cnt || !dashPattern) return TVG_RESULT_INVALID_ARGUMENT; + *cnt = reinterpret_cast(paint)->strokeDash(dashPattern); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_cap(Tvg_Paint* paint, Tvg_Stroke_Cap cap) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke((StrokeCap)cap); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_cap(const Tvg_Paint* paint, Tvg_Stroke_Cap* cap) +{ + if (!paint || !cap) return TVG_RESULT_INVALID_ARGUMENT; + *cap = (Tvg_Stroke_Cap) reinterpret_cast(paint)->strokeCap(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_join(Tvg_Paint* paint, Tvg_Stroke_Join join) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->stroke((StrokeJoin)join); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_join(const Tvg_Paint* paint, Tvg_Stroke_Join* join) +{ + if (!paint || !join) return TVG_RESULT_INVALID_ARGUMENT; + *join = (Tvg_Stroke_Join) reinterpret_cast(paint)->strokeJoin(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_stroke_miterlimit(Tvg_Paint* paint, float ml) +{ + if (ml < 0.0f) return TVG_RESULT_NOT_SUPPORTED; + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->strokeMiterlimit(ml); +} + + +TVG_API Tvg_Result tvg_shape_get_stroke_miterlimit(const Tvg_Paint* paint, float* ml) +{ + if (!paint || !ml) return TVG_RESULT_INVALID_ARGUMENT; + *ml = reinterpret_cast(paint)->strokeMiterlimit(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_fill_color(Tvg_Paint* paint, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->fill(r, g, b, a); +} + + +TVG_API Tvg_Result tvg_shape_get_fill_color(const Tvg_Paint* paint, uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->fillColor(r, g, b, a); +} + + +TVG_API Tvg_Result tvg_shape_set_fill_rule(Tvg_Paint* paint, Tvg_Fill_Rule rule) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->fill((FillRule)rule); +} + + +TVG_API Tvg_Result tvg_shape_get_fill_rule(const Tvg_Paint* paint, Tvg_Fill_Rule* rule) +{ + if (!paint || !rule) return TVG_RESULT_INVALID_ARGUMENT; + *rule = (Tvg_Fill_Rule) reinterpret_cast(paint)->fillRule(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_shape_set_paint_order(Tvg_Paint* paint, bool strokeFirst) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->order(strokeFirst); +} + + +TVG_API Tvg_Result tvg_shape_set_linear_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->fill(unique_ptr((LinearGradient*)(gradient))); +} + + +TVG_API Tvg_Result tvg_shape_set_radial_gradient(Tvg_Paint* paint, Tvg_Gradient* gradient) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->fill(unique_ptr((RadialGradient*)(gradient))); +} + + +TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient) +{ + if (!paint || !gradient) return TVG_RESULT_INVALID_ARGUMENT; + *gradient = (Tvg_Gradient*)(reinterpret_cast(paint)->fill()); + return TVG_RESULT_SUCCESS; +} + +/************************************************************************/ +/* Picture API */ +/************************************************************************/ + +TVG_API Tvg_Paint* tvg_picture_new() +{ + return (Tvg_Paint*) Picture::gen().release(); +} + + +TVG_API Tvg_Result tvg_picture_load(Tvg_Paint* paint, const char* path) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->load(path); +} + + +TVG_API Tvg_Result tvg_picture_load_raw(Tvg_Paint* paint, uint32_t *data, uint32_t w, uint32_t h, bool copy) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->load(data, w, h, copy); +} + + +TVG_API Tvg_Result tvg_picture_load_data(Tvg_Paint* paint, const char *data, uint32_t size, const char *mimetype, bool copy) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->load(data, size, mimetype ? mimetype : "", copy); +} + + +TVG_API Tvg_Result tvg_picture_set_size(Tvg_Paint* paint, float w, float h) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->size(w, h); +} + + +TVG_API Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float* h) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(paint)->size(w, h); +} + + +/************************************************************************/ +/* Gradient API */ +/************************************************************************/ + +TVG_API Tvg_Gradient* tvg_linear_gradient_new() +{ + return (Tvg_Gradient*)LinearGradient::gen().release(); +} + + +TVG_API Tvg_Gradient* tvg_radial_gradient_new() +{ + return (Tvg_Gradient*)RadialGradient::gen().release(); +} + + +TVG_API Tvg_Gradient* tvg_gradient_duplicate(Tvg_Gradient* grad) +{ + if (!grad) return nullptr; + return (Tvg_Gradient*) reinterpret_cast(grad)->duplicate(); +} + + +TVG_API Tvg_Result tvg_gradient_del(Tvg_Gradient* grad) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + delete(reinterpret_cast(grad)); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_linear_gradient_set(Tvg_Gradient* grad, float x1, float y1, float x2, float y2) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->linear(x1, y1, x2, y2); +} + + +TVG_API Tvg_Result tvg_linear_gradient_get(Tvg_Gradient* grad, float* x1, float* y1, float* x2, float* y2) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->linear(x1, y1, x2, y2); +} + + +TVG_API Tvg_Result tvg_radial_gradient_set(Tvg_Gradient* grad, float cx, float cy, float radius) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->radial(cx, cy, radius); +} + + +TVG_API Tvg_Result tvg_radial_gradient_get(Tvg_Gradient* grad, float* cx, float* cy, float* radius) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->radial(cx, cy, radius); +} + + +TVG_API Tvg_Result tvg_gradient_set_color_stops(Tvg_Gradient* grad, const Tvg_Color_Stop* color_stop, uint32_t cnt) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->colorStops(reinterpret_cast(color_stop), cnt); +} + + +TVG_API Tvg_Result tvg_gradient_get_color_stops(const Tvg_Gradient* grad, const Tvg_Color_Stop** color_stop, uint32_t* cnt) +{ + if (!grad || !color_stop || !cnt) return TVG_RESULT_INVALID_ARGUMENT; + *cnt = reinterpret_cast(grad)->colorStops(reinterpret_cast(color_stop)); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_gradient_set_spread(Tvg_Gradient* grad, const Tvg_Stroke_Fill spread) +{ + if (!grad) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->spread((FillSpread)spread); +} + + +TVG_API Tvg_Result tvg_gradient_get_spread(const Tvg_Gradient* grad, Tvg_Stroke_Fill* spread) +{ + if (!grad || !spread) return TVG_RESULT_INVALID_ARGUMENT; + *spread = (Tvg_Stroke_Fill) reinterpret_cast(grad)->spread(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_gradient_set_transform(Tvg_Gradient* grad, const Tvg_Matrix* m) +{ + if (!grad || !m) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(grad)->transform(*(reinterpret_cast(m))); +} + + +TVG_API Tvg_Result tvg_gradient_get_transform(const Tvg_Gradient* grad, Tvg_Matrix* m) +{ + if (!grad || !m) return TVG_RESULT_INVALID_ARGUMENT; + *reinterpret_cast(m) = reinterpret_cast(const_cast(grad))->transform(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_gradient_get_identifier(const Tvg_Gradient* grad, Tvg_Identifier* identifier) +{ + if (!grad || !identifier) return TVG_RESULT_INVALID_ARGUMENT; + *identifier = static_cast(reinterpret_cast(grad)->identifier()); + return TVG_RESULT_SUCCESS; +} + +/************************************************************************/ +/* Scene API */ +/************************************************************************/ + +TVG_API Tvg_Paint* tvg_scene_new() +{ + return (Tvg_Paint*) Scene::gen().release(); +} + + +TVG_API Tvg_Result tvg_scene_reserve(Tvg_Paint* scene, uint32_t size) +{ + return TVG_RESULT_NOT_SUPPORTED; +} + + +TVG_API Tvg_Result tvg_scene_push(Tvg_Paint* scene, Tvg_Paint* paint) +{ + if (!scene || !paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(scene)->push(unique_ptr((Paint*)paint)); +} + + +TVG_API Tvg_Result tvg_scene_clear(Tvg_Paint* scene, bool free) +{ + if (!scene) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(scene)->clear(free); +} + + +/************************************************************************/ +/* Saver API */ +/************************************************************************/ + +TVG_API Tvg_Saver* tvg_saver_new() +{ + return (Tvg_Saver*) Saver::gen().release(); +} + + +TVG_API Tvg_Result tvg_saver_save(Tvg_Saver* saver, Tvg_Paint* paint, const char* path, bool compress) +{ + if (!saver || !paint || !path) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(saver)->save(unique_ptr((Paint*)paint), path, compress); +} + + +TVG_API Tvg_Result tvg_saver_sync(Tvg_Saver* saver) +{ + if (!saver) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(saver)->sync(); +} + + +TVG_API Tvg_Result tvg_saver_del(Tvg_Saver* saver) +{ + if (!saver) return TVG_RESULT_INVALID_ARGUMENT; + delete(reinterpret_cast(saver)); + return TVG_RESULT_SUCCESS; +} + + +/************************************************************************/ +/* Animation API */ +/************************************************************************/ + +TVG_API Tvg_Animation* tvg_animation_new() +{ + return (Tvg_Animation*) Animation::gen().release(); +} + + +TVG_API Tvg_Result tvg_animation_set_frame(Tvg_Animation* animation, uint32_t no) +{ + return TVG_RESULT_INVALID_ARGUMENT; +// if (!animation) return TVG_RESULT_INVALID_ARGUMENT; +// return (Tvg_Result) reinterpret_cast(animation)->frame(no); +} + + +TVG_API Tvg_Result tvg_animation_get_frame(Tvg_Animation* animation, uint32_t* no) +{ + if (!animation || !no) return TVG_RESULT_INVALID_ARGUMENT; + *no = reinterpret_cast(animation)->curFrame(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_animation_get_total_frame(Tvg_Animation* animation, uint32_t* cnt) +{ + if (!animation || !cnt) return TVG_RESULT_INVALID_ARGUMENT; + *cnt = reinterpret_cast(animation)->totalFrame(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Paint* tvg_animation_get_picture(Tvg_Animation* animation) +{ + if (!animation) return nullptr; + return (Tvg_Paint*) reinterpret_cast(animation)->picture(); +} + + +TVG_API Tvg_Result tvg_animation_get_duration(Tvg_Animation* animation, float* duration) +{ + if (!animation || !duration) return TVG_RESULT_INVALID_ARGUMENT; + *duration = reinterpret_cast(animation)->duration(); + return TVG_RESULT_SUCCESS; +} + + +TVG_API Tvg_Result tvg_animation_del(Tvg_Animation* animation) +{ + if (!animation) return TVG_RESULT_INVALID_ARGUMENT; + delete(reinterpret_cast(animation)); + return TVG_RESULT_SUCCESS; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCommon.h b/libraries/lvgl/src/libs/thorvg/tvgCommon.h new file mode 100644 index 0000000..d706811 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCommon.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_COMMON_H_ +#define _TVG_COMMON_H_ + +#include "config.h" +#include "thorvg.h" + +using namespace std; +using namespace tvg; + +//for MSVC Compat +#ifdef _MSC_VER + #define TVG_UNUSED + #define strncasecmp _strnicmp + #define strcasecmp _stricmp +#else + #define TVG_UNUSED __attribute__ ((__unused__)) +#endif + +// Portable 'fallthrough' attribute +#if __has_cpp_attribute(fallthrough) + #ifdef _MSC_VER + #define TVG_FALLTHROUGH [[fallthrough]]; + #else + #define TVG_FALLTHROUGH __attribute__ ((fallthrough)); + #endif +#else + #define TVG_FALLTHROUGH +#endif + +#if defined(_MSC_VER) && defined(__clang__) + #define strncpy strncpy_s + #define strdup _strdup +#endif + +//TVG class identifier values +#define TVG_CLASS_ID_UNDEFINED 0 +#define TVG_CLASS_ID_SHAPE 1 +#define TVG_CLASS_ID_SCENE 2 +#define TVG_CLASS_ID_PICTURE 3 +#define TVG_CLASS_ID_LINEAR 4 +#define TVG_CLASS_ID_RADIAL 5 + +enum class FileType { Tvg = 0, Svg, Lottie, Raw, Png, Jpg, Webp, Unknown }; + +using Size = Point; + +#ifdef THORVG_LOG_ENABLED + constexpr auto ErrorColor = "\033[31m"; //red + constexpr auto ErrorBgColor = "\033[41m";//bg red + constexpr auto LogColor = "\033[32m"; //green + constexpr auto LogBgColor = "\033[42m"; //bg green + constexpr auto GreyColor = "\033[90m"; //grey + constexpr auto ResetColors = "\033[0m"; //default + #define TVGERR(tag, fmt, ...) fprintf(stderr, "%s[E]%s %s" tag "%s (%s %d): %s" fmt "\n", ErrorBgColor, ResetColors, ErrorColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) + #define TVGLOG(tag, fmt, ...) fprintf(stdout, "%s[L]%s %s" tag "%s (%s %d): %s" fmt "\n", LogBgColor, ResetColors, LogColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) +#else + #define TVGERR(...) do {} while(0) + #define TVGLOG(...) do {} while(0) +#endif + +uint16_t THORVG_VERSION_NUMBER(); + + +#define P(A) ((A)->pImpl) //Access to pimpl. +#define PP(A) (((Paint*)(A))->pImpl) //Access to pimpl. + +#endif //_TVG_COMMON_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCompressor.cpp b/libraries/lvgl/src/libs/thorvg/tvgCompressor.cpp new file mode 100644 index 0000000..2094171 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCompressor.cpp @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +/* + * Lempel–Ziv–Welch (LZW) encoder/decoder by Guilherme R. Lampert(guilherme.ronaldo.lampert@gmail.com) + + * This is the compression scheme used by the GIF image format and the Unix 'compress' tool. + * Main differences from this implementation is that End Of Input (EOI) and Clear Codes (CC) + * are not stored in the output and the max code length in bits is 12, vs 16 in compress. + * + * EOI is simply detected by the end of the data stream, while CC happens if the + * dictionary gets filled. Data is written/read from bit streams, which handle + * byte-alignment for us in a transparent way. + + * The decoder relies on the hardcoded data layout produced by the encoder, since + * no additional reconstruction data is added to the output, so they must match. + * The nice thing about LZW is that we can reconstruct the dictionary directly from + * the stream of codes generated by the encoder, so this avoids storing additional + * headers in the bit stream. + + * The output code length is variable. It starts with the minimum number of bits + * required to store the base byte-sized dictionary and automatically increases + * as the dictionary gets larger (it starts at 9-bits and grows to 10-bits when + * code 512 is added, then 11-bits when 1024 is added, and so on). If the dictionary + * is filled (4096 items for a 12-bits dictionary), the whole thing is cleared and + * the process starts over. This is the main reason why the encoder and the decoder + * must match perfectly, since the lengths of the codes will not be specified with + * the data itself. + + * USEFUL LINKS: + * https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch + * http://rosettacode.org/wiki/LZW_compression + * http://www.cs.duke.edu/csed/curious/compression/lzw.html + * http://www.cs.cf.ac.uk/Dave/Multimedia/node214.html + * http://marknelson.us/1989/10/01/lzw-data-compression/ + */ +#include "config.h" + + + +#include +#include +#include "tvgCompressor.h" + +namespace tvg { + + +/************************************************************************/ +/* LZW Implementation */ +/************************************************************************/ + + +//LZW Dictionary helper: +constexpr int Nil = -1; +constexpr int MaxDictBits = 12; +constexpr int StartBits = 9; +constexpr int FirstCode = (1 << (StartBits - 1)); // 256 +constexpr int MaxDictEntries = (1 << MaxDictBits); // 4096 + + +//Round up to the next power-of-two number, e.g. 37 => 64 +static int nextPowerOfTwo(int num) +{ + --num; + for (size_t i = 1; i < sizeof(num) * 8; i <<= 1) { + num = num | num >> i; + } + return ++num; +} + + +struct BitStreamWriter +{ + uint8_t* stream; //Growable buffer to store our bits. Heap allocated & owned by the class instance. + int bytesAllocated; //Current size of heap-allocated stream buffer *in bytes*. + int granularity; //Amount bytesAllocated multiplies by when auto-resizing in appendBit(). + int currBytePos; //Current byte being written to, from 0 to bytesAllocated-1. + int nextBitPos; //Bit position within the current byte to access next. 0 to 7. + int numBitsWritten; //Number of bits in use from the stream buffer, not including byte-rounding padding. + + void internalInit() + { + stream = nullptr; + bytesAllocated = 0; + granularity = 2; + currBytePos = 0; + nextBitPos = 0; + numBitsWritten = 0; + } + + uint8_t* allocBytes(const int bytesWanted, uint8_t * oldPtr, const int oldSize) + { + auto newMemory = static_cast(malloc(bytesWanted)); + memset(newMemory, 0, bytesWanted); + + if (oldPtr) { + memcpy(newMemory, oldPtr, oldSize); + free(oldPtr); + } + return newMemory; + } + + BitStreamWriter() + { + /* 8192 bits for a start (1024 bytes). It will resize if needed. + Default granularity is 2. */ + internalInit(); + allocate(8192); + } + + BitStreamWriter(const int initialSizeInBits, const int growthGranularity = 2) + { + internalInit(); + setGranularity(growthGranularity); + allocate(initialSizeInBits); + } + + ~BitStreamWriter() + { + free(stream); + } + + void allocate(int bitsWanted) + { + //Require at least a byte. + if (bitsWanted <= 0) bitsWanted = 8; + + //Round upwards if needed: + if ((bitsWanted % 8) != 0) bitsWanted = nextPowerOfTwo(bitsWanted); + + //We might already have the required count. + const int sizeInBytes = bitsWanted / 8; + if (sizeInBytes <= bytesAllocated) return; + + stream = allocBytes(sizeInBytes, stream, bytesAllocated); + bytesAllocated = sizeInBytes; + } + + void appendBit(const int bit) + { + const uint32_t mask = uint32_t(1) << nextBitPos; + stream[currBytePos] = (stream[currBytePos] & ~mask) | (-bit & mask); + ++numBitsWritten; + + if (++nextBitPos == 8) { + nextBitPos = 0; + if (++currBytePos == bytesAllocated) allocate(bytesAllocated * granularity * 8); + } + } + + void appendBitsU64(const uint64_t num, const int bitCount) + { + for (int b = 0; b < bitCount; ++b) { + const uint64_t mask = uint64_t(1) << b; + const int bit = !!(num & mask); + appendBit(bit); + } + } + + uint8_t* release() + { + auto oldPtr = stream; + internalInit(); + return oldPtr; + } + + void setGranularity(const int growthGranularity) + { + granularity = (growthGranularity >= 2) ? growthGranularity : 2; + } + + int getByteCount() const + { + int usedBytes = numBitsWritten / 8; + int leftovers = numBitsWritten % 8; + if (leftovers != 0) ++usedBytes; + return usedBytes; + } +}; + + +struct BitStreamReader +{ + const uint8_t* stream; // Pointer to the external bit stream. Not owned by the reader. + const int sizeInBytes; // Size of the stream *in bytes*. Might include padding. + const int sizeInBits; // Size of the stream *in bits*, padding *not* include. + int currBytePos = 0; // Current byte being read in the stream. + int nextBitPos = 0; // Bit position within the current byte to access next. 0 to 7. + int numBitsRead = 0; // Total bits read from the stream so far. Never includes byte-rounding padding. + + BitStreamReader(const uint8_t* bitStream, const int byteCount, const int bitCount) : stream(bitStream), sizeInBytes(byteCount), sizeInBits(bitCount) + { + } + + bool readNextBit(int& bitOut) + { + if (numBitsRead >= sizeInBits) return false; //We are done. + + const uint32_t mask = uint32_t(1) << nextBitPos; + bitOut = !!(stream[currBytePos] & mask); + ++numBitsRead; + + if (++nextBitPos == 8) { + nextBitPos = 0; + ++currBytePos; + } + return true; + } + + uint64_t readBitsU64(const int bitCount) + { + uint64_t num = 0; + for (int b = 0; b < bitCount; ++b) { + int bit; + if (!readNextBit(bit)) break; + /* Based on a "Stanford bit-hack": + http://graphics.stanford.edu/~seander/bithacks.html#ConditionalSetOrClearBitsWithoutBranching */ + const uint64_t mask = uint64_t(1) << b; + num = (num & ~mask) | (-bit & mask); + } + return num; + } + + bool isEndOfStream() const + { + return numBitsRead >= sizeInBits; + } +}; + + +struct Dictionary +{ + struct Entry + { + int code; + int value; + }; + + //Dictionary entries 0-255 are always reserved to the byte/ASCII range. + int size; + Entry entries[MaxDictEntries]; + + Dictionary() + { + /* First 256 dictionary entries are reserved to the byte/ASCII range. + Additional entries follow for the character sequences found in the input. + Up to 4096 - 256 (MaxDictEntries - FirstCode). */ + size = FirstCode; + + for (int i = 0; i < size; ++i) { + entries[i].code = Nil; + entries[i].value = i; + } + } + + int findIndex(const int code, const int value) const + { + if (code == Nil) return value; + + //Linear search for now. + //TODO: Worth optimizing with a proper hash-table? + for (int i = 0; i < size; ++i) { + if (entries[i].code == code && entries[i].value == value) return i; + } + return Nil; + } + + bool add(const int code, const int value) + { + if (size == MaxDictEntries) return false; + entries[size].code = code; + entries[size].value = value; + ++size; + return true; + } + + bool flush(int & codeBitsWidth) + { + if (size == (1 << codeBitsWidth)) { + ++codeBitsWidth; + if (codeBitsWidth > MaxDictBits) { + //Clear the dictionary (except the first 256 byte entries). + codeBitsWidth = StartBits; + size = FirstCode; + return true; + } + } + return false; + } +}; + + +static bool outputByte(int code, uint8_t*& output, int outputSizeBytes, int& bytesDecodedSoFar) +{ + if (bytesDecodedSoFar >= outputSizeBytes) return false; + *output++ = static_cast(code); + ++bytesDecodedSoFar; + return true; +} + + +static bool outputSequence(const Dictionary& dict, int code, uint8_t*& output, int outputSizeBytes, int& bytesDecodedSoFar, int& firstByte) +{ + /* A sequence is stored backwards, so we have to write + it to a temp then output the buffer in reverse. */ + int i = 0; + uint8_t sequence[MaxDictEntries]; + + do { + sequence[i++] = dict.entries[code].value; + code = dict.entries[code].code; + } while (code >= 0); + + firstByte = sequence[--i]; + + for (; i >= 0; --i) { + if (!outputByte(sequence[i], output, outputSizeBytes, bytesDecodedSoFar)) return false; + } + return true; +} + + +uint8_t* lzwDecode(const uint8_t* compressed, uint32_t compressedSizeBytes, uint32_t compressedSizeBits, uint32_t uncompressedSizeBytes) +{ + int code = Nil; + int prevCode = Nil; + int firstByte = 0; + int bytesDecoded = 0; + int codeBitsWidth = StartBits; + auto uncompressed = (uint8_t*) malloc(sizeof(uint8_t) * uncompressedSizeBytes); + auto ptr = uncompressed; + + /* We'll reconstruct the dictionary based on the bit stream codes. + Unlike Huffman encoding, we don't store the dictionary as a prefix to the data. */ + Dictionary dictionary; + BitStreamReader bitStream(compressed, compressedSizeBytes, compressedSizeBits); + + /* We check to avoid an overflow of the user buffer. + If the buffer is smaller than the decompressed size, we break the loop and return the current decompression count. */ + while (!bitStream.isEndOfStream()) { + code = static_cast(bitStream.readBitsU64(codeBitsWidth)); + + if (prevCode == Nil) { + if (!outputByte(code, ptr, uncompressedSizeBytes, bytesDecoded)) break; + firstByte = code; + prevCode = code; + continue; + } + if (code >= dictionary.size) { + if (!outputSequence(dictionary, prevCode, ptr, uncompressedSizeBytes, bytesDecoded, firstByte)) break; + if (!outputByte(firstByte, ptr, uncompressedSizeBytes, bytesDecoded)) break; + } else if (!outputSequence(dictionary, code, ptr, uncompressedSizeBytes, bytesDecoded, firstByte)) break; + + dictionary.add(prevCode, firstByte); + if (dictionary.flush(codeBitsWidth)) prevCode = Nil; + else prevCode = code; + } + + return uncompressed; +} + + +uint8_t* lzwEncode(const uint8_t* uncompressed, uint32_t uncompressedSizeBytes, uint32_t* compressedSizeBytes, uint32_t* compressedSizeBits) +{ + //LZW encoding context: + int code = Nil; + int codeBitsWidth = StartBits; + Dictionary dictionary; + + //Output bit stream we write to. This will allocate memory as needed to accommodate the encoded data. + BitStreamWriter bitStream; + + for (; uncompressedSizeBytes > 0; --uncompressedSizeBytes, ++uncompressed) { + const int value = *uncompressed; + const int index = dictionary.findIndex(code, value); + + if (index != Nil) { + code = index; + continue; + } + + //Write the dictionary code using the minimum bit-with: + bitStream.appendBitsU64(code, codeBitsWidth); + + //Flush it when full so we can restart the sequences. + if (!dictionary.flush(codeBitsWidth)) { + //There's still space for this sequence. + dictionary.add(code, value); + } + code = value; + } + + //Residual code at the end: + if (code != Nil) bitStream.appendBitsU64(code, codeBitsWidth); + + //Pass ownership of the compressed data buffer to the user pointer: + *compressedSizeBytes = bitStream.getByteCount(); + *compressedSizeBits = bitStream.numBitsWritten; + + return bitStream.release(); +} + + +/************************************************************************/ +/* B64 Implementation */ +/************************************************************************/ + + +size_t b64Decode(const char* encoded, const size_t len, char** decoded) +{ + static constexpr const char B64_INDEX[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 63, 62, 62, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 0, 0, 0, 63, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 + }; + + + if (!decoded || !encoded || len == 0) return 0; + + auto reserved = 3 * (1 + (len >> 2)) + 1; + auto output = static_cast(malloc(reserved * sizeof(char))); + if (!output) return 0; + output[reserved - 1] = '\0'; + + size_t idx = 0; + + while (*encoded && *(encoded + 1)) { + if (*encoded <= 0x20) { + ++encoded; + continue; + } + + auto value1 = B64_INDEX[(size_t)encoded[0]]; + auto value2 = B64_INDEX[(size_t)encoded[1]]; + output[idx++] = (value1 << 2) + ((value2 & 0x30) >> 4); + + if (!encoded[2] || encoded[2] == '=' || encoded[2] == '.') break; + auto value3 = B64_INDEX[(size_t)encoded[2]]; + output[idx++] = ((value2 & 0x0f) << 4) + ((value3 & 0x3c) >> 2); + + if (!encoded[3] || encoded[3] == '=' || encoded[3] == '.') break; + auto value4 = B64_INDEX[(size_t)encoded[3]]; + output[idx++] = ((value3 & 0x03) << 6) + value4; + encoded += 4; + } + *decoded = output; + return reserved; +} + + +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgCompressor.h b/libraries/lvgl/src/libs/thorvg/tvgCompressor.h new file mode 100644 index 0000000..6d9dfce --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgCompressor.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_COMPRESSOR_H_ +#define _TVG_COMPRESSOR_H_ + +#include + +namespace tvg +{ + uint8_t* lzwEncode(const uint8_t* uncompressed, uint32_t uncompressedSizeBytes, uint32_t* compressedSizeBytes, uint32_t* compressedSizeBits); + uint8_t* lzwDecode(const uint8_t* compressed, uint32_t compressedSizeBytes, uint32_t compressedSizeBits, uint32_t uncompressedSizeBytes); + size_t b64Decode(const char* encoded, const size_t len, char** decoded); +} + +#endif //_TVG_COMPRESSOR_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgFill.cpp b/libraries/lvgl/src/libs/thorvg/tvgFill.cpp new file mode 100644 index 0000000..1528834 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgFill.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgFill.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +Fill* RadialGradient::Impl::duplicate() +{ + auto ret = RadialGradient::gen(); + if (!ret) return nullptr; + + ret->pImpl->cx = cx; + ret->pImpl->cy = cy; + ret->pImpl->r = r; + ret->pImpl->fx = fx; + ret->pImpl->fy = fy; + ret->pImpl->fr = fr; + + return ret.release(); +} + + +Result RadialGradient::Impl::radial(float cx, float cy, float r, float fx, float fy, float fr) +{ + if (r < 0 || fr < 0) return Result::InvalidArguments; + + this->cx = cx; + this->cy = cy; + this->r = r; + this->fx = fx; + this->fy = fy; + this->fr = fr; + + return Result::Success; +}; + + +Fill* LinearGradient::Impl::duplicate() +{ + auto ret = LinearGradient::gen(); + if (!ret) return nullptr; + + ret->pImpl->x1 = x1; + ret->pImpl->y1 = y1; + ret->pImpl->x2 = x2; + ret->pImpl->y2 = y2; + + return ret.release(); +}; + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Fill::Fill():pImpl(new Impl()) +{ +} + + +Fill::~Fill() +{ + delete(pImpl); +} + + +Result Fill::colorStops(const ColorStop* colorStops, uint32_t cnt) noexcept +{ + if ((!colorStops && cnt > 0) || (colorStops && cnt == 0)) return Result::InvalidArguments; + + if (cnt == 0) { + if (pImpl->colorStops) { + free(pImpl->colorStops); + pImpl->colorStops = nullptr; + pImpl->cnt = 0; + } + return Result::Success; + } + + if (pImpl->cnt != cnt) { + pImpl->colorStops = static_cast(realloc(pImpl->colorStops, cnt * sizeof(ColorStop))); + } + + pImpl->cnt = cnt; + memcpy(pImpl->colorStops, colorStops, cnt * sizeof(ColorStop)); + + return Result::Success; +} + + +uint32_t Fill::colorStops(const ColorStop** colorStops) const noexcept +{ + if (colorStops) *colorStops = pImpl->colorStops; + + return pImpl->cnt; +} + + +Result Fill::spread(FillSpread s) noexcept +{ + pImpl->spread = s; + + return Result::Success; +} + + +FillSpread Fill::spread() const noexcept +{ + return pImpl->spread; +} + + +Result Fill::transform(const Matrix& m) noexcept +{ + if (!pImpl->transform) { + pImpl->transform = static_cast(malloc(sizeof(Matrix))); + } + *pImpl->transform = m; + return Result::Success; +} + + +Matrix Fill::transform() const noexcept +{ + if (pImpl->transform) return *pImpl->transform; + return {1, 0, 0, 0, 1, 0, 0, 0, 1}; +} + + +Fill* Fill::duplicate() const noexcept +{ + return pImpl->duplicate(); +} + + +uint32_t Fill::identifier() const noexcept +{ + return pImpl->id; +} + + +RadialGradient::RadialGradient():pImpl(new Impl()) +{ + Fill::pImpl->id = TVG_CLASS_ID_RADIAL; + Fill::pImpl->method(new FillDup(pImpl)); +} + + +RadialGradient::~RadialGradient() +{ + delete(pImpl); +} + + +Result RadialGradient::radial(float cx, float cy, float r) noexcept +{ + return pImpl->radial(cx, cy, r, cx, cy, 0.0f); +} + + +Result RadialGradient::radial(float* cx, float* cy, float* r) const noexcept +{ + if (cx) *cx = pImpl->cx; + if (cy) *cy = pImpl->cy; + if (r) *r = pImpl->r; + + return Result::Success; +} + + +unique_ptr RadialGradient::gen() noexcept +{ + return unique_ptr(new RadialGradient); +} + + +uint32_t RadialGradient::identifier() noexcept +{ + return TVG_CLASS_ID_RADIAL; +} + + +LinearGradient::LinearGradient():pImpl(new Impl()) +{ + Fill::pImpl->id = TVG_CLASS_ID_LINEAR; + Fill::pImpl->method(new FillDup(pImpl)); +} + + +LinearGradient::~LinearGradient() +{ + delete(pImpl); +} + + +Result LinearGradient::linear(float x1, float y1, float x2, float y2) noexcept +{ + pImpl->x1 = x1; + pImpl->y1 = y1; + pImpl->x2 = x2; + pImpl->y2 = y2; + + return Result::Success; +} + + +Result LinearGradient::linear(float* x1, float* y1, float* x2, float* y2) const noexcept +{ + if (x1) *x1 = pImpl->x1; + if (x2) *x2 = pImpl->x2; + if (y1) *y1 = pImpl->y1; + if (y2) *y2 = pImpl->y2; + + return Result::Success; +} + + +unique_ptr LinearGradient::gen() noexcept +{ + return unique_ptr(new LinearGradient); +} + + +uint32_t LinearGradient::identifier() noexcept +{ + return TVG_CLASS_ID_LINEAR; +} + + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgFill.h b/libraries/lvgl/src/libs/thorvg/tvgFill.h new file mode 100644 index 0000000..1595403 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgFill.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_FILL_H_ +#define _TVG_FILL_H_ + +#include +#include +#include "tvgCommon.h" + +template +struct DuplicateMethod +{ + virtual ~DuplicateMethod() {} + virtual T* duplicate() = 0; +}; + +template +struct FillDup : DuplicateMethod +{ + T* inst = nullptr; + + FillDup(T* _inst) : inst(_inst) {} + ~FillDup() {} + + Fill* duplicate() override + { + return inst->duplicate(); + } +}; + +struct Fill::Impl +{ + ColorStop* colorStops = nullptr; + Matrix* transform = nullptr; + uint32_t cnt = 0; + FillSpread spread; + DuplicateMethod* dup = nullptr; + uint8_t id; + + ~Impl() + { + delete(dup); + free(colorStops); + free(transform); + } + + void method(DuplicateMethod* dup) + { + this->dup = dup; + } + + Fill* duplicate() + { + auto ret = dup->duplicate(); + if (!ret) return nullptr; + + ret->pImpl->cnt = cnt; + ret->pImpl->spread = spread; + ret->pImpl->colorStops = static_cast(malloc(sizeof(ColorStop) * cnt)); + memcpy(ret->pImpl->colorStops, colorStops, sizeof(ColorStop) * cnt); + if (transform) { + ret->pImpl->transform = static_cast(malloc(sizeof(Matrix))); + *ret->pImpl->transform = *transform; + } + return ret; + } +}; + + +struct RadialGradient::Impl +{ + float cx = 0.0f, cy = 0.0f; + float fx = 0.0f, fy = 0.0f; + float r = 0.0f, fr = 0.0f; + + Fill* duplicate(); + Result radial(float cx, float cy, float r, float fx, float fy, float fr); +}; + + +struct LinearGradient::Impl +{ + float x1 = 0.0f; + float y1 = 0.0f; + float x2 = 0.0f; + float y2 = 0.0f; + + Fill* duplicate(); +}; + + +#endif //_TVG_FILL_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgFrameModule.h b/libraries/lvgl/src/libs/thorvg/tvgFrameModule.h new file mode 100644 index 0000000..726b84c --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgFrameModule.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_FRAME_MODULE_H_ +#define _TVG_FRAME_MODULE_H_ + +#include "tvgLoadModule.h" + +namespace tvg +{ + +class FrameModule: public LoadModule +{ +public: + virtual ~FrameModule() {} + + virtual bool frame(uint32_t frameNo) = 0; //set the current frame number + + virtual uint32_t totalFrame() = 0; //return the total frame count + virtual uint32_t curFrame() = 0; //return the current frame number + virtual float duration() = 0; //return the animation duration in seconds + + virtual bool animatable() override { return true; } +}; + +} + +#endif //_TVG_FRAME_MODULE_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgInitializer.cpp b/libraries/lvgl/src/libs/thorvg/tvgInitializer.cpp new file mode 100644 index 0000000..66d2602 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgInitializer.cpp @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgCommon.h" +#include "tvgTaskScheduler.h" +#include "tvgLoader.h" + +#ifdef _WIN32 + #include +#endif + +#ifdef THORVG_SW_RASTER_SUPPORT + #include "tvgSwRenderer.h" +#endif + +#ifdef THORVG_GL_RASTER_SUPPORT + #include "tvgGlRenderer.h" +#endif + +#ifdef THORVG_WG_RASTER_SUPPORT + #include "tvgWgRenderer.h" +#endif + + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static int _initCnt = 0; +static uint16_t _version = 0; + +//enum class operation helper +static constexpr bool operator &(CanvasEngine a, CanvasEngine b) +{ + return int(a) & int(b); +} + +static bool _buildVersionInfo() +{ + auto SRC = THORVG_VERSION_STRING; //ex) 0.3.99 + auto p = SRC; + const char* x; + + char major[3]; + x = strchr(p, '.'); + if (!x) return false; + memcpy(major, p, x - p); + major[x - p] = '\0'; + p = x + 1; + + char minor[3]; + x = strchr(p, '.'); + if (!x) return false; + memcpy(minor, p, x - p); + minor[x - p] = '\0'; + p = x + 1; + + char micro[3]; + x = SRC + strlen(THORVG_VERSION_STRING); + memcpy(micro, p, x - p); + micro[x - p] = '\0'; + + char sum[7]; + snprintf(sum, sizeof(sum), "%s%s%s", major, minor, micro); + + _version = atoi(sum); + + return true; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Result Initializer::init(CanvasEngine engine, uint32_t threads) noexcept +{ + auto nonSupport = true; + if (static_cast(engine) == 0) return Result::InvalidArguments; + + if (engine & CanvasEngine::Sw) { + #ifdef THORVG_SW_RASTER_SUPPORT + if (!SwRenderer::init(threads)) return Result::FailedAllocation; + nonSupport = false; + #endif + } + + if (engine & CanvasEngine::Gl) { + #ifdef THORVG_GL_RASTER_SUPPORT + if (!GlRenderer::init(threads)) return Result::FailedAllocation; + nonSupport = false; + #endif + } + + if (engine & CanvasEngine::Wg) { + #ifdef THORVG_WG_RASTER_SUPPORT + if (!WgRenderer::init(threads)) return Result::FailedAllocation; + nonSupport = false; + #endif + } + + if (nonSupport) return Result::NonSupport; + + if (_initCnt++ > 0) return Result::Success; + + if (!_buildVersionInfo()) return Result::Unknown; + + if (!LoaderMgr::init()) return Result::Unknown; + + TaskScheduler::init(threads); + + return Result::Success; +} + + +Result Initializer::term(CanvasEngine engine) noexcept +{ + if (_initCnt == 0) return Result::InsufficientCondition; + + auto nonSupport = true; + if (static_cast(engine) == 0) return Result::InvalidArguments; + + if (engine & CanvasEngine::Sw) { + #ifdef THORVG_SW_RASTER_SUPPORT + if (!SwRenderer::term()) return Result::InsufficientCondition; + nonSupport = false; + #endif + } + + if (engine & CanvasEngine::Gl) { + #ifdef THORVG_GL_RASTER_SUPPORT + if (!GlRenderer::term()) return Result::InsufficientCondition; + nonSupport = false; + #endif + } + + if (engine & CanvasEngine::Wg) { + #ifdef THORVG_WG_RASTER_SUPPORT + if (!WgRenderer::term()) return Result::InsufficientCondition; + nonSupport = false; + #endif + } + + if (nonSupport) return Result::NonSupport; + + if (--_initCnt > 0) return Result::Success; + + if (!LoaderMgr::term()) return Result::Unknown; + + return Result::Success; +} + + +uint16_t THORVG_VERSION_NUMBER() +{ + return _version; +} + + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgIteratorAccessor.h b/libraries/lvgl/src/libs/thorvg/tvgIteratorAccessor.h new file mode 100644 index 0000000..ac7015f --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgIteratorAccessor.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_ITERATOR_ACCESSOR_H_ +#define _TVG_ITERATOR_ACCESSOR_H_ + +#include "tvgPaint.h" + +namespace tvg +{ + +class IteratorAccessor +{ +public: + //Utility Method: Iterator Accessor + static Iterator* iterator(const Paint* paint) + { + return paint->pImpl->iterator(); + } +}; + +} + +#endif //_TVG_ITERATOR_ACCESSOR_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgLoadModule.h b/libraries/lvgl/src/libs/thorvg/tvgLoadModule.h new file mode 100644 index 0000000..7ccf948 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgLoadModule.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_LOAD_MODULE_H_ +#define _TVG_LOAD_MODULE_H_ + +#include "tvgRender.h" + +namespace tvg +{ + +class LoadModule +{ +public: + float w = 0, h = 0; //default image size + ColorSpace cs = ColorSpace::Unsupported; //must be clarified at open() + + virtual ~LoadModule() {} + + virtual bool open(const string& path) { return false; } + virtual bool open(const char* data, uint32_t size, bool copy) { return false; } + virtual bool open(const uint32_t* data, uint32_t w, uint32_t h, bool copy) { return false; } + + //Override this if the vector-format has own resizing policy. + virtual bool resize(Paint* paint, float w, float h) { return false; } + + virtual bool animatable() { return false; } //true if this loader supports animation. + virtual void sync() {}; //finish immediately if any async update jobs. + + virtual bool read() = 0; + virtual bool close() = 0; + + virtual unique_ptr bitmap() { return nullptr; } + virtual unique_ptr paint() { return nullptr; } +}; + +} + +#endif //_TVG_LOAD_MODULE_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgLoader.cpp b/libraries/lvgl/src/libs/thorvg/tvgLoader.cpp new file mode 100644 index 0000000..3a2cb32 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgLoader.cpp @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgLoader.h" + +#ifdef THORVG_SVG_LOADER_SUPPORT + #include "tvgSvgLoader.h" +#endif + +#ifdef THORVG_PNG_LOADER_SUPPORT + #include "tvgPngLoader.h" +#endif + +#ifdef THORVG_TVG_LOADER_SUPPORT + #include "tvgTvgLoader.h" +#endif + +#ifdef THORVG_JPG_LOADER_SUPPORT + #include "tvgJpgLoader.h" +#endif + +#ifdef THORVG_WEBP_LOADER_SUPPORT + #include "tvgWebpLoader.h" +#endif + +#ifdef THORVG_LOTTIE_LOADER_SUPPORT + #include "tvgLottieLoader.h" +#endif + +#include "tvgRawLoader.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static LoadModule* _find(FileType type) +{ + switch(type) { + case FileType::Tvg: { +#ifdef THORVG_TVG_LOADER_SUPPORT + return new TvgLoader; +#endif + break; + } + case FileType::Svg: { +#ifdef THORVG_SVG_LOADER_SUPPORT + return new SvgLoader; +#endif + break; + } + case FileType::Lottie: { +#ifdef THORVG_LOTTIE_LOADER_SUPPORT + return new LottieLoader; +#endif + break; + } + case FileType::Raw: { + return new RawLoader; + break; + } + case FileType::Png: { +#ifdef THORVG_PNG_LOADER_SUPPORT + return new PngLoader; +#endif + break; + } + case FileType::Jpg: { +#ifdef THORVG_JPG_LOADER_SUPPORT + return new JpgLoader; +#endif + break; + } + case FileType::Webp: { +#ifdef THORVG_WEBP_LOADER_SUPPORT + return new WebpLoader; +#endif + break; + } + default: { + break; + } + } + +#ifdef THORVG_LOG_ENABLED + const char *format; + switch(type) { + case FileType::Tvg: { + format = "TVG"; + break; + } + case FileType::Svg: { + format = "SVG"; + break; + } + case FileType::Lottie: { + format = "lottie(json)"; + break; + } + case FileType::Raw: { + format = "RAW"; + break; + } + case FileType::Png: { + format = "PNG"; + break; + } + case FileType::Jpg: { + format = "JPG"; + break; + } + case FileType::Webp: { + format = "WEBP"; + break; + } + default: { + format = "???"; + break; + } + } + TVGLOG("LOADER", "%s format is not supported", format); +#endif + return nullptr; +} + + +static LoadModule* _findByPath(const string& path) +{ + auto ext = path.substr(path.find_last_of(".") + 1); + if (!ext.compare("tvg")) return _find(FileType::Tvg); + if (!ext.compare("svg")) return _find(FileType::Svg); + if (!ext.compare("json")) return _find(FileType::Lottie); + if (!ext.compare("lottie")) return _find(FileType::Lottie); + if (!ext.compare("png")) return _find(FileType::Png); + if (!ext.compare("jpg")) return _find(FileType::Jpg); + if (!ext.compare("webp")) return _find(FileType::Webp); + return nullptr; +} + + +static LoadModule* _findByType(const string& mimeType) +{ + if (mimeType.empty()) return nullptr; + + auto type = FileType::Unknown; + + if (mimeType == "tvg") type = FileType::Tvg; + else if (mimeType == "svg" || mimeType == "svg+xml") type = FileType::Svg; + else if (mimeType == "lottie") type = FileType::Lottie; + else if (mimeType == "raw") type = FileType::Raw; + else if (mimeType == "png") type = FileType::Png; + else if (mimeType == "jpg" || mimeType == "jpeg") type = FileType::Jpg; + else if (mimeType == "webp") type = FileType::Webp; + else { + TVGLOG("LOADER", "Given mimetype is unknown = \"%s\".", mimeType.c_str()); + return nullptr; + } + + return _find(type); +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + + +bool LoaderMgr::init() +{ + //TODO: + + return true; +} + + +bool LoaderMgr::term() +{ + //TODO: + + return true; +} + + +shared_ptr LoaderMgr::loader(const string& path, bool* invalid) +{ + *invalid = false; + + if (auto loader = _findByPath(path)) { + if (loader->open(path)) return shared_ptr(loader); + else delete(loader); + *invalid = true; + } + return nullptr; +} + + +shared_ptr LoaderMgr::loader(const char* data, uint32_t size, const string& mimeType, bool copy) +{ + //Try with the given MimeType + if (!mimeType.empty()) { + if (auto loader = _findByType(mimeType)) { + if (loader->open(data, size, copy)) { + return shared_ptr(loader); + } else { + TVGLOG("LOADER", "Given mimetype \"%s\" seems incorrect or not supported.", mimeType.c_str()); + delete(loader); + } + } + //Unkown MimeType. Try with the candidates in the order + } else { + for (int i = 0; i < static_cast(FileType::Unknown); i++) { + auto loader = _find(static_cast(i)); + if (loader) { + if (loader->open(data, size, copy)) return shared_ptr(loader); + else delete(loader); + } + } + } + return nullptr; +} + + +shared_ptr LoaderMgr::loader(const uint32_t *data, uint32_t w, uint32_t h, bool copy) +{ + //function is dedicated for raw images only + auto loader = new RawLoader; + if (loader->open(data, w, h, copy)) return shared_ptr(loader); + else delete(loader); + + return nullptr; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgLoader.h b/libraries/lvgl/src/libs/thorvg/tvgLoader.h new file mode 100644 index 0000000..7acdc94 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgLoader.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_LOADER_H_ +#define _TVG_LOADER_H_ + +#include "tvgLoadModule.h" + +struct LoaderMgr +{ + static bool init(); + static bool term(); + static shared_ptr loader(const string& path, bool* invalid); + static shared_ptr loader(const char* data, uint32_t size, const string& mimeType, bool copy); + static shared_ptr loader(const uint32_t* data, uint32_t w, uint32_t h, bool copy); +}; + +#endif //_TVG_LOADER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgMath.cpp b/libraries/lvgl/src/libs/thorvg/tvgMath.cpp new file mode 100644 index 0000000..cf43490 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgMath.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" + + +bool mathInverse(const Matrix* m, Matrix* out) +{ + auto det = m->e11 * (m->e22 * m->e33 - m->e32 * m->e23) - + m->e12 * (m->e21 * m->e33 - m->e23 * m->e31) + + m->e13 * (m->e21 * m->e32 - m->e22 * m->e31); + + if (mathZero(det)) return false; + + auto invDet = 1 / det; + + out->e11 = (m->e22 * m->e33 - m->e32 * m->e23) * invDet; + out->e12 = (m->e13 * m->e32 - m->e12 * m->e33) * invDet; + out->e13 = (m->e12 * m->e23 - m->e13 * m->e22) * invDet; + out->e21 = (m->e23 * m->e31 - m->e21 * m->e33) * invDet; + out->e22 = (m->e11 * m->e33 - m->e13 * m->e31) * invDet; + out->e23 = (m->e21 * m->e13 - m->e11 * m->e23) * invDet; + out->e31 = (m->e21 * m->e32 - m->e31 * m->e22) * invDet; + out->e32 = (m->e31 * m->e12 - m->e11 * m->e32) * invDet; + out->e33 = (m->e11 * m->e22 - m->e21 * m->e12) * invDet; + + return true; +} + + +Matrix mathMultiply(const Matrix* lhs, const Matrix* rhs) +{ + Matrix m; + + m.e11 = lhs->e11 * rhs->e11 + lhs->e12 * rhs->e21 + lhs->e13 * rhs->e31; + m.e12 = lhs->e11 * rhs->e12 + lhs->e12 * rhs->e22 + lhs->e13 * rhs->e32; + m.e13 = lhs->e11 * rhs->e13 + lhs->e12 * rhs->e23 + lhs->e13 * rhs->e33; + + m.e21 = lhs->e21 * rhs->e11 + lhs->e22 * rhs->e21 + lhs->e23 * rhs->e31; + m.e22 = lhs->e21 * rhs->e12 + lhs->e22 * rhs->e22 + lhs->e23 * rhs->e32; + m.e23 = lhs->e21 * rhs->e13 + lhs->e22 * rhs->e23 + lhs->e23 * rhs->e33; + + m.e31 = lhs->e31 * rhs->e11 + lhs->e32 * rhs->e21 + lhs->e33 * rhs->e31; + m.e32 = lhs->e31 * rhs->e12 + lhs->e32 * rhs->e22 + lhs->e33 * rhs->e32; + m.e33 = lhs->e31 * rhs->e13 + lhs->e32 * rhs->e23 + lhs->e33 * rhs->e33; + + return m; +} + + +void mathRotate(Matrix* m, float degree) +{ + if (degree == 0.0f) return; + + auto radian = degree / 180.0f * (float)M_PI; + auto cosVal = cosf((float)radian); + auto sinVal = sinf((float)radian); + + m->e12 = m->e11 * -sinVal; + m->e11 *= cosVal; + m->e21 = m->e22 * sinVal; + m->e22 *= cosVal; +} + + +bool mathIdentity(const Matrix* m) +{ + if (m->e11 != 1.0f || m->e12 != 0.0f || m->e13 != 0.0f || + m->e21 != 0.0f || m->e22 != 1.0f || m->e23 != 0.0f || + m->e31 != 0.0f || m->e32 != 0.0f || m->e33 != 1.0f) { + return false; + } + return true; +} + + +void mathMultiply(Point* pt, const Matrix* transform) +{ + auto tx = pt->x * transform->e11 + pt->y * transform->e12 + transform->e13; + auto ty = pt->x * transform->e21 + pt->y * transform->e22 + transform->e23; + pt->x = tx; + pt->y = ty; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgMath.h b/libraries/lvgl/src/libs/thorvg/tvgMath.h new file mode 100644 index 0000000..3f48e3c --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgMath.h @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_MATH_H_ +#define _TVG_MATH_H_ + + #define _USE_MATH_DEFINES + +#include +#include +#include "tvgCommon.h" + +#define MATH_PI 3.14159265358979323846f +#define MATH_PI2 1.57079632679489661923f + +#define mathMin(x, y) (((x) < (y)) ? (x) : (y)) +#define mathMax(x, y) (((x) > (y)) ? (x) : (y)) + + +bool mathInverse(const Matrix* m, Matrix* out); +Matrix mathMultiply(const Matrix* lhs, const Matrix* rhs); +void mathRotate(Matrix* m, float degree); +bool mathIdentity(const Matrix* m); +void mathMultiply(Point* pt, const Matrix* transform); + + +static inline bool mathZero(float a) +{ + return (fabsf(a) < FLT_EPSILON) ? true : false; +} + + +static inline bool mathEqual(float a, float b) +{ + return (fabsf(a - b) < FLT_EPSILON); +} + + +static inline bool mathEqual(const Matrix& a, const Matrix& b) +{ + if (!mathEqual(a.e11, b.e11) || !mathEqual(a.e12, b.e12) || !mathEqual(a.e13, b.e13) || + !mathEqual(a.e21, b.e21) || !mathEqual(a.e22, b.e22) || !mathEqual(a.e23, b.e23) || + !mathEqual(a.e31, b.e31) || !mathEqual(a.e32, b.e32) || !mathEqual(a.e33, b.e33)) { + return false; + } + return true; +} + + +static inline bool mathRightAngle(const Matrix* m) +{ + auto radian = fabsf(atan2f(m->e21, m->e11)); + if (radian < FLT_EPSILON || mathEqual(radian, float(M_PI_2)) || mathEqual(radian, float(M_PI))) return true; + return false; +} + + +static inline bool mathSkewed(const Matrix* m) +{ + return (fabsf(m->e21 + m->e12) > FLT_EPSILON); +} + + +static inline void mathIdentity(Matrix* m) +{ + m->e11 = 1.0f; + m->e12 = 0.0f; + m->e13 = 0.0f; + m->e21 = 0.0f; + m->e22 = 1.0f; + m->e23 = 0.0f; + m->e31 = 0.0f; + m->e32 = 0.0f; + m->e33 = 1.0f; +} + + +static inline void mathTransform(Matrix* transform, Point* coord) +{ + auto x = coord->x; + auto y = coord->y; + coord->x = x * transform->e11 + y * transform->e12 + transform->e13; + coord->y = x * transform->e21 + y * transform->e22 + transform->e23; +} + + +static inline void mathScale(Matrix* m, float sx, float sy) +{ + m->e11 *= sx; + m->e22 *= sy; +} + + +static inline void mathScaleR(Matrix* m, float x, float y) +{ + if (x != 1.0f) { + m->e11 *= x; + m->e21 *= x; + } + if (y != 1.0f) { + m->e22 *= y; + m->e12 *= y; + } +} + + +static inline void mathTranslate(Matrix* m, float x, float y) +{ + m->e13 += x; + m->e23 += y; +} + + +static inline void mathTranslateR(Matrix* m, float x, float y) +{ + if (x == 0.0f && y == 0.0f) return; + m->e13 += (x * m->e11 + y * m->e12); + m->e23 += (x * m->e21 + y * m->e22); +} + + +static inline void mathLog(Matrix* m) +{ + TVGLOG("MATH", "Matrix: [%f %f %f] [%f %f %f] [%f %f %f]", m->e11, m->e12, m->e13, m->e21, m->e22, m->e23, m->e31, m->e32, m->e33); +} + + +static inline float mathLength(const Point* a, const Point* b) +{ + auto x = b->x - a->x; + auto y = b->y - a->y; + + if (x < 0) x = -x; + if (y < 0) y = -y; + + return (x > y) ? (x + 0.375f * y) : (y + 0.375f * x); +} + + +static inline Point operator-(const Point& lhs, const Point& rhs) +{ + return {lhs.x - rhs.x, lhs.y - rhs.y}; +} + + +static inline Point operator+(const Point& lhs, const Point& rhs) +{ + return {lhs.x + rhs.x, lhs.y + rhs.y}; +} + + +static inline Point operator*(const Point& lhs, float rhs) +{ + return {lhs.x * rhs, lhs.y * rhs}; +} + + +template +static inline T mathLerp(const T &start, const T &end, float t) +{ + return static_cast(start + (end - start) * t); +} + + +#endif //_TVG_MATH_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgPaint.cpp b/libraries/lvgl/src/libs/thorvg/tvgPaint.cpp new file mode 100644 index 0000000..50ba3e6 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgPaint.cpp @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgPaint.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + + +static bool _compFastTrack(Paint* cmpTarget, const RenderTransform* pTransform, RenderTransform* rTransform, RenderRegion& viewport) +{ + /* Access Shape class by Paint is bad... but it's ok still it's an internal usage. */ + auto shape = static_cast(cmpTarget); + + //Rectangle Candidates? + const Point* pts; + if (shape->pathCoords(&pts) != 4) return false; + + if (rTransform) rTransform->update(); + + //No rotation and no skewing + if (pTransform && (!mathRightAngle(&pTransform->m) || mathSkewed(&pTransform->m))) return false; + if (rTransform && (!mathRightAngle(&rTransform->m) || mathSkewed(&rTransform->m))) return false; + + //Perpendicular Rectangle? + auto pt1 = pts + 0; + auto pt2 = pts + 1; + auto pt3 = pts + 2; + auto pt4 = pts + 3; + + if ((mathEqual(pt1->x, pt2->x) && mathEqual(pt2->y, pt3->y) && mathEqual(pt3->x, pt4->x) && mathEqual(pt1->y, pt4->y)) || + (mathEqual(pt2->x, pt3->x) && mathEqual(pt1->y, pt2->y) && mathEqual(pt1->x, pt4->x) && mathEqual(pt3->y, pt4->y))) { + + auto v1 = *pt1; + auto v2 = *pt3; + + if (rTransform) { + mathMultiply(&v1, &rTransform->m); + mathMultiply(&v2, &rTransform->m); + } + + if (pTransform) { + mathMultiply(&v1, &pTransform->m); + mathMultiply(&v2, &pTransform->m); + } + + //sorting + if (v1.x > v2.x) { + auto tmp = v2.x; + v2.x = v1.x; + v1.x = tmp; + } + + if (v1.y > v2.y) { + auto tmp = v2.y; + v2.y = v1.y; + v1.y = tmp; + } + + viewport.x = static_cast(v1.x); + viewport.y = static_cast(v1.y); + viewport.w = static_cast(ceil(v2.x - viewport.x)); + viewport.h = static_cast(ceil(v2.y - viewport.y)); + + if (viewport.w < 0) viewport.w = 0; + if (viewport.h < 0) viewport.h = 0; + + return true; + } + + return false; +} + + +Paint* Paint::Impl::duplicate() +{ + auto ret = smethod->duplicate(); + + //duplicate Transform + if (rTransform) { + ret->pImpl->rTransform = new RenderTransform(); + *ret->pImpl->rTransform = *rTransform; + ret->pImpl->renderFlag |= RenderUpdateFlag::Transform; + } + + ret->pImpl->opacity = opacity; + + if (compData) ret->pImpl->composite(ret, compData->target->duplicate(), compData->method); + + return ret; +} + + +bool Paint::Impl::rotate(float degree) +{ + if (rTransform) { + if (mathEqual(degree, rTransform->degree)) return true; + } else { + if (mathZero(degree)) return true; + rTransform = new RenderTransform(); + } + rTransform->degree = degree; + if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; + + return true; +} + + +bool Paint::Impl::scale(float factor) +{ + if (rTransform) { + if (mathEqual(factor, rTransform->scale)) return true; + } else { + if (mathEqual(factor, 1.0f)) return true; + rTransform = new RenderTransform(); + } + rTransform->scale = factor; + if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; + + return true; +} + + +bool Paint::Impl::translate(float x, float y) +{ + if (rTransform) { + if (mathEqual(x, rTransform->x) && mathEqual(y, rTransform->y)) return true; + } else { + if (mathZero(x) && mathZero(y)) return true; + rTransform = new RenderTransform(); + } + rTransform->x = x; + rTransform->y = y; + if (!rTransform->overriding) renderFlag |= RenderUpdateFlag::Transform; + + return true; +} + + +bool Paint::Impl::render(RenderMethod& renderer) +{ + Compositor* cmp = nullptr; + + /* Note: only ClipPath is processed in update() step. + Create a composition image. */ + if (compData && compData->method != CompositeMethod::ClipPath && !(compData->target->pImpl->ctxFlag & ContextFlag::FastTrack)) { + auto region = smethod->bounds(renderer); + if (MASK_REGION_MERGING(compData->method)) region.add(compData->target->pImpl->smethod->bounds(renderer)); + if (region.w == 0 || region.h == 0) return true; + cmp = renderer.target(region, COMPOSITE_TO_COLORSPACE(renderer, compData->method)); + if (renderer.beginComposite(cmp, CompositeMethod::None, 255)) { + compData->target->pImpl->render(renderer); + } + } + + if (cmp) renderer.beginComposite(cmp, compData->method, compData->target->pImpl->opacity); + + renderer.blend(blendMethod); + auto ret = smethod->render(renderer); + + if (cmp) renderer.endComposite(cmp); + + return ret; +} + + +RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) +{ + if (renderFlag & RenderUpdateFlag::Transform) { + if (!rTransform) return nullptr; + if (!rTransform->update()) { + delete(rTransform); + rTransform = nullptr; + } + } + + /* 1. Composition Pre Processing */ + RenderData trd = nullptr; //composite target render data + RenderRegion viewport; + bool compFastTrack = false; + bool childClipper = false; + + if (compData) { + auto target = compData->target; + auto method = compData->method; + target->pImpl->ctxFlag &= ~ContextFlag::FastTrack; //reset + + /* If the transformation has no rotational factors and the ClipPath/Alpha(InvAlpha)Masking involves a simple rectangle, + we can optimize by using the viewport instead of the regular ClipPath/AlphaMasking sequence for improved performance. */ + auto tryFastTrack = false; + if (target->identifier() == TVG_CLASS_ID_SHAPE) { + if (method == CompositeMethod::ClipPath) tryFastTrack = true; + else { + auto shape = static_cast(target); + uint8_t a; + shape->fillColor(nullptr, nullptr, nullptr, &a); + //no gradient fill & no compositions of the composition target. + if (!shape->fill() && !(PP(shape)->compData)) { + if (method == CompositeMethod::AlphaMask && a == 255 && PP(shape)->opacity == 255) tryFastTrack = true; + else if (method == CompositeMethod::InvAlphaMask && (a == 0 || PP(shape)->opacity == 0)) tryFastTrack = true; + } + } + if (tryFastTrack) { + RenderRegion viewport2; + if ((compFastTrack = _compFastTrack(target, pTransform, target->pImpl->rTransform, viewport2))) { + viewport = renderer.viewport(); + viewport2.intersect(viewport); + renderer.viewport(viewport2); + target->pImpl->ctxFlag |= ContextFlag::FastTrack; + } + } + } + if (!compFastTrack) { + childClipper = compData->method == CompositeMethod::ClipPath ? true : false; + trd = target->pImpl->update(renderer, pTransform, clips, 255, pFlag, childClipper); + if (childClipper) clips.push(trd); + } + } + + /* 2. Main Update */ + RenderData rd = nullptr; + auto newFlag = static_cast(pFlag | renderFlag); + renderFlag = RenderUpdateFlag::None; + opacity = MULTIPLY(opacity, this->opacity); + + if (rTransform && pTransform) { + RenderTransform outTransform(pTransform, rTransform); + rd = smethod->update(renderer, &outTransform, clips, opacity, newFlag, clipper); + } else { + auto outTransform = pTransform ? pTransform : rTransform; + rd = smethod->update(renderer, outTransform, clips, opacity, newFlag, clipper); + } + + /* 3. Composition Post Processing */ + if (compFastTrack) renderer.viewport(viewport); + else if (childClipper) clips.pop(); + + return rd; +} + + +bool Paint::Impl::bounds(float* x, float* y, float* w, float* h, bool transformed, bool stroking) +{ + Matrix* m = nullptr; + + //Case: No transformed, quick return! + if (!transformed || !(m = this->transform())) return smethod->bounds(x, y, w, h, stroking); + + //Case: Transformed + auto tx = 0.0f; + auto ty = 0.0f; + auto tw = 0.0f; + auto th = 0.0f; + + auto ret = smethod->bounds(&tx, &ty, &tw, &th, stroking); + + //Get vertices + Point pt[4] = {{tx, ty}, {tx + tw, ty}, {tx + tw, ty + th}, {tx, ty + th}}; + + //New bounding box + auto x1 = FLT_MAX; + auto y1 = FLT_MAX; + auto x2 = -FLT_MAX; + auto y2 = -FLT_MAX; + + //Compute the AABB after transformation + for (int i = 0; i < 4; i++) { + mathMultiply(&pt[i], m); + + if (pt[i].x < x1) x1 = pt[i].x; + if (pt[i].x > x2) x2 = pt[i].x; + if (pt[i].y < y1) y1 = pt[i].y; + if (pt[i].y > y2) y2 = pt[i].y; + } + + if (x) *x = x1; + if (y) *y = y1; + if (w) *w = x2 - x1; + if (h) *h = y2 - y1; + + return ret; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Paint :: Paint() : pImpl(new Impl()) +{ +} + + +Paint :: ~Paint() +{ + delete(pImpl); +} + + +Result Paint::rotate(float degree) noexcept +{ + if (pImpl->rotate(degree)) return Result::Success; + return Result::FailedAllocation; +} + + +Result Paint::scale(float factor) noexcept +{ + if (pImpl->scale(factor)) return Result::Success; + return Result::FailedAllocation; +} + + +Result Paint::translate(float x, float y) noexcept +{ + if (pImpl->translate(x, y)) return Result::Success; + return Result::FailedAllocation; +} + + +Result Paint::transform(const Matrix& m) noexcept +{ + if (pImpl->transform(m)) return Result::Success; + return Result::FailedAllocation; +} + + +Matrix Paint::transform() noexcept +{ + auto pTransform = pImpl->transform(); + if (pTransform) return *pTransform; + return {1, 0, 0, 0, 1, 0, 0, 0, 1}; +} + + +TVG_DEPRECATED Result Paint::bounds(float* x, float* y, float* w, float* h) const noexcept +{ + return this->bounds(x, y, w, h, false); +} + + +Result Paint::bounds(float* x, float* y, float* w, float* h, bool transform) const noexcept +{ + if (pImpl->bounds(x, y, w, h, transform, true)) return Result::Success; + return Result::InsufficientCondition; +} + + +Paint* Paint::duplicate() const noexcept +{ + return pImpl->duplicate(); +} + + +Result Paint::composite(std::unique_ptr target, CompositeMethod method) noexcept +{ + auto p = target.release(); + if (pImpl->composite(this, p, method)) return Result::Success; + delete(p); + return Result::InvalidArguments; +} + + +CompositeMethod Paint::composite(const Paint** target) const noexcept +{ + if (pImpl->compData) { + if (target) *target = pImpl->compData->target; + return pImpl->compData->method; + } else { + if (target) *target = nullptr; + return CompositeMethod::None; + } +} + + +Result Paint::opacity(uint8_t o) noexcept +{ + if (pImpl->opacity == o) return Result::Success; + + pImpl->opacity = o; + pImpl->renderFlag |= RenderUpdateFlag::Color; + + return Result::Success; +} + + +uint8_t Paint::opacity() const noexcept +{ + return pImpl->opacity; +} + + +uint32_t Paint::identifier() const noexcept +{ + return pImpl->id; +} + + +Result Paint::blend(BlendMethod method) const noexcept +{ + pImpl->blendMethod = method; + + return Result::Success; +} + + +BlendMethod Paint::blend() const noexcept +{ + return pImpl->blendMethod; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgPaint.h b/libraries/lvgl/src/libs/thorvg/tvgPaint.h new file mode 100644 index 0000000..ea5878d --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgPaint.h @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_PAINT_H_ +#define _TVG_PAINT_H_ + +#include "tvgRender.h" +#include "tvgMath.h" + +namespace tvg +{ + enum ContextFlag : uint8_t {Invalid = 0, FastTrack = 1}; + + struct Iterator + { + virtual ~Iterator() {} + virtual const Paint* next() = 0; + virtual uint32_t count() = 0; + virtual void begin() = 0; + }; + + struct StrategyMethod + { + virtual ~StrategyMethod() {} + + virtual bool dispose(RenderMethod& renderer) = 0; //return true if the deletion is allowed. + virtual void* update(RenderMethod& renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has. + virtual bool render(RenderMethod& renderer) = 0; + virtual bool bounds(float* x, float* y, float* w, float* h, bool stroking) = 0; + virtual RenderRegion bounds(RenderMethod& renderer) const = 0; + virtual Paint* duplicate() = 0; + virtual Iterator* iterator() = 0; + }; + + struct Composite + { + Paint* target; + Paint* source; + CompositeMethod method; + }; + + struct Paint::Impl + { + StrategyMethod* smethod = nullptr; + RenderTransform* rTransform = nullptr; + Composite* compData = nullptr; + BlendMethod blendMethod = BlendMethod::Normal; //uint8_t + uint8_t renderFlag = RenderUpdateFlag::None; + uint8_t ctxFlag = ContextFlag::Invalid; + uint8_t id; + uint8_t opacity = 255; + uint8_t refCnt = 0; + + ~Impl() + { + if (compData) { + delete(compData->target); + free(compData); + } + delete(smethod); + delete(rTransform); + } + + uint8_t ref() + { + if (refCnt == 255) TVGERR("RENDERER", "Corrupted reference count!"); + return (++refCnt); + } + + uint8_t unref() + { + if (refCnt == 0) TVGERR("RENDERER", "Corrupted reference count!"); + return (--refCnt); + } + + void method(StrategyMethod* method) + { + smethod = method; + } + + bool transform(const Matrix& m) + { + if (!rTransform) { + if (mathIdentity(&m)) return true; + rTransform = new RenderTransform(); + if (!rTransform) return false; + } + rTransform->override(m); + renderFlag |= RenderUpdateFlag::Transform; + + return true; + } + + Matrix* transform() + { + if (rTransform) { + rTransform->update(); + return &rTransform->m; + } + return nullptr; + } + + RenderRegion bounds(RenderMethod& renderer) const + { + return smethod->bounds(renderer); + } + + bool dispose(RenderMethod& renderer) + { + if (compData) compData->target->pImpl->dispose(renderer); + return smethod->dispose(renderer); + } + + Iterator* iterator() + { + return smethod->iterator(); + } + + bool composite(Paint* source, Paint* target, CompositeMethod method) + { + //Invalid case + if ((!target && method != CompositeMethod::None) || (target && method == CompositeMethod::None)) return false; + + if (compData) { + delete(compData->target); + //Reset scenario + if (!target && method == CompositeMethod::None) { + free(compData); + compData = nullptr; + return true; + } + } else { + if (!target && method == CompositeMethod::None) return true; + compData = static_cast(calloc(1, sizeof(Composite))); + } + compData->target = target; + compData->source = source; + compData->method = method; + return true; + } + + bool rotate(float degree); + bool scale(float factor); + bool translate(float x, float y); + bool bounds(float* x, float* y, float* w, float* h, bool transformed, bool stroking); + RenderData update(RenderMethod& renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper = false); + bool render(RenderMethod& renderer); + Paint* duplicate(); + }; + + + template + struct PaintMethod : StrategyMethod + { + T* inst = nullptr; + + PaintMethod(T* _inst) : inst(_inst) {} + ~PaintMethod() {} + + bool bounds(float* x, float* y, float* w, float* h, bool stroking) override + { + return inst->bounds(x, y, w, h, stroking); + } + + RenderRegion bounds(RenderMethod& renderer) const override + { + return inst->bounds(renderer); + } + + bool dispose(RenderMethod& renderer) override + { + return inst->dispose(renderer); + } + + RenderData update(RenderMethod& renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag renderFlag, bool clipper) override + { + return inst->update(renderer, transform, clips, opacity, renderFlag, clipper); + } + + bool render(RenderMethod& renderer) override + { + return inst->render(renderer); + } + + Paint* duplicate() override + { + return inst->duplicate(); + } + + Iterator* iterator() override + { + return inst->iterator(); + } + }; +} + +#endif //_TVG_PAINT_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgPicture.cpp b/libraries/lvgl/src/libs/thorvg/tvgPicture.cpp new file mode 100644 index 0000000..e58d68e --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgPicture.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgPicture.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +RenderUpdateFlag Picture::Impl::load() +{ + if (loader) { + if (!paint) { + if (auto p = loader->paint()) { + paint = p.release(); + loader->close(); + if (w != loader->w || h != loader->h) { + if (!resizing) { + w = loader->w; + h = loader->h; + } + loader->resize(paint, w, h); + resizing = false; + } + if (paint) return RenderUpdateFlag::None; + } + } else loader->sync(); + + if (!surface) { + if ((surface = loader->bitmap().release())) { + loader->close(); + return RenderUpdateFlag::Image; + } + } + } + return RenderUpdateFlag::None; +} + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Picture::Picture() : pImpl(new Impl(this)) +{ + Paint::pImpl->id = TVG_CLASS_ID_PICTURE; + Paint::pImpl->method(new PaintMethod(pImpl)); +} + + +Picture::~Picture() +{ + delete(pImpl); +} + + +unique_ptr Picture::gen() noexcept +{ + return unique_ptr(new Picture); +} + + +uint32_t Picture::identifier() noexcept +{ + return TVG_CLASS_ID_PICTURE; +} + + +Result Picture::load(const std::string& path) noexcept +{ + if (path.empty()) return Result::InvalidArguments; + + return pImpl->load(path); +} + + +Result Picture::load(const char* data, uint32_t size, const string& mimeType, bool copy) noexcept +{ + if (!data || size <= 0) return Result::InvalidArguments; + + return pImpl->load(data, size, mimeType, copy); +} + + +TVG_DEPRECATED Result Picture::load(const char* data, uint32_t size, bool copy) noexcept +{ + return load(data, size, "", copy); +} + + +Result Picture::load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept +{ + if (!data || w <= 0 || h <= 0) return Result::InvalidArguments; + + return pImpl->load(data, w, h, copy); +} + + +Result Picture::size(float w, float h) noexcept +{ + if (pImpl->size(w, h)) return Result::Success; + return Result::InsufficientCondition; +} + + +Result Picture::size(float* w, float* h) const noexcept +{ + if (!pImpl->loader) return Result::InsufficientCondition; + if (w) *w = pImpl->w; + if (h) *h = pImpl->h; + return Result::Success; +} + + +Result Picture::mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept +{ + if (!triangles && triangleCnt > 0) return Result::InvalidArguments; + if (triangles && triangleCnt == 0) return Result::InvalidArguments; + + pImpl->mesh(triangles, triangleCnt); + return Result::Success; +} + + +uint32_t Picture::mesh(const Polygon** triangles) const noexcept +{ + if (triangles) *triangles = pImpl->rm.triangles; + return pImpl->rm.triangleCnt; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgPicture.h b/libraries/lvgl/src/libs/thorvg/tvgPicture.h new file mode 100644 index 0000000..a9a52a9 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgPicture.h @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_PICTURE_IMPL_H_ +#define _TVG_PICTURE_IMPL_H_ + +#include +#include "tvgPaint.h" +#include "tvgLoader.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct PictureIterator : Iterator +{ + Paint* paint = nullptr; + Paint* ptr = nullptr; + + PictureIterator(Paint* p) : paint(p) {} + + const Paint* next() override + { + if (!ptr) ptr = paint; + else ptr = nullptr; + return ptr; + } + + uint32_t count() override + { + if (paint) return 1; + else return 0; + } + + void begin() override + { + ptr = nullptr; + } +}; + + +struct Picture::Impl +{ + shared_ptr loader = nullptr; + + Paint* paint = nullptr; //vector picture uses + Surface* surface = nullptr; //bitmap picture uses + RenderData rd = nullptr; //engine data + float w = 0, h = 0; + RenderMesh rm; //mesh data + Picture* picture = nullptr; + bool resizing = false; + bool needComp = false; //need composition + + Impl(Picture* p) : picture(p) + { + } + + ~Impl() + { + delete(paint); + delete(surface); + } + + bool dispose(RenderMethod& renderer) + { + if (paint) paint->pImpl->dispose(renderer); + else if (surface) renderer.dispose(rd); + rd = nullptr; + return true; + } + + RenderTransform resizeTransform(const RenderTransform* pTransform) + { + //Overriding Transformation by the desired image size + auto sx = w / loader->w; + auto sy = h / loader->h; + auto scale = sx < sy ? sx : sy; + + RenderTransform tmp; + tmp.m = {scale, 0, 0, 0, scale, 0, 0, 0, 1}; + + if (!pTransform) return tmp; + else return RenderTransform(pTransform, &tmp); + } + + bool needComposition(uint8_t opacity) + { + //In this case, paint(scene) would try composition itself. + if (opacity < 255) return false; + + //Composition test + const Paint* target; + auto method = picture->composite(&target); + if (!target || method == tvg::CompositeMethod::ClipPath) return false; + if (target->pImpl->opacity == 255 || target->pImpl->opacity == 0) return false; + + return true; + } + + RenderData update(RenderMethod &renderer, const RenderTransform* pTransform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) + { + auto flag = load(); + + if (surface) { + auto transform = resizeTransform(pTransform); + rd = renderer.prepare(surface, &rm, rd, &transform, clips, opacity, static_cast(pFlag | flag)); + } else if (paint) { + if (resizing) { + loader->resize(paint, w, h); + resizing = false; + } + needComp = needComposition(opacity) ? true : false; + rd = paint->pImpl->update(renderer, pTransform, clips, opacity, static_cast(pFlag | flag), clipper); + } + return rd; + } + + bool render(RenderMethod &renderer) + { + bool ret = false; + if (surface) return renderer.renderImage(rd); + else if (paint) { + Compositor* cmp = nullptr; + if (needComp) { + cmp = renderer.target(bounds(renderer), renderer.colorSpace()); + renderer.beginComposite(cmp, CompositeMethod::None, 255); + } + ret = paint->pImpl->render(renderer); + if (cmp) renderer.endComposite(cmp); + } + return ret; + } + + bool size(float w, float h) + { + this->w = w; + this->h = h; + resizing = true; + return true; + } + + bool bounds(float* x, float* y, float* w, float* h, bool stroking) + { + if (rm.triangleCnt > 0) { + auto triangles = rm.triangles; + auto min = triangles[0].vertex[0].pt; + auto max = triangles[0].vertex[0].pt; + + for (uint32_t i = 0; i < rm.triangleCnt; ++i) { + if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; + else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; + if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; + else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; + + if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; + else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; + if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; + else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; + + if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; + else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; + if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; + else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; + } + if (x) *x = min.x; + if (y) *y = min.y; + if (w) *w = max.x - min.x; + if (h) *h = max.y - min.y; + } else { + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = this->w; + if (h) *h = this->h; + } + return true; + } + + RenderRegion bounds(RenderMethod& renderer) + { + if (rd) return renderer.region(rd); + if (paint) return paint->pImpl->bounds(renderer); + return {0, 0, 0, 0}; + } + + Result load(const string& path) + { + if (paint || surface) return Result::InsufficientCondition; + if (loader) loader->close(); + bool invalid; //Invalid Path + loader = LoaderMgr::loader(path, &invalid); + if (!loader) { + if (invalid) return Result::InvalidArguments; + return Result::NonSupport; + } + if (!loader->read()) return Result::Unknown; + w = loader->w; + h = loader->h; + return Result::Success; + } + + Result load(const char* data, uint32_t size, const string& mimeType, bool copy) + { + if (paint || surface) return Result::InsufficientCondition; + if (loader) loader->close(); + loader = LoaderMgr::loader(data, size, mimeType, copy); + if (!loader) return Result::NonSupport; + if (!loader->read()) return Result::Unknown; + w = loader->w; + h = loader->h; + return Result::Success; + } + + Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) + { + if (paint || surface) return Result::InsufficientCondition; + if (loader) loader->close(); + loader = LoaderMgr::loader(data, w, h, copy); + if (!loader) return Result::FailedAllocation; + this->w = loader->w; + this->h = loader->h; + return Result::Success; + } + + void mesh(const Polygon* triangles, const uint32_t triangleCnt) + { + if (triangles && triangleCnt > 0) { + this->rm.triangleCnt = triangleCnt; + this->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * triangleCnt); + memcpy(this->rm.triangles, triangles, sizeof(Polygon) * triangleCnt); + } else { + free(this->rm.triangles); + this->rm.triangles = nullptr; + this->rm.triangleCnt = 0; + } + } + + Paint* duplicate() + { + load(); + + auto ret = Picture::gen(); + + auto dup = ret.get()->pImpl; + if (paint) dup->paint = paint->duplicate(); + + dup->loader = loader; + if (surface) { + dup->surface = new Surface; + *dup->surface = *surface; + //TODO: A dupilcation is not a proxy... it needs copy of the pixel data? + dup->surface->owner = false; + } + dup->w = w; + dup->h = h; + dup->resizing = resizing; + + if (rm.triangleCnt > 0) { + dup->rm.triangleCnt = rm.triangleCnt; + dup->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * rm.triangleCnt); + memcpy(dup->rm.triangles, rm.triangles, sizeof(Polygon) * rm.triangleCnt); + } + + return ret.release(); + } + + Iterator* iterator() + { + load(); + return new PictureIterator(paint); + } + + uint32_t* data(uint32_t* w, uint32_t* h) + { + //Try it, If not loaded yet. + load(); + + if (loader) { + if (w) *w = static_cast(loader->w); + if (h) *h = static_cast(loader->h); + } else { + if (w) *w = 0; + if (h) *h = 0; + } + if (surface) return surface->buf32; + else return nullptr; + } + + RenderUpdateFlag load(); +}; + +#endif //_TVG_PICTURE_IMPL_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgRawLoader.cpp b/libraries/lvgl/src/libs/thorvg/tvgRawLoader.cpp new file mode 100644 index 0000000..b20c7fd --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgRawLoader.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include +#include "tvgLoader.h" +#include "tvgRawLoader.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +RawLoader::~RawLoader() +{ + if (copy && content) { + free((void*)content); + content = nullptr; + } +} + + +bool RawLoader::open(const uint32_t* data, uint32_t w, uint32_t h, bool copy) +{ + if (!data || w == 0 || h == 0) return false; + + this->w = (float)w; + this->h = (float)h; + this->copy = copy; + + if (copy) { + content = (uint32_t*)malloc(sizeof(uint32_t) * w * h); + if (!content) return false; + memcpy((void*)content, data, sizeof(uint32_t) * w * h); + } + else content = const_cast(data); + + cs = ColorSpace::ARGB8888; + + return true; +} + + +bool RawLoader::read() +{ + return true; +} + + +bool RawLoader::close() +{ + return true; +} + + +unique_ptr RawLoader::bitmap() +{ + if (!content) return nullptr; + + //TODO: It's better to keep this surface instance in the loader side + auto surface = new Surface; + surface->buf32 = content; + surface->stride = static_cast(w); + surface->w = static_cast(w); + surface->h = static_cast(h); + surface->cs = cs; + surface->channelSize = sizeof(uint32_t); + surface->premultiplied = false; + surface->owner = true; + + return unique_ptr(surface); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgRawLoader.h b/libraries/lvgl/src/libs/thorvg/tvgRawLoader.h new file mode 100644 index 0000000..bc3851f --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgRawLoader.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_RAW_LOADER_H_ +#define _TVG_RAW_LOADER_H_ + +class RawLoader : public LoadModule +{ +public: + uint32_t* content = nullptr; + bool copy = false; + + ~RawLoader(); + + using LoadModule::open; + bool open(const uint32_t* data, uint32_t w, uint32_t h, bool copy) override; + bool read() override; + bool close() override; + + unique_ptr bitmap() override; +}; + + +#endif //_TVG_RAW_LOADER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgRender.cpp b/libraries/lvgl/src/libs/thorvg/tvgRender.cpp new file mode 100644 index 0000000..9994c8c --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgRender.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgRender.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +void RenderTransform::override(const Matrix& m) +{ + this->m = m; + overriding = true; +} + + +bool RenderTransform::update() +{ + if (overriding) return true; + + //Init Status + if (mathZero(x) && mathZero(y) && mathZero(degree) && mathEqual(scale, 1)) return false; + + mathIdentity(&m); + + mathScale(&m, scale, scale); + + if (!mathZero(degree)) mathRotate(&m, degree); + + mathTranslate(&m, x, y); + + return true; +} + + +RenderTransform::RenderTransform() +{ +} + + +RenderTransform::RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs) +{ + m = mathMultiply(&lhs->m, &rhs->m); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgRender.h b/libraries/lvgl/src/libs/thorvg/tvgRender.h new file mode 100644 index 0000000..d95c37c --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgRender.h @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_RENDER_H_ +#define _TVG_RENDER_H_ + +#include "tvgCommon.h" +#include "tvgArray.h" + +namespace tvg +{ + +using RenderData = void*; +using pixel_t = uint32_t; + +enum RenderUpdateFlag : uint8_t {None = 0, Path = 1, Color = 2, Gradient = 4, Stroke = 8, Transform = 16, Image = 32, GradientStroke = 64, All = 255}; + +struct Surface; + +enum ColorSpace +{ + ABGR8888 = 0, //The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. + ARGB8888, //The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. + ABGR8888S, //The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. + ARGB8888S, //The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. + Grayscale8, //One single channel data. + Unsupported //TODO: Change to the default, At the moment, we put it in the last to align with SwCanvas::Colorspace. +}; + +struct Surface +{ + union { + pixel_t* data; //system based data pointer + uint32_t* buf32; //for explicit 32bits channels + uint8_t* buf8; //for explicit 8bits grayscale + }; + uint32_t stride; + uint32_t w, h; + ColorSpace cs; + uint8_t channelSize; + + bool premultiplied; //Alpha-premultiplied + bool owner; //Only owner could modify the buffer +}; + +struct Compositor +{ + CompositeMethod method; + uint8_t opacity; +}; + +struct RenderMesh +{ + Polygon* triangles = nullptr; + uint32_t triangleCnt = 0; + + ~RenderMesh() + { + free(triangles); + } +}; + +struct RenderRegion +{ + int32_t x, y, w, h; + + void intersect(const RenderRegion& rhs) + { + auto x1 = x + w; + auto y1 = y + h; + auto x2 = rhs.x + rhs.w; + auto y2 = rhs.y + rhs.h; + + x = (x > rhs.x) ? x : rhs.x; + y = (y > rhs.y) ? y : rhs.y; + w = ((x1 < x2) ? x1 : x2) - x; + h = ((y1 < y2) ? y1 : y2) - y; + + if (w < 0) w = 0; + if (h < 0) h = 0; + } + + void add(const RenderRegion& rhs) + { + if (rhs.x < x) { + w += (x - rhs.x); + x = rhs.x; + } + if (rhs.y < y) { + h += (y - rhs.y); + y = rhs.y; + } + if (rhs.x + rhs.w > x + w) w = (rhs.x + rhs.w) - x; + if (rhs.y + rhs.h > y + h) h = (rhs.y + rhs.h) - y; + } +}; + +struct RenderTransform +{ + Matrix m; //3x3 Matrix Elements + float x = 0.0f; + float y = 0.0f; + float degree = 0.0f; //rotation degree + float scale = 1.0f; //scale factor + bool overriding = false; //user transform? + + bool update(); + void override(const Matrix& m); + + RenderTransform(); + RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs); +}; + +struct RenderStroke +{ + float width = 0.0f; + uint8_t color[4] = {0, 0, 0, 0}; + Fill *fill = nullptr; + float* dashPattern = nullptr; + uint32_t dashCnt = 0; + float dashOffset = 0.0f; + StrokeCap cap = StrokeCap::Square; + StrokeJoin join = StrokeJoin::Bevel; + float miterlimit = 4.0f; + bool strokeFirst = false; + + struct { + float begin = 0.0f; + float end = 1.0f; + } trim; + + ~RenderStroke() + { + free(dashPattern); + delete(fill); + } +}; + +struct RenderShape +{ + struct + { + Array cmds; + Array pts; + } path; + + Fill *fill = nullptr; + RenderStroke *stroke = nullptr; + uint8_t color[4] = {0, 0, 0, 0}; //r, g, b, a + FillRule rule = FillRule::Winding; + + ~RenderShape() + { + delete(fill); + delete(stroke); + } + + void fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const + { + if (r) *r = color[0]; + if (g) *g = color[1]; + if (b) *b = color[2]; + if (a) *a = color[3]; + } + + float strokeWidth() const + { + if (!stroke) return 0; + return stroke->width; + } + + bool strokeTrim() const + { + if (!stroke) return false; + if (stroke->trim.begin == 0.0f && stroke->trim.end == 1.0f) return false; + if (stroke->trim.begin == 1.0f && stroke->trim.end == 0.0f) return false; + return true; + } + + bool strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const + { + if (!stroke) return false; + + if (r) *r = stroke->color[0]; + if (g) *g = stroke->color[1]; + if (b) *b = stroke->color[2]; + if (a) *a = stroke->color[3]; + + return true; + } + + const Fill* strokeFill() const + { + if (!stroke) return nullptr; + return stroke->fill; + } + + uint32_t strokeDash(const float** dashPattern, float* offset) const + { + if (!stroke) return 0; + if (dashPattern) *dashPattern = stroke->dashPattern; + if (offset) *offset = stroke->dashOffset; + return stroke->dashCnt; + } + + StrokeCap strokeCap() const + { + if (!stroke) return StrokeCap::Square; + return stroke->cap; + } + + StrokeJoin strokeJoin() const + { + if (!stroke) return StrokeJoin::Bevel; + return stroke->join; + } + + float strokeMiterlimit() const + { + if (!stroke) return 4.0f; + + return stroke->miterlimit;; + } +}; + +class RenderMethod +{ +public: + virtual ~RenderMethod() {} + virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0; + virtual RenderData prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) = 0; + virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) = 0; + virtual bool preRender() = 0; + virtual bool renderShape(RenderData data) = 0; + virtual bool renderImage(RenderData data) = 0; + virtual bool postRender() = 0; + virtual bool dispose(RenderData data) = 0; + virtual RenderRegion region(RenderData data) = 0; + virtual RenderRegion viewport() = 0; + virtual bool viewport(const RenderRegion& vp) = 0; + virtual bool blend(BlendMethod method) = 0; + virtual ColorSpace colorSpace() = 0; + + virtual bool clear() = 0; + virtual bool sync() = 0; + + virtual Compositor* target(const RenderRegion& region, ColorSpace cs) = 0; + virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) = 0; + virtual bool endComposite(Compositor* cmp) = 0; +}; + +static inline bool MASK_REGION_MERGING(CompositeMethod method) +{ + switch(method) { + case CompositeMethod::AlphaMask: + case CompositeMethod::InvAlphaMask: + case CompositeMethod::LumaMask: + case CompositeMethod::InvLumaMask: + case CompositeMethod::SubtractMask: + case CompositeMethod::IntersectMask: + return false; + //these might expand the rendering region + case CompositeMethod::AddMask: + case CompositeMethod::DifferenceMask: + return true; + default: + TVGERR("RENDERER", "Unsupported Composite Method! = %d", (int)method); + return false; + } +} + +static inline uint8_t CHANNEL_SIZE(ColorSpace cs) +{ + switch(cs) { + case ColorSpace::ABGR8888: + case ColorSpace::ABGR8888S: + case ColorSpace::ARGB8888: + case ColorSpace::ARGB8888S: + return sizeof(uint32_t); + case ColorSpace::Grayscale8: + return sizeof(uint8_t); + case ColorSpace::Unsupported: + default: + TVGERR("RENDERER", "Unsupported Channel Size! = %d", (int)cs); + return 0; + } +} + +static inline ColorSpace COMPOSITE_TO_COLORSPACE(RenderMethod& renderer, CompositeMethod method) +{ + switch(method) { + case CompositeMethod::AlphaMask: + case CompositeMethod::InvAlphaMask: + case CompositeMethod::AddMask: + case CompositeMethod::DifferenceMask: + case CompositeMethod::SubtractMask: + case CompositeMethod::IntersectMask: + return ColorSpace::Grayscale8; + //TODO: Optimize Luma/InvLuma colorspace to Grayscale8 + case CompositeMethod::LumaMask: + case CompositeMethod::InvLumaMask: + return renderer.colorSpace(); + default: + TVGERR("RENDERER", "Unsupported Composite Size! = %d", (int)method); + return ColorSpace::Unsupported; + } +} + +static inline uint8_t MULTIPLY(uint8_t c, uint8_t a) +{ + return (((c) * (a) + 0xff) >> 8); +} + + +} + +#endif //_TVG_RENDER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSaveModule.h b/libraries/lvgl/src/libs/thorvg/tvgSaveModule.h new file mode 100644 index 0000000..cff1a81 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSaveModule.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SAVE_MODULE_H_ +#define _TVG_SAVE_MODULE_H_ + +#include "tvgIteratorAccessor.h" + +namespace tvg +{ + +class SaveModule +{ +public: + virtual ~SaveModule() {} + + virtual bool save(Paint* paint, const string& path, bool compress) = 0; + virtual bool close() = 0; +}; + +} + +#endif //_TVG_SAVE_MODULE_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSaver.cpp b/libraries/lvgl/src/libs/thorvg/tvgSaver.cpp new file mode 100644 index 0000000..4fd9848 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSaver.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgCommon.h" +#include "tvgSaveModule.h" + +#ifdef THORVG_TVG_SAVER_SUPPORT + #include "tvgTvgSaver.h" +#endif + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct Saver::Impl +{ + SaveModule* saveModule = nullptr; + ~Impl() + { + delete(saveModule); + } +}; + + +static SaveModule* _find(FileType type) +{ + switch(type) { + case FileType::Tvg: { +#ifdef THORVG_TVG_SAVER_SUPPORT + return new TvgSaver; +#endif + break; + } + default: { + break; + } + } + +#ifdef THORVG_LOG_ENABLED + const char *format; + switch(type) { + case FileType::Tvg: { + format = "TVG"; + break; + } + default: { + format = "???"; + break; + } + } + TVGLOG("SAVER", "%s format is not supported", format); +#endif + return nullptr; +} + + +static SaveModule* _find(const string& path) +{ + auto ext = path.substr(path.find_last_of(".") + 1); + if (!ext.compare("tvg")) { + return _find(FileType::Tvg); + } + return nullptr; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Saver::Saver() : pImpl(new Impl()) +{ +} + + +Saver::~Saver() +{ + delete(pImpl); +} + + +Result Saver::save(std::unique_ptr paint, const string& path, bool compress) noexcept +{ + auto p = paint.release(); + if (!p) return Result::MemoryCorruption; + + //Already on saving an other resource. + if (pImpl->saveModule) { + delete(p); + return Result::InsufficientCondition; + } + + if (auto saveModule = _find(path)) { + if (saveModule->save(p, path, compress)) { + pImpl->saveModule = saveModule; + return Result::Success; + } else { + delete(p); + delete(saveModule); + return Result::Unknown; + } + } + delete(p); + return Result::NonSupport; +} + + +Result Saver::sync() noexcept +{ + if (!pImpl->saveModule) return Result::InsufficientCondition; + pImpl->saveModule->close(); + delete(pImpl->saveModule); + pImpl->saveModule = nullptr; + + return Result::Success; +} + + +unique_ptr Saver::gen() noexcept +{ + return unique_ptr(new Saver); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgScene.cpp b/libraries/lvgl/src/libs/thorvg/tvgScene.cpp new file mode 100644 index 0000000..122cd53 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgScene.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgScene.h" + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Scene::Scene() : pImpl(new Impl(this)) +{ + Paint::pImpl->id = TVG_CLASS_ID_SCENE; + Paint::pImpl->method(new PaintMethod(pImpl)); +} + + +Scene::~Scene() +{ + delete(pImpl); +} + + +unique_ptr Scene::gen() noexcept +{ + return unique_ptr(new Scene); +} + + +uint32_t Scene::identifier() noexcept +{ + return TVG_CLASS_ID_SCENE; +} + + +Result Scene::push(unique_ptr paint) noexcept +{ + auto p = paint.release(); + if (!p) return Result::MemoryCorruption; + PP(p)->ref(); + pImpl->paints.push_back(p); + + return Result::Success; +} + + +Result Scene::reserve(TVG_UNUSED uint32_t size) noexcept +{ + return Result::NonSupport; +} + + +Result Scene::clear(bool free) noexcept +{ + pImpl->clear(free); + + return Result::Success; +} + + +list& Scene::paints() noexcept +{ + return pImpl->paints; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgScene.h b/libraries/lvgl/src/libs/thorvg/tvgScene.h new file mode 100644 index 0000000..f626e99 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgScene.h @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SCENE_IMPL_H_ +#define _TVG_SCENE_IMPL_H_ + +#include +#include "tvgPaint.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct SceneIterator : Iterator +{ + list* paints; + list::iterator itr; + + SceneIterator(list* p) : paints(p) + { + begin(); + } + + const Paint* next() override + { + if (itr == paints->end()) return nullptr; + auto paint = *itr; + ++itr; + return paint; + } + + uint32_t count() override + { + return paints->size(); + } + + void begin() override + { + itr = paints->begin(); + } +}; + +struct Scene::Impl +{ + list paints; + RenderMethod* renderer = nullptr; //keep it for explicit clear + RenderData rd = nullptr; + Scene* scene = nullptr; + uint8_t opacity; //for composition + bool needComp; //composite or not + + Impl(Scene* s) : scene(s) + { + } + + ~Impl() + { + for (auto paint : paints) { + if (paint->pImpl->unref() == 0) delete(paint); + } + } + + bool dispose(RenderMethod& renderer) + { + for (auto paint : paints) { + paint->pImpl->dispose(renderer); + } + + renderer.dispose(rd); + this->renderer = nullptr; + this->rd = nullptr; + + return true; + } + + bool needComposition(uint8_t opacity) + { + if (opacity == 0 || paints.empty()) return false; + + //Masking may require composition (even if opacity == 255) + auto compMethod = scene->composite(nullptr); + if (compMethod != CompositeMethod::None && compMethod != CompositeMethod::ClipPath) return true; + + //Blending may require composition (even if opacity == 255) + if (scene->blend() != BlendMethod::Normal) return true; + + //Half translucent requires intermediate composition. + if (opacity == 255) return false; + + //If scene has several children or only scene, it may require composition. + //OPTIMIZE: the bitmap type of the picture would not need the composition. + //OPTIMIZE: a single paint of a scene would not need the composition. + if (paints.size() == 1 && paints.front()->identifier() == TVG_CLASS_ID_SHAPE) return false; + + return true; + } + + RenderData update(RenderMethod &renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flag, bool clipper) + { + if ((needComp = needComposition(opacity))) { + /* Overriding opacity value. If this scene is half-translucent, + It must do intermeidate composition with that opacity value. */ + this->opacity = opacity; + opacity = 255; + } + + this->renderer = &renderer; + + if (clipper) { + Array rds; + rds.reserve(paints.size()); + for (auto paint : paints) { + rds.push(paint->pImpl->update(renderer, transform, clips, opacity, flag, true)); + } + rd = renderer.prepare(rds, rd, transform, clips, opacity, flag); + return rd; + } else { + for (auto paint : paints) { + paint->pImpl->update(renderer, transform, clips, opacity, flag, false); + } + return nullptr; + } + } + + bool render(RenderMethod& renderer) + { + Compositor* cmp = nullptr; + + if (needComp) { + cmp = renderer.target(bounds(renderer), renderer.colorSpace()); + renderer.beginComposite(cmp, CompositeMethod::None, opacity); + } + + for (auto paint : paints) { + if (!paint->pImpl->render(renderer)) return false; + } + + if (cmp) renderer.endComposite(cmp); + + return true; + } + + RenderRegion bounds(RenderMethod& renderer) const + { + if (paints.empty()) return {0, 0, 0, 0}; + + int32_t x1 = INT32_MAX; + int32_t y1 = INT32_MAX; + int32_t x2 = 0; + int32_t y2 = 0; + + for (auto paint : paints) { + auto region = paint->pImpl->bounds(renderer); + + //Merge regions + if (region.x < x1) x1 = region.x; + if (x2 < region.x + region.w) x2 = (region.x + region.w); + if (region.y < y1) y1 = region.y; + if (y2 < region.y + region.h) y2 = (region.y + region.h); + } + + return {x1, y1, (x2 - x1), (y2 - y1)}; + } + + bool bounds(float* px, float* py, float* pw, float* ph, bool stroking) + { + if (paints.empty()) return false; + + auto x1 = FLT_MAX; + auto y1 = FLT_MAX; + auto x2 = -FLT_MAX; + auto y2 = -FLT_MAX; + + for (auto paint : paints) { + auto x = FLT_MAX; + auto y = FLT_MAX; + auto w = 0.0f; + auto h = 0.0f; + + if (!P(paint)->bounds(&x, &y, &w, &h, true, stroking)) continue; + + //Merge regions + if (x < x1) x1 = x; + if (x2 < x + w) x2 = (x + w); + if (y < y1) y1 = y; + if (y2 < y + h) y2 = (y + h); + } + + if (px) *px = x1; + if (py) *py = y1; + if (pw) *pw = (x2 - x1); + if (ph) *ph = (y2 - y1); + + return true; + } + + Paint* duplicate() + { + auto ret = Scene::gen(); + + auto dup = ret.get()->pImpl; + + for (auto paint : paints) { + auto cdup = paint->duplicate(); + P(cdup)->ref(); + dup->paints.push_back(cdup); + } + + return ret.release(); + } + + void clear(bool free) + { + auto dispose = renderer ? true : false; + + for (auto paint : paints) { + if (dispose) free &= P(paint)->dispose(*renderer); + if (P(paint)->unref() == 0 && free) delete(paint); + } + paints.clear(); + renderer = nullptr; + } + + Iterator* iterator() + { + return new SceneIterator(&paints); + } +}; + +#endif //_TVG_SCENE_IMPL_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgShape.cpp b/libraries/lvgl/src/libs/thorvg/tvgShape.cpp new file mode 100644 index 0000000..e43c07f --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgShape.cpp @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgShape.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ +constexpr auto PATH_KAPPA = 0.552284f; + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +Shape :: Shape() : pImpl(new Impl(this)) +{ + Paint::pImpl->id = TVG_CLASS_ID_SHAPE; + Paint::pImpl->method(new PaintMethod(pImpl)); +} + + +Shape :: ~Shape() +{ + delete(pImpl); +} + + +unique_ptr Shape::gen() noexcept +{ + return unique_ptr(new Shape); +} + + +uint32_t Shape::identifier() noexcept +{ + return TVG_CLASS_ID_SHAPE; +} + + +Result Shape::reset() noexcept +{ + pImpl->rs.path.cmds.clear(); + pImpl->rs.path.pts.clear(); + + pImpl->flag = RenderUpdateFlag::Path; + + return Result::Success; +} + + +uint32_t Shape::pathCommands(const PathCommand** cmds) const noexcept +{ + if (!cmds) return 0; + + *cmds = pImpl->rs.path.cmds.data; + return pImpl->rs.path.cmds.count; +} + + +uint32_t Shape::pathCoords(const Point** pts) const noexcept +{ + if (!pts) return 0; + + *pts = pImpl->rs.path.pts.data; + return pImpl->rs.path.pts.count; +} + + +Result Shape::appendPath(const PathCommand *cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) noexcept +{ + if (cmdCnt == 0 || ptsCnt == 0 || !cmds || !pts) return Result::InvalidArguments; + + pImpl->grow(cmdCnt, ptsCnt); + pImpl->append(cmds, cmdCnt, pts, ptsCnt); + + return Result::Success; +} + + +Result Shape::moveTo(float x, float y) noexcept +{ + pImpl->moveTo(x, y); + + return Result::Success; +} + + +Result Shape::lineTo(float x, float y) noexcept +{ + pImpl->lineTo(x, y); + + return Result::Success; +} + + +Result Shape::cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept +{ + pImpl->cubicTo(cx1, cy1, cx2, cy2, x, y); + + return Result::Success; +} + + +Result Shape::close() noexcept +{ + pImpl->close(); + + return Result::Success; +} + + +Result Shape::appendCircle(float cx, float cy, float rx, float ry) noexcept +{ + auto rxKappa = rx * PATH_KAPPA; + auto ryKappa = ry * PATH_KAPPA; + + pImpl->grow(6, 13); + pImpl->moveTo(cx, cy - ry); + pImpl->cubicTo(cx + rxKappa, cy - ry, cx + rx, cy - ryKappa, cx + rx, cy); + pImpl->cubicTo(cx + rx, cy + ryKappa, cx + rxKappa, cy + ry, cx, cy + ry); + pImpl->cubicTo(cx - rxKappa, cy + ry, cx - rx, cy + ryKappa, cx - rx, cy); + pImpl->cubicTo(cx - rx, cy - ryKappa, cx - rxKappa, cy - ry, cx, cy - ry); + pImpl->close(); + + return Result::Success; +} + +Result Shape::appendArc(float cx, float cy, float radius, float startAngle, float sweep, bool pie) noexcept +{ + //just circle + if (sweep >= 360.0f || sweep <= -360.0f) return appendCircle(cx, cy, radius, radius); + + startAngle = (startAngle * MATH_PI) / 180.0f; + sweep = sweep * MATH_PI / 180.0f; + + auto nCurves = ceil(fabsf(sweep / MATH_PI2)); + auto sweepSign = (sweep < 0 ? -1 : 1); + auto fract = fmodf(sweep, MATH_PI2); + fract = (mathZero(fract)) ? MATH_PI2 * sweepSign : fract; + + //Start from here + Point start = {radius * cosf(startAngle), radius * sinf(startAngle)}; + + if (pie) { + pImpl->moveTo(cx, cy); + pImpl->lineTo(start.x + cx, start.y + cy); + } else { + pImpl->moveTo(start.x + cx, start.y + cy); + } + + for (int i = 0; i < nCurves; ++i) { + auto endAngle = startAngle + ((i != nCurves - 1) ? float(M_PI_2) * sweepSign : fract); + Point end = {radius * cosf(endAngle), radius * sinf(endAngle)}; + + //variables needed to calculate bezier control points + + //get bezier control points using article: + //(http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + auto ax = start.x; + auto ay = start.y; + auto bx = end.x; + auto by = end.y; + auto q1 = ax * ax + ay * ay; + auto q2 = ax * bx + ay * by + q1; + auto k2 = (4.0f/3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + start = end; //Next start point is the current end point + + end.x += cx; + end.y += cy; + + Point ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; + Point ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; + + pImpl->cubicTo(ctrl1.x, ctrl1.y, ctrl2.x, ctrl2.y, end.x, end.y); + + startAngle = endAngle; + } + + if (pie) pImpl->close(); + + return Result::Success; +} + + +Result Shape::appendRect(float x, float y, float w, float h, float rx, float ry) noexcept +{ + auto halfW = w * 0.5f; + auto halfH = h * 0.5f; + + //clamping cornerRadius by minimum size + if (rx > halfW) rx = halfW; + if (ry > halfH) ry = halfH; + + //rectangle + if (rx == 0 && ry == 0) { + pImpl->grow(5, 4); + pImpl->moveTo(x, y); + pImpl->lineTo(x + w, y); + pImpl->lineTo(x + w, y + h); + pImpl->lineTo(x, y + h); + pImpl->close(); + //circle + } else if (mathEqual(rx, halfW) && mathEqual(ry, halfH)) { + return appendCircle(x + (w * 0.5f), y + (h * 0.5f), rx, ry); + } else { + auto hrx = rx * 0.5f; + auto hry = ry * 0.5f; + pImpl->grow(10, 17); + pImpl->moveTo(x + rx, y); + pImpl->lineTo(x + w - rx, y); + pImpl->cubicTo(x + w - rx + hrx, y, x + w, y + ry - hry, x + w, y + ry); + pImpl->lineTo(x + w, y + h - ry); + pImpl->cubicTo(x + w, y + h - ry + hry, x + w - rx + hrx, y + h, x + w - rx, y + h); + pImpl->lineTo(x + rx, y + h); + pImpl->cubicTo(x + rx - hrx, y + h, x, y + h - ry + hry, x, y + h - ry); + pImpl->lineTo(x, y + ry); + pImpl->cubicTo(x, y + ry - hry, x + rx - hrx, y, x + rx, y); + pImpl->close(); + } + + return Result::Success; +} + + +Result Shape::fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept +{ + if (pImpl->rs.fill) { + delete(pImpl->rs.fill); + pImpl->rs.fill = nullptr; + pImpl->flag |= RenderUpdateFlag::Gradient; + } + + if (r == pImpl->rs.color[0] && g == pImpl->rs.color[1] && b == pImpl->rs.color[2] && a == pImpl->rs.color[3]) return Result::Success; + + pImpl->rs.color[0] = r; + pImpl->rs.color[1] = g; + pImpl->rs.color[2] = b; + pImpl->rs.color[3] = a; + pImpl->flag |= RenderUpdateFlag::Color; + + return Result::Success; +} + + +Result Shape::fill(unique_ptr f) noexcept +{ + auto p = f.release(); + if (!p) return Result::MemoryCorruption; + + if (pImpl->rs.fill && pImpl->rs.fill != p) delete(pImpl->rs.fill); + pImpl->rs.fill = p; + pImpl->flag |= RenderUpdateFlag::Gradient; + + return Result::Success; +} + + +Result Shape::fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept +{ + pImpl->rs.fillColor(r, g, b, a); + + return Result::Success; +} + + +const Fill* Shape::fill() const noexcept +{ + return pImpl->rs.fill; +} + + +Result Shape::order(bool strokeFirst) noexcept +{ + if (!pImpl->strokeFirst(strokeFirst)) return Result::FailedAllocation; + + return Result::Success; +} + + +Result Shape::stroke(float width) noexcept +{ + if (!pImpl->strokeWidth(width)) return Result::FailedAllocation; + + return Result::Success; +} + + +float Shape::strokeWidth() const noexcept +{ + return pImpl->rs.strokeWidth(); +} + + +Result Shape::stroke(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept +{ + if (!pImpl->strokeColor(r, g, b, a)) return Result::FailedAllocation; + + return Result::Success; +} + + +Result Shape::strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept +{ + if (!pImpl->rs.strokeColor(r, g, b, a)) return Result::InsufficientCondition; + + return Result::Success; +} + + +Result Shape::stroke(unique_ptr f) noexcept +{ + return pImpl->strokeFill(std::move(f)); +} + + +const Fill* Shape::strokeFill() const noexcept +{ + return pImpl->rs.strokeFill(); +} + + +Result Shape::stroke(const float* dashPattern, uint32_t cnt) noexcept +{ + return pImpl->strokeDash(dashPattern, cnt, 0); +} + + +uint32_t Shape::strokeDash(const float** dashPattern) const noexcept +{ + return pImpl->rs.strokeDash(dashPattern, nullptr); +} + + +Result Shape::stroke(StrokeCap cap) noexcept +{ + if (!pImpl->strokeCap(cap)) return Result::FailedAllocation; + + return Result::Success; +} + + +Result Shape::stroke(StrokeJoin join) noexcept +{ + if (!pImpl->strokeJoin(join)) return Result::FailedAllocation; + + return Result::Success; +} + +Result Shape::strokeMiterlimit(float miterlimit) noexcept +{ + // https://www.w3.org/TR/SVG2/painting.html#LineJoin + // - A negative value for stroke-miterlimit must be treated as an illegal value. + if (miterlimit < 0.0f) return Result::NonSupport; + // TODO Find out a reasonable max value. + if (!pImpl->strokeMiterlimit(miterlimit)) return Result::FailedAllocation; + + return Result::Success; +} + + +StrokeCap Shape::strokeCap() const noexcept +{ + return pImpl->rs.strokeCap(); +} + + +StrokeJoin Shape::strokeJoin() const noexcept +{ + return pImpl->rs.strokeJoin(); +} + +float Shape::strokeMiterlimit() const noexcept +{ + return pImpl->rs.strokeMiterlimit(); +} + + +Result Shape::fill(FillRule r) noexcept +{ + pImpl->rs.rule = r; + + return Result::Success; +} + + +FillRule Shape::fillRule() const noexcept +{ + return pImpl->rs.rule; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgShape.h b/libraries/lvgl/src/libs/thorvg/tvgShape.h new file mode 100644 index 0000000..161932d --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgShape.h @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SHAPE_IMPL_H_ +#define _TVG_SHAPE_IMPL_H_ + +#include +#include "tvgMath.h" +#include "tvgPaint.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct Shape::Impl +{ + RenderShape rs; //shape data + RenderData rd = nullptr; //engine data + Shape* shape; + uint8_t flag = RenderUpdateFlag::None; + uint8_t opacity; //for composition + bool needComp; //composite or not + + Impl(Shape* s) : shape(s) + { + } + + bool dispose(RenderMethod& renderer) + { + renderer.dispose(rd); + rd = nullptr; + return true; + } + + bool render(RenderMethod& renderer) + { + Compositor* cmp = nullptr; + bool ret; + + if (needComp) { + cmp = renderer.target(bounds(renderer), renderer.colorSpace()); + renderer.beginComposite(cmp, CompositeMethod::None, opacity); + } + ret = renderer.renderShape(rd); + if (cmp) renderer.endComposite(cmp); + return ret; + } + + bool needComposition(uint8_t opacity) + { + if (opacity == 0) return false; + + //Shape composition is only necessary when stroking & fill are valid. + if (!rs.stroke || rs.stroke->width < FLT_EPSILON || (!rs.stroke->fill && rs.stroke->color[3] == 0)) return false; + if (!rs.fill && rs.color[3] == 0) return false; + + //translucent fill & stroke + if (opacity < 255) return true; + + //Composition test + const Paint* target; + auto method = shape->composite(&target); + if (!target || method == tvg::CompositeMethod::ClipPath) return false; + if (target->pImpl->opacity == 255 || target->pImpl->opacity == 0) return false; + + return true; + } + + RenderData update(RenderMethod& renderer, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) + { + if ((needComp = needComposition(opacity))) { + /* Overriding opacity value. If this scene is half-translucent, + It must do intermeidate composition with that opacity value. */ + this->opacity = opacity; + opacity = 255; + } + + rd = renderer.prepare(rs, rd, transform, clips, opacity, static_cast(pFlag | flag), clipper); + flag = RenderUpdateFlag::None; + return rd; + } + + RenderRegion bounds(RenderMethod& renderer) + { + return renderer.region(rd); + } + + bool bounds(float* x, float* y, float* w, float* h, bool stroking) + { + //Path bounding size + if (rs.path.pts.count > 0 ) { + auto pts = rs.path.pts.data; + Point min = { pts->x, pts->y }; + Point max = { pts->x, pts->y }; + + for (auto pts2 = pts + 1; pts2 < rs.path.pts.end(); ++pts2) { + if (pts2->x < min.x) min.x = pts2->x; + if (pts2->y < min.y) min.y = pts2->y; + if (pts2->x > max.x) max.x = pts2->x; + if (pts2->y > max.y) max.y = pts2->y; + } + + if (x) *x = min.x; + if (y) *y = min.y; + if (w) *w = max.x - min.x; + if (h) *h = max.y - min.y; + } + + //Stroke feathering + if (stroking && rs.stroke) { + if (x) *x -= rs.stroke->width * 0.5f; + if (y) *y -= rs.stroke->width * 0.5f; + if (w) *w += rs.stroke->width; + if (h) *h += rs.stroke->width; + } + return rs.path.pts.count > 0 ? true : false; + } + + void reserveCmd(uint32_t cmdCnt) + { + rs.path.cmds.reserve(cmdCnt); + } + + void reservePts(uint32_t ptsCnt) + { + rs.path.pts.reserve(ptsCnt); + } + + void grow(uint32_t cmdCnt, uint32_t ptsCnt) + { + rs.path.cmds.grow(cmdCnt); + rs.path.pts.grow(ptsCnt); + } + + void append(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) + { + memcpy(rs.path.cmds.end(), cmds, sizeof(PathCommand) * cmdCnt); + memcpy(rs.path.pts.end(), pts, sizeof(Point) * ptsCnt); + rs.path.cmds.count += cmdCnt; + rs.path.pts.count += ptsCnt; + + flag |= RenderUpdateFlag::Path; + } + + void moveTo(float x, float y) + { + rs.path.cmds.push(PathCommand::MoveTo); + rs.path.pts.push({x, y}); + + flag |= RenderUpdateFlag::Path; + } + + void lineTo(float x, float y) + { + rs.path.cmds.push(PathCommand::LineTo); + rs.path.pts.push({x, y}); + + flag |= RenderUpdateFlag::Path; + } + + void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) + { + rs.path.cmds.push(PathCommand::CubicTo); + rs.path.pts.push({cx1, cy1}); + rs.path.pts.push({cx2, cy2}); + rs.path.pts.push({x, y}); + + flag |= RenderUpdateFlag::Path; + } + + void close() + { + //Don't close multiple times. + if (rs.path.cmds.count > 0 && rs.path.cmds.last() == PathCommand::Close) return; + + rs.path.cmds.push(PathCommand::Close); + + flag |= RenderUpdateFlag::Path; + } + + bool strokeWidth(float width) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->width = width; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeTrim(float begin, float end) + { + if (!rs.stroke) { + if (begin == 0.0f && end == 1.0f) return true; + rs.stroke = new RenderStroke(); + } + + if (mathEqual(rs.stroke->trim.begin, begin) && mathEqual(rs.stroke->trim.end, end)) return true; + + rs.stroke->trim.begin = begin; + rs.stroke->trim.end = end; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeCap(StrokeCap cap) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->cap = cap; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeJoin(StrokeJoin join) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->join = join; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeMiterlimit(float miterlimit) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->miterlimit = miterlimit; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->fill) { + delete(rs.stroke->fill); + rs.stroke->fill = nullptr; + flag |= RenderUpdateFlag::GradientStroke; + } + + rs.stroke->color[0] = r; + rs.stroke->color[1] = g; + rs.stroke->color[2] = b; + rs.stroke->color[3] = a; + + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + Result strokeFill(unique_ptr f) + { + auto p = f.release(); + if (!p) return Result::MemoryCorruption; + + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->fill && rs.stroke->fill != p) delete(rs.stroke->fill); + rs.stroke->fill = p; + + flag |= RenderUpdateFlag::Stroke; + flag |= RenderUpdateFlag::GradientStroke; + + return Result::Success; + } + + Result strokeDash(const float* pattern, uint32_t cnt, float offset) + { + if ((cnt == 1) || (!pattern && cnt > 0) || (pattern && cnt == 0)) { + return Result::InvalidArguments; + } + + for (uint32_t i = 0; i < cnt; i++) { + if (pattern[i] < FLT_EPSILON) return Result::InvalidArguments; + } + + //Reset dash + if (!pattern && cnt == 0) { + free(rs.stroke->dashPattern); + rs.stroke->dashPattern = nullptr; + } else { + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->dashCnt != cnt) { + free(rs.stroke->dashPattern); + rs.stroke->dashPattern = nullptr; + } + if (!rs.stroke->dashPattern) { + rs.stroke->dashPattern = static_cast(malloc(sizeof(float) * cnt)); + if (!rs.stroke->dashPattern) return Result::FailedAllocation; + } + for (uint32_t i = 0; i < cnt; ++i) { + rs.stroke->dashPattern[i] = pattern[i]; + } + } + rs.stroke->dashCnt = cnt; + rs.stroke->dashOffset = offset; + flag |= RenderUpdateFlag::Stroke; + + return Result::Success; + } + + bool strokeFirst() + { + if (!rs.stroke) return true; + return rs.stroke->strokeFirst; + } + + bool strokeFirst(bool strokeFirst) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->strokeFirst = strokeFirst; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + void update(RenderUpdateFlag flag) + { + this->flag |= flag; + } + + Paint* duplicate() + { + auto ret = Shape::gen(); + + auto dup = ret.get()->pImpl; + dup->rs.rule = rs.rule; + + //Color + memcpy(dup->rs.color, rs.color, sizeof(rs.color)); + dup->flag = RenderUpdateFlag::Color; + + //Path + if (rs.path.cmds.count > 0 && rs.path.pts.count > 0) { + dup->rs.path.cmds = rs.path.cmds; + dup->rs.path.pts = rs.path.pts; + dup->flag |= RenderUpdateFlag::Path; + } + + //Stroke + if (rs.stroke) { + dup->rs.stroke = new RenderStroke(); + *dup->rs.stroke = *rs.stroke; + memcpy(dup->rs.stroke->color, rs.stroke->color, sizeof(rs.stroke->color)); + if (rs.stroke->dashCnt > 0) { + dup->rs.stroke->dashPattern = static_cast(malloc(sizeof(float) * rs.stroke->dashCnt)); + memcpy(dup->rs.stroke->dashPattern, rs.stroke->dashPattern, sizeof(float) * rs.stroke->dashCnt); + } + if (rs.stroke->fill) { + dup->rs.stroke->fill = rs.stroke->fill->duplicate(); + dup->flag |= RenderUpdateFlag::GradientStroke; + } + dup->flag |= RenderUpdateFlag::Stroke; + } + + //Fill + if (rs.fill) { + dup->rs.fill = rs.fill->duplicate(); + dup->flag |= RenderUpdateFlag::Gradient; + } + + return ret.release(); + } + + Iterator* iterator() + { + return nullptr; + } +}; + +#endif //_TVG_SHAPE_IMPL_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgStr.cpp b/libraries/lvgl/src/libs/thorvg/tvgStr.cpp new file mode 100644 index 0000000..25630c7 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgStr.cpp @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "config.h" +#include +#include +#include "tvgMath.h" +#include "tvgStr.h" + + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static inline bool _floatExact(float a, float b) +{ + return memcmp(&a, &b, sizeof(float)) == 0; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +namespace tvg { + +/* + * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtof-strtof-l-wcstof-wcstof-l?view=msvc-160 + * + * src should be one of the following form : + * + * [whitespace] [sign] {digits [radix digits] | radix digits} [{e | E} [sign] digits] + * [whitespace] [sign] {INF | INFINITY} + * [whitespace] [sign] NAN [sequence] + * + * No hexadecimal form supported + * no sequence supported after NAN + */ +float strToFloat(const char *nPtr, char **endPtr) +{ + if (endPtr) *endPtr = (char *) (nPtr); + if (!nPtr) return 0.0f; + + auto a = nPtr; + auto iter = nPtr; + auto val = 0.0f; + unsigned long long integerPart = 0; + int minus = 1; + + //ignore leading whitespaces + while (isspace(*iter)) iter++; + + //signed or not + if (*iter == '-') { + minus = -1; + iter++; + } else if (*iter == '+') { + iter++; + } + + if (tolower(*iter) == 'i') { + if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'f')) iter += 3; + else goto error; + + if (tolower(*(iter)) == 'i') { + if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'i') && (tolower(*(iter + 3)) == 't') && + (tolower(*(iter + 4)) == 'y')) + iter += 5; + else goto error; + } + if (endPtr) *endPtr = (char *) (iter); + return (minus == -1) ? -INFINITY : INFINITY; + } + + if (tolower(*iter) == 'n') { + if ((tolower(*(iter + 1)) == 'a') && (tolower(*(iter + 2)) == 'n')) iter += 3; + else goto error; + + if (endPtr) *endPtr = (char *) (iter); + return (minus == -1) ? -NAN : NAN; + } + + //Optional: integer part before dot + if (isdigit(*iter)) { + for (; isdigit(*iter); iter++) { + integerPart = integerPart * 10ULL + (unsigned long long) (*iter - '0'); + } + a = iter; + } else if (*iter != '.') { + goto success; + } + + val = static_cast(integerPart); + + //Optional: decimal part after dot + if (*iter == '.') { + unsigned long long decimalPart = 0; + unsigned long long pow10 = 1; + int count = 0; + + iter++; + + if (isdigit(*iter)) { + for (; isdigit(*iter); iter++, count++) { + if (count < 19) { + decimalPart = decimalPart * 10ULL + +static_cast(*iter - '0'); + pow10 *= 10ULL; + } + } + } else if (isspace(*iter)) { //skip if there is a space after the dot. + a = iter; + goto success; + } + + val += static_cast(decimalPart) / static_cast(pow10); + a = iter; + } + + //Optional: exponent + if (*iter == 'e' || *iter == 'E') { + ++iter; + + //Exception: svg may have 'em' unit for fonts. ex) 5em, 10.5em + if ((*iter == 'm') || (*iter == 'M')) { + //TODO: We don't support font em unit now, but has to multiply val * font size later... + a = iter + 1; + goto success; + } + + //signed or not + int minus_e = 1; + + if (*iter == '-') { + minus_e = -1; + ++iter; + } else if (*iter == '+') { + iter++; + } + + unsigned int exponentPart = 0; + + if (isdigit(*iter)) { + while (*iter == '0') iter++; + for (; isdigit(*iter); iter++) { + exponentPart = exponentPart * 10U + static_cast(*iter - '0'); + } + } else if (!isdigit(*(a - 1))) { + a = nPtr; + goto success; + } else if (*iter == 0) { + goto success; + } + + //if ((_floatExact(val, 2.2250738585072011f)) && ((minus_e * static_cast(exponentPart)) <= -308)) { + if ((_floatExact(val, 1.175494351f)) && ((minus_e * static_cast(exponentPart)) <= -38)) { + //val *= 1.0e-308f; + val *= 1.0e-38f; + a = iter; + goto success; + } + + a = iter; + auto scale = 1.0f; + + while (exponentPart >= 8U) { + scale *= (float)1E8; + exponentPart -= 8U; + } + while (exponentPart > 0U) { + scale *= 10.0f; + exponentPart--; + } + val = (minus_e == -1) ? (val / scale) : (val * scale); + } else if ((iter > nPtr) && !isdigit(*(iter - 1))) { + a = nPtr; + goto success; + } + +success: + if (endPtr) *endPtr = (char *)(a); + return minus * val; + +error: + if (endPtr) *endPtr = (char *)(nPtr); + return 0.0f; +} + + +int str2int(const char* str, size_t n) +{ + int ret = 0; + for(size_t i = 0; i < n; ++i) { + ret = ret * 10 + (str[i] - '0'); + } + return ret; +} + +char* strDuplicate(const char *str, size_t n) +{ + auto len = strlen(str); + if (len < n) n = len; + + auto ret = (char *) malloc(n + 1); + if (!ret) return nullptr; + ret[n] = '\0'; + + return (char *) memcpy(ret, str, n); +} + +char* strDirname(const char* path) +{ + const char *ptr = strrchr(path, '/'); +#ifdef _WIN32 + if (ptr) ptr = strrchr(ptr + 1, '\\'); +#endif + int len = int(ptr + 1 - path); // +1 to include '/' + return strDuplicate(path, len); +} + +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgStr.h b/libraries/lvgl/src/libs/thorvg/tvgStr.h new file mode 100644 index 0000000..eb664e2 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgStr.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_STR_H_ +#define _TVG_STR_H_ + +#include + +namespace tvg +{ + +float strToFloat(const char *nPtr, char **endPtr); //convert to float +int str2int(const char* str, size_t n); //convert to integer +char* strDuplicate(const char *str, size_t n); //copy the string +char* strDirname(const char* path); //return the full directory name + +} +#endif //_TVG_STR_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.cpp b/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.cpp new file mode 100644 index 0000000..89e45d4 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.cpp @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2022 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgSvgCssStyle.h" + +#include + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static bool _isImportanceApplicable(SvgStyleFlags &toFlagsImportance, SvgStyleFlags fromFlagsImportance, SvgStyleFlags flag) +{ + if (!(toFlagsImportance & flag) && (fromFlagsImportance & flag)) { + return true; + } + return false; +} + +static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) +{ + if (from == nullptr) return; + //Copy the properties of 'from' only if they were explicitly set (not the default ones). + if ((from->curColorSet && !(to->flags & SvgStyleFlags::Color)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Color)) { + to->color = from->color; + to->curColorSet = true; + to->flags = (to->flags | SvgStyleFlags::Color); + if (from->flagsImportance & SvgStyleFlags::Color) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Color); + } + } + //Fill + if (((from->fill.flags & SvgFillFlags::Paint) && !(to->flags & SvgStyleFlags::Fill)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Fill)) { + to->fill.paint.color = from->fill.paint.color; + to->fill.paint.none = from->fill.paint.none; + to->fill.paint.curColor = from->fill.paint.curColor; + if (from->fill.paint.url) { + if (to->fill.paint.url) free(to->fill.paint.url); + to->fill.paint.url = strdup(from->fill.paint.url); + } + to->fill.flags = (to->fill.flags | SvgFillFlags::Paint); + to->flags = (to->flags | SvgStyleFlags::Fill); + if (from->flagsImportance & SvgStyleFlags::Fill) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Fill); + } + } + if (((from->fill.flags & SvgFillFlags::Opacity) && !(to->flags & SvgStyleFlags::FillOpacity)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::FillOpacity)) { + to->fill.opacity = from->fill.opacity; + to->fill.flags = (to->fill.flags | SvgFillFlags::Opacity); + to->flags = (to->flags | SvgStyleFlags::FillOpacity); + if (from->flagsImportance & SvgStyleFlags::FillOpacity) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::FillOpacity); + } + } + if (((from->fill.flags & SvgFillFlags::FillRule) && !(to->flags & SvgStyleFlags::FillRule)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::FillRule)) { + to->fill.fillRule = from->fill.fillRule; + to->fill.flags = (to->fill.flags | SvgFillFlags::FillRule); + to->flags = (to->flags | SvgStyleFlags::FillRule); + if (from->flagsImportance & SvgStyleFlags::FillRule) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::FillRule); + } + } + //Stroke + if (((from->stroke.flags & SvgStrokeFlags::Paint) && !(to->flags & SvgStyleFlags::Stroke)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Stroke)) { + to->stroke.paint.color = from->stroke.paint.color; + to->stroke.paint.none = from->stroke.paint.none; + to->stroke.paint.curColor = from->stroke.paint.curColor; + if (from->stroke.paint.url) { + if (to->stroke.paint.url) free(to->stroke.paint.url); + to->stroke.paint.url = strdup(from->stroke.paint.url); + } + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Paint); + to->flags = (to->flags | SvgStyleFlags::Stroke); + if (from->flagsImportance & SvgStyleFlags::Stroke) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Stroke); + } + } + if (((from->stroke.flags & SvgStrokeFlags::Opacity) && !(to->flags & SvgStyleFlags::StrokeOpacity)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeOpacity)) { + to->stroke.opacity = from->stroke.opacity; + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Opacity); + to->flags = (to->flags | SvgStyleFlags::StrokeOpacity); + if (from->flagsImportance & SvgStyleFlags::StrokeOpacity) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeOpacity); + } + } + if (((from->stroke.flags & SvgStrokeFlags::Width) && !(to->flags & SvgStyleFlags::StrokeWidth)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeWidth)) { + to->stroke.width = from->stroke.width; + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Width); + to->flags = (to->flags | SvgStyleFlags::StrokeWidth); + if (from->flagsImportance & SvgStyleFlags::StrokeWidth) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeWidth); + } + } + if (((from->stroke.flags & SvgStrokeFlags::Dash) && !(to->flags & SvgStyleFlags::StrokeDashArray)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeDashArray)) { + if (from->stroke.dash.array.count > 0) { + to->stroke.dash.array.clear(); + to->stroke.dash.array.reserve(from->stroke.dash.array.count); + for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { + to->stroke.dash.array.push(from->stroke.dash.array[i]); + } + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Dash); + to->flags = (to->flags | SvgStyleFlags::StrokeDashArray); + if (from->flagsImportance & SvgStyleFlags::StrokeDashArray) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeDashArray); + } + } + } + if (((from->stroke.flags & SvgStrokeFlags::Cap) && !(to->flags & SvgStyleFlags::StrokeLineCap)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeLineCap)) { + to->stroke.cap = from->stroke.cap; + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Cap); + to->flags = (to->flags | SvgStyleFlags::StrokeLineCap); + if (from->flagsImportance & SvgStyleFlags::StrokeLineCap) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeLineCap); + } + } + if (((from->stroke.flags & SvgStrokeFlags::Join) && !(to->flags & SvgStyleFlags::StrokeLineJoin)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::StrokeLineJoin)) { + to->stroke.join = from->stroke.join; + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Join); + to->flags = (to->flags | SvgStyleFlags::StrokeLineJoin); + if (from->flagsImportance & SvgStyleFlags::StrokeLineJoin) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::StrokeLineJoin); + } + } + //Opacity + //TODO: it can be set to be 255 and shouldn't be changed by attribute 'opacity' + if ((from->opacity < 255 && !(to->flags & SvgStyleFlags::Opacity)) || + _isImportanceApplicable(to->flagsImportance, from->flagsImportance, SvgStyleFlags::Opacity)) { + to->opacity = from->opacity; + to->flags = (to->flags | SvgStyleFlags::Opacity); + if (from->flagsImportance & SvgStyleFlags::Opacity) { + to->flagsImportance = (to->flagsImportance | SvgStyleFlags::Opacity); + } + } +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +void cssCopyStyleAttr(SvgNode* to, const SvgNode* from) +{ + //Copy matrix attribute + if (from->transform && !(to->style->flags & SvgStyleFlags::Transform)) { + to->transform = (Matrix*)malloc(sizeof(Matrix)); + if (to->transform) { + *to->transform = *from->transform; + to->style->flags = (to->style->flags | SvgStyleFlags::Transform); + } + } + //Copy style attribute + _copyStyle(to->style, from->style); + + if (from->style->clipPath.url) { + if (to->style->clipPath.url) free(to->style->clipPath.url); + to->style->clipPath.url = strdup(from->style->clipPath.url); + } + if (from->style->mask.url) { + if (to->style->mask.url) free(to->style->mask.url); + to->style->mask.url = strdup(from->style->mask.url); + } +} + + +SvgNode* cssFindStyleNode(const SvgNode* style, const char* title, SvgNodeType type) +{ + if (!style) return nullptr; + + auto child = style->child.data; + for (uint32_t i = 0; i < style->child.count; ++i, ++child) { + if ((*child)->type == type) { + if ((!title && !(*child)->id) || (title && (*child)->id && !strcmp((*child)->id, title))) return (*child); + } + } + return nullptr; +} + + +SvgNode* cssFindStyleNode(const SvgNode* style, const char* title) +{ + if (!style || !title) return nullptr; + + auto child = style->child.data; + for (uint32_t i = 0; i < style->child.count; ++i, ++child) { + if ((*child)->type == SvgNodeType::CssStyle) { + if ((*child)->id && !strcmp((*child)->id, title)) return (*child); + } + } + return nullptr; +} + + +void cssUpdateStyle(SvgNode* doc, SvgNode* style) +{ + if (doc->child.count > 0) { + auto child = doc->child.data; + for (uint32_t i = 0; i < doc->child.count; ++i, ++child) { + if (auto cssNode = cssFindStyleNode(style, nullptr, (*child)->type)) { + cssCopyStyleAttr(*child, cssNode); + } + cssUpdateStyle(*child, style); + } + } +} + + +void cssApplyStyleToPostponeds(Array& postponeds, SvgNode* style) +{ + for (uint32_t i = 0; i < postponeds.count; ++i) { + auto nodeIdPair = postponeds[i]; + + //css styling: tag.name has higher priority than .name + if (auto cssNode = cssFindStyleNode(style, nodeIdPair.id, nodeIdPair.node->type)) { + cssCopyStyleAttr(nodeIdPair.node, cssNode); + } + if (auto cssNode = cssFindStyleNode(style, nodeIdPair.id)) { + cssCopyStyleAttr(nodeIdPair.node, cssNode); + } + } +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.h b/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.h new file mode 100644 index 0000000..d718ede --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgCssStyle.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_CSS_STYLE_H_ +#define _TVG_SVG_CSS_STYLE_H_ + +#include "tvgSvgLoaderCommon.h" + +void cssCopyStyleAttr(SvgNode* to, const SvgNode* from); +SvgNode* cssFindStyleNode(const SvgNode* style, const char* title, SvgNodeType type); +SvgNode* cssFindStyleNode(const SvgNode* style, const char* title); +void cssUpdateStyle(SvgNode* doc, SvgNode* style); +void cssApplyStyleToPostponeds(Array& postponeds, SvgNode* style); + +#endif //_TVG_SVG_CSS_STYLE_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.cpp b/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.cpp new file mode 100644 index 0000000..efca812 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.cpp @@ -0,0 +1,3759 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +/* + * Copyright notice for the EFL: + + * Copyright (C) EFL developers (see AUTHORS) + + * All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "tvgLoader.h" +#include "tvgXmlParser.h" +#include "tvgSvgLoader.h" +#include "tvgSvgSceneBuilder.h" +#include "tvgStr.h" +#include "tvgSvgCssStyle.h" +#include "tvgMath.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +/* + * According to: https://www.w3.org/TR/SVG2/coords.html#Units + * and: https://www.w3.org/TR/css-values-4/#absolute-lengths + */ +#define PX_PER_IN 96 //1 in = 96 px +#define PX_PER_PC 16 //1 pc = 1/6 in -> PX_PER_IN/6 +#define PX_PER_PT 1.333333f //1 pt = 1/72 in -> PX_PER_IN/72 +#define PX_PER_MM 3.779528f //1 in = 25.4 mm -> PX_PER_IN/25.4 +#define PX_PER_CM 37.79528f //1 in = 2.54 cm -> PX_PER_IN/2.54 + +typedef bool (*parseAttributes)(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data); +typedef SvgNode* (*FactoryMethod)(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func); +typedef SvgStyleGradient* (*GradientFactoryMethod)(SvgLoaderData* loader, const char* buf, unsigned bufLength); + +static char* _skipSpace(const char* str, const char* end) +{ + while (((end && str < end) || (!end && *str != '\0')) && isspace(*str)) { + ++str; + } + return (char*) str; +} + + +static char* _copyId(const char* str) +{ + if (!str) return nullptr; + + return strdup(str); +} + + +static const char* _skipComma(const char* content) +{ + content = _skipSpace(content, nullptr); + if (*content == ',') return content + 1; + return content; +} + + +static bool _parseNumber(const char** content, float* number) +{ + char* end = nullptr; + + *number = strToFloat(*content, &end); + //If the start of string is not number + if ((*content) == end) return false; + //Skip comma if any + *content = _skipComma(end); + + return true; +} + + +static constexpr struct +{ + AspectRatioAlign align; + const char* tag; +} alignTags[] = { + { AspectRatioAlign::XMinYMin, "xMinYMin" }, + { AspectRatioAlign::XMidYMin, "xMidYMin" }, + { AspectRatioAlign::XMaxYMin, "xMaxYMin" }, + { AspectRatioAlign::XMinYMid, "xMinYMid" }, + { AspectRatioAlign::XMidYMid, "xMidYMid" }, + { AspectRatioAlign::XMaxYMid, "xMaxYMid" }, + { AspectRatioAlign::XMinYMax, "xMinYMax" }, + { AspectRatioAlign::XMidYMax, "xMidYMax" }, + { AspectRatioAlign::XMaxYMax, "xMaxYMax" }, +}; + + +static void _parseAspectRatio(const char** content, AspectRatioAlign* align, AspectRatioMeetOrSlice* meetOrSlice) +{ + if (!strcmp(*content, "none")) { + *align = AspectRatioAlign::None; + return; + } + + for (unsigned int i = 0; i < sizeof(alignTags) / sizeof(alignTags[0]); i++) { + if (!strncmp(*content, alignTags[i].tag, 8)) { + *align = alignTags[i].align; + *content += 8; + *content = _skipSpace(*content, nullptr); + break; + } + } + + if (!strcmp(*content, "meet")) { + *meetOrSlice = AspectRatioMeetOrSlice::Meet; + } else if (!strcmp(*content, "slice")) { + *meetOrSlice = AspectRatioMeetOrSlice::Slice; + } +} + + +/** + * According to https://www.w3.org/TR/SVG/coords.html#Units + */ +static float _toFloat(const SvgParser* svgParse, const char* str, SvgParserLengthType type) +{ + float parsedValue = strToFloat(str, nullptr); + + if (strstr(str, "cm")) parsedValue *= PX_PER_CM; + else if (strstr(str, "mm")) parsedValue *= PX_PER_MM; + else if (strstr(str, "pt")) parsedValue *= PX_PER_PT; + else if (strstr(str, "pc")) parsedValue *= PX_PER_PC; + else if (strstr(str, "in")) parsedValue *= PX_PER_IN; + else if (strstr(str, "%")) { + if (type == SvgParserLengthType::Vertical) parsedValue = (parsedValue / 100.0f) * svgParse->global.h; + else if (type == SvgParserLengthType::Horizontal) parsedValue = (parsedValue / 100.0f) * svgParse->global.w; + else //if other then it's radius + { + float max = svgParse->global.w; + if (max < svgParse->global.h) + max = svgParse->global.h; + parsedValue = (parsedValue / 100.0f) * max; + } + } + //TODO: Implement 'em', 'ex' attributes + + return parsedValue; +} + + +static float _gradientToFloat(const SvgParser* svgParse, const char* str, bool& isPercentage) +{ + char* end = nullptr; + + float parsedValue = strToFloat(str, &end); + isPercentage = false; + + if (strstr(str, "%")) { + parsedValue = parsedValue / 100.0f; + isPercentage = true; + } + else if (strstr(str, "cm")) parsedValue *= PX_PER_CM; + else if (strstr(str, "mm")) parsedValue *= PX_PER_MM; + else if (strstr(str, "pt")) parsedValue *= PX_PER_PT; + else if (strstr(str, "pc")) parsedValue *= PX_PER_PC; + else if (strstr(str, "in")) parsedValue *= PX_PER_IN; + //TODO: Implement 'em', 'ex' attributes + + return parsedValue; +} + + +static float _toOffset(const char* str) +{ + char* end = nullptr; + auto strEnd = str + strlen(str); + + float parsedValue = strToFloat(str, &end); + + end = _skipSpace(end, nullptr); + auto ptr = strstr(str, "%"); + + if (ptr) { + parsedValue = parsedValue / 100.0f; + if (end != ptr || (end + 1) != strEnd) return 0; + } else if (end != strEnd) return 0; + + return parsedValue; +} + + +static int _toOpacity(const char* str) +{ + char* end = nullptr; + float opacity = strToFloat(str, &end); + + if (end) { + if (end[0] == '%' && end[1] == '\0') return lrint(opacity * 2.55f); + else if (*end == '\0') return lrint(opacity * 255); + } + return 255; +} + + +static SvgMaskType _toMaskType(const char* str) +{ + if (!strcmp(str, "Alpha")) return SvgMaskType::Alpha; + + return SvgMaskType::Luminance; +} + + +//The default rendering order: fill, stroke, markers +//If any is omitted, will be rendered in its default order after the specified ones. +static bool _toPaintOrder(const char* str) +{ + uint8_t position = 1; + uint8_t strokePosition = 0; + uint8_t fillPosition = 0; + + while (*str != '\0') { + str = _skipSpace(str, nullptr); + if (!strncmp(str, "fill", 4)) { + fillPosition = position++; + str += 4; + } else if (!strncmp(str, "stroke", 6)) { + strokePosition = position++; + str += 6; + } else if (!strncmp(str, "markers", 7)) { + str += 7; + } else { + return _toPaintOrder("fill stroke"); + } + } + + if (fillPosition == 0) fillPosition = position++; + if (strokePosition == 0) strokePosition = position++; + + return fillPosition < strokePosition; +} + + +#define _PARSE_TAG(Type, Name, Name1, Tags_Array, Default) \ + static Type _to##Name1(const char* str) \ + { \ + unsigned int i; \ + \ + for (i = 0; i < sizeof(Tags_Array) / sizeof(Tags_Array[0]); i++) { \ + if (!strcmp(str, Tags_Array[i].tag)) return Tags_Array[i].Name; \ + } \ + return Default; \ + } + + +/* parse the line cap used during stroking a path. + * Value: butt | round | square | inherit + * Initial: butt + * https://www.w3.org/TR/SVG/painting.html + */ +static constexpr struct +{ + StrokeCap lineCap; + const char* tag; +} lineCapTags[] = { + { StrokeCap::Butt, "butt" }, + { StrokeCap::Round, "round" }, + { StrokeCap::Square, "square" } +}; + + +_PARSE_TAG(StrokeCap, lineCap, LineCap, lineCapTags, StrokeCap::Butt) + + +/* parse the line join used during stroking a path. + * Value: miter | round | bevel | inherit + * Initial: miter + * https://www.w3.org/TR/SVG/painting.html + */ +static constexpr struct +{ + StrokeJoin lineJoin; + const char* tag; +} lineJoinTags[] = { + { StrokeJoin::Miter, "miter" }, + { StrokeJoin::Round, "round" }, + { StrokeJoin::Bevel, "bevel" } +}; + + +_PARSE_TAG(StrokeJoin, lineJoin, LineJoin, lineJoinTags, StrokeJoin::Miter) + + +/* parse the fill rule used during filling a path. + * Value: nonzero | evenodd | inherit + * Initial: nonzero + * https://www.w3.org/TR/SVG/painting.html + */ +static constexpr struct +{ + FillRule fillRule; + const char* tag; +} fillRuleTags[] = { + { FillRule::EvenOdd, "evenodd" } +}; + + +_PARSE_TAG(FillRule, fillRule, FillRule, fillRuleTags, FillRule::Winding) + + +/* parse the dash pattern used during stroking a path. + * Value: none | | inherit + * Initial: none + * https://www.w3.org/TR/SVG/painting.html + */ +static void _parseDashArray(SvgLoaderData* loader, const char *str, SvgDash* dash) +{ + if (!strncmp(str, "none", 4)) return; + + char *end = nullptr; + + while (*str) { + str = _skipComma(str); + float parsedValue = strToFloat(str, &end); + if (str == end) break; + if (parsedValue <= 0.0f) break; + if (*end == '%') { + ++end; + //Refers to the diagonal length of the viewport. + //https://www.w3.org/TR/SVG2/coords.html#Units + parsedValue = (sqrtf(powf(loader->svgParse->global.w, 2) + powf(loader->svgParse->global.h, 2)) / sqrtf(2.0f)) * (parsedValue / 100.0f); + } + (*dash).array.push(parsedValue); + str = end; + } + //If dash array size is 1, it means that dash and gap size are the same. + if ((*dash).array.count == 1) (*dash).array.push((*dash).array[0]); +} + + +static char* _idFromUrl(const char* url) +{ + url = _skipSpace(url, nullptr); + if ((*url) == '(') { + ++url; + url = _skipSpace(url, nullptr); + } + + if ((*url) == '\'') ++url; + if ((*url) == '#') ++url; + + int i = 0; + while (url[i] > ' ' && url[i] != ')' && url[i] != '\'') ++i; + + return strDuplicate(url, i); +} + + +static unsigned char _parseColor(const char* value, char** end) +{ + float r; + + r = strToFloat(value, end); + *end = _skipSpace(*end, nullptr); + if (**end == '%') { + r = 255 * r / 100; + (*end)++; + } + *end = _skipSpace(*end, nullptr); + + if (r < 0 || r > 255) { + *end = nullptr; + return 0; + } + + return lrint(r); +} + + +static constexpr struct +{ + const char* name; + unsigned int value; +} colors[] = { + { "aliceblue", 0xfff0f8ff }, + { "antiquewhite", 0xfffaebd7 }, + { "aqua", 0xff00ffff }, + { "aquamarine", 0xff7fffd4 }, + { "azure", 0xfff0ffff }, + { "beige", 0xfff5f5dc }, + { "bisque", 0xffffe4c4 }, + { "black", 0xff000000 }, + { "blanchedalmond", 0xffffebcd }, + { "blue", 0xff0000ff }, + { "blueviolet", 0xff8a2be2 }, + { "brown", 0xffa52a2a }, + { "burlywood", 0xffdeb887 }, + { "cadetblue", 0xff5f9ea0 }, + { "chartreuse", 0xff7fff00 }, + { "chocolate", 0xffd2691e }, + { "coral", 0xffff7f50 }, + { "cornflowerblue", 0xff6495ed }, + { "cornsilk", 0xfffff8dc }, + { "crimson", 0xffdc143c }, + { "cyan", 0xff00ffff }, + { "darkblue", 0xff00008b }, + { "darkcyan", 0xff008b8b }, + { "darkgoldenrod", 0xffb8860b }, + { "darkgray", 0xffa9a9a9 }, + { "darkgrey", 0xffa9a9a9 }, + { "darkgreen", 0xff006400 }, + { "darkkhaki", 0xffbdb76b }, + { "darkmagenta", 0xff8b008b }, + { "darkolivegreen", 0xff556b2f }, + { "darkorange", 0xffff8c00 }, + { "darkorchid", 0xff9932cc }, + { "darkred", 0xff8b0000 }, + { "darksalmon", 0xffe9967a }, + { "darkseagreen", 0xff8fbc8f }, + { "darkslateblue", 0xff483d8b }, + { "darkslategray", 0xff2f4f4f }, + { "darkslategrey", 0xff2f4f4f }, + { "darkturquoise", 0xff00ced1 }, + { "darkviolet", 0xff9400d3 }, + { "deeppink", 0xffff1493 }, + { "deepskyblue", 0xff00bfff }, + { "dimgray", 0xff696969 }, + { "dimgrey", 0xff696969 }, + { "dodgerblue", 0xff1e90ff }, + { "firebrick", 0xffb22222 }, + { "floralwhite", 0xfffffaf0 }, + { "forestgreen", 0xff228b22 }, + { "fuchsia", 0xffff00ff }, + { "gainsboro", 0xffdcdcdc }, + { "ghostwhite", 0xfff8f8ff }, + { "gold", 0xffffd700 }, + { "goldenrod", 0xffdaa520 }, + { "gray", 0xff808080 }, + { "grey", 0xff808080 }, + { "green", 0xff008000 }, + { "greenyellow", 0xffadff2f }, + { "honeydew", 0xfff0fff0 }, + { "hotpink", 0xffff69b4 }, + { "indianred", 0xffcd5c5c }, + { "indigo", 0xff4b0082 }, + { "ivory", 0xfffffff0 }, + { "khaki", 0xfff0e68c }, + { "lavender", 0xffe6e6fa }, + { "lavenderblush", 0xfffff0f5 }, + { "lawngreen", 0xff7cfc00 }, + { "lemonchiffon", 0xfffffacd }, + { "lightblue", 0xffadd8e6 }, + { "lightcoral", 0xfff08080 }, + { "lightcyan", 0xffe0ffff }, + { "lightgoldenrodyellow", 0xfffafad2 }, + { "lightgray", 0xffd3d3d3 }, + { "lightgrey", 0xffd3d3d3 }, + { "lightgreen", 0xff90ee90 }, + { "lightpink", 0xffffb6c1 }, + { "lightsalmon", 0xffffa07a }, + { "lightseagreen", 0xff20b2aa }, + { "lightskyblue", 0xff87cefa }, + { "lightslategray", 0xff778899 }, + { "lightslategrey", 0xff778899 }, + { "lightsteelblue", 0xffb0c4de }, + { "lightyellow", 0xffffffe0 }, + { "lime", 0xff00ff00 }, + { "limegreen", 0xff32cd32 }, + { "linen", 0xfffaf0e6 }, + { "magenta", 0xffff00ff }, + { "maroon", 0xff800000 }, + { "mediumaquamarine", 0xff66cdaa }, + { "mediumblue", 0xff0000cd }, + { "mediumorchid", 0xffba55d3 }, + { "mediumpurple", 0xff9370d8 }, + { "mediumseagreen", 0xff3cb371 }, + { "mediumslateblue", 0xff7b68ee }, + { "mediumspringgreen", 0xff00fa9a }, + { "mediumturquoise", 0xff48d1cc }, + { "mediumvioletred", 0xffc71585 }, + { "midnightblue", 0xff191970 }, + { "mintcream", 0xfff5fffa }, + { "mistyrose", 0xffffe4e1 }, + { "moccasin", 0xffffe4b5 }, + { "navajowhite", 0xffffdead }, + { "navy", 0xff000080 }, + { "oldlace", 0xfffdf5e6 }, + { "olive", 0xff808000 }, + { "olivedrab", 0xff6b8e23 }, + { "orange", 0xffffa500 }, + { "orangered", 0xffff4500 }, + { "orchid", 0xffda70d6 }, + { "palegoldenrod", 0xffeee8aa }, + { "palegreen", 0xff98fb98 }, + { "paleturquoise", 0xffafeeee }, + { "palevioletred", 0xffd87093 }, + { "papayawhip", 0xffffefd5 }, + { "peachpuff", 0xffffdab9 }, + { "peru", 0xffcd853f }, + { "pink", 0xffffc0cb }, + { "plum", 0xffdda0dd }, + { "powderblue", 0xffb0e0e6 }, + { "purple", 0xff800080 }, + { "red", 0xffff0000 }, + { "rosybrown", 0xffbc8f8f }, + { "royalblue", 0xff4169e1 }, + { "saddlebrown", 0xff8b4513 }, + { "salmon", 0xfffa8072 }, + { "sandybrown", 0xfff4a460 }, + { "seagreen", 0xff2e8b57 }, + { "seashell", 0xfffff5ee }, + { "sienna", 0xffa0522d }, + { "silver", 0xffc0c0c0 }, + { "skyblue", 0xff87ceeb }, + { "slateblue", 0xff6a5acd }, + { "slategray", 0xff708090 }, + { "slategrey", 0xff708090 }, + { "snow", 0xfffffafa }, + { "springgreen", 0xff00ff7f }, + { "steelblue", 0xff4682b4 }, + { "tan", 0xffd2b48c }, + { "teal", 0xff008080 }, + { "thistle", 0xffd8bfd8 }, + { "tomato", 0xffff6347 }, + { "turquoise", 0xff40e0d0 }, + { "violet", 0xffee82ee }, + { "wheat", 0xfff5deb3 }, + { "white", 0xffffffff }, + { "whitesmoke", 0xfff5f5f5 }, + { "yellow", 0xffffff00 }, + { "yellowgreen", 0xff9acd32 } +}; + + +static void _toColor(const char* str, uint8_t* r, uint8_t* g, uint8_t* b, char** ref) +{ + unsigned int len = strlen(str); + char *red, *green, *blue; + unsigned char tr, tg, tb; + + if (len == 4 && str[0] == '#') { + //Case for "#456" should be interprete as "#445566" + if (isxdigit(str[1]) && isxdigit(str[2]) && isxdigit(str[3])) { + char tmp[3] = { '\0', '\0', '\0' }; + tmp[0] = str[1]; + tmp[1] = str[1]; + *r = strtol(tmp, nullptr, 16); + tmp[0] = str[2]; + tmp[1] = str[2]; + *g = strtol(tmp, nullptr, 16); + tmp[0] = str[3]; + tmp[1] = str[3]; + *b = strtol(tmp, nullptr, 16); + } + } else if (len == 7 && str[0] == '#') { + if (isxdigit(str[1]) && isxdigit(str[2]) && isxdigit(str[3]) && isxdigit(str[4]) && isxdigit(str[5]) && isxdigit(str[6])) { + char tmp[3] = { '\0', '\0', '\0' }; + tmp[0] = str[1]; + tmp[1] = str[2]; + *r = strtol(tmp, nullptr, 16); + tmp[0] = str[3]; + tmp[1] = str[4]; + *g = strtol(tmp, nullptr, 16); + tmp[0] = str[5]; + tmp[1] = str[6]; + *b = strtol(tmp, nullptr, 16); + } + } else if (len >= 10 && (str[0] == 'r' || str[0] == 'R') && (str[1] == 'g' || str[1] == 'G') && (str[2] == 'b' || str[2] == 'B') && str[3] == '(' && str[len - 1] == ')') { + tr = _parseColor(str + 4, &red); + if (red && *red == ',') { + tg = _parseColor(red + 1, &green); + if (green && *green == ',') { + tb = _parseColor(green + 1, &blue); + if (blue && blue[0] == ')' && blue[1] == '\0') { + *r = tr; + *g = tg; + *b = tb; + } + } + } + } else if (ref && len >= 3 && !strncmp(str, "url", 3)) { + if (*ref) free(*ref); + *ref = _idFromUrl((const char*)(str + 3)); + } else { + //Handle named color + for (unsigned int i = 0; i < (sizeof(colors) / sizeof(colors[0])); i++) { + if (!strcasecmp(colors[i].name, str)) { + *r = (((uint8_t*)(&(colors[i].value)))[2]); + *g = (((uint8_t*)(&(colors[i].value)))[1]); + *b = (((uint8_t*)(&(colors[i].value)))[0]); + return; + } + } + } +} + + +static char* _parseNumbersArray(char* str, float* points, int* ptCount, int len) +{ + int count = 0; + char* end = nullptr; + + str = _skipSpace(str, nullptr); + while ((count < len) && (isdigit(*str) || *str == '-' || *str == '+' || *str == '.')) { + points[count++] = strToFloat(str, &end); + str = end; + str = _skipSpace(str, nullptr); + if (*str == ',') ++str; + //Eat the rest of space + str = _skipSpace(str, nullptr); + } + *ptCount = count; + return str; +} + + +enum class MatrixState { + Unknown, + Matrix, + Translate, + Rotate, + Scale, + SkewX, + SkewY +}; + + +#define MATRIX_DEF(Name, Value) \ + { \ +#Name, sizeof(#Name), Value \ + } + + +static constexpr struct +{ + const char* tag; + int sz; + MatrixState state; +} matrixTags[] = { + MATRIX_DEF(matrix, MatrixState::Matrix), + MATRIX_DEF(translate, MatrixState::Translate), + MATRIX_DEF(rotate, MatrixState::Rotate), + MATRIX_DEF(scale, MatrixState::Scale), + MATRIX_DEF(skewX, MatrixState::SkewX), + MATRIX_DEF(skewY, MatrixState::SkewY) +}; + + +static void _matrixCompose(const Matrix* m1, const Matrix* m2, Matrix* dst) +{ + auto a11 = (m1->e11 * m2->e11) + (m1->e12 * m2->e21) + (m1->e13 * m2->e31); + auto a12 = (m1->e11 * m2->e12) + (m1->e12 * m2->e22) + (m1->e13 * m2->e32); + auto a13 = (m1->e11 * m2->e13) + (m1->e12 * m2->e23) + (m1->e13 * m2->e33); + + auto a21 = (m1->e21 * m2->e11) + (m1->e22 * m2->e21) + (m1->e23 * m2->e31); + auto a22 = (m1->e21 * m2->e12) + (m1->e22 * m2->e22) + (m1->e23 * m2->e32); + auto a23 = (m1->e21 * m2->e13) + (m1->e22 * m2->e23) + (m1->e23 * m2->e33); + + auto a31 = (m1->e31 * m2->e11) + (m1->e32 * m2->e21) + (m1->e33 * m2->e31); + auto a32 = (m1->e31 * m2->e12) + (m1->e32 * m2->e22) + (m1->e33 * m2->e32); + auto a33 = (m1->e31 * m2->e13) + (m1->e32 * m2->e23) + (m1->e33 * m2->e33); + + dst->e11 = a11; + dst->e12 = a12; + dst->e13 = a13; + dst->e21 = a21; + dst->e22 = a22; + dst->e23 = a23; + dst->e31 = a31; + dst->e32 = a32; + dst->e33 = a33; +} + + +/* parse transform attribute + * https://www.w3.org/TR/SVG/coords.html#TransformAttribute + */ +static Matrix* _parseTransformationMatrix(const char* value) +{ + const int POINT_CNT = 8; + + auto matrix = (Matrix*)malloc(sizeof(Matrix)); + if (!matrix) return nullptr; + *matrix = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + + float points[POINT_CNT]; + int ptCount = 0; + char* str = (char*)value; + char* end = str + strlen(str); + + while (str < end) { + auto state = MatrixState::Unknown; + + if (isspace(*str) || (*str == ',')) { + ++str; + continue; + } + for (unsigned int i = 0; i < sizeof(matrixTags) / sizeof(matrixTags[0]); i++) { + if (!strncmp(matrixTags[i].tag, str, matrixTags[i].sz - 1)) { + state = matrixTags[i].state; + str += (matrixTags[i].sz - 1); + break; + } + } + if (state == MatrixState::Unknown) goto error; + + str = _skipSpace(str, end); + if (*str != '(') goto error; + ++str; + str = _parseNumbersArray(str, points, &ptCount, POINT_CNT); + if (*str != ')') goto error; + ++str; + + if (state == MatrixState::Matrix) { + if (ptCount != 6) goto error; + Matrix tmp = {points[0], points[2], points[4], points[1], points[3], points[5], 0, 0, 1}; + _matrixCompose(matrix, &tmp, matrix); + } else if (state == MatrixState::Translate) { + if (ptCount == 1) { + Matrix tmp = {1, 0, points[0], 0, 1, 0, 0, 0, 1}; + _matrixCompose(matrix, &tmp, matrix); + } else if (ptCount == 2) { + Matrix tmp = {1, 0, points[0], 0, 1, points[1], 0, 0, 1}; + _matrixCompose(matrix, &tmp, matrix); + } else goto error; + } else if (state == MatrixState::Rotate) { + //Transform to signed. + points[0] = fmod(points[0], (float)360); + if (points[0] < 0) points[0] += 360; + auto c = cosf(points[0] * (float)(M_PI / 180.0)); + auto s = sinf(points[0] * (float)(M_PI / 180.0)); + if (ptCount == 1) { + Matrix tmp = { c, -s, 0, s, c, 0, 0, 0, 1 }; + _matrixCompose(matrix, &tmp, matrix); + } else if (ptCount == 3) { + Matrix tmp = { 1, 0, points[1], 0, 1, points[2], 0, 0, 1 }; + _matrixCompose(matrix, &tmp, matrix); + tmp = { c, -s, 0, s, c, 0, 0, 0, 1 }; + _matrixCompose(matrix, &tmp, matrix); + tmp = { 1, 0, -points[1], 0, 1, -points[2], 0, 0, 1 }; + _matrixCompose(matrix, &tmp, matrix); + } else { + goto error; + } + } else if (state == MatrixState::Scale) { + if (ptCount < 1 || ptCount > 2) goto error; + auto sx = points[0]; + auto sy = sx; + if (ptCount == 2) sy = (float)points[1]; + Matrix tmp = { sx, 0, 0, 0, sy, 0, 0, 0, 1 }; + _matrixCompose(matrix, &tmp, matrix); + } + } + return matrix; +error: + if (matrix) free(matrix); + return nullptr; +} + + +#define LENGTH_DEF(Name, Value) \ + { \ +#Name, sizeof(#Name), Value \ + } + + +static void _postpone(Array& nodes, SvgNode *node, char* id) +{ + nodes.push({node, id}); +} + + +/* +// TODO - remove? +static constexpr struct +{ + const char* tag; + int sz; + SvgLengthType type; +} lengthTags[] = { + LENGTH_DEF(%, SvgLengthType::Percent), + LENGTH_DEF(px, SvgLengthType::Px), + LENGTH_DEF(pc, SvgLengthType::Pc), + LENGTH_DEF(pt, SvgLengthType::Pt), + LENGTH_DEF(mm, SvgLengthType::Mm), + LENGTH_DEF(cm, SvgLengthType::Cm), + LENGTH_DEF(in, SvgLengthType::In) +}; + +static float _parseLength(const char* str, SvgLengthType* type) +{ + float value; + int sz = strlen(str); + + *type = SvgLengthType::Px; + for (unsigned int i = 0; i < sizeof(lengthTags) / sizeof(lengthTags[0]); i++) { + if (lengthTags[i].sz - 1 == sz && !strncmp(lengthTags[i].tag, str, sz)) *type = lengthTags[i].type; + } + value = svgUtilStrtof(str, nullptr); + return value; +} +*/ + +static bool _parseStyleAttr(void* data, const char* key, const char* value); +static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style); + + +static bool _attrParseSvgNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgDocNode* doc = &(node->node.doc); + + if (!strcmp(key, "width")) { + doc->w = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); + if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::WidthInPercent); + } else { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Width); + } + } else if (!strcmp(key, "height")) { + doc->h = _toFloat(loader->svgParse, value, SvgParserLengthType::Vertical); + if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::HeightInPercent); + } else { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Height); + } + } else if (!strcmp(key, "viewBox")) { + if (_parseNumber(&value, &doc->vx)) { + if (_parseNumber(&value, &doc->vy)) { + if (_parseNumber(&value, &doc->vw)) { + if (_parseNumber(&value, &doc->vh)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Viewbox); + loader->svgParse->global.h = doc->vh; + } + loader->svgParse->global.w = doc->vw; + } + loader->svgParse->global.y = doc->vy; + } + loader->svgParse->global.x = doc->vx; + } + if ((doc->viewFlag & SvgViewFlag::Viewbox) && (doc->vw < 0.0f || doc->vh < 0.0f)) { + doc->viewFlag = (SvgViewFlag)((uint32_t)doc->viewFlag & ~(uint32_t)SvgViewFlag::Viewbox); + TVGLOG("SVG", "Negative values of the width and/or height - the attribute invalidated."); + } + if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { + loader->svgParse->global.x = loader->svgParse->global.y = 0.0f; + loader->svgParse->global.w = loader->svgParse->global.h = 1.0f; + } + } else if (!strcmp(key, "preserveAspectRatio")) { + _parseAspectRatio(&value, &doc->align, &doc->meetOrSlice); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); +#ifdef THORVG_LOG_ENABLED + } else if ((!strcmp(key, "x") || !strcmp(key, "y")) && fabsf(strToFloat(value, nullptr)) > FLT_EPSILON) { + TVGLOG("SVG", "Unsupported attributes used [Elements type: Svg][Attribute: %s][Value: %s]", key, value); +#endif + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +//https://www.w3.org/TR/SVGTiny12/painting.html#SpecifyingPaint +static void _handlePaintAttr(SvgPaint* paint, const char* value) +{ + if (!strcmp(value, "none")) { + //No paint property + paint->none = true; + return; + } + paint->none = false; + if (!strcmp(value, "currentColor")) { + paint->curColor = true; + return; + } + _toColor(value, &paint->color.r, &paint->color.g, &paint->color.b, &paint->url); +} + + +static void _handleColorAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + SvgStyleProperty* style = node->style; + style->curColorSet = true; + _toColor(value, &style->color.r, &style->color.g, &style->color.b, nullptr); +} + + +static void _handleFillAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + SvgStyleProperty* style = node->style; + style->fill.flags = (style->fill.flags | SvgFillFlags::Paint); + _handlePaintAttr(&style->fill.paint, value); +} + + +static void _handleStrokeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + SvgStyleProperty* style = node->style; + style->stroke.flags = (style->stroke.flags | SvgStrokeFlags::Paint); + _handlePaintAttr(&style->stroke.paint, value); +} + + +static void _handleStrokeOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Opacity); + node->style->stroke.opacity = _toOpacity(value); +} + +static void _handleStrokeDashArrayAttr(SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Dash); + _parseDashArray(loader, value, &node->style->stroke.dash); +} + +static void _handleStrokeDashOffsetAttr(SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::DashOffset); + node->style->stroke.dash.offset = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); +} + +static void _handleStrokeWidthAttr(SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Width); + node->style->stroke.width = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); +} + + +static void _handleStrokeLineCapAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Cap); + node->style->stroke.cap = _toLineCap(value); +} + + +static void _handleStrokeLineJoinAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Join); + node->style->stroke.join = _toLineJoin(value); +} + +static void _handleStrokeMiterlimitAttr(SvgLoaderData* loader, SvgNode* node, const char* value) +{ + char* end = nullptr; + const float miterlimit = strToFloat(value, &end); + + // https://www.w3.org/TR/SVG2/painting.html#LineJoin + // - A negative value for stroke-miterlimit must be treated as an illegal value. + if (miterlimit < 0.0f) { + TVGERR("SVG", "A stroke-miterlimit change (%f <- %f) with a negative value is omitted.", + node->style->stroke.miterlimit, miterlimit); + return; + } + + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Miterlimit); + node->style->stroke.miterlimit = miterlimit; +} + +static void _handleFillRuleAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::FillRule); + node->style->fill.fillRule = _toFillRule(value); +} + + +static void _handleOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->opacity = _toOpacity(value); +} + + +static void _handleFillOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::Opacity); + node->style->fill.opacity = _toOpacity(value); +} + + +static void _handleTransformAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->transform = _parseTransformationMatrix(value); +} + + +static void _handleClipPathAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + SvgStyleProperty* style = node->style; + int len = strlen(value); + if (len >= 3 && !strncmp(value, "url", 3)) { + if (style->clipPath.url) free(style->clipPath.url); + style->clipPath.url = _idFromUrl((const char*)(value + 3)); + } +} + + +static void _handleMaskAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + SvgStyleProperty* style = node->style; + int len = strlen(value); + if (len >= 3 && !strncmp(value, "url", 3)) { + if (style->mask.url) free(style->mask.url); + style->mask.url = _idFromUrl((const char*)(value + 3)); + } +} + + +static void _handleMaskTypeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->node.mask.type = _toMaskType(value); +} + + +static void _handleDisplayAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + //TODO : The display attribute can have various values as well as "none". + // The default is "inline" which means visible and "none" means invisible. + // Depending on the type of node, additional functionality may be required. + // refer to https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/display + if (!strcmp(value, "none")) node->display = false; + else node->display = true; +} + + +static void _handlePaintOrderAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->flags = (node->style->flags | SvgStyleFlags::PaintOrder); + node->style->paintOrder = _toPaintOrder(value); +} + + +static void _handleCssClassAttr(SvgLoaderData* loader, SvgNode* node, const char* value) +{ + auto cssClass = &node->style->cssClass; + + if (*cssClass && value) free(*cssClass); + *cssClass = _copyId(value); + + bool cssClassFound = false; + + //css styling: tag.name has higher priority than .name + if (auto cssNode = cssFindStyleNode(loader->cssStyle, *cssClass, node->type)) { + cssClassFound = true; + cssCopyStyleAttr(node, cssNode); + } + if (auto cssNode = cssFindStyleNode(loader->cssStyle, *cssClass)) { + cssClassFound = true; + cssCopyStyleAttr(node, cssNode); + } + + if (!cssClassFound) _postpone(loader->nodesToStyle, node, *cssClass); +} + + +typedef void (*styleMethod)(SvgLoaderData* loader, SvgNode* node, const char* value); + +#define STYLE_DEF(Name, Name1, Flag) { #Name, sizeof(#Name), _handle##Name1##Attr, Flag } + + +static constexpr struct +{ + const char* tag; + int sz; + styleMethod tagHandler; + SvgStyleFlags flag; +} styleTags[] = { + STYLE_DEF(color, Color, SvgStyleFlags::Color), + STYLE_DEF(fill, Fill, SvgStyleFlags::Fill), + STYLE_DEF(fill-rule, FillRule, SvgStyleFlags::FillRule), + STYLE_DEF(fill-opacity, FillOpacity, SvgStyleFlags::FillOpacity), + STYLE_DEF(opacity, Opacity, SvgStyleFlags::Opacity), + STYLE_DEF(stroke, Stroke, SvgStyleFlags::Stroke), + STYLE_DEF(stroke-width, StrokeWidth, SvgStyleFlags::StrokeWidth), + STYLE_DEF(stroke-linejoin, StrokeLineJoin, SvgStyleFlags::StrokeLineJoin), + STYLE_DEF(stroke-miterlimit, StrokeMiterlimit, SvgStyleFlags::StrokeMiterlimit), + STYLE_DEF(stroke-linecap, StrokeLineCap, SvgStyleFlags::StrokeLineCap), + STYLE_DEF(stroke-opacity, StrokeOpacity, SvgStyleFlags::StrokeOpacity), + STYLE_DEF(stroke-dasharray, StrokeDashArray, SvgStyleFlags::StrokeDashArray), + STYLE_DEF(stroke-dashoffset, StrokeDashOffset, SvgStyleFlags::StrokeDashOffset), + STYLE_DEF(transform, Transform, SvgStyleFlags::Transform), + STYLE_DEF(clip-path, ClipPath, SvgStyleFlags::ClipPath), + STYLE_DEF(mask, Mask, SvgStyleFlags::Mask), + STYLE_DEF(mask-type, MaskType, SvgStyleFlags::MaskType), + STYLE_DEF(display, Display, SvgStyleFlags::Display), + STYLE_DEF(paint-order, PaintOrder, SvgStyleFlags::PaintOrder) +}; + + +static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + int sz; + if (!key || !value) return false; + + //Trim the white space + key = _skipSpace(key, nullptr); + value = _skipSpace(value, nullptr); + + sz = strlen(key); + for (unsigned int i = 0; i < sizeof(styleTags) / sizeof(styleTags[0]); i++) { + if (styleTags[i].sz - 1 == sz && !strncmp(styleTags[i].tag, key, sz)) { + bool importance = false; + if (auto ptr = strstr(value, "!important")) { + size_t size = ptr - value; + while (size > 0 && isspace(value[size - 1])) { + size--; + } + value = strDuplicate(value, size); + importance = true; + } + if (style) { + if (importance || !(node->style->flagsImportance & styleTags[i].flag)) { + styleTags[i].tagHandler(loader, node, value); + node->style->flags = (node->style->flags | styleTags[i].flag); + } + } else if (!(node->style->flags & styleTags[i].flag)) { + styleTags[i].tagHandler(loader, node, value); + } + if (importance) { + node->style->flagsImportance = (node->style->flags | styleTags[i].flag); + free(const_cast(value)); + } + return true; + } + } + + return false; +} + + +static bool _parseStyleAttr(void* data, const char* key, const char* value) +{ + return _parseStyleAttr(data, key, value, true); +} + + +/* parse g node + * https://www.w3.org/TR/SVG/struct.html#Groups + */ +static bool _attrParseGNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + + if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "transform")) { + node->transform = _parseTransformationMatrix(value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +/* parse clipPath node + * https://www.w3.org/TR/SVG/struct.html#Groups + */ +static bool _attrParseClipPathNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgClipNode* clip = &(node->node.clip); + + if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "transform")) { + node->transform = _parseTransformationMatrix(value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "clipPathUnits")) { + if (!strcmp(value, "objectBoundingBox")) clip->userSpace = false; + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static bool _attrParseMaskNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgMaskNode* mask = &(node->node.mask); + + if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "transform")) { + node->transform = _parseTransformationMatrix(value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "maskContentUnits")) { + if (!strcmp(value, "objectBoundingBox")) mask->userSpace = false; + } else if (!strcmp(key, "mask-type")) { + mask->type = _toMaskType(value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static bool _attrParseCssStyleNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + + if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static bool _attrParseSymbolNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgSymbolNode* symbol = &(node->node.symbol); + + if (!strcmp(key, "viewBox")) { + if (!_parseNumber(&value, &symbol->vx) || !_parseNumber(&value, &symbol->vy)) return false; + if (!_parseNumber(&value, &symbol->vw) || !_parseNumber(&value, &symbol->vh)) return false; + symbol->hasViewBox = true; + } else if (!strcmp(key, "width")) { + symbol->w = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); + symbol->hasWidth = true; + } else if (!strcmp(key, "height")) { + symbol->h = _toFloat(loader->svgParse, value, SvgParserLengthType::Vertical); + symbol->hasHeight = true; + } else if (!strcmp(key, "preserveAspectRatio")) { + _parseAspectRatio(&value, &symbol->align, &symbol->meetOrSlice); + } else if (!strcmp(key, "overflow")) { + if (!strcmp(value, "visible")) symbol->overflowVisible = true; + } else { + return _attrParseGNode(data, key, value); + } + + return true; +} + + +static SvgNode* _createNode(SvgNode* parent, SvgNodeType type) +{ + SvgNode* node = (SvgNode*)calloc(1, sizeof(SvgNode)); + + if (!node) return nullptr; + + //Default fill property + node->style = (SvgStyleProperty*)calloc(1, sizeof(SvgStyleProperty)); + + if (!node->style) { + free(node); + return nullptr; + } + + //Update the default value of stroke and fill + //https://www.w3.org/TR/SVGTiny12/painting.html#SpecifyingPaint + node->style->fill.paint.none = false; + //Default fill opacity is 1 + node->style->fill.opacity = 255; + node->style->opacity = 255; + //Default current color is not set + node->style->fill.paint.curColor = false; + node->style->curColorSet = false; + //Default fill rule is nonzero + node->style->fill.fillRule = FillRule::Winding; + + //Default stroke is none + node->style->stroke.paint.none = true; + //Default stroke opacity is 1 + node->style->stroke.opacity = 255; + //Default stroke current color is not set + node->style->stroke.paint.curColor = false; + //Default stroke width is 1 + node->style->stroke.width = 1; + //Default line cap is butt + node->style->stroke.cap = StrokeCap::Butt; + //Default line join is miter + node->style->stroke.join = StrokeJoin::Miter; + node->style->stroke.miterlimit = 4.0f; + node->style->stroke.scale = 1.0; + + node->style->paintOrder = _toPaintOrder("fill stroke"); + + //Default display is true("inline"). + node->display = true; + + node->parent = parent; + node->type = type; + + if (parent) parent->child.push(node); + return node; +} + + +static SvgNode* _createDefsNode(TVG_UNUSED SvgLoaderData* loader, TVG_UNUSED SvgNode* parent, const char* buf, unsigned bufLength, TVG_UNUSED parseAttributes func) +{ + if (loader->def && loader->doc->node.doc.defs) return loader->def; + SvgNode* node = _createNode(nullptr, SvgNodeType::Defs); + + loader->def = node; + loader->doc->node.doc.defs = node; + return node; +} + + +static SvgNode* _createGNode(TVG_UNUSED SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::G); + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseGNode, loader); + return loader->svgParse->node; +} + + +static SvgNode* _createSvgNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Doc); + if (!loader->svgParse->node) return nullptr; + SvgDocNode* doc = &(loader->svgParse->node->node.doc); + + loader->svgParse->global.w = 1.0f; + loader->svgParse->global.h = 1.0f; + + doc->align = AspectRatioAlign::XMidYMid; + doc->meetOrSlice = AspectRatioMeetOrSlice::Meet; + doc->viewFlag = SvgViewFlag::None; + func(buf, bufLength, _attrParseSvgNode, loader); + + if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { + if (doc->viewFlag & SvgViewFlag::Width) { + loader->svgParse->global.w = doc->w; + } + if (doc->viewFlag & SvgViewFlag::Height) { + loader->svgParse->global.h = doc->h; + } + } + return loader->svgParse->node; +} + + +static SvgNode* _createMaskNode(SvgLoaderData* loader, SvgNode* parent, TVG_UNUSED const char* buf, TVG_UNUSED unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Mask); + if (!loader->svgParse->node) return nullptr; + + loader->svgParse->node->node.mask.userSpace = true; + loader->svgParse->node->node.mask.type = SvgMaskType::Luminance; + + func(buf, bufLength, _attrParseMaskNode, loader); + + return loader->svgParse->node; +} + + +static SvgNode* _createClipPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::ClipPath); + if (!loader->svgParse->node) return nullptr; + + loader->svgParse->node->display = false; + loader->svgParse->node->node.clip.userSpace = true; + + func(buf, bufLength, _attrParseClipPathNode, loader); + + return loader->svgParse->node; +} + + +static SvgNode* _createCssStyleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::CssStyle); + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseCssStyleNode, loader); + + return loader->svgParse->node; +} + + +static SvgNode* _createSymbolNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Symbol); + if (!loader->svgParse->node) return nullptr; + + loader->svgParse->node->display = false; + loader->svgParse->node->node.symbol.align = AspectRatioAlign::XMidYMid; + loader->svgParse->node->node.symbol.meetOrSlice = AspectRatioMeetOrSlice::Meet; + loader->svgParse->node->node.symbol.overflowVisible = false; + + loader->svgParse->node->node.symbol.hasViewBox = false; + loader->svgParse->node->node.symbol.hasWidth = false; + loader->svgParse->node->node.symbol.hasHeight = false; + loader->svgParse->node->node.symbol.vx = 0.0f; + loader->svgParse->node->node.symbol.vy = 0.0f; + + func(buf, bufLength, _attrParseSymbolNode, loader); + + return loader->svgParse->node; +} + + +static bool _attrParsePathNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgPathNode* path = &(node->node.path); + + if (!strcmp(key, "d")) { + if (path->path) free(path->path); + //Temporary: need to copy + path->path = _copyId(value); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static SvgNode* _createPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Path); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParsePathNode, loader); + + return loader->svgParse->node; +} + + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} circleTags[] = { + {"cx", SvgParserLengthType::Horizontal, sizeof("cx"), offsetof(SvgCircleNode, cx)}, + {"cy", SvgParserLengthType::Vertical, sizeof("cy"), offsetof(SvgCircleNode, cy)}, + {"r", SvgParserLengthType::Other, sizeof("r"), offsetof(SvgCircleNode, r)} +}; + + +/* parse the attributes for a circle element. + * https://www.w3.org/TR/SVG/shapes.html#CircleElement + */ +static bool _attrParseCircleNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgCircleNode* circle = &(node->node.circle); + unsigned char* array; + int sz = strlen(key); + + array = (unsigned char*)circle; + for (unsigned int i = 0; i < sizeof(circleTags) / sizeof(circleTags[0]); i++) { + if (circleTags[i].sz - 1 == sz && !strncmp(circleTags[i].tag, key, sz)) { + *((float*)(array + circleTags[i].offset)) = _toFloat(loader->svgParse, value, circleTags[i].type); + return true; + } + } + + if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static SvgNode* _createCircleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Circle); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseCircleNode, loader); + return loader->svgParse->node; +} + + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} ellipseTags[] = { + {"cx", SvgParserLengthType::Horizontal, sizeof("cx"), offsetof(SvgEllipseNode, cx)}, + {"cy", SvgParserLengthType::Vertical, sizeof("cy"), offsetof(SvgEllipseNode, cy)}, + {"rx", SvgParserLengthType::Horizontal, sizeof("rx"), offsetof(SvgEllipseNode, rx)}, + {"ry", SvgParserLengthType::Vertical, sizeof("ry"), offsetof(SvgEllipseNode, ry)} +}; + + +/* parse the attributes for an ellipse element. + * https://www.w3.org/TR/SVG/shapes.html#EllipseElement + */ +static bool _attrParseEllipseNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgEllipseNode* ellipse = &(node->node.ellipse); + unsigned char* array; + int sz = strlen(key); + + array = (unsigned char*)ellipse; + for (unsigned int i = 0; i < sizeof(ellipseTags) / sizeof(ellipseTags[0]); i++) { + if (ellipseTags[i].sz - 1 == sz && !strncmp(ellipseTags[i].tag, key, sz)) { + *((float*)(array + ellipseTags[i].offset)) = _toFloat(loader->svgParse, value, ellipseTags[i].type); + return true; + } + } + + if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static SvgNode* _createEllipseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Ellipse); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseEllipseNode, loader); + return loader->svgParse->node; +} + + +static bool _attrParsePolygonPoints(const char* str, SvgPolygonNode* polygon) +{ + float num; + while (_parseNumber(&str, &num)) polygon->pts.push(num); + return true; +} + + +/* parse the attributes for a polygon element. + * https://www.w3.org/TR/SVG/shapes.html#PolylineElement + */ +static bool _attrParsePolygonNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgPolygonNode* polygon = nullptr; + + if (node->type == SvgNodeType::Polygon) polygon = &(node->node.polygon); + else polygon = &(node->node.polyline); + + if (!strcmp(key, "points")) { + return _attrParsePolygonPoints(value, polygon); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static SvgNode* _createPolygonNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Polygon); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParsePolygonNode, loader); + return loader->svgParse->node; +} + + +static SvgNode* _createPolylineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Polyline); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParsePolygonNode, loader); + return loader->svgParse->node; +} + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} rectTags[] = { + {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgRectNode, x)}, + {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgRectNode, y)}, + {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgRectNode, w)}, + {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgRectNode, h)}, + {"rx", SvgParserLengthType::Horizontal, sizeof("rx"), offsetof(SvgRectNode, rx)}, + {"ry", SvgParserLengthType::Vertical, sizeof("ry"), offsetof(SvgRectNode, ry)} +}; + + +/* parse the attributes for a rect element. + * https://www.w3.org/TR/SVG/shapes.html#RectElement + */ +static bool _attrParseRectNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgRectNode* rect = &(node->node.rect); + unsigned char* array; + bool ret = true; + int sz = strlen(key); + + array = (unsigned char*)rect; + for (unsigned int i = 0; i < sizeof(rectTags) / sizeof(rectTags[0]); i++) { + if (rectTags[i].sz - 1 == sz && !strncmp(rectTags[i].tag, key, sz)) { + *((float*)(array + rectTags[i].offset)) = _toFloat(loader->svgParse, value, rectTags[i].type); + + //Case if only rx or ry is declared + if (!strncmp(rectTags[i].tag, "rx", sz)) rect->hasRx = true; + if (!strncmp(rectTags[i].tag, "ry", sz)) rect->hasRy = true; + + if ((rect->rx >= FLT_EPSILON) && (rect->ry < FLT_EPSILON) && rect->hasRx && !rect->hasRy) rect->ry = rect->rx; + if ((rect->ry >= FLT_EPSILON) && (rect->rx < FLT_EPSILON) && !rect->hasRx && rect->hasRy) rect->rx = rect->ry; + return ret; + } + } + + if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "style")) { + ret = simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else { + ret = _parseStyleAttr(loader, key, value, false); + } + + return ret; +} + + +static SvgNode* _createRectNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Rect); + + if (!loader->svgParse->node) return nullptr; + + loader->svgParse->node->node.rect.hasRx = loader->svgParse->node->node.rect.hasRy = false; + + func(buf, bufLength, _attrParseRectNode, loader); + return loader->svgParse->node; +} + + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} lineTags[] = { + {"x1", SvgParserLengthType::Horizontal, sizeof("x1"), offsetof(SvgLineNode, x1)}, + {"y1", SvgParserLengthType::Vertical, sizeof("y1"), offsetof(SvgLineNode, y1)}, + {"x2", SvgParserLengthType::Horizontal, sizeof("x2"), offsetof(SvgLineNode, x2)}, + {"y2", SvgParserLengthType::Vertical, sizeof("y2"), offsetof(SvgLineNode, y2)} +}; + + +/* parse the attributes for a line element. + * https://www.w3.org/TR/SVG/shapes.html#LineElement + */ +static bool _attrParseLineNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgLineNode* line = &(node->node.line); + unsigned char* array; + int sz = strlen(key); + + array = (unsigned char*)line; + for (unsigned int i = 0; i < sizeof(lineTags) / sizeof(lineTags[0]); i++) { + if (lineTags[i].sz - 1 == sz && !strncmp(lineTags[i].tag, key, sz)) { + *((float*)(array + lineTags[i].offset)) = _toFloat(loader->svgParse, value, lineTags[i].type); + return true; + } + } + + if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else { + return _parseStyleAttr(loader, key, value, false); + } + return true; +} + + +static SvgNode* _createLineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Line); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseLineNode, loader); + return loader->svgParse->node; +} + + +static char* _idFromHref(const char* href) +{ + href = _skipSpace(href, nullptr); + if ((*href) == '#') href++; + return strdup(href); +} + + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} imageTags[] = { + {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgRectNode, x)}, + {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgRectNode, y)}, + {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgRectNode, w)}, + {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgRectNode, h)}, +}; + + +/* parse the attributes for a image element. + * https://www.w3.org/TR/SVG/embedded.html#ImageElement + */ +static bool _attrParseImageNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode* node = loader->svgParse->node; + SvgImageNode* image = &(node->node.image); + unsigned char* array; + int sz = strlen(key); + + array = (unsigned char*)image; + for (unsigned int i = 0; i < sizeof(imageTags) / sizeof(imageTags[0]); i++) { + if (imageTags[i].sz - 1 == sz && !strncmp(imageTags[i].tag, key, sz)) { + *((float*)(array + imageTags[i].offset)) = _toFloat(loader->svgParse, value, imageTags[i].type); + return true; + } + } + + if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { + if (image->href && value) free(image->href); + image->href = _idFromHref(value); + } else if (!strcmp(key, "id")) { + if (node->id && value) free(node->id); + node->id = _copyId(value); + } else if (!strcmp(key, "class")) { + _handleCssClassAttr(loader, node, value); + } else if (!strcmp(key, "style")) { + return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader); + } else if (!strcmp(key, "clip-path")) { + _handleClipPathAttr(loader, node, value); + } else if (!strcmp(key, "mask")) { + _handleMaskAttr(loader, node, value); + } else if (!strcmp(key, "transform")) { + node->transform = _parseTransformationMatrix(value); + } else { + return _parseStyleAttr(loader, key, value); + } + return true; +} + + +static SvgNode* _createImageNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Image); + + if (!loader->svgParse->node) return nullptr; + + func(buf, bufLength, _attrParseImageNode, loader); + return loader->svgParse->node; +} + + +static SvgNode* _getDefsNode(SvgNode* node) +{ + if (!node) return nullptr; + + while (node->parent != nullptr) { + node = node->parent; + } + + if (node->type == SvgNodeType::Doc) return node->node.doc.defs; + if (node->type == SvgNodeType::Defs) return node; + + return nullptr; +} + + +static SvgNode* _findNodeById(SvgNode *node, const char* id) +{ + if (!node) return nullptr; + + SvgNode* result = nullptr; + if (node->id && !strcmp(node->id, id)) return node; + + if (node->child.count > 0) { + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + result = _findNodeById(*child, id); + if (result) break; + } + } + return result; +} + + +static constexpr struct +{ + const char* tag; + SvgParserLengthType type; + int sz; + size_t offset; +} useTags[] = { + {"x", SvgParserLengthType::Horizontal, sizeof("x"), offsetof(SvgUseNode, x)}, + {"y", SvgParserLengthType::Vertical, sizeof("y"), offsetof(SvgUseNode, y)}, + {"width", SvgParserLengthType::Horizontal, sizeof("width"), offsetof(SvgUseNode, w)}, + {"height", SvgParserLengthType::Vertical, sizeof("height"), offsetof(SvgUseNode, h)} +}; + + +static void _cloneNode(SvgNode* from, SvgNode* parent, int depth); +static bool _attrParseUseNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgNode *defs, *nodeFrom, *node = loader->svgParse->node; + char* id; + + SvgUseNode* use = &(node->node.use); + int sz = strlen(key); + unsigned char* array = (unsigned char*)use; + for (unsigned int i = 0; i < sizeof(useTags) / sizeof(useTags[0]); i++) { + if (useTags[i].sz - 1 == sz && !strncmp(useTags[i].tag, key, sz)) { + *((float*)(array + useTags[i].offset)) = _toFloat(loader->svgParse, value, useTags[i].type); + + if (useTags[i].offset == offsetof(SvgUseNode, w)) use->isWidthSet = true; + else if (useTags[i].offset == offsetof(SvgUseNode, h)) use->isHeightSet = true; + + return true; + } + } + + if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { + id = _idFromHref(value); + defs = _getDefsNode(node); + nodeFrom = _findNodeById(defs, id); + if (nodeFrom) { + _cloneNode(nodeFrom, node, 0); + if (nodeFrom->type == SvgNodeType::Symbol) use->symbol = nodeFrom; + free(id); + } else { + //some svg export software include element at the end of the file + //if so the 'from' element won't be found now and we have to repeat finding + //after the whole file is parsed + _postpone(loader->cloneNodes, node, id); + } + } else { + return _attrParseGNode(data, key, value); + } + return true; +} + + +static SvgNode* _createUseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func) +{ + loader->svgParse->node = _createNode(parent, SvgNodeType::Use); + + if (!loader->svgParse->node) return nullptr; + + loader->svgParse->node->node.use.isWidthSet = false; + loader->svgParse->node->node.use.isHeightSet = false; + + func(buf, bufLength, _attrParseUseNode, loader); + return loader->svgParse->node; +} + + +//TODO: Implement 'text' primitive +static constexpr struct +{ + const char* tag; + int sz; + FactoryMethod tagHandler; +} graphicsTags[] = { + {"use", sizeof("use"), _createUseNode}, + {"circle", sizeof("circle"), _createCircleNode}, + {"ellipse", sizeof("ellipse"), _createEllipseNode}, + {"path", sizeof("path"), _createPathNode}, + {"polygon", sizeof("polygon"), _createPolygonNode}, + {"rect", sizeof("rect"), _createRectNode}, + {"polyline", sizeof("polyline"), _createPolylineNode}, + {"line", sizeof("line"), _createLineNode}, + {"image", sizeof("image"), _createImageNode} +}; + + +static constexpr struct +{ + const char* tag; + int sz; + FactoryMethod tagHandler; +} groupTags[] = { + {"defs", sizeof("defs"), _createDefsNode}, + {"g", sizeof("g"), _createGNode}, + {"svg", sizeof("svg"), _createSvgNode}, + {"mask", sizeof("mask"), _createMaskNode}, + {"clipPath", sizeof("clipPath"), _createClipPathNode}, + {"style", sizeof("style"), _createCssStyleNode}, + {"symbol", sizeof("symbol"), _createSymbolNode} +}; + + +#define FIND_FACTORY(Short_Name, Tags_Array) \ + static FactoryMethod \ + _find##Short_Name##Factory(const char* name) \ + { \ + unsigned int i; \ + int sz = strlen(name); \ + \ + for (i = 0; i < sizeof(Tags_Array) / sizeof(Tags_Array[0]); i++) { \ + if (Tags_Array[i].sz - 1 == sz && !strncmp(Tags_Array[i].tag, name, sz)) { \ + return Tags_Array[i].tagHandler; \ + } \ + } \ + return nullptr; \ + } + +FIND_FACTORY(Group, groupTags) +FIND_FACTORY(Graphics, graphicsTags) + + +FillSpread _parseSpreadValue(const char* value) +{ + auto spread = FillSpread::Pad; + + if (!strcmp(value, "reflect")) { + spread = FillSpread::Reflect; + } else if (!strcmp(value, "repeat")) { + spread = FillSpread::Repeat; + } + + return spread; +} + + +static void _handleRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->cx = _gradientToFloat(loader->svgParse, value, radial->isCxPercentage); + if (!loader->svgParse->gradient.parsedFx) { + radial->fx = radial->cx; + radial->isFxPercentage = radial->isCxPercentage; + } +} + + +static void _handleRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->cy = _gradientToFloat(loader->svgParse, value, radial->isCyPercentage); + if (!loader->svgParse->gradient.parsedFy) { + radial->fy = radial->cy; + radial->isFyPercentage = radial->isCyPercentage; + } +} + + +static void _handleRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->fx = _gradientToFloat(loader->svgParse, value, radial->isFxPercentage); + loader->svgParse->gradient.parsedFx = true; +} + + +static void _handleRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->fy = _gradientToFloat(loader->svgParse, value, radial->isFyPercentage); + loader->svgParse->gradient.parsedFy = true; +} + + +static void _handleRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->fr = _gradientToFloat(loader->svgParse, value, radial->isFrPercentage); +} + + +static void _handleRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value) +{ + radial->r = _gradientToFloat(loader->svgParse, value, radial->isRPercentage); +} + + +static void _recalcRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (userSpace && !radial->isCxPercentage) radial->cx = radial->cx / loader->svgParse->global.w; +} + + +static void _recalcRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (userSpace && !radial->isCyPercentage) radial->cy = radial->cy / loader->svgParse->global.h; +} + + +static void _recalcRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (userSpace && !radial->isFxPercentage) radial->fx = radial->fx / loader->svgParse->global.w; +} + + +static void _recalcRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (userSpace && !radial->isFyPercentage) radial->fy = radial->fy / loader->svgParse->global.h; +} + + +static void _recalcRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + // scaling factor based on the Units paragraph from : https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html + if (userSpace && !radial->isFrPercentage) radial->fr = radial->fr / (sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0)); +} + + +static void _recalcRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + // scaling factor based on the Units paragraph from : https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html + if (userSpace && !radial->isRPercentage) radial->r = radial->r / (sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0)); +} + + +static void _recalcInheritedRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isCxPercentage) { + if (userSpace) radial->cx /= loader->svgParse->global.w; + else radial->cx *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isCyPercentage) { + if (userSpace) radial->cy /= loader->svgParse->global.h; + else radial->cy *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isFxPercentage) { + if (userSpace) radial->fx /= loader->svgParse->global.w; + else radial->fx *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isFyPercentage) { + if (userSpace) radial->fy /= loader->svgParse->global.h; + else radial->fy *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isFrPercentage) { + if (userSpace) radial->fr /= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + else radial->fr *= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + } +} + + +static void _recalcInheritedRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isRPercentage) { + if (userSpace) radial->r /= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + else radial->r *= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + } +} + + +static void _inheritRadialCxAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->cx = from->radial->cx; + to->radial->isCxPercentage = from->radial->isCxPercentage; + to->flags = (to->flags | SvgGradientFlags::Cx); +} + + +static void _inheritRadialCyAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->cy = from->radial->cy; + to->radial->isCyPercentage = from->radial->isCyPercentage; + to->flags = (to->flags | SvgGradientFlags::Cy); +} + + +static void _inheritRadialFxAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->fx = from->radial->fx; + to->radial->isFxPercentage = from->radial->isFxPercentage; + to->flags = (to->flags | SvgGradientFlags::Fx); +} + + +static void _inheritRadialFyAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->fy = from->radial->fy; + to->radial->isFyPercentage = from->radial->isFyPercentage; + to->flags = (to->flags | SvgGradientFlags::Fy); +} + + +static void _inheritRadialFrAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->fr = from->radial->fr; + to->radial->isFrPercentage = from->radial->isFrPercentage; + to->flags = (to->flags | SvgGradientFlags::Fr); +} + + +static void _inheritRadialRAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->r = from->radial->r; + to->radial->isRPercentage = from->radial->isRPercentage; + to->flags = (to->flags | SvgGradientFlags::R); +} + + +typedef void (*radialMethod)(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value); +typedef void (*radialInheritMethod)(SvgStyleGradient* to, SvgStyleGradient* from); +typedef void (*radialMethodRecalc)(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace); + + +#define RADIAL_DEF(Name, Name1, Flag) \ + { \ +#Name, sizeof(#Name), _handleRadial##Name1##Attr, _inheritRadial##Name1##Attr, _recalcRadial##Name1##Attr, _recalcInheritedRadial##Name1##Attr, Flag \ + } + + +static constexpr struct +{ + const char* tag; + int sz; + radialMethod tagHandler; + radialInheritMethod tagInheritHandler; + radialMethodRecalc tagRecalc; + radialMethodRecalc tagInheritedRecalc; + SvgGradientFlags flag; +} radialTags[] = { + RADIAL_DEF(cx, Cx, SvgGradientFlags::Cx), + RADIAL_DEF(cy, Cy, SvgGradientFlags::Cy), + RADIAL_DEF(fx, Fx, SvgGradientFlags::Fx), + RADIAL_DEF(fy, Fy, SvgGradientFlags::Fy), + RADIAL_DEF(r, R, SvgGradientFlags::R), + RADIAL_DEF(fr, Fr, SvgGradientFlags::Fr) +}; + + +static bool _attrParseRadialGradientNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgStyleGradient* grad = loader->svgParse->styleGrad; + SvgRadialGradient* radial = grad->radial; + int sz = strlen(key); + + for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { + if (radialTags[i].sz - 1 == sz && !strncmp(radialTags[i].tag, key, sz)) { + radialTags[i].tagHandler(loader, radial, value); + grad->flags = (grad->flags | radialTags[i].flag); + return true; + } + } + + if (!strcmp(key, "id")) { + if (grad->id && value) free(grad->id); + grad->id = _copyId(value); + } else if (!strcmp(key, "spreadMethod")) { + grad->spread = _parseSpreadValue(value); + grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); + } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { + if (grad->ref && value) free(grad->ref); + grad->ref = _idFromHref(value); + } else if (!strcmp(key, "gradientUnits")) { + if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; + grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); + } else if (!strcmp(key, "gradientTransform")) { + grad->transform = _parseTransformationMatrix(value); + } else { + return false; + } + + return true; +} + + +static SvgStyleGradient* _createRadialGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength) +{ + auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); + loader->svgParse->styleGrad = grad; + + grad->flags = SvgGradientFlags::None; + grad->type = SvgGradientType::Radial; + grad->userSpace = false; + grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); + if (!grad->radial) { + grad->clear(); + free(grad); + return nullptr; + } + /** + * Default values of gradient transformed into global percentage + */ + grad->radial->cx = 0.5f; + grad->radial->cy = 0.5f; + grad->radial->fx = 0.5f; + grad->radial->fy = 0.5f; + grad->radial->r = 0.5f; + grad->radial->isCxPercentage = true; + grad->radial->isCyPercentage = true; + grad->radial->isFxPercentage = true; + grad->radial->isFyPercentage = true; + grad->radial->isRPercentage = true; + grad->radial->isFrPercentage = true; + + loader->svgParse->gradient.parsedFx = false; + loader->svgParse->gradient.parsedFy = false; + simpleXmlParseAttributes(buf, bufLength, + _attrParseRadialGradientNode, loader); + + for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { + radialTags[i].tagRecalc(loader, grad->radial, grad->userSpace); + } + + return loader->svgParse->styleGrad; +} + + +static bool _attrParseStopsStyle(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + auto stop = &loader->svgParse->gradStop; + + if (!strcmp(key, "stop-opacity")) { + stop->a = _toOpacity(value); + loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopOpacity); + } else if (!strcmp(key, "stop-color")) { + _toColor(value, &stop->r, &stop->g, &stop->b, nullptr); + loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopColor); + } else { + return false; + } + + return true; +} + + +static bool _attrParseStops(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + auto stop = &loader->svgParse->gradStop; + + if (!strcmp(key, "offset")) { + stop->offset = _toOffset(value); + } else if (!strcmp(key, "stop-opacity")) { + if (!(loader->svgParse->flags & SvgStopStyleFlags::StopOpacity)) { + stop->a = _toOpacity(value); + } + } else if (!strcmp(key, "stop-color")) { + if (!(loader->svgParse->flags & SvgStopStyleFlags::StopColor)) { + _toColor(value, &stop->r, &stop->g, &stop->b, nullptr); + } + } else if (!strcmp(key, "style")) { + simpleXmlParseW3CAttribute(value, strlen(value), _attrParseStopsStyle, data); + } else { + return false; + } + + return true; +} + + +static void _handleLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) +{ + linear->x1 = _gradientToFloat(loader->svgParse, value, linear->isX1Percentage); +} + + +static void _handleLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) +{ + linear->y1 = _gradientToFloat(loader->svgParse, value, linear->isY1Percentage); +} + + +static void _handleLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) +{ + linear->x2 = _gradientToFloat(loader->svgParse, value, linear->isX2Percentage); +} + + +static void _handleLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value) +{ + linear->y2 = _gradientToFloat(loader->svgParse, value, linear->isY2Percentage); +} + + +static void _recalcLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (userSpace && !linear->isX1Percentage) linear->x1 = linear->x1 / loader->svgParse->global.w; +} + + +static void _recalcLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (userSpace && !linear->isY1Percentage) linear->y1 = linear->y1 / loader->svgParse->global.h; +} + + +static void _recalcLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (userSpace && !linear->isX2Percentage) linear->x2 = linear->x2 / loader->svgParse->global.w; +} + + +static void _recalcLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (userSpace && !linear->isY2Percentage) linear->y2 = linear->y2 / loader->svgParse->global.h; +} + + +static void _recalcInheritedLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isX1Percentage) { + if (userSpace) linear->x1 /= loader->svgParse->global.w; + else linear->x1 *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isX2Percentage) { + if (userSpace) linear->x2 /= loader->svgParse->global.w; + else linear->x2 *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isY1Percentage) { + if (userSpace) linear->y1 /= loader->svgParse->global.h; + else linear->y1 *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isY2Percentage) { + if (userSpace) linear->y2 /= loader->svgParse->global.h; + else linear->y2 *= loader->svgParse->global.h; + } +} + + +static void _inheritLinearX1Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->x1 = from->linear->x1; + to->linear->isX1Percentage = from->linear->isX1Percentage; + to->flags = (to->flags | SvgGradientFlags::X1); +} + + +static void _inheritLinearX2Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->x2 = from->linear->x2; + to->linear->isX2Percentage = from->linear->isX2Percentage; + to->flags = (to->flags | SvgGradientFlags::X2); +} + + +static void _inheritLinearY1Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->y1 = from->linear->y1; + to->linear->isY1Percentage = from->linear->isY1Percentage; + to->flags = (to->flags | SvgGradientFlags::Y1); +} + + +static void _inheritLinearY2Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->y2 = from->linear->y2; + to->linear->isY2Percentage = from->linear->isY2Percentage; + to->flags = (to->flags | SvgGradientFlags::Y2); +} + + +typedef void (*Linear_Method)(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value); +typedef void (*Linear_Inherit_Method)(SvgStyleGradient* to, SvgStyleGradient* from); +typedef void (*Linear_Method_Recalc)(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace); + + +#define LINEAR_DEF(Name, Name1, Flag) \ + { \ +#Name, sizeof(#Name), _handleLinear##Name1##Attr, _inheritLinear##Name1##Attr, _recalcLinear##Name1##Attr, _recalcInheritedLinear##Name1##Attr, Flag \ + } + + +static constexpr struct +{ + const char* tag; + int sz; + Linear_Method tagHandler; + Linear_Inherit_Method tagInheritHandler; + Linear_Method_Recalc tagRecalc; + Linear_Method_Recalc tagInheritedRecalc; + SvgGradientFlags flag; +} linear_tags[] = { + LINEAR_DEF(x1, X1, SvgGradientFlags::X1), + LINEAR_DEF(y1, Y1, SvgGradientFlags::Y1), + LINEAR_DEF(x2, X2, SvgGradientFlags::X2), + LINEAR_DEF(y2, Y2, SvgGradientFlags::Y2) +}; + + +static bool _attrParseLinearGradientNode(void* data, const char* key, const char* value) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + SvgStyleGradient* grad = loader->svgParse->styleGrad; + SvgLinearGradient* linear = grad->linear; + int sz = strlen(key); + + for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { + if (linear_tags[i].sz - 1 == sz && !strncmp(linear_tags[i].tag, key, sz)) { + linear_tags[i].tagHandler(loader, linear, value); + grad->flags = (grad->flags | linear_tags[i].flag); + return true; + } + } + + if (!strcmp(key, "id")) { + if (grad->id && value) free(grad->id); + grad->id = _copyId(value); + } else if (!strcmp(key, "spreadMethod")) { + grad->spread = _parseSpreadValue(value); + grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); + } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { + if (grad->ref && value) free(grad->ref); + grad->ref = _idFromHref(value); + } else if (!strcmp(key, "gradientUnits")) { + if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; + grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); + } else if (!strcmp(key, "gradientTransform")) { + grad->transform = _parseTransformationMatrix(value); + } else { + return false; + } + + return true; +} + + +static SvgStyleGradient* _createLinearGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength) +{ + auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); + loader->svgParse->styleGrad = grad; + + grad->flags = SvgGradientFlags::None; + grad->type = SvgGradientType::Linear; + grad->userSpace = false; + grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); + if (!grad->linear) { + grad->clear(); + free(grad); + return nullptr; + } + /** + * Default value of x2 is 100% - transformed to the global percentage + */ + grad->linear->x2 = 1.0f; + grad->linear->isX2Percentage = true; + + simpleXmlParseAttributes(buf, bufLength, _attrParseLinearGradientNode, loader); + + for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { + linear_tags[i].tagRecalc(loader, grad->linear, grad->userSpace); + } + + return loader->svgParse->styleGrad; +} + + +#define GRADIENT_DEF(Name, Name1) \ + { \ +#Name, sizeof(#Name), _create##Name1 \ + } + + +/** + * In the case when the gradients lengths are given as numbers (not percentages) + * in the current user coordinate system, they are recalculated into percentages + * related to the canvas width and height. + */ +static constexpr struct +{ + const char* tag; + int sz; + GradientFactoryMethod tagHandler; +} gradientTags[] = { + GRADIENT_DEF(linearGradient, LinearGradient), + GRADIENT_DEF(radialGradient, RadialGradient) +}; + + +static GradientFactoryMethod _findGradientFactory(const char* name) +{ + int sz = strlen(name); + + for (unsigned int i = 0; i < sizeof(gradientTags) / sizeof(gradientTags[0]); i++) { + if (gradientTags[i].sz - 1 == sz && !strncmp(gradientTags[i].tag, name, sz)) { + return gradientTags[i].tagHandler; + } + } + return nullptr; +} + + +static void _cloneGradStops(Array& dst, const Array& src) +{ + for (uint32_t i = 0; i < src.count; ++i) { + dst.push(src[i]); + } +} + + +static void _inheritGradient(SvgLoaderData* loader, SvgStyleGradient* to, SvgStyleGradient* from) +{ + if (!to || !from) return; + + if (!(to->flags & SvgGradientFlags::SpreadMethod) && (from->flags & SvgGradientFlags::SpreadMethod)) { + to->spread = from->spread; + to->flags = (to->flags | SvgGradientFlags::SpreadMethod); + } + bool gradUnitSet = (to->flags & SvgGradientFlags::GradientUnits); + if (!(to->flags & SvgGradientFlags::GradientUnits) && (from->flags & SvgGradientFlags::GradientUnits)) { + to->userSpace = from->userSpace; + to->flags = (to->flags | SvgGradientFlags::GradientUnits); + } + + if (!to->transform && from->transform) { + to->transform = (Matrix*)malloc(sizeof(Matrix)); + if (to->transform) memcpy(to->transform, from->transform, sizeof(Matrix)); + } + + if (to->type == SvgGradientType::Linear && from->type == SvgGradientType::Linear) { + for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { + bool coordSet = to->flags & linear_tags[i].flag; + if (!(to->flags & linear_tags[i].flag) && (from->flags & linear_tags[i].flag)) { + linear_tags[i].tagInheritHandler(to, from); + } + + //GradUnits not set directly, coord set + if (!gradUnitSet && coordSet) { + linear_tags[i].tagRecalc(loader, to->linear, to->userSpace); + } + //GradUnits set, coord not set directly + if (to->userSpace == from->userSpace) continue; + if (gradUnitSet && !coordSet) { + linear_tags[i].tagInheritedRecalc(loader, to->linear, to->userSpace); + } + } + } else if (to->type == SvgGradientType::Radial && from->type == SvgGradientType::Radial) { + for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { + bool coordSet = (to->flags & radialTags[i].flag); + if (!(to->flags & radialTags[i].flag) && (from->flags & radialTags[i].flag)) { + radialTags[i].tagInheritHandler(to, from); + } + + //GradUnits not set directly, coord set + if (!gradUnitSet && coordSet) { + radialTags[i].tagRecalc(loader, to->radial, to->userSpace); + } + //GradUnits set, coord not set directly + if (to->userSpace == from->userSpace) continue; + if (gradUnitSet && !coordSet) { + radialTags[i].tagInheritedRecalc(loader, to->radial, to->userSpace); + } + } + } + + if (to->stops.empty()) _cloneGradStops(to->stops, from->stops); +} + + +static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from) +{ + if (!from) return nullptr; + + auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); + if (!grad) return nullptr; + + grad->type = from->type; + grad->id = from->id ? _copyId(from->id) : nullptr; + grad->ref = from->ref ? _copyId(from->ref) : nullptr; + grad->spread = from->spread; + grad->userSpace = from->userSpace; + grad->flags = from->flags; + + if (from->transform) { + grad->transform = (Matrix*)calloc(1, sizeof(Matrix)); + if (grad->transform) memcpy(grad->transform, from->transform, sizeof(Matrix)); + } + + if (grad->type == SvgGradientType::Linear) { + grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); + if (!grad->linear) goto error_grad_alloc; + memcpy(grad->linear, from->linear, sizeof(SvgLinearGradient)); + } else if (grad->type == SvgGradientType::Radial) { + grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); + if (!grad->radial) goto error_grad_alloc; + memcpy(grad->radial, from->radial, sizeof(SvgRadialGradient)); + } + + _cloneGradStops(grad->stops, from->stops); + + return grad; + + error_grad_alloc: + if (grad) { + grad->clear(); + free(grad); + } + return nullptr; +} + + +static void _styleInherit(SvgStyleProperty* child, const SvgStyleProperty* parent) +{ + if (parent == nullptr) return; + //Inherit the property of parent if not present in child. + if (!child->curColorSet) { + child->color = parent->color; + child->curColorSet = parent->curColorSet; + } + if (!(child->flags & SvgStyleFlags::PaintOrder)) { + child->paintOrder = parent->paintOrder; + } + //Fill + if (!(child->fill.flags & SvgFillFlags::Paint)) { + child->fill.paint.color = parent->fill.paint.color; + child->fill.paint.none = parent->fill.paint.none; + child->fill.paint.curColor = parent->fill.paint.curColor; + if (parent->fill.paint.url) { + if (child->fill.paint.url) free(child->fill.paint.url); + child->fill.paint.url = _copyId(parent->fill.paint.url); + } + } + if (!(child->fill.flags & SvgFillFlags::Opacity)) { + child->fill.opacity = parent->fill.opacity; + } + if (!(child->fill.flags & SvgFillFlags::FillRule)) { + child->fill.fillRule = parent->fill.fillRule; + } + //Stroke + if (!(child->stroke.flags & SvgStrokeFlags::Paint)) { + child->stroke.paint.color = parent->stroke.paint.color; + child->stroke.paint.none = parent->stroke.paint.none; + child->stroke.paint.curColor = parent->stroke.paint.curColor; + if (parent->stroke.paint.url) { + if (child->stroke.paint.url) free(child->stroke.paint.url); + child->stroke.paint.url = _copyId(parent->stroke.paint.url); + } + } + if (!(child->stroke.flags & SvgStrokeFlags::Opacity)) { + child->stroke.opacity = parent->stroke.opacity; + } + if (!(child->stroke.flags & SvgStrokeFlags::Width)) { + child->stroke.width = parent->stroke.width; + } + if (!(child->stroke.flags & SvgStrokeFlags::Dash)) { + if (parent->stroke.dash.array.count > 0) { + child->stroke.dash.array.clear(); + child->stroke.dash.array.reserve(parent->stroke.dash.array.count); + for (uint32_t i = 0; i < parent->stroke.dash.array.count; ++i) { + child->stroke.dash.array.push(parent->stroke.dash.array[i]); + } + } + } + if (!(child->stroke.flags & SvgStrokeFlags::DashOffset)) { + child->stroke.dash.offset = parent->stroke.dash.offset; + } + if (!(child->stroke.flags & SvgStrokeFlags::Cap)) { + child->stroke.cap = parent->stroke.cap; + } + if (!(child->stroke.flags & SvgStrokeFlags::Join)) { + child->stroke.join = parent->stroke.join; + } + if (!(child->stroke.flags & SvgStrokeFlags::Miterlimit)) { + child->stroke.miterlimit = parent->stroke.miterlimit; + } +} + + +static void _styleCopy(SvgStyleProperty* to, const SvgStyleProperty* from) +{ + if (from == nullptr) return; + //Copy the properties of 'from' only if they were explicitly set (not the default ones). + if (from->curColorSet) { + to->color = from->color; + to->curColorSet = true; + } + if (from->flags & SvgStyleFlags::PaintOrder) { + to->paintOrder = from->paintOrder; + } + //Fill + to->fill.flags = (to->fill.flags | from->fill.flags); + if (from->fill.flags & SvgFillFlags::Paint) { + to->fill.paint.color = from->fill.paint.color; + to->fill.paint.none = from->fill.paint.none; + to->fill.paint.curColor = from->fill.paint.curColor; + if (from->fill.paint.url) { + if (to->fill.paint.url) free(to->fill.paint.url); + to->fill.paint.url = _copyId(from->fill.paint.url); + } + } + if (from->fill.flags & SvgFillFlags::Opacity) { + to->fill.opacity = from->fill.opacity; + } + if (from->fill.flags & SvgFillFlags::FillRule) { + to->fill.fillRule = from->fill.fillRule; + } + //Stroke + to->stroke.flags = (to->stroke.flags | from->stroke.flags); + if (from->stroke.flags & SvgStrokeFlags::Paint) { + to->stroke.paint.color = from->stroke.paint.color; + to->stroke.paint.none = from->stroke.paint.none; + to->stroke.paint.curColor = from->stroke.paint.curColor; + if (from->stroke.paint.url) { + if (to->stroke.paint.url) free(to->stroke.paint.url); + to->stroke.paint.url = _copyId(from->stroke.paint.url); + } + } + if (from->stroke.flags & SvgStrokeFlags::Opacity) { + to->stroke.opacity = from->stroke.opacity; + } + if (from->stroke.flags & SvgStrokeFlags::Width) { + to->stroke.width = from->stroke.width; + } + if (from->stroke.flags & SvgStrokeFlags::Dash) { + if (from->stroke.dash.array.count > 0) { + to->stroke.dash.array.clear(); + to->stroke.dash.array.reserve(from->stroke.dash.array.count); + for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { + to->stroke.dash.array.push(from->stroke.dash.array[i]); + } + } + } + if (from->stroke.flags & SvgStrokeFlags::DashOffset) { + to->stroke.dash.offset = from->stroke.dash.offset; + } + if (from->stroke.flags & SvgStrokeFlags::Cap) { + to->stroke.cap = from->stroke.cap; + } + if (from->stroke.flags & SvgStrokeFlags::Join) { + to->stroke.join = from->stroke.join; + } + if (from->stroke.flags & SvgStrokeFlags::Miterlimit) { + to->stroke.miterlimit = from->stroke.miterlimit; + } +} + + +static void _copyAttr(SvgNode* to, const SvgNode* from) +{ + //Copy matrix attribute + if (from->transform) { + to->transform = (Matrix*)malloc(sizeof(Matrix)); + if (to->transform) *to->transform = *from->transform; + } + //Copy style attribute + _styleCopy(to->style, from->style); + to->style->flags = (to->style->flags | from->style->flags); + if (from->style->clipPath.url) { + if (to->style->clipPath.url) free(to->style->clipPath.url); + to->style->clipPath.url = strdup(from->style->clipPath.url); + } + if (from->style->mask.url) { + if (to->style->mask.url) free(to->style->mask.url); + to->style->mask.url = strdup(from->style->mask.url); + } + + //Copy node attribute + switch (from->type) { + case SvgNodeType::Circle: { + to->node.circle.cx = from->node.circle.cx; + to->node.circle.cy = from->node.circle.cy; + to->node.circle.r = from->node.circle.r; + break; + } + case SvgNodeType::Ellipse: { + to->node.ellipse.cx = from->node.ellipse.cx; + to->node.ellipse.cy = from->node.ellipse.cy; + to->node.ellipse.rx = from->node.ellipse.rx; + to->node.ellipse.ry = from->node.ellipse.ry; + break; + } + case SvgNodeType::Rect: { + to->node.rect.x = from->node.rect.x; + to->node.rect.y = from->node.rect.y; + to->node.rect.w = from->node.rect.w; + to->node.rect.h = from->node.rect.h; + to->node.rect.rx = from->node.rect.rx; + to->node.rect.ry = from->node.rect.ry; + to->node.rect.hasRx = from->node.rect.hasRx; + to->node.rect.hasRy = from->node.rect.hasRy; + break; + } + case SvgNodeType::Line: { + to->node.line.x1 = from->node.line.x1; + to->node.line.y1 = from->node.line.y1; + to->node.line.x2 = from->node.line.x2; + to->node.line.y2 = from->node.line.y2; + break; + } + case SvgNodeType::Path: { + if (from->node.path.path) { + if (to->node.path.path) free(to->node.path.path); + to->node.path.path = strdup(from->node.path.path); + } + break; + } + case SvgNodeType::Polygon: { + if ((to->node.polygon.pts.count = from->node.polygon.pts.count)) { + to->node.polygon.pts = from->node.polygon.pts; + } + break; + } + case SvgNodeType::Polyline: { + if ((to->node.polyline.pts.count = from->node.polyline.pts.count)) { + to->node.polyline.pts = from->node.polyline.pts; + } + break; + } + case SvgNodeType::Image: { + to->node.image.x = from->node.image.x; + to->node.image.y = from->node.image.y; + to->node.image.w = from->node.image.w; + to->node.image.h = from->node.image.h; + if (from->node.image.href) { + if (to->node.image.href) free(to->node.image.href); + to->node.image.href = strdup(from->node.image.href); + } + break; + } + case SvgNodeType::Use: { + to->node.use.x = from->node.use.x; + to->node.use.y = from->node.use.y; + to->node.use.w = from->node.use.w; + to->node.use.h = from->node.use.h; + to->node.use.isWidthSet = from->node.use.isWidthSet; + to->node.use.isHeightSet = from->node.use.isHeightSet; + to->node.use.symbol = from->node.use.symbol; + break; + } + default: { + break; + } + } +} + + +static void _cloneNode(SvgNode* from, SvgNode* parent, int depth) +{ + /* Exception handling: Prevent invalid SVG data input. + The size is the arbitrary value, we need an experimental size. */ + if (depth == 8192) { + TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); + return; + } + + SvgNode* newNode; + if (!from || !parent || from == parent) return; + + newNode = _createNode(parent, from->type); + if (!newNode) return; + + _styleInherit(newNode->style, parent->style); + _copyAttr(newNode, from); + + auto child = from->child.data; + for (uint32_t i = 0; i < from->child.count; ++i, ++child) { + _cloneNode(*child, newNode, depth + 1); + } +} + + +static void _clonePostponedNodes(Array* cloneNodes, SvgNode* doc) +{ + for (uint32_t i = 0; i < cloneNodes->count; ++i) { + auto nodeIdPair = (*cloneNodes)[i]; + auto defs = _getDefsNode(nodeIdPair.node); + auto nodeFrom = _findNodeById(defs, nodeIdPair.id); + if (!nodeFrom) nodeFrom = _findNodeById(doc, nodeIdPair.id); + _cloneNode(nodeFrom, nodeIdPair.node, 0); + if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) { + nodeIdPair.node->node.use.symbol = nodeFrom; + } + free(nodeIdPair.id); + } +} + + +static constexpr struct +{ + const char* tag; + size_t sz; +} popArray[] = { + {"g", sizeof("g")}, + {"svg", sizeof("svg")}, + {"defs", sizeof("defs")}, + {"mask", sizeof("mask")}, + {"clipPath", sizeof("clipPath")}, + {"style", sizeof("style")}, + {"symbol", sizeof("symbol")} +}; + + +static void _svgLoaderParserXmlClose(SvgLoaderData* loader, const char* content) +{ + content = _skipSpace(content, nullptr); + + for (unsigned int i = 0; i < sizeof(popArray) / sizeof(popArray[0]); i++) { + if (!strncmp(content, popArray[i].tag, popArray[i].sz - 1)) { + loader->stack.pop(); + break; + } + } + + loader->level--; +} + + +static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length, bool empty) +{ + const char* attrs = nullptr; + int attrsLength = 0; + int sz = length; + char tagName[20] = ""; + FactoryMethod method; + GradientFactoryMethod gradientMethod; + SvgNode *node = nullptr, *parent = nullptr; + loader->level++; + attrs = simpleXmlFindAttributesTag(content, length); + + if (!attrs) { + //Parse the empty tag + attrs = content; + while ((attrs != nullptr) && *attrs != '>') attrs++; + if (empty) attrs--; + } + + if (attrs) { + //Find out the tag name starting from content till sz length + sz = attrs - content; + while ((sz > 0) && (isspace(content[sz - 1]))) sz--; + if ((unsigned)sz >= sizeof(tagName)) return; + strncpy(tagName, content, sz); + tagName[sz] = '\0'; + attrsLength = length - sz; + } + + if ((method = _findGroupFactory(tagName))) { + //Group + if (empty) return; + if (!loader->doc) { + if (strcmp(tagName, "svg")) return; //Not a valid svg document + node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); + loader->doc = node; + } else { + if (!strcmp(tagName, "svg")) return; //Already loaded (SvgNodeType::Doc) tag + if (loader->stack.count > 0) parent = loader->stack.last(); + else parent = loader->doc; + if (!strcmp(tagName, "style")) { + // TODO: For now only the first style node is saved. After the css id selector + // is introduced this if condition shouldin't be necessary any more + if (!loader->cssStyle) { + node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); + loader->cssStyle = node; + loader->doc->node.doc.style = node; + loader->style = true; + } + } else { + node = method(loader, parent, attrs, attrsLength, simpleXmlParseAttributes); + } + } + + if (!node) return; + if (node->type != SvgNodeType::Defs || !empty) { + loader->stack.push(node); + } + } else if ((method = _findGraphicsFactory(tagName))) { + if (loader->stack.count > 0) parent = loader->stack.last(); + else parent = loader->doc; + node = method(loader, parent, attrs, attrsLength, simpleXmlParseAttributes); + } else if ((gradientMethod = _findGradientFactory(tagName))) { + SvgStyleGradient* gradient; + gradient = gradientMethod(loader, attrs, attrsLength); + //FIXME: The current parsing structure does not distinguish end tags. + // There is no way to know if the currently parsed gradient is in defs. + // If a gradient is declared outside of defs after defs is set, it is included in the gradients of defs. + // But finally, the loader has a gradient style list regardless of defs. + // This is only to support this when multiple gradients are declared, even if no defs are declared. + // refer to: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/defs + if (loader->def && loader->doc->node.doc.defs) { + loader->def->node.defs.gradients.push(gradient); + } else { + loader->gradients.push(gradient); + } + loader->latestGradient = gradient; + } else if (!strcmp(tagName, "stop")) { + if (!loader->latestGradient) { + TVGLOG("SVG", "Stop element is used outside of the Gradient element"); + return; + } + /* default value for opacity */ + loader->svgParse->gradStop = {0.0f, 0, 0, 0, 255}; + loader->svgParse->flags = SvgStopStyleFlags::StopDefault; + simpleXmlParseAttributes(attrs, attrsLength, _attrParseStops, loader); + loader->latestGradient->stops.push(loader->svgParse->gradStop); + } else if (!isIgnoreUnsupportedLogElements(tagName)) { + TVGLOG("SVG", "Unsupported elements used [Elements: %s]", tagName); + } +} + + +static void _svgLoaderParserXmlCssStyle(SvgLoaderData* loader, const char* content, unsigned int length) +{ + char* tag; + char* name; + const char* attrs = nullptr; + unsigned int attrsLength = 0; + + FactoryMethod method; + GradientFactoryMethod gradientMethod; + SvgNode *node = nullptr; + + while (auto next = simpleXmlParseCSSAttribute(content, length, &tag, &name, &attrs, &attrsLength)) { + if ((method = _findGroupFactory(tag))) { + if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); + } else if ((method = _findGraphicsFactory(tag))) { + if ((node = method(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); + } else if ((gradientMethod = _findGradientFactory(tag))) { + TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); + } else if (!strcmp(tag, "stop")) { + TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); + } else if (!strcmp(tag, "all")) { + if ((node = _createCssStyleNode(loader, loader->cssStyle, attrs, attrsLength, simpleXmlParseW3CAttribute))) node->id = _copyId(name); + } else if (!isIgnoreUnsupportedLogElements(tag)) { + TVGLOG("SVG", "Unsupported elements used in the internal CSS style sheets [Elements: %s]", tag); + } + + length -= next - content; + content = next; + + free(tag); + free(name); + } + loader->style = false; +} + + +static bool _svgLoaderParser(void* data, SimpleXMLType type, const char* content, unsigned int length) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + + switch (type) { + case SimpleXMLType::Open: { + _svgLoaderParserXmlOpen(loader, content, length, false); + break; + } + case SimpleXMLType::OpenEmpty: { + _svgLoaderParserXmlOpen(loader, content, length, true); + break; + } + case SimpleXMLType::Close: { + _svgLoaderParserXmlClose(loader, content); + break; + } + case SimpleXMLType::Data: + case SimpleXMLType::CData: { + if (loader->style) _svgLoaderParserXmlCssStyle(loader, content, length); + break; + } + case SimpleXMLType::DoctypeChild: { + break; + } + case SimpleXMLType::Ignored: + case SimpleXMLType::Comment: + case SimpleXMLType::Doctype: { + break; + } + default: { + break; + } + } + + return true; +} + + +static void _inefficientNodeCheck(TVG_UNUSED SvgNode* node) +{ +#ifdef THORVG_LOG_ENABLED + auto type = simpleXmlNodeTypeToString(node->type); + + if (!node->display && node->type != SvgNodeType::ClipPath && node->type != SvgNodeType::Symbol) TVGLOG("SVG", "Inefficient elements used [Display is none][Node Type : %s]", type); + if (node->style->opacity == 0) TVGLOG("SVG", "Inefficient elements used [Opacity is zero][Node Type : %s]", type); + if (node->style->fill.opacity == 0 && node->style->stroke.opacity == 0) TVGLOG("SVG", "Inefficient elements used [Fill opacity and stroke opacity are zero][Node Type : %s]", type); + + switch (node->type) { + case SvgNodeType::Path: { + if (!node->node.path.path) TVGLOG("SVG", "Inefficient elements used [Empty path][Node Type : %s]", type); + break; + } + case SvgNodeType::Ellipse: { + if (node->node.ellipse.rx == 0 && node->node.ellipse.ry == 0) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); + break; + } + case SvgNodeType::Polygon: + case SvgNodeType::Polyline: { + if (node->node.polygon.pts.count < 2) TVGLOG("SVG", "Inefficient elements used [Invalid Polygon][Node Type : %s]", type); + break; + } + case SvgNodeType::Circle: { + if (node->node.circle.r == 0) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); + break; + } + case SvgNodeType::Rect: { + if (node->node.rect.w == 0 && node->node.rect.h) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); + break; + } + case SvgNodeType::Line: { + if (node->node.line.x1 == node->node.line.x2 && node->node.line.y1 == node->node.line.y2) TVGLOG("SVG", "Inefficient elements used [Size is zero][Node Type : %s]", type); + break; + } + default: break; + } +#endif +} + + +static void _updateStyle(SvgNode* node, SvgStyleProperty* parentStyle) +{ + _styleInherit(node->style, parentStyle); + _inefficientNodeCheck(node); + + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + _updateStyle(*child, node->style); + } +} + + +static SvgStyleGradient* _gradientDup(SvgLoaderData* loader, Array* gradients, const char* id) +{ + SvgStyleGradient* result = nullptr; + + auto gradList = gradients->data; + + for (uint32_t i = 0; i < gradients->count; ++i) { + if ((*gradList)->id && !strcmp((*gradList)->id, id)) { + result = _cloneGradient(*gradList); + break; + } + ++gradList; + } + + if (result && result->ref) { + gradList = gradients->data; + for (uint32_t i = 0; i < gradients->count; ++i) { + if ((*gradList)->id && !strcmp((*gradList)->id, result->ref)) { + _inheritGradient(loader, result, *gradList); + break; + } + ++gradList; + } + } + + return result; +} + + +static void _updateGradient(SvgLoaderData* loader, SvgNode* node, Array* gradients) +{ + if (node->child.count > 0) { + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + _updateGradient(loader, *child, gradients); + } + } else { + if (node->style->fill.paint.url) { + auto newGrad = _gradientDup(loader, gradients, node->style->fill.paint.url); + if (newGrad) { + if (node->style->fill.paint.gradient) { + node->style->fill.paint.gradient->clear(); + free(node->style->fill.paint.gradient); + } + node->style->fill.paint.gradient = newGrad; + } + } + if (node->style->stroke.paint.url) { + auto newGrad = _gradientDup(loader, gradients, node->style->stroke.paint.url); + if (newGrad) { + if (node->style->stroke.paint.gradient) { + node->style->stroke.paint.gradient->clear(); + free(node->style->stroke.paint.gradient); + } + node->style->stroke.paint.gradient = newGrad; + } + } + } +} + + +static void _updateComposite(SvgNode* node, SvgNode* root) +{ + if (node->style->clipPath.url && !node->style->clipPath.node) { + SvgNode* findResult = _findNodeById(root, node->style->clipPath.url); + if (findResult) node->style->clipPath.node = findResult; + } + if (node->style->mask.url && !node->style->mask.node) { + SvgNode* findResult = _findNodeById(root, node->style->mask.url); + if (findResult) node->style->mask.node = findResult; + } + if (node->child.count > 0) { + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + _updateComposite(*child, root); + } + } +} + + +static void _freeNodeStyle(SvgStyleProperty* style) +{ + if (!style) return; + + //style->clipPath.node and style->mask.node has only the addresses of node. Therefore, node is released from _freeNode. + free(style->clipPath.url); + free(style->mask.url); + free(style->cssClass); + + if (style->fill.paint.gradient) { + style->fill.paint.gradient->clear(); + free(style->fill.paint.gradient); + } + if (style->stroke.paint.gradient) { + style->stroke.paint.gradient->clear(); + free(style->stroke.paint.gradient); + } + free(style->fill.paint.url); + free(style->stroke.paint.url); + style->stroke.dash.array.reset(); + free(style); +} + + +static void _freeNode(SvgNode* node) +{ + if (!node) return; + + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + _freeNode(*child); + } + node->child.reset(); + + free(node->id); + free(node->transform); + _freeNodeStyle(node->style); + switch (node->type) { + case SvgNodeType::Path: { + free(node->node.path.path); + break; + } + case SvgNodeType::Polygon: { + free(node->node.polygon.pts.data); + break; + } + case SvgNodeType::Polyline: { + free(node->node.polyline.pts.data); + break; + } + case SvgNodeType::Doc: { + _freeNode(node->node.doc.defs); + _freeNode(node->node.doc.style); + break; + } + case SvgNodeType::Defs: { + auto gradients = node->node.defs.gradients.data; + for (size_t i = 0; i < node->node.defs.gradients.count; ++i) { + (*gradients)->clear(); + free(*gradients); + ++gradients; + } + node->node.defs.gradients.reset(); + break; + } + case SvgNodeType::Image: { + free(node->node.image.href); + break; + } + default: { + break; + } + } + free(node); +} + + +static bool _svgLoaderParserForValidCheckXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length) +{ + const char* attrs = nullptr; + int sz = length; + char tagName[20] = ""; + FactoryMethod method; + SvgNode *node = nullptr; + int attrsLength = 0; + loader->level++; + attrs = simpleXmlFindAttributesTag(content, length); + + if (!attrs) { + //Parse the empty tag + attrs = content; + while ((attrs != nullptr) && *attrs != '>') attrs++; + } + + if (attrs) { + sz = attrs - content; + while ((sz > 0) && (isspace(content[sz - 1]))) sz--; + if ((unsigned)sz >= sizeof(tagName)) return false; + strncpy(tagName, content, sz); + tagName[sz] = '\0'; + attrsLength = length - sz; + } + + if ((method = _findGroupFactory(tagName))) { + if (!loader->doc) { + if (strcmp(tagName, "svg")) return true; //Not a valid svg document + node = method(loader, nullptr, attrs, attrsLength, simpleXmlParseAttributes); + loader->doc = node; + loader->stack.push(node); + return false; + } + } + return true; +} + + +static bool _svgLoaderParserForValidCheck(void* data, SimpleXMLType type, const char* content, unsigned int length) +{ + SvgLoaderData* loader = (SvgLoaderData*)data; + bool res = true;; + + switch (type) { + case SimpleXMLType::Open: + case SimpleXMLType::OpenEmpty: { + //If 'res' is false, it means tag is found. + res = _svgLoaderParserForValidCheckXmlOpen(loader, content, length); + break; + } + default: { + break; + } + } + + return res; +} + + +void SvgLoader::clear(bool all) +{ + //flush out the intermediate data + free(loaderData.svgParse); + loaderData.svgParse = nullptr; + + for (auto gradient = loaderData.gradients.data; gradient < loaderData.gradients.end(); ++gradient) { + (*gradient)->clear(); + free(*gradient); + } + loaderData.gradients.reset(); + + _freeNode(loaderData.doc); + loaderData.doc = nullptr; + loaderData.stack.reset(); + + if (!all) return; + + for (auto p = loaderData.images.data; p < loaderData.images.end(); ++p) { + free(*p); + } + loaderData.images.reset(); + + if (copy) free((char*)content); + size = 0; + content = nullptr; + copy = false; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +SvgLoader::SvgLoader() +{ +} + + +SvgLoader::~SvgLoader() +{ + close(); +} + + +void SvgLoader::run(unsigned tid) +{ + //According to the SVG standard the value of the width/height of the viewbox set to 0 disables rendering + if ((viewFlag & SvgViewFlag::Viewbox) && (fabsf(vw) <= FLT_EPSILON || fabsf(vh) <= FLT_EPSILON)) { + TVGLOG("SVG", "The width and/or height set to 0 - rendering disabled."); + root = Scene::gen(); + return; + } + + if (!simpleXmlParse(content, size, true, _svgLoaderParser, &(loaderData))) return; + + if (loaderData.doc) { + auto defs = loaderData.doc->node.doc.defs; + + if (loaderData.nodesToStyle.count > 0) cssApplyStyleToPostponeds(loaderData.nodesToStyle, loaderData.cssStyle); + if (loaderData.cssStyle) cssUpdateStyle(loaderData.doc, loaderData.cssStyle); + + if (loaderData.cloneNodes.count > 0) _clonePostponedNodes(&loaderData.cloneNodes, loaderData.doc); + + _updateComposite(loaderData.doc, loaderData.doc); + if (defs) _updateComposite(loaderData.doc, defs); + + _updateStyle(loaderData.doc, nullptr); + if (defs) _updateStyle(defs, nullptr); + + if (loaderData.gradients.count > 0) _updateGradient(&loaderData, loaderData.doc, &loaderData.gradients); + if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients); + } + root = svgSceneBuild(loaderData, {vx, vy, vw, vh}, w, h, align, meetOrSlice, svgPath, viewFlag); + + //In case no viewbox and width/height data is provided the completion of loading + //has to be forced, in order to establish this data based on the whole picture. + if (!(viewFlag & SvgViewFlag::Viewbox)) { + //Override viewbox & size again after svg loading. + vx = loaderData.doc->node.doc.vx; + vy = loaderData.doc->node.doc.vy; + vw = loaderData.doc->node.doc.vw; + vh = loaderData.doc->node.doc.vh; + w = loaderData.doc->node.doc.w; + h = loaderData.doc->node.doc.h; + } + + clear(false); +} + + +bool SvgLoader::header() +{ + //For valid check, only tag is parsed first. + //If the tag is found, the loaded file is valid and stores viewbox information. + //After that, the remaining content data is parsed in order with async. + loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser)); + if (!loaderData.svgParse) return false; + + loaderData.svgParse->flags = SvgStopStyleFlags::StopDefault; + viewFlag = SvgViewFlag::None; + + simpleXmlParse(content, size, true, _svgLoaderParserForValidCheck, &(loaderData)); + + if (loaderData.doc && loaderData.doc->type == SvgNodeType::Doc) { + viewFlag = loaderData.doc->node.doc.viewFlag; + align = loaderData.doc->node.doc.align; + meetOrSlice = loaderData.doc->node.doc.meetOrSlice; + + if (viewFlag & SvgViewFlag::Viewbox) { + vx = loaderData.doc->node.doc.vx; + vy = loaderData.doc->node.doc.vy; + vw = loaderData.doc->node.doc.vw; + vh = loaderData.doc->node.doc.vh; + + if (viewFlag & SvgViewFlag::Width) w = loaderData.doc->node.doc.w; + else { + w = loaderData.doc->node.doc.vw; + if (viewFlag & SvgViewFlag::WidthInPercent) { + w *= loaderData.doc->node.doc.w; + viewFlag = (viewFlag ^ SvgViewFlag::WidthInPercent); + } + viewFlag = (viewFlag | SvgViewFlag::Width); + } + if (viewFlag & SvgViewFlag::Height) h = loaderData.doc->node.doc.h; + else { + h = loaderData.doc->node.doc.vh; + if (viewFlag & SvgViewFlag::HeightInPercent) { + h *= loaderData.doc->node.doc.h; + viewFlag = (viewFlag ^ SvgViewFlag::HeightInPercent); + } + viewFlag = (viewFlag | SvgViewFlag::Height); + } + //In case no viewbox and width/height data is provided the completion of loading + //has to be forced, in order to establish this data based on the whole picture. + } else { + //Before loading, set default viewbox & size if they are empty + vx = vy = 0.0f; + if (viewFlag & SvgViewFlag::Width) { + vw = w = loaderData.doc->node.doc.w; + } else { + vw = 1.0f; + if (viewFlag & SvgViewFlag::WidthInPercent) { + w = loaderData.doc->node.doc.w; + } else w = 1.0f; + } + + if (viewFlag & SvgViewFlag::Height) { + vh = h = loaderData.doc->node.doc.h; + } else { + vh = 1.0f; + if (viewFlag & SvgViewFlag::HeightInPercent) { + h = loaderData.doc->node.doc.h; + } else h = 1.0f; + } + + run(0); + } + + return true; + } + + TVGLOG("SVG", "No SVG File. There is no "); + return false; +} + + +bool SvgLoader::open(const char* data, uint32_t size, bool copy) +{ + clear(); + + if (copy) { + content = (char*)malloc(size); + if (!content) return false; + memcpy((char*)content, data, size); + } else content = data; + + this->size = size; + this->copy = copy; + + return header(); +} + + +bool SvgLoader::open(const string& path) +{ + clear(); + + ifstream f; + f.open(path); + + if (!f.is_open()) return false; + + svgPath = path; + getline(f, filePath, '\0'); + f.close(); + + if (filePath.empty()) return false; + + content = filePath.c_str(); + size = filePath.size(); + + return header(); +} + + +bool SvgLoader::resize(Paint* paint, float w, float h) +{ + if (!paint) return false; + + auto sx = w / this->w; + auto sy = h / this->h; + Matrix m = {sx, 0, 0, 0, sy, 0, 0, 0, 1}; + paint->transform(m); + + return true; +} + + +bool SvgLoader::read() +{ + if (!content || size == 0) return false; + + //the loading has been already completed in header() + if (root) return true; + + TaskScheduler::request(this); + + return true; +} + + +bool SvgLoader::close() +{ + this->done(); + + clear(); + + return true; +} + + +unique_ptr SvgLoader::paint() +{ + this->done(); + return std::move(root); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.h b/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.h new file mode 100644 index 0000000..38ead0e --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgLoader.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_LOADER_H_ +#define _TVG_SVG_LOADER_H_ + +#include "tvgTaskScheduler.h" +#include "tvgSvgLoaderCommon.h" + +class SvgLoader : public LoadModule, public Task +{ +public: + string filePath; + string svgPath = ""; + const char* content = nullptr; + uint32_t size = 0; + + SvgLoaderData loaderData; + unique_ptr root; + + bool copy = false; + + SvgLoader(); + ~SvgLoader(); + + using LoadModule::open; + bool open(const string& path) override; + bool open(const char* data, uint32_t size, bool copy) override; + bool resize(Paint* paint, float w, float h) override; + bool read() override; + bool close() override; + + unique_ptr paint() override; + +private: + SvgViewFlag viewFlag = SvgViewFlag::None; + AspectRatioAlign align = AspectRatioAlign::XMidYMid; + AspectRatioMeetOrSlice meetOrSlice = AspectRatioMeetOrSlice::Meet; + float vx = 0; + float vy = 0; + float vw = 0; + float vh = 0; + + bool header(); + void clear(bool all = true); + void run(unsigned tid) override; +}; + + +#endif //_TVG_SVG_LOADER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgLoaderCommon.h b/libraries/lvgl/src/libs/thorvg/tvgSvgLoaderCommon.h new file mode 100644 index 0000000..6df7237 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgLoaderCommon.h @@ -0,0 +1,576 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_LOADER_COMMON_H_ +#define _TVG_SVG_LOADER_COMMON_H_ + +#include "tvgCommon.h" +#include "tvgArray.h" + +struct SvgNode; +struct SvgStyleGradient; + +//NOTE: Please update simpleXmlNodeTypeToString() as well. +enum class SvgNodeType +{ + Doc, + G, + Defs, + Animation, + Arc, + Circle, + Ellipse, + Image, + Line, + Path, + Polygon, + Polyline, + Rect, + Text, + TextArea, + Tspan, + Use, + Video, + ClipPath, + Mask, + CssStyle, + Symbol, + Unknown +}; + +/* +// TODO - remove? +enum class SvgLengthType +{ + Percent, + Px, + Pc, + Pt, + Mm, + Cm, + In, +}; +*/ + +enum class SvgFillFlags +{ + Paint = 0x01, + Opacity = 0x02, + Gradient = 0x04, + FillRule = 0x08, + ClipPath = 0x16 +}; + +constexpr bool operator &(SvgFillFlags a, SvgFillFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgFillFlags operator |(SvgFillFlags a, SvgFillFlags b) +{ + return SvgFillFlags(int(a) | int(b)); +} + +enum class SvgStrokeFlags +{ + Paint = 0x1, + Opacity = 0x2, + Gradient = 0x4, + Scale = 0x8, + Width = 0x10, + Cap = 0x20, + Join = 0x40, + Dash = 0x80, + Miterlimit = 0x100, + DashOffset = 0x200 +}; + +constexpr bool operator &(SvgStrokeFlags a, SvgStrokeFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStrokeFlags operator |(SvgStrokeFlags a, SvgStrokeFlags b) +{ + return SvgStrokeFlags(int(a) | int(b)); +} + + +enum class SvgGradientType +{ + Linear, + Radial +}; + +enum class SvgStyleFlags +{ + Color = 0x01, + Fill = 0x02, + FillRule = 0x04, + FillOpacity = 0x08, + Opacity = 0x010, + Stroke = 0x20, + StrokeWidth = 0x40, + StrokeLineJoin = 0x80, + StrokeLineCap = 0x100, + StrokeOpacity = 0x200, + StrokeDashArray = 0x400, + Transform = 0x800, + ClipPath = 0x1000, + Mask = 0x2000, + MaskType = 0x4000, + Display = 0x8000, + PaintOrder = 0x10000, + StrokeMiterlimit = 0x20000, + StrokeDashOffset = 0x40000, +}; + +constexpr bool operator &(SvgStyleFlags a, SvgStyleFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStyleFlags operator |(SvgStyleFlags a, SvgStyleFlags b) +{ + return SvgStyleFlags(int(a) | int(b)); +} + +enum class SvgStopStyleFlags +{ + StopDefault = 0x0, + StopOpacity = 0x01, + StopColor = 0x02 +}; + +constexpr bool operator &(SvgStopStyleFlags a, SvgStopStyleFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStopStyleFlags operator |(SvgStopStyleFlags a, SvgStopStyleFlags b) +{ + return SvgStopStyleFlags(int(a) | int(b)); +} + +enum class SvgGradientFlags +{ + None = 0x0, + GradientUnits = 0x1, + SpreadMethod = 0x2, + X1 = 0x4, + X2 = 0x8, + Y1 = 0x10, + Y2 = 0x20, + Cx = 0x40, + Cy = 0x80, + R = 0x100, + Fx = 0x200, + Fy = 0x400, + Fr = 0x800 +}; + +constexpr bool operator &(SvgGradientFlags a, SvgGradientFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgGradientFlags operator |(SvgGradientFlags a, SvgGradientFlags b) +{ + return SvgGradientFlags(int(a) | int(b)); +} + +enum class SvgFillRule +{ + Winding = 0, + OddEven = 1 +}; + +enum class SvgMaskType +{ + Luminance = 0, + Alpha +}; + +//Length type to recalculate %, pt, pc, mm, cm etc +enum class SvgParserLengthType +{ + Vertical, + Horizontal, + //In case of, for example, radius of radial gradient + Other +}; + +enum class SvgViewFlag +{ + None = 0x0, + Width = 0x01, //viewPort width + Height = 0x02, //viewPort height + Viewbox = 0x04, //viewBox x,y,w,h - used only if all 4 are correctly set + WidthInPercent = 0x08, + HeightInPercent = 0x10 +}; + +constexpr bool operator &(SvgViewFlag a, SvgViewFlag b) +{ + return static_cast(a) & static_cast(b); +} + +constexpr SvgViewFlag operator |(SvgViewFlag a, SvgViewFlag b) +{ + return SvgViewFlag(int(a) | int(b)); +} + +constexpr SvgViewFlag operator ^(SvgViewFlag a, SvgViewFlag b) +{ + return SvgViewFlag(int(a) ^ int(b)); +} + +enum class AspectRatioAlign +{ + None, + XMinYMin, + XMidYMin, + XMaxYMin, + XMinYMid, + XMidYMid, + XMaxYMid, + XMinYMax, + XMidYMax, + XMaxYMax +}; + +enum class AspectRatioMeetOrSlice +{ + Meet, + Slice +}; + +struct SvgDocNode +{ + float w; //unit: point or in percentage see: SvgViewFlag + float h; //unit: point or in percentage see: SvgViewFlag + float vx; + float vy; + float vw; + float vh; + SvgViewFlag viewFlag; + SvgNode* defs; + SvgNode* style; + AspectRatioAlign align; + AspectRatioMeetOrSlice meetOrSlice; +}; + +struct SvgGNode +{ +}; + +struct SvgDefsNode +{ + Array gradients; +}; + +struct SvgSymbolNode +{ + float w, h; + float vx, vy, vw, vh; + AspectRatioAlign align; + AspectRatioMeetOrSlice meetOrSlice; + bool overflowVisible; + bool hasViewBox; + bool hasWidth; + bool hasHeight; +}; + +struct SvgUseNode +{ + float x, y, w, h; + bool isWidthSet; + bool isHeightSet; + SvgNode* symbol; +}; + +struct SvgEllipseNode +{ + float cx; + float cy; + float rx; + float ry; +}; + +struct SvgCircleNode +{ + float cx; + float cy; + float r; +}; + +struct SvgRectNode +{ + float x; + float y; + float w; + float h; + float rx; + float ry; + bool hasRx; + bool hasRy; +}; + +struct SvgLineNode +{ + float x1; + float y1; + float x2; + float y2; +}; + +struct SvgImageNode +{ + float x, y, w, h; + char* href; +}; + +struct SvgPathNode +{ + char* path; +}; + +struct SvgPolygonNode +{ + Array pts; +}; + +struct SvgClipNode +{ + bool userSpace; +}; + +struct SvgMaskNode +{ + SvgMaskType type; + bool userSpace; +}; + +struct SvgCssStyleNode +{ +}; + +struct SvgLinearGradient +{ + float x1; + float y1; + float x2; + float y2; + bool isX1Percentage; + bool isY1Percentage; + bool isX2Percentage; + bool isY2Percentage; +}; + +struct SvgRadialGradient +{ + float cx; + float cy; + float fx; + float fy; + float r; + float fr; + bool isCxPercentage; + bool isCyPercentage; + bool isFxPercentage; + bool isFyPercentage; + bool isRPercentage; + bool isFrPercentage; +}; + +struct SvgComposite +{ + char *url; + SvgNode* node; + bool applying; //flag for checking circular dependency. +}; + +struct SvgColor +{ + uint8_t r; + uint8_t g; + uint8_t b; +}; + +struct SvgPaint +{ + SvgStyleGradient* gradient; + char *url; + SvgColor color; + bool none; + bool curColor; +}; + +struct SvgDash +{ + Array array; + float offset; +}; + +struct SvgStyleGradient +{ + SvgGradientType type; + char* id; + char* ref; + FillSpread spread; + SvgRadialGradient* radial; + SvgLinearGradient* linear; + Matrix* transform; + Array stops; + SvgGradientFlags flags; + bool userSpace; + + void clear() + { + stops.reset(); + free(transform); + free(radial); + free(linear); + free(ref); + free(id); + } +}; + +struct SvgStyleFill +{ + SvgFillFlags flags; + SvgPaint paint; + int opacity; + FillRule fillRule; +}; + +struct SvgStyleStroke +{ + SvgStrokeFlags flags; + SvgPaint paint; + int opacity; + float scale; + float width; + float centered; + StrokeCap cap; + StrokeJoin join; + float miterlimit; + SvgDash dash; +}; + +struct SvgStyleProperty +{ + SvgStyleFill fill; + SvgStyleStroke stroke; + SvgComposite clipPath; + SvgComposite mask; + int opacity; + SvgColor color; + bool curColorSet; + char* cssClass; + bool paintOrder; //true if default (fill, stroke), false otherwise + SvgStyleFlags flags; + SvgStyleFlags flagsImportance; //indicates the importance of the flag - if set, higher priority is applied (https://drafts.csswg.org/css-cascade-4/#importance) +}; + +struct SvgNode +{ + SvgNodeType type; + SvgNode* parent; + Array child; + char *id; + SvgStyleProperty *style; + Matrix* transform; + union { + SvgGNode g; + SvgDocNode doc; + SvgDefsNode defs; + SvgUseNode use; + SvgCircleNode circle; + SvgEllipseNode ellipse; + SvgPolygonNode polygon; + SvgPolygonNode polyline; + SvgRectNode rect; + SvgPathNode path; + SvgLineNode line; + SvgImageNode image; + SvgMaskNode mask; + SvgClipNode clip; + SvgCssStyleNode cssStyle; + SvgSymbolNode symbol; + } node; + bool display; + ~SvgNode(); +}; + +struct SvgParser +{ + SvgNode* node; + SvgStyleGradient* styleGrad; + Fill::ColorStop gradStop; + SvgStopStyleFlags flags; + struct + { + float x, y, w, h; + } global; + struct + { + bool parsedFx; + bool parsedFy; + } gradient; +}; + +struct SvgNodeIdPair +{ + SvgNode* node; + char *id; +}; + +struct SvgLoaderData +{ + Array stack; + SvgNode* doc = nullptr; + SvgNode* def = nullptr; + SvgNode* cssStyle = nullptr; + Array gradients; + SvgStyleGradient* latestGradient = nullptr; //For stops + SvgParser* svgParse = nullptr; + Array cloneNodes; + Array nodesToStyle; + Array images; //embedded images + int level = 0; + bool result = false; + bool style = false; +}; + +struct Box +{ + float x, y, w, h; +}; + +#endif + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgPath.cpp b/libraries/lvgl/src/libs/thorvg/tvgSvgPath.cpp new file mode 100644 index 0000000..46ec157 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgPath.cpp @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +/* + * Copyright notice for the EFL: + + * Copyright (C) EFL developers (see AUTHORS) + + * All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#define _USE_MATH_DEFINES //Math Constants are not defined in Standard C/C++. + +#include +#include +#include +#include "tvgSvgLoaderCommon.h" +#include "tvgSvgPath.h" +#include "tvgStr.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static char* _skipComma(const char* content) +{ + while (*content && isspace(*content)) { + content++; + } + if (*content == ',') return (char*)content + 1; + return (char*)content; +} + + +static bool _parseNumber(char** content, float* number) +{ + char* end = NULL; + *number = strToFloat(*content, &end); + //If the start of string is not number + if ((*content) == end) return false; + //Skip comma if any + *content = _skipComma(end); + return true; +} + + +static bool _parseFlag(char** content, int* number) +{ + char* end = NULL; + if (*(*content) != '0' && *(*content) != '1') return false; + *number = *(*content) - '0'; + *content += 1; + end = *content; + *content = _skipComma(end); + + return true; +} + + +void _pathAppendArcTo(Array* cmds, Array* pts, Point* cur, Point* curCtl, float x, float y, float rx, float ry, float angle, bool largeArc, bool sweep) +{ + float cxp, cyp, cx, cy; + float sx, sy; + float cosPhi, sinPhi; + float dx2, dy2; + float x1p, y1p; + float x1p2, y1p2; + float rx2, ry2; + float lambda; + float c; + float at; + float theta1, deltaTheta; + float nat; + float delta, bcp; + float cosPhiRx, cosPhiRy; + float sinPhiRx, sinPhiRy; + float cosTheta1, sinTheta1; + int segments; + + //Some helpful stuff is available here: + //http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + sx = cur->x; + sy = cur->y; + + //If start and end points are identical, then no arc is drawn + if ((fabsf(x - sx) < (1.0f / 256.0f)) && (fabsf(y - sy) < (1.0f / 256.0f))) return; + + //Correction of out-of-range radii, see F6.6.1 (step 2) + rx = fabsf(rx); + ry = fabsf(ry); + + angle = angle * (float)M_PI / 180.0f; + cosPhi = cosf(angle); + sinPhi = sinf(angle); + dx2 = (sx - x) / 2.0f; + dy2 = (sy - y) / 2.0f; + x1p = cosPhi * dx2 + sinPhi * dy2; + y1p = cosPhi * dy2 - sinPhi * dx2; + x1p2 = x1p * x1p; + y1p2 = y1p * y1p; + rx2 = rx * rx; + ry2 = ry * ry; + lambda = (x1p2 / rx2) + (y1p2 / ry2); + + //Correction of out-of-range radii, see F6.6.2 (step 4) + if (lambda > 1.0f) { + //See F6.6.3 + float lambdaRoot = sqrtf(lambda); + + rx *= lambdaRoot; + ry *= lambdaRoot; + //Update rx2 and ry2 + rx2 = rx * rx; + ry2 = ry * ry; + } + + c = (rx2 * ry2) - (rx2 * y1p2) - (ry2 * x1p2); + + //Check if there is no possible solution + //(i.e. we can't do a square root of a negative value) + if (c < 0.0f) { + //Scale uniformly until we have a single solution + //(see F6.2) i.e. when c == 0.0 + float scale = sqrtf(1.0f - c / (rx2 * ry2)); + rx *= scale; + ry *= scale; + //Update rx2 and ry2 + rx2 = rx * rx; + ry2 = ry * ry; + + //Step 2 (F6.5.2) - simplified since c == 0.0 + cxp = 0.0f; + cyp = 0.0f; + //Step 3 (F6.5.3 first part) - simplified since cxp and cyp == 0.0 + cx = 0.0f; + cy = 0.0f; + } else { + //Complete c calculation + c = sqrtf(c / ((rx2 * y1p2) + (ry2 * x1p2))); + //Inverse sign if Fa == Fs + if (largeArc == sweep) c = -c; + + //Step 2 (F6.5.2) + cxp = c * (rx * y1p / ry); + cyp = c * (-ry * x1p / rx); + + //Step 3 (F6.5.3 first part) + cx = cosPhi * cxp - sinPhi * cyp; + cy = sinPhi * cxp + cosPhi * cyp; + } + + //Step 3 (F6.5.3 second part) we now have the center point of the ellipse + cx += (sx + x) / 2.0f; + cy += (sy + y) / 2.0f; + + //Sstep 4 (F6.5.4) + //We dont' use arccos (as per w3c doc), see + //http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm + //Note: atan2 (0.0, 1.0) == 0.0 + at = atan2(((y1p - cyp) / ry), ((x1p - cxp) / rx)); + theta1 = (at < 0.0f) ? 2.0f * (float)M_PI + at : at; + + nat = atan2(((-y1p - cyp) / ry), ((-x1p - cxp) / rx)); + deltaTheta = (nat < at) ? 2.0f * (float)M_PI - at + nat : nat - at; + + if (sweep) { + //Ensure delta theta < 0 or else add 360 degrees + if (deltaTheta < 0.0f) deltaTheta += (float)(2.0f * (float)M_PI); + } else { + //Ensure delta theta > 0 or else substract 360 degrees + if (deltaTheta > 0.0f) deltaTheta -= (float)(2.0f * (float)M_PI); + } + + //Add several cubic bezier to approximate the arc + //(smaller than 90 degrees) + //We add one extra segment because we want something + //Smaller than 90deg (i.e. not 90 itself) + segments = static_cast(fabsf(deltaTheta / float(M_PI_2)) + 1.0f); + delta = deltaTheta / segments; + + //http://www.stillhq.com/ctpfaq/2001/comp.text.pdf-faq-2001-04.txt (section 2.13) + bcp = 4.0f / 3.0f * (1.0f - cosf(delta / 2.0f)) / sinf(delta / 2.0f); + + cosPhiRx = cosPhi * rx; + cosPhiRy = cosPhi * ry; + sinPhiRx = sinPhi * rx; + sinPhiRy = sinPhi * ry; + + cosTheta1 = cosf(theta1); + sinTheta1 = sinf(theta1); + + for (int i = 0; i < segments; ++i) { + //End angle (for this segment) = current + delta + float c1x, c1y, ex, ey, c2x, c2y; + float theta2 = theta1 + delta; + float cosTheta2 = cosf(theta2); + float sinTheta2 = sinf(theta2); + Point p[3]; + + //First control point (based on start point sx,sy) + c1x = sx - bcp * (cosPhiRx * sinTheta1 + sinPhiRy * cosTheta1); + c1y = sy + bcp * (cosPhiRy * cosTheta1 - sinPhiRx * sinTheta1); + + //End point (for this segment) + ex = cx + (cosPhiRx * cosTheta2 - sinPhiRy * sinTheta2); + ey = cy + (sinPhiRx * cosTheta2 + cosPhiRy * sinTheta2); + + //Second control point (based on end point ex,ey) + c2x = ex + bcp * (cosPhiRx * sinTheta2 + sinPhiRy * cosTheta2); + c2y = ey + bcp * (sinPhiRx * sinTheta2 - cosPhiRy * cosTheta2); + cmds->push(PathCommand::CubicTo); + p[0] = {c1x, c1y}; + p[1] = {c2x, c2y}; + p[2] = {ex, ey}; + pts->push(p[0]); + pts->push(p[1]); + pts->push(p[2]); + *curCtl = p[1]; + *cur = p[2]; + + //Next start point is the current end point (same for angle) + sx = ex; + sy = ey; + theta1 = theta2; + //Avoid recomputations + cosTheta1 = cosTheta2; + sinTheta1 = sinTheta2; + } +} + +static int _numberCount(char cmd) +{ + int count = 0; + switch (cmd) { + case 'M': + case 'm': + case 'L': + case 'l': + case 'T': + case 't': { + count = 2; + break; + } + case 'C': + case 'c': + case 'E': + case 'e': { + count = 6; + break; + } + case 'H': + case 'h': + case 'V': + case 'v': { + count = 1; + break; + } + case 'S': + case 's': + case 'Q': + case 'q': { + count = 4; + break; + } + case 'A': + case 'a': { + count = 7; + break; + } + default: + break; + } + return count; +} + + +static bool _processCommand(Array* cmds, Array* pts, char cmd, float* arr, int count, Point* cur, Point* curCtl, Point* startPoint, bool *isQuadratic) +{ + switch (cmd) { + case 'm': + case 'l': + case 'c': + case 's': + case 'q': + case 't': { + for (int i = 0; i < count - 1; i += 2) { + arr[i] = arr[i] + cur->x; + arr[i + 1] = arr[i + 1] + cur->y; + } + break; + } + case 'h': { + arr[0] = arr[0] + cur->x; + break; + } + case 'v': { + arr[0] = arr[0] + cur->y; + break; + } + case 'a': { + arr[5] = arr[5] + cur->x; + arr[6] = arr[6] + cur->y; + break; + } + default: { + break; + } + } + + switch (cmd) { + case 'm': + case 'M': { + Point p = {arr[0], arr[1]}; + cmds->push(PathCommand::MoveTo); + pts->push(p); + *cur = {arr[0], arr[1]}; + *startPoint = {arr[0], arr[1]}; + break; + } + case 'l': + case 'L': { + Point p = {arr[0], arr[1]}; + cmds->push(PathCommand::LineTo); + pts->push(p); + *cur = {arr[0], arr[1]}; + break; + } + case 'c': + case 'C': { + Point p[3]; + cmds->push(PathCommand::CubicTo); + p[0] = {arr[0], arr[1]}; + p[1] = {arr[2], arr[3]}; + p[2] = {arr[4], arr[5]}; + pts->push(p[0]); + pts->push(p[1]); + pts->push(p[2]); + *curCtl = p[1]; + *cur = p[2]; + *isQuadratic = false; + break; + } + case 's': + case 'S': { + Point p[3], ctrl; + if ((cmds->count > 1) && (cmds->last() == PathCommand::CubicTo) && + !(*isQuadratic)) { + ctrl.x = 2 * cur->x - curCtl->x; + ctrl.y = 2 * cur->y - curCtl->y; + } else { + ctrl = *cur; + } + cmds->push(PathCommand::CubicTo); + p[0] = ctrl; + p[1] = {arr[0], arr[1]}; + p[2] = {arr[2], arr[3]}; + pts->push(p[0]); + pts->push(p[1]); + pts->push(p[2]); + *curCtl = p[1]; + *cur = p[2]; + *isQuadratic = false; + break; + } + case 'q': + case 'Q': { + Point p[3]; + float ctrl_x0 = (cur->x + 2 * arr[0]) * (1.0f / 3.0f); + float ctrl_y0 = (cur->y + 2 * arr[1]) * (1.0f / 3.0f); + float ctrl_x1 = (arr[2] + 2 * arr[0]) * (1.0f / 3.0f); + float ctrl_y1 = (arr[3] + 2 * arr[1]) * (1.0f / 3.0f); + cmds->push(PathCommand::CubicTo); + p[0] = {ctrl_x0, ctrl_y0}; + p[1] = {ctrl_x1, ctrl_y1}; + p[2] = {arr[2], arr[3]}; + pts->push(p[0]); + pts->push(p[1]); + pts->push(p[2]); + *curCtl = {arr[0], arr[1]}; + *cur = p[2]; + *isQuadratic = true; + break; + } + case 't': + case 'T': { + Point p[3], ctrl; + if ((cmds->count > 1) && (cmds->last() == PathCommand::CubicTo) && + *isQuadratic) { + ctrl.x = 2 * cur->x - curCtl->x; + ctrl.y = 2 * cur->y - curCtl->y; + } else { + ctrl = *cur; + } + float ctrl_x0 = (cur->x + 2 * ctrl.x) * (1.0f / 3.0f); + float ctrl_y0 = (cur->y + 2 * ctrl.y) * (1.0f / 3.0f); + float ctrl_x1 = (arr[0] + 2 * ctrl.x) * (1.0f / 3.0f); + float ctrl_y1 = (arr[1] + 2 * ctrl.y) * (1.0f / 3.0f); + cmds->push(PathCommand::CubicTo); + p[0] = {ctrl_x0, ctrl_y0}; + p[1] = {ctrl_x1, ctrl_y1}; + p[2] = {arr[0], arr[1]}; + pts->push(p[0]); + pts->push(p[1]); + pts->push(p[2]); + *curCtl = {ctrl.x, ctrl.y}; + *cur = p[2]; + *isQuadratic = true; + break; + } + case 'h': + case 'H': { + Point p = {arr[0], cur->y}; + cmds->push(PathCommand::LineTo); + pts->push(p); + cur->x = arr[0]; + break; + } + case 'v': + case 'V': { + Point p = {cur->x, arr[0]}; + cmds->push(PathCommand::LineTo); + pts->push(p); + cur->y = arr[0]; + break; + } + case 'z': + case 'Z': { + cmds->push(PathCommand::Close); + *cur = *startPoint; + break; + } + case 'a': + case 'A': { + _pathAppendArcTo(cmds, pts, cur, curCtl, arr[5], arr[6], arr[0], arr[1], arr[2], arr[3], arr[4]); + *cur = *curCtl = {arr[5], arr[6]}; + *isQuadratic = false; + break; + } + default: { + return false; + } + } + return true; +} + + +static char* _nextCommand(char* path, char* cmd, float* arr, int* count) +{ + int large, sweep; + + path = _skipComma(path); + if (isalpha(*path)) { + *cmd = *path; + path++; + *count = _numberCount(*cmd); + } else { + if (*cmd == 'm') *cmd = 'l'; + else if (*cmd == 'M') *cmd = 'L'; + } + if (*count == 7) { + //Special case for arc command + if (_parseNumber(&path, &arr[0])) { + if (_parseNumber(&path, &arr[1])) { + if (_parseNumber(&path, &arr[2])) { + if (_parseFlag(&path, &large)) { + if (_parseFlag(&path, &sweep)) { + if (_parseNumber(&path, &arr[5])) { + if (_parseNumber(&path, &arr[6])) { + arr[3] = (float)large; + arr[4] = (float)sweep; + return path; + } + } + } + } + } + } + } + *count = 0; + return NULL; + } + for (int i = 0; i < *count; i++) { + if (!_parseNumber(&path, &arr[i])) { + *count = 0; + return NULL; + } + path = _skipComma(path); + } + return path; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + + +bool svgPathToTvgPath(const char* svgPath, Array& cmds, Array& pts) +{ + float numberArray[7]; + int numberCount = 0; + Point cur = { 0, 0 }; + Point curCtl = { 0, 0 }; + Point startPoint = { 0, 0 }; + char cmd = 0; + bool isQuadratic = false; + char* path = (char*)svgPath; + + while ((path[0] != '\0')) { + path = _nextCommand(path, &cmd, numberArray, &numberCount); + if (!path) break; + if (!_processCommand(&cmds, &pts, cmd, numberArray, numberCount, &cur, &curCtl, &startPoint, &isQuadratic)) break; + } + + return true; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgPath.h b/libraries/lvgl/src/libs/thorvg/tvgSvgPath.h new file mode 100644 index 0000000..5ac02cd --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgPath.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_PATH_H_ +#define _TVG_SVG_PATH_H_ + +#include "tvgCommon.h" + +bool svgPathToTvgPath(const char* svgPath, Array& cmds, Array& pts); + +#endif //_TVG_SVG_PATH_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.cpp b/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.cpp new file mode 100644 index 0000000..ace3d32 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.cpp @@ -0,0 +1,890 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" /* to include math.h before cstring */ +#include +#include +#include "tvgShape.h" +#include "tvgCompressor.h" +#include "tvgPaint.h" +#include "tvgFill.h" +#include "tvgStr.h" +#include "tvgSvgLoaderCommon.h" +#include "tvgSvgSceneBuilder.h" +#include "tvgSvgPath.h" +#include "tvgSvgUtil.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static bool _appendShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath); +static bool _appendClipShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, const Matrix* transform); +static unique_ptr _sceneBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, bool mask, int depth, bool* isMaskWhite = nullptr); + + +static inline bool _isGroupType(SvgNodeType type) +{ + if (type == SvgNodeType::Doc || type == SvgNodeType::G || type == SvgNodeType::Use || type == SvgNodeType::ClipPath || type == SvgNodeType::Symbol) return true; + return false; +} + + +//According to: https://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBoxUnits (the last paragraph) +//a stroke width should be ignored for bounding box calculations +static Box _boundingBox(const Shape* shape) +{ + float x, y, w, h; + shape->bounds(&x, &y, &w, &h, false); + + if (auto strokeW = shape->strokeWidth()) { + x += 0.5f * strokeW; + y += 0.5f * strokeW; + w -= strokeW; + h -= strokeW; + } + + return {x, y, w, h}; +} + + +static void _transformMultiply(const Matrix* mBBox, Matrix* gradTransf) +{ + gradTransf->e13 = gradTransf->e13 * mBBox->e11 + mBBox->e13; + gradTransf->e12 *= mBBox->e11; + gradTransf->e11 *= mBBox->e11; + + gradTransf->e23 = gradTransf->e23 * mBBox->e22 + mBBox->e23; + gradTransf->e22 *= mBBox->e22; + gradTransf->e21 *= mBBox->e22; +} + + +static unique_ptr _applyLinearGradientProperty(SvgStyleGradient* g, const Shape* vg, const Box& vBox, int opacity) +{ + Fill::ColorStop* stops; + int stopCount = 0; + auto fillGrad = LinearGradient::gen(); + + bool isTransform = (g->transform ? true : false); + Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (isTransform) finalTransform = *g->transform; + + if (g->userSpace) { + g->linear->x1 = g->linear->x1 * vBox.w; + g->linear->y1 = g->linear->y1 * vBox.h; + g->linear->x2 = g->linear->x2 * vBox.w; + g->linear->y2 = g->linear->y2 * vBox.h; + } else { + Matrix m = {vBox.w, 0, vBox.x, 0, vBox.h, vBox.y, 0, 0, 1}; + if (isTransform) _transformMultiply(&m, &finalTransform); + else { + finalTransform = m; + isTransform = true; + } + } + + if (isTransform) fillGrad->transform(finalTransform); + + fillGrad->linear(g->linear->x1, g->linear->y1, g->linear->x2, g->linear->y2); + fillGrad->spread(g->spread); + + //Update the stops + stopCount = g->stops.count; + if (stopCount > 0) { + stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); + if (!stops) return fillGrad; + auto prevOffset = 0.0f; + for (uint32_t i = 0; i < g->stops.count; ++i) { + auto colorStop = &g->stops[i]; + //Use premultiplied color + stops[i].r = colorStop->r; + stops[i].g = colorStop->g; + stops[i].b = colorStop->b; + stops[i].a = static_cast((colorStop->a * opacity) / 255); + stops[i].offset = colorStop->offset; + //check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes + if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; + else if (colorStop->offset > 1) stops[i].offset = 1; + prevOffset = stops[i].offset; + } + fillGrad->colorStops(stops, stopCount); + free(stops); + } + return fillGrad; +} + + +static unique_ptr _applyRadialGradientProperty(SvgStyleGradient* g, const Shape* vg, const Box& vBox, int opacity) +{ + Fill::ColorStop *stops; + int stopCount = 0; + auto fillGrad = RadialGradient::gen(); + + bool isTransform = (g->transform ? true : false); + Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (isTransform) finalTransform = *g->transform; + + if (g->userSpace) { + //The radius scalling is done according to the Units section: + //https://www.w3.org/TR/2015/WD-SVG2-20150915/coords.html + g->radial->cx = g->radial->cx * vBox.w; + g->radial->cy = g->radial->cy * vBox.h; + g->radial->r = g->radial->r * sqrtf(powf(vBox.w, 2.0f) + powf(vBox.h, 2.0f)) / sqrtf(2.0f); + g->radial->fx = g->radial->fx * vBox.w; + g->radial->fy = g->radial->fy * vBox.h; + g->radial->fr = g->radial->fr * sqrtf(powf(vBox.w, 2.0f) + powf(vBox.h, 2.0f)) / sqrtf(2.0f); + } else { + Matrix m = {vBox.w, 0, vBox.x, 0, vBox.h, vBox.y, 0, 0, 1}; + if (isTransform) _transformMultiply(&m, &finalTransform); + else { + finalTransform = m; + isTransform = true; + } + } + + if (isTransform) fillGrad->transform(finalTransform); + + P(fillGrad)->radial(g->radial->cx, g->radial->cy, g->radial->r, g->radial->fx, g->radial->fy, g->radial->fr); + fillGrad->spread(g->spread); + + //Update the stops + stopCount = g->stops.count; + if (stopCount > 0) { + stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); + if (!stops) return fillGrad; + auto prevOffset = 0.0f; + for (uint32_t i = 0; i < g->stops.count; ++i) { + auto colorStop = &g->stops[i]; + //Use premultiplied color + stops[i].r = colorStop->r; + stops[i].g = colorStop->g; + stops[i].b = colorStop->b; + stops[i].a = static_cast((colorStop->a * opacity) / 255); + stops[i].offset = colorStop->offset; + //check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes + if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; + else if (colorStop->offset > 1) stops[i].offset = 1; + prevOffset = stops[i].offset; + } + fillGrad->colorStops(stops, stopCount); + free(stops); + } + return fillGrad; +} + + +//The SVG standard allows only for 'use' nodes that point directly to a basic shape. +static bool _appendClipUseNode(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath) +{ + if (node->child.count != 1) return false; + auto child = *(node->child.data); + + Matrix finalTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (node->transform) finalTransform = *node->transform; + if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) { + Matrix m = {1, 0, node->node.use.x, 0, 1, node->node.use.y, 0, 0, 1}; + finalTransform = mathMultiply(&finalTransform, &m); + } + if (child->transform) finalTransform = mathMultiply(child->transform, &finalTransform); + + return _appendClipShape(loaderData, child, shape, vBox, svgPath, mathIdentity((const Matrix*)(&finalTransform)) ? nullptr : &finalTransform); +} + + +static bool _appendClipChild(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, bool clip) +{ + if (node->type == SvgNodeType::Use) { + return _appendClipUseNode(loaderData, node, shape, vBox, svgPath); + } + return _appendClipShape(loaderData, node, shape, vBox, svgPath, nullptr); +} + + +static Matrix _compositionTransform(Paint* paint, const SvgNode* node, const SvgNode* compNode, SvgNodeType type) +{ + Matrix m = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + //The initial mask transformation ignored according to the SVG standard. + if (node->transform && type != SvgNodeType::Mask) { + m = *node->transform; + } + if (compNode->transform) { + m = mathMultiply(&m, compNode->transform); + } + if (!compNode->node.clip.userSpace) { + float x, y, w, h; + P(paint)->bounds(&x, &y, &w, &h, false, false); + Matrix mBBox = {w, 0, x, 0, h, y, 0, 0, 1}; + m = mathMultiply(&m, &mBBox); + } + return m; +} + + +static void _applyComposition(SvgLoaderData& loaderData, Paint* paint, const SvgNode* node, const Box& vBox, const string& svgPath) +{ + /* ClipPath */ + /* Do not drop in Circular Dependency for ClipPath. + Composition can be applied recursively if its children nodes have composition target to this one. */ + if (node->style->clipPath.applying) { + TVGLOG("SVG", "Multiple Composition Tried! Check out Circular dependency?"); + } else { + auto compNode = node->style->clipPath.node; + if (compNode && compNode->child.count > 0) { + node->style->clipPath.applying = true; + + auto comp = Shape::gen(); + + auto child = compNode->child.data; + auto valid = false; //Composite only when valid shapes exist + + for (uint32_t i = 0; i < compNode->child.count; ++i, ++child) { + if (_appendClipChild(loaderData, *child, comp.get(), vBox, svgPath, compNode->child.count > 1)) valid = true; + } + + if (valid) { + Matrix finalTransform = _compositionTransform(paint, node, compNode, SvgNodeType::ClipPath); + comp->transform(finalTransform); + + paint->composite(std::move(comp), CompositeMethod::ClipPath); + } + + node->style->clipPath.applying = false; + } + } + + /* Mask */ + /* Do not drop in Circular Dependency for Mask. + Composition can be applied recursively if its children nodes have composition target to this one. */ + if (node->style->mask.applying) { + TVGLOG("SVG", "Multiple Composition Tried! Check out Circular dependency?"); + } else { + auto compNode = node->style->mask.node; + if (compNode && compNode->child.count > 0) { + node->style->mask.applying = true; + + bool isMaskWhite = true; + if (auto comp = _sceneBuildHelper(loaderData, compNode, vBox, svgPath, true, 0, &isMaskWhite)) { + if (!compNode->node.mask.userSpace) { + Matrix finalTransform = _compositionTransform(paint, node, compNode, SvgNodeType::Mask); + comp->transform(finalTransform); + } else { + if (node->transform) comp->transform(*node->transform); + } + + if (compNode->node.mask.type == SvgMaskType::Luminance && !isMaskWhite) { + paint->composite(std::move(comp), CompositeMethod::LumaMask); + } else { + paint->composite(std::move(comp), CompositeMethod::AlphaMask); + } + } + + node->style->mask.applying = false; + } + } +} + + +static void _applyProperty(SvgLoaderData& loaderData, SvgNode* node, Shape* vg, const Box& vBox, const string& svgPath, bool clip) +{ + SvgStyleProperty* style = node->style; + + //Clip transformation is applied directly to the path in the _appendClipShape function + if (node->transform && !clip) vg->transform(*node->transform); + if (node->type == SvgNodeType::Doc || !node->display) return; + + //If fill property is nullptr then do nothing + if (style->fill.paint.none) { + //Do nothing + } else if (style->fill.paint.gradient) { + Box bBox = vBox; + if (!style->fill.paint.gradient->userSpace) bBox = _boundingBox(vg); + + if (style->fill.paint.gradient->type == SvgGradientType::Linear) { + auto linear = _applyLinearGradientProperty(style->fill.paint.gradient, vg, bBox, style->fill.opacity); + vg->fill(std::move(linear)); + } else if (style->fill.paint.gradient->type == SvgGradientType::Radial) { + auto radial = _applyRadialGradientProperty(style->fill.paint.gradient, vg, bBox, style->fill.opacity); + vg->fill(std::move(radial)); + } + } else if (style->fill.paint.url) { + //TODO: Apply the color pointed by url + } else if (style->fill.paint.curColor) { + //Apply the current style color + vg->fill(style->color.r, style->color.g, style->color.b, style->fill.opacity); + } else { + //Apply the fill color + vg->fill(style->fill.paint.color.r, style->fill.paint.color.g, style->fill.paint.color.b, style->fill.opacity); + } + + //Apply the fill rule + vg->fill((tvg::FillRule)style->fill.fillRule); + //Rendering order + vg->order(!style->paintOrder); + + //Apply node opacity + if (style->opacity < 255) vg->opacity(style->opacity); + + if (node->type == SvgNodeType::G || node->type == SvgNodeType::Use) return; + + //Apply the stroke style property + vg->stroke(style->stroke.width); + vg->stroke(style->stroke.cap); + vg->stroke(style->stroke.join); + vg->strokeMiterlimit(style->stroke.miterlimit); + if (style->stroke.dash.array.count > 0) { + P(vg)->strokeDash(style->stroke.dash.array.data, style->stroke.dash.array.count, style->stroke.dash.offset); + } + + //If stroke property is nullptr then do nothing + if (style->stroke.paint.none) { + vg->stroke(0.0f); + } else if (style->stroke.paint.gradient) { + Box bBox = vBox; + if (!style->stroke.paint.gradient->userSpace) bBox = _boundingBox(vg); + + if (style->stroke.paint.gradient->type == SvgGradientType::Linear) { + auto linear = _applyLinearGradientProperty(style->stroke.paint.gradient, vg, bBox, style->stroke.opacity); + vg->stroke(std::move(linear)); + } else if (style->stroke.paint.gradient->type == SvgGradientType::Radial) { + auto radial = _applyRadialGradientProperty(style->stroke.paint.gradient, vg, bBox, style->stroke.opacity); + vg->stroke(std::move(radial)); + } + } else if (style->stroke.paint.url) { + //TODO: Apply the color pointed by url + } else if (style->stroke.paint.curColor) { + //Apply the current style color + vg->stroke(style->color.r, style->color.g, style->color.b, style->stroke.opacity); + } else { + //Apply the stroke color + vg->stroke(style->stroke.paint.color.r, style->stroke.paint.color.g, style->stroke.paint.color.b, style->stroke.opacity); + } + + _applyComposition(loaderData, vg, node, vBox, svgPath); +} + + +static unique_ptr _shapeBuildHelper(SvgLoaderData& loaderData, SvgNode* node, const Box& vBox, const string& svgPath) +{ + auto shape = Shape::gen(); + if (_appendShape(loaderData, node, shape.get(), vBox, svgPath)) return shape; + else return nullptr; +} + + +static bool _recognizeShape(SvgNode* node, Shape* shape) +{ + switch (node->type) { + case SvgNodeType::Path: { + if (node->node.path.path) { + Array cmds; + Array pts; + if (svgPathToTvgPath(node->node.path.path, cmds, pts)) { + shape->appendPath(cmds.data, cmds.count, pts.data, pts.count); + } + } + break; + } + case SvgNodeType::Ellipse: { + shape->appendCircle(node->node.ellipse.cx, node->node.ellipse.cy, node->node.ellipse.rx, node->node.ellipse.ry); + break; + } + case SvgNodeType::Polygon: { + if (node->node.polygon.pts.count < 2) break; + auto pts = node->node.polygon.pts.data; + shape->moveTo(pts[0], pts[1]); + for (pts += 2; pts < node->node.polygon.pts.end(); pts += 2) { + shape->lineTo(pts[0], pts[1]); + } + shape->close(); + break; + } + case SvgNodeType::Polyline: { + if (node->node.polyline.pts.count < 2) break; + auto pts = node->node.polyline.pts.data; + shape->moveTo(pts[0], pts[1]); + for (pts += 2; pts < node->node.polyline.pts.end(); pts += 2) { + shape->lineTo(pts[0], pts[1]); + } + break; + } + case SvgNodeType::Circle: { + shape->appendCircle(node->node.circle.cx, node->node.circle.cy, node->node.circle.r, node->node.circle.r); + break; + } + case SvgNodeType::Rect: { + shape->appendRect(node->node.rect.x, node->node.rect.y, node->node.rect.w, node->node.rect.h, node->node.rect.rx, node->node.rect.ry); + break; + } + case SvgNodeType::Line: { + shape->moveTo(node->node.line.x1, node->node.line.y1); + shape->lineTo(node->node.line.x2, node->node.line.y2); + break; + } + default: { + return false; + } + } + return true; +} + + +static bool _appendShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath) +{ + if (!_recognizeShape(node, shape)) return false; + + _applyProperty(loaderData, node, shape, vBox, svgPath, false); + return true; +} + + +static bool _appendClipShape(SvgLoaderData& loaderData, SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath, const Matrix* transform) +{ + //The 'transform' matrix has higher priority than the node->transform, since it already contains it + auto m = transform ? transform : (node->transform ? node->transform : nullptr); + + uint32_t currentPtsCnt = 0; + if (m) { + const Point *tmp = nullptr; + currentPtsCnt = shape->pathCoords(&tmp); + } + + if (!_recognizeShape(node, shape)) return false; + + if (m) { + const Point *pts = nullptr; + auto ptsCnt = shape->pathCoords(&pts); + + auto p = const_cast(pts) + currentPtsCnt; + while (currentPtsCnt++ < ptsCnt) mathMultiply(p++, m); + } + + _applyProperty(loaderData, node, shape, vBox, svgPath, true); + return true; +} + + +enum class imageMimeTypeEncoding +{ + base64 = 0x1, + utf8 = 0x2 +}; + +constexpr imageMimeTypeEncoding operator|(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { + return static_cast(static_cast(a) | static_cast(b)); +} + +constexpr bool operator&(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { + return (static_cast(a) & static_cast(b)); +} + + +static constexpr struct +{ + const char* name; + int sz; + imageMimeTypeEncoding encoding; +} imageMimeTypes[] = { + {"jpeg", sizeof("jpeg"), imageMimeTypeEncoding::base64}, + {"png", sizeof("png"), imageMimeTypeEncoding::base64}, + {"svg+xml", sizeof("svg+xml"), imageMimeTypeEncoding::base64 | imageMimeTypeEncoding::utf8}, +}; + + +static bool _isValidImageMimeTypeAndEncoding(const char** href, const char** mimetype, imageMimeTypeEncoding* encoding) { + if (strncmp(*href, "image/", sizeof("image/") - 1)) return false; //not allowed mime type + *href += sizeof("image/") - 1; + + //RFC2397 data:[][;base64], + //mediatype := [ type "/" subtype ] *( ";" parameter ) + //parameter := attribute "=" value + for (unsigned int i = 0; i < sizeof(imageMimeTypes) / sizeof(imageMimeTypes[0]); i++) { + if (!strncmp(*href, imageMimeTypes[i].name, imageMimeTypes[i].sz - 1)) { + *href += imageMimeTypes[i].sz - 1; + *mimetype = imageMimeTypes[i].name; + + while (**href && **href != ',') { + while (**href && **href != ';') ++(*href); + if (!**href) return false; + ++(*href); + + if (imageMimeTypes[i].encoding & imageMimeTypeEncoding::base64) { + if (!strncmp(*href, "base64,", sizeof("base64,") - 1)) { + *href += sizeof("base64,") - 1; + *encoding = imageMimeTypeEncoding::base64; + return true; //valid base64 + } + } + if (imageMimeTypes[i].encoding & imageMimeTypeEncoding::utf8) { + if (!strncmp(*href, "utf8,", sizeof("utf8,") - 1)) { + *href += sizeof("utf8,") - 1; + *encoding = imageMimeTypeEncoding::utf8; + return true; //valid utf8 + } + } + } + //no encoding defined + if (**href == ',' && (imageMimeTypes[i].encoding & imageMimeTypeEncoding::utf8)) { + ++(*href); + *encoding = imageMimeTypeEncoding::utf8; + return true; //allow no encoding defined if utf8 expected + } + return false; + } + } + return false; +} + +#include "tvgTaskScheduler.h" + +static unique_ptr _imageBuildHelper(SvgLoaderData& loaderData, SvgNode* node, const Box& vBox, const string& svgPath) +{ + if (!node->node.image.href) return nullptr; + auto picture = Picture::gen(); + + TaskScheduler::async(false); //force to load a picture on the same thread + + const char* href = node->node.image.href; + if (!strncmp(href, "data:", sizeof("data:") - 1)) { + href += sizeof("data:") - 1; + const char* mimetype; + imageMimeTypeEncoding encoding; + if (!_isValidImageMimeTypeAndEncoding(&href, &mimetype, &encoding)) return nullptr; //not allowed mime type or encoding + char *decoded = nullptr; + if (encoding == imageMimeTypeEncoding::base64) { + auto size = b64Decode(href, strlen(href), &decoded); + if (picture->load(decoded, size, mimetype, false) != Result::Success) { + free(decoded); + TaskScheduler::async(true); + return nullptr; + } + } else { + auto size = svgUtilURLDecode(href, &decoded); + if (picture->load(decoded, size, mimetype, false) != Result::Success) { + free(decoded); + TaskScheduler::async(true); + return nullptr; + } + } + loaderData.images.push(decoded); + } else { + if (!strncmp(href, "file://", sizeof("file://") - 1)) href += sizeof("file://") - 1; + //TODO: protect against recursive svg image loading + //Temporarily disable embedded svg: + const char *dot = strrchr(href, '.'); + if (dot && !strcmp(dot, ".svg")) { + TVGLOG("SVG", "Embedded svg file is disabled."); + TaskScheduler::async(true); + return nullptr; + } + string imagePath = href; + if (strncmp(href, "/", 1)) { + auto last = svgPath.find_last_of("/"); + imagePath = svgPath.substr(0, (last == string::npos ? 0 : last + 1)) + imagePath; + } + if (picture->load(imagePath) != Result::Success) { + TaskScheduler::async(true); + return nullptr; + } + } + + TaskScheduler::async(true); + + float w, h; + Matrix m = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (picture->size(&w, &h) == Result::Success && w > 0 && h > 0) { + auto sx = node->node.image.w / w; + auto sy = node->node.image.h / h; + m = {sx, 0, node->node.image.x, 0, sy, node->node.image.y, 0, 0, 1}; + } + if (node->transform) m = mathMultiply(node->transform, &m); + picture->transform(m); + + _applyComposition(loaderData, picture.get(), node, vBox, svgPath); + + return picture; +} + + +static Matrix _calculateAspectRatioMatrix(AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, float width, float height, const Box& box) +{ + auto sx = width / box.w; + auto sy = height / box.h; + auto tvx = box.x * sx; + auto tvy = box.y * sy; + + if (align == AspectRatioAlign::None) + return {sx, 0, -tvx, 0, sy, -tvy, 0, 0, 1}; + + //Scale + if (meetOrSlice == AspectRatioMeetOrSlice::Meet) { + if (sx < sy) sy = sx; + else sx = sy; + } else { + if (sx < sy) sx = sy; + else sy = sx; + } + + //Align + tvx = box.x * sx; + tvy = box.y * sy; + auto tvw = box.w * sx; + auto tvh = box.h * sy; + + switch (align) { + case AspectRatioAlign::XMinYMin: { + break; + } + case AspectRatioAlign::XMidYMin: { + tvx -= (width - tvw) * 0.5f; + break; + } + case AspectRatioAlign::XMaxYMin: { + tvx -= width - tvw; + break; + } + case AspectRatioAlign::XMinYMid: { + tvy -= (height - tvh) * 0.5f; + break; + } + case AspectRatioAlign::XMidYMid: { + tvx -= (width - tvw) * 0.5f; + tvy -= (height - tvh) * 0.5f; + break; + } + case AspectRatioAlign::XMaxYMid: { + tvx -= width - tvw; + tvy -= (height - tvh) * 0.5f; + break; + } + case AspectRatioAlign::XMinYMax: { + tvy -= height - tvh; + break; + } + case AspectRatioAlign::XMidYMax: { + tvx -= (width - tvw) * 0.5f; + tvy -= height - tvh; + break; + } + case AspectRatioAlign::XMaxYMax: { + tvx -= width - tvw; + tvy -= height - tvh; + break; + } + default: { + break; + } + } + + return {sx, 0, -tvx, 0, sy, -tvy, 0, 0, 1}; +} + + +static unique_ptr _useBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, int depth, bool* isMaskWhite) +{ + unique_ptr finalScene; + auto scene = _sceneBuildHelper(loaderData, node, vBox, svgPath, false, depth + 1, isMaskWhite); + + // mUseTransform = mUseTransform * mTranslate + Matrix mUseTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if (node->transform) mUseTransform = *node->transform; + if (node->node.use.x != 0.0f || node->node.use.y != 0.0f) { + Matrix mTranslate = {1, 0, node->node.use.x, 0, 1, node->node.use.y, 0, 0, 1}; + mUseTransform = mathMultiply(&mUseTransform, &mTranslate); + } + + if (node->node.use.symbol) { + auto symbol = node->node.use.symbol->node.symbol; + + auto width = (symbol.hasWidth ? symbol.w : vBox.w); + if (node->node.use.isWidthSet) width = node->node.use.w; + auto height = (symbol.hasHeight ? symbol.h : vBox.h);; + if (node->node.use.isHeightSet) height = node->node.use.h; + auto vw = (symbol.hasViewBox ? symbol.vw : width); + auto vh = (symbol.hasViewBox ? symbol.vh : height); + + Matrix mViewBox = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + if ((!mathEqual(width, vw) || !mathEqual(height, vh)) && vw > 0 && vh > 0) { + Box box = {symbol.vx, symbol.vy, vw, vh}; + mViewBox = _calculateAspectRatioMatrix(symbol.align, symbol.meetOrSlice, width, height, box); + } else if (!mathZero(symbol.vx) || !mathZero(symbol.vy)) { + mViewBox = {1, 0, -symbol.vx, 0, 1, -symbol.vy, 0, 0, 1}; + } + + // mSceneTransform = mUseTransform * mSymbolTransform * mViewBox + Matrix mSceneTransform = mViewBox; + if (node->node.use.symbol->transform) { + mSceneTransform = mathMultiply(node->node.use.symbol->transform, &mViewBox); + } + mSceneTransform = mathMultiply(&mUseTransform, &mSceneTransform); + scene->transform(mSceneTransform); + + if (node->node.use.symbol->node.symbol.overflowVisible) { + finalScene = std::move(scene); + } else { + auto viewBoxClip = Shape::gen(); + viewBoxClip->appendRect(0, 0, width, height, 0, 0); + + // mClipTransform = mUseTransform * mSymbolTransform + Matrix mClipTransform = mUseTransform; + if (node->node.use.symbol->transform) { + mClipTransform = mathMultiply(&mUseTransform, node->node.use.symbol->transform); + } + viewBoxClip->transform(mClipTransform); + + auto compositeLayer = Scene::gen(); + compositeLayer->composite(std::move(viewBoxClip), CompositeMethod::ClipPath); + compositeLayer->push(std::move(scene)); + + auto root = Scene::gen(); + root->push(std::move(compositeLayer)); + + finalScene = std::move(root); + } + } else { + scene->transform(mUseTransform); + finalScene = std::move(scene); + } + + return finalScene; +} + + +static unique_ptr _sceneBuildHelper(SvgLoaderData& loaderData, const SvgNode* node, const Box& vBox, const string& svgPath, bool mask, int depth, bool* isMaskWhite) +{ + /* Exception handling: Prevent invalid SVG data input. + The size is the arbitrary value, we need an experimental size. */ + if (depth > 2192) { + TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); + return nullptr; + } + + if (_isGroupType(node->type) || mask) { + auto scene = Scene::gen(); + // For a Symbol node, the viewBox transformation has to be applied first - see _useBuildHelper() + if (!mask && node->transform && node->type != SvgNodeType::Symbol) scene->transform(*node->transform); + + if (node->display && node->style->opacity != 0) { + auto child = node->child.data; + for (uint32_t i = 0; i < node->child.count; ++i, ++child) { + if (_isGroupType((*child)->type)) { + if ((*child)->type == SvgNodeType::Use) + scene->push(_useBuildHelper(loaderData, *child, vBox, svgPath, depth + 1, isMaskWhite)); + else + scene->push(_sceneBuildHelper(loaderData, *child, vBox, svgPath, false, depth + 1, isMaskWhite)); + } else if ((*child)->type == SvgNodeType::Image) { + auto image = _imageBuildHelper(loaderData, *child, vBox, svgPath); + if (image) { + scene->push(std::move(image)); + if (isMaskWhite) *isMaskWhite = false; + } + } else if ((*child)->type != SvgNodeType::Mask) { + auto shape = _shapeBuildHelper(loaderData, *child, vBox, svgPath); + if (shape) { + if (isMaskWhite) { + uint8_t r, g, b; + shape->fillColor(&r, &g, &b); + if (shape->fill() || r < 255 || g < 255 || b < 255 || shape->strokeFill() || + (shape->strokeColor(&r, &g, &b) == Result::Success && (r < 255 || g < 255 || b < 255))) { + *isMaskWhite = false; + } + } + scene->push(std::move(shape)); + } + } + } + _applyComposition(loaderData, scene.get(), node, vBox, svgPath); + scene->opacity(node->style->opacity); + } + return scene; + } + return nullptr; +} + + +static void _updateInvalidViewSize(const Scene* scene, Box& vBox, float& w, float& h, SvgViewFlag viewFlag) +{ + bool validWidth = (viewFlag & SvgViewFlag::Width); + bool validHeight = (viewFlag & SvgViewFlag::Height); + + float x, y; + scene->bounds(&x, &y, &vBox.w, &vBox.h, false); + if (!validWidth && !validHeight) { + vBox.x = x; + vBox.y = y; + } else { + if (validWidth) vBox.w = w; + if (validHeight) vBox.h = h; + } + + //the size would have 1x1 or percentage values. + if (!validWidth) w *= vBox.w; + if (!validHeight) h *= vBox.h; +} + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +unique_ptr svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag) +{ + //TODO: aspect ratio is valid only if viewBox was set + + if (!loaderData.doc || (loaderData.doc->type != SvgNodeType::Doc)) return nullptr; + + auto docNode = _sceneBuildHelper(loaderData, loaderData.doc, vBox, svgPath, false, 0); + + if (!(viewFlag & SvgViewFlag::Viewbox)) _updateInvalidViewSize(docNode.get(), vBox, w, h, viewFlag); + + if (!mathEqual(w, vBox.w) || !mathEqual(h, vBox.h)) { + Matrix m = _calculateAspectRatioMatrix(align, meetOrSlice, w, h, vBox); + docNode->transform(m); + } else if (!mathZero(vBox.x) || !mathZero(vBox.y)) { + docNode->translate(-vBox.x, -vBox.y); + } + + auto viewBoxClip = Shape::gen(); + viewBoxClip->appendRect(0, 0, w, h, 0, 0); + viewBoxClip->fill(0, 0, 0); + + auto compositeLayer = Scene::gen(); + compositeLayer->composite(std::move(viewBoxClip), CompositeMethod::ClipPath); + compositeLayer->push(std::move(docNode)); + + auto root = Scene::gen(); + root->push(std::move(compositeLayer)); + + loaderData.doc->node.doc.vx = vBox.x; + loaderData.doc->node.doc.vy = vBox.y; + loaderData.doc->node.doc.vw = vBox.w; + loaderData.doc->node.doc.vh = vBox.h; + loaderData.doc->node.doc.w = w; + loaderData.doc->node.doc.h = h; + + return root; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.h b/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.h new file mode 100644 index 0000000..5a401e7 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgSceneBuilder.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_SCENE_BUILDER_H_ +#define _TVG_SVG_SCENE_BUILDER_H_ + +#include "tvgCommon.h" + +unique_ptr svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag); + +#endif //_TVG_SVG_SCENE_BUILDER_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.cpp b/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.cpp new file mode 100644 index 0000000..3c5da6c --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include "tvgSvgUtil.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static uint8_t _hexCharToDec(const char c) +{ + if (c >= 'a') return c - 'a' + 10; + else if (c >= 'A') return c - 'A' + 10; + else return c - '0'; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +size_t svgUtilURLDecode(const char *src, char** dst) +{ + if (!src) return 0; + + auto length = strlen(src); + if (length == 0) return 0; + + char* decoded = (char*)malloc(sizeof(char) * length + 1); + decoded[length] = '\0'; + + char a, b; + int idx =0; + while (*src) { + if (*src == '%' && + ((a = src[1]) && (b = src[2])) && + (isxdigit(a) && isxdigit(b))) { + decoded[idx++] = (_hexCharToDec(a) << 4) + _hexCharToDec(b); + src+=3; + } else if (*src == '+') { + decoded[idx++] = ' '; + src++; + } else { + decoded[idx++] = *src++; + } + } + + *dst = decoded; + return length + 1; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.h b/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.h new file mode 100644 index 0000000..c322983 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSvgUtil.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SVG_UTIL_H_ +#define _TVG_SVG_UTIL_H_ + +#include "tvgCommon.h" + +size_t svgUtilURLDecode(const char *src, char** dst); + +#endif //_TVG_SVG_UTIL_H_ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwCanvas.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwCanvas.cpp new file mode 100644 index 0000000..b53fe26 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwCanvas.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgCanvas.h" + +#ifdef THORVG_SW_RASTER_SUPPORT + #include "tvgSwRenderer.h" +#else + class SwRenderer : public RenderMethod + { + //Non Supported. Dummy Class */ + }; +#endif + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct SwCanvas::Impl +{ +}; + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +#ifdef THORVG_SW_RASTER_SUPPORT +SwCanvas::SwCanvas() : Canvas(SwRenderer::gen()), pImpl(new Impl) +#else +SwCanvas::SwCanvas() : Canvas(nullptr), pImpl(new Impl) +#endif +{ +} + + +SwCanvas::~SwCanvas() +{ + delete(pImpl); +} + + +Result SwCanvas::mempool(MempoolPolicy policy) noexcept +{ +#ifdef THORVG_SW_RASTER_SUPPORT + //We know renderer type, avoid dynamic_cast for performance. + auto renderer = static_cast(Canvas::pImpl->renderer); + if (!renderer) return Result::MemoryCorruption; + + //It can't change the policy during the running. + if (!Canvas::pImpl->paints.empty()) return Result::InsufficientCondition; + + if (policy == MempoolPolicy::Individual) renderer->mempool(false); + else renderer->mempool(true); + + return Result::Success; +#endif + return Result::NonSupport; +} + + +Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Colorspace cs) noexcept +{ +#ifdef THORVG_SW_RASTER_SUPPORT + //We know renderer type, avoid dynamic_cast for performance. + auto renderer = static_cast(Canvas::pImpl->renderer); + if (!renderer) return Result::MemoryCorruption; + + if (!renderer->target(buffer, stride, w, h, static_cast(cs))) return Result::InvalidArguments; + + //Paints must be updated again with this new target. + Canvas::pImpl->needRefresh(); + + return Result::Success; +#endif + return Result::NonSupport; +} + + +unique_ptr SwCanvas::gen() noexcept +{ +#ifdef THORVG_SW_RASTER_SUPPORT + if (SwRenderer::init() <= 0) return nullptr; + return unique_ptr(new SwCanvas); +#endif + return nullptr; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwCommon.h b/libraries/lvgl/src/libs/thorvg/tvgSwCommon.h new file mode 100644 index 0000000..591b1c9 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwCommon.h @@ -0,0 +1,580 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SW_COMMON_H_ +#define _TVG_SW_COMMON_H_ + +#include "tvgCommon.h" +#include "tvgRender.h" + +#include + +#if 0 +#include +static double timeStamp() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return (tv.tv_sec + tv.tv_usec / 1000000.0); +} +#endif + +#define SW_CURVE_TYPE_POINT 0 +#define SW_CURVE_TYPE_CUBIC 1 +#define SW_ANGLE_PI (180L << 16) +#define SW_ANGLE_2PI (SW_ANGLE_PI << 1) +#define SW_ANGLE_PI2 (SW_ANGLE_PI >> 1) + +using SwCoord = signed long; +using SwFixed = signed long long; + + +static inline float TO_FLOAT(SwCoord val) +{ + return static_cast(val) / 64.0f; +} + +struct SwPoint +{ + SwCoord x, y; + + SwPoint& operator+=(const SwPoint& rhs) + { + x += rhs.x; + y += rhs.y; + return *this; + } + + SwPoint operator+(const SwPoint& rhs) const + { + return {x + rhs.x, y + rhs.y}; + } + + SwPoint operator-(const SwPoint& rhs) const + { + return {x - rhs.x, y - rhs.y}; + } + + bool operator==(const SwPoint& rhs) const + { + return (x == rhs.x && y == rhs.y); + } + + bool operator!=(const SwPoint& rhs) const + { + return (x != rhs.x || y != rhs.y); + } + + bool zero() const + { + if (x == 0 && y == 0) return true; + else return false; + } + + bool small() const + { + //2 is epsilon... + if (abs(x) < 2 && abs(y) < 2) return true; + else return false; + } + + Point toPoint() const + { + return {TO_FLOAT(x), TO_FLOAT(y)}; + } +}; + +struct SwSize +{ + SwCoord w, h; +}; + +struct SwOutline +{ + Array pts; //the outline's points + Array cntrs; //the contour end points + Array types; //curve type + Array closed; //opened or closed path? + FillRule fillRule; +}; + +struct SwSpan +{ + uint16_t x, y; + uint16_t len; + uint8_t coverage; +}; + +struct SwRleData +{ + SwSpan *spans; + uint32_t alloc; + uint32_t size; +}; + +struct SwBBox +{ + SwPoint min, max; + + void reset() + { + min.x = min.y = max.x = max.y = 0; + } +}; + +struct SwFill +{ + struct SwLinear { + float dx, dy; + float len; + float offset; + }; + + struct SwRadial { + float a11, a12, a13; + float a21, a22, a23; + float fx, fy, fr; + float dx, dy, dr; + float invA, a; + }; + + union { + SwLinear linear; + SwRadial radial; + }; + + uint32_t* ctable; + FillSpread spread; + + bool translucent; +}; + +struct SwStrokeBorder +{ + uint32_t ptsCnt; + uint32_t maxPts; + SwPoint* pts; + uint8_t* tags; + int32_t start; //index of current sub-path start point + bool movable; //true: for ends of lineto borders +}; + +struct SwStroke +{ + SwFixed angleIn; + SwFixed angleOut; + SwPoint center; + SwFixed lineLength; + SwFixed subPathAngle; + SwPoint ptStartSubPath; + SwFixed subPathLineLength; + SwFixed width; + SwFixed miterlimit; + + StrokeCap cap; + StrokeJoin join; + StrokeJoin joinSaved; + SwFill* fill = nullptr; + + SwStrokeBorder borders[2]; + + float sx, sy; + + bool firstPt; + bool closedSubPath; + bool handleWideStrokes; +}; + +struct SwDashStroke +{ + SwOutline* outline = nullptr; + float curLen = 0; + int32_t curIdx = 0; + Point ptStart = {0, 0}; + Point ptCur = {0, 0}; + float* pattern = nullptr; + uint32_t cnt = 0; + bool curOpGap = false; + bool move = true; +}; + +struct SwShape +{ + SwOutline* outline = nullptr; + SwStroke* stroke = nullptr; + SwFill* fill = nullptr; + SwRleData* rle = nullptr; + SwRleData* strokeRle = nullptr; + SwBBox bbox; //Keep it boundary without stroke region. Using for optimal filling. + + bool fastTrack = false; //Fast Track: axis-aligned rectangle without any clips? +}; + +struct SwImage +{ + SwOutline* outline = nullptr; + SwRleData* rle = nullptr; + union { + pixel_t* data; //system based data pointer + uint32_t* buf32; //for explicit 32bits channels + uint8_t* buf8; //for explicit 8bits grayscale + }; + uint32_t w, h, stride; + int32_t ox = 0; //offset x + int32_t oy = 0; //offset y + float scale; + uint8_t channelSize; + + bool direct = false; //draw image directly (with offset) + bool scaled = false; //draw scaled image +}; + +typedef uint8_t(*SwMask)(uint8_t s, uint8_t d, uint8_t a); //src, dst, alpha +typedef uint32_t(*SwBlender)(uint32_t s, uint32_t d, uint8_t a); //src, dst, alpha +typedef uint32_t(*SwJoin)(uint8_t r, uint8_t g, uint8_t b, uint8_t a); //color channel join +typedef uint8_t(*SwAlpha)(uint8_t*); //blending alpha + +struct SwCompositor; + +struct SwSurface : Surface +{ + SwJoin join; + SwAlpha alphas[4]; //Alpha:2, InvAlpha:3, Luma:4, InvLuma:5 + SwBlender blender = nullptr; //blender (optional) + SwCompositor* compositor = nullptr; //compositor (optional) + BlendMethod blendMethod; //blending method (uint8_t) + + SwAlpha alpha(CompositeMethod method) + { + auto idx = (int)(method) - 2; //0: None, 1: ClipPath + return alphas[idx > 3 ? 0 : idx]; //CompositeMethod has only four Matting methods. + } +}; + +struct SwCompositor : Compositor +{ + SwSurface* recoverSfc; //Recover surface when composition is started + SwCompositor* recoverCmp; //Recover compositor when composition is done + SwImage image; + SwBBox bbox; + bool valid; +}; + +struct SwMpool +{ + SwOutline* outline; + SwOutline* strokeOutline; + SwOutline* dashOutline; + unsigned allocSize; +}; + +static inline SwCoord TO_SWCOORD(float val) +{ + return SwCoord(val * 64.0f); +} + +static inline uint32_t JOIN(uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3) +{ + return (c0 << 24 | c1 << 16 | c2 << 8 | c3); +} + +static inline uint32_t ALPHA_BLEND(uint32_t c, uint32_t a) +{ + return (((((c >> 8) & 0x00ff00ff) * a + 0x00ff00ff) & 0xff00ff00) + + ((((c & 0x00ff00ff) * a + 0x00ff00ff) >> 8) & 0x00ff00ff)); +} + +static inline uint32_t INTERPOLATE(uint32_t s, uint32_t d, uint8_t a) +{ + return (((((((s >> 8) & 0xff00ff) - ((d >> 8) & 0xff00ff)) * a) + (d & 0xff00ff00)) & 0xff00ff00) + ((((((s & 0xff00ff) - (d & 0xff00ff)) * a) >> 8) + (d & 0xff00ff)) & 0xff00ff)); +} + +static inline uint8_t INTERPOLATE8(uint8_t s, uint8_t d, uint8_t a) +{ + return (((s) * (a) + 0xff) >> 8) + (((d) * ~(a) + 0xff) >> 8); +} + +static inline SwCoord HALF_STROKE(float width) +{ + return TO_SWCOORD(width * 0.5f); +} + +static inline uint8_t A(uint32_t c) +{ + return ((c) >> 24); +} + +static inline uint8_t IA(uint32_t c) +{ + return (~(c) >> 24); +} + +static inline uint8_t C1(uint32_t c) +{ + return ((c) >> 16); +} + +static inline uint8_t C2(uint32_t c) +{ + return ((c) >> 8); +} + +static inline uint8_t C3(uint32_t c) +{ + return (c); +} + +static inline uint32_t opBlendInterp(uint32_t s, uint32_t d, uint8_t a) +{ + return INTERPOLATE(s, d, a); +} + +static inline uint32_t opBlendNormal(uint32_t s, uint32_t d, uint8_t a) +{ + auto t = ALPHA_BLEND(s, a); + return t + ALPHA_BLEND(d, IA(t)); +} + +static inline uint32_t opBlendPreNormal(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + return s + ALPHA_BLEND(d, IA(s)); +} + +static inline uint32_t opBlendSrcOver(uint32_t s, TVG_UNUSED uint32_t d, TVG_UNUSED uint8_t a) +{ + return s; +} + +//TODO: BlendMethod could remove the alpha parameter. +static inline uint32_t opBlendDifference(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + //if (s > d) => s - d + //else => d - s + auto c1 = (C1(s) > C1(d)) ? (C1(s) - C1(d)) : (C1(d) - C1(s)); + auto c2 = (C2(s) > C2(d)) ? (C2(s) - C2(d)) : (C2(d) - C2(s)); + auto c3 = (C3(s) > C3(d)) ? (C3(s) - C3(d)) : (C3(d) - C3(s)); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendExclusion(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + //A + B - 2AB + auto c1 = std::min(255, C1(s) + C1(d) - std::min(255, (C1(s) * C1(d)) << 1)); + auto c2 = std::min(255, C2(s) + C2(d) - std::min(255, (C2(s) * C2(d)) << 1)); + auto c3 = std::min(255, C3(s) + C3(d) - std::min(255, (C3(s) * C3(d)) << 1)); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendAdd(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // s + d + auto c1 = std::min(C1(s) + C1(d), 255); + auto c2 = std::min(C2(s) + C2(d), 255); + auto c3 = std::min(C3(s) + C3(d), 255); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendScreen(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // s + d - s * d + auto c1 = C1(s) + C1(d) - MULTIPLY(C1(s), C1(d)); + auto c2 = C2(s) + C2(d) - MULTIPLY(C2(s), C2(d)); + auto c3 = C3(s) + C3(d) - MULTIPLY(C3(s), C3(d)); + return JOIN(255, c1, c2, c3); +} + + +static inline uint32_t opBlendMultiply(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // s * d + auto c1 = MULTIPLY(C1(s), C1(d)); + auto c2 = MULTIPLY(C2(s), C2(d)); + auto c3 = MULTIPLY(C3(s), C3(d)); + return JOIN(255, c1, c2, c3); +} + + +static inline uint32_t opBlendOverlay(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // if (2 * d < da) => 2 * s * d, + // else => 1 - 2 * (1 - s) * (1 - d) + auto c1 = (C1(d) < 128) ? std::min(255, 2 * MULTIPLY(C1(s), C1(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C1(s), 255 - C1(d)))); + auto c2 = (C2(d) < 128) ? std::min(255, 2 * MULTIPLY(C2(s), C2(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C2(s), 255 - C2(d)))); + auto c3 = (C3(d) < 128) ? std::min(255, 2 * MULTIPLY(C3(s), C3(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C3(s), 255 - C3(d)))); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendDarken(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // min(s, d) + auto c1 = std::min(C1(s), C1(d)); + auto c2 = std::min(C2(s), C2(d)); + auto c3 = std::min(C3(s), C3(d)); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendLighten(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // max(s, d) + auto c1 = std::max(C1(s), C1(d)); + auto c2 = std::max(C2(s), C2(d)); + auto c3 = std::max(C3(s), C3(d)); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendColorDodge(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // d / (1 - s) + auto is = 0xffffffff - s; + auto c1 = (C1(is) > 0) ? (C1(d) / C1(is)) : C1(d); + auto c2 = (C2(is) > 0) ? (C2(d) / C2(is)) : C2(d); + auto c3 = (C3(is) > 0) ? (C3(d) / C3(is)) : C3(d); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendColorBurn(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + // 1 - (1 - d) / s + auto id = 0xffffffff - d; + auto c1 = 255 - ((C1(s) > 0) ? (C1(id) / C1(s)) : C1(id)); + auto c2 = 255 - ((C2(s) > 0) ? (C2(id) / C2(s)) : C2(id)); + auto c3 = 255 - ((C3(s) > 0) ? (C3(id) / C3(s)) : C3(id)); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendHardLight(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + auto c1 = (C1(s) < 128) ? std::min(255, 2 * MULTIPLY(C1(s), C1(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C1(s), 255 - C1(d)))); + auto c2 = (C2(s) < 128) ? std::min(255, 2 * MULTIPLY(C2(s), C2(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C2(s), 255 - C2(d)))); + auto c3 = (C3(s) < 128) ? std::min(255, 2 * MULTIPLY(C3(s), C3(d))) : (255 - std::min(255, 2 * MULTIPLY(255 - C3(s), 255 - C3(d)))); + return JOIN(255, c1, c2, c3); +} + +static inline uint32_t opBlendSoftLight(uint32_t s, uint32_t d, TVG_UNUSED uint8_t a) +{ + //(255 - 2 * s) * (d * d) + (2 * s * b) + auto c1 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C1(s)), MULTIPLY(C1(d), C1(d))) + 2 * MULTIPLY(C1(s), C1(d))); + auto c2 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C2(s)), MULTIPLY(C2(d), C2(d))) + 2 * MULTIPLY(C2(s), C2(d))); + auto c3 = std::min(255, MULTIPLY(255 - std::min(255, 2 * C3(s)), MULTIPLY(C3(d), C3(d))) + 2 * MULTIPLY(C3(s), C3(d))); + return JOIN(255, c1, c2, c3); +} + + +int64_t mathMultiply(int64_t a, int64_t b); +int64_t mathDivide(int64_t a, int64_t b); +int64_t mathMulDiv(int64_t a, int64_t b, int64_t c); +void mathRotate(SwPoint& pt, SwFixed angle); +SwFixed mathTan(SwFixed angle); +SwFixed mathAtan(const SwPoint& pt); +SwFixed mathCos(SwFixed angle); +SwFixed mathSin(SwFixed angle); +void mathSplitCubic(SwPoint* base); +SwFixed mathDiff(SwFixed angle1, SwFixed angle2); +SwFixed mathLength(const SwPoint& pt); +bool mathSmallCubic(const SwPoint* base, SwFixed& angleIn, SwFixed& angleMid, SwFixed& angleOut); +SwFixed mathMean(SwFixed angle1, SwFixed angle2); +SwPoint mathTransform(const Point* to, const Matrix* transform); +bool mathUpdateOutlineBBox(const SwOutline* outline, const SwBBox& clipRegion, SwBBox& renderRegion, bool fastTrack); +bool mathClipBBox(const SwBBox& clipper, SwBBox& clipee); + +void shapeReset(SwShape* shape); +bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite); +bool shapePrepared(const SwShape* shape); +bool shapeGenRle(SwShape* shape, const RenderShape* rshape, bool antiAlias); +void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid); +void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform); +bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); +void shapeFree(SwShape* shape); +void shapeDelStroke(SwShape* shape); +bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); +bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); +void shapeResetFill(SwShape* shape); +void shapeResetStrokeFill(SwShape* shape); +void shapeDelFill(SwShape* shape); +void shapeDelStrokeFill(SwShape* shape); + +void strokeReset(SwStroke* stroke, const RenderShape* shape, const Matrix* transform); +bool strokeParseOutline(SwStroke* stroke, const SwOutline& outline); +SwOutline* strokeExportOutline(SwStroke* stroke, SwMpool* mpool, unsigned tid); +void strokeFree(SwStroke* stroke); + +bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); +bool imageGenRle(SwImage* image, const SwBBox& renderRegion, bool antiAlias); +void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid); +void imageReset(SwImage* image); +void imageFree(SwImage* image); + +bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable); +void fillReset(SwFill* fill); +void fillFree(SwFill* fill); + +//OPTIMIZE_ME: Skip the function pointer access +void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t opacity); //composite masking ver. +void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t opacity); //direct masking ver. +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a); //blending ver. +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a); //blending + BlendingMethod(op2) ver. +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity); //matting ver. + +void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a); //composite masking ver. +void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) ; //direct masking ver. +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a); //blending ver. +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a); //blending + BlendingMethod(op2) ver. +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity); //matting ver. + +SwRleData* rleRender(SwRleData* rle, const SwOutline* outline, const SwBBox& renderRegion, bool antiAlias); +SwRleData* rleRender(const SwBBox* bbox); +void rleFree(SwRleData* rle); +void rleReset(SwRleData* rle); +void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2); +void rleClipPath(SwRleData* rle, const SwRleData* clip); +void rleClipRect(SwRleData* rle, const SwBBox* clip); + +SwMpool* mpoolInit(uint32_t threads); +bool mpoolTerm(SwMpool* mpool); +bool mpoolClear(SwMpool* mpool); +SwOutline* mpoolReqOutline(SwMpool* mpool, unsigned idx); +void mpoolRetOutline(SwMpool* mpool, unsigned idx); +SwOutline* mpoolReqStrokeOutline(SwMpool* mpool, unsigned idx); +void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx); +SwOutline* mpoolReqDashOutline(SwMpool* mpool, unsigned idx); +void mpoolRetDashOutline(SwMpool* mpool, unsigned idx); + +bool rasterCompositor(SwSurface* surface); +bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id); +bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); +bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint8_t opacity); +bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); +bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id); +bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h); +void rasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len); +void rasterGrayscale8(uint8_t *dst, uint8_t val, uint32_t offset, int32_t len); +void rasterUnpremultiply(Surface* surface); +void rasterPremultiply(Surface* surface); +bool rasterConvertCS(Surface* surface, ColorSpace to); + +#endif /* _TVG_SW_COMMON_H_ */ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwFill.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwFill.cpp new file mode 100644 index 0000000..c4a697d --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwFill.cpp @@ -0,0 +1,785 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgSwCommon.h" +#include "tvgFill.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +#define RADIAL_A_THRESHOLD 0.0005f +#define GRADIENT_STOP_SIZE 1024 +#define FIXPT_BITS 8 +#define FIXPT_SIZE (1<radial.a + * B = 2 * (dr * fr + rx * dx + ry * dy) + * C = fr^2 - rx^2 - ry^2 + * Derivatives are computed with respect to dx. + * This procedure aims to optimize and eliminate the need to calculate all values from the beginning + * for consecutive x values with a constant y. The Taylor series expansions are computed as long as + * its terms are non-zero. + */ +static void _calculateCoefficients(const SwFill* fill, uint32_t x, uint32_t y, float& b, float& deltaB, float& det, float& deltaDet, float& deltaDeltaDet) +{ + auto radial = &fill->radial; + + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + + b = (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy) * radial->invA; + deltaB = (radial->a11 * radial->dx + radial->a21 * radial->dy) * radial->invA; + + auto rr = rx * rx + ry * ry; + auto deltaRr = 2.0f * (rx * radial->a11 + ry * radial->a21) * radial->invA; + auto deltaDeltaRr = 2.0f * (radial->a11 * radial->a11 + radial->a21 * radial->a21) * radial->invA; + + det = b * b + (rr - radial->fr * radial->fr) * radial->invA; + deltaDet = 2.0f * b * deltaB + deltaB * deltaB + deltaRr + deltaDeltaRr; + deltaDeltaDet = 2.0f * deltaB * deltaB + deltaDeltaRr; +} + + +static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface* surface, uint8_t opacity) +{ + if (!fill->ctable) { + fill->ctable = static_cast(malloc(GRADIENT_STOP_SIZE * sizeof(uint32_t))); + if (!fill->ctable) return false; + } + + const Fill::ColorStop* colors; + auto cnt = fdata->colorStops(&colors); + if (cnt == 0 || !colors) return false; + + auto pColors = colors; + + auto a = MULTIPLY(pColors->a, opacity); + if (a < 255) fill->translucent = true; + + auto r = pColors->r; + auto g = pColors->g; + auto b = pColors->b; + auto rgba = surface->join(r, g, b, a); + + auto inc = 1.0f / static_cast(GRADIENT_STOP_SIZE); + auto pos = 1.5f * inc; + uint32_t i = 0; + + fill->ctable[i++] = ALPHA_BLEND(rgba | 0xff000000, a); + + while (pos <= pColors->offset) { + fill->ctable[i] = fill->ctable[i - 1]; + ++i; + pos += inc; + } + + for (uint32_t j = 0; j < cnt - 1; ++j) { + auto curr = colors + j; + auto next = curr + 1; + auto delta = 1.0f / (next->offset - curr->offset); + auto a2 = MULTIPLY(next->a, opacity); + if (!fill->translucent && a2 < 255) fill->translucent = true; + + auto rgba2 = surface->join(next->r, next->g, next->b, a2); + + while (pos < next->offset && i < GRADIENT_STOP_SIZE) { + auto t = (pos - curr->offset) * delta; + auto dist = static_cast(255 * t); + auto dist2 = 255 - dist; + + auto color = INTERPOLATE(rgba, rgba2, dist2); + fill->ctable[i] = ALPHA_BLEND((color | 0xff000000), (color >> 24)); + + ++i; + pos += inc; + } + rgba = rgba2; + a = a2; + } + rgba = ALPHA_BLEND((rgba | 0xff000000), a); + + for (; i < GRADIENT_STOP_SIZE; ++i) + fill->ctable[i] = rgba; + + //Make sure the last color stop is represented at the end of the table + fill->ctable[GRADIENT_STOP_SIZE - 1] = rgba; + + return true; +} + + +bool _prepareLinear(SwFill* fill, const LinearGradient* linear, const Matrix* transform) +{ + float x1, x2, y1, y2; + if (linear->linear(&x1, &y1, &x2, &y2) != Result::Success) return false; + + fill->linear.dx = x2 - x1; + fill->linear.dy = y2 - y1; + fill->linear.len = fill->linear.dx * fill->linear.dx + fill->linear.dy * fill->linear.dy; + + if (fill->linear.len < FLT_EPSILON) return true; + + fill->linear.dx /= fill->linear.len; + fill->linear.dy /= fill->linear.len; + fill->linear.offset = -fill->linear.dx * x1 - fill->linear.dy * y1; + + auto gradTransform = linear->transform(); + bool isTransformation = !mathIdentity((const Matrix*)(&gradTransform)); + + if (isTransformation) { + if (transform) gradTransform = mathMultiply(transform, &gradTransform); + } else if (transform) { + gradTransform = *transform; + isTransformation = true; + } + + if (isTransformation) { + Matrix invTransform; + if (!mathInverse(&gradTransform, &invTransform)) return false; + + fill->linear.offset += fill->linear.dx * invTransform.e13 + fill->linear.dy * invTransform.e23; + + auto dx = fill->linear.dx; + fill->linear.dx = dx * invTransform.e11 + fill->linear.dy * invTransform.e21; + fill->linear.dy = dx * invTransform.e12 + fill->linear.dy * invTransform.e22; + + fill->linear.len = fill->linear.dx * fill->linear.dx + fill->linear.dy * fill->linear.dy; + if (fill->linear.len < FLT_EPSILON) return true; + } + + return true; +} + + +bool _prepareRadial(SwFill* fill, const RadialGradient* radial, const Matrix* transform) +{ + auto cx = P(radial)->cx; + auto cy = P(radial)->cy; + auto r = P(radial)->r; + auto fx = P(radial)->fx; + auto fy = P(radial)->fy; + auto fr = P(radial)->fr; + + if (r < FLT_EPSILON) return true; + + fill->radial.dr = r - fr; + fill->radial.dx = cx - fx; + fill->radial.dy = cy - fy; + fill->radial.fr = fr; + fill->radial.fx = fx; + fill->radial.fy = fy; + fill->radial.a = fill->radial.dr * fill->radial.dr - fill->radial.dx * fill->radial.dx - fill->radial.dy * fill->radial.dy; + + //This condition fulfills the SVG 1.1 std: + //the focal point, if outside the end circle, is moved to be on the end circle + //See: the SVG 2 std requirements: https://www.w3.org/TR/SVG2/pservers.html#RadialGradientNotes + if (fill->radial.a < 0) { + auto dist = sqrtf(fill->radial.dx * fill->radial.dx + fill->radial.dy * fill->radial.dy); + fill->radial.fx = cx + r * (fx - cx) / dist; + fill->radial.fy = cy + r * (fy - cy) / dist; + fill->radial.dx = cx - fill->radial.fx; + fill->radial.dy = cy - fill->radial.fy; + fill->radial.a = fill->radial.dr * fill->radial.dr - fill->radial.dx * fill->radial.dx - fill->radial.dy * fill->radial.dy; + } + + if (fill->radial.a > 0) fill->radial.invA = 1.0f / fill->radial.a; + + auto gradTransform = radial->transform(); + bool isTransformation = !mathIdentity((const Matrix*)(&gradTransform)); + + if (transform) { + if (isTransformation) gradTransform = mathMultiply(transform, &gradTransform); + else { + gradTransform = *transform; + isTransformation = true; + } + } + + if (isTransformation) { + Matrix invTransform; + if (!mathInverse(&gradTransform, &invTransform)) return false; + fill->radial.a11 = invTransform.e11; + fill->radial.a12 = invTransform.e12; + fill->radial.a13 = invTransform.e13; + fill->radial.a21 = invTransform.e21; + fill->radial.a22 = invTransform.e22; + fill->radial.a23 = invTransform.e23; + } else { + fill->radial.a11 = fill->radial.a22 = 1.0f; + fill->radial.a12 = fill->radial.a13 = 0.0f; + fill->radial.a21 = fill->radial.a23 = 0.0f; + } + return true; +} + + +static inline uint32_t _clamp(const SwFill* fill, int32_t pos) +{ + switch (fill->spread) { + case FillSpread::Pad: { + if (pos >= GRADIENT_STOP_SIZE) pos = GRADIENT_STOP_SIZE - 1; + else if (pos < 0) pos = 0; + break; + } + case FillSpread::Repeat: { + pos = pos % GRADIENT_STOP_SIZE; + if (pos < 0) pos = GRADIENT_STOP_SIZE + pos; + break; + } + case FillSpread::Reflect: { + auto limit = GRADIENT_STOP_SIZE * 2; + pos = pos % limit; + if (pos < 0) pos = limit + pos; + if (pos >= GRADIENT_STOP_SIZE) pos = (limit - pos - 1); + break; + } + } + return pos; +} + + +static inline uint32_t _fixedPixel(const SwFill* fill, int32_t pos) +{ + int32_t i = (pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; + return fill->ctable[_clamp(fill, i)]; +} + + +static inline uint32_t _pixel(const SwFill* fill, float pos) +{ + auto i = static_cast(pos * (GRADIENT_STOP_SIZE - 1) + 0.5f); + return fill->ctable[_clamp(fill, i)]; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + + +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) +{ + //edge case + if (fill->radial.a < RADIAL_A_THRESHOLD) { + auto radial = &fill->radial; + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + + if (opacity == 255) { + for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + *dst = opBlendNormal(_pixel(fill, x0), *dst, alpha(cmp)); + rx += radial->a11; + ry += radial->a21; + } + } else { + for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + *dst = opBlendNormal(_pixel(fill, x0), *dst, MULTIPLY(opacity, alpha(cmp))); + rx += radial->a11; + ry += radial->a21; + } + } + } else { + float b, deltaB, det, deltaDet, deltaDeltaDet; + _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); + + if (opacity == 255) { + for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { + *dst = opBlendNormal(_pixel(fill, sqrtf(det) - b), *dst, alpha(cmp)); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } else { + for (uint32_t i = 0 ; i < len ; ++i, ++dst, cmp += csize) { + *dst = opBlendNormal(_pixel(fill, sqrtf(det) - b), *dst, MULTIPLY(opacity, alpha(cmp))); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } + } +} + + +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) +{ + if (fill->radial.a < RADIAL_A_THRESHOLD) { + auto radial = &fill->radial; + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + for (uint32_t i = 0; i < len; ++i, ++dst) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + *dst = op(_pixel(fill, x0), *dst, a); + rx += radial->a11; + ry += radial->a21; + } + } else { + float b, deltaB, det, deltaDet, deltaDeltaDet; + _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); + + for (uint32_t i = 0; i < len; ++i, ++dst) { + *dst = op(_pixel(fill, sqrtf(det) - b), *dst, a); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } +} + + +void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t a) +{ + if (fill->radial.a < RADIAL_A_THRESHOLD) { + auto radial = &fill->radial; + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + for (uint32_t i = 0 ; i < len ; ++i, ++dst) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + auto src = MULTIPLY(a, A(_pixel(fill, x0))); + *dst = maskOp(src, *dst, ~src); + rx += radial->a11; + ry += radial->a21; + } + } else { + float b, deltaB, det, deltaDet, deltaDeltaDet; + _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); + + for (uint32_t i = 0 ; i < len ; ++i, ++dst) { + auto src = MULTIPLY(a, A(_pixel(fill, sqrtf(det) - b))); + *dst = maskOp(src, *dst, ~src); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } +} + + +void fillRadial(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t a) +{ + if (fill->radial.a < RADIAL_A_THRESHOLD) { + auto radial = &fill->radial; + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + for (uint32_t i = 0 ; i < len ; ++i, ++dst, ++cmp) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + auto src = MULTIPLY(A(A(_pixel(fill, x0))), a); + auto tmp = maskOp(src, *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + rx += radial->a11; + ry += radial->a21; + } + } else { + float b, deltaB, det, deltaDet, deltaDeltaDet; + _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); + + for (uint32_t i = 0 ; i < len ; ++i, ++dst, ++cmp) { + auto src = MULTIPLY(A(_pixel(fill, sqrtf(det))), a); + auto tmp = maskOp(src, *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + deltaDet += deltaDeltaDet; + b += deltaB; + } + } +} + + +void fillRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) +{ + if (fill->radial.a < RADIAL_A_THRESHOLD) { + auto radial = &fill->radial; + auto rx = (x + 0.5f) * radial->a11 + (y + 0.5f) * radial->a12 + radial->a13 - radial->fx; + auto ry = (x + 0.5f) * radial->a21 + (y + 0.5f) * radial->a22 + radial->a23 - radial->fy; + + if (a == 255) { + for (uint32_t i = 0; i < len; ++i, ++dst) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + auto tmp = op(_pixel(fill, x0), *dst, 255); + *dst = op2(tmp, *dst, 255); + rx += radial->a11; + ry += radial->a21; + } + } else { + for (uint32_t i = 0; i < len; ++i, ++dst) { + auto x0 = 0.5f * (rx * rx + ry * ry - radial->fr * radial->fr) / (radial->dr * radial->fr + rx * radial->dx + ry * radial->dy); + auto tmp = op(_pixel(fill, x0), *dst, 255); + auto tmp2 = op2(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, a); + rx += radial->a11; + ry += radial->a21; + } + } + } else { + float b, deltaB, det, deltaDet, deltaDeltaDet; + _calculateCoefficients(fill, x, y, b, deltaB, det, deltaDet, deltaDeltaDet); + if (a == 255) { + for (uint32_t i = 0 ; i < len ; ++i, ++dst) { + auto tmp = op(_pixel(fill, sqrtf(det) - b), *dst, 255); + *dst = op2(tmp, *dst, 255); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } else { + for (uint32_t i = 0 ; i < len ; ++i, ++dst) { + auto tmp = op(_pixel(fill, sqrtf(det) - b), *dst, 255); + auto tmp2 = op2(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, a); + det += deltaDet; + deltaDet += deltaDeltaDet; + b += deltaB; + } + } + } +} + + +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) +{ + //Rotation + float rx = x + 0.5f; + float ry = y + 0.5f; + float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); + float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); + + if (opacity == 255) { + if (mathZero(inc)) { + auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); + for (uint32_t i = 0; i < len; ++i, ++dst, cmp += csize) { + *dst = opBlendNormal(color, *dst, alpha(cmp)); + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst, cmp += csize) { + *dst = opBlendNormal(_fixedPixel(fill, t2), *dst, alpha(cmp)); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + *dst = opBlendNormal(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, alpha(cmp)); + ++dst; + t += inc; + cmp += csize; + } + } + } else { + if (mathZero(inc)) { + auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); + for (uint32_t i = 0; i < len; ++i, ++dst, cmp += csize) { + *dst = opBlendNormal(color, *dst, MULTIPLY(alpha(cmp), opacity)); + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst, cmp += csize) { + *dst = opBlendNormal(_fixedPixel(fill, t2), *dst, MULTIPLY(alpha(cmp), opacity)); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + *dst = opBlendNormal(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, MULTIPLY(opacity, alpha(cmp))); + ++dst; + t += inc; + cmp += csize; + } + } + } +} + + +void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask maskOp, uint8_t a) +{ + //Rotation + float rx = x + 0.5f; + float ry = y + 0.5f; + float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); + float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); + + if (mathZero(inc)) { + auto src = MULTIPLY(a, A(_fixedPixel(fill, static_cast(t * FIXPT_SIZE)))); + for (uint32_t i = 0; i < len; ++i, ++dst) { + *dst = maskOp(src, *dst, ~src); + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst) { + auto src = MULTIPLY(_fixedPixel(fill, t2), a); + *dst = maskOp(src, *dst, ~src); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + auto src = MULTIPLY(_pixel(fill, t / GRADIENT_STOP_SIZE), a); + *dst = maskOp(src, *dst, ~src); + ++dst; + t += inc; + } + } +} + + +void fillLinear(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask maskOp, uint8_t a) +{ + //Rotation + float rx = x + 0.5f; + float ry = y + 0.5f; + float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); + float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); + + if (mathZero(inc)) { + auto src = A(_fixedPixel(fill, static_cast(t * FIXPT_SIZE))); + src = MULTIPLY(src, a); + for (uint32_t i = 0; i < len; ++i, ++dst, ++cmp) { + auto tmp = maskOp(src, *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst, ++cmp) { + auto src = MULTIPLY(a, A(_fixedPixel(fill, t2))); + auto tmp = maskOp(src, *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + auto src = MULTIPLY(A(_pixel(fill, t / GRADIENT_STOP_SIZE)), a); + auto tmp = maskOp(src, *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + ++dst; + ++cmp; + t += inc; + } + } +} + + +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) +{ + //Rotation + float rx = x + 0.5f; + float ry = y + 0.5f; + float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); + float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); + + if (mathZero(inc)) { + auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); + for (uint32_t i = 0; i < len; ++i, ++dst) { + *dst = op(color, *dst, a); + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst) { + *dst = op(_fixedPixel(fill, t2), *dst, a); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + *dst = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, a); + ++dst; + t += inc; + } + } +} + + +void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) +{ + //Rotation + float rx = x + 0.5f; + float ry = y + 0.5f; + float t = (fill->linear.dx * rx + fill->linear.dy * ry + fill->linear.offset) * (GRADIENT_STOP_SIZE - 1); + float inc = (fill->linear.dx) * (GRADIENT_STOP_SIZE - 1); + + if (mathZero(inc)) { + auto color = _fixedPixel(fill, static_cast(t * FIXPT_SIZE)); + if (a == 255) { + for (uint32_t i = 0; i < len; ++i, ++dst) { + auto tmp = op(color, *dst, a); + *dst = op2(tmp, *dst, 255); + } + } else { + for (uint32_t i = 0; i < len; ++i, ++dst) { + auto tmp = op(color, *dst, a); + auto tmp2 = op2(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, a); + } + } + return; + } + + auto vMax = static_cast(INT32_MAX >> (FIXPT_BITS + 1)); + auto vMin = -vMax; + auto v = t + (inc * len); + + if (a == 255) { + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst) { + auto tmp = op(_fixedPixel(fill, t2), *dst, 255); + *dst = op2(tmp, *dst, 255); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + auto tmp = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, 255); + *dst = op2(tmp, *dst, 255); + ++dst; + t += inc; + } + } + } else { + //we can use fixed point math + if (v < vMax && v > vMin) { + auto t2 = static_cast(t * FIXPT_SIZE); + auto inc2 = static_cast(inc * FIXPT_SIZE); + for (uint32_t j = 0; j < len; ++j, ++dst) { + auto tmp = op(_fixedPixel(fill, t2), *dst, 255); + auto tmp2 = op2(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, a); + t2 += inc2; + } + //we have to fallback to float math + } else { + uint32_t counter = 0; + while (counter++ < len) { + auto tmp = op(_pixel(fill, t / GRADIENT_STOP_SIZE), *dst, 255); + auto tmp2 = op2(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, a); + ++dst; + t += inc; + } + } + } +} + + +bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) +{ + if (!fill) return false; + + fill->spread = fdata->spread(); + + if (ctable) { + if (!_updateColorTable(fill, fdata, surface, opacity)) return false; + } + + if (fdata->identifier() == TVG_CLASS_ID_LINEAR) { + return _prepareLinear(fill, static_cast(fdata), transform); + } else if (fdata->identifier() == TVG_CLASS_ID_RADIAL) { + return _prepareRadial(fill, static_cast(fdata), transform); + } + + //LOG: What type of gradient?! + + return false; +} + + +void fillReset(SwFill* fill) +{ + if (fill->ctable) { + free(fill->ctable); + fill->ctable = nullptr; + } + fill->translucent = false; +} + + +void fillFree(SwFill* fill) +{ + if (!fill) return; + + if (fill->ctable) free(fill->ctable); + + free(fill); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwImage.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwImage.cpp new file mode 100644 index 0000000..040c389 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwImage.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgSwCommon.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static inline bool _onlyShifted(const Matrix* m) +{ + if (mathEqual(m->e11, 1.0f) && mathEqual(m->e22, 1.0f) && mathZero(m->e12) && mathZero(m->e21)) return true; + return false; +} + + +static bool _genOutline(SwImage* image, const RenderMesh* mesh, const Matrix* transform, SwMpool* mpool, unsigned tid) +{ + image->outline = mpoolReqOutline(mpool, tid); + auto outline = image->outline; + + outline->pts.reserve(5); + outline->types.reserve(5); + outline->cntrs.reserve(1); + outline->closed.reserve(1); + + Point to[4]; + if (mesh->triangleCnt > 0) { + // TODO: Optimise me. We appear to calculate this exact min/max bounding area in multiple + // places. We should be able to re-use one we have already done? Also see: + // tvgPicture.h --> bounds + // tvgSwRasterTexmap.h --> _rasterTexmapPolygonMesh + // + // TODO: Should we calculate the exact path(s) of the triangle mesh instead? + // i.e. copy tvgSwShape.capp -> _genOutline? + // + // TODO: Cntrs? + auto triangles = mesh->triangles; + auto min = triangles[0].vertex[0].pt; + auto max = triangles[0].vertex[0].pt; + + for (uint32_t i = 0; i < mesh->triangleCnt; ++i) { + if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; + else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; + if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; + else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; + + if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; + else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; + if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; + else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; + + if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; + else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; + if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; + else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; + } + to[0] = {min.x, min.y}; + to[1] = {max.x, min.y}; + to[2] = {max.x, max.y}; + to[3] = {min.x, max.y}; + } else { + auto w = static_cast(image->w); + auto h = static_cast(image->h); + to[0] = {0, 0}; + to[1] = {w, 0}; + to[2] = {w, h}; + to[3] = {0, h}; + } + + for (int i = 0; i < 4; i++) { + outline->pts.push(mathTransform(&to[i], transform)); + outline->types.push(SW_CURVE_TYPE_POINT); + } + + outline->pts.push(outline->pts[0]); + outline->types.push(SW_CURVE_TYPE_POINT); + outline->cntrs.push(outline->pts.count - 1); + outline->closed.push(true); + + image->outline = outline; + + return true; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) +{ + image->direct = _onlyShifted(transform); + + //Fast track: Non-transformed image but just shifted. + if (image->direct) { + image->ox = -static_cast(round(transform->e13)); + image->oy = -static_cast(round(transform->e23)); + //Figure out the scale factor by transform matrix + } else { + auto scaleX = sqrtf((transform->e11 * transform->e11) + (transform->e21 * transform->e21)); + auto scaleY = sqrtf((transform->e22 * transform->e22) + (transform->e12 * transform->e12)); + image->scale = (fabsf(scaleX - scaleY) > 0.01f) ? 1.0f : scaleX; + + if (mathZero(transform->e12) && mathZero(transform->e21)) image->scaled = true; + else image->scaled = false; + } + + if (!_genOutline(image, mesh, transform, mpool, tid)) return false; + return mathUpdateOutlineBBox(image->outline, clipRegion, renderRegion, image->direct); +} + + +bool imageGenRle(SwImage* image, const SwBBox& renderRegion, bool antiAlias) +{ + if ((image->rle = rleRender(image->rle, image->outline, renderRegion, antiAlias))) return true; + + return false; +} + + +void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid) +{ + mpoolRetOutline(mpool, tid); + image->outline = nullptr; +} + + +void imageReset(SwImage* image) +{ + rleReset(image->rle); +} + + +void imageFree(SwImage* image) +{ + rleFree(image->rle); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwMath.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwMath.cpp new file mode 100644 index 0000000..b636c04 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwMath.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgSwCommon.h" + + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static float TO_RADIAN(SwFixed angle) +{ + return (float(angle) / 65536.0f) * (MATH_PI / 180.0f); +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +SwFixed mathMean(SwFixed angle1, SwFixed angle2) +{ + return angle1 + mathDiff(angle1, angle2) / 2; +} + + +bool mathSmallCubic(const SwPoint* base, SwFixed& angleIn, SwFixed& angleMid, SwFixed& angleOut) +{ + auto d1 = base[2] - base[3]; + auto d2 = base[1] - base[2]; + auto d3 = base[0] - base[1]; + + if (d1 == d2 || d2 == d3) { + if (d3.small()) angleIn = angleMid = angleOut = 0; + else angleIn = angleMid = angleOut = mathAtan(d3); + return true; + } + + if (d1.small()) { + if (d2.small()) { + if (d3.small()) { + angleIn = angleMid = angleOut = 0; + return true; + } else { + angleIn = angleMid = angleOut = mathAtan(d3); + } + } else { + if (d3.small()) { + angleIn = angleMid = angleOut = mathAtan(d2); + } else { + angleIn = angleMid = mathAtan(d2); + angleOut = mathAtan(d3); + } + } + } else { + if (d2.small()) { + if (d3.small()) { + angleIn = angleMid = angleOut = mathAtan(d1); + } else { + angleIn = mathAtan(d1); + angleOut = mathAtan(d3); + angleMid = mathMean(angleIn, angleOut); + } + } else { + if (d3.small()) { + angleIn = mathAtan(d1); + angleMid = angleOut = mathAtan(d2); + } else { + angleIn = mathAtan(d1); + angleMid = mathAtan(d2); + angleOut = mathAtan(d3); + } + } + } + + auto theta1 = abs(mathDiff(angleIn, angleMid)); + auto theta2 = abs(mathDiff(angleMid, angleOut)); + + if ((theta1 < (SW_ANGLE_PI / 8)) && (theta2 < (SW_ANGLE_PI / 8))) return true; + return false; +} + + +int64_t mathMultiply(int64_t a, int64_t b) +{ + int32_t s = 1; + + //move sign + if (a < 0) { + a = -a; + s = -s; + } + if (b < 0) { + b = -b; + s = -s; + } + int64_t c = (a * b + 0x8000L) >> 16; + return (s > 0) ? c : -c; +} + + +int64_t mathDivide(int64_t a, int64_t b) +{ + int32_t s = 1; + + //move sign + if (a < 0) { + a = -a; + s = -s; + } + if (b < 0) { + b = -b; + s = -s; + } + int64_t q = b > 0 ? ((a << 16) + (b >> 1)) / b : 0x7FFFFFFFL; + return (s < 0 ? -q : q); +} + + +int64_t mathMulDiv(int64_t a, int64_t b, int64_t c) +{ + int32_t s = 1; + + //move sign + if (a < 0) { + a = -a; + s = -s; + } + if (b < 0) { + b = -b; + s = -s; + } + if (c < 0) { + c = -c; + s = -s; + } + int64_t d = c > 0 ? (a * b + (c >> 1)) / c : 0x7FFFFFFFL; + + return (s > 0 ? d : -d); +} + + +void mathRotate(SwPoint& pt, SwFixed angle) +{ + if (angle == 0 || pt.zero()) return; + + Point v = pt.toPoint(); + + auto radian = TO_RADIAN(angle); + auto cosv = cosf(radian); + auto sinv = sinf(radian); + + pt.x = SwCoord(roundf((v.x * cosv - v.y * sinv) * 64.0f)); + pt.y = SwCoord(roundf((v.x * sinv + v.y * cosv) * 64.0f)); +} + + +SwFixed mathTan(SwFixed angle) +{ + if (angle == 0) return 0; + return SwFixed(tanf(TO_RADIAN(angle)) * 65536.0f); +} + + +SwFixed mathAtan(const SwPoint& pt) +{ + if (pt.zero()) return 0; + return SwFixed(atan2f(TO_FLOAT(pt.y), TO_FLOAT(pt.x)) * (180.0f / MATH_PI) * 65536.0f); +} + + +SwFixed mathSin(SwFixed angle) +{ + if (angle == 0) return 0; + return mathCos(SW_ANGLE_PI2 - angle); +} + + +SwFixed mathCos(SwFixed angle) +{ + return SwFixed(cosf(TO_RADIAN(angle)) * 65536.0f); +} + + +SwFixed mathLength(const SwPoint& pt) +{ + if (pt.zero()) return 0; + + //trivial case + if (pt.x == 0) return abs(pt.y); + if (pt.y == 0) return abs(pt.x); + + auto v = pt.toPoint(); + //return static_cast(sqrtf(v.x * v.x + v.y * v.y) * 65536.0f); + + /* approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. + With alpha = 1, beta = 3/8, giving results with the largest error less + than 7% compared to the exact value. */ + if (v.x < 0) v.x = -v.x; + if (v.y < 0) v.y = -v.y; + return (SwFixed)((v.x > v.y) ? (v.x + v.y * 0.375f) : (v.y + v.x * 0.375f)); +} + + +void mathSplitCubic(SwPoint* base) +{ + SwCoord a, b, c, d; + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = (base[0].x + c) >> 1; + base[5].x = b = (base[3].x + d) >> 1; + c = (c + d) >> 1; + base[2].x = a = (a + c) >> 1; + base[4].x = b = (b + c) >> 1; + base[3].x = (a + b) >> 1; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = (base[0].y + c) >> 1; + base[5].y = b = (base[3].y + d) >> 1; + c = (c + d) >> 1; + base[2].y = a = (a + c) >> 1; + base[4].y = b = (b + c) >> 1; + base[3].y = (a + b) >> 1; +} + + +SwFixed mathDiff(SwFixed angle1, SwFixed angle2) +{ + auto delta = angle2 - angle1; + + delta %= SW_ANGLE_2PI; + if (delta < 0) delta += SW_ANGLE_2PI; + if (delta > SW_ANGLE_PI) delta -= SW_ANGLE_2PI; + + return delta; +} + + +SwPoint mathTransform(const Point* to, const Matrix* transform) +{ + if (!transform) return {TO_SWCOORD(to->x), TO_SWCOORD(to->y)}; + + auto tx = to->x * transform->e11 + to->y * transform->e12 + transform->e13; + auto ty = to->x * transform->e21 + to->y * transform->e22 + transform->e23; + + return {TO_SWCOORD(tx), TO_SWCOORD(ty)}; +} + + +bool mathClipBBox(const SwBBox& clipper, SwBBox& clipee) +{ + clipee.max.x = (clipee.max.x < clipper.max.x) ? clipee.max.x : clipper.max.x; + clipee.max.y = (clipee.max.y < clipper.max.y) ? clipee.max.y : clipper.max.y; + clipee.min.x = (clipee.min.x > clipper.min.x) ? clipee.min.x : clipper.min.x; + clipee.min.y = (clipee.min.y > clipper.min.y) ? clipee.min.y : clipper.min.y; + + //Check valid region + if (clipee.max.x - clipee.min.x < 1 && clipee.max.y - clipee.min.y < 1) return false; + + //Check boundary + if (clipee.min.x >= clipper.max.x || clipee.min.y >= clipper.max.y || + clipee.max.x <= clipper.min.x || clipee.max.y <= clipper.min.y) return false; + + return true; +} + + +bool mathUpdateOutlineBBox(const SwOutline* outline, const SwBBox& clipRegion, SwBBox& renderRegion, bool fastTrack) +{ + if (!outline) return false; + + auto pt = outline->pts.data; + + if (outline->pts.empty() || outline->cntrs.empty()) { + renderRegion.reset(); + return false; + } + + auto xMin = pt->x; + auto xMax = pt->x; + auto yMin = pt->y; + auto yMax = pt->y; + + for (++pt; pt < outline->pts.end(); ++pt) { + if (xMin > pt->x) xMin = pt->x; + if (xMax < pt->x) xMax = pt->x; + if (yMin > pt->y) yMin = pt->y; + if (yMax < pt->y) yMax = pt->y; + } + //Since no antialiasing is applied in the Fast Track case, + //the rasterization region has to be rearranged. + //https://github.com/Samsung/thorvg/issues/916 + if (fastTrack) { + renderRegion.min.x = static_cast(round(xMin / 64.0f)); + renderRegion.max.x = static_cast(round(xMax / 64.0f)); + renderRegion.min.y = static_cast(round(yMin / 64.0f)); + renderRegion.max.y = static_cast(round(yMax / 64.0f)); + } else { + renderRegion.min.x = xMin >> 6; + renderRegion.max.x = (xMax + 63) >> 6; + renderRegion.min.y = yMin >> 6; + renderRegion.max.y = (yMax + 63) >> 6; + } + return mathClipBBox(clipRegion, renderRegion); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwMemPool.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwMemPool.cpp new file mode 100644 index 0000000..b9675e5 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwMemPool.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgSwCommon.h" + + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +SwOutline* mpoolReqOutline(SwMpool* mpool, unsigned idx) +{ + return &mpool->outline[idx]; +} + + +void mpoolRetOutline(SwMpool* mpool, unsigned idx) +{ + mpool->outline[idx].pts.clear(); + mpool->outline[idx].cntrs.clear(); + mpool->outline[idx].types.clear(); + mpool->outline[idx].closed.clear(); +} + + +SwOutline* mpoolReqStrokeOutline(SwMpool* mpool, unsigned idx) +{ + return &mpool->strokeOutline[idx]; +} + + +void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx) +{ + mpool->strokeOutline[idx].pts.clear(); + mpool->strokeOutline[idx].cntrs.clear(); + mpool->strokeOutline[idx].types.clear(); + mpool->strokeOutline[idx].closed.clear(); +} + + +SwOutline* mpoolReqDashOutline(SwMpool* mpool, unsigned idx) +{ + return &mpool->dashOutline[idx]; +} + + +void mpoolRetDashOutline(SwMpool* mpool, unsigned idx) +{ + mpool->dashOutline[idx].pts.clear(); + mpool->dashOutline[idx].cntrs.clear(); + mpool->dashOutline[idx].types.clear(); + mpool->dashOutline[idx].closed.clear(); +} + + +SwMpool* mpoolInit(uint32_t threads) +{ + auto allocSize = threads + 1; + + auto mpool = static_cast(calloc(sizeof(SwMpool), 1)); + mpool->outline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); + mpool->strokeOutline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); + mpool->dashOutline = static_cast(calloc(1, sizeof(SwOutline) * allocSize)); + mpool->allocSize = allocSize; + return mpool; +} + + +bool mpoolClear(SwMpool* mpool) +{ + for (unsigned i = 0; i < mpool->allocSize; ++i) { + mpool->outline[i].pts.reset(); + mpool->outline[i].cntrs.reset(); + mpool->outline[i].types.reset(); + mpool->outline[i].closed.reset(); + + mpool->strokeOutline[i].pts.reset(); + mpool->strokeOutline[i].cntrs.reset(); + mpool->strokeOutline[i].types.reset(); + mpool->strokeOutline[i].closed.reset(); + + mpool->dashOutline[i].pts.reset(); + mpool->dashOutline[i].cntrs.reset(); + mpool->dashOutline[i].types.reset(); + mpool->dashOutline[i].closed.reset(); + } + + return true; +} + + +bool mpoolTerm(SwMpool* mpool) +{ + if (!mpool) return false; + + mpoolClear(mpool); + + free(mpool->outline); + free(mpool->strokeOutline); + free(mpool->dashOutline); + free(mpool); + + return true; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRaster.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwRaster.cpp new file mode 100644 index 0000000..dc8c76e --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRaster.cpp @@ -0,0 +1,1957 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifdef _WIN32 + #include +#elif defined(__linux__) + #include +#else + #include +#endif + +#include "tvgMath.h" +#include "tvgRender.h" +#include "tvgSwCommon.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ +constexpr auto DOWN_SCALE_TOLERANCE = 0.5f; + +struct FillLinear +{ + void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a) + { + fillLinear(fill, dst, y, x, len, op, a); + } + + void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) + { + fillLinear(fill, dst, y, x, len, cmp, op, a); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) + { + fillLinear(fill, dst, y, x, len, op, a); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) + { + fillLinear(fill, dst, y, x, len, cmp, alpha, csize, opacity); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) + { + fillLinear(fill, dst, y, x, len, op, op2, a); + } + +}; + +struct FillRadial +{ + void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, SwMask op, uint8_t a) + { + fillRadial(fill, dst, y, x, len, op, a); + } + + void operator()(const SwFill* fill, uint8_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwMask op, uint8_t a) + { + fillRadial(fill, dst, y, x, len, cmp, op, a); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, uint8_t a) + { + fillRadial(fill, dst, y, x, len, op, a); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, uint8_t* cmp, SwAlpha alpha, uint8_t csize, uint8_t opacity) + { + fillRadial(fill, dst, y, x, len, cmp, alpha, csize, opacity); + } + + void operator()(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len, SwBlender op, SwBlender op2, uint8_t a) + { + fillRadial(fill, dst, y, x, len, op, op2, a); + } +}; + + +static inline uint8_t _alpha(uint8_t* a) +{ + return *a; +} + + +static inline uint8_t _ialpha(uint8_t* a) +{ + return ~(*a); +} + + +static inline uint8_t _abgrLuma(uint8_t* c) +{ + auto v = *(uint32_t*)c; + return ((((v&0xff)*54) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*19))) >> 8; //0.2125*R + 0.7154*G + 0.0721*B +} + + +static inline uint8_t _argbLuma(uint8_t* c) +{ + auto v = *(uint32_t*)c; + return ((((v&0xff)*19) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*54))) >> 8; //0.0721*B + 0.7154*G + 0.2125*R +} + + +static inline uint8_t _abgrInvLuma(uint8_t* c) +{ + return ~_abgrLuma(c); +} + + +static inline uint8_t _argbInvLuma(uint8_t* c) +{ + return ~_argbLuma(c); +} + + +static inline uint32_t _abgrJoin(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + return (a << 24 | b << 16 | g << 8 | r); +} + + +static inline uint32_t _argbJoin(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + return (a << 24 | r << 16 | g << 8 | b); +} + +static inline bool _blending(const SwSurface* surface) +{ + return (surface->blender) ? true : false; +} + + +/* OPTIMIZE_ME: Probably, we can separate masking(8bits) / composition(32bits) + This would help to enhance the performance by avoiding the unnecessary matting from the composition */ +static inline bool _compositing(const SwSurface* surface) +{ + if (!surface->compositor || (int)surface->compositor->method <= (int)CompositeMethod::ClipPath) return false; + return true; +} + + +static inline bool _matting(const SwSurface* surface) +{ + if ((int)surface->compositor->method < (int)CompositeMethod::AddMask) return true; + else return false; +} + +static inline uint8_t _opMaskNone(uint8_t s, TVG_UNUSED uint8_t d, TVG_UNUSED uint8_t a) +{ + return s; +} + +static inline uint8_t _opMaskAdd(uint8_t s, uint8_t d, uint8_t a) +{ + return s + MULTIPLY(d, a); +} + + +static inline uint8_t _opMaskSubtract(uint8_t s, uint8_t d, TVG_UNUSED uint8_t a) +{ + return MULTIPLY(s, 255 - d); +} + + +static inline uint8_t _opMaskIntersect(uint8_t s, uint8_t d, TVG_UNUSED uint8_t a) +{ + return MULTIPLY(s, d); +} + + +static inline uint8_t _opMaskDifference(uint8_t s, uint8_t d, uint8_t a) +{ + return MULTIPLY(s, 255 - d) + MULTIPLY(d, a); +} + + +static inline bool _direct(CompositeMethod method) +{ + //subtract & Intersect allows the direct composition + if (method == CompositeMethod::SubtractMask || method == CompositeMethod::IntersectMask) return true; + return false; +} + + +static inline SwMask _getMaskOp(CompositeMethod method) +{ + switch (method) { + case CompositeMethod::AddMask: return _opMaskAdd; + case CompositeMethod::SubtractMask: return _opMaskSubtract; + case CompositeMethod::DifferenceMask: return _opMaskDifference; + case CompositeMethod::IntersectMask: return _opMaskIntersect; + default: return nullptr; + } +} + + +static bool _compositeMaskImage(SwSurface* surface, const SwImage* image, const SwBBox& region) +{ + auto dbuffer = &surface->buf8[region.min.y * surface->stride + region.min.x]; + auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + + for (auto y = region.min.y; y < region.max.y; ++y) { + auto dst = dbuffer; + auto src = sbuffer; + for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { + *dst = *src + MULTIPLY(*dst, ~*src); + } + dbuffer += surface->stride; + sbuffer += image->stride; + } + return true; +} + + +#include "tvgSwRasterTexmap.h" +#include "tvgSwRasterC.h" +#include "tvgSwRasterAvx.h" +#include "tvgSwRasterNeon.h" + + +static inline uint32_t _sampleSize(float scale) +{ + auto sampleSize = static_cast(0.5f / scale); + if (sampleSize == 0) sampleSize = 1; + return sampleSize; +} + + +//Bilinear Interpolation +//OPTIMIZE_ME: Skip the function pointer access +static uint32_t _interpUpScaler(const uint32_t *img, TVG_UNUSED uint32_t stride, uint32_t w, uint32_t h, float sx, float sy, TVG_UNUSED int32_t miny, TVG_UNUSED int32_t maxy, TVG_UNUSED int32_t n) +{ + auto rx = (size_t)(sx); + auto ry = (size_t)(sy); + auto rx2 = rx + 1; + if (rx2 >= w) rx2 = w - 1; + auto ry2 = ry + 1; + if (ry2 >= h) ry2 = h - 1; + + auto dx = static_cast((sx - rx) * 255.0f); + auto dy = static_cast((sy - ry) * 255.0f); + + auto c1 = img[rx + ry * w]; + auto c2 = img[rx2 + ry * w]; + auto c3 = img[rx2 + ry2 * w]; + auto c4 = img[rx + ry2 * w]; + + return INTERPOLATE(INTERPOLATE(c3, c4, dx), INTERPOLATE(c2, c1, dx), dy); +} + + +//2n x 2n Mean Kernel +//OPTIMIZE_ME: Skip the function pointer access +static uint32_t _interpDownScaler(const uint32_t *img, uint32_t stride, uint32_t w, uint32_t h, float sx, TVG_UNUSED float sy, int32_t miny, int32_t maxy, int32_t n) +{ + size_t c[4] = {0, 0, 0, 0}; + + int32_t minx = (int32_t)sx - n; + if (minx < 0) minx = 0; + + int32_t maxx = (int32_t)sx + n; + if (maxx >= (int32_t)w) maxx = w; + + auto src = img + minx + miny * stride; + + for (auto y = miny; y < maxy; ++y) { + auto p = src; + for (auto x = minx; x < maxx; ++x, ++p) { + c[0] += *p >> 24; + c[1] += (*p >> 16) & 0xff; + c[2] += (*p >> 8) & 0xff; + c[3] += *p & 0xff; + } + src += stride; + } + + n = (maxy - miny) * (maxx - minx); + + c[0] /= n; + c[1] /= n; + c[2] /= n; + c[3] /= n; + + return (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]; +} + + +/************************************************************************/ +/* Rect */ +/************************************************************************/ + +static bool _rasterCompositeMaskedRect(SwSurface* surface, const SwBBox& region, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); //compositor buffer + auto ialpha = 255 - a; + + for (uint32_t y = 0; y < h; ++y) { + auto cmp = cbuffer; + for (uint32_t x = 0; x < w; ++x, ++cmp) { + *cmp = maskOp(a, *cmp, ialpha); + } + cbuffer += cstride; + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +static bool _rasterDirectMaskedRect(SwSurface* surface, const SwBBox& region, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x); //compositor buffer + auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); //destination buffer + + for (uint32_t y = 0; y < h; ++y) { + auto cmp = cbuffer; + auto dst = dbuffer; + for (uint32_t x = 0; x < w; ++x, ++cmp, ++dst) { + auto tmp = maskOp(a, *cmp, 0); //not use alpha. + *dst = tmp + MULTIPLY(*dst, ~tmp); + } + cbuffer += surface->compositor->image.stride; + dbuffer += surface->stride; + } + return true; +} + + +static bool _rasterMaskedRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + //8bit masking channels composition + if (surface->channelSize != sizeof(uint8_t)) return false; + + TVGLOG("SW_ENGINE", "Masked(%d) Rect [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); + + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) return _rasterDirectMaskedRect(surface, region, maskOp, r, g, b, a); + else return _rasterCompositeMaskedRect(surface, region, maskOp, r, g, b, a); + return false; +} + + +static bool _rasterMattedRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + ((region.min.y * surface->compositor->image.stride + region.min.x) * csize); //compositor buffer + auto alpha = surface->alpha(surface->compositor->method); + + TVGLOG("SW_ENGINE", "Matted(%d) Rect [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); + + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + auto cmp = &cbuffer[y * surface->compositor->image.stride * csize]; + for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { + *dst = INTERPOLATE(color, *dst, alpha(cmp)); + } + } + //8bits grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + auto cmp = &cbuffer[y * surface->compositor->image.stride * csize]; + for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { + *dst = INTERPOLATE8(a, *dst, alpha(cmp)); + } + } + } + return true; +} + + +static bool _rasterBlendingRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) return false; + + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + auto color = surface->join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto ialpha = 255 - a; + + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + for (uint32_t x = 0; x < w; ++x, ++dst) { + *dst = surface->blender(color, *dst, ialpha); + } + } + return true; +} + + +static bool _rasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ +#if defined(THORVG_AVX_VECTOR_SUPPORT) + return avxRasterTranslucentRect(surface, region, r, g, b, a); +#elif defined(THORVG_NEON_VECTOR_SUPPORT) + return neonRasterTranslucentRect(surface, region, r, g, b, a); +#else + return cRasterTranslucentRect(surface, region, r, g, b, a); +#endif +} + + +static bool _rasterSolidRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b) +{ + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->join(r, g, b, 255); + auto buffer = surface->buf32 + (region.min.y * surface->stride); + for (uint32_t y = 0; y < h; ++y) { + rasterPixel32(buffer + y * surface->stride, color, region.min.x, w); + } + return true; + } + //8bits grayscale + if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t y = 0; y < h; ++y) { + rasterGrayscale8(surface->buf8, 255, (y + region.min.y) * surface->stride + region.min.x, w); + } + return true; + } + return false; +} + + +static bool _rasterRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (_compositing(surface)) { + if (_matting(surface)) return _rasterMattedRect(surface, region, r, g, b, a); + else return _rasterMaskedRect(surface, region, r, g, b, a); + } else if (_blending(surface)) { + return _rasterBlendingRect(surface, region, r, g, b, a); + } else { + if (a == 255) return _rasterSolidRect(surface, region, r, g, b); + else return _rasterTranslucentRect(surface, region, r, g, b, a); + } + return false; +} + + +/************************************************************************/ +/* Rle */ +/************************************************************************/ + +static bool _rasterCompositeMaskedRle(SwSurface* surface, SwRleData* rle, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto span = rle->spans; + auto cbuffer = surface->compositor->image.buf8; + auto cstride = surface->compositor->image.stride; + uint8_t src; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto cmp = &cbuffer[span->y * cstride + span->x]; + if (span->coverage == 255) src = a; + else src = MULTIPLY(a, span->coverage); + auto ialpha = 255 - src; + for (auto x = 0; x < span->len; ++x, ++cmp) { + *cmp = maskOp(src, *cmp, ialpha); + } + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +static bool _rasterDirectMaskedRle(SwSurface* surface, SwRleData* rle, SwMask maskOp, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto span = rle->spans; + auto cbuffer = surface->compositor->image.buf8; + auto cstride = surface->compositor->image.stride; + uint8_t src; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto cmp = &cbuffer[span->y * cstride + span->x]; + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + if (span->coverage == 255) src = a; + else src = MULTIPLY(a, span->coverage); + for (auto x = 0; x < span->len; ++x, ++cmp, ++dst) { + auto tmp = maskOp(src, *cmp, 0); //not use alpha + *dst = tmp + MULTIPLY(*dst, ~tmp); + } + } + return true; +} + + +static bool _rasterMaskedRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + TVGLOG("SW_ENGINE", "Masked(%d) Rle", (int)surface->compositor->method); + + //8bit masking channels composition + if (surface->channelSize != sizeof(uint8_t)) return false; + + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) return _rasterDirectMaskedRle(surface, rle, maskOp, r, g, b, a); + else return _rasterCompositeMaskedRle(surface, rle, maskOp, r, g, b, a); + return false; +} + + +static bool _rasterMattedRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + TVGLOG("SW_ENGINE", "Matted(%d) Rle", (int)surface->compositor->method); + + auto span = rle->spans; + auto cbuffer = surface->compositor->image.buf8; + auto csize = surface->compositor->image.channelSize; + auto alpha = surface->alpha(surface->compositor->method); + + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + uint32_t src; + auto color = surface->join(r, g, b, a); + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + if (span->coverage == 255) src = color; + else src = ALPHA_BLEND(color, span->coverage); + for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { + auto tmp = ALPHA_BLEND(src, alpha(cmp)); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } + return true; + } + //8bit grayscale + if (surface->channelSize == sizeof(uint8_t)) { + uint8_t src; + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + if (span->coverage == 255) src = a; + else src = MULTIPLY(a, span->coverage); + for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { + *dst = INTERPOLATE8(src, *dst, alpha(cmp)); + } + } + return true; + } + return false; +} + + +static bool _rasterBlendingRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) return false; + + auto span = rle->spans; + auto color = surface->join(r, g, b, a); + auto ialpha = 255 - a; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + if (span->coverage == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = surface->blender(color, *dst, ialpha); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + auto tmp = surface->blender(color, *dst, ialpha); + *dst = INTERPOLATE(tmp, *dst, span->coverage); + } + } + } + return true; +} + + +static bool _rasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ +#if defined(THORVG_AVX_VECTOR_SUPPORT) + return avxRasterTranslucentRle(surface, rle, r, g, b, a); +#elif defined(THORVG_NEON_VECTOR_SUPPORT) + return neonRasterTranslucentRle(surface, rle, r, g, b, a); +#else + return cRasterTranslucentRle(surface, rle, r, g, b, a); +#endif +} + + +static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b) +{ + auto span = rle->spans; + + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->join(r, g, b, 255); + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + if (span->coverage == 255) { + rasterPixel32(surface->buf32 + span->y * surface->stride, color, span->x, span->len); + } else { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto src = ALPHA_BLEND(color, span->coverage); + auto ialpha = 255 - span->coverage; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + ALPHA_BLEND(*dst, ialpha); + } + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + if (span->coverage == 255) { + rasterGrayscale8(surface->buf8, span->coverage, span->y * surface->stride + span->x, span->len); + } else { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto ialpha = 255 - span->coverage; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = span->coverage + MULTIPLY(*dst, ialpha); + } + } + } + } + return true; +} + + +static bool _rasterRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (!rle) return false; + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterMattedRle(surface, rle, r, g, b, a); + else return _rasterMaskedRle(surface, rle, r, g, b, a); + } else if (_blending(surface)) { + return _rasterBlendingRle(surface, rle, r, g, b, a); + } else { + if (a == 255) return _rasterSolidRle(surface, rle, r, g, b); + else return _rasterTranslucentRle(surface, rle, r, g, b, a); + } + return false; +} + + +/************************************************************************/ +/* RLE Scaled Image */ +/************************************************************************/ + +#define SCALED_IMAGE_RANGE_Y(y) \ + auto sy = (y) * itransform->e22 + itransform->e23; \ + auto my = (int32_t)round(sy); \ + if (my < 0 || (uint32_t)sy >= image->h) continue; \ + if (scaleMethod == _interpDownScaler) { \ + miny = my - (int32_t)sampleSize; \ + if (miny < 0) miny = 0; \ + maxy = my + (int32_t)sampleSize; \ + if (maxy >= (int32_t)image->h) maxy = (int32_t)image->h; \ + } + +#define SCALED_IMAGE_RANGE_X \ + auto sx = x * itransform->e11 + itransform->e13; \ + if ((int32_t)round(sx) < 0 || (uint32_t) sx >= image->w) continue; + + +#if 0 //Enable it when GRAYSCALE image is supported +static bool _rasterCompositeScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + auto span = image->rle->spans; + int32_t miny = 0, maxy = 0; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + SCALED_IMAGE_RANGE_Y(span->y) + auto cmp = &surface->compositor->image.buf8[span->y * surface->compositor->image.stride + span->x]; + auto a = MULTIPLY(span->coverage, opacity); + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++cmp) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (a < 255) src = MULTIPLY(src, a); + *cmp = maskOp(src, *cmp, ~src); + } + } + return true; +} + + +static bool _rasterDirectScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + auto span = image->rle->spans; + int32_t miny = 0, maxy = 0; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + SCALED_IMAGE_RANGE_Y(span->y) + auto cmp = &surface->compositor->image.buf8[span->y * surface->compositor->image.stride + span->x]; + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto a = MULTIPLY(span->coverage, opacity); + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++cmp, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (a < 255) src = MULTIPLY(src, a); + src = maskOp(src, *cmp, 0); //not use alpha + *dst = src + MULTIPLY(*dst, ~src); + } + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} +#endif + +static bool _rasterScaledMaskedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ +#if 0 //Enable it when GRAYSCALE image is supported + TVGLOG("SW_ENGINE", "Scaled Masked(%d) Rle Image", (int)surface->compositor->method); + + //8bit masking channels composition + if (surface->channelSize != sizeof(uint8_t)) return false; + + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) return _rasterDirectScaledMaskedRleImage(surface, image, itransform, region, maskOp, opacity); + else return _rasterCompositeScaledMaskedRleImage(surface, image, itransform, region, maskOp, opacity); +#endif + return false; +} + + +static bool _rasterScaledMattedRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + TVGLOG("SW_ENGINE", "Scaled Matted(%d) Rle Image", (int)surface->compositor->method); + + auto span = image->rle->spans; + auto csize = surface->compositor->image.channelSize; + auto alpha = surface->alpha(surface->compositor->method); + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + SCALED_IMAGE_RANGE_Y(span->y) + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto a = MULTIPLY(span->coverage, opacity); + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst, cmp += csize) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + src = ALPHA_BLEND(src, (a == 255) ? alpha(cmp) : MULTIPLY(alpha(cmp), a)); + *dst = src + ALPHA_BLEND(*dst, IA(src)); + } + } + + return true; +} + + +static bool _rasterScaledBlendingRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + auto span = image->rle->spans; + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + SCALED_IMAGE_RANGE_Y(span->y) + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto alpha = MULTIPLY(span->coverage, opacity); + if (alpha == 255) { + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + auto tmp = surface->blender(src, *dst, 255); + *dst = INTERPOLATE(tmp, *dst, A(src)); + } + } else { + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (opacity < 255) src = ALPHA_BLEND(src, opacity); + auto tmp = surface->blender(src, *dst, 255); + *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(src))); + } + } + } + return true; +} + + +static bool _rasterScaledRleImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + auto span = image->rle->spans; + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + SCALED_IMAGE_RANGE_Y(span->y) + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto alpha = MULTIPLY(span->coverage, opacity); + for (uint32_t x = static_cast(span->x); x < static_cast(span->x) + span->len; ++x, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (alpha < 255) src = ALPHA_BLEND(src, alpha); + *dst = src + ALPHA_BLEND(*dst, IA(src)); + } + } + return true; +} + + +static bool _scaledRleImage(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported scaled rle image!"); + return false; + } + + Matrix itransform; + + if (transform) { + if (!mathInverse(transform, &itransform)) return false; + } else mathIdentity(&itransform); + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterScaledMattedRleImage(surface, image, &itransform, region, opacity); + else return _rasterScaledMaskedRleImage(surface, image, &itransform, region, opacity); + } else if (_blending(surface)) { + return _rasterScaledBlendingRleImage(surface, image, &itransform, region, opacity); + } else { + return _rasterScaledRleImage(surface, image, &itransform, region, opacity); + } + return false; +} + + +/************************************************************************/ +/* RLE Direct Image */ +/************************************************************************/ + +#if 0 //Enable it when GRAYSCALE image is supported +static bool _rasterCompositeDirectMaskedRleImage(SwSurface* surface, const SwImage* image, SwMask maskOp, uint8_t opacity) +{ + auto span = image->rle->spans; + auto cbuffer = surface->compositor->image.buf8; + auto ctride = surface->compositor->image.stride; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + auto src = image->buf8 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto cmp = &cbuffer[span->y * ctride + span->x]; + auto alpha = MULTIPLY(span->coverage, opacity); + if (alpha == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp) { + *cmp = maskOp(*src, *cmp, ~*src); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp) { + auto tmp = MULTIPLY(*src, alpha); + *cmp = maskOp(*src, *cmp, ~tmp); + } + } + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +static bool _rasterDirectDirectMaskedRleImage(SwSurface* surface, const SwImage* image, SwMask maskOp, uint8_t opacity) +{ + auto span = image->rle->spans; + auto cbuffer = surface->compositor->image.buf8; + auto ctride = surface->compositor->image.stride; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + auto src = image->buf8 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto cmp = &cbuffer[span->y * ctride + span->x]; + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto alpha = MULTIPLY(span->coverage, opacity); + if (alpha == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp, ++dst) { + auto tmp = maskOp(*src, *cmp, 0); //not use alpha + *dst = INTERPOLATE8(tmp, *dst, (255 - tmp)); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++src, ++cmp, ++dst) { + auto tmp = maskOp(MULTIPLY(*src, alpha), *cmp, 0); //not use alpha + *dst = INTERPOLATE8(tmp, *dst, (255 - tmp)); + } + } + } + return true; +} +#endif + +static bool _rasterDirectMaskedRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) +{ +#if 0 //Enable it when GRAYSCALE image is supported + TVGLOG("SW_ENGINE", "Direct Masked(%d) Rle Image", (int)surface->compositor->method); + + //8bit masking channels composition + if (surface->channelSize != sizeof(uint8_t)) return false; + + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) _rasterDirectDirectMaskedRleImage(surface, image, maskOp, opacity); + else return _rasterCompositeDirectMaskedRleImage(surface, image, maskOp, opacity); +#endif + return false; +} + + +static bool _rasterDirectMattedRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) +{ + TVGLOG("SW_ENGINE", "Direct Matted(%d) Rle Image", (int)surface->compositor->method); + + auto span = image->rle->spans; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; + auto alpha = surface->alpha(surface->compositor->method); + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto a = MULTIPLY(span->coverage, opacity); + if (a == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, alpha(cmp)); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, MULTIPLY(a, alpha(cmp))); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } + } + return true; +} + + +static bool _rasterDirectBlendingRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) +{ + auto span = image->rle->spans; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto alpha = MULTIPLY(span->coverage, opacity); + if (alpha == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { + *dst = surface->blender(*img, *dst, IA(*img)); + } + } else if (opacity == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { + auto tmp = surface->blender(*img, *dst, 255); + *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(*img))); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { + auto src = ALPHA_BLEND(*img, opacity); + auto tmp = surface->blender(src, *dst, IA(src)); + *dst = INTERPOLATE(tmp, *dst, MULTIPLY(span->coverage, A(src))); + } + } + } + return true; +} + + +static bool _rasterDirectRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) +{ + auto span = image->rle->spans; + + for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto alpha = MULTIPLY(span->coverage, opacity); + if (alpha == 255) { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { + *dst = *img + ALPHA_BLEND(*dst, IA(*img)); + } + } else { + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { + auto src = ALPHA_BLEND(*img, alpha); + *dst = src + ALPHA_BLEND(*dst, IA(src)); + } + } + } + return true; +} + + +static bool _directRleImage(SwSurface* surface, const SwImage* image, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale rle image!"); + return false; + } + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterDirectMattedRleImage(surface, image, opacity); + else return _rasterDirectMaskedRleImage(surface, image, opacity); + } else if (_blending(surface)) { + return _rasterDirectBlendingRleImage(surface, image, opacity); + } else { + return _rasterDirectRleImage(surface, image, opacity); + } + return false; +} + + +/************************************************************************/ +/*Scaled Image */ +/************************************************************************/ + +#if 0 //Enable it when GRAYSCALE image is supported +static bool _rasterCompositeScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); + int32_t miny = 0, maxy = 0; + + for (auto y = region.min.y; y < region.max.y; ++y) { + SCALED_IMAGE_RANGE_Y(y) + auto cmp = cbuffer; + for (auto x = region.min.x; x < region.max.x; ++x, ++cmp) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (opacity < 255) src = MULTIPLY(src, opacity); + *cmp = maskOp(src, *cmp, ~src); + } + cbuffer += cstride; + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +static bool _rasterDirectScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); + auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); + int32_t miny = 0, maxy = 0; + + for (auto y = region.min.y; y < region.max.y; ++y) { + SCALED_IMAGE_RANGE_Y(y) + auto cmp = cbuffer; + auto dst = dbuffer; + for (auto x = region.min.x; x < region.max.x; ++x, ++cmp, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf8, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (opacity < 255) src = MULTIPLY(src, opacity); + src = maskOp(src, *cmp, 0); //not use alpha + *dst = src + MULTIPLY(*dst, ~src); + } + cbuffer += cstride; + dbuffer += surface->stride; + } + return true; +} +#endif + +static bool _rasterScaledMaskedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ +#if 0 //Enable it when GRAYSCALE image is supported + TVGLOG("SW_ENGINE", "Scaled Masked(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); + + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) return _rasterDirectScaledMaskedImage(surface, image, itransform, region, maskOp, opacity); + else return _rasterCompositeScaledMaskedImage(surface, image, itransform, region, maskOp, opacity); +#endif + return false; +} + + +static bool _rasterScaledMattedImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; + auto alpha = surface->alpha(surface->compositor->method); + + TVGLOG("SW_ENGINE", "Scaled Matted(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); + + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (auto y = region.min.y; y < region.max.y; ++y) { + SCALED_IMAGE_RANGE_Y(y) + auto dst = dbuffer; + auto cmp = cbuffer; + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + auto tmp = ALPHA_BLEND(src, opacity == 255 ? alpha(cmp) : MULTIPLY(opacity, alpha(cmp))); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + dbuffer += surface->stride; + cbuffer += surface->compositor->image.stride * csize; + } + return true; +} + + +static bool _rasterScaledBlendingImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (auto y = region.min.y; y < region.max.y; ++y, dbuffer += surface->stride) { + SCALED_IMAGE_RANGE_Y(y) + auto dst = dbuffer; + for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (opacity < 255) ALPHA_BLEND(src, opacity); + auto tmp = surface->blender(src, *dst, 255); + *dst = INTERPOLATE(tmp, *dst, A(src)); + } + } + return true; +} + + +static bool _rasterScaledImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint8_t opacity) +{ + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); + auto scaleMethod = image->scale < DOWN_SCALE_TOLERANCE ? _interpDownScaler : _interpUpScaler; + auto sampleSize = _sampleSize(image->scale); + int32_t miny = 0, maxy = 0; + + for (auto y = region.min.y; y < region.max.y; ++y, dbuffer += surface->stride) { + SCALED_IMAGE_RANGE_Y(y) + auto dst = dbuffer; + for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { + SCALED_IMAGE_RANGE_X + auto src = scaleMethod(image->buf32, image->stride, image->w, image->h, sx, sy, miny, maxy, sampleSize); + if (opacity < 255) src = ALPHA_BLEND(src, opacity); + *dst = src + ALPHA_BLEND(*dst, IA(src)); + } + } + return true; +} + + +static bool _scaledImage(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon mesh!"); + return false; + } + + Matrix itransform; + + if (transform) { + if (!mathInverse(transform, &itransform)) return false; + } else mathIdentity(&itransform); + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterScaledMattedImage(surface, image, &itransform, region, opacity); + else return _rasterScaledMaskedImage(surface, image, &itransform, region, opacity); + } else if (_blending(surface)) { + return _rasterScaledBlendingImage(surface, image, &itransform, region, opacity); + } else { + return _rasterScaledImage(surface, image, &itransform, region, opacity); + } + return false; +} + + +/************************************************************************/ +/* Direct Image */ +/************************************************************************/ + +#if 0 //Enable it when GRAYSCALE image is supported +static bool _rasterCompositeDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto cstride = surface->compositor->image.stride; + + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); //compositor buffer + auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + + for (uint32_t y = 0; y < h; ++y) { + auto cmp = cbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (uint32_t x = 0; x < w; ++x, ++src, ++cmp) { + *cmp = maskOp(*src, *cmp, ~*src); + } + } else { + for (uint32_t x = 0; x < w; ++x, ++src, ++cmp) { + auto tmp = MULTIPLY(*src, opacity); + *cmp = maskOp(tmp, *cmp, ~tmp); + } + } + cbuffer += cstride; + sbuffer += image->stride; + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +static bool _rasterDirectDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, SwMask maskOp, uint8_t opacity) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto cstride = surface->compositor->image.stride; + + auto cbuffer = surface->compositor->image.buf32 + (region.min.y * cstride + region.min.x); //compositor buffer + auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); //destination buffer + auto sbuffer = image->buf8 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + + for (uint32_t y = 0; y < h; ++y) { + auto cmp = cbuffer; + auto dst = dbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (uint32_t x = 0; x < w; ++x, ++src, ++cmp, ++dst) { + auto tmp = maskOp(*src, *cmp, 0); //not use alpha + *dst = tmp + MULTIPLY(*dst, ~tmp); + } + } else { + for (uint32_t x = 0; x < w; ++x, ++src, ++cmp, ++dst) { + auto tmp = maskOp(MULTIPLY(*src, opacity), *cmp, 0); //not use alpha + *dst = tmp + MULTIPLY(*dst, ~tmp); + } + } + cbuffer += cstride; + dbuffer += surface->stride; + sbuffer += image->stride; + } + return true; +} +#endif + +static bool _rasterDirectMaskedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) +{ + TVGERR("SW_ENGINE", "Not Supported: Direct Masked(%d) Image [Region: %lu %lu %lu %lu]", (int)surface->compositor->method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); + +#if 0 //Enable it when GRAYSCALE image is supported + auto maskOp = _getMaskOp(surface->compositor->method); + if (_direct(surface->compositor->method)) return _rasterDirectDirectMaskedImage(surface, image, region, maskOp, opacity); + else return _rasterCompositeDirectMaskedImage(surface, image, region, maskOp, opacity); +#endif + return false; +} + + +static bool _rasterDirectMattedImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto csize = surface->compositor->image.channelSize; + auto alpha = surface->alpha(surface->compositor->method); + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; //compositor buffer + + TVGLOG("SW_ENGINE", "Direct Matted(%d) Image [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); + + //32 bits + if (surface->channelSize == sizeof(uint32_t)) { + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = buffer; + auto cmp = cbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, alpha(cmp)); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } else { + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, MULTIPLY(opacity, alpha(cmp))); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } + buffer += surface->stride; + cbuffer += surface->compositor->image.stride * csize; + sbuffer += image->stride; + } + //8 bits + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = buffer; + auto cmp = cbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + *dst = MULTIPLY(A(*src), alpha(cmp)); + } + } else { + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + *dst = MULTIPLY(A(*src), MULTIPLY(opacity, alpha(cmp))); + } + } + buffer += surface->stride; + cbuffer += surface->compositor->image.stride * csize; + sbuffer += image->stride; + } + } + return true; +} + + +static bool _rasterDirectBlendingImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale image!"); + return false; + } + + auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + + for (auto y = region.min.y; y < region.max.y; ++y) { + auto dst = dbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { + auto tmp = surface->blender(*src, *dst, 255); + *dst = INTERPOLATE(tmp, *dst, A(*src)); + } + } else { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++src) { + auto tmp = ALPHA_BLEND(*src, opacity); + auto tmp2 = surface->blender(tmp, *dst, 255); + *dst = INTERPOLATE(tmp2, *dst, A(tmp)); + } + } + dbuffer += surface->stride; + sbuffer += image->stride; + } + return true; +} + + +static bool _rasterDirectImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale image!"); + return false; + } + + auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + + for (auto y = region.min.y; y < region.max.y; ++y) { + auto dst = dbuffer; + auto src = sbuffer; + if (opacity == 255) { + for (auto x = region.min.x; x < region.max.x; x++, dst++, src++) { + *dst = *src + ALPHA_BLEND(*dst, IA(*src)); + } + } else { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++src) { + auto tmp = ALPHA_BLEND(*src, opacity); + *dst = tmp + ALPHA_BLEND(*dst, IA(tmp)); + } + } + dbuffer += surface->stride; + sbuffer += image->stride; + } + return true; +} + + +//Blenders for the following scenarios: [Composition / Non-Composition] * [Opaque / Translucent] +static bool _directImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t opacity) +{ + if (_compositing(surface)) { + if (_matting(surface)) return _rasterDirectMattedImage(surface, image, region, opacity); + else return _rasterDirectMaskedImage(surface, image, region, opacity); + } else if (_blending(surface)) { + return _rasterDirectBlendingImage(surface, image, region, opacity); + } else { + return _rasterDirectImage(surface, image, region, opacity); + } + return false; +} + + +//Blenders for the following scenarios: [RLE / Whole] * [Direct / Scaled / Transformed] +static bool _rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, const SwBBox& region, uint8_t opacity) +{ + //RLE Image + if (image->rle) { + if (image->direct) return _directRleImage(surface, image, opacity); + else if (image->scaled) return _scaledRleImage(surface, image, transform, region, opacity); + else return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity); + //Whole Image + } else { + if (image->direct) return _directImage(surface, image, region, opacity); + else if (image->scaled) return _scaledImage(surface, image, transform, region, opacity); + else return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity); + } +} + + +/************************************************************************/ +/* Rect Gradient */ +/************************************************************************/ + +template +static bool _rasterCompositeGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, SwMask maskOp) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); + + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, cbuffer, region.min.y + y, region.min.x, w, maskOp, 255); + cbuffer += surface->stride; + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +template +static bool _rasterDirectGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, SwMask maskOp) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * cstride + region.min.x); + auto dbuffer = surface->buf8 + (region.min.y * surface->stride + region.min.x); + + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, dbuffer, region.min.y + y, region.min.x, w, cbuffer, maskOp, 255); + cbuffer += cstride; + dbuffer += surface->stride; + } + return true; +} + + +template +static bool _rasterGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + auto method = surface->compositor->method; + + TVGLOG("SW_ENGINE", "Masked(%d) Gradient [Region: %lu %lu %lu %lu]", (int)method, region.min.x, region.min.y, region.max.x - region.min.x, region.max.y - region.min.y); + + auto maskOp = _getMaskOp(method); + + if (_direct(method)) return _rasterDirectGradientMaskedRect(surface, region, fill, maskOp); + else return _rasterCompositeGradientMaskedRect(surface, region, fill, maskOp); + + return false; +} + + +template +static bool _rasterGradientMattedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; + auto alpha = surface->alpha(surface->compositor->method); + + TVGLOG("SW_ENGINE", "Matted(%d) Gradient [Region: %lu %lu %u %u]", (int)surface->compositor->method, region.min.x, region.min.y, w, h); + + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, buffer, region.min.y + y, region.min.x, w, cbuffer, alpha, csize, 255); + buffer += surface->stride; + cbuffer += surface->stride * csize; + } + return true; +} + + +template +static bool _rasterBlendingGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + + if (fill->translucent) { + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendPreNormal, surface->blender, 255); + } + } else { + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendSrcOver, surface->blender, 255); + } + } + return true; +} + +template +static bool _rasterTranslucentGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, buffer, region.min.y + y, region.min.x, w, opBlendPreNormal, 255); + buffer += surface->stride; + } + return true; +} + + +template +static bool _rasterSolidGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto w = static_cast(region.max.x - region.min.x); + auto h = static_cast(region.max.y - region.min.y); + + for (uint32_t y = 0; y < h; ++y) { + fillMethod()(fill, buffer + y * surface->stride, region.min.y + y, region.min.x, w, opBlendSrcOver, 255); + } + return true; +} + + +static bool _rasterLinearGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + if (fill->linear.len < FLT_EPSILON) return false; + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterGradientMattedRect(surface, region, fill); + else return _rasterGradientMaskedRect(surface, region, fill); + } else if (_blending(surface)) { + return _rasterBlendingGradientRect(surface, region, fill); + } else { + if (fill->translucent) return _rasterTranslucentGradientRect(surface, region, fill); + else _rasterSolidGradientRect(surface, region, fill); + } + return false; +} + + +static bool _rasterRadialGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill) +{ + if (_compositing(surface)) { + if (_matting(surface)) return _rasterGradientMattedRect(surface, region, fill); + else return _rasterGradientMaskedRect(surface, region, fill); + } else if (_blending(surface)) { + return _rasterBlendingGradientRect(surface, region, fill); + } else { + if (fill->translucent) return _rasterTranslucentGradientRect(surface, region, fill); + else _rasterSolidGradientRect(surface, region, fill); + } + return false; +} + + +/************************************************************************/ +/* Rle Gradient */ +/************************************************************************/ + +template +static bool _rasterCompositeGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, SwMask maskOp) +{ + auto span = rle->spans; + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto cmp = &cbuffer[span->y * cstride + span->x]; + fillMethod()(fill, cmp, span->y, span->x, span->len, maskOp, span->coverage); + } + return _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); +} + + +template +static bool _rasterDirectGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, SwMask maskOp) +{ + auto span = rle->spans; + auto cstride = surface->compositor->image.stride; + auto cbuffer = surface->compositor->image.buf8; + auto dbuffer = surface->buf8; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto cmp = &cbuffer[span->y * cstride + span->x]; + auto dst = &dbuffer[span->y * surface->stride + span->x]; + fillMethod()(fill, dst, span->y, span->x, span->len, cmp, maskOp, span->coverage); + } + return true; +} + + +template +static bool _rasterGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + auto method = surface->compositor->method; + + TVGLOG("SW_ENGINE", "Masked(%d) Rle Linear Gradient", (int)method); + + auto maskOp = _getMaskOp(method); + + if (_direct(method)) return _rasterDirectGradientMaskedRle(surface, rle, fill, maskOp); + else return _rasterCompositeGradientMaskedRle(surface, rle, fill, maskOp); + return false; +} + + +template +static bool _rasterGradientMattedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + TVGLOG("SW_ENGINE", "Matted(%d) Rle Linear Gradient", (int)surface->compositor->method); + + auto span = rle->spans; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; + auto alpha = surface->alpha(surface->compositor->method); + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + fillMethod()(fill, dst, span->y, span->x, span->len, cmp, alpha, csize, span->coverage); + } + return true; +} + + +template +static bool _rasterBlendingGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + auto span = rle->spans; + + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + fillMethod()(fill, dst, span->y, span->x, span->len, opBlendPreNormal, surface->blender, span->coverage); + } + return true; +} + + +template +static bool _rasterTranslucentGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + auto span = rle->spans; + + //32 bits + if (surface->channelSize == sizeof(uint32_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, opBlendPreNormal, 255); + else fillMethod()(fill, dst, span->y, span->x, span->len, opBlendNormal, span->coverage); + } + //8 bits + } else if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskAdd, 255); + } + } + return true; +} + + +template +static bool _rasterSolidGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + auto span = rle->spans; + + //32 bits + if (surface->channelSize == sizeof(uint32_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, opBlendSrcOver, 255); + else fillMethod()(fill, dst, span->y, span->x, span->len, opBlendInterp, span->coverage); + } + //8 bits + } else if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + if (span->coverage == 255) fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskNone, 255); + else fillMethod()(fill, dst, span->y, span->x, span->len, _opMaskAdd, span->coverage); + } + } + + return true; +} + + +static bool _rasterLinearGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + if (!rle || fill->linear.len < FLT_EPSILON) return false; + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterGradientMattedRle(surface, rle, fill); + else return _rasterGradientMaskedRle(surface, rle, fill); + } else if (_blending(surface)) { + return _rasterBlendingGradientRle(surface, rle, fill); + } else { + if (fill->translucent) return _rasterTranslucentGradientRle(surface, rle, fill); + else return _rasterSolidGradientRle(surface, rle, fill); + } + return false; +} + + +static bool _rasterRadialGradientRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill) +{ + if (!rle) return false; + + if (_compositing(surface)) { + if (_matting(surface)) return _rasterGradientMattedRle(surface, rle, fill); + else return _rasterGradientMaskedRle(surface, rle, fill); + } else if (_blending(surface)) { + _rasterBlendingGradientRle(surface, rle, fill); + } else { + if (fill->translucent) _rasterTranslucentGradientRle(surface, rle, fill); + else return _rasterSolidGradientRle(surface, rle, fill); + } + return false; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + + +void rasterGrayscale8(uint8_t *dst, uint8_t val, uint32_t offset, int32_t len) +{ + //OPTIMIZE_ME: Support SIMD + cRasterPixels(dst, val, offset, len); +} + + +void rasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) +{ +#if defined(THORVG_AVX_VECTOR_SUPPORT) + avxRasterPixel32(dst, val, offset, len); +#elif defined(THORVG_NEON_VECTOR_SUPPORT) + neonRasterPixel32(dst, val, offset, len); +#else + cRasterPixels(dst, val, offset, len); +#endif +} + + +bool rasterCompositor(SwSurface* surface) +{ + //See CompositeMethod, Alpha:3, InvAlpha:4, Luma:5, InvLuma:6 + surface->alphas[0] = _alpha; + surface->alphas[1] = _ialpha; + + if (surface->cs == ColorSpace::ABGR8888 || surface->cs == ColorSpace::ABGR8888S) { + surface->join = _abgrJoin; + surface->alphas[2] = _abgrLuma; + surface->alphas[3] = _abgrInvLuma; + } else if (surface->cs == ColorSpace::ARGB8888 || surface->cs == ColorSpace::ARGB8888S) { + surface->join = _argbJoin; + surface->alphas[2] = _argbLuma; + surface->alphas[3] = _argbInvLuma; + } else { + TVGERR("SW_ENGINE", "Unsupported Colorspace(%d) is expected!", surface->cs); + return false; + } + return true; +} + + +bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h) +{ + if (!surface || !surface->buf32 || surface->stride == 0 || surface->w == 0 || surface->h == 0) return false; + + //32 bits + if (surface->channelSize == sizeof(uint32_t)) { + //full clear + if (w == surface->stride) { + rasterPixel32(surface->buf32, 0x00000000, surface->stride * y, w * h); + //partial clear + } else { + for (uint32_t i = 0; i < h; i++) { + rasterPixel32(surface->buf32, 0x00000000, (surface->stride * y + x) + (surface->stride * i), w); + } + } + //8 bits + } else if (surface->channelSize == sizeof(uint8_t)) { + //full clear + if (w == surface->stride) { + rasterGrayscale8(surface->buf8, 0x00, surface->stride * y, w * h); + //partial clear + } else { + for (uint32_t i = 0; i < h; i++) { + rasterGrayscale8(surface->buf8, 0x00, (surface->stride * y + x) + (surface->stride * i), w); + } + } + } + return true; +} + + +void rasterUnpremultiply(Surface* surface) +{ + if (surface->channelSize != sizeof(uint32_t)) return; + + TVGLOG("SW_ENGINE", "Unpremultiply [Size: %d x %d]", surface->w, surface->h); + + //OPTIMIZE_ME: +SIMD + for (uint32_t y = 0; y < surface->h; y++) { + auto buffer = surface->buf32 + surface->stride * y; + for (uint32_t x = 0; x < surface->w; ++x) { + uint8_t a = buffer[x] >> 24; + if (a == 255) { + continue; + } else if (a == 0) { + buffer[x] = 0x00ffffff; + } else { + uint16_t r = ((buffer[x] >> 8) & 0xff00) / a; + uint16_t g = ((buffer[x]) & 0xff00) / a; + uint16_t b = ((buffer[x] << 8) & 0xff00) / a; + if (r > 0xff) r = 0xff; + if (g > 0xff) g = 0xff; + if (b > 0xff) b = 0xff; + buffer[x] = (a << 24) | (r << 16) | (g << 8) | (b); + } + } + } + surface->premultiplied = false; +} + + +void rasterPremultiply(Surface* surface) +{ + if (surface->channelSize != sizeof(uint32_t)) return; + + TVGLOG("SW_ENGINE", "Premultiply [Size: %d x %d]", surface->w, surface->h); + + //OPTIMIZE_ME: +SIMD + auto buffer = surface->buf32; + for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { + auto dst = buffer; + for (uint32_t x = 0; x < surface->w; ++x, ++dst) { + auto c = *dst; + auto a = (c >> 24); + *dst = (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); + } + } + surface->premultiplied = true; +} + + +bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id) +{ + if (!shape->fill) return false; + + if (shape->fastTrack) { + if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRect(surface, shape->bbox, shape->fill); + else if (id == TVG_CLASS_ID_RADIAL)return _rasterRadialGradientRect(surface, shape->bbox, shape->fill); + } else { + if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRle(surface, shape->rle, shape->fill); + else if (id == TVG_CLASS_ID_RADIAL) return _rasterRadialGradientRle(surface, shape->rle, shape->fill); + } + return false; +} + + +bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id) +{ + if (!shape->stroke || !shape->stroke->fill || !shape->strokeRle) return false; + + if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRle(surface, shape->strokeRle, shape->stroke->fill); + else if (id == TVG_CLASS_ID_RADIAL) return _rasterRadialGradientRle(surface, shape->strokeRle, shape->stroke->fill); + + return false; +} + + +bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (a < 255) { + r = MULTIPLY(r, a); + g = MULTIPLY(g, a); + b = MULTIPLY(b, a); + } + if (shape->fastTrack) return _rasterRect(surface, shape->bbox, r, g, b, a); + else return _rasterRle(surface, shape->rle, r, g, b, a); +} + + +bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (a < 255) { + r = MULTIPLY(r, a); + g = MULTIPLY(g, a); + b = MULTIPLY(b, a); + } + + return _rasterRle(surface, shape->strokeRle, r, g, b, a); +} + + +bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint8_t opacity) +{ + //Verify Boundary + if (bbox.max.x < 0 || bbox.max.y < 0 || bbox.min.x >= static_cast(surface->w) || bbox.min.y >= static_cast(surface->h)) return false; + + if (mesh && mesh->triangleCnt > 0) return _rasterTexmapPolygonMesh(surface, image, mesh, transform, &bbox, opacity); + else return _rasterImage(surface, image, transform, bbox, opacity); +} + + +bool rasterConvertCS(Surface* surface, ColorSpace to) +{ + //TOOD: Support SIMD accelerations + auto from = surface->cs; + + if (((from == ColorSpace::ABGR8888) || (from == ColorSpace::ABGR8888S)) && ((to == ColorSpace::ARGB8888) || (to == ColorSpace::ARGB8888S))) { + surface->cs = to; + return cRasterABGRtoARGB(surface); + } + if (((from == ColorSpace::ARGB8888) || (from == ColorSpace::ARGB8888S)) && ((to == ColorSpace::ABGR8888) || (to == ColorSpace::ABGR8888S))) { + surface->cs = to; + return cRasterARGBtoABGR(surface); + } + + return false; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRasterAvx.h b/libraries/lvgl/src/libs/thorvg/tvgSwRasterAvx.h new file mode 100644 index 0000000..633abf1 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRasterAvx.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifdef THORVG_AVX_VECTOR_SUPPORT + +#include + +#define N_32BITS_IN_128REG 4 +#define N_32BITS_IN_256REG 8 + +static inline __m128i ALPHA_BLEND(__m128i c, __m128i a) +{ + //1. set the masks for the A/G and R/B channels + auto AG = _mm_set1_epi32(0xff00ff00); + auto RB = _mm_set1_epi32(0x00ff00ff); + + //2. mask the alpha vector - originally quartet [a, a, a, a] + auto aAG = _mm_and_si128(a, AG); + auto aRB = _mm_and_si128(a, RB); + + //3. calculate the alpha blending of the 2nd and 4th channel + //- mask the color vector + //- multiply it by the masked alpha vector + //- add the correction to compensate bit shifting used instead of dividing by 255 + //- shift bits - corresponding to division by 256 + auto even = _mm_and_si128(c, RB); + even = _mm_mullo_epi16(even, aRB); + even =_mm_add_epi16(even, RB); + even = _mm_srli_epi16(even, 8); + + //4. calculate the alpha blending of the 1st and 3rd channel: + //- mask the color vector + //- multiply it by the corresponding masked alpha vector and store the high bits of the result + //- add the correction to compensate division by 256 instead of by 255 (next step) + //- remove the low 8 bits to mimic the division by 256 + auto odd = _mm_and_si128(c, AG); + odd = _mm_mulhi_epu16(odd, aAG); + odd = _mm_add_epi16(odd, RB); + odd = _mm_and_si128(odd, AG); + + //5. the final result + return _mm_or_si128(odd, even); +} + + +static void avxRasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) +{ + //1. calculate how many iterations we need to cover the length + uint32_t iterations = len / N_32BITS_IN_256REG; + uint32_t avxFilled = iterations * N_32BITS_IN_256REG; + + //2. set the beginning of the array + dst += offset; + + //3. fill the octets + for (uint32_t i = 0; i < iterations; ++i, dst += N_32BITS_IN_256REG) { + _mm256_storeu_si256((__m256i*)dst, _mm256_set1_epi32(val)); + } + + //4. fill leftovers (in the first step we have to set the pointer to the place where the avx job is done) + int32_t leftovers = len - avxFilled; + while (leftovers--) *dst++ = val; +} + + +static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + + uint32_t ialpha = 255 - a; + + auto avxColor = _mm_set1_epi32(color); + auto avxIalpha = _mm_set1_epi8(ialpha); + + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + + //1. fill the not aligned memory (for 128-bit registers a 16-bytes alignment is required) + auto notAligned = ((uintptr_t)dst & 0xf) / 4; + if (notAligned) { + notAligned = (N_32BITS_IN_128REG - notAligned > w ? w : N_32BITS_IN_128REG - notAligned); + for (uint32_t x = 0; x < notAligned; ++x, ++dst) { + *dst = color + ALPHA_BLEND(*dst, ialpha); + } + } + + //2. fill the aligned memory - N_32BITS_IN_128REG pixels processed at once + uint32_t iterations = (w - notAligned) / N_32BITS_IN_128REG; + uint32_t avxFilled = iterations * N_32BITS_IN_128REG; + auto avxDst = (__m128i*)dst; + for (uint32_t x = 0; x < iterations; ++x, ++avxDst) { + *avxDst = _mm_add_epi32(avxColor, ALPHA_BLEND(*avxDst, avxIalpha)); + } + + //3. fill the remaining pixels + int32_t leftovers = w - notAligned - avxFilled; + dst += avxFilled; + while (leftovers--) { + *dst = color + ALPHA_BLEND(*dst, ialpha); + dst++; + } + } + return true; +} + + +static bool avxRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->join(r, g, b, a); + auto span = rle->spans; + uint32_t src; + + for (uint32_t i = 0; i < rle->size; ++i) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + + if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); + else src = color; + + auto ialpha = IA(src); + + //1. fill the not aligned memory (for 128-bit registers a 16-bytes alignment is required) + auto notAligned = ((uintptr_t)dst & 0xf) / 4; + if (notAligned) { + notAligned = (N_32BITS_IN_128REG - notAligned > span->len ? span->len : N_32BITS_IN_128REG - notAligned); + for (uint32_t x = 0; x < notAligned; ++x, ++dst) { + *dst = src + ALPHA_BLEND(*dst, ialpha); + } + } + + //2. fill the aligned memory using avx - N_32BITS_IN_128REG pixels processed at once + //In order to avoid unneccessary avx variables declarations a check is made whether there are any iterations at all + uint32_t iterations = (span->len - notAligned) / N_32BITS_IN_128REG; + uint32_t avxFilled = 0; + if (iterations > 0) { + auto avxSrc = _mm_set1_epi32(src); + auto avxIalpha = _mm_set1_epi8(ialpha); + + avxFilled = iterations * N_32BITS_IN_128REG; + auto avxDst = (__m128i*)dst; + for (uint32_t x = 0; x < iterations; ++x, ++avxDst) { + *avxDst = _mm_add_epi32(avxSrc, ALPHA_BLEND(*avxDst, avxIalpha)); + } + } + + //3. fill the remaining pixels + int32_t leftovers = span->len - notAligned - avxFilled; + dst += avxFilled; + while (leftovers--) { + *dst = src + ALPHA_BLEND(*dst, ialpha); + dst++; + } + + ++span; + } + return true; +} + + +#endif + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRasterC.h b/libraries/lvgl/src/libs/thorvg/tvgSwRasterC.h new file mode 100644 index 0000000..c7f2840 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRasterC.h @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +template +static void inline cRasterPixels(PIXEL_T* dst, PIXEL_T val, uint32_t offset, int32_t len) +{ + dst += offset; + + //fix the misaligned memory + auto alignOffset = (long long) dst % 8; + if (alignOffset > 0) { + if (sizeof(PIXEL_T) == 4) alignOffset /= 4; + else if (sizeof(PIXEL_T) == 1) alignOffset = 8 - alignOffset; + while (alignOffset > 0 && len > 0) { + *dst++ = val; + --len; + --alignOffset; + } + } + + //64bits faster clear + if ((sizeof(PIXEL_T) == 4)) { + auto val64 = (uint64_t(val) << 32) | uint64_t(val); + while (len > 1) { + *reinterpret_cast(dst) = val64; + len -= 2; + dst += 2; + } + } else if (sizeof(PIXEL_T) == 1) { + auto val32 = (uint32_t(val) << 24) | (uint32_t(val) << 16) | (uint32_t(val) << 8) | uint32_t(val); + auto val64 = (uint64_t(val32) << 32) | val32; + while (len > 7) { + *reinterpret_cast(dst) = val64; + len -= 8; + dst += 8; + } + } + + //leftovers + while (len--) *dst++ = val; +} + + +static bool inline cRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto span = rle->spans; + + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->join(r, g, b, a); + uint32_t src; + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); + else src = color; + auto ialpha = IA(src); + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + ALPHA_BLEND(*dst, ialpha); + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + uint8_t src; + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + if (span->coverage < 255) src = MULTIPLY(span->coverage, a); + else src = a; + auto ialpha = ~a; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + MULTIPLY(*dst, ialpha); + } + } + } + return true; +} + + +static bool inline cRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto ialpha = 255 - a; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + for (uint32_t x = 0; x < w; ++x, ++dst) { + *dst = color + ALPHA_BLEND(*dst, ialpha); + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; + auto ialpha = ~a; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + for (uint32_t x = 0; x < w; ++x, ++dst) { + *dst = a + MULTIPLY(*dst, ialpha); + } + } + } + return true; +} + + +static bool inline cRasterABGRtoARGB(Surface* surface) +{ + TVGLOG("SW_ENGINE", "Convert ColorSpace ABGR - ARGB [Size: %d x %d]", surface->w, surface->h); + + //64bits faster converting + if (surface->w % 2 == 0) { + auto buffer = reinterpret_cast(surface->buf32); + for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride / 2) { + auto dst = buffer; + for (uint32_t x = 0; x < surface->w / 2; ++x, ++dst) { + auto c = *dst; + //flip Blue, Red channels + *dst = (c & 0xff000000ff000000) + ((c & 0x00ff000000ff0000) >> 16) + (c & 0x0000ff000000ff00) + ((c & 0x000000ff000000ff) << 16); + } + } + //default converting + } else { + auto buffer = surface->buf32; + for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { + auto dst = buffer; + for (uint32_t x = 0; x < surface->w; ++x, ++dst) { + auto c = *dst; + //flip Blue, Red channels + *dst = (c & 0xff000000) + ((c & 0x00ff0000) >> 16) + (c & 0x0000ff00) + ((c & 0x000000ff) << 16); + } + } + } + return true; +} + + +static bool inline cRasterARGBtoABGR(Surface* surface) +{ + //exactly same with ABGRtoARGB + return cRasterABGRtoARGB(surface); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRasterNeon.h b/libraries/lvgl/src/libs/thorvg/tvgSwRasterNeon.h new file mode 100644 index 0000000..97e4706 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRasterNeon.h @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifdef THORVG_NEON_VECTOR_SUPPORT + +#include + +static inline uint8x8_t ALPHA_BLEND(uint8x8_t c, uint8x8_t a) +{ + uint16x8_t t = vmull_u8(c, a); + return vshrn_n_u16(t, 8); +} + + +static void neonRasterPixel32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) +{ + uint32_t iterations = len / 4; + uint32_t neonFilled = iterations * 4; + + dst += offset; + uint32x4_t vectorVal = {val, val, val, val}; + + for (uint32_t i = 0; i < iterations; ++i) { + vst1q_u32(dst, vectorVal); + dst += 4; + } + + int32_t leftovers = len - neonFilled; + while (leftovers--) *dst++ = val; +} + + +static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); + auto span = rle->spans; + uint32_t src; + uint8x8_t *vDst = nullptr; + uint16_t align; + + for (uint32_t i = 0; i < rle->size; ++i) { + if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); + else src = color; + + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto ialpha = IALPHA(src); + + if ((((uint32_t) dst) & 0x7) != 0) { + //fill not aligned byte + *dst = src + ALPHA_BLEND(*dst, ialpha); + vDst = (uint8x8_t*)(dst + 1); + align = 1; + } else { + vDst = (uint8x8_t*) dst; + align = 0; + } + + uint8x8_t vSrc = (uint8x8_t) vdup_n_u32(src); + uint8x8_t vIalpha = vdup_n_u8((uint8_t) ialpha); + + for (uint32_t x = 0; x < (span->len - align) / 2; ++x) + vDst[x] = vadd_u8(vSrc, ALPHA_BLEND(vDst[x], vIalpha)); + + auto leftovers = (span->len - align) % 2; + if (leftovers > 0) dst[span->len - 1] = src + ALPHA_BLEND(dst[span->len - 1], ialpha); + + ++span; + } + return true; +} + + +static bool neonRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto h = static_cast(region.max.y - region.min.y); + auto w = static_cast(region.max.x - region.min.x); + auto ialpha = 255 - a; + + auto vColor = vdup_n_u32(color); + auto vIalpha = vdup_n_u8((uint8_t) ialpha); + + uint8x8_t* vDst = nullptr; + uint32_t align; + + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + + if ((((uint32_t) dst) & 0x7) != 0) { + //fill not aligned byte + *dst = color + ALPHA_BLEND(*dst, ialpha); + vDst = (uint8x8_t*) (dst + 1); + align = 1; + } else { + vDst = (uint8x8_t*) dst; + align = 0; + } + + for (uint32_t x = 0; x < (w - align) / 2; ++x) + vDst[x] = vadd_u8((uint8x8_t)vColor, ALPHA_BLEND(vDst[x], vIalpha)); + + auto leftovers = (w - align) % 2; + if (leftovers > 0) dst[w - 1] = color + ALPHA_BLEND(dst[w - 1], ialpha); + } + return true; +} + +#endif + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRasterTexmap.h b/libraries/lvgl/src/libs/thorvg/tvgSwRasterTexmap.h new file mode 100644 index 0000000..d7353c7 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRasterTexmap.h @@ -0,0 +1,1213 @@ +/* + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +struct AALine +{ + int32_t x[2]; + int32_t coverage[2]; + int32_t length[2]; +}; + +struct AASpans +{ + AALine *lines; + int32_t yStart; + int32_t yEnd; +}; + +static inline void _swap(float& a, float& b, float& tmp) +{ + tmp = a; + a = b; + b = tmp; +} + + +//Careful! Shared resource, No support threading +static float dudx, dvdx; +static float dxdya, dxdyb, dudya, dvdya; +static float xa, xb, ua, va; + + +//Y Range exception handling +static bool _arrange(const SwImage* image, const SwBBox* region, int& yStart, int& yEnd) +{ + int32_t regionTop, regionBottom; + + if (region) { + regionTop = region->min.y; + regionBottom = region->max.y; + } else { + regionTop = image->rle->spans->y; + regionBottom = image->rle->spans[image->rle->size - 1].y; + } + + if (yStart >= regionBottom) return false; + + if (yStart < regionTop) yStart = regionTop; + if (yEnd > regionBottom) yEnd = regionBottom; + + return true; +} + + +static bool _rasterMaskedPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, uint8_t dirFlag = 0) +{ + return false; + +#if 0 //Enable it when GRAYSCALE image is supported + auto maskOp = _getMaskOp(surface->compositor->method); + auto direct = _direct(surface->compositor->method); + float _dudx = dudx, _dvdx = dvdx; + float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; + float _xa = xa, _xb = xb, _ua = ua, _va = va; + auto sbuf = image->buf8; + int32_t sw = static_cast(image->stride); + int32_t sh = image->h; + int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; + int32_t vv = 0, uu = 0; + int32_t minx = INT32_MAX, maxx = INT32_MIN; + float dx, u, v, iptr; + SwSpan* span = nullptr; //used only when rle based. + + if (!_arrange(image, region, yStart, yEnd)) return false; + + //Loop through all lines in the segment + uint32_t spanIdx = 0; + + if (region) { + minx = region->min.x; + maxx = region->max.x; + } else { + span = image->rle->spans; + while (span->y < yStart) { + ++span; + ++spanIdx; + } + } + + y = yStart; + + while (y < yEnd) { + x1 = (int32_t)_xa; + x2 = (int32_t)_xb; + + if (!region) { + minx = INT32_MAX; + maxx = INT32_MIN; + //one single row, could be consisted of multiple spans. + while (span->y == y && spanIdx < image->rle->size) { + if (minx > span->x) minx = span->x; + if (maxx < span->x + span->len) maxx = span->x + span->len; + ++span; + ++spanIdx; + } + } + if (x1 < minx) x1 = minx; + if (x2 > maxx) x2 = maxx; + + //Anti-Aliasing frames + ay = y - aaSpans->yStart; + if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; + if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; + + //Range allowed + if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { + + //Perform subtexel pre-stepping on UV + dx = 1 - (_xa - x1); + u = _ua + dx * _dudx; + v = _va + dx * _dvdx; + + x = x1; + + auto cmp = &surface->compositor->image.buf8[y * surface->compositor->image.stride + x1]; + auto dst = &surface->buf8[y * surface->stride + x1]; + + if (opacity == 255) { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + if (uu >= sw) continue; + vv = (int) v; + if (vv >= sh) continue; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + if (direct) { + auto tmp = maskOp(px, *cmp, 0); //not use alpha + *dst = tmp + MULTIPLY(*dst, ~tmp); + ++dst; + } else { + *cmp = maskOp(px, *cmp, ~px); + } + ++cmp; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } else { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + if (uu >= sw) continue; + vv = (int) v; + if (vv >= sh) continue; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + + if (direct) { + auto tmp = maskOp(MULTIPLY(px, opacity), *cmp, 0); + *dst = tmp + MULTIPLY(*dst, ~tmp); + ++dst; + } else { + auto tmp = MULTIPLY(px, opacity); + *cmp = maskOp(tmp, *cmp, ~px); + } + ++cmp; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } + } + + //Step along both edges + _xa += _dxdya; + _xb += _dxdyb; + _ua += _dudya; + _va += _dvdya; + + if (!region && spanIdx >= image->rle->size) break; + + ++y; + } + xa = _xa; + xb = _xb; + ua = _ua; + va = _va; + + return true; +#endif +} + + +static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity) +{ + float _dudx = dudx, _dvdx = dvdx; + float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; + float _xa = xa, _xb = xb, _ua = ua, _va = va; + auto sbuf = image->buf32; + auto dbuf = surface->buf32; + int32_t sw = static_cast(image->stride); + int32_t sh = image->h; + int32_t dw = surface->stride; + int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; + int32_t vv = 0, uu = 0; + int32_t minx = INT32_MAX, maxx = INT32_MIN; + float dx, u, v, iptr; + uint32_t* buf; + SwSpan* span = nullptr; //used only when rle based. + + if (!_arrange(image, region, yStart, yEnd)) return; + + //Loop through all lines in the segment + uint32_t spanIdx = 0; + + if (region) { + minx = region->min.x; + maxx = region->max.x; + } else { + span = image->rle->spans; + while (span->y < yStart) { + ++span; + ++spanIdx; + } + } + + y = yStart; + + while (y < yEnd) { + x1 = (int32_t)_xa; + x2 = (int32_t)_xb; + + if (!region) { + minx = INT32_MAX; + maxx = INT32_MIN; + //one single row, could be consisted of multiple spans. + while (span->y == y && spanIdx < image->rle->size) { + if (minx > span->x) minx = span->x; + if (maxx < span->x + span->len) maxx = span->x + span->len; + ++span; + ++spanIdx; + } + } + if (x1 < minx) x1 = minx; + if (x2 > maxx) x2 = maxx; + + //Anti-Aliasing frames + ay = y - aaSpans->yStart; + if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; + if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; + + //Range allowed + if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { + + //Perform subtexel pre-stepping on UV + dx = 1 - (_xa - x1); + u = _ua + dx * _dudx; + v = _va + dx * _dvdx; + + buf = dbuf + ((y * dw) + x1); + + x = x1; + + if (opacity == 255) { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + if (uu >= sw) continue; + vv = (int) v; + if (vv >= sh) continue; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + *buf = surface->blender(px, *buf, IA(px)); + ++buf; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } else { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + if (uu >= sw) continue; + vv = (int) v; + if (vv >= sh) continue; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + auto src = ALPHA_BLEND(px, opacity); + *buf = surface->blender(src, *buf, IA(src)); + ++buf; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } + } + + //Step along both edges + _xa += _dxdya; + _xb += _dxdyb; + _ua += _dudya; + _va += _dvdya; + + if (!region && spanIdx >= image->rle->size) break; + + ++y; + } + xa = _xa; + xb = _xb; + ua = _ua; + va = _va; +} + + +static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, bool matting) +{ + float _dudx = dudx, _dvdx = dvdx; + float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; + float _xa = xa, _xb = xb, _ua = ua, _va = va; + auto sbuf = image->buf32; + auto dbuf = surface->buf32; + int32_t sw = static_cast(image->stride); + int32_t sh = image->h; + int32_t dw = surface->stride; + int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay; + int32_t vv = 0, uu = 0; + int32_t minx = INT32_MAX, maxx = INT32_MIN; + float dx, u, v, iptr; + uint32_t* buf; + SwSpan* span = nullptr; //used only when rle based. + + //for matting(composition) + auto csize = matting ? surface->compositor->image.channelSize: 0; + auto alpha = matting ? surface->alpha(surface->compositor->method) : nullptr; + uint8_t* cmp = nullptr; + + if (!_arrange(image, region, yStart, yEnd)) return; + + //Loop through all lines in the segment + uint32_t spanIdx = 0; + + if (region) { + minx = region->min.x; + maxx = region->max.x; + } else { + span = image->rle->spans; + while (span->y < yStart) { + ++span; + ++spanIdx; + } + } + + y = yStart; + + while (y < yEnd) { + x1 = (int32_t)_xa; + x2 = (int32_t)_xb; + + if (!region) { + minx = INT32_MAX; + maxx = INT32_MIN; + //one single row, could be consisted of multiple spans. + while (span->y == y && spanIdx < image->rle->size) { + if (minx > span->x) minx = span->x; + if (maxx < span->x + span->len) maxx = span->x + span->len; + ++span; + ++spanIdx; + } + } + if (x1 < minx) x1 = minx; + if (x2 > maxx) x2 = maxx; + + //Anti-Aliasing frames + ay = y - aaSpans->yStart; + if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1; + if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2; + + //Range allowed + if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) { + + //Perform subtexel pre-stepping on UV + dx = 1 - (_xa - x1); + u = _ua + dx * _dudx; + v = _va + dx * _dvdx; + + buf = dbuf + ((y * dw) + x1); + + x = x1; + + if (matting) cmp = &surface->compositor->image.buf8[(y * surface->compositor->image.stride + x1) * csize]; + + if (opacity == 255) { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + if (uu >= sw) continue; + vv = (int) v; + if (vv >= sh) continue; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + uint32_t src; + if (matting) { + src = ALPHA_BLEND(px, alpha(cmp)); + cmp += csize; + } else { + src = px; + } + *buf = src + ALPHA_BLEND(*buf, IA(src)); + ++buf; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } else { + //Draw horizontal line + while (x++ < x2) { + uu = (int) u; + vv = (int) v; + + ar = (int)(255 * (1 - modff(u, &iptr))); + ab = (int)(255 * (1 - modff(v, &iptr))); + iru = uu + 1; + irv = vv + 1; + + if (vv >= sh) continue; + + px = *(sbuf + (vv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* right pixel */ + int px2 = *(sbuf + (vv * sw) + iru); + px = INTERPOLATE(px, px2, ar); + } + /* vertical interpolate */ + if (irv < sh) { + /* bottom pixel */ + int px2 = *(sbuf + (irv * sw) + uu); + + /* horizontal interpolate */ + if (iru < sw) { + /* bottom right pixel */ + int px3 = *(sbuf + (irv * sw) + iru); + px2 = INTERPOLATE(px2, px3, ar); + } + px = INTERPOLATE(px, px2, ab); + } + uint32_t src; + if (matting) { + src = ALPHA_BLEND(px, MULTIPLY(opacity, alpha(cmp))); + cmp += csize; + } else { + src = ALPHA_BLEND(px, opacity); + } + *buf = src + ALPHA_BLEND(*buf, IA(src)); + ++buf; + + //Step UV horizontally + u += _dudx; + v += _dvdx; + //range over? + if ((uint32_t)v >= image->h) break; + } + } + } + + //Step along both edges + _xa += _dxdya; + _xb += _dxdyb; + _ua += _dudya; + _va += _dvdya; + + if (!region && spanIdx >= image->rle->size) break; + + ++y; + } + xa = _xa; + xb = _xb; + ua = _ua; + va = _va; +} + + +/* This mapping algorithm is based on Mikael Kalms's. */ +static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, Polygon& polygon, AASpans* aaSpans, uint8_t opacity) +{ + float x[3] = {polygon.vertex[0].pt.x, polygon.vertex[1].pt.x, polygon.vertex[2].pt.x}; + float y[3] = {polygon.vertex[0].pt.y, polygon.vertex[1].pt.y, polygon.vertex[2].pt.y}; + float u[3] = {polygon.vertex[0].uv.x, polygon.vertex[1].uv.x, polygon.vertex[2].uv.x}; + float v[3] = {polygon.vertex[0].uv.y, polygon.vertex[1].uv.y, polygon.vertex[2].uv.y}; + + float off_y; + float dxdy[3] = {0.0f, 0.0f, 0.0f}; + float tmp; + + auto upper = false; + + //Sort the vertices in ascending Y order + if (y[0] > y[1]) { + _swap(x[0], x[1], tmp); + _swap(y[0], y[1], tmp); + _swap(u[0], u[1], tmp); + _swap(v[0], v[1], tmp); + } + if (y[0] > y[2]) { + _swap(x[0], x[2], tmp); + _swap(y[0], y[2], tmp); + _swap(u[0], u[2], tmp); + _swap(v[0], v[2], tmp); + } + if (y[1] > y[2]) { + _swap(x[1], x[2], tmp); + _swap(y[1], y[2], tmp); + _swap(u[1], u[2], tmp); + _swap(v[1], v[2], tmp); + } + + //Y indexes + int yi[3] = {(int)y[0], (int)y[1], (int)y[2]}; + + //Skip drawing if it's too thin to cover any pixels at all. + if ((yi[0] == yi[1] && yi[0] == yi[2]) || ((int) x[0] == (int) x[1] && (int) x[0] == (int) x[2])) return; + + //Calculate horizontal and vertical increments for UV axes (these calcs are certainly not optimal, although they're stable (handles any dy being 0) + auto denom = ((x[2] - x[0]) * (y[1] - y[0]) - (x[1] - x[0]) * (y[2] - y[0])); + + //Skip poly if it's an infinitely thin line + if (mathZero(denom)) return; + + denom = 1 / denom; //Reciprocal for speeding up + dudx = ((u[2] - u[0]) * (y[1] - y[0]) - (u[1] - u[0]) * (y[2] - y[0])) * denom; + dvdx = ((v[2] - v[0]) * (y[1] - y[0]) - (v[1] - v[0]) * (y[2] - y[0])) * denom; + auto dudy = ((u[1] - u[0]) * (x[2] - x[0]) - (u[2] - u[0]) * (x[1] - x[0])) * denom; + auto dvdy = ((v[1] - v[0]) * (x[2] - x[0]) - (v[2] - v[0]) * (x[1] - x[0])) * denom; + + //Calculate X-slopes along the edges + if (y[1] > y[0]) dxdy[0] = (x[1] - x[0]) / (y[1] - y[0]); + if (y[2] > y[0]) dxdy[1] = (x[2] - x[0]) / (y[2] - y[0]); + if (y[2] > y[1]) dxdy[2] = (x[2] - x[1]) / (y[2] - y[1]); + + //Determine which side of the polygon the longer edge is on + auto side = (dxdy[1] > dxdy[0]) ? true : false; + + if (mathEqual(y[0], y[1])) side = x[0] > x[1]; + if (mathEqual(y[1], y[2])) side = x[2] > x[1]; + + auto regionTop = region ? region->min.y : image->rle->spans->y; //Normal Image or Rle Image? + auto compositing = _compositing(surface); //Composition required + auto blending = _blending(surface); //Blending required + + //Longer edge is on the left side + if (!side) { + //Calculate slopes along left edge + dxdya = dxdy[1]; + dudya = dxdya * dudx + dudy; + dvdya = dxdya * dvdx + dvdy; + + //Perform subpixel pre-stepping along left edge + auto dy = 1.0f - (y[0] - yi[0]); + xa = x[0] + dy * dxdya; + ua = u[0] + dy * dudya; + va = v[0] + dy * dvdya; + + //Draw upper segment if possibly visible + if (yi[0] < yi[1]) { + off_y = y[0] < regionTop ? (regionTop - y[0]) : 0; + xa += (off_y * dxdya); + ua += (off_y * dudya); + va += (off_y * dvdya); + + // Set right edge X-slope and perform subpixel pre-stepping + dxdyb = dxdy[0]; + xb = x[0] + dy * dxdyb + (off_y * dxdyb); + + if (compositing) { + if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true); + else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 1); + } else if (blending) { + _rasterBlendingPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity); + } else { + _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false); + } + upper = true; + } + //Draw lower segment if possibly visible + if (yi[1] < yi[2]) { + off_y = y[1] < regionTop ? (regionTop - y[1]) : 0; + if (!upper) { + xa += (off_y * dxdya); + ua += (off_y * dudya); + va += (off_y * dvdya); + } + // Set right edge X-slope and perform subpixel pre-stepping + dxdyb = dxdy[2]; + xb = x[1] + (1 - (y[1] - yi[1])) * dxdyb + (off_y * dxdyb); + if (compositing) { + if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true); + else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 2); + } else if (blending) { + _rasterBlendingPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity); + } else { + _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false); + } + } + //Longer edge is on the right side + } else { + //Set right edge X-slope and perform subpixel pre-stepping + dxdyb = dxdy[1]; + auto dy = 1.0f - (y[0] - yi[0]); + xb = x[0] + dy * dxdyb; + + //Draw upper segment if possibly visible + if (yi[0] < yi[1]) { + off_y = y[0] < regionTop ? (regionTop - y[0]) : 0; + xb += (off_y *dxdyb); + + // Set slopes along left edge and perform subpixel pre-stepping + dxdya = dxdy[0]; + dudya = dxdya * dudx + dudy; + dvdya = dxdya * dvdx + dvdy; + + xa = x[0] + dy * dxdya + (off_y * dxdya); + ua = u[0] + dy * dudya + (off_y * dudya); + va = v[0] + dy * dvdya + (off_y * dvdya); + + if (compositing) { + if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true); + else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 3); + } else if (blending) { + _rasterBlendingPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity); + } else { + _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false); + } + upper = true; + } + //Draw lower segment if possibly visible + if (yi[1] < yi[2]) { + off_y = y[1] < regionTop ? (regionTop - y[1]) : 0; + if (!upper) xb += (off_y *dxdyb); + + // Set slopes along left edge and perform subpixel pre-stepping + dxdya = dxdy[2]; + dudya = dxdya * dudx + dudy; + dvdya = dxdya * dvdx + dvdy; + dy = 1 - (y[1] - yi[1]); + xa = x[1] + dy * dxdya + (off_y * dxdya); + ua = u[1] + dy * dudya + (off_y * dudya); + va = v[1] + dy * dvdya + (off_y * dvdya); + + if (compositing) { + if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true); + else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 4); + } else if (blending) { + _rasterBlendingPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity); + } else { + _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false); + } + } + } +} + + +static AASpans* _AASpans(float ymin, float ymax, const SwImage* image, const SwBBox* region) +{ + auto yStart = static_cast(ymin); + auto yEnd = static_cast(ymax); + + if (!_arrange(image, region, yStart, yEnd)) return nullptr; + + auto aaSpans = static_cast(malloc(sizeof(AASpans))); + aaSpans->yStart = yStart; + aaSpans->yEnd = yEnd; + + //Initialize X range + auto height = yEnd - yStart; + + aaSpans->lines = static_cast(calloc(height, sizeof(AALine))); + + for (int32_t i = 0; i < height; i++) { + aaSpans->lines[i].x[0] = INT32_MAX; + aaSpans->lines[i].x[1] = INT32_MIN; + } + return aaSpans; +} + + +static void _calcIrregularCoverage(AALine* lines, int32_t eidx, int32_t y, int32_t diagonal, int32_t edgeDist, bool reverse) +{ + if (eidx == 1) reverse = !reverse; + int32_t coverage = (255 / (diagonal + 2)); + int32_t tmp; + for (int32_t ry = 0; ry < (diagonal + 2); ry++) { + tmp = y - ry - edgeDist; + if (tmp < 0) return; + lines[tmp].length[eidx] = 1; + if (reverse) lines[tmp].coverage[eidx] = 255 - (coverage * ry); + else lines[tmp].coverage[eidx] = (coverage * ry); + } +} + + +static void _calcVertCoverage(AALine *lines, int32_t eidx, int32_t y, int32_t rewind, bool reverse) +{ + if (eidx == 1) reverse = !reverse; + int32_t coverage = (255 / (rewind + 1)); + int32_t tmp; + for (int ry = 1; ry < (rewind + 1); ry++) { + tmp = y - ry; + if (tmp < 0) return; + lines[tmp].length[eidx] = 1; + if (reverse) lines[tmp].coverage[eidx] = (255 - (coverage * ry)); + else lines[tmp].coverage[eidx] = (coverage * ry); + } +} + + +static void _calcHorizCoverage(AALine *lines, int32_t eidx, int32_t y, int32_t x, int32_t x2) +{ + if (lines[y].length[eidx] < abs(x - x2)) { + lines[y].length[eidx] = abs(x - x2); + lines[y].coverage[eidx] = (255 / (lines[y].length[eidx] + 1)); + } +} + + +/* + * This Anti-Aliasing mechanism is originated from Hermet Park's idea. + * To understand this AA logic, you can refer this page: + * www.hermet.pe.kr/122 (hermetpark@gmail.com) +*/ +static void _calcAAEdge(AASpans *aaSpans, int32_t eidx) +{ +//Previous edge direction: +#define DirOutHor 0x0011 +#define DirOutVer 0x0001 +#define DirInHor 0x0010 +#define DirInVer 0x0000 +#define DirNone 0x1000 + +#define PUSH_VERTEX() \ + do { \ + pEdge.x = lines[y].x[eidx]; \ + pEdge.y = y; \ + ptx[0] = tx[0]; \ + ptx[1] = tx[1]; \ + } while (0) + + int32_t y = 0; + SwPoint pEdge = {-1, -1}; //previous edge point + SwPoint edgeDiff = {0, 0}; //temporary used for point distance + + /* store bigger to tx[0] between prev and current edge's x positions. */ + int32_t tx[2] = {0, 0}; + /* back up prev tx values */ + int32_t ptx[2] = {0, 0}; + int32_t diagonal = 0; //straight diagonal pixels count + + auto yStart = aaSpans->yStart; + auto yEnd = aaSpans->yEnd; + auto lines = aaSpans->lines; + + int32_t prevDir = DirNone; + int32_t curDir = DirNone; + + yEnd -= yStart; + + //Start Edge + if (y < yEnd) { + pEdge.x = lines[y].x[eidx]; + pEdge.y = y; + } + + //Calculates AA Edges + for (y++; y < yEnd; y++) { + //Ready tx + if (eidx == 0) { + tx[0] = pEdge.x; + tx[1] = lines[y].x[0]; + } else { + tx[0] = lines[y].x[1]; + tx[1] = pEdge.x; + } + edgeDiff.x = (tx[0] - tx[1]); + edgeDiff.y = (y - pEdge.y); + + //Confirm current edge direction + if (edgeDiff.x > 0) { + if (edgeDiff.y == 1) curDir = DirOutHor; + else curDir = DirOutVer; + } else if (edgeDiff.x < 0) { + if (edgeDiff.y == 1) curDir = DirInHor; + else curDir = DirInVer; + } else curDir = DirNone; + + //straight diagonal increase + if ((curDir == prevDir) && (y < yEnd)) { + if ((abs(edgeDiff.x) == 1) && (edgeDiff.y == 1)) { + ++diagonal; + PUSH_VERTEX(); + continue; + } + } + + switch (curDir) { + case DirOutHor: { + _calcHorizCoverage(lines, eidx, y, tx[0], tx[1]); + if (diagonal > 0) { + _calcIrregularCoverage(lines, eidx, y, diagonal, 0, true); + diagonal = 0; + } + /* Increment direction is changed: Outside Vertical -> Outside Horizontal */ + if (prevDir == DirOutVer) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); + + //Trick, but fine-tunning! + if (y == 1) _calcHorizCoverage(lines, eidx, pEdge.y, tx[0], tx[1]); + PUSH_VERTEX(); + } + break; + case DirOutVer: { + _calcVertCoverage(lines, eidx, y, edgeDiff.y, true); + if (diagonal > 0) { + _calcIrregularCoverage(lines, eidx, y, diagonal, edgeDiff.y, false); + diagonal = 0; + } + /* Increment direction is changed: Outside Horizontal -> Outside Vertical */ + if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); + PUSH_VERTEX(); + } + break; + case DirInHor: { + _calcHorizCoverage(lines, eidx, (y - 1), tx[0], tx[1]); + if (diagonal > 0) { + _calcIrregularCoverage(lines, eidx, y, diagonal, 0, false); + diagonal = 0; + } + /* Increment direction is changed: Outside Horizontal -> Inside Horizontal */ + if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); + PUSH_VERTEX(); + } + break; + case DirInVer: { + _calcVertCoverage(lines, eidx, y, edgeDiff.y, false); + if (prevDir == DirOutHor) edgeDiff.y -= 1; //Weird, fine tuning????????????????????? + if (diagonal > 0) { + _calcIrregularCoverage(lines, eidx, y, diagonal, edgeDiff.y, true); + diagonal = 0; + } + /* Increment direction is changed: Outside Horizontal -> Inside Vertical */ + if (prevDir == DirOutHor) _calcHorizCoverage(lines, eidx, pEdge.y, ptx[0], ptx[1]); + PUSH_VERTEX(); + } + break; + } + if (curDir != DirNone) prevDir = curDir; + } + + //leftovers...? + if ((edgeDiff.y == 1) && (edgeDiff.x != 0)) { + if (y >= yEnd) y = (yEnd - 1); + _calcHorizCoverage(lines, eidx, y - 1, ptx[0], ptx[1]); + _calcHorizCoverage(lines, eidx, y, tx[0], tx[1]); + } else { + ++y; + if (y > yEnd) y = yEnd; + _calcVertCoverage(lines, eidx, y, (edgeDiff.y + 1), (prevDir & 0x00000001)); + } +} + + +static bool _apply(SwSurface* surface, AASpans* aaSpans) +{ + auto y = aaSpans->yStart; + uint32_t pixel; + uint32_t* dst; + int32_t pos; + + //left side + _calcAAEdge(aaSpans, 0); + //right side + _calcAAEdge(aaSpans, 1); + + while (y < aaSpans->yEnd) { + auto line = &aaSpans->lines[y - aaSpans->yStart]; + auto width = line->x[1] - line->x[0]; + if (width > 0) { + auto offset = y * surface->stride; + + //Left edge + dst = surface->buf32 + (offset + line->x[0]); + if (line->x[0] > 1) pixel = *(dst - 1); + else pixel = *dst; + + pos = 1; + while (pos <= line->length[0]) { + *dst = INTERPOLATE(*dst, pixel, line->coverage[0] * pos); + ++dst; + ++pos; + } + + //Right edge + dst = surface->buf32 + (offset + line->x[1] - 1); + if (line->x[1] < (int32_t)(surface->w - 1)) pixel = *(dst + 1); + else pixel = *dst; + + pos = width; + while ((int32_t)(width - line->length[1]) < pos) { + *dst = INTERPOLATE(*dst, pixel, 255 - (line->coverage[1] * (line->length[1] - (width - pos)))); + --dst; + --pos; + } + } + y++; + } + + free(aaSpans->lines); + free(aaSpans); + + return true; +} + + +/* + 2 triangles constructs 1 mesh. + below figure illustrates vert[4] index info. + If you need better quality, please divide a mesh by more number of triangles. + + 0 -- 1 + | / | + | / | + 3 -- 2 +*/ +static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon!"); + return false; + } + + //Exceptions: No dedicated drawing area? + if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; + + /* Prepare vertices. + shift XY coordinates to match the sub-pixeling technique. */ + Vertex vertices[4]; + vertices[0] = {{0.0f, 0.0f}, {0.0f, 0.0f}}; + vertices[1] = {{float(image->w), 0.0f}, {float(image->w), 0.0f}}; + vertices[2] = {{float(image->w), float(image->h)}, {float(image->w), float(image->h)}}; + vertices[3] = {{0.0f, float(image->h)}, {0.0f, float(image->h)}}; + + float ys = FLT_MAX, ye = -1.0f; + for (int i = 0; i < 4; i++) { + mathMultiply(&vertices[i].pt, transform); + + if (vertices[i].pt.y < ys) ys = vertices[i].pt.y; + if (vertices[i].pt.y > ye) ye = vertices[i].pt.y; + } + + auto aaSpans = _AASpans(ys, ye, image, region); + if (!aaSpans) return true; + + Polygon polygon; + + //Draw the first polygon + polygon.vertex[0] = vertices[0]; + polygon.vertex[1] = vertices[1]; + polygon.vertex[2] = vertices[3]; + + _rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity); + + //Draw the second polygon + polygon.vertex[0] = vertices[1]; + polygon.vertex[1] = vertices[2]; + polygon.vertex[2] = vertices[3]; + + _rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity); + +#if 0 + if (_compositing(surface) && _masking(surface) && !_direct(surface->compositor->method)) { + _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); + } +#endif + return _apply(surface, aaSpans); +} + + +/* + Provide any number of triangles to draw a mesh using the supplied image. + Indexes are not used, so each triangle (Polygon) vertex has to be defined, even if they copy the previous one. + Example: + + 0 -- 1 0 -- 1 0 + | / | --> | / / | + | / | | / / | + 2 -- 3 2 1 -- 2 + + Should provide two Polygons, one for each triangle. + // TODO: region? +*/ +static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint8_t opacity) +{ + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale Textmap polygon mesh!"); + return false; + } + + //Exceptions: No dedicated drawing area? + if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; + + // Step polygons once to transform + auto transformedTris = (Polygon*)malloc(sizeof(Polygon) * mesh->triangleCnt); + float ys = FLT_MAX, ye = -1.0f; + for (uint32_t i = 0; i < mesh->triangleCnt; i++) { + transformedTris[i] = mesh->triangles[i]; + mathMultiply(&transformedTris[i].vertex[0].pt, transform); + mathMultiply(&transformedTris[i].vertex[1].pt, transform); + mathMultiply(&transformedTris[i].vertex[2].pt, transform); + + if (transformedTris[i].vertex[0].pt.y < ys) ys = transformedTris[i].vertex[0].pt.y; + else if (transformedTris[i].vertex[0].pt.y > ye) ye = transformedTris[i].vertex[0].pt.y; + if (transformedTris[i].vertex[1].pt.y < ys) ys = transformedTris[i].vertex[1].pt.y; + else if (transformedTris[i].vertex[1].pt.y > ye) ye = transformedTris[i].vertex[1].pt.y; + if (transformedTris[i].vertex[2].pt.y < ys) ys = transformedTris[i].vertex[2].pt.y; + else if (transformedTris[i].vertex[2].pt.y > ye) ye = transformedTris[i].vertex[2].pt.y; + + // Convert normalized UV coordinates to image coordinates + transformedTris[i].vertex[0].uv.x *= (float)image->w; + transformedTris[i].vertex[0].uv.y *= (float)image->h; + transformedTris[i].vertex[1].uv.x *= (float)image->w; + transformedTris[i].vertex[1].uv.y *= (float)image->h; + transformedTris[i].vertex[2].uv.x *= (float)image->w; + transformedTris[i].vertex[2].uv.y *= (float)image->h; + } + + // Get AA spans and step polygons again to draw + if (auto aaSpans = _AASpans(ys, ye, image, region)) { + for (uint32_t i = 0; i < mesh->triangleCnt; i++) { + _rasterPolygonImage(surface, image, region, transformedTris[i], aaSpans, opacity); + } +#if 0 + if (_compositing(surface) && _masking(surface) && !_direct(surface->compositor->method)) { + _compositeMaskImage(surface, &surface->compositor->image, surface->compositor->bbox); + } +#endif + _apply(surface, aaSpans); + } + free(transformedTris); + return true; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.cpp new file mode 100644 index 0000000..007c09e --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.cpp @@ -0,0 +1,866 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgMath.h" +#include "tvgSwCommon.h" +#include "tvgTaskScheduler.h" +#include "tvgSwRenderer.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ +static int32_t initEngineCnt = false; +static int32_t rendererCnt = 0; +static SwMpool* globalMpool = nullptr; +static uint32_t threadsCnt = 0; + +struct SwTask : Task +{ + SwSurface* surface = nullptr; + SwMpool* mpool = nullptr; + SwBBox bbox = {{0, 0}, {0, 0}}; //Whole Rendering Region + Matrix* transform = nullptr; + Array clips; + RenderUpdateFlag flags = RenderUpdateFlag::None; + uint8_t opacity; + bool pushed = false; //Pushed into task list? + bool disposed = false; //Disposed task? + + RenderRegion bounds() const + { + RenderRegion region; + + //Range over? + region.x = bbox.min.x > 0 ? bbox.min.x : 0; + region.y = bbox.min.y > 0 ? bbox.min.y : 0; + region.w = bbox.max.x - region.x; + region.h = bbox.max.y - region.y; + if (region.w < 0) region.w = 0; + if (region.h < 0) region.h = 0; + + return region; + } + + virtual bool dispose() = 0; + virtual bool clip(SwRleData* target) = 0; + virtual SwRleData* rle() = 0; + + virtual ~SwTask() + { + free(transform); + } +}; + + +struct SwShapeTask : SwTask +{ + SwShape shape; + const RenderShape* rshape = nullptr; + bool cmpStroking = false; + bool clipper = false; + + /* We assume that if the stroke width is greater than 2, + the shape's outline beneath the stroke could be adequately covered by the stroke drawing. + Therefore, antialiasing is disabled under this condition. + Additionally, the stroke style should not be dashed. */ + bool antialiasing(float strokeWidth) + { + return strokeWidth < 2.0f || rshape->stroke->dashCnt > 0 || rshape->stroke->strokeFirst; + } + + float validStrokeWidth() + { + if (!rshape->stroke) return 0.0f; + + auto width = rshape->stroke->width; + if (mathZero(width)) return 0.0f; + + if (!rshape->stroke->fill && (MULTIPLY(rshape->stroke->color[3], opacity) == 0)) return 0.0f; + if (mathZero(rshape->stroke->trim.begin - rshape->stroke->trim.end)) return 0.0f; + + if (transform) return (width * sqrt(transform->e11 * transform->e11 + transform->e12 * transform->e12)); + else return width; + } + + + bool clip(SwRleData* target) override + { + if (shape.fastTrack) rleClipRect(target, &bbox); + else if (shape.rle) rleClipPath(target, shape.rle); + else return false; + + return true; + } + + SwRleData* rle() override + { + if (!shape.rle && shape.fastTrack) { + shape.rle = rleRender(&shape.bbox); + } + return shape.rle; + } + + void run(unsigned tid) override + { + if (opacity == 0 && !clipper) return; //Invisible + + auto strokeWidth = validStrokeWidth(); + bool visibleFill = false; + auto clipRegion = bbox; + + //This checks also for the case, if the invisible shape turned to visible by alpha. + auto prepareShape = false; + if (!shapePrepared(&shape) && (flags & RenderUpdateFlag::Color)) prepareShape = true; + + //Shape + if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) { + uint8_t alpha = 0; + rshape->fillColor(nullptr, nullptr, nullptr, &alpha); + alpha = MULTIPLY(alpha, opacity); + visibleFill = (alpha > 0 || rshape->fill); + if (visibleFill || clipper) { + shapeReset(&shape); + if (!shapePrepare(&shape, rshape, transform, clipRegion, bbox, mpool, tid, clips.count > 0 ? true : false)) goto err; + } + } + //Fill + if (flags & (RenderUpdateFlag::Gradient | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) { + if (visibleFill || clipper) { + if (!shapeGenRle(&shape, rshape, antialiasing(strokeWidth))) goto err; + } + if (auto fill = rshape->fill) { + auto ctable = (flags & RenderUpdateFlag::Gradient) ? true : false; + if (ctable) shapeResetFill(&shape); + if (!shapeGenFillColors(&shape, fill, transform, surface, opacity, ctable)) goto err; + } else { + shapeDelFill(&shape); + } + } + //Stroke + if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::Transform)) { + if (strokeWidth > 0.0f) { + shapeResetStroke(&shape, rshape, transform); + if (!shapeGenStrokeRle(&shape, rshape, transform, clipRegion, bbox, mpool, tid)) goto err; + + if (auto fill = rshape->strokeFill()) { + auto ctable = (flags & RenderUpdateFlag::GradientStroke) ? true : false; + if (ctable) shapeResetStrokeFill(&shape); + if (!shapeGenStrokeFillColors(&shape, fill, transform, surface, opacity, ctable)) goto err; + } else { + shapeDelStrokeFill(&shape); + } + } else { + shapeDelStroke(&shape); + } + } + + //Clear current task memorypool here if the clippers would use the same memory pool + shapeDelOutline(&shape, mpool, tid); + + //Clip Path + for (auto clip = clips.data; clip < clips.end(); ++clip) { + auto clipper = static_cast(*clip); + //Clip shape rle + if (shape.rle && !clipper->clip(shape.rle)) goto err; + //Clip stroke rle + if (shape.strokeRle && !clipper->clip(shape.strokeRle)) goto err; + } + return; + + err: + shapeReset(&shape); + shapeDelOutline(&shape, mpool, tid); + } + + bool dispose() override + { + shapeFree(&shape); + return true; + } +}; + + +struct SwSceneTask : SwTask +{ + Array scene; //list of paints render data (SwTask) + SwRleData* sceneRle = nullptr; + + bool clip(SwRleData* target) override + { + //Only one shape + if (scene.count == 1) { + return static_cast(*scene.data)->clip(target); + } + + //More than one shapes + if (sceneRle) rleClipPath(target, sceneRle); + else TVGLOG("SW_ENGINE", "No clippers in a scene?"); + + return true; + } + + SwRleData* rle() override + { + return sceneRle; + } + + void run(unsigned tid) override + { + //TODO: Skip the run if the scene hans't changed. + if (!sceneRle) sceneRle = static_cast(calloc(1, sizeof(SwRleData))); + else rleReset(sceneRle); + + //Merge shapes if it has more than one shapes + if (scene.count > 1) { + //Merge first two clippers + auto clipper1 = static_cast(*scene.data); + auto clipper2 = static_cast(*(scene.data + 1)); + + rleMerge(sceneRle, clipper1->rle(), clipper2->rle()); + + //Unify the remained clippers + for (auto rd = scene.data + 2; rd < scene.end(); ++rd) { + auto clipper = static_cast(*rd); + rleMerge(sceneRle, sceneRle, clipper->rle()); + } + } + } + + bool dispose() override + { + rleFree(sceneRle); + return true; + } +}; + + +struct SwImageTask : SwTask +{ + SwImage image; + Surface* source; //Image source + const RenderMesh* mesh = nullptr; //Should be valid ptr in action + + bool clip(SwRleData* target) override + { + TVGERR("SW_ENGINE", "Image is used as ClipPath?"); + return true; + } + + SwRleData* rle() override + { + TVGERR("SW_ENGINE", "Image is used as Scene ClipPath?"); + return nullptr; + } + + void run(unsigned tid) override + { + auto clipRegion = bbox; + + //Convert colorspace if it's not aligned. + if (source->owner) { + if (source->cs != surface->cs) rasterConvertCS(source, surface->cs); + if (!source->premultiplied) rasterPremultiply(source); + } + + image.data = source->data; + image.w = source->w; + image.h = source->h; + image.stride = source->stride; + image.channelSize = source->channelSize; + + //Invisible shape turned to visible by alpha. + if ((flags & (RenderUpdateFlag::Image | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) && (opacity > 0)) { + imageReset(&image); + if (!image.data || image.w == 0 || image.h == 0) goto end; + + if (!imagePrepare(&image, mesh, transform, clipRegion, bbox, mpool, tid)) goto end; + + // TODO: How do we clip the triangle mesh? Only clip non-meshed images for now + if (mesh->triangleCnt == 0 && clips.count > 0) { + if (!imageGenRle(&image, bbox, false)) goto end; + if (image.rle) { + //Clear current task memorypool here if the clippers would use the same memory pool + imageDelOutline(&image, mpool, tid); + for (auto clip = clips.data; clip < clips.end(); ++clip) { + auto clipper = static_cast(*clip); + if (!clipper->clip(image.rle)) goto err; + } + return; + } + } + } + goto end; + err: + rleReset(image.rle); + end: + imageDelOutline(&image, mpool, tid); + } + + bool dispose() override + { + imageFree(&image); + return true; + } +}; + + +static void _termEngine() +{ + if (rendererCnt > 0) return; + + mpoolTerm(globalMpool); + globalMpool = nullptr; +} + + +static void _renderFill(SwShapeTask* task, SwSurface* surface, uint8_t opacity) +{ + uint8_t r, g, b, a; + if (auto fill = task->rshape->fill) { + rasterGradientShape(surface, &task->shape, fill->identifier()); + } else { + task->rshape->fillColor(&r, &g, &b, &a); + a = MULTIPLY(opacity, a); + if (a > 0) rasterShape(surface, &task->shape, r, g, b, a); + } +} + +static void _renderStroke(SwShapeTask* task, SwSurface* surface, uint8_t opacity) +{ + uint8_t r, g, b, a; + if (auto strokeFill = task->rshape->strokeFill()) { + rasterGradientStroke(surface, &task->shape, strokeFill->identifier()); + } else { + if (task->rshape->strokeColor(&r, &g, &b, &a)) { + a = MULTIPLY(opacity, a); + if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a); + } + } +} + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +SwRenderer::~SwRenderer() +{ + clearCompositors(); + + delete(surface); + + if (!sharedMpool) mpoolTerm(mpool); + + --rendererCnt; + + if (rendererCnt == 0 && initEngineCnt == 0) _termEngine(); +} + + +bool SwRenderer::clear() +{ + for (auto task = tasks.data; task < tasks.end(); ++task) { + if ((*task)->disposed) { + delete(*task); + } else { + (*task)->done(); + (*task)->pushed = false; + } + } + tasks.clear(); + + if (!sharedMpool) mpoolClear(mpool); + + if (surface) { + vport.x = vport.y = 0; + vport.w = surface->w; + vport.h = surface->h; + } + + return true; +} + + +bool SwRenderer::sync() +{ + return true; +} + + +RenderRegion SwRenderer::viewport() +{ + return vport; +} + + +bool SwRenderer::viewport(const RenderRegion& vp) +{ + vport = vp; + return true; +} + + +bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs) +{ + if (!data || stride == 0 || w == 0 || h == 0 || w > stride) return false; + + if (!surface) surface = new SwSurface; + + surface->data = data; + surface->stride = stride; + surface->w = w; + surface->h = h; + surface->cs = cs; + surface->channelSize = CHANNEL_SIZE(cs); + surface->premultiplied = true; + surface->owner = true; + + vport.x = vport.y = 0; + vport.w = surface->w; + vport.h = surface->h; + + return rasterCompositor(surface); +} + + +bool SwRenderer::preRender() +{ +#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG + return true; +#else + return rasterClear(surface, 0, 0, surface->w, surface->h); +#endif +} + + +void SwRenderer::clearCompositors() +{ + //Free Composite Caches + for (auto comp = compositors.data; comp < compositors.end(); ++comp) { + free((*comp)->compositor->image.data); + delete((*comp)->compositor); + delete(*comp); + } + compositors.reset(); +} + + +bool SwRenderer::postRender() +{ + //Unmultiply alpha if needed + if (surface->cs == ColorSpace::ABGR8888S || surface->cs == ColorSpace::ARGB8888S) { + rasterUnpremultiply(surface); + } + + for (auto task = tasks.data; task < tasks.end(); ++task) { + if ((*task)->disposed) delete(*task); + else (*task)->pushed = false; + } + tasks.clear(); + + clearCompositors(); + return true; +} + + +bool SwRenderer::renderImage(RenderData data) +{ + auto task = static_cast(data); + task->done(); + + if (task->opacity == 0) return true; + + return rasterImage(surface, &task->image, task->mesh, task->transform, task->bbox, task->opacity); +} + + +bool SwRenderer::renderShape(RenderData data) +{ + auto task = static_cast(data); + if (!task) return false; + + task->done(); + + if (task->opacity == 0) return true; + + //Main raster stage + if (task->rshape->stroke && task->rshape->stroke->strokeFirst) { + _renderStroke(task, surface, task->opacity); + _renderFill(task, surface, task->opacity); + } else { + _renderFill(task, surface, task->opacity); + _renderStroke(task, surface, task->opacity); + } + + return true; +} + + +bool SwRenderer::blend(BlendMethod method) +{ + if (surface->blendMethod == method) return true; + surface->blendMethod = method; + + switch (method) { + case BlendMethod::Add: + surface->blender = opBlendAdd; + break; + case BlendMethod::Screen: + surface->blender = opBlendScreen; + break; + case BlendMethod::Multiply: + surface->blender = opBlendMultiply; + break; + case BlendMethod::Overlay: + surface->blender = opBlendOverlay; + break; + case BlendMethod::Difference: + surface->blender = opBlendDifference; + break; + case BlendMethod::Exclusion: + surface->blender = opBlendExclusion; + break; + case BlendMethod::SrcOver: + surface->blender = opBlendSrcOver; + break; + case BlendMethod::Darken: + surface->blender = opBlendDarken; + break; + case BlendMethod::Lighten: + surface->blender = opBlendLighten; + break; + case BlendMethod::ColorDodge: + surface->blender = opBlendColorDodge; + break; + case BlendMethod::ColorBurn: + surface->blender = opBlendColorBurn; + break; + case BlendMethod::HardLight: + surface->blender = opBlendHardLight; + break; + case BlendMethod::SoftLight: + surface->blender = opBlendSoftLight; + break; + default: + surface->blender = nullptr; + break; + } + return false; +} + + +RenderRegion SwRenderer::region(RenderData data) +{ + return static_cast(data)->bounds(); +} + + +bool SwRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) +{ + if (!cmp) return false; + auto p = static_cast(cmp); + + p->method = method; + p->opacity = opacity; + + //Current Context? + if (p->method != CompositeMethod::None) { + surface = p->recoverSfc; + surface->compositor = p; + } + + return true; +} + + +bool SwRenderer::mempool(bool shared) +{ + if (shared == sharedMpool) return true; + + if (shared) { + if (!sharedMpool) { + if (!mpoolTerm(mpool)) return false; + mpool = globalMpool; + } + } else { + if (sharedMpool) mpool = mpoolInit(threadsCnt); + } + + sharedMpool = shared; + + if (mpool) return true; + return false; +} + + +Compositor* SwRenderer::target(const RenderRegion& region, ColorSpace cs) +{ + auto x = region.x; + auto y = region.y; + auto w = region.w; + auto h = region.h; + auto sw = static_cast(surface->w); + auto sh = static_cast(surface->h); + + //Out of boundary + if (x >= sw || y >= sh || x + w < 0 || y + h < 0) return nullptr; + + SwSurface* cmp = nullptr; + + auto reqChannelSize = CHANNEL_SIZE(cs); + + //Use cached data + for (auto p = compositors.data; p < compositors.end(); ++p) { + if ((*p)->compositor->valid && (*p)->compositor->image.channelSize == reqChannelSize) { + cmp = *p; + break; + } + } + + //New Composition + if (!cmp) { + cmp = new SwSurface; + + //Inherits attributes from main surface + *cmp = *surface; + + cmp->compositor = new SwCompositor; + + //TODO: We can optimize compositor surface size from (surface->stride x surface->h) to Parameter(w x h) + cmp->compositor->image.data = (pixel_t*)malloc(reqChannelSize * surface->stride * surface->h); + cmp->channelSize = cmp->compositor->image.channelSize = reqChannelSize; + + compositors.push(cmp); + } + + //Boundary Check + if (x + w > sw) w = (sw - x); + if (y + h > sh) h = (sh - y); + + cmp->compositor->recoverSfc = surface; + cmp->compositor->recoverCmp = surface->compositor; + cmp->compositor->valid = false; + cmp->compositor->bbox.min.x = x; + cmp->compositor->bbox.min.y = y; + cmp->compositor->bbox.max.x = x + w; + cmp->compositor->bbox.max.y = y + h; + cmp->compositor->image.stride = surface->stride; + cmp->compositor->image.w = surface->w; + cmp->compositor->image.h = surface->h; + cmp->compositor->image.direct = true; + + cmp->data = cmp->compositor->image.data; + cmp->w = cmp->compositor->image.w; + cmp->h = cmp->compositor->image.h; + + rasterClear(cmp, x, y, w, h); + + //Switch render target + surface = cmp; + + return cmp->compositor; +} + + +bool SwRenderer::endComposite(Compositor* cmp) +{ + if (!cmp) return false; + + auto p = static_cast(cmp); + p->valid = true; + + //Recover Context + surface = p->recoverSfc; + surface->compositor = p->recoverCmp; + + //Default is alpha blending + if (p->method == CompositeMethod::None) { + return rasterImage(surface, &p->image, nullptr, nullptr, p->bbox, p->opacity); + } + + return true; +} + + +ColorSpace SwRenderer::colorSpace() +{ + if (surface) return surface->cs; + else return ColorSpace::Unsupported; +} + + +bool SwRenderer::dispose(RenderData data) +{ + auto task = static_cast(data); + if (!task) return true; + task->done(); + task->dispose(); + + if (task->pushed) task->disposed = true; + else delete(task); + + return true; +} + + +void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, const Array& clips, uint8_t opacity, RenderUpdateFlag flags) +{ + if (!surface) return task; + if (flags == RenderUpdateFlag::None) return task; + + //Finish previous task if it has duplicated request. + task->done(); + + //TODO: Failed threading them. It would be better if it's possible. + //See: https://github.com/thorvg/thorvg/issues/1409 + //Guarantee composition targets get ready. + for (auto clip = clips.data; clip < clips.end(); ++clip) { + static_cast(*clip)->done(); + } + + task->clips = clips; + + if (transform) { + if (!task->transform) task->transform = static_cast(malloc(sizeof(Matrix))); + *task->transform = transform->m; + } else { + if (task->transform) free(task->transform); + task->transform = nullptr; + } + + //zero size? + if (task->transform) { + if (task->transform->e11 == 0.0f && task->transform->e12 == 0.0f) return task; //zero width + if (task->transform->e21 == 0.0f && task->transform->e22 == 0.0f) return task; //zero height + } + + task->opacity = opacity; + task->surface = surface; + task->mpool = mpool; + task->flags = flags; + task->bbox.min.x = mathMax(static_cast(0), static_cast(vport.x)); + task->bbox.min.y = mathMax(static_cast(0), static_cast(vport.y)); + task->bbox.max.x = mathMin(static_cast(surface->w), static_cast(vport.x + vport.w)); + task->bbox.max.y = mathMin(static_cast(surface->h), static_cast(vport.y + vport.h)); + + if (!task->pushed) { + task->pushed = true; + tasks.push(task); + } + + TaskScheduler::request(task); + + return task; +} + + +RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) +{ + //prepare task + auto task = static_cast(data); + if (!task) task = new SwImageTask; + task->source = surface; + task->mesh = mesh; + return prepareCommon(task, transform, clips, opacity, flags); +} + + +RenderData SwRenderer::prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) +{ + //prepare task + auto task = static_cast(data); + if (!task) task = new SwSceneTask; + task->scene = scene; + + //TODO: Failed threading them. It would be better if it's possible. + //See: https://github.com/thorvg/thorvg/issues/1409 + //Guarantee composition targets get ready. + for (auto task = scene.data; task < scene.end(); ++task) { + static_cast(*task)->done(); + } + return prepareCommon(task, transform, clips, opacity, flags); +} + + +RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) +{ + //prepare task + auto task = static_cast(data); + if (!task) { + task = new SwShapeTask; + task->rshape = &rshape; + } + task->clipper = clipper; + + return prepareCommon(task, transform, clips, opacity, flags); +} + + +SwRenderer::SwRenderer():mpool(globalMpool) +{ +} + + +bool SwRenderer::init(uint32_t threads) +{ + if ((initEngineCnt++) > 0) return true; + + threadsCnt = threads; + + //Share the memory pool among the renderer + globalMpool = mpoolInit(threads); + if (!globalMpool) { + --initEngineCnt; + return false; + } + + return true; +} + + +int32_t SwRenderer::init() +{ + return initEngineCnt; +} + + +bool SwRenderer::term() +{ + if ((--initEngineCnt) > 0) return true; + + initEngineCnt = 0; + + _termEngine(); + + return true; +} + +SwRenderer* SwRenderer::gen() +{ + ++rendererCnt; + return new SwRenderer(); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.h b/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.h new file mode 100644 index 0000000..8df5a21 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRenderer.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SW_RENDERER_H_ +#define _TVG_SW_RENDERER_H_ + +#include "tvgRender.h" + +struct SwSurface; +struct SwTask; +struct SwCompositor; +struct SwMpool; + +namespace tvg +{ + +class SwRenderer : public RenderMethod +{ +public: + RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override; + RenderData prepare(const Array& scene, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; + RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array& clips, uint8_t opacity, RenderUpdateFlag flags) override; + bool preRender() override; + bool renderShape(RenderData data) override; + bool renderImage(RenderData data) override; + bool postRender() override; + bool dispose(RenderData data) override; + RenderRegion region(RenderData data) override; + RenderRegion viewport() override; + bool viewport(const RenderRegion& vp) override; + bool blend(BlendMethod method) override; + ColorSpace colorSpace() override; + + bool clear() override; + bool sync() override; + bool target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs); + bool mempool(bool shared); + + Compositor* target(const RenderRegion& region, ColorSpace cs) override; + bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) override; + bool endComposite(Compositor* cmp) override; + void clearCompositors(); + + static SwRenderer* gen(); + static bool init(uint32_t threads); + static int32_t init(); + static bool term(); + +private: + SwSurface* surface = nullptr; //active surface + Array tasks; //async task list + Array compositors; //render targets cache list + SwMpool* mpool; //private memory pool + RenderRegion vport; //viewport + bool sharedMpool = true; //memory-pool behavior policy + + SwRenderer(); + ~SwRenderer(); + + RenderData prepareCommon(SwTask* task, const RenderTransform* transform, const Array& clips, uint8_t opacity, RenderUpdateFlag flags); +}; + +} + +#endif /* _TVG_SW_RENDERER_H_ */ + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwRle.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwRle.cpp new file mode 100644 index 0000000..e541e94 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwRle.cpp @@ -0,0 +1,1134 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +/* + * The FreeType Project LICENSE + * ---------------------------- + + * 2006-Jan-27 + + * Copyright 1996-2002, 2006 by + * David Turner, Robert Wilhelm, and Werner Lemberg + + + + * Introduction + * ============ + + * The FreeType Project is distributed in several archive packages; + * some of them may contain, in addition to the FreeType font engine, + * various tools and contributions which rely on, or relate to, the + * FreeType Project. + + * This license applies to all files found in such packages, and + * which do not fall under their own explicit license. The license + * affects thus the FreeType font engine, the test programs, + * documentation and makefiles, at the very least. + + * This license was inspired by the BSD, Artistic, and IJG + * (Independent JPEG Group) licenses, which all encourage inclusion + * and use of free software in commercial and freeware products + * alike. As a consequence, its main points are that: + + * o We don't promise that this software works. However, we will be + * interested in any kind of bug reports. (`as is' distribution) + + * o You can use this software for whatever you want, in parts or + * full form, without having to pay us. (`royalty-free' usage) + + * o You may not pretend that you wrote this software. If you use + * it, or only parts of it, in a program, you must acknowledge + * somewhere in your documentation that you have used the + * FreeType code. (`credits') + + * We specifically permit and encourage the inclusion of this + * software, with or without modifications, in commercial products. + * We disclaim all warranties covering The FreeType Project and + * assume no liability related to The FreeType Project. + + + * Finally, many people asked us for a preferred form for a + * credit/disclaimer to use in compliance with this license. We thus + * encourage you to use the following text: + + * """ + * Portions of this software are copyright � The FreeType + * Project (www.freetype.org). All rights reserved. + * """ + + * Please replace with the value from the FreeType version you + * actually use. + +* Legal Terms +* =========== + +* 0. Definitions +* -------------- + +* Throughout this license, the terms `package', `FreeType Project', +* and `FreeType archive' refer to the set of files originally +* distributed by the authors (David Turner, Robert Wilhelm, and +* Werner Lemberg) as the `FreeType Project', be they named as alpha, +* beta or final release. + +* `You' refers to the licensee, or person using the project, where +* `using' is a generic term including compiling the project's source +* code as well as linking it to form a `program' or `executable'. +* This program is referred to as `a program using the FreeType +* engine'. + +* This license applies to all files distributed in the original +* FreeType Project, including all source code, binaries and +* documentation, unless otherwise stated in the file in its +* original, unmodified form as distributed in the original archive. +* If you are unsure whether or not a particular file is covered by +* this license, you must contact us to verify this. + +* The FreeType Project is copyright (C) 1996-2000 by David Turner, +* Robert Wilhelm, and Werner Lemberg. All rights reserved except as +* specified below. + +* 1. No Warranty +* -------------- + +* THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY +* KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO +* USE, OF THE FREETYPE PROJECT. + +* 2. Redistribution +* ----------------- + +* This license grants a worldwide, royalty-free, perpetual and +* irrevocable right and license to use, execute, perform, compile, +* display, copy, create derivative works of, distribute and +* sublicense the FreeType Project (in both source and object code +* forms) and derivative works thereof for any purpose; and to +* authorize others to exercise some or all of the rights granted +* herein, subject to the following conditions: + +* o Redistribution of source code must retain this license file +* (`FTL.TXT') unaltered; any additions, deletions or changes to +* the original files must be clearly indicated in accompanying +* documentation. The copyright notices of the unaltered, +* original files must be preserved in all copies of source +* files. + +* o Redistribution in binary form must provide a disclaimer that +* states that the software is based in part of the work of the +* FreeType Team, in the distribution documentation. We also +* encourage you to put an URL to the FreeType web page in your +* documentation, though this isn't mandatory. + +* These conditions apply to any software derived from or based on +* the FreeType Project, not just the unmodified files. If you use +* our work, you must acknowledge us. However, no fee need be paid +* to us. + +* 3. Advertising +* -------------- + +* Neither the FreeType authors and contributors nor you shall use +* the name of the other for commercial, advertising, or promotional +* purposes without specific prior written permission. + +* We suggest, but do not require, that you use one or more of the +* following phrases to refer to this software in your documentation +* or advertising materials: `FreeType Project', `FreeType Engine', +* `FreeType library', or `FreeType Distribution'. + +* As you have not signed this license, you are not required to +* accept it. However, as the FreeType Project is copyrighted +* material, only this license, or another one contracted with the +* authors, grants you the right to use, distribute, and modify it. +* Therefore, by using, distributing, or modifying the FreeType +* Project, you indicate that you understand and accept all the terms +* of this license. + +* 4. Contacts +* ----------- + +* There are two mailing lists related to FreeType: + +* o freetype@nongnu.org + +* Discusses general use and applications of FreeType, as well as +* future and wanted additions to the library and distribution. +* If you are looking for support, start in this list if you +* haven't found anything to help you in the documentation. + +* o freetype-devel@nongnu.org + +* Discusses bugs, as well as engine internals, design issues, +* specific licenses, porting, etc. + +* Our home page can be found at + +* http://www.freetype.org +*/ + +#include +#include +#include +#include "tvgSwCommon.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +constexpr auto MAX_SPANS = 256; +constexpr auto PIXEL_BITS = 8; //must be at least 6 bits! +constexpr auto ONE_PIXEL = (1L << PIXEL_BITS); + +using Area = long; + +struct Band +{ + SwCoord min, max; +}; + +struct Cell +{ + SwCoord x; + SwCoord cover; + Area area; + Cell *next; +}; + +struct RleWorker +{ + SwRleData* rle; + + SwPoint cellPos; + SwPoint cellMin; + SwPoint cellMax; + SwCoord cellXCnt; + SwCoord cellYCnt; + + Area area; + SwCoord cover; + + Cell* cells; + ptrdiff_t maxCells; + ptrdiff_t cellsCnt; + + SwPoint pos; + + SwPoint bezStack[32 * 3 + 1]; + int levStack[32]; + + SwOutline* outline; + + SwSpan spans[MAX_SPANS]; + int spansCnt; + int ySpan; + + int bandSize; + int bandShoot; + + jmp_buf jmpBuf; + + void* buffer; + long bufferSize; + + Cell** yCells; + SwCoord yCnt; + + bool invalid; + bool antiAlias; +}; + + +static inline SwPoint UPSCALE(const SwPoint& pt) +{ + return {SwCoord(((unsigned long) pt.x) << (PIXEL_BITS - 6)), SwCoord(((unsigned long) pt.y) << (PIXEL_BITS - 6))}; +} + + +static inline SwPoint TRUNC(const SwPoint& pt) +{ + return {pt.x >> PIXEL_BITS, pt.y >> PIXEL_BITS}; +} + + +static inline SwCoord TRUNC(const SwCoord x) +{ + return x >> PIXEL_BITS; +} + + +static inline SwPoint SUBPIXELS(const SwPoint& pt) +{ + return {SwCoord(((unsigned long) pt.x) << PIXEL_BITS), SwCoord(((unsigned long) pt.y) << PIXEL_BITS)}; +} + + +static inline SwCoord SUBPIXELS(const SwCoord x) +{ + return SwCoord(((unsigned long) x) << PIXEL_BITS); +} + +/* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' + * algorithm. We use alpha = 1, beta = 3/8, giving us results with a + * largest error less than 7% compared to the exact value. + */ +static inline SwCoord HYPOT(SwPoint pt) +{ + if (pt.x < 0) pt.x = -pt.x; + if (pt.y < 0) pt.y = -pt.y; + return ((pt.x > pt.y) ? (pt.x + (3 * pt.y >> 3)) : (pt.y + (3 * pt.x >> 3))); +} + +static void _genSpan(SwRleData* rle, const SwSpan* spans, uint32_t count) +{ + auto newSize = rle->size + count; + + /* allocate enough memory for new spans */ + /* alloc is required to prevent free and reallocation */ + /* when the rle needs to be regenerated because of attribute change. */ + if (rle->alloc < newSize) { + rle->alloc = (newSize * 2); + //OPTIMIZE: use mempool! + rle->spans = static_cast(realloc(rle->spans, rle->alloc * sizeof(SwSpan))); + } + + //copy the new spans to the allocated memory + SwSpan* lastSpan = rle->spans + rle->size; + memcpy(lastSpan, spans, count * sizeof(SwSpan)); + + rle->size = newSize; +} + + +static void _horizLine(RleWorker& rw, SwCoord x, SwCoord y, SwCoord area, SwCoord acount) +{ + x += rw.cellMin.x; + y += rw.cellMin.y; + + //Clip Y range + if (y < rw.cellMin.y || y >= rw.cellMax.y) return; + + /* compute the coverage line's coverage, depending on the outline fill rule */ + /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ + auto coverage = static_cast(area >> (PIXEL_BITS * 2 + 1 - 8)); //range 0 - 255 + + if (coverage < 0) coverage = -coverage; + + if (rw.outline->fillRule == FillRule::EvenOdd) { + coverage &= 511; + if (coverage > 255) coverage = 511 - coverage; + } else { + //normal non-zero winding rule + if (coverage > 255) coverage = 255; + } + + //span has ushort coordinates. check limit overflow + if (x >= SHRT_MAX) { + TVGERR("SW_ENGINE", "X-coordiante overflow!"); + x = SHRT_MAX; + } + if (y >= SHRT_MAX) { + TVGERR("SW_ENGINE", "Y Coordiante overflow!"); + y = SHRT_MAX; + } + + if (coverage > 0) { + if (!rw.antiAlias) coverage = 255; + auto count = rw.spansCnt; + auto span = rw.spans + count - 1; + + //see whether we can add this span to the current list + if ((count > 0) && (rw.ySpan == y) && + (span->x + span->len == x) && (span->coverage == coverage)) { + + //Clip x range + SwCoord xOver = 0; + if (x + acount >= rw.cellMax.x) xOver -= (x + acount - rw.cellMax.x); + if (x < rw.cellMin.x) xOver -= (rw.cellMin.x - x); + + //span->len += (acount + xOver) - 1; + span->len += (acount + xOver); + return; + } + + if (count >= MAX_SPANS) { + _genSpan(rw.rle, rw.spans, count); + rw.spansCnt = 0; + rw.ySpan = 0; + span = rw.spans; + } else { + ++span; + } + + //Clip x range + SwCoord xOver = 0; + if (x + acount >= rw.cellMax.x) xOver -= (x + acount - rw.cellMax.x); + if (x < rw.cellMin.x) { + xOver -= (rw.cellMin.x - x); + x = rw.cellMin.x; + } + + //Nothing to draw + if (acount + xOver <= 0) return; + + //add a span to the current list + span->x = x; + span->y = y; + span->len = (acount + xOver); + span->coverage = coverage; + ++rw.spansCnt; + rw.ySpan = y; + } +} + + +static void _sweep(RleWorker& rw) +{ + if (rw.cellsCnt == 0) return; + + rw.spansCnt = 0; + rw.ySpan = 0; + + for (int y = 0; y < rw.yCnt; ++y) { + auto cover = 0; + auto x = 0; + auto cell = rw.yCells[y]; + + while (cell) { + if (cell->x > x && cover != 0) _horizLine(rw, x, y, cover * (ONE_PIXEL * 2), cell->x - x); + cover += cell->cover; + auto area = cover * (ONE_PIXEL * 2) - cell->area; + if (area != 0 && cell->x >= 0) _horizLine(rw, cell->x, y, area, 1); + x = cell->x + 1; + cell = cell->next; + } + + if (cover != 0) _horizLine(rw, x, y, cover * (ONE_PIXEL * 2), rw.cellXCnt - x); + } + + if (rw.spansCnt > 0) _genSpan(rw.rle, rw.spans, rw.spansCnt); +} + + +static Cell* _findCell(RleWorker& rw) +{ + auto x = rw.cellPos.x; + if (x > rw.cellXCnt) x = rw.cellXCnt; + + auto pcell = &rw.yCells[rw.cellPos.y]; + + while(true) { + Cell* cell = *pcell; + if (!cell || cell->x > x) break; + if (cell->x == x) return cell; + pcell = &cell->next; + } + + if (rw.cellsCnt >= rw.maxCells) longjmp(rw.jmpBuf, 1); + + auto cell = rw.cells + rw.cellsCnt++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + cell->next = *pcell; + *pcell = cell; + + return cell; +} + + +static void _recordCell(RleWorker& rw) +{ + if (rw.area | rw.cover) { + auto cell = _findCell(rw); + cell->area += rw.area; + cell->cover += rw.cover; + } +} + + +static void _setCell(RleWorker& rw, SwPoint pos) +{ + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + /* All cells that are on the left of the clipping region go to the + min_ex - 1 horizontal position. */ + pos.x -= rw.cellMin.x; + pos.y -= rw.cellMin.y; + + if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; + + //Are we moving to a different cell? + if (pos != rw.cellPos) { + //Record the current one if it is valid + if (!rw.invalid) _recordCell(rw); + } + + rw.area = 0; + rw.cover = 0; + rw.cellPos = pos; + rw.invalid = ((unsigned)pos.y >= (unsigned)rw.cellYCnt || pos.x >= rw.cellXCnt); +} + + +static void _startCell(RleWorker& rw, SwPoint pos) +{ + if (pos.x > rw.cellMax.x) pos.x = rw.cellMax.x; + if (pos.x < rw.cellMin.x) pos.x = rw.cellMin.x; + + rw.area = 0; + rw.cover = 0; + rw.cellPos = pos - rw.cellMin; + rw.invalid = false; + + _setCell(rw, pos); +} + + +static void _moveTo(RleWorker& rw, const SwPoint& to) +{ + //record current cell, if any */ + if (!rw.invalid) _recordCell(rw); + + //start to a new position + _startCell(rw, TRUNC(to)); + + rw.pos = to; +} + + +static void _lineTo(RleWorker& rw, const SwPoint& to) +{ +#define SW_UDIV(a, b) \ + static_cast(((unsigned long)(a) * (unsigned long)(b)) >> \ + (sizeof(long) * CHAR_BIT - PIXEL_BITS)) + + auto e1 = TRUNC(rw.pos); + auto e2 = TRUNC(to); + + //vertical clipping + if ((e1.y >= rw.cellMax.y && e2.y >= rw.cellMax.y) || (e1.y < rw.cellMin.y && e2.y < rw.cellMin.y)) { + rw.pos = to; + return; + } + + auto diff = to - rw.pos; + auto f1 = rw.pos - SUBPIXELS(e1); + SwPoint f2; + + //inside one cell + if (e1 == e2) { + ; + //any horizontal line + } else if (diff.y == 0) { + e1.x = e2.x; + _setCell(rw, e1); + } else if (diff.x == 0) { + //vertical line up + if (diff.y > 0) { + do { + f2.y = ONE_PIXEL; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * f1.x * 2; + f1.y = 0; + ++e1.y; + _setCell(rw, e1); + } while(e1.y != e2.y); + //vertical line down + } else { + do { + f2.y = 0; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * f1.x * 2; + f1.y = ONE_PIXEL; + --e1.y; + _setCell(rw, e1); + } while(e1.y != e2.y); + } + //any other line + } else { + Area prod = diff.x * f1.y - diff.y * f1.x; + + /* These macros speed up repetitive divisions by replacing them + with multiplications and right shifts. */ + auto dx_r = static_cast(ULONG_MAX >> PIXEL_BITS) / (diff.x); + auto dy_r = static_cast(ULONG_MAX >> PIXEL_BITS) / (diff.y); + + /* The fundamental value `prod' determines which side and the */ + /* exact coordinate where the line exits current cell. It is */ + /* also easily updated when moving from one cell to the next. */ + do { + auto px = diff.x * ONE_PIXEL; + auto py = diff.y * ONE_PIXEL; + + //left + if (prod <= 0 && prod - px > 0) { + f2 = {0, SW_UDIV(-prod, -dx_r)}; + prod -= py; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * (f1.x + f2.x); + f1 = {ONE_PIXEL, f2.y}; + --e1.x; + //up + } else if (prod - px <= 0 && prod - px + py > 0) { + prod -= px; + f2 = {SW_UDIV(-prod, dy_r), ONE_PIXEL}; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * (f1.x + f2.x); + f1 = {f2.x, 0}; + ++e1.y; + //right + } else if (prod - px + py <= 0 && prod + py >= 0) { + prod += py; + f2 = {ONE_PIXEL, SW_UDIV(prod, dx_r)}; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * (f1.x + f2.x); + f1 = {0, f2.y}; + ++e1.x; + //down + } else { + f2 = {SW_UDIV(prod, -dy_r), 0}; + prod += px; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * (f1.x + f2.x); + f1 = {f2.x, ONE_PIXEL}; + --e1.y; + } + + _setCell(rw, e1); + + } while(e1 != e2); + } + + f2 = {to.x - SUBPIXELS(e2.x), to.y - SUBPIXELS(e2.y)}; + rw.cover += (f2.y - f1.y); + rw.area += (f2.y - f1.y) * (f1.x + f2.x); + rw.pos = to; +} + + +static void _cubicTo(RleWorker& rw, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) +{ + auto arc = rw.bezStack; + arc[0] = to; + arc[1] = ctrl2; + arc[2] = ctrl1; + arc[3] = rw.pos; + + //Short-cut the arc that crosses the current band + auto min = arc[0].y; + auto max = arc[0].y; + + SwCoord y; + for (auto i = 1; i < 4; ++i) { + y = arc[i].y; + if (y < min) min = y; + if (y > max) max = y; + } + + if (TRUNC(min) >= rw.cellMax.y || TRUNC(max) < rw.cellMin.y) goto draw; + + /* Decide whether to split or draw. See `Rapid Termination */ + /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ + /* F. Hain, at */ + /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ + while (true) { + { + //diff is the P0 - P3 chord vector + auto diff = arc[3] - arc[0]; + auto L = HYPOT(diff); + + //avoid possible arithmetic overflow below by splitting + if (L > SHRT_MAX) goto split; + + //max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1) + auto sLimit = L * (ONE_PIXEL / 6); + + auto diff1 = arc[1] - arc[0]; + auto s = diff.y * diff1.x - diff.x * diff1.y; + if (s < 0) s = -s; + if (s > sLimit) goto split; + + //s is L * the perpendicular distance from P2 to the line P0 - P3 + auto diff2 = arc[2] - arc[0]; + s = diff.y * diff2.x - diff.x * diff2.y; + if (s < 0) s = -s; + if (s > sLimit) goto split; + + /* Split super curvy segments where the off points are so far + from the chord that the angles P0-P1-P3 or P0-P2-P3 become + acute as detected by appropriate dot products */ + if (diff1.x * (diff1.x - diff.x) + diff1.y * (diff1.y - diff.y) > 0 || + diff2.x * (diff2.x - diff.x) + diff2.y * (diff2.y - diff.y) > 0) + goto split; + + //no reason to split + goto draw; + } + split: + mathSplitCubic(arc); + arc += 3; + continue; + + draw: + _lineTo(rw, arc[0]); + if (arc == rw.bezStack) return; + arc -= 3; + } +} + + +static void _decomposeOutline(RleWorker& rw) +{ + auto outline = rw.outline; + auto first = 0; //index of first point in contour + + for (auto cntr = outline->cntrs.data; cntr < outline->cntrs.end(); ++cntr) { + auto last = *cntr; + auto limit = outline->pts.data + last; + auto start = UPSCALE(outline->pts[first]); + auto pt = outline->pts.data + first; + auto types = outline->types.data + first; + + _moveTo(rw, UPSCALE(outline->pts[first])); + + while (pt < limit) { + ++pt; + ++types; + + //emit a single line_to + if (types[0] == SW_CURVE_TYPE_POINT) { + _lineTo(rw, UPSCALE(*pt)); + //types cubic + } else { + pt += 2; + types += 2; + + if (pt <= limit) { + _cubicTo(rw, UPSCALE(pt[-2]), UPSCALE(pt[-1]), UPSCALE(pt[0])); + continue; + } + _cubicTo(rw, UPSCALE(pt[-2]), UPSCALE(pt[-1]), start); + goto close; + } + } + _lineTo(rw, start); + close: + first = last + 1; + } +} + + +static int _genRle(RleWorker& rw) +{ + if (setjmp(rw.jmpBuf) == 0) { + _decomposeOutline(rw); + if (!rw.invalid) _recordCell(rw); + return 0; + } + return -1; //lack of cell memory +} + + +static SwSpan* _intersectSpansRegion(const SwRleData *clip, const SwRleData *target, SwSpan *outSpans, uint32_t outSpansCnt) +{ + auto out = outSpans; + auto spans = target->spans; + auto end = target->spans + target->size; + auto clipSpans = clip->spans; + auto clipEnd = clip->spans + clip->size; + + while (spans < end && clipSpans < clipEnd) { + //align y cooridnates. + if (clipSpans->y > spans->y) { + ++spans; + continue; + } + if (spans->y > clipSpans->y) { + ++clipSpans; + continue; + } + + //Try clipping with all clip spans which have a same y coordinate. + auto temp = clipSpans; + while(temp < clipEnd && outSpansCnt > 0 && temp->y == clipSpans->y) { + auto sx1 = spans->x; + auto sx2 = sx1 + spans->len; + auto cx1 = temp->x; + auto cx2 = cx1 + temp->len; + + //The span must be left(x1) to right(x2) direction. Not intersected. + if (cx2 < sx1 || sx2 < cx1) { + ++temp; + continue; + } + + //clip span region. + auto x = sx1 > cx1 ? sx1 : cx1; + auto len = (sx2 < cx2 ? sx2 : cx2) - x; + if (len > 0) { + out->x = x; + out->y = temp->y; + out->len = len; + out->coverage = (uint8_t)(((spans->coverage * temp->coverage) + 0xff) >> 8); + ++out; + --outSpansCnt; + } + ++temp; + } + ++spans; + } + return out; +} + + +static SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSpan *outSpans, uint32_t outSpansCnt) +{ + auto out = outSpans; + auto spans = targetRle->spans; + auto end = targetRle->spans + targetRle->size; + auto minx = static_cast(bbox->min.x); + auto miny = static_cast(bbox->min.y); + auto maxx = minx + static_cast(bbox->max.x - bbox->min.x) - 1; + auto maxy = miny + static_cast(bbox->max.y - bbox->min.y) - 1; + + while (outSpansCnt > 0 && spans < end) { + if (spans->y > maxy) { + spans = end; + break; + } + if (spans->y < miny || spans->x > maxx || spans->x + spans->len <= minx) { + ++spans; + continue; + } + if (spans->x < minx) { + out->len = (spans->len - (minx - spans->x)) < (maxx - minx + 1) ? (spans->len - (minx - spans->x)) : (maxx - minx + 1); + out->x = minx; + } + else { + out->x = spans->x; + out->len = spans->len < (maxx - spans->x + 1) ? spans->len : (maxx - spans->x + 1); + } + if (out->len > 0) { + out->y = spans->y; + out->coverage = spans->coverage; + ++out; + --outSpansCnt; + } + ++spans; + } + return out; +} + + +static SwSpan* _mergeSpansRegion(const SwRleData *clip1, const SwRleData *clip2, SwSpan *outSpans) +{ + auto out = outSpans; + auto spans1 = clip1->spans; + auto end1 = clip1->spans + clip1->size; + auto spans2 = clip2->spans; + auto end2 = clip2->spans + clip2->size; + + //list two spans up in y order + //TODO: Remove duplicated regions? + while (spans1 < end1 && spans2 < end2) { + while (spans1 < end1 && spans1->y <= spans2->y) { + *out = *spans1; + ++spans1; + ++out; + } + if (spans1 >= end1) break; + while (spans2 < end2 && spans2->y <= spans1->y) { + *out = *spans2; + ++spans2; + ++out; + } + } + + //Leftovers + while (spans1 < end1) { + *out = *spans1; + ++spans1; + ++out; + } + while (spans2 < end2) { + *out = *spans2; + ++spans2; + ++out; + } + + return out; +} + + +void _replaceClipSpan(SwRleData *rle, SwSpan* clippedSpans, uint32_t size) +{ + free(rle->spans); + rle->spans = clippedSpans; + rle->size = rle->alloc = size; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +SwRleData* rleRender(SwRleData* rle, const SwOutline* outline, const SwBBox& renderRegion, bool antiAlias) +{ + constexpr auto RENDER_POOL_SIZE = 16384L; + constexpr auto BAND_SIZE = 40; + + //TODO: We can preserve several static workers in advance + RleWorker rw; + Cell buffer[RENDER_POOL_SIZE / sizeof(Cell)]; + + //Init Cells + rw.buffer = buffer; + rw.bufferSize = sizeof(buffer); + rw.yCells = reinterpret_cast(buffer); + rw.cells = nullptr; + rw.maxCells = 0; + rw.cellsCnt = 0; + rw.area = 0; + rw.cover = 0; + rw.invalid = true; + rw.cellMin = renderRegion.min; + rw.cellMax = renderRegion.max; + rw.cellXCnt = rw.cellMax.x - rw.cellMin.x; + rw.cellYCnt = rw.cellMax.y - rw.cellMin.y; + rw.ySpan = 0; + rw.outline = const_cast(outline); + rw.bandSize = rw.bufferSize / (sizeof(Cell) * 8); //bandSize: 64 + rw.bandShoot = 0; + rw.antiAlias = antiAlias; + + if (!rle) rw.rle = reinterpret_cast(calloc(1, sizeof(SwRleData))); + else rw.rle = rle; + + //Generate RLE + Band bands[BAND_SIZE]; + Band* band; + + /* set up vertical bands */ + auto bandCnt = static_cast((rw.cellMax.y - rw.cellMin.y) / rw.bandSize); + if (bandCnt == 0) bandCnt = 1; + else if (bandCnt >= BAND_SIZE) bandCnt = (BAND_SIZE - 1); + + auto min = rw.cellMin.y; + auto yMax = rw.cellMax.y; + SwCoord max; + int ret; + + for (int n = 0; n < bandCnt; ++n, min = max) { + max = min + rw.bandSize; + if (n == bandCnt -1 || max > yMax) max = yMax; + + bands[0].min = min; + bands[0].max = max; + band = bands; + + while (band >= bands) { + rw.yCells = static_cast(rw.buffer); + rw.yCnt = band->max - band->min; + + int cellStart = sizeof(Cell*) * (int)rw.yCnt; + int cellMod = cellStart % sizeof(Cell); + + if (cellMod > 0) cellStart += sizeof(Cell) - cellMod; + + auto cellEnd = rw.bufferSize; + cellEnd -= cellEnd % sizeof(Cell); + + auto cellsMax = reinterpret_cast((char*)rw.buffer + cellEnd); + rw.cells = reinterpret_cast((char*)rw.buffer + cellStart); + + if (rw.cells >= cellsMax) goto reduce_bands; + + rw.maxCells = cellsMax - rw.cells; + if (rw.maxCells < 2) goto reduce_bands; + + for (int y = 0; y < rw.yCnt; ++y) + rw.yCells[y] = nullptr; + + rw.cellsCnt = 0; + rw.invalid = true; + rw.cellMin.y = band->min; + rw.cellMax.y = band->max; + rw.cellYCnt = band->max - band->min; + + ret = _genRle(rw); + if (ret == 0) { + _sweep(rw); + --band; + continue; + } else if (ret == 1) { + goto error; + } + + reduce_bands: + /* render pool overflow: we will reduce the render band by half */ + auto bottom = band->min; + auto top = band->max; + auto middle = bottom + ((top - bottom) >> 1); + + /* This is too complex for a single scanline; there must + be some problems */ + if (middle == bottom) goto error; + + if (bottom - top >= rw.bandSize) ++rw.bandShoot; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + ++band; + } + } + + if (rw.bandShoot > 8 && rw.bandSize > 16) + rw.bandSize = (rw.bandSize >> 1); + + return rw.rle; + +error: + free(rw.rle); + rw.rle = nullptr; + return nullptr; +} + + +SwRleData* rleRender(const SwBBox* bbox) +{ + auto width = static_cast(bbox->max.x - bbox->min.x); + auto height = static_cast(bbox->max.y - bbox->min.y); + + auto rle = static_cast(malloc(sizeof(SwRleData))); + rle->spans = static_cast(malloc(sizeof(SwSpan) * height)); + rle->size = height; + rle->alloc = height; + + auto span = rle->spans; + for (uint16_t i = 0; i < height; ++i, ++span) { + span->x = bbox->min.x; + span->y = bbox->min.y + i; + span->len = width; + span->coverage = 255; + } + + return rle; +} + + +void rleReset(SwRleData* rle) +{ + if (!rle) return; + rle->size = 0; +} + + +void rleFree(SwRleData* rle) +{ + if (!rle) return; + if (rle->spans) free(rle->spans); + free(rle); +} + + +void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2) +{ + if (!rle || (!clip1 && !clip2)) return; + if (clip1 && clip1->size == 0 && clip2 && clip2->size == 0) return; + + TVGLOG("SW_ENGINE", "Unifying Rle!"); + + //clip1 is empty, just copy clip2 + if (!clip1 || clip1->size == 0) { + if (clip2) { + auto spans = static_cast(malloc(sizeof(SwSpan) * (clip2->size))); + memcpy(spans, clip2->spans, clip2->size); + _replaceClipSpan(rle, spans, clip2->size); + } else { + _replaceClipSpan(rle, nullptr, 0); + } + return; + } + + //clip2 is empty, just copy clip1 + if (!clip2 || clip2->size == 0) { + if (clip1) { + auto spans = static_cast(malloc(sizeof(SwSpan) * (clip1->size))); + memcpy(spans, clip1->spans, clip1->size); + _replaceClipSpan(rle, spans, clip1->size); + } else { + _replaceClipSpan(rle, nullptr, 0); + } + return; + } + + auto spanCnt = clip1->size + clip2->size; + auto spans = static_cast(malloc(sizeof(SwSpan) * spanCnt)); + auto spansEnd = _mergeSpansRegion(clip1, clip2, spans); + + _replaceClipSpan(rle, spans, spansEnd - spans); +} + + +void rleClipPath(SwRleData *rle, const SwRleData *clip) +{ + if (rle->size == 0 || clip->size == 0) return; + auto spanCnt = rle->size > clip->size ? rle->size : clip->size; + auto spans = static_cast(malloc(sizeof(SwSpan) * (spanCnt))); + auto spansEnd = _intersectSpansRegion(clip, rle, spans, spanCnt); + + _replaceClipSpan(rle, spans, spansEnd - spans); + + TVGLOG("SW_ENGINE", "Using ClipPath!"); +} + + +void rleClipRect(SwRleData *rle, const SwBBox* clip) +{ + if (rle->size == 0) return; + auto spans = static_cast(malloc(sizeof(SwSpan) * (rle->size))); + auto spansEnd = _intersectSpansRect(clip, rle, spans, rle->size); + + _replaceClipSpan(rle, spans, spansEnd - spans); + + TVGLOG("SW_ENGINE", "Using ClipRect!"); +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwShape.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwShape.cpp new file mode 100644 index 0000000..6a9ea53 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwShape.cpp @@ -0,0 +1,686 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include "tvgSwCommon.h" +#include "tvgMath.h" +#include "tvgBezier.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +struct Line +{ + Point pt1; + Point pt2; +}; + + +static float _lineLength(const Point& pt1, const Point& pt2) +{ + /* approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm. + With alpha = 1, beta = 3/8, giving results with the largest error less + than 7% compared to the exact value. */ + Point diff = {pt2.x - pt1.x, pt2.y - pt1.y}; + if (diff.x < 0) diff.x = -diff.x; + if (diff.y < 0) diff.y = -diff.y; + return (diff.x > diff.y) ? (diff.x + diff.y * 0.375f) : (diff.y + diff.x * 0.375f); +} + + +static void _lineSplitAt(const Line& cur, float at, Line& left, Line& right) +{ + auto len = _lineLength(cur.pt1, cur.pt2); + auto dx = ((cur.pt2.x - cur.pt1.x) / len) * at; + auto dy = ((cur.pt2.y - cur.pt1.y) / len) * at; + left.pt1 = cur.pt1; + left.pt2.x = left.pt1.x + dx; + left.pt2.y = left.pt1.y + dy; + right.pt1 = left.pt2; + right.pt2 = cur.pt2; +} + + +static void _outlineEnd(SwOutline& outline) +{ + if (outline.pts.empty()) return; + outline.cntrs.push(outline.pts.count - 1); +} + + +static void _outlineMoveTo(SwOutline& outline, const Point* to, const Matrix* transform) +{ + if (outline.pts.count > 0) outline.cntrs.push(outline.pts.count - 1); + + outline.pts.push(mathTransform(to, transform)); + outline.types.push(SW_CURVE_TYPE_POINT); +} + + +static void _outlineLineTo(SwOutline& outline, const Point* to, const Matrix* transform) +{ + outline.pts.push(mathTransform(to, transform)); + outline.types.push(SW_CURVE_TYPE_POINT); +} + + +static void _outlineCubicTo(SwOutline& outline, const Point* ctrl1, const Point* ctrl2, const Point* to, const Matrix* transform) +{ + outline.pts.push(mathTransform(ctrl1, transform)); + outline.types.push(SW_CURVE_TYPE_CUBIC); + + outline.pts.push(mathTransform(ctrl2, transform)); + outline.types.push(SW_CURVE_TYPE_CUBIC); + + outline.pts.push(mathTransform(to, transform)); + outline.types.push(SW_CURVE_TYPE_POINT); +} + + +static void _outlineClose(SwOutline& outline) +{ + uint32_t i = 0; + + if (outline.cntrs.count > 0) i = outline.cntrs.last() + 1; + else i = 0; //First Path + + //Make sure there is at least one point in the current path + if (outline.pts.count == i) return; + + //Close the path + outline.pts.push(outline.pts[i]); + outline.types.push(SW_CURVE_TYPE_POINT); + outline.closed.push(true); +} + + +static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* transform) +{ + Line cur = {dash.ptCur, *to}; + auto len = _lineLength(cur.pt1, cur.pt2); + + if (len < dash.curLen) { + dash.curLen -= len; + if (!dash.curOpGap) { + if (dash.move) { + _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + dash.move = false; + } + _outlineLineTo(*dash.outline, to, transform); + } + } else { + while (len > dash.curLen) { + Line left, right; + if (dash.curLen > 0) { + len -= dash.curLen; + _lineSplitAt(cur, dash.curLen, left, right); + if (!dash.curOpGap) { + if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) { + _outlineMoveTo(*dash.outline, &left.pt1, transform); + dash.move = false; + } + _outlineLineTo(*dash.outline, &left.pt2, transform); + } + } else { + right = cur; + } + dash.curIdx = (dash.curIdx + 1) % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx]; + dash.curOpGap = !dash.curOpGap; + cur = right; + dash.ptCur = cur.pt1; + dash.move = true; + } + //leftovers + dash.curLen -= len; + if (!dash.curOpGap) { + if (dash.move) { + _outlineMoveTo(*dash.outline, &cur.pt1, transform); + dash.move = false; + } + _outlineLineTo(*dash.outline, &cur.pt2, transform); + } + if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { + //move to next dash + dash.curIdx = (dash.curIdx + 1) % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx]; + dash.curOpGap = !dash.curOpGap; + } + } + dash.ptCur = *to; +} + + +static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ctrl2, const Point* to, const Matrix* transform) +{ + Bezier cur = {dash.ptCur, *ctrl1, *ctrl2, *to}; + auto len = bezLength(cur); + + if (len < dash.curLen) { + dash.curLen -= len; + if (!dash.curOpGap) { + if (dash.move) { + _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + dash.move = false; + } + _outlineCubicTo(*dash.outline, ctrl1, ctrl2, to, transform); + } + } else { + while (len > dash.curLen) { + Bezier left, right; + if (dash.curLen > 0) { + len -= dash.curLen; + bezSplitAt(cur, dash.curLen, left, right); + if (!dash.curOpGap) { + if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) { + _outlineMoveTo(*dash.outline, &left.start, transform); + dash.move = false; + } + _outlineCubicTo(*dash.outline, &left.ctrl1, &left.ctrl2, &left.end, transform); + } + } else { + right = cur; + } + dash.curIdx = (dash.curIdx + 1) % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx]; + dash.curOpGap = !dash.curOpGap; + cur = right; + dash.ptCur = right.start; + dash.move = true; + } + //leftovers + dash.curLen -= len; + if (!dash.curOpGap) { + if (dash.move) { + _outlineMoveTo(*dash.outline, &cur.start, transform); + dash.move = false; + } + _outlineCubicTo(*dash.outline, &cur.ctrl1, &cur.ctrl2, &cur.end, transform); + } + if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { + //move to next dash + dash.curIdx = (dash.curIdx + 1) % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx]; + dash.curOpGap = !dash.curOpGap; + } + } + dash.ptCur = *to; +} + + +static void _dashClose(SwDashStroke& dash, const Matrix* transform) +{ + _dashLineTo(dash, &dash.ptStart, transform); +} + + +static void _dashMoveTo(SwDashStroke& dash, uint32_t offIdx, float offset, const Point* pts, const Matrix* transform) +{ + dash.curIdx = offIdx % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx] - offset; + dash.curOpGap = offIdx % 2; + dash.ptStart = dash.ptCur = *pts; + dash.move = true; +} + + +static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* transform, float length, SwMpool* mpool, unsigned tid) +{ + const PathCommand* cmds = rshape->path.cmds.data; + auto cmdCnt = rshape->path.cmds.count; + const Point* pts = rshape->path.pts.data; + auto ptsCnt = rshape->path.pts.count; + + //No actual shape data + if (cmdCnt == 0 || ptsCnt == 0) return nullptr; + + SwDashStroke dash; + auto offset = 0.0f; + auto trimmed = false; + + dash.cnt = rshape->strokeDash((const float**)&dash.pattern, &offset); + + //dash by trimming. + if (length > 0.0f && dash.cnt == 0) { + auto begin = length * rshape->stroke->trim.begin; + auto end = length * rshape->stroke->trim.end; + + //TODO: mix trimming + dash style + + //default + if (end > begin) { + if (begin > 0) dash.cnt += 4; + else dash.cnt += 2; + //looping + } else dash.cnt += 3; + + dash.pattern = (float*)malloc(sizeof(float) * dash.cnt); + + if (dash.cnt == 2) { + dash.pattern[0] = end - begin; + dash.pattern[1] = length - (end - begin); + } else if (dash.cnt == 3) { + dash.pattern[0] = end; + dash.pattern[1] = (begin - end); + dash.pattern[2] = length - begin; + } else { + dash.pattern[0] = 0; //zero dash to start with a space. + dash.pattern[1] = begin; + dash.pattern[2] = end - begin; + dash.pattern[3] = length - (end - begin); + } + + trimmed = true; + //just a dasy style. + } else { + if (dash.cnt == 0) return nullptr; + } + + //offset? + auto patternLength = 0.0f; + uint32_t offIdx = 0; + if (!mathZero(offset)) { + for (size_t i = 0; i < dash.cnt; ++i) patternLength += dash.pattern[i]; + bool isOdd = dash.cnt % 2; + if (isOdd) patternLength *= 2; + + offset = fmod(offset, patternLength); + if (offset < 0) offset += patternLength; + + for (size_t i = 0; i < dash.cnt * (1 + (size_t)isOdd); ++i, ++offIdx) { + auto curPattern = dash.pattern[i % dash.cnt]; + if (offset < curPattern) break; + offset -= curPattern; + } + } + + dash.outline = mpoolReqDashOutline(mpool, tid); + + //smart reservation + auto closeCnt = 0; + auto moveCnt = 0; + + for (auto cmd = rshape->path.cmds.data; cmd < rshape->path.cmds.end(); ++cmd) { + if (*cmd == PathCommand::Close) ++closeCnt; + else if (*cmd == PathCommand::MoveTo) ++moveCnt; + } + + //No idea exact count.... Reserve Approximitely 20x... + //OPTIMIZE: we can directly copy the path points when the close is occupied with a point. + dash.outline->pts.grow(20 * (closeCnt + ptsCnt + 1)); + dash.outline->types.grow(20 * (closeCnt + ptsCnt + 1)); + dash.outline->cntrs.grow(20 * (moveCnt + 1)); + + while (cmdCnt-- > 0) { + switch (*cmds) { + case PathCommand::Close: { + _dashClose(dash, transform); + break; + } + case PathCommand::MoveTo: { + _dashMoveTo(dash, offIdx, offset, pts, transform); + ++pts; + break; + } + case PathCommand::LineTo: { + _dashLineTo(dash, pts, transform); + ++pts; + break; + } + case PathCommand::CubicTo: { + _dashCubicTo(dash, pts, pts + 1, pts + 2, transform); + pts += 3; + break; + } + } + ++cmds; + } + + _outlineEnd(*dash.outline); + + if (trimmed) free(dash.pattern); + + return dash.outline; +} + + +static float _outlineLength(const RenderShape* rshape) +{ + const PathCommand* cmds = rshape->path.cmds.data; + auto cmdCnt = rshape->path.cmds.count; + const Point* pts = rshape->path.pts.data; + auto ptsCnt = rshape->path.pts.count; + + //No actual shape data + if (cmdCnt == 0 || ptsCnt == 0) return 0.0f; + + const Point* close = nullptr; + auto length = 0.0f; + + //Compute the whole length + while (cmdCnt-- > 0) { + switch (*cmds) { + case PathCommand::Close: { + length += mathLength(pts - 1, close); + ++pts; + break; + } + case PathCommand::MoveTo: { + close = pts; + ++pts; + break; + } + case PathCommand::LineTo: { + length += mathLength(pts - 1, pts); + ++pts; + break; + } + case PathCommand::CubicTo: { + length += bezLength({*(pts - 1), *pts, *(pts + 1), *(pts + 2)}); + pts += 3; + break; + } + } + ++cmds; + } + return length; +} + + +static bool _axisAlignedRect(const SwOutline* outline) +{ + //Fast Track: axis-aligned rectangle? + if (outline->pts.count != 5) return false; + + auto pt1 = outline->pts.data + 0; + auto pt2 = outline->pts.data + 1; + auto pt3 = outline->pts.data + 2; + auto pt4 = outline->pts.data + 3; + + auto a = SwPoint{pt1->x, pt3->y}; + auto b = SwPoint{pt3->x, pt1->y}; + + if ((*pt2 == a && *pt4 == b) || (*pt2 == b && *pt4 == a)) return true; + + return false; +} + + +static bool _genOutline(SwShape* shape, const RenderShape* rshape, const Matrix* transform, SwMpool* mpool, unsigned tid, bool hasComposite) +{ + const PathCommand* cmds = rshape->path.cmds.data; + auto cmdCnt = rshape->path.cmds.count; + const Point* pts = rshape->path.pts.data; + auto ptsCnt = rshape->path.pts.count; + + //No actual shape data + if (cmdCnt == 0 || ptsCnt == 0) return false; + + //smart reservation + auto moveCnt = 0; + auto closeCnt = 0; + + for (auto cmd = rshape->path.cmds.data; cmd < rshape->path.cmds.end(); ++cmd) { + if (*cmd == PathCommand::Close) ++closeCnt; + else if (*cmd == PathCommand::MoveTo) ++moveCnt; + } + + shape->outline = mpoolReqOutline(mpool, tid); + auto outline = shape->outline; + + //OPTIMIZE: we can directly copy the path points when the close is occupied with a point. + outline->pts.grow(ptsCnt + closeCnt + 1); + outline->types.grow(ptsCnt + closeCnt + 1); + outline->cntrs.grow(moveCnt + 1); + + //Dash outlines are always opened. + //Only normal outlines use this information, it sholud be same to their contour counts. + outline->closed.reserve(outline->cntrs.reserved); + + memset(outline->closed.data, 0x0, sizeof(bool) * outline->closed.reserved); + + //Generate Outlines + while (cmdCnt-- > 0) { + switch (*cmds) { + case PathCommand::Close: { + _outlineClose(*outline); + break; + } + case PathCommand::MoveTo: { + _outlineMoveTo(*outline, pts, transform); + ++pts; + break; + } + case PathCommand::LineTo: { + _outlineLineTo(*outline, pts, transform); + ++pts; + break; + } + case PathCommand::CubicTo: { + _outlineCubicTo(*outline, pts, pts + 1, pts + 2, transform); + pts += 3; + break; + } + } + ++cmds; + } + + _outlineEnd(*outline); + + outline->fillRule = rshape->rule; + shape->outline = outline; + + shape->fastTrack = (!hasComposite && _axisAlignedRect(shape->outline)); + return true; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite) +{ + if (!_genOutline(shape, rshape, transform, mpool, tid, hasComposite)) return false; + if (!mathUpdateOutlineBBox(shape->outline, clipRegion, renderRegion, shape->fastTrack)) return false; + + //Keep it for Rasterization Region + shape->bbox = renderRegion; + + //Check valid region + if (renderRegion.max.x - renderRegion.min.x < 1 && renderRegion.max.y - renderRegion.min.y < 1) return false; + + //Check boundary + if (renderRegion.min.x >= clipRegion.max.x || renderRegion.min.y >= clipRegion.max.y || + renderRegion.max.x <= clipRegion.min.x || renderRegion.max.y <= clipRegion.min.y) return false; + + return true; +} + + +bool shapePrepared(const SwShape* shape) +{ + return shape->rle ? true : false; +} + + +bool shapeGenRle(SwShape* shape, TVG_UNUSED const RenderShape* rshape, bool antiAlias) +{ + //FIXME: Should we draw it? + //Case: Stroke Line + //if (shape.outline->opened) return true; + + //Case A: Fast Track Rectangle Drawing + if (shape->fastTrack) return true; + + //Case B: Normal Shape RLE Drawing + if ((shape->rle = rleRender(shape->rle, shape->outline, shape->bbox, antiAlias))) return true; + + return false; +} + + +void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid) +{ + mpoolRetOutline(mpool, tid); + shape->outline = nullptr; +} + + +void shapeReset(SwShape* shape) +{ + rleReset(shape->rle); + rleReset(shape->strokeRle); + shape->fastTrack = false; + shape->bbox.reset(); +} + + +void shapeFree(SwShape* shape) +{ + rleFree(shape->rle); + shapeDelFill(shape); + + if (shape->stroke) { + rleFree(shape->strokeRle); + strokeFree(shape->stroke); + } +} + + +void shapeDelStroke(SwShape* shape) +{ + if (!shape->stroke) return; + rleFree(shape->strokeRle); + shape->strokeRle = nullptr; + strokeFree(shape->stroke); + shape->stroke = nullptr; +} + + +void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform) +{ + if (!shape->stroke) shape->stroke = static_cast(calloc(1, sizeof(SwStroke))); + auto stroke = shape->stroke; + if (!stroke) return; + + strokeReset(stroke, rshape, transform); + rleReset(shape->strokeRle); +} + + +bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) +{ + SwOutline* shapeOutline = nullptr; + SwOutline* strokeOutline = nullptr; + auto dashStroking = false; + auto ret = true; + + auto length = rshape->strokeTrim() ? _outlineLength(rshape) : 0.0f; + + //Dash style (+trimming) + if (rshape->stroke->dashCnt > 0 || length > 0) { + shapeOutline = _genDashOutline(rshape, transform, length, mpool, tid); + if (!shapeOutline) return false; + dashStroking = true; + //Normal style + } else { + if (!shape->outline) { + if (!_genOutline(shape, rshape, transform, mpool, tid, false)) return false; + } + shapeOutline = shape->outline; + } + + if (!strokeParseOutline(shape->stroke, *shapeOutline)) { + ret = false; + goto clear; + } + + strokeOutline = strokeExportOutline(shape->stroke, mpool, tid); + + if (!mathUpdateOutlineBBox(strokeOutline, clipRegion, renderRegion, false)) { + ret = false; + goto clear; + } + + shape->strokeRle = rleRender(shape->strokeRle, strokeOutline, renderRegion, true); + +clear: + if (dashStroking) mpoolRetDashOutline(mpool, tid); + mpoolRetStrokeOutline(mpool, tid); + + return ret; +} + + +bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) +{ + return fillGenColorTable(shape->fill, fill, transform, surface, opacity, ctable); +} + + +bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable) +{ + return fillGenColorTable(shape->stroke->fill, fill, transform, surface, opacity, ctable); +} + + +void shapeResetFill(SwShape* shape) +{ + if (!shape->fill) { + shape->fill = static_cast(calloc(1, sizeof(SwFill))); + if (!shape->fill) return; + } + fillReset(shape->fill); +} + + +void shapeResetStrokeFill(SwShape* shape) +{ + if (!shape->stroke->fill) { + shape->stroke->fill = static_cast(calloc(1, sizeof(SwFill))); + if (!shape->stroke->fill) return; + } + fillReset(shape->stroke->fill); +} + + +void shapeDelFill(SwShape* shape) +{ + if (!shape->fill) return; + fillFree(shape->fill); + shape->fill = nullptr; +} + + +void shapeDelStrokeFill(SwShape* shape) +{ + if (!shape->stroke->fill) return; + fillFree(shape->stroke->fill); + shape->stroke->fill = nullptr; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgSwStroke.cpp b/libraries/lvgl/src/libs/thorvg/tvgSwStroke.cpp new file mode 100644 index 0000000..c097c60 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgSwStroke.cpp @@ -0,0 +1,915 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include +#include "tvgSwCommon.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +static constexpr auto SW_STROKE_TAG_POINT = 1; +static constexpr auto SW_STROKE_TAG_CUBIC = 2; +static constexpr auto SW_STROKE_TAG_BEGIN = 4; +static constexpr auto SW_STROKE_TAG_END = 8; + +static inline SwFixed SIDE_TO_ROTATE(const int32_t s) +{ + return (SW_ANGLE_PI2 - static_cast(s) * SW_ANGLE_PI); +} + + +static inline void SCALE(const SwStroke& stroke, SwPoint& pt) +{ + pt.x = static_cast(pt.x * stroke.sx); + pt.y = static_cast(pt.y * stroke.sy); +} + + +static void _growBorder(SwStrokeBorder* border, uint32_t newPts) +{ + auto maxOld = border->maxPts; + auto maxNew = border->ptsCnt + newPts; + + if (maxNew <= maxOld) return; + + auto maxCur = maxOld; + + while (maxCur < maxNew) + maxCur += (maxCur >> 1) + 16; + //OPTIMIZE: use mempool! + border->pts = static_cast(realloc(border->pts, maxCur * sizeof(SwPoint))); + border->tags = static_cast(realloc(border->tags, maxCur * sizeof(uint8_t))); + border->maxPts = maxCur; +} + + +static void _borderClose(SwStrokeBorder* border, bool reverse) +{ + auto start = border->start; + auto count = border->ptsCnt; + + //Don't record empty paths! + if (count <= start + 1U) { + border->ptsCnt = start; + } else { + /* Copy the last point to the start of this sub-path, + since it contains the adjusted starting coordinates */ + border->ptsCnt = --count; + border->pts[start] = border->pts[count]; + + if (reverse) { + //reverse the points + auto pt1 = border->pts + start + 1; + auto pt2 = border->pts + count - 1; + + while (pt1 < pt2) { + auto tmp = *pt1; + *pt1 = *pt2; + *pt2 = tmp; + ++pt1; + --pt2; + } + + //reverse the tags + auto tag1 = border->tags + start + 1; + auto tag2 = border->tags + count - 1; + + while (tag1 < tag2) { + auto tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + ++tag1; + --tag2; + } + } + + border->tags[start] |= SW_STROKE_TAG_BEGIN; + border->tags[count - 1] |= SW_STROKE_TAG_END; + } + + border->start = -1; + border->movable = false; +} + + +static void _borderCubicTo(SwStrokeBorder* border, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) +{ + _growBorder(border, 3); + + auto pt = border->pts + border->ptsCnt; + auto tag = border->tags + border->ptsCnt; + + pt[0] = ctrl1; + pt[1] = ctrl2; + pt[2] = to; + + tag[0] = SW_STROKE_TAG_CUBIC; + tag[1] = SW_STROKE_TAG_CUBIC; + tag[2] = SW_STROKE_TAG_POINT; + + border->ptsCnt += 3; + border->movable = false; +} + + +static void _borderArcTo(SwStrokeBorder* border, const SwPoint& center, SwFixed radius, SwFixed angleStart, SwFixed angleDiff, SwStroke& stroke) +{ + constexpr SwFixed ARC_CUBIC_ANGLE = SW_ANGLE_PI / 2; + SwPoint a = {static_cast(radius), 0}; + mathRotate(a, angleStart); + SCALE(stroke, a); + a += center; + + auto total = angleDiff; + auto angle = angleStart; + auto rotate = (angleDiff >= 0) ? SW_ANGLE_PI2 : -SW_ANGLE_PI2; + + while (total != 0) { + auto step = total; + if (step > ARC_CUBIC_ANGLE) step = ARC_CUBIC_ANGLE; + else if (step < -ARC_CUBIC_ANGLE) step = -ARC_CUBIC_ANGLE; + + auto next = angle + step; + auto theta = step; + if (theta < 0) theta = -theta; + + theta >>= 1; + + //compute end point + SwPoint b = {static_cast(radius), 0}; + mathRotate(b, next); + SCALE(stroke, b); + b += center; + + //compute first and second control points + auto length = mathMulDiv(radius, mathSin(theta) * 4, (0x10000L + mathCos(theta)) * 3); + + SwPoint a2 = {static_cast(length), 0}; + mathRotate(a2, angle + rotate); + SCALE(stroke, a2); + a2 += a; + + SwPoint b2 = {static_cast(length), 0}; + mathRotate(b2, next - rotate); + SCALE(stroke, b2); + b2 += b; + + //add cubic arc + _borderCubicTo(border, a2, b2, b); + + //process the rest of the arc? + a = b; + total -= step; + angle = next; + } +} + + +static void _borderLineTo(SwStrokeBorder* border, const SwPoint& to, bool movable) +{ + if (border->movable) { + //move last point + border->pts[border->ptsCnt - 1] = to; + } else { + //don't add zero-length line_to + if (border->ptsCnt > 0 && (border->pts[border->ptsCnt - 1] - to).small()) return; + + _growBorder(border, 1); + border->pts[border->ptsCnt] = to; + border->tags[border->ptsCnt] = SW_STROKE_TAG_POINT; + border->ptsCnt += 1; + } + + border->movable = movable; +} + + +static void _borderMoveTo(SwStrokeBorder* border, SwPoint& to) +{ + //close current open path if any? + if (border->start >= 0) _borderClose(border, false); + + border->start = border->ptsCnt; + border->movable = false; + + _borderLineTo(border, to, false); +} + + +static void _arcTo(SwStroke& stroke, int32_t side) +{ + auto border = stroke.borders + side; + auto rotate = SIDE_TO_ROTATE(side); + auto total = mathDiff(stroke.angleIn, stroke.angleOut); + if (total == SW_ANGLE_PI) total = -rotate * 2; + + _borderArcTo(border, stroke.center, stroke.width, stroke.angleIn + rotate, total, stroke); + border->movable = false; +} + + +static void _outside(SwStroke& stroke, int32_t side, SwFixed lineLength) +{ + auto border = stroke.borders + side; + + if (stroke.join == StrokeJoin::Round) { + _arcTo(stroke, side); + } else { + //this is a mitered (pointed) or beveled (truncated) corner + auto rotate = SIDE_TO_ROTATE(side); + auto bevel = (stroke.join == StrokeJoin::Bevel) ? true : false; + SwFixed phi = 0; + SwFixed thcos = 0; + + if (!bevel) { + auto theta = mathDiff(stroke.angleIn, stroke.angleOut); + if (theta == SW_ANGLE_PI) { + theta = rotate; + phi = stroke.angleIn; + } else { + theta /= 2; + phi = stroke.angleIn + theta + rotate; + } + + thcos = mathCos(theta); + auto sigma = mathMultiply(stroke.miterlimit, thcos); + + //is miter limit exceeded? + if (sigma < 0x10000L) bevel = true; + } + + //this is a bevel (broken angle) + if (bevel) { + SwPoint delta = {static_cast(stroke.width), 0}; + mathRotate(delta, stroke.angleOut + rotate); + SCALE(stroke, delta); + delta += stroke.center; + border->movable = false; + _borderLineTo(border, delta, false); + //this is a miter (intersection) + } else { + auto length = mathDivide(stroke.width, thcos); + SwPoint delta = {static_cast(length), 0}; + mathRotate(delta, phi); + SCALE(stroke, delta); + delta += stroke.center; + _borderLineTo(border, delta, false); + + /* Now add and end point + Only needed if not lineto (lineLength is zero for curves) */ + if (lineLength == 0) { + delta = {static_cast(stroke.width), 0}; + mathRotate(delta, stroke.angleOut + rotate); + SCALE(stroke, delta); + delta += stroke.center; + _borderLineTo(border, delta, false); + } + } + } +} + + +static void _inside(SwStroke& stroke, int32_t side, SwFixed lineLength) +{ + auto border = stroke.borders + side; + auto theta = mathDiff(stroke.angleIn, stroke.angleOut) / 2; + SwPoint delta; + bool intersect = false; + + /* Only intersect borders if between two line_to's and both + lines are long enough (line length is zero for curves). */ + if (border->movable && lineLength > 0) { + //compute minimum required length of lines + SwFixed minLength = abs(mathMultiply(stroke.width, mathTan(theta))); + if (stroke.lineLength >= minLength && lineLength >= minLength) intersect = true; + } + + auto rotate = SIDE_TO_ROTATE(side); + + if (!intersect) { + delta = {static_cast(stroke.width), 0}; + mathRotate(delta, stroke.angleOut + rotate); + SCALE(stroke, delta); + delta += stroke.center; + border->movable = false; + } else { + //compute median angle + auto phi = stroke.angleIn + theta; + auto thcos = mathCos(theta); + delta = {static_cast(mathDivide(stroke.width, thcos)), 0}; + mathRotate(delta, phi + rotate); + SCALE(stroke, delta); + delta += stroke.center; + } + + _borderLineTo(border, delta, false); +} + + +void _processCorner(SwStroke& stroke, SwFixed lineLength) +{ + auto turn = mathDiff(stroke.angleIn, stroke.angleOut); + + //no specific corner processing is required if the turn is 0 + if (turn == 0) return; + + //when we turn to the right, the inside side is 0 + int32_t inside = 0; + + //otherwise, the inside is 1 + if (turn < 0) inside = 1; + + //process the inside + _inside(stroke, inside, lineLength); + + //process the outside + _outside(stroke, 1 - inside, lineLength); +} + + +void _firstSubPath(SwStroke& stroke, SwFixed startAngle, SwFixed lineLength) +{ + SwPoint delta = {static_cast(stroke.width), 0}; + mathRotate(delta, startAngle + SW_ANGLE_PI2); + SCALE(stroke, delta); + + auto pt = stroke.center + delta; + auto border = stroke.borders; + _borderMoveTo(border, pt); + + pt = stroke.center - delta; + ++border; + _borderMoveTo(border, pt); + + /* Save angle, position and line length for last join + lineLength is zero for curves */ + stroke.subPathAngle = startAngle; + stroke.firstPt = false; + stroke.subPathLineLength = lineLength; +} + + +static void _lineTo(SwStroke& stroke, const SwPoint& to) +{ + auto delta = to - stroke.center; + + //a zero-length lineto is a no-op; avoid creating a spurious corner + if (delta.zero()) return; + + //compute length of line + auto angle = mathAtan(delta); + + /* The lineLength is used to determine the intersection of strokes outlines. + The scale needs to be reverted since the stroke width has not been scaled. + An alternative option is to scale the width of the stroke properly by + calculating the mixture of the sx/sy rating on the stroke direction. */ + delta.x = static_cast(delta.x / stroke.sx); + delta.y = static_cast(delta.y / stroke.sy); + auto lineLength = mathLength(delta); + + delta = {static_cast(stroke.width), 0}; + mathRotate(delta, angle + SW_ANGLE_PI2); + SCALE(stroke, delta); + + //process corner if necessary + if (stroke.firstPt) { + /* This is the first segment of a subpath. We need to add a point to each border + at their respective starting point locations. */ + _firstSubPath(stroke, angle, lineLength); + } else { + //process the current corner + stroke.angleOut = angle; + _processCorner(stroke, lineLength); + } + + //now add a line segment to both the inside and outside paths + auto border = stroke.borders; + auto side = 1; + + while (side >= 0) { + auto pt = to + delta; + + //the ends of lineto borders are movable + _borderLineTo(border, pt, true); + + delta.x = -delta.x; + delta.y = -delta.y; + + --side; + ++border; + } + + stroke.angleIn = angle; + stroke.center = to; + stroke.lineLength = lineLength; +} + + +static void _cubicTo(SwStroke& stroke, const SwPoint& ctrl1, const SwPoint& ctrl2, const SwPoint& to) +{ + SwPoint bezStack[37]; //TODO: static? + auto limit = bezStack + 32; + auto arc = bezStack; + auto firstArc = true; + arc[0] = to; + arc[1] = ctrl2; + arc[2] = ctrl1; + arc[3] = stroke.center; + + while (arc >= bezStack) { + SwFixed angleIn, angleOut, angleMid; + + //initialize with current direction + angleIn = angleOut = angleMid = stroke.angleIn; + + if (arc < limit && !mathSmallCubic(arc, angleIn, angleMid, angleOut)) { + if (stroke.firstPt) stroke.angleIn = angleIn; + mathSplitCubic(arc); + arc += 3; + continue; + } + + if (firstArc) { + firstArc = false; + //process corner if necessary + if (stroke.firstPt) { + _firstSubPath(stroke, angleIn, 0); + } else { + stroke.angleOut = angleIn; + _processCorner(stroke, 0); + } + } else if (abs(mathDiff(stroke.angleIn, angleIn)) > (SW_ANGLE_PI / 8) / 4) { + //if the deviation from one arc to the next is too great add a round corner + stroke.center = arc[3]; + stroke.angleOut = angleIn; + stroke.join = StrokeJoin::Round; + + _processCorner(stroke, 0); + + //reinstate line join style + stroke.join = stroke.joinSaved; + } + + //the arc's angle is small enough; we can add it directly to each border + auto theta1 = mathDiff(angleIn, angleMid) / 2; + auto theta2 = mathDiff(angleMid, angleOut) / 2; + auto phi1 = mathMean(angleIn, angleMid); + auto phi2 = mathMean(angleMid, angleOut); + auto length1 = mathDivide(stroke.width, mathCos(theta1)); + auto length2 = mathDivide(stroke.width, mathCos(theta2)); + SwFixed alpha0 = 0; + + //compute direction of original arc + if (stroke.handleWideStrokes) { + alpha0 = mathAtan(arc[0] - arc[3]); + } + + auto border = stroke.borders; + int32_t side = 0; + + while (side < 2) { + auto rotate = SIDE_TO_ROTATE(side); + + //compute control points + SwPoint _ctrl1 = {static_cast(length1), 0}; + mathRotate(_ctrl1, phi1 + rotate); + SCALE(stroke, _ctrl1); + _ctrl1 += arc[2]; + + SwPoint _ctrl2 = {static_cast(length2), 0}; + mathRotate(_ctrl2, phi2 + rotate); + SCALE(stroke, _ctrl2); + _ctrl2 += arc[1]; + + //compute end point + SwPoint _end = {static_cast(stroke.width), 0}; + mathRotate(_end, angleOut + rotate); + SCALE(stroke, _end); + _end += arc[0]; + + if (stroke.handleWideStrokes) { + /* determine whether the border radius is greater than the radius of + curvature of the original arc */ + auto _start = border->pts[border->ptsCnt - 1]; + auto alpha1 = mathAtan(_end - _start); + + //is the direction of the border arc opposite to that of the original arc? + if (abs(mathDiff(alpha0, alpha1)) > SW_ANGLE_PI / 2) { + + //use the sine rule to find the intersection point + auto beta = mathAtan(arc[3] - _start); + auto gamma = mathAtan(arc[0] - _end); + auto bvec = _end - _start; + auto blen = mathLength(bvec); + auto sinA = abs(mathSin(alpha1 - gamma)); + auto sinB = abs(mathSin(beta - gamma)); + auto alen = mathMulDiv(blen, sinA, sinB); + + SwPoint delta = {static_cast(alen), 0}; + mathRotate(delta, beta); + delta += _start; + + //circumnavigate the negative sector backwards + border->movable = false; + _borderLineTo(border, delta, false); + _borderLineTo(border, _end, false); + _borderCubicTo(border, _ctrl2, _ctrl1, _start); + + //and then move to the endpoint + _borderLineTo(border, _end, false); + + ++side; + ++border; + continue; + } + } + _borderCubicTo(border, _ctrl1, _ctrl2, _end); + ++side; + ++border; + } + arc -= 3; + stroke.angleIn = angleOut; + } + stroke.center = to; +} + + +static void _addCap(SwStroke& stroke, SwFixed angle, int32_t side) +{ + if (stroke.cap == StrokeCap::Square) { + auto rotate = SIDE_TO_ROTATE(side); + auto border = stroke.borders + side; + + SwPoint delta = {static_cast(stroke.width), 0}; + mathRotate(delta, angle); + SCALE(stroke, delta); + + SwPoint delta2 = {static_cast(stroke.width), 0}; + mathRotate(delta2, angle + rotate); + SCALE(stroke, delta2); + delta += stroke.center + delta2; + + _borderLineTo(border, delta, false); + + delta = {static_cast(stroke.width), 0}; + mathRotate(delta, angle); + SCALE(stroke, delta); + + delta2 = {static_cast(stroke.width), 0}; + mathRotate(delta2, angle - rotate); + SCALE(stroke, delta2); + delta += delta2 + stroke.center; + + _borderLineTo(border, delta, false); + + } else if (stroke.cap == StrokeCap::Round) { + + stroke.angleIn = angle; + stroke.angleOut = angle + SW_ANGLE_PI; + _arcTo(stroke, side); + return; + + } else { //Butt + auto rotate = SIDE_TO_ROTATE(side); + auto border = stroke.borders + side; + + SwPoint delta = {static_cast(stroke.width), 0}; + mathRotate(delta, angle + rotate); + SCALE(stroke, delta); + delta += stroke.center; + + _borderLineTo(border, delta, false); + + delta = {static_cast(stroke.width), 0}; + mathRotate(delta, angle - rotate); + SCALE(stroke, delta); + delta += stroke.center; + + _borderLineTo(border, delta, false); + } +} + + +static void _addReverseLeft(SwStroke& stroke, bool opened) +{ + auto right = stroke.borders + 0; + auto left = stroke.borders + 1; + auto newPts = left->ptsCnt - left->start; + + if (newPts <= 0) return; + + _growBorder(right, newPts); + + auto dstPt = right->pts + right->ptsCnt; + auto dstTag = right->tags + right->ptsCnt; + auto srcPt = left->pts + left->ptsCnt - 1; + auto srcTag = left->tags + left->ptsCnt - 1; + + while (srcPt >= left->pts + left->start) { + *dstPt = *srcPt; + *dstTag = *srcTag; + + if (opened) { + dstTag[0] &= ~(SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); + } else { + //switch begin/end tags if necessary + auto ttag = dstTag[0] & (SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); + if (ttag == SW_STROKE_TAG_BEGIN || ttag == SW_STROKE_TAG_END) + dstTag[0] ^= (SW_STROKE_TAG_BEGIN | SW_STROKE_TAG_END); + } + --srcPt; + --srcTag; + ++dstPt; + ++dstTag; + } + + left->ptsCnt = left->start; + right->ptsCnt += newPts; + right->movable = false; + left->movable = false; +} + + +static void _beginSubPath(SwStroke& stroke, const SwPoint& to, bool closed) +{ + /* We cannot process the first point because there is not enough + information regarding its corner/cap. Later, it will be processed + in the _endSubPath() */ + + stroke.firstPt = true; + stroke.center = to; + stroke.closedSubPath = closed; + + /* Determine if we need to check whether the border radius is greater + than the radius of curvature of a curve, to handle this case specially. + This is only required if bevel joins or butt caps may be created because + round & miter joins and round & square caps cover the nagative sector + created with wide strokes. */ + if ((stroke.join != StrokeJoin::Round) || (!stroke.closedSubPath && stroke.cap == StrokeCap::Butt)) + stroke.handleWideStrokes = true; + else + stroke.handleWideStrokes = false; + + stroke.ptStartSubPath = to; + stroke.angleIn = 0; +} + + +static void _endSubPath(SwStroke& stroke) +{ + if (stroke.closedSubPath) { + //close the path if needed + if (stroke.center != stroke.ptStartSubPath) + _lineTo(stroke, stroke.ptStartSubPath); + + //process the corner + stroke.angleOut = stroke.subPathAngle; + auto turn = mathDiff(stroke.angleIn, stroke.angleOut); + + //No specific corner processing is required if the turn is 0 + if (turn != 0) { + //when we turn to the right, the inside is 0 + int32_t inside = 0; + + //otherwise, the inside is 1 + if (turn < 0) inside = 1; + + _inside(stroke, inside, stroke.subPathLineLength); //inside + _outside(stroke, 1 - inside, stroke.subPathLineLength); //outside + } + + _borderClose(stroke.borders + 0, false); + _borderClose(stroke.borders + 1, true); + } else { + auto right = stroke.borders; + + /* all right, this is an opened path, we need to add a cap between + right & left, add the reverse of left, then add a final cap + between left & right */ + _addCap(stroke, stroke.angleIn, 0); + + //add reversed points from 'left' to 'right' + _addReverseLeft(stroke, true); + + //now add the final cap + stroke.center = stroke.ptStartSubPath; + _addCap(stroke, stroke.subPathAngle + SW_ANGLE_PI, 0); + + /* now end the right subpath accordingly. The left one is rewind + and deosn't need further processing */ + _borderClose(right, false); + } +} + + +static void _getCounts(SwStrokeBorder* border, uint32_t& ptsCnt, uint32_t& cntrsCnt) +{ + auto count = border->ptsCnt; + auto tags = border->tags; + uint32_t _ptsCnt = 0; + uint32_t _cntrsCnt = 0; + bool inCntr = false; + + while (count > 0) { + if (tags[0] & SW_STROKE_TAG_BEGIN) { + if (inCntr) goto fail; + inCntr = true; + } else if (!inCntr) goto fail; + + if (tags[0] & SW_STROKE_TAG_END) { + inCntr = false; + ++_cntrsCnt; + } + --count; + ++_ptsCnt; + ++tags; + } + + if (inCntr) goto fail; + + ptsCnt = _ptsCnt; + cntrsCnt = _cntrsCnt; + + return; + +fail: + ptsCnt = 0; + cntrsCnt = 0; +} + + +static void _exportBorderOutline(const SwStroke& stroke, SwOutline* outline, uint32_t side) +{ + auto border = stroke.borders + side; + if (border->ptsCnt == 0) return; + + memcpy(outline->pts.data + outline->pts.count, border->pts, border->ptsCnt * sizeof(SwPoint)); + + auto cnt = border->ptsCnt; + auto src = border->tags; + auto tags = outline->types.data + outline->types.count; + auto idx = outline->pts.count; + + while (cnt > 0) { + if (*src & SW_STROKE_TAG_POINT) *tags = SW_CURVE_TYPE_POINT; + else if (*src & SW_STROKE_TAG_CUBIC) *tags = SW_CURVE_TYPE_CUBIC; + else TVGERR("SW_ENGINE", "Invalid stroke tag was given! = %d", *src); + if (*src & SW_STROKE_TAG_END) outline->cntrs.push(idx); + ++src; + ++tags; + ++idx; + --cnt; + } + outline->pts.count += border->ptsCnt; + outline->types.count += border->ptsCnt; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +void strokeFree(SwStroke* stroke) +{ + if (!stroke) return; + + //free borders + if (stroke->borders[0].pts) free(stroke->borders[0].pts); + if (stroke->borders[0].tags) free(stroke->borders[0].tags); + if (stroke->borders[1].pts) free(stroke->borders[1].pts); + if (stroke->borders[1].tags) free(stroke->borders[1].tags); + + fillFree(stroke->fill); + stroke->fill = nullptr; + + free(stroke); +} + + +void strokeReset(SwStroke* stroke, const RenderShape* rshape, const Matrix* transform) +{ + if (transform) { + stroke->sx = sqrtf(powf(transform->e11, 2.0f) + powf(transform->e21, 2.0f)); + stroke->sy = sqrtf(powf(transform->e12, 2.0f) + powf(transform->e22, 2.0f)); + } else { + stroke->sx = stroke->sy = 1.0f; + } + + stroke->width = HALF_STROKE(rshape->strokeWidth()); + stroke->cap = rshape->strokeCap(); + stroke->miterlimit = static_cast(rshape->strokeMiterlimit()) << 16; + + //Save line join: it can be temporarily changed when stroking curves... + stroke->joinSaved = stroke->join = rshape->strokeJoin(); + + stroke->borders[0].ptsCnt = 0; + stroke->borders[0].start = -1; + stroke->borders[1].ptsCnt = 0; + stroke->borders[1].start = -1; +} + + +bool strokeParseOutline(SwStroke* stroke, const SwOutline& outline) +{ + uint32_t first = 0; + uint32_t i = 0; + + for (auto cntr = outline.cntrs.data; cntr < outline.cntrs.end(); ++cntr, ++i) { + auto last = *cntr; //index of last point in contour + auto limit = outline.pts.data + last; + + //Skip empty points + if (last <= first) { + first = last + 1; + continue; + } + + auto start = outline.pts[first]; + auto pt = outline.pts.data + first; + auto types = outline.types.data + first; + auto type = types[0]; + + //A contour cannot start with a cubic control point + if (type == SW_CURVE_TYPE_CUBIC) return false; + + auto closed = outline.closed.data ? outline.closed.data[i]: false; + + _beginSubPath(*stroke, start, closed); + + while (pt < limit) { + ++pt; + ++types; + + //emit a signel line_to + if (types[0] == SW_CURVE_TYPE_POINT) { + _lineTo(*stroke, *pt); + //types cubic + } else { + if (pt + 1 > limit || types[1] != SW_CURVE_TYPE_CUBIC) return false; + + pt += 2; + types += 2; + + if (pt <= limit) { + _cubicTo(*stroke, pt[-2], pt[-1], pt[0]); + continue; + } + _cubicTo(*stroke, pt[-2], pt[-1], start); + goto close; + } + } + close: + if (!stroke->firstPt) _endSubPath(*stroke); + first = last + 1; + } + return true; +} + + +SwOutline* strokeExportOutline(SwStroke* stroke, SwMpool* mpool, unsigned tid) +{ + uint32_t count1, count2, count3, count4; + + _getCounts(stroke->borders + 0, count1, count2); + _getCounts(stroke->borders + 1, count3, count4); + + auto ptsCnt = count1 + count3; + auto cntrsCnt = count2 + count4; + + auto outline = mpoolReqStrokeOutline(mpool, tid); + outline->pts.reserve(ptsCnt); + outline->types.reserve(ptsCnt); + outline->cntrs.reserve(cntrsCnt); + + _exportBorderOutline(*stroke, outline, 0); //left + _exportBorderOutline(*stroke, outline, 1); //right + + return outline; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.cpp b/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.cpp new file mode 100644 index 0000000..cad12c3 --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include +#include "tvgTaskScheduler.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +namespace tvg { + +static thread_local bool _async = true; //toggle async tasking for each thread on/off + + +struct TaskSchedulerImpl +{ + TaskSchedulerImpl(unsigned threadCnt) + { + } + + ~TaskSchedulerImpl() + { + } + + void request(Task* task) + { + task->run(0); + } +}; + +} + +static TaskSchedulerImpl* inst = nullptr; + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +void TaskScheduler::init(unsigned threads) +{ + if (inst) return; + inst = new TaskSchedulerImpl(threads); +} + +void TaskScheduler::request(Task* task) +{ + if (inst) inst->request(task); +} + +void TaskScheduler::async(bool on) +{ + _async = on; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.h b/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.h new file mode 100644 index 0000000..41d6f9b --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgTaskScheduler.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_TASK_SCHEDULER_H_ +#define _TVG_TASK_SCHEDULER_H_ + +#include "tvgCommon.h" + +namespace tvg +{ + +struct Task; + +struct TaskScheduler +{ + static void init(unsigned threads); + static void request(Task* task); + static void async(bool on); +}; + +struct Task +{ +private: + +public: + virtual ~Task() = default; + + void done() + { + } + +protected: + virtual void run(unsigned tid) = 0; + +private: + void operator()(unsigned tid) + { + run(tid); + + } + + void prepare() + { + } + + friend struct TaskSchedulerImpl; +}; + +} + +#endif //_TVG_TASK_SCHEDULER_H_ + + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgXmlParser.cpp b/libraries/lvgl/src/libs/thorvg/tvgXmlParser.cpp new file mode 100644 index 0000000..6bd35ba --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgXmlParser.cpp @@ -0,0 +1,591 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#include +#include +#include + +#ifdef _WIN32 + #include +#elif defined(__linux__) + #include +#else + #include +#endif + +#include "tvgXmlParser.h" +#include "tvgStr.h" + +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ + +bool _isIgnoreUnsupportedLogAttributes(TVG_UNUSED const char* tagAttribute, TVG_UNUSED const char* tagValue) +{ +#ifdef THORVG_LOG_ENABLED + const auto attributesNum = 6; + const struct + { + const char* tag; + bool tagWildcard; //If true, it is assumed that a wildcard is used after the tag. (ex: tagName*) + const char* value; + } attributes[] = { + {"id", false, nullptr}, + {"data-name", false, nullptr}, + {"overflow", false, "visible"}, + {"version", false, nullptr}, + {"xmlns", true, nullptr}, + {"xml:space", false, nullptr}, + }; + + for (unsigned int i = 0; i < attributesNum; ++i) { + if (!strncmp(tagAttribute, attributes[i].tag, attributes[i].tagWildcard ? strlen(attributes[i].tag) : strlen(tagAttribute))) { + if (attributes[i].value && tagValue) { + if (!strncmp(tagValue, attributes[i].value, strlen(tagValue))) { + return true; + } else continue; + } + return true; + } + } + return false; +#endif + return true; +} + + +static const char* _simpleXmlFindWhiteSpace(const char* itr, const char* itrEnd) +{ + for (; itr < itrEnd; itr++) { + if (isspace((unsigned char)*itr)) break; + } + return itr; +} + + +static const char* _simpleXmlSkipWhiteSpace(const char* itr, const char* itrEnd) +{ + for (; itr < itrEnd; itr++) { + if (!isspace((unsigned char)*itr)) break; + } + return itr; +} + + +static const char* _simpleXmlUnskipWhiteSpace(const char* itr, const char* itrStart) +{ + for (itr--; itr > itrStart; itr--) { + if (!isspace((unsigned char)*itr)) break; + } + return itr + 1; +} + + +static const char* _simpleXmlSkipXmlEntities(const char* itr, const char* itrEnd) +{ + auto p = itr; + while (itr < itrEnd && *itr == '&') { + for (int i = 0; i < NUMBER_OF_XML_ENTITIES; ++i) { + if (strncmp(itr, xmlEntity[i], xmlEntityLength[i]) == 0) { + itr += xmlEntityLength[i]; + break; + } + } + if (itr == p) break; + p = itr; + } + return itr; +} + + +static const char* _simpleXmlUnskipXmlEntities(const char* itr, const char* itrStart) +{ + auto p = itr; + while (itr > itrStart && *(itr - 1) == ';') { + for (int i = 0; i < NUMBER_OF_XML_ENTITIES; ++i) { + if (itr - xmlEntityLength[i] > itrStart && + strncmp(itr - xmlEntityLength[i], xmlEntity[i], xmlEntityLength[i]) == 0) { + itr -= xmlEntityLength[i]; + break; + } + } + if (itr == p) break; + p = itr; + } + return itr; +} + + +static const char* _skipWhiteSpacesAndXmlEntities(const char* itr, const char* itrEnd) +{ + itr = _simpleXmlSkipWhiteSpace(itr, itrEnd); + auto p = itr; + while (true) { + if (p != (itr = _simpleXmlSkipXmlEntities(itr, itrEnd))) p = itr; + else break; + if (p != (itr = _simpleXmlSkipWhiteSpace(itr, itrEnd))) p = itr; + else break; + } + return itr; +} + + +static const char* _unskipWhiteSpacesAndXmlEntities(const char* itr, const char* itrStart) +{ + itr = _simpleXmlUnskipWhiteSpace(itr, itrStart); + auto p = itr; + while (true) { + if (p != (itr = _simpleXmlUnskipXmlEntities(itr, itrStart))) p = itr; + else break; + if (p != (itr = _simpleXmlUnskipWhiteSpace(itr, itrStart))) p = itr; + else break; + } + return itr; +} + + +static const char* _simpleXmlFindStartTag(const char* itr, const char* itrEnd) +{ + return (const char*)memchr(itr, '<', itrEnd - itr); +} + + +static const char* _simpleXmlFindEndTag(const char* itr, const char* itrEnd) +{ + bool insideQuote = false; + for (; itr < itrEnd; itr++) { + if (*itr == '"') insideQuote = !insideQuote; + if (!insideQuote) { + if ((*itr == '>') || (*itr == '<')) + return itr; + } + } + return nullptr; +} + + +static const char* _simpleXmlFindEndCommentTag(const char* itr, const char* itrEnd) +{ + for (; itr < itrEnd; itr++) { + if ((*itr == '-') && ((itr + 1 < itrEnd) && (*(itr + 1) == '-')) && ((itr + 2 < itrEnd) && (*(itr + 2) == '>'))) return itr + 2; + } + return nullptr; +} + + +static const char* _simpleXmlFindEndCdataTag(const char* itr, const char* itrEnd) +{ + for (; itr < itrEnd; itr++) { + if ((*itr == ']') && ((itr + 1 < itrEnd) && (*(itr + 1) == ']')) && ((itr + 2 < itrEnd) && (*(itr + 2) == '>'))) return itr + 2; + } + return nullptr; +} + + +static const char* _simpleXmlFindDoctypeChildEndTag(const char* itr, const char* itrEnd) +{ + for (; itr < itrEnd; itr++) { + if (*itr == '>') return itr; + } + return nullptr; +} + + +static SimpleXMLType _getXMLType(const char* itr, const char* itrEnd, size_t &toff) +{ + toff = 0; + if (itr[1] == '/') { + toff = 1; + return SimpleXMLType::Close; + } else if (itr[1] == '?') { + toff = 1; + return SimpleXMLType::Processing; + } else if (itr[1] == '!') { + if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "DOCTYPE", sizeof("DOCTYPE") - 1)) && ((itr[2 + sizeof("DOCTYPE") - 1] == '>') || (isspace((unsigned char)itr[2 + sizeof("DOCTYPE") - 1])))) { + toff = sizeof("!DOCTYPE") - 1; + return SimpleXMLType::Doctype; + } else if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "[CDATA[", sizeof("[CDATA[") - 1))) { + toff = sizeof("![CDATA[") - 1; + return SimpleXMLType::CData; + } else if ((itr + sizeof("") - 1 < itrEnd) && (!memcmp(itr + 2, "--", sizeof("--") - 1))) { + toff = sizeof("!--") - 1; + return SimpleXMLType::Comment; + } else if (itr + sizeof("") - 1 < itrEnd) { + toff = sizeof("!") - 1; + return SimpleXMLType::DoctypeChild; + } + return SimpleXMLType::Open; + } + return SimpleXMLType::Open; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +const char* simpleXmlNodeTypeToString(TVG_UNUSED SvgNodeType type) +{ +#ifdef THORVG_LOG_ENABLED + static const char* TYPE_NAMES[] = { + "Svg", + "G", + "Defs", + "Animation", + "Arc", + "Circle", + "Ellipse", + "Image", + "Line", + "Path", + "Polygon", + "Polyline", + "Rect", + "Text", + "TextArea", + "Tspan", + "Use", + "Video", + "ClipPath", + "Mask", + "Symbol", + "Unknown", + }; + return TYPE_NAMES[(int) type]; +#endif + return nullptr; +} + + +bool isIgnoreUnsupportedLogElements(TVG_UNUSED const char* tagName) +{ +#ifdef THORVG_LOG_ENABLED + const auto elementsNum = 1; + const char* const elements[] = { "title" }; + + for (unsigned int i = 0; i < elementsNum; ++i) { + if (!strncmp(tagName, elements[i], strlen(tagName))) { + return true; + } + } + return false; +#else + return true; +#endif +} + + +bool simpleXmlParseAttributes(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + char* tmpBuf = (char*)malloc(bufLength + 1); + + if (!buf || !func || !tmpBuf) goto error; + + while (itr < itrEnd) { + const char* p = _skipWhiteSpacesAndXmlEntities(itr, itrEnd); + const char *key, *keyEnd, *value, *valueEnd; + char* tval; + + if (p == itrEnd) goto success; + + key = p; + for (keyEnd = key; keyEnd < itrEnd; keyEnd++) { + if ((*keyEnd == '=') || (isspace((unsigned char)*keyEnd))) break; + } + if (keyEnd == itrEnd) goto error; + if (keyEnd == key) continue; + + if (*keyEnd == '=') value = keyEnd + 1; + else { + value = (const char*)memchr(keyEnd, '=', itrEnd - keyEnd); + if (!value) goto error; + value++; + } + keyEnd = _simpleXmlUnskipXmlEntities(keyEnd, key); + + value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); + if (value == itrEnd) goto error; + + if ((*value == '"') || (*value == '\'')) { + valueEnd = (const char*)memchr(value + 1, *value, itrEnd - value); + if (!valueEnd) goto error; + value++; + } else { + valueEnd = _simpleXmlFindWhiteSpace(value, itrEnd); + } + + itr = valueEnd + 1; + + value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); + valueEnd = _unskipWhiteSpacesAndXmlEntities(valueEnd, value); + + memcpy(tmpBuf, key, keyEnd - key); + tmpBuf[keyEnd - key] = '\0'; + + tval = tmpBuf + (keyEnd - key) + 1; + int i = 0; + while (value < valueEnd) { + value = _simpleXmlSkipXmlEntities(value, valueEnd); + tval[i++] = *value; + value++; + } + tval[i] = '\0'; + + if (!func((void*)data, tmpBuf, tval)) { + if (!_isIgnoreUnsupportedLogAttributes(tmpBuf, tval)) { + TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", tmpBuf, tval ? tval : "NONE"); + } + } + } + +success: + free(tmpBuf); + return true; + +error: + free(tmpBuf); + return false; +} + + +bool simpleXmlParse(const char* buf, unsigned bufLength, bool strip, simpleXMLCb func, const void* data) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + + if (!buf || !func) return false; + + while (itr < itrEnd) { + if (itr[0] == '<') { + //Invalid case + if (itr + 1 >= itrEnd) return false; + + size_t toff = 0; + SimpleXMLType type = _getXMLType(itr, itrEnd, toff); + + const char* p; + if (type == SimpleXMLType::CData) p = _simpleXmlFindEndCdataTag(itr + 1 + toff, itrEnd); + else if (type == SimpleXMLType::DoctypeChild) p = _simpleXmlFindDoctypeChildEndTag(itr + 1 + toff, itrEnd); + else if (type == SimpleXMLType::Comment) p = _simpleXmlFindEndCommentTag(itr + 1 + toff, itrEnd); + else p = _simpleXmlFindEndTag(itr + 1 + toff, itrEnd); + + if (p) { + //Invalid case: '<' nested + if (*p == '<' && type != SimpleXMLType::Doctype) return false; + const char *start, *end; + + start = itr + 1 + toff; + end = p; + + switch (type) { + case SimpleXMLType::Open: { + if (p[-1] == '/') { + type = SimpleXMLType::OpenEmpty; + end--; + } + break; + } + case SimpleXMLType::CData: { + if (!memcmp(p - 2, "]]", 2)) end -= 2; + break; + } + case SimpleXMLType::Processing: { + if (p[-1] == '?') end--; + break; + } + case SimpleXMLType::Comment: { + if (!memcmp(p - 2, "--", 2)) end -= 2; + break; + } + default: { + break; + } + } + + if (strip && (type != SimpleXMLType::CData)) { + start = _skipWhiteSpacesAndXmlEntities(start, end); + end = _unskipWhiteSpacesAndXmlEntities(end, start); + } + + if (!func((void*)data, type, start, (unsigned int)(end - start))) return false; + + itr = p + 1; + } else { + return false; + } + } else { + const char *p, *end; + + if (strip) { + p = itr; + p = _skipWhiteSpacesAndXmlEntities(p, itrEnd); + if (p) { + if (!func((void*)data, SimpleXMLType::Ignored, itr, (unsigned int)(p - itr))) return false; + itr = p; + } + } + + p = _simpleXmlFindStartTag(itr, itrEnd); + if (!p) p = itrEnd; + + end = p; + if (strip) end = _unskipWhiteSpacesAndXmlEntities(end, itr); + + if (itr != end && !func((void*)data, SimpleXMLType::Data, itr, (unsigned int)(end - itr))) return false; + + if (strip && (end < p) && !func((void*)data, SimpleXMLType::Ignored, end, (unsigned int)(p - end))) return false; + + itr = p; + } + } + return true; +} + + +bool simpleXmlParseW3CAttribute(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) +{ + const char* end; + char* key; + char* val; + char* next; + + if (!buf) return false; + + end = buf + bufLength; + key = (char*)alloca(end - buf + 1); + val = (char*)alloca(end - buf + 1); + + if (buf == end) return true; + + do { + char* sep = (char*)strchr(buf, ':'); + next = (char*)strchr(buf, ';'); + if (sep >= end) { + next = nullptr; + sep = nullptr; + } + if (next >= end) next = nullptr; + + key[0] = '\0'; + val[0] = '\0'; + + if (next == nullptr && sep != nullptr) { + memcpy(key, buf, sep - buf); + key[sep - buf] = '\0'; + + memcpy(val, sep + 1, end - sep - 1); + val[end - sep - 1] = '\0'; + } else if (sep < next && sep != nullptr) { + memcpy(key, buf, sep - buf); + key[sep - buf] = '\0'; + + memcpy(val, sep + 1, next - sep - 1); + val[next - sep - 1] = '\0'; + } else if (next) { + memcpy(key, buf, next - buf); + key[next - buf] = '\0'; + } + + if (key[0]) { + key = const_cast(_simpleXmlSkipWhiteSpace(key, key + strlen(key))); + key[_simpleXmlUnskipWhiteSpace(key + strlen(key) , key) - key] = '\0'; + val = const_cast(_simpleXmlSkipWhiteSpace(val, val + strlen(val))); + val[_simpleXmlUnskipWhiteSpace(val + strlen(val) , val) - val] = '\0'; + + if (!func((void*)data, key, val)) { + if (!_isIgnoreUnsupportedLogAttributes(key, val)) { + TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", key, val ? val : "NONE"); + } + } + } + + buf = next + 1; + } while (next != nullptr); + + return true; +} + + +/* + * Supported formats: + * tag {}, .name {}, tag.name{} + */ +const char* simpleXmlParseCSSAttribute(const char* buf, unsigned bufLength, char** tag, char** name, const char** attrs, unsigned* attrsLength) +{ + if (!buf) return nullptr; + + *tag = *name = nullptr; + *attrsLength = 0; + + auto itr = _simpleXmlSkipWhiteSpace(buf, buf + bufLength); + auto itrEnd = (const char*)memchr(buf, '{', bufLength); + + if (!itrEnd || itr == itrEnd) return nullptr; + + auto nextElement = (const char*)memchr(itrEnd, '}', bufLength - (itrEnd - buf)); + if (!nextElement) return nullptr; + + *attrs = itrEnd + 1; + *attrsLength = nextElement - *attrs; + + const char *p; + + itrEnd = _simpleXmlUnskipWhiteSpace(itrEnd, itr); + if (*(itrEnd - 1) == '.') return nullptr; + + for (p = itr; p < itrEnd; p++) { + if (*p == '.') break; + } + + if (p == itr) *tag = strdup("all"); + else *tag = strDuplicate(itr, p - itr); + + if (p == itrEnd) *name = nullptr; + else *name = strDuplicate(p + 1, itrEnd - p - 1); + + return (nextElement ? nextElement + 1 : nullptr); +} + + +const char* simpleXmlFindAttributesTag(const char* buf, unsigned bufLength) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + + for (; itr < itrEnd; itr++) { + if (!isspace((unsigned char)*itr)) { + //User skip tagname and already gave it the attributes. + if (*itr == '=') return buf; + } else { + itr = _simpleXmlUnskipXmlEntities(itr, buf); + if (itr == itrEnd) return nullptr; + return itr; + } + } + + return nullptr; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/libraries/lvgl/src/libs/thorvg/tvgXmlParser.h b/libraries/lvgl/src/libs/thorvg/tvgXmlParser.h new file mode 100644 index 0000000..e1cf2de --- /dev/null +++ b/libraries/lvgl/src/libs/thorvg/tvgXmlParser.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SIMPLE_XML_PARSER_H_ +#define _TVG_SIMPLE_XML_PARSER_H_ + +#include "tvgSvgLoaderCommon.h" + +#define NUMBER_OF_XML_ENTITIES 8 +const char* const xmlEntity[] = {""", " ", "'", "&", "<", ">", "#", "'"}; +const int xmlEntityLength[] = {6, 6, 6, 5, 4, 4, 6, 6}; + +enum class SimpleXMLType +{ + Open = 0, //!< \ + OpenEmpty, //!< \ + Close, //!< \ + Data, //!< tag text data + CData, //!< \ + Error, //!< error contents + Processing, //!< \ \ + Doctype, //!< \ + Ignored, //!< whatever is ignored by parser, like whitespace + DoctypeChild //!< \tiny_ttf_cache +/********************** + * TYPEDEFS + **********************/ +typedef struct ttf_font_desc { + lv_fs_file_t file; +#if LV_TINY_TTF_FILE_SUPPORT != 0 + ttf_cb_stream_t stream; +#else + const uint8_t * stream; +#endif + stbtt_fontinfo info; + float scale; + int ascent; + int descent; +} ttf_font_desc_t; + +typedef struct _tiny_ttf_cache_data_t { + lv_font_t * font; + uint32_t unicode; + uint32_t size; + lv_draw_buf_t * draw_buf; +} tiny_ttf_cache_data_t; +/********************** + * STATIC PROTOTYPES + **********************/ +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next); +static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, lv_draw_buf_t * draw_buf); +static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, + int32_t font_size, + size_t cache_size); + +static bool tiny_ttf_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data); +static void tiny_ttf_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t tiny_ttf_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, + const tiny_ttf_cache_data_t * rhs); +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size) +{ + if(font_size <= 0) { + LV_LOG_ERROR("invalid font size: %"PRIx32, font_size); + return; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); + int line_gap = 0; + stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); + font->line_height = (int32_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); + font->base_line = (int32_t)(dsc->scale * (line_gap - dsc->descent)); +} + +void lv_tiny_ttf_destroy(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + + if(font->dsc != NULL) { + ttf_font_desc_t * ttf = (ttf_font_desc_t *)font->dsc; +#if LV_TINY_TTF_FILE_SUPPORT != 0 + if(ttf->stream.file != NULL) { + lv_fs_close(&ttf->file); + } +#endif + lv_cache_drop_all(tiny_ttf_cache, (void *)font->dsc); + lv_free(ttf); + font->dsc = NULL; + } + + lv_free(font); +} + +void lv_tiny_ttf_init(void) +{ + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)tiny_ttf_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)tiny_ttf_cache_free_cb, + }; + + tiny_ttf_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_cache_data_t), 128, ops); +} + +void lv_tiny_ttf_deinit(void) +{ + lv_cache_destroy(tiny_ttf_cache, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT != 0 +static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read) +{ + if(stream->file != NULL) { + uint32_t br; + lv_fs_read(stream->file, data, to_read, &br); + } + else { + if(to_read + stream->position >= stream->size) { + to_read = stream->size - stream->position; + } + memcpy(data, ((const unsigned char *)stream->data + stream->position), to_read); + stream->position += to_read; + } +} +static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position) +{ + if(stream->file != NULL) { + lv_fs_seek(stream->file, position, LV_FS_SEEK_SET); + } + else { + if(position > stream->size) { + stream->position = stream->size; + } + else { + stream->position = position; + } + } +} +#endif + +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + if(unicode_letter < 0x20 || + unicode_letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ + unicode_letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ + dsc_out->box_w = 0; + dsc_out->adv_w = 0; + dsc_out->box_h = 0; /*height of the bitmap in [px]*/ + dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_NONE; + dsc_out->is_placeholder = false; + return true; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return false; + } + int x1, y1, x2, y2; + + stbtt_GetGlyphBitmapBox(&dsc->info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int g2 = 0; + if(unicode_letter_next != 0) { + g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); + } + int advw, lsb; + stbtt_GetGlyphHMetrics(&dsc->info, g1, &advw, &lsb); + int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, g2); + dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + + 0.5f); /*Horizontal space required by the glyph in [px]*/ + dsc_out->box_w = (x2 - x1 + 1); /*width of the bitmap in [px]*/ + dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/ + dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; + dsc_out->is_placeholder = false; + return true; /*true: glyph found; false: glyph was not found*/ +} + +static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, + uint32_t unicode_letter, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + const lv_font_t * font = g_dsc->resolved_font; + tiny_ttf_cache_data_t search_key = { + .font = (lv_font_t *)font, + .unicode = unicode_letter, + .size = font->line_height, + }; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(tiny_ttf_cache, &search_key, (void *)font->dsc); + + if(entry == NULL) { + LV_LOG_ERROR("cache not allocated\n"); + return NULL; + } + + g_dsc->entry = entry; + tiny_ttf_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + return cached_data->draw_buf; +} + +static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + if(g_dsc->entry == NULL) { + return; + } + lv_cache_release(tiny_ttf_cache, g_dsc->entry, NULL); + g_dsc->entry = NULL; +} + +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, int32_t font_size, + size_t cache_size) +{ + LV_UNUSED(data_size); + LV_UNUSED(cache_size); + if((path == NULL && data == NULL) || 0 >= font_size) { + LV_LOG_ERROR("tiny_ttf: invalid argument\n"); + return NULL; + } + ttf_font_desc_t * dsc = lv_malloc_zeroed(sizeof(ttf_font_desc_t)); + if(dsc == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + return NULL; + } +#if LV_TINY_TTF_FILE_SUPPORT != 0 + if(path != NULL) { + if(LV_FS_RES_OK != lv_fs_open(&dsc->file, path, LV_FS_MODE_RD)) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: unable to open %s\n", path); + return NULL; + } + dsc->stream.file = &dsc->file; + } + else { + dsc->stream.data = (const uint8_t *)data; + dsc->stream.size = data_size; + } + if(0 == stbtt_InitFont(&dsc->info, &dsc->stream, stbtt_GetFontOffsetForIndex(&dsc->stream, 0))) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: init failed\n"); + return NULL; + } + +#else + dsc->stream = (const uint8_t *)data; + if(0 == stbtt_InitFont(&dsc->info, dsc->stream, stbtt_GetFontOffsetForIndex(dsc->stream, 0))) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: init failed\n"); + return NULL; + } +#endif + + lv_font_t * out_font = lv_malloc_zeroed(sizeof(lv_font_t)); + if(out_font == NULL) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + return NULL; + } + out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; + out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; + out_font->release_glyph = ttf_release_glyph_cb; + out_font->dsc = dsc; + lv_tiny_ttf_set_size(out_font, font_size); + return out_font; +} +#if LV_TINY_TTF_FILE_SUPPORT != 0 +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, 0); +} +#endif +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, 0); +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool tiny_ttf_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data) +{ + + ttf_font_desc_t * dsc = (ttf_font_desc_t *)user_data; + uint32_t unicode_letter = node->unicode; + + const stbtt_fontinfo * info = (const stbtt_fontinfo *)&dsc->info; + int g1 = stbtt_FindGlyphIndex(info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return false; + } + int x1, y1, x2, y2; + stbtt_GetGlyphBitmapBox(info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int w, h; + w = x2 - x1 + 1; + h = y2 - y1 + 1; + lv_draw_buf_t * draw_buf = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + if(NULL == draw_buf) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + return false; + } + + lv_draw_buf_clear(draw_buf, NULL); + + uint32_t stride = draw_buf->header.stride; + stbtt_MakeGlyphBitmap(info, draw_buf->data, w, h, stride, dsc->scale, dsc->scale, g1); + + node->draw_buf = draw_buf; + return true; +} + +static void tiny_ttf_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data) +{ + LV_UNUSED(user_data); + + lv_draw_buf_destroy(node->draw_buf); +} + +static lv_cache_compare_res_t tiny_ttf_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, + const tiny_ttf_cache_data_t * rhs) +{ + if(lhs->font != rhs->font) { + return lhs->font > rhs->font ? 1 : -1; + } + + if(lhs->unicode != rhs->unicode) { + return lhs->unicode > rhs->unicode ? 1 : -1; + } + + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + + return 0; +} + +#endif diff --git a/libraries/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h b/libraries/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h new file mode 100644 index 0000000..2966ade --- /dev/null +++ b/libraries/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h @@ -0,0 +1,66 @@ +/** + * @file lv_tiny_ttf.h + * + */ + +#ifndef LV_TINY_TTF_H +#define LV_TINY_TTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_TINY_TTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT !=0 +/* create a font from the specified file or path with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size); + +/* create a font from the specified file or path with the specified line height with the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, size_t cache_size); +#endif + +void lv_tiny_ttf_init(void); + +void lv_tiny_ttf_deinit(void); + +/* create a font from the specified data pointer with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size); + +/* create a font from the specified data pointer with the specified line height and the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, size_t cache_size); + +/* set the size of the font to a new font_size*/ +void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size); + +/* destroy a font previously created with lv_tiny_ttf_create_xxxx()*/ +void lv_tiny_ttf_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TINY_TTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TINY_TTF_H*/ diff --git a/libraries/lvgl/src/libs/tiny_ttf/stb_rect_pack.h b/libraries/lvgl/src/libs/tiny_ttf/stb_rect_pack.h new file mode 100644 index 0000000..b265df9 --- /dev/null +++ b/libraries/lvgl/src/libs/tiny_ttf/stb_rect_pack.h @@ -0,0 +1,633 @@ +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC + #define STBRP_DEF static +#else + #define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect { + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum { + STBRP_HEURISTIC_Skyline_default = 0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node { + stbrp_coord x, y; + stbrp_node * next; +}; + +struct stbrp_context { + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node * active_head; + stbrp_node * free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT + #include + #define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT + #include + #define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER + #define STBRP__NOTUSED(v) (void)(v) + #define STBRP__CDECL __cdecl +#else + #define STBRP__NOTUSED(v) (void)sizeof(v) + #define STBRP__CDECL +#endif + +enum { + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic) +{ + switch(context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem) +{ + if(allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes - 1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes) +{ + int i; + + for(i = 0; i < num_nodes - 1; ++i) + nodes[i].next = &nodes[i + 1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1 << 30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context * c, stbrp_node * first, int x0, int width, int * pwaste) +{ + stbrp_node * node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + +#if 0 + // skip in case we're past the node + while(node->next->x <= x0) + ++node; +#else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency +#endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while(node->x < x1) { + if(node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visited + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if(node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } + else { + // add waste area + int under_width = node->next->x - node->x; + if(under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct { + int x, y; + stbrp_node ** prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context * c, int width, int height) +{ + int best_waste = (1 << 30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node ** prev, * node, * tail, ** best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if(width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while(node->x + width <= c->width) { + int y, waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if(c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if(y < best_y) { + best_y = y; + best = prev; + } + } + else { + // best-fit + if(y + height <= c->height) { + // can only use it if it first vertically + if(y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if(c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while(tail->x < width) + tail = tail->next; + while(tail) { + int xpos = tail->x - width; + int y, waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while(node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if(y + height <= c->height) { + if(y <= best_y) { + if(y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) { + best_x = xpos; + STBRP_ASSERT(y <= best_y); + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context * context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node * node, * cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if(res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord)(res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stiched back in + + cur = *res.prev_link; + if(cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node * next = cur->next; + cur->next = node; + cur = next; + } + else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while(cur->next && cur->next->x <= res.x + width) { + stbrp_node * next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if(cur->x < res.x + width) + cur->x = (stbrp_coord)(res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while(cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count = 0; + cur = context->active_head; + while(cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while(cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes + 2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + if(p->h > q->h) + return -1; + if(p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for(i = 0; i < num_rects; ++i) { + if(rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } + else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if(fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } + else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if(!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/libraries/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h b/libraries/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h new file mode 100644 index 0000000..e91997b --- /dev/null +++ b/libraries/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h @@ -0,0 +1,5558 @@ +// stb_truetype.h - v1.26htcw (fork to enable streaming and low memory environments) +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0, q.t0); + glVertex2f(q.x0, q.y0); + glTexCoord2f(q.s1, q.t0); + glVertex2f(q.x1, q.y0); + glTexCoord2f(q.s1, q.t1); + glVertex2f(q.x1, q.y1); + glTexCoord2f(q.s0, q.t1); + glVertex2f(q.x0, q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1 << 25]; + +int main(int argc, char ** argv) +{ + stbtt_fontinfo font; + unsigned char * bitmap; + int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); + + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24 << 20]; +unsigned char screen[20][79]; + +int main(int arg, char ** argv) +{ + stbtt_fontinfo font; + int i, j, ascent, baseline, ch = 0; + float scale, xpos = 2; // leave a little padding in case the character extends left + char * text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent, 0, 0); + baseline = (int)(ascent * scale); + + while(text[ch]) { + int advance, lsb, x0, y0, x1, y1; + float x_shift = xpos - (float)floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, + x_shift, 0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if(text[ch + 1]) + xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); + ++ch; + } + + for(j = 0; j < 20; ++j) { + for(i = 0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i] >> 5]); + putchar('\n'); + } + + return 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION +// #define your own (u)stbtt_int8/16/32 before including to override this +#ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; +#endif + +typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; +typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; + +// define STBTT_STDIO_STREAM to stream from a FILE object +// instead of from memory. Or define STBTT_STREAM_TYPE, +// STBTT_STREAM_READ and STBTT_STREAM_SEEK to implement +// another streaming source +#ifdef STBTT_STDIO_STREAM + #include + #define STBTT_STREAM_TYPE FILE* + #define STBTT_STREAM_READ(s,x,y) fread(x,1,y,s); + #define STBTT_STREAM_SEEK(s,x) fseek(s,x,SEEK_SET); +#endif + +// heap factor sizes for various counts of objects +// adjust for your platform. Below is suitable for +// modern PC class machines. +#ifndef STBTT_HEAP_FACTOR_SIZE_32 + #define STBTT_HEAP_FACTOR_SIZE_32 2000 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_128 + #define STBTT_HEAP_FACTOR_SIZE_128 800 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_DEFAULT + #define STBTT_HEAP_FACTOR_SIZE_DEFAULT 100 +#endif + +// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h +#ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) +#endif + +#ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) (float)sqrt(x) + #define STBTT_pow(x,y) pow(x,y) +#endif + +#ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) +#endif + +#ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) +#endif + +#ifndef STBTT_fabs + #include + #define STBTT_fabs(x) (float)fabs(x) +#endif + +// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h +#ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) +#endif + +#ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) +#endif + +#ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) +#endif + +#ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC + #define STBTT_DEF static +#else + #define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct { +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; + stbtt_uint32 offset; +#else + unsigned char * data; +#endif + int cursor; + int size; +} stbtt__buf; + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; +} stbtt_bakedchar; + +typedef struct { + float x0, y0, s0, t0; // top-left + float x1, y1, s1, t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + float xoff2, yoff2; +} stbtt_packedchar; + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +/// @endcond + +#ifndef STB_RECT_PACK_VERSION +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +#endif +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int width, int height, + int stride_in_bytes, int padding, void * alloc_context); + +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +typedef struct { + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int * array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar * chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, + unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph received the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void * user_allocator_context; + void * pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char * pixels; + void * nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data); +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data); +#endif +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE, int index); +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index); +#endif + +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo { + void * userdata; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; +#else + unsigned char * data; // pointer to .ttf file +#endif + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset); +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset); +#endif +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct _stbtt_kerningentry { + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) +enum { + STBTT_vmove = 1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic +}; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values +// (we share this with other code at RAD) +#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file +typedef struct { + stbtt_vertex_type x, y, cx, cy, cx1, cy1; + unsigned char type, padding; +} stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex ** vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex ** vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * vertices); +// frees the data allocated above + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); + +// @TODO: don't expose this structure +typedef struct { + int w, h, stride; + unsigned char * pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex * vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void * userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags); +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags); +#endif +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2); +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2); +#endif +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID); + +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, + STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, + STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, + STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, + STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, + STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE + #define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 + #error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION + #define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER + #define STBTT__NOTUSED(v) (void)(v) +#else + #define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + ++b->cursor; + return result; +#else + return b->data[b->cursor++]; +#endif + +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + return result; +#else + return b->data[b->cursor]; +#endif + +} + +static void stbtt__buf_seek(stbtt__buf * b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf * b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf * b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for(i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} +#ifdef STBTT_STREAM_TYPE + static stbtt__buf stbtt__new_buf(STBTT_STREAM_TYPE s, size_t size) +#else + static stbtt__buf stbtt__new_buf(const void * p, size_t size) +#endif +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); +#ifdef STBTT_STREAM_TYPE + r.data = s; + r.offset = 0; +#else + r.data = (stbtt_uint8 *)p; +#endif + r.size = (int)size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf * b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if(o < 0 || s < 0 || o > b->size || s > b->size - o) return r; +#ifdef STBTT_STREAM_TYPE + r.data = b->data; + r.offset = b->offset + o; +#else + r.data = b->data + o; +#endif + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf * b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if(count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf * b) +{ + int b0 = stbtt__buf_get8(b); + if(b0 >= 32 && b0 <= 246) return b0 - 139; + else if(b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; + else if(b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; + else if(b0 == 28) return stbtt__buf_get16(b); + else if(b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf * b) +{ + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if(b0 == 30) { + stbtt__buf_skip(b, 1); + while(b->cursor < b->size) { + v = stbtt__buf_get8(b); + if((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } + else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf * b, int key) +{ + stbtt__buf_seek(b, 0); + while(b->cursor < b->size) { + int start = b->cursor, end, op; + while(stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if(op == 12) op = stbtt__buf_get8(b) | 0x100; + if(op == key) return stbtt__buf_range(b, start, end - start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf * b, int key, int outcount, stbtt_uint32 * out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for(i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf * b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i * offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#ifdef STBTT_STREAM_TYPE +static stbtt_uint8 ttBYTE(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r; + STBTT_STREAM_READ(s, &r, 1); + return r; +} +#define ttCHAR(s, offset) ((stbtt_int8)ttBYTE(s,offset)) +static stbtt_uint16 ttUSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_int16 ttSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_uint32 ttULONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +static stbtt_int32 ttLONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +#else +#define ttBYTE(p, offset) (* (stbtt_uint8 *) (p+offset)) +#define ttCHAR(p, offset) (* (stbtt_int8 *) (p+offset)) +static stbtt_uint16 ttUSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_int16 ttSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_uint32 ttULONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +static stbtt_int32 ttLONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +#endif +#define ttFixed(p, offset) ttLONG(p, offset) + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) +#ifdef STBTT_STREAM_TYPE + static int stbtt__isfont(STBTT_STREAM_TYPE stream, stbtt_uint32 offs) +#else + static int stbtt__isfont(stbtt_uint8 * font, stbtt_uint32 offs) +#endif +{ +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 font[4]; + STBTT_STREAM_SEEK(stream, offs); + STBTT_STREAM_READ(stream, font, 4); +#else + font += offs; +#endif + // check the version number + if(stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 + if(stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if(stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if(stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 + if(stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +#ifdef STBTT_STREAM_TYPE + static stbtt_uint32 stbtt__find_table(STBTT_STREAM_TYPE data, stbtt_uint32 fontstart, const char * tag) +#else + static stbtt_uint32 stbtt__find_table(stbtt_uint8 * data, stbtt_uint32 fontstart, const char * tag) +#endif +{ + stbtt_int32 num_tables = ttUSHORT(data, fontstart + 4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for(i = 0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16 * i; +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(data, loc + 0); + STBTT_STREAM_READ(data, buf, 4); + if(stbtt_tag(buf, tag)) + return ttULONG(data, loc + 8); +#else + if(stbtt_tag(data + loc + 0, tag)) + return ttULONG(data, loc + 8); +#endif + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetFontOffsetForIndex_internal(STBTT_STREAM_TYPE font_collection, int index) +#else + static int stbtt_GetFontOffsetForIndex_internal(unsigned char * font_collection, int index) +#endif +{ + // if it's just a font, there's only one valid index + if(stbtt__isfont(font_collection, 0)) + return index == 0 ? 0 : -1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection, 8); + if(index >= n) + return -1; + return ttULONG(font_collection, 12 + index * 4); + } + } + return -1; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetNumberOfFonts_internal(STBTT_STREAM_TYPE font_collection) +#else + static int stbtt_GetNumberOfFonts_internal(unsigned char * font_collection) +#endif +{ + // if it's just a font, there's only one valid font + if(stbtt__isfont(font_collection, 0)) + return 1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + return ttLONG(font_collection, 8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if(!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if(!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1] + subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo * info) +{ + stbtt_uint32 t; + if(info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if(t) { + stbtt_uint32 offset = ttULONG(info->data, t + 2); + info->svg = t + offset; + } + else { + info->svg = 0; + } + } + return info->svg; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_InitFont_internal(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int fontstart) +#else + static int stbtt_InitFont_internal(stbtt_fontinfo * info, unsigned char * data, int fontstart) +#endif +{ + stbtt_uint32 cmap, t; + stbtt_int32 i, numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if(!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if(info->glyf) { + // required for truetype + if(!info->loca) return 0; + } + else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if(!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + +#ifdef STBTT_STREAM_TYPE + info->cff = stbtt__new_buf(info->data, 512 * 1024 * 1024); + info->cff.offset = cff; +#else + info->cff = stbtt__new_buf(info->data + cff, 512 * 1024 * 1024); +#endif + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if(cstype != 2) return 0; + if(charstrings == 0) return 0; + + if(fdarrayoff) { + // looks like a CID font + if(!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if(t) + info->numGlyphs = ttUSHORT(data, t + 4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data, cmap + 2); + info->index_map = 0; + for(i = 0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data, encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch(ttUSHORT(data, encoding_record + 2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + } + if(info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data, info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint) +{ +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data, index_map + 0); + if(format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data, index_map + 2); + if(unicode_codepoint < bytes - 6) + return ttBYTE(data, index_map + 6 + unicode_codepoint); + return 0; + } + else if(format == 6) { + stbtt_uint32 first = ttUSHORT(data, index_map + 6); + stbtt_uint32 count = ttUSHORT(data, index_map + 8); + if((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) + return ttUSHORT(data, index_map + 10 + (unicode_codepoint - first) * 2); + return 0; + } + else if(format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } + else if(format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data, index_map + 6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data, index_map + 8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data, index_map + 10); + stbtt_uint16 rangeShift = ttUSHORT(data, index_map + 12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if(unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if(unicode_codepoint >= ttUSHORT(data, search + rangeShift * 2)) + search += rangeShift * 2; + + // now decrement to bias correctly to find smallest + search -= 2; + while(entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data, search + searchRange * 2); + if(unicode_codepoint > end) + search += searchRange * 2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); + + start = ttUSHORT(data, index_map + 14 + segcount * 2 + 2 + 2 * item); + last = ttUSHORT(data, endCount + 2 * item); + if(unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data, index_map + 14 + segcount * 6 + 2 + 2 * item); + if(offset == 0) + return (stbtt_uint16)(unicode_codepoint + ttSHORT(data, index_map + 14 + segcount * 4 + 2 + 2 * item)); + + return ttUSHORT(data, offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); + } + } + else if(format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data, index_map + 12); + stbtt_int32 low, high; + low = 0; + high = (stbtt_int32)ngroups; + // Binary search the right group. + while(low < high) { + stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data, index_map + 16 + mid * 12); + stbtt_uint32 end_char = ttULONG(data, index_map + 16 + mid * 12 + 4); + if((stbtt_uint32)unicode_codepoint < start_char) + high = mid; + else if((stbtt_uint32)unicode_codepoint > end_char) + low = mid + 1; + else { + stbtt_uint32 start_glyph = ttULONG(data, index_map + 16 + mid * 12 + 8); + if(format == 12) + return start_glyph + unicode_codepoint - start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex * *vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex * v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16)x; + v->y = (stbtt_int16)y; + v->cx = (stbtt_int16)cx; + v->cy = (stbtt_int16)cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo * info, int glyph_index) +{ + int g1, g2; + + STBTT_assert(!info->cff.size); + + if(glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if(info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if(info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2 + 2) * 2; + } + else { + g1 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4 + 4); + } + + return g1 == g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + if(info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } + else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 0; + + if(x0) *x0 = ttSHORT(info->data, g + 2); + if(y0) *y0 = ttSHORT(info->data, g + 4); + if(x1) *x1 = ttSHORT(info->data, g + 6); + if(y1) *y1 = ttSHORT(info->data, g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if(info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 1; + numberOfContours = ttSHORT(info->data, g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex * vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if(start_off) { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint32 endPtsOfContours; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_vertex * vertices = 0; + int num_vertices = 0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if(g < 0) return 0; + + numberOfContours = ttSHORT(data, g); + + if(numberOfContours > 0) { + stbtt_uint8 flags = 0, flagcount; + stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; + stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; + stbtt_uint32 points; + endPtsOfContours = (g + 10); + ins = ttUSHORT(data, g + 10 + numberOfContours * 2); + points = g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1 + ttUSHORT(data, endPtsOfContours + numberOfContours * 2 - 2); + + m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if(vertices == 0) + return 0; + + next_move = 0; + flagcount = 0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for(i = 0; i < n; ++i) { + if(flagcount == 0) { + flags = ttBYTE(data, points++); + if(flags & 8) + flagcount = ttBYTE(data, points++); + } + else + --flagcount; + vertices[off + i].type = flags; + } + + // now load x coordinates + x = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 2) { + stbtt_int16 dx = ttBYTE(data, points++); + x += (flags & 16) ? dx : -dx; // ??? + } + else { + if(!(flags & 16)) { + x = x + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].x = (stbtt_int16)x; + } + + // now load y coordinates + y = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 4) { + stbtt_int16 dy = ttBYTE(data, points++); + y += (flags & 32) ? dy : -dy; // ??? + } + else { + if(!(flags & 32)) { + y = y + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].y = (stbtt_int16)y; + } + + // now convert them to our format + num_vertices = 0; + sx = sy = cx = cy = scx = scy = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + x = (stbtt_int16)vertices[off + i].x; + y = (stbtt_int16)vertices[off + i].y; + + if(next_move == i) { + if(i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + + // now start the new one + start_off = !(flags & 1); + if(start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if(!(vertices[off + i + 1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; + sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; + } + else { + // otherwise just use the next point as our start point + sx = (stbtt_int32)vertices[off + i + 1].x; + sy = (stbtt_int32)vertices[off + i + 1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } + else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); + was_off = 0; + next_move = 1 + ttUSHORT(data, endPtsOfContours + j * 2); + ++j; + } + else { + if(!(flags & 1)) { // if it's a curve + if(was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + } + else if(numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint32 comp = g + 10; + num_vertices = 0; + vertices = 0; + while(more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex * comp_verts = 0, * tmp = 0; + float mtx[6] = { 1, 0, 0, 1, 0, 0 }, m, n; + + flags = ttSHORT(data, comp); + comp += 2; + gidx = ttSHORT(data, comp); + comp += 2; + + if(flags & 2) { // XY values + if(flags & 1) { // shorts + mtx[4] = ttSHORT(data, comp); + comp += 2; + mtx[5] = ttSHORT(data, comp); + comp += 2; + } + else { + mtx[4] = ttCHAR(data, comp); + comp += 1; + mtx[5] = ttCHAR(data, comp); + comp += 1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if(flags & (1 << 3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + } + else if(flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + else if(flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[2] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + + // Find transformation scales. + m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); + n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if(comp_num_verts > 0) { + // Transform vertices. + for(i = 0; i < comp_num_verts; ++i) { + stbtt_vertex * v = &comp_verts[i]; + stbtt_vertex_type x, y; + x = v->x; + y = v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + x = v->cx; + y = v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex *)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); + if(!tmp) { + if(vertices) STBTT_free(vertices, info->userdata); + if(comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if(num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); + STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); + if(vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1 << 5); + } + } + else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct { + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex * pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx * c, stbtt_int32 x, stbtt_int32 y) +{ + if(x > c->max_x || !c->started) c->max_x = x; + if(y > c->max_y || !c->started) c->max_y = y; + if(x < c->min_x || !c->started) c->min_x = x; + if(y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx * c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if(c->bounds) { + stbtt__track_vertex(c, x, y); + if(type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } + else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx * ctx) +{ + if(ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx * ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx * ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx * ctx, float dx1, float dy1, float dx2, float dy2, float dx3, + float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if(count >= 33900) + bias = 32768; + else if(count >= 1240) + bias = 1131; + n += bias; + if(n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if(fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } + else if(fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for(i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if(glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if(fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo * info, int glyph_index, stbtt__csctx * c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while(b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch(b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if(in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if(sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); + break; + case 0x04: // vmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp - 1]); + break; + case 0x16: // hmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 1], 0); + break; + + case 0x05: // rlineto + if(sp < 2) return STBTT__CSERR("rlineto stack"); + for(; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if(sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if(sp < 1) return STBTT__CSERR("hlineto stack"); + for(;;) { + if(i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; +vlineto: + if(i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if(sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if(sp < 4) return STBTT__CSERR("vhcurveto stack"); + for(;;) { + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; +hvcurveto: + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if(sp < 6) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x18: // rcurveline + if(sp < 8) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + if(i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + case 0x19: // rlinecurve + if(sp < 8) return STBTT__CSERR("rlinecurve stack"); + for(; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + if(i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if(sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if(sp & 1) { + f = s[i]; + i++; + } + for(; i + 3 < sp; i += 4) { + if(b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if(!has_subrs) { + if(info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if(sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int)s[--sp]; + if(subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if(b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if(subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch(b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if(sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if(sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if(sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); + break; + + case 0x25: // flex1 + if(sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1 + dx2 + dx3 + dx4 + dx5; + dy = dy1 + dy2 + dy3 + dy4 + dy5; + if(STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } + break; + + default: + if(b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if(b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } + else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if(sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if(clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if(stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex *)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if(stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if(x0) *x0 = r ? c.min_x : 0; + if(y0) *y0 = r ? c.min_y : 0; + if(x1) *x1 = r ? c.max_x : 0; + if(y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + if(!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data, info->hhea + 34); + if(glyph_index < numOfLongHorMetrics) { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * glyph_index); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, info->hmtx + 4 * glyph_index + 2); + } + else { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * (numOfLongHorMetrics - 1)); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, + info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info) +{ + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(info->data, 10 + info->kern); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length) +{ + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(info->data, 10 + info->kern); + if(table_length < length) + length = table_length; + + for(k = 0; k < length; k++) { + table[k].glyph1 = ttUSHORT(info->data, 18 + (k * 6) + info->kern); + table[k].glyph2 = ttUSHORT(info->data, 20 + (k * 6) + info->kern); + table[k].advance = ttSHORT(info->data, 22 + (k * 6) + info->kern); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, info->kern + 2) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, info->kern + 8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(info->data, info->kern + 10) - 1; + needle = glyph1 << 16 | glyph2; + while(l <= r) { + m = (l + r) >> 1; + straw = ttULONG(info->data, info->kern + 18 + (m * 6)); // note: unaligned read + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else + return ttSHORT(info->data, info->kern + 22 + (m * 6)); + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetCoverageIndex(STBTT_STREAM_TYPE data, stbtt_uint32 coverageTable, int glyph) +#else + static stbtt_int32 stbtt__GetCoverageIndex(const stbtt_uint8 * data, stbtt_uint32 coverageTable, int glyph) +#endif +{ + stbtt_uint16 coverageFormat = ttUSHORT(data, coverageTable); + switch(coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(data, coverageTable + 2); + + // Binary search. + stbtt_int32 l = 0, r = glyphCount - 1, m; + int straw, needle = glyph; + while(l <= r) { + stbtt_uint32 glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(data, glyphArray + 2 * m); + straw = glyphID; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(data, coverageTable + 2); + stbtt_uint32 rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = rangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(data, rangeRecord); + strawEnd = ttUSHORT(data, rangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(data, rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: + return -1; // unsupported + } + + return -1; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetGlyphClass(STBTT_STREAM_TYPE data, stbtt_uint32 classDefTable, int glyph) +#else + static stbtt_int32 stbtt__GetGlyphClass(const stbtt_uint8 * data, stbtt_uint32 classDefTable, int glyph) +#endif +{ + stbtt_uint16 classDefFormat = ttUSHORT(data, classDefTable); + switch(classDefFormat) { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(data, classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(data, classDefTable + 4); + stbtt_uint32 classDef1ValueArray = classDefTable + 6; + + if(glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(data, classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(data, classDefTable + 2); + stbtt_uint32 classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = classRangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(data, classRangeRecord); + strawEnd = ttUSHORT(data, classRangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(data, classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint32 lookupList; + stbtt_uint16 lookupCount; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + const stbtt_uint8 * data = info->data; +#endif + stbtt_int32 i, sti; + + if(!info->gpos) return 0; + + if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 + if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data, 8 + info->gpos); + lookupList = lookupListOffset; + lookupCount = ttUSHORT(data, lookupList); + + for(i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); + stbtt_uint32 lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); + stbtt_uint16 subTableCount = ttUSHORT(data, lookupTable + 4); + stbtt_uint32 subTableOffsets = lookupTable + 6; + if(lookupType != 2) // Pair Adjustment Positioning Subtable + continue; + + for(sti = 0; sti < subTableCount; sti++) { + stbtt_uint16 subtableOffset = ttUSHORT(data, subTableOffsets + 2 * sti); + stbtt_uint32 table = lookupTable + subtableOffset; + stbtt_uint16 posFormat = ttUSHORT(data, table); + stbtt_uint16 coverageOffset = ttUSHORT(data, table + 2); + stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(data, table + coverageOffset, glyph1); + if(coverageIndex == -1) continue; + + switch(posFormat) { + case 1: { + stbtt_int32 l, r, m; + int straw, needle; + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_int32 valueRecordPairSizeInBytes = 2; + stbtt_uint16 pairSetCount = ttUSHORT(data, table + 8); + stbtt_uint16 pairPosOffset = ttUSHORT(data, table + 10 + 2 * coverageIndex); + stbtt_uint32 pairValueTable = table + pairPosOffset; + stbtt_uint16 pairValueCount = ttUSHORT(data, pairValueTable); + stbtt_uint32 pairValueArray = pairValueTable + 2; + + if(coverageIndex >= pairSetCount) return 0; + + needle = glyph2; + r = pairValueCount - 1; + l = 0; + + // Binary search. + while(l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint32 pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(data, pairValue); + straw = secondGlyph; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(data, pairValue + 2); + return xAdvance; + } + } + } + else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(data, table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(data, table + 10); + int glyph1class = stbtt__GetGlyphClass(data, table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(data, table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(data, table + 12); + stbtt_uint16 class2Count = ttUSHORT(data, table + 14); + stbtt_uint32 class1Records, class2Records; + stbtt_int16 xAdvance; + + if(glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if(glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(data, class2Records + 2 * glyph2class); + return xAdvance; + } + else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int g1, int g2) +{ + int xAdvance = 0; + + if(info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if(info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2) +{ + if(!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap) +{ + if(ascent) *ascent = ttSHORT(info->data, info->hhea + 4); + if(descent) *descent = ttSHORT(info->data, info->hhea + 6); + if(lineGap) *lineGap = ttSHORT(info->data, info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if(!tab) + return 0; + if(typoAscent) *typoAscent = ttSHORT(info->data, tab + 68); + if(typoDescent) *typoDescent = ttSHORT(info->data, tab + 70); + if(typoLineGap) *typoLineGap = ttSHORT(info->data, tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1) +{ + *x0 = ttSHORT(info->data, info->head + 36); + *y0 = ttSHORT(info->data, info->head + 38); + *x1 = ttSHORT(info->data, info->head + 40); + *y1 = ttSHORT(info->data, info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float height) +{ + int fheight = ttSHORT(info->data, info->hhea + 4) - ttSHORT(info->data, info->hhea + 6); + return (float)height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data, info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl) +{ + int i; + stbtt_uint32 svg_doc_list = stbtt__get_svg((stbtt_fontinfo *)info); + + int numEntries = ttUSHORT(info->data, svg_doc_list); + stbtt_uint32 svg_docs = svg_doc_list + 2; + + for(i = 0; i < numEntries; i++) { + stbtt_uint32 svg_doc = svg_docs + (12 * i); + if((gl >= ttUSHORT(info->data, svg_doc)) && (gl <= ttUSHORT(info->data, svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs) +{ + stbtt_uint32 svg_doc; + + if(info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if(svg_doc != 0) { + *svgOfs = info->svg + ttULONG(info->data, svg_doc + 4); + return ttULONG(info->data, svg_doc + 8); + } + else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svgOfs); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning + if(!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { + // e.g. space character + if(ix0) *ix0 = 0; + if(iy0) *iy0 = 0; + if(ix1) *ix1 = 0; + if(iy1) *iy1 = 0; + } + else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if(ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if(iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if(ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); + if(iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, + iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk { + struct stbtt__hheap_chunk * next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap { + struct stbtt__hheap_chunk * head; + void * first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void * stbtt__hheap_alloc(stbtt__hheap * hh, size_t size, void * userdata) +{ + if(hh->first_free) { + void * p = hh->first_free; + hh->first_free = *(void **)p; + return p; + } + else { + if(hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? STBTT_HEAP_FACTOR_SIZE_32 : size < 128 ? STBTT_HEAP_FACTOR_SIZE_128 : + STBTT_HEAP_FACTOR_SIZE_DEFAULT); + stbtt__hheap_chunk * c = (stbtt__hheap_chunk *)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if(c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap * hh, void * p) +{ + *(void **)p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap * hh, void * userdata) +{ + stbtt__hheap_chunk * c = hh->head; + while(c) { + stbtt__hheap_chunk * n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0, y0, x1, y1; + int invert; +} stbtt__edge; + +typedef struct stbtt__active_edge { + struct stbtt__active_edge * next; +#if STBTT_RASTERIZER_VERSION==1 + int x, dx; + float ey; + int direction; +#elif STBTT_RASTERIZER_VERSION==2 + float fx, fdx, fdy; + float direction; + float sy; + float ey; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if(!z) return z; + + // round dx down to avoid overshooting + if(dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - + e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if(!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char * scanline, int len, stbtt__active_edge * e, int max_weight) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + while(e) { + if(w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; + w += e->direction; + } + else { + int x1 = e->x; + w += e->direction; + // if we went to zero, we need to draw + if(w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if(i < len && j >= 0) { + if(i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } + else { + if(i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if(j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for(++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8)max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], * scanline; + + if(result->w > 512) + scanline = (unsigned char *)STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; + + while(j < result->h) { + STBTT_memset(scanline, 0, result->w); + for(s = 0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge ** step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed = 0; + step = &active; + while(*step && (*step)->next) { + if((*step)->x > (*step)->next->x) { + stbtt__active_edge * t = *step; + stbtt__active_edge * q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if(!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while(e->y0 <= scan_y) { + if(e->y1 > scan_y) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if(z != NULL) { + // find insertion point + if(active == NULL) + active = z; + else if(z->x < active->x) { + // insert at front + z->next = active; + active = z; + } + else { + // find thing to insert AFTER + stbtt__active_edge * p = active; + while(p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if(active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float * scanline, int x, stbtt__active_edge * e, float x0, float y0, float x1, + float y1) +{ + if(y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if(y0 > e->ey) return; + if(y1 < e->sy) return; + if(y0 < e->sy) { + x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); + y0 = e->sy; + } + if(y1 > e->ey) { + x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); + y1 = e->ey; + } + + if(x0 == x) + STBTT_assert(x1 <= x + 1); + else if(x0 == x + 1) + STBTT_assert(x1 >= x); + else if(x0 <= x) + STBTT_assert(x1 <= x); + else if(x0 >= x + 1) + STBTT_assert(x1 >= x + 1); + else + STBTT_assert(x1 >= x && x1 <= x + 1); + + if(x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1 - y0); + else if(x0 >= x + 1 && x1 >= x + 1) { + /*Nothing to do*/; + } + else { + STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); + scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float * scanline, float * scanline_fill, int len, stbtt__active_edge * e, + float y_top) +{ + float y_bottom = y_top + 1; + + while(e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if(e->fdx == 0) { + float x0 = e->fx; + if(x0 < len) { + if(x0 >= 0) { + stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); + stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); + } + else { + stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); + } + } + } + else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0, sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if(e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } + else { + x_top = x0; + sy0 = y_top; + } + if(e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } + else { + x_bottom = xb; + sy1 = y_bottom; + } + + if(x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if((int)x_top == (int)x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int)x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x + 1.0f, x_bottom, x + 1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } + else { + int x, x1, x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if(x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int)x_top; + x2 = (int)x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1 + 1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if(y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing - sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1 + 1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if(y_final > y_bottom) { + y_final = y_bottom; + dy = (y_final - y_crossing) / (x2 - (x1 + 1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for(x = x1 + 1; x < x2; ++x) { + scanline[x] += area + step / 2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final - 0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1 - y_final, (float)x2, x2 + 1.0f, x_bottom, x2 + 1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1 - sy0); + } + } + else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for(x = 0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float)(x); + float x2 = (float)(x + 1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x + 1 - x0) / dx + y_top; + + if(x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else { // one segment + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0, i; + float scanline_data[129], * scanline, * scanline2; + + STBTT__NOTUSED(vsubsample); + + if(result->w > 64) + scanline = (float *)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float)(off_y + result->h) + 1; + + while(j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge ** step = &active; + + STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while(e->y0 <= scan_y_bottom) { + if(e->y0 != e->y1) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if(z != NULL) { + if(j == 0 && off_y != 0) { + if(z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if(active) + stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); + + { + float sum = 0; + for(i = 0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float)STBTT_fabs(k) * 255 + 0.5f; + m = (int)k; + if(m > 255) m = 255; + result->pixels[j * result->stride + i] = (unsigned char)m; + } + } + // advance all the edges + step = &active; + while(*step) { + stbtt__active_edge * z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge * p, int n) +{ + int i, j; + for(i = 1; i < n; ++i) { + stbtt__edge t = p[i], * a = &t; + j = i; + while(j > 0) { + stbtt__edge * b = &p[j - 1]; + int c = STBTT__COMPARE(a, b); + if(!c) break; + p[j] = p[j - 1]; + --j; + } + if(i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge * p, int n) +{ + /* threshold for transitioning to insertion sort */ + while(n > 12) { + stbtt__edge t; + int c01, c12, c, m, i, j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0], &p[m]); + c12 = STBTT__COMPARE(&p[m], &p[n - 1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if(c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0], &p[n - 1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n - 1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i = 1; + j = n - 1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for(;; ++i) { + if(!STBTT__COMPARE(&p[i], &p[0])) break; + } + for(;; --j) { + if(!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if(i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if(j < (n - i)) { + stbtt__sort_edges_quicksort(p, j); + p = p + i; + n = n - i; + } + else { + stbtt__sort_edges_quicksort(p + i, n - i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge * p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct { + float x, y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap * result, stbtt__point * pts, int * wcount, int windings, float scale_x, + float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void * userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge * e; + int n, i, j, k, m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for(i = 0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel + if(e == 0) return; + n = 0; + + m = 0; + for(i = 0; i < windings; ++i) { + stbtt__point * p = pts + m; + m += wcount[i]; + j = wcount[i] - 1; + for(k = 0; k < wcount[i]; j = k++) { + int a = k, b = j; + // skip the edge if horizontal + if(p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if(invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a = j, b = k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point * points, int n, float x, float y) +{ + if(!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2 * x1 + x2) / 4; + float my = (y0 + 2 * y1 + y2) / 4; + // versus directly drawn line + float dx = (x0 + x2) / 2 - mx; + float dy = (y0 + y2) / 2 - my; + if(n > 16) // 65536 segments on one curve better be enough! + return 1; + if(dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, + objspace_flatness_squared, n + 1); + stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, + objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x2, y2); + *num_points = *num_points + 1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1 - x0; + float dy0 = y1 - y0; + float dx1 = x2 - x1; + float dy1 = y2 - y1; + float dx2 = x3 - x2; + float dy2 = y3 - y2; + float dx = x3 - x0; + float dy = y3 - y0; + float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt( + dx2 * dx2 + dy2 * dy2)); + float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); + float flatness_squared = longlen * longlen - shortlen * shortlen; + + if(n > 16) // 65536 segments on one curve better be enough! + return; + + if(flatness_squared > objspace_flatness_squared) { + float x01 = (x0 + x1) / 2; + float y01 = (y0 + y1) / 2; + float x12 = (x1 + x2) / 2; + float y12 = (y1 + y2) / 2; + float x23 = (x2 + x3) / 2; + float y23 = (y2 + y3) / 2; + + float xa = (x01 + x12) / 2; + float ya = (y01 + y12) / 2; + float xb = (x12 + x23) / 2; + float yb = (y12 + y23) / 2; + + float mx = (xa + xb) / 2; + float my = (ya + yb) / 2; + + stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x3, y3); + *num_points = *num_points + 1; + } +} + +// returns number of contours +static stbtt__point * stbtt_FlattenCurves(stbtt_vertex * vertices, int num_verts, float objspace_flatness, + int ** contour_lengths, int * num_contours, void * userdata) +{ + stbtt__point * points = 0; + int num_points = 0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i, n = 0, start = 0, pass; + + // count how many "moves" there are to get the contour count + for(i = 0; i < num_verts; ++i) + if(vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if(n == 0) return 0; + + *contour_lengths = (int *)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if(*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for(pass = 0; pass < 2; ++pass) { + float x = 0, y = 0; + if(pass == 1) { + points = (stbtt__point *)STBTT_malloc(num_points * sizeof(points[0]), userdata); + if(points == NULL) goto error; + } + num_points = 0; + n = -1; + for(i = 0; i < num_verts; ++i) { + switch(vertices[i].type) { + case STBTT_vmove: + // start the next contour + if(n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, float flatness_in_pixels, stbtt_vertex * vertices, int num_verts, + float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void * userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int * winding_lengths = NULL; + stbtt__point * windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, + &winding_count, userdata); + if(windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, + invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff) +{ + int ix0, iy0, ix1, iy1; + stbtt__bitmap gbm; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if(scale_x == 0) scale_x = scale_y; + if(scale_y == 0) { + if(scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if(width) *width = gbm.w; + if(height) *height = gbm.h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + if(gbm.w && gbm.h) { + gbm.pixels = (unsigned char *)STBTT_malloc(gbm.w * gbm.h, info->userdata); + if(gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0, iy0; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if(gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small +#ifdef STBTT_STREAM_TYPE +static int stbtt_BakeFontBitmap_internal(STBTT_STREAM_TYPE data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#else +static int stbtt_BakeFontBitmap_internal(unsigned char * data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#endif +{ + float scale; + int x, y, bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if(!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + x = y = 1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for(i = 0; i < num_chars; ++i) { + int advance, lsb, x0, y0, x1, y1, gw, gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); + gw = x1 - x0; + gh = y1 - y0; + if(x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if(y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x + gw < pw); + STBTT_assert(y + gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); + chardata[i].x0 = (stbtt_int16)x; + chardata[i].y0 = (stbtt_int16)y; + chardata[i].x1 = (stbtt_int16)(x + gw); + chardata[i].y1 = (stbtt_int16)(y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float)x0; + chardata[i].yoff = (float)y0; + x = x + gw + 1; + if(y + gh + 1 > bottom_y) + bottom_y = y + gh + 1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar * b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct { + int width, height; + int x, y, bottom_y; +} stbrp_context; + +typedef struct { + unsigned char x; +} stbrp_node; + +struct stbrp_rect { + stbrp_coord x, y; + int id, w, h, was_packed; +}; + +static void stbrp_init_target(stbrp_context * con, int pw, int ph, stbrp_node * nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context * con, stbrp_rect * rects, int num_rects) +{ + int i; + for(i = 0; i < num_rects; ++i) { + if(con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if(con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if(con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for(; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int pw, int ph, int stride_in_bytes, + int padding, void * alloc_context) +{ + stbrp_context * context = (stbrp_context *)STBTT_malloc(sizeof(*context), alloc_context); + int num_nodes = pw - padding; + stbrp_node * nodes = (stbrp_node *)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); + + if(context == NULL || nodes == NULL) { + if(context != NULL) STBTT_free(context, alloc_context); + if(nodes != NULL) STBTT_free(nodes, alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); + + if(pixels) + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc) +{ + STBTT_free(spc->nodes, spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if(h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if(v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char)(total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < h; ++i) { + STBTT_assert(pixels[i * stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if(!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float) - (oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k; + int missing_glyph_added = 0; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char)spc->h_oversample; + ranges[i].v_oversample = (unsigned char)spc->v_oversample; + for(j = 0; j < ranges[i].num_chars; ++j) { + int x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if(glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } + else { + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + &x0, &y0, &x1, &y1); + rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); + rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); + if(glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, + float * sub_x, float * sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if(prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if(prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h, recip_v, sub_x, sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for(j = 0; j < ranges[i].num_chars; ++j) { + stbrp_rect * r = &rects[k]; + if(r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar * bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord)spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0, &y0, &x1, &y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w - spc->h_oversample + 1, + r->h - spc->v_oversample + 1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + glyph); + + if(spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if(spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16)r->x; + bc->y0 = (stbtt_int16)r->y; + bc->x1 = (stbtt_int16)(r->x + r->w); + bc->y1 = (stbtt_int16)(r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float)x0 * recip_h + sub_x; + bc->yoff = (float)y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if(glyph == 0) + missing_glyph = j; + } + else if(spc->skip_missing) { + return_value = 0; + } + else if(r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } + else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#endif + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *)spc->pack_info, rects, num_rects); +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#endif +{ + stbtt_fontinfo info; + int i, j, n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect * rects; + + // flag all characters as NOT packed + for(i = 0; i < num_ranges; ++i) + for(j = 0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for(i = 0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if(rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#endif +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#endif +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float)i_ascent * scale; + *descent = (float)i_descent * scale; + *lineGap = (float)i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar * b = chardata + char_index; + + if(align_to_integer) { + float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } + else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], + float hits[2][2]) +{ + float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; + float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; + float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; + float roperp = orig[1] * ray[0] - orig[0] * ray[1]; + + float a = q0perp - 2 * q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if(a != 0.0f) { + float discr = b * b - a * c; + if(discr > 0.0f) { + float rcpna = -1 / a; + float d = (float)STBTT_sqrt(discr); + s0 = (b + d) * rcpna; + s1 = (b - d) * rcpna; + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + if(d > 0.0f && s1 >= 0.0f && s1 <= 1.0f) { + if(num_s == 0) s0 = s1; + ++num_s; + } + } + } + else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + } + + if(num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0] * rayn_x + q0[1] * rayn_y; + float q1d = q1[0] * rayn_x + q1[1] * rayn_y; + float q2d = q2[0] * rayn_x + q2[1] * rayn_y; + float rod = orig[0] * rayn_x + orig[1] * rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; + hits[0][1] = a * s0 + b; + + if(num_s > 1) { + hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; + hits[1][1] = a * s1 + b; + return 2; + } + else { + return 1; + } + } +} + +static int equal(float * a, float * b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex * verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float)STBTT_fmod(y, 1.0f); + if(y_frac < 0.01f) + y += 0.01f; + else if(y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for(i = 0; i < nverts; ++i) { + if(verts[i].type == STBTT_vline) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].x, y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if(verts[i].type == STBTT_vcurve) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; + int x2 = (int)verts[i].x, y2 = (int)verts[i].y; + int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); + int by = STBTT_max(y0, STBTT_max(y1, y2)); + if(y > ay && y < by && x > ax) { + float q0[2], q1[2], q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if(equal(q0, q1) || equal(q1, q2)) { + x0 = (int)verts[i - 1].x; + y0 = (int)verts[i - 1].y; + x1 = (int)verts[i].x; + y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if(num_hits >= 1) + if(hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if(num_hits >= 2) + if(hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot(float x) +{ + if(x < 0) + return -(float)STBTT_pow(-x, 1.0f / 3.0f); + else + return (float)STBTT_pow(x, 1.0f / 3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float * r) +{ + float s = -a / 3; + float p = b - a * a / 3; + float q = a * (2 * a * a - 9 * b) / 27 + c; + float p3 = p * p * p; + float d = q * q + 4 * p3 / 27; + if(d >= 0) { + float z = (float)STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } + else { + float u = (float)STBTT_sqrt(-p / 3); + float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float)STBTT_cos(v); + float n = (float)STBTT_cos(v - 3.141592f / 2) * 1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0, iy0, ix1, iy1; + int w, h; + unsigned char * data; + + if(scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); + + // if empty, return NULL + if(ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if(width) *width = w; + if(height) *height = h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x, y, i, j; + float * precompute; + stbtt_vertex * verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *)STBTT_malloc(w * h, info->userdata); + precompute = (float *)STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for(i = 0, j = num_verts - 1; i < num_verts; j = i++) { + if(verts[i].type == STBTT_vline) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; + float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float len2 = bx * bx + by * by; + if(len2 != 0.0f) + precompute[i] = 1.0f / (bx * bx + by * by); + else + precompute[i] = 0.0f; + } + else + precompute[i] = 0.0f; + } + + for(y = iy0; y < iy1; ++y) { + for(x = ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float)x + 0.5f; + float sy = (float)y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, + verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for(i = 0; i < num_verts; ++i) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + + if(verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; + + float dist, dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; + STBTT_assert(i != 0); + if(dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1 - x0, dy = y1 - y0; + float px = x0 - sx, py = y0 - sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px * dx + py * dy) / (dx * dx + dy * dy); + if(t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); + float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); + float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); + float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if(sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { + int num = 0; + float ax = x1 - x0, ay = y1 - y0; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = { 0.f, 0.f, 0.f }; + float px, py, t, it, dist2; + float a_inv = precompute[i]; + if(a_inv == 0.0f) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3 * (ax * bx + ay * by); + float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); + float c = mx * ax + my * ay; + if(a == 0.0f) { // if a is 0, it's linear + if(b != 0.0f) { + res[num++] = -c / b; + } + } + else { + float discriminant = b * b - 4 * a * c; + if(discriminant < 0) + num = 0; + else { + float root = (float)STBTT_sqrt(discriminant); + res[0] = (-b - root) / (2 * a); + res[1] = (-b + root) / (2 * a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } + else { + float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; + float d = (mx * ax + my * ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + if(num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + } + } + } + if(winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if(val < 0) + val = 0; + else if(val > 255) + val = 255; + data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +#ifdef STBTT_STREAM_TYPE +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, STBTT_STREAM_TYPE s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#else +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, stbtt_uint8 * s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#endif +{ + stbtt_int32 i = 0; + + // convert utf16 to utf8 and compare the results while converting + while(len2) { + stbtt_uint16 ch = ttUSHORT(s2, s2offs); + if(ch < 0x80) { + if(i >= len1) return -1; + if(s1[i++] != ch) return -1; + } + else if(ch < 0x800) { + if(i + 1 >= len1) return -1; + if(s1[i++] != 0xc0 + (ch >> 6)) return -1; + if(s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } + else if(ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = ttUSHORT(s2, s2offs + 2); + if(i + 3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if(s1[i++] != 0xf0 + (c >> 18)) return -1; + if(s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c) & 0x3f)) return -1; + s2offs += 2; // plus another 2 below + len2 -= 2; + } + else if(ch >= 0xdc00 && ch < 0xe000) { + return -1; + } + else { + if(i + 2 >= len1) return -1; + if(s1[i++] != 0xe0 + (ch >> 12)) return -1; + if(s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; + } + s2offs += 2; + len2 -= 2; + } + return i; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, s2, s2offs, len2); +} +#else +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, char * s2, stbtt_uint32 s2offs, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, (stbtt_uint8 *)s2, s2offs, len2); +} +#endif +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID) +{ + stbtt_int32 i, count, stringOffset; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(font->data, offset, "name"); + if(!nm) return 0; + + count = ttUSHORT(font->data, nm + 2); + stringOffset = nm + ttUSHORT(font->data, nm + 4); + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if(platformID == ttUSHORT(font->data, loc + 0) && encodingID == ttUSHORT(font->data, loc + 2) + && languageID == ttUSHORT(font->data, loc + 4) && nameID == ttUSHORT(font->data, loc + 6)) { + *length = ttUSHORT(font->data, loc + 8); + return stringOffset + ttUSHORT(font->data, loc + 10); + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt__matchpair(STBTT_STREAM_TYPE fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#else +static int stbtt__matchpair(stbtt_uint8 * fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#endif +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc, nm + 2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc, nm + 4); + + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc, loc + 6); + if(id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc, loc + 0), encoding = ttUSHORT(fc, loc + 2), language = ttUSHORT(fc, loc + 4); + + // is this a Unicode encoding? + if(platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc, loc + 8); + stbtt_int32 off = ttUSHORT(fc, loc + 10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc, stringOffset + off, slen); + if(matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if(i + 1 < count && ttUSHORT(fc, loc + 12 + 6) == next_id && ttUSHORT(fc, loc + 12) == platform && + ttUSHORT(fc, loc + 12 + 2) == encoding && ttUSHORT(fc, loc + 12 + 4) == language) { + slen = ttUSHORT(fc, loc + 12 + 8); + off = ttUSHORT(fc, loc + 12 + 10); + if(slen == 0) { + if(matchlen == nlen) + return 1; + } + else if(matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; +#ifdef STBTT_STREAM_TYPE + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, fc, stringOffset + off, + slen)) +#else + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, (char *)fc, + stringOffset + off, slen)) +#endif + return 1; + } + } + else { + // if nothing immediately following + if(matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt__matches(STBTT_STREAM_TYPE fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#else + static int stbtt__matches(stbtt_uint8 * fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#endif + +{ + stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char *)name); + stbtt_uint32 nm, hd; + if(!stbtt__isfont(fc, offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if(flags) { + hd = stbtt__find_table(fc, offset, "head"); + if((ttUSHORT(fc, hd + 44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if(!nm) return 0; + + if(flags) { + if(name == NULL) return 1; + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if(stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + else { + if(name == NULL) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_FindMatchingFont_internal(STBTT_STREAM_TYPE font_collection, char * name_utf8, stbtt_int32 flags) +#else + static int stbtt_FindMatchingFont_internal(unsigned char * font_collection, char * name_utf8, stbtt_int32 flags) +#endif +{ + stbtt_int32 i; + for(i = 0;; ++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if(off < 0) return off; +#ifdef STBTT_STREAM_TYPE + if(stbtt__matches(font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#else + if(stbtt__matches((stbtt_uint8 *)font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#endif + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#endif +{ +#ifdef STBTT_STREAM_TYPE + return stbtt_BakeFontBitmap_internal(data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +#else + return stbtt_BakeFontBitmap_internal((unsigned char *)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, + chardata); +#endif +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal(data, index); +} +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *)data, index); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data) +{ + return stbtt_GetNumberOfFonts_internal(data); +} +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *)data); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset) +{ + return stbtt_InitFont_internal(info, data, offset); +} +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *)data, offset); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal(fontdata, (char *)name, flags); +} +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *)fontdata, (char *)name, flags); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, s2, s2offs, len2); +} +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, (char *)s2, s2offs, len2); +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.c b/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.c new file mode 100644 index 0000000..2185c28 --- /dev/null +++ b/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.c @@ -0,0 +1,289 @@ +/** + * @file lv_tjpgd.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_TJPGD + +#include "tjpgd.h" +#include "lv_tjpgd.h" +#include "../../misc/lv_fs.h" + +/********************* + * DEFINES + *********************/ +#define TJPGD_WORKBUFF_SIZE 4096 //Recommended by TJPGD library + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata); +static int is_jpg(const uint8_t * raw_data, size_t len); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_tjpgd_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_get_area_cb(dec, decoder_get_area); + lv_image_decoder_set_close_cb(dec, decoder_close); +} + +void lv_tjpgd_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + lv_image_src_t src_type = lv_image_src_get_type(src); + + if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + uint8_t * raw_data = (uint8_t *)img_dsc->data; + const uint32_t raw_data_size = img_dsc->data_size; + + if(is_jpg(raw_data, raw_data_size) == true) { +#if LV_USE_FS_MEMFS + header->cf = LV_COLOR_FORMAT_RAW; + header->w = img_dsc->header.w; + header->h = img_dsc->header.h; + header->stride = img_dsc->header.w * 3; + return LV_RESULT_OK; +#else + LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); + return LV_RESULT_INVALID; +#endif + } + } + else if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + if((lv_strcmp(lv_fs_get_ext(fn), "jpg") == 0) || (lv_strcmp(lv_fs_get_ext(fn), "jpeg") == 0)) { + lv_fs_file_t f; + lv_fs_res_t res; + res = lv_fs_open(&f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + + uint8_t workb[TJPGD_WORKBUFF_SIZE]; + JDEC jd; + JRESULT rc = jd_prepare(&jd, input_func, workb, TJPGD_WORKBUFF_SIZE, &f); + if(rc) { + LV_LOG_WARN("jd_prepare error: %d", rc); + lv_fs_close(&f); + return LV_RESULT_INVALID; + } + header->cf = LV_COLOR_FORMAT_RAW; + header->w = jd.width; + header->h = jd.height; + header->stride = jd.width * 3; + + lv_fs_close(&f); + return LV_RESULT_OK; + } + } + return LV_RESULT_INVALID; +} + +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata) +{ + lv_fs_file_t * f = jd->device; + if(!f) return 0; + + if(buff) { + uint32_t rn = 0; + lv_fs_read(f, buff, (uint32_t)ndata, &rn); + return rn; + } + else { + uint32_t pos; + lv_fs_tell(f, &pos); + lv_fs_seek(f, (uint32_t)(ndata + pos), LV_FS_SEEK_SET); + return ndata; + } + return 0; +} + +/** + * Decode a JPG image and return the decoded data. + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_fs_file_t * f = lv_malloc(sizeof(lv_fs_file_t)); + if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { +#if LV_USE_FS_MEMFS + const lv_image_dsc_t * img_dsc = dsc->src; + if(is_jpg(img_dsc->data, img_dsc->data_size) == true) { + lv_fs_path_ex_t path; + lv_fs_make_path_from_buffer(&path, LV_FS_MEMFS_LETTER, img_dsc->data, img_dsc->data_size); + lv_fs_res_t res; + res = lv_fs_open(f, (const char *)&path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + lv_free(f); + return LV_RESULT_INVALID; + } + } +#else + LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); + return LV_RESULT_INVALID; +#endif + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + if((lv_strcmp(lv_fs_get_ext(fn), "jpg") == 0) || (lv_strcmp(lv_fs_get_ext(fn), "jpeg") == 0)) { + lv_fs_res_t res; + res = lv_fs_open(f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + lv_free(f); + return LV_RESULT_INVALID; + } + } + } + + uint8_t * workb_temp = lv_malloc(TJPGD_WORKBUFF_SIZE); + JDEC * jd = lv_malloc(sizeof(JDEC)); + dsc->user_data = jd; + JRESULT rc = jd_prepare(jd, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, f); + if(rc) return rc; + + dsc->header.cf = LV_COLOR_FORMAT_RGB888; + dsc->header.w = jd->width; + dsc->header.h = jd->height; + dsc->header.stride = jd->width * 3; + + if(rc != JDR_OK) { + lv_free(workb_temp); + lv_free(jd); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); + LV_UNUSED(full_area); + + JDEC * jd = dsc->user_data; + lv_draw_buf_t * decoded = (void *)dsc->decoded; + if(decoded == NULL) decoded = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); + dsc->decoded = decoded; + + uint32_t mx, my; + mx = jd->msx * 8; + my = jd->msy * 8; /* Size of the MCU (pixel) */ + if(decoded_area->y1 == LV_COORD_MIN) { + decoded_area->y1 = 0; + decoded_area->y2 = my - 1; + decoded_area->x1 = -mx; + decoded_area->x2 = -1; + jd->scale = 0; + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ + jd->rst = 0; + jd->rsc = 0; + decoded->data = jd->workbuf; + decoded->header = dsc->header; + decoded->header.stride = mx * 3; + } + + decoded_area->x1 += mx; + decoded_area->x2 += mx; + + if(decoded_area->x1 >= jd->width) { + decoded_area->x1 = 0; + decoded_area->x2 = mx - 1; + decoded_area->y1 += my; + decoded_area->y2 += my; + } + + decoded->header.w = mx; + decoded->header.h = my; + decoded->data_size = decoded->header.stride * decoded->header.h; + + /* Process restart interval if enabled */ + JRESULT rc; + if(jd->nrst && jd->rst++ == jd->nrst) { + rc = jd_restart(jd, jd->rsc++); + if(rc != JDR_OK) return rc; + jd->rst = 1; + } + + /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ + rc = jd_mcu_load(jd); + if(rc != JDR_OK) return rc; + + /* Output the MCU (YCbCr to RGB, scaling and output) */ + rc = jd_mcu_output(jd, NULL, decoded_area->x1, decoded_area->y1); + if(rc != JDR_OK) return rc; + + return LV_RESULT_OK; +} + +/** + * Free the allocated resources + * @param decoder pointer to the decoder where this function belongs + * @param dsc pointer to a descriptor which describes this decoding session + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + JDEC * jd = dsc->user_data; + lv_fs_close(jd->device); + lv_free(jd->device); + lv_free(jd->pool_original); + lv_free(jd); + lv_free((void *)dsc->decoded); +} + +static int is_jpg(const uint8_t * raw_data, size_t len) +{ + const uint8_t jpg_signature[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46}; + if(len < sizeof(jpg_signature)) return false; + return memcmp(jpg_signature, raw_data, sizeof(jpg_signature)) == 0; +} + +#endif /*LV_USE_TJPGD*/ diff --git a/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.h b/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.h new file mode 100644 index 0000000..ec35800 --- /dev/null +++ b/libraries/lvgl/src/libs/tjpgd/lv_tjpgd.h @@ -0,0 +1,45 @@ +/** + * @file lv_tjpgd.h + * + */ + +#ifndef LV_TJPGD_H +#define LV_TJPGD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_TJPGD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_tjpgd_init(void); + +void lv_tjpgd_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TJPGD*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_TJPGD_H */ diff --git a/libraries/lvgl/src/libs/tjpgd/tjpgd.c b/libraries/lvgl/src/libs/tjpgd/tjpgd.c new file mode 100644 index 0000000..22dfd56 --- /dev/null +++ b/libraries/lvgl/src/libs/tjpgd/tjpgd.c @@ -0,0 +1,1137 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 (C)ChaN, 2021 +/-----------------------------------------------------------------------------/ +/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ * The TJpgDec module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Oct 04, 2011 R0.01 First release. +/ Feb 19, 2012 R0.01a Fixed decompression fails when scan starts with an escape seq. +/ Sep 03, 2012 R0.01b Added JD_TBLCLIP option. +/ Mar 16, 2019 R0.01c Supported stdint.h. +/ Jul 01, 2020 R0.01d Fixed wrong integer type usage. +/ May 08, 2021 R0.02 Supported grayscale image. Separated configuration options. +/ Jun 11, 2021 R0.02a Some performance improvement. +/ Jul 01, 2021 R0.03 Added JD_FASTDECODE option. +/ Some performance improvement. +/----------------------------------------------------------------------------*/ + +#include "tjpgd.h" + + +#if JD_FASTDECODE == 2 + #define HUFF_BIT 10 /* Bit length to apply fast huffman decode */ + #define HUFF_LEN (1 << HUFF_BIT) + #define HUFF_MASK (HUFF_LEN - 1) +#endif + + +/*-----------------------------------------------*/ +/* Zigzag-order to raster-order conversion table */ +/*-----------------------------------------------*/ + +static const uint8_t Zig[64] = { /* Zigzag-order to raster-order conversion table */ + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 +}; + + + +/*-------------------------------------------------*/ +/* Input scale factor of Arai algorithm */ +/* (scaled up 16 bits for fixed point operations) */ +/*-------------------------------------------------*/ + +static const uint16_t Ipsf[64] = { /* See also aa_idct.png */ + (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), + (uint16_t)(1.38704 * 8192), (uint16_t)(1.92388 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.38268 * 8192), + (uint16_t)(1.30656 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.70711 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.36048 * 8192), + (uint16_t)(1.17588 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.38268 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.32442 * 8192), + (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), + (uint16_t)(0.78570 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.61732 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.21677 * 8192), + (uint16_t)(0.54120 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.29290 * 8192), (uint16_t)(0.14932 * 8192), + (uint16_t)(0.27590 * 8192), (uint16_t)(0.38268 * 8192), (uint16_t)(0.36048 * 8192), (uint16_t)(0.32442 * 8192), (uint16_t)(0.27590 * 8192), (uint16_t)(0.21678 * 8192), (uint16_t)(0.14932 * 8192), (uint16_t)(0.07612 * 8192) +}; + + + +/*---------------------------------------------*/ +/* Conversion table for fast clipping process */ +/*---------------------------------------------*/ + +#if JD_TBLCLIP + +#define BYTECLIP(v) Clip8[(unsigned int)(v) & 0x3FF] + +static const uint8_t Clip8[1024] = { + /* 0..255 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + /* 256..511 */ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* -512..-257 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* -256..-1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#else /* JD_TBLCLIP */ + +static uint8_t BYTECLIP(int val) +{ + if(val < 0) return 0; + if(val > 255) return 255; + return (uint8_t)val; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Allocate a memory block from memory pool */ +/*-----------------------------------------------------------------------*/ + +static void * alloc_pool( /* Pointer to allocated memory block (NULL:no memory available) */ + JDEC * jd, /* Pointer to the decompressor object */ + size_t ndata /* Number of bytes to allocate */ +) +{ + char * rp = 0; + + + ndata = (ndata + 3) & ~3; /* Align block size to the word boundary */ + + if(jd->sz_pool >= ndata) { + jd->sz_pool -= ndata; + rp = (char *)jd->pool; /* Get start of available memory pool */ + jd->pool = (void *)(rp + ndata); /* Allocate required bytes */ + } + + return (void *)rp; /* Return allocated memory block (NULL:no memory to allocate) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create de-quantization and prescaling tables with a DQT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_qt_tbl( /* 0:OK, !0:Failed */ + JDEC * jd, /* Pointer to the decompressor object */ + const uint8_t * data, /* Pointer to the quantizer tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, zi; + uint8_t d; + int32_t * pb; + + + while(ndata) { /* Process all tables in the segment */ + if(ndata < 65) return JDR_FMT1; /* Err: table size is unaligned */ + ndata -= 65; + d = *data++; /* Get table property */ + if(d & 0xF0) return JDR_FMT1; /* Err: not 8-bit resolution */ + i = d & 3; /* Get table ID */ + pb = alloc_pool(jd, 64 * sizeof(int32_t)); /* Allocate a memory block for the table */ + if(!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->qttbl[i] = pb; /* Register the table */ + for(i = 0; i < 64; i++) { /* Load the table */ + zi = Zig[i]; /* Zigzag-order to raster-order conversion */ + pb[zi] = (int32_t)((uint32_t) * data++ * Ipsf[zi]); /* Apply scale factor of Arai algorithm to the de-quantizers */ + } + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create huffman code tables with a DHT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_huffman_tbl( /* 0:OK, !0:Failed */ + JDEC * jd, /* Pointer to the decompressor object */ + const uint8_t * data, /* Pointer to the packed huffman tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, j, b, cls, num; + size_t np; + uint8_t d, * pb, * pd; + uint16_t hc, * ph; + + + while(ndata) { /* Process all tables in the segment */ + if(ndata < 17) return JDR_FMT1; /* Err: wrong data size */ + ndata -= 17; + d = *data++; /* Get table number and class */ + if(d & 0xEE) return JDR_FMT1; /* Err: invalid class/number */ + cls = d >> 4; + num = d & 0x0F; /* class = dc(0)/ac(1), table number = 0/1 */ + pb = alloc_pool(jd, 16); /* Allocate a memory block for the bit distribution table */ + if(!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->huffbits[num][cls] = pb; + for(np = i = 0; i < 16; i++) { /* Load number of patterns for 1 to 16-bit code */ + np += (pb[i] = *data++); /* Get sum of code words for each code */ + } + ph = alloc_pool(jd, np * sizeof(uint16_t)); /* Allocate a memory block for the code word table */ + if(!ph) return JDR_MEM1; /* Err: not enough memory */ + jd->huffcode[num][cls] = ph; + hc = 0; + for(j = i = 0; i < 16; i++) { /* Re-build huffman code word table */ + b = pb[i]; + while(b--) ph[j++] = hc++; + hc <<= 1; + } + + if(ndata < np) return JDR_FMT1; /* Err: wrong data size */ + ndata -= np; + pd = alloc_pool(jd, np); /* Allocate a memory block for the decoded data */ + if(!pd) return JDR_MEM1; /* Err: not enough memory */ + jd->huffdata[num][cls] = pd; + for(i = 0; i < np; i++) { /* Load decoded data corresponds to each code word */ + d = *data++; + if(!cls && d > 11) return JDR_FMT1; + pd[i] = d; + } +#if JD_FASTDECODE == 2 + { /* Create fast huffman decode table */ + unsigned int span, td, ti; + uint16_t * tbl_ac = 0; + uint8_t * tbl_dc = 0; + + if(cls) { + tbl_ac = alloc_pool(jd, HUFF_LEN * sizeof(uint16_t)); /* LUT for AC elements */ + if(!tbl_ac) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_ac[num] = tbl_ac; + memset(tbl_ac, 0xFF, HUFF_LEN * sizeof(uint16_t)); /* Default value (0xFFFF: may be long code) */ + } + else { + tbl_dc = alloc_pool(jd, HUFF_LEN * sizeof(uint8_t)); /* LUT for AC elements */ + if(!tbl_dc) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_dc[num] = tbl_dc; + memset(tbl_dc, 0xFF, HUFF_LEN * sizeof(uint8_t)); /* Default value (0xFF: may be long code) */ + } + for(i = b = 0; b < HUFF_BIT; b++) { /* Create LUT */ + for(j = pb[b]; j; j--) { + ti = ph[i] << (HUFF_BIT - 1 - b) & HUFF_MASK; /* Index of input pattern for the code */ + if(cls) { + td = pd[i++] | ((b + 1) << 8); /* b15..b8: code length, b7..b0: zero run and data length */ + for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_ac[ti++] = (uint16_t)td) ; + } + else { + td = pd[i++] | ((b + 1) << 4); /* b7..b4: code length, b3..b0: data length */ + for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_dc[ti++] = (uint8_t)td) ; + } + } + } + jd->longofs[num][cls] = i; /* Code table offset for long code */ + } +#endif + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract a huffman decoded data from input stream */ +/*-----------------------------------------------------------------------*/ + +static int huffext( /* >=0: decoded data, <0: error code */ + JDEC * jd, /* Pointer to the decompressor object */ + unsigned int id, /* Table ID (0:Y, 1:C) */ + unsigned int cls /* Table class (0:DC, 1:AC) */ +) +{ + size_t dc = jd->dctr; + uint8_t * dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t bm, nd, bl; + const uint8_t * hb = jd->huffbits[id][cls]; /* Bit distribution table */ + const uint16_t * hc = jd->huffcode[id][cls]; /* Code word table */ + const uint8_t * hd = jd->huffdata[id][cls]; /* Data table */ + + + bm = jd->dbit; /* Bit mask to extract */ + d = 0; + bl = 16; /* Max code length */ + do { + if(!bm) { /* Next byte? */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be collapted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } + else { + if(*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + bm = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if(*dp & bm) d++; + bm >>= 1; + + for(nd = *hb++; nd; nd--) { /* Search the code word in this bit length */ + if(d == *hc++) { /* Matched? */ + jd->dbit = bm; + jd->dctr = dc; + jd->dptr = dp; + return *hd; /* Return the decoded data */ + } + hd++; + } + bl--; + } while(bl); + +#else + const uint8_t * hb, * hd; + const uint16_t * hc; + unsigned int nc, bl, wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while(wbit < 16) { /* Prepare 16 bits into the working register */ + if(jd->marker) { + d = 0xFF; /* Input stream has stalled for a marker. Generate stuff bits */ + } + else { + if(!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; + dc--; + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } + else { + if(d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Shift 8 bits in the working register */ + wbit += 8; + } + jd->dctr = dc; + jd->dptr = dp; + jd->wreg = w; + +#if JD_FASTDECODE == 2 + /* Table search for the short codes */ + d = (unsigned int)(w >> (wbit - HUFF_BIT)); /* Short code as table index */ + if(cls) { /* AC element */ + d = jd->hufflut_ac[id][d]; /* Table decode */ + if(d != 0xFFFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 8); /* Snip the code length */ + return d & 0xFF; /* b7..0: zero run and following data bits */ + } + } + else { /* DC element */ + d = jd->hufflut_dc[id][d]; /* Table decode */ + if(d != 0xFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 4); /* Snip the code length */ + return d & 0xF; /* b3..0: following data bits */ + } + } + + /* Incremental search for the codes longer than HUFF_BIT */ + hb = jd->huffbits[id][cls] + HUFF_BIT; /* Bit distribution table */ + hc = jd->huffcode[id][cls] + jd->longofs[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls] + jd->longofs[id][cls]; /* Data table */ + bl = HUFF_BIT + 1; +#else + /* Incremental search for all codes */ + hb = jd->huffbits[id][cls]; /* Bit distribution table */ + hc = jd->huffcode[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls]; /* Data table */ + bl = 1; +#endif + for(; bl <= 16; bl++) { /* Incremental search */ + nc = *hb++; + if(nc) { + d = w >> (wbit - bl); + do { /* Search the code word in this bit length */ + if(d == *hc++) { /* Matched? */ + jd->dbit = wbit - bl; /* Snip the huffman code */ + return *hd; /* Return the decoded data */ + } + hd++; + } while(--nc); + } + } +#endif + + return 0 - (int)JDR_FMT1; /* Err: code not found (may be collapted data) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract N bits from input stream */ +/*-----------------------------------------------------------------------*/ + +static int bitext( /* >=0: extracted data, <0: error code */ + JDEC * jd, /* Pointer to the decompressor object */ + unsigned int nbit /* Number of bits to extract (1 to 16) */ +) +{ + size_t dc = jd->dctr; + uint8_t * dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t mbit = jd->dbit; + + d = 0; + do { + if(!mbit) { /* Next byte? */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be collapted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } + else { + if(*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence */ + } + } + mbit = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if(*dp & mbit) d |= 1; + mbit >>= 1; + nbit--; + } while(nbit); + + jd->dbit = mbit; + jd->dctr = dc; + jd->dptr = dp; + return (int)d; + +#else + unsigned int wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while(wbit < nbit) { /* Prepare nbit bits into the working register */ + if(jd->marker) { + d = 0xFF; /* Input stream stalled, generate stuff bits */ + } + else { + if(!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; + dc--; + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } + else { + if(d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Get 8 bits into the working register */ + wbit += 8; + } + jd->wreg = w; + jd->dbit = wbit - nbit; + jd->dctr = dc; + jd->dptr = dp; + + return (int)(w >> ((wbit - nbit) % 32)); +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Process restart interval */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_restart( + JDEC * jd, /* Pointer to the decompressor object */ + uint16_t rstn /* Expected restert sequence number */ +) +{ + unsigned int i; + uint8_t * dp = jd->dptr; + size_t dc = jd->dctr; + +#if JD_FASTDECODE == 0 + uint16_t d = 0; + + /* Get two bytes from the input stream */ + for(i = 0; i < 2; i++) { + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return JDR_INP; + } + else { + dp++; + } + dc--; + d = d << 8 | *dp; /* Get a byte */ + } + jd->dptr = dp; + jd->dctr = dc; + jd->dbit = 0; + + /* Check the marker */ + if((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker is not detected (may be collapted data) */ + } + +#else + uint16_t marker; + + + if(jd->marker) { /* Generate a maker if it has been detected */ + marker = 0xFF00 | jd->marker; + jd->marker = 0; + } + else { + marker = 0; + for(i = 0; i < 2; i++) { /* Get a restart marker */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return JDR_INP; + } + marker = (marker << 8) | *dp++; /* Get a byte */ + dc--; + } + jd->dptr = dp; + jd->dctr = dc; + } + + /* Check the marker */ + if((marker & 0xFFD8) != 0xFFD0 || (marker & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker was not detected (may be collapted data) */ + } + + jd->dbit = 0; /* Discard stuff bits */ +#endif + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Reset DC offset */ + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Apply Inverse-DCT in Arai Algorithm (see also aa_idct.png) */ +/*-----------------------------------------------------------------------*/ + +static void block_idct( + int32_t * src, /* Input block data (de-quantized and pre-scaled for Arai Algorithm) */ + jd_yuv_t * dst /* Pointer to the destination to store the block as byte array */ +) +{ + const int32_t M13 = (int32_t)(1.41421 * 4096), M2 = (int32_t)(1.08239 * 4096), M4 = (int32_t)(2.61313 * 4096), + M5 = (int32_t)(1.84776 * 4096); + int32_t v0, v1, v2, v3, v4, v5, v6, v7; + int32_t t10, t11, t12, t13; + int i; + + /* Process columns */ + for(i = 0; i < 8; i++) { + v0 = src[8 * 0]; /* Get even elements */ + v1 = src[8 * 2]; + v2 = src[8 * 4]; + v3 = src[8 * 6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[8 * 7]; /* Get odd elements */ + v5 = src[8 * 1]; + v6 = src[8 * 5]; + v7 = src[8 * 3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + src[8 * 0] = v0 + v7; /* Write-back transformed values */ + src[8 * 7] = v0 - v7; + src[8 * 1] = v1 + v6; + src[8 * 6] = v1 - v6; + src[8 * 2] = v2 + v5; + src[8 * 5] = v2 - v5; + src[8 * 3] = v3 + v4; + src[8 * 4] = v3 - v4; + + src++; /* Next column */ + } + + /* Process rows */ + src -= 8; + for(i = 0; i < 8; i++) { + v0 = src[0] + (128L << 8); /* Get even elements (remove DC offset (-128) here) */ + v1 = src[2]; + v2 = src[4]; + v3 = src[6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[7]; /* Get odd elements */ + v5 = src[1]; + v6 = src[5]; + v7 = src[3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + /* Descale the transformed values 8 bits and output a row */ +#if JD_FASTDECODE >= 1 + dst[0] = (int16_t)((v0 + v7) >> 8); + dst[7] = (int16_t)((v0 - v7) >> 8); + dst[1] = (int16_t)((v1 + v6) >> 8); + dst[6] = (int16_t)((v1 - v6) >> 8); + dst[2] = (int16_t)((v2 + v5) >> 8); + dst[5] = (int16_t)((v2 - v5) >> 8); + dst[3] = (int16_t)((v3 + v4) >> 8); + dst[4] = (int16_t)((v3 - v4) >> 8); +#else + dst[0] = BYTECLIP((v0 + v7) >> 8); + dst[7] = BYTECLIP((v0 - v7) >> 8); + dst[1] = BYTECLIP((v1 + v6) >> 8); + dst[6] = BYTECLIP((v1 - v6) >> 8); + dst[2] = BYTECLIP((v2 + v5) >> 8); + dst[5] = BYTECLIP((v2 - v5) >> 8); + dst[3] = BYTECLIP((v3 + v4) >> 8); + dst[4] = BYTECLIP((v3 - v4) >> 8); +#endif + + dst += 8; + src += 8; /* Next row */ + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load all blocks in an MCU into working buffer */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_mcu_load( + JDEC * jd /* Pointer to the decompressor object */ +) +{ + int32_t * tmp = (int32_t *)jd->workbuf; /* Block working buffer for de-quantize and IDCT */ + int d, e; + unsigned int blk, nby, i, bc, z, id, cmp; + jd_yuv_t * bp; + const int32_t * dqf; + + + nby = jd->msx * jd->msy; /* Number of Y blocks (1, 2 or 4) */ + bp = jd->mcubuf; /* Pointer to the first block of MCU */ + + for(blk = 0; blk < nby + 2; blk++) { /* Get nby Y blocks and two C blocks */ + cmp = (blk < nby) ? 0 : blk - nby + 1; /* Component number 0:Y, 1:Cb, 2:Cr */ + + if(cmp && jd->ncomp != 3) { /* Clear C blocks if not exist (monochrome image) */ + for(i = 0; i < 64; bp[i++] = 128) ; + + } + else { /* Load Y/C blocks from input stream */ + id = cmp ? 1 : 0; /* Huffman table ID of this component */ + + /* Extract a DC element from input stream */ + d = huffext(jd, id, 0); /* Extract a huffman coded data (bit length) */ + if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input */ + bc = (unsigned int)d; + d = jd->dcv[cmp]; /* DC value of previous block */ + if(bc) { /* If there is any difference from previous block */ + e = bitext(jd, bc); /* Extract data bits */ + if(e < 0) return (JRESULT)(0 - e); /* Err: input */ + bc = 1 << (bc - 1); /* MSB position */ + if(!(e & bc)) e -= (bc << 1) - 1; /* Restore negative value if needed */ + d += e; /* Get current value */ + jd->dcv[cmp] = (int16_t)d; /* Save current DC value for next block */ + } + dqf = jd->qttbl[jd->qtid[cmp]]; /* De-quantizer table ID for this component */ + tmp[0] = d * dqf[0] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + + /* Extract following 63 AC elements from input stream */ + memset(&tmp[1], 0, 63 * sizeof(int32_t)); /* Initialize all AC elements */ + z = 1; /* Top of the AC elements (in zigzag-order) */ + do { + d = huffext(jd, id, 1); /* Extract a huffman coded value (zero runs and bit length) */ + if(d == 0) break; /* EOB? */ + if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input error */ + bc = (unsigned int)d; + z += bc >> 4; /* Skip leading zero run */ + if(z >= 64) return JDR_FMT1; /* Too long zero run */ + if(bc &= 0x0F) { /* Bit length? */ + d = bitext(jd, bc); /* Extract data bits */ + if(d < 0) return (JRESULT)(0 - d); /* Err: input device */ + bc = 1 << (bc - 1); /* MSB position */ + if(!(d & bc)) d -= (bc << 1) - 1; /* Restore negative value if needed */ + i = Zig[z]; /* Get raster-order index */ + tmp[i] = d * dqf[i] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + } + } while(++z < 64); /* Next AC element */ + + if(JD_FORMAT != 2 || !cmp) { /* C components may not be processed if in grayscale output */ + if(z == 1 || (JD_USE_SCALE && + jd->scale == + 3)) { /* If no AC element or scale ratio is 1/8, IDCT can be omitted and the block is filled with DC value */ + d = (jd_yuv_t)((*tmp / 256) + 128); + if(JD_FASTDECODE >= 1) { + for(i = 0; i < 64; bp[i++] = d) ; + } + else { + memset(bp, d, 64); + } + } + else { + block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ + } + } + } + + bp += 64; /* Next block */ + } + + return JDR_OK; /* All blocks have been loaded successfully */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Output an MCU: Convert YCrCb to RGB and output it in RGB form */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_mcu_output( + JDEC * jd, /* Pointer to the decompressor object */ + int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ + unsigned int x, /* MCU location in the image */ + unsigned int y /* MCU location in the image */ +) +{ + const int CVACC = (sizeof(int) > 2) ? 1024 : 128; /* Adaptive accuracy for both 16-/32-bit systems */ + unsigned int ix, iy, mx, my, rx, ry; + int yy, cb, cr; + jd_yuv_t * py, * pc; + uint8_t * pix; + JRECT rect; + + + mx = jd->msx * 8; + my = jd->msy * 8; /* MCU size (pixel) */ + rx = (x + mx <= jd->width) ? mx : jd->width - + x; /* Output rectangular size (it may be clipped at right/bottom end of image) */ + ry = (y + my <= jd->height) ? my : jd->height - y; + if(JD_USE_SCALE) { + rx >>= jd->scale; + ry >>= jd->scale; + if(!rx || !ry) return JDR_OK; /* Skip this MCU if all pixel is to be rounded off */ + x >>= jd->scale; + y >>= jd->scale; + } + rect.left = x; + rect.right = x + rx - 1; /* Rectangular area in the frame buffer */ + rect.top = y; + rect.bottom = y + ry - 1; + + + if(!JD_USE_SCALE || jd->scale != 3) { /* Not for 1/8 scaling */ + pix = (uint8_t *)jd->workbuf; + + if(JD_FORMAT != 2) { /* RGB output (build an RGB MCU from Y/C component) */ + for(iy = 0; iy < my; iy++) { + pc = py = jd->mcubuf; + if(my == 16) { /* Double block height? */ + pc += 64 * 4 + (iy >> 1) * 8; + if(iy >= 8) py += 64; + } + else { /* Single block height */ + pc += mx * 8 + iy * 8; + } + py += iy * 8; + for(ix = 0; ix < mx; ix++) { + cb = pc[0] - 128; /* Get Cb/Cr component and remove offset */ + cr = pc[64] - 128; + if(mx == 16) { /* Double block width? */ + if(ix == 8) py += 64 - 8; /* Jump to next block if double block height */ + pc += ix & 1; /* Step forward chroma pointer every two pixels */ + } + else { /* Single block width */ + pc++; /* Step forward chroma pointer every pixel */ + } + yy = *py++; /* Get Y component */ + *pix++ = /*B*/ BYTECLIP(yy + ((int)(1.772 * CVACC) * cb) / CVACC); + *pix++ = /*G*/ BYTECLIP(yy - ((int)(0.344 * CVACC) * cb + (int)(0.714 * CVACC) * cr) / CVACC); + *pix++ = /*R*/ BYTECLIP(yy + ((int)(1.402 * CVACC) * cr) / CVACC); + } + } + } + } + + /* Squeeze up pixel table if a part of MCU is to be truncated */ + mx >>= jd->scale; + if(rx < mx) { /* Is the MCU spans rigit edge? */ + uint8_t * s, * d; + unsigned int xi, yi; + + s = d = (uint8_t *)jd->workbuf; + for(yi = 0; yi < ry; yi++) { + for(xi = 0; xi < rx; xi++) { /* Copy effective pixels */ + *d++ = *s++; + if(JD_FORMAT != 2) { + *d++ = *s++; + *d++ = *s++; + } + } + s += (mx - rx) * (JD_FORMAT != 2 ? 3 : 1); /* Skip truncated pixels */ + } + } + + /* Convert RGB888 to RGB565 if needed */ + if(JD_FORMAT == 1) { + uint8_t * s = (uint8_t *)jd->workbuf; + uint16_t w, * d = (uint16_t *)s; + unsigned int n = rx * ry; + + do { + w = (*s++ & 0xF8) << 8; /* RRRRR----------- */ + w |= (*s++ & 0xFC) << 3; /* -----GGGGGG----- */ + w |= *s++ >> 3; /* -----------BBBBB */ + *d++ = w; + } while(--n); + } + + /* Output the rectangular */ + if(outfunc) return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR; + return 0; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Analyze the JPEG image and Initialize decompressor object */ +/*-----------------------------------------------------------------------*/ + +#define LDB_WORD(ptr) (uint16_t)(((uint16_t)*((uint8_t*)(ptr))<<8)|(uint16_t)*(uint8_t*)((ptr)+1)) + + +JRESULT jd_prepare( + JDEC * jd, /* Blank decompressor object */ + size_t (*infunc)(JDEC *, uint8_t *, size_t), /* JPEG strem input function */ + void * pool, /* Working buffer for the decompression session */ + size_t sz_pool, /* Size of working buffer */ + void * dev /* I/O device identifier for the session */ +) +{ + uint8_t * seg, b; + uint16_t marker; + unsigned int n, i, ofs; + size_t len; + JRESULT rc; + + + memset(jd, 0, sizeof( + JDEC)); /* Clear decompression object (this might be a problem if machine's null pointer is not all bits zero) */ + jd->pool = pool; /* Work memory */ + jd->pool_original = pool; + jd->sz_pool = sz_pool; /* Size of given work memory */ + jd->infunc = infunc; /* Stream input function */ + jd->device = dev; /* I/O device identifier */ + + jd->inbuf = seg = alloc_pool(jd, JD_SZBUF); /* Allocate stream input buffer */ + if(!seg) return JDR_MEM1; + + ofs = marker = 0; /* Find SOI marker */ + do { + if(jd->infunc(jd, seg, 1) != 1) return JDR_INP; /* Err: SOI was not detected */ + ofs++; + marker = marker << 8 | seg[0]; + } while(marker != 0xFFD8); + + for(;;) { /* Parse JPEG segments */ + /* Get a JPEG marker */ + if(jd->infunc(jd, seg, 4) != 4) return JDR_INP; + marker = LDB_WORD(seg); /* Marker */ + len = LDB_WORD(seg + 2); /* Length field */ + if(len <= 2 || (marker >> 8) != 0xFF) return JDR_FMT1; + len -= 2; /* Segent content size */ + ofs += 4 + len; /* Number of bytes loaded */ + + switch(marker & 0xFF) { + case 0xC0: /* SOF0 (baseline JPEG) */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->width = LDB_WORD(&seg[3]); /* Image width in unit of pixel */ + jd->height = LDB_WORD(&seg[1]); /* Image height in unit of pixel */ + jd->ncomp = seg[5]; /* Number of color components */ + if(jd->ncomp != 3 && jd->ncomp != 1) return JDR_FMT3; /* Err: Supports only Grayscale and Y/Cb/Cr */ + + /* Check each image component */ + for(i = 0; i < jd->ncomp; i++) { + b = seg[7 + 3 * i]; /* Get sampling factor */ + if(i == 0) { /* Y component */ + if(b != 0x11 && b != 0x22 && b != 0x21) { /* Check sampling factor */ + return JDR_FMT3; /* Err: Supports only 4:4:4, 4:2:0 or 4:2:2 */ + } + jd->msx = b >> 4; + jd->msy = b & 15; /* Size of MCU [blocks] */ + } + else { /* Cb/Cr component */ + if(b != 0x11) return JDR_FMT3; /* Err: Sampling factor of Cb/Cr must be 1 */ + } + jd->qtid[i] = seg[8 + 3 * i]; /* Get dequantizer table ID for this component */ + if(jd->qtid[i] > 3) return JDR_FMT3; /* Err: Invalid ID */ + } + break; + + case 0xDD: /* DRI - Define Restart Interval */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->nrst = LDB_WORD(seg); /* Get restart interval (MCUs) */ + break; + + case 0xC4: /* DHT - Define Huffman Tables */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_huffman_tbl(jd, seg, len); /* Create huffman tables */ + if(rc) return rc; + break; + + case 0xDB: /* DQT - Define Quaitizer Tables */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_qt_tbl(jd, seg, len); /* Create de-quantizer tables */ + if(rc) return rc; + break; + + case 0xDA: /* SOS - Start of Scan */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + if(!jd->width || !jd->height) return JDR_FMT1; /* Err: Invalid image size */ + if(seg[0] != jd->ncomp) return JDR_FMT3; /* Err: Wrong color components */ + + /* Check if all tables corresponding to each components have been loaded */ + for(i = 0; i < jd->ncomp; i++) { + b = seg[2 + 2 * i]; /* Get huffman table ID */ + if(b != 0x00 && b != 0x11) return JDR_FMT3; /* Err: Different table number for DC/AC element */ + n = i ? 1 : 0; /* Component class */ + if(!jd->huffbits[n][0] || !jd->huffbits[n][1]) { /* Check huffman table for this component */ + return JDR_FMT1; /* Err: Nnot loaded */ + } + if(!jd->qttbl[jd->qtid[i]]) { /* Check dequantizer table for this component */ + return JDR_FMT1; /* Err: Not loaded */ + } + } + + /* Allocate working buffer for MCU and pixel output */ + n = jd->msy * jd->msx; /* Number of Y blocks in the MCU */ + if(!n) return JDR_FMT1; /* Err: SOF0 has not been loaded */ + len = n * 64 * 2 + 64; /* Allocate buffer for IDCT and RGB output */ + if(len < 256) len = 256; /* but at least 256 byte is required for IDCT */ + jd->workbuf = alloc_pool(jd, + len); /* and it may occupy a part of following MCU working buffer for RGB output */ + if(!jd->workbuf) return JDR_MEM1; /* Err: not enough memory */ + jd->mcubuf = alloc_pool(jd, (n + 2) * 64 * sizeof(jd_yuv_t)); /* Allocate MCU working buffer */ + if(!jd->mcubuf) return JDR_MEM1; /* Err: not enough memory */ + + /* Align stream read offset to JD_SZBUF */ + if(ofs %= JD_SZBUF) { + jd->dctr = jd->infunc(jd, seg + ofs, (size_t)(JD_SZBUF - ofs)); + } + jd->dptr = seg + ofs - (JD_FASTDECODE ? 0 : 1); + + return JDR_OK; /* Initialization succeeded. Ready to decompress the JPEG image. */ + + case 0xC1: /* SOF1 */ + case 0xC2: /* SOF2 */ + case 0xC3: /* SOF3 */ + case 0xC5: /* SOF5 */ + case 0xC6: /* SOF6 */ + case 0xC7: /* SOF7 */ + case 0xC9: /* SOF9 */ + case 0xCA: /* SOF10 */ + case 0xCB: /* SOF11 */ + case 0xCD: /* SOF13 */ + case 0xCE: /* SOF14 */ + case 0xCF: /* SOF15 */ + case 0xD9: /* EOI */ + return JDR_FMT3; /* Unsuppoted JPEG standard (may be progressive JPEG) */ + + default: /* Unknown segment (comment, exif or etc..) */ + /* Skip segment data (null pointer specifies to remove data from the stream) */ + if(jd->infunc(jd, 0, len) != len) return JDR_INP; + } + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Start to decompress the JPEG picture */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_decomp( + JDEC * jd, /* Initialized decompression object */ + int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ + uint8_t scale /* Output de-scaling factor (0 to 3) */ +) +{ + unsigned int x, y, mx, my; + uint16_t rst, rsc; + JRESULT rc; + + + if(scale > (JD_USE_SCALE ? 3 : 0)) return JDR_PAR; + jd->scale = scale; + + mx = jd->msx * 8; + my = jd->msy * 8; /* Size of the MCU (pixel) */ + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ + rst = rsc = 0; + + rc = JDR_OK; + for(y = 0; y < jd->height; y += my) { /* Vertical loop of MCUs */ + for(x = 0; x < jd->width; x += mx) { /* Horizontal loop of MCUs */ + if(jd->nrst && rst++ == jd->nrst) { /* Process restart interval if enabled */ + rc = jd_restart(jd, rsc++); + if(rc != JDR_OK) return rc; + rst = 1; + } + rc = jd_mcu_load(jd); /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ + if(rc != JDR_OK) return rc; + rc = jd_mcu_output(jd, outfunc, x, y); /* Output the MCU (YCbCr to RGB, scaling and output) */ + if(rc != JDR_OK) return rc; + } + } + + return rc; +} diff --git a/libraries/lvgl/src/libs/tjpgd/tjpgd.h b/libraries/lvgl/src/libs/tjpgd/tjpgd.h new file mode 100644 index 0000000..f1b5788 --- /dev/null +++ b/libraries/lvgl/src/libs/tjpgd/tjpgd.h @@ -0,0 +1,103 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 include file (C)ChaN, 2021 +/----------------------------------------------------------------------------*/ +#ifndef DEF_TJPGDEC +#define DEF_TJPGDEC + +#ifdef __cplusplus +extern "C" { +#endif + +#include "tjpgdcnf.h" +#include +#include + +#if JD_FASTDECODE >= 1 +typedef int16_t jd_yuv_t; +#else +typedef uint8_t jd_yuv_t; +#endif + + +/* Error code */ +typedef enum { + JDR_OK = 0, /* 0: Succeeded */ + JDR_INTR, /* 1: Interrupted by output function */ + JDR_INP, /* 2: Device error or wrong termination of input stream */ + JDR_MEM1, /* 3: Insufficient memory pool for the image */ + JDR_MEM2, /* 4: Insufficient stream input buffer */ + JDR_PAR, /* 5: Parameter error */ + JDR_FMT1, /* 6: Data format error (may be broken data) */ + JDR_FMT2, /* 7: Right format but not supported */ + JDR_FMT3 /* 8: Not supported JPEG standard */ +} JRESULT; + + + +/* Rectangular region in the output image */ +typedef struct { + uint16_t left; /* Left end */ + uint16_t right; /* Right end */ + uint16_t top; /* Top end */ + uint16_t bottom; /* Bottom end */ +} JRECT; + + + +/* Decompressor object structure */ +typedef struct JDEC JDEC; +struct JDEC { + size_t dctr; /* Number of bytes available in the input buffer */ + uint8_t * dptr; /* Current data read ptr */ + uint8_t * inbuf; /* Bit stream input buffer */ + uint8_t dbit; /* Number of bits available in wreg or reading bit mask */ + uint8_t scale; /* Output scaling ratio */ + uint8_t msx, msy; /* MCU size in unit of block (width, height) */ + uint8_t qtid[3]; /* Quantization table ID of each component, Y, Cb, Cr */ + uint8_t ncomp; /* Number of color components 1:grayscale, 3:color */ + int16_t dcv[3]; /* Previous DC element of each component */ + uint16_t nrst; /* Restart interval */ + uint16_t rst; /* Restart count*/ + uint16_t rsc; /* Expected restart sequence ID*/ + uint16_t width, height; /* Size of the input image (pixel) */ + uint8_t * huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ + uint16_t * huffcode[2][2]; /* Huffman code word tables [id][dcac] */ + uint8_t * huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ + int32_t * qttbl[4]; /* Dequantizer tables [id] */ +#if JD_FASTDECODE >= 1 + uint32_t wreg; /* Working shift register */ + uint8_t marker; /* Detected marker (0:None) */ +#if JD_FASTDECODE == 2 + uint8_t longofs[2][2]; /* Table offset of long code [id][dcac] */ + uint16_t * hufflut_ac[2]; /* Fast huffman decode tables for AC short code [id] */ + uint8_t * hufflut_dc[2]; /* Fast huffman decode tables for DC short code [id] */ +#endif +#endif + void * workbuf; /* Working buffer for IDCT and RGB output */ + jd_yuv_t * mcubuf; /* Working buffer for the MCU */ + void * pool; /* Pointer to available memory pool */ + void * pool_original; /* Pointer to original pool */ + size_t sz_pool; /* Size of memory pool (bytes available) */ + size_t (*infunc)(JDEC *, uint8_t *, size_t); /* Pointer to jpeg stream input function */ + void * device; /* Pointer to I/O device identifier for the session */ +}; + + + +/* TJpgDec API functions */ +JRESULT jd_prepare(JDEC * jd, size_t (*infunc)(JDEC *, uint8_t *, size_t), void * pool, size_t sz_pool, void * dev); + +JRESULT jd_decomp(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), uint8_t scale); + +JRESULT jd_mcu_load(JDEC * jd); + +JRESULT jd_mcu_output(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), unsigned int x, unsigned int y); + +JRESULT jd_restart(JDEC * jd, uint16_t rstn); + + +#ifdef __cplusplus +} +#endif + +#endif /* _TJPGDEC */ diff --git a/libraries/lvgl/src/libs/tjpgd/tjpgdcnf.h b/libraries/lvgl/src/libs/tjpgd/tjpgdcnf.h new file mode 100644 index 0000000..dc27d6a --- /dev/null +++ b/libraries/lvgl/src/libs/tjpgd/tjpgdcnf.h @@ -0,0 +1,33 @@ +/*----------------------------------------------*/ +/* TJpgDec System Configurations R0.03 */ +/*----------------------------------------------*/ + +#define JD_SZBUF 512 +/* Specifies size of stream input buffer */ + +#define JD_FORMAT 0 +/* Specifies output pixel format. +/ 0: RGB888 (24-bit/pix) +/ 1: RGB565 (16-bit/pix) +/ 2: Grayscale (8-bit/pix) +*/ + +#define JD_USE_SCALE 0 +/* Switches output descaling feature. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_TBLCLIP 1 +/* Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_FASTDECODE 1 +/* Optimization level +/ 0: Basic optimization. Suitable for 8/16-bit MCUs. +/ 1: + 32-bit barrel shifter. Suitable for 32-bit MCUs. +/ 2: + Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM) +*/ + diff --git a/libraries/lvgl/src/lv_api_map_v8.h b/libraries/lvgl/src/lv_api_map_v8.h new file mode 100644 index 0000000..0b6da1b --- /dev/null +++ b/libraries/lvgl/src/lv_api_map_v8.h @@ -0,0 +1,280 @@ +/** + * @file lv_api_map_v8.h + * + */ + +#ifndef LV_API_MAP_V8_H +#define LV_API_MAP_V8_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_DISP_ROTATION_0 LV_DISPLAY_ROTATION_0 +#define LV_DISP_ROTATION_90 LV_DISPLAY_ROTATION_90 +#define LV_DISP_ROTATION_180 LV_DISPLAY_ROTATION_180 +#define LV_DISP_ROTATION_270 LV_DISPLAY_ROTATION_270 + +#define LV_DISP_RENDER_MODE_PARTIAL LV_DISPLAY_RENDER_MODE_PARTIAL +#define LV_DISP_RENDER_MODE_DIRECT LV_DISPLAY_RENDER_MODE_DIRECT +#define LV_DISP_RENDER_MODE_FULL LV_DISPLAY_RENDER_MODE_FULL + +#define LV_BTNMATRIX_BTN_NONE LV_BUTTONMATRIX_BUTTON_NONE + +#define LV_BTNMATRIX_CTRL_HIDDEN LV_BUTTONMATRIX_CTRL_HIDDEN +#define LV_BTNMATRIX_CTRL_NO_REPEAT LV_BUTTONMATRIX_CTRL_NO_REPEAT +#define LV_BTNMATRIX_CTRL_DISABLED LV_BUTTONMATRIX_CTRL_DISABLED +#define LV_BTNMATRIX_CTRL_CHECKABLE LV_BUTTONMATRIX_CTRL_CHECKABLE +#define LV_BTNMATRIX_CTRL_CHECKED LV_BUTTONMATRIX_CTRL_CHECKED +#define LV_BTNMATRIX_CTRL_CLICK_TRIG LV_BUTTONMATRIX_CTRL_CLICK_TRIG +#define LV_BTNMATRIX_CTRL_POPOVER LV_BUTTONMATRIX_CTRL_POPOVER +#define LV_BTNMATRIX_CTRL_CUSTOM_1 LV_BUTTONMATRIX_CTRL_CUSTOM_1 +#define LV_BTNMATRIX_CTRL_CUSTOM_2 LV_BUTTONMATRIX_CTRL_CUSTOM_2 + +/********************** + * TYPEDEFS + **********************/ +typedef int32_t lv_coord_t; +typedef lv_result_t lv_res_t; +typedef lv_image_dsc_t lv_img_dsc_t; +typedef lv_display_t lv_disp_t; +typedef lv_display_rotation_t lv_disp_rotation_t; +typedef lv_display_render_mode_t lv_disp_render_t; +typedef lv_anim_completed_cb_t lv_anim_ready_cb_t; +typedef lv_screen_load_anim_t lv_scr_load_anim_t; +typedef lv_buttonmatrix_ctrl_t lv_btnmatrix_ctrl_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_task_handler(void) +{ + return lv_timer_handler(); +} + +/** + * Move the object to the foreground. + * It will look like if it was created as the last child of its parent. + * It also means it can cover any of the siblings. + * @param obj pointer to an object + */ +static inline void lv_obj_move_foreground(lv_obj_t * obj) +{ + lv_obj_t * parent = lv_obj_get_parent(obj); + if(!parent) { + LV_LOG_WARN("parent is NULL"); + return; + } + + lv_obj_move_to_index(obj, lv_obj_get_child_count(parent) - 1); +} + +/** + * Move the object to the background. + * It will look like if it was created as the first child of its parent. + * It also means any of the siblings can cover the object. + * @param obj pointer to an object + */ +static inline void lv_obj_move_background(lv_obj_t * obj) +{ + lv_obj_move_to_index(obj, 0); +} + +/********************** + * MACROS + **********************/ +#define LV_RES_OK LV_RESULT_OK +#define LV_RES_INV LV_RESULT_INVALID + +#define LV_INDEV_STATE_PR LV_INDEV_STATE_PRESSED +#define LV_INDEV_STATE_REL LV_INDEV_STATE_RELEASED + +#define lv_obj_del lv_obj_delete +#define lv_obj_del_async lv_obj_delete_async +#define lv_obj_clear_flag lv_obj_remove_flag +#define lv_obj_clear_state lv_obj_remove_state + +#define lv_indev_set_disp lv_indev_set_display +#define lv_indev_get_act lv_indev_active +#define lv_scr_act lv_screen_active +#define lv_disp_remove lv_display_delete +#define lv_disp_set_default lv_display_set_default +#define lv_disp_get_default lv_display_get_default +#define lv_disp_get_next lv_display_get_next +#define lv_disp_set_rotation lv_display_set_rotation +#define lv_disp_get_hor_res lv_display_get_horizontal_resolution +#define lv_disp_get_ver_res lv_display_get_vertical_resolution +#define lv_disp_get_physical_hor_res lv_display_get_physical_horizontal_resolution +#define lv_disp_get_physical_ver_res lv_display_get_physical_vertical_resolution +#define lv_disp_get_offset_x lv_display_get_offset_x +#define lv_disp_get_offset_y lv_display_get_offset_y +#define lv_disp_get_rotation lv_display_get_rotation +#define lv_disp_get_dpi lv_display_get_dpi +#define lv_disp_get_antialiasing lv_display_get_antialiasing +#define lv_disp_flush_ready lv_display_flush_ready +#define lv_disp_flush_is_last lv_display_flush_is_last +#define lv_disp_get_scr_act lv_display_get_screen_active +#define lv_disp_get_scr_prev lv_display_get_screen_prev +#define lv_disp_load_scr lv_screen_load +#define lv_scr_load lv_screen_load +#define lv_scr_load_anim lv_screen_load_anim +#define lv_disp_get_layer_top lv_display_get_layer_top +#define lv_disp_get_layer_sys lv_display_get_layer_sys +#define lv_disp_send_event lv_display_send_event +#define lv_disp_set_theme lv_display_set_theme +#define lv_disp_get_theme lv_display_get_theme +#define lv_disp_get_inactive_time lv_display_get_inactive_time +#define lv_disp_trig_activity lv_display_trigger_activity +#define lv_disp_enable_invalidation lv_display_enable_invalidation +#define lv_disp_is_invalidation_enabled lv_display_is_invalidation_enabled +#define _lv_disp_refr_timer _lv_display_refr_timer +#define _lv_disp_get_refr_timer lv_display_get_refr_timer + +#define lv_timer_del lv_timer_delete + +#define lv_anim_del lv_anim_delete +#define lv_anim_del_all lv_anim_delete_all +#define lv_anim_set_ready_cb lv_anim_set_completed_cb + +#define lv_group_del lv_group_delete + +#define lv_txt_get_size lv_text_get_size +#define lv_txt_get_width lv_text_get_width + +#define lv_img_create lv_image_create +#define lv_img_set_src lv_image_set_src +#define lv_img_set_offset_x lv_image_set_offset_x +#define lv_img_set_offset_y lv_image_set_offset_y +#define lv_img_set_angle lv_image_set_rotation +#define lv_img_set_pivot lv_image_set_pivot +#define lv_img_set_zoom lv_image_set_scale +#define lv_img_set_antialias lv_image_set_antialias +#define lv_img_get_src lv_image_get_src +#define lv_img_get_offset_x lv_image_get_offset_x +#define lv_img_get_offset_y lv_image_get_offset_y +#define lv_img_get_angle lv_image_get_rotation +#define lv_img_get_pivot lv_image_get_pivot +#define lv_img_get_zoom lv_image_get_scale +#define lv_img_get_antialias lv_image_get_antialias + +#define lv_list_set_btn_text lv_list_set_button_text +#define lv_list_get_btn_text lv_list_get_button_text +#define lv_list_add_btn lv_list_add_button + +#define lv_btn_create lv_button_create + +#define lv_btnmatrix_create lv_buttonmatrix_create +#define lv_btnmatrix_set_map lv_buttonmatrix_set_map +#define lv_btnmatrix_set_ctrl_map lv_buttonmatrix_set_ctrl_map +#define lv_btnmatrix_set_selected_btn lv_buttonmatrix_set_selected_button +#define lv_btnmatrix_set_btn_ctrl lv_buttonmatrix_set_button_ctrl +#define lv_btnmatrix_clear_btn_ctrl lv_buttonmatrix_clear_button_ctrl +#define lv_btnmatrix_set_btn_ctrl_all lv_buttonmatrix_set_button_ctrl_all +#define lv_btnmatrix_clear_btn_ctrl_all lv_buttonmatrix_clear_button_ctrl_all +#define lv_btnmatrix_set_btn_width lv_buttonmatrix_set_button_width +#define lv_btnmatrix_set_one_checked lv_buttonmatrix_set_one_checked +#define lv_btnmatrix_get_map lv_buttonmatrix_get_map +#define lv_btnmatrix_get_selected_btn lv_buttonmatrix_get_selected_button +#define lv_btnmatrix_get_btn_text lv_buttonmatrix_get_button_text +#define lv_btnmatrix_has_button_ctrl lv_buttonmatrix_has_button_ctrl +#define lv_btnmatrix_get_one_checked lv_buttonmatrix_get_one_checked + +#define lv_tabview_get_tab_btns lv_tabview_get_tab_bar +#define lv_tabview_get_tab_act lv_tabview_get_tab_active +#define lv_tabview_set_act lv_tabview_set_active + +#define lv_tileview_get_tile_act lv_tileview_get_tile_active +#define lv_obj_set_tile_id lv_tileview_set_tile_by_index +#define lv_obj_set_tile lv_tileview_set_tile + +#define lv_roller_set_visible_row_cnt lv_roller_set_visible_row_count +#define lv_roller_get_option_cnt lv_roller_get_option_count + +#define lv_table_set_col_cnt lv_table_set_column_count +#define lv_table_set_row_cnt lv_table_set_row_count +#define lv_table_get_col_cnt lv_table_get_column_count +#define lv_table_get_row_cnt lv_table_get_row_count +#define lv_table_set_col_width lv_table_set_column_width +#define lv_table_get_col_width lv_table_get_column_width + +#define lv_dropdown_get_option_cnt lv_dropdown_get_option_count + +#define lv_obj_get_child_cnt lv_obj_get_child_count +#define lv_obj_get_disp lv_obj_get_display +#define lv_obj_delete_anim_ready_cb lv_obj_delete_anim_completed_cb + +#define LV_STYLE_ANIM_TIME LV_STYLE_ANIM_DURATION +#define LV_STYLE_IMG_OPA LV_STYLE_IMAGE_OPA +#define LV_STYLE_IMG_RECOLOR LV_STYLE_IMAGE_RECOLOR +#define LV_STYLE_IMG_RECOLOR_OPA LV_STYLE_IMAGE_RECOLOR_OPA +#define LV_STYLE_SHADOW_OFS_X LV_STYLE_SHADOW_OFFSET_X +#define LV_STYLE_SHADOW_OFS_Y LV_STYLE_SHADOW_OFFSET_Y +#define LV_STYLE_TRANSFORM_ANGLE LV_STYLE_TRANSFORM_ROTATION + +#define lv_obj_get_style_anim_time lv_obj_get_style_anim_duration +#define lv_obj_get_style_img_opa lv_obj_get_style_image_opa +#define lv_obj_get_style_img_recolor lv_obj_get_style_image_recolor +#define lv_obj_get_style_img_recolor_filtered lv_obj_get_style_image_recolor_filtered +#define lv_obj_get_style_img_recolor_opa lv_obj_get_style_image_recolor_opa +#define lv_obj_get_style_shadow_ofs_x lv_obj_get_style_shadow_offset_x +#define lv_obj_get_style_shadow_ofs_y lv_obj_get_style_shadow_offset_y +#define lv_obj_get_style_transform_angle lv_obj_get_style_transform_rotation +#define lv_obj_get_style_bg_img_src lv_obj_get_style_bg_image_src +#define lv_obj_get_style_bg_img_recolor lv_obj_get_style_bg_image_recolor +#define lv_obj_get_style_bg_img_recolor_opa lv_obj_get_style_bg_image_recolor_opa + +#define lv_obj_set_style_anim_time lv_obj_set_style_anim_duration +#define lv_obj_set_style_img_opa lv_obj_set_style_image_opa +#define lv_obj_set_style_img_recolor lv_obj_set_style_image_recolor +#define lv_obj_set_style_img_recolor_opa lv_obj_set_style_image_recolor_opa +#define lv_obj_set_style_shadow_ofs_x lv_obj_set_style_shadow_offset_x +#define lv_obj_set_style_shadow_ofs_y lv_obj_set_style_shadow_offset_y +#define lv_obj_set_style_transform_zoom lv_obj_set_style_transform_scale +#define lv_obj_set_style_transform_angle lv_obj_set_style_transform_rotation +#define lv_obj_set_style_bg_img_src lv_obj_set_style_bg_image_src +#define lv_obj_set_style_bg_img_recolor lv_obj_set_style_bg_image_recolor +#define lv_obj_set_style_bg_img_recolor_opa lv_obj_set_style_bg_image_recolor_opa + +#define lv_style_set_anim_time lv_style_set_anim_duration +#define lv_style_set_img_opa lv_style_set_image_opa +#define lv_style_set_img_recolor lv_style_set_image_recolor +#define lv_style_set_img_recolor_opa lv_style_set_image_recolor_opa +#define lv_style_set_shadow_ofs_x lv_style_set_shadow_offset_x +#define lv_style_set_shadow_ofs_y lv_style_set_shadow_offset_y +#define lv_style_set_transform_angle lv_style_set_transform_rotation +#define lv_style_set_transform_zoom lv_style_set_transform_scale +#define lv_style_set_bg_img_src lv_style_set_bg_image_src +#define lv_style_set_bg_img_recolor lv_style_set_bg_image_recolor +#define lv_style_set_bg_img_recolor_opa lv_style_set_bg_image_recolor_opa + +#define LV_ZOOM_NONE LV_SCALE_NONE + +#define lv_image_decoder_built_in_open lv_bin_decoder_open +#define lv_image_decoder_built_in_close lv_bin_decoder_close + +/********************** + * MACROS + **********************/ +/** Use this macro to declare an image in a C file*/ +#define LV_IMG_DECLARE(var_name) extern const lv_image_dsc_t var_name; + +/********************** + * DEPRECATED FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_API_MAP_V8_H*/ diff --git a/libraries/lvgl/src/lv_api_map_v9_0.h b/libraries/lvgl/src/lv_api_map_v9_0.h new file mode 100644 index 0000000..3992844 --- /dev/null +++ b/libraries/lvgl/src/lv_api_map_v9_0.h @@ -0,0 +1,52 @@ +/** + * @file lv_api_map_v9_0.h + * + */ + +#ifndef LV_API_MAP_V9_0_H +#define LV_API_MAP_V9_0_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ +#define lv_image_set_align lv_image_set_inner_align +#define lv_image_get_align lv_image_get_inner_align + +#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * DEPRECATED FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_API_MAP_V9_0_H*/ diff --git a/libraries/lvgl/src/lv_conf_internal.h b/libraries/lvgl/src/lv_conf_internal.h new file mode 100644 index 0000000..d6d7fd0 --- /dev/null +++ b/libraries/lvgl/src/lv_conf_internal.h @@ -0,0 +1,3230 @@ +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_conf_internal.h + * Make sure all the defines of lv_conf.h have a default value +**/ + +#ifndef LV_CONF_INTERNAL_H +#define LV_CONF_INTERNAL_H +/* clang-format off */ + +/*Config options*/ +#define LV_OS_NONE 0 +#define LV_OS_PTHREAD 1 +#define LV_OS_FREERTOS 2 +#define LV_OS_CMSIS_RTOS2 3 +#define LV_OS_RTTHREAD 4 +#define LV_OS_WINDOWS 5 +#define LV_OS_CUSTOM 255 + +#define LV_STDLIB_BUILTIN 0 +#define LV_STDLIB_CLIB 1 +#define LV_STDLIB_MICROPYTHON 2 +#define LV_STDLIB_RTTHREAD 3 +#define LV_STDLIB_CUSTOM 255 + +#define LV_DRAW_SW_ASM_NONE 0 +#define LV_DRAW_SW_ASM_NEON 1 +#define LV_DRAW_SW_ASM_HELIUM 2 +#define LV_DRAW_SW_ASM_CUSTOM 255 + +/* Handle special Kconfig options */ +#ifndef LV_KCONFIG_IGNORE + #include "lv_conf_kconfig.h" + #ifdef CONFIG_LV_CONF_SKIP + #define LV_CONF_SKIP + #endif +#endif + +/*If "lv_conf.h" is available from here try to use it later.*/ +#ifdef __has_include + #if __has_include("lv_conf.h") + #ifndef LV_CONF_INCLUDE_SIMPLE + #define LV_CONF_INCLUDE_SIMPLE + #endif + #endif +#endif + +/*If lv_conf.h is not skipped include it*/ +#ifndef LV_CONF_SKIP + #ifdef LV_CONF_PATH /*If there is a path defined for lv_conf.h use it*/ + #define __LV_TO_STR_AUX(x) #x + #define __LV_TO_STR(x) __LV_TO_STR_AUX(x) + #include __LV_TO_STR(LV_CONF_PATH) + #undef __LV_TO_STR_AUX + #undef __LV_TO_STR + #elif defined(LV_CONF_INCLUDE_SIMPLE) /*Or simply include lv_conf.h is enabled*/ + #include "lv_conf.h" + #else + #include "../../lv_conf.h" /*Else assume lv_conf.h is next to the lvgl folder*/ + #endif + #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK) + /* #include will sometimes silently fail when __has_include is used */ + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */ + #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors") + #endif +#endif + +#ifdef CONFIG_LV_COLOR_DEPTH + #define _LV_KCONFIG_PRESENT +#endif + +/*---------------------------------- + * Start parsing lv_conf_template.h + -----------------------------------*/ + +/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#ifndef LV_COLOR_DEPTH + #ifdef CONFIG_LV_COLOR_DEPTH + #define LV_COLOR_DEPTH CONFIG_LV_COLOR_DEPTH + #else + #define LV_COLOR_DEPTH 16 + #endif +#endif + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#ifndef LV_USE_STDLIB_MALLOC + #ifdef CONFIG_LV_USE_STDLIB_MALLOC + #define LV_USE_STDLIB_MALLOC CONFIG_LV_USE_STDLIB_MALLOC + #else + #define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN + #endif +#endif +#ifndef LV_USE_STDLIB_STRING + #ifdef CONFIG_LV_USE_STDLIB_STRING + #define LV_USE_STDLIB_STRING CONFIG_LV_USE_STDLIB_STRING + #else + #define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN + #endif +#endif +#ifndef LV_USE_STDLIB_SPRINTF + #ifdef CONFIG_LV_USE_STDLIB_SPRINTF + #define LV_USE_STDLIB_SPRINTF CONFIG_LV_USE_STDLIB_SPRINTF + #else + #define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + #endif +#endif + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #ifndef LV_MEM_SIZE + #ifdef CONFIG_LV_MEM_SIZE + #define LV_MEM_SIZE CONFIG_LV_MEM_SIZE + #else + #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ + #endif + #endif + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #ifndef LV_MEM_POOL_EXPAND_SIZE + #ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE + #define LV_MEM_POOL_EXPAND_SIZE CONFIG_LV_MEM_POOL_EXPAND_SIZE + #else + #define LV_MEM_POOL_EXPAND_SIZE 0 + #endif + #endif + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #ifndef LV_MEM_ADR + #ifdef CONFIG_LV_MEM_ADR + #define LV_MEM_ADR CONFIG_LV_MEM_ADR + #else + #define LV_MEM_ADR 0 /*0: unused*/ + #endif + #endif + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #ifndef LV_MEM_POOL_INCLUDE + #ifdef CONFIG_LV_MEM_POOL_INCLUDE + #define LV_MEM_POOL_INCLUDE CONFIG_LV_MEM_POOL_INCLUDE + #else + #undef LV_MEM_POOL_INCLUDE + #endif + #endif + #ifndef LV_MEM_POOL_ALLOC + #ifdef CONFIG_LV_MEM_POOL_ALLOC + #define LV_MEM_POOL_ALLOC CONFIG_LV_MEM_POOL_ALLOC + #else + #undef LV_MEM_POOL_ALLOC + #endif + #endif + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#ifndef LV_DEF_REFR_PERIOD + #ifdef CONFIG_LV_DEF_REFR_PERIOD + #define LV_DEF_REFR_PERIOD CONFIG_LV_DEF_REFR_PERIOD + #else + #define LV_DEF_REFR_PERIOD 33 /*[ms]*/ + #endif +#endif + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#ifndef LV_DPI_DEF + #ifdef CONFIG_LV_DPI_DEF + #define LV_DPI_DEF CONFIG_LV_DPI_DEF + #else + #define LV_DPI_DEF 130 /*[px/inch]*/ + #endif +#endif + +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#ifndef LV_USE_OS + #ifdef CONFIG_LV_USE_OS + #define LV_USE_OS CONFIG_LV_USE_OS + #else + #define LV_USE_OS LV_OS_NONE + #endif +#endif + +#if LV_USE_OS == LV_OS_CUSTOM + #ifndef LV_OS_CUSTOM_INCLUDE + #ifdef CONFIG_LV_OS_CUSTOM_INCLUDE + #define LV_OS_CUSTOM_INCLUDE CONFIG_LV_OS_CUSTOM_INCLUDE + #else + #define LV_OS_CUSTOM_INCLUDE + #endif + #endif +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#ifndef LV_DRAW_BUF_STRIDE_ALIGN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 0 + #endif + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 1 + #endif +#endif + +/*Align the start address of draw_buf addresses to this bytes*/ +#ifndef LV_DRAW_BUF_ALIGN + #ifdef CONFIG_LV_DRAW_BUF_ALIGN + #define LV_DRAW_BUF_ALIGN CONFIG_LV_DRAW_BUF_ALIGN + #else + #define LV_DRAW_BUF_ALIGN 4 + #endif +#endif + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/*The target buffer size for simple layer chunks.*/ +#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #ifdef CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #else + #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + #endif +#endif + +#ifndef LV_USE_DRAW_SW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DRAW_SW + #define LV_USE_DRAW_SW CONFIG_LV_USE_DRAW_SW + #else + #define LV_USE_DRAW_SW 0 + #endif + #else + #define LV_USE_DRAW_SW 1 + #endif +#endif +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #ifndef LV_DRAW_SW_DRAW_UNIT_CNT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT + #define LV_DRAW_SW_DRAW_UNIT_CNT CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT + #else + #define LV_DRAW_SW_DRAW_UNIT_CNT 0 + #endif + #else + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + #endif + #endif + + /* Use Arm-2D to accelerate the sw render */ + #ifndef LV_USE_DRAW_ARM2D_SYNC + #ifdef CONFIG_LV_USE_DRAW_ARM2D_SYNC + #define LV_USE_DRAW_ARM2D_SYNC CONFIG_LV_USE_DRAW_ARM2D_SYNC + #else + #define LV_USE_DRAW_ARM2D_SYNC 0 + #endif + #endif + + /* Enable native helium assembly to be compiled */ + #ifndef LV_USE_NATIVE_HELIUM_ASM + #ifdef CONFIG_LV_USE_NATIVE_HELIUM_ASM + #define LV_USE_NATIVE_HELIUM_ASM CONFIG_LV_USE_NATIVE_HELIUM_ASM + #else + #define LV_USE_NATIVE_HELIUM_ASM 0 + #endif + #endif + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #ifndef LV_DRAW_SW_COMPLEX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_COMPLEX + #define LV_DRAW_SW_COMPLEX CONFIG_LV_DRAW_SW_COMPLEX + #else + #define LV_DRAW_SW_COMPLEX 0 + #endif + #else + #define LV_DRAW_SW_COMPLEX 1 + #endif + #endif + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #ifndef LV_DRAW_SW_SHADOW_CACHE_SIZE + #ifdef CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE + #define LV_DRAW_SW_SHADOW_CACHE_SIZE CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE + #else + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + #endif + #endif + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #ifndef LV_DRAW_SW_CIRCLE_CACHE_SIZE + #ifdef CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE + #else + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + #endif + #endif + + #ifndef LV_USE_DRAW_SW_ASM + #ifdef CONFIG_LV_USE_DRAW_SW_ASM + #define LV_USE_DRAW_SW_ASM CONFIG_LV_USE_DRAW_SW_ASM + #else + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + #endif + #endif + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #ifndef LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #ifdef CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #else + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif + #endif + #endif +#endif + +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#ifndef LV_USE_DRAW_VGLITE + #ifdef CONFIG_LV_USE_DRAW_VGLITE + #define LV_USE_DRAW_VGLITE CONFIG_LV_USE_DRAW_VGLITE + #else + #define LV_USE_DRAW_VGLITE 0 + #endif +#endif + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #ifndef LV_USE_VGLITE_BLIT_SPLIT + #ifdef CONFIG_LV_USE_VGLITE_BLIT_SPLIT + #define LV_USE_VGLITE_BLIT_SPLIT CONFIG_LV_USE_VGLITE_BLIT_SPLIT + #else + #define LV_USE_VGLITE_BLIT_SPLIT 0 + #endif + #endif + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #ifndef LV_USE_VGLITE_DRAW_ASYNC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_VGLITE_DRAW_ASYNC + #define LV_USE_VGLITE_DRAW_ASYNC CONFIG_LV_USE_VGLITE_DRAW_ASYNC + #else + #define LV_USE_VGLITE_DRAW_ASYNC 0 + #endif + #else + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + #endif + #endif + + /* Enable VGLite asserts. */ + #ifndef LV_USE_VGLITE_ASSERT + #ifdef CONFIG_LV_USE_VGLITE_ASSERT + #define LV_USE_VGLITE_ASSERT CONFIG_LV_USE_VGLITE_ASSERT + #else + #define LV_USE_VGLITE_ASSERT 0 + #endif + #endif +#endif + +/* Use NXP's PXP on iMX RTxxx platforms. */ +#ifndef LV_USE_DRAW_PXP + #ifdef CONFIG_LV_USE_DRAW_PXP + #define LV_USE_DRAW_PXP CONFIG_LV_USE_DRAW_PXP + #else + #define LV_USE_DRAW_PXP 0 + #endif +#endif + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #ifndef LV_USE_PXP_ASSERT + #ifdef CONFIG_LV_USE_PXP_ASSERT + #define LV_USE_PXP_ASSERT CONFIG_LV_USE_PXP_ASSERT + #else + #define LV_USE_PXP_ASSERT 0 + #endif + #endif +#endif + +/* Use Renesas Dave2D on RA platforms. */ +#ifndef LV_USE_DRAW_DAVE2D + #ifdef CONFIG_LV_USE_DRAW_DAVE2D + #define LV_USE_DRAW_DAVE2D CONFIG_LV_USE_DRAW_DAVE2D + #else + #define LV_USE_DRAW_DAVE2D 0 + #endif +#endif + +/* Draw using cached SDL textures*/ +#ifndef LV_USE_DRAW_SDL + #ifdef CONFIG_LV_USE_DRAW_SDL + #define LV_USE_DRAW_SDL CONFIG_LV_USE_DRAW_SDL + #else + #define LV_USE_DRAW_SDL 0 + #endif +#endif + +/* Use VG-Lite GPU. */ +#ifndef LV_USE_DRAW_VG_LITE + #ifdef CONFIG_LV_USE_DRAW_VG_LITE + #define LV_USE_DRAW_VG_LITE CONFIG_LV_USE_DRAW_VG_LITE + #else + #define LV_USE_DRAW_VG_LITE 0 + #endif +#endif + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#ifndef LV_VG_LITE_USE_GPU_INIT + #ifdef CONFIG_LV_VG_LITE_USE_GPU_INIT + #define LV_VG_LITE_USE_GPU_INIT CONFIG_LV_VG_LITE_USE_GPU_INIT + #else + #define LV_VG_LITE_USE_GPU_INIT 0 + #endif +#endif + +/* Enable VG-Lite assert. */ +#ifndef LV_VG_LITE_USE_ASSERT + #ifdef CONFIG_LV_VG_LITE_USE_ASSERT + #define LV_VG_LITE_USE_ASSERT CONFIG_LV_VG_LITE_USE_ASSERT + #else + #define LV_VG_LITE_USE_ASSERT 0 + #endif +#endif + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#ifndef LV_VG_LITE_FLUSH_MAX_COUNT + #ifdef CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT + #define LV_VG_LITE_FLUSH_MAX_COUNT CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT + #else + #define LV_VG_LITE_FLUSH_MAX_COUNT 8 + #endif +#endif + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#ifndef LV_VG_LITE_USE_BOX_SHADOW + #ifdef CONFIG_LV_VG_LITE_USE_BOX_SHADOW + #define LV_VG_LITE_USE_BOX_SHADOW CONFIG_LV_VG_LITE_USE_BOX_SHADOW + #else + #define LV_VG_LITE_USE_BOX_SHADOW 0 + #endif +#endif + +/* VG-Lite gradient image maximum cache number. + * NOTE: The memory usage of a single gradient image is 4K bytes. + */ +#ifndef LV_VG_LITE_GRAD_CACHE_SIZE + #ifdef CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE + #define LV_VG_LITE_GRAD_CACHE_SIZE CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE + #else + #define LV_VG_LITE_GRAD_CACHE_SIZE 32 + #endif +#endif + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#ifndef LV_USE_LOG + #ifdef CONFIG_LV_USE_LOG + #define LV_USE_LOG CONFIG_LV_USE_LOG + #else + #define LV_USE_LOG 0 + #endif +#endif +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #ifndef LV_LOG_LEVEL + #ifdef CONFIG_LV_LOG_LEVEL + #define LV_LOG_LEVEL CONFIG_LV_LOG_LEVEL + #else + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + #endif + #endif + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #ifndef LV_LOG_PRINTF + #ifdef CONFIG_LV_LOG_PRINTF + #define LV_LOG_PRINTF CONFIG_LV_LOG_PRINTF + #else + #define LV_LOG_PRINTF 0 + #endif + #endif + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #ifndef LV_LOG_USE_TIMESTAMP + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_USE_TIMESTAMP + #define LV_LOG_USE_TIMESTAMP CONFIG_LV_LOG_USE_TIMESTAMP + #else + #define LV_LOG_USE_TIMESTAMP 0 + #endif + #else + #define LV_LOG_USE_TIMESTAMP 1 + #endif + #endif + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #ifndef LV_LOG_USE_FILE_LINE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_USE_FILE_LINE + #define LV_LOG_USE_FILE_LINE CONFIG_LV_LOG_USE_FILE_LINE + #else + #define LV_LOG_USE_FILE_LINE 0 + #endif + #else + #define LV_LOG_USE_FILE_LINE 1 + #endif + #endif + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #ifndef LV_LOG_TRACE_MEM + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_MEM + #define LV_LOG_TRACE_MEM CONFIG_LV_LOG_TRACE_MEM + #else + #define LV_LOG_TRACE_MEM 0 + #endif + #else + #define LV_LOG_TRACE_MEM 1 + #endif + #endif + #ifndef LV_LOG_TRACE_TIMER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_TIMER + #define LV_LOG_TRACE_TIMER CONFIG_LV_LOG_TRACE_TIMER + #else + #define LV_LOG_TRACE_TIMER 0 + #endif + #else + #define LV_LOG_TRACE_TIMER 1 + #endif + #endif + #ifndef LV_LOG_TRACE_INDEV + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_INDEV + #define LV_LOG_TRACE_INDEV CONFIG_LV_LOG_TRACE_INDEV + #else + #define LV_LOG_TRACE_INDEV 0 + #endif + #else + #define LV_LOG_TRACE_INDEV 1 + #endif + #endif + #ifndef LV_LOG_TRACE_DISP_REFR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_DISP_REFR + #define LV_LOG_TRACE_DISP_REFR CONFIG_LV_LOG_TRACE_DISP_REFR + #else + #define LV_LOG_TRACE_DISP_REFR 0 + #endif + #else + #define LV_LOG_TRACE_DISP_REFR 1 + #endif + #endif + #ifndef LV_LOG_TRACE_EVENT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_EVENT + #define LV_LOG_TRACE_EVENT CONFIG_LV_LOG_TRACE_EVENT + #else + #define LV_LOG_TRACE_EVENT 0 + #endif + #else + #define LV_LOG_TRACE_EVENT 1 + #endif + #endif + #ifndef LV_LOG_TRACE_OBJ_CREATE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_OBJ_CREATE + #define LV_LOG_TRACE_OBJ_CREATE CONFIG_LV_LOG_TRACE_OBJ_CREATE + #else + #define LV_LOG_TRACE_OBJ_CREATE 0 + #endif + #else + #define LV_LOG_TRACE_OBJ_CREATE 1 + #endif + #endif + #ifndef LV_LOG_TRACE_LAYOUT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_LAYOUT + #define LV_LOG_TRACE_LAYOUT CONFIG_LV_LOG_TRACE_LAYOUT + #else + #define LV_LOG_TRACE_LAYOUT 0 + #endif + #else + #define LV_LOG_TRACE_LAYOUT 1 + #endif + #endif + #ifndef LV_LOG_TRACE_ANIM + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_ANIM + #define LV_LOG_TRACE_ANIM CONFIG_LV_LOG_TRACE_ANIM + #else + #define LV_LOG_TRACE_ANIM 0 + #endif + #else + #define LV_LOG_TRACE_ANIM 1 + #endif + #endif + #ifndef LV_LOG_TRACE_CACHE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_CACHE + #define LV_LOG_TRACE_CACHE CONFIG_LV_LOG_TRACE_CACHE + #else + #define LV_LOG_TRACE_CACHE 0 + #endif + #else + #define LV_LOG_TRACE_CACHE 1 + #endif + #endif + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#ifndef LV_USE_ASSERT_NULL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_NULL + #define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL + #else + #define LV_USE_ASSERT_NULL 0 + #endif + #else + #define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_MALLOC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_MALLOC + #define LV_USE_ASSERT_MALLOC CONFIG_LV_USE_ASSERT_MALLOC + #else + #define LV_USE_ASSERT_MALLOC 0 + #endif + #else + #define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_STYLE + #ifdef CONFIG_LV_USE_ASSERT_STYLE + #define LV_USE_ASSERT_STYLE CONFIG_LV_USE_ASSERT_STYLE + #else + #define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_MEM_INTEGRITY + #ifdef CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #define LV_USE_ASSERT_MEM_INTEGRITY CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #else + #define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ + #endif +#endif +#ifndef LV_USE_ASSERT_OBJ + #ifdef CONFIG_LV_USE_ASSERT_OBJ + #define LV_USE_ASSERT_OBJ CONFIG_LV_USE_ASSERT_OBJ + #else + #define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + #endif +#endif + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#ifndef LV_ASSERT_HANDLER_INCLUDE + #ifdef CONFIG_LV_ASSERT_HANDLER_INCLUDE + #define LV_ASSERT_HANDLER_INCLUDE CONFIG_LV_ASSERT_HANDLER_INCLUDE + #else + #define LV_ASSERT_HANDLER_INCLUDE + #endif +#endif +#ifndef LV_ASSERT_HANDLER + #ifdef CONFIG_LV_ASSERT_HANDLER + #define LV_ASSERT_HANDLER CONFIG_LV_ASSERT_HANDLER + #else + #define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + #endif +#endif + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#ifndef LV_USE_REFR_DEBUG + #ifdef CONFIG_LV_USE_REFR_DEBUG + #define LV_USE_REFR_DEBUG CONFIG_LV_USE_REFR_DEBUG + #else + #define LV_USE_REFR_DEBUG 0 + #endif +#endif + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#ifndef LV_USE_LAYER_DEBUG + #ifdef CONFIG_LV_USE_LAYER_DEBUG + #define LV_USE_LAYER_DEBUG CONFIG_LV_USE_LAYER_DEBUG + #else + #define LV_USE_LAYER_DEBUG 0 + #endif +#endif + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#ifndef LV_USE_PARALLEL_DRAW_DEBUG + #ifdef CONFIG_LV_USE_PARALLEL_DRAW_DEBUG + #define LV_USE_PARALLEL_DRAW_DEBUG CONFIG_LV_USE_PARALLEL_DRAW_DEBUG + #else + #define LV_USE_PARALLEL_DRAW_DEBUG 0 + #endif +#endif + +/*------------- + * Others + *-----------*/ + +#ifndef LV_ENABLE_GLOBAL_CUSTOM + #ifdef CONFIG_LV_ENABLE_GLOBAL_CUSTOM + #define LV_ENABLE_GLOBAL_CUSTOM CONFIG_LV_ENABLE_GLOBAL_CUSTOM + #else + #define LV_ENABLE_GLOBAL_CUSTOM 0 + #endif +#endif +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #ifndef LV_GLOBAL_CUSTOM_INCLUDE + #ifdef CONFIG_LV_GLOBAL_CUSTOM_INCLUDE + #define LV_GLOBAL_CUSTOM_INCLUDE CONFIG_LV_GLOBAL_CUSTOM_INCLUDE + #else + #define LV_GLOBAL_CUSTOM_INCLUDE + #endif + #endif +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#ifndef LV_CACHE_DEF_SIZE + #ifdef CONFIG_LV_CACHE_DEF_SIZE + #define LV_CACHE_DEF_SIZE CONFIG_LV_CACHE_DEF_SIZE + #else + #define LV_CACHE_DEF_SIZE 0 + #endif +#endif + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#ifndef LV_IMAGE_HEADER_CACHE_DEF_CNT + #ifdef CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT + #define LV_IMAGE_HEADER_CACHE_DEF_CNT CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT + #else + #define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + #endif +#endif + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#ifndef LV_GRADIENT_MAX_STOPS + #ifdef CONFIG_LV_GRADIENT_MAX_STOPS + #define LV_GRADIENT_MAX_STOPS CONFIG_LV_GRADIENT_MAX_STOPS + #else + #define LV_GRADIENT_MAX_STOPS 2 + #endif +#endif + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#ifndef LV_COLOR_MIX_ROUND_OFS + #ifdef CONFIG_LV_COLOR_MIX_ROUND_OFS + #define LV_COLOR_MIX_ROUND_OFS CONFIG_LV_COLOR_MIX_ROUND_OFS + #else + #define LV_COLOR_MIX_ROUND_OFS 0 + #endif +#endif + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#ifndef LV_OBJ_STYLE_CACHE + #ifdef CONFIG_LV_OBJ_STYLE_CACHE + #define LV_OBJ_STYLE_CACHE CONFIG_LV_OBJ_STYLE_CACHE + #else + #define LV_OBJ_STYLE_CACHE 0 + #endif +#endif + +/* Add `id` field to `lv_obj_t` */ +#ifndef LV_USE_OBJ_ID + #ifdef CONFIG_LV_USE_OBJ_ID + #define LV_USE_OBJ_ID CONFIG_LV_USE_OBJ_ID + #else + #define LV_USE_OBJ_ID 0 + #endif +#endif + +/* Use lvgl builtin method for obj ID */ +#ifndef LV_USE_OBJ_ID_BUILTIN + #ifdef CONFIG_LV_USE_OBJ_ID_BUILTIN + #define LV_USE_OBJ_ID_BUILTIN CONFIG_LV_USE_OBJ_ID_BUILTIN + #else + #define LV_USE_OBJ_ID_BUILTIN 0 + #endif +#endif + +/*Use obj property set/get API*/ +#ifndef LV_USE_OBJ_PROPERTY + #ifdef CONFIG_LV_USE_OBJ_PROPERTY + #define LV_USE_OBJ_PROPERTY CONFIG_LV_USE_OBJ_PROPERTY + #else + #define LV_USE_OBJ_PROPERTY 0 + #endif +#endif + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#ifndef LV_USE_VG_LITE_THORVG + #ifdef CONFIG_LV_USE_VG_LITE_THORVG + #define LV_USE_VG_LITE_THORVG CONFIG_LV_USE_VG_LITE_THORVG + #else + #define LV_USE_VG_LITE_THORVG 0 + #endif +#endif + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #ifndef LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #ifdef CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #else + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + #endif + #endif + + /*Enable YUV color format support*/ + #ifndef LV_VG_LITE_THORVG_YUV_SUPPORT + #ifdef CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT + #define LV_VG_LITE_THORVG_YUV_SUPPORT CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT + #else + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + #endif + #endif + + /*Enable 16 pixels alignment*/ + #ifndef LV_VG_LITE_THORVG_16PIXELS_ALIGN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN + #else + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 0 + #endif + #else + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + #endif + #endif + + /*Buffer address alignment*/ + #ifndef LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #ifdef CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #else + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + #endif + #endif + + /*Enable multi-thread render*/ + #ifndef LV_VG_LITE_THORVG_THREAD_RENDER + #ifdef CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER + #define LV_VG_LITE_THORVG_THREAD_RENDER CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER + #else + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + #endif + #endif + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#ifndef LV_BIG_ENDIAN_SYSTEM + #ifdef CONFIG_LV_BIG_ENDIAN_SYSTEM + #define LV_BIG_ENDIAN_SYSTEM CONFIG_LV_BIG_ENDIAN_SYSTEM + #else + #define LV_BIG_ENDIAN_SYSTEM 0 + #endif +#endif + +/*Define a custom attribute to `lv_tick_inc` function*/ +#ifndef LV_ATTRIBUTE_TICK_INC + #ifdef CONFIG_LV_ATTRIBUTE_TICK_INC + #define LV_ATTRIBUTE_TICK_INC CONFIG_LV_ATTRIBUTE_TICK_INC + #else + #define LV_ATTRIBUTE_TICK_INC + #endif +#endif + +/*Define a custom attribute to `lv_timer_handler` function*/ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER + #ifdef CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #define LV_ATTRIBUTE_TIMER_HANDLER CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #else + #define LV_ATTRIBUTE_TIMER_HANDLER + #endif +#endif + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#ifndef LV_ATTRIBUTE_FLUSH_READY + #ifdef CONFIG_LV_ATTRIBUTE_FLUSH_READY + #define LV_ATTRIBUTE_FLUSH_READY CONFIG_LV_ATTRIBUTE_FLUSH_READY + #else + #define LV_ATTRIBUTE_FLUSH_READY + #endif +#endif + +/*Required alignment size for buffers*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN_SIZE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 0 + #endif + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + #endif +#endif + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #else + #define LV_ATTRIBUTE_MEM_ALIGN + #endif +#endif + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#ifndef LV_ATTRIBUTE_LARGE_CONST + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_CONST + #define LV_ATTRIBUTE_LARGE_CONST CONFIG_LV_ATTRIBUTE_LARGE_CONST + #else + #define LV_ATTRIBUTE_LARGE_CONST + #endif +#endif + +/*Compiler prefix for a big array declaration in RAM*/ +#ifndef LV_ATTRIBUTE_LARGE_RAM_ARRAY + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #else + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY + #endif +#endif + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#ifndef LV_ATTRIBUTE_FAST_MEM + #ifdef CONFIG_LV_ATTRIBUTE_FAST_MEM + #define LV_ATTRIBUTE_FAST_MEM CONFIG_LV_ATTRIBUTE_FAST_MEM + #else + #define LV_ATTRIBUTE_FAST_MEM + #endif +#endif + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#ifndef LV_EXPORT_CONST_INT + #ifdef CONFIG_LV_EXPORT_CONST_INT + #define LV_EXPORT_CONST_INT CONFIG_LV_EXPORT_CONST_INT + #else + #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + #endif +#endif + +/*Prefix all global extern data with this*/ +#ifndef LV_ATTRIBUTE_EXTERN_DATA + #ifdef CONFIG_LV_ATTRIBUTE_EXTERN_DATA + #define LV_ATTRIBUTE_EXTERN_DATA CONFIG_LV_ATTRIBUTE_EXTERN_DATA + #else + #define LV_ATTRIBUTE_EXTERN_DATA + #endif +#endif + +/* Use `float` as `lv_value_precise_t` */ +#ifndef LV_USE_FLOAT + #ifdef CONFIG_LV_USE_FLOAT + #define LV_USE_FLOAT CONFIG_LV_USE_FLOAT + #else + #define LV_USE_FLOAT 0 + #endif +#endif + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#ifndef LV_FONT_MONTSERRAT_8 + #ifdef CONFIG_LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 CONFIG_LV_FONT_MONTSERRAT_8 + #else + #define LV_FONT_MONTSERRAT_8 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_10 + #ifdef CONFIG_LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 CONFIG_LV_FONT_MONTSERRAT_10 + #else + #define LV_FONT_MONTSERRAT_10 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_12 + #ifdef CONFIG_LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 CONFIG_LV_FONT_MONTSERRAT_12 + #else + #define LV_FONT_MONTSERRAT_12 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_14 + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 CONFIG_LV_FONT_MONTSERRAT_14 + #else + #define LV_FONT_MONTSERRAT_14 0 + #endif + #else + #define LV_FONT_MONTSERRAT_14 1 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_16 + #ifdef CONFIG_LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 CONFIG_LV_FONT_MONTSERRAT_16 + #else + #define LV_FONT_MONTSERRAT_16 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_18 + #ifdef CONFIG_LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 CONFIG_LV_FONT_MONTSERRAT_18 + #else + #define LV_FONT_MONTSERRAT_18 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_20 + #ifdef CONFIG_LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 CONFIG_LV_FONT_MONTSERRAT_20 + #else + #define LV_FONT_MONTSERRAT_20 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_22 + #ifdef CONFIG_LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 CONFIG_LV_FONT_MONTSERRAT_22 + #else + #define LV_FONT_MONTSERRAT_22 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_24 + #ifdef CONFIG_LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 CONFIG_LV_FONT_MONTSERRAT_24 + #else + #define LV_FONT_MONTSERRAT_24 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_26 + #ifdef CONFIG_LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 CONFIG_LV_FONT_MONTSERRAT_26 + #else + #define LV_FONT_MONTSERRAT_26 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_28 + #ifdef CONFIG_LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 CONFIG_LV_FONT_MONTSERRAT_28 + #else + #define LV_FONT_MONTSERRAT_28 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_30 + #ifdef CONFIG_LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 CONFIG_LV_FONT_MONTSERRAT_30 + #else + #define LV_FONT_MONTSERRAT_30 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_32 + #ifdef CONFIG_LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 CONFIG_LV_FONT_MONTSERRAT_32 + #else + #define LV_FONT_MONTSERRAT_32 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_34 + #ifdef CONFIG_LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 CONFIG_LV_FONT_MONTSERRAT_34 + #else + #define LV_FONT_MONTSERRAT_34 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_36 + #ifdef CONFIG_LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 CONFIG_LV_FONT_MONTSERRAT_36 + #else + #define LV_FONT_MONTSERRAT_36 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_38 + #ifdef CONFIG_LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 CONFIG_LV_FONT_MONTSERRAT_38 + #else + #define LV_FONT_MONTSERRAT_38 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_40 + #ifdef CONFIG_LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 CONFIG_LV_FONT_MONTSERRAT_40 + #else + #define LV_FONT_MONTSERRAT_40 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_42 + #ifdef CONFIG_LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 CONFIG_LV_FONT_MONTSERRAT_42 + #else + #define LV_FONT_MONTSERRAT_42 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_44 + #ifdef CONFIG_LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 CONFIG_LV_FONT_MONTSERRAT_44 + #else + #define LV_FONT_MONTSERRAT_44 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_46 + #ifdef CONFIG_LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 CONFIG_LV_FONT_MONTSERRAT_46 + #else + #define LV_FONT_MONTSERRAT_46 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_48 + #ifdef CONFIG_LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 CONFIG_LV_FONT_MONTSERRAT_48 + #else + #define LV_FONT_MONTSERRAT_48 0 + #endif +#endif + +/*Demonstrate special features*/ +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #ifdef CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #else + #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ + #endif +#endif +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #ifdef CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #else + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ + #endif +#endif +#ifndef LV_FONT_SIMSUN_16_CJK + #ifdef CONFIG_LV_FONT_SIMSUN_16_CJK + #define LV_FONT_SIMSUN_16_CJK CONFIG_LV_FONT_SIMSUN_16_CJK + #else + #define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + #endif +#endif + +/*Pixel perfect monospace fonts*/ +#ifndef LV_FONT_UNSCII_8 + #ifdef CONFIG_LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 CONFIG_LV_FONT_UNSCII_8 + #else + #define LV_FONT_UNSCII_8 0 + #endif +#endif +#ifndef LV_FONT_UNSCII_16 + #ifdef CONFIG_LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 CONFIG_LV_FONT_UNSCII_16 + #else + #define LV_FONT_UNSCII_16 0 + #endif +#endif + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#ifndef LV_FONT_CUSTOM_DECLARE + #ifdef CONFIG_LV_FONT_CUSTOM_DECLARE + #define LV_FONT_CUSTOM_DECLARE CONFIG_LV_FONT_CUSTOM_DECLARE + #else + #define LV_FONT_CUSTOM_DECLARE + #endif +#endif + +/*Always set a default font*/ +#ifndef LV_FONT_DEFAULT + #ifdef CONFIG_LV_FONT_DEFAULT + #define LV_FONT_DEFAULT CONFIG_LV_FONT_DEFAULT + #else + #define LV_FONT_DEFAULT &lv_font_montserrat_14 + #endif +#endif + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#ifndef LV_FONT_FMT_TXT_LARGE + #ifdef CONFIG_LV_FONT_FMT_TXT_LARGE + #define LV_FONT_FMT_TXT_LARGE CONFIG_LV_FONT_FMT_TXT_LARGE + #else + #define LV_FONT_FMT_TXT_LARGE 0 + #endif +#endif + +/*Enables/disables support for compressed fonts.*/ +#ifndef LV_USE_FONT_COMPRESSED + #ifdef CONFIG_LV_USE_FONT_COMPRESSED + #define LV_USE_FONT_COMPRESSED CONFIG_LV_USE_FONT_COMPRESSED + #else + #define LV_USE_FONT_COMPRESSED 0 + #endif +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#ifndef LV_USE_FONT_PLACEHOLDER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER + #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER + #else + #define LV_USE_FONT_PLACEHOLDER 0 + #endif + #else + #define LV_USE_FONT_PLACEHOLDER 1 + #endif +#endif + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#ifndef LV_TXT_ENC + #ifdef CONFIG_LV_TXT_ENC + #define LV_TXT_ENC CONFIG_LV_TXT_ENC + #else + #define LV_TXT_ENC LV_TXT_ENC_UTF8 + #endif +#endif + +/*Can break (wrap) texts on these chars*/ +#ifndef LV_TXT_BREAK_CHARS + #ifdef CONFIG_LV_TXT_BREAK_CHARS + #define LV_TXT_BREAK_CHARS CONFIG_LV_TXT_BREAK_CHARS + #else + #define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + #endif +#endif + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#ifndef LV_TXT_LINE_BREAK_LONG_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #define LV_TXT_LINE_BREAK_LONG_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_LEN 0 + #endif +#endif + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#ifndef LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + #endif +#endif + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#ifndef LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + #endif +#endif + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#ifndef LV_USE_BIDI + #ifdef CONFIG_LV_USE_BIDI + #define LV_USE_BIDI CONFIG_LV_USE_BIDI + #else + #define LV_USE_BIDI 0 + #endif +#endif +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #ifndef LV_BIDI_BASE_DIR_DEF + #ifdef CONFIG_LV_BIDI_BASE_DIR_DEF + #define LV_BIDI_BASE_DIR_DEF CONFIG_LV_BIDI_BASE_DIR_DEF + #else + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO + #endif + #endif +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#ifndef LV_USE_ARABIC_PERSIAN_CHARS + #ifdef CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #define LV_USE_ARABIC_PERSIAN_CHARS CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #else + #define LV_USE_ARABIC_PERSIAN_CHARS 0 + #endif +#endif + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#ifndef LV_WIDGETS_HAS_DEFAULT_VALUE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE + #define LV_WIDGETS_HAS_DEFAULT_VALUE CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE + #else + #define LV_WIDGETS_HAS_DEFAULT_VALUE 0 + #endif + #else + #define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + #endif +#endif + +#ifndef LV_USE_ANIMIMG + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ANIMIMG + #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG + #else + #define LV_USE_ANIMIMG 0 + #endif + #else + #define LV_USE_ANIMIMG 1 + #endif +#endif + +#ifndef LV_USE_ARC + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ARC + #define LV_USE_ARC CONFIG_LV_USE_ARC + #else + #define LV_USE_ARC 0 + #endif + #else + #define LV_USE_ARC 1 + #endif +#endif + +#ifndef LV_USE_BAR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BAR + #define LV_USE_BAR CONFIG_LV_USE_BAR + #else + #define LV_USE_BAR 0 + #endif + #else + #define LV_USE_BAR 1 + #endif +#endif + +#ifndef LV_USE_BUTTON + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BUTTON + #define LV_USE_BUTTON CONFIG_LV_USE_BUTTON + #else + #define LV_USE_BUTTON 0 + #endif + #else + #define LV_USE_BUTTON 1 + #endif +#endif + +#ifndef LV_USE_BUTTONMATRIX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BUTTONMATRIX + #define LV_USE_BUTTONMATRIX CONFIG_LV_USE_BUTTONMATRIX + #else + #define LV_USE_BUTTONMATRIX 0 + #endif + #else + #define LV_USE_BUTTONMATRIX 1 + #endif +#endif + +#ifndef LV_USE_CALENDAR + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR + #define LV_USE_CALENDAR CONFIG_LV_USE_CALENDAR + #else + #define LV_USE_CALENDAR 0 + #endif + #else + #define LV_USE_CALENDAR 1 + #endif +#endif +#if LV_USE_CALENDAR + #ifndef LV_CALENDAR_WEEK_STARTS_MONDAY + #ifdef CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_WEEK_STARTS_MONDAY CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #else + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #endif + #endif + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #endif + #endif + #else + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + #endif + #endif + + #ifndef LV_CALENDAR_DEFAULT_MONTH_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #define LV_CALENDAR_DEFAULT_MONTH_NAMES CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #else + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_ARROW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #define LV_USE_CALENDAR_HEADER_ARROW CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #else + #define LV_USE_CALENDAR_HEADER_ARROW 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_DROPDOWN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #define LV_USE_CALENDAR_HEADER_DROPDOWN CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 + #endif + #endif +#endif /*LV_USE_CALENDAR*/ + +#ifndef LV_USE_CANVAS + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CANVAS + #define LV_USE_CANVAS CONFIG_LV_USE_CANVAS + #else + #define LV_USE_CANVAS 0 + #endif + #else + #define LV_USE_CANVAS 1 + #endif +#endif + +#ifndef LV_USE_CHART + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHART + #define LV_USE_CHART CONFIG_LV_USE_CHART + #else + #define LV_USE_CHART 0 + #endif + #else + #define LV_USE_CHART 1 + #endif +#endif + +#ifndef LV_USE_CHECKBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHECKBOX + #define LV_USE_CHECKBOX CONFIG_LV_USE_CHECKBOX + #else + #define LV_USE_CHECKBOX 0 + #endif + #else + #define LV_USE_CHECKBOX 1 + #endif +#endif + +#ifndef LV_USE_DROPDOWN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DROPDOWN + #define LV_USE_DROPDOWN CONFIG_LV_USE_DROPDOWN + #else + #define LV_USE_DROPDOWN 0 + #endif + #else + #define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + #endif +#endif + +#ifndef LV_USE_IMAGE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMAGE + #define LV_USE_IMAGE CONFIG_LV_USE_IMAGE + #else + #define LV_USE_IMAGE 0 + #endif + #else + #define LV_USE_IMAGE 1 /*Requires: lv_label*/ + #endif +#endif + +#ifndef LV_USE_IMAGEBUTTON + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMAGEBUTTON + #define LV_USE_IMAGEBUTTON CONFIG_LV_USE_IMAGEBUTTON + #else + #define LV_USE_IMAGEBUTTON 0 + #endif + #else + #define LV_USE_IMAGEBUTTON 1 + #endif +#endif + +#ifndef LV_USE_KEYBOARD + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_KEYBOARD + #define LV_USE_KEYBOARD CONFIG_LV_USE_KEYBOARD + #else + #define LV_USE_KEYBOARD 0 + #endif + #else + #define LV_USE_KEYBOARD 1 + #endif +#endif + +#ifndef LV_USE_LABEL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LABEL + #define LV_USE_LABEL CONFIG_LV_USE_LABEL + #else + #define LV_USE_LABEL 0 + #endif + #else + #define LV_USE_LABEL 1 + #endif +#endif +#if LV_USE_LABEL + #ifndef LV_LABEL_TEXT_SELECTION + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_TEXT_SELECTION + #define LV_LABEL_TEXT_SELECTION CONFIG_LV_LABEL_TEXT_SELECTION + #else + #define LV_LABEL_TEXT_SELECTION 0 + #endif + #else + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #endif + #endif + #ifndef LV_LABEL_LONG_TXT_HINT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_LONG_TXT_HINT + #define LV_LABEL_LONG_TXT_HINT CONFIG_LV_LABEL_LONG_TXT_HINT + #else + #define LV_LABEL_LONG_TXT_HINT 0 + #endif + #else + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #endif + #endif + #ifndef LV_LABEL_WAIT_CHAR_COUNT + #ifdef CONFIG_LV_LABEL_WAIT_CHAR_COUNT + #define LV_LABEL_WAIT_CHAR_COUNT CONFIG_LV_LABEL_WAIT_CHAR_COUNT + #else + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ + #endif + #endif +#endif + +#ifndef LV_USE_LED + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LED + #define LV_USE_LED CONFIG_LV_USE_LED + #else + #define LV_USE_LED 0 + #endif + #else + #define LV_USE_LED 1 + #endif +#endif + +#ifndef LV_USE_LINE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LINE + #define LV_USE_LINE CONFIG_LV_USE_LINE + #else + #define LV_USE_LINE 0 + #endif + #else + #define LV_USE_LINE 1 + #endif +#endif + +#ifndef LV_USE_LIST + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LIST + #define LV_USE_LIST CONFIG_LV_USE_LIST + #else + #define LV_USE_LIST 0 + #endif + #else + #define LV_USE_LIST 1 + #endif +#endif + +#ifndef LV_USE_MENU + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MENU + #define LV_USE_MENU CONFIG_LV_USE_MENU + #else + #define LV_USE_MENU 0 + #endif + #else + #define LV_USE_MENU 1 + #endif +#endif + +#ifndef LV_USE_MSGBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MSGBOX + #define LV_USE_MSGBOX CONFIG_LV_USE_MSGBOX + #else + #define LV_USE_MSGBOX 0 + #endif + #else + #define LV_USE_MSGBOX 1 + #endif +#endif + +#ifndef LV_USE_ROLLER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ROLLER + #define LV_USE_ROLLER CONFIG_LV_USE_ROLLER + #else + #define LV_USE_ROLLER 0 + #endif + #else + #define LV_USE_ROLLER 1 /*Requires: lv_label*/ + #endif +#endif + +#ifndef LV_USE_SCALE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SCALE + #define LV_USE_SCALE CONFIG_LV_USE_SCALE + #else + #define LV_USE_SCALE 0 + #endif + #else + #define LV_USE_SCALE 1 + #endif +#endif + +#ifndef LV_USE_SLIDER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SLIDER + #define LV_USE_SLIDER CONFIG_LV_USE_SLIDER + #else + #define LV_USE_SLIDER 0 + #endif + #else + #define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + #endif +#endif + +#ifndef LV_USE_SPAN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPAN + #define LV_USE_SPAN CONFIG_LV_USE_SPAN + #else + #define LV_USE_SPAN 0 + #endif + #else + #define LV_USE_SPAN 1 + #endif +#endif +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #ifndef LV_SPAN_SNIPPET_STACK_SIZE + #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #else + #define LV_SPAN_SNIPPET_STACK_SIZE 64 + #endif + #endif +#endif + +#ifndef LV_USE_SPINBOX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINBOX + #define LV_USE_SPINBOX CONFIG_LV_USE_SPINBOX + #else + #define LV_USE_SPINBOX 0 + #endif + #else + #define LV_USE_SPINBOX 1 + #endif +#endif + +#ifndef LV_USE_SPINNER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINNER + #define LV_USE_SPINNER CONFIG_LV_USE_SPINNER + #else + #define LV_USE_SPINNER 0 + #endif + #else + #define LV_USE_SPINNER 1 + #endif +#endif + +#ifndef LV_USE_SWITCH + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SWITCH + #define LV_USE_SWITCH CONFIG_LV_USE_SWITCH + #else + #define LV_USE_SWITCH 0 + #endif + #else + #define LV_USE_SWITCH 1 + #endif +#endif + +#ifndef LV_USE_TEXTAREA + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TEXTAREA + #define LV_USE_TEXTAREA CONFIG_LV_USE_TEXTAREA + #else + #define LV_USE_TEXTAREA 0 + #endif + #else + #define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ + #endif +#endif +#if LV_USE_TEXTAREA != 0 + #ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #ifdef CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #else + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ + #endif + #endif +#endif + +#ifndef LV_USE_TABLE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABLE + #define LV_USE_TABLE CONFIG_LV_USE_TABLE + #else + #define LV_USE_TABLE 0 + #endif + #else + #define LV_USE_TABLE 1 + #endif +#endif + +#ifndef LV_USE_TABVIEW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABVIEW + #define LV_USE_TABVIEW CONFIG_LV_USE_TABVIEW + #else + #define LV_USE_TABVIEW 0 + #endif + #else + #define LV_USE_TABVIEW 1 + #endif +#endif + +#ifndef LV_USE_TILEVIEW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TILEVIEW + #define LV_USE_TILEVIEW CONFIG_LV_USE_TILEVIEW + #else + #define LV_USE_TILEVIEW 0 + #endif + #else + #define LV_USE_TILEVIEW 1 + #endif +#endif + +#ifndef LV_USE_WIN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_WIN + #define LV_USE_WIN CONFIG_LV_USE_WIN + #else + #define LV_USE_WIN 0 + #endif + #else + #define LV_USE_WIN 1 + #endif +#endif + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#ifndef LV_USE_THEME_DEFAULT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_DEFAULT + #define LV_USE_THEME_DEFAULT CONFIG_LV_USE_THEME_DEFAULT + #else + #define LV_USE_THEME_DEFAULT 0 + #endif + #else + #define LV_USE_THEME_DEFAULT 1 + #endif +#endif +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #ifndef LV_THEME_DEFAULT_DARK + #ifdef CONFIG_LV_THEME_DEFAULT_DARK + #define LV_THEME_DEFAULT_DARK CONFIG_LV_THEME_DEFAULT_DARK + #else + #define LV_THEME_DEFAULT_DARK 0 + #endif + #endif + + /*1: Enable grow on press*/ + #ifndef LV_THEME_DEFAULT_GROW + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_THEME_DEFAULT_GROW + #define LV_THEME_DEFAULT_GROW CONFIG_LV_THEME_DEFAULT_GROW + #else + #define LV_THEME_DEFAULT_GROW 0 + #endif + #else + #define LV_THEME_DEFAULT_GROW 1 + #endif + #endif + + /*Default transition time in [ms]*/ + #ifndef LV_THEME_DEFAULT_TRANSITION_TIME + #ifdef CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #define LV_THEME_DEFAULT_TRANSITION_TIME CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #else + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 + #endif + #endif +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#ifndef LV_USE_THEME_SIMPLE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_SIMPLE + #define LV_USE_THEME_SIMPLE CONFIG_LV_USE_THEME_SIMPLE + #else + #define LV_USE_THEME_SIMPLE 0 + #endif + #else + #define LV_USE_THEME_SIMPLE 1 + #endif +#endif + +/*A theme designed for monochrome displays*/ +#ifndef LV_USE_THEME_MONO + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_MONO + #define LV_USE_THEME_MONO CONFIG_LV_USE_THEME_MONO + #else + #define LV_USE_THEME_MONO 0 + #endif + #else + #define LV_USE_THEME_MONO 1 + #endif +#endif + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#ifndef LV_USE_FLEX + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FLEX + #define LV_USE_FLEX CONFIG_LV_USE_FLEX + #else + #define LV_USE_FLEX 0 + #endif + #else + #define LV_USE_FLEX 1 + #endif +#endif + +/*A layout similar to Grid in CSS.*/ +#ifndef LV_USE_GRID + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_GRID + #define LV_USE_GRID CONFIG_LV_USE_GRID + #else + #define LV_USE_GRID 0 + #endif + #else + #define LV_USE_GRID 1 + #endif +#endif + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#ifndef LV_USE_FS_STDIO + #ifdef CONFIG_LV_USE_FS_STDIO + #define LV_USE_FS_STDIO CONFIG_LV_USE_FS_STDIO + #else + #define LV_USE_FS_STDIO 0 + #endif +#endif +#if LV_USE_FS_STDIO + #ifndef LV_FS_STDIO_LETTER + #ifdef CONFIG_LV_FS_STDIO_LETTER + #define LV_FS_STDIO_LETTER CONFIG_LV_FS_STDIO_LETTER + #else + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_STDIO_PATH + #ifdef CONFIG_LV_FS_STDIO_PATH + #define LV_FS_STDIO_PATH CONFIG_LV_FS_STDIO_PATH + #else + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_STDIO_CACHE_SIZE + #ifdef CONFIG_LV_FS_STDIO_CACHE_SIZE + #define LV_FS_STDIO_CACHE_SIZE CONFIG_LV_FS_STDIO_CACHE_SIZE + #else + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for open, read, etc*/ +#ifndef LV_USE_FS_POSIX + #ifdef CONFIG_LV_USE_FS_POSIX + #define LV_USE_FS_POSIX CONFIG_LV_USE_FS_POSIX + #else + #define LV_USE_FS_POSIX 0 + #endif +#endif +#if LV_USE_FS_POSIX + #ifndef LV_FS_POSIX_LETTER + #ifdef CONFIG_LV_FS_POSIX_LETTER + #define LV_FS_POSIX_LETTER CONFIG_LV_FS_POSIX_LETTER + #else + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_POSIX_PATH + #ifdef CONFIG_LV_FS_POSIX_PATH + #define LV_FS_POSIX_PATH CONFIG_LV_FS_POSIX_PATH + #else + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_POSIX_CACHE_SIZE + #ifdef CONFIG_LV_FS_POSIX_CACHE_SIZE + #define LV_FS_POSIX_CACHE_SIZE CONFIG_LV_FS_POSIX_CACHE_SIZE + #else + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for CreateFile, ReadFile, etc*/ +#ifndef LV_USE_FS_WIN32 + #ifdef CONFIG_LV_USE_FS_WIN32 + #define LV_USE_FS_WIN32 CONFIG_LV_USE_FS_WIN32 + #else + #define LV_USE_FS_WIN32 0 + #endif +#endif +#if LV_USE_FS_WIN32 + #ifndef LV_FS_WIN32_LETTER + #ifdef CONFIG_LV_FS_WIN32_LETTER + #define LV_FS_WIN32_LETTER CONFIG_LV_FS_WIN32_LETTER + #else + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_WIN32_PATH + #ifdef CONFIG_LV_FS_WIN32_PATH + #define LV_FS_WIN32_PATH CONFIG_LV_FS_WIN32_PATH + #else + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #endif + #endif + #ifndef LV_FS_WIN32_CACHE_SIZE + #ifdef CONFIG_LV_FS_WIN32_CACHE_SIZE + #define LV_FS_WIN32_CACHE_SIZE CONFIG_LV_FS_WIN32_CACHE_SIZE + #else + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#ifndef LV_USE_FS_FATFS + #ifdef CONFIG_LV_USE_FS_FATFS + #define LV_USE_FS_FATFS CONFIG_LV_USE_FS_FATFS + #else + #define LV_USE_FS_FATFS 0 + #endif +#endif +#if LV_USE_FS_FATFS + #ifndef LV_FS_FATFS_LETTER + #ifdef CONFIG_LV_FS_FATFS_LETTER + #define LV_FS_FATFS_LETTER CONFIG_LV_FS_FATFS_LETTER + #else + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif + #ifndef LV_FS_FATFS_CACHE_SIZE + #ifdef CONFIG_LV_FS_FATFS_CACHE_SIZE + #define LV_FS_FATFS_CACHE_SIZE CONFIG_LV_FS_FATFS_CACHE_SIZE + #else + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + +/*API for memory-mapped file access. */ +#ifndef LV_USE_FS_MEMFS + #ifdef CONFIG_LV_USE_FS_MEMFS + #define LV_USE_FS_MEMFS CONFIG_LV_USE_FS_MEMFS + #else + #define LV_USE_FS_MEMFS 0 + #endif +#endif +#if LV_USE_FS_MEMFS + #ifndef LV_FS_MEMFS_LETTER + #ifdef CONFIG_LV_FS_MEMFS_LETTER + #define LV_FS_MEMFS_LETTER CONFIG_LV_FS_MEMFS_LETTER + #else + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif +#endif + +/*API for LittleFs. */ +#ifndef LV_USE_FS_LITTLEFS + #ifdef CONFIG_LV_USE_FS_LITTLEFS + #define LV_USE_FS_LITTLEFS CONFIG_LV_USE_FS_LITTLEFS + #else + #define LV_USE_FS_LITTLEFS 0 + #endif +#endif +#if LV_USE_FS_LITTLEFS + #ifndef LV_FS_LITTLEFS_LETTER + #ifdef CONFIG_LV_FS_LITTLEFS_LETTER + #define LV_FS_LITTLEFS_LETTER CONFIG_LV_FS_LITTLEFS_LETTER + #else + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif +#endif + +/*LODEPNG decoder library*/ +#ifndef LV_USE_LODEPNG + #ifdef CONFIG_LV_USE_LODEPNG + #define LV_USE_LODEPNG CONFIG_LV_USE_LODEPNG + #else + #define LV_USE_LODEPNG 0 + #endif +#endif + +/*PNG decoder(libpng) library*/ +#ifndef LV_USE_LIBPNG + #ifdef CONFIG_LV_USE_LIBPNG + #define LV_USE_LIBPNG CONFIG_LV_USE_LIBPNG + #else + #define LV_USE_LIBPNG 0 + #endif +#endif + +/*BMP decoder library*/ +#ifndef LV_USE_BMP + #ifdef CONFIG_LV_USE_BMP + #define LV_USE_BMP CONFIG_LV_USE_BMP + #else + #define LV_USE_BMP 0 + #endif +#endif + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#ifndef LV_USE_TJPGD + #ifdef CONFIG_LV_USE_TJPGD + #define LV_USE_TJPGD CONFIG_LV_USE_TJPGD + #else + #define LV_USE_TJPGD 0 + #endif +#endif + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#ifndef LV_USE_LIBJPEG_TURBO + #ifdef CONFIG_LV_USE_LIBJPEG_TURBO + #define LV_USE_LIBJPEG_TURBO CONFIG_LV_USE_LIBJPEG_TURBO + #else + #define LV_USE_LIBJPEG_TURBO 0 + #endif +#endif + +/*GIF decoder library*/ +#ifndef LV_USE_GIF + #ifdef CONFIG_LV_USE_GIF + #define LV_USE_GIF CONFIG_LV_USE_GIF + #else + #define LV_USE_GIF 0 + #endif +#endif +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#ifndef LV_GIF_CACHE_DECODE_DATA + #ifdef CONFIG_LV_GIF_CACHE_DECODE_DATA + #define LV_GIF_CACHE_DECODE_DATA CONFIG_LV_GIF_CACHE_DECODE_DATA + #else + #define LV_GIF_CACHE_DECODE_DATA 0 + #endif +#endif +#endif + + +/*Decode bin images to RAM*/ +#ifndef LV_BIN_DECODER_RAM_LOAD + #ifdef CONFIG_LV_BIN_DECODER_RAM_LOAD + #define LV_BIN_DECODER_RAM_LOAD CONFIG_LV_BIN_DECODER_RAM_LOAD + #else + #define LV_BIN_DECODER_RAM_LOAD 0 + #endif +#endif + +/*RLE decompress library*/ +#ifndef LV_USE_RLE + #ifdef CONFIG_LV_USE_RLE + #define LV_USE_RLE CONFIG_LV_USE_RLE + #else + #define LV_USE_RLE 0 + #endif +#endif + +/*QR code library*/ +#ifndef LV_USE_QRCODE + #ifdef CONFIG_LV_USE_QRCODE + #define LV_USE_QRCODE CONFIG_LV_USE_QRCODE + #else + #define LV_USE_QRCODE 0 + #endif +#endif + +/*Barcode code library*/ +#ifndef LV_USE_BARCODE + #ifdef CONFIG_LV_USE_BARCODE + #define LV_USE_BARCODE CONFIG_LV_USE_BARCODE + #else + #define LV_USE_BARCODE 0 + #endif +#endif + +/*FreeType library*/ +#ifndef LV_USE_FREETYPE + #ifdef CONFIG_LV_USE_FREETYPE + #define LV_USE_FREETYPE CONFIG_LV_USE_FREETYPE + #else + #define LV_USE_FREETYPE 0 + #endif +#endif +#if LV_USE_FREETYPE + /*Let FreeType to use LVGL memory and file porting*/ + #ifndef LV_FREETYPE_USE_LVGL_PORT + #ifdef CONFIG_LV_FREETYPE_USE_LVGL_PORT + #define LV_FREETYPE_USE_LVGL_PORT CONFIG_LV_FREETYPE_USE_LVGL_PORT + #else + #define LV_FREETYPE_USE_LVGL_PORT 0 + #endif + #endif + + /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached. + *The higher the value, the more memory will be used.*/ + #ifndef LV_FREETYPE_CACHE_FT_GLYPH_CNT + #ifdef CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT + #else + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 + #endif + #endif +#endif + +/* Built-in TTF decoder */ +#ifndef LV_USE_TINY_TTF + #ifdef CONFIG_LV_USE_TINY_TTF + #define LV_USE_TINY_TTF CONFIG_LV_USE_TINY_TTF + #else + #define LV_USE_TINY_TTF 0 + #endif +#endif +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #ifndef LV_TINY_TTF_FILE_SUPPORT + #ifdef CONFIG_LV_TINY_TTF_FILE_SUPPORT + #define LV_TINY_TTF_FILE_SUPPORT CONFIG_LV_TINY_TTF_FILE_SUPPORT + #else + #define LV_TINY_TTF_FILE_SUPPORT 0 + #endif + #endif +#endif + +/*Rlottie library*/ +#ifndef LV_USE_RLOTTIE + #ifdef CONFIG_LV_USE_RLOTTIE + #define LV_USE_RLOTTIE CONFIG_LV_USE_RLOTTIE + #else + #define LV_USE_RLOTTIE 0 + #endif +#endif + +/*Enable Vector Graphic APIs*/ +#ifndef LV_USE_VECTOR_GRAPHIC + #ifdef CONFIG_LV_USE_VECTOR_GRAPHIC + #define LV_USE_VECTOR_GRAPHIC CONFIG_LV_USE_VECTOR_GRAPHIC + #else + #define LV_USE_VECTOR_GRAPHIC 0 + #endif +#endif + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#ifndef LV_USE_THORVG_INTERNAL + #ifdef CONFIG_LV_USE_THORVG_INTERNAL + #define LV_USE_THORVG_INTERNAL CONFIG_LV_USE_THORVG_INTERNAL + #else + #define LV_USE_THORVG_INTERNAL 0 + #endif +#endif + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#ifndef LV_USE_THORVG_EXTERNAL + #ifdef CONFIG_LV_USE_THORVG_EXTERNAL + #define LV_USE_THORVG_EXTERNAL CONFIG_LV_USE_THORVG_EXTERNAL + #else + #define LV_USE_THORVG_EXTERNAL 0 + #endif +#endif + +/*Use lvgl built-in LZ4 lib*/ +#ifndef LV_USE_LZ4_INTERNAL + #ifdef CONFIG_LV_USE_LZ4_INTERNAL + #define LV_USE_LZ4_INTERNAL CONFIG_LV_USE_LZ4_INTERNAL + #else + #define LV_USE_LZ4_INTERNAL 0 + #endif +#endif + +/*Use external LZ4 library*/ +#ifndef LV_USE_LZ4_EXTERNAL + #ifdef CONFIG_LV_USE_LZ4_EXTERNAL + #define LV_USE_LZ4_EXTERNAL CONFIG_LV_USE_LZ4_EXTERNAL + #else + #define LV_USE_LZ4_EXTERNAL 0 + #endif +#endif + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#ifndef LV_USE_FFMPEG + #ifdef CONFIG_LV_USE_FFMPEG + #define LV_USE_FFMPEG CONFIG_LV_USE_FFMPEG + #else + #define LV_USE_FFMPEG 0 + #endif +#endif +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #ifndef LV_FFMPEG_DUMP_FORMAT + #ifdef CONFIG_LV_FFMPEG_DUMP_FORMAT + #define LV_FFMPEG_DUMP_FORMAT CONFIG_LV_FFMPEG_DUMP_FORMAT + #else + #define LV_FFMPEG_DUMP_FORMAT 0 + #endif + #endif +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable API to take snapshot for object*/ +#ifndef LV_USE_SNAPSHOT + #ifdef CONFIG_LV_USE_SNAPSHOT + #define LV_USE_SNAPSHOT CONFIG_LV_USE_SNAPSHOT + #else + #define LV_USE_SNAPSHOT 0 + #endif +#endif + +/*1: Enable system monitor component*/ +#ifndef LV_USE_SYSMON + #ifdef CONFIG_LV_USE_SYSMON + #define LV_USE_SYSMON CONFIG_LV_USE_SYSMON + #else + #define LV_USE_SYSMON 0 + #endif +#endif +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #ifndef LV_SYSMON_GET_IDLE + #ifdef CONFIG_LV_SYSMON_GET_IDLE + #define LV_SYSMON_GET_IDLE CONFIG_LV_SYSMON_GET_IDLE + #else + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + #endif + #endif + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #ifndef LV_USE_PERF_MONITOR + #ifdef CONFIG_LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR + #else + #define LV_USE_PERF_MONITOR 0 + #endif + #endif + #if LV_USE_PERF_MONITOR + #ifndef LV_USE_PERF_MONITOR_POS + #ifdef CONFIG_LV_USE_PERF_MONITOR_POS + #define LV_USE_PERF_MONITOR_POS CONFIG_LV_USE_PERF_MONITOR_POS + #else + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + #endif + #endif + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #ifndef LV_USE_PERF_MONITOR_LOG_MODE + #ifdef CONFIG_LV_USE_PERF_MONITOR_LOG_MODE + #define LV_USE_PERF_MONITOR_LOG_MODE CONFIG_LV_USE_PERF_MONITOR_LOG_MODE + #else + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + #endif + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * Requires `LV_USE_SYSMON = 1`*/ + #ifndef LV_USE_MEM_MONITOR + #ifdef CONFIG_LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR + #else + #define LV_USE_MEM_MONITOR 0 + #endif + #endif + #if LV_USE_MEM_MONITOR + #ifndef LV_USE_MEM_MONITOR_POS + #ifdef CONFIG_LV_USE_MEM_MONITOR_POS + #define LV_USE_MEM_MONITOR_POS CONFIG_LV_USE_MEM_MONITOR_POS + #else + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + #endif + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#ifndef LV_USE_PROFILER + #ifdef CONFIG_LV_USE_PROFILER + #define LV_USE_PROFILER CONFIG_LV_USE_PROFILER + #else + #define LV_USE_PROFILER 0 + #endif +#endif +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #ifndef LV_USE_PROFILER_BUILTIN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_PROFILER_BUILTIN + #define LV_USE_PROFILER_BUILTIN CONFIG_LV_USE_PROFILER_BUILTIN + #else + #define LV_USE_PROFILER_BUILTIN 0 + #endif + #else + #define LV_USE_PROFILER_BUILTIN 1 + #endif + #endif + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #ifndef LV_PROFILER_BUILTIN_BUF_SIZE + #ifdef CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #define LV_PROFILER_BUILTIN_BUF_SIZE CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #else + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + #endif + #endif + + /*Header to include for the profiler*/ + #ifndef LV_PROFILER_INCLUDE + #ifdef CONFIG_LV_PROFILER_INCLUDE + #define LV_PROFILER_INCLUDE CONFIG_LV_PROFILER_INCLUDE + #else + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + #endif + #endif + + /*Profiler start point function*/ + #ifndef LV_PROFILER_BEGIN + #ifdef CONFIG_LV_PROFILER_BEGIN + #define LV_PROFILER_BEGIN CONFIG_LV_PROFILER_BEGIN + #else + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + #endif + #endif + + /*Profiler end point function*/ + #ifndef LV_PROFILER_END + #ifdef CONFIG_LV_PROFILER_END + #define LV_PROFILER_END CONFIG_LV_PROFILER_END + #else + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + #endif + #endif + + /*Profiler start point function with custom tag*/ + #ifndef LV_PROFILER_BEGIN_TAG + #ifdef CONFIG_LV_PROFILER_BEGIN_TAG + #define LV_PROFILER_BEGIN_TAG CONFIG_LV_PROFILER_BEGIN_TAG + #else + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + #endif + #endif + + /*Profiler end point function with custom tag*/ + #ifndef LV_PROFILER_END_TAG + #ifdef CONFIG_LV_PROFILER_END_TAG + #define LV_PROFILER_END_TAG CONFIG_LV_PROFILER_END_TAG + #else + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG + #endif + #endif +#endif + +/*1: Enable Monkey test*/ +#ifndef LV_USE_MONKEY + #ifdef CONFIG_LV_USE_MONKEY + #define LV_USE_MONKEY CONFIG_LV_USE_MONKEY + #else + #define LV_USE_MONKEY 0 + #endif +#endif + +/*1: Enable grid navigation*/ +#ifndef LV_USE_GRIDNAV + #ifdef CONFIG_LV_USE_GRIDNAV + #define LV_USE_GRIDNAV CONFIG_LV_USE_GRIDNAV + #else + #define LV_USE_GRIDNAV 0 + #endif +#endif + +/*1: Enable lv_obj fragment*/ +#ifndef LV_USE_FRAGMENT + #ifdef CONFIG_LV_USE_FRAGMENT + #define LV_USE_FRAGMENT CONFIG_LV_USE_FRAGMENT + #else + #define LV_USE_FRAGMENT 0 + #endif +#endif + +/*1: Support using images as font in label or span widgets */ +#ifndef LV_USE_IMGFONT + #ifdef CONFIG_LV_USE_IMGFONT + #define LV_USE_IMGFONT CONFIG_LV_USE_IMGFONT + #else + #define LV_USE_IMGFONT 0 + #endif +#endif + +/*1: Enable an observer pattern implementation*/ +#ifndef LV_USE_OBSERVER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_OBSERVER + #define LV_USE_OBSERVER CONFIG_LV_USE_OBSERVER + #else + #define LV_USE_OBSERVER 0 + #endif + #else + #define LV_USE_OBSERVER 1 + #endif +#endif + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#ifndef LV_USE_IME_PINYIN + #ifdef CONFIG_LV_USE_IME_PINYIN + #define LV_USE_IME_PINYIN CONFIG_LV_USE_IME_PINYIN + #else + #define LV_USE_IME_PINYIN 0 + #endif +#endif +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 0 + #endif + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + #endif + #endif + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #ifndef LV_IME_PINYIN_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #define LV_IME_PINYIN_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + #endif + #endif + + /*Use 9 key input(k9)*/ + #ifndef LV_IME_PINYIN_USE_K9_MODE + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE + #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE + #else + #define LV_IME_PINYIN_USE_K9_MODE 0 + #endif + #else + #define LV_IME_PINYIN_USE_K9_MODE 1 + #endif + #endif + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #ifndef LV_IME_PINYIN_K9_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif + #endif + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#ifndef LV_USE_FILE_EXPLORER + #ifdef CONFIG_LV_USE_FILE_EXPLORER + #define LV_USE_FILE_EXPLORER CONFIG_LV_USE_FILE_EXPLORER + #else + #define LV_USE_FILE_EXPLORER 0 + #endif +#endif +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #ifndef LV_FILE_EXPLORER_PATH_MAX_LEN + #ifdef CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN + #define LV_FILE_EXPLORER_PATH_MAX_LEN CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN + #else + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + #endif + #endif + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #ifndef LV_FILE_EXPLORER_QUICK_ACCESS + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS + #define LV_FILE_EXPLORER_QUICK_ACCESS CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS + #else + #define LV_FILE_EXPLORER_QUICK_ACCESS 0 + #endif + #else + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 + #endif + #endif +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#ifndef LV_USE_SDL + #ifdef CONFIG_LV_USE_SDL + #define LV_USE_SDL CONFIG_LV_USE_SDL + #else + #define LV_USE_SDL 0 + #endif +#endif +#if LV_USE_SDL + #ifndef LV_SDL_INCLUDE_PATH + #ifdef CONFIG_LV_SDL_INCLUDE_PATH + #define LV_SDL_INCLUDE_PATH CONFIG_LV_SDL_INCLUDE_PATH + #else + #define LV_SDL_INCLUDE_PATH + #endif + #endif + #ifndef LV_SDL_RENDER_MODE + #ifdef CONFIG_LV_SDL_RENDER_MODE + #define LV_SDL_RENDER_MODE CONFIG_LV_SDL_RENDER_MODE + #else + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #endif + #endif + #ifndef LV_SDL_BUF_COUNT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_BUF_COUNT + #define LV_SDL_BUF_COUNT CONFIG_LV_SDL_BUF_COUNT + #else + #define LV_SDL_BUF_COUNT 0 + #endif + #else + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #endif + #endif + #ifndef LV_SDL_FULLSCREEN + #ifdef CONFIG_LV_SDL_FULLSCREEN + #define LV_SDL_FULLSCREEN CONFIG_LV_SDL_FULLSCREEN + #else + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #endif + #endif + #ifndef LV_SDL_DIRECT_EXIT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_DIRECT_EXIT + #define LV_SDL_DIRECT_EXIT CONFIG_LV_SDL_DIRECT_EXIT + #else + #define LV_SDL_DIRECT_EXIT 0 + #endif + #else + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ + #endif + #endif + #ifndef LV_SDL_MOUSEWHEEL_MODE + #ifdef CONFIG_LV_SDL_MOUSEWHEEL_MODE + #define LV_SDL_MOUSEWHEEL_MODE CONFIG_LV_SDL_MOUSEWHEEL_MODE + #else + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ + #endif + #endif +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#ifndef LV_USE_X11 + #ifdef CONFIG_LV_USE_X11 + #define LV_USE_X11 CONFIG_LV_USE_X11 + #else + #define LV_USE_X11 0 + #endif +#endif +#if LV_USE_X11 + #ifndef LV_X11_DIRECT_EXIT + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_DIRECT_EXIT + #define LV_X11_DIRECT_EXIT CONFIG_LV_X11_DIRECT_EXIT + #else + #define LV_X11_DIRECT_EXIT 0 + #endif + #else + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #endif + #endif + #ifndef LV_X11_DOUBLE_BUFFER + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_DOUBLE_BUFFER + #define LV_X11_DOUBLE_BUFFER CONFIG_LV_X11_DOUBLE_BUFFER + #else + #define LV_X11_DOUBLE_BUFFER 0 + #endif + #else + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + #endif + #endif + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #ifndef LV_X11_RENDER_MODE_PARTIAL + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_RENDER_MODE_PARTIAL + #define LV_X11_RENDER_MODE_PARTIAL CONFIG_LV_X11_RENDER_MODE_PARTIAL + #else + #define LV_X11_RENDER_MODE_PARTIAL 0 + #endif + #else + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #endif + #endif + #ifndef LV_X11_RENDER_MODE_DIRECT + #ifdef CONFIG_LV_X11_RENDER_MODE_DIRECT + #define LV_X11_RENDER_MODE_DIRECT CONFIG_LV_X11_RENDER_MODE_DIRECT + #else + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #endif + #endif + #ifndef LV_X11_RENDER_MODE_FULL + #ifdef CONFIG_LV_X11_RENDER_MODE_FULL + #define LV_X11_RENDER_MODE_FULL CONFIG_LV_X11_RENDER_MODE_FULL + #else + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ + #endif + #endif +#endif + +/*Driver for /dev/fb*/ +#ifndef LV_USE_LINUX_FBDEV + #ifdef CONFIG_LV_USE_LINUX_FBDEV + #define LV_USE_LINUX_FBDEV CONFIG_LV_USE_LINUX_FBDEV + #else + #define LV_USE_LINUX_FBDEV 0 + #endif +#endif +#if LV_USE_LINUX_FBDEV + #ifndef LV_LINUX_FBDEV_BSD + #ifdef CONFIG_LV_LINUX_FBDEV_BSD + #define LV_LINUX_FBDEV_BSD CONFIG_LV_LINUX_FBDEV_BSD + #else + #define LV_LINUX_FBDEV_BSD 0 + #endif + #endif + #ifndef LV_LINUX_FBDEV_RENDER_MODE + #ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE + #define LV_LINUX_FBDEV_RENDER_MODE CONFIG_LV_LINUX_FBDEV_RENDER_MODE + #else + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #endif + #endif + #ifndef LV_LINUX_FBDEV_BUFFER_COUNT + #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT + #define LV_LINUX_FBDEV_BUFFER_COUNT CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT + #else + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #endif + #endif + #ifndef LV_LINUX_FBDEV_BUFFER_SIZE + #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE + #define LV_LINUX_FBDEV_BUFFER_SIZE CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE + #else + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 + #endif + #endif +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#ifndef LV_USE_NUTTX + #ifdef CONFIG_LV_USE_NUTTX + #define LV_USE_NUTTX CONFIG_LV_USE_NUTTX + #else + #define LV_USE_NUTTX 0 + #endif +#endif + +#if LV_USE_NUTTX + #ifndef LV_USE_NUTTX_LIBUV + #ifdef CONFIG_LV_USE_NUTTX_LIBUV + #define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV + #else + #define LV_USE_NUTTX_LIBUV 0 + #endif + #endif + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #ifndef LV_USE_NUTTX_CUSTOM_INIT + #ifdef CONFIG_LV_USE_NUTTX_CUSTOM_INIT + #define LV_USE_NUTTX_CUSTOM_INIT CONFIG_LV_USE_NUTTX_CUSTOM_INIT + #else + #define LV_USE_NUTTX_CUSTOM_INIT 0 + #endif + #endif + + /*Driver for /dev/lcd*/ + #ifndef LV_USE_NUTTX_LCD + #ifdef CONFIG_LV_USE_NUTTX_LCD + #define LV_USE_NUTTX_LCD CONFIG_LV_USE_NUTTX_LCD + #else + #define LV_USE_NUTTX_LCD 0 + #endif + #endif + #if LV_USE_NUTTX_LCD + #ifndef LV_NUTTX_LCD_BUFFER_COUNT + #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_COUNT + #define LV_NUTTX_LCD_BUFFER_COUNT CONFIG_LV_NUTTX_LCD_BUFFER_COUNT + #else + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #endif + #endif + #ifndef LV_NUTTX_LCD_BUFFER_SIZE + #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_SIZE + #define LV_NUTTX_LCD_BUFFER_SIZE CONFIG_LV_NUTTX_LCD_BUFFER_SIZE + #else + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + #endif + #endif + + /*Driver for /dev/input*/ + #ifndef LV_USE_NUTTX_TOUCHSCREEN + #ifdef CONFIG_LV_USE_NUTTX_TOUCHSCREEN + #define LV_USE_NUTTX_TOUCHSCREEN CONFIG_LV_USE_NUTTX_TOUCHSCREEN + #else + #define LV_USE_NUTTX_TOUCHSCREEN 0 + #endif + #endif + +#endif + +/*Driver for /dev/dri/card*/ +#ifndef LV_USE_LINUX_DRM + #ifdef CONFIG_LV_USE_LINUX_DRM + #define LV_USE_LINUX_DRM CONFIG_LV_USE_LINUX_DRM + #else + #define LV_USE_LINUX_DRM 0 + #endif +#endif + +/*Interface for TFT_eSPI*/ +#ifndef LV_USE_TFT_ESPI + #ifdef CONFIG_LV_USE_TFT_ESPI + #define LV_USE_TFT_ESPI CONFIG_LV_USE_TFT_ESPI + #else + #define LV_USE_TFT_ESPI 0 + #endif +#endif + +/*Driver for evdev input devices*/ +#ifndef LV_USE_EVDEV + #ifdef CONFIG_LV_USE_EVDEV + #define LV_USE_EVDEV CONFIG_LV_USE_EVDEV + #else + #define LV_USE_EVDEV 0 + #endif +#endif + +/*Driver for libinput input devices*/ +#ifndef LV_USE_LIBINPUT + #ifdef CONFIG_LV_USE_LIBINPUT + #define LV_USE_LIBINPUT CONFIG_LV_USE_LIBINPUT + #else + #define LV_USE_LIBINPUT 0 + #endif +#endif + +#if LV_USE_LIBINPUT + #ifndef LV_LIBINPUT_BSD + #ifdef CONFIG_LV_LIBINPUT_BSD + #define LV_LIBINPUT_BSD CONFIG_LV_LIBINPUT_BSD + #else + #define LV_LIBINPUT_BSD 0 + #endif + #endif + + /*Full keyboard support*/ + #ifndef LV_LIBINPUT_XKB + #ifdef CONFIG_LV_LIBINPUT_XKB + #define LV_LIBINPUT_XKB CONFIG_LV_LIBINPUT_XKB + #else + #define LV_LIBINPUT_XKB 0 + #endif + #endif + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #ifndef LV_LIBINPUT_XKB_KEY_MAP + #ifdef CONFIG_LV_LIBINPUT_XKB_KEY_MAP + #define LV_LIBINPUT_XKB_KEY_MAP CONFIG_LV_LIBINPUT_XKB_KEY_MAP + #else + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif + #endif + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#ifndef LV_USE_ST7735 + #ifdef CONFIG_LV_USE_ST7735 + #define LV_USE_ST7735 CONFIG_LV_USE_ST7735 + #else + #define LV_USE_ST7735 0 + #endif +#endif +#ifndef LV_USE_ST7789 + #ifdef CONFIG_LV_USE_ST7789 + #define LV_USE_ST7789 CONFIG_LV_USE_ST7789 + #else + #define LV_USE_ST7789 0 + #endif +#endif +#ifndef LV_USE_ST7796 + #ifdef CONFIG_LV_USE_ST7796 + #define LV_USE_ST7796 CONFIG_LV_USE_ST7796 + #else + #define LV_USE_ST7796 0 + #endif +#endif +#ifndef LV_USE_ILI9341 + #ifdef CONFIG_LV_USE_ILI9341 + #define LV_USE_ILI9341 CONFIG_LV_USE_ILI9341 + #else + #define LV_USE_ILI9341 0 + #endif +#endif + +#ifndef LV_USE_GENERIC_MIPI + #ifdef CONFIG_LV_USE_GENERIC_MIPI + #define LV_USE_GENERIC_MIPI CONFIG_LV_USE_GENERIC_MIPI + #else + #define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + #endif +#endif + +/* LVGL Windows backend */ +#ifndef LV_USE_WINDOWS + #ifdef CONFIG_LV_USE_WINDOWS + #define LV_USE_WINDOWS CONFIG_LV_USE_WINDOWS + #else + #define LV_USE_WINDOWS 0 + #endif +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#ifndef LV_BUILD_EXAMPLES + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_BUILD_EXAMPLES + #define LV_BUILD_EXAMPLES CONFIG_LV_BUILD_EXAMPLES + #else + #define LV_BUILD_EXAMPLES 0 + #endif + #else + #define LV_BUILD_EXAMPLES 1 + #endif +#endif + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#ifndef LV_USE_DEMO_WIDGETS + #ifdef CONFIG_LV_USE_DEMO_WIDGETS + #define LV_USE_DEMO_WIDGETS CONFIG_LV_USE_DEMO_WIDGETS + #else + #define LV_USE_DEMO_WIDGETS 0 + #endif +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#ifndef LV_USE_DEMO_KEYPAD_AND_ENCODER + #ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #define LV_USE_DEMO_KEYPAD_AND_ENCODER CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #else + #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + #endif +#endif + +/*Benchmark your system*/ +#ifndef LV_USE_DEMO_BENCHMARK + #ifdef CONFIG_LV_USE_DEMO_BENCHMARK + #define LV_USE_DEMO_BENCHMARK CONFIG_LV_USE_DEMO_BENCHMARK + #else + #define LV_USE_DEMO_BENCHMARK 0 + #endif +#endif + +/*Render test for each primitives. Requires at least 480x272 display*/ +#ifndef LV_USE_DEMO_RENDER + #ifdef CONFIG_LV_USE_DEMO_RENDER + #define LV_USE_DEMO_RENDER CONFIG_LV_USE_DEMO_RENDER + #else + #define LV_USE_DEMO_RENDER 0 + #endif +#endif + +/*Stress test for LVGL*/ +#ifndef LV_USE_DEMO_STRESS + #ifdef CONFIG_LV_USE_DEMO_STRESS + #define LV_USE_DEMO_STRESS CONFIG_LV_USE_DEMO_STRESS + #else + #define LV_USE_DEMO_STRESS 0 + #endif +#endif + +/*Music player demo*/ +#ifndef LV_USE_DEMO_MUSIC + #ifdef CONFIG_LV_USE_DEMO_MUSIC + #define LV_USE_DEMO_MUSIC CONFIG_LV_USE_DEMO_MUSIC + #else + #define LV_USE_DEMO_MUSIC 0 + #endif +#endif +#if LV_USE_DEMO_MUSIC + #ifndef LV_DEMO_MUSIC_SQUARE + #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE + #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE + #else + #define LV_DEMO_MUSIC_SQUARE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LANDSCAPE + #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #else + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_ROUND + #ifdef CONFIG_LV_DEMO_MUSIC_ROUND + #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND + #else + #define LV_DEMO_MUSIC_ROUND 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LARGE + #ifdef CONFIG_LV_DEMO_MUSIC_LARGE + #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE + #else + #define LV_DEMO_MUSIC_LARGE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_AUTO_PLAY + #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #else + #define LV_DEMO_MUSIC_AUTO_PLAY 0 + #endif + #endif +#endif + +/*Flex layout demo*/ +#ifndef LV_USE_DEMO_FLEX_LAYOUT + #ifdef CONFIG_LV_USE_DEMO_FLEX_LAYOUT + #define LV_USE_DEMO_FLEX_LAYOUT CONFIG_LV_USE_DEMO_FLEX_LAYOUT + #else + #define LV_USE_DEMO_FLEX_LAYOUT 0 + #endif +#endif + +/*Smart-phone like multi-language demo*/ +#ifndef LV_USE_DEMO_MULTILANG + #ifdef CONFIG_LV_USE_DEMO_MULTILANG + #define LV_USE_DEMO_MULTILANG CONFIG_LV_USE_DEMO_MULTILANG + #else + #define LV_USE_DEMO_MULTILANG 0 + #endif +#endif + +/*Widget transformation demo*/ +#ifndef LV_USE_DEMO_TRANSFORM + #ifdef CONFIG_LV_USE_DEMO_TRANSFORM + #define LV_USE_DEMO_TRANSFORM CONFIG_LV_USE_DEMO_TRANSFORM + #else + #define LV_USE_DEMO_TRANSFORM 0 + #endif +#endif + +/*Demonstrate scroll settings*/ +#ifndef LV_USE_DEMO_SCROLL + #ifdef CONFIG_LV_USE_DEMO_SCROLL + #define LV_USE_DEMO_SCROLL CONFIG_LV_USE_DEMO_SCROLL + #else + #define LV_USE_DEMO_SCROLL 0 + #endif +#endif + +/*Vector graphic demo*/ +#ifndef LV_USE_DEMO_VECTOR_GRAPHIC + #ifdef CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC + #define LV_USE_DEMO_VECTOR_GRAPHIC CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC + #else + #define LV_USE_DEMO_VECTOR_GRAPHIC 0 + #endif +#endif + + +/*---------------------------------- + * End of parsing lv_conf_template.h + -----------------------------------*/ + +#ifndef __ASSEMBLY__ +LV_EXPORT_CONST_INT(LV_DPI_DEF); +LV_EXPORT_CONST_INT(LV_DRAW_BUF_STRIDE_ALIGN); +LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN); +#endif + +#undef _LV_KCONFIG_PRESENT + +/*Set some defines if a dependency is disabled*/ +#if LV_USE_LOG == 0 + #define LV_LOG_LEVEL LV_LOG_LEVEL_NONE + #define LV_LOG_TRACE_MEM 0 + #define LV_LOG_TRACE_TIMER 0 + #define LV_LOG_TRACE_INDEV 0 + #define LV_LOG_TRACE_DISP_REFR 0 + #define LV_LOG_TRACE_EVENT 0 + #define LV_LOG_TRACE_OBJ_CREATE 0 + #define LV_LOG_TRACE_LAYOUT 0 + #define LV_LOG_TRACE_ANIM 0 +#endif /*LV_USE_LOG*/ + +#ifndef LV_USE_LZ4 + #define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL) +#endif + +#ifndef LV_USE_THORVG + #define LV_USE_THORVG (LV_USE_THORVG_INTERNAL || LV_USE_THORVG_EXTERNAL) +#endif + +/*If running without lv_conf.h add typedefs with default value*/ +#ifdef LV_CONF_SKIP + #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /*Disable warnings for Visual Studio*/ + #define _CRT_SECURE_NO_WARNINGS + #endif +#endif /*defined(LV_CONF_SKIP)*/ + +#endif /*LV_CONF_INTERNAL_H*/ diff --git a/libraries/lvgl/src/lv_conf_kconfig.h b/libraries/lvgl/src/lv_conf_kconfig.h new file mode 100644 index 0000000..7f7cbcb --- /dev/null +++ b/libraries/lvgl/src/lv_conf_kconfig.h @@ -0,0 +1,254 @@ +/** * @file lv_conf_kconfig.h * Configs that need special handling when LVGL is used with Kconfig */ + +#ifndef LV_CONF_KCONFIG_H +#define LV_CONF_KCONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_KCONFIG_EXTERNAL_INCLUDE +# include LV_CONF_KCONFIG_EXTERNAL_INCLUDE +#else + +# ifdef ESP_PLATFORM +# include "sdkconfig.h" +# include "esp_attr.h" +# endif + +# ifdef __NuttX__ +# include +# elif defined(__RTTHREAD__) +# define LV_CONF_INCLUDE_SIMPLE +# include +# endif + +#endif /*LV_CONF_KCONFIG_EXTERNAL_INCLUDE*/ + +/******************* + * LV_USE_STDLIB_MALLOC + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_MALLOC +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_USE_STDLIB_STRING + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_STRING +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_USE_STDLIB_SPRINTF + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_SPRINTF +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_MEM_SIZE + *******************/ + +#ifdef CONFIG_LV_MEM_SIZE_KILOBYTES +# if(CONFIG_LV_MEM_SIZE_KILOBYTES < 2) +# error "LV_MEM_SIZE >= 2kB is required" +# endif + +# define CONFIG_LV_MEM_SIZE (CONFIG_LV_MEM_SIZE_KILOBYTES * 1024U) +#endif + +#ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES +# define CONFIG_LV_MEM_POOL_EXPAND_SIZE (CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES * 1024U) +#endif + +/*------------------ + * MONITOR POSITION + *-----------------*/ + +#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER +#endif + +#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER +#endif + +/******************** + * FONT SELECTION + *******************/ + +/** + * NOTE: In Kconfig instead of `LV_DEFAULT_FONT` + * `CONFIG_LV_FONT_DEFAULT_` is defined + * hence the large selection with if-s + */ + +/*------------------ + * DEFAULT FONT + *-----------------*/ +#ifdef CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_10 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_14 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_16 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_18 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_20 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_22 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_24 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_26 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_30 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_32 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_34 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_36 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_38 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_40 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_42 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_44 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_46 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_48 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12_subpx +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28_compressed +#elif defined(CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW) +# define CONFIG_LV_FONT_DEFAULT &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK) +# define CONFIG_LV_FONT_DEFAULT &lv_font_simsun_16_cjk +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_8) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_16 +#endif + +/*------------------ + * TEXT ENCODING + *-----------------*/ +#ifdef CONFIG_LV_TXT_ENC_UTF8 +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_UTF8 +#elif defined(CONFIG_LV_TXT_ENC_ASCII) +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_ASCII +#endif + +/*------------------ + * BIDI DIRECTION + *-----------------*/ + +#ifdef CONFIG_LV_BASE_DIR_LTR +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_LTR +#elif defined(CONFIG_LV_BASE_DIR_RTL) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_RTL +#elif defined(CONFIG_LV_BASE_DIR_AUTO) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*------------------ + * SDL + *-----------------*/ + +#ifdef CONFIG_LV_SDL_RENDER_MODE_PARTIAL +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined(CONFIG_LV_SDL_RENDER_MODE_DIRECT) +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined(CONFIG_LV_SDL_RENDER_MODE_FULL) +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + +/*------------------ + * LINUX FBDEV + *-----------------*/ + +#ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE_PARTIAL +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_DIRECT) +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_FULL) +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CONF_KCONFIG_H*/ diff --git a/libraries/lvgl/src/lv_init.c b/libraries/lvgl/src/lv_init.c new file mode 100644 index 0000000..cb4f23c --- /dev/null +++ b/libraries/lvgl/src/lv_init.c @@ -0,0 +1,415 @@ +/** + * @file lv_init.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "core/lv_global.h" +#include "core/lv_obj.h" +#include "display/lv_display_private.h" +#include "indev/lv_indev_private.h" +#include "layouts/lv_layout.h" +#include "libs/bin_decoder/lv_bin_decoder.h" +#include "libs/bmp/lv_bmp.h" +#include "libs/ffmpeg/lv_ffmpeg.h" +#include "libs/freetype/lv_freetype.h" +#include "libs/fsdrv/lv_fsdrv.h" +#include "libs/gif/lv_gif.h" +#include "libs/tjpgd/lv_tjpgd.h" +#include "libs/libjpeg_turbo/lv_libjpeg_turbo.h" +#include "libs/lodepng/lv_lodepng.h" +#include "libs/libpng/lv_libpng.h" +#include "draw/lv_draw.h" +#include "misc/lv_async.h" +#include "misc/lv_fs.h" +#if LV_USE_DRAW_VGLITE + #include "draw/nxp/vglite/lv_draw_vglite.h" +#endif +#if LV_USE_DRAW_PXP + #include "draw/nxp/pxp/lv_draw_pxp.h" +#endif +#if LV_USE_DRAW_DAVE2D + #include "draw/renesas/dave2d/lv_draw_dave2d.h" +#endif +#if LV_USE_DRAW_SDL + #include "draw/sdl/lv_draw_sdl.h" +#endif +#if LV_USE_DRAW_VG_LITE + #include "draw/vg_lite/lv_draw_vg_lite.h" +#endif +#if LV_USE_WINDOWS + #include "drivers/windows/lv_windows_context.h" +#endif + +/********************* + * DEFINES + *********************/ +#define lv_initialized LV_GLOBAL_DEFAULT()->inited +#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_ENABLE_GLOBAL_CUSTOM == 0 + lv_global_t lv_global; +#endif + +/********************** + * MACROS + **********************/ + +#ifndef LV_GLOBAL_INIT + #define LV_GLOBAL_INIT(__GLOBAL_PTR) lv_global_init((lv_global_t *)(__GLOBAL_PTR)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ +static inline void lv_global_init(lv_global_t * global) +{ + LV_ASSERT_NULL(global); + + if(global == NULL) { + LV_LOG_ERROR("lv_global cannot be null"); + return; + } + + lv_memzero(global, sizeof(lv_global_t)); + + _lv_ll_init(&(global->disp_ll), sizeof(lv_display_t)); + _lv_ll_init(&(global->indev_ll), sizeof(lv_indev_t)); + + global->memory_zero = ZERO_MEM_SENTINEL; + global->style_refresh = true; + global->layout_count = _LV_LAYOUT_LAST; + global->style_last_custom_prop_id = (uint32_t)_LV_STYLE_LAST_BUILT_IN_PROP; + global->event_last_register_id = _LV_EVENT_LAST; + lv_rand_set_seed(0x1234ABCD); + +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + global->sw_shadow_cache.cache_size = -1; + global->sw_shadow_cache.cache_r = -1; +#endif +} + +static inline void _lv_cleanup_devices(lv_global_t * global) +{ + LV_ASSERT_NULL(global); + + if(global) { + /* cleanup indev and display */ + _lv_ll_clear_custom(&(global->indev_ll), (void (*)(void *)) lv_indev_delete); + _lv_ll_clear_custom(&(global->disp_ll), (void (*)(void *)) lv_display_delete); + } +} + +bool lv_is_initialized(void) +{ +#if LV_ENABLE_GLOBAL_CUSTOM + if(LV_GLOBAL_DEFAULT()) return lv_initialized; + else return false; +#else + return lv_initialized; +#endif +} + +void lv_init(void) +{ + /*First initialize Garbage Collection if needed*/ +#ifdef LV_GC_INIT + LV_GC_INIT(); +#endif + + /*Do nothing if already initialized*/ + if(lv_initialized) { + LV_LOG_WARN("lv_init: already initialized"); + return; + } + + LV_LOG_INFO("begin"); + + /*Initialize members of static variable lv_global */ + LV_GLOBAL_INIT(LV_GLOBAL_DEFAULT()); + + lv_mem_init(); + + _lv_draw_buf_init_handlers(); + +#if LV_USE_SPAN != 0 + lv_span_stack_init(); +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_profiler_builtin_config_t profiler_config; + lv_profiler_builtin_config_init(&profiler_config); + lv_profiler_builtin_init(&profiler_config); +#endif + + _lv_timer_core_init(); + + _lv_fs_init(); + + _lv_layout_init(); + + _lv_anim_core_init(); + + _lv_group_init(); + + lv_draw_init(); + +#if LV_USE_DRAW_SW + lv_draw_sw_init(); +#endif + +#if LV_USE_DRAW_VGLITE + lv_draw_vglite_init(); +#endif + +#if LV_USE_DRAW_PXP + lv_draw_pxp_init(); +#endif + +#if LV_USE_DRAW_DAVE2D + lv_draw_dave2d_init(); +#endif + +#if LV_USE_DRAW_SDL + lv_draw_sdl_init(); +#endif + +#if LV_USE_WINDOWS + lv_windows_platform_init(); +#endif + + _lv_obj_style_init(); + + /*Initialize the screen refresh system*/ + _lv_refr_init(); + +#if LV_USE_SYSMON + _lv_sysmon_builtin_init(); +#endif + + _lv_image_decoder_init(); + lv_bin_decoder_init(); /*LVGL built-in binary image decoder*/ + +#if LV_USE_DRAW_VG_LITE + lv_draw_vg_lite_init(); +#endif + + /*Test if the IDE has UTF-8 encoding*/ + const char * txt = "Á"; + + uint8_t * txt_u8 = (uint8_t *)txt; + if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { + LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); + } + + uint32_t endianness_test = 0x11223344; + uint8_t * endianness_test_p = (uint8_t *) &endianness_test; + bool big_endian = endianness_test_p[0] == 0x11; + + if(big_endian) { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 1, + "It's a big endian system but LV_BIG_ENDIAN_SYSTEM is not enabled in lv_conf.h"); + } + else { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 0, + "It's a little endian system but LV_BIG_ENDIAN_SYSTEM is enabled in lv_conf.h"); + } + +#if LV_USE_ASSERT_MEM_INTEGRITY + LV_LOG_WARN("Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_OBJ + LV_LOG_WARN("Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_STYLE + LV_LOG_WARN("Style sanity checks are enabled that uses more RAM"); +#endif + +#if LV_LOG_LEVEL == LV_LOG_LEVEL_TRACE + LV_LOG_WARN("Log level is set to 'Trace' which makes LVGL much slower"); +#endif + +#if LV_USE_FS_FATFS != '\0' + lv_fs_fatfs_init(); +#endif + +#if LV_USE_FS_STDIO != '\0' + lv_fs_stdio_init(); +#endif + +#if LV_USE_FS_POSIX != '\0' + lv_fs_posix_init(); +#endif + +#if LV_USE_FS_WIN32 != '\0' + lv_fs_win32_init(); +#endif + +#if LV_USE_FS_MEMFS + lv_fs_memfs_init(); +#endif + +#if LV_USE_FS_LITTLEFS + lv_fs_littlefs_init(); +#endif + +#if LV_USE_LODEPNG + lv_lodepng_init(); +#endif + +#if LV_USE_LIBPNG + lv_libpng_init(); +#endif + +#if LV_USE_TJPGD + lv_tjpgd_init(); +#endif + +#if LV_USE_LIBJPEG_TURBO + lv_libjpeg_turbo_init(); +#endif + +#if LV_USE_BMP + lv_bmp_init(); +#endif + + /*Make FFMPEG last because the last converter will be checked first and + *it's superior to any other */ +#if LV_USE_FFMPEG + lv_ffmpeg_init(); +#endif + +#if LV_USE_FREETYPE + /*Init freetype library*/ + lv_freetype_init(LV_FREETYPE_CACHE_FT_GLYPH_CNT); +#endif + +#if LV_USE_TINY_TTF + lv_tiny_ttf_init(); +#endif + + lv_initialized = true; + + LV_LOG_TRACE("finished"); +} + +void lv_deinit(void) +{ + /*Do nothing if already deinit*/ + if(!lv_initialized) { + LV_LOG_WARN("lv_deinit: already deinit!"); + return; + } + + if(lv_deinit_in_progress) return; + + lv_deinit_in_progress = true; + +#if LV_USE_SYSMON + _lv_sysmon_builtin_deinit(); +#endif + + lv_display_set_default(NULL); + + _lv_cleanup_devices(LV_GLOBAL_DEFAULT()); + +#if LV_USE_SPAN != 0 + lv_span_stack_deinit(); +#endif + +#if LV_USE_DRAW_SW + lv_draw_sw_deinit(); +#endif + +#if LV_USE_FREETYPE + lv_freetype_uninit(); +#endif + +#if LV_USE_TINY_TTF + lv_tiny_ttf_deinit(); +#endif + +#if LV_USE_THEME_DEFAULT + lv_theme_default_deinit(); +#endif + +#if LV_USE_THEME_SIMPLE + lv_theme_simple_deinit(); +#endif + +#if LV_USE_THEME_MONO + lv_theme_mono_deinit(); +#endif + + _lv_image_decoder_deinit(); + + _lv_refr_deinit(); + + _lv_obj_style_deinit(); + +#if LV_USE_DRAW_PXP + lv_draw_pxp_deinit(); +#endif + +#if LV_USE_DRAW_VGLITE + lv_draw_vglite_deinit(); +#endif + +#if LV_USE_DRAW_VG_LITE + lv_draw_vg_lite_deinit(); +#endif + +#if LV_USE_DRAW_SW + lv_draw_sw_deinit(); +#endif + + lv_draw_deinit(); + + _lv_group_deinit(); + + _lv_anim_core_deinit(); + + _lv_layout_deinit(); + + _lv_fs_deinit(); + + _lv_timer_core_deinit(); + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_profiler_builtin_uninit(); +#endif + +#if LV_USE_OBJ_ID_BUILTIN + lv_objid_builtin_destroy(); +#endif + + lv_mem_deinit(); + + lv_initialized = false; + + LV_LOG_INFO("lv_deinit done"); + +#if LV_USE_LOG + lv_log_register_print_cb(NULL); +#endif + +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/lv_init.h b/libraries/lvgl/src/lv_init.h new file mode 100644 index 0000000..e5b551f --- /dev/null +++ b/libraries/lvgl/src/lv_init.h @@ -0,0 +1,55 @@ +/** + * @file lv_init.h + * + */ + +#ifndef LV_INIT_H +#define LV_INIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize LVGL library. + * Should be called before any other LVGL related function. + */ +void lv_init(void); + +/** + * Deinit the 'lv' library + */ +void lv_deinit(void); + +/** + * Returns whether the 'lv' library is currently initialized + */ +bool lv_is_initialized(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INIT_H*/ diff --git a/libraries/lvgl/src/lvgl.h b/libraries/lvgl/src/lvgl.h new file mode 100644 index 0000000..e4533da --- /dev/null +++ b/libraries/lvgl/src/lvgl.h @@ -0,0 +1,39 @@ +/** + * @file lvgl.h + * This file exists only to be compatible with Arduino's library structure + */ + +#ifndef LVGL_SRC_H +#define LVGL_SRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lvgl.h" +#include "lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_SRC_H*/ diff --git a/libraries/lvgl/src/lvgl_private.h b/libraries/lvgl/src/lvgl_private.h new file mode 100644 index 0000000..c6fc599 --- /dev/null +++ b/libraries/lvgl/src/lvgl_private.h @@ -0,0 +1,39 @@ +/** + * @file lvgl_private.h + * + */ + +#ifndef LVGL_PRIVATE_H +#define LVGL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "display/lv_display_private.h" +#include "indev/lv_indev_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_PRIVATE_H*/ diff --git a/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.c b/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.c new file mode 100644 index 0000000..097f764 --- /dev/null +++ b/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.c @@ -0,0 +1,464 @@ +/** +* @file _lv_cache_lru_rb.c +* +*/ + +/***************************************************************************\ +* * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┌ ─ ─ ─ ┐ * +* ┌ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ Cache insert ┃ * +* ┃ RB Tree │ │Hitting│ head * +* └ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ─ ─ ─ ─ ┃ * +* ┃ ┌─┬─┬─┬─┐ ┌─────┐ * +* ┌──│◄│B│►│ │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┃─ ─ ╋ ─ ─▶│ B │ ┃ * +* ┃ │ └─┴─┴─┴─┘ └──▲──┘ * +* │ │ ┃ ┃ │ ┃ * +* ┃ │ │ ┌──┴──┐ * +* │ └──────┐ ┌ ─┃─ ─ ╋ ─ ─▶│ E │ ┃ * +* ┃ ▼ ┌ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ └──▲──┘ * +* ┌─┬─┬─┬─┐ ▼ │ ┃ ┃ │ ┃ * +* ┃│◄│A│►│ │─ ─ ┘ ┌─┬─┬─┬─┐ │ ┌──┴──┐ * +* └─┴─┴─┴─┘ ┌───│◄│D│►│ │─ ─ ─ ─ ─ ─│─ ╋ ┐ ┃ ─ ▶│ A │ ┌ ─ ─ ─ ─ ─ ┐ ┃ * +* ┃ │ └─┴─┴─┴─┘ └──▲──┘ LRU * +* │ │ │ ┃ │ ┃ │ │ Cache │ ┃ * +* ┃ ▼ └──────┐ ┌──┴──┐ ─ ─ ─ ─ ─ ─ * +* ┌─┬─┬─┬─┐ ▼ │ ┃ └ ─┃─ ─ ▶│ D │ ┃ * +* ┃ │◄│C│►│ │─ ─ ┌─┬─┬─┬─┐ └──▲──┘ * +* └─┴─┴─┴─┘ │ │◄│E│►│ │─ ┘ ┃ ┃ │ ┃ * +* ┃ └─┴─┴─┴─┘ ┌──┴──┐ * +* │ │ ─ ╋ ─ ─┃─ ─ ▶│ C │ ┃ * +* ┃ ─ ─ ─ ─ ┼ ─ ─ ┘ └──▲──┘ * +* ▼ ┃ ┃ ┌ ─ ─│─ ─ ┐ ┃ * +* ┃ ┌─┬─┬─┬─┐ ┌──┴──┐ * +* │◄│F│►│ │─ ─┃─ ─ ╋ ─ ┼▶│ F │ │ ┃ * +* ┃ └─┴─┴─┴─┘ └─────┘ * +* ┃ ┃ └ ─ ─ ─ ─ ┘ ┃ * +* ┃ remove * +* ┃ ┃ tail ┃ * +* ┗ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ * +* * +\***************************************************************************/ + +/********************* + * INCLUDES + *********************/ +#include "_lv_cache_lru_rb.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../stdlib/lv_string.h" +#include "../lv_ll.h" +#include "../lv_rb.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef uint32_t (get_data_size_cb_t)(const void * data); + +struct _lv_lru_rb_t { + lv_cache_t cache; + + lv_rb_t rb; + lv_ll_t ll; + + get_data_size_cb_t * get_data_size_cb; +}; +typedef struct _lv_lru_rb_t lv_lru_rb_t_; +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * alloc_cb(void); +static bool init_cnt_cb(lv_cache_t * cache); +static bool init_size_cb(lv_cache_t * cache); +static void destroy_cb(lv_cache_t * cache, void * user_data); + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data); +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data); +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data); +static void drop_all_cb(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data); +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data); + +static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data); +inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node); + +static uint32_t cnt_get_data_size_cb(const void * data); +static uint32_t size_get_data_size_cb(const void * data); + +/********************** + * GLOBAL VARIABLES + **********************/ +const lv_cache_class_t lv_cache_class_lru_rb_count = { + .alloc_cb = alloc_cb, + .init_cb = init_cnt_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb +}; + +const lv_cache_class_t lv_cache_class_lru_rb_size = { + .alloc_cb = alloc_cb, + .init_cb = init_size_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb +}; +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ +static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_insert(&lru->rb, key); + if(node == NULL) + goto FAILED_HANDLER2; + + void * data = node->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, lru->cache.node_size); + lv_memcpy(data, key, lru->cache.node_size); + + void * lru_node = _lv_ll_ins_head(&lru->ll); + if(lru_node == NULL) + goto FAILED_HANDLER1; + + lv_memcpy(lru_node, &node, sizeof(void *)); + lv_memcpy(get_lru_node(lru, node), &lru_node, sizeof(void *)); + + lv_cache_entry_init(entry, &lru->cache, lru->cache.node_size); + goto FAILED_HANDLER2; + +FAILED_HANDLER1: + lv_rb_drop_node(&lru->rb, node); + node = NULL; +FAILED_HANDLER2: + return node; +} + +inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node) +{ + return (void **)((char *)node->data + lru->rb.size - sizeof(void *)); +} + +static void * alloc_cb(void) +{ + void * res = lv_malloc(sizeof(lv_lru_rb_t_)); + LV_ASSERT_MALLOC(res); + if(res == NULL) { + LV_LOG_ERROR("malloc failed"); + return NULL; + } + + lv_memzero(res, sizeof(lv_lru_rb_t_)); + return res; +} + +static bool init_cnt_cb(lv_cache_t * cache) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.max_size <= 0 + || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + /*add void* to store the ll node pointer*/ + if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { + return false; + } + _lv_ll_init(&lru->ll, sizeof(void *)); + + lru->get_data_size_cb = cnt_get_data_size_cb; + + return true; +} + +static bool init_size_cb(lv_cache_t * cache) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.max_size <= 0 + || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + /*add void* to store the ll node pointer*/ + if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { + return false; + } + _lv_ll_init(&lru->ll, sizeof(void *)); + + lru->get_data_size_cb = size_get_data_size_cb; + + return true; +} + +static void destroy_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + cache->clz->drop_all_cb(cache, user_data); +} + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + /*try the first ll node first*/ + void * head = _lv_ll_get_head(&lru->ll); + if(head) { + lv_rb_node_t * node = *(lv_rb_node_t **)head; + void * data = node->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); + if(lru->cache.ops.compare_cb(data, key) == 0) { + return entry; + } + } + + lv_rb_node_t * node = lv_rb_find(&lru->rb, key); + /*cache hit*/ + if(node) { + void * lru_node = *get_lru_node(lru, node); + head = _lv_ll_get_head(&lru->ll); + _lv_ll_move_before(&lru->ll, lru_node, head); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(node->data, cache->node_size); + return entry; + } + return NULL; +} + +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + lv_rb_node_t * new_node = alloc_new_node(lru, (void *)key, user_data); + if(new_node == NULL) { + return NULL; + } + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(new_node->data, cache->node_size); + + cache->size += lru->get_data_size_cb(key); + + return entry; +} + +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(entry); + + if(lru == NULL || entry == NULL) { + return; + } + + void * data = lv_cache_entry_get_data(entry); + lv_rb_node_t * node = lv_rb_find(&lru->rb, data); + if(node == NULL) { + return; + } + + void * lru_node = *get_lru_node(lru, node); + lv_rb_remove_node(&lru->rb, node); + _lv_ll_remove(&lru->ll, lru_node); + lv_free(lru_node); + + cache->size -= lru->get_data_size_cb(data); +} + +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return; + } + + lv_rb_node_t * node = lv_rb_find(&lru->rb, key); + if(node == NULL) { + return; + } + + void * data = node->data; + + lru->cache.ops.free_cb(data, user_data); + cache->size -= lru->get_data_size_cb(data); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); + void * lru_node = *get_lru_node(lru, node); + + lv_rb_remove_node(&lru->rb, node); + lv_cache_entry_delete(entry); + + _lv_ll_remove(&lru->ll, lru_node); + lv_free(lru_node); +} + +static void drop_all_cb(lv_cache_t * cache, void * user_data) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + uint32_t used_cnt = 0; + lv_rb_node_t ** node; + _LV_LL_READ(&lru->ll, node) { + /*free user handled data and do other clean up*/ + void * search_key = (*node)->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(search_key, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + lru->cache.ops.free_cb(search_key, user_data); + } + else { + LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", (void *)entry, lv_cache_entry_get_ref(entry)); + used_cnt++; + } + } + if(used_cnt > 0) { + LV_LOG_WARN("%" LV_PRId32 " entries are still referenced", used_cnt); + } + + lv_rb_destroy(&lru->rb); + _lv_ll_clear(&lru->ll); + + cache->size = 0; +} + +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + lv_rb_node_t ** tail; + _LV_LL_READ_BACK(&lru->ll, tail) { + lv_rb_node_t * tail_node = *tail; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail_node->data, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + return entry; + } + } + + return NULL; +} + +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return LV_CACHE_RESERVE_COND_ERROR; + } + + uint32_t data_size = key ? lru->get_data_size_cb(key) : 0; + if(data_size > lru->cache.max_size) { + LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size, lru->cache.max_size); + return LV_CACHE_RESERVE_COND_TOO_LARGE; + } + + return cache->size + reserved_size + data_size > lru->cache.max_size + ? LV_CACHE_RESERVE_COND_NEED_VICTIM + : LV_CACHE_RESERVE_COND_OK; +} + +static uint32_t cnt_get_data_size_cb(const void * data) +{ + LV_UNUSED(data); + return 1; +} + +static uint32_t size_get_data_size_cb(const void * data) +{ + lv_cache_slot_size_t * slot = (lv_cache_slot_size_t *)data; + return slot->size; +} diff --git a/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.h b/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.h new file mode 100644 index 0000000..a27110b --- /dev/null +++ b/libraries/lvgl/src/misc/cache/_lv_cache_lru_rb.h @@ -0,0 +1,44 @@ +/** +* @file _lv_cache_lru_rb.h +* +*/ + +#ifndef LV_CACHE_LRU_RB_H +#define LV_CACHE_LRU_RB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_cache_entry.h" +#include "lv_cache_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_count; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_size; +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_LRU_RB_H*/ diff --git a/libraries/lvgl/src/misc/cache/lv_cache.c b/libraries/lvgl/src/misc/cache/lv_cache.c new file mode 100644 index 0000000..e22cd9e --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache.c @@ -0,0 +1,275 @@ +/** +* @file lv_cache.c +* +*/ + +/********************* + * INCLUDES + *********************/ +#include "lv_cache.h" +#include "../../stdlib/lv_sprintf.h" +#include "../lv_assert.h" +#include "lv_cache_entry_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); +static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, + size_t node_size, size_t max_size, + lv_cache_ops_t ops) +{ + lv_cache_t * cache = cache_class->alloc_cb(); + LV_ASSERT_MALLOC(cache); + + cache->clz = cache_class; + cache->node_size = node_size; + cache->max_size = max_size; + cache->size = 0; + cache->ops = ops; + + if(cache->clz->init_cb(cache) == false) { + LV_LOG_ERROR("Cache init failed"); + lv_free(cache); + return NULL; + } + + lv_mutex_init(&cache->lock); + + return cache; +} + +void lv_cache_destroy(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + lv_mutex_lock(&cache->lock); + cache->clz->destroy_cb(cache, user_data); + lv_mutex_unlock(&cache->lock); + lv_mutex_delete(&cache->lock); + lv_free(cache); +} + +lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + lv_mutex_lock(&cache->lock); + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + return entry; +} +void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) +{ + LV_ASSERT_NULL(entry); + + lv_mutex_lock(&cache->lock); + lv_cache_entry_release_data(entry, user_data); + + if(lv_cache_entry_get_ref(entry) == 0 && lv_cache_entry_is_invalid(entry)) { + cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); + lv_cache_entry_delete(entry); + } + lv_mutex_unlock(&cache->lock); +} +lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + lv_mutex_lock(&cache->lock); + lv_cache_entry_t * entry = cache_add_internal_no_lock(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + + return entry; +} +lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + lv_mutex_lock(&cache->lock); + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + lv_mutex_unlock(&cache->lock); + return entry; + } + entry = cache_add_internal_no_lock(cache, key, user_data); + if(entry == NULL) { + lv_mutex_unlock(&cache->lock); + return NULL; + } + bool create_res = cache->ops.create_cb(lv_cache_entry_get_data(entry), user_data); + if(create_res == false) { + cache->clz->remove_cb(cache, entry, user_data); + lv_cache_entry_delete(entry); + entry = NULL; + } + else { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + return entry; +} +void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data) +{ + LV_ASSERT_NULL(cache); + + for(lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data); + reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; + reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data)) + cache_evict_one_internal_no_lock(cache, user_data); + +} +void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + lv_mutex_lock(&cache->lock); + cache_drop_internal_no_lock(cache, key, user_data); + lv_mutex_unlock(&cache->lock); +} +bool lv_cache_evict_one(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + lv_mutex_lock(&cache->lock); + bool res = cache_evict_one_internal_no_lock(cache, user_data); + lv_mutex_unlock(&cache->lock); + + return res; +} +void lv_cache_drop_all(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + lv_mutex_lock(&cache->lock); + cache->clz->drop_all_cb(cache, user_data); + lv_mutex_unlock(&cache->lock); +} + +void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data) +{ + LV_UNUSED(user_data); + cache->max_size = max_size; +} +size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->max_size; +} +size_t lv_cache_get_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->size; +} +size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->max_size - cache->size; +} +void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.compare_cb = compare_cb; +} +void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.create_cb = alloc_cb; +} +void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.free_cb = free_cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(entry == NULL) { + return; + } + + if(lv_cache_entry_get_ref(entry) == 0) { + cache->clz->remove_cb(cache, entry, user_data); + cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); + lv_cache_entry_delete(entry); + } + else { + lv_cache_entry_set_invalid(entry, true); + cache->clz->remove_cb(cache, entry, user_data); + } +} + +static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data) +{ + lv_cache_entry_t * victim = cache->clz->get_victim_cb(cache, user_data); + + if(victim == NULL) { + LV_LOG_ERROR("No victim found"); + return false; + } + + cache->clz->remove_cb(cache, victim, user_data); + cache->ops.free_cb(lv_cache_entry_get_data(victim), user_data); + lv_cache_entry_delete(victim); + return true; +} + +static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data); + if(reserve_cond_res == LV_CACHE_RESERVE_COND_TOO_LARGE) { + LV_LOG_ERROR("data %p is too large that exceeds max size (%" LV_PRIu32 ")", key, cache->max_size); + return NULL; + } + + for(; reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; + reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data)) + if(cache_evict_one_internal_no_lock(cache, user_data) == false) + return NULL; + + lv_cache_entry_t * entry = cache->clz->add_cb(cache, key, user_data); + + return entry; +} diff --git a/libraries/lvgl/src/misc/cache/lv_cache.h b/libraries/lvgl/src/misc/cache/lv_cache.h new file mode 100644 index 0000000..25db6fc --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache.h @@ -0,0 +1,206 @@ +/** +* @file lv_cache.h +* +*/ + +#ifndef LV_CACHE1_H +#define LV_CACHE1_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_cache_entry.h" +#include "lv_cache_private.h" +#include +#include + +#include "_lv_cache_lru_rb.h" + +#include "lv_image_cache.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a cache object with the given parameters. + * @param cache_class The class of the cache. Currently only support one two builtin classes: + * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. + * @param node_size The node size is the size of the data stored in the cache.. + * @param max_size The max size is the maximum amount of memory or count that the cache can hold. + * @lv_cache_class_lru_rb_count: max_size is the maximum count of nodes in the cache. + * @lv_cache_class_lru_rb_size: max_size is the maximum size of the cache in bytes. + * @param ops A set of operations that can be performed on the cache. See @lv_cache_ops_t for details. + * @return Returns a pointer to the created cache object on success, @NULL on error. + */ +lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, + size_t node_size, size_t max_size, + lv_cache_ops_t ops); + +/** + * Destroy a cache object. + * @param cache The cache object pointer to destroy. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_destroy(lv_cache_t * cache, void * user_data); + +/** + * Acquire a cache entry with the given key. If the entry is not in the cache, it will return @NULL as it is not found. + * If the entry is found, it's priority will be changed by the cache's policy. And the @lv_entry_t::ref count will be incremented. + * @param cache The cache object pointer to acquire the entry. + * @param key The key of the entry to acquire. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the acquired cache entry on success with @lv_entry_t::ref count incremented, @NULL on error. + */ +lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Acquire a cache entry with the given key. If the entry is not in the cache, it will create a new entry with the given key. + * If the entry is found, it's priority will be changed by the cache's policy. And the @lv_entry_t::ref count will be incremented. + * If you want to use this API to simplify the code, you should provide a @lv_cache_ops_t::create_cb that creates a new entry with the given key. + * This API is a combination of @lv_cache_acquire and @lv_cache_add. The effect is the same as calling @lv_cache_acquire and @lv_cache_add separately. + * And the internal impact on cache is also consistent with these two APIs. + * @param cache The cache object pointer to acquire the entry. + * @param key The key of the entry to acquire or create. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the acquired or created cache entry on success with @lv_entry_t::ref count incremented, @NULL on error. + */ +lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Add a new cache entry with the given key and data. If the cache is full, the cache's policy will be used to evict an entry. + * @param cache The cache object pointer to add the entry. + * @param key The key of the entry to add. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the added cache entry on success with @lv_entry_t::ref count incremented, @NULL on error. + */ +lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Release a cache entry. The @lv_entry_t::ref count will be decremented. If the @lv_entry_t::ref count is zero, it will issue an error. + * If the entry passed to this function is the last reference to the data and the entry is marked as invalid, the cache's policy will be used to evict the entry. + * @param cache The cache object pointer to release the entry. + * @param entry The cache entry pointer to release. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); + +/** + * Reserve a certain amount of memory/count in the cache. This function is useful when you want to reserve a certain amount of memory/count in advance, + * for example, when you know that you will need it later. + * When the current cache size is max than the reserved size, the function will evict entries until the reserved size is reached. + * @param cache The cache object pointer to reserve. + * @param reserved_size The amount of memory/count to reserve. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data); + +/** + * Drop a cache entry with the given key. If the entry is not in the cache, nothing will happen to it. + * If the entry is found, it will be removed from the cache and its data will be freed when the last reference to it is released. + * @note The data will not be freed immediately but when the last reference to it is released. But this entry will not be found by @lv_cache_acquire. + * If you want cache a same key again, you should use @lv_cache_add or @lv_cache_acquire_or_create. + * @param cache The cache object pointer to drop the entry. + * @param key The key of the entry to drop. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Drop all cache entries. All entries will be removed from the cache and their data will be freed when the last reference to them is released. + * @note If some entries are still referenced by other objects, it will issue an error. And this case shouldn't happen in normal cases.. + * @param cache The cache object pointer to drop all entries. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_drop_all(lv_cache_t * cache, void * user_data); + +/** + * Evict one entry from the cache. The eviction policy will be used to select the entry to evict. + * @param cache The cache object pointer to evict an entry. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns true if an entry is evicted, false if no entry is evicted. + */ +bool lv_cache_evict_one(lv_cache_t * cache, void * user_data); + +/** + * Set the maximum size of the cache. + * If the current cache size is greater than the new maximum size, the cache's policy will be used to evict entries until the new maximum size is reached. + * @note But this behavior will happen only new entries are added to the cache. + * @param cache The cache object pointer to set the maximum size. + * @param max_size The new maximum size of the cache. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data); + +/** + * Get the maximum size of the cache. + * @param cache The cache object pointer to get the maximum size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the maximum size of the cache. + */ +size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data); + +/** + * Get the current size of the cache. + * @param cache The cache object pointer to get the current size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the current size of the cache. + */ +size_t lv_cache_get_size(lv_cache_t * cache, void * user_data); + +/** + * Get the free size of the cache. + * @param cache The cache object pointer to get the free size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the free size of the cache. + */ +size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data); + +/** + * Set the compare callback of the cache. + * @param cache The cache object pointer to set the compare callback. + * @param compare_cb The compare callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data); + +/** + * Set the create callback of the cache. + * @param cache The cache object pointer to set the create callback. + * @param alloc_cb The create callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data); + +/** + * Set the free callback of the cache. + * @param cache The cache object pointer to set the free callback. + * @param free_cb The free callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data); +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_H*/ diff --git a/libraries/lvgl/src/misc/cache/lv_cache_entry.c b/libraries/lvgl/src/misc/cache/lv_cache_entry.c new file mode 100644 index 0000000..242e1a0 --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache_entry.c @@ -0,0 +1,167 @@ +/** +* @file lv_cache_entry.c +* + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_cache_entry.h" +#include "../../stdlib/lv_sprintf.h" +#include "../lv_assert.h" +#include "lv_cache.h" +#include "lv_cache_entry_private.h" +#include "lv_cache_private.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_cache_entry_t { + const lv_cache_t * cache; + int32_t ref_cnt; + uint32_t node_size; + + bool is_invalid; +}; +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_cache_entry_reset_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt = 0; +} +void lv_cache_entry_inc_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt++; +} +void lv_cache_entry_dec_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt--; + if(entry->ref_cnt < 0) { + LV_LOG_WARN("ref_cnt(%" LV_PRIu32 ") < 0", entry->ref_cnt); + entry->ref_cnt = 0; + } +} +int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->ref_cnt; +} +uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry) +{ + return entry->node_size; +} +void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size) +{ + LV_ASSERT_NULL(entry); + entry->node_size = node_size; +} +void lv_cache_entry_set_invalid(lv_cache_entry_t * entry, bool is_invalid) +{ + LV_ASSERT_NULL(entry); + entry->is_invalid = is_invalid; +} +bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->is_invalid; +} +void * lv_cache_entry_get_data(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return (uint8_t *)entry - entry->node_size; +} +void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + + lv_cache_entry_inc_ref(entry); + return lv_cache_entry_get_data(entry); +} +void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(entry); + if(lv_cache_entry_get_ref(entry) == 0) { + LV_LOG_ERROR("ref_cnt(%" LV_PRIu32 ") == 0", entry->ref_cnt); + return; + } + + lv_cache_entry_dec_ref(entry); +} +lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size) +{ + LV_ASSERT_NULL(data); + return (lv_cache_entry_t *)((uint8_t *)data + node_size); +} +void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache) +{ + LV_ASSERT_NULL(entry); + entry->cache = cache; +} +const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->cache; +} + +uint32_t lv_cache_entry_get_size(const uint32_t node_size) +{ + return node_size + sizeof(lv_cache_entry_t); +} +lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache) +{ + void * res = lv_malloc_zeroed(lv_cache_entry_get_size(node_size)); + LV_ASSERT_MALLOC(res) + if(res == NULL) { + LV_LOG_ERROR("malloc failed"); + return NULL; + } + lv_cache_entry_t * entry = (lv_cache_entry_t *)res; + lv_cache_entry_init(entry, cache, node_size); + return (lv_cache_entry_t *)((uint8_t *)entry + node_size); +} +void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size) +{ + LV_ASSERT_NULL(entry); + LV_ASSERT_NULL(cache); + + entry->cache = cache; + entry->node_size = node_size; + entry->ref_cnt = 0; + entry->is_invalid = false; +} +void lv_cache_entry_delete(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + + void * data = lv_cache_entry_get_data(entry); + lv_free(data); +} +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/cache/lv_cache_entry.h b/libraries/lvgl/src/misc/cache/lv_cache_entry.h new file mode 100644 index 0000000..0cd2fb2 --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache_entry.h @@ -0,0 +1,116 @@ +/** +* @file lv_cache_entry.h +* + */ + +#ifndef LV_CACHE_ENTRY_H +#define LV_CACHE_ENTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../osal/lv_os.h" +#include "../lv_types.h" +#include "lv_cache_private.h" +#include +#include +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the size of a cache entry. + * @param node_size The size of the node in the cache. + * @return The size of the cache entry. + */ +uint32_t lv_cache_entry_get_size(const uint32_t node_size); + +/** + * Get the reference count of a cache entry. + * @param entry The cache entry to get the reference count of. + * @return The reference count of the cache entry. + */ +int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry); + +/** + * Get the node size of a cache entry. Which is the same size with @lv_cache_entry_get_size's node_size parameter. + * @param entry The cache entry to get the node size of. + * @return The node size of the cache entry. + */ +uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry); + +/** + * Check if a cache entry is invalid. + * @param entry The cache entry to check. + * @return True: the cache entry is invalid. False: the cache entry is valid. + */ +bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry); + +/** + * Get the data of a cache entry. + * @param entry The cache entry to get the data of. + * @return The pointer to the data of the cache entry. + */ +void * lv_cache_entry_get_data(lv_cache_entry_t * entry); + +/** + * Get the cache instance of a cache entry. + * @param entry The cache entry to get the cache instance of. + * @return The pointer to the cache instance of the cache entry. + */ +const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry); + +/** + * Get the cache entry of a data. The data should be allocated by the cache instance. + * @param data The data to get the cache entry of. + * @param node_size The size of the node in the cache. + * @return The pointer to the cache entry of the data. + */ +lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size); + +/** + * Allocate a cache entry. + * @param node_size The size of the node in the cache. + * @param cache The cache instance to allocate the cache entry from. + * @return The pointer to the allocated cache entry. + */ +lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache); + +/** + * Initialize a cache entry. + * @param entry The cache entry to initialize. + * @param cache The cache instance to allocate the cache entry from. + * @param node_size The size of the node in the cache. + */ +void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size); + +/** + * Deallocate a cache entry. And the data of the cache entry will be freed. + * @param entry The cache entry to deallocate. + */ +void lv_cache_entry_delete(lv_cache_entry_t * entry); +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_ENTRY_H*/ diff --git a/libraries/lvgl/src/misc/cache/lv_cache_entry_private.h b/libraries/lvgl/src/misc/cache/lv_cache_entry_private.h new file mode 100644 index 0000000..227585e --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache_entry_private.h @@ -0,0 +1,51 @@ +/** +* @file lv_cache_entry_private.h +* + */ + +#ifndef LV_CACHE_ENTRY_PRIVATE +#define LV_CACHE_ENTRY_PRIVATE + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_types.h" +#include +#include +#include "../../osal/lv_os.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_cache_entry_reset_ref(lv_cache_entry_t * entry); +void lv_cache_entry_inc_ref(lv_cache_entry_t * entry); +void lv_cache_entry_dec_ref(lv_cache_entry_t * entry); +void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size); +void lv_cache_entry_set_invalid(lv_cache_entry_t * entry, bool is_invalid); +void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache); +void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry); +void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data); +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_ENTRY_PRIVATE*/ diff --git a/libraries/lvgl/src/misc/cache/lv_cache_private.h b/libraries/lvgl/src/misc/cache/lv_cache_private.h new file mode 100644 index 0000000..4dbafd1 --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_cache_private.h @@ -0,0 +1,190 @@ +/** +* @file lv_cache_private.h +* +*/ + +#ifndef LV_CACHE_PRIVATE_H +#define LV_CACHE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_types.h" +#include +#include +#include "../../osal/lv_os.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * The result of the cache reserve condition callback + */ +typedef enum { + LV_CACHE_RESERVE_COND_OK, /**< The condition is met and no entries need to be evicted */ + LV_CACHE_RESERVE_COND_TOO_LARGE, /**< The condition is not met and the reserve size is too large */ + LV_CACHE_RESERVE_COND_NEED_VICTIM, /**< The condition is not met and a victim is needed to be evicted */ + LV_CACHE_RESERVE_COND_ERROR /**< An error occurred while checking the condition */ +} lv_cache_reserve_cond_res_t; + +struct _lv_cache_ops_t; +struct _lv_cache_t; +struct _lv_cache_class_t; +struct _lv_cache_entry_t; + +typedef struct _lv_cache_ops_t lv_cache_ops_t; +typedef struct _lv_cache_t lv_cache_t; +typedef struct _lv_cache_class_t lv_cache_class_t; +typedef struct _lv_cache_entry_t lv_cache_entry_t; + +typedef int8_t lv_cache_compare_res_t; +typedef bool (*lv_cache_create_cb_t)(void * node, void * user_data); +typedef void (*lv_cache_free_cb_t)(void * node, void * user_data); +typedef lv_cache_compare_res_t (*lv_cache_compare_cb_t)(const void * a, const void * b); + +/** + * The cache instance allocation function, used by the cache class to allocate memory for cache instances. + * @return It should return a pointer to the allocated instance. + */ +typedef void * (*lv_cache_alloc_cb_t)(void); + +/** + * The cache instance initialization function, used by the cache class to initialize the cache instance. + * @return It should return true if the initialization is successful, false otherwise. + */ +typedef bool (*lv_cache_init_cb_t)(lv_cache_t * cache); + +/** + * The cache instance destruction function, used by the cache class to destroy the cache instance. + */ +typedef void (*lv_cache_destroy_cb_t)(lv_cache_t * cache, void * user_data); + +/** + * The cache get function, used by the cache class to get a cache entry by its key. + * @return @NULL if the key is not found. + */ +typedef lv_cache_entry_t * (*lv_cache_get_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache add function, used by the cache class to add a cache entry with a given key. + * This function only cares about how to add the entry, it doesn't check if the entry already exists and doesn't care about is it a victim or not. + * @return the added cache entry, or NULL if the entry is not added. + */ +typedef lv_cache_entry_t * (*lv_cache_add_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache remove function, used by the cache class to remove a cache entry from the cache but doesn't free the memory.. + * This function only cares about how to remove the entry, it doesn't care about is it a victim or not. + */ +typedef void (*lv_cache_remove_cb_t)(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); + +/** + * The cache drop function, used by the cache class to remove a cache entry from the cache and free the memory. + */ +typedef void (*lv_cache_drop_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache drop all function, used by the cache class to remove all cache entries from the cache and free the memory. + */ +typedef void (*lv_cache_drop_all_cb_t)(lv_cache_t * cache, void * user_data); + +/** + * The cache get victim function, used by the cache class to get a victim entry to be evicted. + */ +typedef lv_cache_entry_t * (*lv_cache_get_victim_cb)(lv_cache_t * cache, void * user_data); + +/** + * The cache reserve condition function, used by the cache class to check if a new entry can be added to the cache without exceeding its maximum size. + * See @lv_cache_reserve_cond_res_t for the possible results. + */ +typedef lv_cache_reserve_cond_res_t (*lv_cache_reserve_cond_cb)(lv_cache_t * cache, const void * key, size_t size, + void * user_data); + +/** + * The cache operations struct + */ +struct _lv_cache_ops_t { + lv_cache_compare_cb_t compare_cb; /**< Compare function for keys */ + lv_cache_create_cb_t create_cb; /**< Create function for nodes */ + lv_cache_free_cb_t free_cb; /**< Free function for nodes */ +}; + +/** + * The cache entry struct + */ +struct _lv_cache_t { + const lv_cache_class_t * clz; /**< The cache class. There are two built-in classes: + * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */ + + uint32_t node_size; /**< The size of a node */ + + uint32_t max_size; /**< The maximum size of the cache */ + uint32_t size; /**< The current size of the cache */ + + lv_cache_ops_t ops; /**< The cache operations struct @lv_cache_ops_t */ + + lv_mutex_t lock; /**< The cache lock used to protect the cache in multithreading environments */ +}; + +/** + * The cache class struct for building custom cache classes, and there are two built-in classes for examples: + * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. + */ +struct _lv_cache_class_t { + lv_cache_alloc_cb_t alloc_cb; /**< The allocation function for cache entries */ + lv_cache_init_cb_t init_cb; /**< The initialization function for cache entries */ + lv_cache_destroy_cb_t destroy_cb; /**< The destruction function for cache entries */ + + lv_cache_get_cb_t get_cb; /**< The get function for cache entries */ + lv_cache_add_cb_t add_cb; /**< The add function for cache entries */ + lv_cache_remove_cb_t remove_cb; /**< The remove function for cache entries */ + lv_cache_drop_cb_t drop_cb; /**< The drop function for cache entries */ + lv_cache_drop_all_cb_t drop_all_cb; /**< The drop all function for cache entries */ + lv_cache_get_victim_cb get_victim_cb; /**< The get victim function for cache entries */ + lv_cache_reserve_cond_cb reserve_cond_cb; /**< The reserve condition function for cache entries */ +}; + +/*----------------- + * Cache entry slot + *----------------*/ + +struct _lv_cache_slot_size_t; + +typedef struct _lv_cache_slot_size_t lv_cache_slot_size_t; + +/** + * The cache entry slot struct + * To add new fields to the cache entry, add them to a new struct and add it to the first field of the cache data struct. + * And this one is a size slot for the cache entry. + */ +struct _lv_cache_slot_size_t { + size_t size; +}; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_PRIVATE_H*/ diff --git a/libraries/lvgl/src/misc/cache/lv_image_cache.c b/libraries/lvgl/src/misc/cache/lv_image_cache.c new file mode 100644 index 0000000..28f0aec --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_image_cache.c @@ -0,0 +1,109 @@ +/** +* @file lv_image_cache.c +* + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_assert.h" +#include "lv_image_cache.h" +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_image_cache_drop(const void * src) +{ + /*If user invalidate image, the header cache should be invalidated too.*/ + lv_image_header_cache_drop(src); + +#if LV_CACHE_DEF_SIZE > 0 + if(src == NULL) { + lv_cache_drop_all(img_cache_p, NULL); + return; + } + + lv_image_cache_data_t search_key = { + .src = src, + .src_type = lv_image_src_get_type(src), + }; + + lv_cache_drop(img_cache_p, &search_key, NULL); +#else + LV_UNUSED(src); +#endif +} + +void lv_image_cache_resize(uint32_t new_size, bool evict_now) +{ +#if LV_CACHE_DEF_SIZE > 0 + lv_cache_set_max_size(img_cache_p, new_size, NULL); + if(evict_now) { + lv_cache_reserve(img_cache_p, new_size, NULL); + } +#else + LV_UNUSED(new_size); + LV_UNUSED(evict_now); +#endif +} + +void lv_image_header_cache_drop(const void * src) +{ +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + if(src == NULL) { + lv_cache_drop_all(img_header_cache_p, NULL); + return; + } + + lv_image_header_cache_data_t search_key = { + .src = src, + .src_type = lv_image_src_get_type(src), + }; + + lv_cache_drop(img_header_cache_p, &search_key, NULL); +#else + LV_UNUSED(src); +#endif +} + +void lv_image_header_cache_resize(uint32_t new_size, bool evict_now) +{ +#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 + lv_cache_set_max_size(img_header_cache_p, new_size, NULL); + if(evict_now) { + lv_cache_reserve(img_header_cache_p, new_size, NULL); + } +#else + LV_UNUSED(new_size); + LV_UNUSED(evict_now); +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/cache/lv_image_cache.h b/libraries/lvgl/src/misc/cache/lv_image_cache.h new file mode 100644 index 0000000..f8a5903 --- /dev/null +++ b/libraries/lvgl/src/misc/cache/lv_image_cache.h @@ -0,0 +1,69 @@ +/** +* @file lv_image_cache.h +* + */ + +#ifndef LV_IMAGE_CACHE_H +#define LV_IMAGE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_cache_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Invalidate image cache. Use NULL to invalidate all images. + * @param src pointer to an image source. + */ +void lv_image_cache_drop(const void * src); + +/** + * Resize image cache. + * @param new_size new size of the cache in bytes. + * @param evict_now true: evict the images should be removed by the eviction policy, false: wait for the next cache cleanup. + */ +void lv_image_cache_resize(uint32_t new_size, bool evict_now); + +/** + * Invalidate image header cache. Use NULL to invalidate all image headers. + * It's also automatically called when an image is invalidated. + * @param src pointer to an image source. + */ +void lv_image_header_cache_drop(const void * src); + +/** + * Resize image header cache. + * @param new_size new size of the cache in count of image headers. + * @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup. + */ +void lv_image_header_cache_resize(uint32_t new_size, bool evict_now); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_CACHE_H*/ diff --git a/libraries/lvgl/src/misc/lv_anim.c b/libraries/lvgl/src/misc/lv_anim.c new file mode 100644 index 0000000..b33c599 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_anim.c @@ -0,0 +1,555 @@ +/** + * @file lv_anim.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_anim.h" + +#include "../core/lv_global.h" +#include "../tick/lv_tick.h" +#include "lv_assert.h" +#include "lv_timer.h" +#include "lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define LV_ANIM_RESOLUTION 1024 +#define LV_ANIM_RES_SHIFT 10 +#define state LV_GLOBAL_DEFAULT()->anim_state +#define anim_ll_p &(state.anim_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void anim_timer(lv_timer_t * param); +static void anim_mark_list_change(void); +static void anim_completed_handler(lv_anim_t * a); +static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, + int32_t y1, int32_t x2, int32_t y2); +static uint32_t convert_speed_to_time(uint32_t speed, int32_t start, int32_t end); +static void resolve_time(lv_anim_t * a); +static bool remove_concurrent_anims(lv_anim_t * a_current); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_ANIM + #define LV_TRACE_ANIM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_ANIM(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_anim_core_init(void) +{ + _lv_ll_init(anim_ll_p, sizeof(lv_anim_t)); + state.timer = lv_timer_create(anim_timer, LV_DEF_REFR_PERIOD, NULL); + anim_mark_list_change(); /*Turn off the animation timer*/ + state.anim_list_changed = false; + state.anim_run_round = false; +} + +void _lv_anim_core_deinit(void) +{ + lv_anim_delete_all(); +} + +void lv_anim_init(lv_anim_t * a) +{ + lv_memzero(a, sizeof(lv_anim_t)); + a->duration = 500; + a->start_value = 0; + a->end_value = 100; + a->repeat_cnt = 1; + a->path_cb = lv_anim_path_linear; + a->early_apply = 1; +} + +lv_anim_t * lv_anim_start(const lv_anim_t * a) +{ + LV_TRACE_ANIM("begin"); + + /*Add the new animation to the animation linked list*/ + lv_anim_t * new_anim = _lv_ll_ins_head(anim_ll_p); + LV_ASSERT_MALLOC(new_anim); + if(new_anim == NULL) return NULL; + + /*Initialize the animation descriptor*/ + lv_memcpy(new_anim, a, sizeof(lv_anim_t)); + if(a->var == a) new_anim->var = new_anim; + new_anim->run_round = state.anim_run_round; + new_anim->last_timer_run = lv_tick_get(); + + /*Set the start value*/ + if(new_anim->early_apply) { + if(new_anim->get_value_cb) { + int32_t v_ofs = new_anim->get_value_cb(new_anim); + new_anim->start_value += v_ofs; + new_anim->end_value += v_ofs; + + } + + resolve_time(new_anim); + + /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ + if(a->exec_cb || a->custom_exec_cb) remove_concurrent_anims(new_anim); + + if(new_anim->exec_cb) { + new_anim->exec_cb(new_anim->var, new_anim->start_value); + } + if(new_anim->custom_exec_cb) { + new_anim->custom_exec_cb(new_anim, new_anim->start_value); + } + } + + /*Creating an animation changed the linked list. + *It's important if it happens in a ready callback. (see `anim_timer`)*/ + anim_mark_list_change(); + + LV_TRACE_ANIM("finished"); + return new_anim; +} + +uint32_t lv_anim_get_playtime(const lv_anim_t * a) +{ + if(a->repeat_cnt == LV_ANIM_REPEAT_INFINITE) { + return LV_ANIM_PLAYTIME_INFINITE; + } + + uint32_t repeate_cnt = a->repeat_cnt; + if(repeate_cnt < 1) repeate_cnt = 1; + + uint32_t playtime = a->repeat_delay + a->duration + a->playback_delay + a->playback_duration; + playtime = playtime * a->repeat_cnt; + return playtime; +} + +bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + bool del_any = false; + a = _lv_ll_get_head(anim_ll_p); + while(a != NULL) { + bool del = false; + if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) { + _lv_ll_remove(anim_ll_p, a); + if(a->deleted_cb != NULL) a->deleted_cb(a); + lv_free(a); + anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in + the linked list*/ + del_any = true; + del = true; + } + + /*Always start from the head on delete, because we don't know + *how `anim_ll_p` was changes in `a->deleted_cb` */ + a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a); + } + + return del_any; +} + +void lv_anim_delete_all(void) +{ + _lv_ll_clear(anim_ll_p); + anim_mark_list_change(); +} + +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + _LV_LL_READ(anim_ll_p, a) { + if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { + return a; + } + } + + return NULL; +} + +lv_timer_t * lv_anim_get_timer(void) +{ + return state.timer; +} + +uint16_t lv_anim_count_running(void) +{ + uint16_t cnt = 0; + lv_anim_t * a; + _LV_LL_READ(anim_ll_p, a) cnt++; + + return cnt; +} + +uint32_t lv_anim_speed_clamped(uint32_t speed, uint32_t min_time, uint32_t max_time) +{ + + if(speed > 10000) { + LV_LOG_WARN("speed is truncated to 10000 (was %"LV_PRIu32")", speed); + speed = 10230; + } + if(min_time > 10000) { + LV_LOG_WARN("min_time is truncated to 10000 (was %"LV_PRIu32")", min_time); + min_time = 10230; + } + if(max_time > 10000) { + LV_LOG_WARN("max_time is truncated to 10000 (was %"LV_PRIu32")", max_time); + max_time = 10230; + } + + /*Lower the resolution to fit the 0.1023 range*/ + speed = (speed + 5) / 10; + min_time = (min_time + 5) / 10; + max_time = (max_time + 5) / 10; + + return 0x80000000 + (max_time << 20) + (min_time << 10) + speed; + +} + +uint32_t lv_anim_speed(uint32_t speed) +{ + return lv_anim_speed_clamped(speed, 0, 10000); +} + +void lv_anim_refr_now(void) +{ + anim_timer(NULL); +} + +int32_t lv_anim_path_linear(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t step = lv_map(a->act_time, 0, a->duration, 0, LV_ANIM_RESOLUTION); + + /*Get the new value which will be proportional to `step` + *and the `start` and `end` values*/ + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_ANIM_RES_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_ease_in(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(1), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_ease_out(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_overshoot(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, 341, 0, 683, 1300); +} + +int32_t lv_anim_path_bounce(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); + int32_t diff = (a->end_value - a->start_value); + + /*3 bounces has 5 parts: 3 down and 2 up. One part is t / 5 long*/ + + if(t < 408) { + /*Go down*/ + t = (t * 2500) >> LV_BEZIER_VAL_SHIFT; /*[0..1024] range*/ + } + else if(t >= 408 && t < 614) { + /*First bounce back*/ + t -= 408; + t = t * 5; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 20; + } + else if(t >= 614 && t < 819) { + /*Fall back*/ + t -= 614; + t = t * 5; /*to [0..1024] range*/ + diff = diff / 20; + } + else if(t >= 819 && t < 921) { + /*Second bounce back*/ + t -= 819; + t = t * 10; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 40; + } + else if(t >= 921 && t <= LV_BEZIER_VAL_MAX) { + /*Fall back*/ + t -= 921; + t = t * 10; /*to [0..1024] range*/ + diff = diff / 40; + } + + if(t > LV_BEZIER_VAL_MAX) t = LV_BEZIER_VAL_MAX; + if(t < 0) t = 0; + int32_t step = lv_bezier3(t, LV_BEZIER_VAL_MAX, 800, 500, 0); + + int32_t new_value; + new_value = step * diff; + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value = a->end_value - new_value; + + return new_value; +} + +int32_t lv_anim_path_step(const lv_anim_t * a) +{ + if(a->act_time >= a->duration) + return a->end_value; + else + return a->start_value; +} + +int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a) +{ + const struct _lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + return lv_anim_path_cubic_bezier(a, para->x1, para->y1, para->x2, para->y2); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +/** + * Periodically handle the animations. + * @param param unused + */ +static void anim_timer(lv_timer_t * param) +{ + LV_UNUSED(param); + + /*Flip the run round*/ + state.anim_run_round = state.anim_run_round ? false : true; + + lv_anim_t * a = _lv_ll_get_head(anim_ll_p); + + while(a != NULL) { + + // printf("%p, %d\n", a, a->start_value); + + uint32_t elaps = lv_tick_elaps(a->last_timer_run); + a->act_time += elaps; + + a->last_timer_run = lv_tick_get(); + + /*It can be set by `lv_anim_delete()` typically in `end_cb`. If set then an animation delete + * happened in `anim_completed_handler` which could make this linked list reading corrupt + * because the list is changed meanwhile + */ + state.anim_list_changed = false; + + if(a->run_round != state.anim_run_round) { + a->run_round = state.anim_run_round; /*The list readying might be reset so need to know which anim has run already*/ + + /*The animation will run now for the first time. Call `start_cb`*/ + if(!a->start_cb_called && a->act_time >= 0) { + + if(a->early_apply == 0 && a->get_value_cb) { + int32_t v_ofs = a->get_value_cb(a); + a->start_value += v_ofs; + a->end_value += v_ofs; + } + + resolve_time(a); + + if(a->start_cb) a->start_cb(a); + a->start_cb_called = 1; + + /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ + remove_concurrent_anims(a); + } + + if(a->act_time >= 0) { + if(a->act_time > a->duration) a->act_time = a->duration; + + int32_t new_value; + new_value = a->path_cb(a); + + if(new_value != a->current_value) { + a->current_value = new_value; + /*Apply the calculated value*/ + if(a->exec_cb) a->exec_cb(a->var, new_value); + if(!state.anim_list_changed && a->custom_exec_cb) a->custom_exec_cb(a, new_value); + } + + /*If the time is elapsed the animation is ready*/ + if(!state.anim_list_changed && a->act_time >= a->duration) { + anim_completed_handler(a); + } + } + } + + /*If the linked list changed due to anim. delete then it's not safe to continue + *the reading of the list from here -> start from the head*/ + if(state.anim_list_changed) + a = _lv_ll_get_head(anim_ll_p); + else + a = _lv_ll_get_next(anim_ll_p, a); + } + +} + +/** + * Called when an animation is completed to do the necessary things + * e.g. repeat, play back, delete etc. + * @param a pointer to an animation descriptor + */ +static void anim_completed_handler(lv_anim_t * a) +{ + /*In the end of a forward anim decrement repeat cnt.*/ + if(a->playback_now == 0 && a->repeat_cnt > 0 && a->repeat_cnt != LV_ANIM_REPEAT_INFINITE) { + a->repeat_cnt--; + } + + /*Delete the animation if + * - no repeat left and no play back (simple one shot animation) + * - no repeat, play back is enabled and play back is ready*/ + if(a->repeat_cnt == 0 && (a->playback_duration == 0 || a->playback_now == 1)) { + + /*Delete the animation from the list. + * This way the `completed_cb` will see the animations like it's animation is already deleted*/ + _lv_ll_remove(anim_ll_p, a); + /*Flag that the list has changed*/ + anim_mark_list_change(); + + /*Call the callback function at the end*/ + if(a->completed_cb != NULL) a->completed_cb(a); + if(a->deleted_cb != NULL) a->deleted_cb(a); + lv_free(a); + } + /*If the animation is not deleted then restart it*/ + else { + a->act_time = -(int32_t)(a->repeat_delay); /*Restart the animation*/ + /*Swap the start and end values in play back mode*/ + if(a->playback_duration != 0) { + /*If now turning back use the 'playback_pause*/ + if(a->playback_now == 0) a->act_time = -(int32_t)(a->playback_delay); + + /*Toggle the play back state*/ + a->playback_now = a->playback_now == 0 ? 1 : 0; + /*Swap the start and end values*/ + int32_t tmp = a->start_value; + a->start_value = a->end_value; + a->end_value = tmp; + /*Swap the time and playback_duration*/ + tmp = a->duration; + a->duration = a->playback_duration; + a->playback_duration = tmp; + } + } +} + +static void anim_mark_list_change(void) +{ + state.anim_list_changed = true; + if(_lv_ll_get_head(anim_ll_p) == NULL) + lv_timer_pause(state.timer); + else + lv_timer_resume(state.timer); +} + +static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_cubic_bezier(t, x1, y1, x2, y2); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +static uint32_t convert_speed_to_time(uint32_t speed_or_time, int32_t start, int32_t end) +{ + /*It was a simple time*/ + if((speed_or_time & 0x80000000) == 0) return speed_or_time; + + uint32_t d = LV_ABS(start - end); + uint32_t speed = speed_or_time & 0x3FF; + uint32_t time = (d * 100) / speed; /*Speed is in 10 units per sec*/ + uint32_t max_time = (speed_or_time >> 20) & 0x3FF; + uint32_t min_time = (speed_or_time >> 10) & 0x3FF; + + return LV_CLAMP(min_time * 10, time, max_time * 10); +} + +static void resolve_time(lv_anim_t * a) +{ + a->duration = convert_speed_to_time(a->duration, a->start_value, a->end_value); + a->playback_duration = convert_speed_to_time(a->playback_duration, a->start_value, a->end_value); + a->playback_delay = convert_speed_to_time(a->playback_delay, a->start_value, a->end_value); + a->repeat_delay = convert_speed_to_time(a->repeat_delay, a->start_value, a->end_value); +} + +/** + * Remove animations which are animating the same var with the same exec_cb + * and they are already running or they have early_apply + * @param a_current the current animation, use its var and exec_cb as reference to know what to remove + * @return true: at least one animation was delete + */ +static bool remove_concurrent_anims(lv_anim_t * a_current) +{ + if(a_current->exec_cb == NULL && a_current->custom_exec_cb == NULL) return false; + + lv_anim_t * a; + bool del_any = false; + a = _lv_ll_get_head(anim_ll_p); + while(a != NULL) { + bool del = false; + /*We can't test for custom_exec_cb equality because in the MicroPython binding + *a wrapper callback is used here an the real callback data is stored in the `user_data`. + *Therefore equality check would remove all animations.*/ + if(a != a_current && + (a->act_time >= 0 || a->early_apply) && + (a->var == a_current->var) && + ((a->exec_cb && a->exec_cb == a_current->exec_cb) + /*|| (a->custom_exec_cb && a->custom_exec_cb == a_current->custom_exec_cb)*/)) { + _lv_ll_remove(anim_ll_p, a); + if(a->deleted_cb != NULL) a->deleted_cb(a); + lv_free(a); + /*Read by `anim_timer`. It need to know if a delete occurred in the linked list*/ + anim_mark_list_change(); + + del_any = true; + del = true; + } + + /*Always start from the head on delete, because we don't know + *how `anim_ll_p` was changes in `a->deleted_cb` */ + a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a); + } + + return del_any; +} diff --git a/libraries/lvgl/src/misc/lv_anim.h b/libraries/lvgl/src/misc/lv_anim.h new file mode 100644 index 0000000..bff3b33 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_anim.h @@ -0,0 +1,621 @@ +/** + * @file lv_anim.h + * + */ + +#ifndef LV_ANIM_H +#define LV_ANIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" +#include "lv_math.h" +#include "lv_timer.h" +#include "lv_ll.h" + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_ANIM_REPEAT_INFINITE 0xFFFF +#define LV_ANIM_PLAYTIME_INFINITE 0xFFFFFFFF + +/* + * Macros used to set cubic-bezier anim parameter. + * Parameters come from https://easings.net/ + * + * Usage: + * + * lv_anim_t a; + * lv_anim_init(&a); + * ... + * lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); + * LV_ANIM_SET_EASE_IN_SINE(&a); //Set cubic-bezier anim parameter to easeInSine + * ... + * lv_anim_start(&a); + */ + +#define _PARA(a, x1, y1, x2, y2) ((a)->parameter.bezier3 = \ +(struct _lv_anim_bezier3_para_t) { \ + LV_BEZIER_VAL_FLOAT(x1), LV_BEZIER_VAL_FLOAT(y1), \ + LV_BEZIER_VAL_FLOAT(x2), LV_BEZIER_VAL_FLOAT(y2) } \ + ) + +#define LV_ANIM_SET_EASE_IN_SINE(a) _PARA(a, 0.12, 0, 0.39, 0) +#define LV_ANIM_SET_EASE_OUT_SINE(a) _PARA(a, 0.61, 1, 0.88, 1) +#define LV_ANIM_SET_EASE_IN_OUT_SINE(a) _PARA(a, 0.37, 0, 0.63, 1) +#define LV_ANIM_SET_EASE_IN_QUAD(a) _PARA(a, 0.11, 0, 0.5, 0) +#define LV_ANIM_SET_EASE_OUT_QUAD(a) _PARA(a, 0.5, 1, 0.89, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUAD(a) _PARA(a, 0.45, 0, 0.55, 1) +#define LV_ANIM_SET_EASE_IN_CUBIC(a) _PARA(a, 0.32, 0, 0.67, 0) +#define LV_ANIM_SET_EASE_OUT_CUBIC(a) _PARA(a, 0.33, 1, 0.68, 1) +#define LV_ANIM_SET_EASE_IN_OUT_CUBIC(a) _PARA(a, 0.65, 0, 0.35, 1) +#define LV_ANIM_SET_EASE_IN_QUART(a) _PARA(a, 0.5, 0, 0.75, 0) +#define LV_ANIM_SET_EASE_OUT_QUART(a) _PARA(a, 0.25, 1, 0.5, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUART(a) _PARA(a, 0.76, 0, 0.24, 1) +#define LV_ANIM_SET_EASE_IN_QUINT(a) _PARA(a, 0.64, 0, 0.78, 0) +#define LV_ANIM_SET_EASE_OUT_QUINT(a) _PARA(a, 0.22, 1, 0.36, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUINT(a) _PARA(a, 0.83, 0, 0.17, 1) +#define LV_ANIM_SET_EASE_IN_EXPO(a) _PARA(a, 0.7, 0, 0.84, 0) +#define LV_ANIM_SET_EASE_OUT_EXPO(a) _PARA(a, 0.16, 1, 0.3, 1) +#define LV_ANIM_SET_EASE_IN_OUT_EXPO(a) _PARA(a, 0.87, 0, 0.13, 1) +#define LV_ANIM_SET_EASE_IN_CIRC(a) _PARA(a, 0.55, 0, 1, 0.45) +#define LV_ANIM_SET_EASE_OUT_CIRC(a) _PARA(a, 0, 0.55, 0.45, 1) +#define LV_ANIM_SET_EASE_IN_OUT_CIRC(a) _PARA(a, 0.85, 0, 0.15, 1) +#define LV_ANIM_SET_EASE_IN_BACK(a) _PARA(a, 0.36, 0, 0.66, -0.56) +#define LV_ANIM_SET_EASE_OUT_BACK(a) _PARA(a, 0.34, 1.56, 0.64, 1) +#define LV_ANIM_SET_EASE_IN_OUT_BACK(a) _PARA(a, 0.68, -0.6, 0.32, 1.6) + +LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); +LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE); + +/********************** + * TYPEDEFS + **********************/ + +/** Can be used to indicate if animations are enabled or disabled in a case*/ +typedef enum { + LV_ANIM_OFF, + LV_ANIM_ON, +} lv_anim_enable_t; + +typedef struct { + bool anim_list_changed; + bool anim_run_round; + lv_timer_t * timer; + lv_ll_t anim_ll; +} lv_anim_state_t; + +/** Get the current value during an animation*/ +typedef int32_t (*lv_anim_path_cb_t)(const lv_anim_t *); + +/** Generic prototype of "animator" functions. + * First parameter is the variable to animate. + * Second parameter is the value to set. + * Compatible with `lv_xxx_set_yyy(obj, value)` functions + * The `x` in `_xcb_t` means it's not a fully generic prototype because + * it doesn't receive `lv_anim_t *` as its first argument*/ +typedef void (*lv_anim_exec_xcb_t)(void *, int32_t); + +/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter. + * It's more consistent but less convenient. Might be used by binding generator functions.*/ +typedef void (*lv_anim_custom_exec_cb_t)(lv_anim_t *, int32_t); + +/** Callback to call when the animation is ready*/ +typedef void (*lv_anim_completed_cb_t)(lv_anim_t *); + +/** Callback to call when the animation really stars (considering `delay`)*/ +typedef void (*lv_anim_start_cb_t)(lv_anim_t *); + +/** Callback used when the animation values are relative to get the current value*/ +typedef int32_t (*lv_anim_get_value_cb_t)(lv_anim_t *); + +/** Callback used when the animation is deleted*/ +typedef void (*lv_anim_deleted_cb_t)(lv_anim_t *); + +typedef struct _lv_anim_bezier3_para_t { + int16_t x1; + int16_t y1; + int16_t x2; + int16_t y2; +} lv_anim_bezier3_para_t; /**< Parameter used when path is custom_bezier*/ + +/** Describes an animation*/ +struct _lv_anim_t { + void * var; /**var = var; +} + +/** + * Set a function to animate `var` + * @param a pointer to an initialized `lv_anim_t` variable + * @param exec_cb a function to execute during animation + * LVGL's built-in functions can be used. + * E.g. lv_obj_set_x + */ +static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) +{ + a->exec_cb = exec_cb; +} + +/** + * Set the duration of an animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param duration duration of the animation in milliseconds + */ +static inline void lv_anim_set_duration(lv_anim_t * a, uint32_t duration) +{ + a->duration = duration; +} + +/** + * Legacy `lv_anim_set_time` API will be removed soon, use `lv_anim_set_duration` instead. + */ +static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration) +{ + lv_anim_set_duration(a, duration); +} + +/** + * Set a delay before starting the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay before the animation in milliseconds + */ +static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) +{ + a->act_time = -(int32_t)(delay); +} + +/** + * Set the start and end values of an animation + * @param a pointer to an initialized `lv_anim_t` variable + * @param start the start value + * @param end the end value + */ +static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) +{ + a->start_value = start; + a->current_value = INT32_MIN; + a->end_value = end; +} + +/** + * Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives + * `lv_anim_t * ` as its first parameter instead of `void *`. + * This function might be used when LVGL is bound to other languages because + * it's more consistent to have `lv_anim_t *` as first parameter. + * @param a pointer to an initialized `lv_anim_t` variable + * @param exec_cb a function to execute. + */ +static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + a->custom_exec_cb = exec_cb; +} + +/** + * Set the path (curve) of the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param path_cb a function to set the current value of the animation. + */ +static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) +{ + a->path_cb = path_cb; +} + +/** + * Set a function call when the animation really starts (considering `delay`) + * @param a pointer to an initialized `lv_anim_t` variable + * @param start_cb a function call when the animation starts + */ +static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) +{ + a->start_cb = start_cb; +} + +/** + * Set a function to use the current value of the variable and make start and end value + * relative to the returned current value. + * @param a pointer to an initialized `lv_anim_t` variable + * @param get_value_cb a function call when the animation starts + */ +static inline void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) +{ + a->get_value_cb = get_value_cb; +} + +/** + * Set a function call when the animation is completed + * @param a pointer to an initialized `lv_anim_t` variable + * @param completed_cb a function call when the animation is fully completed + */ +static inline void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb) +{ + a->completed_cb = completed_cb; +} + +/** + * Set a function call when the animation is deleted. + * @param a pointer to an initialized `lv_anim_t` variable + * @param deleted_cb a function call when the animation is deleted + */ +static inline void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) +{ + a->deleted_cb = deleted_cb; +} + +/** + * Make the animation to play back to when the forward direction is ready + * @param a pointer to an initialized `lv_anim_t` variable + * @param time the duration of the playback animation in milliseconds. 0: disable playback + */ +static inline void lv_anim_set_playback_duration(lv_anim_t * a, uint32_t duration) +{ + a->playback_duration = duration; +} + +/** + * Legacy `lv_anim_set_playback_time` API will be removed soon, use `lv_anim_set_playback_duration` instead. + */ +static inline void lv_anim_set_playback_time(lv_anim_t * a, uint32_t duration) +{ + lv_anim_set_playback_duration(a, duration); +} + +/** + * Make the animation to play back to when the forward direction is ready + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay in milliseconds before starting the playback animation. + */ +static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) +{ + a->playback_delay = delay; +} + +/** + * Make the animation repeat itself. + * @param a pointer to an initialized `lv_anim_t` variable + * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. + */ +static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt) +{ + a->repeat_cnt = cnt; +} + +/** + * Set a delay before repeating the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param delay delay in milliseconds before repeating the animation. + */ +static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) +{ + a->repeat_delay = delay; +} + +/** + * Set a whether the animation's should be applied immediately or only when the delay expired. + * @param a pointer to an initialized `lv_anim_t` variable + * @param en true: apply the start value immediately in `lv_anim_start`; + * false: apply the start value only when `delay` ms is elapsed and the animations really starts + */ +static inline void lv_anim_set_early_apply(lv_anim_t * a, bool en) +{ + a->early_apply = en; +} + +/** + * Set the custom user data field of the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @param user_data pointer to the new user_data. + */ +static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data) +{ + a->user_data = user_data; +} + +/** + * Set parameter for cubic bezier path + * @param a pointer to an initialized `lv_anim_t` variable + * @param x1 first control point + * @param y1 + * @param y1 second control point + */ +static inline void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2) +{ + struct _lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + + para->x1 = x1; + para->x2 = x2; + para->y1 = y1; + para->y2 = y2; +} + +/** + * Create an animation + * @param a an initialized 'anim_t' variable. Not required after call. + * @return pointer to the created animation (different from the `a` parameter) + */ +lv_anim_t * lv_anim_start(const lv_anim_t * a); + +/** + * Get a delay before starting the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @return delay before the animation in milliseconds + */ +static inline uint32_t lv_anim_get_delay(const lv_anim_t * a) +{ + return -a->act_time; +} + +/** + * Get the time used to play the animation. + * @param a pointer to an animation. + * @return the play time in milliseconds. + */ +uint32_t lv_anim_get_playtime(const lv_anim_t * a); + +/** + * Get the duration of an animation + * @param a pointer to an initialized `lv_anim_t` variable + * @return the duration of the animation in milliseconds + */ +static inline uint32_t lv_anim_get_time(const lv_anim_t * a) +{ + return a->duration; +} + +/** + * Get the repeat count of the animation. + * @param a pointer to an initialized `lv_anim_t` variable + * @return the repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: disabled repetition. + */ +static inline uint16_t lv_anim_get_repeat_count(const lv_anim_t * a) +{ + return a->repeat_cnt; +} + +/** + * Get the user_data field of the animation + * @param a pointer to an initialized `lv_anim_t` variable + * @return the pointer to the custom user_data of the animation + */ +static inline void * lv_anim_get_user_data(const lv_anim_t * a) +{ + return a->user_data; +} + +/** + * Delete animation(s) of a variable with a given animator function + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', + * or NULL to ignore it and delete all the animations of 'var + * @return true: at least 1 animation is deleted, false: no animation is deleted + */ +bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb); + +/** + * Delete all the animations + */ +void lv_anim_delete_all(void); + +/** + * Get the animation of a variable and its `exec_cb`. + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' + * @return pointer to the animation. + */ +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb); + +/** + * Get global animation refresher timer. + * @return pointer to the animation refresher timer. + */ +lv_timer_t * lv_anim_get_timer(void); + +/** + * Delete an animation by getting the animated variable from `a`. + * Only animations with `exec_cb` will be deleted. + * This function exists because it's logical that all anim. functions receives an + * `lv_anim_t` as their first parameter. It's not practical in C but might make + * the API more consequent and makes easier to generate bindings. + * @param a pointer to an animation. + * @param exec_cb a function pointer which is animating 'var', + * or NULL to ignore it and delete all the animations of 'var + * @return true: at least 1 animation is deleted, false: no animation is deleted + */ +static inline bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_delete(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +/** + * Get the animation of a variable and its `exec_cb`. + * This function exists because it's logical that all anim. functions receives an + * `lv_anim_t` as their first parameter. It's not practical in C but might make + * the API more consequent and makes easier to generate bindings. + * @param a pointer to an animation. + * @param exec_cb a function pointer which is animating 'var', or NULL to return first matching 'var' + * @return pointer to the animation. + */ +static inline lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +/** + * Get the number of currently running animations + * @return the number of running animations + */ +uint16_t lv_anim_count_running(void); + +/** + * Store the speed as a special value which can be used as time in animations. + * It will be converted to time internally based on the start and end values + * @param speed the speed of the animation in with unit / sec resolution in 0..10k range + * @return a special value which can be used as an animation time + */ +uint32_t lv_anim_speed(uint32_t speed); + +/** + * Store the speed as a special value which can be used as time in animations. + * It will be converted to time internally based on the start and end values + * @param speed the speed of the animation in as unit / sec resolution in 0..10k range + * @param min_time the minimum time in 0..10k range + * @param max_time the maximum time in 0..10k range + * @return a special value in where all three values are stored and can be used as an animation time + * @note internally speed is stored as 10 unit/sec + * @note internally min/max_time are stored with 10 ms unit + * + */ +uint32_t lv_anim_speed_clamped(uint32_t speed, uint32_t min_time, uint32_t max_time); + +/** + * Manually refresh the state of the animations. + * Useful to make the animations running in a blocking process where + * `lv_timer_handler` can't run for a while. + * Shouldn't be used directly because it is called in `lv_refr_now()`. + */ +void lv_anim_refr_now(void); + +/** + * Calculate the current value of an animation applying linear characteristic + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_linear(const lv_anim_t * a); + +/** + * Calculate the current value of an animation slowing down the start phase + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_in(const lv_anim_t * a); + +/** + * Calculate the current value of an animation slowing down the end phase + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_out(const lv_anim_t * a); + +/** + * Calculate the current value of an animation applying an "S" characteristic (cosine) + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_ease_in_out(const lv_anim_t * a); + +/** + * Calculate the current value of an animation with overshoot at the end + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_overshoot(const lv_anim_t * a); + +/** + * Calculate the current value of an animation with 3 bounces + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_bounce(const lv_anim_t * a); + +/** + * Calculate the current value of an animation applying step characteristic. + * (Set end value on the end of the animation) + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_step(const lv_anim_t * a); + +/** + * A custom cubic bezier animation path, need to specify cubic-parameters in a->parameter.bezier3 + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_H*/ diff --git a/libraries/lvgl/src/misc/lv_anim_timeline.c b/libraries/lvgl/src/misc/lv_anim_timeline.c new file mode 100644 index 0000000..0acd243 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_anim_timeline.c @@ -0,0 +1,202 @@ +/** + * @file lv_anim_timeline.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_assert.h" +#include "lv_anim_timeline.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Data of anim_timeline_dsc*/ +typedef struct { + lv_anim_t anim; + uint32_t start_time; +} lv_anim_timeline_dsc_t; + +/*Data of anim_timeline*/ +struct _lv_anim_timeline_t { + lv_anim_timeline_dsc_t * anim_dsc; /**< Dynamically allocated anim dsc array*/ + uint32_t anim_dsc_cnt; /**< The length of anim dsc array*/ + uint32_t act_time; /**< Current time of the animation*/ + bool reverse; /**< Reverse playback*/ +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void anim_timeline_exec_cb(void * var, int32_t v); +static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time); +static int32_t anim_timeline_path_cb(const lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_anim_timeline_t * lv_anim_timeline_create(void) +{ + lv_anim_timeline_t * at = lv_malloc_zeroed(sizeof(lv_anim_timeline_t)); + LV_ASSERT_MALLOC(at); + return at; +} + +void lv_anim_timeline_delete(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + lv_anim_timeline_pause(at); + + lv_free(at->anim_dsc); + lv_free(at); +} + +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a) +{ + LV_ASSERT_NULL(at); + + at->anim_dsc_cnt++; + at->anim_dsc = lv_realloc(at->anim_dsc, at->anim_dsc_cnt * sizeof(lv_anim_timeline_dsc_t)); + + LV_ASSERT_MALLOC(at->anim_dsc); + + at->anim_dsc[at->anim_dsc_cnt - 1].anim = *a; + at->anim_dsc[at->anim_dsc_cnt - 1].start_time = start_time; +} + +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = lv_anim_timeline_get_playtime(at); + uint32_t start = at->act_time; + uint32_t end = at->reverse ? 0 : playtime; + uint32_t duration = end > start ? end - start : start - end; + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, at); + lv_anim_set_exec_cb(&a, anim_timeline_exec_cb); + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, duration); + lv_anim_set_path_cb(&a, anim_timeline_path_cb); + lv_anim_start(&a); + return playtime; +} + +void lv_anim_timeline_pause(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + lv_anim_delete(at, anim_timeline_exec_cb); +} + +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse) +{ + LV_ASSERT_NULL(at); + at->reverse = reverse; +} + +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = lv_anim_timeline_get_playtime(at); + uint32_t act_time = lv_map(progress, 0, LV_ANIM_TIMELINE_PROGRESS_MAX, 0, playtime); + anim_timeline_set_act_time(at, act_time); +} + +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = 0; + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + uint32_t end = lv_anim_get_playtime(&at->anim_dsc[i].anim); + if(end == LV_ANIM_PLAYTIME_INFINITE) + return end; + end += at->anim_dsc[i].start_time; + if(end > playtime) { + playtime = end; + } + } + + return playtime; +} + +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->reverse; +} + +uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + uint32_t playtime = lv_anim_timeline_get_playtime(at); + return lv_map(at->act_time, 0, playtime, 0, LV_ANIM_TIMELINE_PROGRESS_MAX); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time) +{ + at->act_time = act_time; + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + lv_anim_t * a = &(at->anim_dsc[i].anim); + + if(a->exec_cb == NULL && a->custom_exec_cb == NULL) { + continue; + } + + uint32_t start_time = at->anim_dsc[i].start_time; + int32_t value = 0; + if(act_time < start_time && a->early_apply) { + value = a->start_value; + if(a->exec_cb) a->exec_cb(a->var, value); + if(a->custom_exec_cb) a->custom_exec_cb(a, value); + } + else if(act_time >= start_time && act_time <= (start_time + a->duration)) { + a->act_time = act_time - start_time; + value = a->path_cb(a); + if(a->exec_cb) a->exec_cb(a->var, value); + if(a->custom_exec_cb) a->custom_exec_cb(a, value); + } + else if(act_time > start_time + a->duration) { + value = a->end_value; + if(a->exec_cb) a->exec_cb(a->var, value); + if(a->custom_exec_cb) a->custom_exec_cb(a, value); + } + } +} + +static int32_t anim_timeline_path_cb(const lv_anim_t * a) +{ + /* Directly map original timestamps to avoid loss of accuracy */ + return lv_map(a->act_time, 0, a->duration, a->start_value, a->end_value); +} + +static void anim_timeline_exec_cb(void * var, int32_t v) +{ + lv_anim_timeline_t * at = var; + anim_timeline_set_act_time(at, v); +} diff --git a/libraries/lvgl/src/misc/lv_anim_timeline.h b/libraries/lvgl/src/misc/lv_anim_timeline.h new file mode 100644 index 0000000..dd27070 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_anim_timeline.h @@ -0,0 +1,110 @@ +/** + * @file lv_anim_timeline.h + * + */ + +#ifndef LV_ANIM_TIMELINE_H +#define LV_ANIM_TIMELINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_anim.h" + +/********************* + * DEFINES + *********************/ + +#define LV_ANIM_TIMELINE_PROGRESS_MAX 0xFFFF + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_anim_timeline_t lv_anim_timeline_t; + +/********************** +* GLOBAL PROTOTYPES +**********************/ + +/** + * Create an animation timeline. + * @return pointer to the animation timeline. + */ +lv_anim_timeline_t * lv_anim_timeline_create(void); + +/** + * Delete animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_delete(lv_anim_timeline_t * at); + +/** + * Add animation to the animation timeline. + * @param at pointer to the animation timeline. + * @param start_time the time the animation started on the timeline, note that start_time will override the value of delay. + * @param a pointer to an animation. + */ +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a); + +/** + * Start the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at); + +/** + * Pause the animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_pause(lv_anim_timeline_t * at); + +/** + * Set the playback direction of the animation timeline. + * @param at pointer to the animation timeline. + * @param reverse whether to play in reverse. + */ +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse); + +/** + * Set the progress of the animation timeline. + * @param at pointer to the animation timeline. + * @param progress set value 0~65535 to map 0~100% animation progress. + */ +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress); + +/** + * Get the time used to play the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at); + +/** + * Get whether the animation timeline is played in reverse. + * @param at pointer to the animation timeline. + * @return return true if it is reverse playback. + */ +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at); + +/** + * Get the progress of the animation timeline. + * @param at pointer to the animation timeline. + * @return return value 0~65535 to map 0~100% animation progress. + */ +uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_TIMELINE_H*/ diff --git a/libraries/lvgl/src/misc/lv_area.c b/libraries/lvgl/src/misc/lv_area.c new file mode 100644 index 0000000..3cfd121 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_area.c @@ -0,0 +1,535 @@ +/** + * @file lv_area.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../core/lv_global.h" + +#include "lv_area.h" +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + area_p->x1 = x1; + area_p->y1 = y1; + area_p->x2 = x2; + area_p->y2 = y2; +} + +void lv_area_set_width(lv_area_t * area_p, int32_t w) +{ + area_p->x2 = area_p->x1 + w - 1; +} + +void lv_area_set_height(lv_area_t * area_p, int32_t h) +{ + area_p->y2 = area_p->y1 + h - 1; +} + +void _lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y) +{ + int32_t w = lv_area_get_width(area_p); + int32_t h = lv_area_get_height(area_p); + area_p->x1 = x; + area_p->y1 = y; + lv_area_set_width(area_p, w); + lv_area_set_height(area_p, h); +} + +uint32_t lv_area_get_size(const lv_area_t * area_p) +{ + uint32_t size; + + size = (uint32_t)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1); + + return size; +} + +void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra) +{ + area->x1 -= w_extra; + area->x2 += w_extra; + area->y1 -= h_extra; + area->y2 += h_extra; +} + +void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs) +{ + area->x1 += x_ofs; + area->x2 += x_ofs; + area->y1 += y_ofs; + area->y2 += y_ofs; +} + +bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Get the smaller area from 'a1_p' and 'a2_p'*/ + res_p->x1 = LV_MAX(a1_p->x1, a2_p->x1); + res_p->y1 = LV_MAX(a1_p->y1, a2_p->y1); + res_p->x2 = LV_MIN(a1_p->x2, a2_p->x2); + res_p->y2 = LV_MIN(a1_p->y2, a2_p->y2); + + /*If x1 or y1 greater than x2 or y2 then the areas union is empty*/ + bool union_ok = true; + if((res_p->x1 > res_p->x2) || (res_p->y1 > res_p->y2)) { + union_ok = false; + } + + return union_ok; +} + +int8_t _lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Areas have no common parts*/ + if(!_lv_area_is_on(a1_p, a2_p)) return -1; + + /*No remaining areas after removing common parts*/ + if(_lv_area_is_in(a1_p, a2_p, 0)) return 0; + + /*Result counter*/ + int8_t res_c = 0; + + /*Get required information*/ + lv_area_t n; + int32_t a1_w = lv_area_get_width(a1_p) - 1; + int32_t a1_h = lv_area_get_height(a1_p) - 1; + + /*Compute top rectangle*/ + int32_t th = a2_p->y1 - a1_p->y1; + if(th > 0) { + n.x1 = a1_p->x1; + n.y1 = a1_p->y1; + n.x2 = a1_p->x2; + n.y2 = a1_p->y1 + th; + res_p[res_c++] = n; + } + + /*Compute the bottom rectangle*/ + int32_t bh = a1_h - (a2_p->y2 - a1_p->y1); + if(bh > 0 && a2_p->y2 < a1_p->y2) { + n.x1 = a1_p->x1; + n.y1 = a2_p->y2; + n.x2 = a1_p->x2; + n.y2 = a2_p->y2 + bh; + res_p[res_c++] = n; + } + + /*Compute side height*/ + int32_t y1 = a2_p->y1 > a1_p->y1 ? a2_p->y1 : a1_p->y1; + int32_t y2 = a2_p->y2 < a1_p->y2 ? a2_p->y2 : a1_p->y2; + int32_t sh = y2 - y1; + + /*Compute the left rectangle*/ + int32_t lw = a2_p->x1 - a1_p->x1; + if(lw > 0 && sh > 0) { + n.x1 = a1_p->x1; + n.y1 = y1; + n.x2 = a1_p->x1 + lw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + /*Compute the right rectangle*/ + int32_t rw = a1_w - (a2_p->x2 - a1_p->x1); + if(rw > 0) { + n.x1 = a2_p->x2; + n.y1 = y1; + n.x2 = a2_p->x2 + rw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + //Return number of results + return res_c; +} + +void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + a_res_p->x1 = LV_MIN(a1_p->x1, a2_p->x1); + a_res_p->y1 = LV_MIN(a1_p->y1, a2_p->y1); + a_res_p->x2 = LV_MAX(a1_p->x2, a2_p->x2); + a_res_p->y2 = LV_MAX(a1_p->y2, a2_p->y2); +} + +bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius) +{ + /*First check the basic area*/ + bool is_on_rect = false; + if((p_p->x >= a_p->x1 && p_p->x <= a_p->x2) && ((p_p->y >= a_p->y1 && p_p->y <= a_p->y2))) { + is_on_rect = true; + } + if(!is_on_rect) + return false; + /*Now handle potential rounded rectangles*/ + if(radius <= 0) { + /*No radius, it is within the rectangle*/ + return true; + } + int32_t w = lv_area_get_width(a_p) / 2; + int32_t h = lv_area_get_height(a_p) / 2; + int32_t max_radius = LV_MIN(w, h); + if(radius > max_radius) + radius = max_radius; + + /*Check if it's in one of the corners*/ + lv_area_t corner_area; + /*Top left*/ + corner_area.x1 = a_p->x1; + corner_area.x2 = a_p->x1 + radius; + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom left*/ + corner_area.y1 = a_p->y2 - radius; + corner_area.y2 = a_p->y2; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom right*/ + corner_area.x1 = a_p->x2 - radius; + corner_area.x2 = a_p->x2; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Top right*/ + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(_lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Not within corners*/ + return true; +} + +bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { + return true; + } + else { + return false; + } +} + +bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius) +{ + bool is_in = false; + + if(ain_p->x1 >= aholder_p->x1 && ain_p->y1 >= aholder_p->y1 && ain_p->x2 <= aholder_p->x2 && + ain_p->y2 <= aholder_p->y2) { + is_in = true; + } + + if(!is_in) return false; + if(radius == 0) return true; + + /*Check if the corner points are inside the radius or not*/ + lv_point_t p; + + lv_point_set(&p, ain_p->x1, ain_p->y1); + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x2, ain_p->y1); + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x1, ain_p->y2); + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x2, ain_p->y2); + if(_lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + return true; +} + +bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius) +{ + if(aout_p->x2 < aholder_p->x1 || aout_p->y2 < aholder_p->y1 || aout_p->x1 > aholder_p->x2 || + aout_p->y1 > aholder_p->y2) { + return true; + } + + if(radius == 0) return false; + + /*Check if the corner points are outside the radius or not*/ + lv_point_t p; + + lv_point_set(&p, aout_p->x1, aout_p->y1); + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x2, aout_p->y1); + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x1, aout_p->y2); + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x2, aout_p->y2); + if(_lv_area_is_point_on(aholder_p, &p, radius)) return false; + + return true; +} + +bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) +{ + return a->x1 == b->x1 && a->x2 == b->x2 && a->y1 == b->y1 && a->y2 == b->y2; +} + +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y) +{ + + int32_t x; + int32_t y; + switch(align) { + case LV_ALIGN_CENTER: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_TOP_LEFT: + x = 0; + y = 0; + break; + case LV_ALIGN_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = 0; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_LEFT_MID: + x = 0; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_area_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_area_get_width(base); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_area_get_width(base); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + default: + x = 0; + y = 0; + break; + } + + x += base->x1; + y += base->y1; + + int32_t w = lv_area_get_width(to_align); + int32_t h = lv_area_get_height(to_align); + to_align->x1 = x + ofs_x; + to_align->y1 = y + ofs_y; + to_align->x2 = to_align->x1 + w - 1; + to_align->y2 = to_align->y1 + h - 1; +} + +#define _LV_TRANSFORM_TRIGO_SHIFT 10 + +void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, + bool zoom_first) +{ + lv_point_array_transform(point, 1, angle, scale_x, scale_y, pivot, zoom_first); +} + +void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, + const lv_point_t * pivot, + bool zoom_first) +{ + if(angle == 0 && scale_x == 256 && scale_y == 256) { + return; + } + uint32_t i; + for(i = 0; i < count; i++) { + points[i].x -= pivot->x; + points[i].y -= pivot->y; + + } + + if(angle == 0) { + for(i = 0; i < count; i++) { + points[i].x = (((int32_t)(points[i].x) * scale_x) >> 8) + pivot->x; + points[i].y = (((int32_t)(points[i].y) * scale_y) >> 8) + pivot->y; + } + return; + } + + int32_t angle_limited = angle; + if(angle_limited > 3600) angle_limited -= 3600; + if(angle_limited < 0) angle_limited += 3600; + + int32_t angle_low = angle_limited / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = angle_limited - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT); + + for(i = 0; i < count; i++) { + int32_t x = points[i].x; + int32_t y = points[i].y; + if(scale_x == 256 && scale_y == 256) { + points[i].x = ((cosma * x - sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; + points[i].y = ((sinma * x + cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; + } + else { + if(zoom_first) { + x *= scale_x; + y *= scale_y; + points[i].x = (((cosma * x - sinma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + } + else { + points[i].x = (((cosma * x - sinma * y) * scale_x) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y) * scale_y) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + } + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p) +{ + int32_t r = (area->x2 - area->x1) / 2; + + /*Circle center*/ + int32_t cx = area->x1 + r; + int32_t cy = area->y1 + r; + + /*Simplify the code by moving everything to (0, 0)*/ + int32_t px = p->x - cx; + int32_t py = p->y - cy; + + uint32_t r_sqrd = r * r; + uint32_t dist = (px * px) + (py * py); + + if(dist <= r_sqrd) + return true; + else + return false; +} diff --git a/libraries/lvgl/src/misc/lv_area.h b/libraries/lvgl/src/misc/lv_area.h new file mode 100644 index 0000000..376ab9f --- /dev/null +++ b/libraries/lvgl/src/misc/lv_area.h @@ -0,0 +1,388 @@ +/** + * @file lv_area.h + * + */ + +#ifndef LV_AREA_H +#define LV_AREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a point on the screen. + */ +typedef struct { + int32_t x; + int32_t y; +} lv_point_t; + +typedef struct { + lv_value_precise_t x; + lv_value_precise_t y; +} lv_point_precise_t; + +/** Represents an area of the screen.*/ +typedef struct { + int32_t x1; + int32_t y1; + int32_t x2; + int32_t y2; +} lv_area_t; + +/** Alignments*/ + +enum _lv_align_t { + LV_ALIGN_DEFAULT = 0, + LV_ALIGN_TOP_LEFT, + LV_ALIGN_TOP_MID, + LV_ALIGN_TOP_RIGHT, + LV_ALIGN_BOTTOM_LEFT, + LV_ALIGN_BOTTOM_MID, + LV_ALIGN_BOTTOM_RIGHT, + LV_ALIGN_LEFT_MID, + LV_ALIGN_RIGHT_MID, + LV_ALIGN_CENTER, + + LV_ALIGN_OUT_TOP_LEFT, + LV_ALIGN_OUT_TOP_MID, + LV_ALIGN_OUT_TOP_RIGHT, + LV_ALIGN_OUT_BOTTOM_LEFT, + LV_ALIGN_OUT_BOTTOM_MID, + LV_ALIGN_OUT_BOTTOM_RIGHT, + LV_ALIGN_OUT_LEFT_TOP, + LV_ALIGN_OUT_LEFT_MID, + LV_ALIGN_OUT_LEFT_BOTTOM, + LV_ALIGN_OUT_RIGHT_TOP, + LV_ALIGN_OUT_RIGHT_MID, + LV_ALIGN_OUT_RIGHT_BOTTOM, +}; + +#ifdef DOXYGEN +typedef _lv_align_t lv_align_t; +#else +typedef uint8_t lv_align_t; +#endif /*DOXYGEN*/ + +enum _lv_dir_t { + LV_DIR_NONE = 0x00, + LV_DIR_LEFT = (1 << 0), + LV_DIR_RIGHT = (1 << 1), + LV_DIR_TOP = (1 << 2), + LV_DIR_BOTTOM = (1 << 3), + LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, + LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, + LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, +}; + +#ifdef DOXYGEN +typedef _lv_dir_t lv_dir_t; +#else +typedef uint8_t lv_dir_t; +#endif /*DOXYGEN*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an area + * @param area_p pointer to an area + * @param x1 left coordinate of the area + * @param y1 top coordinate of the area + * @param x2 right coordinate of the area + * @param y2 bottom coordinate of the area + */ +void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2); + +/** + * Copy an area + * @param dest pointer to the destination area + * @param src pointer to the source area + */ +inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) +{ + dest->x1 = src->x1; + dest->y1 = src->y1; + dest->x2 = src->x2; + dest->y2 = src->y2; +} + +/** + * Get the width of an area + * @param area_p pointer to an area + * @return the width of the area (if x1 == x2 -> width = 1) + */ +static inline int32_t lv_area_get_width(const lv_area_t * area_p) +{ + return (int32_t)(area_p->x2 - area_p->x1 + 1); +} + +/** + * Get the height of an area + * @param area_p pointer to an area + * @return the height of the area (if y1 == y2 -> height = 1) + */ +static inline int32_t lv_area_get_height(const lv_area_t * area_p) +{ + return (int32_t)(area_p->y2 - area_p->y1 + 1); +} + +/** + * Set the width of an area + * @param area_p pointer to an area + * @param w the new width of the area (w == 1 makes x1 == x2) + */ +void lv_area_set_width(lv_area_t * area_p, int32_t w); + +/** + * Set the height of an area + * @param area_p pointer to an area + * @param h the new height of the area (h == 1 makes y1 == y2) + */ +void lv_area_set_height(lv_area_t * area_p, int32_t h); + +/** + * Set the position of an area (width and height will be kept) + * @param area_p pointer to an area + * @param x the new x coordinate of the area + * @param y the new y coordinate of the area + */ +void _lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y); + +/** + * Return with area of an area (x * y) + * @param area_p pointer to an area + * @return size of area + */ +uint32_t lv_area_get_size(const lv_area_t * area_p); + +void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra); + +void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs); + +/** + * Get the common parts of two areas + * @param res_p pointer to an area, the result will be stored her + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return false: the two area has NO common parts, res_p is invalid + */ +bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results (max 4) or -1 if no intersect + */ +int8_t _lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Join two areas into a third which involves the other two + * @param a_res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + */ +void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if a point is on an area + * @param a_p pointer to an area + * @param p_p pointer to a point + * @param radius radius of area (e.g. for rounded rectangle) + * @return false:the point is out of the area + */ +bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius); + +/** + * Check if two area has common parts + * @param a1_p pointer to an area. + * @param a2_p pointer to an other area + * @return false: a1_p and a2_p has no common parts + */ +bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if an area is fully on an other + * @param ain_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `ain_p` is fully inside `aholder_p` + */ +bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if an area is fully out of an other + * @param aout_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `aout_p` is fully outside `aholder_p` + */ +bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if 2 area is the same + * @param a pointer to an area + * @param b pointer to another area + */ +bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); + +/** + * Align an area to an other + * @param base an area where the other will be aligned + * @param to_align the area to align + * @param align `LV_ALIGN_...` + * @param ofs_x X offset + * @param ofs_y Y offset + */ +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y); + +/** + * Transform a point + * @param point pointer to a point + * @param angle angle with 0.1 resolutions (123 means 12.3°) + * @param scale_x horizontal zoom, 256 means 100% + * @param scale_y vertical zoom, 256 means 100% + * @param pivot pointer to the pivot point of the transformation + * @param zoom_first true: zoom first and rotate after that; else: opssoite order + */ +void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, + bool zoom_first); + +/** + * Transform an array of points + * @param points pointer to an array of points + * @param count number of points in the array + * @param angle angle with 0.1 resolutions (123 means 12.3°) + * @param scale_x horizontal zoom, 256 means 100% + * @param scale_y vertical zoom, 256 means 100% + * @param pivot pointer to the pivot point of the transformation + * @param zoom_first true: zoom first and rotate after that; else: opssoite order + */ +void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, + const lv_point_t * pivot, + bool zoom_first); + +static inline lv_point_t lv_point_from_precise(const lv_point_precise_t * p) +{ + lv_point_t point = { + (int32_t)p->x, (int32_t)p->y + }; + + return point; +} + +static inline lv_point_precise_t lv_point_to_precise(const lv_point_t * p) +{ + lv_point_precise_t point = { + (lv_value_precise_t)p->x, (lv_value_precise_t)p->y + }; + + return point; +} + +static inline void lv_point_set(lv_point_t * p, int32_t x, int32_t y) +{ + p->x = x; + p->y = y; +} + +static inline void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y) +{ + p->x = x; + p->y = y; +} + +static inline void lv_point_swap(lv_point_t * p1, lv_point_t * p2) +{ + lv_point_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +static inline void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2) +{ + lv_point_precise_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +/********************** + * MACROS + **********************/ + +#define _LV_COORD_TYPE_SHIFT (29U) + +#define _LV_COORD_TYPE_MASK (3 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE(x) ((x) & _LV_COORD_TYPE_MASK) /*Extract type specifiers*/ +#define _LV_COORD_PLAIN(x) ((x) & ~_LV_COORD_TYPE_MASK) /*Remove type specifiers*/ + +#define _LV_COORD_TYPE_PX (0 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE_SPEC (1 << _LV_COORD_TYPE_SHIFT) +#define _LV_COORD_TYPE_PX_NEG (3 << _LV_COORD_TYPE_SHIFT) + +#define LV_COORD_IS_PX(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX || _LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX_NEG) +#define LV_COORD_IS_SPEC(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_SPEC) + +#define LV_COORD_SET_SPEC(x) ((x) | _LV_COORD_TYPE_SPEC) + +/*Special coordinates*/ +#define LV_PCT(x) (x < 0 ? LV_COORD_SET_SPEC(1000 - (x)) : LV_COORD_SET_SPEC(x)) +#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && _LV_COORD_PLAIN(x) <= 2000)) +#define LV_COORD_GET_PCT(x) (_LV_COORD_PLAIN(x) > 1000 ? 1000 - _LV_COORD_PLAIN(x) : _LV_COORD_PLAIN(x)) +#define LV_SIZE_CONTENT LV_COORD_SET_SPEC(2001) + +LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); + +/*Max coordinate value*/ +#define LV_COORD_MAX ((1 << _LV_COORD_TYPE_SHIFT) - 1) +#define LV_COORD_MIN (-LV_COORD_MAX) + +LV_EXPORT_CONST_INT(LV_COORD_MAX); +LV_EXPORT_CONST_INT(LV_COORD_MIN); + +/** + * Convert a percentage value to `int32_t`. + * Percentage values are stored in special range + * @param x the percentage (0..1000) + * @return a coordinate that stores the percentage + */ +static inline int32_t lv_pct(int32_t x) +{ + return LV_PCT(x); +} + +static inline int32_t lv_pct_to_px(int32_t v, int32_t base) +{ + if(LV_COORD_IS_PCT(v)) { + return (LV_COORD_GET_PCT(v) * base) / 100; + } + + return v; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/misc/lv_array.c b/libraries/lvgl/src/misc/lv_array.c new file mode 100644 index 0000000..cb96205 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_array.c @@ -0,0 +1,172 @@ +/** + * @file lv_array.c + * Array. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_array.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +#include "lv_assert.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size) +{ + array->size = 0; + array->capacity = capacity; + array->element_size = element_size; + + array->data = lv_malloc(capacity * element_size); + LV_ASSERT_MALLOC(array->data); +} + +void lv_array_deinit(lv_array_t * array) +{ + if(array->data) { + lv_free(array->data); + array->data = NULL; + } + + array->size = 0; + array->capacity = 0; +} + +void lv_array_copy(lv_array_t * target, const lv_array_t * source) +{ + if(lv_array_is_empty(source)) { + return; + } + lv_array_deinit(target); + lv_array_init(target, source->capacity, source->element_size); + lv_memcpy(target->data, source->data, source->size * source->element_size); + target->size = source->size; +} + +lv_result_t lv_array_remove(lv_array_t * array, uint32_t index) +{ + if(index >= array->size) { + return LV_RESULT_INVALID; + } + + /*Shortcut*/ + if(index == array->size - 1) { + lv_array_resize(array, array->size - 1); + return LV_RESULT_OK; + } + + uint8_t * start = lv_array_at(array, index); + uint8_t * remaining = start + array->element_size; + uint32_t remaining_size = (array->size - index - 1) * array->element_size; + lv_memmove(start, remaining, remaining_size); + lv_array_resize(array, array->size - 1); + return LV_RESULT_OK; +} + +lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end) +{ + if(end > array->size) { + end = array->size; + } + + if(start >= end) { + return LV_RESULT_INVALID; + } + + /*Shortcut*/ + if(end == array->size) { + lv_array_resize(array, start); + return LV_RESULT_OK; + } + + uint8_t * start_p = lv_array_at(array, start); + uint8_t * remaining = start_p + (end - start) * array->element_size; + uint32_t remaining_size = (array->size - end) * array->element_size; + lv_memcpy(start_p, remaining, remaining_size); + lv_array_resize(array, array->size - (end - start)); + return LV_RESULT_OK; +} + +void lv_array_resize(lv_array_t * array, uint32_t new_capacity) +{ + uint8_t * data = lv_realloc(array->data, new_capacity * array->element_size); + LV_ASSERT_NULL(data); + array->data = data; + array->capacity = new_capacity; + if(array->size > new_capacity) { + array->size = new_capacity; + } +} + +lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other) +{ + LV_ASSERT_NULL(array->data); + uint32_t size = other->size; + if(array->size + size > array->capacity) { + /*array is full*/ + lv_array_resize(array, array->size + size); + } + + uint8_t * data = array->data + array->size * array->element_size; + lv_memcpy(data, other->data, array->element_size * size); + array->size += size; + return LV_RESULT_OK; +} + +lv_result_t lv_array_push_back(lv_array_t * array, const void * element) +{ + LV_ASSERT_NULL(array->data); + + if(array->size == array->capacity) { + /*array is full*/ + lv_array_resize(array, array->capacity + 1); + } + + uint8_t * data = array->data + array->size * array->element_size; + lv_memcpy(data, element, array->element_size); + array->size++; + return LV_RESULT_OK; +} + +void * lv_array_at(const lv_array_t * array, uint32_t index) +{ + if(index >= array->size) { + return NULL; + } + + LV_ASSERT_NULL(array->data); + return array->data + index * array->element_size; +} + +lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value) +{ + uint8_t * data = lv_array_at(array, index); + if(data == NULL) return LV_RESULT_INVALID; + + lv_memcpy(data, value, array->element_size); + return LV_RESULT_OK; +} diff --git a/libraries/lvgl/src/misc/lv_array.h b/libraries/lvgl/src/misc/lv_array.h new file mode 100644 index 0000000..3cdb1c6 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_array.h @@ -0,0 +1,203 @@ +/** + * @file lv_array.h + * Array. The elements are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_ARRAY_H +#define LV_ARRAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define LV_ARRAY_DEFAULT_CAPACITY 8 + +/********************** + * TYPEDEFS + **********************/ + +/** Description of a array*/ +typedef struct { + uint8_t * data; + uint32_t size; + uint32_t capacity; + uint32_t element_size; +} lv_array_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init an array. + * @param array pointer to an `lv_array_t` variable to initialize + * @param capacity the initial capacity of the array + * @param element_size the size of an element in bytes + */ +void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size); + +/** + * Resize the array to the given capacity. + * @note if the new capacity is smaller than the current size, the array will be truncated. + * @param array pointer to an `lv_array_t` variable + * @param new_capacity the new capacity of the array + */ +void lv_array_resize(lv_array_t * array, uint32_t new_capacity); + +/** + * Deinit the array, and free the allocated memory + * @param array pointer to an `lv_array_t` variable to deinitialize + */ +void lv_array_deinit(lv_array_t * array); + +/** + * Return how many elements are stored in the array. + * @param array pointer to an `lv_array_t` variable + * @return the number of elements stored in the array + */ +static inline uint32_t lv_array_size(const lv_array_t * array) +{ + return array->size; +} + +/** + * Return the capacity of the array, i.e. how many elements can be stored. + * @param array pointer to an `lv_array_t` variable + * @return the capacity of the array + */ +static inline uint32_t lv_array_capacity(const lv_array_t * array) +{ + return array->capacity; +} + +/** + * Return if the array is empty + * @param array pointer to an `lv_array_t` variable + * @return true: array is empty; false: array is not empty + */ +static inline bool lv_array_is_empty(const lv_array_t * array) +{ + return array->size == 0; +} + +/** + * Return if the array is full + * @param array pointer to an `lv_array_t` variable + * @return true: array is full; false: array is not full + */ +static inline bool lv_array_is_full(const lv_array_t * array) +{ + return array->size == array->capacity; +} + +/** + * Copy an array to another. + * @note this will create a new array with the same capacity and size as the source array. + * @param target pointer to an `lv_array_t` variable to copy to + * @param source pointer to an `lv_array_t` variable to copy from + */ +void lv_array_copy(lv_array_t * target, const lv_array_t * source); + +/** + * Remove all elements in array. + * @param array pointer to an `lv_array_t` variable + */ +static inline void lv_array_clear(lv_array_t * array) +{ + array->size = 0; +} + +/** + * Remove the element at the specified position in the array. + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to remove + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_remove(lv_array_t * array, uint32_t index); + +/** + * Remove from the array either a single element or a range of elements ([start, end)). + * @note This effectively reduces the container size by the number of elements removed. + * @note When start equals to end, the function has no effect. + * @param array pointer to an `lv_array_t` variable + * @param start the index of the first element to be removed + * @param end the index of the first element that is not to be removed + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end); + +/** + * Concatenate two arrays. Adds new elements to the end of the array. + * @note The destination array is automatically expanded as necessary. + * @param array pointer to an `lv_array_t` variable + * @param other pointer to the array to concatenate + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other); + +/** + * Push back element. Adds a new element to the end of the array. + * If the array capacity is not enough for the new element, the array will be resized automatically. + * @param array pointer to an `lv_array_t` variable + * @param element pointer to the element to add + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_push_back(lv_array_t * array, const void * element); + +/** + * Assigns one content to the array, replacing its current content. + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to replace + * @param value pointer to the elements to add + * @return true: success; false: error + */ +lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value); + +/** + * Returns a pointer to the element at position n in the array. + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to return + * @return a pointer to the requested element, NULL if `index` is out of range + */ +void * lv_array_at(const lv_array_t * array, uint32_t index); + +/** + * Returns a pointer to the first element in the array. + * @param array pointer to an `lv_array_t` variable + * @return a pointer to the first element in the array + */ +static inline void * lv_array_front(const lv_array_t * array) +{ + return lv_array_at(array, 0); +} + +/** + * Returns a pointer to the last element in the array. + * @param array pointer to an `lv_array_t` variable + */ +static inline void * lv_array_back(const lv_array_t * array) +{ + return lv_array_at(array, lv_array_size(array) - 1); +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/misc/lv_assert.h b/libraries/lvgl/src/misc/lv_assert.h new file mode 100644 index 0000000..c9dc849 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_assert.h @@ -0,0 +1,87 @@ +/** + * @file lv_assert.h + * + */ + +#ifndef LV_ASSERT_H +#define LV_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_log.h" +#include "../stdlib/lv_mem.h" +#include LV_ASSERT_HANDLER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_ASSERT(expr) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s", #expr); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +#define LV_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s (%s)", #expr, msg); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +#define LV_ASSERT_FORMAT_MSG(expr, format, ...) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s " format , #expr, __VA_ARGS__); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +/*----------------- + * ASSERTS + *-----------------*/ + +#if LV_USE_ASSERT_NULL +# define LV_ASSERT_NULL(p) LV_ASSERT_MSG(p != NULL, "NULL pointer"); +#else +# define LV_ASSERT_NULL(p) +#endif + +#if LV_USE_ASSERT_MALLOC +# define LV_ASSERT_MALLOC(p) LV_ASSERT_MSG(p != NULL, "Out of memory"); +#else +# define LV_ASSERT_MALLOC(p) +#endif + +#if LV_USE_ASSERT_MEM_INTEGRITY +# define LV_ASSERT_MEM_INTEGRITY() LV_ASSERT_MSG(lv_mem_test() == LV_RESULT_OK, "Memory integrity error"); +#else +# define LV_ASSERT_MEM_INTEGRITY() +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASSERT_H*/ diff --git a/libraries/lvgl/src/misc/lv_async.c b/libraries/lvgl/src/misc/lv_async.c new file mode 100644 index 0000000..591d230 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_async.c @@ -0,0 +1,108 @@ +/** + * @file lv_async.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_async.h" +#include "lv_timer.h" +#include "../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_async_info_t { + lv_async_cb_t cb; + void * user_data; +} lv_async_info_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) +{ + /*Allocate an info structure*/ + lv_async_info_t * info = lv_malloc(sizeof(lv_async_info_t)); + + if(info == NULL) + return LV_RESULT_INVALID; + + /*Create a new timer*/ + lv_timer_t * timer = lv_timer_create(lv_async_timer_cb, 0, info); + + if(timer == NULL) { + lv_free(info); + return LV_RESULT_INVALID; + } + + info->cb = async_xcb; + info->user_data = user_data; + + lv_timer_set_repeat_count(timer, 1); + return LV_RESULT_OK; +} + +lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data) +{ + lv_timer_t * timer = lv_timer_get_next(NULL); + lv_result_t res = LV_RESULT_INVALID; + + while(timer != NULL) { + /*Find the next timer node*/ + lv_timer_t * timer_next = lv_timer_get_next(timer); + + /*Find async timer callback*/ + if(timer->timer_cb == lv_async_timer_cb) { + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + + /*Match user function callback and user data*/ + if(info->cb == async_xcb && info->user_data == user_data) { + lv_timer_delete(timer); + lv_free(info); + res = LV_RESULT_OK; + } + } + + timer = timer_next; + } + + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer) +{ + /*Save the info because an lv_async_call_cancel might delete it in the callback*/ + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + lv_async_info_t info_save = *info; + lv_timer_delete(timer); + lv_free(info); + + info_save.cb(info_save.user_data); +} diff --git a/libraries/lvgl/src/misc/lv_async.h b/libraries/lvgl/src/misc/lv_async.h new file mode 100644 index 0000000..362a0ff --- /dev/null +++ b/libraries/lvgl/src/misc/lv_async.h @@ -0,0 +1,61 @@ +/** + * @file lv_async.h + * + */ + +#ifndef LV_ASYNC_H +#define LV_ASYNC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Type for async callback. + */ +typedef void (*lv_async_cb_t)(void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call an asynchronous function the next time lv_timer_handler() is run. This function is likely to return + * **before** the call actually happens! + * @param async_xcb a callback which is the task itself. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param user_data custom parameter + */ +lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data); + +/** + * Cancel an asynchronous function call + * @param async_xcb a callback which is the task itself. + * @param user_data custom parameter + */ +lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASYNC_H*/ diff --git a/libraries/lvgl/src/misc/lv_bidi.c b/libraries/lvgl/src/misc/lv_bidi.c new file mode 100644 index 0000000..1fa374d --- /dev/null +++ b/libraries/lvgl/src/misc/lv_bidi.c @@ -0,0 +1,653 @@ +/** + * @file lv_bidi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_bidi.h" +#include "lv_text.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +#if LV_USE_BIDI + +/********************* + * DEFINES + *********************/ +#define LV_BIDI_BRACKLET_DEPTH 4 + +// Highest bit of the 16-bit pos_conv value specifies whether this pos is RTL or not +#define GET_POS(x) ((x) & 0x7FFF) +#define IS_RTL_POS(x) (((x) & 0x8000) != 0) +#define SET_RTL_POS(x, is_rtl) (GET_POS(x) | ((is_rtl)? 0x8000: 0)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t bracklet_pos; + lv_base_dir_t dir; +} bracket_stack_t; + +typedef struct { + bracket_stack_t br_stack[LV_BIDI_BRACKLET_DEPTH]; + uint8_t br_stack_p; +} lv_bidi_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t lv_bidi_get_next_paragraph(const char * txt); +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter); +static bool lv_bidi_letter_is_weak(uint32_t letter); +static bool lv_bidi_letter_is_rtl(uint32_t letter); +static bool lv_bidi_letter_is_neutral(uint32_t letter); + +static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, + uint32_t * len, + uint16_t * pos_conv_len); +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len); +static uint32_t char_change_to_pair(uint32_t letter); +static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, + uint32_t letter, + lv_base_dir_t base_dir); +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index); +static uint32_t get_txt_len(const char * txt, uint32_t max_len); + +/********************** + * STATIC VARIABLES + **********************/ +static const uint8_t bracket_left[] = {"<({["}; +static const uint8_t bracket_right[] = {">)}]"}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) +{ + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + + uint32_t par_start = 0; + uint32_t par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + + while(str_in[par_start] != '\0') { + par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); + _lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); + par_start += par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + } + + str_out[par_start] = '\0'; +} + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt) +{ + uint32_t i = 0; + uint32_t letter; + while(txt[i] != '\0') { + letter = _lv_text_encoded_next(txt, &i); + + lv_base_dir_t dir; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_RTL || dir == LV_BASE_DIR_LTR) return dir; + } + + /*If there were no strong char earlier return with the default base dir*/ + if(LV_BIDI_BASE_DIR_DEF == LV_BASE_DIR_AUTO) return LV_BASE_DIR_LTR; + else return LV_BIDI_BASE_DIR_DEF; +} + +uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_malloc(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_free(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); + + if(bidi_txt == NULL) lv_free(buf); + uint16_t res = GET_POS(pos_conv_buf[visual_pos]); + lv_free(pos_conv_buf); + return res; +} + +uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_malloc(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_free(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + _lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + for(uint16_t i = 0; i < pos_conv_len; i++) { + if(GET_POS(pos_conv_buf[i]) == logical_pos) { + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[i]); + lv_free(pos_conv_buf); + + if(bidi_txt == NULL) lv_free(buf); + return i; + } + } + lv_free(pos_conv_buf); + if(bidi_txt == NULL) lv_free(buf); + return (uint16_t) -1; +} + +void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len) +{ + uint32_t run_len = 0; + lv_base_dir_t run_dir; + uint32_t rd = 0; + uint32_t wr; + uint16_t pos_conv_run_len = 0; + uint16_t pos_conv_rd = 0; + uint16_t pos_conv_wr; + + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BASE_DIR_RTL) { + wr = len; + pos_conv_wr = pos_conv_len; + } + else { + wr = 0; + pos_conv_wr = 0; + } + + if(str_out) str_out[len] = '\0'; + + lv_base_dir_t dir = base_dir; + + /*Empty the bracket stack*/ + lv_bidi_ctx_t ctx; + lv_memzero(&ctx, sizeof(ctx)); + + /*Process neutral chars in the beginning*/ + while(rd < len) { + uint32_t letter = _lv_text_encoded_next(str_in, &rd); + pos_conv_rd++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(&ctx, str_in, rd, len, letter, base_dir); + else if(dir != LV_BASE_DIR_WEAK) break; + } + + if(rd && str_in[rd] != '\0' && rd < len) { + _lv_text_encoded_prev(str_in, &rd); + pos_conv_rd--; + } + + if(rd) { + if(base_dir == LV_BASE_DIR_LTR) { + if(str_out) { + lv_memcpy(&str_out[wr], str_in, rd); + wr += rd; + } + if(pos_conv_out) { + fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_rd, 0); + pos_conv_wr += pos_conv_rd; + } + } + else { + wr -= rd; + pos_conv_wr -= pos_conv_rd; + rtl_reverse(str_out ? &str_out[wr] : NULL, str_in, rd, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, 0, + pos_conv_rd); + } + } + + /*Get and process the runs*/ + + while(rd < len && str_in[rd]) { + run_dir = get_next_run(&ctx, &str_in[rd], base_dir, len - rd, &run_len, &pos_conv_run_len); + + if(base_dir == LV_BASE_DIR_LTR) { + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + wr += run_len; + pos_conv_wr += pos_conv_run_len; + } + else { + wr -= run_len; + pos_conv_wr -= pos_conv_run_len; + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + } + + rd += run_len; + pos_conv_rd += pos_conv_run_len; + } +} + +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = _lv_bidi_detect_base_dir(txt); + + if(*align == LV_TEXT_ALIGN_AUTO) { + if(*base_dir == LV_BASE_DIR_RTL) *align = LV_TEXT_ALIGN_RIGHT; + else *align = LV_TEXT_ALIGN_LEFT; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the next paragraph from a text + * @param txt the text to process + * @return the length of the current paragraph in byte count + */ +static uint32_t lv_bidi_get_next_paragraph(const char * txt) +{ + uint32_t i = 0; + + _lv_text_encoded_next(txt, &i); + + while(txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + _lv_text_encoded_next(txt, &i); + } + + return i; +} + +/** + * Get the direction of a character + * @param letter a Unicode character + * @return `LV_BASE_DIR_RTL/LTR/WEAK/NEUTRAL` + */ +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter) +{ + if(lv_bidi_letter_is_rtl(letter)) return LV_BASE_DIR_RTL; + if(lv_bidi_letter_is_neutral(letter)) return LV_BASE_DIR_NEUTRAL; + if(lv_bidi_letter_is_weak(letter)) return LV_BASE_DIR_WEAK; + + return LV_BASE_DIR_LTR; +} +/** + * Tell whether a character is weak or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_weak(uint32_t letter) +{ + uint32_t i = 0; + static const char weaks[] = "0123456789"; + + do { + uint32_t x = _lv_text_encoded_next(weaks, &i); + if(letter == x) { + return true; + } + } while(weaks[i] != '\0'); + + return false; +} +/** + * Tell whether a character is RTL or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_rtl(uint32_t letter) +{ + if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ + + /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ + if(letter >= 0x600 && letter <= 0x6FF) return true; + if(letter >= 0xFB50 && letter <= 0xFDFF) return true; + if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + + /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ + if(letter >= 0x590 && letter <= 0x5FF) return true; + if(letter >= 0xFB1D && letter <= 0xFB4F) return true; + + return false; +} + +/** + * Tell whether a character is neutral or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_neutral(uint32_t letter) +{ + uint16_t i; + static const char neutrals[] = " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|"; + for(i = 0; neutrals[i] != '\0'; i++) { + if(letter == (uint32_t)neutrals[i]) return true; + } + + return false; +} + +static uint32_t get_txt_len(const char * txt, uint32_t max_len) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(i < max_len && txt[i] != '\0') { + _lv_text_encoded_next(txt, &i); + len++; + } + + return len; +} + +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index) +{ + uint16_t i; + for(i = 0; i < len; i++) { + out[i] = SET_RTL_POS(index, false); + index++; + } +} + +static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, + uint32_t * len, + uint16_t * pos_conv_len) +{ + uint32_t i = 0; + uint32_t letter; + + uint16_t pos_conv_i = 0; + + letter = _lv_text_encoded_next(txt, NULL); + lv_base_dir_t dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, 0, max_len, letter, base_dir); + + /*Find the first strong char. Skip the neutrals*/ + while(dir == LV_BASE_DIR_NEUTRAL || dir == LV_BASE_DIR_WEAK) { + letter = _lv_text_encoded_next(txt, &i); + + pos_conv_i++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); + + if(dir == LV_BASE_DIR_LTR || dir == LV_BASE_DIR_RTL) break; + + if(i >= max_len || txt[i] == '\0' || txt[i] == '\n' || txt[i] == '\r') { + *len = i; + *pos_conv_len = pos_conv_i; + return base_dir; + } + } + + lv_base_dir_t run_dir = dir; + + uint32_t i_prev = i; + uint32_t i_last_strong = i; + uint16_t pos_conv_i_prev = pos_conv_i; + uint16_t pos_conv_i_last_strong = pos_conv_i; + + /*Find the next char which has different direction*/ + lv_base_dir_t next_dir = base_dir; + while(i_prev < max_len && txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + letter = _lv_text_encoded_next(txt, &i); + pos_conv_i++; + next_dir = lv_bidi_get_letter_dir(letter); + if(next_dir == LV_BASE_DIR_NEUTRAL) next_dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); + + if(next_dir == LV_BASE_DIR_WEAK) { + if(run_dir == LV_BASE_DIR_RTL) { + if(base_dir == LV_BASE_DIR_RTL) { + next_dir = LV_BASE_DIR_LTR; + } + } + } + + /*New dir found?*/ + if((next_dir == LV_BASE_DIR_RTL || next_dir == LV_BASE_DIR_LTR) && next_dir != run_dir) { + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; + } + + if(next_dir != LV_BASE_DIR_NEUTRAL) { + i_last_strong = i; + pos_conv_i_last_strong = pos_conv_i; + } + + i_prev = i; + pos_conv_i_prev = pos_conv_i; + } + + /*Handle end of of string. Apply `base_dir` on trailing neutrals*/ + + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; +} + +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len) +{ + uint32_t i = len; + uint32_t wr = 0; + uint16_t pos_conv_i = pos_conv_len; + uint16_t pos_conv_wr = 0; + + while(i) { + uint32_t letter = _lv_text_encoded_prev(src, &i); + uint16_t pos_conv_letter = --pos_conv_i; + + /*Keep weak letters (numbers) as LTR*/ + if(lv_bidi_letter_is_weak(letter)) { + uint32_t last_weak = i; + uint32_t first_weak = i; + uint16_t pos_conv_last_weak = pos_conv_i; + uint16_t pos_conv_first_weak = pos_conv_i; + while(i) { + letter = _lv_text_encoded_prev(src, &i); + pos_conv_letter = --pos_conv_i; + + /*No need to call `char_change_to_pair` because there not such chars here*/ + + /*Finish on non-weak char*/ + /*but treat number and currency related chars as weak*/ + if(lv_bidi_letter_is_weak(letter) == false && letter != '.' && letter != ',' && letter != '$' && letter != '%') { + _lv_text_encoded_next(src, &i); /*Rewind one letter*/ + pos_conv_i++; + first_weak = i; + pos_conv_first_weak = pos_conv_i; + break; + } + } + if(i == 0) { + first_weak = 0; + pos_conv_first_weak = 0; + } + + if(dest) lv_memcpy(&dest[wr], &src[first_weak], last_weak - first_weak + 1); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_last_weak - pos_conv_first_weak + 1, + pos_conv_rd_base + pos_conv_first_weak); + wr += last_weak - first_weak + 1; + pos_conv_wr += pos_conv_last_weak - pos_conv_first_weak + 1; + } + + /*Simply store in reversed order*/ + else { + uint32_t letter_size = _lv_text_encoded_size((const char *)&src[i]); + /*Swap arithmetical symbols*/ + if(letter_size == 1) { + uint32_t new_letter = letter = char_change_to_pair(letter); + if(dest) dest[wr] = (uint8_t)new_letter; + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_letter, true); + wr++; + pos_conv_wr++; + } + /*Just store the letter*/ + else { + if(dest) lv_memcpy(&dest[wr], &src[i], letter_size); + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_i, true); + wr += letter_size; + pos_conv_wr++; + } + } + } +} + +static uint32_t char_change_to_pair(uint32_t letter) +{ + + uint8_t i; + for(i = 0; bracket_left[i] != '\0'; i++) { + if(letter == bracket_left[i]) return bracket_right[i]; + } + + for(i = 0; bracket_right[i] != '\0'; i++) { + if(letter == bracket_right[i]) return bracket_left[i]; + } + + return letter; +} + +static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, + uint32_t letter, + lv_base_dir_t base_dir) +{ + lv_base_dir_t bracket_dir = LV_BASE_DIR_NEUTRAL; + + uint8_t i; + /*Is the letter an opening bracket?*/ + for(i = 0; bracket_left[i] != '\0'; i++) { + if(bracket_left[i] == letter) { + /*If so find its matching closing bracket. + *If a char with base dir. direction is found then the brackets will have `base_dir` direction*/ + uint32_t txt_i = next_pos; + while(txt_i < len) { + uint32_t letter_next = _lv_text_encoded_next(txt, &txt_i); + if(letter_next == bracket_right[i]) { + /*Closing bracket found*/ + break; + } + else { + /*Save the dir*/ + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == base_dir) { + bracket_dir = base_dir; + } + } + } + + /*There were no matching closing bracket*/ + if(txt_i > len) return LV_BASE_DIR_NEUTRAL; + + /*There where a strong char with base dir in the bracket so the dir is found.*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL && bracket_dir != LV_BASE_DIR_WEAK) break; + + /*If there were no matching strong chars in the brackets then check the previous chars*/ + txt_i = next_pos; + if(txt_i) _lv_text_encoded_prev(txt, &txt_i); + while(txt_i > 0) { + uint32_t letter_next = _lv_text_encoded_prev(txt, &txt_i); + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == LV_BASE_DIR_LTR || letter_dir == LV_BASE_DIR_RTL) { + bracket_dir = letter_dir; + break; + } + } + + /*There where a previous strong char which can be used*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL) break; + + /*There were no strong chars before the bracket, so use the base dir.*/ + if(txt_i == 0) bracket_dir = base_dir; + + break; + } + } + + /*The letter was an opening bracket*/ + if(bracket_left[i] != '\0') { + + if(bracket_dir == LV_BASE_DIR_NEUTRAL || ctx->br_stack_p == LV_BIDI_BRACKLET_DEPTH) return LV_BASE_DIR_NEUTRAL; + + ctx->br_stack[ctx->br_stack_p].bracklet_pos = i; + ctx->br_stack[ctx->br_stack_p].dir = bracket_dir; + + ctx->br_stack_p++; + return bracket_dir; + } + else if(ctx->br_stack_p > 0) { + /*Is the letter a closing bracket of the last opening?*/ + if(letter == bracket_right[ctx->br_stack[ctx->br_stack_p - 1].bracklet_pos]) { + bracket_dir = ctx->br_stack[ctx->br_stack_p - 1].dir; + ctx->br_stack_p--; + return bracket_dir; + } + } + + return LV_BASE_DIR_NEUTRAL; +} + +#endif /*LV_USE_BIDI*/ diff --git a/libraries/lvgl/src/misc/lv_bidi.h b/libraries/lvgl/src/misc/lv_bidi.h new file mode 100644 index 0000000..e5b19c2 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_bidi.h @@ -0,0 +1,144 @@ +/** + * @file lv_bidi.h + * + */ + +#ifndef LV_BIDI_H +#define LV_BIDI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "lv_text.h" + +/********************* + * DEFINES + *********************/ +/*Special non printable strong characters. + *They can be inserted to texts to affect the run's direction*/ +#define LV_BIDI_LRO "\xE2\x80\xAD" /*U+202D*/ +#define LV_BIDI_RLO "\xE2\x80\xAE" /*U+202E*/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_base_dir_t { + LV_BASE_DIR_LTR = 0x00, + LV_BASE_DIR_RTL = 0x01, + LV_BASE_DIR_AUTO = 0x02, + + LV_BASE_DIR_NEUTRAL = 0x20, + LV_BASE_DIR_WEAK = 0x21, +}; + +#ifdef DOXYGEN +typedef _lv_base_dir_t lv_base_dir_t; +#else +typedef uint8_t lv_base_dir_t; +#endif /*DOXYGEN*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_USE_BIDI + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +void _lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t _lv_bidi_detect_base_dir(const char * txt); + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param visual_pos the visual character position which logical position should be get + * @param is_rtl tell the char at `visual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t _lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl); + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t _lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl); + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of the text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len); + +/** + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER) + * @param base_dir LV_BASE_DIR_..., write the calculated base dir here (LV_BASE_DIR_LTR/RTL) + * @param txt a text, used with LV_BASE_DIR_AUTO to determine the base direction + */ +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt); + +/********************** + * MACROS + **********************/ + +#else /*LV_USE_BIDI*/ +/** + * For compatibility if LV_USE_BIDI = 0 + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align For LV_TEXT_ALIGN_AUTO give LV_TEXT_ALIGN_LEFT else leave unchanged, write back the calculated align here + * @param base_dir Unused + * @param txt Unused + */ +static inline void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + LV_UNUSED(txt); + LV_UNUSED(base_dir); + if(*align == LV_TEXT_ALIGN_AUTO) * align = LV_TEXT_ALIGN_LEFT; +} +#endif /*LV_USE_BIDI*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIDI_H*/ diff --git a/libraries/lvgl/src/misc/lv_color.c b/libraries/lvgl/src/misc/lv_color.c new file mode 100644 index 0000000..74b964f --- /dev/null +++ b/libraries/lvgl/src/misc/lv_color.c @@ -0,0 +1,264 @@ +/** + * @file lv_color.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include "lv_log.h" +#include "../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa); + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_color_filter_dsc_t lv_color_filter_shade = {.filter_cb = lv_color_filter_shade_cb}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint8_t lv_color_format_get_bpp(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_A1: + return 1; + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_A2: + return 2; + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_A4: + return 4; + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_I8: + return 8; + + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_RGB565: + return 16; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return 24; + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + return 32; + + case LV_COLOR_FORMAT_UNKNOWN: + default: + return 0; + } +} + +bool lv_color_format_has_alpha(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A1: + case LV_COLOR_FORMAT_A2: + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_ARGB8888: + return true; + default: + return false; + } +} + +lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa) +{ + lv_color32_t c32; + c32.red = color.red; + c32.green = color.green; + c32.blue = color.blue; + c32.alpha = opa; + return c32; +} + +uint16_t lv_color_to_u16(lv_color_t color) +{ + return ((color.red & 0xF8) << 8) + ((color.green & 0xFC) << 3) + ((color.blue & 0xF8) >> 3); +} + +uint32_t lv_color_to_u32(lv_color_t color) +{ + return (uint32_t)((uint32_t)0xff << 24) + (color.red << 16) + (color.green << 8) + (color.blue); +} + +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl) +{ + + return lv_color_mix(lv_color_white(), c, lvl); +} + +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl) +{ + return lv_color_mix(lv_color_black(), c, lvl); +} + +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) +{ + h = (uint32_t)((uint32_t)h * 255) / 360; + s = (uint16_t)((uint16_t)s * 255) / 100; + v = (uint16_t)((uint16_t)v * 255) / 100; + + uint8_t r, g, b; + + uint8_t region, remainder, p, q, t; + + if(s == 0) { + return lv_color_make(v, v, v); + } + + region = h / 43; + remainder = (h - (region * 43)) * 6; + + p = (v * (255 - s)) >> 8; + q = (v * (255 - ((s * remainder) >> 8))) >> 8; + t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; + + switch(region) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + default: + r = v; + g = p; + b = q; + break; + } + + lv_color_t result = lv_color_make(r, g, b); + return result; +} + +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8) +{ + uint16_t r = ((uint32_t)r8 << 10) / 255; + uint16_t g = ((uint32_t)g8 << 10) / 255; + uint16_t b = ((uint32_t)b8 << 10) / 255; + + uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); + uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); + + lv_color_hsv_t hsv; + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness + hsv.v = (100 * rgbMax) >> 10; + + int32_t delta = rgbMax - rgbMin; + if(delta < 3) { + hsv.h = 0; + hsv.s = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation + hsv.s = 100 * delta / rgbMax; + if(hsv.s < 3) { + hsv.h = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma + int32_t h; + if(rgbMax == r) + h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta + else if(rgbMax == g) + h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow + else if(rgbMax == b) + h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan + else + h = 0; + h *= 60; + h >>= 10; + if(h < 0) h += 360; + + hsv.h = h; + return hsv; +} + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t c) +{ + return lv_color_rgb_to_hsv(c.red, c.green, c.blue); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Helper function to easily create color filters + * @param dsc pointer to a color filter descriptor + * @param c the color to modify + * @param opa the intensity of the modification + * - LV_OPA_50: do nothing + * - < LV_OPA_50: darken + * - LV_OPA_0: fully black + * - > LV_OPA_50: lighten + * - LV_OPA_100: fully white + * @return the modified color + */ +static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa) +{ + LV_UNUSED(dsc); + if(opa == LV_OPA_50) return c; + if(opa < LV_OPA_50) return lv_color_lighten(c, (LV_OPA_50 - opa) * 2); + else return lv_color_darken(c, (opa - LV_OPA_50 * LV_OPA_50) * 2); +} diff --git a/libraries/lvgl/src/misc/lv_color.h b/libraries/lvgl/src/misc/lv_color.h new file mode 100644 index 0000000..9432344 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_color.h @@ -0,0 +1,456 @@ +/** + * @file lv_color.h + * + */ + +#ifndef LV_COLOR_H +#define LV_COLOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_assert.h" +#include "lv_math.h" +#include "lv_types.h" +#include +#include + +/********************* + * DEFINES + *********************/ +LV_EXPORT_CONST_INT(LV_COLOR_DEPTH); + +#if LV_COLOR_DEPTH == 8 +#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 2 +#elif LV_COLOR_DEPTH == 16 +#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 3 +#elif LV_COLOR_DEPTH == 24 +#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#elif LV_COLOR_DEPTH == 32 +#define _LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#endif + +/** + * Opacity percentages. + */ + +enum _lv_opa_t { + LV_OPA_TRANSP = 0, + LV_OPA_0 = 0, + LV_OPA_10 = 25, + LV_OPA_20 = 51, + LV_OPA_30 = 76, + LV_OPA_40 = 102, + LV_OPA_50 = 127, + LV_OPA_60 = 153, + LV_OPA_70 = 178, + LV_OPA_80 = 204, + LV_OPA_90 = 229, + LV_OPA_100 = 255, + LV_OPA_COVER = 255, +}; + +#ifdef DOXYGEN +typedef _lv_opa_t lv_opa_t; +#else +typedef uint8_t lv_opa_t; +#endif /*DOXYGEN*/ + +#define LV_OPA_MIN 2 /*Opacities below this will be transparent*/ +#define LV_OPA_MAX 253 /*Opacities above this will fully cover*/ + +#define LV_COLOR_FORMAT_GET_BPP(cf) ( \ + (cf) == LV_COLOR_FORMAT_I1 ? 1 : \ + (cf) == LV_COLOR_FORMAT_A1 ? 1 : \ + (cf) == LV_COLOR_FORMAT_I2 ? 2 : \ + (cf) == LV_COLOR_FORMAT_A2 ? 2 : \ + (cf) == LV_COLOR_FORMAT_I4 ? 4 : \ + (cf) == LV_COLOR_FORMAT_A4 ? 4 : \ + (cf) == LV_COLOR_FORMAT_L8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_A8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_I8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_RGB565 ? 16 : \ + (cf) == LV_COLOR_FORMAT_RGB565A8 ? 16 : \ + (cf) == LV_COLOR_FORMAT_ARGB8565 ? 24 : \ + (cf) == LV_COLOR_FORMAT_RGB888 ? 24 : \ + (cf) == LV_COLOR_FORMAT_ARGB8888 ? 32 : \ + (cf) == LV_COLOR_FORMAT_XRGB8888 ? 32 : \ + 0 \ + ) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; +} lv_color_t; + +typedef struct { + uint16_t blue : 5; + uint16_t green : 6; + uint16_t red : 5; +} lv_color16_t; + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; +} lv_color32_t; + +typedef struct { + uint16_t h; + uint8_t s; + uint8_t v; +} lv_color_hsv_t; + +enum _lv_color_format_t { + LV_COLOR_FORMAT_UNKNOWN = 0, + + LV_COLOR_FORMAT_RAW = 0x01, + LV_COLOR_FORMAT_RAW_ALPHA = 0x02, + + /*<=1 byte (+alpha) formats*/ + LV_COLOR_FORMAT_L8 = 0x06, + LV_COLOR_FORMAT_I1 = 0x07, + LV_COLOR_FORMAT_I2 = 0x08, + LV_COLOR_FORMAT_I4 = 0x09, + LV_COLOR_FORMAT_I8 = 0x0A, + LV_COLOR_FORMAT_A8 = 0x0E, + + /*2 byte (+alpha) formats*/ + LV_COLOR_FORMAT_RGB565 = 0x12, + LV_COLOR_FORMAT_ARGB8565 = 0x13, /**< Not supported by sw renderer yet. */ + LV_COLOR_FORMAT_RGB565A8 = 0x14 /**< Color array followed by Alpha array*/, + + /*3 byte (+alpha) formats*/ + LV_COLOR_FORMAT_RGB888 = 0x0F, + LV_COLOR_FORMAT_ARGB8888 = 0x10, + LV_COLOR_FORMAT_XRGB8888 = 0x11, + + /*Formats not supported by software renderer but kept here so GPU can use it*/ + LV_COLOR_FORMAT_A1 = 0x0B, + LV_COLOR_FORMAT_A2 = 0x0C, + LV_COLOR_FORMAT_A4 = 0x0D, + + /* reference to https://wiki.videolan.org/YUV/ */ + /*YUV planar formats*/ + LV_COLOR_FORMAT_YUV_START = 0x20, + LV_COLOR_FORMAT_I420 = LV_COLOR_FORMAT_YUV_START, /*YUV420 planar(3 plane)*/ + LV_COLOR_FORMAT_I422 = 0x21, /*YUV422 planar(3 plane)*/ + LV_COLOR_FORMAT_I444 = 0x22, /*YUV444 planar(3 plane)*/ + LV_COLOR_FORMAT_I400 = 0x23, /*YUV400 no chroma channel*/ + LV_COLOR_FORMAT_NV21 = 0x24, /*YUV420 planar(2 plane), UV plane in 'V, U, V, U'*/ + LV_COLOR_FORMAT_NV12 = 0x25, /*YUV420 planar(2 plane), UV plane in 'U, V, U, V'*/ + + /*YUV packed formats*/ + LV_COLOR_FORMAT_YUY2 = 0x26, /*YUV422 packed like 'Y U Y V'*/ + LV_COLOR_FORMAT_UYVY = 0x27, /*YUV422 packed like 'U Y V Y'*/ + + LV_COLOR_FORMAT_YUV_END = LV_COLOR_FORMAT_UYVY, + + /*Color formats in which LVGL can render*/ +#if LV_COLOR_DEPTH == 8 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_L8, +#elif LV_COLOR_DEPTH == 16 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB565, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_RGB565A8, +#elif LV_COLOR_DEPTH == 24 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB888, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, +#elif LV_COLOR_DEPTH == 32 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_XRGB8888, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, +#endif +}; + +#ifdef DOXYGEN +typedef _lv_color_format_t lv_color_format_t; +#else +typedef uint8_t lv_color_format_t; +#endif /*DOXYGEN*/ + +#define LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf) ((cf) >= LV_COLOR_FORMAT_A1 && (cf) <= LV_COLOR_FORMAT_A8) +#define LV_COLOR_FORMAT_IS_INDEXED(cf) ((cf) >= LV_COLOR_FORMAT_I1 && (cf) <= LV_COLOR_FORMAT_I8) +#define LV_COLOR_FORMAT_IS_YUV(cf) ((cf) >= LV_COLOR_FORMAT_YUV_START && (cf) <= LV_COLOR_FORMAT_YUV_END) +#define LV_COLOR_INDEXED_PALETTE_SIZE(cf) ((cf) == LV_COLOR_FORMAT_I1 ? 2 :\ + (cf) == LV_COLOR_FORMAT_I2 ? 4 :\ + (cf) == LV_COLOR_FORMAT_I4 ? 16 :\ + (cf) == LV_COLOR_FORMAT_I8 ? 256 : 0) + +/********************** + * MACROS + **********************/ + +#define LV_COLOR_MAKE(r8, g8, b8) {b8, g8, r8} + +#define LV_OPA_MIX2(a1, a2) (((int32_t)(a1) * (a2)) >> 8) +#define LV_OPA_MIX3(a1, a2, a3) (((int32_t)(a1) * (a2) * (a3)) >> 16) + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the pixel size of a color format in bits, bpp + * @param src_cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bits + */ +uint8_t lv_color_format_get_bpp(lv_color_format_t cf); + +/** + * Get the pixel size of a color format in bytes + * @param src_cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bytes + */ +static inline uint8_t lv_color_format_get_size(lv_color_format_t cf) +{ + return (lv_color_format_get_bpp(cf) + 7) >> 3; +} + +/** + * Check if a color format has alpha channel or not + * @param src_cf a color format (`LV_COLOR_FORMAT_...`) + * @return true: has alpha channel; false: doesn't have alpha channel + */ +bool lv_color_format_has_alpha(lv_color_format_t src_cf); + +/** + * Create an ARGB8888 color from RGB888 + alpha + * @param color an RGB888 color + * @param opa the alpha value + * @return the ARGB8888 color + */ +lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa); + +/** + * Convert an RGB888 color to an integer + * @param c an RGB888 color + * @return `c` as an integer + */ +static inline uint32_t lv_color_to_int(lv_color_t c) +{ + uint8_t * tmp = (uint8_t *) &c; + return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16); +} + +/** + * Check if two RGB888 color are equal + * @param c1 the first color + * @param c2 the second color + * @return true: equal + */ +static inline bool lv_color_eq(lv_color_t c1, lv_color_t c2) +{ + return lv_color_to_int(c1) == lv_color_to_int(c2); +} + +/** + * Check if two ARGB8888 color are equal + * @param c1 the first color + * @param c2 the second color + * @return true: equal + */ +static inline bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2) +{ + return *((uint32_t *)&c1) == *((uint32_t *)&c2); +} + +/** + * Create a color from 0x000000..0xffffff input + * @param c the hex input + * @return the color + */ +static inline lv_color_t lv_color_hex(uint32_t c) +{ + lv_color_t ret; + ret.red = (c >> 16) & 0xff; + ret.green = (c >> 8) & 0xff; + ret.blue = (c >> 0) & 0xff; + return ret; +} + +/** + * Create an RGB888 color + * @param r the red channel (0..255) + * @param g the green channel (0..255) + * @param b the blue channel (0..255) + * @return the color + */ +static inline lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) +{ + lv_color_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + return ret; +} + +/** + * Create an ARGB8888 color + * @param r the red channel (0..255) + * @param g the green channel (0..255) + * @param b the blue channel (0..255) + * @param a the alpha channel (0..255) + * @return the color + */ +static inline lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + lv_color32_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + ret.alpha = a; + return ret; +} + +/** + * Create a color from 0x000..0xfff input + * @param c the hex input (e.g. 0x123 will be 0x112233) + * @return the color + */ +static inline lv_color_t lv_color_hex3(uint32_t c) +{ + return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), + (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); +} + +/** + * Convert am RGB888 color to RGB565 stored in `uint16_t` + * @param color and RGB888 color + * @return `color` as RGB565 on `uin16_t` + */ +uint16_t lv_color_to_u16(lv_color_t color); + +/** + * Convert am RGB888 color to XRGB8888 stored in `uint32_t` + * @param color and RGB888 color + * @return `color` as XRGB8888 on `uin32_t` (the alpha channel is always set to 0xFF) + */ +uint32_t lv_color_to_u32(lv_color_t color); + +/** + * Mix two RGB565 colors + * @param c1 the first color (typically the foreground color) + * @param c2 the second color (typically the background color) + * @param mix 0..255, or LV_OPA_0/10/20... + * @return mix == 0: c2 + * mix == 255: c1 + * mix == 128: 0.5 x c1 + 0.5 x c2 + */ +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix) +{ + if(mix == 255) return c1; + if(mix == 0) return c2; + + uint16_t ret; + + /* Source: https://stackoverflow.com/a/50012418/1999969*/ + mix = (uint32_t)((uint32_t)mix + 4) >> 3; + + /*0x7E0F81F = 0b00000111111000001111100000011111*/ + uint32_t bg = (uint32_t)(c2 | ((uint32_t)c2 << 16)) & 0x7E0F81F; + uint32_t fg = (uint32_t)(c1 | ((uint32_t)c1 << 16)) & 0x7E0F81F; + uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; + ret = (uint16_t)(result >> 16) | result; + + return ret; +} + +/** + * Mix white to a color + * @param c the base color + * @param lvl the intensity of white (0: no change, 255: fully white) + * @return the mixed color + */ +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); + +/** + * Mix black to a color + * @param c the base color + * @param lvl the intensity of black (0: no change, 255: fully black) + * @return the mixed color + */ +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl); + +/** + * Convert a HSV color to RGB + * @param h hue [0..359] + * @param s saturation [0..100] + * @param v value [0..100] + * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) + */ +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); + +/** + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV + */ +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8); + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color); + +/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ + +/** + * A helper for white color + * @return a white color + */ +static inline lv_color_t lv_color_white(void) +{ + return lv_color_make(0xff, 0xff, 0xff); +} + +/** + * A helper for black color + * @return a black color + */ +static inline lv_color_t lv_color_black(void) +{ + return lv_color_make(0x00, 0x00, 0x00); +} + +static inline void lv_color_premultiply(lv_color32_t * c) +{ + c->red = LV_OPA_MIX2(c->red, c->alpha); + c->green = LV_OPA_MIX2(c->green, c->alpha); + c->blue = LV_OPA_MIX2(c->blue, c->alpha); +} + +static inline void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a) +{ + c->red = LV_OPA_MIX2(c->red, a); + c->green = LV_OPA_MIX2(c->green, a); + c->blue = LV_OPA_MIX2(c->blue, a); +} + +/********************** + * MACROS + **********************/ + +#include "lv_palette.h" +#include "lv_color_op.h" + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_color_filter_dsc_t lv_color_filter_shade; + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_H*/ diff --git a/libraries/lvgl/src/misc/lv_color_op.c b/libraries/lvgl/src/misc/lv_color_op.c new file mode 100644 index 0000000..5e2fb34 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_color_op.c @@ -0,0 +1,35 @@ +/** + * @file lv_color.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include "lv_log.h" +#include "../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_color_op.h b/libraries/lvgl/src/misc/lv_color_op.h new file mode 100644 index 0000000..1109c9c --- /dev/null +++ b/libraries/lvgl/src/misc/lv_color_op.h @@ -0,0 +1,112 @@ +/** + * @file lv_color_op.h + * + */ + +#ifndef LV_COLOR_OP_H +#define LV_COLOR_OP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_assert.h" +#include "lv_math.h" +#include "lv_color.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_color_filter_dsc_t; + +typedef lv_color_t (*lv_color_filter_cb_t)(const struct _lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); + +typedef struct _lv_color_filter_dsc_t { + lv_color_filter_cb_t filter_cb; + void * user_data; +} lv_color_filter_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Mix two colors with a given ratio. + * @param c1 the first color to mix (usually the foreground) + * @param c2 the second color to mix (usually the background) + * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` + * @return the mixed color + */ +static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +{ + lv_color_t ret; + + ret.red = LV_UDIV255((uint16_t)c1.red * mix + c2.red * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.green = LV_UDIV255((uint16_t)c1.green * mix + c2.green * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.blue = LV_UDIV255((uint16_t)c1.blue * mix + c2.blue * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + return ret; +} + +/** + * + * @param fg + * @param bg + * @return + * @note Use bg.alpha in the return value + * @note Use fg.alpha as mix ratio + */ +static inline lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX) { + fg.alpha = bg.alpha; + return fg; + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + bg.red = (uint32_t)((uint32_t)fg.red * fg.alpha + (uint32_t)bg.red * (255 - fg.alpha)) >> 8; + bg.green = (uint32_t)((uint32_t)fg.green * fg.alpha + (uint32_t)bg.green * (255 - fg.alpha)) >> 8; + bg.blue = (uint32_t)((uint32_t)fg.blue * fg.alpha + (uint32_t)bg.blue * (255 - fg.alpha)) >> 8; + return bg; +} + +//! @endcond + +/** + * Get the brightness of a color + * @param color a color + * @return the brightness [0..255] + */ +static inline uint8_t lv_color_brightness(lv_color_t c) +{ + uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); + return (uint8_t)(bright >> 3); +} + +static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) +{ + dsc->filter_cb = cb; +} + +/********************** + * PREDEFINED COLORS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_H*/ diff --git a/libraries/lvgl/src/misc/lv_event.c b/libraries/lvgl/src/misc/lv_event.c new file mode 100644 index 0000000..e991ec0 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_event.c @@ -0,0 +1,224 @@ +/** + * @file lv_event.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_event.h" +#include "../core/lv_global.h" +#include "../stdlib/lv_mem.h" +#include "lv_assert.h" +#include + +/********************* + * DEFINES + *********************/ + +#define event_head LV_GLOBAL_DEFAULT()->event_header +#define event_last_id LV_GLOBAL_DEFAULT()->event_last_register_id + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#if LV_USE_LOG && LV_LOG_TRACE_EVENT + #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_EVENT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_event_push(lv_event_t * e) +{ + /*Build a simple linked list from the objects used in the events + *It's important to know if this object was deleted by a nested event + *called from this `event_cb`.*/ + e->prev = event_head; + event_head = e; + +} + +void _lv_event_pop(lv_event_t * e) +{ + event_head = e->prev; +} + +lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess) +{ + if(list == NULL) return LV_RESULT_OK; + + uint32_t i = 0; + lv_event_dsc_t ** dsc = lv_array_front(list); + uint32_t size = lv_array_size(list); + for(i = 0; i < size; i++) { + if(dsc[i]->cb == NULL) continue; + bool is_preprocessed = (dsc[i]->filter & LV_EVENT_PREPROCESS) != 0; + if(is_preprocessed != preprocess) continue; + lv_event_code_t filter = dsc[i]->filter & ~LV_EVENT_PREPROCESS; + if(filter == LV_EVENT_ALL || filter == e->code) { + e->user_data = dsc[i]->user_data; + dsc[i]->cb(e); + if(e->stop_processing) return LV_RESULT_OK; + + /*Stop if the object is deleted*/ + if(e->deleted) return LV_RESULT_INVALID; + + } + } + return LV_RESULT_OK; +} + +lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, + void * user_data) +{ + lv_event_dsc_t * dsc = lv_malloc(sizeof(lv_event_dsc_t)); + LV_ASSERT_NULL(dsc); + + dsc->cb = cb; + dsc->filter = filter; + dsc->user_data = user_data; + + if(lv_array_size(list) == 0) { + /*event list hasn't been initialized.*/ + lv_array_init(list, 1, sizeof(lv_event_dsc_t *)); + } + + lv_array_push_back(list, &dsc); + return dsc; +} + +bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(list); + LV_ASSERT_NULL(dsc); + + int size = lv_array_size(list); + lv_event_dsc_t ** events = lv_array_front(list); + for(int i = 0; i < size; i++) { + if(events[i] == dsc) { + lv_free(dsc); + lv_array_remove(list, i); + return true; + } + } + + return false; +} + +uint32_t lv_event_get_count(lv_event_list_t * list) +{ + LV_ASSERT_NULL(list); + return lv_array_size(list); +} + +lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index) +{ + LV_ASSERT_NULL(list); + lv_event_dsc_t ** dsc; + dsc = lv_array_at(list, index); + return dsc ? *dsc : NULL; +} + +lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + return dsc->cb; +} + +void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + return dsc->user_data; + +} + +bool lv_event_remove(lv_event_list_t * list, uint32_t index) +{ + LV_ASSERT_NULL(list); + lv_event_dsc_t * dsc = lv_event_get_dsc(list, index); + lv_free(dsc); + return lv_array_remove(list, index); +} + +void lv_event_remove_all(lv_event_list_t * list) +{ + LV_ASSERT_NULL(list); + int size = lv_array_size(list); + lv_event_dsc_t ** dsc = lv_array_front(list); + for(int i = 0; i < size; i++) { + lv_free(dsc[i]); + } + lv_array_deinit(list); +} + +void * lv_event_get_current_target(lv_event_t * e) +{ + return e->current_target; +} + +void * lv_event_get_target(lv_event_t * e) +{ + return e->original_target; +} + +lv_event_code_t lv_event_get_code(lv_event_t * e) +{ + return e->code & ~LV_EVENT_PREPROCESS; +} + +void * lv_event_get_param(lv_event_t * e) +{ + return e->param; +} + +void * lv_event_get_user_data(lv_event_t * e) +{ + return e->user_data; +} + +void lv_event_stop_bubbling(lv_event_t * e) +{ + e->stop_bubbling = 1; +} + +void lv_event_stop_processing(lv_event_t * e) +{ + e->stop_processing = 1; +} + +uint32_t lv_event_register_id(void) +{ + event_last_id ++; + return event_last_id; +} + +void _lv_event_mark_deleted(void * target) +{ + lv_event_t * e = event_head; + + while(e) { + if(e->original_target == target || e->current_target == target) e->deleted = 1; + e = e->prev; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_event.h b/libraries/lvgl/src/misc/lv_event.h new file mode 100644 index 0000000..2eeb5cd --- /dev/null +++ b/libraries/lvgl/src/misc/lv_event.h @@ -0,0 +1,245 @@ +/** + * @file lv_event.h + * + */ + +#ifndef LV_EVENT_H +#define LV_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "lv_types.h" +#include "../lv_conf_internal.h" + +#include "lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_event_cb_t)(lv_event_t * e); + +typedef struct { + lv_event_cb_t cb; + void * user_data; + uint32_t filter; +} lv_event_dsc_t; + +/** + * Type of event being sent to the object. + */ +typedef enum { + LV_EVENT_ALL = 0, + + /** Input device events*/ + LV_EVENT_PRESSED, /**< The object has been pressed*/ + LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ + LV_EVENT_PRESS_LOST, /**< The object is still being pressed but slid cursor/finger off of the object */ + LV_EVENT_SHORT_CLICKED, /**< The object was pressed for a short period of time, then released it. Not called if scrolled.*/ + LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `long_press_time`. Not called if scrolled.*/ + LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `long_press_time` in every `long_press_repeat_time` ms. Not called if scrolled.*/ + LV_EVENT_CLICKED, /**< Called on release if not scrolled (regardless to long press)*/ + LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/ + LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified*/ + LV_EVENT_SCROLL_THROW_BEGIN, + LV_EVENT_SCROLL_END, /**< Scrolling ends*/ + LV_EVENT_SCROLL, /**< Scrolling*/ + LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_active());` */ + LV_EVENT_KEY, /**< A key is sent to the object. Get the key with `lv_indev_get_key(lv_indev_active());`*/ + LV_EVENT_ROTARY, /**< An encoder or wheel was rotated. Get the rotation count with `lv_event_get_rotary_diff(e);`*/ + LV_EVENT_FOCUSED, /**< The object is focused*/ + LV_EVENT_DEFOCUSED, /**< The object is defocused*/ + LV_EVENT_LEAVE, /**< The object is defocused but still selected*/ + LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing*/ + LV_EVENT_INDEV_RESET, /**< Indev has been reset*/ + + /** Drawing events*/ + LV_EVENT_COVER_CHECK, /**< Check if the object fully covers an area. The event parameter is `lv_cover_check_info_t *`.*/ + LV_EVENT_REFR_EXT_DRAW_SIZE, /**< Get the required extra draw area around the object (e.g. for shadow). The event parameter is `int32_t *` to store the size.*/ + LV_EVENT_DRAW_MAIN_BEGIN, /**< Starting the main drawing phase*/ + LV_EVENT_DRAW_MAIN, /**< Perform the main drawing*/ + LV_EVENT_DRAW_MAIN_END, /**< Finishing the main drawing phase*/ + LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_TASK_ADDED, /**< Adding a draw task */ + + /** Special events*/ + LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved)*/ + LV_EVENT_INSERT, /**< A text is inserted to the object. The event data is `char *` being inserted.*/ + LV_EVENT_REFRESH, /**< Notify the object to refresh something on it (for the user)*/ + LV_EVENT_READY, /**< A process has finished*/ + LV_EVENT_CANCEL, /**< A process has been cancelled */ + + /** Other events*/ + LV_EVENT_CREATE, /**< Object is being created*/ + LV_EVENT_DELETE, /**< Object is being deleted*/ + LV_EVENT_CHILD_CHANGED, /**< Child was removed, added, or its size, position were changed */ + LV_EVENT_CHILD_CREATED, /**< Child was created, always bubbles up to all parents*/ + LV_EVENT_CHILD_DELETED, /**< Child was deleted, always bubbles up to all parents*/ + LV_EVENT_SCREEN_UNLOAD_START, /**< A screen unload started, fired immediately when scr_load is called*/ + LV_EVENT_SCREEN_LOAD_START, /**< A screen load started, fired when the screen change delay is expired*/ + LV_EVENT_SCREEN_LOADED, /**< A screen was loaded*/ + LV_EVENT_SCREEN_UNLOADED, /**< A screen was unloaded*/ + LV_EVENT_SIZE_CHANGED, /**< Object coordinates/size have changed*/ + LV_EVENT_STYLE_CHANGED, /**< Object's style has changed*/ + LV_EVENT_LAYOUT_CHANGED, /**< The children position has changed due to a layout recalculation*/ + LV_EVENT_GET_SELF_SIZE, /**< Get the internal size of a widget*/ + + /** Events of optional LVGL components*/ + LV_EVENT_INVALIDATE_AREA, + LV_EVENT_RESOLUTION_CHANGED, + LV_EVENT_COLOR_FORMAT_CHANGED, + LV_EVENT_REFR_REQUEST, + LV_EVENT_REFR_START, + LV_EVENT_REFR_READY, + LV_EVENT_RENDER_START, + LV_EVENT_RENDER_READY, + LV_EVENT_FLUSH_START, + LV_EVENT_FLUSH_FINISH, + LV_EVENT_FLUSH_WAIT_START, + LV_EVENT_FLUSH_WAIT_FINISH, + + LV_EVENT_VSYNC, + + _LV_EVENT_LAST, /** Number of default events*/ + + LV_EVENT_PREPROCESS = 0x8000, /** This is a flag that can be set with an event so it's processed + before the class default event processing */ +} lv_event_code_t; + +typedef lv_array_t lv_event_list_t; + +struct _lv_event_t { + void * current_target; + void * original_target; + lv_event_code_t code; + void * user_data; + void * param; + lv_event_t * prev; + uint8_t deleted : 1; + uint8_t stop_processing : 1; + uint8_t stop_bubbling : 1; +}; + +/** + * @brief Event callback. + * Events are used to notify the user of some action being taken on the object. + * For details, see ::lv_event_t. + */ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void _lv_event_push(lv_event_t * e); + +void _lv_event_pop(lv_event_t * e); + +lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess); + +lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data); +bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc); + +uint32_t lv_event_get_count(lv_event_list_t * list); + +lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index); + +lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc); + +void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc); + +bool lv_event_remove(lv_event_list_t * list, uint32_t index); + +void lv_event_remove_all(lv_event_list_t * list); + +/** + * Get the object originally targeted by the event. It's the same even if the event is bubbled. + * @param e pointer to the event descriptor + * @return the target of the event_code + */ +void * lv_event_get_target(lv_event_t * e); + +/** + * Get the current target of the event. It's the object which event handler being called. + * If the event is not bubbled it's the same as "normal" target. + * @param e pointer to the event descriptor + * @return pointer to the current target of the event_code + */ +void * lv_event_get_current_target(lv_event_t * e); + +/** + * Get the event code of an event + * @param e pointer to the event descriptor + * @return the event code. (E.g. `LV_EVENT_CLICKED`, `LV_EVENT_FOCUSED`, etc) + */ +lv_event_code_t lv_event_get_code(lv_event_t * e); + +/** + * Get the parameter passed when the event was sent + * @param e pointer to the event descriptor + * @return pointer to the parameter + */ +void * lv_event_get_param(lv_event_t * e); + +/** + * Get the user_data passed when the event was registered on the object + * @param e pointer to the event descriptor + * @return pointer to the user_data + */ +void * lv_event_get_user_data(lv_event_t * e); + +/** + * Stop the event from bubbling. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_bubbling(lv_event_t * e); + +/** + * Stop processing this event. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_processing(lv_event_t * e); + +/** + * Register a new, custom event ID. + * It can be used the same way as e.g. `LV_EVENT_CLICKED` to send custom events + * @return the new event id + * @example + * uint32_t LV_EVENT_MINE = 0; + * ... + * e = lv_event_register_id(); + * ... + * lv_obj_send_event(obj, LV_EVENT_MINE, &some_data); + */ +uint32_t lv_event_register_id(void); + +/** + * Nested events can be called and one of them might belong to an object that is being deleted. + * Mark this object's `event_temp_data` deleted to know that its `lv_obj_send_event` should return `LV_RESULT_INVALID` + * @param target pointer to an event target which was deleted + */ +void _lv_event_mark_deleted(void * target); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVENT_H*/ diff --git a/libraries/lvgl/src/misc/lv_fs.c b/libraries/lvgl/src/misc/lv_fs.c new file mode 100644 index 0000000..921d306 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_fs.c @@ -0,0 +1,578 @@ +/** + * @file lv_fs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_fs.h" + +#include +#include "../misc/lv_assert.h" +#include "../stdlib/lv_string.h" +#include "lv_ll.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define fsdrv_ll_p &(LV_GLOBAL_DEFAULT()->fsdrv_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static const char * lv_fs_get_real_path(const char * path); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_fs_init(void) +{ + _lv_ll_init(fsdrv_ll_p, sizeof(lv_fs_drv_t *)); +} + +void _lv_fs_deinit(void) +{ + _lv_ll_clear(fsdrv_ll_p); +} + +bool lv_fs_is_ready(char letter) +{ + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) return false; /*An unknown driver in not ready*/ + + if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ + + return drv->ready_cb(drv); +} + +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) +{ + if(path == NULL) { + LV_LOG_WARN("Can't open file: path is NULL"); + return LV_FS_RES_INV_PARAM; + } + + char letter = path[0]; + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) { + LV_LOG_WARN("Can't open file (%s): unknown driver letter", path); + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + LV_LOG_WARN("Can't open file (%s): driver not ready", path); + return LV_FS_RES_HW_ERR; + } + } + + if(drv->open_cb == NULL) { + LV_LOG_WARN("Can't open file (%s): open function not exists", path); + return LV_FS_RES_NOT_IMP; + } + + file_p->drv = drv; + + /* For memory-mapped files we set the file handle to our file descriptor so that we can access the cache from the file operations */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + file_p->file_d = file_p; + } + else { + const char * real_path = lv_fs_get_real_path(path); + void * file_d = drv->open_cb(drv, real_path, mode); + if(file_d == NULL || file_d == (void *)(-1)) { + return LV_FS_RES_UNKNOWN; + } + file_p->file_d = file_d; + } + + if(drv->cache_size) { + file_p->cache = lv_malloc_zeroed(sizeof(lv_fs_file_cache_t)); + LV_ASSERT_MALLOC(file_p->cache); + + /* If this is a memory-mapped file, then set "cache" to the memory buffer */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + lv_fs_path_ex_t * path_ex = (lv_fs_path_ex_t *)path; + file_p->cache->buffer = (void *)path_ex->buffer; + file_p->cache->start = 0; + file_p->cache->file_position = 0; + file_p->cache->end = path_ex->size; + } + /*Set an invalid range by default*/ + else { + file_p->cache->start = UINT32_MAX; + file_p->cache->end = UINT32_MAX - 1; + } + } + + return LV_FS_RES_OK; +} + +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size) +{ + path->path[0] = letter; + path->path[1] = ':'; + path->path[2] = 0; + path->buffer = buf; + path->size = size; +} + +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); + + if(file_p->drv->cache_size && file_p->cache) { + /* Only free cache if it was pre-allocated (for memory-mapped files it is never allocated) */ + if(file_p->drv->cache_size != LV_FS_CACHE_FROM_BUFFER && file_p->cache->buffer) { + lv_free(file_p->cache->buffer); + } + + lv_free(file_p->cache); + } + + file_p->file_d = NULL; + file_p->drv = NULL; + file_p->cache = NULL; + + return res; +} + +static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res = LV_FS_RES_OK; + uint32_t file_position = file_p->cache->file_position; + uint32_t start = file_p->cache->start; + uint32_t end = file_p->cache->end; + char * buffer = file_p->cache->buffer; + uint32_t buffer_size = file_p->drv->cache_size; + + if(start <= file_position && file_position <= end) { + /* Data can be read from cache buffer */ + uint32_t buffer_remaining_length = (uint32_t)end - file_position + 1; + uint32_t buffer_offset = (end - start) - buffer_remaining_length + 1; + + /* Do not allow reading beyond the actual memory block for memory-mapped files */ + if(file_p->drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + if(btr > buffer_remaining_length) + btr = buffer_remaining_length - 1; + } + + if(btr <= buffer_remaining_length) { + /*Data is in cache buffer, and buffer end not reached, no need to read from FS*/ + lv_memcpy(buf, buffer + buffer_offset, btr); + *br = btr; + } + else { + /*First part of data is in cache buffer, but we need to read rest of data from FS*/ + lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length); + + file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->end + 1, + LV_FS_SEEK_SET); + + uint32_t bytes_read_to_buffer = 0; + if(btr - buffer_remaining_length > buffer_size) { + /*If remaining data chuck is bigger than buffer size, then do not use cache, instead read it directly from FS*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)(buf + buffer_remaining_length), + btr - buffer_remaining_length, &bytes_read_to_buffer); + } + else { + /*If remaining data chunk is smaller than buffer size, then read into cache buffer*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_p->cache->end + 1; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; + + uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer); + lv_memcpy(buf + buffer_remaining_length, buffer, data_chunk_remaining); + } + *br = LV_MIN(buffer_remaining_length + bytes_read_to_buffer, btr); + } + } + else { + file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, + LV_FS_SEEK_SET); + + /*Data is not in cache buffer*/ + if(btr > buffer_size) { + /*If bigger data is requested, then do not use cache, instead read it directly*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buf, btr, br); + } + else { + /*If small data is requested, then read from FS into cache buffer*/ + if(buffer == NULL) { + file_p->cache->buffer = lv_malloc(buffer_size); + LV_ASSERT_MALLOC(file_p->cache->buffer); + buffer = file_p->cache->buffer; + } + + uint32_t bytes_read_to_buffer = 0; + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_position; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; + + *br = LV_MIN(btr, bytes_read_to_buffer); + lv_memcpy(buf, buffer, *br); + + } + } + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position += *br; + } + + return res; +} + +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + if(br != NULL) *br = 0; + if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; + if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; + + uint32_t br_tmp = 0; + lv_fs_res_t res; + + if(file_p->drv->cache_size) { + res = lv_fs_read_cached(file_p, (char *)buf, btr, &br_tmp); + } + else { + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); + } + + if(br != NULL) *br = br_tmp; + + return res; +} + +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + if(bw != NULL) *bw = 0; + + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->write_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = LV_FS_RES_OK; + + /*Need to do FS seek before writing data to FS*/ + if(file_p->drv->cache_size) { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) return res; + } + + uint32_t bw_tmp = 0; + res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); + if(bw != NULL) *bw = bw_tmp; + + if(file_p->drv->cache_size && res == LV_FS_RES_OK) + file_p->cache->file_position += bw_tmp; + + return res; +} + +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->seek_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = LV_FS_RES_OK; + if(file_p->drv->cache_size) { + switch(whence) { + case LV_FS_SEEK_SET: { + file_p->cache->file_position = pos; + + /*FS seek if new position is outside cache buffer*/ + if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + } + + break; + } + case LV_FS_SEEK_CUR: { + file_p->cache->file_position += pos; + + /*FS seek if new position is outside cache buffer*/ + if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + } + + break; + } + case LV_FS_SEEK_END: { + /*Because we don't know the file size, we do a little trick: do a FS seek, then get the new file position from FS*/ + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + if(res == LV_FS_RES_OK) { + uint32_t tmp_position; + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, &tmp_position); + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position = tmp_position; + } + } + break; + } + } + } + else { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + } + + return res; +} + +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) +{ + if(file_p->drv == NULL) { + *pos = 0; + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->tell_cb == NULL) { + *pos = 0; + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res; + if(file_p->drv->cache_size) { + *pos = file_p->cache->file_position; + res = LV_FS_RES_OK; + } + else { + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); + } + + return res; +} + +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) +{ + if(path == NULL) return LV_FS_RES_INV_PARAM; + + char letter = path[0]; + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) { + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + return LV_FS_RES_HW_ERR; + } + } + + if(drv->dir_open_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + const char * real_path = lv_fs_get_real_path(path); + void * dir_d = drv->dir_open_cb(drv, real_path); + + if(dir_d == NULL || dir_d == (void *)(-1)) { + return LV_FS_RES_UNKNOWN; + } + + rddir_p->drv = drv; + rddir_p->dir_d = dir_d; + + return LV_FS_RES_OK; +} + +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len) +{ + if(fn_len == 0) { + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + fn[0] = '\0'; + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_read_cb == NULL) { + fn[0] = '\0'; + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn, fn_len); + + return res; +} + +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) +{ + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + lv_fs_res_t res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); + + rddir_p->dir_d = NULL; + rddir_p->drv = NULL; + + return res; +} + +void lv_fs_drv_init(lv_fs_drv_t * drv) +{ + lv_memzero(drv, sizeof(lv_fs_drv_t)); +} + +void lv_fs_drv_register(lv_fs_drv_t * drv_p) +{ + /*Save the new driver*/ + lv_fs_drv_t ** new_drv; + new_drv = _lv_ll_ins_head(fsdrv_ll_p); + LV_ASSERT_MALLOC(new_drv); + if(new_drv == NULL) return; + + *new_drv = drv_p; +} + +lv_fs_drv_t * lv_fs_get_drv(char letter) +{ + lv_fs_drv_t ** drv; + + _LV_LL_READ(fsdrv_ll_p, drv) { + if((*drv)->letter == letter) { + return *drv; + } + } + + return NULL; +} + +char * lv_fs_get_letters(char * buf) +{ + lv_fs_drv_t ** drv; + uint8_t i = 0; + + _LV_LL_READ(fsdrv_ll_p, drv) { + buf[i] = (*drv)->letter; + i++; + } + + buf[i] = '\0'; + + return buf; +} + +const char * lv_fs_get_ext(const char * fn) +{ + size_t i; + for(i = lv_strlen(fn); i > 0; i--) { + if(fn[i] == '.') { + return &fn[i + 1]; + } + else if(fn[i] == '/' || fn[i] == '\\') { + return ""; /*No extension if a '\' or '/' found*/ + } + } + + return ""; /*Empty string if no '.' in the file name.*/ +} + +char * lv_fs_up(char * path) +{ + size_t len = lv_strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + path[len] = '\0'; + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\') break; + } + + if(i > 0) path[i] = '\0'; + + return path; +} + +const char * lv_fs_get_last(const char * path) +{ + size_t len = lv_strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\') break; + } + + /*No '/' or '\' in the path so return with path itself*/ + if(i == 0) return path; + + return &path[i + 1]; +} +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Skip the driver letter and the possible : after the letter + * @param path path string (E.g. S:/folder/file.txt) + * @return pointer to the beginning of the real path (E.g. /folder/file.txt) + */ +static const char * lv_fs_get_real_path(const char * path) +{ + path++; /*Ignore the driver letter*/ + if(*path == ':') path++; + + return path; +} diff --git a/libraries/lvgl/src/misc/lv_fs.h b/libraries/lvgl/src/misc/lv_fs.h new file mode 100644 index 0000000..ae29456 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_fs.h @@ -0,0 +1,295 @@ +/** + * @file lv_fs.h + * + */ + +#ifndef LV_FS_H +#define LV_FS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#define LV_FS_MAX_FN_LENGTH 64 +#define LV_FS_MAX_PATH_LENGTH 256 + +#define LV_FS_CACHE_FROM_BUFFER UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/** + * Errors in the file system module. + */ +enum _lv_fs_res_t { + LV_FS_RES_OK = 0, + LV_FS_RES_HW_ERR, /*Low level hardware error*/ + LV_FS_RES_FS_ERR, /*Error in the file system structure*/ + LV_FS_RES_NOT_EX, /*Driver, file or directory is not exists*/ + LV_FS_RES_FULL, /*Disk full*/ + LV_FS_RES_LOCKED, /*The file is already opened*/ + LV_FS_RES_DENIED, /*Access denied. Check 'fs_open' modes and write protect*/ + LV_FS_RES_BUSY, /*The file system now can't handle it, try later*/ + LV_FS_RES_TOUT, /*Process time outed*/ + LV_FS_RES_NOT_IMP, /*Requested function is not implemented*/ + LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ + LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ + LV_FS_RES_UNKNOWN, /*Other unknown error*/ +}; + +#ifdef DOXYGEN +typedef _lv_fs_res_t lv_fs_res_t; +#else +typedef uint8_t lv_fs_res_t; +#endif /*DOXYGEN*/ + +/** + * File open mode. + */ +enum _lv_fs_mode_t { + LV_FS_MODE_WR = 0x01, + LV_FS_MODE_RD = 0x02, +}; + +#ifdef DOXYGEN +typedef _lv_fs_mode_t lv_fs_mode_t; +#else +typedef uint8_t lv_fs_mode_t; +#endif /*DOXYGEN*/ + +/** + * Seek modes. + */ +typedef enum { + LV_FS_SEEK_SET = 0x00, /**< Set the position from absolutely (from the start of file)*/ + LV_FS_SEEK_CUR = 0x01, /**< Set the position from the current position*/ + LV_FS_SEEK_END = 0x02, /**< Set the position from the end of the file*/ +} lv_fs_whence_t; + +struct _lv_fs_drv_t; +typedef struct _lv_fs_drv_t lv_fs_drv_t; +struct _lv_fs_drv_t { + char letter; + uint32_t cache_size; + bool (*ready_cb)(lv_fs_drv_t * drv); + + void * (*open_cb)(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); + lv_fs_res_t (*close_cb)(lv_fs_drv_t * drv, void * file_p); + lv_fs_res_t (*read_cb)(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); + lv_fs_res_t (*write_cb)(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); + lv_fs_res_t (*seek_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); + lv_fs_res_t (*tell_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + + void * (*dir_open_cb)(lv_fs_drv_t * drv, const char * path); + lv_fs_res_t (*dir_read_cb)(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); + lv_fs_res_t (*dir_close_cb)(lv_fs_drv_t * drv, void * rddir_p); + + void * user_data; /**< Custom file user data*/ +}; + +typedef struct { + uint32_t start; + uint32_t end; + uint32_t file_position; + void * buffer; +} lv_fs_file_cache_t; + +typedef struct { + void * file_d; + lv_fs_drv_t * drv; + lv_fs_file_cache_t * cache; +} lv_fs_file_t; + +/* Extended path object to specify the buffer for memory-mapped files */ +typedef struct { + char path[4]; /* This is needed to make it compatible with a normal path */ + const void * buffer; + uint32_t size; +} lv_fs_path_ex_t; + +typedef struct { + void * dir_d; + lv_fs_drv_t * drv; +} lv_fs_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the File system interface + */ +void _lv_fs_init(void); + +/** + * Deinitialize the File system interface + */ +void _lv_fs_deinit(void); + +/** + * Initialize a file system driver with default values. + * It is used to ensure all fields have known values and not memory junk. + * After it you can set the fields. + * @param drv pointer to driver variable to initialize + */ +void lv_fs_drv_init(lv_fs_drv_t * drv); + +/** + * Add a new drive + * @param drv pointer to an lv_fs_drv_t structure which is inited with the + * corresponding function pointers. Only pointer is saved, so the + * driver should be static or dynamically allocated. + */ +void lv_fs_drv_register(lv_fs_drv_t * drv); + +/** + * Give a pointer to a driver from its letter + * @param letter the driver letter + * @return pointer to a driver or NULL if not found + */ +lv_fs_drv_t * lv_fs_get_drv(char letter); + +/** + * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be + * returned. + * @param letter letter of the drive + * @return true: drive is ready; false: drive is not ready + */ +bool lv_fs_is_ready(char letter); + +/** + * Open a file + * @param file_p pointer to a lv_fs_file_t variable + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); + +/** + * Make a path object for the memory-mapped file compatible with the file system interface + * @param path path to a lv_fs_path_ex object + * @param letter the letter of the driver. E.g. `LV_FS_MEMFS_LETTER` + * @param buf address of the memory buffer + * @param size size of the memory buffer in bytes + */ +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size); + +/** + * Close an already opened file + * @param file_p pointer to a lv_fs_file_t variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p); + +/** + * Read from a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer where the read bytes are stored + * @param btr Bytes To Read + * @param br the number of real read bytes (Bytes Read). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); + +/** + * Write into a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); + +/** + * Set the position of the 'cursor' (read write pointer) in a file + * @param file_p pointer to a lv_fs_file_t variable + * @param pos the new position expressed in bytes index (0: start of file) + * @param whence tells from where set the position. See @lv_fs_whence_t + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); + +/** + * Give the position of the read write pointer + * @param file_p pointer to a lv_fs_file_t variable + * @param pos pointer to store the position of the read write pointer + * @return LV_FS_RES_OK or any error from 'fs_res_t' + */ +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos); + +/** + * Initialize a 'fs_dir_t' variable for directory reading + * @param rddir_p pointer to a 'lv_fs_dir_t' variable + * @param path path to a directory + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len); + +/** + * Close the directory reading + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p); + +/** + * Fill a buffer with the letters of existing drivers + * @param buf buffer to store the letters ('\0' added after the last letter) + * @return the buffer + */ +char * lv_fs_get_letters(char * buf); + +/** + * Return with the extension of the filename + * @param fn string with a filename + * @return pointer to the beginning extension or empty string if no extension + */ +const char * lv_fs_get_ext(const char * fn); + +/** + * Step up one level + * @param path pointer to a file name + * @return the truncated file name + */ +char * lv_fs_up(char * path); + +/** + * Get the last element of a path (e.g. U:/folder/file -> file) + * @param path pointer to a file name + * @return pointer to the beginning of the last element in the path + */ +const char * lv_fs_get_last(const char * path); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FS_H*/ diff --git a/libraries/lvgl/src/misc/lv_ll.c b/libraries/lvgl/src/misc/lv_ll.c new file mode 100644 index 0000000..6debda0 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_ll.c @@ -0,0 +1,334 @@ +/** + * @file lv_ll.c + * Handle linked lists. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ll.h" +#include "../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#define LL_NODE_META_SIZE (sizeof(lv_ll_node_t *) + sizeof(lv_ll_node_t *)) +#define LL_PREV_P_OFFSET(ll_p) (ll_p->n_size) +#define LL_NEXT_P_OFFSET(ll_p) (ll_p->n_size + sizeof(lv_ll_node_t *)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev); +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) +{ + ll_p->head = NULL; + ll_p->tail = NULL; +#ifdef LV_ARCH_64 + /*Round the size up to 8*/ + node_size = (node_size + 7) & (~0x7); +#else + /*Round the size up to 4*/ + node_size = (node_size + 3) & (~0x3); +#endif + + ll_p->n_size = node_size; +} + +void * _lv_ll_ins_head(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_prev(ll_p, n_new, NULL); /*No prev. before the new head*/ + node_set_next(ll_p, n_new, ll_p->head); /*After new comes the old head*/ + + if(ll_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_p, ll_p->head, n_new); + } + + ll_p->head = n_new; /*Set the new head in the dsc.*/ + if(ll_p->tail == NULL) { /*If there is no tail (1. node) set the tail too*/ + ll_p->tail = n_new; + } + } + + return n_new; +} + +void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) +{ + lv_ll_node_t * n_new; + + if(NULL == ll_p || NULL == n_act) return NULL; + + if(_lv_ll_get_head(ll_p) == n_act) { + n_new = _lv_ll_ins_head(ll_p); + if(n_new == NULL) return NULL; + } + else { + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + if(n_new == NULL) return NULL; + + lv_ll_node_t * n_prev; + n_prev = _lv_ll_get_prev(ll_p, n_act); + node_set_next(ll_p, n_prev, n_new); + node_set_prev(ll_p, n_new, n_prev); + node_set_prev(ll_p, n_act, n_new); + node_set_next(ll_p, n_new, n_act); + } + + return n_new; +} + +void * _lv_ll_ins_tail(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ + node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is the old tail*/ + if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ + node_set_next(ll_p, ll_p->tail, n_new); + } + + ll_p->tail = n_new; /*Set the new tail in the dsc.*/ + if(ll_p->head == NULL) { /*If there is no head (1. node) set the head too*/ + ll_p->head = n_new; + } + } + + return n_new; +} + +void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) +{ + if(ll_p == NULL) return; + + if(_lv_ll_get_head(ll_p) == node_p) { + /*The new head will be the node after 'n_act'*/ + ll_p->head = _lv_ll_get_next(ll_p, node_p); + if(ll_p->head == NULL) { + ll_p->tail = NULL; + } + else { + node_set_prev(ll_p, ll_p->head, NULL); + } + } + else if(_lv_ll_get_tail(ll_p) == node_p) { + /*The new tail will be the node before 'n_act'*/ + ll_p->tail = _lv_ll_get_prev(ll_p, node_p); + if(ll_p->tail == NULL) { + ll_p->head = NULL; + } + else { + node_set_next(ll_p, ll_p->tail, NULL); + } + } + else { + lv_ll_node_t * n_prev = _lv_ll_get_prev(ll_p, node_p); + lv_ll_node_t * n_next = _lv_ll_get_next(ll_p, node_p); + + node_set_next(ll_p, n_prev, n_next); + node_set_prev(ll_p, n_next, n_prev); + } +} + +void _lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) +{ + void * i; + void * i_next; + + i = _lv_ll_get_head(ll_p); + i_next = NULL; + + while(i != NULL) { + i_next = _lv_ll_get_next(ll_p, i); + if(cleanup == NULL) { + _lv_ll_remove(ll_p, i); + lv_free(i); + } + else { + cleanup(i); + } + i = i_next; + } +} + +void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) +{ + _lv_ll_remove(ll_ori_p, node); + + if(head) { + /*Set node as head*/ + node_set_prev(ll_new_p, node, NULL); + node_set_next(ll_new_p, node, ll_new_p->head); + + if(ll_new_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_new_p, ll_new_p->head, node); + } + + ll_new_p->head = node; /*Set the new head in the dsc.*/ + if(ll_new_p->tail == NULL) { /*If there is no tail (first node) set the tail too*/ + ll_new_p->tail = node; + } + } + else { + /*Set node as tail*/ + node_set_prev(ll_new_p, node, ll_new_p->tail); + node_set_next(ll_new_p, node, NULL); + + if(ll_new_p->tail != NULL) { /*If there is old tail then after it goes the new*/ + node_set_next(ll_new_p, ll_new_p->tail, node); + } + + ll_new_p->tail = node; /*Set the new tail in the dsc.*/ + if(ll_new_p->head == NULL) { /*If there is no head (first node) set the head too*/ + ll_new_p->head = node; + } + } +} + +void * _lv_ll_get_head(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->head; +} + +void * _lv_ll_get_tail(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->tail; +} + +void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the next node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_NEXT_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the prev. node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_PREV_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +uint32_t _lv_ll_get_len(const lv_ll_t * ll_p) +{ + uint32_t len = 0; + void * node; + + for(node = _lv_ll_get_head(ll_p); node != NULL; node = _lv_ll_get_next(ll_p, node)) { + len++; + } + + return len; +} + +void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) +{ + if(n_act == n_after) return; /*Can't move before itself*/ + + void * n_before; + if(n_after != NULL) + n_before = _lv_ll_get_prev(ll_p, n_after); + else + n_before = _lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ + + if(n_act == n_before) return; /*Already before `n_after`*/ + + /*It's much easier to remove from the list and add again*/ + _lv_ll_remove(ll_p, n_act); + + /*Add again by setting the prev. and next nodes*/ + node_set_next(ll_p, n_before, n_act); + node_set_prev(ll_p, n_act, n_before); + node_set_prev(ll_p, n_after, n_act); + node_set_next(ll_p, n_act, n_after); + + /*If `n_act` was moved before NULL then it become the new tail*/ + if(n_after == NULL) ll_p->tail = n_act; + + /*If `n_act` was moved before `NULL` then it's the new head*/ + if(n_before == NULL) ll_p->head = n_act; +} + +bool _lv_ll_is_empty(lv_ll_t * ll_p) +{ + if(ll_p == NULL) return true; + + if(ll_p->head == NULL && ll_p->tail == NULL) return true; + + return false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Set the previous node pointer of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which prev. node pointer should be set + * @param prev pointer to a node which should be the previous node before 'act' + */ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) +{ + if(act == NULL) return; /*Can't set the prev node of `NULL`*/ + + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_PREV_P_OFFSET(ll_p); + + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** prev_node_p = (lv_ll_node_t **) &prev; + + *act_node_p = *prev_node_p; +} + +/** + * Set the 'next node pointer' of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which next node pointer should be set + * @param next pointer to a node which should be the next node before 'act' + */ +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) +{ + if(act == NULL) return; /*Can't set the next node of `NULL`*/ + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_NEXT_P_OFFSET(ll_p); + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** next_node_p = (lv_ll_node_t **) &next; + + *act_node_p = *next_node_p; +} diff --git a/libraries/lvgl/src/misc/lv_ll.h b/libraries/lvgl/src/misc/lv_ll.h new file mode 100644 index 0000000..676e404 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_ll.h @@ -0,0 +1,172 @@ +/** + * @file lv_ll.h + * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_LL_H +#define LV_LL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Dummy type to make handling easier*/ +typedef uint8_t lv_ll_node_t; + +/** Description of a linked list*/ +typedef struct { + uint32_t n_size; + lv_ll_node_t * head; + lv_ll_node_t * tail; +} lv_ll_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize linked list + * @param ll_p pointer to lv_ll_t variable + * @param node_size the size of 1 node in bytes + */ +void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); + +/** + * Add a new head to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new head + */ +void * _lv_ll_ins_head(lv_ll_t * ll_p); + +/** + * Insert a new node in front of the n_act node + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the new node + */ +void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); + +/** + * Add a new tail to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new tail + */ +void * _lv_ll_ins_tail(lv_ll_t * ll_p); + +/** + * Remove the node 'node_p' from 'll_p' linked list. + * It does not free the memory of node. + * @param ll_p pointer to the linked list of 'node_p' + * @param node_p pointer to node in 'll_p' linked list + */ +void _lv_ll_remove(lv_ll_t * ll_p, void * node_p); + +void _lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)); + +/** + * Remove and free all elements from a linked list. The list remain valid but become empty. + * @param ll_p pointer to linked list + */ +static inline void _lv_ll_clear(lv_ll_t * ll_p) +{ + _lv_ll_clear_custom(ll_p, NULL); +} + +/** + * Move a node to a new linked list + * @param ll_ori_p pointer to the original (old) linked list + * @param ll_new_p pointer to the new linked list + * @param node pointer to a node + * @param head true: be the head in the new list + * false be the tail in the new list + */ +void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); + +/** + * Return with head node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the head of 'll_p' + */ +void * _lv_ll_get_head(const lv_ll_t * ll_p); + +/** + * Return with tail node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the tail of 'll_p' + */ +void * _lv_ll_get_tail(const lv_ll_t * ll_p); + +/** + * Return with the pointer of the next node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the next node + */ +void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return with the pointer of the previous node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the previous node + */ +void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return the length of the linked list. + * @param ll_p pointer to linked list + * @return length of the linked list + */ +uint32_t _lv_ll_get_len(const lv_ll_t * ll_p); + +/** + * TODO + * @param ll_p + * @param n1_p + * @param n2_p +void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); + */ + +/** + * Move a node before an other node in the same linked list + * @param ll_p pointer to a linked list + * @param n_act pointer to node to move + * @param n_after pointer to a node which should be after `n_act` + */ +void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); + +/** + * Check if a linked list is empty + * @param ll_p pointer to a linked list + * @return true: the linked list is empty; false: not empty + */ +bool _lv_ll_is_empty(lv_ll_t * ll_p); + +/********************** + * MACROS + **********************/ + +#define _LV_LL_READ(list, i) for(i = _lv_ll_get_head(list); i != NULL; i = _lv_ll_get_next(list, i)) + +#define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(list); i != NULL; i = _lv_ll_get_prev(list, i)) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/misc/lv_log.c b/libraries/lvgl/src/misc/lv_log.c new file mode 100644 index 0000000..d72c11b --- /dev/null +++ b/libraries/lvgl/src/misc/lv_log.c @@ -0,0 +1,147 @@ +/** + * @file lv_log.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_log.h" +#if LV_USE_LOG + +#include +#include +#include "../stdlib/lv_sprintf.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "../tick/lv_tick.h" +#include "../core/lv_global.h" + +#if LV_LOG_PRINTF + #include +#endif + +/********************* + * DEFINES + *********************/ +#if LV_LOG_USE_TIMESTAMP + #define last_log_time LV_GLOBAL_DEFAULT()->log_last_log_time +#endif +#define custom_print_cb LV_GLOBAL_DEFAULT()->custom_log_print_cb + +#if LV_LOG_USE_TIMESTAMP + #define LOG_TIMESTAMP_FMT "\t(%" LV_PRIu32 ".%03" LV_PRIu32 ", +%" LV_PRIu32 ")\t" + #define LOG_TIMESTAMP_EXPR t / 1000, t % 1000, t - last_log_time, +#else + #define LOG_TIMESTAMP_FMT + #define LOG_TIMESTAMP_EXPR +#endif + +#if LV_LOG_USE_FILE_LINE + #define LOG_FILE_LINE_FMT " %s:%d" + #define LOG_FILE_LINE_EXPR , &file[p], line +#else + #define LOG_FILE_LINE_FMT + #define LOG_FILE_LINE_EXPR +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) +{ + custom_print_cb = print_cb; +} + +void _lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) +{ + if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/ + + if(level >= LV_LOG_LEVEL) { + va_list args; + va_start(args, format); + +#if LV_LOG_USE_FILE_LINE + /*Use only the file name not the path*/ + size_t p; + for(p = lv_strlen(file); p > 0; p--) { + if(file[p] == '/' || file[p] == '\\') { + p++; /*Skip the slash*/ + break; + } + } +#else + LV_UNUSED(file); + LV_UNUSED(line); +#endif + +#if LV_LOG_USE_TIMESTAMP + uint32_t t = lv_tick_get(); +#endif + static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"}; + +#if LV_LOG_PRINTF + printf("[%s]" LOG_TIMESTAMP_FMT " %s: ", + lvl_prefix[level], LOG_TIMESTAMP_EXPR func); + vprintf(format, args); + printf(LOG_FILE_LINE_FMT "\n" LOG_FILE_LINE_EXPR); +#else + if(custom_print_cb) { + char buf[512]; + char msg[256]; + lv_vsnprintf(msg, sizeof(msg), format, args); + lv_snprintf(buf, sizeof(buf), "[%s]" LOG_TIMESTAMP_FMT " %s: %s" LOG_FILE_LINE_FMT "\n", + lvl_prefix[level], LOG_TIMESTAMP_EXPR func, msg LOG_FILE_LINE_EXPR); + custom_print_cb(level, buf); + } +#endif + +#if LV_LOG_USE_TIMESTAMP + last_log_time = t; +#endif + va_end(args); + } +} + +void lv_log(const char * format, ...) +{ + if(LV_LOG_LEVEL >= LV_LOG_LEVEL_NONE) return; /* disable log */ + + va_list args; + va_start(args, format); + +#if LV_LOG_PRINTF + vprintf(format, args); +#else + if(custom_print_cb) { + char buf[512]; + lv_vsnprintf(buf, sizeof(buf), format, args); + custom_print_cb(LV_LOG_LEVEL_USER, buf); + } +#endif + + va_end(args); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LOG*/ diff --git a/libraries/lvgl/src/misc/lv_log.h b/libraries/lvgl/src/misc/lv_log.h new file mode 100644 index 0000000..87ca382 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_log.h @@ -0,0 +1,163 @@ +/** + * @file lv_log.h + * + */ + +#ifndef LV_LOG_H +#define LV_LOG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/*Possible log level. For compatibility declare it independently from `LV_USE_LOG`*/ + +#define LV_LOG_LEVEL_TRACE 0 /**< A lot of logs to give detailed information*/ +#define LV_LOG_LEVEL_INFO 1 /**< Log important events*/ +#define LV_LOG_LEVEL_WARN 2 /**< Log if something unwanted happened but didn't caused problem*/ +#define LV_LOG_LEVEL_ERROR 3 /**< Only critical issue, when the system may fail*/ +#define LV_LOG_LEVEL_USER 4 /**< Custom logs from the user*/ +#define LV_LOG_LEVEL_NONE 5 /**< Do not log anything*/ +#define _LV_LOG_LEVEL_NUM 6 /**< Number of log levels*/ + +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_WARN); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_ERROR); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_USER); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_NONE); + +typedef int8_t lv_log_level_t; + +#if LV_USE_LOG + +#if LV_LOG_USE_FILE_LINE +#define LV_LOG_FILE __FILE__ +#define LV_LOG_LINE __LINE__ +#else +#define LV_LOG_FILE NULL +#define LV_LOG_LINE 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * Log print function. Receives a string buffer to print". + */ +typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char * buf); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register custom print/write function to call when a log is added. + * It can format its "File path", "Line number" and "Description" as required + * and send the formatted log message to a console or serial port. + * @param print_cb a function pointer to print a log + */ +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); + +/** + * Print a log message via `printf` if enabled with `LV_LOG_PRINTF` in `lv_conf.h` + * and/or a print callback if registered with `lv_log_register_print_cb` + * @param format printf-like format string + * @param ... parameters for `format` + */ +void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2); + +/** + * Add a log + * @param level the level of log. (From `lv_log_level_t` enum) + * @param file name of the file when the log added + * @param line line number in the source code where the log added + * @param func name of the function when the log added + * @param format printf-like format string + * @param ... parameters for `format` + */ +void _lv_log_add(lv_log_level_t level, const char * file, int line, + const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); + +/********************** + * MACROS + **********************/ +#ifndef LV_LOG_TRACE +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE +# define LV_LOG_TRACE(...) _lv_log_add(LV_LOG_LEVEL_TRACE, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_TRACE(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_INFO +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO +# define LV_LOG_INFO(...) _lv_log_add(LV_LOG_LEVEL_INFO, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_INFO(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_WARN +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN +# define LV_LOG_WARN(...) _lv_log_add(LV_LOG_LEVEL_WARN, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_WARN(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_ERROR +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR +# define LV_LOG_ERROR(...) _lv_log_add(LV_LOG_LEVEL_ERROR, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_ERROR(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_USER +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER +# define LV_LOG_USER(...) _lv_log_add(LV_LOG_LEVEL_USER, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_USER(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG +# if LV_LOG_LEVEL < LV_LOG_LEVEL_NONE +# define LV_LOG(...) lv_log(__VA_ARGS__) +# else +# define LV_LOG(...) do {} while(0) +# endif +#endif + +#else /*LV_USE_LOG*/ + +/*Do nothing if `LV_USE_LOG 0`*/ +#define _lv_log_add(level, file, line, ...) +#define LV_LOG_TRACE(...) do {}while(0) +#define LV_LOG_INFO(...) do {}while(0) +#define LV_LOG_WARN(...) do {}while(0) +#define LV_LOG_ERROR(...) do {}while(0) +#define LV_LOG_USER(...) do {}while(0) +#define LV_LOG(...) do {}while(0) + +#endif /*LV_USE_LOG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOG_H*/ diff --git a/libraries/lvgl/src/misc/lv_lru.c b/libraries/lvgl/src/misc/lv_lru.c new file mode 100644 index 0000000..5f3618c --- /dev/null +++ b/libraries/lvgl/src/misc/lv_lru.c @@ -0,0 +1,344 @@ +/** + * @file lv_lru.c + * + * @see https://github.com/willcannings/C-LRU-Cache + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_lru.h" +#include "lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "lv_assert.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_lru_item_t { + void * value; + void * key; + size_t value_length; + size_t key_length; + uint64_t access_count; + struct _lv_lru_item_t * next; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * MurmurHash2 + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length); + +/** compare a key against an existing item's key */ +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length); + +/** remove an item and push it to the free items queue */ +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index); + +/** pop an existing item off the free queue, or create a new one */ +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/* error helpers */ +#define error_for(conditions, error) if(conditions) {return error;} +#define test_for_missing_cache() error_for(!cache, LV_LRU_MISSING_CACHE) +#define test_for_missing_key() error_for(!key, LV_LRU_MISSING_KEY) +#define test_for_missing_value() error_for(!value || value_length == 0, LV_LRU_MISSING_VALUE) +#define test_for_value_too_large() error_for(value_length > cache->total_memory, LV_LRU_VALUE_TOO_LARGE) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, + lv_lru_free_cb_t key_free) +{ + // create the cache + lv_lru_t * cache = lv_malloc_zeroed(sizeof(lv_lru_t)); + if(!cache) { + LV_LOG_WARN("LRU Cache unable to create cache object"); + return NULL; + } + cache->hash_table_size = cache_size / average_length; + cache->average_item_length = average_length; + cache->free_memory = cache_size; + cache->total_memory = cache_size; + cache->seed = lv_rand(1, UINT32_MAX); + cache->value_free = value_free ? value_free : lv_free; + cache->key_free = key_free ? key_free : lv_free; + + // size the hash table to a guestimate of the number of slots required (assuming a perfect hash) + cache->items = lv_malloc_zeroed(sizeof(lv_lru_item_t *) * cache->hash_table_size); + if(!cache->items) { + LV_LOG_WARN("LRU Cache unable to create cache hash table"); + lv_free(cache); + return NULL; + } + return cache; +} + +void lv_lru_delete(lv_lru_t * cache) +{ + LV_ASSERT_NULL(cache); + + // free each of the cached items, and the hash table + lv_lru_item_t * item = NULL, * next = NULL; + uint32_t i = 0; + if(cache->items) { + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + while(item) { + next = (lv_lru_item_t *) item->next; + cache->value_free(item->value); + cache->key_free(item->key); + cache->free_memory += item->value_length; + lv_free(item); + item = next; + } + } + lv_free(cache->items); + } + + if(cache->free_items) { + item = cache->free_items; + while(item) { + next = (lv_lru_item_t *) item->next; + lv_free(item); + item = next; + } + } + + // free the cache + lv_free(cache); +} + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length) +{ + test_for_missing_cache(); + test_for_missing_key(); + test_for_missing_value(); + test_for_value_too_large(); + + // see if the key already exists + uint32_t hash_index = lv_lru_hash(cache, key, key_length); + int required = 0; + lv_lru_item_t * item = NULL, * prev = NULL; + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_length)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + // update the value and value_lengths + required = (int)(value_length - item->value_length); + cache->value_free(item->value); + item->value = value; + item->value_length = value_length; + + } + else { + // insert a new item + item = lv_lru_pop_or_create_item(cache); + item->value = value; + item->key = lv_malloc(key_length); + memcpy(item->key, key, key_length); + item->value_length = value_length; + item->key_length = key_length; + required = (int) value_length; + + if(prev) + prev->next = item; + else + cache->items[hash_index] = item; + } + item->access_count = ++cache->access_count; + + // remove as many items as necessary to free enough space + if(required > 0 && (size_t) required > cache->free_memory) { + while(cache->free_memory < (size_t) required) + lv_lru_remove_lru_item(cache); + } + cache->free_memory -= required; + return LV_LRU_OK; +} + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + lv_lru_item_t * item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) + item = (lv_lru_item_t *) item->next; + + if(item) { + *value = item->value; + item->access_count = ++cache->access_count; + } + else { + *value = NULL; + } + + return LV_LRU_OK; +} + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + lv_lru_item_t * item = NULL, * prev = NULL; + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + lv_lru_remove_item(cache, prev, item, hash_index); + } + + return LV_LRU_OK; +} + +void lv_lru_remove_lru_item(lv_lru_t * cache) +{ + lv_lru_item_t * min_item = NULL, * min_prev = NULL; + lv_lru_item_t * item = NULL, * prev = NULL; + uint32_t i = 0, min_index = -1; + uint64_t min_access_count = -1; + + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + prev = NULL; + + while(item) { + if(item->access_count < min_access_count || (int64_t) min_access_count == -1) { + min_access_count = item->access_count; + min_item = item; + min_prev = prev; + min_index = i; + } + prev = item; + item = item->next; + } + } + + if(min_item) { + lv_lru_remove_item(cache, min_prev, min_item, min_index); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length) +{ + uint32_t m = 0x5bd1e995; + uint32_t r = 24; + uint32_t h = cache->seed ^ key_length; + char * data = (char *) key; + + while(key_length >= 4) { + uint32_t k = *(uint32_t *) data; + k *= m; + k ^= k >> r; + k *= m; + h *= m; + h ^= k; + data += 4; + key_length -= 4; + } + + if(key_length >= 3) { + h ^= data[2] << 16; + } + if(key_length >= 2) { + h ^= data[1] << 8; + } + if(key_length >= 1) { + h ^= data[0]; + h *= m; + } + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + return h % cache->hash_table_size; +} + +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length) +{ + if(key_length != item->key_length) { + return 1; + } + else { + return memcmp(key, item->key, key_length); + } +} + +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index) +{ + if(prev) { + prev->next = item->next; + } + else { + cache->items[hash_index] = (lv_lru_item_t *) item->next; + } + + // free memory and update the free memory counter + cache->free_memory += item->value_length; + cache->value_free(item->value); + cache->key_free(item->key); + + // push the item to the free items queue + lv_memzero(item, sizeof(lv_lru_item_t)); + item->next = cache->free_items; + cache->free_items = item; +} + +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache) +{ + lv_lru_item_t * item = NULL; + + if(cache->free_items) { + item = cache->free_items; + cache->free_items = item->next; + lv_memzero(item, sizeof(lv_lru_item_t)); + } + else { + item = lv_malloc_zeroed(sizeof(lv_lru_item_t)); + } + + return item; +} diff --git a/libraries/lvgl/src/misc/lv_lru.h b/libraries/lvgl/src/misc/lv_lru.h new file mode 100644 index 0000000..02172d2 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_lru.h @@ -0,0 +1,86 @@ +/** + * @file lv_lru.h + * + */ + +#ifndef LV_LRU_H +#define LV_LRU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#include "lv_types.h" + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_LRU_OK = 0, + LV_LRU_MISSING_CACHE, + LV_LRU_MISSING_KEY, + LV_LRU_MISSING_VALUE, + LV_LRU_LOCK_ERROR, + LV_LRU_VALUE_TOO_LARGE +} lv_lru_res_t; + +typedef void (*lv_lru_free_cb_t)(void * v); + +typedef struct _lv_lru_item_t lv_lru_item_t; + +typedef struct lv_lru_t { + lv_lru_item_t ** items; + uint64_t access_count; + size_t free_memory; + size_t total_memory; + size_t average_item_length; + size_t hash_table_size; + uint32_t seed; + lv_lru_free_cb_t value_free; + lv_lru_free_cb_t key_free; + lv_lru_item_t * free_items; +} lv_lru_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, + lv_lru_free_cb_t key_free); + +void lv_lru_delete(lv_lru_t * cache); + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length); + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value); + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size); + +/** + * remove the least recently used item + * + * @todo we can optimise this by finding the n lru items, where n = required_space / average_length + */ +void lv_lru_remove_lru_item(lv_lru_t * cache); +/********************** + * MACROS + **********************/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LRU_H*/ diff --git a/libraries/lvgl/src/misc/lv_math.c b/libraries/lvgl/src/misc/lv_math.c new file mode 100644 index 0000000..59e9460 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_math.c @@ -0,0 +1,355 @@ +/** + * @file lv_math.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_math.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define rand_seed LV_GLOBAL_DEFAULT()->math_rand_seed + +/********************** + * TYPEDEFS + **********************/ + +#define CUBIC_NEWTON_ITERATIONS 8 +#define CUBIC_PRECISION_BITS 10 /* 10 or 14 bits recommended, int64_t calculation is used for >14bit precision */ + +#if CUBIC_PRECISION_BITS < 10 || CUBIC_PRECISION_BITS > 20 + #error "cubic precision bits should be in range of [10, 20] for 32bit/64bit calculations." +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static const uint16_t sin0_90_table[] = { + 0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481, + 9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14365, 14876, 15384, 15886, 16384, 16877, + 17364, 17847, 18324, 18795, 19261, 19720, 20174, 20622, 21063, 21498, 21926, 22348, 22763, 23170, 23571, 23965, + 24351, 24730, 25102, 25466, 25822, 26170, 26510, 26842, 27166, 27482, 27789, 28088, 28378, 28660, 28932, 29197, + 29452, 29698, 29935, 30163, 30382, 30592, 30792, 30983, 31164, 31336, 31499, 31651, 31795, 31928, 32052, 32166, + 32270, 32365, 32449, 32524, 32588, 32643, 32688, 32723, 32748, 32763, 32768 +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle) +{ + int32_t ret = 0; + while(angle < 0) angle += 360; + while(angle >= 360) angle -= 360; + + if(angle < 90) { + ret = sin0_90_table[angle]; + } + else if(angle >= 90 && angle < 180) { + angle = 180 - angle; + ret = sin0_90_table[angle]; + } + else if(angle >= 180 && angle < 270) { + angle = angle - 180; + ret = -sin0_90_table[angle]; + } + else { /*angle >=270*/ + angle = 360 - angle; + ret = -sin0_90_table[angle]; + } + + if(ret == 32767) return 32768; + else if(ret == -32767) return -32768; + else return ret; +} + +/** + * cubic-bezier Reference: + * + * https://github.com/gre/bezier-easing + * https://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h + * + * Copyright (c) 2014 Gaëtan Renaudeau + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +static int32_t do_cubic_bezier(int32_t t, int32_t a, int32_t b, int32_t c) +{ + /*a * t^3 + b * t^2 + c * t*/ +#if CUBIC_PRECISION_BITS > 14 + int64_t ret; +#else + int32_t ret; +#endif + + ret = a; + ret = (ret * t) >> CUBIC_PRECISION_BITS; + ret = ((ret + b) * t) >> CUBIC_PRECISION_BITS; + ret = ((ret + c) * t) >> CUBIC_PRECISION_BITS; + return ret; +} + +int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + int32_t ax, bx, cx, ay, by, cy; + int32_t tl, tr, t; /*t in cubic-bezier function, used for bisection */ + int32_t xs; /*x sampled on curve */ +#if CUBIC_PRECISION_BITS > 14 + int64_t d; /*slope value at specified t*/ +#else + int32_t d; +#endif + + if(x == 0 || x == LV_BEZIER_VAL_MAX) return x; + + /* input is always LV_BEZIER_VAL_SHIFT bit precision */ + +#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT + x <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + x1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + x2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + y1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + y2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; +#endif + + cx = 3 * x1; + bx = 3 * (x2 - x1) - cx; + ax = (1L << CUBIC_PRECISION_BITS) - cx - bx; + + cy = 3 * y1; + by = 3 * (y2 - y1) - cy; + ay = (1L << CUBIC_PRECISION_BITS) - cy - by; + + /*Try Newton's method firstly */ + t = x; /*Make a guess*/ + for(int i = 0; i < CUBIC_NEWTON_ITERATIONS; i++) { + /*Check if x on curve at t matches input x*/ + xs = do_cubic_bezier(t, ax, bx, cx) - x; + if(LV_ABS(xs) <= 1) goto found; + + /* get slop at t, d = 3 * ax * t^2 + 2 * bx + t + cx */ + d = ax; /* use 64bit operation if needed. */ + d = (3 * d * t) >> CUBIC_PRECISION_BITS; + d = ((d + 2 * bx) * t) >> CUBIC_PRECISION_BITS; + d += cx; + + if(LV_ABS(d) <= 1) break; + + d = ((int64_t)xs * (1L << CUBIC_PRECISION_BITS)) / d; + if(d == 0) break; /*Reached precision limits*/ + t -= d; + } + + /*Fallback to bisection method for reliability*/ + tl = 0, tr = 1L << CUBIC_PRECISION_BITS, t = x; + + if(t < tl) { + t = tl; + goto found; + } + + if(t > tr) { + t = tr; + goto found; + } + + while(tl < tr) { + xs = do_cubic_bezier(t, ax, bx, cx); + if(LV_ABS(xs - x) <= 1) goto found; + x > xs ? (tl = t) : (tr = t); + t = (tr - tl) / 2 + tl; + if(t == tl) break; + } + + /*Failed to find suitable t for given x, return a value anyway.*/ +found: + /*Return y at t*/ +#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT + return do_cubic_bezier(t, ay, by, cy) >> (CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT); +#else + return do_cubic_bezier(t, ay, by, cy); +#endif +} + +void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) +{ + x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ + + uint32_t root = 0; + uint32_t trial; + /*http://ww1.microchip.com/...en/AppNotes/91040a.pdf*/ + do { + trial = root + mask; + if(trial * trial <= x) root = trial; + mask = mask >> 1; + } while(mask); + + q->i = root >> 4; + q->f = (root & 0xf) << 4; +} + +uint16_t lv_atan2(int x, int y) +{ + /** + * Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com + * Converts any XY values including 0 to a degree value that should be + * within +/- 1 degree of the accurate value without needing + * large slow trig functions like ArcTan() or ArcCos(). + * NOTE! at least one of the X or Y values must be non-zero! + * This is the full version, for all 4 quadrants and will generate + * the angle in integer degrees from 0-360. + * Any values of X and Y are usable including negative values provided + * they are between -1456 and 1456 so the 16bit multiply does not overflow. + */ + unsigned char negflag; + unsigned char tempdegree; + unsigned char comp; + unsigned int degree; /*this will hold the result*/ + unsigned int ux; + unsigned int uy; + + /*Save the sign flags then remove signs and get XY as unsigned ints*/ + negflag = 0; + if(x < 0) { + negflag += 0x01; /*x flag bit*/ + x = (0 - x); /*is now +*/ + } + ux = x; /*copy to unsigned var before multiply*/ + if(y < 0) { + negflag += 0x02; /*y flag bit*/ + y = (0 - y); /*is now +*/ + } + uy = y; /*copy to unsigned var before multiply*/ + + /*1. Calc the scaled "degrees"*/ + if(ux > uy) { + degree = (uy * 45) / ux; /*degree result will be 0-45 range*/ + negflag += 0x10; /*octant flag bit*/ + } + else { + degree = (ux * 45) / uy; /*degree result will be 0-45 range*/ + } + + /*2. Compensate for the 4 degree error curve*/ + comp = 0; + tempdegree = degree; /*use an unsigned char for speed!*/ + if(tempdegree > 22) { /*if top half of range*/ + if(tempdegree <= 44) comp++; + if(tempdegree <= 41) comp++; + if(tempdegree <= 37) comp++; + if(tempdegree <= 32) comp++; /*max is 4 degrees compensated*/ + } + else { /*else is lower half of range*/ + if(tempdegree >= 2) comp++; + if(tempdegree >= 6) comp++; + if(tempdegree >= 10) comp++; + if(tempdegree >= 15) comp++; /*max is 4 degrees compensated*/ + } + degree += comp; /*degree is now accurate to +/- 1 degree!*/ + + /*Invert degree if it was X>Y octant, makes 0-45 into 90-45*/ + if(negflag & 0x10) degree = (90 - degree); + + /*3. Degree is now 0-90 range for this quadrant,*/ + /*need to invert it for whichever quadrant it was in*/ + if(negflag & 0x02) { /*if -Y*/ + if(negflag & 0x01) /*if -Y -X*/ + degree = (180 + degree); + else /*else is -Y +X*/ + degree = (180 - degree); + } + else { /*else is +Y*/ + if(negflag & 0x01) /*if +Y -X*/ + degree = (360 - degree); + } + return degree; +} + +int64_t lv_pow(int64_t base, int8_t exp) +{ + int64_t result = 1; + while(exp) { + if(exp & 1) + result *= base; + exp >>= 1; + base *= base; + } + + return result; +} + +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out) +{ + if(max_in >= min_in && x >= max_in) return max_out; + if(max_in >= min_in && x <= min_in) return min_out; + + if(max_in <= min_in && x <= max_in) return max_out; + if(max_in <= min_in && x >= min_in) return min_out; + + /** + * The equation should be: + * ((x - min_in) * delta_out) / delta in) + min_out + * To avoid rounding error reorder the operations: + * (x - min_in) * (delta_out / delta_min) + min_out + */ + + int32_t delta_in = max_in - min_in; + int32_t delta_out = max_out - min_out; + + return ((x - min_in) * delta_out) / delta_in + min_out; +} + +void lv_rand_set_seed(uint32_t seed) +{ + rand_seed = seed; +} + +uint32_t lv_rand(uint32_t min, uint32_t max) +{ + /*Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs"*/ + uint32_t x = rand_seed; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + rand_seed = x; + + return (rand_seed % (max - min + 1)) + min; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_math.h b/libraries/lvgl/src/misc/lv_math.h new file mode 100644 index 0000000..d1a543d --- /dev/null +++ b/libraries/lvgl/src/misc/lv_math.h @@ -0,0 +1,170 @@ +/** + * @file lv_math.h + * + */ + +#ifndef LV_MATH_H +#define LV_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define LV_TRIGO_SIN_MAX 32768 +#define LV_TRIGO_SHIFT 15 /**< >> LV_TRIGO_SHIFT to normalize*/ + +#define LV_BEZIER_VAL_SHIFT 10 /**< log2(LV_BEZIER_VAL_MAX): used to normalize up scaled values*/ +#define LV_BEZIER_VAL_MAX (1L << LV_BEZIER_VAL_SHIFT) /**< Max time in Bezier functions (not [0..1] to use integers)*/ +#define LV_BEZIER_VAL_FLOAT(f) ((int32_t)((f) * LV_BEZIER_VAL_MAX)) /**< Convert const float number cubic-bezier values to fix-point value*/ + +/*Align up value x to align, align must be a power of two*/ +#define LV_ALIGN_UP(x, align) (((x) + ((align) - 1)) & ~((align) - 1)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint16_t i; + uint16_t f; +} lv_sqrt_res_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +//! @cond Doxygen_Suppress +/** + * Return with sinus of an angle + * @param angle + * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 + */ +int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); + +static inline int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) +{ + return lv_trigo_sin(angle + 90); +} + +//! @endcond + +/** + * Calculate the y value of cubic-bezier(x1, y1, x2, y2) function as specified x. + * @param x time in range of [0..LV_BEZIER_VAL_MAX] + * @param x1 x of control point 1 in range of [0..LV_BEZIER_VAL_MAX] + * @param y1 y of control point 1 in range of [0..LV_BEZIER_VAL_MAX] + * @param x2 x of control point 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param y2 y of control point 2 in range of [0..LV_BEZIER_VAL_MAX] + * @return the value calculated + */ +int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2); + +/** + * Calculate a value of a Cubic Bezier function. + * @param t time in range of [0..LV_BEZIER_VAL_MAX] + * @param u0 must be 0 + * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] + * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param u3 must be LV_BEZIER_VAL_MAX + * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] + */ +static inline int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3) +{ + LV_UNUSED(u0); + LV_UNUSED(u3); + return lv_cubic_bezier(t, 341, u1, 683, u2); +} + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y); + +//! @cond Doxygen_Suppress + +/** + * Get the square root of a number + * @param x integer which square root should be calculated + * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit + * @param mask optional to skip some iterations if the magnitude of the root is known. + * Set to 0x8000 by default. + * If root < 16: mask = 0x80 + * If root < 256: mask = 0x800 + * Else: mask = 0x8000 + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); + +//! @endcond + +/** + * Calculate the integer exponents. + * @param base + * @param exp + * @return base raised to the power exponent + */ +int64_t lv_pow(int64_t base, int8_t exp); + +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out); + +/** + * Set the seed of the pseudo random number generator + * @param seed a number to initialize the random generator + */ +void lv_rand_set_seed(uint32_t seed); + +/** + * Get a pseudo random number in the given range + * @param min the minimum value + * @param max the maximum value + * @return return the random number. min <= return_value <= max + */ +uint32_t lv_rand(uint32_t min, uint32_t max); + +/********************** + * MACROS + **********************/ +#define LV_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define LV_MIN3(a, b, c) (LV_MIN(LV_MIN(a,b), c)) +#define LV_MIN4(a, b, c, d) (LV_MIN(LV_MIN(a,b), LV_MIN(c,d))) + +#define LV_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LV_MAX3(a, b, c) (LV_MAX(LV_MAX(a,b), c)) +#define LV_MAX4(a, b, c, d) (LV_MAX(LV_MAX(a,b), LV_MAX(c,d))) + +#define LV_CLAMP(min, val, max) (LV_MAX(min, (LV_MIN(val, max)))) + +#define LV_ABS(x) ((x) > 0 ? (x) : (-(x))) +#define LV_UDIV255(x) (((x) * 0x8081U) >> 0x17) + +#define LV_IS_SIGNED(t) (((t)(-1)) < ((t)0)) +#define LV_UMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_SMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_MAX_OF(t) ((unsigned long)(LV_IS_SIGNED(t) ? LV_SMAX_OF(t) : LV_UMAX_OF(t))) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/misc/lv_palette.c b/libraries/lvgl/src/misc/lv_palette.c new file mode 100644 index 0000000..31aa66c --- /dev/null +++ b/libraries/lvgl/src/misc/lv_palette.c @@ -0,0 +1,130 @@ +/** + * @file lv_palette.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_palette.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_color_t lv_palette_main(lv_palette_t p) +{ + static const lv_color_t colors[] = { + LV_COLOR_MAKE(0xF4, 0x43, 0x36), LV_COLOR_MAKE(0xE9, 0x1E, 0x63), LV_COLOR_MAKE(0x9C, 0x27, 0xB0), LV_COLOR_MAKE(0x67, 0x3A, 0xB7), + LV_COLOR_MAKE(0x3F, 0x51, 0xB5), LV_COLOR_MAKE(0x21, 0x96, 0xF3), LV_COLOR_MAKE(0x03, 0xA9, 0xF4), LV_COLOR_MAKE(0x00, 0xBC, 0xD4), + LV_COLOR_MAKE(0x00, 0x96, 0x88), LV_COLOR_MAKE(0x4C, 0xAF, 0x50), LV_COLOR_MAKE(0x8B, 0xC3, 0x4A), LV_COLOR_MAKE(0xCD, 0xDC, 0x39), + LV_COLOR_MAKE(0xFF, 0xEB, 0x3B), LV_COLOR_MAKE(0xFF, 0xC1, 0x07), LV_COLOR_MAKE(0xFF, 0x98, 0x00), LV_COLOR_MAKE(0xFF, 0x57, 0x22), + LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E) + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + return colors[p]; + +} + +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][5] = { + {LV_COLOR_MAKE(0xEF, 0x53, 0x50), LV_COLOR_MAKE(0xE5, 0x73, 0x73), LV_COLOR_MAKE(0xEF, 0x9A, 0x9A), LV_COLOR_MAKE(0xFF, 0xCD, 0xD2), LV_COLOR_MAKE(0xFF, 0xEB, 0xEE)}, + {LV_COLOR_MAKE(0xEC, 0x40, 0x7A), LV_COLOR_MAKE(0xF0, 0x62, 0x92), LV_COLOR_MAKE(0xF4, 0x8F, 0xB1), LV_COLOR_MAKE(0xF8, 0xBB, 0xD0), LV_COLOR_MAKE(0xFC, 0xE4, 0xEC)}, + {LV_COLOR_MAKE(0xAB, 0x47, 0xBC), LV_COLOR_MAKE(0xBA, 0x68, 0xC8), LV_COLOR_MAKE(0xCE, 0x93, 0xD8), LV_COLOR_MAKE(0xE1, 0xBE, 0xE7), LV_COLOR_MAKE(0xF3, 0xE5, 0xF5)}, + {LV_COLOR_MAKE(0x7E, 0x57, 0xC2), LV_COLOR_MAKE(0x95, 0x75, 0xCD), LV_COLOR_MAKE(0xB3, 0x9D, 0xDB), LV_COLOR_MAKE(0xD1, 0xC4, 0xE9), LV_COLOR_MAKE(0xED, 0xE7, 0xF6)}, + {LV_COLOR_MAKE(0x5C, 0x6B, 0xC0), LV_COLOR_MAKE(0x79, 0x86, 0xCB), LV_COLOR_MAKE(0x9F, 0xA8, 0xDA), LV_COLOR_MAKE(0xC5, 0xCA, 0xE9), LV_COLOR_MAKE(0xE8, 0xEA, 0xF6)}, + {LV_COLOR_MAKE(0x42, 0xA5, 0xF5), LV_COLOR_MAKE(0x64, 0xB5, 0xF6), LV_COLOR_MAKE(0x90, 0xCA, 0xF9), LV_COLOR_MAKE(0xBB, 0xDE, 0xFB), LV_COLOR_MAKE(0xE3, 0xF2, 0xFD)}, + {LV_COLOR_MAKE(0x29, 0xB6, 0xF6), LV_COLOR_MAKE(0x4F, 0xC3, 0xF7), LV_COLOR_MAKE(0x81, 0xD4, 0xFA), LV_COLOR_MAKE(0xB3, 0xE5, 0xFC), LV_COLOR_MAKE(0xE1, 0xF5, 0xFE)}, + {LV_COLOR_MAKE(0x26, 0xC6, 0xDA), LV_COLOR_MAKE(0x4D, 0xD0, 0xE1), LV_COLOR_MAKE(0x80, 0xDE, 0xEA), LV_COLOR_MAKE(0xB2, 0xEB, 0xF2), LV_COLOR_MAKE(0xE0, 0xF7, 0xFA)}, + {LV_COLOR_MAKE(0x26, 0xA6, 0x9A), LV_COLOR_MAKE(0x4D, 0xB6, 0xAC), LV_COLOR_MAKE(0x80, 0xCB, 0xC4), LV_COLOR_MAKE(0xB2, 0xDF, 0xDB), LV_COLOR_MAKE(0xE0, 0xF2, 0xF1)}, + {LV_COLOR_MAKE(0x66, 0xBB, 0x6A), LV_COLOR_MAKE(0x81, 0xC7, 0x84), LV_COLOR_MAKE(0xA5, 0xD6, 0xA7), LV_COLOR_MAKE(0xC8, 0xE6, 0xC9), LV_COLOR_MAKE(0xE8, 0xF5, 0xE9)}, + {LV_COLOR_MAKE(0x9C, 0xCC, 0x65), LV_COLOR_MAKE(0xAE, 0xD5, 0x81), LV_COLOR_MAKE(0xC5, 0xE1, 0xA5), LV_COLOR_MAKE(0xDC, 0xED, 0xC8), LV_COLOR_MAKE(0xF1, 0xF8, 0xE9)}, + {LV_COLOR_MAKE(0xD4, 0xE1, 0x57), LV_COLOR_MAKE(0xDC, 0xE7, 0x75), LV_COLOR_MAKE(0xE6, 0xEE, 0x9C), LV_COLOR_MAKE(0xF0, 0xF4, 0xC3), LV_COLOR_MAKE(0xF9, 0xFB, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xEE, 0x58), LV_COLOR_MAKE(0xFF, 0xF1, 0x76), LV_COLOR_MAKE(0xFF, 0xF5, 0x9D), LV_COLOR_MAKE(0xFF, 0xF9, 0xC4), LV_COLOR_MAKE(0xFF, 0xFD, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xCA, 0x28), LV_COLOR_MAKE(0xFF, 0xD5, 0x4F), LV_COLOR_MAKE(0xFF, 0xE0, 0x82), LV_COLOR_MAKE(0xFF, 0xEC, 0xB3), LV_COLOR_MAKE(0xFF, 0xF8, 0xE1)}, + {LV_COLOR_MAKE(0xFF, 0xA7, 0x26), LV_COLOR_MAKE(0xFF, 0xB7, 0x4D), LV_COLOR_MAKE(0xFF, 0xCC, 0x80), LV_COLOR_MAKE(0xFF, 0xE0, 0xB2), LV_COLOR_MAKE(0xFF, 0xF3, 0xE0)}, + {LV_COLOR_MAKE(0xFF, 0x70, 0x43), LV_COLOR_MAKE(0xFF, 0x8A, 0x65), LV_COLOR_MAKE(0xFF, 0xAB, 0x91), LV_COLOR_MAKE(0xFF, 0xCC, 0xBC), LV_COLOR_MAKE(0xFB, 0xE9, 0xE7)}, + {LV_COLOR_MAKE(0x8D, 0x6E, 0x63), LV_COLOR_MAKE(0xA1, 0x88, 0x7F), LV_COLOR_MAKE(0xBC, 0xAA, 0xA4), LV_COLOR_MAKE(0xD7, 0xCC, 0xC8), LV_COLOR_MAKE(0xEF, 0xEB, 0xE9)}, + {LV_COLOR_MAKE(0x78, 0x90, 0x9C), LV_COLOR_MAKE(0x90, 0xA4, 0xAE), LV_COLOR_MAKE(0xB0, 0xBE, 0xC5), LV_COLOR_MAKE(0xCF, 0xD8, 0xDC), LV_COLOR_MAKE(0xEC, 0xEF, 0xF1)}, + {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)}, + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 5) { + LV_LOG_WARN("Invalid level: %d. Must be 1..5", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} + +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][4] = { + {LV_COLOR_MAKE(0xE5, 0x39, 0x35), LV_COLOR_MAKE(0xD3, 0x2F, 0x2F), LV_COLOR_MAKE(0xC6, 0x28, 0x28), LV_COLOR_MAKE(0xB7, 0x1C, 0x1C)}, + {LV_COLOR_MAKE(0xD8, 0x1B, 0x60), LV_COLOR_MAKE(0xC2, 0x18, 0x5B), LV_COLOR_MAKE(0xAD, 0x14, 0x57), LV_COLOR_MAKE(0x88, 0x0E, 0x4F)}, + {LV_COLOR_MAKE(0x8E, 0x24, 0xAA), LV_COLOR_MAKE(0x7B, 0x1F, 0xA2), LV_COLOR_MAKE(0x6A, 0x1B, 0x9A), LV_COLOR_MAKE(0x4A, 0x14, 0x8C)}, + {LV_COLOR_MAKE(0x5E, 0x35, 0xB1), LV_COLOR_MAKE(0x51, 0x2D, 0xA8), LV_COLOR_MAKE(0x45, 0x27, 0xA0), LV_COLOR_MAKE(0x31, 0x1B, 0x92)}, + {LV_COLOR_MAKE(0x39, 0x49, 0xAB), LV_COLOR_MAKE(0x30, 0x3F, 0x9F), LV_COLOR_MAKE(0x28, 0x35, 0x93), LV_COLOR_MAKE(0x1A, 0x23, 0x7E)}, + {LV_COLOR_MAKE(0x1E, 0x88, 0xE5), LV_COLOR_MAKE(0x19, 0x76, 0xD2), LV_COLOR_MAKE(0x15, 0x65, 0xC0), LV_COLOR_MAKE(0x0D, 0x47, 0xA1)}, + {LV_COLOR_MAKE(0x03, 0x9B, 0xE5), LV_COLOR_MAKE(0x02, 0x88, 0xD1), LV_COLOR_MAKE(0x02, 0x77, 0xBD), LV_COLOR_MAKE(0x01, 0x57, 0x9B)}, + {LV_COLOR_MAKE(0x00, 0xAC, 0xC1), LV_COLOR_MAKE(0x00, 0x97, 0xA7), LV_COLOR_MAKE(0x00, 0x83, 0x8F), LV_COLOR_MAKE(0x00, 0x60, 0x64)}, + {LV_COLOR_MAKE(0x00, 0x89, 0x7B), LV_COLOR_MAKE(0x00, 0x79, 0x6B), LV_COLOR_MAKE(0x00, 0x69, 0x5C), LV_COLOR_MAKE(0x00, 0x4D, 0x40)}, + {LV_COLOR_MAKE(0x43, 0xA0, 0x47), LV_COLOR_MAKE(0x38, 0x8E, 0x3C), LV_COLOR_MAKE(0x2E, 0x7D, 0x32), LV_COLOR_MAKE(0x1B, 0x5E, 0x20)}, + {LV_COLOR_MAKE(0x7C, 0xB3, 0x42), LV_COLOR_MAKE(0x68, 0x9F, 0x38), LV_COLOR_MAKE(0x55, 0x8B, 0x2F), LV_COLOR_MAKE(0x33, 0x69, 0x1E)}, + {LV_COLOR_MAKE(0xC0, 0xCA, 0x33), LV_COLOR_MAKE(0xAF, 0xB4, 0x2B), LV_COLOR_MAKE(0x9E, 0x9D, 0x24), LV_COLOR_MAKE(0x82, 0x77, 0x17)}, + {LV_COLOR_MAKE(0xFD, 0xD8, 0x35), LV_COLOR_MAKE(0xFB, 0xC0, 0x2D), LV_COLOR_MAKE(0xF9, 0xA8, 0x25), LV_COLOR_MAKE(0xF5, 0x7F, 0x17)}, + {LV_COLOR_MAKE(0xFF, 0xB3, 0x00), LV_COLOR_MAKE(0xFF, 0xA0, 0x00), LV_COLOR_MAKE(0xFF, 0x8F, 0x00), LV_COLOR_MAKE(0xFF, 0x6F, 0x00)}, + {LV_COLOR_MAKE(0xFB, 0x8C, 0x00), LV_COLOR_MAKE(0xF5, 0x7C, 0x00), LV_COLOR_MAKE(0xEF, 0x6C, 0x00), LV_COLOR_MAKE(0xE6, 0x51, 0x00)}, + {LV_COLOR_MAKE(0xF4, 0x51, 0x1E), LV_COLOR_MAKE(0xE6, 0x4A, 0x19), LV_COLOR_MAKE(0xD8, 0x43, 0x15), LV_COLOR_MAKE(0xBF, 0x36, 0x0C)}, + {LV_COLOR_MAKE(0x6D, 0x4C, 0x41), LV_COLOR_MAKE(0x5D, 0x40, 0x37), LV_COLOR_MAKE(0x4E, 0x34, 0x2E), LV_COLOR_MAKE(0x3E, 0x27, 0x23)}, + {LV_COLOR_MAKE(0x54, 0x6E, 0x7A), LV_COLOR_MAKE(0x45, 0x5A, 0x64), LV_COLOR_MAKE(0x37, 0x47, 0x4F), LV_COLOR_MAKE(0x26, 0x32, 0x38)}, + {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)}, + }; + + if(p >= _LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 4) { + LV_LOG_WARN("Invalid level: %d. Must be 1..4", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} diff --git a/libraries/lvgl/src/misc/lv_palette.h b/libraries/lvgl/src/misc/lv_palette.h new file mode 100644 index 0000000..fedac9e --- /dev/null +++ b/libraries/lvgl/src/misc/lv_palette.h @@ -0,0 +1,69 @@ +/** + * @file lv_palette.h + * + */ + +#ifndef LV_PALETTE_H +#define LV_PALETTE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_PALETTE_RED, + LV_PALETTE_PINK, + LV_PALETTE_PURPLE, + LV_PALETTE_DEEP_PURPLE, + LV_PALETTE_INDIGO, + LV_PALETTE_BLUE, + LV_PALETTE_LIGHT_BLUE, + LV_PALETTE_CYAN, + LV_PALETTE_TEAL, + LV_PALETTE_GREEN, + LV_PALETTE_LIGHT_GREEN, + LV_PALETTE_LIME, + LV_PALETTE_YELLOW, + LV_PALETTE_AMBER, + LV_PALETTE_ORANGE, + LV_PALETTE_DEEP_ORANGE, + LV_PALETTE_BROWN, + LV_PALETTE_BLUE_GREY, + LV_PALETTE_GREY, + _LV_PALETTE_LAST, + LV_PALETTE_NONE = 0xff, +} lv_palette_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ + +lv_color_t lv_palette_main(lv_palette_t p); +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl); +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PALETTE_H*/ diff --git a/libraries/lvgl/src/misc/lv_profiler.h b/libraries/lvgl/src/misc/lv_profiler.h new file mode 100644 index 0000000..47d5bd2 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_profiler.h @@ -0,0 +1,52 @@ +/** + * @file lv_profiler.h + * + */ + +#ifndef LV_PROFILER_H +#define LV_PROFILER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_PROFILER + +#include LV_PROFILER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#else + +#define LV_PROFILER_BEGIN +#define LV_PROFILER_END +#define LV_PROFILER_BEGIN_TAG(tag) LV_UNUSED(tag) +#define LV_PROFILER_END_TAG(tag) LV_UNUSED(tag) + +#endif /*LV_USE_PROFILER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_H*/ diff --git a/libraries/lvgl/src/misc/lv_profiler_builtin.c b/libraries/lvgl/src/misc/lv_profiler_builtin.c new file mode 100644 index 0000000..ba278ae --- /dev/null +++ b/libraries/lvgl/src/misc/lv_profiler_builtin.c @@ -0,0 +1,262 @@ +/** + * @file lv_profiler_builtin.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin.h" +#include "../lvgl.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#define profiler_ctx LV_GLOBAL_DEFAULT()->profiler_context + +#define LV_PROFILER_STR_MAX_LEN 128 +#define LV_PROFILER_TICK_PER_SEC_MAX 1000000 + +#if LV_USE_OS + #define LV_PROFILER_MULTEX_INIT lv_mutex_init(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_DEINIT lv_mutex_delete(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_LOCK lv_mutex_lock(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_UNLOCK lv_mutex_unlock(&profiler_ctx->mutex) +#else + #define LV_PROFILER_MULTEX_INIT + #define LV_PROFILER_MULTEX_DEINIT + #define LV_PROFILER_MULTEX_LOCK + #define LV_PROFILER_MULTEX_UNLOCK +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief Structure representing a built-in profiler item in LVGL + */ +typedef struct { + char tag; /**< The tag of the profiler item */ + uint32_t tick; /**< The tick value of the profiler item */ + const char * func; /**< A pointer to the function associated with the profiler item */ +#if LV_USE_OS + int tid; /**< The thread ID of the profiler item */ + int cpu; /**< The CPU ID of the profiler item */ +#endif +} lv_profiler_builtin_item_t; + +/** + * @brief Structure representing a context for the LVGL built-in profiler + */ +typedef struct _lv_profiler_builtin_ctx_t { + lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */ + uint32_t item_num; /**< Number of profiler items in the array */ + uint32_t cur_index; /**< Index of the current profiler item */ + lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */ + bool enable; /**< Whether the built-in profiler is enabled */ +#if LV_USE_OS + lv_mutex_t mutex; /**< Mutex to protect the built-in profiler */ +#endif +} lv_profiler_builtin_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void default_flush_cb(const char * buf); +static int default_tid_get_cb(void); +static int default_cpu_get_cb(void); +static void flush_no_lock(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + lv_memzero(config, sizeof(lv_profiler_builtin_config_t)); + config->buf_size = LV_PROFILER_BUILTIN_BUF_SIZE; + config->tick_per_sec = 1000; + config->tick_get_cb = lv_tick_get; + config->flush_cb = default_flush_cb; + config->tid_get_cb = default_tid_get_cb; + config->cpu_get_cb = default_cpu_get_cb; +} + +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + LV_ASSERT_NULL(config->tick_get_cb); + + uint32_t num = config->buf_size / sizeof(lv_profiler_builtin_item_t); + if(num == 0) { + LV_LOG_WARN("buf_size must > %d", (int)sizeof(lv_profiler_builtin_item_t)); + return; + } + + if(config->tick_per_sec == 0 || config->tick_per_sec > LV_PROFILER_TICK_PER_SEC_MAX) { + LV_LOG_WARN("tick_per_sec range must be between 1~%d", LV_PROFILER_TICK_PER_SEC_MAX); + return; + } + + /*Free the old item_arr memory*/ + if(profiler_ctx) { + lv_profiler_builtin_uninit(); + } + + profiler_ctx = lv_malloc_zeroed(sizeof(lv_profiler_builtin_ctx_t)); + LV_ASSERT_MALLOC(profiler_ctx); + + profiler_ctx->item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t)); + LV_ASSERT_MALLOC(profiler_ctx->item_arr); + if(profiler_ctx->item_arr == NULL) { + lv_free(profiler_ctx); + profiler_ctx = NULL; + LV_LOG_ERROR("malloc failed for item_arr"); + return; + } + + LV_PROFILER_MULTEX_INIT; + profiler_ctx->item_num = num; + profiler_ctx->config = *config; + + if(profiler_ctx->config.flush_cb) { + /* add profiler header for perfetto */ + profiler_ctx->config.flush_cb("# tracer: nop\n"); + profiler_ctx->config.flush_cb("#\n"); + } + + lv_profiler_builtin_set_enable(true); + + LV_LOG_INFO("init OK, item_num = %d", (int)num); +} + +void lv_profiler_builtin_uninit(void) +{ + LV_ASSERT_NULL(profiler_ctx); + LV_PROFILER_MULTEX_DEINIT; + lv_free(profiler_ctx->item_arr); + lv_free(profiler_ctx); + profiler_ctx = NULL; +} + +void lv_profiler_builtin_set_enable(bool enable) +{ + if(!profiler_ctx) { + return; + } + + profiler_ctx->enable = enable; +} + +void lv_profiler_builtin_flush(void) +{ + LV_ASSERT_NULL(profiler_ctx); + + LV_PROFILER_MULTEX_LOCK; + flush_no_lock(); + LV_PROFILER_MULTEX_UNLOCK; +} + +void lv_profiler_builtin_write(const char * func, char tag) +{ + LV_ASSERT_NULL(profiler_ctx); + LV_ASSERT_NULL(func); + + if(!profiler_ctx->enable) { + return; + } + + LV_PROFILER_MULTEX_LOCK; + + if(profiler_ctx->cur_index >= profiler_ctx->item_num) { + flush_no_lock(); + profiler_ctx->cur_index = 0; + } + + lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[profiler_ctx->cur_index]; + item->func = func; + item->tag = tag; + item->tick = profiler_ctx->config.tick_get_cb(); + +#if LV_USE_OS + item->tid = profiler_ctx->config.tid_get_cb(); + item->cpu = profiler_ctx->config.cpu_get_cb(); +#endif + + profiler_ctx->cur_index++; + + LV_PROFILER_MULTEX_UNLOCK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void default_flush_cb(const char * buf) +{ + LV_LOG("%s", buf); +} + +static int default_tid_get_cb(void) +{ + return 1; +} + +static int default_cpu_get_cb(void) +{ + return 0; +} + +static void flush_no_lock(void) +{ + if(!profiler_ctx->config.flush_cb) { + LV_LOG_WARN("flush_cb is not registered"); + return; + } + + uint32_t cur = 0; + char buf[LV_PROFILER_STR_MAX_LEN]; + uint32_t tick_per_sec = profiler_ctx->config.tick_per_sec; + while(cur < profiler_ctx->cur_index) { + lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[cur++]; + uint32_t sec = item->tick / tick_per_sec; + uint32_t usec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec); + +#if LV_USE_OS + lv_snprintf(buf, sizeof(buf), + " LVGL-%d [%d] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n", + item->tid, + item->cpu, + sec, + usec, + item->tag, + item->func); +#else + lv_snprintf(buf, sizeof(buf), + " LVGL-1 [0] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n", + sec, + usec, + item->tag, + item->func); +#endif + profiler_ctx->config.flush_cb(buf); + } +} + +#endif /*LV_USE_PROFILER_BUILTIN*/ diff --git a/libraries/lvgl/src/misc/lv_profiler_builtin.h b/libraries/lvgl/src/misc/lv_profiler_builtin.h new file mode 100644 index 0000000..ac79f8e --- /dev/null +++ b/libraries/lvgl/src/misc/lv_profiler_builtin.h @@ -0,0 +1,99 @@ +/** + * @file lv_profiler_builtin.h + * + */ + +#ifndef LV_PROFILER_BUILTIN_H +#define LV_PROFILER_BUILTIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_PROFILER_BUILTIN_BEGIN_TAG(tag) lv_profiler_builtin_write((tag), 'B') +#define LV_PROFILER_BUILTIN_END_TAG(tag) lv_profiler_builtin_write((tag), 'E') +#define LV_PROFILER_BUILTIN_BEGIN LV_PROFILER_BUILTIN_BEGIN_TAG(__func__) +#define LV_PROFILER_BUILTIN_END LV_PROFILER_BUILTIN_END_TAG(__func__) + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief LVGL profiler built-in configuration structure + */ +typedef struct { + size_t buf_size; /**< The size of the buffer used for profiling data */ + uint32_t tick_per_sec; /**< The number of ticks per second */ + uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ + void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ + int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */ + int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */ +} lv_profiler_builtin_config_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the configuration of the built-in profiler + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config); + +/** + * @brief Initialize the built-in profiler with the given configuration + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config); + +/** + * @brief Uninitialize the built-in profiler + */ +void lv_profiler_builtin_uninit(void); + +/** + * @brief Enable or disable the built-in profiler + * @param enable true to enable the built-in profiler, false to disable + */ +void lv_profiler_builtin_set_enable(bool enable); + +/** + * @brief Flush the profiling data to the console + */ +void lv_profiler_builtin_flush(void); + +/** + * @brief Write the profiling data for a function with the given tag + * @param func Name of the function being profiled + * @param tag Tag to associate with the profiling data for the function + */ +void lv_profiler_builtin_write(const char * func, char tag); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_PROFILER_BUILTIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_BUILTIN_H*/ diff --git a/libraries/lvgl/src/misc/lv_rb.c b/libraries/lvgl/src/misc/lv_rb.c new file mode 100644 index 0000000..8a56459 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_rb.c @@ -0,0 +1,556 @@ +/** + * @file lv_rb.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_rb.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_rb_node_t * rb_create_node(lv_rb_t * tree); +static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size) +{ + LV_ASSERT_NULL(tree); + LV_ASSERT_NULL(compare); + LV_ASSERT(node_size > 0); + + if(tree == NULL || compare == NULL || node_size == 0) { + return false; + } + + lv_memzero(tree, sizeof(lv_rb_t)); + + tree->root = NULL; + tree->compare = compare; + tree->size = node_size; + + return true; +} + +lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_find(tree, key); + if(node) return node; + else { + node = rb_create_node(tree); + if(node == NULL) return NULL; + + if(tree->root == NULL) { + tree->root = node; + node->parent = NULL; + node->color = LV_RB_COLOR_BLACK; + return node; + } + } + + void * new_data = node->data; + node->data = key; + lv_rb_node_t * parent = rb_find_leaf_parent(tree, node); + + node->parent = parent; + node->color = LV_RB_COLOR_RED; + + if(tree->compare(key, parent->data) < 0) parent->left = node; + else parent->right = node; + + rb_insert_color(tree, node); + + node->data = new_data; + return node; +} + +lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * current = tree->root; + + while(current != NULL) { + lv_rb_compare_res_t cmp = tree->compare(key, current->data); + + if(cmp == 0) { + return current; + } + else if(cmp < 0) { + current = current->left; + } + else { + current = current->right; + } + } + + return NULL; +} + +void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * child = NULL; + lv_rb_node_t * parent = NULL; + lv_rb_color_t color = LV_RB_COLOR_BLACK; + + if(node->left != NULL && node->right != NULL) { + lv_rb_node_t * replace = node; + replace = lv_rb_minimum_from(replace->right); + + if(node->parent != NULL) { + if(node->parent->left == node) { + node->parent->left = replace; + } + else { + node->parent->right = replace; + } + } + else { + tree->root = replace; + } + + child = replace->right; + parent = replace->parent; + color = replace->color; + + if(parent == node) { + parent = replace; + } + else { + if(child != NULL) { + child->parent = parent; + } + parent->left = child; + replace->right = node->right; + node->right->parent = replace; + } + + replace->parent = node->parent; + replace->color = node->color; + replace->left = node->left; + node->left->parent = replace; + + if(color == LV_RB_COLOR_BLACK) { + rb_delete_color(tree, child, parent); + } + + void * data = node->data; + lv_free(node); + return data; + } + + child = node->right != NULL ? node->right : node->left; + parent = node->parent; + color = node->color; + + if(child != NULL) { + child->parent = parent; + } + + if(parent != NULL) { + if(parent->left == node) { + parent->left = child; + } + else { + parent->right = child; + } + } + else { + tree->root = child; + } + + if(color == LV_RB_COLOR_BLACK) { + rb_delete_color(tree, child, parent); + } + + void * data = node->data; + lv_free(node); + return data; +} + +void * lv_rb_remove(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_find(tree, key); + LV_ASSERT_NULL(node); + if(node == NULL) { + LV_LOG_WARN("rb delete %d not found", (int)(uintptr_t)key); + return NULL; + } + + return lv_rb_remove_node(tree, node); +} + +bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return false; + } + + void * data = lv_rb_remove_node(tree, node); + if(data) { + lv_free(data); + return true; + } + return false; +} + +bool lv_rb_drop(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return false; + } + + void * data = lv_rb_remove(tree, key); + if(data) { + lv_free(data); + return true; + } + return false; +} + +void lv_rb_destroy(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + + if(tree == NULL) { + return; + } + + lv_rb_node_t * node = tree->root; + lv_rb_node_t * parent = NULL; + + while(node != NULL) { + if(node->left != NULL) { + node = node->left; + } + else if(node->right != NULL) { + node = node->right; + } + else { + parent = node->parent; + if(parent != NULL) { + if(parent->left == node) { + parent->left = NULL; + } + else { + parent->right = NULL; + } + } + lv_free(node->data); + lv_free(node); + node = parent; + } + } + tree->root = NULL; +} + +lv_rb_node_t * lv_rb_minimum(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + return lv_rb_minimum_from(tree->root); +} + +lv_rb_node_t * lv_rb_maximum(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + return lv_rb_maximum_from(tree->root); +} + +lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node) +{ + while(node->left != NULL) { + node = node->left; + } + + return node; +} + +lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node) +{ + while(node->right != NULL) { + node = node->right; + } + + return node; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_rb_node_t * rb_create_node(lv_rb_t * tree) +{ + lv_rb_node_t * node = lv_malloc_zeroed(sizeof(lv_rb_node_t)); + LV_ASSERT_MALLOC(node); + if(node == NULL) { + return NULL; + } + + node->data = lv_malloc_zeroed(tree->size); + LV_ASSERT_MALLOC(node->data); + if(node->data == NULL) { + lv_free(node); + return NULL; + } + + node->color = LV_RB_COLOR_RED; + node->left = NULL; + node->right = NULL; + + return node; +} + +static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * current = tree->root; + lv_rb_node_t * parent = current; + + while(current != NULL) { + parent = current; + + if(tree->compare(node->data, current->data) < 0) { + current = current->left; + } + else { + current = current->right; + } + } + + return parent; +} + +static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * left = node->left; + node->left = left->right; + + if(left->right != NULL) { + left->right->parent = node; + } + + left->parent = node->parent; + + if(node->parent == NULL) { + tree->root = left; + } + else if(node == node->parent->right) { + node->parent->right = left; + } + else { + node->parent->left = left; + } + + left->right = node; + node->parent = left; +} + +static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * right = node->right; + node->right = right->left; + + if(right->left != NULL) { + right->left->parent = node; + } + + right->parent = node->parent; + + if(node->parent == NULL) { + tree->root = right; + } + else if(node == node->parent->left) { + node->parent->left = right; + } + else { + node->parent->right = right; + } + + right->left = node; + node->parent = right; +} + +static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * parent = NULL; + lv_rb_node_t * gparent = NULL; + + while((parent = node->parent) && parent->color == LV_RB_COLOR_RED) { + gparent = parent->parent; + + if(parent == gparent->left) { + { + lv_rb_node_t * uncle = gparent->right; + if(uncle && uncle->color == LV_RB_COLOR_RED) { + uncle->color = LV_RB_COLOR_BLACK; + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + node = gparent; + continue; + } + } + + if(parent->right == node) { + lv_rb_node_t * tmp; + rb_left_rotate(tree, parent); + tmp = parent; + parent = node; + node = tmp; + } + + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, gparent); + } + else { + { + lv_rb_node_t * uncle = gparent->left; + if(uncle && uncle->color == LV_RB_COLOR_RED) { + uncle->color = LV_RB_COLOR_BLACK; + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + node = gparent; + continue; + } + } + + if(parent->left == node) { + lv_rb_node_t * tmp; + rb_right_rotate(tree, parent); + tmp = parent; + parent = node; + node = tmp; + } + + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, gparent); + } + } + + tree->root->color = LV_RB_COLOR_BLACK; +} + +static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return; + } + + while((node1 == NULL || node1->color == LV_RB_COLOR_BLACK) && node1 != tree->root) { + if(node2->left == node1) { + lv_rb_node_t * pNode2 = node2->right; + if(pNode2->color == LV_RB_COLOR_RED) { + pNode2->color = LV_RB_COLOR_BLACK; + node2->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, node2); + pNode2 = node2->right; + } + + if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) + && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { + pNode2->color = LV_RB_COLOR_RED; + node1 = node2; + node2 = node2->parent; + } + else { + if(pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK) { + pNode2->left->color = LV_RB_COLOR_BLACK; + pNode2->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, pNode2); + pNode2 = node2->right; + } + pNode2->color = node2->color; + node2->color = LV_RB_COLOR_BLACK; + pNode2->right->color = LV_RB_COLOR_BLACK; + rb_left_rotate(tree, node2); + node1 = tree->root; + break; + } + } + else { + lv_rb_node_t * pNode2 = node2->left; + if(pNode2->color == LV_RB_COLOR_RED) { + pNode2->color = LV_RB_COLOR_BLACK; + node2->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, node2); + pNode2 = node2->left; + } + + if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) + && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { + pNode2->color = LV_RB_COLOR_RED; + node1 = node2; + node2 = node2->parent; + } + else { + if(pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) { + pNode2->right->color = LV_RB_COLOR_BLACK; + pNode2->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, pNode2); + pNode2 = node2->left; + } + pNode2->color = node2->color; + node2->color = LV_RB_COLOR_BLACK; + pNode2->left->color = LV_RB_COLOR_BLACK; + rb_right_rotate(tree, node2); + node1 = tree->root; + break; + } + } + } + if(node1 != NULL) + node1->color = LV_RB_COLOR_BLACK; +} diff --git a/libraries/lvgl/src/misc/lv_rb.h b/libraries/lvgl/src/misc/lv_rb.h new file mode 100644 index 0000000..1533cea --- /dev/null +++ b/libraries/lvgl/src/misc/lv_rb.h @@ -0,0 +1,80 @@ +/** + * @file lv_rb.h + * + */ + +#ifndef LV_RB_H +#define LV_RB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_types.h" +#include "stdbool.h" +#include "lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_RB_COLOR_RED, + LV_RB_COLOR_BLACK +} lv_rb_color_t; + +typedef struct lv_rb_node_t { + struct lv_rb_node_t * parent; + struct lv_rb_node_t * left; + struct lv_rb_node_t * right; + lv_rb_color_t color; + void * data; +} lv_rb_node_t; + +typedef int8_t lv_rb_compare_res_t; + +typedef lv_rb_compare_res_t (*lv_rb_compare_t)(const void * a, const void * b); + +typedef struct { + lv_rb_node_t * root; + lv_rb_compare_t compare; + size_t size; +} lv_rb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size); +lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key); +lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key); +void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node); +void * lv_rb_remove(lv_rb_t * tree, const void * key); +bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node); +bool lv_rb_drop(lv_rb_t * tree, const void * key); +lv_rb_node_t * lv_rb_minimum(lv_rb_t * node); +lv_rb_node_t * lv_rb_maximum(lv_rb_t * node); +lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node); +lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node); +void lv_rb_destroy(lv_rb_t * tree); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RB_H*/ diff --git a/libraries/lvgl/src/misc/lv_style.c b/libraries/lvgl/src/misc/lv_style.c new file mode 100644 index 0000000..e727843 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_style.c @@ -0,0 +1,442 @@ +/** + * @file lv_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_style.h" +#include "../core/lv_global.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "lv_assert.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define _lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size +#define _lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table +#define last_custom_prop_id LV_GLOBAL_DEFAULT()->style_last_custom_prop_id + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_style_prop_t lv_style_const_prop_id_inv = LV_STYLE_PROP_INV; + +const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PROPS] = { + [LV_STYLE_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MIN_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MAX_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_LENGTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TRANSFORM_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, + [LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, + [LV_STYLE_TRANSFORM_SCALE_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SCALE_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SKEW_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SKEW_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_ROTATION] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + + [LV_STYLE_PAD_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_ROW] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_COLUMN] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + + [LV_STYLE_BG_COLOR] = 0, + [LV_STYLE_BG_OPA] = 0, + [LV_STYLE_BG_GRAD_COLOR] = 0, + [LV_STYLE_BG_GRAD_DIR] = 0, + [LV_STYLE_BG_MAIN_STOP] = 0, + [LV_STYLE_BG_GRAD_STOP] = 0, + [LV_STYLE_BG_MAIN_OPA] = 0, + [LV_STYLE_BG_GRAD_OPA] = 0, + [LV_STYLE_BG_GRAD] = 0, + + [LV_STYLE_BG_IMAGE_SRC] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_BG_IMAGE_OPA] = 0, + [LV_STYLE_BG_IMAGE_RECOLOR] = 0, + [LV_STYLE_BG_IMAGE_RECOLOR_OPA] = 0, + [LV_STYLE_BG_IMAGE_TILED] = 0, + + [LV_STYLE_BORDER_COLOR] = 0, + [LV_STYLE_BORDER_OPA] = 0, + [LV_STYLE_BORDER_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BORDER_SIDE] = 0, + [LV_STYLE_BORDER_POST] = 0, + + [LV_STYLE_OUTLINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_OUTLINE_COLOR] = 0, + [LV_STYLE_OUTLINE_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_OUTLINE_PAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + + [LV_STYLE_SHADOW_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_OFFSET_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_OFFSET_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_SPREAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_COLOR] = 0, + [LV_STYLE_SHADOW_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + + [LV_STYLE_IMAGE_OPA] = 0, + [LV_STYLE_IMAGE_RECOLOR] = 0, + [LV_STYLE_IMAGE_RECOLOR_OPA] = 0, + + [LV_STYLE_LINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_LINE_DASH_WIDTH] = 0, + [LV_STYLE_LINE_DASH_GAP] = 0, + [LV_STYLE_LINE_ROUNDED] = 0, + [LV_STYLE_LINE_COLOR] = 0, + [LV_STYLE_LINE_OPA] = 0, + + [LV_STYLE_ARC_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_ARC_ROUNDED] = 0, + [LV_STYLE_ARC_COLOR] = 0, + [LV_STYLE_ARC_OPA] = 0, + [LV_STYLE_ARC_IMAGE_SRC] = 0, + + [LV_STYLE_TEXT_COLOR] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_FONT] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_LETTER_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_LINE_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_DECOR] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_ALIGN] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + + [LV_STYLE_RADIUS] = 0, + [LV_STYLE_CLIP_CORNER] = 0, + [LV_STYLE_OPA] = 0, + [LV_STYLE_OPA_LAYERED] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_ANIM_DURATION] = 0, + [LV_STYLE_TRANSITION] = 0, + [LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + [LV_STYLE_LAYOUT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BASE_DIR] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BITMAP_MASK_SRC] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + +#if LV_USE_FLEX + [LV_STYLE_FLEX_FLOW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_MAIN_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_CROSS_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_TRACK_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_GROW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, +#endif + +#if LV_USE_GRID + [LV_STYLE_GRID_COLUMN_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_ROW_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_COLUMN_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_ROW_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_ROW_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_ROW_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_COLUMN_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_COLUMN_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_X_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_Y_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, +#endif + +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_style_init(lv_style_t * style) +{ +#if LV_USE_ASSERT_STYLE + if(style->sentinel == LV_STYLE_SENTINEL_VALUE && style->prop_cnt > 1) { + LV_LOG_WARN("Style might be already inited. (Potential memory leak)"); + } +#endif + + lv_memzero(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + +void lv_style_reset(lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + if(style->prop_cnt != 255) lv_free(style->values_and_props); + lv_memzero(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + +lv_style_prop_t lv_style_register_prop(uint8_t flag) +{ + if(_lv_style_custom_prop_flag_lookup_table == NULL) { + _lv_style_custom_prop_flag_lookup_table_size = 0; + last_custom_prop_id = (uint16_t)_LV_STYLE_LAST_BUILT_IN_PROP; + } + + // if((last_custom_prop_id + 1) != 0) { + // LV_LOG_ERROR("No more custom property IDs available"); + // return LV_STYLE_PROP_INV; + // } + + /* + * Allocate the lookup table if it's not yet available. + */ + size_t required_size = (last_custom_prop_id + 1 - _LV_STYLE_LAST_BUILT_IN_PROP); + if(_lv_style_custom_prop_flag_lookup_table_size < required_size) { + /* Round required_size up to the nearest 32-byte value */ + required_size = (required_size + 31) & ~31; + LV_ASSERT_MSG(required_size > 0, "required size has become 0?"); + uint8_t * old_p = _lv_style_custom_prop_flag_lookup_table; + uint8_t * new_p = lv_realloc(old_p, required_size * sizeof(uint8_t)); + if(new_p == NULL) { + LV_LOG_ERROR("Unable to allocate space for custom property lookup table"); + return LV_STYLE_PROP_INV; + } + _lv_style_custom_prop_flag_lookup_table = new_p; + _lv_style_custom_prop_flag_lookup_table_size = required_size; + } + last_custom_prop_id++; + /* This should never happen - we should bail out above */ + LV_ASSERT_NULL(_lv_style_custom_prop_flag_lookup_table); + _lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - _LV_STYLE_NUM_BUILT_IN_PROPS] = flag; + return last_custom_prop_id; +} + +lv_style_prop_t lv_style_get_num_custom_props(void) +{ + return last_custom_prop_id - _LV_STYLE_LAST_BUILT_IN_PROP; +} + +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop) +{ + LV_ASSERT_STYLE(style); + + if(lv_style_is_const(style)) { + LV_LOG_ERROR("Cannot remove prop from const style"); + return false; + } + + if(style->prop_cnt == 0) return false; + + uint8_t * tmp = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint8_t * old_props = (uint8_t *)tmp; + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(old_props[i] == prop) { + lv_style_value_t * old_values = (lv_style_value_t *)style->values_and_props; + + size_t size = (style->prop_cnt - 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); + uint8_t * new_values_and_props = lv_malloc(size); + if(new_values_and_props == NULL) return false; + style->values_and_props = new_values_and_props; + style->prop_cnt--; + + tmp = new_values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint8_t * new_props = (uint8_t *)tmp; + lv_style_value_t * new_values = (lv_style_value_t *)new_values_and_props; + + uint32_t j; + for(i = j = 0; j <= style->prop_cnt; + j++) { /*<=: because prop_cnt already reduced but all the old props. needs to be checked.*/ + if(old_props[j] != prop) { + new_values[i] = old_values[j]; + new_props[i++] = old_props[j]; + } + } + + lv_free(old_values); + return true; + } + } + + return false; +} + +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value) +{ + LV_ASSERT_STYLE(style); + + if(lv_style_is_const(style)) { + LV_LOG_ERROR("Cannot set property of constant style"); + return; + } + + LV_ASSERT(prop != LV_STYLE_PROP_INV); + + lv_style_prop_t * props; + int32_t i; + + if(style->values_and_props) { + props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(i = style->prop_cnt - 1; i >= 0; i--) { + if(props[i] == prop) { + lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; + values[i] = value; + return; + } + } + } + + size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); + uint8_t * values_and_props = lv_realloc(style->values_and_props, size); + if(values_and_props == NULL) return; + style->values_and_props = values_and_props; + + props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + /*Shift all props to make place for the value before them*/ + for(i = style->prop_cnt - 1; i >= 0; i--) { + props[i + sizeof(lv_style_value_t) / sizeof(lv_style_prop_t)] = props[i]; + } + style->prop_cnt++; + + /*Go to the new position with the props*/ + props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + lv_style_value_t * values = (lv_style_value_t *)values_and_props; + + /*Set the new property and value*/ + props[style->prop_cnt - 1] = prop; + values[style->prop_cnt - 1] = value; + + uint32_t group = _lv_style_get_prop_group(prop); + style->has_group |= (uint32_t)1 << group; +} + +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value) +{ + return lv_style_get_prop_inlined(style, prop, value); +} + +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data) +{ + lv_memzero(tr, sizeof(lv_style_transition_dsc_t)); + tr->props = props; + tr->path_xcb = path_cb == NULL ? lv_anim_path_linear : path_cb; + tr->time = time; + tr->delay = delay; + tr->user_data = user_data; +} + +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) +{ + const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00); + const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff); + switch(prop) { + case LV_STYLE_TRANSFORM_SCALE_X: + case LV_STYLE_TRANSFORM_SCALE_Y: + return (lv_style_value_t) { + .num = LV_SCALE_NONE + }; + case LV_STYLE_BG_COLOR: + return (lv_style_value_t) { + .color = white + }; + case LV_STYLE_BG_GRAD_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_ARC_COLOR: + case LV_STYLE_LINE_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_IMAGE_RECOLOR: + return (lv_style_value_t) { + .color = black + }; + case LV_STYLE_OPA: + case LV_STYLE_OPA_LAYERED: + case LV_STYLE_BORDER_OPA: + case LV_STYLE_TEXT_OPA: + case LV_STYLE_IMAGE_OPA: + case LV_STYLE_BG_GRAD_OPA: + case LV_STYLE_BG_MAIN_OPA: + case LV_STYLE_BG_IMAGE_OPA: + case LV_STYLE_OUTLINE_OPA: + case LV_STYLE_SHADOW_OPA: + case LV_STYLE_LINE_OPA: + case LV_STYLE_ARC_OPA: + return (lv_style_value_t) { + .num = LV_OPA_COVER + }; + case LV_STYLE_BG_GRAD_STOP: + return (lv_style_value_t) { + .num = 255 + }; + case LV_STYLE_BORDER_SIDE: + return (lv_style_value_t) { + .num = LV_BORDER_SIDE_FULL + }; + case LV_STYLE_TEXT_FONT: + return (lv_style_value_t) { + .ptr = LV_FONT_DEFAULT + }; + case LV_STYLE_MAX_WIDTH: + case LV_STYLE_MAX_HEIGHT: + return (lv_style_value_t) { + .num = LV_COORD_MAX + }; + case LV_STYLE_ROTARY_SENSITIVITY: + return (lv_style_value_t) { + .num = 256 + }; + default: + return (lv_style_value_t) { + .ptr = NULL + }; + } +} + +bool lv_style_is_empty(const lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + return style->prop_cnt == 0; +} + +uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop) +{ + if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_FLAG_ALL; /*Any prop can have any flags*/ + if(prop == LV_STYLE_PROP_INV) return 0; + + if(prop < _LV_STYLE_NUM_BUILT_IN_PROPS) + return _lv_style_builtin_prop_flag_lookup_table[prop]; + prop -= _LV_STYLE_NUM_BUILT_IN_PROPS; + if(_lv_style_custom_prop_flag_lookup_table != NULL && prop < _lv_style_custom_prop_flag_lookup_table_size) + return _lv_style_custom_prop_flag_lookup_table[prop]; + return 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_style.h b/libraries/lvgl/src/misc/lv_style.h new file mode 100644 index 0000000..5c69e59 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_style.h @@ -0,0 +1,631 @@ +/** + * @file lv_style.h + * + */ + +#ifndef LV_STYLE_H +#define LV_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "../font/lv_font.h" +#include "lv_color.h" +#include "lv_area.h" +#include "lv_anim.h" +#include "lv_text.h" +#include "lv_types.h" +#include "lv_assert.h" +#include "lv_bidi.h" +#include "../layouts/lv_layout.h" + +/********************* + * DEFINES + *********************/ + +#define LV_STYLE_SENTINEL_VALUE 0xAABBCCDD + +/** + * Flags for style behavior + * + * The rest of the flags will have _FLAG added to their name in v9. + */ +#define LV_STYLE_PROP_FLAG_NONE (0) +#define LV_STYLE_PROP_FLAG_INHERITABLE (1 << 0) /*Inherited*/ +#define LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE (1 << 1) /*Requires ext. draw size update when changed*/ +#define LV_STYLE_PROP_FLAG_LAYOUT_UPDATE (1 << 2) /*Requires layout update when changed*/ +#define LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE (1 << 3) /*Requires layout update on parent when changed*/ +#define LV_STYLE_PROP_FLAG_LAYER_UPDATE (1 << 4) /*Affects layer handling*/ +#define LV_STYLE_PROP_FLAG_TRANSFORM (1 << 5) /*Affects the object's transformation*/ +#define LV_STYLE_PROP_FLAG_ALL (0x3F) /*Indicating all flags*/ + +/** + * Other constants + */ +#define LV_SCALE_NONE 256 /*Value for not zooming the image*/ +LV_EXPORT_CONST_INT(LV_SCALE_NONE); + +// *INDENT-OFF* +#if LV_USE_ASSERT_STYLE +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .sentinel = LV_STYLE_SENTINEL_VALUE, \ + .values_and_props = (void*)prop_array, \ + .has_group = 0xFFFFFFFF, \ + .prop_cnt = 255 \ + } +#else +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .values_and_props = prop_array, \ + .has_group = 0xFFFFFFFF, \ + .prop_cnt = 255, \ + } +#endif +// *INDENT-ON* + +#define LV_STYLE_CONST_PROPS_END { .prop_ptr = NULL, .value = { .num = 0 } } + +/********************** + * TYPEDEFS + **********************/ + +/** + * Possible options how to blend opaque drawings + */ +enum _lv_blend_mode_t { + LV_BLEND_MODE_NORMAL, /**< Simply mix according to the opacity value*/ + LV_BLEND_MODE_ADDITIVE, /**< Add the respective color channels*/ + LV_BLEND_MODE_SUBTRACTIVE,/**< Subtract the foreground from the background*/ + LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ +}; + +#ifdef DOXYGEN +typedef _lv_blend_mode_t lv_blend_mode_t; +#else +typedef uint8_t lv_blend_mode_t; +#endif /*DOXYGEN*/ + +/** + * Some options to apply decorations on texts. + * 'OR'ed values can be used. + */ +enum _lv_text_decor_t { + LV_TEXT_DECOR_NONE = 0x00, + LV_TEXT_DECOR_UNDERLINE = 0x01, + LV_TEXT_DECOR_STRIKETHROUGH = 0x02, +}; + +#ifdef DOXYGEN +typedef _lv_text_decor_t lv_text_decor_t; +#else +typedef uint8_t lv_text_decor_t; +#endif /*DOXYGEN*/ + +/** + * Selects on which sides border should be drawn + * 'OR'ed values can be used. + */ +enum _lv_border_side_t { + LV_BORDER_SIDE_NONE = 0x00, + LV_BORDER_SIDE_BOTTOM = 0x01, + LV_BORDER_SIDE_TOP = 0x02, + LV_BORDER_SIDE_LEFT = 0x04, + LV_BORDER_SIDE_RIGHT = 0x08, + LV_BORDER_SIDE_FULL = 0x0F, + LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ +}; + +#ifdef DOXYGEN +typedef _lv_border_side_t lv_border_side_t; +#else +typedef uint8_t lv_border_side_t; +#endif /*DOXYGEN*/ + +/** + * The direction of the gradient. + */ +enum _lv_grad_dir_t { + LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/ + LV_GRAD_DIR_VER, /**< Vertical (top to bottom) gradient*/ + LV_GRAD_DIR_HOR, /**< Horizontal (left to right) gradient*/ +}; + +#ifdef DOXYGEN +typedef _lv_grad_dir_t lv_grad_dir_t; +#else +typedef uint8_t lv_grad_dir_t; +#endif /*DOXYGEN*/ + +/** A gradient stop definition. + * This matches a color and a position in a virtual 0-255 scale. + */ +typedef struct { + lv_color_t color; /**< The stop color */ + lv_opa_t opa; /**< The opacity of the color*/ + uint8_t frac; /**< The stop position in 1/255 unit */ +} lv_gradient_stop_t; + +/** A descriptor of a gradient. */ +typedef struct { + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ + uint8_t stops_count; /**< The number of used stops in the array */ + lv_grad_dir_t dir : 3; /**< The gradient direction. + * Any of LV_GRAD_DIR_HOR, LV_GRAD_DIR_VER, LV_GRAD_DIR_NONE */ +} lv_grad_dsc_t; + +/** + * A common type to handle all the property types in the same way. + */ +typedef union { + int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ + const void * ptr; /**< Constant pointers (font, cone text, etc)*/ + lv_color_t color; /**< Colors*/ +} lv_style_value_t; + +/** + * Enumeration of all built in style properties + * + * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one. + */ +enum _lv_style_prop_t { + LV_STYLE_PROP_INV = 0, + + /*Group 0*/ + LV_STYLE_WIDTH = 1, + LV_STYLE_HEIGHT = 2, + LV_STYLE_LENGTH = 3, + + LV_STYLE_MIN_WIDTH = 4, + LV_STYLE_MAX_WIDTH = 5, + LV_STYLE_MIN_HEIGHT = 6, + LV_STYLE_MAX_HEIGHT = 7, + + LV_STYLE_X = 8, + LV_STYLE_Y = 9, + LV_STYLE_ALIGN = 10, + + LV_STYLE_RADIUS = 12, + + /*Group 1*/ + LV_STYLE_PAD_TOP = 16, + LV_STYLE_PAD_BOTTOM = 17, + LV_STYLE_PAD_LEFT = 18, + LV_STYLE_PAD_RIGHT = 19, + + LV_STYLE_PAD_ROW = 20, + LV_STYLE_PAD_COLUMN = 21, + LV_STYLE_LAYOUT = 22, + + LV_STYLE_MARGIN_TOP = 24, + LV_STYLE_MARGIN_BOTTOM = 25, + LV_STYLE_MARGIN_LEFT = 26, + LV_STYLE_MARGIN_RIGHT = 27, + + /*Group 2*/ + LV_STYLE_BG_COLOR = 28, + LV_STYLE_BG_OPA = 29, + + LV_STYLE_BG_GRAD_DIR = 32, + LV_STYLE_BG_MAIN_STOP = 33, + LV_STYLE_BG_GRAD_STOP = 34, + LV_STYLE_BG_GRAD_COLOR = 35, + + LV_STYLE_BG_MAIN_OPA = 36, + LV_STYLE_BG_GRAD_OPA = 37, + LV_STYLE_BG_GRAD = 38, + LV_STYLE_BASE_DIR = 39, + + LV_STYLE_BG_IMAGE_SRC = 40, + LV_STYLE_BG_IMAGE_OPA = 41, + LV_STYLE_BG_IMAGE_RECOLOR = 42, + LV_STYLE_BG_IMAGE_RECOLOR_OPA = 43, + + LV_STYLE_BG_IMAGE_TILED = 44, + LV_STYLE_CLIP_CORNER = 45, + + /*Group 3*/ + LV_STYLE_BORDER_WIDTH = 48, + LV_STYLE_BORDER_COLOR = 49, + LV_STYLE_BORDER_OPA = 50, + + LV_STYLE_BORDER_SIDE = 52, + LV_STYLE_BORDER_POST = 53, + + LV_STYLE_OUTLINE_WIDTH = 56, + LV_STYLE_OUTLINE_COLOR = 57, + LV_STYLE_OUTLINE_OPA = 58, + LV_STYLE_OUTLINE_PAD = 59, + + /*Group 4*/ + LV_STYLE_SHADOW_WIDTH = 60, + LV_STYLE_SHADOW_COLOR = 61, + LV_STYLE_SHADOW_OPA = 62, + + LV_STYLE_SHADOW_OFFSET_X = 64, + LV_STYLE_SHADOW_OFFSET_Y = 65, + LV_STYLE_SHADOW_SPREAD = 66, + + LV_STYLE_IMAGE_OPA = 68, + LV_STYLE_IMAGE_RECOLOR = 69, + LV_STYLE_IMAGE_RECOLOR_OPA = 70, + + LV_STYLE_LINE_WIDTH = 72, + LV_STYLE_LINE_DASH_WIDTH = 73, + LV_STYLE_LINE_DASH_GAP = 74, + LV_STYLE_LINE_ROUNDED = 75, + LV_STYLE_LINE_COLOR = 76, + LV_STYLE_LINE_OPA = 77, + + /*Group 5*/ + LV_STYLE_ARC_WIDTH = 80, + LV_STYLE_ARC_ROUNDED = 81, + LV_STYLE_ARC_COLOR = 82, + LV_STYLE_ARC_OPA = 83, + LV_STYLE_ARC_IMAGE_SRC = 84, + + LV_STYLE_TEXT_COLOR = 88, + LV_STYLE_TEXT_OPA = 89, + LV_STYLE_TEXT_FONT = 90, + + LV_STYLE_TEXT_LETTER_SPACE = 91, + LV_STYLE_TEXT_LINE_SPACE = 92, + LV_STYLE_TEXT_DECOR = 93, + LV_STYLE_TEXT_ALIGN = 94, + + LV_STYLE_OPA = 95, + LV_STYLE_OPA_LAYERED = 96, + LV_STYLE_COLOR_FILTER_DSC = 97, + LV_STYLE_COLOR_FILTER_OPA = 98, + LV_STYLE_ANIM = 99, + LV_STYLE_ANIM_DURATION = 100, + LV_STYLE_TRANSITION = 102, + LV_STYLE_BLEND_MODE = 103, + LV_STYLE_TRANSFORM_WIDTH = 104, + LV_STYLE_TRANSFORM_HEIGHT = 105, + LV_STYLE_TRANSLATE_X = 106, + LV_STYLE_TRANSLATE_Y = 107, + LV_STYLE_TRANSFORM_SCALE_X = 108, + LV_STYLE_TRANSFORM_SCALE_Y = 109, + LV_STYLE_TRANSFORM_ROTATION = 110, + LV_STYLE_TRANSFORM_PIVOT_X = 111, + LV_STYLE_TRANSFORM_PIVOT_Y = 112, + LV_STYLE_TRANSFORM_SKEW_X = 113, + LV_STYLE_TRANSFORM_SKEW_Y = 114, + LV_STYLE_BITMAP_MASK_SRC = 115, + LV_STYLE_ROTARY_SENSITIVITY = 116, + +#if LV_USE_FLEX + LV_STYLE_FLEX_FLOW = 125, + LV_STYLE_FLEX_MAIN_PLACE = 126, + LV_STYLE_FLEX_CROSS_PLACE = 127, + LV_STYLE_FLEX_TRACK_PLACE = 128, + LV_STYLE_FLEX_GROW = 129, +#endif + +#if LV_USE_GRID + LV_STYLE_GRID_COLUMN_ALIGN = 130, + LV_STYLE_GRID_ROW_ALIGN = 131, + LV_STYLE_GRID_ROW_DSC_ARRAY = 132, + LV_STYLE_GRID_COLUMN_DSC_ARRAY = 133, + LV_STYLE_GRID_CELL_COLUMN_POS = 134, + LV_STYLE_GRID_CELL_COLUMN_SPAN = 135, + LV_STYLE_GRID_CELL_X_ALIGN = 136, + LV_STYLE_GRID_CELL_ROW_POS = 137, + LV_STYLE_GRID_CELL_ROW_SPAN = 138, + LV_STYLE_GRID_CELL_Y_ALIGN = 139, +#endif + + _LV_STYLE_LAST_BUILT_IN_PROP = 140, + + _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1, + + LV_STYLE_PROP_ANY = 0xFF, + _LV_STYLE_PROP_CONST = 0xFF /* magic value for const styles */ +}; + +#ifdef DOXYGEN +typedef _lv_style_prop_t lv_style_prop_t; +#else +typedef uint8_t lv_style_prop_t; +#endif /*DOXYGEN*/ + +enum _lv_style_res_t { + LV_STYLE_RES_NOT_FOUND, + LV_STYLE_RES_FOUND, +}; + +#ifdef DOXYGEN +typedef _lv_style_res_t lv_style_res_t; +#else +typedef uint8_t lv_style_res_t; +#endif /*DOXYGEN*/ + +/** + * Descriptor for style transitions + */ +typedef struct { + const lv_style_prop_t * props; /**< An array with the properties to animate.*/ + void * user_data; /**< A custom user data that will be passed to the animation's user_data */ + lv_anim_path_cb_t path_xcb; /**< A path for the animation.*/ + uint32_t time; /**< Duration of the transition in [ms]*/ + uint32_t delay; /**< Delay before the transition in [ms]*/ +} lv_style_transition_dsc_t; + +/** + * Descriptor of a constant style property. + */ +typedef struct { + const lv_style_prop_t * prop_ptr; + lv_style_value_t value; +} lv_style_const_prop_t; + +/** + * Descriptor of a style (a collection of properties and values). + */ +typedef struct { + +#if LV_USE_ASSERT_STYLE + uint32_t sentinel; +#endif + + void * values_and_props; + + uint32_t has_group; + uint8_t prop_cnt; /**< 255 means it's a constant style*/ +} lv_style_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a style + * @param style pointer to a style to initialize + * @note Do not call `lv_style_init` on styles that already have some properties + * because this function won't free the used memory, just sets a default state for the style. + * In other words be sure to initialize styles only once! + */ +void lv_style_init(lv_style_t * style); + +/** + * Clear all properties from a style and free all allocated memories. + * @param style pointer to a style + */ +void lv_style_reset(lv_style_t * style); + +/** + * Check if a style is constant + * @param style pointer to a style + * @return true: the style is constant + */ +static inline bool lv_style_is_const(const lv_style_t * style) +{ + if(style->prop_cnt == 255) return true; + return false; +} + +/** + * Register a new style property for custom usage + * @return a new property ID, or LV_STYLE_PROP_INV if there are no more available. + * @example + * lv_style_prop_t MY_PROP; + * static inline void lv_style_set_my_prop(lv_style_t * style, lv_color_t value) { + * lv_style_value_t v = {.color = value}; lv_style_set_prop(style, MY_PROP, v); } + * + * ... + * MY_PROP = lv_style_register_prop(); + * ... + * lv_style_set_my_prop(&style1, lv_palette_main(LV_PALETTE_RED)); + */ +lv_style_prop_t lv_style_register_prop(uint8_t flag); + +/** + * Get the number of custom properties that have been registered thus far. + */ +lv_style_prop_t lv_style_get_num_custom_props(void); + +/** + * Remove a property from a style + * @param style pointer to a style + * @param prop a style property ORed with a state. + * @return true: the property was found and removed; false: the property wasn't found + */ +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop); + +/** + * Set the value of property in a style. + * This function shouldn't be used directly by the user. + * Instead use `lv_style_set_()`. E.g. `lv_style_set_bg_color()` + * @param style pointer to style + * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`) + * @param value `lv_style_value_t` variable in which a field is set according to the type of `prop` + */ +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) + * LV_RESULT_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + */ +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value); + +/** + * Initialize a transition descriptor. + * @param tr pointer to a transition descriptor to initialize + * @param props an array with the properties to transition. The last element must be zero. + * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used. + * @param time duration of the transition in [ms] + * @param delay delay before the transition in [ms] + * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called + * @example + * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 }; + * static lv_style_transition_dsc_t trans1; + * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL); + */ +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data); + +/** + * Get the default value of a property + * @param prop the ID of a property + * @return the default value + */ +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) + * LV_RESULT_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + * @note This function is the same as ::lv_style_get_prop but inlined. Use it only on performance critical places + */ +static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop, + lv_style_value_t * value) +{ + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = (lv_style_const_prop_t *)style->values_and_props; + uint32_t i; + for(i = 0; props[i].prop_ptr; i++) { + if(*props[i].prop_ptr == prop) { + *value = props[i].value; + return LV_STYLE_RES_FOUND; + } + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(props[i] == prop) { + lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; + *value = values[i]; + return LV_STYLE_RES_FOUND; + } + } + } + return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Checks if a style is empty (has no properties) + * @param style pointer to a style + * @return true if the style is empty + */ +bool lv_style_is_empty(const lv_style_t * style); + +/** + * Tell the group of a property. If the a property from a group is set in a style the (1 << group) bit of style->has_group is set. + * It allows early skipping the style if the property is not exists in the style at all. + * @param prop a style property + * @return the group [0..30] 30 means all the custom properties with index > 120 + */ +static inline uint32_t _lv_style_get_prop_group(lv_style_prop_t prop) +{ + uint32_t group = prop >> 2; + if(group > 30) group = 31; /*The MSB marks all the custom properties*/ + return group; + +} + +/** + * Get the flags of a built-in or custom property. + * + * @param prop a style property + * @return the flags of the property + */ +uint8_t _lv_style_prop_lookup_flags(lv_style_prop_t prop); + +#include "lv_style_gen.h" + +static inline void lv_style_set_size(lv_style_t * style, int32_t width, int32_t height) +{ + lv_style_set_width(style, width); + lv_style_set_height(style, height); +} + +static inline void lv_style_set_pad_all(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +static inline void lv_style_set_pad_hor(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); +} + +static inline void lv_style_set_pad_ver(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +static inline void lv_style_set_pad_gap(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_row(style, value); + lv_style_set_pad_column(style, value); +} + +static inline void lv_style_set_transform_scale(lv_style_t * style, int32_t value) +{ + lv_style_set_transform_scale_x(style, value); + lv_style_set_transform_scale_y(style, value); +} + +/** + * @brief Check if the style property has a specified behavioral flag. + * + * Do not pass multiple flags to this function as backwards-compatibility is not guaranteed + * for that. + * + * @param prop Property ID + * @param flag Flag + * @return true if the flag is set for this property + */ +static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag) +{ + return _lv_style_prop_lookup_flags(prop) & flag; +} + +/************************* + * GLOBAL VARIABLES + *************************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t lv_style_const_prop_id_inv; + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_STYLE +# define LV_ASSERT_STYLE(style_p) \ + do { \ + LV_ASSERT_MSG(style_p != NULL, "The style is NULL"); \ + LV_ASSERT_MSG(style_p->sentinel == LV_STYLE_SENTINEL_VALUE, "Style is not initialized or corrupted"); \ + } while(0) +#else +# define LV_ASSERT_STYLE(p) do{}while(0) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STYLE_H*/ diff --git a/libraries/lvgl/src/misc/lv_style_gen.c b/libraries/lvgl/src/misc/lv_style_gen.c new file mode 100644 index 0000000..2970875 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_style_gen.c @@ -0,0 +1,1117 @@ + +/* + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#include "lv_style.h" + + +void lv_style_set_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_WIDTH = LV_STYLE_WIDTH; + +void lv_style_set_min_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MIN_WIDTH = LV_STYLE_MIN_WIDTH; + +void lv_style_set_max_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MAX_WIDTH = LV_STYLE_MAX_WIDTH; + +void lv_style_set_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_HEIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_HEIGHT = LV_STYLE_HEIGHT; + +void lv_style_set_min_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_HEIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MIN_HEIGHT = LV_STYLE_MIN_HEIGHT; + +void lv_style_set_max_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_HEIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MAX_HEIGHT = LV_STYLE_MAX_HEIGHT; + +void lv_style_set_length(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LENGTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LENGTH = LV_STYLE_LENGTH; + +void lv_style_set_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_X = LV_STYLE_X; + +void lv_style_set_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_Y = LV_STYLE_Y; + +void lv_style_set_align(lv_style_t * style, lv_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ALIGN = LV_STYLE_ALIGN; + +void lv_style_set_transform_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_WIDTH = LV_STYLE_TRANSFORM_WIDTH; + +void lv_style_set_transform_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_HEIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_HEIGHT = LV_STYLE_TRANSFORM_HEIGHT; + +void lv_style_set_translate_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_X = LV_STYLE_TRANSLATE_X; + +void lv_style_set_translate_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y = LV_STYLE_TRANSLATE_Y; + +void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X = LV_STYLE_TRANSFORM_SCALE_X; + +void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y = LV_STYLE_TRANSFORM_SCALE_Y; + +void lv_style_set_transform_rotation(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_ROTATION, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_ROTATION = LV_STYLE_TRANSFORM_ROTATION; + +void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_X = LV_STYLE_TRANSFORM_PIVOT_X; + +void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_Y = LV_STYLE_TRANSFORM_PIVOT_Y; + +void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_X = LV_STYLE_TRANSFORM_SKEW_X; + +void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_Y = LV_STYLE_TRANSFORM_SKEW_Y; + +void lv_style_set_pad_top(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_TOP, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_TOP = LV_STYLE_PAD_TOP; + +void lv_style_set_pad_bottom(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_BOTTOM, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_BOTTOM = LV_STYLE_PAD_BOTTOM; + +void lv_style_set_pad_left(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_LEFT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_LEFT = LV_STYLE_PAD_LEFT; + +void lv_style_set_pad_right(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_RIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_RIGHT = LV_STYLE_PAD_RIGHT; + +void lv_style_set_pad_row(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_ROW, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_ROW = LV_STYLE_PAD_ROW; + +void lv_style_set_pad_column(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_COLUMN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_PAD_COLUMN = LV_STYLE_PAD_COLUMN; + +void lv_style_set_margin_top(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_TOP, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MARGIN_TOP = LV_STYLE_MARGIN_TOP; + +void lv_style_set_margin_bottom(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_BOTTOM, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MARGIN_BOTTOM = LV_STYLE_MARGIN_BOTTOM; + +void lv_style_set_margin_left(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_LEFT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MARGIN_LEFT = LV_STYLE_MARGIN_LEFT; + +void lv_style_set_margin_right(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_RIGHT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_MARGIN_RIGHT = LV_STYLE_MARGIN_RIGHT; + +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_COLOR = LV_STYLE_BG_COLOR; + +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_OPA = LV_STYLE_BG_OPA; + +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_COLOR = LV_STYLE_BG_GRAD_COLOR; + +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_DIR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_DIR = LV_STYLE_BG_GRAD_DIR; + +void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_MAIN_STOP, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_STOP = LV_STYLE_BG_MAIN_STOP; + +void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_STOP, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP = LV_STYLE_BG_GRAD_STOP; + +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_MAIN_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA = LV_STYLE_BG_MAIN_OPA; + +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA = LV_STYLE_BG_GRAD_OPA; + +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD = LV_STYLE_BG_GRAD; + +void lv_style_set_bg_image_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_SRC, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_SRC = LV_STYLE_BG_IMAGE_SRC; + +void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_OPA = LV_STYLE_BG_IMAGE_OPA; + +void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR = LV_STYLE_BG_IMAGE_RECOLOR; + +void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA = LV_STYLE_BG_IMAGE_RECOLOR_OPA; + +void lv_style_set_bg_image_tiled(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_TILED, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_TILED = LV_STYLE_BG_IMAGE_TILED; + +void lv_style_set_border_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BORDER_COLOR = LV_STYLE_BORDER_COLOR; + +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BORDER_OPA = LV_STYLE_BORDER_OPA; + +void lv_style_set_border_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BORDER_WIDTH = LV_STYLE_BORDER_WIDTH; + +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_SIDE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BORDER_SIDE = LV_STYLE_BORDER_SIDE; + +void lv_style_set_border_post(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_POST, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BORDER_POST = LV_STYLE_BORDER_POST; + +void lv_style_set_outline_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_WIDTH = LV_STYLE_OUTLINE_WIDTH; + +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_COLOR = LV_STYLE_OUTLINE_COLOR; + +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_OPA = LV_STYLE_OUTLINE_OPA; + +void lv_style_set_outline_pad(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_PAD, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_PAD = LV_STYLE_OUTLINE_PAD; + +void lv_style_set_shadow_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_WIDTH = LV_STYLE_SHADOW_WIDTH; + +void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_X, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_X = LV_STYLE_SHADOW_OFFSET_X; + +void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_Y, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_Y = LV_STYLE_SHADOW_OFFSET_Y; + +void lv_style_set_shadow_spread(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_SPREAD, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_SPREAD = LV_STYLE_SHADOW_SPREAD; + +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_COLOR = LV_STYLE_SHADOW_COLOR; + +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OPA = LV_STYLE_SHADOW_OPA; + +void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_IMAGE_OPA = LV_STYLE_IMAGE_OPA; + +void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR = LV_STYLE_IMAGE_RECOLOR; + +void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR_OPA = LV_STYLE_IMAGE_RECOLOR_OPA; + +void lv_style_set_line_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_WIDTH = LV_STYLE_LINE_WIDTH; + +void lv_style_set_line_dash_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_WIDTH = LV_STYLE_LINE_DASH_WIDTH; + +void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_GAP, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_GAP = LV_STYLE_LINE_DASH_GAP; + +void lv_style_set_line_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_ROUNDED, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_ROUNDED = LV_STYLE_LINE_ROUNDED; + +void lv_style_set_line_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_COLOR = LV_STYLE_LINE_COLOR; + +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LINE_OPA = LV_STYLE_LINE_OPA; + +void lv_style_set_arc_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_WIDTH, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ARC_WIDTH = LV_STYLE_ARC_WIDTH; + +void lv_style_set_arc_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_ROUNDED, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ARC_ROUNDED = LV_STYLE_ARC_ROUNDED; + +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ARC_COLOR = LV_STYLE_ARC_COLOR; + +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ARC_OPA = LV_STYLE_ARC_OPA; + +void lv_style_set_arc_image_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_IMAGE_SRC, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ARC_IMAGE_SRC = LV_STYLE_ARC_IMAGE_SRC; + +void lv_style_set_text_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_COLOR = LV_STYLE_TEXT_COLOR; + +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_OPA = LV_STYLE_TEXT_OPA; + +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_FONT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_FONT = LV_STYLE_TEXT_FONT; + +void lv_style_set_text_letter_space(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LETTER_SPACE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_LETTER_SPACE = LV_STYLE_TEXT_LETTER_SPACE; + +void lv_style_set_text_line_space(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LINE_SPACE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_LINE_SPACE = LV_STYLE_TEXT_LINE_SPACE; + +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_DECOR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_DECOR = LV_STYLE_TEXT_DECOR; + +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TEXT_ALIGN = LV_STYLE_TEXT_ALIGN; + +void lv_style_set_radius(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_RADIUS, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_RADIUS = LV_STYLE_RADIUS; + +void lv_style_set_clip_corner(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_CLIP_CORNER, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_CLIP_CORNER = LV_STYLE_CLIP_CORNER; + +void lv_style_set_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OPA = LV_STYLE_OPA; + +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_OPA_LAYERED = LV_STYLE_OPA_LAYERED; + +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_DSC = LV_STYLE_COLOR_FILTER_DSC; + +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_OPA = LV_STYLE_COLOR_FILTER_OPA; + +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ANIM, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ANIM = LV_STYLE_ANIM; + +void lv_style_set_anim_duration(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ANIM_DURATION, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ANIM_DURATION = LV_STYLE_ANIM_DURATION; + +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TRANSITION, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_TRANSITION = LV_STYLE_TRANSITION; + +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLEND_MODE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BLEND_MODE = LV_STYLE_BLEND_MODE; + +void lv_style_set_layout(lv_style_t * style, uint16_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LAYOUT, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_LAYOUT = LV_STYLE_LAYOUT; + +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BASE_DIR, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR = LV_STYLE_BASE_DIR; + +void lv_style_set_bitmap_mask_src(lv_style_t * style, const lv_image_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BITMAP_MASK_SRC, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC = LV_STYLE_BITMAP_MASK_SRC; + +void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ROTARY_SENSITIVITY, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY = LV_STYLE_ROTARY_SENSITIVITY; +#if LV_USE_FLEX + +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_FLOW, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW = LV_STYLE_FLEX_FLOW; + +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_MAIN_PLACE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE = LV_STYLE_FLEX_MAIN_PLACE; + +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_CROSS_PLACE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE = LV_STYLE_FLEX_CROSS_PLACE; + +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_TRACK_PLACE, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE = LV_STYLE_FLEX_TRACK_PLACE; + +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW = LV_STYLE_FLEX_GROW; +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID + +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY = LV_STYLE_GRID_COLUMN_DSC_ARRAY; + +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN = LV_STYLE_GRID_COLUMN_ALIGN; + +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_DSC_ARRAY, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY = LV_STYLE_GRID_ROW_DSC_ARRAY; + +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN = LV_STYLE_GRID_ROW_ALIGN; + +void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_POS, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS = LV_STYLE_GRID_CELL_COLUMN_POS; + +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_X_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN = LV_STYLE_GRID_CELL_X_ALIGN; + +void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_SPAN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN = LV_STYLE_GRID_CELL_COLUMN_SPAN; + +void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_POS, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS = LV_STYLE_GRID_CELL_ROW_POS; + +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_Y_ALIGN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN = LV_STYLE_GRID_CELL_Y_ALIGN; + +void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_SPAN, v); +} + +const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN = LV_STYLE_GRID_CELL_ROW_SPAN; +#endif /*LV_USE_GRID*/ + diff --git a/libraries/lvgl/src/misc/lv_style_gen.h b/libraries/lvgl/src/misc/lv_style_gen.h new file mode 100644 index 0000000..7aed6b7 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_style_gen.h @@ -0,0 +1,804 @@ + +/* + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#ifndef LV_STYLE_GEN_H +#define LV_STYLE_GEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +void lv_style_set_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_WIDTH; +void lv_style_set_min_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MIN_WIDTH; +void lv_style_set_max_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MAX_WIDTH; +void lv_style_set_height(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_HEIGHT; +void lv_style_set_min_height(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MIN_HEIGHT; +void lv_style_set_max_height(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MAX_HEIGHT; +void lv_style_set_length(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LENGTH; +void lv_style_set_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_X; +void lv_style_set_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_Y; +void lv_style_set_align(lv_style_t * style, lv_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ALIGN; +void lv_style_set_transform_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_WIDTH; +void lv_style_set_transform_height(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_HEIGHT; +void lv_style_set_translate_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_X; +void lv_style_set_translate_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y; +void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X; +void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y; +void lv_style_set_transform_rotation(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_ROTATION; +void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_X; +void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_PIVOT_Y; +void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_X; +void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SKEW_Y; +void lv_style_set_pad_top(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_TOP; +void lv_style_set_pad_bottom(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_BOTTOM; +void lv_style_set_pad_left(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_LEFT; +void lv_style_set_pad_right(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_RIGHT; +void lv_style_set_pad_row(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_ROW; +void lv_style_set_pad_column(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_PAD_COLUMN; +void lv_style_set_margin_top(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_TOP; +void lv_style_set_margin_bottom(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_BOTTOM; +void lv_style_set_margin_left(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_LEFT; +void lv_style_set_margin_right(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_MARGIN_RIGHT; +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_COLOR; +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_OPA; +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_COLOR; +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_DIR; +void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_STOP; +void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_STOP; +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_MAIN_OPA; +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD_OPA; +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_GRAD; +void lv_style_set_bg_image_src(lv_style_t * style, const void * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_SRC; +void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_OPA; +void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR; +void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA; +void lv_style_set_bg_image_tiled(lv_style_t * style, bool value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BG_IMAGE_TILED; +void lv_style_set_border_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_COLOR; +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_OPA; +void lv_style_set_border_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_WIDTH; +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_SIDE; +void lv_style_set_border_post(lv_style_t * style, bool value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BORDER_POST; +void lv_style_set_outline_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_WIDTH; +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_COLOR; +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_OPA; +void lv_style_set_outline_pad(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OUTLINE_PAD; +void lv_style_set_shadow_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_WIDTH; +void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_X; +void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OFFSET_Y; +void lv_style_set_shadow_spread(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_SPREAD; +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_COLOR; +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_SHADOW_OPA; +void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_OPA; +void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR; +void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_IMAGE_RECOLOR_OPA; +void lv_style_set_line_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_WIDTH; +void lv_style_set_line_dash_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_WIDTH; +void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_DASH_GAP; +void lv_style_set_line_rounded(lv_style_t * style, bool value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_ROUNDED; +void lv_style_set_line_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_COLOR; +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LINE_OPA; +void lv_style_set_arc_width(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_WIDTH; +void lv_style_set_arc_rounded(lv_style_t * style, bool value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_ROUNDED; +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_COLOR; +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_OPA; +void lv_style_set_arc_image_src(lv_style_t * style, const void * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ARC_IMAGE_SRC; +void lv_style_set_text_color(lv_style_t * style, lv_color_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_COLOR; +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_OPA; +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_FONT; +void lv_style_set_text_letter_space(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_LETTER_SPACE; +void lv_style_set_text_line_space(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_LINE_SPACE; +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_DECOR; +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TEXT_ALIGN; +void lv_style_set_radius(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_RADIUS; +void lv_style_set_clip_corner(lv_style_t * style, bool value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_CLIP_CORNER; +void lv_style_set_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OPA; +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_OPA_LAYERED; +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_DSC; +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_COLOR_FILTER_OPA; +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ANIM; +void lv_style_set_anim_duration(lv_style_t * style, uint32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ANIM_DURATION; +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_TRANSITION; +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BLEND_MODE; +void lv_style_set_layout(lv_style_t * style, uint16_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LAYOUT; +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR; +void lv_style_set_bitmap_mask_src(lv_style_t * style, const lv_image_dsc_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC; +void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY; +#if LV_USE_FLEX +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW; +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE; +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE; +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE; +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW; +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY; +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN; +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY; +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN; +void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS; +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN; +void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN; +void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS; +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN; +void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value); +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN; +#endif /*LV_USE_GRID*/ + + +#define LV_STYLE_CONST_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MIN_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MIN_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MAX_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MAX_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_HEIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MIN_HEIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MIN_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MAX_HEIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MAX_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LENGTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LENGTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_HEIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSLATE_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSLATE_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSLATE_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSLATE_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_SCALE_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_SCALE_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_ROTATION(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_ROTATION, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_SKEW_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SKEW_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSFORM_SKEW_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SKEW_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_TOP(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_TOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_BOTTOM(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_BOTTOM, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_LEFT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_LEFT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_RIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_RIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_ROW(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_ROW, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_PAD_COLUMN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_PAD_COLUMN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MARGIN_TOP(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MARGIN_TOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MARGIN_BOTTOM(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MARGIN_BOTTOM, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MARGIN_LEFT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MARGIN_LEFT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_MARGIN_RIGHT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_MARGIN_RIGHT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_DIR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_MAIN_STOP(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_STOP(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_MAIN_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_GRAD(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_GRAD, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BG_IMAGE_SRC(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_SRC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BG_IMAGE_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_IMAGE_RECOLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_RECOLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BG_IMAGE_RECOLOR_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BG_IMAGE_TILED(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BG_IMAGE_TILED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BORDER_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_BORDER_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BORDER_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BORDER_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_SIDE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BORDER_SIDE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BORDER_POST(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BORDER_POST, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OUTLINE_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_OUTLINE_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OUTLINE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OUTLINE_PAD(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OUTLINE_PAD, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_OFFSET_X(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_OFFSET_Y(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_SPREAD(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_SHADOW_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_SHADOW_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_SHADOW_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_IMAGE_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_IMAGE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_IMAGE_RECOLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_IMAGE_RECOLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_IMAGE_RECOLOR_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_DASH_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_DASH_GAP(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_ROUNDED(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_ROUNDED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LINE_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_LINE_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LINE_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_WIDTH(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ARC_WIDTH, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_ROUNDED(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ARC_ROUNDED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ARC_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_ARC_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ARC_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ARC_IMAGE_SRC(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ARC_IMAGE_SRC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_TEXT_COLOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_COLOR, .value = { .color = val } \ + } + +#define LV_STYLE_CONST_TEXT_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_FONT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_FONT, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_TEXT_LETTER_SPACE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_LINE_SPACE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_DECOR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_DECOR, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TEXT_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TEXT_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_RADIUS(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_RADIUS, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_CLIP_CORNER(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_CLIP_CORNER, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_OPA_LAYERED(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_OPA_LAYERED, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_COLOR_FILTER_DSC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_COLOR_FILTER_OPA(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_ANIM(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ANIM, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_ANIM_DURATION(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ANIM_DURATION, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_TRANSITION(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_TRANSITION, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_BLEND_MODE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BLEND_MODE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_LAYOUT(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_LAYOUT, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BASE_DIR(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BASE_DIR, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_BITMAP_MASK_SRC(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_BITMAP_MASK_SRC, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_ROTARY_SENSITIVITY(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \ + } +#if LV_USE_FLEX + +#define LV_STYLE_CONST_FLEX_FLOW(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_FLEX_FLOW, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_FLEX_MAIN_PLACE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_FLEX_MAIN_PLACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_FLEX_CROSS_PLACE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_FLEX_CROSS_PLACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_FLEX_TRACK_PLACE(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_FLEX_TRACK_PLACE, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_FLEX_GROW(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_FLEX_GROW, .value = { .num = (int32_t)val } \ + } +#endif /*LV_USE_FLEX*/ + +#if LV_USE_GRID + +#define LV_STYLE_CONST_GRID_COLUMN_DSC_ARRAY(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_GRID_COLUMN_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_COLUMN_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_ROW_DSC_ARRAY(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_ROW_DSC_ARRAY, .value = { .ptr = val } \ + } + +#define LV_STYLE_CONST_GRID_ROW_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_ROW_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_COLUMN_POS(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_COLUMN_POS, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_X_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_X_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_COLUMN_SPAN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_ROW_POS(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_ROW_POS, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_Y_ALIGN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_Y_ALIGN, .value = { .num = (int32_t)val } \ + } + +#define LV_STYLE_CONST_GRID_CELL_ROW_SPAN(val) \ + { \ + .prop_ptr = &_lv_style_const_prop_id_GRID_CELL_ROW_SPAN, .value = { .num = (int32_t)val } \ + } +#endif /*LV_USE_GRID*/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_STYLE_GEN_H */ diff --git a/libraries/lvgl/src/misc/lv_templ.c b/libraries/lvgl/src/misc/lv_templ.c new file mode 100644 index 0000000..939930c --- /dev/null +++ b/libraries/lvgl/src/misc/lv_templ.c @@ -0,0 +1,40 @@ +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ +/*It can be removed.*/ +typedef int _keep_pedantic_happy; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_templ.h b/libraries/lvgl/src/misc/lv_templ.h new file mode 100644 index 0000000..f7e3c26 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_templ.h @@ -0,0 +1,37 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/libraries/lvgl/src/misc/lv_text.c b/libraries/lvgl/src/misc/lv_text.c new file mode 100644 index 0000000..b9e96de --- /dev/null +++ b/libraries/lvgl/src/misc/lv_text.c @@ -0,0 +1,820 @@ +/** + * @file lv_text.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_text.h" +#include "lv_text_ap.h" +#include "lv_math.h" +#include "lv_log.h" +#include "lv_assert.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define NO_BREAK_FOUND UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + static uint8_t lv_text_utf8_size(const char * str); + static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni); + static uint32_t lv_text_utf8_conv_wc(uint32_t c); + static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i); + static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_text_utf8_get_length(const char * txt); +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + static uint8_t lv_text_iso8859_1_size(const char * str); + static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni); + static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c); + static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i); + static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_text_iso8859_1_get_length(const char * txt); +#endif +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + uint8_t (*_lv_text_encoded_size)(const char *) = lv_text_utf8_size; + uint32_t (*_lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_utf8; + uint32_t (*_lv_text_encoded_conv_wc)(uint32_t) = lv_text_utf8_conv_wc; + uint32_t (*_lv_text_encoded_next)(const char *, uint32_t *) = lv_text_utf8_next; + uint32_t (*_lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_utf8_prev; + uint32_t (*_lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_utf8_get_byte_id; + uint32_t (*_lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_utf8_get_char_id; + uint32_t (*_lv_text_get_encoded_length)(const char *) = lv_text_utf8_get_length; +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + uint8_t (*_lv_text_encoded_size)(const char *) = lv_text_iso8859_1_size; + uint32_t (*_lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_iso8859_1; + uint32_t (*_lv_text_encoded_conv_wc)(uint32_t) = lv_text_iso8859_1_conv_wc; + uint32_t (*_lv_text_encoded_next)(const char *, uint32_t *) = lv_text_iso8859_1_next; + uint32_t (*_lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_iso8859_1_prev; + uint32_t (*_lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_iso8859_1_get_byte_id; + uint32_t (*_lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_iso8859_1_get_char_id; + uint32_t (*_lv_text_get_encoded_length)(const char *) = lv_text_iso8859_1_get_length; + +#endif + +/********************** + * MACROS + **********************/ + +#define LV_IS_ASCII(value) ((value & 0x80U) == 0x00U) +#define LV_IS_2BYTES_UTF8_CODE(value) ((value & 0xE0U) == 0xC0U) +#define LV_IS_3BYTES_UTF8_CODE(value) ((value & 0xF0U) == 0xE0U) +#define LV_IS_4BYTES_UTF8_CODE(value) ((value & 0xF8U) == 0xF0U) +#define LV_IS_INVALID_UTF8_CODE(value) ((value & 0xC0U) != 0x80U) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, + int32_t line_space, int32_t max_width, lv_text_flag_t flag) +{ + size_res->x = 0; + size_res->y = 0; + + if(text == NULL) return; + if(font == NULL) return; + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t line_start = 0; + uint32_t new_line_start = 0; + uint16_t letter_height = lv_font_get_line_height(font); + + /*Calc. the height and longest line*/ + while(text[line_start] != '\0') { + new_line_start += _lv_text_get_next_line(&text[line_start], font, letter_space, max_width, NULL, flag); + + if((unsigned long)size_res->y + (unsigned long)letter_height + (unsigned long)line_space > LV_MAX_OF(int32_t)) { + LV_LOG_WARN("integer overflow while calculating text height"); + return; + } + else { + size_res->y += letter_height; + size_res->y += line_space; + } + + /*Calculate the longest line*/ + int32_t act_line_length = lv_text_get_width(&text[line_start], new_line_start - line_start, font, letter_space); + + size_res->x = LV_MAX(act_line_length, size_res->x); + line_start = new_line_start; + } + + /*Make the text one line taller if the last character is '\n' or '\r'*/ + if((line_start != 0) && (text[line_start - 1] == '\n' || text[line_start - 1] == '\r')) { + size_res->y += letter_height + line_space; + } + + /*Correction with the last line space or set the height manually if the text is empty*/ + if(size_res->y == 0) + size_res->y = letter_height; + else + size_res->y -= line_space; +} + +/** + * Get the next word of text. A word is delimited by break characters. + * + * If the word cannot fit in the max_width space, obey LV_TXT_LINE_BREAK_LONG_* rules. + * + * If the next word cannot fit anything, return 0. + * + * If the first character is a break character, returns the next index. + * + * Example calls from lv_text_get_next_line() assuming sufficient max_width and + * txt = "Test text\n" + * 0123456789 + * + * Calls would be as follows: + * 1. Return i=4, pointing at breakchar ' ', for the string "Test" + * 2. Return i=5, since i=4 was a breakchar. + * 3. Return i=9, pointing at breakchar '\n' + * 4. Parenting lv_text_get_next_line() would detect subsequent '\0' + * + * TODO: Returned word_w_ptr may overestimate the returned word's width when + * max_width is reached. In current usage, this has no impact. + * + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid line breaks + * @param flags settings for the text from 'txt_flag_type' enum + * @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL. + * @param force Force return the fraction of the word that can fit in the provided space. + * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) + */ +static uint32_t lv_text_get_next_word(const char * txt, const lv_font_t * font, + int32_t letter_space, int32_t max_width, + lv_text_flag_t flag, uint32_t * word_w_ptr, bool force) +{ + if(txt == NULL || txt[0] == '\0') return 0; + if(font == NULL) return 0; + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t i = 0, i_next = 0, i_next_next = 0; /*Iterating index into txt*/ + uint32_t letter = 0; /*Letter at i*/ + uint32_t letter_next = 0; /*Letter at i_next*/ + int32_t letter_w; + int32_t cur_w = 0; /*Pixel Width of transversed string*/ + uint32_t word_len = 0; /*Number of characters in the transversed word*/ + uint32_t break_index = NO_BREAK_FOUND; /*only used for "long" words*/ + uint32_t break_letter_count = 0; /*Number of characters up to the long word break point*/ + + letter = _lv_text_encoded_next(txt, &i_next); + i_next_next = i_next; + + /*Obtain the full word, regardless if it fits or not in max_width*/ + while(txt[i] != '\0') { + letter_next = _lv_text_encoded_next(txt, &i_next_next); + word_len++; + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + cur_w += letter_w; + + if(letter_w > 0) { + cur_w += letter_space; + } + + /*Test if this character fits within max_width*/ + if(break_index == NO_BREAK_FOUND && (cur_w - letter_space) > max_width) { + break_index = i; + break_letter_count = word_len - 1; + /*break_index is now pointing at the character that doesn't fit*/ + } + + /*Check for new line chars and breakchars*/ + if(letter == '\n' || letter == '\r' || _lv_text_is_break_char(letter)) { + /*Update the output width on the first character if it fits. + *Must do this here in case first letter is a break character.*/ + if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; + word_len--; + break; + } + else if(_lv_text_is_a_word(letter_next) || _lv_text_is_a_word(letter)) { + /*Found a word for single letter, usually true for CJK*/ + *word_w_ptr = cur_w; + i = i_next; + break; + } + + /*Update the output width*/ + if(word_w_ptr != NULL && break_index == NO_BREAK_FOUND) *word_w_ptr = cur_w; + + i = i_next; + i_next = i_next_next; + letter = letter_next; + } + + /*Entire Word fits in the provided space*/ + if(break_index == NO_BREAK_FOUND) { + if(word_len == 0 || (letter == '\r' && letter_next == '\n')) i = i_next; + return i; + } + +#if LV_TXT_LINE_BREAK_LONG_LEN > 0 + /*Word doesn't fit in provided space, but isn't "long"*/ + if(word_len < LV_TXT_LINE_BREAK_LONG_LEN) { + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + return 0; + } + + /*Word is "long," but insufficient amounts can fit in provided space*/ + if(break_letter_count < LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN) { + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; + return 0; + } + + /*Word is a "long", but letters may need to be better distributed*/ + { + i = break_index; + int32_t n_move = LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - (word_len - break_letter_count); + /*Move pointer "i" backwards*/ + for(; n_move > 0; n_move--) { + _lv_text_encoded_prev(txt, &i); + /** + * TODO: it would be appropriate to update the returned + * word width hereHowever, in current usage, this doesn't impact anything. + */ + } + } + return i; +#else + if(force) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + (void) break_letter_count; + return 0; +#endif +} + +uint32_t _lv_text_get_next_line(const char * txt, const lv_font_t * font, + int32_t letter_space, int32_t max_width, + int32_t * used_width, lv_text_flag_t flag) +{ + if(used_width) *used_width = 0; + + if(txt == NULL) return 0; + if(txt[0] == '\0') return 0; + if(font == NULL) return 0; + + int32_t line_w = 0; + + /*If max_width doesn't matter simply find the new line character + *without thinking about word wrapping*/ + if((flag & LV_TEXT_FLAG_EXPAND) || (flag & LV_TEXT_FLAG_FIT)) { + uint32_t i; + for(i = 0; txt[i] != '\n' && txt[i] != '\r' && txt[i] != '\0'; i++) { + /*Just find the new line chars or string ends by incrementing `i`*/ + } + if(txt[i] != '\0') i++; /*To go beyond `\n`*/ + if(used_width) *used_width = -1; + return i; + } + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + uint32_t i = 0; /*Iterating index into txt*/ + + while(txt[i] != '\0' && max_width > 0) { + uint32_t word_w = 0; + uint32_t advance = lv_text_get_next_word(&txt[i], font, letter_space, max_width, flag, &word_w, i == 0); + max_width -= word_w; + line_w += word_w; + + if(advance == 0) { + break; + } + + i += advance; + + if(txt[0] == '\n' || txt[0] == '\r') break; + + if(txt[i] == '\n' || txt[i] == '\r') { + i++; /*Include the following newline in the current line*/ + break; + } + + } + + /*Always step at least one to avoid infinite loops*/ + if(i == 0) { + uint32_t letter = _lv_text_encoded_next(txt, &i); + if(used_width != NULL) { + line_w = lv_font_get_glyph_width(font, letter, '\0'); + } + } + + if(used_width != NULL) { + *used_width = line_w; + } + + return i; +} + +int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, int32_t letter_space) +{ + if(txt == NULL) return 0; + if(font == NULL) return 0; + if(txt[0] == '\0') return 0; + + uint32_t i = 0; + int32_t width = 0; + + if(length != 0) { + while(i < length) { + uint32_t letter; + uint32_t letter_next; + _lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + int32_t char_width = lv_font_get_glyph_width(font, letter, letter_next); + if(char_width > 0) { + width += char_width; + width += letter_space; + } + } + + if(width > 0) { + width -= letter_space; /*Trim the last letter space. Important if the text is center + aligned*/ + } + } + + return width; +} + +void _lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt) +{ + if(txt_buf == NULL || ins_txt == NULL) return; + + size_t old_len = lv_strlen(txt_buf); + size_t ins_len = lv_strlen(ins_txt); + if(ins_len == 0) return; + + size_t new_len = ins_len + old_len; + pos = _lv_text_encoded_get_byte_id(txt_buf, pos); /*Convert to byte index instead of letter index*/ + + /*Copy the second part into the end to make place to text to insert*/ + size_t i; + for(i = new_len; i >= pos + ins_len; i--) { + txt_buf[i] = txt_buf[i - ins_len]; + } + + /*Copy the text into the new space*/ + lv_memcpy(txt_buf + pos, ins_txt, ins_len); +} + +void _lv_text_cut(char * txt, uint32_t pos, uint32_t len) +{ + if(txt == NULL) return; + + size_t old_len = lv_strlen(txt); + + pos = _lv_text_encoded_get_byte_id(txt, pos); /*Convert to byte index instead of letter index*/ + len = _lv_text_encoded_get_byte_id(&txt[pos], len); + + /*Copy the second part into the end to make place to text to insert*/ + uint32_t i; + for(i = pos; i <= old_len - len; i++) { + txt[i] = txt[i + len]; + } +} + +char * _lv_text_set_text_vfmt(const char * fmt, va_list ap) +{ + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + va_list ap_copy; + va_copy(ap_copy, ap); + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + char * text = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_malloc(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + return NULL; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_text_ap_calc_bytes_count(raw_txt); + text = lv_malloc(len_ap + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + _lv_text_ap_proc(raw_txt, text); + + lv_free(raw_txt); +#else + text = lv_malloc(len + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + + lv_vsnprintf(text, len + 1, fmt, ap); +#endif + + return text; +} + +void _lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs) +{ + *letter = _lv_text_encoded_next(txt, ofs); + *letter_next = *letter != '\0' ? _lv_text_encoded_next(&txt[*ofs], NULL) : 0; +} + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 +/******************************* + * UTF-8 ENCODER/DECODER + ******************************/ + +/** + * Give the size of an UTF-8 coded character + * @param str pointer to a character in a string + * @return length of the UTF-8 character (1,2,3 or 4), 0 on invalid code. + */ +static uint8_t lv_text_utf8_size(const char * str) +{ + if(LV_IS_ASCII(str[0])) + return 1; + else if(LV_IS_2BYTES_UTF8_CODE(str[0])) + return 2; + else if(LV_IS_3BYTES_UTF8_CODE(str[0])) + return 3; + else if(LV_IS_4BYTES_UTF8_CODE(str[0])) + return 4; + return 0; +} + +/** + * Convert a Unicode letter to UTF-8. + * @param letter_uni a Unicode letter + * @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') + */ +static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni) +{ + if(letter_uni < 128) return letter_uni; + uint8_t bytes[4]; + + if(letter_uni < 0x0800) { + bytes[0] = ((letter_uni >> 6) & 0x1F) | 0xC0; + bytes[1] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[2] = 0; + bytes[3] = 0; + } + else if(letter_uni < 0x010000) { + bytes[0] = ((letter_uni >> 12) & 0x0F) | 0xE0; + bytes[1] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[3] = 0; + } + else if(letter_uni < 0x110000) { + bytes[0] = ((letter_uni >> 18) & 0x07) | 0xF0; + bytes[1] = ((letter_uni >> 12) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80; + } + else { + return 0; + } + + uint32_t * res_p = (uint32_t *)bytes; + return *res_p; +} + +/** + * Convert a wide character, e.g. 'Á' little endian to be UTF-8 compatible + * @param c a wide character or a Little endian number + * @return `c` in big endian + */ +static uint32_t lv_text_utf8_conv_wc(uint32_t c) +{ +#if LV_BIG_ENDIAN_SYSTEM == 0 + /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ + if((c & 0x80) != 0) { + uint32_t swapped; + uint8_t c8[4]; + lv_memcpy(c8, &c, 4); + swapped = (c8[0] << 24) + (c8[1] << 16) + (c8[2] << 8) + (c8[3]); + uint8_t i; + for(i = 0; i < 4; i++) { + if((swapped & 0xFF) == 0) + swapped = (swapped >> 8); /*Ignore leading zeros (they were in the end originally)*/ + } + c = swapped; + } +#endif + return c; +} + +/** + * Decode an UTF-8 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next UTF-8 char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i) +{ + /** + * Unicode to UTF-8 + * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx + * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx + * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx + * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx + */ + + uint32_t result = 0; + + /*Dummy 'i' pointer is required*/ + uint32_t i_tmp = 0; + if(i == NULL) i = &i_tmp; + + /*Normal ASCII*/ + if(LV_IS_ASCII(txt[*i])) { + result = txt[*i]; + (*i)++; + } + /*Real UTF-8 decode*/ + else { + /*2 bytes UTF-8 code*/ + if(LV_IS_2BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x1F) << 6; + (*i)++; + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*3 bytes UTF-8 code*/ + else if(LV_IS_3BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x0F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*4 bytes UTF-8 code*/ + else if(LV_IS_4BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x07) << 18; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += txt[*i] & 0x3F; + (*i)++; + } + else { + (*i)++; /*Not UTF-8 char. Go the next.*/ + } + } + return result; +} + +/** + * Get previous UTF-8 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous + * UTF-8 char in 'txt'. + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i) +{ + uint8_t c_size; + uint8_t cnt = 0; + + /*Try to find a !0 long UTF-8 char by stepping one character back*/ + (*i)--; + do { + if(cnt >= 4) return 0; /*No UTF-8 char found before the initial*/ + + c_size = _lv_text_encoded_size(&txt[*i]); + if(c_size == 0) { + if(*i != 0) + (*i)--; + else + return 0; + } + cnt++; + } while(c_size == 0); + + uint32_t i_tmp = *i; + uint32_t letter = _lv_text_encoded_next(txt, &i_tmp); /*Character found, get it*/ + + return letter; +} + +/** + * Convert a character index (in an UTF-8 text) to byte index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id) +{ + uint32_t i; + uint32_t byte_cnt = 0; + for(i = 0; i < utf8_id && txt[byte_cnt] != '\0'; i++) { + uint8_t c_size = _lv_text_encoded_size(&txt[byte_cnt]); + /* If the char was invalid tell it's 1 byte long*/ + byte_cnt += c_size ? c_size : 1; + } + + return byte_cnt; +} + +/** + * Convert a byte index (in an UTF-8 text) to character index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id) +{ + uint32_t i = 0; + uint32_t char_cnt = 0; + + while(i < byte_id) { + _lv_text_encoded_next(txt, &i); /*'i' points to the next letter so use the prev. value*/ + char_cnt++; + } + + return char_cnt; +} + +/** + * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. + * E.g.: "ÁBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_text_utf8_get_length(const char * txt) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(txt[i] != '\0') { + _lv_text_encoded_next(txt, &i); + len++; + } + + return len; +} + +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII +/******************************* + * ASCII ENCODER/DECODER + ******************************/ + +/** + * Give the size of an ISO8859-1 coded character + * @param str pointer to a character in a string + * @return length of the UTF-8 character (1,2,3 or 4). O on invalid code + */ +static uint8_t lv_text_iso8859_1_size(const char * str) +{ + LV_UNUSED(str); /*Unused*/ + return 1; +} + +/** + * Convert a Unicode letter to ISO8859-1. + * @param letter_uni a Unicode letter + * @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') + */ +static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni) +{ + if(letter_uni < 256) + return letter_uni; + else + return ' '; +} + +/** + * Convert wide characters to ASCII, however wide characters in ASCII range (e.g. 'A') are ASCII compatible by default. + * So this function does nothing just returns with `c`. + * @param c a character, e.g. 'A' + * @return same as `c` + */ +static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c) +{ + return c; +} + +/** + * Decode an ISO8859-1 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next UTF-8 char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i) +{ + if(i == NULL) return txt[0]; /*Get the next char*/ + + uint8_t letter = txt[*i]; + (*i)++; + return letter; +} + +/** + * Get previous ISO8859-1 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous UTF-8 char in 'txt'. + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i) +{ + if(i == NULL) return *(txt - 1); /*Get the prev. char*/ + + (*i)--; + uint8_t letter = txt[*i]; + + return letter; +} + +/** + * Convert a character index (in an ISO8859-1 text) to byte index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id) +{ + LV_UNUSED(txt); /*Unused*/ + return utf8_id; /*In Non encoded no difference*/ +} + +/** + * Convert a byte index (in an ISO8859-1 text) to character index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id) +{ + LV_UNUSED(txt); /*Unused*/ + return byte_id; /*In Non encoded no difference*/ +} + +/** + * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. + * E.g.: "ÁBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_text_iso8859_1_get_length(const char * txt) +{ + return lv_strlen(txt); +} +#else + +#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" + +#endif diff --git a/libraries/lvgl/src/misc/lv_text.h b/libraries/lvgl/src/misc/lv_text.h new file mode 100644 index 0000000..b2eddab --- /dev/null +++ b/libraries/lvgl/src/misc/lv_text.h @@ -0,0 +1,336 @@ +/** + * @file lv_text.h + * + */ + +#ifndef LV_TEXT_H +#define LV_TEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include "lv_area.h" +#include "../font/lv_font.h" +#include "../stdlib/lv_sprintf.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_TXT_ENC_UTF8 1 +#define LV_TXT_ENC_ASCII 2 + +/********************** + * TYPEDEFS + **********************/ + +/** + * Options for text rendering. + */ + +enum _lv_text_flag_t { + LV_TEXT_FLAG_NONE = 0x00, + LV_TEXT_FLAG_EXPAND = 0x01, /**< Ignore max-width to avoid automatic word wrapping*/ + LV_TEXT_FLAG_FIT = 0x02, /**< Max-width is already equal to the longest line. (Used to skip some calculation)*/ +}; + +#ifdef DOXYGEN +typedef _lv_text_flag_t lv_text_flag_t; +#else +typedef uint8_t lv_text_flag_t; +#endif /*DOXYGEN*/ + +/** Label align policy*/ +enum _lv_text_align_t { + LV_TEXT_ALIGN_AUTO, /**< Align text auto*/ + LV_TEXT_ALIGN_LEFT, /**< Align text to left*/ + LV_TEXT_ALIGN_CENTER, /**< Align text to center*/ + LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/ +}; + +#ifdef DOXYGEN +typedef _lv_text_align_t lv_text_align_t; +#else +typedef uint8_t lv_text_align_t; +#endif /*DOXYGEN*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get size of a text + * @param size_res pointer to a 'point_t' variable to store the result + * @param text pointer to a text + * @param font pointer to font of the text + * @param letter_space letter space of the text + * @param line_space line space of the text + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid + * @param flag settings for the text from ::lv_text_flag_t + + * line breaks + */ +void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, + int32_t line_space, int32_t max_width, lv_text_flag_t flag); + +/** + * Get the next line of text. Check line length and break chars too. + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid + * line breaks + * @param used_width When used_width != NULL, save the width of this line if + * flag == LV_TEXT_FLAG_NONE, otherwise save -1. + * @param flag settings for the text from 'txt_flag_type' enum + * @return the index of the first char of the new line (in byte index not letter index. With UTF-8 + * they are different) + */ +uint32_t _lv_text_get_next_line(const char * txt, const lv_font_t * font, int32_t letter_space, + int32_t max_width, int32_t * used_width, lv_text_flag_t flag); + +/** + * Give the length of a text with a given font + * @param txt a '\0' terminate string + * @param length length of 'txt' in byte count and not characters (Á is 1 character but 2 bytes in + * UTF-8) + * @param font pointer to a font + * @param letter_space letter space + * @return length of a char_num long text + */ +int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, int32_t letter_space); + +/** + * Insert a string into an other + * @param txt_buf the original text (must be big enough for the result text and NULL terminated) + * @param pos position to insert (0: before the original text, 1: after the first char etc.) + * @param ins_txt text to insert, must be '\0' terminated + */ +void _lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt); + +/** + * Delete a part of a string + * @param txt string to modify, must be '\0' terminated and should point to a heap or stack frame, not read-only memory. + * @param pos position where to start the deleting (0: before the first char, 1: after the first + * char etc.) + * @param len number of characters to delete + */ +void _lv_text_cut(char * txt, uint32_t pos, uint32_t len); + +/** + * return a new formatted text. Memory will be allocated to store the text. + * @param fmt `printf`-like format + * @param ap items to print + + * @return pointer to the allocated text string. + */ +char * _lv_text_set_text_vfmt(const char * fmt, va_list ap) LV_FORMAT_ATTRIBUTE(1, 0); + +/** + * Decode two encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param letter the first decoded Unicode character or 0 on invalid data code + * @param letter_next the second decoded Unicode character or 0 on invalid data code + * @param ofs start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + */ +void _lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs); + +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool _lv_text_is_break_char(uint32_t letter) +{ + uint8_t i; + bool ret = false; + + /*Compare the letter to TXT_BREAK_CHARS*/ + for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { + if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { + ret = true; /*If match then it is break char*/ + break; + } + } + + return ret; +} + +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool _lv_text_is_a_word(uint32_t letter) +{ + /*Cheap check on invalid letter*/ + if(letter == 0) return false; + + /*CJK Unified Ideographs*/ + if(letter >= 0x4E00 && letter <= 0x9FFF) { + return true; + } + + /*Fullwidth ASCII variants*/ + if(letter >= 0xFF01 && letter <= 0xFF5E) { + return true; + } + + /*CJK symbols and punctuation*/ + if(letter >= 0x3000 && letter <= 0x303F) { + return true; + } + + /*CJK Radicals Supplement*/ + if(letter >= 0x2E80 && letter <= 0x2EFF) { + return true; + } + + /*CJK Strokes*/ + if(letter >= 0x31C0 && letter <= 0x31EF) { + return true; + } + + /*Hiragana and Katakana*/ + if(letter >= 0x3040 && letter <= 0x30FF) { + return true; + } + + /*Chinese Vertical Forms*/ + if(letter >= 0xFE10 && letter <= 0xFE1F) { + return true; + } + + /*CJK Compatibility Forms*/ + if(letter >= 0xFE30 && letter <= 0xFE4F) { + return true; + } + + return false; +} + +/** + * Test if character can be treated as marker, and don't need to be rendered. + * Note, this is not a full list. Add your findings to the list. + * + * @param letter a letter + * @return true if so + */ +static inline bool _lv_text_is_marker(uint32_t letter) +{ + if(letter < 0x20) return true; + + /*U+061C ARABIC LETTER MARK, see https://www.compart.com/en/unicode/block/U+0600*/ + if(letter == 0x061C) return true; + + /*U+115F HANGUL CHOSEONG FILLER, See https://www.compart.com/en/unicode/block/U+1100*/ + if(letter == 0x115F) return true; + /*U+1160 HANGUL JUNGSEONG FILLER*/ + if(letter == 0x1160) return true; + + /*See https://www.compart.com/en/unicode/block/U+1800*/ + if(letter >= 0x180B && letter <= 0x180E) return true; + + /*See https://www.compart.com/en/unicode/block/U+2000*/ + if(letter >= 0x200B && letter <= 0x200F) return true; + if(letter >= 0x2028 && letter <= 0x202F) return true; + if(letter >= 0x205F && letter <= 0x206F) return true; + + /*U+FEFF ZERO WIDTH NO-BREAK SPACE, see https://www.compart.com/en/unicode/block/U+FE70*/ + if(letter == 0xFEFF) return true; + + if(letter == 0xF8FF) return true; /*LV_SYMBOL_DUMMY*/ + + return false; +} + +/*************************************************************** + * GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE + ***************************************************************/ + +/** + * Give the size of an encoded character + * @param str pointer to a character in a string + * @return length of the encoded character (1,2,3 ...). O in invalid + */ +extern uint8_t (*_lv_text_encoded_size)(const char *); + +/** + * Convert a Unicode letter to encoded + * @param letter_uni a Unicode letter + * @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ü') + */ +extern uint32_t (*_lv_text_unicode_to_encoded)(uint32_t); + +/** + * Convert a wide character, e.g. 'Á' little endian to be compatible with the encoded format. + * @param c a wide character + * @return `c` in the encoded format + */ +extern uint32_t (*_lv_text_encoded_conv_wc)(uint32_t c); + +/** + * Decode the next encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param i start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid data code + */ +extern uint32_t (*_lv_text_encoded_next)(const char *, uint32_t *); + +/** + * Get the previous encoded character form a string. + * @param txt pointer to '\0' terminated string + * @param i_start index in 'txt' where to start. After the call it will point to the previous + * encoded char in 'txt'. + * @return the decoded Unicode character or 0 on invalid data + */ +extern uint32_t (*_lv_text_encoded_prev)(const char *, uint32_t *); + +/** + * Convert a letter index (in the encoded text) to byte index. + * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param enc_id letter index + * @return byte index of the 'enc_id'th letter + */ +extern uint32_t (*_lv_text_encoded_get_byte_id)(const char *, uint32_t); + +/** + * Convert a byte index (in an encoded text) to character index. + * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +extern uint32_t (*_lv_text_encoded_get_char_id)(const char *, uint32_t); + +/** + * Get the number of characters (and NOT bytes) in a string. + * E.g. in UTF-8 "ÁBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +extern uint32_t (*_lv_text_get_encoded_length)(const char *); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXT_H*/ diff --git a/libraries/lvgl/src/misc/lv_text_ap.c b/libraries/lvgl/src/misc/lv_text_ap.c new file mode 100644 index 0000000..95e0dd7 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_text_ap.c @@ -0,0 +1,301 @@ +/** + * @file lv_text_ap.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_bidi.h" +#include "lv_text.h" +#include "lv_text_ap.h" +#include "../stdlib/lv_mem.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t char_offset; + uint16_t char_end_form; + int8_t char_beginning_form_offset; + int8_t char_middle_form_offset; + int8_t char_isolated_form_offset; + struct { + uint8_t conj_to_previous; + uint8_t conj_to_next; + } ap_chars_conjunction; +} ap_chars_map_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 +static uint32_t lv_ap_get_char_index(uint16_t c); +static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next); +static bool lv_text_is_arabic_vowel(uint16_t c); + +/********************** + * STATIC VARIABLES + **********************/ + +const ap_chars_map_t ap_chars_map[] = { + /*{Key Offset, End, Beginning, Middle, Isolated, {conjunction}}*/ + {1, 0xFE84, -1, 0, -1, {1, 0}}, // أ + {2, 0xFE86, -1, 0, -1, {1, 0}}, // ؤ + {3, 0xFE88, -1, 0, -1, {1, 0}}, // ﺇ + {4, 0xFE8A, 1, 2, -1, {1, 0}}, // ئ + {5, 0xFE8E, -1, 0, -1, {1, 0}}, // آ + {6, 0xFE90, 1, 2, -1, {1, 1}}, // ب + {92, 0xFB57, 1, 2, -1, {1, 1}}, // پ + {8, 0xFE96, 1, 2, -1, {1, 1}}, // ت + {9, 0xFE9A, 1, 2, -1, {1, 1}}, // ث + {10, 0xFE9E, 1, 2, -1, {1, 1}}, // ج + {100, 0xFB7B, 1, 2, -1, {1, 1}}, // چ + {11, 0xFEA2, 1, 2, -1, {1, 1}}, // ح + {12, 0xFEA6, 1, 2, -1, {1, 1}}, // خ + {13, 0xFEAA, -1, 0, -1, {1, 0}}, // د + {14, 0xFEAC, -1, 0, -1, {1, 0}}, // ذ + {15, 0xFEAE, -1, 0, -1, {1, 0}}, // ر + {16, 0xFEB0, -1, 0, -1, {1, 0}}, // ز + {118, 0xFB8B, -1, 0, -1, {1, 0}}, // ژ + {17, 0xFEB2, 1, 2, -1, {1, 1}}, // س + {18, 0xFEB6, 1, 2, -1, {1, 1}}, // ش + {19, 0xFEBA, 1, 2, -1, {1, 1}}, // ص + {20, 0xFEBE, 1, 2, -1, {1, 1}}, // ض + {21, 0xFEC2, 1, 2, -1, {1, 1}}, // ط + {22, 0xFEC6, 1, 2, -1, {1, 1}}, // ظ + {23, 0xFECA, 1, 2, -1, {1, 1}}, // ع + {24, 0xFECE, 1, 2, -1, {1, 1}}, // غ + {30, 0x0640, 0, 0, 0, {1, 1}}, // - (mad, hyphen) + {31, 0xFED2, 1, 2, -1, {1, 1}}, // ف + {32, 0xFED6, 1, 2, -1, {1, 1}}, // ق + {135, 0xFB8F, 1, 2, -1, {1, 1}}, // ک + {33, 0xFEDA, 1, 2, -1, {1, 1}}, // ﻙ + {141, 0xFB93, 1, 2, -1, {1, 1}}, // گ + {34, 0xFEDE, 1, 2, -1, {1, 1}}, // ل + {35, 0xFEE2, 1, 2, -1, {1, 1}}, // م + {36, 0xFEE6, 1, 2, -1, {1, 1}}, // ن + {38, 0xFEEE, -1, 0, -1, {1, 0}}, // و + {37, 0xFEEA, 1, 2, -1, {1, 1}}, // ه + {39, 0xFEF0, 0, 0, -1, {1, 0}}, // ى + {40, 0xFEF2, 1, 2, -1, {1, 1}}, // ي + {170, 0xFBFD, 1, 2, -1, {1, 1}}, // ی + {7, 0xFE94, 1, 2, -1, {1, 0}}, // ة + {206, 0x06F0, 1, 2, -1, {0, 0}}, // ۰ + {207, 0x06F1, 0, 0, 0, {0, 0}}, // ۱ + {208, 0x06F2, 0, 0, 0, {0, 0}}, // ۲ + {209, 0x06F3, 0, 0, 0, {0, 0}}, // ۳ + {210, 0x06F4, 0, 0, 0, {0, 0}}, // ۴ + {211, 0x06F5, 0, 0, 0, {0, 0}}, // ۵ + {212, 0x06F6, 0, 0, 0, {0, 0}}, // ۶ + {213, 0x06F7, 0, 0, 0, {0, 0}}, // ۷ + {214, 0x06F8, 0, 0, 0, {0, 0}}, // ۸ + {215, 0x06F9, 0, 0, 0, {0, 0}}, // ۹ + LV_AP_END_CHARS_LIST +}; +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ +uint32_t _lv_text_ap_calc_bytes_count(const char * txt) +{ + uint32_t txt_length = 0; + uint32_t chars_cnt = 0; + uint32_t current_ap_idx = 0; + uint32_t i, j; + uint32_t ch_enc; + + txt_length = _lv_text_get_encoded_length(txt); + + i = 0; + j = 0; + while(i < txt_length) { + ch_enc = _lv_text_encoded_next(txt, &j); + current_ap_idx = lv_ap_get_char_index(ch_enc); + + if(current_ap_idx != LV_UNDEF_ARABIC_PERSIAN_CHARS) + ch_enc = ap_chars_map[current_ap_idx].char_end_form; + + if(ch_enc < 0x80) + chars_cnt++; + else if(ch_enc < 0x0800) + chars_cnt += 2; + else if(ch_enc < 0x010000) + chars_cnt += 3; + else + chars_cnt += 4; + + i++; + } + + return chars_cnt + 1; +} + +void _lv_text_ap_proc(const char * txt, char * txt_out) +{ + uint32_t txt_length = 0; + uint32_t index_current, idx_next, idx_previous, i, j; + uint32_t * ch_enc; + uint32_t * ch_fin; + char * txt_out_temp; + + txt_length = _lv_text_get_encoded_length(txt); + + ch_enc = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); + ch_fin = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); + + i = 0; + j = 0; + while(j < txt_length) + ch_enc[j++] = _lv_text_encoded_next(txt, &i); + + ch_enc[j] = 0; + + i = 0; + j = 0; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + while(i < txt_length) { + index_current = lv_ap_get_char_index(ch_enc[i]); + idx_next = lv_ap_get_char_index(ch_enc[i + 1]); + + if(lv_text_is_arabic_vowel(ch_enc[i])) { // Current character is a vowel + ch_fin[j] = ch_enc[i]; + i++; + j++; + continue; // Skip this character + } + else if(lv_text_is_arabic_vowel(ch_enc[i + 1])) { // Next character is a vowel + idx_next = lv_ap_get_char_index(ch_enc[i + 2]); // Skip the vowel character to join with the character after it + } + + if(index_current == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + ch_fin[j] = ch_enc[i]; + j++; + i++; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + continue; + } + + uint8_t conjunction_to_previuse = (i == 0 || + idx_previous == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_previous].ap_chars_conjunction.conj_to_next; + uint8_t conjunction_to_next = ((i == txt_length - 1) || + idx_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_next].ap_chars_conjunction.conj_to_previous; + + uint32_t lam_alef = lv_text_lam_alef(index_current, idx_next); + if(lam_alef) { + if(conjunction_to_previuse) { + lam_alef ++; + } + ch_fin[j] = lam_alef; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + i += 2; + j++; + continue; + } + + if(conjunction_to_previuse && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_middle_form_offset; + else if(!conjunction_to_previuse && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_beginning_form_offset; + else if(conjunction_to_previuse && !conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form; + else + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_isolated_form_offset; + idx_previous = index_current; + i++; + j++; + } + ch_fin[j] = 0; + for(i = 0; i < txt_length; i++) + ch_enc[i] = 0; + for(i = 0; i < j; i++) + ch_enc[i] = ch_fin[i]; + lv_free(ch_fin); + + txt_out_temp = txt_out; + i = 0; + + while(i < txt_length) { + if(ch_enc[i] < 0x80) { + *(txt_out_temp++) = ch_enc[i] & 0xFF; + } + else if(ch_enc[i] < 0x0800) { + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x1F) | 0xC0; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x010000) { + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x0F) | 0xE0; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x110000) { + *(txt_out_temp++) = ((ch_enc[i] >> 18) & 0x07) | 0xF0; + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + + i++; + } + *(txt_out_temp) = '\0'; + lv_free(ch_enc); +} +/********************** +* STATIC FUNCTIONS +**********************/ + +static uint32_t lv_ap_get_char_index(uint16_t c) +{ + for(uint8_t i = 0; ap_chars_map[i].char_end_form; i++) { + if(c == (ap_chars_map[i].char_offset + LV_AP_ALPHABET_BASE_CODE)) + return i; + else if(c == ap_chars_map[i].char_end_form //is it an End form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_beginning_form_offset) //is it a Beginning form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_middle_form_offset) //is it a middle form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_isolated_form_offset)) { //is it an isolated form + return i; + } + } + return LV_UNDEF_ARABIC_PERSIAN_CHARS; +} + +static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next) +{ + uint32_t ch_code = 0; + if(ap_chars_map[ch_curr].char_offset != 34) { + return 0; + } + if(ch_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + return 0; + } + ch_code = ap_chars_map[ch_next].char_offset + LV_AP_ALPHABET_BASE_CODE; + if(ch_code == 0x0622) { + return 0xFEF5; // (lam-alef) mad + } + if(ch_code == 0x0623) { + return 0xFEF7; // (lam-alef) top hamza + } + if(ch_code == 0x0625) { + return 0xFEF9; // (lam-alef) bot hamza + } + if(ch_code == 0x0627) { + return 0xFEFB; // (lam-alef) alef + } + return 0; +} + +static bool lv_text_is_arabic_vowel(uint16_t c) +{ + return (c >= 0x064B) && (c <= 0x0652); +} + +#endif diff --git a/libraries/lvgl/src/misc/lv_text_ap.h b/libraries/lvgl/src/misc/lv_text_ap.h new file mode 100644 index 0000000..df6357f --- /dev/null +++ b/libraries/lvgl/src/misc/lv_text_ap.h @@ -0,0 +1,49 @@ +/** + * @file lv_text_ap.h + * + */ + +#ifndef LV_TEXT_AP_H +#define LV_TEXT_AP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_text.h" +#include "../draw/lv_draw.h" + +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + +/********************* + * DEFINES + *********************/ + +#define LV_UNDEF_ARABIC_PERSIAN_CHARS (UINT32_MAX) +#define LV_AP_ALPHABET_BASE_CODE 0x0622 +#define LV_AP_END_CHARS_LIST {0,0,0,0,0,{0,0}} +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +uint32_t _lv_text_ap_calc_bytes_count(const char * txt); +void _lv_text_ap_proc(const char * txt, char * txt_out); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_ARABIC_PERSIAN_CHARS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXT_AP_H*/ diff --git a/libraries/lvgl/src/misc/lv_timer.c b/libraries/lvgl/src/misc/lv_timer.c new file mode 100644 index 0000000..5537e59 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_timer.c @@ -0,0 +1,359 @@ +/** + * @file lv_timer.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_timer.h" +#include "../core/lv_global.h" +#include "../tick/lv_tick.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_sprintf.h" +#include "lv_assert.h" +#include "lv_ll.h" +#include "lv_profiler.h" + +/********************* + * DEFINES + *********************/ + +#define IDLE_MEAS_PERIOD 500 /*[ms]*/ +#define DEF_PERIOD 500 + +#define state LV_GLOBAL_DEFAULT()->timer_state +#define timer_ll_p &(state.timer_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool lv_timer_exec(lv_timer_t * timer); +static uint32_t lv_timer_time_remaining(lv_timer_t * timer); +static void lv_timer_handler_resume(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_TIMER + #define LV_TRACE_TIMER(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_TIMER(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_timer_core_init(void) +{ + _lv_ll_init(timer_ll_p, sizeof(lv_timer_t)); + + /*Initially enable the lv_timer handling*/ + lv_timer_enable(true); +} + +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) +{ + LV_TRACE_TIMER("begin"); + + lv_timer_state_t * state_p = &state; + /*Avoid concurrent running of the timer handler*/ + if(state_p->already_running) { + LV_TRACE_TIMER("already running, concurrent calls are not allow, returning"); + return 1; + } + state_p->already_running = true; + + if(state_p->lv_timer_run == false) { + state_p->already_running = false; /*Release mutex*/ + return 1; + } + + LV_PROFILER_BEGIN; + uint32_t handler_start = lv_tick_get(); + + if(handler_start == 0) { + state.run_cnt++; + if(state.run_cnt > 100) { + state.run_cnt = 0; + LV_LOG_WARN("It seems lv_tick_inc() is not called."); + } + } + + /*Run all timer from the list*/ + lv_timer_t * next; + lv_timer_t * timer_active; + lv_ll_t * timer_head = timer_ll_p; + do { + state_p->timer_deleted = false; + state_p->timer_created = false; + + timer_active = _lv_ll_get_head(timer_head); + while(timer_active) { + /*The timer might be deleted if it runs only once ('repeat_count = 1') + *So get next element until the current is surely valid*/ + next = _lv_ll_get_next(timer_head, timer_active); + + if(lv_timer_exec(timer_active)) { + /*If a timer was created or deleted then this or the next item might be corrupted*/ + if(state_p->timer_created || state_p->timer_deleted) { + LV_TRACE_TIMER("Start from the first timer again because a timer was created or deleted"); + break; + } + } + + timer_active = next; /*Load the next timer*/ + } + } while(timer_active); + + uint32_t time_until_next = LV_NO_TIMER_READY; + next = _lv_ll_get_head(timer_head); + while(next) { + if(!next->paused) { + uint32_t delay = lv_timer_time_remaining(next); + if(delay < time_until_next) + time_until_next = delay; + } + + next = _lv_ll_get_next(timer_head, next); /*Find the next timer*/ + } + + state_p->busy_time += lv_tick_elaps(handler_start); + uint32_t idle_period_time = lv_tick_elaps(state_p->idle_period_start); + if(idle_period_time >= IDLE_MEAS_PERIOD) { + state_p->idle_last = (state_p->busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/ + state_p->idle_last = state_p->idle_last > 100 ? 0 : 100 - state_p->idle_last; /*But we need idle time*/ + state_p->busy_time = 0; + state_p->idle_period_start = lv_tick_get(); + } + + state_p->timer_time_until_next = time_until_next; + state_p->already_running = false; /*Release the mutex*/ + + LV_TRACE_TIMER("finished (%" LV_PRIu32 " ms until the next timer call)", time_until_next); + LV_PROFILER_END; + return time_until_next; +} + +LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void) +{ + lv_timer_state_t * state_p = &state; + if(lv_tick_elaps(state_p->periodic_last_tick) >= state_p->timer_time_until_next) { + LV_TRACE_TIMER("calling lv_timer_handler()"); + lv_timer_handler(); + state_p->periodic_last_tick = lv_tick_get(); + } +} + +lv_timer_t * lv_timer_create_basic(void) +{ + return lv_timer_create(NULL, DEF_PERIOD, NULL); +} + +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data) +{ + lv_timer_t * new_timer = NULL; + + new_timer = _lv_ll_ins_head(timer_ll_p); + LV_ASSERT_MALLOC(new_timer); + if(new_timer == NULL) return NULL; + + new_timer->period = period; + new_timer->timer_cb = timer_xcb; + new_timer->repeat_count = -1; + new_timer->paused = 0; + new_timer->last_run = lv_tick_get(); + new_timer->user_data = user_data; + new_timer->auto_delete = true; + + state.timer_created = true; + + lv_timer_handler_resume(); + + return new_timer; +} + +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb) +{ + LV_ASSERT_NULL(timer); + timer->timer_cb = timer_cb; +} + +void lv_timer_delete(lv_timer_t * timer) +{ + _lv_ll_remove(timer_ll_p, timer); + state.timer_deleted = true; + + lv_free(timer); +} + +void lv_timer_pause(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->paused = true; +} + +void lv_timer_resume(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->paused = false; + lv_timer_handler_resume(); +} + +void lv_timer_set_period(lv_timer_t * timer, uint32_t period) +{ + LV_ASSERT_NULL(timer); + timer->period = period; +} + +void lv_timer_ready(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->last_run = lv_tick_get() - timer->period - 1; +} + +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count) +{ + LV_ASSERT_NULL(timer); + timer->repeat_count = repeat_count; +} + +void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete) +{ + LV_ASSERT_NULL(timer); + timer->auto_delete = auto_delete; +} + +void lv_timer_set_user_data(lv_timer_t * timer, void * user_data) +{ + LV_ASSERT_NULL(timer); + timer->user_data = user_data; +} + +void lv_timer_reset(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->last_run = lv_tick_get(); + lv_timer_handler_resume(); +} + +void lv_timer_enable(bool en) +{ + state.lv_timer_run = en; + if(en) lv_timer_handler_resume(); +} + +void _lv_timer_core_deinit(void) +{ + lv_timer_enable(false); + + _lv_ll_clear(timer_ll_p); +} + +uint32_t lv_timer_get_idle(void) +{ + return state.idle_last; +} + +uint32_t lv_timer_get_time_until_next(void) +{ + return state.timer_time_until_next; +} + +lv_timer_t * lv_timer_get_next(lv_timer_t * timer) +{ + if(timer == NULL) return _lv_ll_get_head(timer_ll_p); + else return _lv_ll_get_next(timer_ll_p, timer); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Execute timer if its remaining time is zero + * @param timer pointer to lv_timer + * @return true: execute, false: not executed + */ +static bool lv_timer_exec(lv_timer_t * timer) +{ + if(timer->paused) return false; + + bool exec = false; + if(lv_timer_time_remaining(timer) == 0) { + /* Decrement the repeat count before executing the timer_cb. + * If any timer is deleted `if(timer->repeat_count == 0)` is not executed below + * but at least the repeat count is zero and the timer can be deleted in the next round*/ + int32_t original_repeat_count = timer->repeat_count; + if(timer->repeat_count > 0) timer->repeat_count--; + timer->last_run = lv_tick_get(); + LV_TRACE_TIMER("calling timer callback: %p", *((void **)&timer->timer_cb)); + + if(timer->timer_cb && original_repeat_count != 0) timer->timer_cb(timer); + + if(!state.timer_deleted) { + LV_TRACE_TIMER("timer callback %p finished", *((void **)&timer->timer_cb)); + } + else { + LV_TRACE_TIMER("timer callback finished"); + } + + LV_ASSERT_MEM_INTEGRITY(); + exec = true; + } + + if(state.timer_deleted == false) { /*The timer might be deleted by itself as well*/ + if(timer->repeat_count == 0) { /*The repeat count is over, delete the timer*/ + if(timer->auto_delete) { + LV_TRACE_TIMER("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); + lv_timer_delete(timer); + } + else { + LV_TRACE_TIMER("pausing timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); + lv_timer_pause(timer); + } + } + } + + return exec; +} + +/** + * Find out how much time remains before a timer must be run. + * @param timer pointer to lv_timer + * @return the time remaining, or 0 if it needs to be run again + */ +static uint32_t lv_timer_time_remaining(lv_timer_t * timer) +{ + /*Check if at least 'period' time elapsed*/ + uint32_t elp = lv_tick_elaps(timer->last_run); + if(elp >= timer->period) + return 0; + return timer->period - elp; +} + +/** + * Call the ready lv_timer + */ +static void lv_timer_handler_resume(void) +{ + /*If there is a timer which is ready to run then resume the timer loop*/ + state.timer_time_until_next = 0; + if(state.resume_cb) { + state.resume_cb(state.resume_data); + } +} + +void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data) +{ + state.resume_cb = cb; + state.resume_data = data; +} diff --git a/libraries/lvgl/src/misc/lv_timer.h b/libraries/lvgl/src/misc/lv_timer.h new file mode 100644 index 0000000..06576a8 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_timer.h @@ -0,0 +1,270 @@ +/** + * @file lv_timer.h + */ + +#ifndef LV_TIMER_H +#define LV_TIMER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../tick/lv_tick.h" +#include "lv_types.h" +#include "lv_ll.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER +#define LV_ATTRIBUTE_TIMER_HANDLER +#endif + +#define LV_NO_TIMER_READY 0xFFFFFFFF + +/********************** + * TYPEDEFS + **********************/ + +/** + * Timers execute this type of functions. + */ +typedef void (*lv_timer_cb_t)(lv_timer_t *); + +/** + * Timer handler resume this type of function. + */ +typedef void (*lv_timer_handler_resume_cb_t)(void * data); + +/** + * Descriptor of a lv_timer + */ +struct _lv_timer_t { + uint32_t period; /**< How often the timer should run*/ + uint32_t last_run; /**< Last time the timer ran*/ + lv_timer_cb_t timer_cb; /**< Timer function*/ + void * user_data; /**< Custom user data*/ + int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times*/ + uint32_t paused : 1; + uint32_t auto_delete : 1; +}; + +typedef struct { + lv_ll_t timer_ll; /*Linked list to store the lv_timers*/ + + bool lv_timer_run; + uint8_t idle_last; + bool timer_deleted; + bool timer_created; + uint32_t timer_time_until_next; + + bool already_running; + uint32_t periodic_last_tick; + uint32_t busy_time; + uint32_t idle_period_start; + uint32_t run_cnt; + + lv_timer_handler_resume_cb_t resume_cb; + void * resume_data; +} lv_timer_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the lv_timer module + */ +void _lv_timer_core_init(void); + +/** + * Deinit the lv_timer module + */ +void _lv_timer_core_deinit(void); + +//! @cond Doxygen_Suppress + +/** + * Call it periodically to handle lv_timers. + * @return time till it needs to be run next (in ms) + */ +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); + +//! @endcond + +/** + * Call it in the super-loop of main() or threads. It will run lv_timer_handler() + * with a given period in ms. You can use it with sleep or delay in OS environment. + * This function is used to simplify the porting. + * @param period the period for running lv_timer_handler() + * @return the time after which it must be called again + */ +static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period) +{ + static uint32_t last_tick = 0; + + if(lv_tick_elaps(last_tick) >= period) { + last_tick = lv_tick_get(); + return lv_timer_handler(); + } + return 1; +} + +/** + * Call it in the super-loop of main() or threads. It will automatically call lv_timer_handler() at the right time. + * This function is used to simplify the porting. + */ +LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void); + +/** + * Set the resume callback to the timer handler + * @param cb the function to call when timer handler is resumed + * @param data pointer to a resume data + */ +void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data); + +/** + * Create an "empty" timer. It needs to be initialized with at least + * `lv_timer_set_cb` and `lv_timer_set_period` + * @return pointer to the created timer + */ +lv_timer_t * lv_timer_create_basic(void); + +/** + * Create a new lv_timer + * @param timer_xcb a callback to call periodically. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param period call period in ms unit + * @param user_data custom parameter + * @return pointer to the new timer + */ +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); + +/** + * Delete a lv_timer + * @param timer pointer to an lv_timer + */ +void lv_timer_delete(lv_timer_t * timer); + +/** + * Pause a timer. + * @param timer pointer to an lv_timer + */ +void lv_timer_pause(lv_timer_t * timer); + +/** + * Resume a timer. + * @param timer pointer to an lv_timer + */ +void lv_timer_resume(lv_timer_t * timer); + +/** + * Set the callback to the timer (the function to call periodically) + * @param timer pointer to a timer + * @param timer_cb the function to call periodically + */ +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb); + +/** + * Set new period for a lv_timer + * @param timer pointer to a lv_timer + * @param period the new period + */ +void lv_timer_set_period(lv_timer_t * timer, uint32_t period); + +/** + * Make a lv_timer ready. It will not wait its period. + * @param timer pointer to a lv_timer. + */ +void lv_timer_ready(lv_timer_t * timer); + +/** + * Set the number of times a timer will repeat. + * @param timer pointer to a lv_timer. + * @param repeat_count -1 : infinity; 0 : stop ; n>0: residual times + */ +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count); + +/** + * Set whether a lv_timer will be deleted automatically when it is called `repeat_count` times. + * @param timer pointer to a lv_timer. + * @param auto_delete true: auto delete; false: timer will be paused when it is called `repeat_count` times. + */ +void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete); + +/** + * Set custom parameter to the lv_timer. + * @param timer pointer to a lv_timer. + * @param user_data custom parameter + */ +void lv_timer_set_user_data(lv_timer_t * timer, void * user_data); + +/** + * Reset a lv_timer. + * It will be called the previously set period milliseconds later. + * @param timer pointer to a lv_timer. + */ +void lv_timer_reset(lv_timer_t * timer); + +/** + * Enable or disable the whole lv_timer handling + * @param en true: lv_timer handling is running, false: lv_timer handling is suspended + */ +void lv_timer_enable(bool en); + +/** + * Get idle percentage + * @return the lv_timer idle in percentage + */ +uint32_t lv_timer_get_idle(void); + +/** + * Get the time remaining until the next timer will run + * @return the time remaining in ms + */ +uint32_t lv_timer_get_time_until_next(void); + +/** + * Iterate through the timers + * @param timer NULL to start iteration or the previous return value to get the next timer + * @return the next timer or NULL if there is no more timer + */ +lv_timer_t * lv_timer_get_next(lv_timer_t * timer); + +/** + * Get the user_data passed when the timer was created + * @param timer pointer to the lv_timer + * @return pointer to the user_data + */ +static inline void * lv_timer_get_user_data(lv_timer_t * timer) +{ + return timer->user_data; +} + +/** + * Get the pause state of a timer + * @param timer pointer to a lv_timer + * @return true: timer is paused; false: timer is running + */ +static inline bool lv_timer_get_paused(lv_timer_t * timer) +{ + return timer->paused; +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/misc/lv_types.h b/libraries/lvgl/src/misc/lv_types.h new file mode 100644 index 0000000..1b992c1 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_types.h @@ -0,0 +1,178 @@ +/** + * @file lv_types.h + * + */ + +#ifndef LV_TYPES_H +#define LV_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#ifndef __ASSEMBLY__ +#include +#endif + +/********************* + * DEFINES + *********************/ + +/*If __UINTPTR_MAX__ or UINTPTR_MAX are available, use them to determine arch size*/ +#if defined(__UINTPTR_MAX__) && __UINTPTR_MAX__ > 0xFFFFFFFF +#define LV_ARCH_64 + +#elif defined(UINTPTR_MAX) && UINTPTR_MAX > 0xFFFFFFFF +#define LV_ARCH_64 + +/*Otherwise use compiler-dependent means to determine arch size*/ +#elif defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__) || defined (__aarch64__) +#define LV_ARCH_64 + +#endif + +/********************** + * TYPEDEFS + **********************/ + +/* Exclude C enum and struct definitions when included by assembly code */ +#ifndef __ASSEMBLY__ + +/** + * LVGL error codes. + */ +enum _lv_result_t { + LV_RESULT_INVALID = 0, /*Typically indicates that the object is deleted (become invalid) in the action + function or an operation was failed*/ + LV_RESULT_OK, /*The object is valid (no deleted) after the action*/ +}; + +#ifdef DOXYGEN +typedef _lv_result_t lv_result_t; +#else +typedef uint8_t lv_result_t; +#endif /*DOXYGEN*/ + +#if defined(__cplusplus) || __STDC_VERSION__ >= 199901L +/*If c99 or newer, use the definition of uintptr_t directly from */ +typedef uintptr_t lv_uintptr_t; +typedef intptr_t lv_intptr_t; + +#else + +/*Otherwise, use the arch size determination*/ +#ifdef LV_ARCH_64 +typedef uint64_t lv_uintptr_t; +typedef int64_t lv_intptr_t; +#else +typedef uint32_t lv_uintptr_t; +typedef int32_t lv_intptr_t; +#endif + +#endif + +#if LV_USE_FLOAT +typedef float lv_value_precise_t; +#else +typedef int32_t lv_value_precise_t; +#endif + +/** + * Typedefs from various lvgl modules. + * They are defined here to avoid circular dependencies. + */ + +struct _lv_obj_t; +typedef struct _lv_obj_t lv_obj_t; + +#ifdef DOXYGEN +typedef _lv_state_t lv_state_t; +typedef _lv_part_t lv_part_t; +typedef _lv_obj_flag_t lv_obj_flag_t; +#else +typedef uint16_t lv_state_t; +typedef uint32_t lv_part_t; +typedef uint32_t lv_obj_flag_t; +#endif /*DOXYGEN*/ + +struct _lv_obj_class_t; +typedef struct _lv_obj_class_t lv_obj_class_t; + +struct _lv_group_t; +typedef struct _lv_group_t lv_group_t; + +#ifdef DOXYGEN +typedef _lv_key_t lv_key_t; +#else +typedef uint8_t lv_key_t; +#endif /*DOXYGEN*/ + +struct _lv_display_t; +typedef struct _lv_display_t lv_display_t; + +struct _lv_layer_t; +typedef struct _lv_layer_t lv_layer_t; +struct _lv_draw_unit_t; +typedef struct _lv_draw_unit_t lv_draw_unit_t; +struct _lv_draw_task_t; +typedef struct _lv_draw_task_t lv_draw_task_t; + +struct _lv_indev_t; +typedef struct _lv_indev_t lv_indev_t; + +struct _lv_event_t; +typedef struct _lv_event_t lv_event_t; + +struct _lv_timer_t; +typedef struct _lv_timer_t lv_timer_t; + +struct _lv_theme_t; +typedef struct _lv_theme_t lv_theme_t; + +struct _lv_anim_t; +typedef struct _lv_anim_t lv_anim_t; + +struct _lv_font_t; +typedef struct _lv_font_t lv_font_t; + +struct _lv_image_decoder_t; +typedef struct _lv_image_decoder_t lv_image_decoder_t; + +#endif /*__ASSEMBLY__*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_UNUSED(x) ((void)x) + +#define _LV_CONCAT(x, y) x ## y +#define LV_CONCAT(x, y) _LV_CONCAT(x, y) + +#define _LV_CONCAT3(x, y, z) x ## y ## z +#define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z) + +#if defined(PYCPARSER) || defined(__CC_ARM) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(gnu_printf, fmtstr, vararg))) +#elif (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(printf, fmtstr, vararg))) +#else +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TYPES_H*/ diff --git a/libraries/lvgl/src/misc/lv_utils.c b/libraries/lvgl/src/misc/lv_utils.c new file mode 100644 index 0000000..2eb02af --- /dev/null +++ b/libraries/lvgl/src/misc/lv_utils.c @@ -0,0 +1,96 @@ +/** + * @file lv_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include + +#include "lv_utils.h" +#include "lv_fs.h" +#include "cache/lv_image_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, + int32_t (*cmp)(const void * pRef, const void * pElement)) +{ + const char * middle; + int32_t c; + + for(middle = base; n != 0;) { + middle += (n / 2) * size; + if((c = (*cmp)(key, middle)) > 0) { + n = (n / 2) - ((n & 1) == 0); + base = (middle += size); + } + else if(c < 0) { + n /= 2; + middle = base; + } + else { + return (char *)middle; + } + } + return NULL; +} + +lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path) +{ + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_WR); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("create file %s failed", path); + return LV_RESULT_INVALID; + } + + /*Image content modified, invalidate image cache.*/ + lv_image_cache_drop(path); + + uint32_t bw; + res = lv_fs_write(&file, &draw_buf->header, sizeof(draw_buf->header), &bw); + if(res != LV_FS_RES_OK || bw != sizeof(draw_buf->header)) { + LV_LOG_ERROR("write draw_buf->header failed"); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + res = lv_fs_write(&file, draw_buf->data, draw_buf->data_size, &bw); + if(res != LV_FS_RES_OK || bw != draw_buf->data_size) { + LV_LOG_ERROR("write draw_buf->data failed"); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + lv_fs_close(&file); + LV_LOG_TRACE("saved draw_buf to %s", path); + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/misc/lv_utils.h b/libraries/lvgl/src/misc/lv_utils.h new file mode 100644 index 0000000..8422cf8 --- /dev/null +++ b/libraries/lvgl/src/misc/lv_utils.h @@ -0,0 +1,70 @@ +/** + * @file lv_utils.h + * + */ + +#ifndef LV_UTILS_H +#define LV_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" +#include "../draw/lv_draw_buf.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** Searches base[0] to base[n - 1] for an item that matches *key. + * + * @note The function cmp must return negative if it's first + * argument (the search key) is less that it's second (a table entry), + * zero if equal, and positive if greater. + * + * @note Items in the array must be in ascending order. + * + * @param key Pointer to item being searched for + * @param base Pointer to first element to search + * @param n Number of elements + * @param size Size of each element + * @param cmp Pointer to comparison function (see #unicode_list_compare as a comparison function + * example) + * + * @return a pointer to a matching item, or NULL if none exists. + */ +void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, + int32_t (*cmp)(const void * pRef, const void * pElement)); + +/** + * Save a draw buf to a file + * @param draw_buf pointer to a draw buffer + * @param path path to the file to save + * @return LV_RES_OK: success; LV_RES_INV: error + */ +lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/osal/lv_cmsis_rtos2.c b/libraries/lvgl/src/osal/lv_cmsis_rtos2.c new file mode 100644 index 0000000..028520f --- /dev/null +++ b/libraries/lvgl/src/osal/lv_cmsis_rtos2.c @@ -0,0 +1,190 @@ +/** + * @file lv_cmsis_rtos2.c + * + */ + +/* + * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_CMSIS_RTOS2 + +#include "../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + static const osPriority_t prio_map[] = { + [LV_THREAD_PRIO_LOWEST] = osPriorityLow, + [LV_THREAD_PRIO_LOW] = osPriorityBelowNormal, + [LV_THREAD_PRIO_MID] = osPriorityNormal, + [LV_THREAD_PRIO_HIGH] = osPriorityHigh, + [LV_THREAD_PRIO_HIGHEST] = osPriorityRealtime7, + }; + + osThreadAttr_t c_tThreadAttribute = { + .stack_size = stack_size, + .priority = prio_map[prio], + }; + + *thread = osThreadNew(callback, user_data, &c_tThreadAttribute); + + if(NULL == *thread) { + LV_LOG_WARN("Error: Failed to create a cmsis-rtos2 thread."); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + osThreadDetach(*thread); + osStatus_t status = osThreadTerminate(*thread); + if(status == osOK) { + return LV_RESULT_OK; + } + return LV_RESULT_INVALID; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + const osMutexAttr_t Thread_Mutex_attr = { + "LVGLMutex", + osMutexRecursive | osMutexPrioInherit | osMutexRobust, + }; + + *mutex = osMutexNew(&Thread_Mutex_attr); + if(*mutex == NULL) { + LV_LOG_WARN("Error: failed to create cmsis-rtos mutex"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexAcquire(*mutex, 0U); + if(status != osOK) { + LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexAcquire(*mutex, 0U); + if(status != osOK) { + LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex in an ISR %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexRelease(*mutex); + if(status != osOK) { + LV_LOG_WARN("Error: failed to release cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexDelete(*mutex); + if(status != osOK) { + LV_LOG_WARN("Error: failed to delete cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + *sync = osEventFlagsNew(NULL); + if(NULL == *sync) { + LV_LOG_WARN("Error: failed to create a cmsis-rtos2 EventFlag"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + uint32_t ret = osEventFlagsWait(*sync, 0x01, osFlagsWaitAny, osWaitForever); + if(ret & (1 << 31)) { + LV_LOG_WARN("Error: failed to wait a cmsis-rtos2 EventFlag %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + uint32_t ret = osEventFlagsSet(*sync, 0x01); + if(ret & (1 << 31)) { + LV_LOG_WARN("Error: failed to set a cmsis-rtos2 EventFlag %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + osStatus_t status = osEventFlagsDelete(*sync); + if(status != osOK) { + LV_LOG_WARN("Error: failed to delete a cmsis-rtos2 EventFlag %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ diff --git a/libraries/lvgl/src/osal/lv_cmsis_rtos2.h b/libraries/lvgl/src/osal/lv_cmsis_rtos2.h new file mode 100644 index 0000000..62481e7 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_cmsis_rtos2.h @@ -0,0 +1,53 @@ +/** + * @file lv_cmsis_rtos2.h + * + */ + +/* + * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef LV_CMSIS_RTOS2_H +#define LV_CMSIS_RTOS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_CMSIS_RTOS2 + +#include "cmsis_os2.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef osThreadId_t lv_thread_t; + +typedef osMutexId_t lv_mutex_t; + +typedef osEventFlagsId_t lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_CMSIS_RTOS2*/ diff --git a/libraries/lvgl/src/osal/lv_freertos.c b/libraries/lvgl/src/osal/lv_freertos.c new file mode 100644 index 0000000..0f7f678 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_freertos.c @@ -0,0 +1,439 @@ +/** + * @file lv_freertos.c + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_FREERTOS + +#if (ESP_PLATFORM) + #include "freertos/atomic.h" +#else + #include "atomic.h" +#endif + +#include "../misc/lv_log.h" +/********************* + * DEFINES + *********************/ + +#define ulMAX_COUNT 10U +#ifndef pcTASK_NAME + #define pcTASK_NAME "lvglDraw" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void prvRunThread(void * pxArg); + +static void prvMutexInit(lv_mutex_t * pxMutex); + +static void prvCheckMutexInit(lv_mutex_t * pxMutex); + +#if !USE_FREERTOS_TASK_NOTIFY +static void prvCondInit(lv_thread_sync_t * pxCond); + +static void prvCheckCondInit(lv_thread_sync_t * pxCond); + +static void prvTestAndDecrement(lv_thread_sync_t * pxCond, + uint32_t ulLocalWaitingThreads); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#if (ESP_PLATFORM) + static portMUX_TYPE critSectionMux = portMUX_INITIALIZER_UNLOCKED; +#endif + +/********************** + * MACROS + **********************/ + +#if (ESP_PLATFORM) + #define _enter_critical() taskENTER_CRITICAL(&critSectionMux); + #define _exit_critical() taskEXIT_CRITICAL(&critSectionMux); +#else + #define _enter_critical() taskENTER_CRITICAL(); + #define _exit_critical() taskEXIT_CRITICAL(); +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * pxThread, lv_thread_prio_t xSchedPriority, + void (*pvStartRoutine)(void *), size_t usStackSize, + void * xAttr) +{ + pxThread->xTaskArg = xAttr; + pxThread->pvStartRoutine = pvStartRoutine; + + BaseType_t xTaskCreateStatus = xTaskCreate( + prvRunThread, + pcTASK_NAME, + (configSTACK_DEPTH_TYPE)(usStackSize / sizeof(StackType_t)), + (void *)pxThread, + tskIDLE_PRIORITY + xSchedPriority, + &pxThread->xTaskHandle); + + /* Ensure that the FreeRTOS task was successfully created. */ + if(xTaskCreateStatus != pdPASS) { + LV_LOG_ERROR("xTaskCreate failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * pxThread) +{ + vTaskDelete(pxThread->xTaskHandle); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xMutexTakeStatus = xSemaphoreTake(pxMutex->xMutex, portMAX_DELAY); + if(xMutexTakeStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + BaseType_t xMutexTakeStatus = xSemaphoreTakeFromISR(pxMutex->xMutex, &xHigherPriorityTaskWoken); + if(xMutexTakeStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake failed!"); + return LV_RESULT_INVALID; + } + + /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch + should be performed to ensure the interrupt returns directly to the highest + priority task. The macro used for this purpose is dependent on the port in + use and may be called portEND_SWITCHING_ISR(). */ + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xMutexGiveStatus = xSemaphoreGive(pxMutex->xMutex); + if(xMutexGiveStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreGive failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * pxMutex) +{ + vSemaphoreDelete(pxMutex->xMutex); + pxMutex->xIsInitialized = pdFALSE; + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * pxCond) +{ +#if USE_FREERTOS_TASK_NOTIFY + /* Store the handle of the calling task. */ + pxCond->xTaskToNotify = xTaskGetCurrentTaskHandle(); +#else + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); +#endif + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * pxCond) +{ + lv_result_t lvRes = LV_RESULT_OK; + +#if USE_FREERTOS_TASK_NOTIFY + LV_UNUSED(pxCond); + + /* Wait for other task to notify this task. */ + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); +#else + uint32_t ulLocalWaitingThreads; + + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); + + /* Acquire the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + while(!pxCond->xSyncSignal) { + /* Increase the counter of threads blocking on condition variable, then + * release the mutex. */ + + /* Atomically increments thread waiting by 1, and + * stores number of threads waiting before increment. */ + ulLocalWaitingThreads = Atomic_Increment_u32(&pxCond->ulWaitingThreads); + + BaseType_t xMutexStatus = xSemaphoreGive(pxCond->xSyncMutex); + + /* Wait on the condition variable. */ + if(xMutexStatus == pdTRUE) { + BaseType_t xCondWaitStatus = xSemaphoreTake( + pxCond->xCondWaitSemaphore, + portMAX_DELAY); + + /* Relock the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + if(xCondWaitStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake(xCondWaitSemaphore) failed!"); + lvRes = LV_RESULT_INVALID; + + /* Atomically decrements thread waiting by 1. + * If iLocalWaitingThreads is updated by other thread(s) in between, + * this implementation guarantees to decrement by 1 based on the + * value currently in pxCond->ulWaitingThreads. */ + prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); + } + } + else { + LV_LOG_ERROR("xSemaphoreGive(xSyncMutex) failed!"); + lvRes = LV_RESULT_INVALID; + + /* Atomically decrements thread waiting by 1. + * If iLocalWaitingThreads is updated by other thread(s) in between, + * this implementation guarantees to decrement by 1 based on the + * value currently in pxCond->ulWaitingThreads. */ + prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); + } + } + + pxCond->xSyncSignal = pdFALSE; + + /* Release the mutex. */ + xSemaphoreGive(pxCond->xSyncMutex); +#endif + + return lvRes; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * pxCond) +{ +#if USE_FREERTOS_TASK_NOTIFY + /* Send a notification to the task waiting. */ + xTaskNotifyGive(pxCond->xTaskToNotify); +#else + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); + + /* Acquire the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + pxCond->xSyncSignal = pdTRUE; + + /* Local copy of number of threads waiting. */ + uint32_t ulLocalWaitingThreads = pxCond->ulWaitingThreads; + + /* Test local copy of threads waiting is larger than zero. */ + while(ulLocalWaitingThreads > 0) { + /* Atomically check whether the copy in memory has changed. + * If not, set the copy of threads waiting in memory to zero. */ + if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( + &pxCond->ulWaitingThreads, + 0, + ulLocalWaitingThreads)) { + /* Unblock all. */ + for(uint32_t i = 0; i < ulLocalWaitingThreads; i++) { + xSemaphoreGive(pxCond->xCondWaitSemaphore); + } + + break; + } + + /* Local copy is out dated. Reload from memory and retry. */ + ulLocalWaitingThreads = pxCond->ulWaitingThreads; + } + + /* Release the mutex. */ + xSemaphoreGive(pxCond->xSyncMutex); +#endif + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * pxCond) +{ +#if USE_FREERTOS_TASK_NOTIFY + LV_UNUSED(pxCond); +#else + /* Cleanup all resources used by the cond. */ + vSemaphoreDelete(pxCond->xCondWaitSemaphore); + vSemaphoreDelete(pxCond->xSyncMutex); + pxCond->ulWaitingThreads = 0; + pxCond->xSyncSignal = pdFALSE; + pxCond->xIsInitialized = pdFALSE; +#endif + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void prvRunThread(void * pxArg) +{ + lv_thread_t * pxThread = (lv_thread_t *)pxArg; + + /* Run the thread routine. */ + pxThread->pvStartRoutine((void *)pxThread->xTaskArg); + + vTaskDelete(NULL); +} + +static void prvMutexInit(lv_mutex_t * pxMutex) +{ + pxMutex->xMutex = xSemaphoreCreateMutex(); + + /* Ensure that the FreeRTOS mutex was successfully created. */ + if(pxMutex->xMutex == NULL) { + LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); + return; + } + + /* Mutex successfully created. */ + pxMutex->xIsInitialized = pdTRUE; +} + +static void prvCheckMutexInit(lv_mutex_t * pxMutex) +{ + /* Check if the mutex needs to be initialized. */ + if(pxMutex->xIsInitialized == pdFALSE) { + /* Mutex initialization must be in a critical section to prevent two threads + * from initializing it at the same time. */ + _enter_critical(); + + /* Check again that the mutex is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if(pxMutex->xIsInitialized == pdFALSE) { + prvMutexInit(pxMutex); + } + + /* Exit the critical section. */ + _exit_critical(); + } +} + +#if !USE_FREERTOS_TASK_NOTIFY +static void prvCondInit(lv_thread_sync_t * pxCond) +{ + pxCond->xCondWaitSemaphore = xSemaphoreCreateCounting(ulMAX_COUNT, 0U); + + /* Ensure that the FreeRTOS semaphore was successfully created. */ + if(pxCond->xCondWaitSemaphore == NULL) { + LV_LOG_ERROR("xSemaphoreCreateCounting failed!"); + return; + } + + pxCond->xSyncMutex = xSemaphoreCreateMutex(); + + /* Ensure that the FreeRTOS mutex was successfully created. */ + if(pxCond->xSyncMutex == NULL) { + LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); + /* Cleanup. */ + vSemaphoreDelete(pxCond->xCondWaitSemaphore); + return; + } + + /* Condition variable successfully created. */ + pxCond->ulWaitingThreads = 0; + pxCond->xSyncSignal = pdFALSE; + pxCond->xIsInitialized = pdTRUE; +} + +static void prvCheckCondInit(lv_thread_sync_t * pxCond) +{ + BaseType_t xSemCreateStatus = pdTRUE; + + /* Check if the condition variable needs to be initialized. */ + if(pxCond->xIsInitialized == pdFALSE) { + /* Cond initialization must be in a critical section to prevent two + * threads from initializing it at the same time. */ + _enter_critical(); + + /* Check again that the condition is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if(pxCond->xIsInitialized == pdFALSE) { + prvCondInit(pxCond); + } + + /* Exit the critical section. */ + _exit_critical(); + } +} + +static void prvTestAndDecrement(lv_thread_sync_t * pxCond, + uint32_t ulLocalWaitingThreads) +{ + /* Test local copy of threads waiting is larger than zero. */ + while(ulLocalWaitingThreads > 0) { + /* Atomically check whether the copy in memory has changed. + * If not, decrease the copy of threads waiting in memory. */ + if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( + &pxCond->ulWaitingThreads, + ulLocalWaitingThreads - 1, + ulLocalWaitingThreads)) { + /* Signal one succeeded. Break. */ + break; + } + + /* Local copy may be out dated. Reload from memory and retry. */ + ulLocalWaitingThreads = pxCond->ulWaitingThreads; + } +} +#endif + +#endif /*LV_USE_OS == LV_OS_FREERTOS*/ diff --git a/libraries/lvgl/src/osal/lv_freertos.h b/libraries/lvgl/src/osal/lv_freertos.h new file mode 100644 index 0000000..0935006 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_freertos.h @@ -0,0 +1,90 @@ +/** + * @file lv_freertos.h + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_FREERTOS_H +#define LV_FREERTOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_FREERTOS + +#if (ESP_PLATFORM) +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#else +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* + * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM + * than unblocking a task using an intermediary object such as a binary semaphore. + * + * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. + */ +#define USE_FREERTOS_TASK_NOTIFY 1 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void (*pvStartRoutine)(void *); /**< Application thread function. */ + void * xTaskArg; /**< Arguments for application thread function. */ + TaskHandle_t xTaskHandle; /**< FreeRTOS task handle. */ +} lv_thread_t; + +typedef struct { + BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */ + SemaphoreHandle_t xMutex; /**< FreeRTOS mutex. */ +} lv_mutex_t; + +typedef struct { +#if USE_FREERTOS_TASK_NOTIFY + TaskHandle_t xTaskToNotify; +#else + BaseType_t + xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */ + SemaphoreHandle_t xCondWaitSemaphore; /**< Threads block on this semaphore in lv_thread_sync_wait. */ + uint32_t ulWaitingThreads; /**< The number of threads currently waiting on this condition variable. */ + SemaphoreHandle_t xSyncMutex; /**< Threads take this mutex before accessing the condition variable. */ + BaseType_t xSyncSignal; /**< Set to pdTRUE if the thread is signaled, pdFALSE otherwise. */ +#endif +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_FREERTOS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FREERTOS_H*/ diff --git a/libraries/lvgl/src/osal/lv_os.h b/libraries/lvgl/src/osal/lv_os.h new file mode 100644 index 0000000..9b3254f --- /dev/null +++ b/libraries/lvgl/src/osal/lv_os.h @@ -0,0 +1,155 @@ +/** + * @file lv_os.h + * + */ + +#ifndef LV_OS_H +#define LV_OS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * OS OPTIONS + *********************/ + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include + +#if LV_USE_OS == LV_OS_NONE +#include "lv_os_none.h" +#elif LV_USE_OS == LV_OS_PTHREAD +#include "lv_pthread.h" +#elif LV_USE_OS == LV_OS_FREERTOS +#include "lv_freertos.h" +#elif LV_USE_OS == LV_OS_CMSIS_RTOS2 +#include "lv_cmsis_rtos2.h" +#elif LV_USE_OS == LV_OS_RTTHREAD +#include "lv_rtthread.h" +#elif LV_USE_OS == LV_OS_WINDOWS +#include "lv_windows.h" +#elif LV_USE_OS == LV_OS_CUSTOM +#include LV_OS_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_THREAD_PRIO_LOWEST, + LV_THREAD_PRIO_LOW, + LV_THREAD_PRIO_MID, + LV_THREAD_PRIO_HIGH, + LV_THREAD_PRIO_HIGHEST, +} lv_thread_prio_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*---------------------------------------- + * These functions needs to be implemented + * for specific operating systems + *---------------------------------------*/ + +/** + * Create a new thread + * @param thread a variable in which the thread will be stored + * @param prio priority of the thread + * @param callback function of the thread + * @param stack_size stack size in bytes + * @param user_data arbitrary data, will be available in the callback + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data); + +/** + * Delete a thread + * @param thread the thread to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_delete(lv_thread_t * thread); + +/** + * Create a mutex + * @param mutex a variable in which the thread will be stored + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_init(lv_mutex_t * mutex); + +/** + * Lock a mutex + * @param mutex the mutex to lock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_lock(lv_mutex_t * mutex); + +/** + * Lock a mutex from interrupt + * @param mutex the mutex to lock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex); + +/** + * Unlock a mutex + * @param mutex the mutex to unlock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex); + +/** + * Delete a mutex + * @param mutex the mutex to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_delete(lv_mutex_t * mutex); + +/** + * Create a thread synchronization object + * @param sync a variable in which the sync will be stored + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync); + +/** + * Wait for a "signal" on a sync object + * @param sync a sync object + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync); + +/** + * Send a wake-up signal to a sync object + * @param sync a sync object + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync); + +/** + * Delete a sync object + * @param sync a sync object to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_H*/ diff --git a/libraries/lvgl/src/osal/lv_os_none.c b/libraries/lvgl/src/osal/lv_os_none.c new file mode 100644 index 0000000..4e044d0 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_os_none.c @@ -0,0 +1,120 @@ +/** + * @file lv_os_none.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_NONE +#include "../misc/lv_types.h" +#include "../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + LV_UNUSED(thread); + LV_UNUSED(callback); + LV_UNUSED(prio); + LV_UNUSED(stack_size); + LV_UNUSED(user_data); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + LV_UNUSED(thread); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + LV_ASSERT(0); + return LV_RESULT_INVALID; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_NONE*/ diff --git a/libraries/lvgl/src/osal/lv_os_none.h b/libraries/lvgl/src/osal/lv_os_none.h new file mode 100644 index 0000000..e08a0dc --- /dev/null +++ b/libraries/lvgl/src/osal/lv_os_none.h @@ -0,0 +1,43 @@ +/** + * @file lv_os_none.h + * + */ + +#ifndef LV_OS_NONE_H +#define LV_OS_NONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_NONE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef int lv_mutex_t; +typedef int lv_thread_t; +typedef int lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_NONE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_NONE_H*/ diff --git a/libraries/lvgl/src/osal/lv_pthread.c b/libraries/lvgl/src/osal/lv_pthread.c new file mode 100644 index 0000000..68676c9 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_pthread.c @@ -0,0 +1,164 @@ +/** + * @file lv_pthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_PTHREAD + +#include +#include "../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * generic_callback(void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + LV_UNUSED(prio); + LV_UNUSED(stack_size); + thread->callback = callback; + thread->user_data = user_data; + pthread_create(&thread->thread, NULL, generic_callback, thread); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + int ret = pthread_join(thread->thread, NULL); + if(ret != 0) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_init(mutex, NULL); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_lock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_lock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_unlock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + pthread_mutex_destroy(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + pthread_mutex_init(&sync->mutex, 0); + pthread_cond_init(&sync->cond, 0); + sync->v = false; + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + pthread_mutex_lock(&sync->mutex); + while(!sync->v) { + pthread_cond_wait(&sync->cond, &sync->mutex); + } + sync->v = false; + pthread_mutex_unlock(&sync->mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + pthread_mutex_lock(&sync->mutex); + sync->v = true; + pthread_cond_signal(&sync->cond); + pthread_mutex_unlock(&sync->mutex); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + pthread_mutex_destroy(&sync->mutex); + pthread_cond_destroy(&sync->cond); + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * generic_callback(void * user_data) +{ + lv_thread_t * thread = user_data; + thread->callback(thread->user_data); + return NULL; +} + +#endif /*LV_USE_OS == LV_OS_PTHREAD*/ diff --git a/libraries/lvgl/src/osal/lv_pthread.h b/libraries/lvgl/src/osal/lv_pthread.h new file mode 100644 index 0000000..e7abc90 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_pthread.h @@ -0,0 +1,57 @@ +/** + * @file lv_pthread.h + * + */ + +#ifndef LV_PTHREAD_H +#define LV_PTHREAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_PTHREAD + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + pthread_t thread; + void (*callback)(void *); + void * user_data; +} lv_thread_t; + +typedef pthread_mutex_t lv_mutex_t; + +typedef struct { + pthread_mutex_t mutex; + pthread_cond_t cond; + bool v; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_PTHREAD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PTHREAD_H*/ diff --git a/libraries/lvgl/src/osal/lv_rtthread.c b/libraries/lvgl/src/osal/lv_rtthread.c new file mode 100644 index 0000000..39f78d7 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_rtthread.c @@ -0,0 +1,184 @@ +/** + * @file lv_rtthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_RTTHREAD + +#include "../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +#define THREAD_TIMESLICE 20U + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data) +{ + thread->thread = rt_thread_create("thread", + callback, + user_data, + stack_size, + prio, + THREAD_TIMESLICE); + rt_err_t ret = rt_thread_startup(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + rt_err_t ret = rt_thread_delete(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + mutex->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); + if(mutex->mutex == RT_NULL) { + LV_LOG_WARN("create mutex failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_release(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_delete(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + sync->sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); + if(sync->sem == RT_NULL) { + LV_LOG_WARN("create semaphore failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_take(sync->sem, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_release(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_delete(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ diff --git a/libraries/lvgl/src/osal/lv_rtthread.h b/libraries/lvgl/src/osal/lv_rtthread.h new file mode 100644 index 0000000..255a47a --- /dev/null +++ b/libraries/lvgl/src/osal/lv_rtthread.h @@ -0,0 +1,54 @@ +/** + * @file lv_rtthread.h + * + */ + +#ifndef LV_RTTHREAD_H +#define LV_RTTHREAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_RTTHREAD + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + rt_thread_t thread; +} lv_thread_t; + +typedef struct { + rt_mutex_t mutex; +} lv_mutex_t; + +typedef struct { + rt_sem_t sem; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RTTHREAD_H*/ diff --git a/libraries/lvgl/src/osal/lv_windows.c b/libraries/lvgl/src/osal/lv_windows.c new file mode 100644 index 0000000..0d6a33d --- /dev/null +++ b/libraries/lvgl/src/osal/lv_windows.c @@ -0,0 +1,215 @@ +/** + * @file lv_windows.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_os.h" + +#if LV_USE_OS == LV_OS_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void (*callback)(void *); + void * user_data; +} lv_thread_init_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static unsigned __stdcall thread_start_routine(void * parameter); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init( + lv_thread_t * thread, + lv_thread_prio_t prio, + void (*callback)(void *), + size_t stack_size, + void * user_data) +{ + if(!thread) { + return LV_RESULT_INVALID; + } + + static const int prio_map[] = { + [LV_THREAD_PRIO_LOWEST] = THREAD_PRIORITY_LOWEST, + [LV_THREAD_PRIO_LOW] = THREAD_PRIORITY_BELOW_NORMAL, + [LV_THREAD_PRIO_MID] = THREAD_PRIORITY_NORMAL, + [LV_THREAD_PRIO_HIGH] = THREAD_PRIORITY_ABOVE_NORMAL, + [LV_THREAD_PRIO_HIGHEST] = THREAD_PRIORITY_HIGHEST, + }; + + lv_thread_init_data_t * init_data = + (lv_thread_init_data_t *)(malloc( + sizeof(lv_thread_init_data_t))); + if(!init_data) { + return LV_RESULT_INVALID; + } + init_data->callback = callback; + init_data->user_data = user_data; + + /* + Reference: https://learn.microsoft.com/en-us/windows/win32/api + /processthreadsapi/nf-processthreadsapi-createthread + + A thread in an executable that calls the C run-time library (CRT) should + use the _beginthreadex and _endthreadex functions for thread management + rather than CreateThread and ExitThread; this requires the use of the + multithreaded version of the CRT. If a thread created using CreateThread + calls the CRT, the CRT may terminate the process in low-memory conditions. + */ + *thread = (HANDLE)(_beginthreadex( + NULL, + (unsigned)(stack_size), + thread_start_routine, + init_data, + 0, + NULL)); + if(!*thread) { + return LV_RESULT_INVALID; + } + + /* + Try to set the thread priority. (Not mandatory for creating a new thread.) + */ + SetThreadPriority(*thread, prio_map[prio]); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + lv_result_t result = LV_RESULT_OK; + + if(!TerminateThread(thread, 0)) { + result = LV_RESULT_INVALID; + } + + CloseHandle(thread); + + return result; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + InitializeCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + EnterCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + EnterCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + LeaveCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + DeleteCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + InitializeCriticalSection(&sync->cs); + InitializeConditionVariable(&sync->cv); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + EnterCriticalSection(&sync->cs); + while(!sync->v) { + SleepConditionVariableCS(&sync->cv, &sync->cs, INFINITE); + } + sync->v = false; + LeaveCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + EnterCriticalSection(&sync->cs); + sync->v = true; + WakeConditionVariable(&sync->cv); + LeaveCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + DeleteCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static unsigned __stdcall thread_start_routine(void * parameter) +{ + lv_thread_init_data_t * init_data = (lv_thread_init_data_t *)(parameter); + if(init_data) { + init_data->callback(init_data->user_data); + free(init_data); + } + + return 0; +} + +#endif /*LV_USE_OS == LV_OS_WINDOWS*/ diff --git a/libraries/lvgl/src/osal/lv_windows.h b/libraries/lvgl/src/osal/lv_windows.h new file mode 100644 index 0000000..fd930e8 --- /dev/null +++ b/libraries/lvgl/src/osal/lv_windows.h @@ -0,0 +1,54 @@ +/** + * @file lv_windows.h + * + */ + +#ifndef LV_WINDOWS_H +#define LV_WINDOWS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_OS == LV_OS_WINDOWS + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef HANDLE lv_thread_t; + +typedef CRITICAL_SECTION lv_mutex_t; + +typedef struct { + CRITICAL_SECTION cs; + CONDITION_VARIABLE cv; + bool v; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_WINDOWS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_H*/ diff --git a/libraries/lvgl/src/others/file_explorer/lv_file_explorer.c b/libraries/lvgl/src/others/file_explorer/lv_file_explorer.c new file mode 100644 index 0000000..40a7a38 --- /dev/null +++ b/libraries/lvgl/src/others/file_explorer/lv_file_explorer.c @@ -0,0 +1,706 @@ +/** + * @file lv_file_explorer.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_file_explorer.h" +#if LV_USE_FILE_EXPLORER != 0 + +#include "../../lvgl.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_file_explorer_class) + +#define FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH (22) +#define FILE_EXPLORER_BROWSER_AREA_WIDTH (100 - FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH) + +#define quick_access_list_button_style (LV_GLOBAL_DEFAULT()->fe_list_button_style) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +static void browser_file_event_handler(lv_event_t * e); +#if LV_FILE_EXPLORER_QUICK_ACCESS + static void quick_access_event_handler(lv_event_t * e); + static void quick_access_area_event_handler(lv_event_t * e); +#endif + +static void init_style(lv_obj_t * obj); +static void show_dir(lv_obj_t * obj, const char * path); +static void strip_ext(char * dir); +static void file_explorer_sort(lv_obj_t * obj); +static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi); +static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j); +static bool is_end_with(const char * str1, const char * str2); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_file_explorer_class = { + .constructor_cb = lv_file_explorer_constructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_file_explorer_t), + .base_class = &lv_obj_class, + .name = "file-explorer", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_file_explorer_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ +#if LV_FILE_EXPLORER_QUICK_ACCESS +void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + /*If path is unavailable */ + if((path == NULL) || (lv_strlen(path) <= 0)) return; + + char ** dir_str = NULL; + switch(dir) { + case LV_EXPLORER_HOME_DIR: + dir_str = &(explorer->home_dir); + break; + case LV_EXPLORER_MUSIC_DIR: + dir_str = &(explorer->music_dir); + break; + case LV_EXPLORER_PICTURES_DIR: + dir_str = &(explorer->pictures_dir); + break; + case LV_EXPLORER_VIDEO_DIR: + dir_str = &(explorer->video_dir); + break; + case LV_EXPLORER_DOCS_DIR: + dir_str = &(explorer->docs_dir); + break; + case LV_EXPLORER_FS_DIR: + dir_str = &(explorer->fs_dir); + break; + + default: + return; + break; + } + + /*Free the old text*/ + if(*dir_str != NULL) { + lv_free(*dir_str); + *dir_str = NULL; + } + + /*Allocate space for the new text*/ + *dir_str = lv_strdup(path); +} + +#endif + +void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + explorer->sort = sort; + + file_explorer_sort(obj); +} + +/*===================== + * Getter functions + *====================*/ +const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->sel_fn; +} + +const char * lv_file_explorer_get_current_path(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->current_path; +} + +lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->file_table; +} + +lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->head_area; +} + +lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->path_label; +} + +#if LV_FILE_EXPLORER_QUICK_ACCESS +lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->quick_access_area; +} + +lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->list_places; +} + +lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->list_device; +} + +#endif + +lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->sort; +} + +/*===================== + * Other functions + *====================*/ +void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + show_dir(obj, dir); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + +#if LV_FILE_EXPLORER_QUICK_ACCESS + explorer->home_dir = NULL; + explorer->video_dir = NULL; + explorer->pictures_dir = NULL; + explorer->music_dir = NULL; + explorer->docs_dir = NULL; + explorer->fs_dir = NULL; +#endif + + explorer->sort = LV_EXPLORER_SORT_NONE; + + lv_memzero(explorer->current_path, sizeof(explorer->current_path)); + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + explorer->cont = lv_obj_create(obj); + lv_obj_set_width(explorer->cont, LV_PCT(100)); + lv_obj_set_flex_grow(explorer->cont, 1); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Quick access bar area on the left*/ + explorer->quick_access_area = lv_obj_create(explorer->cont); + lv_obj_set_size(explorer->quick_access_area, LV_PCT(FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH), LV_PCT(100)); + lv_obj_set_flex_flow(explorer->quick_access_area, LV_FLEX_FLOW_COLUMN); + lv_obj_add_event_cb(explorer->quick_access_area, quick_access_area_event_handler, LV_EVENT_ALL, + explorer); +#endif + + /*File table area on the right*/ + explorer->browser_area = lv_obj_create(explorer->cont); +#if LV_FILE_EXPLORER_QUICK_ACCESS + lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); +#else + lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); +#endif + lv_obj_set_flex_flow(explorer->browser_area, LV_FLEX_FLOW_COLUMN); + + /*The area displayed above the file browse list(head)*/ + explorer->head_area = lv_obj_create(explorer->browser_area); + lv_obj_set_size(explorer->head_area, LV_PCT(100), LV_PCT(14)); + lv_obj_remove_flag(explorer->head_area, LV_OBJ_FLAG_SCROLLABLE); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Two lists of quick access bar*/ + lv_obj_t * btn; + /*list 1*/ + explorer->list_device = lv_list_create(explorer->quick_access_area); + lv_obj_set_size(explorer->list_device, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_device, "DEVICE"), lv_palette_main(LV_PALETTE_ORANGE), 0); + + btn = lv_list_add_button(explorer->list_device, NULL, LV_SYMBOL_DRIVE " File System"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + + /*list 2*/ + explorer->list_places = lv_list_create(explorer->quick_access_area); + lv_obj_set_size(explorer->list_places, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_places, "PLACES"), lv_palette_main(LV_PALETTE_LIME), 0); + + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_HOME " HOME"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_VIDEO " Video"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_IMAGE " Pictures"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_AUDIO " Music"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_FILE " Documents"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); +#endif + + /*Show current path*/ + explorer->path_label = lv_label_create(explorer->head_area); + lv_label_set_text(explorer->path_label, LV_SYMBOL_EYE_OPEN"https://lvgl.io"); + lv_obj_center(explorer->path_label); + + /*Table showing the contents of the table of contents*/ + explorer->file_table = lv_table_create(explorer->browser_area); + lv_obj_set_size(explorer->file_table, LV_PCT(100), LV_PCT(86)); + lv_table_set_column_width(explorer->file_table, 0, LV_PCT(100)); + lv_table_set_column_count(explorer->file_table, 1); + lv_obj_add_event_cb(explorer->file_table, browser_file_event_handler, LV_EVENT_ALL, obj); + + /*only scroll up and down*/ + lv_obj_set_scroll_dir(explorer->file_table, LV_DIR_TOP | LV_DIR_BOTTOM); + + /*Initialize style*/ + init_style(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void init_style(lv_obj_t * obj) +{ + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + /*lv_file_explorer obj style*/ + lv_obj_set_style_radius(obj, 0, 0); + lv_obj_set_style_bg_color(obj, lv_color_hex(0xf2f1f6), 0); + + /*main container style*/ + lv_obj_set_style_radius(explorer->cont, 0, 0); + lv_obj_set_style_bg_opa(explorer->cont, LV_OPA_0, 0); + lv_obj_set_style_border_width(explorer->cont, 0, 0); + lv_obj_set_style_outline_width(explorer->cont, 0, 0); + lv_obj_set_style_pad_column(explorer->cont, 0, 0); + lv_obj_set_style_pad_row(explorer->cont, 0, 0); + lv_obj_set_style_flex_flow(explorer->cont, LV_FLEX_FLOW_ROW, 0); + lv_obj_set_style_pad_all(explorer->cont, 0, 0); + lv_obj_set_style_layout(explorer->cont, LV_LAYOUT_FLEX, 0); + + /*head cont style*/ + lv_obj_set_style_radius(explorer->head_area, 0, 0); + lv_obj_set_style_border_width(explorer->head_area, 0, 0); + lv_obj_set_style_pad_top(explorer->head_area, 0, 0); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Quick access bar container style*/ + lv_obj_set_style_pad_all(explorer->quick_access_area, 0, 0); + lv_obj_set_style_pad_row(explorer->quick_access_area, 20, 0); + lv_obj_set_style_radius(explorer->quick_access_area, 0, 0); + lv_obj_set_style_border_width(explorer->quick_access_area, 1, 0); + lv_obj_set_style_outline_width(explorer->quick_access_area, 0, 0); + lv_obj_set_style_bg_color(explorer->quick_access_area, lv_color_hex(0xf2f1f6), 0); +#endif + + /*File browser container style*/ + lv_obj_set_style_pad_all(explorer->browser_area, 0, 0); + lv_obj_set_style_pad_row(explorer->browser_area, 0, 0); + lv_obj_set_style_radius(explorer->browser_area, 0, 0); + lv_obj_set_style_border_width(explorer->browser_area, 0, 0); + lv_obj_set_style_outline_width(explorer->browser_area, 0, 0); + lv_obj_set_style_bg_color(explorer->browser_area, lv_color_hex(0xffffff), 0); + + /*Style of the table in the browser container*/ + lv_obj_set_style_bg_color(explorer->file_table, lv_color_hex(0xffffff), 0); + lv_obj_set_style_pad_all(explorer->file_table, 0, 0); + lv_obj_set_style_radius(explorer->file_table, 0, 0); + lv_obj_set_style_border_width(explorer->file_table, 0, 0); + lv_obj_set_style_outline_width(explorer->file_table, 0, 0); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Style of the list in the quick access bar*/ + lv_obj_set_style_border_width(explorer->list_device, 0, 0); + lv_obj_set_style_outline_width(explorer->list_device, 0, 0); + lv_obj_set_style_radius(explorer->list_device, 0, 0); + lv_obj_set_style_pad_all(explorer->list_device, 0, 0); + + lv_obj_set_style_border_width(explorer->list_places, 0, 0); + lv_obj_set_style_outline_width(explorer->list_places, 0, 0); + lv_obj_set_style_radius(explorer->list_places, 0, 0); + lv_obj_set_style_pad_all(explorer->list_places, 0, 0); + + /*Style of the quick access list btn in the quick access bar*/ + lv_style_init(&quick_access_list_button_style); + lv_style_set_border_width(&quick_access_list_button_style, 0); + lv_style_set_bg_color(&quick_access_list_button_style, lv_color_hex(0xf2f1f6)); + + uint32_t i, j; + for(i = 0; i < lv_obj_get_child_count(explorer->quick_access_area); i++) { + lv_obj_t * child = lv_obj_get_child(explorer->quick_access_area, i); + if(lv_obj_check_type(child, &lv_list_class)) { + for(j = 0; j < lv_obj_get_child_count(child); j++) { + lv_obj_t * list_child = lv_obj_get_child(child, j); + if(lv_obj_check_type(list_child, &lv_list_button_class)) { + lv_obj_add_style(list_child, &quick_access_list_button_style, 0); + } + } + } + } +#endif + +} + +#if LV_FILE_EXPLORER_QUICK_ACCESS +static void quick_access_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * btn = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + if(code == LV_EVENT_CLICKED) { + char ** path = NULL; + lv_obj_t * label = lv_obj_get_child(btn, -1); + char * label_text = lv_label_get_text(label); + + if((lv_strcmp(label_text, LV_SYMBOL_HOME " HOME") == 0)) { + path = &(explorer->home_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_VIDEO " Video") == 0)) { + path = &(explorer->video_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_IMAGE " Pictures") == 0)) { + path = &(explorer->pictures_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_AUDIO " Music") == 0)) { + path = &(explorer->music_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_FILE " Documents") == 0)) { + path = &(explorer->docs_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_DRIVE " File System") == 0)) { + path = &(explorer->fs_dir); + } + + if(path != NULL) + show_dir(obj, *path); + } +} + +static void quick_access_area_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * area = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + if(code == LV_EVENT_LAYOUT_CHANGED) { + if(lv_obj_has_flag(area, LV_OBJ_FLAG_HIDDEN)) + lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); + else + lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); + } +} +#endif + +static void browser_file_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + if(code == LV_EVENT_VALUE_CHANGED) { + char file_name[LV_FILE_EXPLORER_PATH_MAX_LEN]; + const char * str_fn = NULL; + uint32_t row; + uint32_t col; + + lv_memzero(file_name, sizeof(file_name)); + lv_table_get_selected_cell(explorer->file_table, &row, &col); + str_fn = lv_table_get_cell_value(explorer->file_table, row, col); + + str_fn = str_fn + 5; + if((lv_strcmp(str_fn, ".") == 0)) return; + + if((lv_strcmp(str_fn, "..") == 0) && (lv_strlen(explorer->current_path) > 3)) { + strip_ext(explorer->current_path); + /*Remove the last '/' character*/ + strip_ext(explorer->current_path); + lv_snprintf((char *)file_name, sizeof(file_name), "%s", explorer->current_path); + } + else { + if(lv_strcmp(str_fn, "..") != 0) { + lv_snprintf((char *)file_name, sizeof(file_name), "%s%s", explorer->current_path, str_fn); + } + } + + lv_fs_dir_t dir; + if(lv_fs_dir_open(&dir, file_name) == LV_FS_RES_OK) { + lv_fs_dir_close(&dir); + show_dir(obj, (char *)file_name); + } + else { + if(lv_strcmp(str_fn, "..") != 0) { + explorer->sel_fn = str_fn; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + } + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_table_set_column_width(explorer->file_table, 0, lv_obj_get_width(explorer->file_table)); + } + else if((code == LV_EVENT_CLICKED) || (code == LV_EVENT_RELEASED)) { + lv_obj_send_event(obj, LV_EVENT_CLICKED, NULL); + } +} + +static void show_dir(lv_obj_t * obj, const char * path) +{ + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + char fn[LV_FILE_EXPLORER_PATH_MAX_LEN]; + uint16_t index = 0; + lv_fs_dir_t dir; + lv_fs_res_t res; + + res = lv_fs_dir_open(&dir, path); + if(res != LV_FS_RES_OK) { + LV_LOG_USER("Open dir error %d!", res); + return; + } + + lv_table_set_cell_value_fmt(explorer->file_table, index++, 0, LV_SYMBOL_DIRECTORY " %s", "."); + lv_table_set_cell_value_fmt(explorer->file_table, index++, 0, LV_SYMBOL_DIRECTORY " %s", ".."); + lv_table_set_cell_value(explorer->file_table, 0, 1, "0"); + lv_table_set_cell_value(explorer->file_table, 1, 1, "0"); + + while(1) { + res = lv_fs_dir_read(&dir, fn, sizeof(fn)); + if(res != LV_FS_RES_OK) { + LV_LOG_USER("Driver, file or directory is not exists %d!", res); + break; + } + + /*fn is empty, if not more files to read*/ + if(lv_strlen(fn) == 0) { + LV_LOG_USER("Not more files to read!"); + break; + } + + if((is_end_with(fn, ".png") == true) || (is_end_with(fn, ".PNG") == true) || \ + (is_end_with(fn, ".jpg") == true) || (is_end_with(fn, ".JPG") == true) || \ + (is_end_with(fn, ".bmp") == true) || (is_end_with(fn, ".BMP") == true) || \ + (is_end_with(fn, ".gif") == true) || (is_end_with(fn, ".GIF") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_IMAGE " %s", fn); + lv_table_set_cell_value(explorer->file_table, index, 1, "1"); + } + else if((is_end_with(fn, ".mp3") == true) || (is_end_with(fn, ".MP3") == true) || \ + (is_end_with(fn, ".wav") == true) || (is_end_with(fn, ".WAV") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_AUDIO " %s", fn); + lv_table_set_cell_value(explorer->file_table, index, 1, "2"); + } + else if((is_end_with(fn, ".mp4") == true) || (is_end_with(fn, ".MP4") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_VIDEO " %s", fn); + lv_table_set_cell_value(explorer->file_table, index, 1, "3"); + } + else if((is_end_with(fn, ".") == true) || (is_end_with(fn, "..") == true)) { + /*is dir*/ + continue; + } + else if(fn[0] == '/') {/*is dir*/ + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_DIRECTORY " %s", fn + 1); + lv_table_set_cell_value(explorer->file_table, index, 1, "0"); + } + else { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_FILE " %s", fn); + lv_table_set_cell_value(explorer->file_table, index, 1, "4"); + } + + index++; + } + + lv_fs_dir_close(&dir); + + lv_table_set_row_count(explorer->file_table, index); + file_explorer_sort(obj); + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + + /*Move the table to the top*/ + lv_obj_scroll_to_y(explorer->file_table, 0, LV_ANIM_OFF); + + lv_memzero(explorer->current_path, sizeof(explorer->current_path)); + lv_strncpy(explorer->current_path, path, sizeof(explorer->current_path) - 1); + lv_label_set_text_fmt(explorer->path_label, LV_SYMBOL_EYE_OPEN" %s", path); + + size_t current_path_len = lv_strlen(explorer->current_path); + if((*((explorer->current_path) + current_path_len) != '/') && (current_path_len < LV_FILE_EXPLORER_PATH_MAX_LEN)) { + *((explorer->current_path) + current_path_len) = '/'; + } +} + +/*Remove the specified suffix*/ +static void strip_ext(char * dir) +{ + char * end = dir + lv_strlen(dir); + + while(end >= dir && *end != '/') { + --end; + } + + if(end > dir) { + *end = '\0'; + } + else if(end == dir) { + *(end + 1) = '\0'; + } +} + +static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j) +{ + const char * tmp; + tmp = lv_table_get_cell_value(tb, i, 0); + lv_table_set_cell_value(tb, 0, 2, tmp); + lv_table_set_cell_value(tb, i, 0, lv_table_get_cell_value(tb, j, 0)); + lv_table_set_cell_value(tb, j, 0, lv_table_get_cell_value(tb, 0, 2)); + + tmp = lv_table_get_cell_value(tb, i, 1); + lv_table_set_cell_value(tb, 0, 2, tmp); + lv_table_set_cell_value(tb, i, 1, lv_table_get_cell_value(tb, j, 1)); + lv_table_set_cell_value(tb, j, 1, lv_table_get_cell_value(tb, 0, 2)); +} + +static void file_explorer_sort(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + uint16_t sum = lv_table_get_row_count(explorer->file_table); + + if(sum > 1) { + switch(explorer->sort) { + case LV_EXPLORER_SORT_NONE: + break; + case LV_EXPLORER_SORT_KIND: + sort_by_file_kind(explorer->file_table, 0, (sum - 1)); + break; + default: + break; + } + } +} + +/*Quick sort 3 way*/ +static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi) +{ + if(lo >= hi) return; + + int16_t lt = lo; + int16_t i = lo + 1; + int16_t gt = hi; + const char * v = lv_table_get_cell_value(tb, lo, 1); + while(i <= gt) { + if(lv_strcmp(lv_table_get_cell_value(tb, i, 1), v) < 0) + exch_table_item(tb, lt++, i++); + else if(lv_strcmp(lv_table_get_cell_value(tb, i, 1), v) > 0) + exch_table_item(tb, i, gt--); + else + i++; + } + + sort_by_file_kind(tb, lo, lt - 1); + sort_by_file_kind(tb, gt + 1, hi); +} + +static bool is_end_with(const char * str1, const char * str2) +{ + if(str1 == NULL || str2 == NULL) + return false; + + uint16_t len1 = lv_strlen(str1); + uint16_t len2 = lv_strlen(str2); + if((len1 < len2) || (len1 == 0 || len2 == 0)) + return false; + + while(len2 >= 1) { + if(str2[len2 - 1] != str1[len1 - 1]) + return false; + + len2--; + len1--; + } + + return true; +} + +#endif /*LV_USE_FILE_EXPLORER*/ diff --git a/libraries/lvgl/src/others/file_explorer/lv_file_explorer.h b/libraries/lvgl/src/others/file_explorer/lv_file_explorer.h new file mode 100644 index 0000000..9d1c3cc --- /dev/null +++ b/libraries/lvgl/src/others/file_explorer/lv_file_explorer.h @@ -0,0 +1,192 @@ +/** + * @file lv_file_explorer.h + * + */ + +#ifndef LV_FILE_EXPLORER_H +#define LV_FILE_EXPLORER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_FILE_EXPLORER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_EXPLORER_SORT_NONE, + LV_EXPLORER_SORT_KIND, +} lv_file_explorer_sort_t; + +#if LV_FILE_EXPLORER_QUICK_ACCESS +typedef enum { + LV_EXPLORER_HOME_DIR, + LV_EXPLORER_MUSIC_DIR, + LV_EXPLORER_PICTURES_DIR, + LV_EXPLORER_VIDEO_DIR, + LV_EXPLORER_DOCS_DIR, + LV_EXPLORER_FS_DIR, +} lv_file_explorer_dir_t; +#endif + +/*Data of canvas*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * cont; + lv_obj_t * head_area; + lv_obj_t * browser_area; + lv_obj_t * file_table; + lv_obj_t * path_label; +#if LV_FILE_EXPLORER_QUICK_ACCESS + lv_obj_t * quick_access_area; + lv_obj_t * list_device; + lv_obj_t * list_places; + char * home_dir; + char * music_dir; + char * pictures_dir; + char * video_dir; + char * docs_dir; + char * fs_dir; +#endif + const char * sel_fn; + char current_path[LV_FILE_EXPLORER_PATH_MAX_LEN]; + lv_file_explorer_sort_t sort; +} lv_file_explorer_t; + +extern const lv_obj_class_t lv_file_explorer_class; + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_file_explorer_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +#if LV_FILE_EXPLORER_QUICK_ACCESS +/** + * Set file_explorer + * @param obj pointer to a label object + * @param dir the dir from 'lv_file_explorer_dir_t' enum. + * @param path path + + */ +void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path); +#endif + +/** + * Set file_explorer sort + * @param obj pointer to a file explorer object + * @param sort the sort from 'lv_file_explorer_sort_t' enum. + */ +void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get file explorer Selected file + * @param obj pointer to a file explorer object + * @return pointer to the file explorer selected file name + */ +const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj); + +/** + * Get file explorer cur path + * @param obj pointer to a file explorer object + * @return pointer to the file explorer cur path + */ +const char * lv_file_explorer_get_current_path(const lv_obj_t * obj); + +/** + * Get file explorer head area obj + * @param obj pointer to a file explorer object + * @return pointer to the file explorer head area obj(lv_obj) + */ +lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj); + +/** + * Get file explorer head area obj + * @param obj pointer to a file explorer object + * @return pointer to the file explorer quick access area obj(lv_obj) + */ +lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj); + +/** + * Get file explorer path obj(label) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer path obj(lv_label) + */ +lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj); + +#if LV_FILE_EXPLORER_QUICK_ACCESS +/** + * Get file explorer places list obj(lv_list) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer places list obj(lv_list) + */ +lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj); + +/** + * Get file explorer device list obj(lv_list) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer device list obj(lv_list) + */ +lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj); +#endif + +/** + * Get file explorer file list obj(lv_table) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer file table obj(lv_table) + */ +lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj); + +/** + * Set file_explorer sort + * @param obj pointer to a file explorer object + * @return the current mode from 'lv_file_explorer_sort_t' + */ +lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Open a specified path + * @param obj pointer to a file explorer object + * @param dir pointer to the path + */ +void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FILE_EXPLORER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FILE_EXPLORER_H*/ diff --git a/libraries/lvgl/src/others/fragment/README.md b/libraries/lvgl/src/others/fragment/README.md new file mode 100644 index 0000000..e69de29 diff --git a/libraries/lvgl/src/others/fragment/lv_fragment.c b/libraries/lvgl/src/others/fragment/lv_fragment.c new file mode 100644 index 0000000..c04b3e8 --- /dev/null +++ b/libraries/lvgl/src/others/fragment/lv_fragment.c @@ -0,0 +1,155 @@ +/** + * @file lv_fragment.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT +#include "../../stdlib/lv_string.h" + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void cb_delete_assertion(lv_event_t * event); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args) +{ + LV_ASSERT_NULL(cls); + LV_ASSERT_NULL(cls->create_obj_cb); + LV_ASSERT(cls->instance_size >= sizeof(lv_fragment_t)); + lv_fragment_t * instance = lv_malloc_zeroed(cls->instance_size); + instance->cls = cls; + instance->child_manager = lv_fragment_manager_create(instance); + if(cls->constructor_cb) { + cls->constructor_cb(instance, args); + } + return instance; +} + +void lv_fragment_delete(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + if(fragment->managed) { + lv_fragment_manager_remove(fragment->managed->manager, fragment); + return; + } + if(fragment->obj) { + lv_fragment_delete_obj(fragment); + } + /* Objects will leak if this function called before objects deleted */ + const lv_fragment_class_t * cls = fragment->cls; + if(cls->destructor_cb) { + cls->destructor_cb(fragment); + } + lv_fragment_manager_delete(fragment->child_manager); + lv_free(fragment); +} + +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->manager; +} + +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->container; +} + +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return lv_fragment_manager_get_parent_fragment(fragment->managed->manager); +} + +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container) +{ + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + states->destroying_obj = false; + } + const lv_fragment_class_t * cls = fragment->cls; + lv_obj_t * obj = cls->create_obj_cb(fragment, container); + LV_ASSERT_NULL(obj); + fragment->obj = obj; + lv_fragment_manager_create_obj(fragment->child_manager); + if(states) { + states->obj_created = true; + lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL); + } + if(cls->obj_created_cb) { + cls->obj_created_cb(fragment, obj); + } + return obj; +} + +void lv_fragment_delete_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + lv_fragment_manager_delete_obj(fragment->child_manager); + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + if(!states->obj_created) return; + states->destroying_obj = true; + + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(fragment->obj); + bool cb_removed = false; + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(fragment->obj, i); + if(lv_event_dsc_get_cb(event_dsc) == cb_delete_assertion) { + cb_removed = lv_obj_remove_event(fragment->obj, i); + break; + } + } + + LV_ASSERT(cb_removed); + } + LV_ASSERT_NULL(fragment->obj); + const lv_fragment_class_t * cls = fragment->cls; + if(cls->obj_will_delete_cb) { + cls->obj_will_delete_cb(fragment, fragment->obj); + } + lv_obj_delete(fragment->obj); + if(cls->obj_deleted_cb) { + cls->obj_deleted_cb(fragment, fragment->obj); + } + if(states) { + states->obj_created = false; + } + fragment->obj = NULL; +} + +void lv_fragment_recreate_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + lv_fragment_delete_obj(fragment); + lv_fragment_create_obj(fragment, *fragment->managed->container); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cb_delete_assertion(lv_event_t * event) +{ + LV_UNUSED(event); + LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj"); +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/libraries/lvgl/src/others/fragment/lv_fragment.h b/libraries/lvgl/src/others/fragment/lv_fragment.h new file mode 100644 index 0000000..593b5b5 --- /dev/null +++ b/libraries/lvgl/src/others/fragment/lv_fragment.h @@ -0,0 +1,335 @@ +/** + * Public header for Fragment + * @file lv_fragment.h + */ + +#ifndef LV_FRAGMENT_H +#define LV_FRAGMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_FRAGMENT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_fragment_manager_t lv_fragment_manager_t; + +typedef struct _lv_fragment_t lv_fragment_t; +typedef struct _lv_fragment_class_t lv_fragment_class_t; +typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t; + +struct _lv_fragment_t { + /** + * Class of this fragment + */ + const lv_fragment_class_t * cls; + /** + * Managed fragment states. If not null, then this fragment is managed. + * + * @warning Don't modify values inside this struct! + */ + lv_fragment_managed_states_t * managed; + /** + * Child fragment manager + */ + lv_fragment_manager_t * child_manager; + /** + * lv_obj returned by create_obj_cb + */ + lv_obj_t * obj; + +}; + +struct _lv_fragment_class_t { + /** + * Constructor function for fragment class + * @param self Fragment instance + * @param args Arguments assigned by fragment manager + */ + void (*constructor_cb)(lv_fragment_t * self, void * args); + + /** + * Destructor function for fragment class + * @param self Fragment instance, will be freed after this call + */ + void (*destructor_cb)(lv_fragment_t * self); + + /** + * Fragment attached to manager + * @param self Fragment instance + */ + void (*attached_cb)(lv_fragment_t * self); + + /** + * Fragment detached from manager + * @param self Fragment instance + */ + void (*detached_cb)(lv_fragment_t * self); + + /** + * Create objects + * @param self Fragment instance + * @param container Container of the objects should be created upon + * @return Created object, NULL if multiple objects has been created + */ + lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container); + + /** + * + * @param self Fragment instance + * @param obj lv_obj returned by create_obj_cb + */ + void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called before objects in the fragment will be deleted. + * + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called when the object created by fragment received `LV_EVENT_DELETE` event + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Handle event + * @param self Fragment instance + * @param which User-defined ID of event + * @param data1 User-defined data + * @param data2 User-defined data + */ + bool (*event_cb)(lv_fragment_t * self, int code, void * userdata); + + /** + * *REQUIRED*: Allocation size of fragment + */ + size_t instance_size; +}; + +/** + * Fragment states + */ +struct _lv_fragment_managed_states_t { + /** + * Class of the fragment + */ + const lv_fragment_class_t * cls; + /** + * Manager the fragment attached to + */ + lv_fragment_manager_t * manager; + /** + * Container object the fragment adding view to + */ + lv_obj_t * const * container; + /** + * Fragment instance + */ + lv_fragment_t * instance; + /** + * true between `create_obj_cb` and `obj_deleted_cb` + */ + bool obj_created; + /** + * true before `lv_fragment_delete_obj` is called. Don't touch any object if this is true + */ + bool destroying_obj; + /** + * true if this fragment is in navigation stack that can be popped + */ + bool in_stack; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create fragment manager instance + * @param parent Parent fragment if this manager is placed inside another fragment, can be null. + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent); + +/** + * Destroy fragment manager instance + * @param manager Fragment manager instance + */ +void lv_fragment_manager_delete(lv_fragment_manager_t * manager); + +/** + * Create object of all fragments managed by this manager. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager); + +/** + * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager); + +/** + * Attach fragment to manager, and add to container. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Detach and destroy fragment. If fragment is in navigation stack, remove from it. + * @param manager Fragment manager instance + * @param fragment Fragment instance + */ +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment); + +/** + * Attach fragment to manager and add to navigation stack. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Remove the top-most fragment for stack + * @param manager Fragment manager instance + * @return true if there is fragment to pop + */ +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager); + +/** + * Replace fragment. Old item in the stack will be removed. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/** + * Send event to top-most fragment + * @param manager Fragment manager instance + * @param code User-defined ID of event + * @param userdata User-defined data + * @return true if fragment returned true + */ +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata); + +/** + * Get stack size of this fragment manager + * @param manager Fragment manager instance + * @return Stack size of this fragment manager + */ +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager); + +/** + * Get top most fragment instance + * @param manager Fragment manager instance + * @return Top most fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager); + +/** + * Find first fragment instance in the container + * @param manager Fragment manager instance + * @param container Container which target fragment added to + * @return First fragment instance in the container + */ +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container); + +/** + * Get parent fragment + * @param manager Fragment manager instance + * @return Parent fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager); + +/** + * Create a fragment instance. + * + * @param cls Fragment class. This fragment must return non null object. + * @param args Arguments assigned by fragment manager + * @return Fragment instance + */ +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args); + +/** + * Destroy a fragment. + * @param fragment Fragment instance. + */ +void lv_fragment_delete(lv_fragment_t * fragment); + +/** + * Get associated manager of this fragment + * @param fragment Fragment instance + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment); + +/** + * Get container object of this fragment + * @param fragment Fragment instance + * @return Reference to container object + */ +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment); + +/** + * Get parent fragment of this fragment + * @param fragment Fragment instance + * @return Parent fragment + */ +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment); + +/** + * Create object by fragment. + * + * @param fragment Fragment instance. + * @param container Container of the objects should be created upon. + * @return Created object + */ +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container); + +/** + * Delete created object of a fragment + * + * @param fragment Fragment instance. + */ +void lv_fragment_delete_obj(lv_fragment_t * fragment); + +/** + * Destroy obj in fragment, and recreate them. + * @param fragment Fragment instance + */ +void lv_fragment_recreate_obj(lv_fragment_t * fragment); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FRAGMENT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FRAGMENT_H*/ diff --git a/libraries/lvgl/src/others/fragment/lv_fragment_manager.c b/libraries/lvgl/src/others/fragment/lv_fragment_manager.c new file mode 100644 index 0000000..73b0c9d --- /dev/null +++ b/libraries/lvgl/src/others/fragment/lv_fragment_manager.c @@ -0,0 +1,279 @@ +/** + * @file lv_fragment_manager.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT + +#include "../../misc/lv_ll.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_fragment_stack_item_t { + lv_fragment_managed_states_t * states; +} lv_fragment_stack_item_t; + +struct _lv_fragment_manager_t { + lv_fragment_t * parent; + /** + * Linked list to store attached fragments + */ + lv_ll_t attached; + /** + * Linked list to store fragments in stack + */ + lv_ll_t stack; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item); + +static void item_delete_obj(lv_fragment_managed_states_t * item); + +static void item_delete_fragment(lv_fragment_managed_states_t * item); + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent) +{ + lv_fragment_manager_t * instance = lv_malloc_zeroed(sizeof(lv_fragment_manager_t)); + instance->parent = parent; + _lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); + _lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); + return instance; +} + +void lv_fragment_manager_delete(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states; + _LV_LL_READ_BACK(&manager->attached, states) { + item_delete_obj(states); + item_delete_fragment(states); + } + _lv_ll_clear(&manager->attached); + _lv_ll_clear(&manager->stack); + lv_free(manager); +} + +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + lv_fragment_managed_states_t * states = NULL; + _LV_LL_READ(&manager->attached, states) { + if(states->in_stack && top->states != states) { + /*Only create obj for top item in stack*/ + continue; + } + item_create_obj(states); + } +} + +void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states = NULL; + _LV_LL_READ_BACK(&manager->attached, states) { + item_delete_obj(states); + } +} + +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + if(!manager->parent || manager->parent->managed->obj_created) { + item_create_obj(states); + } +} + +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + LV_ASSERT(fragment->managed->manager == manager); + lv_fragment_managed_states_t * states = fragment->managed; + lv_fragment_managed_states_t * prev = NULL; + bool was_top = false; + if(states->in_stack) { + void * stack_top = _lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * item = NULL; + _LV_LL_READ_BACK(&manager->stack, item) { + if(item->states == states) { + was_top = stack_top == item; + void * stack_prev = _lv_ll_get_prev(&manager->stack, item); + if(!stack_prev) break; + prev = ((lv_fragment_stack_item_t *) stack_prev)->states; + break; + } + } + if(item) { + _lv_ll_remove(&manager->stack, item); + lv_free(item); + } + } + item_delete_obj(states); + item_delete_fragment(states); + _lv_ll_remove(&manager->attached, states); + lv_free(states); + if(prev && was_top) { + item_create_obj(prev); + } +} + +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + if(top != NULL) { + item_delete_obj(top->states); + } + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + states->in_stack = true; + /*Add fragment to the top of the stack*/ + lv_fragment_stack_item_t * item = _lv_ll_ins_tail(&manager->stack); + lv_memzero(item, sizeof(lv_fragment_stack_item_t)); + item->states = states; + item_create_obj(states); +} + +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager) +{ + lv_fragment_t * top = lv_fragment_manager_get_top(manager); + if(top == NULL) return false; + lv_fragment_manager_remove(manager, top); + return true; +} + +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container); + if(top != NULL) { + lv_fragment_manager_remove(manager, top); + } + lv_fragment_manager_add(manager, fragment, container); +} + +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * p = NULL; + _LV_LL_READ_BACK(&manager->attached, p) { + if(!p->obj_created || p->destroying_obj) continue; + lv_fragment_t * instance = p->instance; + if(!instance) continue; + if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; + if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true; + } + return false; +} + +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return _lv_ll_get_len(&manager->stack); +} + +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager) +{ + LV_ASSERT(manager); + lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack); + if(!top)return NULL; + return top->states->instance; +} + +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container) +{ + LV_ASSERT(manager); + lv_fragment_managed_states_t * states; + _LV_LL_READ(&manager->attached, states) { + if(*states->container == container) return states->instance; + } + return NULL; +} + +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return manager->parent; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item) +{ + LV_ASSERT(item->instance); + lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL); +} + +static void item_delete_obj(lv_fragment_managed_states_t * item) +{ + lv_fragment_delete_obj(item->instance); +} + +/** + * Detach, then destroy fragment + * @param item fragment states + */ +static void item_delete_fragment(lv_fragment_managed_states_t * item) +{ + lv_fragment_t * instance = item->instance; + if(instance->cls->detached_cb) { + instance->cls->detached_cb(instance); + } + instance->managed = NULL; + lv_fragment_delete(instance); + item->instance = NULL; +} + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + LV_ASSERT(manager); + LV_ASSERT(fragment); + LV_ASSERT(fragment->managed == NULL); + lv_fragment_managed_states_t * states = _lv_ll_ins_tail(&manager->attached); + lv_memzero(states, sizeof(lv_fragment_managed_states_t)); + states->cls = fragment->cls; + states->manager = manager; + states->container = container; + states->instance = fragment; + fragment->managed = states; + if(fragment->cls->attached_cb) { + fragment->cls->attached_cb(fragment); + } + return states; +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/libraries/lvgl/src/others/gridnav/lv_gridnav.c b/libraries/lvgl/src/others/gridnav/lv_gridnav.c new file mode 100644 index 0000000..f49c62d --- /dev/null +++ b/libraries/lvgl/src/others/gridnav/lv_gridnav.c @@ -0,0 +1,397 @@ +/** + * @file lv_gridnav.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gridnav.h" +#if LV_USE_GRIDNAV + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_gridnav_ctrl_t ctrl; + lv_obj_t * focused_obj; +} lv_gridnav_dsc_t; + +typedef enum { + FIND_LEFT, + FIND_RIGHT, + FIND_TOP, + FIND_BOTTOM, + FIND_NEXT_ROW_FIRST_ITEM, + FIND_PREV_ROW_LAST_ITEM, + FIND_FIRST_ROW, + FIND_LAST_ROW, +} find_mode_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void gridnav_event_cb(lv_event_t * e); +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode); +static lv_obj_t * find_first_focusable(lv_obj_t * obj); +static lv_obj_t * find_last_focusable(lv_obj_t * obj); +static bool obj_is_focuable(lv_obj_t * obj); +static int32_t get_x_center(lv_obj_t * obj); +static int32_t get_y_center(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl) +{ + lv_gridnav_remove(obj); /*Be sure to not add gridnav twice*/ + + lv_gridnav_dsc_t * dsc = lv_malloc(sizeof(lv_gridnav_dsc_t)); + LV_ASSERT_MALLOC(dsc); + dsc->ctrl = ctrl; + dsc->focused_obj = NULL; + lv_obj_add_event_cb(obj, gridnav_event_cb, LV_EVENT_ALL, dsc); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); +} + +void lv_gridnav_remove(lv_obj_t * obj) +{ + lv_event_dsc_t * event_dsc = NULL; + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t i; + for(i = 0; i < event_cnt; i++) { + event_dsc = lv_obj_get_event_dsc(obj, i); + if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { + lv_free(lv_event_dsc_get_user_data(event_dsc)); + lv_obj_remove_event(obj, i); + break; + } + } + +} + +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en) +{ + LV_ASSERT_NULL(to_focus); + + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(cont); + lv_gridnav_dsc_t * dsc = NULL; + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(cont, i); + if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { + dsc = lv_event_dsc_get_user_data(event_dsc); + break; + } + } + + if(dsc == NULL) { + LV_LOG_WARN("`cont` is not a gridnav container"); + return; + } + + if(obj_is_focuable(to_focus) == false) { + LV_LOG_WARN("The object to focus is not focusable"); + return; + } + + if(dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + } + + lv_obj_add_state(to_focus, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(to_focus, anim_en); + dsc->focused_obj = to_focus; + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void gridnav_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_gridnav_dsc_t * dsc = lv_event_get_user_data(e); + lv_event_code_t code = lv_event_get_code(e); + + if(code == LV_EVENT_KEY) { + uint32_t child_cnt = lv_obj_get_child_count(obj); + if(child_cnt == 0) return; + + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj == NULL) return; + + uint32_t key = lv_event_get_key(e); + lv_obj_t * guess = NULL; + + if(key == LV_KEY_RIGHT) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_right(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, -d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_RIGHT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_NEXT_ROW_FIRST_ITEM); + if(guess == NULL) guess = find_first_focusable(obj); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_LEFT) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_left(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_LEFT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_PREV_ROW_LAST_ITEM); + if(guess == NULL) guess = find_last_focusable(obj); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_DOWN) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_bottom(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, -d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_BOTTOM); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_FIRST_ROW); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_UP) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_top(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_TOP); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_LAST_ROW); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + lv_obj_send_event(dsc->focused_obj, LV_EVENT_KEY, &key); + } + } + + if(guess && guess != dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_add_state(guess, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(guess, LV_ANIM_ON); + dsc->focused_obj = guess; + } + } + else if(code == LV_EVENT_FOCUSED) { + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj) { + lv_obj_add_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_remove_state(dsc->focused_obj, LV_STATE_PRESSED); /*Be sure the focuses obj is not stuck in pressed state*/ + lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + if(dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + } + } + else if(code == LV_EVENT_CHILD_CREATED) { + lv_obj_t * child = lv_event_get_target(e); + if(lv_obj_get_parent(child) == obj) { + if(dsc->focused_obj == NULL) { + dsc->focused_obj = child; + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_obj_add_state(child, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_scroll_to_view(child, LV_ANIM_OFF); + } + } + } + } + else if(code == LV_EVENT_CHILD_DELETED) { + /*This event bubble, so be sure this object's child was deleted. + *As we don't know which object was deleted we can't make the next focused. + *So make the first object focused*/ + lv_obj_t * target = lv_event_get_target(e); + if(target == obj) { + dsc->focused_obj = find_first_focusable(obj); + } + } + else if(code == LV_EVENT_DELETE) { + lv_gridnav_remove(obj); + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED || code == LV_EVENT_LONG_PRESSED_REPEAT || + code == LV_EVENT_CLICKED || code == LV_EVENT_RELEASED) { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + /*Forward press/release related event too*/ + lv_indev_type_t t = lv_indev_get_type(lv_indev_active()); + if(t == LV_INDEV_TYPE_ENCODER || t == LV_INDEV_TYPE_KEYPAD) { + lv_obj_send_event(dsc->focused_obj, code, lv_indev_active()); + } + } + } +} + +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode) +{ + int32_t x_start = get_x_center(start_child); + int32_t y_start = get_y_center(start_child); + uint32_t child_cnt = lv_obj_get_child_count(obj); + lv_obj_t * guess = NULL; + int32_t x_err_guess = LV_COORD_MAX; + int32_t y_err_guess = LV_COORD_MAX; + int32_t h_half = lv_obj_get_height(start_child) / 2; + int32_t h_max = lv_obj_get_height(obj) + lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == start_child) continue; + if(obj_is_focuable(child) == false) continue; + + int32_t x_err = 0; + int32_t y_err = 0; + switch(mode) { + case FIND_LEFT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err >= 0) continue; /*It's on the right*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_RIGHT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err <= 0) continue; /*It's on the left*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_TOP: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + break; + case FIND_BOTTOM: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + break; + case FIND_NEXT_ROW_FIRST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + x_err = lv_obj_get_x(child); + break; + case FIND_PREV_ROW_LAST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + x_err = obj->coords.x2 - child->coords.x2; + break; + case FIND_FIRST_ROW: + x_err = get_x_center(child) - x_start; + y_err = lv_obj_get_y(child); + break; + case FIND_LAST_ROW: + x_err = get_x_center(child) - x_start; + y_err = h_max - lv_obj_get_y(child); + } + + if(guess == NULL || + (y_err * y_err + x_err * x_err < y_err_guess * y_err_guess + x_err_guess * x_err_guess)) { + guess = child; + x_err_guess = x_err; + y_err_guess = y_err; + } + } + return guess; +} + +static lv_obj_t * find_first_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_count(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focuable(child)) return child; + + } + return NULL; +} + +static lv_obj_t * find_last_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_count(obj); + int32_t i; + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focuable(child)) return child; + } + return NULL; +} + +static bool obj_is_focuable(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE)) return true; + else return false; +} + +static int32_t get_x_center(lv_obj_t * obj) +{ + return obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; +} + +static int32_t get_y_center(lv_obj_t * obj) +{ + return obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; +} + +#endif /*LV_USE_GRIDNAV*/ diff --git a/libraries/lvgl/src/others/gridnav/lv_gridnav.h b/libraries/lvgl/src/others/gridnav/lv_gridnav.h new file mode 100644 index 0000000..29b86fc --- /dev/null +++ b/libraries/lvgl/src/others/gridnav/lv_gridnav.h @@ -0,0 +1,123 @@ +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ +/*It can be removed.*/ +typedef int _keep_pedantic_happy; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ +/** + * @file lv_gridnav.h + * + */ + +#ifndef LV_GRIDFOCUS_H +#define LV_GRIDFOCUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_GRIDNAV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_GRIDNAV_CTRL_NONE = 0x0, + + /** + * If there is no next/previous object in a direction, + * the focus goes to the object in the next/previous row (on left/right keys) + * or first/last row (on up/down keys) + */ + LV_GRIDNAV_CTRL_ROLLOVER = 0x1, + + /** + * If an arrow is pressed and the focused object can be scrolled in that direction + * then it will be scrolled instead of going to the next/previous object. + * If there is no more room for scrolling the next/previous object will be focused normally */ + LV_GRIDNAV_CTRL_SCROLL_FIRST = 0x2, + +} lv_gridnav_ctrl_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add grid navigation feature to an object. It expects the children to be arranged + * into a grid-like layout. Although it's not required to have pixel perfect alignment. + * This feature makes possible to use keys to navigate among the children and focus them. + * The keys other than arrows and press/release related events + * are forwarded to the focused child. + * @param obj pointer to an object on which navigation should be applied. + * @param ctrl control flags from `lv_gridnav_ctrl_t`. + */ +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl); + +/** + * Remove the grid navigation support from an object + * @param obj pointer to an object + */ +void lv_gridnav_remove(lv_obj_t * obj); + +/** + * Manually focus an object on gridnav container + * @param cont pointer to a gridnav container + * @param to_focus pointer to an object to focus + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GRIDNAV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRIDFOCUS_H*/ diff --git a/libraries/lvgl/src/others/ime/lv_ime_pinyin.c b/libraries/lvgl/src/others/ime/lv_ime_pinyin.c new file mode 100644 index 0000000..1cb6a5e --- /dev/null +++ b/libraries/lvgl/src/others/ime/lv_ime_pinyin.c @@ -0,0 +1,1195 @@ +/** + * @file lv_ime_pinyin.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ime_pinyin.h" +#if LV_USE_IME_PINYIN != 0 + +#include +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_ime_pinyin_class) +#define cand_len LV_GLOBAL_DEFAULT()->ime_cand_len + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_style_change_event(lv_event_t * e); +static void lv_ime_pinyin_kb_event(lv_event_t * e); +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e); + +static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict); +static void pinyin_input_proc(lv_obj_t * obj); +static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn); +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num); +static void pinyin_ime_clear_data(lv_obj_t * obj); + +#if LV_IME_PINYIN_USE_K9_MODE + static void pinyin_k9_init_data(lv_obj_t * obj); + static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]); + static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str); + static void pinyin_k9_fill_cand(lv_obj_t * obj); + static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_ime_pinyin_class = { + .constructor_cb = lv_ime_pinyin_constructor, + .destructor_cb = lv_ime_pinyin_destructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_ime_pinyin_t), + .base_class = &lv_obj_class, + .name = "ime-pinyin", +}; + +#if LV_IME_PINYIN_USE_K9_MODE +static const char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\ + ",\0", "123\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0", + ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0", + "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0", + LV_SYMBOL_LEFT"\0", "\0" + }; + +static lv_buttonmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 17] = { 1 }; +static char lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0}; +#endif + +static char lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4]; +static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3]; + +#if LV_IME_PINYIN_USE_DEFAULT_DICT +static const lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = { + { "a", "啊" }, + { "ai", "愛" }, + { "an", "安暗案" }, + { "ba", "吧把爸八" }, + { "bai", "百白敗" }, + { "ban", "半般辦" }, + { "bang", "旁" }, + { "bao", "保薄包報" }, + { "bei", "被背悲北杯備" }, + { "ben", "本" }, + { "bi", "必比避鼻彼筆秘閉" }, + { "bian", "便邊變変辺" }, + { "biao", "表標" }, + { "bie", "別" }, + { "bing", "病並氷" }, + { "bo", "波薄泊" }, + { "bu", "不布步部捕補歩" }, + { "ca", "察" }, + { "cai", "才材菜財採" }, + { "can", "参残參" }, + { "ce", "策側" }, + { "ceng", "曾" }, + { "cha", "差查茶" }, + { "chai", "差" }, + { "chan", "產産單" }, + { "chang", "場廠" }, + { "chao", "超朝" }, + { "che", "車" }, + { "cheng", "成程乗" }, + { "chi", "尺吃持赤池遅歯" }, + { "chong", "充种重種" }, + { "chu", "出初楚触處処" }, + { "chuan", "川船傳" }, + { "chuang", "創窓" }, + { "chun", "春" }, + { "ci", "此次辞差" }, + { "cong", "從従" }, + { "cu", "卒" }, + { "cun", "存村" }, + { "cuo", "錯" }, + { "da", "大打答達" }, + { "dai", "代待帯帶貸" }, + { "dan", "但担擔誕單単" }, + { "dang", "当党當黨" }, + { "dao", "到道盗導島辺" }, + { "de", "的得" }, + { "dei", "" }, + { "deng", "等" }, + { "di", "地得低底弟第締" }, + { "dian", "点电店點電" }, + { "diao", "調" }, + { "ding", "定町" }, + { "dong", "冬東動働凍" }, + { "du", "独度都渡読" }, + { "duan", "段断短斷" }, + { "dui", "對対" }, + { "duo", "多駄" }, + { "e", "嗯悪" }, + { "en", "嗯" }, + { "er", "而耳二兒" }, + { "fa", "乏法發発髪" }, + { "fan", "反返犯番仮販飯範払" }, + { "fang", "方放房坊訪" }, + { "fei", "非飛費" }, + { "fen", "分份" }, + { "feng", "風豐" }, + { "fou", "否不" }, + { "fu", "父夫富服符付附府幅婦復複負払" }, + { "gai", "改概該" }, + { "gan", "甘感敢" }, + { "gang", "港剛" }, + { "gao", "告高" }, + { "ge", "各格歌革割個" }, + { "gei", "給" }, + { "gen", "跟根" }, + { "geng", "更" }, + { "gong", "工共供功公" }, + { "gou", "夠構溝" }, + { "gu", "古故鼓" }, + { "guai", "掛" }, + { "guan", "官管慣館觀関關" }, + { "guang", "光広" }, + { "gui", "規帰" }, + { "guo", "果国裏菓國過" }, + { "hai", "孩海害還" }, + { "han", "寒漢" }, + { "hang", "航行" }, + { "hao", "好号" }, + { "he", "合和喝何荷" }, + { "hei", "黒" }, + { "hen", "很" }, + { "heng", "行横" }, + { "hou", "厚喉候後" }, + { "hu", "乎呼湖護" }, + { "hua", "化画花話畫劃" }, + { "huai", "壊劃" }, + { "huan", "緩環歡還換" }, + { "huang", "黄" }, + { "hui", "回会慧絵揮會" }, + { "hun", "混婚" }, + { "huo", "活或火獲" }, + { "i", "" }, + { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" }, + { "jia", "家加價" }, + { "jian", "件建健肩見減間検簡漸" }, + { "jiang", "降強講將港" }, + { "jiao", "叫教交角覚覺較學" }, + { "jie", "介借接姐皆届界解結階節價" }, + { "jin", "今近禁金僅進" }, + { "jing", "京境景静精經経" }, + { "jiu", "就久九酒究" }, + { "ju", "句具局居決挙據舉" }, + { "jue", "角覚覺" }, + { "jun", "均" }, + { "kai", "開" }, + { "kan", "看刊" }, + { "kang", "康" }, + { "kao", "考" }, + { "ke", "可刻科克客渇課" }, + { "ken", "肯" }, + { "kong", "空控" }, + { "kou", "口" }, + { "ku", "苦庫" }, + { "kuai", "快塊会會" }, + { "kuang", "況" }, + { "kun", "困" }, + { "kuo", "括拡適" }, + { "la", "拉啦落" }, + { "lai", "来來頼" }, + { "lao", "老絡落" }, + { "le", "了楽樂" }, + { "lei", "類" }, + { "leng", "冷" }, + { "li", "力立利理例礼離麗裡勵歷" }, + { "lian", "連練臉聯" }, + { "liang", "良量涼兩両" }, + { "liao", "料" }, + { "lie", "列" }, + { "lin", "林隣賃" }, + { "ling", "另令領" }, + { "liu", "六留流" }, + { "lu", "律路録緑陸履慮" }, + { "lv", "旅" }, + { "lun", "輪論" }, + { "luo", "落絡" }, + { "ma", "媽嗎嘛" }, + { "mai", "買売" }, + { "man", "滿" }, + { "mang", "忙" }, + { "mao", "毛猫貿" }, + { "me", "麼" }, + { "mei", "美妹每沒毎媒" }, + { "men", "們" }, + { "mi", "米密秘" }, + { "mian", "免面勉眠" }, + { "miao", "描" }, + { "min", "民皿" }, + { "ming", "命明名" }, + { "mo", "末模麼" }, + { "mou", "某" }, + { "mu", "母木目模" }, + { "na", "那哪拿內南" }, + { "nan", "男南難" }, + { "nao", "腦" }, + { "ne", "那哪呢" }, + { "nei", "内那哪內" }, + { "neng", "能" }, + { "ni", "你妳呢" }, + { "nian", "年念" }, + { "niang", "娘" }, + { "nin", "您" }, + { "ning", "凝" }, + { "niu", "牛" }, + { "nong", "農濃" }, + { "nu", "女努" }, + { "nuan", "暖" }, + { "o", "" }, + { "ou", "歐" }, + { "pa", "怕" }, + { "pai", "迫派排" }, + { "pan", "判番" }, + { "pang", "旁" }, + { "pei", "配" }, + { "peng", "朋" }, + { "pi", "疲否" }, + { "pian", "片便" }, + { "pin", "品貧" }, + { "ping", "平評" }, + { "po", "迫破泊頗" }, + { "pu", "普僕" }, + { "qi", "起其奇七气期泣企妻契気" }, + { "qian", "嵌浅千前鉛錢針" }, + { "qiang", "強將" }, + { "qiao", "橋繰" }, + { "qie", "且切契" }, + { "qin", "寝勤親" }, + { "qing", "青清情晴輕頃請軽" }, + { "qiu", "求秋球" }, + { "qu", "去取趣曲區" }, + { "quan", "全犬券" }, + { "que", "缺確卻" }, + { "ran", "然" }, + { "rang", "讓" }, + { "re", "熱" }, + { "ren", "人任認" }, + { "reng", "仍" }, + { "ri", "日" }, + { "rong", "容" }, + { "rou", "弱若肉" }, + { "ru", "如入" }, + { "ruan", "軟" }, + { "sai", "賽" }, + { "san", "三" }, + { "sao", "騒繰" }, + { "se", "色" }, + { "sen", "森" }, + { "sha", "砂" }, + { "shan", "善山單" }, + { "shang", "上尚商" }, + { "shao", "少紹" }, + { "shaung", "雙" }, + { "she", "社射設捨渉" }, + { "shei", "誰" }, + { "shen", "什申深甚身伸沈神" }, + { "sheng", "生声昇勝乗聲" }, + { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" }, + { "shou", "手首守受授" }, + { "shu", "束数暑殊樹書屬輸術" }, + { "shui", "水説說誰" }, + { "shuo", "数説說" }, + { "si", "思寺司四私似死価" }, + { "song", "送" }, + { "su", "速宿素蘇訴" }, + { "suan", "算酸" }, + { "sui", "隨雖歲歳" }, + { "sun", "孫" }, + { "suo", "所" }, + { "ta", "她他它牠" }, + { "tai", "太台態臺" }, + { "tan", "探談曇" }, + { "tang", "糖" }, + { "tao", "桃逃套討" }, + { "te", "特" }, + { "ti", "体提替題體戻" }, + { "tian", "天田" }, + { "tiao", "条條調" }, + { "tie", "鉄" }, + { "ting", "停庭聽町" }, + { "tong", "同童通痛统統" }, + { "tou", "投透頭" }, + { "tu", "土徒茶図" }, + { "tuan", "團" }, + { "tui", "推退" }, + { "tuo", "脱駄" }, + { "u", "" }, + { "v", "" }, + { "wai", "外" }, + { "wan", "完万玩晩腕灣" }, + { "wang", "忘望亡往網" }, + { "wei", "危位未味委為謂維違圍" }, + { "wen", "文温問聞" }, + { "wo", "我" }, + { "wu", "午物五無屋亡鳥務汚" }, + { "xi", "夕息西洗喜系昔席希析嬉膝細習係" }, + { "xia", "下夏狭暇" }, + { "xian", "先限嫌洗現見線顯" }, + { "xiang", "向相香像想象降項詳響" }, + { "xiao", "小笑消效校削咲" }, + { "xie", "写携些解邪械協謝寫契" }, + { "xin", "心信新辛" }, + { "xing", "行形性幸型星興" }, + { "xiong", "兄胸" }, + { "xiu", "休秀修" }, + { "xu", "須需許續緒続" }, + { "xuan", "選懸" }, + { "xue", "学雪削靴學" }, + { "xun", "訓訊" }, + { "ya", "呀押壓" }, + { "yan", "言顔研煙嚴厳験驗塩" }, + { "yang", "央洋陽樣様" }, + { "yao", "要揺腰薬曜" }, + { "ye", "也野夜邪業葉" }, + { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" }, + { "yin", "因引音飲銀" }, + { "ying", "英迎影映應營営" }, + { "yong", "永用泳擁" }, + { "you", "又有右友由尤油遊郵誘優" }, + { "yu", "予育余雨浴欲愈御宇域語於魚與込" }, + { "yuan", "元原源院員円園遠猿願" }, + { "yue", "月越約楽" }, + { "yun", "雲伝運" }, + { "za", "雑" }, + { "zai", "在再載災" }, + { "zang", "蔵" }, + { "zao", "早造" }, + { "ze", "則擇責" }, + { "zen", "怎" }, + { "zeng", "曾增増" }, + { "zha", "札" }, + { "zhai", "宅擇" }, + { "zhan", "站展戰戦" }, + { "zhang", "丈長障帳張" }, + { "zhao", "找着朝招" }, + { "zhe", "者這" }, + { "zhen", "真震針" }, + { "zheng", "正整争政爭" }, + { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" }, + { "zhong", "中种終重種眾" }, + { "zhou", "周州昼宙洲週" }, + { "zhu", "助主住柱株祝逐注著諸屬術" }, + { "zhuan", "专專転" }, + { "zhuang", "状狀" }, + { "zhui", "追" }, + { "zhun", "準" }, + { "zhuo", "着" }, + { "zi", "子自字姉資" }, + { "zong", "總" }, + { "zuo", "左做昨坐座作" }, + { "zu", "足祖族卒組" }, + { "zui", "最酔" }, + { "zou", "走" }, + {NULL, NULL} +}; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb) +{ + if(kb) { + LV_ASSERT_OBJ(kb, &lv_keyboard_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->kb = kb; + lv_obj_set_parent(obj, lv_obj_get_parent(kb)); + lv_obj_set_parent(pinyin_ime->cand_panel, lv_obj_get_parent(kb)); + lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0); +} + +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + init_pinyin_dict(obj, dict); +} + +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class); + + pinyin_ime->mode = mode; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_k9_init_data(obj); + lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char **)lv_btnm_def_pinyin_k9_map, + default_kb_ctrl_k9_map); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1); + } +#endif +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->kb; +} + +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->cand_panel; +} + +const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->dict; +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) { + if(btnm_i == 0) { + lv_btnm_def_pinyin_sel_map[btnm_i] = "<"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ">"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ""; + } + else { + lv_pinyin_cand_str[py_str_i][0] = ' '; + lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i]; + py_str_i++; + } + } + + pinyin_ime->mode = LV_IME_PINYIN_MODE_K26; + pinyin_ime->py_page = 0; + pinyin_ime->ta_count = 0; + pinyin_ime->cand_num = 0; + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + lv_memzero(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); + lv_memzero(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); + + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + +#if LV_IME_PINYIN_USE_DEFAULT_DICT + init_pinyin_dict(obj, lv_ime_pinyin_def_dict); +#endif + + /* Init pinyin_ime->cand_panel */ + pinyin_ime->cand_panel = lv_buttonmatrix_create(lv_obj_get_parent(obj)); + lv_buttonmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map); + lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5)); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + + lv_buttonmatrix_set_one_checked(pinyin_ime->cand_panel, true); + lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + /* Set cand_panel style*/ + // Default style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0); + lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0); + + // LV_PART_ITEMS style + lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS); + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + + // LV_PART_ITEMS | LV_STATE_PRESSED style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED); + + /* event handler */ + lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL); + +#if LV_IME_PINYIN_USE_K9_MODE + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + + pinyin_k9_init_data(obj); + + _lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); +#endif +} + +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(lv_obj_is_valid(pinyin_ime->kb)) + lv_obj_delete(pinyin_ime->kb); + + if(lv_obj_is_valid(pinyin_ime->cand_panel)) + lv_obj_delete(pinyin_ime->cand_panel); +} + +static void lv_ime_pinyin_kb_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * kb = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + +#if LV_IME_PINYIN_USE_K9_MODE + static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; +#endif + + if(code == LV_EVENT_VALUE_CHANGED) { + uint16_t btn_id = lv_buttonmatrix_get_selected_button(kb); + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; + + const char * txt = lv_buttonmatrix_get_button_text(kb, lv_buttonmatrix_get_selected_button(kb)); + if(txt == NULL) return; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + + uint16_t tmp_button_str_len = lv_strlen(pinyin_ime->input_char); + if((btn_id >= 16) && (tmp_button_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) { + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + strcat(pinyin_ime->input_char, txt); + pinyin_input_proc(obj); + + for(int index = 0; index < (pinyin_ime->ta_count + tmp_button_str_len); index++) { + lv_textarea_delete_char(ta); + } + + pinyin_ime->ta_count = tmp_button_str_len; + pinyin_ime->k9_input_str_len = tmp_button_str_len; + lv_textarea_add_text(ta, pinyin_ime->input_char); + + return; + } + } +#endif + + if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + pinyin_ime_clear_data(obj); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + // del input char + if(pinyin_ime->ta_count > 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) + pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0'; +#if LV_IME_PINYIN_USE_K9_MODE + else + pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0'; +#endif + + pinyin_ime->ta_count--; + if(pinyin_ime->ta_count <= 0) { + pinyin_ime_clear_data(obj); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + pinyin_input_proc(obj); + } +#if LV_IME_PINYIN_USE_K9_MODE + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char) - 1; + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + pinyin_ime->ta_count--; + } +#endif + } + } + else if((lv_strcmp(txt, "ABC") == 0) || (lv_strcmp(txt, "abc") == 0) || (lv_strcmp(txt, "1#") == 0) || + (lv_strcmp(txt, LV_SYMBOL_OK) == 0)) { + pinyin_ime_clear_data(obj); + return; + } + else if(lv_strcmp(txt, "123") == 0) { + for(uint16_t i = 0; i < lv_strlen(txt); i++) + lv_textarea_delete_char(ta); + + pinyin_ime_clear_data(obj); + lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9_NUMBER); + lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K26); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9_NUMBER) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); + } + pinyin_ime_clear_data(obj); + } + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' && + txt[0] <= 'Z'))) { + strcat(pinyin_ime->input_char, txt); + pinyin_input_proc(obj); + pinyin_ime->ta_count++; + } +#if LV_IME_PINYIN_USE_K9_MODE + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) { + for(uint16_t i = 0; i < 8; i++) { + if((lv_strcmp(txt, k9_py_map[i]) == 0) || (lv_strcmp(txt, "abc ") == 0)) { + if(lv_strcmp(txt, "abc ") == 0) pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]) + 1; + else pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]); + pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i; + pinyin_ime->k9_input_str[pinyin_ime->ta_count + 1] = '\0'; + + break; + } + } + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + } + else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { + pinyin_k9_cand_page_proc(obj, 0); + } + else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + pinyin_k9_cand_page_proc(obj, 1); + } +#endif + } +} + +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * cand_panel = lv_event_get_current_target(e); + lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_VALUE_CHANGED) { + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + if(ta == NULL) return; + + uint32_t id = lv_buttonmatrix_get_selected_button(cand_panel); + if(id == LV_BUTTONMATRIX_BUTTON_NONE) { + return; + } + else if(id == 0) { + pinyin_page_proc(obj, 0); + return; + } + else if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + pinyin_page_proc(obj, 1); + return; + } + + const char * txt = lv_buttonmatrix_get_button_text(cand_panel, id); + uint16_t index = 0; + for(index = 0; index < pinyin_ime->ta_count; index++) + lv_textarea_delete_char(ta); + + lv_textarea_add_text(ta, txt); + + pinyin_ime_clear_data(obj); + } +} + +static void pinyin_input_proc(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num); + if(pinyin_ime->cand_str == NULL) { + return; + } + + pinyin_ime->py_page = 0; + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j]; + } + } + + lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +} + +static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM; + uint16_t remainder = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM; + + if(!pinyin_ime->cand_str) return; + + if(dir == 0) { + if(pinyin_ime->py_page) { + pinyin_ime->py_page--; + } + } + else { + if(remainder == 0) { + page_num -= 1; + } + if(pinyin_ime->py_page < page_num) { + pinyin_ime->py_page++; + } + else return; + } + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM); + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + if((remainder > 0) && (pinyin_ime->py_page == page_num)) { + if(i > remainder) + break; + } + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j]; + } + } +} + +static void lv_ime_pinyin_style_change_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0); + } +} + +static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + char headletter = 'a'; + uint16_t offset_sum = 0; + uint16_t offset_count = 0; + uint16_t letter_calc = 0; + + pinyin_ime->dict = dict; + + for(uint16_t i = 0; ; i++) { + if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) { + headletter = dict[i - 1].py[0]; + letter_calc = headletter - 'a'; + pinyin_ime->py_num[letter_calc] = offset_count; + break; + } + + if(headletter == (dict[i].py[0])) { + offset_count++; + } + else { + headletter = dict[i].py[0]; + letter_calc = headletter - 'a'; + pinyin_ime->py_num[letter_calc - 1] = offset_count; + offset_sum += offset_count; + pinyin_ime->py_pos[letter_calc] = offset_sum; + + offset_count = 1; + } + } +} + +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + const lv_pinyin_dict_t * cpHZ; + uint8_t index, len = 0, offset; + volatile uint8_t count = 0; + + if(*py_str == '\0') return NULL; + if(*py_str == 'i') return NULL; + if(*py_str == 'u') return NULL; + if(*py_str == 'v') return NULL; + if(*py_str == ' ') return NULL; + + offset = py_str[0] - 'a'; + len = lv_strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + // The Chinese character in UTF-8 encoding format is 3 bytes + * cand_num = lv_strlen((const char *)(cpHZ->py_mb)) / 3; + return (char *)(cpHZ->py_mb); + } + cpHZ++; + } + return NULL; +} + +static void pinyin_ime_clear_data(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_strcpy(lv_pinyin_k9_cand_str[i], " "); + } + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + lv_buttonmatrix_set_map(pinyin_ime->kb, (const char **)lv_btnm_def_pinyin_k9_map); + } +#endif + + pinyin_ime->ta_count = 0; + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +} + +#if LV_IME_PINYIN_USE_K9_MODE +static void pinyin_k9_init_data(lv_obj_t * obj) +{ + LV_UNUSED(obj); + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) { + if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) { + lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0"); + } + else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) { + lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], "\0"); + } + else { + lv_strcpy(lv_pinyin_k9_cand_str[py_str_i], " \0"); + } + + lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i]; + py_str_i++; + } + + default_kb_ctrl_k9_map[0] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[1] = LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | 1; + default_kb_ctrl_k9_map[4] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[5] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[9] = LV_KEYBOARD_CTRL_BUTTON_FLAGS | 1; + default_kb_ctrl_k9_map[10] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[14] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[15] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; +} + +static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t len = lv_strlen(k9_input); + + if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) { + return; + } + + char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int index = 0; + int flag = 0; + uint16_t count = 0; + + uint32_t ll_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + + while(index != -1) { + if(index == len) { + if(pinyin_k9_is_valid_py(obj, py_comp)) { + if((count >= ll_len) || (ll_len == 0)) { + ll_index = _lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); + lv_strcpy(ll_index->py_str, py_comp); + } + else if((count < ll_len)) { + lv_strcpy(ll_index->py_str, py_comp); + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); + } + count++; + } + index--; + } + else { + flag = mark[index]; + if((size_t)flag < lv_strlen(py9_map[k9_input[index] - '2'])) { + py_comp[index] = py9_map[k9_input[index] - '2'][flag]; + mark[index] = mark[index] + 1; + index++; + } + else { + mark[index] = 0; + index--; + } + } + } + + if(count > 0) { + pinyin_ime->ta_count++; + pinyin_ime->k9_legal_py_count = count; + } +} + +/*true: visible; false: not visible*/ +static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + const lv_pinyin_dict_t * cpHZ = NULL; + uint8_t index = 0, len = 0, offset = 0; + volatile uint8_t count = 0; + + if(*py_str == '\0') return false; + if(*py_str == 'i') return false; + if(*py_str == 'u') return false; + if(*py_str == 'v') return false; + + offset = py_str[0] - 'a'; + len = lv_strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + return true; + } + cpHZ++; + } + return false; +} + +static void pinyin_k9_fill_cand(lv_obj_t * obj) +{ + uint16_t index = 0, tmp_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + tmp_len = pinyin_ime->k9_legal_py_count; + + if(tmp_len != cand_len) { + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + cand_len = tmp_len; + } + + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + lv_strcpy(pinyin_ime->input_char, ll_index->py_str); + + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strcpy(lv_pinyin_k9_cand_str[i], " "); + } + + while(ll_index) { + if(index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) + break; + + if(index < pinyin_ime->k9_legal_py_count) { + lv_strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str); + } + + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + index++; + } + pinyin_ime->k9_py_ll_pos = index; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + for(index = 0; index < pinyin_ime->k9_input_str_len; index++) { + lv_textarea_delete_char(ta); + } + pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char); + lv_textarea_add_text(ta, pinyin_ime->input_char); +} + +static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + uint16_t ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + + if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) { + ime_pinyin_k9_py_str_t * ll_index = NULL; + int count = 0; + + ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + while(ll_index) { + if(count >= pinyin_ime->k9_py_ll_pos) break; + + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + + if((NULL == ll_index) && (dir == 1)) return; + + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0"); + lv_strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0"); + + // next page + if(dir == 1) { + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strcpy(lv_pinyin_k9_cand_str[i], " "); + } + + count = 0; + while(ll_index) { + if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1)) + break; + + lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); + ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + pinyin_ime->k9_py_ll_pos += count - 1; + + } + // previous page + else { + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strcpy(lv_pinyin_k9_cand_str[i], " "); + } + count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1; + ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); + while(ll_index) { + if(count < 0) break; + + lv_strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str); + ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ + count--; + } + + if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM) + pinyin_ime->k9_py_ll_pos -= 1; + } + + lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); + } +} + +#endif /*LV_IME_PINYIN_USE_K9_MODE*/ + +#endif /*LV_USE_IME_PINYIN*/ diff --git a/libraries/lvgl/src/others/ime/lv_ime_pinyin.h b/libraries/lvgl/src/others/ime/lv_ime_pinyin.h new file mode 100644 index 0000000..a342d2c --- /dev/null +++ b/libraries/lvgl/src/others/ime/lv_ime_pinyin.h @@ -0,0 +1,144 @@ +/** + * @file lv_ime_pinyin.h + * + */ +#ifndef LV_IME_PINYIN_H +#define LV_IME_PINYIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_IME_PINYIN != 0 + +/********************* + * DEFINES + *********************/ +#define LV_IME_PINYIN_K9_MAX_INPUT 7 + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_IME_PINYIN_MODE_K26, + LV_IME_PINYIN_MODE_K9, + LV_IME_PINYIN_MODE_K9_NUMBER, +} lv_ime_pinyin_mode_t; + +/*Data of pinyin_dict*/ +typedef struct { + const char * const py; + const char * const py_mb; +} lv_pinyin_dict_t; + +/*Data of 9-key input(k9) mode*/ +typedef struct { + char py_str[7]; +} ime_pinyin_k9_py_str_t; + +/*Data of lv_ime_pinyin*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * kb; + lv_obj_t * cand_panel; + const lv_pinyin_dict_t * dict; + lv_ll_t k9_legal_py_ll; + char * cand_str; /* Candidate string */ + char input_char[16]; /* Input box character */ +#if LV_IME_PINYIN_USE_K9_MODE + char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */ + uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ + uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ + uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ +#endif + uint16_t ta_count; /* The number of characters entered in the text box this time */ + uint16_t cand_num; /* Number of candidates */ + uint16_t py_page; /* Current pinyin map pages(k26) */ + uint16_t py_num[26]; /* Number and length of Pinyin */ + uint16_t py_pos[26]; /* Pinyin position */ + lv_ime_pinyin_mode_t mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ +} lv_ime_pinyin_t; + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +extern const lv_obj_class_t lv_ime_pinyin_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the keyboard of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param kb pointer to a Pinyin input method keyboard + */ +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method dictionary + */ +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); + +/** + * Set mode, 26-key input(k26) or 9-key input(k9). + * @param obj pointer to a Pinyin input method object + * @param mode the mode from 'lv_ime_pinyin_mode_t' + */ +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); + +/*===================== + * Getter functions + *====================*/ + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin IME object + * @return pointer to the Pinyin IME keyboard + */ +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method candidate panel + */ +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method dictionary + */ +const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_IME_PINYIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_IME_PINYIN*/ diff --git a/libraries/lvgl/src/others/imgfont/lv_imgfont.c b/libraries/lvgl/src/others/imgfont/lv_imgfont.c new file mode 100644 index 0000000..1a77688 --- /dev/null +++ b/libraries/lvgl/src/others/imgfont/lv_imgfont.c @@ -0,0 +1,125 @@ +/** + * @file lv_imgfont.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_font_t font; + lv_imgfont_get_path_cb_t path_cb; + void * user_data; +} imgfont_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32_t unicode, + lv_draw_buf_t * draw_buf); +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data) +{ + imgfont_dsc_t * dsc = lv_malloc_zeroed(sizeof(imgfont_dsc_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + dsc->path_cb = path_cb; + dsc->user_data = user_data; + + lv_font_t * font = &dsc->font; + font->dsc = dsc; + font->get_glyph_dsc = imgfont_get_glyph_dsc; + font->get_glyph_bitmap = imgfont_get_glyph_bitmap; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = height; + font->base_line = 0; + font->underline_position = 0; + font->underline_thickness = 0; + + return font; +} + +void lv_imgfont_destroy(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + lv_free(dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32_t unicode, + lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + const lv_font_t * font = g_dsc->resolved_font; + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + int32_t offset_y = 0; + const void * img_src = dsc->path_cb(font, unicode, 0, &offset_y, dsc->user_data); + return img_src; +} + +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next) +{ + LV_ASSERT_NULL(font); + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + LV_ASSERT_NULL(dsc); + if(dsc->path_cb == NULL) return false; + + int32_t offset_y = 0; + + const void * img_src = dsc->path_cb(font, unicode, unicode_next, &offset_y, dsc->user_data); + if(img_src == NULL) return false; + + lv_image_header_t header; + if(lv_image_decoder_get_info(img_src, &header) != LV_RESULT_OK) { + return false; + } + + dsc_out->is_placeholder = 0; + dsc_out->adv_w = header.w; + dsc_out->box_w = header.w; + dsc_out->box_h = header.h; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = offset_y; + dsc_out->format = LV_FONT_GLYPH_FORMAT_IMAGE; /* is image identifier */ + + return true; +} + +#endif /*LV_USE_IMGFONT*/ diff --git a/libraries/lvgl/src/others/imgfont/lv_imgfont.h b/libraries/lvgl/src/others/imgfont/lv_imgfont.h new file mode 100644 index 0000000..68c317a --- /dev/null +++ b/libraries/lvgl/src/others/imgfont/lv_imgfont.h @@ -0,0 +1,63 @@ +/** + * @file lv_imgfont.h + * + */ + +#ifndef LV_IMGFONT_H +#define LV_IMGFONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../font/lv_font.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/* gets the image path name of this character */ +typedef const void * (*lv_imgfont_get_path_cb_t)(const lv_font_t * font, + uint32_t unicode, uint32_t unicode_next, + int32_t * offset_y, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Creates a image font with info parameter specified. + * @param height font size + * @param path_cb a function to get the image path name of character. + * @param user_data pointer to user data + * @return pointer to the new imgfont or NULL if create error. + */ +lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data); + +/** + * Destroy a image font that has been created. + * @param font pointer to image font handle. + */ +void lv_imgfont_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMGFONT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_IMGFONT_H */ diff --git a/libraries/lvgl/src/others/monkey/lv_monkey.c b/libraries/lvgl/src/others/monkey/lv_monkey.c new file mode 100644 index 0000000..9f97091 --- /dev/null +++ b/libraries/lvgl/src/others/monkey/lv_monkey.c @@ -0,0 +1,178 @@ +/** + * @file lv_monkey.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_monkey.h" + +#if LV_USE_MONKEY != 0 + +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_mem.h" +#include "../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ +#define MONKEY_PERIOD_RANGE_MIN_DEF 100 +#define MONKEY_PERIOD_RANGE_MAX_DEF 1000 + +/********************** + * TYPEDEFS + **********************/ +struct _lv_monkey { + lv_monkey_config_t config; + lv_indev_data_t indev_data; + lv_indev_t * indev; + lv_timer_t * timer; + void * user_data; +}; + +static const lv_key_t lv_key_map[] = { + LV_KEY_UP, + LV_KEY_DOWN, + LV_KEY_RIGHT, + LV_KEY_LEFT, + LV_KEY_ESC, + LV_KEY_DEL, + LV_KEY_BACKSPACE, + LV_KEY_ENTER, + LV_KEY_NEXT, + LV_KEY_PREV, + LV_KEY_HOME, + LV_KEY_END, +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig); +static void lv_monkey_timer_cb(lv_timer_t * timer); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_monkey_config_init(lv_monkey_config_t * config) +{ + lv_memzero(config, sizeof(lv_monkey_config_t)); + config->type = LV_INDEV_TYPE_POINTER; + config->period_range.min = MONKEY_PERIOD_RANGE_MIN_DEF; + config->period_range.max = MONKEY_PERIOD_RANGE_MAX_DEF; +} + +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config) +{ + lv_monkey_t * monkey = lv_malloc_zeroed(sizeof(lv_monkey_t)); + LV_ASSERT_MALLOC(monkey); + + monkey->config = *config; + monkey->timer = lv_timer_create(lv_monkey_timer_cb, monkey->config.period_range.min, monkey); + lv_timer_pause(monkey->timer); + + monkey->indev = lv_indev_create(); + lv_indev_set_type(monkey->indev, config->type); + lv_indev_set_read_cb(monkey->indev, lv_monkey_read_cb); + lv_indev_set_user_data(monkey->indev, monkey); + return monkey; +} + +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->indev; +} + +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en) +{ + LV_ASSERT_NULL(monkey); + en ? lv_timer_resume(monkey->timer) : lv_timer_pause(monkey->timer); +} + +bool lv_monkey_get_enable(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return !monkey->timer->paused; +} + +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data) +{ + LV_ASSERT_NULL(monkey); + monkey->user_data = user_data; +} + +void * lv_monkey_get_user_data(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->user_data; +} + +void lv_monkey_delete(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + + lv_timer_delete(monkey->timer); + lv_indev_delete(monkey->indev); + lv_free(monkey); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_monkey_t * monkey = lv_indev_get_user_data(indev); + + data->btn_id = monkey->indev_data.btn_id; + data->point = monkey->indev_data.point; + data->enc_diff = monkey->indev_data.enc_diff; + data->state = monkey->indev_data.state; +} + +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig) +{ + if(howsmall >= howbig) { + return howsmall; + } + int32_t diff = howbig - howsmall; + return (int32_t)lv_rand(0, diff) + howsmall; +} + +static void lv_monkey_timer_cb(lv_timer_t * timer) +{ + lv_monkey_t * monkey = timer->user_data; + lv_indev_data_t * data = &monkey->indev_data; + + switch(lv_indev_get_type(monkey->indev)) { + case LV_INDEV_TYPE_POINTER: + data->point.x = (int32_t)lv_monkey_random(0, LV_HOR_RES - 1); + data->point.y = (int32_t)lv_monkey_random(0, LV_VER_RES - 1); + break; + case LV_INDEV_TYPE_ENCODER: + data->enc_diff = (int16_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_BUTTON: + data->btn_id = (uint32_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_KEYPAD: { + int32_t index = lv_monkey_random(0, sizeof(lv_key_map) / sizeof(lv_key_map[0]) - 1); + data->key = lv_key_map[index]; + break; + } + default: + break; + } + + data->state = lv_monkey_random(0, 100) < 50 ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; + + lv_timer_set_period(monkey->timer, lv_monkey_random(monkey->config.period_range.min, monkey->config.period_range.max)); +} + +#endif /*LV_USE_MONKEY*/ diff --git a/libraries/lvgl/src/others/monkey/lv_monkey.h b/libraries/lvgl/src/others/monkey/lv_monkey.h new file mode 100644 index 0000000..3791abc --- /dev/null +++ b/libraries/lvgl/src/others/monkey/lv_monkey.h @@ -0,0 +1,117 @@ +/** + * @file lv_monkey.h + * + */ +#ifndef LV_MONKEY_H +#define LV_MONKEY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_monkey; +typedef struct _lv_monkey lv_monkey_t; + +typedef struct { + /**< Input device type*/ + lv_indev_type_t type; + + /**< Monkey execution period*/ + struct { + //! @cond Doxygen_Suppress + uint32_t min; + uint32_t max; + //! @endcond + } period_range; + + /**< The range of input value*/ + struct { + int32_t min; + int32_t max; + } input_range; +} lv_monkey_config_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a monkey config with default values + * @param config pointer to 'lv_monkey_config_t' variable to initialize + */ +void lv_monkey_config_init(lv_monkey_config_t * config); + +/** + * Create monkey for test + * @param config pointer to 'lv_monkey_config_t' variable + * @return pointer to the created monkey + */ +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config); + +/** + * Get monkey input device + * @param monkey pointer to a monkey + * @return pointer to the input device + */ +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey); + +/** + * Enable monkey + * @param monkey pointer to a monkey + * @param en set to true to enable + */ +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en); + +/** + * Get whether monkey is enabled + * @param monkey pointer to a monkey + * @return return true if monkey enabled + */ +bool lv_monkey_get_enable(lv_monkey_t * monkey); + +/** + * Set the user_data field of the monkey + * @param monkey pointer to a monkey + * @param user_data pointer to the new user_data. + */ +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data); + +/** + * Get the user_data field of the monkey + * @param monkey pointer to a monkey + * @return the pointer to the user_data of the monkey + */ +void * lv_monkey_get_user_data(lv_monkey_t * monkey); + +/** + * Delete monkey + * @param monkey pointer to monkey + */ +void lv_monkey_delete(lv_monkey_t * monkey); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MONKEY*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MONKEY_H*/ diff --git a/libraries/lvgl/src/others/observer/lv_observer.c b/libraries/lvgl/src/others/observer/lv_observer.c new file mode 100644 index 0000000..10b3186 --- /dev/null +++ b/libraries/lvgl/src/others/observer/lv_observer.c @@ -0,0 +1,717 @@ +/** + * @file lv_observer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_observer.h" +#if LV_USE_OBSERVER + +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t flag; + lv_subject_value_t value; + uint32_t inv : 1; +} flag_and_cond_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void unsubscribe_on_delete_cb(lv_event_t * e); +static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject); +static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, + int32_t ref_value, bool inv); +static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject); + +#if LV_USE_BUTTON + static void btn_value_changed_event_cb(lv_event_t * e); +#endif + +#if LV_USE_LABEL + static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if LV_USE_ARC + static void arc_value_changed_event_cb(lv_event_t * e); + static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if LV_USE_SLIDER + static void slider_value_changed_event_cb(lv_event_t * e); + static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if LV_USE_ROLLER + static void roller_value_changed_event_cb(lv_event_t * e); + static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if LV_USE_DROPDOWN + static void dropdown_value_changed_event_cb(lv_event_t * e); + static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_subject_init_int(lv_subject_t * subject, int32_t value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_INT; + subject->value.num = value; + subject->prev_value.num = value; + _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_int(lv_subject_t * subject, int32_t value) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return; + } + + subject->prev_value.num = subject->value.num; + subject->value.num = value; + lv_subject_notify(subject); +} + +int32_t lv_subject_get_int(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return 0; + } + + return subject->value.num; +} + +int32_t lv_subject_get_previous_int(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return 0; + } + + return subject->prev_value.num; +} + +void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + lv_strncpy(buf, value, size); + if(prev_buf) lv_strncpy(prev_buf, value, size); + + subject->type = LV_SUBJECT_TYPE_STRING; + subject->size = size; + subject->value.pointer = buf; + subject->prev_value.pointer = prev_buf; + + _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_copy_string(lv_subject_t * subject, const char * buf) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return; + } + + if(subject->size < 1) return; + if(subject->prev_value.pointer) { + lv_strncpy((char *)subject->prev_value.pointer, subject->value.pointer, subject->size - 1); + } + + lv_strncpy((char *)subject->value.pointer, buf, subject->size - 1); + + lv_subject_notify(subject); + +} + +const char * lv_subject_get_string(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return ""; + } + + return subject->value.pointer; +} + +const char * lv_subject_get_previous_string(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return NULL; + } + + return subject->prev_value.pointer; +} + +void lv_subject_init_pointer(lv_subject_t * subject, void * value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_POINTER; + subject->value.pointer = value; + subject->prev_value.pointer = value; + _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_pointer(lv_subject_t * subject, void * ptr) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return; + } + + subject->prev_value.pointer = subject->value.pointer; + subject->value.pointer = ptr; + lv_subject_notify(subject); +} + +const void * lv_subject_get_pointer(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return NULL; + } + + return subject->value.pointer; +} + +const void * lv_subject_get_previous_pointer(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return NULL; + } + + return subject->prev_value.pointer; +} + +void lv_subject_init_color(lv_subject_t * subject, lv_color_t color) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_COLOR; + subject->value.color = color; + subject->prev_value.color = color; + _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_color(lv_subject_t * subject, lv_color_t color) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return; + } + + subject->prev_value.color = subject->value.color; + subject->value.color = color; + lv_subject_notify(subject); +} + +lv_color_t lv_subject_get_color(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return lv_color_black(); + } + + return subject->value.color; +} + +lv_color_t lv_subject_get_previous_color(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return lv_color_black(); + } + + return subject->prev_value.color; +} + +void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32_t list_len) +{ + subject->type = LV_SUBJECT_TYPE_GROUP; + subject->size = list_len; + _lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); + subject->value.pointer = list; + + /* bind all subjects to this subject */ + uint32_t i; + for(i = 0; i < list_len; i++) { + /*If a subject in the group changes notify the group itself*/ + lv_subject_add_observer(list[i], group_notify_cb, subject); + } +} + +lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index) +{ + if(subject->type != LV_SUBJECT_TYPE_GROUP) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_GROUP"); + return NULL; + } + + if(index >= subject->size) return NULL; + + return ((lv_subject_t **)(subject->value.pointer))[index]; +} + +lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t cb, void * user_data) +{ + lv_observer_t * observer = lv_subject_add_observer_obj(subject, cb, NULL, user_data); + return observer; +} + +lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t cb, lv_obj_t * obj, + void * user_data) +{ + LV_ASSERT_NULL(subject); + if(subject->type == LV_SUBJECT_TYPE_INVALID) { + LV_LOG_WARN("Subject not initialized yet"); + return NULL; + } + lv_observer_t * observer = _lv_ll_ins_tail(&(subject->subs_ll)); + LV_ASSERT_MALLOC(observer); + if(observer == NULL) return NULL; + + lv_memzero(observer, sizeof(*observer)); + + observer->subject = subject; + observer->cb = cb; + observer->user_data = user_data; + observer->target = obj; + /* subscribe to delete event of the object */ + if(obj != NULL) { + lv_obj_add_event_cb(obj, unsubscribe_on_delete_cb, LV_EVENT_DELETE, observer); + } + + /* update object immediately */ + if(observer->cb) observer->cb(observer, subject); + + return observer; +} + +lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t cb, void * target, + void * user_data) +{ + LV_ASSERT_NULL(subject); + if(subject->type == LV_SUBJECT_TYPE_INVALID) { + LV_LOG_WARN("Subject not initialized yet"); + return NULL; + } + lv_observer_t * observer = _lv_ll_ins_tail(&(subject->subs_ll)); + LV_ASSERT_MALLOC(observer); + if(observer == NULL) return NULL; + + lv_memzero(observer, sizeof(*observer)); + + observer->subject = subject; + observer->cb = cb; + observer->user_data = user_data; + observer->target = target; + + /* update object immediately */ + if(observer->cb) observer->cb(observer, subject); + + return observer; +} + +void lv_observer_remove(lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + + observer->subject->notify_restart_query = 1; + + _lv_ll_remove(&(observer->subject->subs_ll), observer); + + if(observer->auto_free_user_data) { + lv_free(observer->user_data); + } + lv_free(observer); +} + +void lv_subject_remove_all_obj(lv_subject_t * subject, lv_obj_t * obj) +{ + LV_ASSERT_NULL(subject); + if(subject->type == LV_SUBJECT_TYPE_INVALID) { + LV_LOG_WARN("Subject not initialized yet"); + return; + } + + while(lv_obj_remove_event_cb(obj, unsubscribe_on_delete_cb)); + +#if LV_USE_BUTTON + while(lv_obj_remove_event_cb(obj, btn_value_changed_event_cb)); +#endif /*LV_USE_BUTTON*/ + +#if LV_USE_ARC + while(lv_obj_remove_event_cb(obj, arc_value_changed_event_cb)); +#endif /*LV_USE_ARC*/ + +#if LV_USE_ROLLER + while(lv_obj_remove_event_cb(obj, roller_value_changed_event_cb)); +#endif /*LV_USE_ROLLER*/ + +#if LV_USE_DROPDOWN + while(lv_obj_remove_event_cb(obj, dropdown_value_changed_event_cb)); +#endif /*LV_USE_DROPDOWN*/ + + lv_observer_t * observer = _lv_ll_get_head(&subject->subs_ll); + while(observer) { + lv_observer_t * observer_next = _lv_ll_get_next(&subject->subs_ll, observer); + if(observer->target == obj) { + lv_observer_remove(observer); + } + observer = observer_next; + } +} + +void * lv_observer_get_target(lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + + return observer->target; +} + +void lv_subject_notify(lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + + lv_observer_t * observer; + _LV_LL_READ(&(subject->subs_ll), observer) { + observer->notified = 0; + } + + do { + subject->notify_restart_query = 0; + _LV_LL_READ(&(subject->subs_ll), observer) { + if(observer->cb && observer->notified == 0) { + observer->cb(observer, subject); + if(subject->notify_restart_query) break; + observer->notified = 1; + } + } + } while(subject->notify_restart_query); +} + +lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, false); + return observable; +} + +lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, + int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, true); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, false); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, true); + return observable; +} + +#if LV_USE_BUTTON +lv_observer_t * lv_button_bind_checked(lv_obj_t * obj, lv_subject_t * subject) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, LV_STATE_CHECKED, 1, false); + lv_obj_add_event_cb(obj, btn_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + return observable; +} +#endif /*LV_USE_BUTTON*/ + +#if LV_USE_LABEL +lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt) +{ + if(fmt == NULL) { + if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + else { + if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER && + subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, label_text_observer_cb, obj, (void *)fmt); + return observer; +} +#endif /*LV_USE_LABEL*/ + +#if LV_USE_ARC +lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, arc_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, arc_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_ARC*/ + +#if LV_USE_SLIDER +lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, slider_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, slider_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_SLIDER*/ + +#if LV_USE_ROLLER + +lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, roller_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, roller_value_observer_cb, obj, NULL); + return observer; + +} +#endif /*LV_USE_ROLLER*/ + +#if LV_USE_DROPDOWN + +lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, dropdown_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, dropdown_value_observer_cb, obj, NULL); + return observer; + +} + +#endif /*LV_USE_DROPDOWN*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + LV_UNUSED(subject); + lv_subject_t * subject_group = observer->user_data; + lv_subject_notify(subject_group); +} + +static void unsubscribe_on_delete_cb(lv_event_t * e) +{ + lv_observer_t * observer = lv_event_get_user_data(e); + lv_observer_remove(observer); +} + +static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, + int32_t ref_value, bool inv) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + flag_and_cond_t * p = lv_malloc(sizeof(flag_and_cond_t)); + if(p == NULL) { + LV_LOG_WARN("Out of memory"); + return NULL; + } + + p->flag = flag; + p->value.num = ref_value; + p->inv = inv; + + lv_observer_t * observable = lv_subject_add_observer_obj(subject, cb, obj, p); + observable->auto_free_user_data = 1; + return observable; +} + +static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + flag_and_cond_t * p = observer->user_data; + + bool res = subject->value.num == p->value.num; + if(p->inv) res = !res; + + if(res) { + lv_obj_add_flag(observer->target, p->flag); + } + else { + lv_obj_remove_flag(observer->target, p->flag); + } +} + +static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + flag_and_cond_t * p = observer->user_data; + + bool res = subject->value.num == p->value.num; + if(p->inv) res = !res; + + if(res) { + lv_obj_add_state(observer->target, p->flag); + } + else { + lv_obj_remove_state(observer->target, p->flag); + } +} + +#if LV_USE_BUTTON + +static void btn_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_obj_has_state(obj, LV_STATE_CHECKED)); +} + +#endif /*LV_USE_BUTTON*/ + +#if LV_USE_LABEL + +static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + const char * fmt = observer->user_data; + + if(fmt == NULL) { + lv_label_set_text(observer->target, subject->value.pointer); + } + else { + switch(subject->type) { + case LV_SUBJECT_TYPE_INT: + lv_label_set_text_fmt(observer->target, fmt, subject->value.num); + break; + case LV_SUBJECT_TYPE_STRING: + case LV_SUBJECT_TYPE_POINTER: + lv_label_set_text_fmt(observer->target, fmt, subject->value.pointer); + break; + default: + break; + } + } +} + +#endif /*LV_USE_LABEL*/ + +#if LV_USE_ARC + +static void arc_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * arc = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_arc_get_value(arc)); +} + +static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_arc_set_value(observer->target, subject->value.num); +} + +#endif /*LV_USE_ARC*/ + +#if LV_USE_SLIDER + +static void slider_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * slider = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_slider_get_value(slider)); +} + +static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_slider_set_value(observer->target, subject->value.num, LV_ANIM_OFF); +} + +#endif /*LV_USE_SLIDER*/ + +#if LV_USE_ROLLER + +static void roller_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * roller = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_roller_get_selected(roller)); +} + +static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + if((int32_t)lv_roller_get_selected(observer->target) != subject->value.num) { + lv_roller_set_selected(observer->target, subject->value.num, LV_ANIM_OFF); + } +} + +#endif /*LV_USE_ROLLER*/ + +#if LV_USE_DROPDOWN + +static void dropdown_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_dropdown_get_selected(dropdown)); +} + +static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_dropdown_set_selected(observer->target, subject->value.num); +} + +#endif /*LV_USE_DROPDOWN*/ + +#endif /*LV_USE_OBSERVER*/ diff --git a/libraries/lvgl/src/others/observer/lv_observer.h b/libraries/lvgl/src/others/observer/lv_observer.h new file mode 100644 index 0000000..e1c9cb6 --- /dev/null +++ b/libraries/lvgl/src/others/observer/lv_observer.h @@ -0,0 +1,406 @@ +/** + * @file lv_observer.h + * + */ + +#ifndef LV_OBSERVER_H +#define LV_OBSERVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj.h" +#if LV_USE_OBSERVER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_observer_t; +typedef struct _lv_observer_t lv_observer_t; + +typedef enum { + LV_SUBJECT_TYPE_INVALID = 0, /**< indicates subject not initialized yet*/ + LV_SUBJECT_TYPE_NONE = 1, /**< a null value like None or NILt*/ + LV_SUBJECT_TYPE_INT = 2, /**< an int32_t*/ + LV_SUBJECT_TYPE_POINTER = 3, /**< a void pointer*/ + LV_SUBJECT_TYPE_COLOR = 4, /**< an lv_color_t*/ + LV_SUBJECT_TYPE_GROUP = 5, /**< an array of subjects*/ + LV_SUBJECT_TYPE_STRING = 6, /**< a char pointer*/ +} lv_subject_type_t; + +/** + * A common type to handle all the various observable types in the same way + */ +typedef union { + int32_t num; /**< Integer number (opacity, enums, booleans or "normal" numbers)*/ + const void * pointer; /**< Constant pointer (string buffer, format string, font, cone text, etc)*/ + lv_color_t color; /**< Color */ +} lv_subject_value_t; + +/** + * The subject (an observable value) + */ +typedef struct { + lv_ll_t subs_ll; /**< Subscribers*/ + uint32_t type : 4; + uint32_t size : 28; /**< Might be used to store a size related to `type`*/ + lv_subject_value_t value; /**< Actual value*/ + lv_subject_value_t prev_value; /**< Previous value*/ + uint32_t notify_restart_query : 1; /**< If an observer deleted start notifying from the beginning. */ + void * user_data; /**< Additional parameter, can be used freely by the user*/ +} lv_subject_t; + +/** + * Callback called when the observed value changes + * @param observer pointer to the observer of the callback + * @param subject pointer to the subject of the observer + */ +typedef void (*lv_observer_cb_t)(lv_observer_t * observer, lv_subject_t * subject); + +/** + * The observer object: a descriptor returned when subscribing LVGL widgets to subjects + */ +struct _lv_observer_t { + lv_subject_t * subject; /**< The observed value */ + lv_observer_cb_t cb; /**< Callback that should be called when the value changes*/ + void * target; /**< A target for the observer, e.g. a widget or style*/ + void * user_data; /**< Additional parameter supplied when subscribing*/ + uint32_t auto_free_user_data : 1; /**< Automatically free user data when the observer is removed */ + uint32_t notified : 1; /**< Mark if this observer was already notified*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an integer type subject + * @param subject pointer to the subject + * @param value initial value + */ +void lv_subject_init_int(lv_subject_t * subject, int32_t value); + +/** + * Set the value of an integer subject. It will notify all the observers as well. + * @param subject pointer to the subject + * @param value the new value + */ +void lv_subject_set_int(lv_subject_t * subject, int32_t value); + +/** + * Get the current value of an integer subject + * @param subject pointer to the subject + * @return the current value + */ +int32_t lv_subject_get_int(lv_subject_t * subject); + +/** + * Get the previous value of an integer subject + * @param subject pointer to the subject + * @return the current value + */ +int32_t lv_subject_get_previous_int(lv_subject_t * subject); + +/** + * Initialize a string type subject + * @param subject pointer to the subject + * @param buf pointer to a buffer to store the string + * @param prev_buf pointer to a buffer to store the previous string, can be NULL if not used + * @param size size of the buffer + * @param value initial value as a string, e.g. "hello" + * @note the string subject stores the whole string, not only a pointer + */ +void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value); + +/** + * Copy a string to a subject. It will notify all the observers as well. + * @param subject pointer to the subject + * @param buf the new string + */ +void lv_subject_copy_string(lv_subject_t * subject, const char * buf); + +/** + * Get the current value of an string subject + * @param subject pointer to the subject + * @return pointer to the buffer containing the current value + */ +const char * lv_subject_get_string(lv_subject_t * subject); + +/** + * Get the previous value of an string subject + * @param subject pointer to the subject + * @return pointer to the buffer containing the current value + * @note NULL will be returned if NULL was passed in `lv_subject_init_string()` + * as `prev_buf` + */ +const char * lv_subject_get_previous_string(lv_subject_t * subject); + +/** + * Initialize an pointer type subject + * @param subject pointer to the subject + * @param value initial value + */ +void lv_subject_init_pointer(lv_subject_t * subject, void * value); + +/** + * Set the value of a pointer subject. It will notify all the observers as well. + * @param subject pointer to the subject + * @param value the new value + */ +void lv_subject_set_pointer(lv_subject_t * subject, void * ptr); + +/** + * Get the current value of a pointer subject + * @param subject pointer to the subject + * @return the current value + */ +const void * lv_subject_get_pointer(lv_subject_t * subject); + +/** + * Get the previous value of a pointer subject + * @param subject pointer to the subject + * @return the current value + */ +const void * lv_subject_get_previous_pointer(lv_subject_t * subject); + +/** + * Initialize an color type subject + * @param subject pointer to the subject + * @param value initial value + */ +void lv_subject_init_color(lv_subject_t * subject, lv_color_t color); + +/** + * Set the value of a color subject. It will notify all the observers as well. + * @param subject pointer to the subject + * @param value the new value + */ +void lv_subject_set_color(lv_subject_t * subject, lv_color_t color); + +/** + * Get the current value of a color subject + * @param subject pointer to the subject + * @return the current value + */ +lv_color_t lv_subject_get_color(lv_subject_t * subject); + +/** + * Get the previous value of a color subject + * @param subject pointer to the subject + * @return the current value + */ +lv_color_t lv_subject_get_previous_color(lv_subject_t * subject); + +/** + * Initialize a subject group + * @param subject pointer to the subject + * @param list list of other subject addresses, any of these changes `subject` will be notified + * @param list_len number of elements in `list` + */ +void lv_subject_init_group(lv_subject_t * subject, lv_subject_t * list[], uint32_t list_len); + +/** + * Get an element from the subject group's list + * @param subject pointer to the subject + * @param index index of the element to get + * @return pointer a subject from the list, or NULL if the index is out of bounds + */ +lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index); + +/** + * Add an observer to a subject. When the subject changes `observer_cb` will be called. + * @param subject pointer to the subject + * @param observer_cb the callback to call + * @param user_data optional user data + * @return pointer to the created observer + */ +lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t observer_cb, void * user_data); + +/** + * Add an observer to a subject for an object. + * When the object is deleted, it will be removed from the subject automatically. + * @param subject pointer to the subject + * @param observer_cb the callback to call + * @param obj pointer to an object + * @param user_data optional user data + * @return pointer to the created observer + */ +lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t observer_cb, lv_obj_t * obj, + void * user_data); + +/** + * Add an observer to a subject and also save a target. + * @param subject pointer to the subject + * @param observer_cb the callback to call + * @param target pointer to any data + * @param user_data optional user data + * @return pointer to the created observer + */ +lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t cb, void * target, + void * user_data); + +/** + * Remove an observer from its subject + * @param observer pointer to an observer + */ +void lv_observer_remove(lv_observer_t * observer); + +/** + * Remove all observers from their subject related to an object + * @param observer pointer to an observer + * @param obj pointer to an object + */ +void lv_subject_remove_all_obj(lv_subject_t * subject, lv_obj_t * obj); + +/** + * Get the target of an observer + * @param observer pointer to an observer + * @return pointer to the saved target + */ +void * lv_observer_get_target(lv_observer_t * observer); + +/** + * Get the target object of the observer. + * It's the same as `lv_observer_get_target` and added only + * for semantic reasons + * @param observer pointer to an observer + * @return pointer to the saved object target + */ +static inline lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer) +{ + return (lv_obj_t *)lv_observer_get_target(observer); +} + +/** + * Notify all observers of subject + * @param subject pointer to a subject + */ +void lv_subject_notify(lv_subject_t * subject); + +/** + * Set an object flag if an integer subject's value is equal to a reference value, clear the flag otherwise + * @param obj pointer to an object + * @param subject pointer to a subject + * @param flag a flag to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value a reference value to compare the subject's value with + * @return pointer to the created observer + */ +lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + +/** + * Set an object flag if an integer subject's value is not equal to a reference value, clear the flag otherwise + * @param obj pointer to an object + * @param subject pointer to a subject + * @param flag a flag to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value a reference value to compare the subject's value with + * @return pointer to the created observer + */ +lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, + int32_t ref_value); + +/** + * Set an object state if an integer subject's value is equal to a reference value, clear the flag otherwise + * @param obj pointer to an object + * @param subject pointer to a subject + * @param flag a state to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value a reference value to compare the subject's value with + * @return pointer to the created observer + */ +lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set an object state if an integer subject's value is not equal to a reference value, clear the flag otherwise + * @param obj pointer to an object + * @param subject pointer to a subject + * @param flag a state to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value a reference value to compare the subject's value with + * @return pointer to the created observer + */ +lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, + int32_t ref_value); + +#if LV_USE_BUTTON +/** + * Set an integer subject to 1 when a button is checked and set it 0 when unchecked. + * @param obj pointer to a button + * @param subject pointer to a subject + * @return pointer to the created observer + */ +lv_observer_t * lv_button_bind_checked(lv_obj_t * obj, lv_subject_t * subject); +#endif + +#if LV_USE_LABEL +/** + * Bind an integer, string, or pointer subject to a label. + * @param obj pointer to a label + * @param subject pointer to a subject + * @param fmt an optional format string with 1 format specifier (e.g. "%d °C") + * or NULL to bind the value directly. + * @return pointer to the created observer + * @note fmt == NULL can be used only with string and pointer subjects. + * @note if the subject is a pointer must point to a `\0` terminated string. + */ +lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt); +#endif + +#if LV_USE_ARC +/** + * Bind an integer subject to an arc's value + * @param obj pointer to an arc + * @param subject pointer to a subject + * @return pointer to the created observer + */ +lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +#if LV_USE_SLIDER +/** + * Bind an integer subject to a slider's value + * @param obj pointer to a slider + * @param subject pointer to a subject + * @return pointer to the created observer + */ +lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +#if LV_USE_ROLLER +/** + * Bind an integer subject to a roller's value + * @param obj pointer to a roller + * @param subject pointer to a subject + * @return pointer to the created observer + */ +lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +#if LV_USE_DROPDOWN +/** + * Bind an integer subject to a dropdown's value + * @param obj pointer to a drop down + * @param subject pointer to a subject + * @return pointer to the created observer + */ +lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OBSERVER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBSERVER_H*/ diff --git a/libraries/lvgl/src/others/snapshot/lv_snapshot.c b/libraries/lvgl/src/others/snapshot/lv_snapshot.c new file mode 100644 index 0000000..021467b --- /dev/null +++ b/libraries/lvgl/src/others/snapshot/lv_snapshot.c @@ -0,0 +1,150 @@ +/** + * @file lv_snapshot.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_snapshot.h" +#if LV_USE_SNAPSHOT + +#include +#include "../../display/lv_display.h" +#include "../../core/lv_refr.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a draw buffer for object to store the snapshot image. + */ +lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf) +{ + lv_obj_update_layout(obj); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + if(w == 0 || h == 0) return NULL; + + return lv_draw_buf_create(w, h, cf, LV_STRIDE_AUTO); +} + +lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) +{ + lv_obj_update_layout(obj); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + if(w == 0 || h == 0) return LV_RESULT_INVALID; + + draw_buf = lv_draw_buf_reshape(draw_buf, LV_COLOR_FORMAT_UNKNOWN, w, h, LV_STRIDE_AUTO); + return draw_buf == NULL ? LV_RESULT_INVALID : LV_RESULT_OK; +} + +lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(draw_buf); + lv_result_t res; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + break; + default: + LV_LOG_WARN("Not supported color format"); + return LV_RESULT_INVALID; + } + + res = lv_snapshot_reshape_draw_buf(obj, draw_buf); + if(res != LV_RESULT_OK) return res; + + /* clear draw buffer*/ + lv_draw_buf_clear(draw_buf, NULL); + + lv_area_t snapshot_area; + int32_t w = draw_buf->header.w; + int32_t h = draw_buf->header.h; + int32_t ext_size = _lv_obj_get_ext_draw_size(obj); + lv_obj_get_coords(obj, &snapshot_area); + lv_area_increase(&snapshot_area, ext_size, ext_size); + + lv_layer_t layer; + lv_memzero(&layer, sizeof(layer)); + + layer.draw_buf = draw_buf; + layer.buf_area.x1 = snapshot_area.x1; + layer.buf_area.y1 = snapshot_area.y1; + layer.buf_area.x2 = snapshot_area.x1 + w - 1; + layer.buf_area.y2 = snapshot_area.y1 + h - 1; + layer.color_format = cf; + layer._clip_area = snapshot_area; + + lv_display_t * disp_old = _lv_refr_get_disp_refreshing(); + lv_display_t * disp_new = lv_obj_get_display(obj); + lv_layer_t * layer_old = disp_new->layer_head; + disp_new->layer_head = &layer; + + _lv_refr_set_disp_refreshing(disp_new); + lv_obj_redraw(&layer, obj); + + while(layer.draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch_layer(NULL, &layer); + } + + disp_new->layer_head = layer_old; + _lv_refr_set_disp_refreshing(disp_old); + + return LV_RESULT_OK; +} + +lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) +{ + LV_ASSERT_NULL(obj); + lv_draw_buf_t * draw_buf = lv_snapshot_create_draw_buf(obj, cf); + if(draw_buf == NULL) return NULL; + + if(lv_snapshot_take_to_draw_buf(obj, cf, draw_buf) != LV_RESULT_OK) { + lv_draw_buf_destroy(draw_buf); + return NULL; + } + + return draw_buf; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_SNAPSHOT*/ diff --git a/libraries/lvgl/src/others/snapshot/lv_snapshot.h b/libraries/lvgl/src/others/snapshot/lv_snapshot.h new file mode 100644 index 0000000..f8cd0ca --- /dev/null +++ b/libraries/lvgl/src/others/snapshot/lv_snapshot.h @@ -0,0 +1,114 @@ +/** + * @file lv_snapshot.h + * + */ + +#ifndef LV_SNAPSHOT_H +#define LV_SNAPSHOT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_SNAPSHOT +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Take snapshot for object with its children, create the draw buffer as needed. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @return a pointer to an draw buffer containing snapshot image, or NULL if failed. + */ +lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf); + +/** + * Create a draw buffer to store the snapshot image for object. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @return a pointer to an draw buffer ready for taking snapshot, or NULL if failed. + */ +lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf); + +/** + * Reshape the draw buffer to prepare for taking snapshot for obj. + * This is usually used to check if the existing draw buffer is enough for + * obj snapshot. If return LV_RESULT_INVALID, you should create a new one. + * @param draw_buf the draw buffer to reshape. + * @param obj the object to generate snapshot. + */ +lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); + +/** + * Take snapshot for object with its children, save image info to provided buffer. + * @param obj the object to generate snapshot. + * @param cf color format for new snapshot image. + * It could differ with cf of `draw_buf` as long as the new cf will fit in. + * @param draw_buf the draw buffer to store the image result. It's reshaped automatically. + * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. + */ +lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf); + +/** + * @deprecated Use `lv_draw_buf_destroy` instead. + * + * Free the snapshot image returned by @ref lv_snapshot_take + * @param dsc the image descriptor generated by lv_snapshot_take. + */ +static inline void lv_snapshot_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly."); + lv_draw_buf_destroy((lv_draw_buf_t *)dsc); +} + +/** + * Take snapshot for object with its children, save image info to provided buffer. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buf the buffer to store image data. It must meet align requirement. + * @param buf_size provided buffer size in bytes. + * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. + * @deprecated Use lv_snapshot_take_to_draw_buf instead. + */ +static inline lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, + void * buf, + uint32_t buf_size) +{ + lv_draw_buf_t draw_buf; + LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead."); + lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size); + lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf); + if(res == LV_RESULT_OK) { + lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t)); + } + return res; +} + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_SNAPSHOT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/lvgl/src/others/sysmon/lv_sysmon.c b/libraries/lvgl/src/others/sysmon/lv_sysmon.c new file mode 100644 index 0000000..a9f311f --- /dev/null +++ b/libraries/lvgl/src/others/sysmon/lv_sysmon.c @@ -0,0 +1,286 @@ +/** + * @file lv_sysmon.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_sysmon.h" + +#if LV_USE_SYSMON + +#include "../../core/lv_global.h" +#include "../../misc/lv_async.h" +#include "../../stdlib/lv_string.h" +#include "../../widgets/label/lv_label.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_sysmon_class) + +#define SYSMON_REFR_PERIOD_DEF 300 /* ms */ + +#if defined(LV_USE_PERF_MONITOR) && LV_USE_PERF_MONITOR + #define sysmon_perf LV_GLOBAL_DEFAULT()->sysmon_perf + #define _USE_PERF_MONITOR 1 +#else + #define _USE_PERF_MONITOR 0 +#endif + +#if defined(LV_USE_MEM_MONITOR) && LV_USE_MEM_MONITOR + #define sysmon_mem LV_GLOBAL_DEFAULT()->sysmon_mem + #define _USE_MEM_MONITOR 1 +#else + #define _USE_MEM_MONITOR 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if _USE_PERF_MONITOR + static void perf_update_timer_cb(lv_timer_t * t); + static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if _USE_MEM_MONITOR + static void mem_update_timer_cb(lv_timer_t * t); + static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void _lv_sysmon_builtin_init(void) +{ +#if _USE_PERF_MONITOR + static lv_sysmon_perf_info_t perf_info; + lv_subject_init_pointer(&sysmon_perf.subject, &perf_info); + sysmon_perf.timer = lv_timer_create(perf_update_timer_cb, SYSMON_REFR_PERIOD_DEF, &perf_info); +#endif + +#if _USE_MEM_MONITOR + static lv_mem_monitor_t mem_info; + lv_subject_init_pointer(&sysmon_mem.subject, &mem_info); + sysmon_mem.timer = lv_timer_create(mem_update_timer_cb, SYSMON_REFR_PERIOD_DEF, &mem_info); +#endif +} + +void _lv_sysmon_builtin_deinit(void) +{ +#if _USE_PERF_MONITOR + lv_timer_delete(sysmon_perf.timer); +#endif + +#if _USE_MEM_MONITOR + lv_timer_delete(sysmon_mem.timer); +#endif +} + +lv_obj_t * lv_sysmon_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * label = lv_label_create(parent); + lv_obj_set_style_bg_opa(label, LV_OPA_50, 0); + lv_obj_set_style_bg_color(label, lv_color_black(), 0); + lv_obj_set_style_text_color(label, lv_color_white(), 0); + lv_obj_set_style_pad_all(label, 3, 0); + lv_label_set_text(label, "?"); + return label; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if _USE_PERF_MONITOR + +static void perf_monitor_disp_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_sysmon_perf_info_t * info = (lv_sysmon_perf_info_t *)lv_subject_get_pointer(&sysmon_perf.subject); + + switch(code) { + case LV_EVENT_REFR_START: + info->measured.refr_interval_sum += lv_tick_elaps(info->measured.refr_start); + info->measured.refr_start = lv_tick_get(); + break; + case LV_EVENT_REFR_READY: + info->measured.refr_elaps_sum += lv_tick_elaps(info->measured.refr_start); + info->measured.refr_cnt++; + break; + case LV_EVENT_RENDER_START: + info->measured.render_in_progress = 1; + info->measured.render_start = lv_tick_get(); + break; + case LV_EVENT_RENDER_READY: + info->measured.render_in_progress = 0; + info->measured.render_elaps_sum += lv_tick_elaps(info->measured.render_start); + info->measured.render_cnt++; + break; + case LV_EVENT_FLUSH_START: + case LV_EVENT_FLUSH_WAIT_START: + if(info->measured.render_in_progress) { + info->measured.flush_in_render_start = lv_tick_get(); + } + else { + info->measured.flush_not_in_render_start = lv_tick_get(); + } + break; + case LV_EVENT_FLUSH_FINISH: + case LV_EVENT_FLUSH_WAIT_FINISH: + if(info->measured.render_in_progress) { + info->measured.flush_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_in_render_start); + } + else { + info->measured.flush_not_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_not_in_render_start); + } + break; + default: + break; + } +} + +static void perf_update_timer_cb(lv_timer_t * t) +{ + /*Wait for a display*/ + if(!sysmon_perf.inited && lv_display_get_default()) { + lv_display_add_event_cb(lv_display_get_default(), perf_monitor_disp_event_cb, LV_EVENT_ALL, NULL); + + lv_obj_t * obj1 = lv_sysmon_create(lv_layer_sys()); + lv_obj_align(obj1, LV_USE_PERF_MONITOR_POS, 0, 0); + lv_subject_add_observer_obj(&sysmon_perf.subject, perf_observer_cb, obj1, NULL); +#if LV_USE_PERF_MONITOR_LOG_MODE + lv_obj_add_flag(obj1, LV_OBJ_FLAG_HIDDEN); +#endif + sysmon_perf.inited = true; + } + + if(!sysmon_perf.inited) return; + + uint32_t LV_SYSMON_GET_IDLE(void); + + lv_sysmon_perf_info_t * info = lv_timer_get_user_data(t); + info->calculated.run_cnt++; + + uint32_t time_since_last_report = lv_tick_elaps(info->measured.last_report_timestamp); + lv_timer_t * disp_refr_timer = lv_display_get_refr_timer(NULL); + uint32_t disp_refr_period = disp_refr_timer->period; + + info->calculated.fps = info->measured.refr_interval_sum ? (1000 * info->measured.refr_cnt / time_since_last_report) : 0; + info->calculated.fps = LV_MIN(info->calculated.fps, + 1000 / disp_refr_period); /*Limit due to possible off-by-one error*/ + + info->calculated.cpu = 100 - LV_SYSMON_GET_IDLE(); + info->calculated.refr_avg_time = info->measured.refr_cnt ? (info->measured.refr_elaps_sum / info->measured.refr_cnt) : + 0; + + info->calculated.flush_avg_time = info->measured.render_cnt ? + ((info->measured.flush_in_render_elaps_sum + info->measured.flush_not_in_render_elaps_sum) + / info->measured.render_cnt) : 0; + /*Flush time was measured in rendering time so subtract it*/ + info->calculated.render_avg_time = info->measured.render_cnt ? ((info->measured.render_elaps_sum - + info->measured.flush_in_render_elaps_sum) / + info->measured.render_cnt) : 0; + + info->calculated.cpu_avg_total = ((info->calculated.cpu_avg_total * (info->calculated.run_cnt - 1)) + + info->calculated.cpu) / info->calculated.run_cnt; + info->calculated.fps_avg_total = ((info->calculated.fps_avg_total * (info->calculated.run_cnt - 1)) + + info->calculated.fps) / info->calculated.run_cnt; + + lv_subject_set_pointer(&sysmon_perf.subject, info); + + lv_sysmon_perf_info_t prev_info = *info; + lv_memzero(info, sizeof(lv_sysmon_perf_info_t)); + info->measured.refr_start = prev_info.measured.refr_start; + info->calculated.cpu_avg_total = prev_info.calculated.cpu_avg_total; + info->calculated.fps_avg_total = prev_info.calculated.fps_avg_total; + info->calculated.run_cnt = prev_info.calculated.run_cnt; + + info->measured.last_report_timestamp = lv_tick_get(); +} + +static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_obj_t * label = lv_observer_get_target(observer); + const lv_sysmon_perf_info_t * perf = lv_subject_get_pointer(subject); + +#if LV_USE_PERF_MONITOR_LOG_MODE + LV_UNUSED(label); + LV_LOG("sysmon: " + "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32"), " + "refr %" LV_PRIu32 "ms (render %" LV_PRIu32 "ms | flush %" LV_PRIu32 "ms), " + "CPU %" LV_PRIu32 "%%\n", + perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt, + perf->calculated.refr_avg_time, perf->calculated.render_avg_time, perf->calculated.flush_avg_time, + perf->calculated.cpu); +#else + lv_label_set_text_fmt( + label, + "%" LV_PRIu32" FPS, %" LV_PRIu32 "%% CPU\n" + "%" LV_PRIu32" ms (%" LV_PRIu32" | %" LV_PRIu32")", + perf->calculated.fps, perf->calculated.cpu, + perf->calculated.render_avg_time + perf->calculated.flush_avg_time, + perf->calculated.render_avg_time, perf->calculated.flush_avg_time + ); +#endif /*LV_USE_PERF_MONITOR_LOG_MODE*/ +} + +#endif + +#if _USE_MEM_MONITOR + +static void mem_update_timer_cb(lv_timer_t * t) +{ + /*Wait for a display*/ + if(!sysmon_mem.inited && lv_display_get_default()) { + lv_obj_t * obj2 = lv_sysmon_create(lv_layer_sys()); + lv_obj_align(obj2, LV_USE_MEM_MONITOR_POS, 0, 0); + lv_subject_add_observer_obj(&sysmon_mem.subject, mem_observer_cb, obj2, NULL); + sysmon_mem.inited = true; + } + + if(!sysmon_mem.inited) return; + + lv_mem_monitor_t * mem_mon = lv_timer_get_user_data(t); + lv_mem_monitor(mem_mon); + lv_subject_set_pointer(&sysmon_mem.subject, mem_mon); +} + +static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_obj_t * label = lv_observer_get_target(observer); + const lv_mem_monitor_t * mon = lv_subject_get_pointer(subject); + + size_t used_size = mon->total_size - mon->free_size;; + size_t used_kb = used_size / 1024; + size_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; + size_t max_used_kb = mon->max_used / 1024; + size_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102; + lv_label_set_text_fmt(label, + "%zu.%zu kB (%d%%)\n" + "%zu.%zu kB max, %d%% frag.", + used_kb, used_kb_tenth, mon->used_pct, + max_used_kb, max_used_kb_tenth, + mon->frag_pct); +} + +#endif + +#endif /*LV_USE_SYSMON*/ diff --git a/libraries/lvgl/src/others/sysmon/lv_sysmon.h b/libraries/lvgl/src/others/sysmon/lv_sysmon.h new file mode 100644 index 0000000..849e4d8 --- /dev/null +++ b/libraries/lvgl/src/others/sysmon/lv_sysmon.h @@ -0,0 +1,115 @@ +/** + * @file lv_sysmon.h + * + */ + +#ifndef LV_SYSMON_H +#define LV_SYSMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_timer.h" +#include "../../others/observer/lv_observer.h" + +#if LV_USE_SYSMON + +#if LV_USE_LABEL == 0 +#error "lv_sysmon: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " +#endif + +#if LV_USE_OBSERVER == 0 +#error "lv_observer: lv_observer is required. Enable it in lv_conf.h (LV_USE_OBSERVER 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_subject_t subject; + lv_timer_t * timer; + bool inited; +} lv_sysmon_backend_data_t; + +#if LV_USE_PERF_MONITOR +typedef struct { + struct { + bool inited; + uint32_t refr_start; + uint32_t refr_interval_sum; + uint32_t refr_elaps_sum; + uint32_t refr_cnt; + uint32_t render_start; + uint32_t render_elaps_sum; /*Contains the flush time too*/ + uint32_t render_cnt; + uint32_t flush_in_render_start; + uint32_t flush_in_render_elaps_sum; + uint32_t flush_not_in_render_start; + uint32_t flush_not_in_render_elaps_sum; + uint32_t last_report_timestamp; + uint32_t render_in_progress : 1; + } measured; + + struct { + uint32_t fps; + uint32_t cpu; + uint32_t refr_avg_time; + uint32_t render_avg_time; /**< Pure rendering time without flush time*/ + uint32_t flush_avg_time; /**< Pure flushing time without rendering time*/ + uint32_t cpu_avg_total; + uint32_t fps_avg_total; + uint32_t run_cnt; + } calculated; + +} lv_sysmon_perf_info_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a system monitor object. + * @param parent pointer to an object, it will be the parent of the new system monitor + * @return pointer to the new system monitor object + */ +lv_obj_t * lv_sysmon_create(lv_obj_t * parent); + +/** + * Set the refresh period of the system monitor object + * @param obj pointer to a system monitor object + * @param period the refresh period in milliseconds + */ +void lv_sysmon_set_refr_period(lv_obj_t * obj, uint32_t period); + +/** + * Initialize built-in system monitor, such as performance and memory monitor. + */ +void _lv_sysmon_builtin_init(void); + +/** + * DeInitialize built-in system monitor, such as performance and memory monitor. + */ +void _lv_sysmon_builtin_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SYSMON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYSMON_H*/ diff --git a/libraries/lvgl/src/others/vg_lite_tvg/vg_lite.h b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite.h new file mode 100644 index 0000000..2f970fb --- /dev/null +++ b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite.h @@ -0,0 +1,1380 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef _vg_lite_h_ +#define _vg_lite_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) +#define inline __inline +#endif + +#include +#include + + +/* VGLite API Constants *******************************************************************************************************************/ + +#define VGLITE_HEADER_VERSION 7 + +#ifndef VGLITE_VERSION_3_0 +#define VGLITE_VERSION_3_0 1 + +#define VGLITE_MAKE_VERSION(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch)) +#define VGLITE_VERSION_MAJOR(version) (((uint32_t)(version) >> 16) & 0xff) +#define VGLITE_VERSION_MINOR(version) (((uint32_t)(version) >> 8) & 0xff) +#define VGLITE_VERSION_PATCH(version) ((uint32_t)(version) & 0xff) + +#define VGLITE_API_VERSION_3_0 VGLITE_MAKE_VERSION(3, 0, 0) + +#define VGLITE_RELEASE_VERSION VGLITE_MAKE_VERSION(4,0,47) + +#define VGL_FALSE 0 +#define VGL_TRUE 1 + +/* Path command (op code). */ +#define VLC_OP_END 0x00 +#define VLC_OP_CLOSE 0x01 +#define VLC_OP_MOVE 0x02 +#define VLC_OP_MOVE_REL 0x03 +#define VLC_OP_LINE 0x04 +#define VLC_OP_LINE_REL 0x05 +#define VLC_OP_QUAD 0x06 +#define VLC_OP_QUAD_REL 0x07 +#define VLC_OP_CUBIC 0x08 +#define VLC_OP_CUBIC_REL 0x09 +#define VLC_OP_BREAK 0x0A +#define VLC_OP_HLINE 0x0B +#define VLC_OP_HLINE_REL 0x0C +#define VLC_OP_VLINE 0x0D +#define VLC_OP_VLINE_REL 0x0E +#define VLC_OP_SQUAD 0x0F +#define VLC_OP_SQUAD_REL 0x10 +#define VLC_OP_SCUBIC 0x11 +#define VLC_OP_SCUBIC_REL 0x12 +#define VLC_OP_SCCWARC 0x13 +#define VLC_OP_SCCWARC_REL 0x14 +#define VLC_OP_SCWARC 0x15 +#define VLC_OP_SCWARC_REL 0x16 +#define VLC_OP_LCCWARC 0x17 +#define VLC_OP_LCCWARC_REL 0x18 +#define VLC_OP_LCWARC 0x19 +#define VLC_OP_LCWARC_REL 0x1A + +/* Macros for path manipulating: See path definitions. */ +#define VLM_PATH_ENABLE_UPLOAD(path) (path).uploaded.property |= 1 +#define VLM_PATH_DISABLE_UPLOAD(path) (path).uploaded.property &= (~1) +#define VLM_PATH_GET_UPLOAD_BIT(path) ((path).uploaded.property & 1) + +/* Gradient constants. */ +#define VLC_MAX_COLOR_RAMP_STOPS 256 /*! The max number of radial gradient stops. */ +#define VLC_MAX_GRADIENT_STOPS 16 /*! The max number of gradient stops. */ +#define VLC_GRADIENT_BUFFER_WIDTH 1024 /*! The internal gradient buffer width.*/ + + +/* API name defines for backward compatibility to VGLite 2.0 APIs */ +#define vg_lite_buffer_upload vg_lite_upload_buffer +#define vg_lite_path_append vg_lite_append_path +#define vg_lite_path_calc_length vg_lite_get_path_length +#define vg_lite_set_ts_buffer vg_lite_set_tess_buffer +#define vg_lite_set_draw_path_type vg_lite_set_path_type +#define vg_lite_create_mask_layer vg_lite_create_masklayer +#define vg_lite_fill_mask_layer vg_lite_fill_masklayer +#define vg_lite_blend_mask_layer vg_lite_blend_masklayer +#define vg_lite_generate_mask_layer_by_path vg_lite_render_masklayer +#define vg_lite_set_mask_layer vg_lite_set_masklayer +#define vg_lite_destroy_mask_layer vg_lite_destroy_masklayer +#define vg_lite_enable_mask vg_lite_enable_masklayer +#define vg_lite_enable_color_transformation vg_lite_enable_color_transform +#define vg_lite_set_color_transformation vg_lite_set_color_transform +#define vg_lite_set_image_global_alpha vg_lite_source_global_alpha +#define vg_lite_set_dest_global_alpha vg_lite_dest_global_alpha +#define vg_lite_clear_rad_grad vg_lite_clear_radial_grad +#define vg_lite_update_rad_grad vg_lite_update_radial_grad +#define vg_lite_get_rad_grad_matrix vg_lite_get_radial_grad_matrix +#define vg_lite_set_rad_grad vg_lite_set_radial_grad +#define vg_lite_draw_linear_gradient vg_lite_draw_linear_grad +#define vg_lite_draw_radial_gradient vg_lite_draw_radial_grad +#define vg_lite_draw_gradient vg_lite_draw_grad +#define vg_lite_mem_avail vg_lite_get_mem_size +#define vg_lite_set_update_stroke vg_lite_update_stroke + +#define vg_lite_buffer_image_mode_t vg_lite_image_mode_t +#define vg_lite_draw_path_type_t vg_lite_path_type_t +#define vg_lite_linear_gradient_ext_t vg_lite_ext_linear_gradient_t +#define vg_lite_buffer_transparency_mode_t vg_lite_transparency_t + + +/* VGLite API Types ***********************************************************************************************************************/ + +typedef unsigned char vg_lite_uint8_t; +typedef char vg_lite_int8_t; +typedef short vg_lite_int16_t; +typedef unsigned short vg_lite_uint16_t; +typedef int vg_lite_int32_t; +typedef unsigned int vg_lite_uint32_t; +typedef unsigned long long vg_lite_uint64_t; +typedef float vg_lite_float_t; +typedef double vg_lite_double_t; +typedef char vg_lite_char; +typedef char* vg_lite_string; +typedef void* vg_lite_pointer; +typedef void vg_lite_void; +typedef unsigned int vg_lite_color_t; + + +/* VGLite API Enumerations ****************************************************************************************************************/ + +#ifndef VG_LITE_ERROR +#define VG_LITE_ERROR 1 + + /* Error codes that the vg_lite functions can return. */ + typedef enum vg_lite_error + { + VG_LITE_SUCCESS = 0, /*! Success. */ + VG_LITE_INVALID_ARGUMENT, /*! An invalid argument was specified. */ + VG_LITE_OUT_OF_MEMORY, /*! Out of memory. */ + VG_LITE_NO_CONTEXT, /*! No context or an unintialized context specified. */ + VG_LITE_TIMEOUT, /*! A timeout has occurred during a wait. */ + VG_LITE_OUT_OF_RESOURCES, /*! Out of system resources. */ + VG_LITE_GENERIC_IO, /*! Cannot communicate with the kernel driver. */ + VG_LITE_NOT_SUPPORT, /*! Function call not supported. */ + VG_LITE_ALREADY_EXISTS, /*! Object already exists */ + VG_LITE_NOT_ALIGNED, /*! Data alignment error */ + VG_LITE_FLEXA_TIME_OUT, /*! VG timeout requesting for segment buffer */ + VG_LITE_FLEXA_HANDSHAKE_FAIL, /*! VG and SBI synchronizer handshake failed */ + } vg_lite_error_t; +#endif + + /* Chip features bit */ + typedef enum vg_lite_feature + { + gcFEATURE_BIT_VG_IM_INDEX_FORMAT, + gcFEATURE_BIT_VG_SCISSOR, + gcFEATURE_BIT_VG_BORDER_CULLING, + gcFEATURE_BIT_VG_RGBA2_FORMAT, + gcFEATURE_BIT_VG_QUALITY_8X, + gcFEATURE_BIT_VG_IM_FASTCLAER, + gcFEATURE_BIT_VG_RADIAL_GRADIENT, + gcFEATURE_BIT_VG_GLOBAL_ALPHA, + gcFEATURE_BIT_VG_RGBA8_ETC2_EAC, + gcFEATURE_BIT_VG_COLOR_KEY, + gcFEATURE_BIT_VG_DOUBLE_IMAGE, + gcFEATURE_BIT_VG_YUV_OUTPUT, + gcFEATURE_BIT_VG_FLEXA, + gcFEATURE_BIT_VG_24BIT, + gcFEATURE_BIT_VG_DITHER, + gcFEATURE_BIT_VG_USE_DST, + gcFEATURE_BIT_VG_PE_CLEAR, + gcFEATURE_BIT_VG_IM_INPUT, + gcFEATURE_BIT_VG_DEC_COMPRESS, + gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT, + gcFEATURE_BIT_VG_MASK, + gcFEATURE_BIT_VG_MIRROR, + gcFEATURE_BIT_VG_GAMMA, + gcFEATURE_BIT_VG_NEW_BLEND_MODE, + gcFEATURE_BIT_VG_STENCIL, + gcFEATURE_BIT_VG_SRC_PREMULTIPLIED, /*! Valid only if gcFEATURE_BIT_VG_HW_PREMULTIPLY is 0 */ + gcFEATURE_BIT_VG_HW_PREMULTIPLY, /*! HW multiplier can accept either premultiplied or not */ + gcFEATURE_BIT_VG_COLOR_TRANSFORMATION, + gcFEATURE_BIT_VG_LVGL_SUPPORT, + gcFEATURE_BIT_VG_INDEX_ENDIAN, + gcFEATURE_BIT_VG_24BIT_PLANAR, + gcFEATURE_BIT_VG_PIXEL_MATRIX, + gcFEATURE_BIT_VG_NEW_IMAGE_INDEX, + gcFEATURE_BIT_VG_PARALLEL_PATHS, + gcFEATURE_BIT_VG_STRIPE_MODE, + gcFEATURE_BIT_VG_IM_DEC_INPUT, + gcFEATURE_BIT_VG_GAUSSIAN_BLUR, + gcFEATURE_BIT_VG_RECTANGLE_TILED_OUT, + gcFEATURE_BIT_VG_TESSELLATION_TILED_OUT, + gcFEATURE_BIT_VG_IM_REPEAT_REFLECT, + gcFEATURE_BIT_VG_YUY2_INPUT, + gcFEATURE_BIT_VG_YUV_INPUT, + gcFEATURE_BIT_VG_YUV_TILED_INPUT, + gcFEATURE_BIT_VG_AYUV_INPUT, + gcFEATURE_BIT_VG_16PIXELS_ALIGN, + gcFEATURE_BIT_VG_DEC_COMPRESS_2_0, + gcFEATURE_COUNT + } vg_lite_feature_t; + + /* Rendering quality enums. */ + typedef enum vg_lite_quality + { + VG_LITE_HIGH, /*! High quality 16x anti-aliasing path. */ + VG_LITE_UPPER, /*! Upper quality 8x anti-aliasing path. */ + VG_LITE_MEDIUM, /*! Medium quality 4x anti-aliasing path. */ + VG_LITE_LOW, /*! Low quality path without any anti-aliasing. */ + } vg_lite_quality_t; + + /* Format of path coordinates. */ + typedef enum vg_lite_format + { + VG_LITE_S8, /*! Signed 8-bit coordinates. */ + VG_LITE_S16, /*! Signed 16-bit coordinates. */ + VG_LITE_S32, /*! Signed 32-bit coordinates. */ + VG_LITE_FP32, /*! 32-bit floating point coordinates. */ + } vg_lite_format_t; + + /* Format of pixel buffer. */ + typedef enum vg_lite_buffer_format + { + /* OpenVG VGImageFormat enums: + * Note: The bits for each color channel are stored within a machine word + * from MSB to LSB in the order indicated by the pixel format name. + * This is opposite of VG_LITE_* formats (from LSB to MSB). + */ + + /* RGB{A,X} channel ordering */ + VG_sRGBX_8888 = 0, + VG_sRGBA_8888 = 1, + VG_sRGBA_8888_PRE = 2, + VG_sRGB_565 = 3, + VG_sRGBA_5551 = 4, + VG_sRGBA_4444 = 5, + VG_sL_8 = 6, + VG_lRGBX_8888 = 7, + VG_lRGBA_8888 = 8, + VG_lRGBA_8888_PRE = 9, + VG_lL_8 = 10, + VG_A_8 = 11, + VG_BW_1 = 12, + VG_A_1 = 13, + VG_A_4 = 14, + + VG_sRGBX_8888_PRE = 15, + VG_sRGB_565_PRE = 16, + VG_sRGBA_5551_PRE = 17, + VG_sRGBA_4444_PRE = 18, + VG_lRGBX_8888_PRE = 19, + VG_lRGB_565 = 20, + VG_lRGB_565_PRE = 21, + VG_lRGBA_5551 = 22, + VG_lRGBA_5551_PRE = 23, + VG_lRGBA_4444 = 24, + VG_lRGBA_4444_PRE = 25, + + /* {A,X}RGB channel ordering */ + VG_sXRGB_8888 = 0 | (1 << 6), + VG_sARGB_8888 = 1 | (1 << 6), + VG_sARGB_8888_PRE = 2 | (1 << 6), + VG_sARGB_1555 = 4 | (1 << 6), + VG_sARGB_4444 = 5 | (1 << 6), + VG_lXRGB_8888 = 7 | (1 << 6), + VG_lARGB_8888 = 8 | (1 << 6), + VG_lARGB_8888_PRE = 9 | (1 << 6), + + /* BGR{A,X} channel ordering */ + VG_sBGRX_8888 = 0 | (1 << 7), + VG_sBGRA_8888 = 1 | (1 << 7), + VG_sBGRA_8888_PRE = 2 | (1 << 7), + VG_sBGR_565 = 3 | (1 << 7), + VG_sBGRA_5551 = 4 | (1 << 7), + VG_sBGRA_4444 = 5 | (1 << 7), + VG_lBGRX_8888 = 7 | (1 << 7), + VG_lBGRA_8888 = 8 | (1 << 7), + VG_lBGRA_8888_PRE = 9 | (1 << 7), + + /* {A,X}BGR channel ordering */ + VG_sXBGR_8888 = 0 | (1 << 6) | (1 << 7), + VG_sABGR_8888 = 1 | (1 << 6) | (1 << 7), + VG_sABGR_8888_PRE = 2 | (1 << 6) | (1 << 7), + VG_sABGR_1555 = 4 | (1 << 6) | (1 << 7), + VG_sABGR_4444 = 5 | (1 << 6) | (1 << 7), + VG_lXBGR_8888 = 7 | (1 << 6) | (1 << 7), + VG_lABGR_8888 = 8 | (1 << 6) | (1 << 7), + VG_lABGR_8888_PRE = 9 | (1 << 6) | (1 << 7), + + /* Original VGLite API image format enums: + * Note: The bits for each color channel are stored within a machine word + * from LSB to MSB in the order indicated by the pixel format name. + * This is opposite of OPENVG VG_* formats (from MSB to LSB). + */ + VG_LITE_RGBA8888 = 0 | (1 << 10), + VG_LITE_BGRA8888 = 1 | (1 << 10), + VG_LITE_RGBX8888 = 2 | (1 << 10), + VG_LITE_BGRX8888 = 3 | (1 << 10), + VG_LITE_RGB565 = 4 | (1 << 10), + VG_LITE_BGR565 = 5 | (1 << 10), + VG_LITE_RGBA4444 = 6 | (1 << 10), + VG_LITE_BGRA4444 = 7 | (1 << 10), + VG_LITE_BGRA5551 = 8 | (1 << 10), + VG_LITE_A4 = 9 | (1 << 10), + VG_LITE_A8 = 10 | (1 << 10), + VG_LITE_L8 = 11 | (1 << 10), + VG_LITE_YUYV = 12 | (1 << 10), + VG_LITE_YUY2 = 13 | (1 << 10), + VG_LITE_ANV12 = 14 | (1 << 10), + VG_LITE_AYUY2 = 15 | (1 << 10), + VG_LITE_NV12 = 16 | (1 << 10), + VG_LITE_YV12 = 17 | (1 << 10), + VG_LITE_YV24 = 18 | (1 << 10), + VG_LITE_YV16 = 19 | (1 << 10), + VG_LITE_NV16 = 20 | (1 << 10), + VG_LITE_YUY2_TILED = 21 | (1 << 10), + VG_LITE_NV12_TILED = 22 | (1 << 10), + VG_LITE_ANV12_TILED = 23 | (1 << 10), + VG_LITE_AYUY2_TILED = 24 | (1 << 10), + VG_LITE_RGBA2222 = 25 | (1 << 10), + VG_LITE_BGRA2222 = 26 | (1 << 10), + VG_LITE_ABGR2222 = 27 | (1 << 10), + VG_LITE_ARGB2222 = 28 | (1 << 10), + VG_LITE_ABGR4444 = 29 | (1 << 10), + VG_LITE_ARGB4444 = 30 | (1 << 10), + VG_LITE_ABGR8888 = 31 | (1 << 10), + VG_LITE_ARGB8888 = 32 | (1 << 10), + VG_LITE_ABGR1555 = 33 | (1 << 10), + VG_LITE_RGBA5551 = 34 | (1 << 10), + VG_LITE_ARGB1555 = 35 | (1 << 10), + VG_LITE_XBGR8888 = 36 | (1 << 10), + VG_LITE_XRGB8888 = 37 | (1 << 10), + VG_LITE_RGBA8888_ETC2_EAC = 38 | (1 << 10), + VG_LITE_RGB888 = 39 | (1 << 10), + VG_LITE_BGR888 = 40 | (1 << 10), + VG_LITE_ABGR8565 = 41 | (1 << 10), + VG_LITE_BGRA5658 = 42 | (1 << 10), + VG_LITE_ARGB8565 = 43 | (1 << 10), + VG_LITE_RGBA5658 = 44 | (1 << 10), + VG_LITE_ABGR8565_PLANAR = 45 | (1 << 10), + VG_LITE_BGRA5658_PLANAR = 46 | (1 << 10), + VG_LITE_ARGB8565_PLANAR = 47 | (1 << 10), + VG_LITE_RGBA5658_PLANAR = 48 | (1 << 10), + + VG_LITE_INDEX_1 = 0 | (1 << 11), /*! Indexed format. */ + VG_LITE_INDEX_2 = 1 | (1 << 11), + VG_LITE_INDEX_4 = 2 | (1 << 11), + VG_LITE_INDEX_8 = 3 | (1 << 11), + + } vg_lite_buffer_format_t; + + /* Swizzle of packed YUV format UV channels. */ + typedef enum vg_lite_swizzle + { + VG_LITE_SWIZZLE_UV, + VG_LITE_SWIZZLE_VU, + } vg_lite_swizzle_t; + + /* The YUV<->RGB conversion rule. */ + typedef enum vg_lite_yuv2rgb + { + VG_LITE_YUV601, + VG_LITE_YUV709, + } vg_lite_yuv2rgb_t; + + /* The pixel layout in a buffer. */ + typedef enum vg_lite_buffer_layout + { + VG_LITE_LINEAR, + VG_LITE_TILED, + } vg_lite_buffer_layout_t; + + /* The image (buffer) rendering mode. Match OpenVG enum VGImageMode */ + typedef enum vg_lite_image_mode + { + /* For enum value backward compatibility */ + VG_LITE_ZERO = 0, + VG_LITE_NORMAL_IMAGE_MODE = 0x1F00, + VG_LITE_MULTIPLY_IMAGE_MODE = 0x1F01, + VG_LITE_STENCIL_MODE = 0x1F02, + VG_LITE_NONE_IMAGE_MODE = 0x1F03, + VG_LITE_RECOLOR_MODE = 0x1F04, + } vg_lite_image_mode_t; + + /* The image (buffer) transparency mode. */ + typedef enum vg_lite_transparency + { + VG_LITE_IMAGE_OPAQUE, + VG_LITE_IMAGE_TRANSPARENT + } vg_lite_transparency_t; + + /* Blending modes. VG_BLEND_* match OpenVG enum VGBlendMode. + * S and D represent source and destination color channels. + * Sa and Da represent the source and destination alpha channels. + */ + typedef enum vg_lite_blend + { + VG_LITE_BLEND_NONE = 0, /*! S, No blend, Non-premultiplied */ + VG_LITE_BLEND_SRC_OVER = 1, /*! S + (1 - Sa) * D , Non-premultiplied */ + VG_LITE_BLEND_DST_OVER = 2, /*! (1 - Da) * S + D , Non-premultiplied */ + VG_LITE_BLEND_SRC_IN = 3, /*! Da * S , Non-premultiplied */ + VG_LITE_BLEND_DST_IN = 4, /*! Sa * D , Non-premultiplied */ + VG_LITE_BLEND_MULTIPLY = 5, /*! S * (1 - Da) + D * (1 - Sa) + S * D , Non-premultiplied */ + VG_LITE_BLEND_SCREEN = 6, /*! S + D - S * D , Non-premultiplied */ + VG_LITE_BLEND_DARKEN = 7, /*! min(SrcOver, DstOver) , Non-premultiplied */ + VG_LITE_BLEND_LIGHTEN = 8, /*! max(SrcOver, DstOver) , Non-premultiplied */ + VG_LITE_BLEND_ADDITIVE = 9, /*! S + D , Non-premultiplied */ + VG_LITE_BLEND_SUBTRACT = 10, /*! D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_SUBTRACT_LVGL = 11, /*! D - S , Non-premultiplied */ + VG_LITE_BLEND_NORMAL_LVGL = 12, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ + VG_LITE_BLEND_ADDITIVE_LVGL = 13, /*! (S + D) * Sa + D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_MULTIPLY_LVGL = 14, /*! (S * D) * Sa + D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_PREMULTIPLY_SRC_OVER = 15, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ + + OPENVG_BLEND_SRC = 0x2000, /*! Copy SRC, no blend, Premultiplied */ + OPENVG_BLEND_SRC_OVER = 0x2001, /*! Porter-Duff SRC_OVER blend, Premultiplied */ + OPENVG_BLEND_DST_OVER = 0x2002, /*! Porter-Duff DST_OVER blend, Premultiplied */ + OPENVG_BLEND_SRC_IN = 0x2003, /*! Porter-Duff SRC_IN blend, Premultiplied */ + OPENVG_BLEND_DST_IN = 0x2004, /*! Porter-Duff DST_IN blend, Premultiplied */ + OPENVG_BLEND_MULTIPLY = 0x2005, /*! Porter-Duff MULTIPLY blend, Premultiplied */ + OPENVG_BLEND_SCREEN = 0x2006, /*! Porter-Duff SCREEN blend, Premultiplied */ + OPENVG_BLEND_DARKEN = 0x2007, /*! Porter-Duff DARKEN blend, Premultiplied */ + OPENVG_BLEND_LIGHTEN = 0x2008, /*! Porter-Duff LIGHTEN blend, Premultiplied */ + OPENVG_BLEND_ADDITIVE = 0x2009, /*! Porter-Duff ADDITIVE blend, Premultiplied */ + } vg_lite_blend_t; + + /* Fill rules. Match OpenVG enum VGFillRule */ + typedef enum vg_lite_fill + { + VG_LITE_FILL_EVEN_ODD = 0x1900, /*! A pixel is drawn it it crosses an odd number of path pixels. */ + VG_LITE_FILL_NON_ZERO = 0x1901, /*! A pixel is drawn if it crosses at least one path pixel. */ + } vg_lite_fill_t; + + /* Global alpha modes. */ + typedef enum vg_lite_global_alpha + { + VG_LITE_NORMAL = 0, /*! Use original src/dst alpha value. */ + VG_LITE_GLOBAL, /*! Use global src/dst alpha value to replace original src/dst alpha value. */ + VG_LITE_SCALED, /*! Multiply global src/dst alpha value and original src/dst alpha value. */ + } vg_lite_global_alpha_t; + + /* Filter modes. */ + typedef enum vg_lite_filter + { + VG_LITE_FILTER_POINT = 0, /*! Fetch the nearest image pixel. */ + VG_LITE_FILTER_LINEAR = 0x1000, /*! Used for linear paint. */ + VG_LITE_FILTER_BI_LINEAR = 0x2000, /*! Use a 2x2 box around the image pixel and perform an interpolation. */ + VG_LITE_FILTER_GAUSSIAN = 0x3000, /*! Perform 3x3 gaussian blur with the convolution for image pixel. */ + } vg_lite_filter_t; + + /* Pattern padding mode. Match OpenVG enum VGTilingMode. */ + typedef enum vg_lite_pattern_mode + { + VG_LITE_PATTERN_COLOR = 0x1D00, /*! Pixel outside the bounds of sourceimage should be taken as the color */ + VG_LITE_PATTERN_PAD = 0x1D01, /*! Pixel outside the bounds of sourceimage should be taken as having the same color as the closest edge pixel */ + VG_LITE_PATTERN_REPEAT = 0x1D02, /*! Pixel outside the bounds of sourceimage should be repeated indefinitely in all directions */ + VG_LITE_PATTERN_REFLECT = 0x1D03, /*! Pixel outside the bounds of sourceimage should be reflected indefinitely in all directions */ + } vg_lite_pattern_mode_t; + + /* Paint type. Match OpenVG enum VGPaintType. */ + typedef enum vg_lite_paint_type + { + /* For enum value backward compatibility */ + VG_LITE_PAINT_ZERO = 0, + VG_LITE_PAINT_COLOR = 0x1B00, + VG_LITE_PAINT_LINEAR_GRADIENT = 0x1B01, + VG_LITE_PAINT_RADIAL_GRADIENT = 0x1B02, + VG_LITE_PAINT_PATTERN = 0x1B03, + } vg_lite_paint_type_t; + + /* Radial gradient padding mode. Match OpenVG enum VGColorRampSpreadMode */ + typedef enum + { + VG_LITE_GRADIENT_SPREAD_FILL = 0, + VG_LITE_GRADIENT_SPREAD_PAD = 0x1C00, + VG_LITE_GRADIENT_SPREAD_REPEAT = 0x1C01, + VG_LITE_GRADIENT_SPREAD_REFLECT = 0x1C02, + } vg_lite_gradient_spreadmode_t; + + /* Decnano Compress mode. */ + typedef enum vg_lite_compress_mode + { + VG_LITE_DEC_DISABLE = 0, /*! disable compress */ + VG_LITE_DEC_NON_SAMPLE, /*! compress ratio is 1.6 if use ARGB8888, compress ratio is 2 if use XRGB8888 */ + VG_LITE_DEC_HSAMPLE, /*! compress ratio is 2 if use ARGB8888, compress ratio is 2.6 if use XRGB8888 */ + VG_LITE_DEC_HV_SAMPLE, /*! compress ratio is 2.6 if use ARGB8888, compress ratio is 4 if use XRGB8888 */ + } vg_lite_compress_mode_t; + + /* Draw path type. Match OpenVG enum VGPaintMode */ + typedef enum vg_lite_path_type + { + /* For enum value backward compatibility */ + VG_LITE_DRAW_ZERO = 0, + VG_LITE_DRAW_STROKE_PATH = (1<<0), + VG_LITE_DRAW_FILL_PATH = (1<<1), + VG_LITE_DRAW_FILL_STROKE_PATH = (1<<1 | 1<<0), + } vg_lite_path_type_t; + + /* End cap style. Match OpenVG enum VGCapStyle */ + typedef enum vg_lite_cap_style + { + VG_LITE_CAP_BUTT = 0x1700, + VG_LITE_CAP_ROUND = 0x1701, + VG_LITE_CAP_SQUARE = 0x1702, + } vg_lite_cap_style_t; + + /* Line join styles. Match OpenVG enum VGJoinStyle */ + typedef enum vg_lite_join_style + { + VG_LITE_JOIN_MITER = 0x1800, + VG_LITE_JOIN_ROUND = 0x1801, + VG_LITE_JOIN_BEVEL = 0x1802, + } vg_lite_join_style_t; + + /* Mask operation mode. Match OpenVG enum VGMaskOperation */ + typedef enum vg_lite_mask_operation + { + VG_LITE_CLEAR_MASK = 0x1500, /*! Set all dest mask values to 0 */ + VG_LITE_FILL_MASK = 0x1501, /*! Set all dest mask values to 1 */ + VG_LITE_SET_MASK = 0x1502, /*! Copy from src masklayer to dest masklayer. */ + VG_LITE_UNION_MASK = 0x1503, /*! Replace dest masklayer by its union with src masklayer. */ + VG_LITE_INTERSECT_MASK = 0x1504, /*! Replace dest masklayer by its intersection with src masklayer. */ + VG_LITE_SUBTRACT_MASK = 0x1505, /*! Subtract src mask in dest masklayer */ + } vg_lite_mask_operation_t; + + /* Mirror orientation mode. */ + typedef enum vg_lite_orientation + { + VG_LITE_ORIENTATION_TOP_BOTTOM, + VG_LITE_ORIENTATION_BOTTOM_TOP, + } vg_lite_orientation_t; + + /* Gamma conversion mode. */ + typedef enum vg_lite_gamma_conversion + { + VG_LITE_GAMMA_NO_CONVERSION, /*! Leave color as is. */ + VG_LITE_GAMMA_LINEAR, /*! Convert from sRGB to linear space. */ + VG_LITE_GAMMA_NON_LINEAR /*! Convert from linear to sRGB space. */ + } vg_lite_gamma_conversion_t; + + /* Index endian */ + typedef enum vg_lite_index_endian + { + VG_LITE_INDEX_LITTLE_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit0~bit7. + *! when using index2, the parsing order is bit0:1,bit2:3,bit4:5.bit6:7. + *! when using index4, the parsing order is bit0:3,bit4:7. + */ + VG_LITE_INDEX_BIG_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit7~bit0. + *! when using index2, the parsing order is bit7:6,bit5:4,bit3:2.bit1:0. + *! when using index4, the parsing order is bit4:7,bit0:3. + */ + } vg_lite_index_endian_t; + + /* Map flag*/ + typedef enum vg_lite_map_flag + { + VG_LITE_MAP_USER_MEMORY = 0, + VG_LITE_MAP_DMABUF = 0x01, + } vg_lite_map_flag_t; + + /*VGLite parameters variable*/ + typedef enum vg_lite_param_type + { + VG_LITE_SCISSOR_RECT, /*! count must be 4n for x, y, right, bottom */ + VG_LITE_GPU_IDLE_STATE, /*! 0: busy, 1: idle */ + } vg_lite_param_type_t; + +/* VGLite API Structures ******************************************************************************************************************/ + + /* VGLite driver information */ + typedef struct vg_lite_info { + vg_lite_uint32_t api_version; + vg_lite_uint32_t header_version; + vg_lite_uint32_t release_version; + vg_lite_uint32_t reserved; + } vg_lite_info_t; + + /* A 2D Point definition. */ + typedef struct vg_lite_point { + vg_lite_int32_t x; + vg_lite_int32_t y; + } vg_lite_point_t; + + /* Four 2D Point that form a polygon */ + typedef vg_lite_point_t vg_lite_point4_t[4]; + + /* A rectangle.*/ + typedef struct vg_lite_rectangle { + vg_lite_int32_t x; /*! Left coordinate of rectangle. */ + vg_lite_int32_t y; /*! Top coordinate of rectangle. */ + vg_lite_int32_t width; /*! Width of rectangle. */ + vg_lite_int32_t height; /*! Height of rectangle. */ + } vg_lite_rectangle_t; + + typedef struct vg_lite_matrix { + vg_lite_float_t m[3][3]; /*! The 3x3 matrix is in [row][column] order. */ + vg_lite_float_t scaleX; + vg_lite_float_t scaleY; + vg_lite_float_t angle; + } vg_lite_matrix_t; + + typedef struct vg_lite_yuvinfo + { + vg_lite_swizzle_t swizzle; /*! UV swizzle. */ + vg_lite_yuv2rgb_t yuv2rgb; /*! 601 or 709 conversion standard. */ + vg_lite_uint32_t uv_planar; /*! UV(U) planar address. */ + vg_lite_uint32_t v_planar; /*! V planar address. */ + vg_lite_uint32_t alpha_planar; /*! Alpha planar address. */ + vg_lite_uint32_t uv_stride; /*! UV(U) stride. */ + vg_lite_uint32_t v_stride; /*! V stride. */ + vg_lite_uint32_t alpha_stride; /*! Alpha stride. */ + vg_lite_uint32_t uv_height; /*! UV(U) height. */ + vg_lite_uint32_t v_height; /*! V height. */ + vg_lite_pointer uv_memory; /*! The logical pointer to the UV(U) planar memory. */ + vg_lite_pointer v_memory; /*! The logical pointer to the V planar memory. */ + vg_lite_pointer uv_handle; /*! The memory handle of the UV(U) planar. */ + vg_lite_pointer v_handle; /*! The memory handle of the V planar. */ + } vg_lite_yuvinfo_t; + + typedef struct vg_lite_path_point* vg_lite_path_point_ptr; + typedef struct vg_lite_path_point + { + /* X coordinate. */ + vg_lite_float_t x; + + /* Y coordinate. */ + vg_lite_float_t y; + + /* Flatten flag for flattened path. */ + vg_lite_uint8_t flatten_flag; + + /* Curve type for stroke path. */ + vg_lite_uint8_t curve_type; + + /* X tangent. */ + vg_lite_float_t tangentX; + + /* Y tangent. */ + vg_lite_float_t tangentY; + + /* Length of the line. */ + vg_lite_float_t length; + + /* Pointer to next point node. */ + vg_lite_path_point_ptr next; + + /* Pointer to previous point node. */ + vg_lite_path_point_ptr prev; + + } vg_lite_path_point_t; + + typedef struct vg_lite_sub_path* vg_lite_sub_path_ptr; + typedef struct vg_lite_sub_path + { + /* Pointer to next sub path. */ + vg_lite_sub_path_ptr next; + + /* Number of points. */ + vg_lite_uint32_t point_count; + + /* Point list. */ + vg_lite_path_point_ptr point_list; + + /* Last point. */ + vg_lite_path_point_ptr end_point; + + /* Whether is path is closed. */ + vg_lite_uint8_t closed; + + /* Sub path length. */ + vg_lite_float_t length; + + } vg_lite_sub_path_t; + + /* Save divided path data according to MOVE/MOVE_REL. */ + typedef struct vg_lite_path_list* vg_lite_path_list_ptr; + typedef struct vg_lite_path_list + { + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_list_ptr next; + vg_lite_uint8_t closed; + + } vg_lite_path_list_t; + + typedef struct vg_lite_stroke + { + /* Stroke parameters */ + vg_lite_cap_style_t cap_style; + vg_lite_join_style_t join_style; + vg_lite_float_t line_width; + vg_lite_float_t miter_limit; + vg_lite_float_t *dash_pattern; + vg_lite_uint32_t pattern_count; + vg_lite_float_t dash_phase; + vg_lite_float_t dash_length; + vg_lite_uint32_t dash_index; + vg_lite_float_t half_width; + + /* Total length of stroke dash patterns. */ + vg_lite_float_t pattern_length; + + /* For fast checking. */ + vg_lite_float_t miter_square; + + /* Temp storage of stroke subPath. */ + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_point_ptr left_point; + vg_lite_path_point_ptr right_point; + vg_lite_path_point_ptr stroke_points; + vg_lite_path_point_ptr stroke_end; + vg_lite_uint32_t stroke_count; + + /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ + vg_lite_path_list_ptr path_list_divide; + + /* pointer to current divided path data. */ + vg_lite_path_list_ptr cur_list; + + /* Flag that add end_path in driver. */ + vg_lite_uint8_t add_end; + vg_lite_uint8_t dash_reset; + + /* Sub path list. */ + vg_lite_sub_path_ptr stroke_paths; + + /* Last sub path. */ + vg_lite_sub_path_ptr last_stroke; + + /* Swing area handling. */ + vg_lite_uint32_t swing_handling; + vg_lite_float_t swing_deltax; + vg_lite_float_t swing_deltay; + vg_lite_path_point_ptr swing_start; + vg_lite_path_point_ptr swing_stroke; + vg_lite_float_t swing_length; + vg_lite_float_t swing_centlen; + vg_lite_uint32_t swing_count; + vg_lite_uint8_t need_swing; + vg_lite_uint8_t swing_ccw; + + vg_lite_float_t stroke_length; + vg_lite_uint32_t stroke_size; + + /* The stroke line is fat line. */ + vg_lite_uint8_t fattened; + vg_lite_uint8_t closed; + + } vg_lite_stroke_t; + + /* Fast clear buffer. */ + typedef struct vg_lite_fc_buffer + { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_pointer handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_uint32_t color; /*! The fastclear color value. */ + } vg_lite_fc_buffer_t; + + /* Structure for any image or render target. */ + typedef struct vg_lite_buffer + { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! Height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_buffer_layout_t tiled; /*! Indicating the buffer memory layout is linear or tiled. */ + vg_lite_buffer_format_t format; /*! The pixel format of the buffer. */ + vg_lite_pointer handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_yuvinfo_t yuv; /*! The yuv format details. */ + vg_lite_image_mode_t image_mode; /*! The blit image mode. */ + vg_lite_transparency_t transparency_mode; /*! image transparency mode. */ + vg_lite_fc_buffer_t fc_buffer[3]; /*! 3 fastclear buffers,reserved YUV format. */ + vg_lite_compress_mode_t compress_mode; /*! Refer to the definition by vg_lite_compress_mode_t. */ + vg_lite_index_endian_t index_endian; /*! Refer to the definition by vg_lite_index_endian_t. */ + vg_lite_paint_type_t paintType; /*! Get paintcolor from different paint types. */ + vg_lite_uint8_t fc_enable; /*! enable im fastclear. */ + vg_lite_uint8_t scissor_layer; /*! The buffer is scissor buffer. */ + vg_lite_uint8_t premultiplied; /*! The RGB pixel values are alpha-premultipled */ + } vg_lite_buffer_t; + + /* Memory allocation info by kernel. */ + typedef struct vg_lite_hw_memory + { + vg_lite_pointer handle; /*! gpu memory object handle. */ + vg_lite_pointer memory; /*! logical memory address. */ + vg_lite_uint32_t address; /*! GPU memory address. */ + vg_lite_uint32_t bytes; /*! Size of memory. */ + vg_lite_uint32_t property; /*! Currently bit0 is used for path upload state: + *! 1 : enable auto path data uploading. + *! 0 : disable path data uploading. path data is embedded in command buffer. */ + } vg_lite_hw_memory_t; + + /* Path info for drawing command. */ + typedef struct vg_lite_path + { + vg_lite_float_t bounding_box[4]; /*! Bounding box specified as left, top, right, and bottom. */ + vg_lite_quality_t quality; /*! Quality hint for the path. */ + vg_lite_format_t format; /*! Coordinate format. */ + vg_lite_hw_memory_t uploaded; /*! Path data that has been upload into GPU addressable memory. */ + vg_lite_uint32_t path_length; /*! Number of bytes in the path data. */ + vg_lite_pointer path; /*! Pointer to the physical description of the path. */ + vg_lite_int8_t path_changed; /*! Indicate whether path data is synced with command buffer (uploaded) or not. */ + vg_lite_int8_t pdata_internal; /*! Indicate whether path data memory is allocated by driver. */ + vg_lite_path_type_t path_type; /*! Refer to the definition by vg_lite_path_type_t. */ + vg_lite_stroke_t *stroke; /*! Pointer to a vg_lite_stroke_t structure.*/ + vg_lite_pointer stroke_path; /*! Pointer to the physical description of the stroke path. */ + vg_lite_uint32_t stroke_size; /*! Number of bytes in the stroke path data. */ + vg_lite_color_t stroke_color; /*! The stroke path fill color. */ + vg_lite_int8_t add_end; /*! Flag that add end_path in driver. */ + } vg_lite_path_t; + + /* Color ramp definition. */ + typedef struct vg_lite_color_ramp + { + vg_lite_float_t stop; /*! Value for the color stop. */ + vg_lite_float_t red; /*! Red color channel value for the color stop. */ + vg_lite_float_t green; /*! Green color channel value for the color stop. */ + vg_lite_float_t blue; /*! Blue color channel value for the color stop. */ + vg_lite_float_t alpha; /*! Alpha color channel value for the color stop. */ + } vg_lite_color_ramp_t; + + /* Linear gradient parameter */ + typedef struct vg_lite_linear_gradient_parameter + { + vg_lite_float_t X0; + vg_lite_float_t Y0; + vg_lite_float_t X1; + vg_lite_float_t Y1; + } vg_lite_linear_gradient_parameter_t; + + typedef struct vg_lite_radial_gradient_parameter + { + vg_lite_float_t cx; /*! x coordinate of the center point. */ + vg_lite_float_t cy; /*! y coordinate of the center point. */ + vg_lite_float_t r; /*! radius. */ + vg_lite_float_t fx; /*! x coordinate of the focal point. */ + vg_lite_float_t fy; /*! y coordinate of the focal point. */ + } vg_lite_radial_gradient_parameter_t; + + /* Linear gradient definition. */ + typedef struct vg_lite_linear_gradient { + vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; /*! Colors for stops. */ + vg_lite_uint32_t count; /*! Count of colors, up to 16. */ + vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; /*! Color stops, value from 0 to 255. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + } vg_lite_linear_gradient_t; + + /* Extended linear gradient definition. */ + typedef struct vg_lite_ext_linear_gradient { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_linear_gradient_parameter_t linear_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ + } vg_lite_ext_linear_gradient_t; + + /* Radial gradient definition. */ + typedef struct vg_lite_radial_gradient + { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_radial_gradient_parameter_t radial_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to the driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ + } vg_lite_radial_gradient_t; + + /* Colorkey definition */ + typedef struct vg_lite_color_key + { + vg_lite_uint8_t enable; /*! The color key is effective only when "enable" is ture, */ + vg_lite_uint8_t low_r; /*! The R chanel of low_rgb. */ + vg_lite_uint8_t low_g; /*! The G chanel of low_rgb. */ + vg_lite_uint8_t low_b; /*! The B chanel of low_rgb. */ + vg_lite_uint8_t alpha; /*! The alpha channel to replace destination pixel alpha channel.*/ + vg_lite_uint8_t hign_r; /*! The R chanel of hign_rgb. */ + vg_lite_uint8_t hign_g; /*! The G chanel of hign_rgb. */ + vg_lite_uint8_t hign_b; /*! The B chanel of hign_rgb. */ + } vg_lite_color_key_t; + + /* Four colorkey definition. + * rgb_hi_0, rgb_lo_0, alpha_0, enable_0; + * rgb_hi_1, rgb_lo_1, alpha_1, enable_1; + * rgb_hi_2, rgb_lo_2, alpha_2, enable_2; + * rgb_hi_3, rgb_lo_3, alpha_3, enable_3; + * Priority order: color_key_0 > color_key_1 > color_key_2 > color_key_3. + */ + typedef vg_lite_color_key_t vg_lite_color_key4_t[4]; + + /* Pixel matrix values */ + typedef vg_lite_float_t vg_lite_pixel_matrix_t[20]; + + /* HW pixel channel enable flags */ + typedef struct vg_lite_pixel_channel_enable + { + vg_lite_uint8_t enable_a; /*! Enable A channel.*/ + vg_lite_uint8_t enable_b; /*! Enable B channel. */ + vg_lite_uint8_t enable_g; /*! Enable G channel. */ + vg_lite_uint8_t enable_r; /*! Enable R channel. */ + } vg_lite_pixel_channel_enable_t; + + /* Pixel color transform */ + typedef struct vg_lite_color_transform + { + vg_lite_float_t a_scale; + vg_lite_float_t a_bias; + vg_lite_float_t r_scale; + vg_lite_float_t r_bias; + vg_lite_float_t g_scale; + vg_lite_float_t g_bias; + vg_lite_float_t b_scale; + vg_lite_float_t b_bias; + } vg_lite_color_transform_t; + +/* VGLite API Functions *******************************************************************************************************************/ + + /* Initialize a vglite context. */ + vg_lite_error_t vg_lite_init(vg_lite_int32_t tess_width, vg_lite_int32_t tess_height); + + /* Destroy a vglite context. */ + vg_lite_error_t vg_lite_close(void); + + /* Get the VGLite driver information. */ + vg_lite_error_t vg_lite_get_info(vg_lite_info_t* info); + + /* Get the GPU chip information. */ + vg_lite_uint32_t vg_lite_get_product_info(vg_lite_char *name, vg_lite_uint32_t *chip_id, vg_lite_uint32_t *chip_rev); + + /* Query if a specific feature is supported. */ + vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature); + + /* Flush command buffer and wait for GPU to complete. */ + vg_lite_error_t vg_lite_finish(void); + + /* Flush the command buffer without waiting for GPU to complete. */ + vg_lite_error_t vg_lite_flush(void); + + /* Get the value of register from register's address. */ + vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t* result); + + /* Generate a 3x3 homogenous matrix to transform 4 source coordinates to 4 target coordinates. */ + vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_point4_t src, vg_lite_point4_t dst, vg_lite_matrix_t *mat); + + /* Allocate a buffer from GPU hardware accessible memory. */ + vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t *buffer); + + /* Free a buffer allocated by vg_lite_allocate() */ + vg_lite_error_t vg_lite_free(vg_lite_buffer_t *buffer); + + /* Upload RGB or YUV pixel data to an allocated buffer. */ + vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t *buffer, vg_lite_uint8_t *data[3], vg_lite_uint32_t stride[3]); + + /* Map a buffer into hardware accessible address space. */ + vg_lite_error_t vg_lite_map(vg_lite_buffer_t *buffer, vg_lite_map_flag_t flag, int32_t fd); + + /* Unmap a buffer that is mapped */ + vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t *buffer); + + /* flush cache */ + vg_lite_error_t vg_lite_flush_mapped_buffer(vg_lite_buffer_t * buffer); + + /* Fill a buffer rectangle area with a specified color. */ + vg_lite_error_t vg_lite_clear(vg_lite_buffer_t *target, vg_lite_rectangle_t *rect, vg_lite_color_t color); + + /* Copy a source image to target buffer with transformation, blending, color mixing, and filtering. */ + vg_lite_error_t vg_lite_blit(vg_lite_buffer_t *target, + vg_lite_buffer_t *source, + vg_lite_matrix_t *matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + + /* Copy a rectangle area of source image to target buffer with transformation, blending, color mixing, and filtering. */ + vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t *target, + vg_lite_buffer_t *source, + vg_lite_rectangle_t *rect, + vg_lite_matrix_t *matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + + /* Copy two source images to the target buffer with transformation, blending, and filtering. */ + vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t *target, + vg_lite_buffer_t *source0, + vg_lite_buffer_t *source1, + vg_lite_matrix_t *matrix0, + vg_lite_matrix_t *matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + + /* Copy a rectangle area of source image to target buffer without transformation, blending, color mixing, and filtering. */ + vg_lite_error_t vg_lite_copy_image(vg_lite_buffer_t *target, + vg_lite_buffer_t *source, + vg_lite_int32_t sx, + vg_lite_int32_t sy, + vg_lite_int32_t dx, + vg_lite_int32_t dy, + vg_lite_int32_t width, + vg_lite_int32_t height); + + /* Draw a path to a target buffer with transformation, color, and blending */ + vg_lite_error_t vg_lite_draw(vg_lite_buffer_t *target, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t *matrix, + vg_lite_blend_t blend, + vg_lite_color_t color); + + /* Set stroke path attributes. */ + vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t *path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t *dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t color); + + /* Update stroke path. */ + vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t *path); + + /* Set path type. */ + vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t *path, vg_lite_path_type_t path_type); + + /* Clears all attributes of a path. */ + vg_lite_error_t vg_lite_clear_path(vg_lite_path_t *path); + + /* Upload a path to GPU memory so GPU can access it directly. */ + vg_lite_error_t vg_lite_upload_path(vg_lite_path_t *path); + + /* Initialize a path object with attributes. */ + vg_lite_error_t vg_lite_init_path(vg_lite_path_t *path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + + /* Initializes a arc path with attributes. */ + vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t *path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + + /* Return the size (in bytes) of command buffer for a path opcode array. */ + vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t *opcode, + vg_lite_uint32_t count, + vg_lite_format_t format); + + /* Generate command buffer for the (path) based on input opcodes (opcode) and coordinates (data). */ + vg_lite_error_t vg_lite_append_path(vg_lite_path_t *path, + vg_lite_uint8_t *opcode, + vg_lite_pointer data, + vg_lite_uint32_t seg_count); + + /* Set CLUT (Color Look Up Table) for index image. The (colors) is in ARGB format. */ + vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t *colors); + + /* Draw a path that is filled by a transformed image pattern. */ + vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t *target, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t *path_matrix, + vg_lite_buffer_t *pattern_image, + vg_lite_matrix_t *pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter); + + /* Initialize a linear gradient object with default attributes. */ + vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t *grad); + + /* Reset a linear gradient object attributes. */ + vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t *grad); + + /* Update a linear gradient object. */ + vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t *grad); + + /* Return pointer to a linear gradient object's matrix. */ + vg_lite_matrix_t* vg_lite_get_grad_matrix(vg_lite_linear_gradient_t *grad); + + /* Set attributes for a linear gradient object. */ + vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t *grad, + vg_lite_uint32_t count, + vg_lite_uint32_t *colors, + vg_lite_uint32_t *stops); + + /* Draw a path with a linear gradient object pattern. */ + vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t *target, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t *matrix, + vg_lite_linear_gradient_t *grad, + vg_lite_blend_t blend); + + /* Reset an extended linear gradient object attributes and free image buffer. */ + vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t *grad); + + /* Update an extended linear gradient object. */ + vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t *grad); + + /* Return pointer to an extended linear gradient object's matrix. */ + vg_lite_matrix_t* vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t *grad); + + /* Set attributes for an extended linear gradient object. */ + vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t *grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t *color_ramp, + vg_lite_linear_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + + /* Draw a path with an extended linear gradient object. */ + vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t *target, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t *path_matrix, + vg_lite_ext_linear_gradient_t *grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + + /* Reset a radial gradient object attributes and free image buffer. */ + vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t *grad); + + /* Update a radial gradient object. */ + vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t *grad); + + /* Return pointer to a radial gradient object's matrix. */ + vg_lite_matrix_t* vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t *grad); + + /* Set attributes for a radial gradient object. */ + vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t *grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t *color_ramp, + vg_lite_radial_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + + /* Draw a path with a radial gradient object pattern. */ + vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t *target, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t *path_matrix, + vg_lite_radial_gradient_t *grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + + /* Load an identity matrix. */ + vg_lite_error_t vg_lite_identity(vg_lite_matrix_t *matrix); + + /* Translate a matrix. */ + vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t *matrix); + + /* Scale a matrix. */ + vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t *matrix); + + /* Rotate a matrix. */ + vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t *matrix); + + /* Set and enable a scissor rectangle for render target. */ + vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, vg_lite_int32_t bottom); + + /* Set scissor rectangles on mask layer. Scissor rects are enabled/disabled by following APIs. */ + vg_lite_error_t vg_lite_scissor_rects(vg_lite_uint32_t nums, vg_lite_rectangle_t rect[]); + + /* Enable scissor rects defined on mask layer. */ + vg_lite_error_t vg_lite_enable_scissor(void); + + /* Disable scissor rects defined on mask layer. */ + vg_lite_error_t vg_lite_disable_scissor(void); + + /* Query size of available contiguous video memory. */ + vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t *size); + + /* Set global alpha value for source image */ + vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + + /* Set global alpha value for destination image. */ + vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + + /* Set colorkey. */ + vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey); + + /* Enable dither function. Dither is OFF by default. */ + vg_lite_error_t vg_lite_enable_dither(void); + + /* Disable dither function. Dither is OFF by default. */ + vg_lite_error_t vg_lite_disable_dither(void); + + /* Set a 64-byte aligned memory buffer (physical) as VGLite tessellation buffer. */ + vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + + /* Can be called before vg_lite_init() to overwrite the default VG_LITE_COMMAND_BUFFER_SIZE */ + vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size); + + /* Set a user-defined external memory buffer (physical, 64-byte aligned) as VGLite command buffer. */ + vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + + /* Setup a pixel transform matrix m[20] which transforms each pixel as following: + * + * |a'| |m0 m1 m2 m3 m4 | |a| + * |r'| |m5 m6 m7 m8 m9 | |r| + * |g'| = |m10 m11 m12 m13 m14|.|g| + * |b'| |m15 m16 m17 m18 m19| |b| + * |1 | |0 0 0 0 1 | |1| + * + * The pixel transform for A, R, G, B channel can be enabled/disabled individually with (channel) parameter. + */ + vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t *channel); + + /* Setup 3x3 gaussian blur weight values to filter image pixels. + * + * Paramters w0, w1, w2 define a 3x3 gaussian blur weight matrix as below + * + * | w2 w1 w2 | + * | w1 w0 w1 | + * | w2 w1 w2 | + * + * The sum of 9 kernel weights must be 1.0 to avoid convolution overflow ( w0 + 4*w1 + 4*w2 = 1.0 ). + * The 3x3 weight matrix applies to a 3x3 pixel block + * + * | pixel[i-1][j-1] pixel[i][j-1] pixel[i+1][j-1]| + * | pixel[i-1][j] pixel[i][j] pixel[i+1][j] | + * | pixel[i-1][j+1] pixel[i][j+1] pixel[i+1][j+1]| + * + * With the following dot product equation: + * + * color[i][j] = w2*pixel[i-1][j-1] + w1*pixel[i][j-1] + w2*pixel[i+1][j-1] + * + w1*pixel[i-1][j] + w0*pixel[i][j] + w1*pixel[i+1][j] + * + w2*pixel[i-1][j+1] + w1*pixel[i][j+1] + w2*pixel[i+1][j+1]; + */ + vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2); + + /* Enable masklayer function. Masklayer is OFF by default. */ + vg_lite_error_t vg_lite_enable_masklayer(void); + + /* Disable masklayer function. Masklayer is OFF by default. */ + vg_lite_error_t vg_lite_disable_masklayer(void); + + /* Setup a masklayer. */ + vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t *masklayer); + + /* Free a masklayer and disable mask operation. */ + vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t *masklayer); + + /* Create a masklayer with default format A8 and default pixel value 255. */ + vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t *masklayer, + vg_lite_uint32_t width, + vg_lite_uint32_t height); + + /* Set pixel values for a rectangle area in a masklayer */ + vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t *masklayer, + vg_lite_rectangle_t *rect, + vg_lite_uint8_t value); + + /* Blend a rectangle area of src masklayer with dst masklayer according to (operation). */ + vg_lite_error_t vg_lite_blend_masklayer(vg_lite_buffer_t *dst, + vg_lite_buffer_t *src, + vg_lite_mask_operation_t operation, + vg_lite_rectangle_t *rect); + + /* Render a (path) with (fill_rule), (color), (matrix) to the masklayer. */ + vg_lite_error_t vg_lite_render_masklayer(vg_lite_buffer_t *masklayer, + vg_lite_mask_operation_t operation, + vg_lite_path_t *path, + vg_lite_fill_t fill_rule, + vg_lite_color_t color, + vg_lite_matrix_t *matrix); + + /* Set mirror orientation. */ + vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation); + + /* Set gamma value. */ + vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value); + + /* Enable color transformation, which is OFF by default. */ + vg_lite_error_t vg_lite_enable_color_transform(void); + + /* Disable color transformation, which is OFF by default. */ + vg_lite_error_t vg_lite_disable_color_transform(void); + + /* Set pixel color transformation scale and bias values for each pixel channel. */ + vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t *values); + + /* Set flexa stream id. */ + vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id); + + /* set flexa background buffer.*/ + vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, + vg_lite_buffer_t *buffer, + vg_lite_uint32_t seg_count, + vg_lite_uint32_t seg_size); + + /* Enable flexa. */ + vg_lite_error_t vg_lite_flexa_enable(void); + + /* Disable flexa.*/ + vg_lite_error_t vg_lite_flexa_disable(void); + + /* Set flexa stop flag after the last frame. */ + vg_lite_error_t vg_lite_flexa_stop_frame(void); + + /* Dump command buffer */ + vg_lite_error_t vg_lite_dump_command_buffer(void); + + /* Return VGLite parameters in params[] array */ + vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_float_t* params); + +#endif /* VGLITE_VERSION_3_0 */ + +#ifdef __cplusplus +} +#endif +#endif /* _vg_lite_h_ */ \ No newline at end of file diff --git a/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c new file mode 100644 index 0000000..a6e57d1 --- /dev/null +++ b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c @@ -0,0 +1,162 @@ +/** + * @file vg_lite_matrix.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG + +#include +#include +#include "vg_lite.h" + +/********************* + * DEFINES + *********************/ + +#define VG_SW_BLIT_PRECISION_OPT 1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix) +{ + /* Set identify matrix. */ + matrix->m[0][0] = 1.0f; + matrix->m[0][1] = 0.0f; + matrix->m[0][2] = 0.0f; + matrix->m[1][0] = 0.0f; + matrix->m[1][1] = 1.0f; + matrix->m[1][2] = 0.0f; + matrix->m[2][0] = 0.0f; + matrix->m[2][1] = 0.0f; + matrix->m[2][2] = 1.0f; + +#if VG_SW_BLIT_PRECISION_OPT + matrix->scaleX = 1.0f; + matrix->scaleY = 1.0f; + matrix->angle = 0.0f; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +static void multiply(vg_lite_matrix_t * matrix, vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) + + (matrix->m[row][1] * mult->m[1][column]) + + (matrix->m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ +#if VG_SW_BLIT_PRECISION_OPT + memcpy(matrix, &temp, sizeof(vg_lite_float_t) * 9); +#else + memcpy(matrix, &temp, sizeof(temp)); +#endif /* VG_SW_BLIT_PRECISION_OPT */ +} + +vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix) +{ + /* Set translation matrix. */ + vg_lite_matrix_t t = { { {1.0f, 0.0f, x}, + {0.0f, 1.0f, y}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &t); + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix) +{ + /* Set scale matrix. */ + vg_lite_matrix_t s = { { {scale_x, 0.0f, 0.0f}, + {0.0f, scale_y, 0.0f}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &s); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->scaleX = matrix->scaleX * scale_x; + matrix->scaleY = matrix->scaleY * scale_y; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix) +{ + /* Convert degrees into radians. */ + vg_lite_float_t angle = (degrees / 180.0f) * 3.141592654f; + + /* Compuet cosine and sine values. */ + vg_lite_float_t cos_angle = cosf(angle); + vg_lite_float_t sin_angle = sinf(angle); + + /* Set rotation matrix. */ + vg_lite_matrix_t r = { { {cos_angle, -sin_angle, 0.0f}, + {sin_angle, cos_angle, 0.0f}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &r); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->angle = matrix->angle + degrees; + if(matrix->angle >= 360) { + vg_lite_uint32_t count = (vg_lite_uint32_t)matrix->angle / 360; + matrix->angle = matrix->angle - count * 360; + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_VG_LITE_THORVG*/ diff --git a/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp new file mode 100644 index 0000000..97c63d7 --- /dev/null +++ b/libraries/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp @@ -0,0 +1,2658 @@ +/** + * @file vg_lite_tvg.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG + +#include "vg_lite.h" +#include "../../lvgl.h" +#include "../../libs/thorvg/thorvg.h" +#include +#include +#include +#include +#include +#include + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + #include +#endif + +/********************* + * DEFINES + *********************/ + +#define TVG_CANVAS_ENGINE CanvasEngine::Sw +#define TVG_COLOR(COLOR) B(COLOR), G(COLOR), R(COLOR), A(COLOR) +#define TVG_IS_VG_FMT_SUPPORT(fmt) ((fmt) == VG_LITE_BGRA8888 || (fmt) == VG_LITE_BGRX8888) + +#define TVG_CHECK_RETURN_VG_ERROR(FUNC) \ + do { \ + Result res = FUNC; \ + if (res != Result::Success) { \ + LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res); \ + return vg_lite_error_conv(res); \ + } \ + } while (0) +#define TVG_CHECK_RETURN_RESULT(FUNC) \ + do { \ + Result res = FUNC; \ + if (res != Result::Success) { \ + LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res);\ + return res; \ + } \ + } while (0) + +/* clang-format off */ + +#define IS_INDEX_FMT(fmt) \ + ((fmt) == VG_LITE_INDEX_1 \ + || (fmt) == VG_LITE_INDEX_2 \ + || (fmt) == VG_LITE_INDEX_4 \ + || (fmt) == VG_LITE_INDEX_8) + +#define VLC_GET_ARG(CUR, INDEX) vlc_get_arg((cur + (INDEX) * fmt_len), path->format); +#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr)) +#define VLC_OP_ARG_LEN(OP, LEN) \ + case VLC_OP_##OP: \ + return (LEN) + +#define A(color) ((color) >> 24) +#define R(color) (((color) & 0x00ff0000) >> 16) +#define G(color) (((color) & 0x0000ff00) >> 8) +#define B(color) ((color) & 0xff) +#define ARGB(a, r, g, b) ((a) << 24) | ((r) << 16) | ((g) << 8) | (b) +#define MIN(a, b) (a) > (b) ? (b) : (a) +#define MAX(a, b) (a) > (b) ? (a) : (b) +#define UDIV255(x) (((x) * 0x8081U) >> 0x17) +#define LERP(v1, v2, w) ((v1) * (w) + (v2) * (1.0f - (w))) +#define CLAMP(x, min, max) (((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x)) +#define COLOR_FROM_RAMP(ColorRamp) (((vg_lite_float_t*)ColorRamp) + 1) + +#define VG_LITE_RETURN_ERROR(func) \ + if ((error = func) != VG_LITE_SUCCESS) \ + return error + +#define VG_LITE_ALIGN(number, align_bytes) \ + (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) + +#define VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) + +#define VG_LITE_IS_ALPHA_FORMAT(format) \ + ((format) == VG_LITE_A8 || (format) == VG_LITE_A4) + +/* clang-format on */ + +/********************** + * TYPEDEFS + **********************/ + +using namespace tvg; + +#pragma pack(1) +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; +} vg_color24_t; + +typedef struct { + uint16_t blue : 5; + uint16_t green : 6; + uint16_t red : 5; +} vg_color16_t; + +typedef struct { + vg_color16_t c; + uint8_t alpha; +} vg_color16_alpha_t; + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; +} vg_color32_t; + +typedef struct { + vg_lite_float_t x; + vg_lite_float_t y; +} vg_lite_fpoint_t; + +#pragma pack() + +class vg_lite_ctx +{ + public: + std::unique_ptr canvas; + void * target_buffer; + vg_lite_uint32_t target_px_size; + vg_lite_buffer_format_t target_format; + + public: + vg_lite_ctx() + : target_buffer { nullptr } + , target_px_size { 0 } + , target_format { VG_LITE_BGRA8888 } + , clut_2colors { 0 } + , clut_4colors { 0 } + , clut_16colors { 0 } + , clut_256colors { 0 } + { + canvas = SwCanvas::gen(); + } + + vg_lite_uint32_t * get_image_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) + { + src_buffer.resize(w * h); + return src_buffer.data(); + } + + vg_lite_uint32_t * get_temp_target_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) + { + vg_lite_uint32_t px_size = w * h; + if(px_size > dest_buffer.size()) { + dest_buffer.resize(w * h); + } + return dest_buffer.data(); + } + + vg_lite_uint32_t * get_temp_target_buffer() + { + return dest_buffer.data(); + } + + void set_CLUT(vg_lite_uint32_t count, const vg_lite_uint32_t * colors) + { + switch(count) { + case 2: + memcpy(clut_2colors, colors, sizeof(clut_2colors)); + break; + case 4: + memcpy(clut_4colors, colors, sizeof(clut_4colors)); + break; + case 16: + memcpy(clut_16colors, colors, sizeof(clut_16colors)); + break; + case 256: + memcpy(clut_256colors, colors, sizeof(clut_256colors)); + break; + default: + LV_ASSERT(false); + break; + } + } + + const vg_lite_uint32_t * get_CLUT(vg_lite_buffer_format_t format) + { + switch(format) { + case VG_LITE_INDEX_1: + return clut_2colors; + + case VG_LITE_INDEX_2: + return clut_2colors; + + case VG_LITE_INDEX_4: + return clut_4colors; + + case VG_LITE_INDEX_8: + return clut_256colors; + + default: + break; + } + + LV_ASSERT(false); + return nullptr; + } + + static vg_lite_ctx * get_instance() + { + static vg_lite_ctx instance; + return &instance; + } + + private: + /* */ + std::vector src_buffer; + std::vector dest_buffer; + + vg_lite_uint32_t clut_2colors[2]; + vg_lite_uint32_t clut_4colors[4]; + vg_lite_uint32_t clut_16colors[16]; + vg_lite_uint32_t clut_256colors[256]; +}; + +template +class vg_lite_converter +{ + public: + typedef void (*converter_cb_t)(DEST_TYPE * dest, const SRC_TYPE * src, vg_lite_uint32_t px_size, + vg_lite_uint32_t color); + + public: + vg_lite_converter(converter_cb_t converter) + : _converter_cb(converter) + { + } + + void convert(vg_lite_buffer_t * dest_buf, const vg_lite_buffer_t * src_buf, vg_lite_uint32_t color = 0) + { + LV_ASSERT(_converter_cb); + uint8_t * dest = (uint8_t *)dest_buf->memory; + const uint8_t * src = (const uint8_t *)src_buf->memory; + vg_lite_uint32_t h = src_buf->height; + + while(h--) { + _converter_cb((DEST_TYPE *)dest, (const SRC_TYPE *)src, src_buf->width, color); + dest += dest_buf->stride; + src += src_buf->stride; + } + } + + private: + converter_cb_t _converter_cb; +}; + +typedef vg_lite_float_t FLOATVECTOR4[4]; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static vg_lite_error_t vg_lite_error_conv(Result result); +static Matrix matrix_conv(const vg_lite_matrix_t * matrix); +static FillRule fill_rule_conv(vg_lite_fill_t fill); +static BlendMethod blend_method_conv(vg_lite_blend_t blend); +static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap); +static StrokeJoin stroke_join_conv(vg_lite_join_style_t join); +static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix); +static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, + const vg_lite_rectangle_t * rect); +static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target); +static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, + vg_lite_color_t color = 0); + +static inline bool math_zero(float a) +{ + return (fabs(a) < FLT_EPSILON); +} + +static inline bool math_equal(float a, float b) +{ + return math_zero(a - b); +} + +static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied); +static uint8_t PackColorComponent(vg_lite_float_t value); +static void get_format_bytes(vg_lite_buffer_format_t format, + vg_lite_uint32_t * mul, + vg_lite_uint32_t * div, + vg_lite_uint32_t * bytes_align); + +static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point); +static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix); +static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult); + +/********************** + * STATIC VARIABLES + **********************/ + +/* color converters */ + +static vg_lite_converter conv_bgra8888_to_bgr565( + [](vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red >> 3; + dest->green = src->green >> 2; + dest->blue = src->blue >> 3; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra8888_to_bgra5658( + [](vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->c.red = src->red >> 3; + dest->c.green = src->green >> 2; + dest->c.blue = src->blue >> 3; + dest->alpha = src->alpha; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgr565_to_bgra8888( + [](vg_color32_t * dest, const vg_color16_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red << 3; + dest->green = src->green << 2; + dest->blue = src->blue << 3; + dest->alpha = 0xFF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra5658_to_bgra8888( + [](vg_color32_t * dest, const vg_color16_alpha_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->c.red << 3; + dest->green = src->c.green << 2; + dest->blue = src->c.blue << 3; + dest->alpha = src->alpha; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgrx8888_to_bgra8888( + [](vg_color32_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + *dest = *src; + dest->alpha = 0xFF; + dest++; + src++; + } +}); + +static vg_lite_converter conv_bgr888_to_bgra8888( + [](vg_color32_t * dest, const vg_color24_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red; + dest->green = src->green; + dest->blue = src->blue; + dest->alpha = 0xFF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_alpha8_to_bgra8888( + [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) +{ + while(px_size--) { + uint8_t alpha = *src; + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + dest++; + src++; + } +}); + +static vg_lite_converter conv_alpha4_to_bgra8888( + [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) +{ + /* 1 byte -> 2 px */ + px_size /= 2; + + while(px_size--) { + /* high 4bit */ + uint8_t alpha = (*src & 0xF0); + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + dest++; + + /* low 4bit */ + alpha = (*src & 0x0F) << 4; + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + + dest++; + src++; + } +}); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +extern "C" { + + void gpu_init(void) + { + vg_lite_init(0, 0); + } + + vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer) + { + if(buffer->format == VG_LITE_RGBA8888_ETC2_EAC && (buffer->width % 16 || buffer->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Reset planar. */ + buffer->yuv.uv_planar = buffer->yuv.v_planar = buffer->yuv.alpha_planar = 0; + + /* Align height in case format is tiled. */ + if(buffer->format >= VG_LITE_YUY2 && buffer->format <= VG_LITE_NV16) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + if(buffer->format >= VG_LITE_YUY2_TILED && buffer->format <= VG_LITE_AYUY2_TILED) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->tiled = VG_LITE_TILED; + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + vg_lite_uint32_t mul, div, align; + get_format_bytes(buffer->format, &mul, &div, &align); + vg_lite_uint32_t stride = VG_LITE_ALIGN((buffer->width * mul / div), align); + + buffer->stride = stride; + buffer->memory = aligned_alloc(LV_VG_LITE_THORVG_BUF_ADDR_ALIGN, stride * buffer->height); + LV_ASSERT(buffer->memory); + buffer->address = (vg_lite_uint32_t)(uintptr_t)buffer->memory; + buffer->handle = buffer->memory; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer) + { + LV_ASSERT(buffer->memory); + free(buffer->memory); + memset(buffer, 0, sizeof(vg_lite_buffer_t)); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, vg_lite_uint8_t * data[3], vg_lite_uint32_t stride[3]) + { + LV_UNUSED(buffer); + LV_UNUSED(data); + LV_UNUSED(stride); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd) + { + LV_UNUSED(buffer); + LV_UNUSED(flag); + LV_UNUSED(fd); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer) + { + LV_UNUSED(buffer); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, vg_lite_rectangle_t * rectangle, vg_lite_color_t color) + { + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rectangle)); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(filter); + auto ctx = vg_lite_ctx::get_instance(); + canvas_set_target(ctx, target); + + auto picture = Picture::gen(); + + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, + vg_lite_buffer_t * source0, + vg_lite_buffer_t * source1, + vg_lite_matrix_t * matrix0, + vg_lite_matrix_t * matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter) + { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_DOUBLE_IMAGE)) { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t error; + + VG_LITE_RETURN_ERROR(vg_lite_blit(target, source0, matrix0, blend, 0, filter)); + VG_LITE_RETURN_ERROR(vg_lite_blit(target, source1, matrix1, blend, 0, filter)); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(filter); + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rect)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); + + auto picture = tvg::Picture::gen(); + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init(int32_t tessellation_width, int32_t tessellation_height) + { + LV_UNUSED(tessellation_width); + LV_UNUSED(tessellation_height); +#if LV_VG_LITE_THORVG_THREAD_RENDER + /* Threads Count */ + auto threads = std::thread::hardware_concurrency(); + if(threads > 0) { + --threads; /* Allow the designated main thread capacity */ + } +#endif + + /* Initialize ThorVG Engine */ + TVG_CHECK_RETURN_VG_ERROR(Initializer::init(TVG_CANVAS_ENGINE, 0)); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_close(void) + { + TVG_CHECK_RETURN_VG_ERROR(Initializer::term(TVG_CANVAS_ENGINE)); + return VG_LITE_SUCCESS; + } + + static void picture_bgra8888_to_bgr565(vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red >> 3; + dest->green = src->green >> 2; + dest->blue = src->blue >> 3; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgra5658(vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->c.red = src->red >> 3; + dest->c.green = src->green >> 2; + dest->c.blue = src->blue >> 3; + dest->alpha = src->alpha; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgr888(vg_color24_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red; + dest->green = src->green; + dest->blue = src->blue; + src++; + dest++; + } + } + + vg_lite_error_t vg_lite_finish(void) + { + vg_lite_ctx * ctx = vg_lite_ctx::get_instance(); + + if(ctx->canvas->draw() == Result::InsufficientCondition) { + return VG_LITE_SUCCESS; + } + + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->sync()); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->clear(true)); + + /* make sure target buffer is valid */ + LV_ASSERT_NULL(ctx->target_buffer); + + /* If target_buffer is not in a format supported by thorvg, software conversion is required. */ + switch(ctx->target_format) { + case VG_LITE_BGR565: + picture_bgra8888_to_bgr565( + (vg_color16_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA5658: + picture_bgra8888_to_bgra5658( + (vg_color16_alpha_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGR888: + picture_bgra8888_to_bgr888( + (vg_color24_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA8888: + case VG_LITE_BGRX8888: + /* No conversion required. */ + break; + default: + LV_LOG_ERROR("unsupported format: %d", ctx->target_format); + LV_ASSERT(false); + break; + } + + /* finish convert, clean target buffer info */ + ctx->target_buffer = nullptr; + ctx->target_px_size = 0; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_flush(void) + { + return vg_lite_finish(); + } + + vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color) + { + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t color) + { + if(!path || line_width <= 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(miter_limit < 1.0f) { + miter_limit = 1.0f; + } + + if(!path->stroke) { + path->stroke = (vg_lite_stroke_t *)lv_malloc_zeroed(sizeof(vg_lite_stroke_t)); + + if(!path->stroke) { + return VG_LITE_OUT_OF_RESOURCES; + } + } + + path->stroke->cap_style = cap_style; + path->stroke->join_style = join_style; + path->stroke->line_width = line_width; + path->stroke->miter_limit = miter_limit; + path->stroke->half_width = line_width / 2.0f; + path->stroke->miter_square = path->stroke->miter_limit * path->stroke->miter_limit; + path->stroke->dash_pattern = dash_pattern; + path->stroke->pattern_count = pattern_count; + path->stroke->dash_phase = dash_phase; + path->stroke_color = color; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path) + { + LV_UNUSED(path); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type) + { + if(!path || + (path_type != VG_LITE_DRAW_FILL_PATH && + path_type != VG_LITE_DRAW_STROKE_PATH && + path_type != VG_LITE_DRAW_FILL_STROKE_PATH) + ) + return VG_LITE_INVALID_ARGUMENT; + + path->path_type = path_type; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result) + { + LV_UNUSED(address); + LV_UNUSED(result); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info) + { + info->api_version = VGLITE_API_VERSION_3_0; + info->header_version = VGLITE_HEADER_VERSION; + info->release_version = VGLITE_RELEASE_VERSION; + info->reserved = 0; + return VG_LITE_SUCCESS; + } + + vg_lite_uint32_t vg_lite_get_product_info(char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev) + { + strcpy(name, "GCNanoLiteV"); + *chip_id = 0x265; + *chip_rev = 0x2000; + return 1; + } + + vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature) + { + switch(feature) { + case gcFEATURE_BIT_VG_IM_INDEX_FORMAT: + case gcFEATURE_BIT_VG_BORDER_CULLING: + case gcFEATURE_BIT_VG_RGBA2_FORMAT: + case gcFEATURE_BIT_VG_IM_FASTCLAER: + case gcFEATURE_BIT_VG_GLOBAL_ALPHA: + case gcFEATURE_BIT_VG_COLOR_KEY: + case gcFEATURE_BIT_VG_24BIT: + case gcFEATURE_BIT_VG_DITHER: + case gcFEATURE_BIT_VG_USE_DST: + +#if LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + case gcFEATURE_BIT_VG_LVGL_SUPPORT: +#endif + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + case gcFEATURE_BIT_VG_YUV_INPUT: +#endif + +#if LV_VG_LITE_THORVG_16PIXELS_ALIGN + case gcFEATURE_BIT_VG_16PIXELS_ALIGN: +#endif + return 1; + default: + break; + } + return 0; + } + + vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + void * path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) + { + if(!path) { + return VG_LITE_INVALID_ARGUMENT; + } + + path->format = data_format; + path->quality = quality; + path->bounding_box[0] = min_x; + path->bounding_box[1] = min_y; + path->bounding_box[2] = max_x; + path->bounding_box[3] = max_y; + + path->path_length = path_length; + path->path = path_data; + + path->path_changed = 1; + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + path->pdata_internal = 0; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + void * path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) + { + LV_UNUSED(path); + LV_UNUSED(data_format); + LV_UNUSED(quality); + LV_UNUSED(path_length); + LV_UNUSED(path_data); + LV_UNUSED(min_x); + LV_UNUSED(min_y); + LV_UNUSED(max_x); + LV_UNUSED(max_y); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path) + { + LV_ASSERT_NULL(path); + + if(path->stroke) { + lv_free(path->stroke); + path->stroke = NULL; + } + + return VG_LITE_SUCCESS; + } + + vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode, + vg_lite_uint32_t count, + vg_lite_format_t format) + { + LV_UNUSED(opcode); + LV_UNUSED(count); + LV_UNUSED(format); + return 0; + } + + vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, + uint8_t * cmd, + void * data, + vg_lite_uint32_t seg_count) + { + LV_UNUSED(path); + LV_UNUSED(cmd); + LV_UNUSED(data); + LV_UNUSED(seg_count); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path) + { + LV_UNUSED(path); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, + vg_lite_uint32_t * colors) + { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT)) { + return VG_LITE_NOT_SUPPORT; + } + LV_ASSERT(colors); + + auto ctx = vg_lite_ctx::get_instance(); + ctx->set_CLUT(count, colors); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * pattern_image, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(pattern_mode); + LV_UNUSED(pattern_color); + LV_UNUSED(filter); + + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule))); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); + + auto picture = tvg::Picture::gen(); + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, pattern_image, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(pattern_matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* Set the member values according to driver defaults. */ + grad->image.width = VLC_GRADIENT_BUFFER_WIDTH; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.format = VG_LITE_BGRA8888; + + /* Allocate the image for gradient. */ + error = vg_lite_allocate(&grad->image); + + grad->count = 0; + + return error; + } + + vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_linear_gradient_parameter_t linear_gradient, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) + { + static vg_lite_color_ramp_t default_ramp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + vg_lite_uint32_t i, trg_count; + vg_lite_float_t prev_stop; + vg_lite_color_ramp_t * src_ramp; + vg_lite_color_ramp_t * src_ramp_last; + vg_lite_color_ramp_t * trg_ramp; + + /* Reset the count. */ + trg_count = 0; + + if((linear_gradient.X0 == linear_gradient.X1) && (linear_gradient.Y0 == linear_gradient.Y1)) + return VG_LITE_INVALID_ARGUMENT; + + grad->linear_grad = linear_gradient; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + src_ramp_last + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prev_stop = -1; + + /* Reset the count. */ + trg_count = 0; + + /* Walk through the source ramp. */ + for( + src_ramp = grad->color_ramp, trg_ramp = grad->converted_ramp; + (src_ramp < src_ramp_last) && (trg_count < VLC_MAX_COLOR_RAMP_STOPS + 2); + src_ramp += 1) { + /* Must be in increasing order. */ + if(src_ramp->stop < prev_stop) { + /* Ignore the entire sequence. */ + trg_count = 0; + break; + } + + /* Update the previous stop value. */ + prev_stop = src_ramp->stop; + + /* Must be within [0..1] range. */ + if((src_ramp->stop < 0.0f) || (src_ramp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(src_ramp), COLOR_FROM_RAMP(trg_ramp), 0); + + /* First stop greater then zero? */ + if((trg_count == 0) && (src_ramp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trg_ramp->stop = 0.0f; + + /* Replicate the entry. */ + trg_ramp[1] = *trg_ramp; + trg_ramp[1].stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 2; + trg_count += 2; + } + else { + /* Set the stop value. */ + trg_ramp->stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 1; + trg_count += 1; + } + } + + /* Empty sequence? */ + if(trg_count == 0) { + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trg_ramp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trg_ramp = trg_ramp[-1]; + + /* Force the last stop to 1.0f. */ + trg_ramp->stop = 1.0f; + + /* Update the final entry count. */ + trg_count += 1; + } + + /* Set new length. */ + grad->converted_length = trg_count; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad) + { + vg_lite_uint32_t ramp_length; + vg_lite_color_ramp_t * color_ramp; + vg_lite_uint32_t common, stop; + vg_lite_uint32_t i, width; + uint8_t * bits; + vg_lite_float_t x0, y0, x1, y1, length; + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + color_ramp = grad->converted_ramp; + + x0 = grad->linear_grad.X0; + y0 = grad->linear_grad.Y0; + x1 = grad->linear_grad.X1; + y1 = grad->linear_grad.Y1; + length = (vg_lite_float_t)sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + + if(length <= 0) + return VG_LITE_INVALID_ARGUMENT; + /* Find the common denominator of the color ramp stops. */ + if(length < 1) { + common = 1; + } + else { + common = (vg_lite_uint32_t)length; + } + + for(i = 0; i < ramp_length; ++i) { + if(color_ramp[i].stop != 0.0f) { + vg_lite_float_t mul = common * color_ramp[i].stop; + vg_lite_float_t frac = mul - (vg_lite_float_t)floor(mul); + if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ + common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); + } + } + } + + /* Compute the width of the required color array. */ + width = common + 1; + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + memset(grad->image.memory, 0, grad->image.stride * grad->image.height); + width = common + 1; + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + if(i == 241) + i = 241; + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > color_ramp[stop].stop) { + ++stop; + } + + if(gradient == color_ramp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = color_ramp[stop].alpha; + color1[2] = color_ramp[stop].blue; + color1[1] = color_ramp[stop].green; + color1[0] = color_ramp[stop].red; + + color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; + } + else { + if(stop == 0) { + return VG_LITE_INVALID_ARGUMENT; + } + /* Compute weight. */ + weight = (color_ramp[stop].stop - gradient) + / (color_ramp[stop].stop - color_ramp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = color_ramp[stop - 1].alpha; + color1[2] = color_ramp[stop - 1].blue; + color1[1] = color_ramp[stop - 1].green; + color1[0] = color_ramp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = color_ramp[stop].alpha; + color2[2] = color_ramp[stop].blue; + color2[1] = color_ramp[stop].green; + color2[0] = color_ramp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_radial_gradient_parameter_t radial_grad, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) + { + static vg_lite_color_ramp_t defaultRamp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + vg_lite_uint32_t i, trgCount; + vg_lite_float_t prevStop; + vg_lite_color_ramp_t * srcRamp; + vg_lite_color_ramp_t * srcRampLast; + vg_lite_color_ramp_t * trgRamp; + + /* Reset the count. */ + trgCount = 0; + + if(radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + grad->radial_grad = radial_grad; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + srcRampLast + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prevStop = -1; + + /* Reset the count. */ + trgCount = 0; + + /* Walk through the source ramp. */ + for( + srcRamp = grad->color_ramp, trgRamp = grad->converted_ramp; + (srcRamp < srcRampLast) && (trgCount < VLC_MAX_COLOR_RAMP_STOPS + 2); + srcRamp += 1) { + /* Must be in increasing order. */ + if(srcRamp->stop < prevStop) { + /* Ignore the entire sequence. */ + trgCount = 0; + break; + } + + /* Update the previous stop value. */ + prevStop = srcRamp->stop; + + /* Must be within [0..1] range. */ + if((srcRamp->stop < 0.0f) || (srcRamp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(srcRamp), COLOR_FROM_RAMP(trgRamp), 0); + + /* First stop greater then zero? */ + if((trgCount == 0) && (srcRamp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trgRamp->stop = 0.0f; + + /* Replicate the entry. */ + trgRamp[1] = *trgRamp; + trgRamp[1].stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 2; + trgCount += 2; + } + else { + /* Set the stop value. */ + trgRamp->stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 1; + trgCount += 1; + } + } + + /* Empty sequence? */ + if(trgCount == 0) { + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trgRamp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trgRamp = trgRamp[-1]; + + /* Force the last stop to 1.0f. */ + trgRamp->stop = 1.0f; + + /* Update the final entry count. */ + trgCount += 1; + } + + /* Set new length. */ + grad->converted_length = trgCount; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad) + { + vg_lite_uint32_t ramp_length; + vg_lite_color_ramp_t * colorRamp; + vg_lite_uint32_t common, stop; + vg_lite_uint32_t i, width; + uint8_t * bits; + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_uint32_t align, mul, div; + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + colorRamp = grad->converted_ramp; + + if(grad->radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + /* Find the common denominator of the color ramp stops. */ + if(grad->radial_grad.r < 1) { + common = 1; + } + else { + common = (vg_lite_uint32_t)grad->radial_grad.r; + } + + for(i = 0; i < ramp_length; ++i) { + if(colorRamp[i].stop != 0.0f) { + vg_lite_float_t m = common * colorRamp[i].stop; + vg_lite_float_t frac = m - (vg_lite_float_t)floor(m); + if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ + common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); + } + } + } + + /* Compute the width of the required color array. */ + width = common + 1; + width = (width + 15) & (~0xf); + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + + get_format_bytes(VG_LITE_ABGR8888, &mul, &div, &align); + width = grad->image.stride * div / mul; + + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > colorRamp[stop].stop) { + ++stop; + } + + if(gradient == colorRamp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = colorRamp[stop].alpha; + color1[2] = colorRamp[stop].blue; + color1[1] = colorRamp[stop].green; + color1[0] = colorRamp[stop].red; + + color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; + } + else { + /* Compute weight. */ + weight = (colorRamp[stop].stop - gradient) + / (colorRamp[stop].stop - colorRamp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = colorRamp[stop - 1].alpha; + color1[2] = colorRamp[stop - 1].blue; + color1[1] = colorRamp[stop - 1].green; + color1[0] = colorRamp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = colorRamp[stop].alpha; + color2[2] = colorRamp[stop].blue; + color2[1] = colorRamp[stop].green; + color2[0] = colorRamp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_uint32_t * colors, + vg_lite_uint32_t * stops) + { + vg_lite_uint32_t i; + + grad->count = 0; /* Opaque B&W gradient */ + if(!count || count > VLC_MAX_GRADIENT_STOPS || colors == NULL || stops == NULL) + return VG_LITE_SUCCESS; + + /* Check stops validity */ + for(i = 0; i < count; i++) + if(stops[i] < VLC_GRADIENT_BUFFER_WIDTH) { + if(!grad->count || stops[i] > grad->stops[grad->count - 1]) { + grad->stops[grad->count] = stops[i]; + grad->colors[grad->count] = colors[i]; + grad->count++; + } + else if(stops[i] == grad->stops[grad->count - 1]) { + /* Equal stops : use the color corresponding to the last stop + in the sequence */ + grad->colors[grad->count - 1] = colors[i]; + } + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + int32_t r0, g0, b0, a0; + int32_t r1, g1, b1, a1; + int32_t lr, lg, lb, la; + vg_lite_uint32_t i; + int32_t j; + int32_t ds, dr, dg, db, da; + vg_lite_uint32_t * buffer = (vg_lite_uint32_t *)grad->image.memory; + + if(grad->count == 0) { + /* If no valid stops have been specified (e.g., due to an empty input + * array, out-of-range, or out-of-order stops), a stop at 0 with color + * 0xFF000000 (opaque black) and a stop at 255 with color 0xFFFFFFFF + * (opaque white) are implicitly defined. */ + grad->stops[0] = 0; + grad->colors[0] = 0xFF000000; /* Opaque black */ + grad->stops[1] = 255; + grad->colors[1] = 0xFFFFFFFF; /* Opaque white */ + grad->count = 2; + } + else if(grad->count && grad->stops[0] != 0) { + /* If at least one valid stop has been specified, but none has been + * defined with an offset of 0, an implicit stop is added with an + * offset of 0 and the same color as the first user-defined stop. */ + for(i = 0; i < grad->stops[0]; i++) + buffer[i] = grad->colors[0]; + } + a0 = A(grad->colors[0]); + r0 = R(grad->colors[0]); + g0 = G(grad->colors[0]); + b0 = B(grad->colors[0]); + + /* Calculate the colors for each pixel of the image. */ + for(i = 0; i < grad->count - 1; i++) { + buffer[grad->stops[i]] = grad->colors[i]; + ds = grad->stops[i + 1] - grad->stops[i]; + a1 = A(grad->colors[i + 1]); + r1 = R(grad->colors[i + 1]); + g1 = G(grad->colors[i + 1]); + b1 = B(grad->colors[i + 1]); + + da = a1 - a0; + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + + for(j = 1; j < ds; j++) { + la = a0 + da * j / ds; + lr = r0 + dr * j / ds; + lg = g0 + dg * j / ds; + lb = b0 + db * j / ds; + + buffer[grad->stops[i] + j] = ARGB(la, lr, lg, lb); + } + + a0 = a1; + r0 = r1; + g0 = g1; + b0 = b1; + } + + /* If at least one valid stop has been specified, but none has been defined + * with an offset of 255, an implicit stop is added with an offset of 255 + * and the same color as the last user-defined stop. */ + for(i = grad->stops[grad->count - 1]; i < VLC_GRADIENT_BUFFER_WIDTH; i++) + buffer[i] = grad->colors[grad->count - 1]; + + return error; + } + + vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_linear_gradient_t * grad, + vg_lite_blend_t blend) + { + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + + vg_lite_matrix_t grad_matrix; + vg_lite_identity(&grad_matrix); + vg_lite_matrix_inverse(&grad_matrix, matrix); + vg_lite_matrix_multiply(&grad_matrix, &grad->matrix); + + vg_lite_fpoint_t p1 = {0.0f, 0.0f}; + vg_lite_fpoint_t p2 = {1.0f, 0}; + + vg_lite_fpoint_t p1_trans = p1; + vg_lite_fpoint_t p2_trans = p2; + + p1_trans = matrix_transform_point(&grad_matrix, &p1); + p2_trans = matrix_transform_point(&grad_matrix, &p2); + float dx = (p2_trans.x - p1_trans.x); + float dy = (p2_trans.y - p1_trans.y); + float scale = sqrtf(dx * dx + dy * dy); + float angle = (float)(atan2f(dy, dx)); + float dlen = 256 * scale; + float x_min = grad_matrix.m[0][2]; + float y_min = grad_matrix.m[1][2]; + float x_max = x_min + dlen * cosf(angle); + float y_max = y_min + dlen * sinf(angle); + LV_LOG_TRACE("linear gradient {%.2f, %.2f} ~ {%.2f, %.2f}", x_min, y_min, x_max, y_max); + auto linearGrad = LinearGradient::gen(); + linearGrad->linear(x_min, y_min, x_max, y_max); + linearGrad->spread(FillSpread::Pad); + + tvg::Fill::ColorStop colorStops[VLC_MAX_GRADIENT_STOPS]; + for(vg_lite_uint32_t i = 0; i < grad->count; i++) { + colorStops[i].offset = grad->stops[i] / 255.0f; + colorStops[i].r = R(grad->colors[i]); + colorStops[i].g = G(grad->colors[i]); + colorStops[i].b = B(grad->colors[i]); + colorStops[i].a = A(grad->colors[i]); + } + TVG_CHECK_RETURN_VG_ERROR(linearGrad->colorStops(colorStops, grad->count)); + + TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(linearGrad))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) + { + LV_UNUSED(target); + LV_UNUSED(path); + LV_UNUSED(fill_rule); + LV_UNUSED(path_matrix); + LV_UNUSED(grad); + LV_UNUSED(paint_color); + LV_UNUSED(blend); + LV_UNUSED(filter); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size) + { + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_scissor(int32_t x, int32_t y, int32_t right, int32_t bottom) + { + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(right); + LV_UNUSED(bottom); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_enable_scissor(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_disable_scissor(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size) + { + *size = 0; + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) + { + LV_UNUSED(alpha_mode); + LV_UNUSED(alpha_value); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) + { + LV_UNUSED(alpha_mode); + LV_UNUSED(alpha_value); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey) + { + LV_UNUSED(colorkey); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_stream_id(uint8_t stream_id) + { + LV_UNUSED(stream_id); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_current_background_buffer(uint8_t stream_id, + vg_lite_buffer_t * buffer, + vg_lite_uint32_t background_segment_count, + vg_lite_uint32_t background_segment_size) + { + LV_UNUSED(stream_id); + LV_UNUSED(buffer); + LV_UNUSED(background_segment_count); + LV_UNUSED(background_segment_size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_enable_flexa(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_disable_flexa(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_stop_frame(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_enable_dither(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_disable_dither(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) + { + LV_UNUSED(physical); + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) + { + LV_UNUSED(physical); + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_float_t * params) + { + switch(type) { + case VG_LITE_GPU_IDLE_STATE: + if(count != 1 || params == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + *(vg_lite_uint32_t *)params = 1; + return VG_LITE_SUCCESS; + + default: + break; + } + + return VG_LITE_NOT_SUPPORT; + } +} /* extern "C" */ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_error_t vg_lite_error_conv(Result result) +{ + switch(result) { + case Result::Success: + return VG_LITE_SUCCESS; + + case Result::InvalidArguments: + return VG_LITE_INVALID_ARGUMENT; + + case Result::InsufficientCondition: + return VG_LITE_OUT_OF_RESOURCES; + + case Result::FailedAllocation: + return VG_LITE_OUT_OF_MEMORY; + + case Result::NonSupport: + return VG_LITE_NOT_SUPPORT; + + default: + break; + } + + return VG_LITE_TIMEOUT; +} + +static Matrix matrix_conv(const vg_lite_matrix_t * matrix) +{ + return *(Matrix *)matrix; +} + +static FillRule fill_rule_conv(vg_lite_fill_t fill) +{ + if(fill == VG_LITE_FILL_EVEN_ODD) { + return FillRule::EvenOdd; + } + + return FillRule::Winding; +} + +static BlendMethod blend_method_conv(vg_lite_blend_t blend) +{ + switch(blend) { + case VG_LITE_BLEND_NONE: + return BlendMethod::SrcOver; + + case VG_LITE_BLEND_NORMAL_LVGL: + return BlendMethod::Normal; + + case VG_LITE_BLEND_SRC_OVER: + return BlendMethod::Normal; + + case VG_LITE_BLEND_SCREEN: + return BlendMethod::Screen; + + case VG_LITE_BLEND_ADDITIVE: + return BlendMethod::Add; + + case VG_LITE_BLEND_MULTIPLY: + return BlendMethod::Multiply; + + default: + break; + } + + return BlendMethod::Normal; +} + +static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap) +{ + switch(cap) { + case VG_LITE_CAP_SQUARE: + return StrokeCap::Square; + case VG_LITE_CAP_ROUND: + return StrokeCap::Round; + case VG_LITE_CAP_BUTT: + return StrokeCap::Butt; + default: + break; + } + + return StrokeCap::Square; +} + +static StrokeJoin stroke_join_conv(vg_lite_join_style_t join) +{ + switch(join) { + case VG_LITE_JOIN_BEVEL: + return StrokeJoin::Bevel; + case VG_LITE_JOIN_ROUND: + return StrokeJoin::Round; + case VG_LITE_JOIN_MITER: + return StrokeJoin::Miter; + default: + break; + } + + return StrokeJoin::Bevel; +} + +static float vlc_get_arg(const void * data, vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return *((int8_t *)data); + + case VG_LITE_S16: + return *((int16_t *)data); + + case VG_LITE_S32: + return *((int32_t *)data); + + case VG_LITE_FP32: + return *((float *)data); + + default: + LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); + break; + } + + return 0; +} + +static uint8_t vlc_format_len(vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return 1; + case VG_LITE_S16: + return 2; + case VG_LITE_S32: + return 4; + case VG_LITE_FP32: + return 4; + default: + LV_LOG_ERROR("UNKNOW_FORMAT: %d", format); + LV_ASSERT(false); + break; + } + + return 0; +} + +static uint8_t vlc_op_arg_len(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ARG_LEN(END, 0); + VLC_OP_ARG_LEN(CLOSE, 0); + VLC_OP_ARG_LEN(MOVE, 2); + VLC_OP_ARG_LEN(MOVE_REL, 2); + VLC_OP_ARG_LEN(LINE, 2); + VLC_OP_ARG_LEN(LINE_REL, 2); + VLC_OP_ARG_LEN(QUAD, 4); + VLC_OP_ARG_LEN(QUAD_REL, 4); + VLC_OP_ARG_LEN(CUBIC, 6); + VLC_OP_ARG_LEN(CUBIC_REL, 6); + VLC_OP_ARG_LEN(SCCWARC, 5); + VLC_OP_ARG_LEN(SCCWARC_REL, 5); + VLC_OP_ARG_LEN(SCWARC, 5); + VLC_OP_ARG_LEN(SCWARC_REL, 5); + VLC_OP_ARG_LEN(LCCWARC, 5); + VLC_OP_ARG_LEN(LCCWARC_REL, 5); + VLC_OP_ARG_LEN(LCWARC, 5); + VLC_OP_ARG_LEN(LCWARC_REL, 5); + default: + LV_LOG_ERROR("UNKNOW_VLC_OP: 0x%x", vlc_op); + LV_ASSERT(false); + break; + } + + return 0; +} + +static Result shape_set_stroke(std::unique_ptr & shape, const vg_lite_path_t * path) +{ + /* if path is not a stroke, return */ + if(path->path_type == VG_LITE_DRAW_ZERO + || path->path_type == VG_LITE_DRAW_FILL_PATH) { + return Result::Success; + } + + LV_ASSERT_NULL(path->stroke); + TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->line_width)); + TVG_CHECK_RETURN_RESULT(shape->strokeMiterlimit(path->stroke->miter_limit)); + TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_cap_conv(path->stroke->cap_style))); + TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_join_conv(path->stroke->join_style))); + TVG_CHECK_RETURN_RESULT(shape->stroke(TVG_COLOR(path->stroke_color))); + + if(path->stroke->pattern_count) { + LV_ASSERT_NULL(path->stroke->dash_pattern); + TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->dash_pattern, path->stroke->pattern_count)); + } + + return Result::Success; +} + +static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix) +{ + uint8_t fmt_len = vlc_format_len(path->format); + uint8_t * cur = (uint8_t *)path->path; + uint8_t * end = cur + path->path_length; + + while(cur < end) { + /* get op code */ + uint8_t op_code = VLC_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = vlc_op_arg_len(op_code); + + /* skip op code */ + cur += fmt_len; + + switch(op_code) { + case VLC_OP_MOVE: { + float x = VLC_GET_ARG(cur, 0); + float y = VLC_GET_ARG(cur, 1); + TVG_CHECK_RETURN_RESULT(shape->moveTo(x, y)); + } + break; + + case VLC_OP_LINE: { + float x = VLC_GET_ARG(cur, 0); + float y = VLC_GET_ARG(cur, 1); + TVG_CHECK_RETURN_RESULT(shape->lineTo(x, y)); + } + break; + + case VLC_OP_QUAD: { + /* hack pre point */ + float qcx0 = VLC_GET_ARG(cur, -3); + float qcy0 = VLC_GET_ARG(cur, -2); + float qcx1 = VLC_GET_ARG(cur, 0); + float qcy1 = VLC_GET_ARG(cur, 1); + float x = VLC_GET_ARG(cur, 2); + float y = VLC_GET_ARG(cur, 3); + + qcx0 += (qcx1 - qcx0) * 2 / 3; + qcy0 += (qcy1 - qcy0) * 2 / 3; + qcx1 = x + (qcx1 - x) * 2 / 3; + qcy1 = y + (qcy1 - y) * 2 / 3; + + TVG_CHECK_RETURN_RESULT(shape->cubicTo(qcx0, qcy0, qcx1, qcy1, x, y)); + } + break; + + case VLC_OP_CUBIC: { + float cx1 = VLC_GET_ARG(cur, 0); + float cy1 = VLC_GET_ARG(cur, 1); + float cx2 = VLC_GET_ARG(cur, 2); + float cy2 = VLC_GET_ARG(cur, 3); + float x = VLC_GET_ARG(cur, 4); + float y = VLC_GET_ARG(cur, 5); + TVG_CHECK_RETURN_RESULT(shape->cubicTo(cx1, cy1, cx2, cy2, x, y)); + } + break; + + case VLC_OP_CLOSE: + TVG_CHECK_RETURN_RESULT(shape->close()); + break; + + default: + break; + } + + cur += arg_len * fmt_len; + } + + float x_min = path->bounding_box[0]; + float y_min = path->bounding_box[1]; + float x_max = path->bounding_box[2]; + float y_max = path->bounding_box[3]; + + if(math_equal(x_min, __FLT_MIN__) && math_equal(y_min, __FLT_MIN__) + && math_equal(x_max, __FLT_MAX__) && math_equal(y_max, __FLT_MAX__)) { + return Result::Success; + } + + TVG_CHECK_RETURN_RESULT(shape_set_stroke(shape, path)); + + auto cilp = Shape::gen(); + TVG_CHECK_RETURN_RESULT(cilp->appendRect(x_min, y_min, x_max - x_min, y_max - y_min, 0, 0)); + TVG_CHECK_RETURN_RESULT(cilp->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_RESULT(shape->composite(std::move(cilp), CompositeMethod::ClipPath)); + + return Result::Success; +} + +static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, + const vg_lite_rectangle_t * rect) +{ + if(rect) { + TVG_CHECK_RETURN_RESULT(shape->appendRect(rect->x, rect->y, rect->width, rect->height, 0, 0)); + } + else if(target) { + TVG_CHECK_RETURN_RESULT(shape->appendRect(0, 0, target->width, target->height, 0, 0)); + } + else { + return Result::InvalidArguments; + } + + return Result::Success; +} + +static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target) +{ + void * tvg_target_buffer = nullptr; + + /* if target_buffer needs to be changed, finish current drawing */ + if(ctx->target_buffer && ctx->target_buffer != target->memory) { + vg_lite_finish(); + } + + ctx->target_buffer = target->memory; + ctx->target_format = target->format; + ctx->target_px_size = target->width * target->height; + + if(TVG_IS_VG_FMT_SUPPORT(target->format)) { + /* if target format is supported by VG, use target buffer directly */ + tvg_target_buffer = target->memory; + } + else { + /* if target format is not supported by VG, use internal buffer */ + tvg_target_buffer = ctx->get_temp_target_buffer(target->width, target->height); + } + + Result res = ctx->canvas->target( + (uint32_t *)tvg_target_buffer, + target->width, + target->width, + target->height, + SwCanvas::ARGB8888); + + return res; +} + +static vg_lite_uint32_t width_to_stride(vg_lite_uint32_t w, vg_lite_buffer_format_t color_format) +{ + if(vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN)) { + w = VG_LITE_ALIGN(w, 16); + } + + vg_lite_uint32_t mul, div, align; + get_format_bytes(color_format, &mul, &div, &align); + return VG_LITE_ALIGN((w * mul / div), align); +} + +static bool decode_indexed_line( + vg_lite_buffer_format_t color_format, + const vg_lite_uint32_t * palette, + int32_t x, int32_t y, + int32_t w_px, const uint8_t * in, vg_lite_uint32_t * out) +{ + uint8_t px_size; + uint16_t mask; + + vg_lite_uint32_t w_byte = width_to_stride(w_px, color_format); + + in += w_byte * y; /*First pixel*/ + out += w_px * y; + + int8_t shift = 0; + switch(color_format) { + case VG_LITE_INDEX_1: + px_size = 1; + in += x / 8; /*8pixel per byte*/ + shift = 7 - (x & 0x7); + break; + case VG_LITE_INDEX_2: + px_size = 2; + in += x / 4; /*4pixel per byte*/ + shift = 6 - 2 * (x & 0x3); + break; + case VG_LITE_INDEX_4: + px_size = 4; + in += x / 2; /*2pixel per byte*/ + shift = 4 - 4 * (x & 0x1); + break; + case VG_LITE_INDEX_8: + px_size = 8; + in += x; + shift = 0; + break; + default: + LV_ASSERT(false); + return false; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + int32_t i; + for(i = 0; i < w_px; i++) { + uint8_t val_act = (*in >> shift) & mask; + out[i] = palette[val_act]; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + in++; + } + } + return true; +} + +static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, + vg_lite_color_t color) +{ + vg_lite_uint32_t * image_buffer; + LV_ASSERT(VG_LITE_IS_ALIGNED(source->memory, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN)); + +#if LV_VG_LITE_THORVG_16PIXELS_ALIGN + LV_ASSERT(VG_LITE_IS_ALIGNED(source->width, 16)); +#endif + + if(source->format == VG_LITE_BGRA8888 && source->image_mode == VG_LITE_NORMAL_IMAGE_MODE) { + image_buffer = (vg_lite_uint32_t *)source->memory; + } + else { + vg_lite_uint32_t width = source->width; + vg_lite_uint32_t height = source->height; + vg_lite_uint32_t px_size = width * height; + image_buffer = ctx->get_image_buffer(width, height); + + vg_lite_buffer_t target; + memset(&target, 0, sizeof(target)); + target.memory = image_buffer; + target.format = VG_LITE_BGRA8888; + target.width = width; + target.height = height; + target.stride = width_to_stride(width, target.format); + + switch(source->format) { + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_INDEX_8: { + const vg_lite_uint32_t * clut_colors = ctx->get_CLUT(source->format); + for(vg_lite_uint32_t y = 0; y < height; y++) { + decode_indexed_line(source->format, clut_colors, 0, y, width, (uint8_t *)source->memory, image_buffer); + } + } + break; + + case VG_LITE_A4: { + conv_alpha4_to_bgra8888.convert(&target, source, color); + } + break; + + case VG_LITE_A8: { + conv_alpha8_to_bgra8888.convert(&target, source, color); + } + break; + + case VG_LITE_BGRX8888: { + conv_bgrx8888_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGR888: { + conv_bgr888_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRA5658: { + conv_bgra5658_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGR565: { + conv_bgr565_to_bgra8888.convert(&target, source); + } + break; + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + case VG_LITE_NV12: { + libyuv::NV12ToARGB((const uint8_t *)source->memory, source->stride, (const uint8_t *)source->yuv.uv_memory, + source->yuv.uv_stride, + (uint8_t *)image_buffer, source->width * sizeof(vg_lite_uint32_t), width, height); + } + break; +#endif + + case VG_LITE_BGRA8888: { + memcpy(image_buffer, source->memory, px_size * sizeof(vg_color32_t)); + } + break; + + default: + LV_LOG_ERROR("unsupported format: %d", source->format); + LV_ASSERT(false); + break; + } + + /* multiply color */ + if(source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE && !VG_LITE_IS_ALPHA_FORMAT(source->format)) { + vg_color32_t * dest = (vg_color32_t *)image_buffer; + while(px_size--) { + dest->alpha = UDIV255(dest->alpha * A(color)); + dest->red = UDIV255(dest->red * B(color)); + dest->green = UDIV255(dest->green * G(color)); + dest->blue = UDIV255(dest->blue * R(color)); + dest++; + } + } + } + + TVG_CHECK_RETURN_RESULT(picture->load((uint32_t *)image_buffer, source->width, source->height, true)); + + return Result::Success; +} + +static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied) +{ + vg_lite_float_t colorMax; + /* Clamp the alpha channel. */ + Target[3] = CLAMP(Source[3], 0.0f, 1.0f); + + /* Determine the maximum value for the color channels. */ + colorMax = Premultiplied ? Target[3] : 1.0f; + + /* Clamp the color channels. */ + Target[0] = CLAMP(Source[0], 0.0f, colorMax); + Target[1] = CLAMP(Source[1], 0.0f, colorMax); + Target[2] = CLAMP(Source[2], 0.0f, colorMax); +} + +static uint8_t PackColorComponent(vg_lite_float_t value) +{ + /* Compute the rounded normalized value. */ + vg_lite_float_t rounded = value * 255.0f + 0.5f; + + /* Get the integer part. */ + int32_t roundedInt = (int32_t)rounded; + + /* Clamp to 0..1 range. */ + uint8_t clamped = (uint8_t)CLAMP(roundedInt, 0, 255); + + /* Return result. */ + return clamped; +} + +/* Get the bpp information of a color format. */ +static void get_format_bytes(vg_lite_buffer_format_t format, + vg_lite_uint32_t * mul, + vg_lite_uint32_t * div, + vg_lite_uint32_t * bytes_align) +{ + *mul = *div = 1; + *bytes_align = 4; + switch(format) { + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + + case VG_LITE_A4: + *div = 2; + break; + + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + /* AYUY2 buffer memory = YUY2 + alpha. */ + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + /* ABGR8565_PLANAR buffer memory = RGB565 + alpha. */ + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + *mul = 2; + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + *mul = 4; + break; + + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + *mul = 3; + break; + + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + *mul = 4; + break; + + case VG_LITE_INDEX_1: + *div = 8; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_2: + *div = 4; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_4: + *div = 2; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_8: + *bytes_align = 1; + break; + + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + *mul = 1; + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + *mul = 3; + break; + + /* OpenVG format*/ + case VG_sRGBX_8888: + case VG_sRGBA_8888: + case VG_sRGBA_8888_PRE: + case VG_lRGBX_8888: + case VG_lRGBA_8888: + case VG_lRGBA_8888_PRE: + case VG_sXRGB_8888: + case VG_sARGB_8888: + case VG_sARGB_8888_PRE: + case VG_lXRGB_8888: + case VG_lARGB_8888: + case VG_lARGB_8888_PRE: + case VG_sBGRX_8888: + case VG_sBGRA_8888: + case VG_sBGRA_8888_PRE: + case VG_lBGRX_8888: + case VG_lBGRA_8888: + case VG_sXBGR_8888: + case VG_sABGR_8888: + case VG_lBGRA_8888_PRE: + case VG_sABGR_8888_PRE: + case VG_lXBGR_8888: + case VG_lABGR_8888: + case VG_lABGR_8888_PRE: + *mul = 4; + break; + + case VG_sRGBA_5551: + case VG_sRGBA_4444: + case VG_sARGB_1555: + case VG_sARGB_4444: + case VG_sBGRA_5551: + case VG_sBGRA_4444: + case VG_sABGR_1555: + case VG_sABGR_4444: + case VG_sRGB_565: + case VG_sBGR_565: + *mul = 2; + break; + + case VG_sL_8: + case VG_lL_8: + case VG_A_8: + break; + + case VG_BW_1: + case VG_A_4: + case VG_A_1: + *div = 2; + break; + + default: + break; + } +} + +static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point) +{ + vg_lite_fpoint_t p; + p.x = (vg_lite_float_t)(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]); + p.y = (vg_lite_float_t)(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]); + return p; +} + +static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) +{ + vg_lite_float_t det00, det01, det02; + vg_lite_float_t d; + bool is_affine; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->m[0][0] = 1.0f; + result->m[0][1] = 0.0f; + result->m[0][2] = 0.0f; + result->m[1][0] = 0.0f; + result->m[1][1] = 1.0f; + result->m[1][2] = 0.0f; + result->m[2][0] = 0.0f; + result->m[2][1] = 0.0f; + result->m[2][2] = 1.0f; + + /* Success. */ + return true; + } + + det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]); + det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]); + det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]); + + /* Compute determinant. */ + d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02); + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return false; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + is_affine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f); + + result->m[0][0] = d * det00; + result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2])); + result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2])); + result->m[1][0] = d * det01; + result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2])); + result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2])); + result->m[2][0] = is_affine ? 0.0f : d * det02; + result->m[2][1] = is_affine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1])); + result->m[2][2] = is_affine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1])); + + /* Success. */ + return true; +} + +static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) + + (matrix->m[row][1] * mult->m[1][column]) + + (matrix->m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ + lv_memcpy(matrix->m, &temp.m, sizeof(temp.m)); +} + +#endif diff --git a/libraries/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c b/libraries/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c new file mode 100644 index 0000000..b7b707d --- /dev/null +++ b/libraries/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c @@ -0,0 +1,273 @@ +/** + * @file lv_malloc_core.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#include "lv_tlsf.h" +#include "../lv_string.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_ll.h" +#include "../../misc/lv_math.h" +#include "../../osal/lv_os.h" +#include "../../core/lv_global.h" + +#ifdef LV_MEM_POOL_INCLUDE + #include LV_MEM_POOL_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ +#ifndef LV_MEM_ADD_JUNK + #define LV_MEM_ADD_JUNK 0 +#endif + +#ifdef LV_ARCH_64 + #define MEM_UNIT uint64_t + #define ALIGN_MASK 0x7 +#else + #define MEM_UNIT uint32_t + #define ALIGN_MASK 0x3 +#endif +#define state LV_GLOBAL_DEFAULT()->tlsf_state + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_mem_walker(void * ptr, size_t size, int used, void * user); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +#define _COPY(d, s) *d = *s; d++; s++; +#define _SET(d, v) *d = v; d++; +#define _REPEAT8(expr) expr expr expr expr expr expr expr expr + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ +#if LV_USE_OS + lv_mutex_init(&state.mutex); +#endif + +#if LV_MEM_ADR == 0 +#ifdef LV_MEM_POOL_ALLOC + state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_POOL_ALLOC(LV_MEM_SIZE), LV_MEM_SIZE); +#else + /*Allocate a large array to store the dynamically allocated data*/ + static LV_ATTRIBUTE_LARGE_RAM_ARRAY MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)]; + state.tlsf = lv_tlsf_create_with_pool((void *)work_mem_int, LV_MEM_SIZE); +#endif +#else + state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE); +#endif + + _lv_ll_init(&state.pool_ll, sizeof(lv_pool_t)); + + /*Record the first pool*/ + lv_pool_t * pool_p = _lv_ll_ins_tail(&state.pool_ll); + LV_ASSERT_MALLOC(pool_p); + *pool_p = lv_tlsf_get_pool(state.tlsf); + +#if LV_MEM_ADD_JUNK + LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower"); +#endif +} + +void lv_mem_deinit(void) +{ + _lv_ll_clear(&state.pool_ll); + lv_tlsf_destroy(state.tlsf); +#if LV_USE_OS + lv_mutex_delete(&state.mutex); +#endif +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + lv_mem_pool_t new_pool = lv_tlsf_add_pool(state.tlsf, mem, bytes); + if(!new_pool) { + LV_LOG_WARN("failed to add memory pool, address: %p, size: %zu", mem, bytes); + return NULL; + } + + lv_pool_t * pool_p = _lv_ll_ins_tail(&state.pool_ll); + LV_ASSERT_MALLOC(pool_p); + *pool_p = new_pool; + + return new_pool; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + lv_pool_t * pool_p; + _LV_LL_READ(&state.pool_ll, pool_p) { + if(*pool_p == pool) { + _lv_ll_remove(&state.pool_ll, pool_p); + lv_free(pool_p); + lv_tlsf_remove_pool(state.tlsf, pool); + return; + } + } + LV_LOG_WARN("invalid pool: %p", pool); +} + +void * lv_malloc_core(size_t size) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + void * p = lv_tlsf_malloc(state.tlsf, size); + + if(p) { + state.cur_used += lv_tlsf_block_size(p); + state.max_used = LV_MAX(state.cur_used, state.max_used); + } + +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return p; +} + +void * lv_realloc_core(void * p, size_t new_size) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + + size_t old_size = lv_tlsf_block_size(p); + void * p_new = lv_tlsf_realloc(state.tlsf, p, new_size); + + if(p_new) { + state.cur_used -= old_size; + state.cur_used += lv_tlsf_block_size(p_new); + state.max_used = LV_MAX(state.cur_used, state.max_used); + } +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + + return p_new; +} + +void lv_free_core(void * p) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + +#if LV_MEM_ADD_JUNK + lv_memset(p, 0xbb, lv_tlsf_block_size(data)); +#endif + size_t size = lv_tlsf_block_size(p); + lv_tlsf_free(state.tlsf, p); + if(state.cur_used > size) state.cur_used -= size; + else state.cur_used = 0; + +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Init the data*/ + lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); + LV_TRACE_MEM("begin"); + + lv_pool_t * pool_p; + _LV_LL_READ(&state.pool_ll, pool_p) { + lv_tlsf_walk_pool(*pool_p, lv_mem_walker, mon_p); + } + + mon_p->used_pct = 100 - (uint64_t)100U * mon_p->free_size / mon_p->total_size; + if(mon_p->free_size > 0) { + mon_p->frag_pct = (uint64_t)mon_p->free_biggest_size * 100U / mon_p->free_size; + mon_p->frag_pct = 100 - mon_p->frag_pct; + } + else { + mon_p->frag_pct = 0; /*no fragmentation if all the RAM is used*/ + } + + mon_p->max_used = state.max_used; + + LV_TRACE_MEM("finished"); +} + +lv_result_t lv_mem_test_core(void) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + if(lv_tlsf_check(state.tlsf)) { + LV_LOG_WARN("failed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_INVALID; + } + + lv_pool_t * pool_p; + _LV_LL_READ(&state.pool_ll, pool_p) { + if(lv_tlsf_check_pool(*pool_p)) { + LV_LOG_WARN("pool failed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_INVALID; + } + } + + LV_TRACE_MEM("passed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_mem_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(ptr); + + lv_mem_monitor_t * mon_p = user; + mon_p->total_size += size; + if(used) { + mon_p->used_cnt++; + } + else { + mon_p->free_cnt++; + mon_p->free_size += size; + if(size > mon_p->free_biggest_size) + mon_p->free_biggest_size = size; + } +} +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/libraries/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c b/libraries/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c new file mode 100644 index 0000000..d5fc555 --- /dev/null +++ b/libraries/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c @@ -0,0 +1,886 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +/*Original repository: https://github.com/mpaland/printf*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_BUILTIN + +#include "../lv_sprintf.h" +#include "../../misc/lv_types.h" + +#define PRINTF_DISABLE_SUPPORT_FLOAT (!LV_USE_FLOAT) + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE + #define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE + #define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#if !PRINTF_DISABLE_SUPPORT_FLOAT + #define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL + #define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION + #define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT + #define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG + #define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T + #define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + +typedef struct { + const char * fmt; + va_list * va; +} lv_vaformat_t; + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) + #include +#endif + +// output function type +typedef void (*out_fct_type)(char character, void * buffer, size_t idx, size_t maxlen); + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void * arg); + void * arg; +} out_fct_wrap_type; + +// internal buffer output +static inline void _out_buffer(char character, void * buffer, size_t idx, size_t maxlen) +{ + if(idx < maxlen) { + ((char *)buffer)[idx] = character; + } +} + +// internal null output +static inline void _out_null(char character, void * buffer, size_t idx, size_t maxlen) +{ + LV_UNUSED(character); + LV_UNUSED(buffer); + LV_UNUSED(idx); + LV_UNUSED(maxlen); +} + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by 'maxsize' +static inline unsigned int _strnlen_s(const char * str, size_t maxsize) +{ + const char * s; + for(s = str; *s && maxsize--; ++s); + return (unsigned int)(s - str); +} + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char ** str) +{ + unsigned int i = 0U; + while(_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char * buffer, size_t idx, size_t maxlen, const char * buf, size_t len, + unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if(!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + size_t i; + for(i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while(len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char * buffer, size_t idx, size_t maxlen, char * buf, size_t len, + bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if(!(flags & FLAGS_LEFT)) { + if(width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if(flags & FLAGS_HASH) { + if(!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if(len && (base == 16U)) { + len--; + } + } + if((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if(len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_NTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, + unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long long value, + bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + +#if defined(PRINTF_SUPPORT_FLOAT) + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags); +#endif + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if(value != value) + return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if(value < -DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if(value > DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, + flags); + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad + if((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +#else + return 0U; +#endif + } + + // test for negative + bool negative = false; + if(value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision, if not set explicitly + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if(diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if(frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if(diff < 0.5) { + } + else if((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if(prec == 0U) { + diff = value - (double)whole; + if((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while(len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if(!(frac /= 10U)) { + break; + } + } + // add extra 0s + while((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if(len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while(len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if(!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if(!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if(width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_FTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + // check for NaN and special values + if((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { + return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign + const bool negative = value < 0; + if(negative) { + value = -value; + } + + // default precision + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if(value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if(flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if((value >= 1e-4) && (value < 1e6)) { + if((int)prec > expval) { + prec = (unsigned)((int)prec - expval - 1); + } + else { + prec = 0; + } + flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if((prec > 0) && (flags & FLAGS_PRECISION)) { + --prec; + } + } + } + + // will everything fit? + unsigned int fwidth = width; + if(width > minwidth) { + // we didn't fall-back so subtract the characters required for the exponent + fwidth -= minwidth; + } + else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if((flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if(expval) { + value /= conv.F; + } + + // output the floating part + const size_t start_idx = idx; + idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if(minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value + idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth - 1, + FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) out(' ', buffer, idx++, maxlen); + } + } + return idx; +} +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + +// internal vsnprintf +static int _lv_vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if(!buffer) { + // use null output function + out = _out_null; + } + + while(*format) { + // format specifier? %[flags][width][.precision][length] + if(*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch(*format) { + case '0': + flags |= FLAGS_ZEROPAD; + format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + format++; + n = 1U; + break; + default : + n = 0U; + break; + } + } while(n); + + // evaluate width field + width = 0U; + if(_is_digit(*format)) { + width = _atoi(&format); + } + else if(*format == '*') { + const int w = va_arg(va, int); + if(w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int) - w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if(*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if(_is_digit(*format)) { + precision = _atoi(&format); + } + else if(*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch(*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if(*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if(*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't' : + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch(*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'p' : + case 'P' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if(*format == 'x' || *format == 'X') { + base = 16U; + } + else if(*format == 'p' || *format == 'P') { + base = 16U; + flags |= FLAGS_HASH; // always hash for pointer format +#if defined(PRINTF_SUPPORT_LONG_LONG) + if(sizeof(uintptr_t) == sizeof(long long)) + flags |= FLAGS_LONG_LONG; + else +#endif + flags |= FLAGS_LONG; + + if(*(format + 1) == 'V') + format++; + } + else if(*format == 'o') { + base = 8U; + } + else if(*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if(*format == 'X' || *format == 'P') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if(flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if((*format == 'i') || (*format == 'd')) { + // signed + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, + precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, + int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + } + else if(*format == 'V') { + lv_vaformat_t * vaf = va_arg(va, lv_vaformat_t *); + va_list copy; + + va_copy(copy, *vaf->va); + idx += _lv_vsnprintf(out, buffer + idx, maxlen - idx, vaf->fmt, copy); + va_end(copy); + } + else { + // unsigned + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, + unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f' : + case 'F' : + if(*format == 'F') flags |= FLAGS_UPPERCASE; + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if((*format == 'g') || (*format == 'G')) flags |= FLAGS_ADAPT_EXP; + if((*format == 'E') || (*format == 'G')) flags |= FLAGS_UPPERCASE; + idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char * p = va_arg(va, char *); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t) -1); + // pre padding + if(flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + +/////////////////////////////////////////////////////////////////////////////// +/// GLOBAL FUNCTIONS FOR LVGL +/////////////////////////////////////////////////////////////////////////////// + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _lv_vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return _lv_vsnprintf(_out_buffer, buffer, count, format, va); +} + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/libraries/lvgl/src/stdlib/builtin/lv_string_builtin.c b/libraries/lvgl/src/stdlib/builtin/lv_string_builtin.c new file mode 100644 index 0000000..a033a78 --- /dev/null +++ b/libraries/lvgl/src/stdlib/builtin/lv_string_builtin.c @@ -0,0 +1,223 @@ +/** + * @file lv_string.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_BUILTIN +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_string.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#ifdef LV_ARCH_64 + #define MEM_UNIT uint64_t + #define ALIGN_MASK 0x7 +#else + #define MEM_UNIT uint32_t + #define ALIGN_MASK 0x3 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +#define _COPY(d, s) *d = *s; d++; s++; +#define _SET(d, v) *d = v; d++; +#define _REPEAT8(expr) expr expr expr expr expr expr expr expr + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + uint8_t * d8 = dst; + const uint8_t * s8 = src; + + /*Simplify for small memories*/ + if(len < 16) { + while(len) { + *d8 = *s8; + d8++; + s8++; + len--; + } + return dst; + } + + lv_uintptr_t d_align = (lv_uintptr_t)d8 & ALIGN_MASK; + lv_uintptr_t s_align = (lv_uintptr_t)s8 & ALIGN_MASK; + + /*Byte copy for unaligned memories*/ + if(s_align != d_align) { + while(len > 32) { + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + len -= 32; + } + while(len) { + _COPY(d8, s8) + len--; + } + return dst; + } + + /*Make the memories aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + _COPY(d8, s8); + d_align--; + len--; + } + } + + uint32_t * d32 = (uint32_t *)d8; + const uint32_t * s32 = (uint32_t *)s8; + while(len > 32) { + _REPEAT8(_COPY(d32, s32)) + len -= 32; + } + + d8 = (uint8_t *)d32; + s8 = (const uint8_t *)s32; + while(len) { + _COPY(d8, s8) + len--; + } + + return dst; +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + uint8_t * d8 = (uint8_t *)dst; + uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; + + /*Make the address aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + _SET(d8, v); + len--; + d_align--; + } + } + + uint32_t v32 = (uint32_t)v + ((uint32_t)v << 8) + ((uint32_t)v << 16) + ((uint32_t)v << 24); + uint32_t * d32 = (uint32_t *)d8; + + while(len > 32) { + _REPEAT8(_SET(d32, v32)); + len -= 32; + } + + d8 = (uint8_t *)d32; + while(len) { + _SET(d8, v); + len--; + } +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + if(dst < src || (char *)dst > ((char *)src + len)) { + return lv_memcpy(dst, src, len); + } + + if(dst > src) { + char * tmp = (char *)dst + len - 1; + char * s = (char *)src + len - 1; + + while(len--) { + *tmp-- = *s--; + } + } + else { + char * tmp = (char *)dst; + char * s = (char *)src; + + while(len--) { + *tmp++ = *s++; + } + } + + return dst; +} + +/* See https://en.cppreference.com/w/c/string/byte/strlen for reference */ +size_t lv_strlen(const char * str) +{ + size_t i = 0; + while(str[i]) i++; + + return i; +} + +char * lv_strncpy(char * dst, const char * src, size_t dst_size) +{ + size_t i; + for(i = 0; i < dst_size - 1 && src[i]; i++) { + dst[i] = src[i]; + } + dst[i] = '\0'; + return dst; +} + +char * lv_strcpy(char * dst, const char * src) +{ + char * tmp = dst; + while((*dst++ = *src++) != '\0'); + return tmp; +} + +int32_t lv_strcmp(const char * s1, const char * s2) +{ + while(*s1 && (*s1 == *s2)) { + s1++; + s2++; + } + return *(const unsigned char *)s1 - *(const unsigned char *)s2; +} + +char * lv_strdup(const char * src) +{ + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*do memcpy is faster than strncpy when length is known*/ + return dst; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/libraries/lvgl/src/stdlib/builtin/lv_tlsf.c b/libraries/lvgl/src/stdlib/builtin/lv_tlsf.c new file mode 100644 index 0000000..8910b05 --- /dev/null +++ b/libraries/lvgl/src/stdlib/builtin/lv_tlsf.c @@ -0,0 +1,1245 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#include +#include "lv_tlsf.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_assert.h" + +#undef printf +#define printf LV_LOG_ERROR + +#define TLSF_MAX_POOL_SIZE (LV_MEM_SIZE + LV_MEM_POOL_EXPAND_SIZE) + +#if !defined(_DEBUG) + #define _DEBUG 0 +#endif + +#if defined(__cplusplus) + #define tlsf_decl inline +#else + #define tlsf_decl static +#endif + +/* +** Architecture-specific bit manipulation routines. +** +** TLSF achieves O(1) cost for malloc and free operations by limiting +** the search for a free block to a free list of guaranteed size +** adequate to fulfill the request, combined with efficient free list +** queries using bitmasks and architecture-specific bit-manipulation +** routines. +** +** Most modern processors provide instructions to count leading zeroes +** in a word, find the lowest and highest set bit, etc. These +** specific implementations will be used when available, falling back +** to a reasonably efficient generic implementation. +** +** NOTE: TLSF spec relies on ffs/fls returning value 0..31. +** ffs/fls return 1-32 by default, returning 0 for error. +*/ + +/* +** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) +** architecture. There is no reliable portable method at compile-time. +*/ +#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ + || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) + #define TLSF_64BIT +#endif + +/* +** Returns one plus the index of the most significant 1-bit of n, +** or if n is zero, returns zero. +*/ +#ifdef TLSF_64BIT + #define TLSF_FLS(n) ((n) & 0xffffffff00000000ull ? 32 + TLSF_FLS32((size_t)(n) >> 32) : TLSF_FLS32(n)) +#else + #define TLSF_FLS(n) TLSF_FLS32(n) +#endif + +#define TLSF_FLS32(n) ((n) & 0xffff0000 ? 16 + TLSF_FLS16((n) >> 16) : TLSF_FLS16(n)) +#define TLSF_FLS16(n) ((n) & 0xff00 ? 8 + TLSF_FLS8 ((n) >> 8) : TLSF_FLS8 (n)) +#define TLSF_FLS8(n) ((n) & 0xf0 ? 4 + TLSF_FLS4 ((n) >> 4) : TLSF_FLS4 (n)) +#define TLSF_FLS4(n) ((n) & 0xc ? 2 + TLSF_FLS2 ((n) >> 2) : TLSF_FLS2 (n)) +#define TLSF_FLS2(n) ((n) & 0x2 ? 1 + TLSF_FLS1 ((n) >> 1) : TLSF_FLS1 (n)) +#define TLSF_FLS1(n) ((n) & 0x1 ? 1 : 0) + +/* +** Returns round up value of log2(n). +** Note: it is used at compile time. +*/ +#define TLSF_LOG2_CEIL(n) ((n) & (n - 1) ? TLSF_FLS(n) : TLSF_FLS(n) - 1) + +/* +** gcc 3.4 and above have builtin support, specialized for architecture. +** Some compilers masquerade as gcc; patchlevel test filters them out. +*/ +#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \ + && defined (__GNUC_PATCHLEVEL__) + +#if defined (__SNC__) +/* SNC for Playstation 3. */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __builtin_clz(reverse); + return bit - 1; +} + +#else + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + return __builtin_ffs(word) - 1; +} + +#endif + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __builtin_clz(word) : 0; + return bit - 1; +} + +#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64)) +/* Microsoft Visual C++ support on x86/X64 architectures. */ + +#include + +#pragma intrinsic(_BitScanReverse) +#pragma intrinsic(_BitScanForward) + +tlsf_decl int tlsf_fls(unsigned int word) +{ + unsigned long index; + return _BitScanReverse(&index, word) ? index : -1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + unsigned long index; + return _BitScanForward(&index, word) ? index : -1; +} + +#elif defined (_MSC_VER) && defined (_M_PPC) +/* Microsoft Visual C++ support on PowerPC architectures. */ + +#include + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = 32 - _CountLeadingZeros(word); + return bit - 1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - _CountLeadingZeros(reverse); + return bit - 1; +} + +#elif defined (__ARMCC_VERSION) +/* RealView Compilation Tools for ARM */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __clz(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __clz(word) : 0; + return bit - 1; +} + +#elif defined (__ghs__) +/* Green Hills support for PowerPC */ + +#include + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __CLZ32(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __CLZ32(word) : 0; + return bit - 1; +} + +#else +/* Fall back to generic implementation. */ + +/* Implement ffs in terms of fls. */ +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + return TLSF_FLS32(reverse) - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + return TLSF_FLS32(word) - 1; +} + +#endif + +/* Possibly 64-bit version of tlsf_fls. */ +#if defined (TLSF_64BIT) +tlsf_decl int tlsf_fls_sizet(size_t size) +{ + int high = (int)(size >> 32); + int bits = 0; + if(high) { + bits = 32 + tlsf_fls(high); + } + else { + bits = tlsf_fls((int)size & 0xffffffff); + + } + return bits; +} +#else +#define tlsf_fls_sizet tlsf_fls +#endif + +#undef tlsf_decl + +/* +** Constants. +*/ + +/* Public constants: may be modified. */ +enum tlsf_public { + /* log2 of number of linear subdivisions of block sizes. Larger + ** values require more memory in the control structure. Values of + ** 4 or 5 are typical. + */ + SL_INDEX_COUNT_LOG2 = 5, +}; + +/* Private constants: do not modify. */ +enum tlsf_private { +#if defined (TLSF_64BIT) + /* All allocation sizes and addresses are aligned to 8 bytes. */ + ALIGN_SIZE_LOG2 = 3, +#else + /* All allocation sizes and addresses are aligned to 4 bytes. */ + ALIGN_SIZE_LOG2 = 2, +#endif + ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), + + /* + ** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. + ** However, because we linearly subdivide the second-level lists, and + ** our minimum size granularity is 4 bytes, it doesn't make sense to + ** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, + ** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be + ** trying to split size ranges into more slots than we have available. + ** Instead, we calculate the minimum threshold size, and place all + ** blocks below that size into the 0th first-level list. + */ + +#if defined (TLSF_MAX_POOL_SIZE) + FL_INDEX_MAX = TLSF_LOG2_CEIL(TLSF_MAX_POOL_SIZE), +#elif defined (TLSF_64BIT) + /* + ** TODO: We can increase this to support larger sizes, at the expense + ** of more overhead in the TLSF structure. + */ + FL_INDEX_MAX = 32, +#else + FL_INDEX_MAX = 30, +#endif + SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), + FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), + FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), + + SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), +}; + +/* +** Cast and min/max macros. +*/ + +#define tlsf_cast(t, exp) ((t) (exp)) +#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) +#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) + +/* +** Set assert macro, if it has not been provided by the user. +*/ +#define tlsf_assert LV_ASSERT + +#if !defined (tlsf_assert) + #define tlsf_assert assert +#endif + +/* +** Static assertion mechanism. +*/ + +#define _tlsf_glue2(x, y) x ## y +#define _tlsf_glue(x, y) _tlsf_glue2(x, y) +#define tlsf_static_assert(exp) \ + typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1] + +/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ +tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); + +/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ +tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); + +/* Ensure we've properly tuned our sizes. */ +tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + +/* +** Data structures and associated constants. +*/ + +/* +** Block header structure. +** +** There are several implementation subtleties involved: +** - The prev_phys_block field is only valid if the previous block is free. +** - The prev_phys_block field is actually stored at the end of the +** previous block. It appears at the beginning of this structure only to +** simplify the implementation. +** - The next_free / prev_free fields are only valid if the block is free. +*/ +typedef struct block_header_t { + /* Points to the previous physical block. */ + struct block_header_t * prev_phys_block; + + /* The size of this block, excluding the block header. */ + size_t size; + + /* Next and previous free blocks. */ + struct block_header_t * next_free; + struct block_header_t * prev_free; +} block_header_t; + +/* +** Since block sizes are always at least a multiple of 4, the two least +** significant bits of the size field are used to store the block status: +** - bit 0: whether block is busy or free +** - bit 1: whether previous block is busy or free +*/ +static const size_t block_header_free_bit = 1 << 0; +static const size_t block_header_prev_free_bit = 1 << 1; + +/* +** The size of the block header exposed to used blocks is the size field. +** The prev_phys_block field is stored *inside* the previous free block. +*/ +static const size_t block_header_overhead = sizeof(size_t); + +/* User data starts directly after the size field in a used block. */ +static const size_t block_start_offset = + offsetof(block_header_t, size) + sizeof(size_t); + +/* +** A free block must be large enough to store its header minus the size of +** the prev_phys_block field, and no larger than the number of addressable +** bits for FL_INDEX. +*/ +static const size_t block_size_min = + sizeof(block_header_t) - sizeof(block_header_t *); +static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; + +/* The TLSF control structure. */ +typedef struct control_t { + /* Empty lists point at this block to indicate they are free. */ + block_header_t block_null; + + /* Bitmaps for free lists. */ + unsigned int fl_bitmap; + unsigned int sl_bitmap[FL_INDEX_COUNT]; + + /* Head of free lists. */ + block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; +} control_t; + +/* A type used for casting when doing pointer arithmetic. */ +typedef ptrdiff_t tlsfptr_t; + +/* +** block_header_t member functions. +*/ + +static size_t block_size(const block_header_t * block) +{ + return block->size & ~(block_header_free_bit | block_header_prev_free_bit); +} + +static void block_set_size(block_header_t * block, size_t size) +{ + const size_t oldsize = block->size; + block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); +} + +static int block_is_last(const block_header_t * block) +{ + return block_size(block) == 0; +} + +static int block_is_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_free_bit); +} + +static void block_set_free(block_header_t * block) +{ + block->size |= block_header_free_bit; +} + +static void block_set_used(block_header_t * block) +{ + block->size &= ~block_header_free_bit; +} + +static int block_is_prev_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_prev_free_bit); +} + +static void block_set_prev_free(block_header_t * block) +{ + block->size |= block_header_prev_free_bit; +} + +static void block_set_prev_used(block_header_t * block) +{ + block->size &= ~block_header_prev_free_bit; +} + +static block_header_t * block_from_ptr(const void * ptr) +{ + return tlsf_cast(block_header_t *, + tlsf_cast(unsigned char *, ptr) - block_start_offset); +} + +static void * block_to_ptr(const block_header_t * block) +{ + return tlsf_cast(void *, + tlsf_cast(unsigned char *, block) + block_start_offset); +} + +/* Return location of next block after block of given size. */ +static block_header_t * offset_to_block(const void * ptr, size_t size) +{ + return tlsf_cast(block_header_t *, tlsf_cast(tlsfptr_t, ptr) + size); +} + +/* Return location of previous block. */ +static block_header_t * block_prev(const block_header_t * block) +{ + tlsf_assert(block_is_prev_free(block) && "previous block must be free"); + return block->prev_phys_block; +} + +/* Return location of next existing block. */ +static block_header_t * block_next(const block_header_t * block) +{ + block_header_t * next = offset_to_block(block_to_ptr(block), + block_size(block) - block_header_overhead); + tlsf_assert(!block_is_last(block)); + return next; +} + +/* Link a new block with its physical neighbor, return the neighbor. */ +static block_header_t * block_link_next(block_header_t * block) +{ + block_header_t * next = block_next(block); + next->prev_phys_block = block; + return next; +} + +static void block_mark_as_free(block_header_t * block) +{ + /* Link the block to the next block, first. */ + block_header_t * next = block_link_next(block); + block_set_prev_free(next); + block_set_free(block); +} + +static void block_mark_as_used(block_header_t * block) +{ + block_header_t * next = block_next(block); + block_set_prev_used(next); + block_set_used(block); +} + +static size_t align_up(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return (x + (align - 1)) & ~(align - 1); +} + +static size_t align_down(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return x - (x & (align - 1)); +} + +static void * align_ptr(const void * ptr, size_t align) +{ + const tlsfptr_t aligned = + (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1); + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return tlsf_cast(void *, aligned); +} + +/* +** Adjust an allocation size to be aligned to word size, and no smaller +** than internal minimum. +*/ +static size_t adjust_request_size(size_t size, size_t align) +{ + size_t adjust = 0; + if(size) { + const size_t aligned = align_up(size, align); + + /* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */ + if(aligned < block_size_max) { + adjust = tlsf_max(aligned, block_size_min); + } + } + return adjust; +} + +/* +** TLSF utility functions. In most cases, these are direct translations of +** the documentation found in the white paper. +*/ + +static void mapping_insert(size_t size, int * fli, int * sli) +{ + int fl, sl; + if(size < SMALL_BLOCK_SIZE) { + /* Store small blocks in first list. */ + fl = 0; + sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + } + else { + fl = tlsf_fls_sizet(size); + sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2); + fl -= (FL_INDEX_SHIFT - 1); + } + *fli = fl; + *sli = sl; +} + +/* This version rounds up to the next block size (for allocations) */ +static void mapping_search(size_t size, int * fli, int * sli) +{ + if(size >= SMALL_BLOCK_SIZE) { + const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; + size += round; + } + mapping_insert(size, fli, sli); +} + +static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli) +{ + int fl = *fli; + int sl = *sli; + + /* + ** First, search for a block in the list associated with the given + ** fl/sl index. + */ + unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl); + if(!sl_map) { + /* No block exists. Search in the next largest first-level list. */ + const unsigned int fl_map = control->fl_bitmap & (~0U << (fl + 1)); + if(!fl_map) { + /* No free blocks available, memory has been exhausted. */ + return 0; + } + + fl = tlsf_ffs(fl_map); + *fli = fl; + sl_map = control->sl_bitmap[fl]; + } + tlsf_assert(sl_map && "internal error - second level bitmap is null"); + sl = tlsf_ffs(sl_map); + *sli = sl; + + /* Return the first block in the free list. */ + return control->blocks[fl][sl]; +} + +/* Remove a free block from the free list.*/ +static void remove_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * prev = block->prev_free; + block_header_t * next = block->next_free; + tlsf_assert(prev && "prev_free field can not be null"); + tlsf_assert(next && "next_free field can not be null"); + next->prev_free = prev; + prev->next_free = next; + + /* If this block is the head of the free list, set new head. */ + if(control->blocks[fl][sl] == block) { + control->blocks[fl][sl] = next; + + /* If the new head is null, clear the bitmap. */ + if(next == &control->block_null) { + control->sl_bitmap[fl] &= ~(1U << sl); + + /* If the second bitmap is now empty, clear the fl bitmap. */ + if(!control->sl_bitmap[fl]) { + control->fl_bitmap &= ~(1U << fl); + } + } + } +} + +/* Insert a free block into the free block list. */ +static void insert_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * current = control->blocks[fl][sl]; + tlsf_assert(current && "free list cannot have a null entry"); + tlsf_assert(block && "cannot insert a null entry into the free list"); + block->next_free = current; + block->prev_free = &control->block_null; + current->prev_free = block; + + tlsf_assert(block_to_ptr(block) == align_ptr(block_to_ptr(block), ALIGN_SIZE) + && "block not aligned properly"); + /* + ** Insert the new block at the head of the list, and mark the first- + ** and second-level bitmaps appropriately. + */ + control->blocks[fl][sl] = block; + control->fl_bitmap |= (1U << fl); + control->sl_bitmap[fl] |= (1U << sl); +} + +/* Remove a given block from the free list. */ +static void block_remove(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* Insert a given block into the free list. */ +static void block_insert(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + insert_free_block(control, block, fl, sl); +} + +static int block_can_split(block_header_t * block, size_t size) +{ + return block_size(block) >= sizeof(block_header_t) + size; +} + +/* Split a block into two, the second of which is free. */ +static block_header_t * block_split(block_header_t * block, size_t size) +{ + /* Calculate the amount of space left in the remaining block. */ + block_header_t * remaining = + offset_to_block(block_to_ptr(block), size - block_header_overhead); + + const size_t remain_size = block_size(block) - (size + block_header_overhead); + + tlsf_assert(block_to_ptr(remaining) == align_ptr(block_to_ptr(remaining), ALIGN_SIZE) + && "remaining block not aligned properly"); + + tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); + block_set_size(remaining, remain_size); + tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); + + block_set_size(block, size); + block_mark_as_free(remaining); + + return remaining; +} + +/* Absorb a free block's storage into an adjacent previous free block. */ +static block_header_t * block_absorb(block_header_t * prev, block_header_t * block) +{ + tlsf_assert(!block_is_last(prev) && "previous block can't be last"); + /* Note: Leaves flags untouched. */ + prev->size += block_size(block) + block_header_overhead; + block_link_next(prev); + return prev; +} + +/* Merge a just-freed block with an adjacent previous free block. */ +static block_header_t * block_merge_prev(control_t * control, block_header_t * block) +{ + if(block_is_prev_free(block)) { + block_header_t * prev = block_prev(block); + tlsf_assert(prev && "prev physical block can't be null"); + tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such"); + block_remove(control, prev); + block = block_absorb(prev, block); + } + + return block; +} + +/* Merge a just-freed block with an adjacent free block. */ +static block_header_t * block_merge_next(control_t * control, block_header_t * block) +{ + block_header_t * next = block_next(block); + tlsf_assert(next && "next physical block can't be null"); + + if(block_is_free(next)) { + tlsf_assert(!block_is_last(block) && "previous block can't be last"); + block_remove(control, next); + block = block_absorb(block, next); + } + + return block; +} + +/* Trim any trailing block space off the end of a block, return to pool. */ +static void block_trim_free(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(block_is_free(block) && "block must be free"); + if(block_can_split(block, size)) { + block_header_t * remaining_block = block_split(block, size); + block_link_next(block); + block_set_prev_free(remaining_block); + block_insert(control, remaining_block); + } +} + +/* Trim any trailing block space off the end of a used block, return to pool. */ +static void block_trim_used(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(!block_is_free(block) && "block must be used"); + if(block_can_split(block, size)) { + /* If the next block is free, we must coalesce. */ + block_header_t * remaining_block = block_split(block, size); + block_set_prev_used(remaining_block); + + remaining_block = block_merge_next(control, remaining_block); + block_insert(control, remaining_block); + } +} + +static block_header_t * block_trim_free_leading(control_t * control, block_header_t * block, size_t size) +{ + block_header_t * remaining_block = block; + if(block_can_split(block, size)) { + /* We want the 2nd block. */ + remaining_block = block_split(block, size - block_header_overhead); + block_set_prev_free(remaining_block); + + block_link_next(block); + block_insert(control, block); + } + + return remaining_block; +} + +static block_header_t * block_locate_free(control_t * control, size_t size) +{ + int fl = 0, sl = 0; + block_header_t * block = 0; + + if(size) { + mapping_search(size, &fl, &sl); + + /* + ** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up + ** with indices that are off the end of the block array. + ** So, we protect against that here, since this is the only callsite of mapping_search. + ** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range. + */ + if(fl < FL_INDEX_COUNT) { + block = search_suitable_block(control, &fl, &sl); + } + } + + if(block) { + tlsf_assert(block_size(block) >= size); + remove_free_block(control, block, fl, sl); + } + + return block; +} + +static void * block_prepare_used(control_t * control, block_header_t * block, size_t size) +{ + void * p = 0; + if(block) { + tlsf_assert(size && "size must be non-zero"); + block_trim_free(control, block, size); + block_mark_as_used(block); + p = block_to_ptr(block); + } + return p; +} + +/* Clear structure and point all empty lists at the null block. */ +static void control_constructor(control_t * control) +{ + int i, j; + + control->block_null.next_free = &control->block_null; + control->block_null.prev_free = &control->block_null; + + control->fl_bitmap = 0; + for(i = 0; i < FL_INDEX_COUNT; ++i) { + control->sl_bitmap[i] = 0; + for(j = 0; j < SL_INDEX_COUNT; ++j) { + control->blocks[i][j] = &control->block_null; + } + } +} + +/* +** Debugging utilities. +*/ + +typedef struct integrity_t { + int prev_status; + int status; +} integrity_t; + +#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } + +static void integrity_walker(void * ptr, size_t size, int used, void * user) +{ + block_header_t * block = block_from_ptr(ptr); + integrity_t * integ = tlsf_cast(integrity_t *, user); + const int this_prev_status = block_is_prev_free(block) ? 1 : 0; + const int this_status = block_is_free(block) ? 1 : 0; + const size_t this_block_size = block_size(block); + + int status = 0; + LV_UNUSED(used); + tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); + tlsf_insist(size == this_block_size && "block size incorrect"); + + integ->prev_status = this_status; + integ->status += status; +} + +int lv_tlsf_check(lv_tlsf_t tlsf) +{ + int i, j; + + control_t * control = tlsf_cast(control_t *, tlsf); + int status = 0; + + /* Check that the free lists and bitmaps are accurate. */ + for(i = 0; i < FL_INDEX_COUNT; ++i) { + for(j = 0; j < SL_INDEX_COUNT; ++j) { + const int fl_map = control->fl_bitmap & (1U << i); + const int sl_list = control->sl_bitmap[i]; + const int sl_map = sl_list & (1U << j); + const block_header_t * block = control->blocks[i][j]; + + /* Check that first- and second-level lists agree. */ + if(!fl_map) { + tlsf_insist(!sl_map && "second-level map must be null"); + } + + if(!sl_map) { + tlsf_insist(block == &control->block_null && "block list must be null"); + continue; + } + + /* Check that there is at least one free block. */ + tlsf_insist(sl_list && "no free blocks in second-level map"); + tlsf_insist(block != &control->block_null && "block should not be null"); + + while(block != &control->block_null) { + int fli, sli; + tlsf_insist(block_is_free(block) && "block should be free"); + tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); + tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); + tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); + tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); + + mapping_insert(block_size(block), &fli, &sli); + tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); + block = block->next_free; + } + } + } + + return status; +} + +#undef tlsf_insist + +static void default_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(user); + printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, (void *)block_from_ptr(ptr)); +} + +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user) +{ + lv_tlsf_walker pool_walker = walker ? walker : default_walker; + block_header_t * block = + offset_to_block(pool, -(int)block_header_overhead); + + while(block && !block_is_last(block)) { + pool_walker( + block_to_ptr(block), + block_size(block), + !block_is_free(block), + user); + block = block_next(block); + } +} + +size_t lv_tlsf_block_size(void * ptr) +{ + size_t size = 0; + if(ptr) { + const block_header_t * block = block_from_ptr(ptr); + size = block_size(block); + } + return size; +} + +int lv_tlsf_check_pool(lv_pool_t pool) +{ + /* Check that the blocks are physically correct. */ + integrity_t integ = { 0, 0 }; + lv_tlsf_walk_pool(pool, integrity_walker, &integ); + + return integ.status; +} + +/* +** Size of the TLSF structures in a given memory block passed to +** lv_tlsf_create, equal to the size of a control_t +*/ +size_t lv_tlsf_size(void) +{ + return sizeof(control_t); +} + +size_t lv_tlsf_align_size(void) +{ + return ALIGN_SIZE; +} + +size_t lv_tlsf_block_size_min(void) +{ + return block_size_min; +} + +size_t lv_tlsf_block_size_max(void) +{ + return block_size_max; +} + +/* +** Overhead of the TLSF structures in a given memory block passed to +** lv_tlsf_add_pool, equal to the overhead of a free block and the +** sentinel block. +*/ +size_t lv_tlsf_pool_overhead(void) +{ + return 2 * block_header_overhead; +} + +size_t lv_tlsf_alloc_overhead(void) +{ + return block_header_overhead; +} + +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes) +{ + block_header_t * block; + block_header_t * next; + + const size_t pool_overhead = lv_tlsf_pool_overhead(); + const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); + + if(((ptrdiff_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_add_pool: Memory must be aligned by %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + if(pool_bytes < block_size_min || pool_bytes > block_size_max) { +#if defined (TLSF_64BIT) + printf("lv_tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)((pool_overhead + block_size_max) / 256)); +#else + printf("lv_tlsf_add_pool: Memory size must be between %u and %u bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)(pool_overhead + block_size_max)); +#endif + return 0; + } + + /* + ** Create the main free block. Offset the start of the block slightly + ** so that the prev_phys_block field falls outside of the pool - + ** it will never be used. + */ + block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead); + block_set_size(block, pool_bytes); + block_set_free(block); + block_set_prev_used(block); + block_insert(tlsf_cast(control_t *, tlsf), block); + + /* Split the block to create a zero-size sentinel block. */ + next = block_link_next(block); + block_set_size(next, 0); + block_set_used(next); + block_set_prev_free(next); + + return mem; +} + +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = offset_to_block(pool, -(int)block_header_overhead); + + int fl = 0, sl = 0; + + tlsf_assert(block_is_free(block) && "block should be free"); + tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); + tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); + + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* +** TLSF main interface. +*/ + +#if _DEBUG +int test_ffs_fls() +{ + /* Verify ffs/fls work properly. */ + int rv = 0; + rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; + rv += (tlsf_fls(0) == -1) ? 0 : 0x2; + rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; + rv += (tlsf_fls(1) == 0) ? 0 : 0x8; + rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; + rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; + rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; + rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; + +#if defined (TLSF_64BIT) + rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; + rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; + rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; +#endif + + if(rv) { + printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); + } + return rv; +} +#endif + +lv_tlsf_t lv_tlsf_create(void * mem) +{ +#if _DEBUG + if(test_ffs_fls()) { + return 0; + } +#endif + + if(((tlsfptr_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_create: Memory must be aligned to %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + control_constructor(tlsf_cast(control_t *, mem)); + + return tlsf_cast(lv_tlsf_t, mem); +} + +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes) +{ + lv_tlsf_t tlsf = lv_tlsf_create(mem); + lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size()); + return tlsf; +} + +void lv_tlsf_destroy(lv_tlsf_t tlsf) +{ + /* Nothing to do. */ + LV_UNUSED(tlsf); +} + +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf) +{ + return tlsf_cast(lv_pool_t, (char *)tlsf + lv_tlsf_size()); +} + +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + block_header_t * block = block_locate_free(control, adjust); + return block_prepare_used(control, block, adjust); +} + +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + + /* + ** We must allocate an additional minimum block size bytes so that if + ** our free block will leave an alignment gap which is smaller, we can + ** trim a leading free block and release it back to the pool. We must + ** do this because the previous physical block is in use, therefore + ** the prev_phys_block field is not valid, and we can't simply adjust + ** the size of that block. + */ + const size_t gap_minimum = sizeof(block_header_t); + const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align); + + /* + ** If alignment is less than or equals base alignment, we're done. + ** If we requested 0 bytes, return null, as lv_tlsf_malloc(0) does. + */ + const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; + + block_header_t * block = block_locate_free(control, aligned_size); + + /* This can't be a static assert. */ + tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead); + + if(block) { + void * ptr = block_to_ptr(block); + void * aligned = align_ptr(ptr, align); + size_t gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + + /* If gap size is too small, offset to next aligned boundary. */ + if(gap && gap < gap_minimum) { + const size_t gap_remain = gap_minimum - gap; + const size_t offset = tlsf_max(gap_remain, align); + const void * next_aligned = tlsf_cast(void *, + tlsf_cast(tlsfptr_t, aligned) + offset); + + aligned = align_ptr(next_aligned, align); + gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + } + + if(gap) { + tlsf_assert(gap >= gap_minimum && "gap size too small"); + block = block_trim_free_leading(control, block, gap); + } + } + + return block_prepare_used(control, block, adjust); +} + +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr) +{ + size_t size = 0; + /* Don't attempt to free a NULL pointer. */ + if(ptr) { + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = block_from_ptr(ptr); + tlsf_assert(!block_is_free(block) && "block already marked as free"); + size = block->size; + block_mark_as_free(block); + block = block_merge_prev(control, block); + block = block_merge_next(control, block); + block_insert(control, block); + } + + return size; +} + +/* +** The TLSF block information provides us with enough information to +** provide a reasonably intelligent implementation of realloc, growing or +** shrinking the currently allocated block as required. +** +** This routine handles the somewhat esoteric edge cases of realloc: +** - a non-zero size with a null pointer will behave like malloc +** - a zero size with a non-null pointer will behave like free +** - a request that cannot be satisfied will leave the original buffer +** untouched +** - an extended buffer size will leave the newly-allocated area with +** contents undefined +*/ +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + void * p = 0; + + /* Zero-size requests are treated as free. */ + if(ptr && size == 0) { + lv_tlsf_free(tlsf, ptr); + } + /* Requests with NULL pointers are treated as malloc. */ + else if(!ptr) { + p = lv_tlsf_malloc(tlsf, size); + } + else { + block_header_t * block = block_from_ptr(ptr); + block_header_t * next = block_next(block); + + const size_t cursize = block_size(block); + const size_t combined = cursize + block_size(next) + block_header_overhead; + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + if(size > cursize && adjust == 0) { + /* The request is probably too large, fail */ + return NULL; + } + + tlsf_assert(!block_is_free(block) && "block already marked as free"); + + /* + ** If the next block is used, or when combined with the current + ** block, does not offer enough space, we must reallocate and copy. + */ + if(adjust > cursize && (!block_is_free(next) || adjust > combined)) { + p = lv_tlsf_malloc(tlsf, size); + if(p) { + const size_t minsize = tlsf_min(cursize, size); + lv_memcpy(p, ptr, minsize); + lv_tlsf_free(tlsf, ptr); + } + } + else { + /* Do we need to expand to the next block? */ + if(adjust > cursize) { + block_merge_next(control, block); + block_mark_as_used(block); + } + + /* Trim the resulting block and return the original pointer. */ + block_trim_used(control, block, adjust); + p = ptr; + } + } + + return p; +} + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/libraries/lvgl/src/stdlib/builtin/lv_tlsf.h b/libraries/lvgl/src/stdlib/builtin/lv_tlsf.h new file mode 100644 index 0000000..9812663 --- /dev/null +++ b/libraries/lvgl/src/stdlib/builtin/lv_tlsf.h @@ -0,0 +1,108 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#ifndef LV_TLSF_H +#define LV_TLSF_H + +/* +** Two Level Segregated Fit memory allocator, version 3.1. +** Written by Matthew Conte +** http://tlsf.baisoku.org +** +** Based on the original documentation by Miguel Masmano: +** http://www.gii.upv.es/tlsf/main/docs +** +** This implementation was written to the specification +** of the document, therefore no GPL restrictions apply. +** +** Copyright (c) 2006-2016, Matthew Conte +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the copyright holder nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL MATTHEW CONTE BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include "../../osal/lv_os.h" +#include "../../misc/lv_ll.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/* lv_tlsf_t: a TLSF structure. Can contain 1 to N pools. */ +/* lv_pool_t: a block of memory that TLSF can manage. */ +typedef void * lv_tlsf_t; +typedef void * lv_pool_t; + +typedef struct { +#if LV_USE_OS + lv_mutex_t mutex; +#endif + lv_tlsf_t tlsf; + size_t cur_used; + size_t max_used; + lv_ll_t pool_ll; +} lv_tlsf_state_t; + +/* Create/destroy a memory pool. */ +lv_tlsf_t lv_tlsf_create(void * mem); +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes); +void lv_tlsf_destroy(lv_tlsf_t tlsf); +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf); + +/* Add/remove memory pools. */ +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes); +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool); + +/* malloc/memalign/realloc/free replacements. */ +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t bytes); +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t bytes); +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size); +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr); + +/* Returns internal block size, not original request size */ +size_t lv_tlsf_block_size(void * ptr); + +/* Overheads/limits of internal structures. */ +size_t lv_tlsf_size(void); +size_t lv_tlsf_align_size(void); +size_t lv_tlsf_block_size_min(void); +size_t lv_tlsf_block_size_max(void); +size_t lv_tlsf_pool_overhead(void); +size_t lv_tlsf_alloc_overhead(void); + +/* Debugging. */ +typedef void (*lv_tlsf_walker)(void * ptr, size_t size, int used, void * user); +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user); +/* Returns nonzero if any internal consistency check fails. */ +int lv_tlsf_check(lv_tlsf_t tlsf); +int lv_tlsf_check_pool(lv_pool_t pool); + +#if defined(__cplusplus) +}; +#endif + +#endif /*LV_TLSF_H*/ + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/libraries/lvgl/src/stdlib/clib/lv_mem_core_clib.c b/libraries/lvgl/src/stdlib/clib/lv_mem_core_clib.c new file mode 100644 index 0000000..9cdddf4 --- /dev/null +++ b/libraries/lvgl/src/stdlib/clib/lv_mem_core_clib.c @@ -0,0 +1,94 @@ +/** + * @file lv_malloc_core.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_CLIB +#include "../../stdlib/lv_mem.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ + +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ + return malloc(size); +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + return realloc(p, new_size); +} + +void lv_free_core(void * p) +{ + free(p); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_CLIB*/ diff --git a/libraries/lvgl/src/stdlib/clib/lv_sprintf_clib.c b/libraries/lvgl/src/stdlib/clib/lv_sprintf_clib.c new file mode 100644 index 0000000..4f4fb9c --- /dev/null +++ b/libraries/lvgl/src/stdlib/clib/lv_sprintf_clib.c @@ -0,0 +1,58 @@ + +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_CLIB +#include +#include +#include "../lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = vsnprintf(buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return vsnprintf(buffer, count, format, va); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/libraries/lvgl/src/stdlib/clib/lv_string_clib.c b/libraries/lvgl/src/stdlib/clib/lv_string_clib.c new file mode 100644 index 0000000..359b2e0 --- /dev/null +++ b/libraries/lvgl/src/stdlib/clib/lv_string_clib.c @@ -0,0 +1,93 @@ +/** + * @file lv_string.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_CLIB +#include "../lv_string.h" +#include "../lv_mem.h" /*Need lv_malloc*/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + return memcpy(dst, src, len); +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + memset(dst, v, len); +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + return memmove(dst, src, len); +} + +size_t lv_strlen(const char * str) +{ + return strlen(str); +} + +char * lv_strncpy(char * dst, const char * src, size_t dest_size) +{ + if(dest_size > 0) { + dst[0] = '\0'; + strncat(dst, src, dest_size - 1); + } + + return dst; +} + +char * lv_strcpy(char * dst, const char * src) +{ + return strcpy(dst, src); +} + +int32_t lv_strcmp(const char * s1, const char * s2) +{ + return strcmp(s1, s2); +} + +char * lv_strdup(const char * src) +{ + /*strdup uses malloc, so use the lv_malloc when LV_USE_STDLIB_MALLOC is not LV_STDLIB_CLIB */ + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*do memcpy is faster than strncpy when length is known*/ + return dst; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_CLIB*/ diff --git a/libraries/lvgl/src/stdlib/lv_mem.c b/libraries/lvgl/src/stdlib/lv_mem.c new file mode 100644 index 0000000..c1ab647 --- /dev/null +++ b/libraries/lvgl/src/stdlib/lv_mem.c @@ -0,0 +1,168 @@ +/** + * @file lv_mem.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_mem.h" +#include "lv_string.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_log.h" +#include "../core/lv_global.h" + +#if LV_USE_OS == LV_OS_PTHREAD + #include +#endif + +/********************* + * DEFINES + *********************/ +/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ +#ifndef LV_MEM_ADD_JUNK + #define LV_MEM_ADD_JUNK 0 +#endif + +#define zero_mem LV_GLOBAL_DEFAULT()->memory_zero + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void * lv_malloc_core(size_t size); +void * lv_realloc_core(void * p, size_t new_size); +void lv_free_core(void * p); +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); +lv_result_t lv_mem_test_core(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * lv_malloc(size_t size) +{ + LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); + if(size == 0) { + LV_TRACE_MEM("using zero_mem"); + return &zero_mem; + } + + void * alloc = lv_malloc_core(size); + + if(alloc == NULL) { + LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); +#endif + return NULL; + } + +#if LV_MEM_ADD_JUNK + lv_memset(alloc, 0xaa, size); +#endif + + LV_TRACE_MEM("allocated at %p", alloc); + return alloc; +} + +void * lv_malloc_zeroed(size_t size) +{ + LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); + if(size == 0) { + LV_TRACE_MEM("using zero_mem"); + return &zero_mem; + } + + void * alloc = lv_malloc_core(size); + if(alloc == NULL) { + LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); +#endif + return NULL; + } + + lv_memzero(alloc, size); + + LV_TRACE_MEM("allocated at %p", alloc); + return alloc; +} + +void lv_free(void * data) +{ + LV_TRACE_MEM("freeing %p", data); + if(data == &zero_mem) return; + if(data == NULL) return; + + lv_free_core(data); +} + +void * lv_realloc(void * data_p, size_t new_size) +{ + LV_TRACE_MEM("reallocating %p with %lu size", data_p, (unsigned long)new_size); + if(new_size == 0) { + LV_TRACE_MEM("using zero_mem"); + lv_free(data_p); + return &zero_mem; + } + + if(data_p == &zero_mem) return lv_malloc(new_size); + + void * new_p = lv_realloc_core(data_p, new_size); + + if(new_p == NULL) { + LV_LOG_ERROR("couldn't reallocate memory"); + return NULL; + } + + LV_TRACE_MEM("reallocated at %p", new_p); + return new_p; +} + +lv_result_t lv_mem_test(void) +{ + if(zero_mem != ZERO_MEM_SENTINEL) { + LV_LOG_WARN("zero_mem is written"); + return LV_RESULT_INVALID; + } + + return lv_mem_test_core(); +} + +void lv_mem_monitor(lv_mem_monitor_t * mon_p) +{ + lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); + lv_mem_monitor_core(mon_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/stdlib/lv_mem.h b/libraries/lvgl/src/stdlib/lv_mem.h new file mode 100644 index 0000000..f66f3d6 --- /dev/null +++ b/libraries/lvgl/src/stdlib/lv_mem.h @@ -0,0 +1,143 @@ +/** + * @file lv_mem.h + * + */ + +#ifndef LV_MEM_H +#define LV_MEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include +#include + +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void * lv_mem_pool_t; + +/** + * Heap information structure. + */ +typedef struct { + size_t total_size; /**< Total heap size*/ + size_t free_cnt; + size_t free_size; /**< Size of available memory*/ + size_t free_biggest_size; + size_t used_cnt; + size_t max_used; /**< Max size of Heap memory used*/ + uint8_t used_pct; /**< Percentage used*/ + uint8_t frag_pct; /**< Amount of fragmentation*/ +} lv_mem_monitor_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize to use malloc/free/realloc etc + */ +void lv_mem_init(void); + +/** + * Drop all dynamically allocated memory and reset the memory pools' state + */ +void lv_mem_deinit(void); + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes); + +void lv_mem_remove_pool(lv_mem_pool_t pool); + +/** + * Allocate memory dynamically + * @param size requested size in bytes + * @return pointer to allocated uninitialized memory, or NULL on failure + */ +void * lv_malloc(size_t size); + +/** + * Allocate zeroed memory dynamically + * @param size requested size in bytes + * @return pointer to allocated zeroed memory, or NULL on failure + */ +void * lv_malloc_zeroed(size_t size); + +/** + * Free an allocated data + * @param data pointer to an allocated memory + */ +void lv_free(void * data); + +/** + * Reallocate a memory with a new size. The old content will be kept. + * @param data_p pointer to an allocated memory. + * Its content will be copied to the new memory block and freed + * @param new_size the desired new size in byte + * @return pointer to the new memory, NULL on failure + */ +void * lv_realloc(void * data_p, size_t new_size); + +/** + * Used internally to execute a plain `malloc` operation + * @param size size in bytes to `malloc` + */ +void * lv_malloc_core(size_t size); + +/** + * Used internally to execute a plain `free` operation + * @param p memory address to free + */ +void lv_free_core(void * p); + +/** + * Used internally to execute a plain realloc operation + * @param p memory address to realloc + * @param new_size size in bytes to realloc + */ +void * lv_realloc_core(void * p, size_t new_size); + +/** + * Used internally to execute a plain malloc operation + * @param size size in bytes to malloc + */ +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); + +lv_result_t lv_mem_test_core(void); + +/** + * @brief Tests the memory allocation system by allocating and freeing a block of memory. + * @return LV_RESULT_OK if the memory allocation system is working properly, or LV_RESULT_INVALID if there is an error. + */ +lv_result_t lv_mem_test(void); + +/** + * Give information about the work memory of dynamic allocation + * @param mon_p pointer to a lv_mem_monitor_t variable, + * the result of the analysis will be stored here + */ +void lv_mem_monitor(lv_mem_monitor_t * mon_p); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MEM_H*/ diff --git a/libraries/lvgl/src/stdlib/lv_sprintf.h b/libraries/lvgl/src/stdlib/lv_sprintf.h new file mode 100644 index 0000000..cd5a803 --- /dev/null +++ b/libraries/lvgl/src/stdlib/lv_sprintf.h @@ -0,0 +1,47 @@ +/** + * lv_snprintf.h + * + */ + +#ifndef _LV_SPRINTF_H_ +#define _LV_SPRINTF_H_ + +#if defined(__has_include) + #if __has_include() + #include + /* platform-specific printf format for int32_t, usually "d" or "ld" */ + #define LV_PRId32 PRId32 + #define LV_PRIu32 PRIu32 + #define LV_PRIx32 PRIx32 + #define LV_PRIX32 PRIX32 + #else + #define LV_PRId32 "d" + #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" + #endif +#else + /* hope this is correct for ports without __has_include or without inttypes.h */ + #define LV_PRId32 "d" + #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" +#endif + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int lv_snprintf(char * buffer, size_t count, const char * format, ...); + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* _LV_SPRINTF_H_*/ diff --git a/libraries/lvgl/src/stdlib/lv_string.h b/libraries/lvgl/src/stdlib/lv_string.h new file mode 100644 index 0000000..745cd49 --- /dev/null +++ b/libraries/lvgl/src/stdlib/lv_string.h @@ -0,0 +1,118 @@ +/** + * @file lv_stringn.h + * + */ + +#ifndef LV_STRING_H +#define LV_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Copies a block of memory from a source address to a destination address. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param len Number of bytes to copy. + * @return Pointer to the destination array. + * @note The function does not check for any overlapping of the source and destination memory blocks. + */ +void * lv_memcpy(void * dst, const void * src, size_t len); + +/** + * @brief Fills a block of memory with a specified value. + * @param dst Pointer to the destination array to fill with the specified value. + * @param v Value to be set. The value is passed as an int, but the function fills + * the block of memory using the unsigned char conversion of this value. + * @param len Number of bytes to be set to the value. + */ +void lv_memset(void * dst, uint8_t v, size_t len); + +/** + * @brief Move a block of memory from source to destination + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param len Number of bytes to copy + * @return Pointer to the destination array. + */ +void * lv_memmove(void * dst, const void * src, size_t len); + +/** + * Same as `memset(dst, 0x00, len)`. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +static inline void lv_memzero(void * dst, size_t len) +{ + lv_memset(dst, 0x00, len); +} + +/** + * @brief Computes the length of the string str up to, but not including the terminating null character. + * @param str Pointer to the null-terminated byte string to be examined. + * @return The length of the string in bytes. + */ +size_t lv_strlen(const char * str); + +/** + * @brief Copies up to dest_size characters from the string pointed to by src to the character array pointed to by dst. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param dest_size Maximum number of characters to be copied to dst, including the null character. + * @return A pointer to the destination array, which is dst. + */ +char * lv_strncpy(char * dst, const char * src, size_t dest_size); + +/** + * @brief Copies the string pointed to by src, including the terminating null character, + * to the character array pointed to by dst. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @return A pointer to the destination array, which is dst. + */ +char * lv_strcpy(char * dst, const char * src); + +/** + * @brief This function will compare two strings without specified length. + * @param s1 pointer to the first string + * @param s2 pointer to the second string + * @return the difference between the value of the first unmatching character. + */ +int32_t lv_strcmp(const char * s1, const char * s2); + +/** + * @brief Duplicate a string by allocating a new one and copying the content. + * @param src Pointer to the source of data to be copied. + * @return A pointer to the new allocated string. NULL if failed. + */ +char * lv_strdup(const char * src); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STRING_H*/ diff --git a/libraries/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c b/libraries/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c new file mode 100644 index 0000000..69c8bd6 --- /dev/null +++ b/libraries/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c @@ -0,0 +1,95 @@ +/** + * @file lv_malloc_core.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_MICROPYTHON +#include "../../stdlib/lv_mem.h" +#include "include/lv_mp_mem_custom_include.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ + +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ + return m_malloc(size); +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + return m_realloc(p, new_size); +} + +void lv_free_core(void * p) +{ + m_free(p); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_MICROPYTHON*/ diff --git a/libraries/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c b/libraries/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c new file mode 100644 index 0000000..29a600a --- /dev/null +++ b/libraries/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c @@ -0,0 +1,98 @@ +/** + * @file lv_malloc_core_rtthread.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_RTTHREAD +#include "../../stdlib/lv_mem.h" +#include + +#ifndef RT_USING_HEAP + #error "lv_mem_core_rtthread: RT_USING_HEAP is required. Define it in rtconfig.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ + return rt_malloc(size); +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + return rt_realloc(p, new_size); +} + +void lv_free_core(void * p) +{ + rt_free(p); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/libraries/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c b/libraries/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c new file mode 100644 index 0000000..721f4fd --- /dev/null +++ b/libraries/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c @@ -0,0 +1,61 @@ +/** + * @file lv_sprintf_rtthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_RTTHREAD +#include +#include +#include "../lv_sprintf.h" + +#if LV_USE_FLOAT == 1 + #warning "lv_sprintf_rtthread: rtthread not support float in sprintf" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = rt_vsnprintf(buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return rt_vsnprintf(buffer, count, format, va); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/libraries/lvgl/src/stdlib/rtthread/lv_string_rtthread.c b/libraries/lvgl/src/stdlib/rtthread/lv_string_rtthread.c new file mode 100644 index 0000000..8694981 --- /dev/null +++ b/libraries/lvgl/src/stdlib/rtthread/lv_string_rtthread.c @@ -0,0 +1,92 @@ +/** + * @file lv_string_rtthread.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_RTTHREAD +#include "../lv_string.h" +#include "../lv_mem.h" /*Need lv_malloc*/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + return rt_memcpy(dst, src, len); +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + rt_memset(dst, v, len); +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + return rt_memmove(dst, src, len); +} + +size_t lv_strlen(const char * str) +{ + return rt_strlen(str); +} + +char * lv_strncpy(char * dst, const char * src, size_t dest_size) +{ + return rt_strncpy(dst, src, dest_size); +} + +char * lv_strcpy(char * dst, const char * src) +{ + return rt_strcpy(dst, src); +} + +int32_t lv_strcmp(const char * s1, const char * s2) +{ + return rt_strcmp(s1, s2); +} + +char * lv_strdup(const char * src) +{ + /*strdup uses rt_malloc, so use the lv_malloc when LV_USE_STDLIB_MALLOC is not LV_STDLIB_RTTHREAD */ +#if LV_USE_STDLIB_MALLOC != LV_STDLIB_RTTHREAD + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*do memcpy is faster than strncpy when length is known*/ + return dst; +#else + return rt_strdup(src); +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/libraries/lvgl/src/themes/default/lv_theme_default.c b/libraries/lvgl/src/themes/default/lv_theme_default.c new file mode 100644 index 0000000..66494ba --- /dev/null +++ b/libraries/lvgl/src/themes/default/lv_theme_default.c @@ -0,0 +1,1225 @@ +/** + * @file lv_theme_default.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_DEFAULT + +#include "../lv_theme.h" +#include "../../misc/lv_color.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_default)) + +#define MODE_DARK 1 +#define RADIUS_DEFAULT _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 12 : 8) + +/*SCREEN*/ +#define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_CARD lv_color_white() +#define LIGHT_COLOR_TEXT lv_palette_darken(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_GREY lv_palette_lighten(LV_PALETTE_GREY, 2) +#define DARK_COLOR_SCR lv_color_hex(0x15171A) +#define DARK_COLOR_CARD lv_color_hex(0x282b30) +#define DARK_COLOR_TEXT lv_palette_lighten(LV_PALETTE_GREY, 5) +#define DARK_COLOR_GREY lv_color_hex(0x2f3237) + +#define TRANSITION_TIME LV_THEME_DEFAULT_TRANSITION_TIME +#define BORDER_WIDTH _LV_DPX_CALC(theme->disp_dpi, 2) +#define OUTLINE_WIDTH _LV_DPX_CALC(theme->disp_dpi, 3) + +#define PAD_DEF _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 24 : theme->disp_size == DISP_MEDIUM ? 20 : 16) +#define PAD_SMALL _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 14 : theme->disp_size == DISP_MEDIUM ? 12 : 10) +#define PAD_TINY _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 8 : theme->disp_size == DISP_MEDIUM ? 6 : 2) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t scrollbar; + lv_style_t scrollbar_scrolled; + lv_style_t card; + lv_style_t btn; + + /*Utility*/ + lv_style_t bg_color_primary; + lv_style_t bg_color_primary_muted; + lv_style_t bg_color_secondary; + lv_style_t bg_color_secondary_muted; + lv_style_t bg_color_grey; + lv_style_t bg_color_white; + lv_style_t pressed; + lv_style_t disabled; + lv_style_t pad_zero; + lv_style_t pad_tiny; + lv_style_t pad_small; + lv_style_t pad_normal; + lv_style_t pad_gap; + lv_style_t line_space_large; + lv_style_t text_align_center; + lv_style_t outline_primary; + lv_style_t outline_secondary; + lv_style_t circle; + lv_style_t no_radius; + lv_style_t clip_corner; + lv_style_t rotary_scroll; +#if LV_THEME_DEFAULT_GROW + lv_style_t grow; +#endif + lv_style_t transition_delayed; + lv_style_t transition_normal; + lv_style_t anim; + lv_style_t anim_fast; + + /*Parts*/ + lv_style_t knob; + +#if LV_USE_ARC + lv_style_t arc_indic; + lv_style_t arc_indic_primary; +#endif + +#if LV_USE_CHART + lv_style_t chart_series, chart_indic, chart_bg; +#endif + +#if LV_USE_DROPDOWN + lv_style_t dropdown_list; +#endif + +#if LV_USE_CHECKBOX + lv_style_t cb_marker, cb_marker_checked; +#endif + +#if LV_USE_SWITCH + lv_style_t switch_knob; +#endif + +#if LV_USE_LINE + lv_style_t line; +#endif + +#if LV_USE_TABLE + lv_style_t table_cell; +#endif + +#if LV_USE_TEXTAREA + lv_style_t ta_cursor, ta_placeholder; +#endif + +#if LV_USE_CALENDAR + lv_style_t calendar_btnm_bg, calendar_btnm_day, calendar_header; +#endif + +#if LV_USE_MENU + lv_style_t menu_bg, menu_cont, menu_sidebar_cont, menu_main_cont, menu_page, menu_header_cont, menu_header_btn, + menu_section, menu_pressed, menu_separator; +#endif + +#if LV_USE_MSGBOX + lv_style_t msgbox_backdrop_bg; +#endif + +#if LV_USE_KEYBOARD + lv_style_t keyboard_button_bg; +#endif + +#if LV_USE_LIST + lv_style_t list_bg, list_btn, list_item_grow; +#endif + +#if LV_USE_TABVIEW + lv_style_t tab_bg_focus, tab_btn; +#endif +#if LV_USE_LED + lv_style_t led; +#endif + +#if LV_USE_SCALE + lv_style_t scale; +#endif +} my_theme_styles_t; + +typedef enum { + DISP_SMALL = 3, + DISP_MEDIUM = 2, + DISP_LARGE = 1, +} disp_size_t; + +struct _my_theme_t { + lv_theme_t base; + disp_size_t disp_size; + int32_t disp_dpi; + lv_color_t color_scr; + lv_color_t color_text; + lv_color_t color_card; + lv_color_t color_grey; + bool inited; + my_theme_styles_t styles; + + lv_color_filter_dsc_t dark_filter; + lv_color_filter_dsc_t grey_filter; + +#if LV_THEME_DEFAULT_TRANSITION_TIME + lv_style_transition_dsc_t trans_delayed; + lv_style_transition_dsc_t trans_normal; +#endif +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); +static void style_init_reset(lv_style_t * style); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_color_t dark_color_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t c, lv_opa_t opa) +{ + LV_UNUSED(f); + return lv_color_darken(c, opa); +} + +static lv_color_t grey_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t color, lv_opa_t opa) +{ + LV_UNUSED(f); + if(theme_def->base.flags & MODE_DARK) return lv_color_mix(lv_palette_darken(LV_PALETTE_GREY, 2), color, opa); + else return lv_color_mix(lv_palette_lighten(LV_PALETTE_GREY, 2), color, opa); +} + +static void style_init(my_theme_t * theme) +{ +#if TRANSITION_TIME + static const lv_style_prop_t trans_props[] = { + LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, + LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, + LV_STYLE_TRANSLATE_Y, LV_STYLE_TRANSLATE_X, + LV_STYLE_TRANSFORM_ROTATION, + LV_STYLE_TRANSFORM_SCALE_X, LV_STYLE_TRANSFORM_SCALE_Y, + LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_DSC, + 0 + }; +#endif + + theme->color_scr = theme->base.flags & MODE_DARK ? DARK_COLOR_SCR : LIGHT_COLOR_SCR; + theme->color_text = theme->base.flags & MODE_DARK ? DARK_COLOR_TEXT : LIGHT_COLOR_TEXT; + theme->color_card = theme->base.flags & MODE_DARK ? DARK_COLOR_CARD : LIGHT_COLOR_CARD; + theme->color_grey = theme->base.flags & MODE_DARK ? DARK_COLOR_GREY : LIGHT_COLOR_GREY; + + style_init_reset(&theme->styles.transition_delayed); + style_init_reset(&theme->styles.transition_normal); +#if TRANSITION_TIME + lv_style_transition_dsc_init(&theme->trans_delayed, trans_props, lv_anim_path_linear, TRANSITION_TIME, 70, NULL); + lv_style_transition_dsc_init(&theme->trans_normal, trans_props, lv_anim_path_linear, TRANSITION_TIME, 0, NULL); + + lv_style_set_transition(&theme->styles.transition_delayed, + &theme->trans_delayed); /*Go back to default state with delay*/ + + lv_style_set_transition(&theme->styles.transition_normal, &theme->trans_normal); /*Go back to default state with delay*/ +#endif + + style_init_reset(&theme->styles.scrollbar); + lv_color_t sb_color = (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_main(LV_PALETTE_GREY); + lv_style_set_bg_color(&theme->styles.scrollbar, sb_color); + + lv_style_set_radius(&theme->styles.scrollbar, LV_RADIUS_CIRCLE); + lv_style_set_pad_all(&theme->styles.scrollbar, _LV_DPX_CALC(theme->disp_dpi, 7)); + lv_style_set_width(&theme->styles.scrollbar, _LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_40); +#if TRANSITION_TIME + lv_style_set_transition(&theme->styles.scrollbar, &theme->trans_normal); +#endif + + style_init_reset(&theme->styles.scrollbar_scrolled); + lv_style_set_bg_opa(&theme->styles.scrollbar_scrolled, LV_OPA_COVER); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, theme->color_scr); + lv_style_set_text_color(&theme->styles.scr, theme->color_text); + lv_style_set_text_font(&theme->styles.scr, theme->base.font_normal); + lv_style_set_pad_row(&theme->styles.scr, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.scr, PAD_SMALL); + lv_style_set_rotary_sensitivity(&theme->styles.scr, theme->disp_dpi / 4 * 256); + + style_init_reset(&theme->styles.card); + lv_style_set_radius(&theme->styles.card, RADIUS_DEFAULT); + lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.card, theme->color_card); + lv_style_set_border_color(&theme->styles.card, theme->color_grey); + lv_style_set_border_width(&theme->styles.card, BORDER_WIDTH); + lv_style_set_border_post(&theme->styles.card, true); + lv_style_set_text_color(&theme->styles.card, theme->color_text); + lv_style_set_pad_all(&theme->styles.card, PAD_DEF); + lv_style_set_pad_row(&theme->styles.card, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.card, PAD_SMALL); + lv_style_set_line_color(&theme->styles.card, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_line_width(&theme->styles.card, _LV_DPX_CALC(theme->disp_dpi, 1)); + + style_init_reset(&theme->styles.outline_primary); + lv_style_set_outline_color(&theme->styles.outline_primary, theme->base.color_primary); + lv_style_set_outline_width(&theme->styles.outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_pad(&theme->styles.outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&theme->styles.outline_primary, LV_OPA_50); + + style_init_reset(&theme->styles.outline_secondary); + lv_style_set_outline_color(&theme->styles.outline_secondary, theme->base.color_secondary); + lv_style_set_outline_width(&theme->styles.outline_secondary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&theme->styles.outline_secondary, LV_OPA_50); + + style_init_reset(&theme->styles.btn); + lv_style_set_radius(&theme->styles.btn, + _LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12 : 8)); + lv_style_set_bg_opa(&theme->styles.btn, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.btn, theme->color_grey); + if(!(theme->base.flags & MODE_DARK)) { + lv_style_set_shadow_color(&theme->styles.btn, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_shadow_width(&theme->styles.btn, LV_DPX(3)); + lv_style_set_shadow_opa(&theme->styles.btn, LV_OPA_50); + lv_style_set_shadow_offset_y(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, LV_DPX(4))); + } + lv_style_set_text_color(&theme->styles.btn, theme->color_text); + lv_style_set_pad_hor(&theme->styles.btn, PAD_DEF); + lv_style_set_pad_ver(&theme->styles.btn, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_pad_row(&theme->styles.btn, _LV_DPX_CALC(theme->disp_dpi, 5)); + + lv_color_filter_dsc_init(&theme->dark_filter, dark_color_filter_cb); + lv_color_filter_dsc_init(&theme->grey_filter, grey_filter_cb); + + style_init_reset(&theme->styles.pressed); + lv_style_set_color_filter_dsc(&theme->styles.pressed, &theme->dark_filter); + lv_style_set_color_filter_opa(&theme->styles.pressed, 35); + + style_init_reset(&theme->styles.disabled); + lv_style_set_color_filter_dsc(&theme->styles.disabled, &theme->grey_filter); + lv_style_set_color_filter_opa(&theme->styles.disabled, LV_OPA_50); + + style_init_reset(&theme->styles.clip_corner); + lv_style_set_clip_corner(&theme->styles.clip_corner, true); + lv_style_set_border_post(&theme->styles.clip_corner, true); + + style_init_reset(&theme->styles.pad_normal); + lv_style_set_pad_all(&theme->styles.pad_normal, PAD_DEF); + lv_style_set_pad_row(&theme->styles.pad_normal, PAD_DEF); + lv_style_set_pad_column(&theme->styles.pad_normal, PAD_DEF); + + style_init_reset(&theme->styles.pad_small); + lv_style_set_pad_all(&theme->styles.pad_small, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.pad_small, PAD_SMALL); + + style_init_reset(&theme->styles.pad_gap); + lv_style_set_pad_row(&theme->styles.pad_gap, _LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_pad_column(&theme->styles.pad_gap, _LV_DPX_CALC(theme->disp_dpi, 10)); + + style_init_reset(&theme->styles.line_space_large); + lv_style_set_text_line_space(&theme->styles.line_space_large, _LV_DPX_CALC(theme->disp_dpi, 20)); + + style_init_reset(&theme->styles.text_align_center); + lv_style_set_text_align(&theme->styles.text_align_center, LV_TEXT_ALIGN_CENTER); + + style_init_reset(&theme->styles.pad_zero); + lv_style_set_pad_all(&theme->styles.pad_zero, 0); + lv_style_set_pad_row(&theme->styles.pad_zero, 0); + lv_style_set_pad_column(&theme->styles.pad_zero, 0); + + style_init_reset(&theme->styles.pad_tiny); + lv_style_set_pad_all(&theme->styles.pad_tiny, PAD_TINY); + lv_style_set_pad_row(&theme->styles.pad_tiny, PAD_TINY); + lv_style_set_pad_column(&theme->styles.pad_tiny, PAD_TINY); + + style_init_reset(&theme->styles.bg_color_primary); + lv_style_set_bg_color(&theme->styles.bg_color_primary, theme->base.color_primary); + lv_style_set_text_color(&theme->styles.bg_color_primary, lv_color_white()); + lv_style_set_bg_opa(&theme->styles.bg_color_primary, LV_OPA_COVER); + + style_init_reset(&theme->styles.bg_color_primary_muted); + lv_style_set_bg_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); + lv_style_set_text_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.bg_color_primary_muted, LV_OPA_20); + + style_init_reset(&theme->styles.bg_color_secondary); + lv_style_set_bg_color(&theme->styles.bg_color_secondary, theme->base.color_secondary); + lv_style_set_text_color(&theme->styles.bg_color_secondary, lv_color_white()); + lv_style_set_bg_opa(&theme->styles.bg_color_secondary, LV_OPA_COVER); + + style_init_reset(&theme->styles.bg_color_secondary_muted); + lv_style_set_bg_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); + lv_style_set_text_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); + lv_style_set_bg_opa(&theme->styles.bg_color_secondary_muted, LV_OPA_20); + + style_init_reset(&theme->styles.bg_color_grey); + lv_style_set_bg_color(&theme->styles.bg_color_grey, theme->color_grey); + lv_style_set_bg_opa(&theme->styles.bg_color_grey, LV_OPA_COVER); + lv_style_set_text_color(&theme->styles.bg_color_grey, theme->color_text); + + style_init_reset(&theme->styles.bg_color_white); + lv_style_set_bg_color(&theme->styles.bg_color_white, theme->color_card); + lv_style_set_bg_opa(&theme->styles.bg_color_white, LV_OPA_COVER); + lv_style_set_text_color(&theme->styles.bg_color_white, theme->color_text); + + style_init_reset(&theme->styles.circle); + lv_style_set_radius(&theme->styles.circle, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.no_radius); + lv_style_set_radius(&theme->styles.no_radius, 0); + + style_init_reset(&theme->styles.rotary_scroll); + lv_style_set_rotary_sensitivity(&theme->styles.rotary_scroll, theme->disp_dpi / 4 * 256); + +#if LV_THEME_DEFAULT_GROW + style_init_reset(&theme->styles.grow); + lv_style_set_transform_width(&theme->styles.grow, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_transform_height(&theme->styles.grow, _LV_DPX_CALC(theme->disp_dpi, 3)); +#endif + + style_init_reset(&theme->styles.knob); + lv_style_set_bg_color(&theme->styles.knob, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.knob, LV_OPA_COVER); + lv_style_set_pad_all(&theme->styles.knob, _LV_DPX_CALC(theme->disp_dpi, 6)); + lv_style_set_radius(&theme->styles.knob, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.anim); + lv_style_set_anim_duration(&theme->styles.anim, 200); + + style_init_reset(&theme->styles.anim_fast); + lv_style_set_anim_duration(&theme->styles.anim_fast, 120); + +#if LV_USE_ARC + style_init_reset(&theme->styles.arc_indic); + lv_style_set_arc_color(&theme->styles.arc_indic, theme->color_grey); + lv_style_set_arc_width(&theme->styles.arc_indic, _LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_arc_rounded(&theme->styles.arc_indic, true); + + style_init_reset(&theme->styles.arc_indic_primary); + lv_style_set_arc_color(&theme->styles.arc_indic_primary, theme->base.color_primary); +#endif + +#if LV_USE_DROPDOWN + style_init_reset(&theme->styles.dropdown_list); + lv_style_set_max_height(&theme->styles.dropdown_list, LV_DPI_DEF * 2); +#endif +#if LV_USE_CHECKBOX + style_init_reset(&theme->styles.cb_marker); + lv_style_set_pad_all(&theme->styles.cb_marker, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_border_width(&theme->styles.cb_marker, BORDER_WIDTH); + lv_style_set_border_color(&theme->styles.cb_marker, theme->base.color_primary); + lv_style_set_bg_color(&theme->styles.cb_marker, theme->color_card); + lv_style_set_bg_opa(&theme->styles.cb_marker, LV_OPA_COVER); + lv_style_set_radius(&theme->styles.cb_marker, RADIUS_DEFAULT / 2); + + style_init_reset(&theme->styles.cb_marker_checked); + lv_style_set_bg_image_src(&theme->styles.cb_marker_checked, LV_SYMBOL_OK); + lv_style_set_text_color(&theme->styles.cb_marker_checked, lv_color_white()); + lv_style_set_text_font(&theme->styles.cb_marker_checked, theme->base.font_small); +#endif + +#if LV_USE_SWITCH + style_init_reset(&theme->styles.switch_knob); + lv_style_set_pad_all(&theme->styles.switch_knob, - _LV_DPX_CALC(theme->disp_dpi, 4)); + lv_style_set_bg_color(&theme->styles.switch_knob, lv_color_white()); +#endif + +#if LV_USE_LINE + style_init_reset(&theme->styles.line); + lv_style_set_line_width(&theme->styles.line, 1); + lv_style_set_line_color(&theme->styles.line, theme->color_text); +#endif + +#if LV_USE_CHART + style_init_reset(&theme->styles.chart_bg); + lv_style_set_border_post(&theme->styles.chart_bg, false); + lv_style_set_pad_column(&theme->styles.chart_bg, _LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_line_color(&theme->styles.chart_bg, theme->color_grey); + + style_init_reset(&theme->styles.chart_series); + lv_style_set_line_width(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_radius(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 3)); + + int32_t chart_size = _LV_DPX_CALC(theme->disp_dpi, 8); + lv_style_set_size(&theme->styles.chart_series, chart_size, chart_size); + lv_style_set_pad_column(&theme->styles.chart_series, _LV_DPX_CALC(theme->disp_dpi, 2)); + + style_init_reset(&theme->styles.chart_indic); + lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); + lv_style_set_size(&theme->styles.chart_indic, chart_size, chart_size); + lv_style_set_bg_color(&theme->styles.chart_indic, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); +#endif + +#if LV_USE_MENU + style_init_reset(&theme->styles.menu_bg); + lv_style_set_pad_all(&theme->styles.menu_bg, 0); + lv_style_set_pad_gap(&theme->styles.menu_bg, 0); + lv_style_set_radius(&theme->styles.menu_bg, 0); + lv_style_set_clip_corner(&theme->styles.menu_bg, true); + lv_style_set_border_side(&theme->styles.menu_bg, LV_BORDER_SIDE_NONE); + + style_init_reset(&theme->styles.menu_section); + lv_style_set_radius(&theme->styles.menu_section, RADIUS_DEFAULT); + lv_style_set_clip_corner(&theme->styles.menu_section, true); + lv_style_set_bg_opa(&theme->styles.menu_section, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.menu_section, theme->color_card); + lv_style_set_text_color(&theme->styles.menu_section, theme->color_text); + + style_init_reset(&theme->styles.menu_cont); + lv_style_set_pad_hor(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_pad_ver(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_border_width(&theme->styles.menu_cont, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_opa(&theme->styles.menu_cont, LV_OPA_10); + lv_style_set_border_color(&theme->styles.menu_cont, theme->color_text); + lv_style_set_border_side(&theme->styles.menu_cont, LV_BORDER_SIDE_NONE); + + style_init_reset(&theme->styles.menu_sidebar_cont); + lv_style_set_pad_all(&theme->styles.menu_sidebar_cont, 0); + lv_style_set_pad_gap(&theme->styles.menu_sidebar_cont, 0); + lv_style_set_border_width(&theme->styles.menu_sidebar_cont, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_opa(&theme->styles.menu_sidebar_cont, LV_OPA_10); + lv_style_set_border_color(&theme->styles.menu_sidebar_cont, theme->color_text); + lv_style_set_border_side(&theme->styles.menu_sidebar_cont, LV_BORDER_SIDE_RIGHT); + + style_init_reset(&theme->styles.menu_main_cont); + lv_style_set_pad_all(&theme->styles.menu_main_cont, 0); + lv_style_set_pad_gap(&theme->styles.menu_main_cont, 0); + + style_init_reset(&theme->styles.menu_header_cont); + lv_style_set_pad_hor(&theme->styles.menu_header_cont, PAD_SMALL); + lv_style_set_pad_ver(&theme->styles.menu_header_cont, PAD_TINY); + lv_style_set_pad_gap(&theme->styles.menu_header_cont, PAD_SMALL); + + style_init_reset(&theme->styles.menu_header_btn); + lv_style_set_pad_hor(&theme->styles.menu_header_btn, PAD_TINY); + lv_style_set_pad_ver(&theme->styles.menu_header_btn, PAD_TINY); + lv_style_set_shadow_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); + lv_style_set_bg_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); + lv_style_set_text_color(&theme->styles.menu_header_btn, theme->color_text); + + style_init_reset(&theme->styles.menu_page); + lv_style_set_pad_hor(&theme->styles.menu_page, 0); + lv_style_set_pad_gap(&theme->styles.menu_page, 0); + + style_init_reset(&theme->styles.menu_pressed); + lv_style_set_bg_opa(&theme->styles.menu_pressed, LV_OPA_20); + lv_style_set_bg_color(&theme->styles.menu_pressed, lv_palette_main(LV_PALETTE_GREY)); + + style_init_reset(&theme->styles.menu_separator); + lv_style_set_bg_opa(&theme->styles.menu_separator, LV_OPA_TRANSP); + lv_style_set_pad_ver(&theme->styles.menu_separator, PAD_TINY); +#endif + +#if LV_USE_TABLE + style_init_reset(&theme->styles.table_cell); + lv_style_set_border_width(&theme->styles.table_cell, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.table_cell, theme->color_grey); + lv_style_set_border_side(&theme->styles.table_cell, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_color(&theme->styles.ta_cursor, theme->color_text); + lv_style_set_border_width(&theme->styles.ta_cursor, _LV_DPX_CALC(theme->disp_dpi, 2)); + lv_style_set_pad_left(&theme->styles.ta_cursor, - _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 400); + + style_init_reset(&theme->styles.ta_placeholder); + lv_style_set_text_color(&theme->styles.ta_placeholder, + (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_lighten(LV_PALETTE_GREY, 1)); +#endif + +#if LV_USE_CALENDAR + style_init_reset(&theme->styles.calendar_btnm_bg); + lv_style_set_pad_all(&theme->styles.calendar_btnm_bg, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.calendar_btnm_bg, PAD_SMALL / 2); + + style_init_reset(&theme->styles.calendar_btnm_day); + lv_style_set_border_width(&theme->styles.calendar_btnm_day, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.calendar_btnm_day, theme->color_grey); + lv_style_set_bg_color(&theme->styles.calendar_btnm_day, theme->color_card); + lv_style_set_bg_opa(&theme->styles.calendar_btnm_day, LV_OPA_20); + + style_init_reset(&theme->styles.calendar_header); + lv_style_set_pad_hor(&theme->styles.calendar_header, PAD_SMALL); + lv_style_set_pad_top(&theme->styles.calendar_header, PAD_SMALL); + lv_style_set_pad_bottom(&theme->styles.calendar_header, PAD_TINY); + lv_style_set_pad_gap(&theme->styles.calendar_header, PAD_SMALL); +#endif + +#if LV_USE_MSGBOX + style_init_reset(&theme->styles.msgbox_backdrop_bg); + lv_style_set_bg_color(&theme->styles.msgbox_backdrop_bg, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_bg_opa(&theme->styles.msgbox_backdrop_bg, LV_OPA_50); +#endif +#if LV_USE_KEYBOARD + style_init_reset(&theme->styles.keyboard_button_bg); + lv_style_set_shadow_width(&theme->styles.keyboard_button_bg, 0); + lv_style_set_radius(&theme->styles.keyboard_button_bg, + theme->disp_size == DISP_SMALL ? RADIUS_DEFAULT / 2 : RADIUS_DEFAULT); +#endif + +#if LV_USE_TABVIEW + style_init_reset(&theme->styles.tab_btn); + lv_style_set_border_color(&theme->styles.tab_btn, theme->base.color_primary); + lv_style_set_border_width(&theme->styles.tab_btn, BORDER_WIDTH * 2); + lv_style_set_border_side(&theme->styles.tab_btn, LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_top(&theme->styles.tab_btn, BORDER_WIDTH * 2); + + style_init_reset(&theme->styles.tab_bg_focus); + lv_style_set_outline_pad(&theme->styles.tab_bg_focus, -BORDER_WIDTH); +#endif + +#if LV_USE_LIST + style_init_reset(&theme->styles.list_bg); + lv_style_set_pad_hor(&theme->styles.list_bg, PAD_DEF); + lv_style_set_pad_ver(&theme->styles.list_bg, 0); + lv_style_set_pad_gap(&theme->styles.list_bg, 0); + lv_style_set_clip_corner(&theme->styles.list_bg, true); + + style_init_reset(&theme->styles.list_btn); + lv_style_set_border_width(&theme->styles.list_btn, _LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.list_btn, theme->color_grey); + lv_style_set_border_side(&theme->styles.list_btn, LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_all(&theme->styles.list_btn, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.list_btn, PAD_SMALL); + + style_init_reset(&theme->styles.list_item_grow); + lv_style_set_transform_width(&theme->styles.list_item_grow, PAD_DEF); +#endif + +#if LV_USE_LED + style_init_reset(&theme->styles.led); + lv_style_set_bg_opa(&theme->styles.led, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.led, lv_color_white()); + lv_style_set_bg_grad_color(&theme->styles.led, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_radius(&theme->styles.led, LV_RADIUS_CIRCLE); + lv_style_set_shadow_width(&theme->styles.led, _LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_shadow_color(&theme->styles.led, lv_color_white()); + lv_style_set_shadow_spread(&theme->styles.led, _LV_DPX_CALC(theme->disp_dpi, 5)); +#endif + +#if LV_USE_SCALE + style_init_reset(&theme->styles.scale); + lv_style_set_line_color(&theme->styles.scale, theme->color_text); + lv_style_set_line_width(&theme->styles.scale, LV_DPX(2)); + lv_style_set_arc_color(&theme->styles.scale, theme->color_text); + lv_style_set_arc_width(&theme->styles.scale, LV_DPX(2)); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in a simple `static lv_style_t my_style...` variables*/ + + if(!lv_theme_default_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + } + + my_theme_t * theme = theme_def; + + lv_display_t * new_disp = disp == NULL ? lv_display_get_default() : disp; + int32_t new_dpi = lv_display_get_dpi(new_disp); + int32_t hor_res = lv_display_get_horizontal_resolution(new_disp); + disp_size_t new_size; + + if(hor_res <= 320) new_size = DISP_SMALL; + else if(hor_res < 720) new_size = DISP_MEDIUM; + else new_size = DISP_LARGE; + + /* check theme information whether will change or not*/ + if(theme->inited && theme->disp_dpi == new_dpi && + theme->disp_size == new_size && + lv_color_eq(theme->base.color_primary, color_primary) && + lv_color_eq(theme->base.color_secondary, color_secondary) && + (theme->base.flags == dark ? MODE_DARK : 0) && + theme->base.font_small == font) { + return (lv_theme_t *) theme; + + } + + theme->disp_size = new_size; + theme->disp_dpi = new_dpi; + theme->base.disp = new_disp; + theme->base.color_primary = color_primary; + theme->base.color_secondary = color_secondary; + theme->base.font_small = font; + theme->base.font_normal = font; + theme->base.font_large = font; + theme->base.apply_cb = theme_apply; + theme->base.flags = dark ? MODE_DARK : 0; + + style_init(theme); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) lv_obj_report_style_change(NULL); + + theme->inited = true; + + return (lv_theme_t *) theme; +} + +void lv_theme_default_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + + } + lv_free(theme_def); + theme_def = NULL; + } +} + +lv_theme_t * lv_theme_default_get(void) +{ + if(!lv_theme_default_is_inited()) { + return NULL; + } + + return (lv_theme_t *)theme_def; +} + +bool lv_theme_default_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(parent && lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_index(obj) == 1) { + return; + } + /*Tabview button container*/ + else if(lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_index(obj) == 0) { + lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); + return; + } + /*Tabview pages*/ + else if(parent && lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pad_normal, 0); + lv_obj_add_style(obj, &theme->styles.rotary_scroll, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.pad_normal, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + +#if LV_USE_CALENDAR + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_calendar_class)) { + /*No style*/ + return; + } +#endif + + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent && lv_obj_get_index(parent) == 0) { /*Tabview header*/ + if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.tab_btn, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); + return; + } + } + +#endif + lv_obj_add_style(obj, &theme->styles.btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + +#if LV_USE_MENU + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(lv_obj_get_parent(obj), &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_header_btn, 0); + lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); + } +#endif + } +#endif + +#if LV_USE_LINE + else if(lv_obj_check_type(obj, &lv_line_class)) { + lv_obj_add_style(obj, &theme->styles.line, 0); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { + +#if LV_USE_CALENDAR + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_btnm_bg, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.calendar_btnm_day, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_PART_KNOB | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_KNOB | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.table_cell, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pad_normal, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.cb_marker, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.cb_marker_checked, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_INDICATOR | LV_STATE_PRESSED); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_PART_INDICATOR | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.anim_fast, 0); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.switch_knob, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_KNOB | LV_STATE_DISABLED); + + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.chart_bg, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.anim, 0); + lv_obj_add_style(obj, &theme->styles.line_space_large, 0); + lv_obj_add_style(obj, &theme->styles.text_align_center, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.clip_corner, 0); + lv_obj_add_style(obj, &theme->styles.line_space_large, 0); + lv_obj_add_style(obj, &theme->styles.dropdown_list, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_SELECTED | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.arc_indic, 0); + lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &theme->styles.arc_indic, 0); + lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.ta_placeholder, LV_PART_TEXTAREA_PLACEHOLDER); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + } + +#if LV_USE_CALENDAR_HEADER_ARROW + else if(lv_obj_check_type(obj, &lv_calendar_header_arrow_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_header, 0); + } +#endif + +#if LV_USE_CALENDAR_HEADER_DROPDOWN + else if(lv_obj_check_type(obj, &lv_calendar_header_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_header, 0); + } +#endif +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, theme->disp_size == DISP_LARGE ? &theme->styles.pad_small : &theme->styles.pad_tiny, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.keyboard_button_bg, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_grey, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.list_bg, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.list_item_grow, 0); + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); + lv_obj_add_style(obj, &theme->styles.list_btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + + } +#endif +#if LV_USE_MENU + else if(lv_obj_check_type(obj, &lv_menu_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.menu_bg, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_sidebar_cont, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_main_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_main_cont, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_cont, 0); + lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_PRESSED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(obj, &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_header_cont, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_page_class)) { + lv_obj_add_style(obj, &theme->styles.menu_page, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_section_class)) { + lv_obj_add_style(obj, &theme->styles.menu_section, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_separator_class)) { + lv_obj_add_style(obj, &theme->styles.menu_separator, 0); + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_backdrop_class)) { + lv_obj_add_style(obj, &theme->styles.msgbox_backdrop_bg, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_header_class)) { + lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_footer_class)) { + lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_header_button_class) || + lv_obj_check_type(obj, &lv_msgbox_footer_button_class)) { + lv_obj_add_style(obj, &theme->styles.btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + return; + } + + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); + return; + } + +#endif + +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#endif + +#if LV_USE_TABVIEW + else if(lv_obj_check_type(obj, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + } +#endif + +#if LV_USE_WIN + else if(lv_obj_check_type(obj, &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.clip_corner, 0); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.led, 0); + } +#endif + +#if LV_USE_SCALE + else if(lv_obj_check_type(obj, &lv_scale_class)) { + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_MAIN); + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_ITEMS); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(theme_def->inited) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/libraries/lvgl/src/themes/default/lv_theme_default.h b/libraries/lvgl/src/themes/default/lv_theme_default.h new file mode 100644 index 0000000..72d9acb --- /dev/null +++ b/libraries/lvgl/src/themes/default/lv_theme_default.h @@ -0,0 +1,71 @@ +/** + * @file lv_theme_default.h + * + */ + +#ifndef LV_THEME_DEFAULT_H +#define LV_THEME_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" + +#if LV_USE_THEME_DEFAULT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display + * @param color_primary the primary color of the theme + * @param color_secondary the secondary color for the theme + * @param dark + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font); + +/** + * Get default theme + * @return a pointer to default theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_default_get(void); + +/** + * Check if default theme is initialized + * @return true if default theme is initialized, false otherwise + */ +bool lv_theme_default_is_inited(void); + +/** + * Deinitialize the default theme + */ +void lv_theme_default_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_DEFAULT_H*/ diff --git a/libraries/lvgl/src/themes/lv_theme.c b/libraries/lvgl/src/themes/lv_theme.c new file mode 100644 index 0000000..3520475 --- /dev/null +++ b/libraries/lvgl/src/themes/lv_theme.c @@ -0,0 +1,119 @@ +/** + * @file lv_theme.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void apply_theme(lv_theme_t * th, lv_obj_t * obj); +static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj) +{ + lv_display_t * disp = obj ? lv_obj_get_display(obj) : lv_display_get_default(); + return lv_display_get_theme(disp); +} + +void lv_theme_apply(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + if(th == NULL) return; + + lv_obj_remove_style_all(obj); + + apply_theme_recursion(th, obj); /*Apply the theme including the base theme(s)*/ +} + +void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * base) +{ + new_theme->parent = base; +} + +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb) +{ + theme->apply_cb = apply_cb; +} + +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_small : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_normal : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_large : LV_FONT_DEFAULT; +} + +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_primary : lv_palette_main(LV_PALETTE_BLUE_GREY); +} + +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_secondary : lv_palette_main(LV_PALETTE_BLUE); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void apply_theme(lv_theme_t * th, lv_obj_t * obj) +{ + if(th->parent) apply_theme(th->parent, obj); + if(th->apply_cb) th->apply_cb(th, obj); +} + +static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj) +{ + const lv_obj_class_t * original_class_p = obj->class_p; + + if(obj->class_p->base_class && obj->class_p->theme_inheritable == LV_OBJ_CLASS_THEME_INHERITABLE_TRUE) { + /*Apply the base class theme in obj*/ + obj->class_p = obj->class_p->base_class; + + /*apply the base first*/ + apply_theme_recursion(th, obj); + } + + /*Restore the original class*/ + obj->class_p = original_class_p; + + apply_theme(th, obj); +} diff --git a/libraries/lvgl/src/themes/lv_theme.h b/libraries/lvgl/src/themes/lv_theme.h new file mode 100644 index 0000000..fc19f4c --- /dev/null +++ b/libraries/lvgl/src/themes/lv_theme.h @@ -0,0 +1,121 @@ +/** + *@file lv_theme.h + * + */ + +#ifndef LV_THEME_H +#define LV_THEME_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_theme_apply_cb_t)(lv_theme_t *, lv_obj_t *); + +struct _lv_theme_t { + lv_theme_apply_cb_t apply_cb; + lv_theme_t * parent; /**< Apply the current theme's style on top of this theme.*/ + void * user_data; + lv_display_t * disp; + lv_color_t color_primary; + lv_color_t color_secondary; + const lv_font_t * font_small; + const lv_font_t * font_normal; + const lv_font_t * font_large; + uint32_t flags; /*Any custom flag used by the theme*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the theme assigned to the display of the object + * @param obj pointer to a theme object + * @return the theme of the object's display (can be NULL) + */ +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj); + +/** + * Apply the active theme on an object + * @param obj pointer to an object + */ +void lv_theme_apply(lv_obj_t * obj); + +/** + * Set a base theme for a theme. + * The styles from the base them will be added before the styles of the current theme. + * Arbitrary long chain of themes can be created by setting base themes. + * @param new_theme pointer to theme which base should be set + * @param parent pointer to the base theme + */ +void lv_theme_set_parent(lv_theme_t * new_theme, lv_theme_t * parent); + +/** + * Set an apply callback for a theme. + * The apply callback is used to add styles to different objects + * @param theme pointer to theme which callback should be set + * @param apply_cb pointer to the callback + */ +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb); + +/** + * Get the small font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj); +/** + * Get the normal font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj); + +/** + * Get the subtitle font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj); + +/** + * Get the primary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj); + +/** + * Get the secondary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#include "default/lv_theme_default.h" +#include "mono/lv_theme_mono.h" +#include "simple/lv_theme_simple.h" + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_H*/ diff --git a/libraries/lvgl/src/themes/mono/lv_theme_mono.c b/libraries/lvgl/src/themes/mono/lv_theme_mono.c new file mode 100644 index 0000000..fdcf11d --- /dev/null +++ b/libraries/lvgl/src/themes/mono/lv_theme_mono.c @@ -0,0 +1,531 @@ +/** + * @file lv_theme_mono.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_THEME_MONO + +#include "lv_theme_mono.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_mono)) + +#define COLOR_FG dark_bg ? lv_color_white() : lv_color_black() +#define COLOR_BG dark_bg ? lv_color_black() : lv_color_white() + +#define BORDER_W_NORMAL 1 +#define BORDER_W_PR 3 +#define BORDER_W_DIS 0 +#define BORDER_W_FOCUS 1 +#define BORDER_W_EDIT 2 +#define PAD_DEF 4 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t card; + lv_style_t scrollbar; + lv_style_t pr; + lv_style_t inv; + lv_style_t disabled; + lv_style_t focus; + lv_style_t edit; + lv_style_t pad_gap; + lv_style_t pad_zero; + lv_style_t no_radius; + lv_style_t radius_circle; + lv_style_t large_border; + lv_style_t large_line_space; + lv_style_t underline; +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +#if LV_USE_CHART + lv_style_t chart_indic; +#endif +} my_theme_styles_t; + +struct _my_theme_t { + lv_theme_t base; + my_theme_styles_t styles; + bool inited; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(my_theme_t * theme, bool dark_bg, const lv_font_t * font) +{ + style_init_reset(&theme->styles.scrollbar); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_FG); + lv_style_set_width(&theme->styles.scrollbar, PAD_DEF); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, COLOR_BG); + lv_style_set_text_color(&theme->styles.scr, COLOR_FG); + lv_style_set_pad_row(&theme->styles.scr, PAD_DEF); + lv_style_set_pad_column(&theme->styles.scr, PAD_DEF); + lv_style_set_text_font(&theme->styles.scr, font); + + style_init_reset(&theme->styles.card); + lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.card, COLOR_BG); + lv_style_set_border_color(&theme->styles.card, COLOR_FG); + lv_style_set_radius(&theme->styles.card, 2); + lv_style_set_border_width(&theme->styles.card, BORDER_W_NORMAL); + lv_style_set_pad_all(&theme->styles.card, PAD_DEF); + lv_style_set_pad_gap(&theme->styles.card, PAD_DEF); + lv_style_set_text_color(&theme->styles.card, COLOR_FG); + lv_style_set_line_width(&theme->styles.card, 2); + lv_style_set_line_color(&theme->styles.card, COLOR_FG); + lv_style_set_arc_width(&theme->styles.card, 2); + lv_style_set_arc_color(&theme->styles.card, COLOR_FG); + lv_style_set_outline_color(&theme->styles.card, COLOR_FG); + lv_style_set_anim_duration(&theme->styles.card, 300); + + style_init_reset(&theme->styles.pr); + lv_style_set_border_width(&theme->styles.pr, BORDER_W_PR); + + style_init_reset(&theme->styles.inv); + lv_style_set_bg_opa(&theme->styles.inv, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.inv, COLOR_FG); + lv_style_set_border_color(&theme->styles.inv, COLOR_BG); + lv_style_set_line_color(&theme->styles.inv, COLOR_BG); + lv_style_set_arc_color(&theme->styles.inv, COLOR_BG); + lv_style_set_text_color(&theme->styles.inv, COLOR_BG); + lv_style_set_outline_color(&theme->styles.inv, COLOR_BG); + + style_init_reset(&theme->styles.disabled); + lv_style_set_border_width(&theme->styles.disabled, BORDER_W_DIS); + + style_init_reset(&theme->styles.focus); + lv_style_set_outline_width(&theme->styles.focus, 1); + lv_style_set_outline_pad(&theme->styles.focus, BORDER_W_FOCUS); + + style_init_reset(&theme->styles.edit); + lv_style_set_outline_width(&theme->styles.edit, BORDER_W_EDIT); + + style_init_reset(&theme->styles.large_border); + lv_style_set_border_width(&theme->styles.large_border, BORDER_W_EDIT); + + style_init_reset(&theme->styles.pad_gap); + lv_style_set_pad_gap(&theme->styles.pad_gap, PAD_DEF); + + style_init_reset(&theme->styles.pad_zero); + lv_style_set_pad_all(&theme->styles.pad_zero, 0); + lv_style_set_pad_gap(&theme->styles.pad_zero, 0); + + style_init_reset(&theme->styles.no_radius); + lv_style_set_radius(&theme->styles.no_radius, 0); + + style_init_reset(&theme->styles.radius_circle); + lv_style_set_radius(&theme->styles.radius_circle, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.large_line_space); + lv_style_set_text_line_space(&theme->styles.large_line_space, 6); + + style_init_reset(&theme->styles.underline); + lv_style_set_text_decor(&theme->styles.underline, LV_TEXT_DECOR_UNDERLINE); + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_FG); + lv_style_set_border_width(&theme->styles.ta_cursor, 2); + lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); +#endif + +#if LV_USE_CHART + style_init_reset(&theme->styles.chart_indic); + lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); + lv_style_set_size(&theme->styles.chart_indic, lv_display_dpx(theme->base.disp, 8), lv_display_dpx(theme->base.disp, 8)); + lv_style_set_bg_color(&theme->styles.chart_indic, COLOR_FG); + lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_theme_mono_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +void lv_theme_mono_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + } + lv_free(theme_def); + theme_def = NULL; + } +} + +lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_mono_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + } + + my_theme_t * theme = theme_def; + + theme->base.disp = disp; + theme->base.font_small = LV_FONT_DEFAULT; + theme->base.font_normal = LV_FONT_DEFAULT; + theme->base.font_large = LV_FONT_DEFAULT; + theme->base.apply_cb = theme_apply; + + style_init(theme, dark_bg, font); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *) theme) lv_obj_report_style_change(NULL); + + theme->inited = true; + + return (lv_theme_t *)theme_def; +} + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.no_radius, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, LV_PART_MAIN); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.radius_circle, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_CURSOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.large_line_space, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.large_line_space, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_SELECTED | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_STATE_EDITED); + + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + return; + } +#endif +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_CURSOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(lv_theme_mono_is_inited()) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/libraries/lvgl/src/themes/mono/lv_theme_mono.h b/libraries/lvgl/src/themes/mono/lv_theme_mono.h new file mode 100644 index 0000000..fafe27f --- /dev/null +++ b/libraries/lvgl/src/themes/mono/lv_theme_mono.h @@ -0,0 +1,62 @@ +/** + * @file lv_theme_mono.h + * + */ + +#ifndef LV_USE_THEME_MONO_H +#define LV_USE_THEME_MONO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" + +#if LV_USE_THEME_MONO + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display + * @param dark_bg + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_mono_is_inited(void); + +/** + * Deinitialize the mono theme + */ +void lv_theme_mono_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_THEME_MONO_H*/ diff --git a/libraries/lvgl/src/themes/simple/lv_theme_simple.c b/libraries/lvgl/src/themes/simple/lv_theme_simple.c new file mode 100644 index 0000000..6eb2b2c --- /dev/null +++ b/libraries/lvgl/src/themes/simple/lv_theme_simple.c @@ -0,0 +1,437 @@ +/** + * @file lv_theme_simple.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_SIMPLE + +#include "lv_theme_simple.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_simple)) + +#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define COLOR_WHITE lv_color_white() +#define COLOR_LIGHT lv_palette_lighten(LV_PALETTE_GREY, 2) +#define COLOR_DARK lv_palette_main(LV_PALETTE_GREY) +#define COLOR_DIM lv_palette_darken(LV_PALETTE_GREY, 2) +#define SCROLLBAR_WIDTH 2 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t transp; + lv_style_t white; + lv_style_t light; + lv_style_t dark; + lv_style_t dim; + lv_style_t scrollbar; +#if LV_USE_ARC + lv_style_t arc_line; + lv_style_t arc_knob; +#endif +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +} my_theme_styles_t; + +struct _my_theme_t { + lv_theme_t base; + my_theme_styles_t styles; + bool inited; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(my_theme_t * theme) +{ + style_init_reset(&theme->styles.scrollbar); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_DARK); + lv_style_set_width(&theme->styles.scrollbar, SCROLLBAR_WIDTH); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, COLOR_SCR); + lv_style_set_text_color(&theme->styles.scr, COLOR_DIM); + + style_init_reset(&theme->styles.transp); + lv_style_set_bg_opa(&theme->styles.transp, LV_OPA_TRANSP); + + style_init_reset(&theme->styles.white); + lv_style_set_bg_opa(&theme->styles.white, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.white, COLOR_WHITE); + lv_style_set_line_width(&theme->styles.white, 1); + lv_style_set_line_color(&theme->styles.white, COLOR_WHITE); + lv_style_set_arc_width(&theme->styles.white, 2); + lv_style_set_arc_color(&theme->styles.white, COLOR_WHITE); + + style_init_reset(&theme->styles.light); + lv_style_set_bg_opa(&theme->styles.light, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.light, COLOR_LIGHT); + lv_style_set_line_width(&theme->styles.light, 1); + lv_style_set_line_color(&theme->styles.light, COLOR_LIGHT); + lv_style_set_arc_width(&theme->styles.light, 2); + lv_style_set_arc_color(&theme->styles.light, COLOR_LIGHT); + + style_init_reset(&theme->styles.dark); + lv_style_set_bg_opa(&theme->styles.dark, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.dark, COLOR_DARK); + lv_style_set_line_width(&theme->styles.dark, 1); + lv_style_set_line_color(&theme->styles.dark, COLOR_DARK); + lv_style_set_arc_width(&theme->styles.dark, 2); + lv_style_set_arc_color(&theme->styles.dark, COLOR_DARK); + + style_init_reset(&theme->styles.dim); + lv_style_set_bg_opa(&theme->styles.dim, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.dim, COLOR_DIM); + lv_style_set_line_width(&theme->styles.dim, 1); + lv_style_set_line_color(&theme->styles.dim, COLOR_DIM); + lv_style_set_arc_width(&theme->styles.dim, 2); + lv_style_set_arc_color(&theme->styles.dim, COLOR_DIM); + +#if LV_USE_ARC + style_init_reset(&theme->styles.arc_line); + lv_style_set_arc_width(&theme->styles.arc_line, 6); + style_init_reset(&theme->styles.arc_knob); + lv_style_set_pad_all(&theme->styles.arc_knob, 5); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_DIM); + lv_style_set_border_width(&theme->styles.ta_cursor, 2); + lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_theme_simple_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +lv_theme_t * lv_theme_simple_get(void) +{ + if(!lv_theme_simple_is_inited()) { + return NULL; + } + + return (lv_theme_t *)theme_def; +} + +void lv_theme_simple_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + } + lv_free(theme_def); + theme_def = NULL; + } +} + +lv_theme_t * lv_theme_simple_init(lv_display_t * disp) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. Micropython) + *In a general case styles could be in simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_simple_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + } + + my_theme_t * theme = theme_def; + + theme->base.disp = disp; + theme->base.font_small = LV_FONT_DEFAULT; + theme->base.font_normal = LV_FONT_DEFAULT; + theme->base.font_large = LV_FONT_DEFAULT; + theme->base.apply_cb = theme_apply; + + style_init(theme); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) { + lv_obj_report_style_change(NULL); + } + + theme->inited = true; + + return (lv_theme_t *)theme_def; +} + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + + if(lv_obj_get_parent(obj) == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + lv_obj_t * parent = lv_obj_get_parent(obj); + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_get_index(obj) == 0 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + return; + } + /*Content*/ + else if(lv_obj_get_index(obj) == 1 && lv_obj_check_type(lv_obj_get_parent(obj), &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + lv_obj_add_style(obj, &theme->styles.dark, 0); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.transp, 0); + lv_obj_add_style(obj, &theme->styles.arc_line, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.arc_knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.transp, 0); + lv_obj_add_style(obj, &theme->styles.arc_line, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS | LV_STATE_CHECKED); + } +#endif +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.dark, 0); + + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + return; + } +#endif +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + } +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(lv_theme_simple_is_inited()) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/libraries/lvgl/src/themes/simple/lv_theme_simple.h b/libraries/lvgl/src/themes/simple/lv_theme_simple.h new file mode 100644 index 0000000..6717366 --- /dev/null +++ b/libraries/lvgl/src/themes/simple/lv_theme_simple.h @@ -0,0 +1,67 @@ +/** + * @file lv_theme_simple.h + * + */ + +#ifndef LV_THEME_SIMPLE_H +#define LV_THEME_SIMPLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" +#include "../../display/lv_display.h" + +#if LV_USE_THEME_SIMPLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display to attach the theme + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_simple_init(lv_display_t * disp); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_simple_is_inited(void); + +/** + * Get simple theme + * @return a pointer to simple theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_simple_get(void); + +/** + * Deinitialize the simple theme + */ +void lv_theme_simple_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_SIMPLE_H*/ diff --git a/libraries/lvgl/src/tick/lv_tick.c b/libraries/lvgl/src/tick/lv_tick.c new file mode 100644 index 0000000..2e4626b --- /dev/null +++ b/libraries/lvgl/src/tick/lv_tick.c @@ -0,0 +1,113 @@ +/** + * @file lv_tick.c + * Provide access to the system tick with 1 millisecond resolution + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tick.h" +#include +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define state LV_GLOBAL_DEFAULT()->tick_state + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period) +{ + lv_tick_state_t * state_p = &state; + + state_p->sys_irq_flag = 0; + state_p->sys_time += tick_period; +} + +uint32_t lv_tick_get(void) +{ + lv_tick_state_t * state_p = &state; + + if(state_p->tick_get_cb) + return state_p->tick_get_cb(); + + /*If `lv_tick_inc` is called from an interrupt while `sys_time` is read + *the result might be corrupted. + *This loop detects if `lv_tick_inc` was called while reading `sys_time`. + *If `tick_irq_flag` was cleared in `lv_tick_inc` try to read again + *until `tick_irq_flag` remains `1`.*/ + uint32_t result; + do { + state_p->sys_irq_flag = 1; + result = state_p->sys_time; + } while(!state_p->sys_irq_flag); /*Continue until see a non interrupted cycle*/ + + return result; +} + +uint32_t lv_tick_elaps(uint32_t prev_tick) +{ + uint32_t act_time = lv_tick_get(); + + /*If there is no overflow in sys_time simple subtract*/ + if(act_time >= prev_tick) { + prev_tick = act_time - prev_tick; + } + else { + prev_tick = UINT32_MAX - prev_tick + 1; + prev_tick += act_time; + } + + return prev_tick; +} + +void lv_delay_ms(uint32_t ms) +{ + if(state.delay_cb) { + state.delay_cb(ms); + } + else { + uint32_t t = lv_tick_get(); + while(lv_tick_elaps(t) < ms) { + /*Do something to no call `lv_tick_elaps` too often as it might interfere with interrupts*/ + volatile uint32_t i; + volatile uint32_t x = ms; + for(i = 0; i < 100; i++) { + x = x * 3; + } + } + } +} + +void lv_tick_set_cb(lv_tick_get_cb_t cb) +{ + state.tick_get_cb = cb; +} + +void lv_delay_set_cb(lv_delay_cb_t cb) +{ + state.delay_cb = cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/libraries/lvgl/src/tick/lv_tick.h b/libraries/lvgl/src/tick/lv_tick.h new file mode 100644 index 0000000..da86203 --- /dev/null +++ b/libraries/lvgl/src/tick/lv_tick.h @@ -0,0 +1,93 @@ +/** + * @file lv_hal_tick.h + * Provide access to the system tick with 1 millisecond resolution + */ + +#ifndef LV_HAL_TICK_H +#define LV_HAL_TICK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include +#include + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TICK_INC +#define LV_ATTRIBUTE_TICK_INC +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef uint32_t (*lv_tick_get_cb_t)(void); + +typedef void (*lv_delay_cb_t)(uint32_t ms); + +typedef struct { + uint32_t sys_time; + volatile uint8_t sys_irq_flag; + lv_tick_get_cb_t tick_get_cb; + lv_delay_cb_t delay_cb; +} lv_tick_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * You have to call this function periodically + * @param tick_period the call period of this function in milliseconds + */ +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period); + +/** + * Get the elapsed milliseconds since start up + * @return the elapsed milliseconds + */ +uint32_t lv_tick_get(void); + +/** + * Get the elapsed milliseconds since a previous time stamp + * @param prev_tick a previous time stamp (return value of lv_tick_get() ) + * @return the elapsed milliseconds since 'prev_tick' + */ +uint32_t lv_tick_elaps(uint32_t prev_tick); + +/** + * Delay for the given milliseconds. + * By default it's a blocking delay, but with `lv_delay_set_cb()` + * a custom delay function can be set too + * @param ms the number of milliseconds to delay + */ +void lv_delay_ms(uint32_t ms); + +/** + * Set the custom callback for 'lv_tick_get' + * @param cb call this callback on 'lv_tick_get' + */ +void lv_tick_set_cb(lv_tick_get_cb_t cb); + +/** + * Set a custom callback for 'lv_dalay_ms' + * @param cb call this callback in 'lv_dalay_ms' + */ +void lv_delay_set_cb(lv_delay_cb_t cb); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_HAL_TICK_H*/ diff --git a/libraries/lvgl/src/widgets/animimage/lv_animimage.c b/libraries/lvgl/src/widgets/animimage/lv_animimage.c new file mode 100644 index 0000000..d26a848 --- /dev/null +++ b/libraries/lvgl/src/widgets/animimage/lv_animimage.c @@ -0,0 +1,169 @@ +/** + * @file lv_animimg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_animimage.h" +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMAGE == 0 + #error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1) " +#endif + +#include "../../draw/lv_image_decoder.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_fs.h" +#include "../../misc/lv_text.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_anim.h" + +/********************* + * DEFINES + *********************/ +#define LV_OBJX_NAME "lv_animimg" + +#define MY_CLASS (&lv_animimg_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void index_change(lv_obj_t * obj, int32_t index); +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_animimg_class = { + .constructor_cb = lv_animimg_constructor, + .instance_size = sizeof(lv_animimg_t), + .base_class = &lv_image_class, + .name = "animimg", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_animimg_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + animimg->dsc = dsc; + animimg->pic_count = num; + lv_anim_set_values(&animimg->anim, 0, (int32_t)num - 1); +} + +void lv_animimg_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_start(&animimg->anim); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_duration(&animimg->anim, duration); + lv_anim_set_playback_delay(&animimg->anim, duration); +} + +void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_repeat_count(&animimg->anim, count); +} + +/*===================== + * Getter functions + *====================*/ + +const void ** lv_animimg_get_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return animimg->dsc; +} + +uint8_t lv_animimg_get_src_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return animimg->pic_count; +} + +uint32_t lv_animimg_get_duration(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return lv_anim_get_time(&animimg->anim); +} + +uint32_t lv_animimg_get_repeat_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return lv_anim_get_repeat_count(&animimg->anim); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + animimg->dsc = NULL; + animimg->pic_count = -1; + + /*initial animation*/ + lv_anim_init(&animimg->anim); + lv_anim_set_var(&animimg->anim, obj); + lv_anim_set_duration(&animimg->anim, 30); + lv_anim_set_exec_cb(&animimg->anim, (lv_anim_exec_xcb_t)index_change); + lv_anim_set_values(&animimg->anim, 0, 1); + lv_anim_set_repeat_count(&animimg->anim, LV_ANIM_REPEAT_INFINITE); +} + +static void index_change(lv_obj_t * obj, int32_t index) +{ + int32_t idx; + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + idx = index % animimg->pic_count; + + lv_image_set_src(obj, animimg->dsc[idx]); +} + +#endif diff --git a/libraries/lvgl/src/widgets/animimage/lv_animimage.h b/libraries/lvgl/src/widgets/animimage/lv_animimage.h new file mode 100644 index 0000000..87df815 --- /dev/null +++ b/libraries/lvgl/src/widgets/animimage/lv_animimage.h @@ -0,0 +1,136 @@ +/** + * @file lv_animimg.h + * + */ + +#ifndef LV_ANIM_IMAGE_H +#define LV_ANIM_IMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../image/lv_image.h" + +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMAGE == 0 +#error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_animimg_class; + +/*Data of the animimage*/ +typedef struct { + lv_image_t img; + lv_anim_t anim; + /*picture sequence */ + const void ** dsc; + int8_t pic_count; +} lv_animimg_t; + +/*Image parts*/ +enum _lv_animimg_part_t { + LV_ANIM_IMAGE_PART_MAIN, +}; + +#ifdef DOXYGEN +typedef _lv_animimg_part_t lv_animimg_part_t; +#else +typedef uint8_t lv_animimg_part_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an animation image objects + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created animation image object + */ +lv_obj_t * lv_animimg_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image animation images source. + * @param img pointer to an animation image object + * @param dsc pointer to a series images + * @param num images' number + */ +void lv_animimg_set_src(lv_obj_t * img, const void * dsc[], size_t num); + +/** + * Startup the image animation. + * @param obj pointer to an animation image object + */ +void lv_animimg_start(lv_obj_t * obj); + +/** + * Set the image animation duration time. unit:ms + * @param img pointer to an animation image object + * @param duration the duration in milliseconds + */ +void lv_animimg_set_duration(lv_obj_t * img, uint32_t duration); + +/** + * Set the image animation repeatedly play times. + * @param img pointer to an animation image object + * @param count the number of times to repeat the animation + */ +void lv_animimg_set_repeat_count(lv_obj_t * img, uint32_t count); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the image animation images source. + * @param img pointer to an animation image object + * @return a pointer that will point to a series images + */ +const void ** lv_animimg_get_src(lv_obj_t * img); + +/** + * Get the image animation images source. + * @param img pointer to an animation image object + * @return the number of source images + */ +uint8_t lv_animimg_get_src_count(lv_obj_t * img); + +/** + * Get the image animation duration time. unit:ms + * @param img pointer to an animation image object + * @return the animation duration time + */ +uint32_t lv_animimg_get_duration(lv_obj_t * img); + +/** + * Get the image animation repeat play times. + * @param img pointer to an animation image object + * @return the repeat count + */ +uint32_t lv_animimg_get_repeat_count(lv_obj_t * img); + +#endif /*LV_USE_ANIMIMG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_ANIM_IMAGE_H*/ diff --git a/libraries/lvgl/src/widgets/arc/lv_arc.c b/libraries/lvgl/src/widgets/arc/lv_arc.c new file mode 100644 index 0000000..6d43839 --- /dev/null +++ b/libraries/lvgl/src/widgets/arc/lv_arc.c @@ -0,0 +1,1027 @@ +/** + * @file lv_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_arc.h" +#if LV_USE_ARC != 0 + +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw_arc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_arc_class) + +#define VALUE_UNSET INT16_MIN +#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U) +#define CLICK_INSIDE_BG_ANGLES ((uint32_t) 0x01U) +#define CLICK_CLOSER_TO_MAX_END ((uint32_t) 0x00U) +#define CLICK_CLOSER_TO_MIN_END ((uint32_t) 0x01U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_arc_draw(lv_event_t * e); +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void inv_arc_area(lv_obj_t * arc, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part); +static void inv_knob_area(lv_obj_t * obj); +static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); +static lv_value_precise_t get_angle(const lv_obj_t * obj); +static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, int32_t r, lv_area_t * knob_area); +static void value_update(lv_obj_t * arc); +static int32_t knob_get_extra_size(lv_obj_t * obj); +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, + const lv_value_precise_t tolerance_deg); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_arc_class = { + .constructor_cb = lv_arc_constructor, + .event_cb = lv_arc_event, + .instance_size = sizeof(lv_arc_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_obj_class, + .name = "arc", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_arc_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + lv_value_precise_t new_delta = arc->indic_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->indic_angle_start, start, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->indic_angle_start, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_start = start; + + inv_knob_area(obj); +} + +void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + if(end > 360) end -= 360; + + lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + lv_value_precise_t new_delta = end - arc->indic_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->indic_angle_end, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, arc->indic_angle_end, end, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_end = end; + + inv_knob_area(obj); +} + +void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) +{ + lv_arc_set_end_angle(obj, end); + lv_arc_set_start_angle(obj, start); +} + +void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + lv_value_precise_t new_delta = arc->bg_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->bg_angle_start, start, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->bg_angle_start, LV_PART_MAIN); + + arc->bg_angle_start = start; + + value_update(obj); +} + +void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(end > 360) end -= 360; + + lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + lv_value_precise_t new_delta = end - arc->bg_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->bg_angle_end, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, arc->bg_angle_end, end, LV_PART_MAIN); + + arc->bg_angle_end = end; + + value_update(obj); +} + +void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) +{ + lv_arc_set_bg_end_angle(obj, end); + lv_arc_set_bg_start_angle(obj, start); +} + +void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->rotation = rotation; + + lv_obj_invalidate(obj); +} + +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + int32_t val = arc->value; + + arc->type = type; + arc->value = -1; /** Force set_value handling*/ + + lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, bg_midpoint); + break; + case LV_ARC_MODE_REVERSE: + lv_arc_set_end_angle(obj, arc->bg_angle_end); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + lv_arc_set_start_angle(obj, arc->bg_angle_start); + } + + lv_arc_set_value(obj, val); +} + +void lv_arc_set_value(lv_obj_t * obj, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->value == value) return; + + int32_t new_value; + new_value = value > arc->max_value ? arc->max_value : value; + new_value = new_value < arc->min_value ? arc->min_value : new_value; + + if(arc->value == new_value) return; + arc->value = new_value; + + value_update(obj); +} + +void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->min_value == min && arc->max_value == max) return; + + arc->min_value = min; + arc->max_value = max; + + if(arc->value < min) { + arc->value = min; + } + if(arc->value > max) { + arc->value = max; + } + + value_update(obj); /*value has changed relative to the new range*/ +} + +void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->chg_rate = rate; +} + +void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->knob_offset = offset; +} + +/*===================== + * Getter functions + *====================*/ + +lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_start; +} + +lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_end; +} + +lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_start; +} + +lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_end; +} + +int32_t lv_arc_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->value; +} + +int32_t lv_arc_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->min_value; +} + +int32_t lv_arc_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->max_value; +} + +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->type; +} + +int32_t lv_arc_get_rotation(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *)obj)->rotation; +} + +int32_t lv_arc_get_knob_offset(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *)obj)->knob_offset; +} + +/*===================== + * Other functions + *====================*/ + +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_align); + + lv_obj_update_layout(obj); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + arc_r += r_offset; + + int32_t angle = (int32_t)get_angle(obj); + int32_t knob_x = (arc_r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; + int32_t knob_y = (arc_r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; + lv_obj_align_to(obj_to_align, obj, LV_ALIGN_CENTER, knob_x, knob_y); +} + +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_rotate); + + lv_obj_update_layout(obj); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + + arc_r += r_offset; + lv_obj_align_to(obj_to_rotate, obj, LV_ALIGN_CENTER, 0, -arc_r); + + lv_obj_update_layout(obj); + + int32_t angle = (int32_t)get_angle(obj); + int32_t pivot_x = obj_to_rotate->coords.x1 - center.x; + int32_t pivot_y = obj_to_rotate->coords.y1 - center.y; + lv_obj_set_style_transform_pivot_x(obj_to_rotate, -pivot_x, 0); + lv_obj_set_style_transform_pivot_y(obj_to_rotate, -pivot_y, 0); + lv_obj_set_style_transform_rotation(obj_to_rotate, angle * 10 + 900, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_arc_t * arc = (lv_arc_t *)obj; + + /*Initialize the allocated 'ext'*/ + arc->rotation = 0; + arc->bg_angle_start = 135; + arc->bg_angle_end = 45; + arc->indic_angle_start = 135; + arc->indic_angle_end = 270; + arc->type = LV_ARC_MODE_NORMAL; + arc->value = VALUE_UNSET; + arc->min_close = 1; + arc->min_value = 0; + arc->max_value = 100; + arc->dragging = false; + arc->chg_rate = 720; + arc->last_tick = lv_tick_get(); + arc->last_angle = arc->indic_angle_end; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_arc_t * arc = (lv_arc_t *)obj; + if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_active(); + if(indev == NULL) return; + + /*Handle only pointers here*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type != LV_INDEV_TYPE_POINTER) return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + + /*Make point relative to the arc's center*/ + lv_point_t center; + int32_t r; + get_center(obj, ¢er, &r); + + p.x -= center.x; + p.y -= center.y; + + /*Enter dragging mode if pressed out of the knob*/ + if(arc->dragging == false) { + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + r -= indic_width; + /*Add some more sensitive area if there is no advanced hit testing. + * (Advanced hit testing is more precise)*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + r -= indic_width; + } + else { + r -= LV_MAX(r / 4, indic_width); + } + if(r < 1) r = 1; + + if(p.x * p.x + p.y * p.y > r * r) { + arc->dragging = true; + arc->last_tick = lv_tick_get(); /*Capture timestamp at dragging start*/ + } + } + + /*It must be in "dragging" mode to turn the arc*/ + if(arc->dragging == false) return; + + /*No angle can be determined if exactly the middle of the arc is being pressed*/ + if(p.x == 0 && p.y == 0) return; + + /*Calculate the angle of the pressed point*/ + lv_value_precise_t angle; + lv_value_precise_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) { + bg_end = arc->bg_angle_end + 360; + } + + angle = lv_atan2(p.y, p.x); + angle -= arc->rotation; + angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + + /* If we click near the bg_angle_start the angle will be close to 360° instead of a small angle */ + if(angle < 0) angle += 360; + + const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ + const lv_value_precise_t tolerance_deg = (360 * lv_dpx(50U)) / circumference; + const uint32_t min_close_prev = (uint32_t) arc->min_close; + + const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, angle, tolerance_deg); + if(!is_angle_within_bg_bounds) { + return; + } + + lv_value_precise_t deg_range = bg_end - arc->bg_angle_start; + lv_value_precise_t last_angle_rel = arc->last_angle - arc->bg_angle_start; + lv_value_precise_t delta_angle = angle - last_angle_rel; + + /*Do not allow big jumps (jumps bigger than 280°). + *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. + *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ + if(LV_ABS(delta_angle) > 280) { + if(arc->min_close) angle = 0; + else angle = deg_range; + } + /* Check if click was outside the background arc start and end angles */ + else if(CLICK_OUTSIDE_BG_ANGLES == arc->in_out) { + if(arc->min_close) angle = -deg_range; + else angle = deg_range; + } + else { /* Keep the angle value */ } + + /* Prevent big jumps when the click goes from start to end angle in the invisible + * part of the background arc without being released */ + if(((min_close_prev == CLICK_CLOSER_TO_MIN_END) && (arc->min_close == CLICK_CLOSER_TO_MAX_END)) + && ((CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (LV_ABS(delta_angle) > 280))) { + angle = 0; + } + else if(((min_close_prev == CLICK_CLOSER_TO_MAX_END) && (arc->min_close == CLICK_CLOSER_TO_MIN_END)) + && (CLICK_OUTSIDE_BG_ANGLES == arc->in_out)) { + angle = deg_range; + } + else { /* Keep the angle value */ } + + /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ + delta_angle = angle - last_angle_rel; + + uint32_t delta_tick = lv_tick_elaps(arc->last_tick); + /* delta_angle_max can never be signed. delta_tick is always signed, same for ch_rate */ + const lv_value_precise_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; + + if(delta_angle > delta_angle_max) { + delta_angle = delta_angle_max; + } + else if(delta_angle < -delta_angle_max) { + delta_angle = -delta_angle_max; + } + else { /* Nothing to do */ } + + angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ + + /*Rounding for symmetry*/ + lv_value_precise_t round = ((bg_end - arc->bg_angle_start) * 8) / (arc->max_value - arc->min_value); + round = (round + 4) / 16; + angle += round; + + angle += arc->bg_angle_start; /*Make the angle absolute again*/ + + /*Set the new value*/ + int32_t old_value = arc->value; + int32_t new_value = lv_map((int32_t)angle, (int32_t)arc->bg_angle_start, (int32_t)bg_end, arc->min_value, + arc->max_value); + if(arc->type == LV_ARC_MODE_REVERSE) { + new_value = arc->max_value - new_value + arc->min_value; + } + + if(new_value != lv_arc_get_value(obj)) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + lv_arc_set_value(obj, new_value); /*set_value caches the last_angle for the next iteration*/ + if(new_value != old_value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + + /*Don't let the elapsed time become too big while sitting on an end point*/ + if(new_value == arc->min_value || new_value == arc->max_value) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + arc->dragging = false; + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) lv_group_set_editing(g, false); + } + + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + + int32_t old_value = arc->value; + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_arc_set_value(obj, lv_arc_get_value(obj) + 1); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_arc_set_value(obj, lv_arc_get_value(obj) - 1); + } + + if(old_value != arc->value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_ROTARY) { + int32_t r = lv_event_get_rotary_diff(e); + + int32_t old_value = arc->value; + lv_arc_set_value(obj, lv_arc_get_value(obj) + r); + if(old_value != arc->value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + + lv_point_t p; + int32_t r; + get_center(obj, &p, &r); + + int32_t ext_click_area = 0; + if(obj->spec_attr) ext_click_area = obj->spec_attr->ext_click_pad; + + int32_t w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + r -= w + ext_click_area; + + lv_area_t a; + /*Invalid if clicked inside*/ + lv_area_set(&a, p.x - r, p.y - r, p.x + r, p.y + r); + if(_lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { + info->res = false; + return; + } + + /*Valid if no clicked outside*/ + lv_area_increase(&a, w + ext_click_area * 2, w + ext_click_area * 2); + info->res = _lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t bg_pad = LV_MAX4(bg_left, bg_right, bg_top, bg_bottom); + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + int32_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; + + int32_t knob_extra_size = knob_pad - bg_pad; + knob_extra_size += knob_get_extra_size(obj); + + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_extra_size); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_arc_draw(e); + } +} + +static void lv_arc_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_arc_t * arc = (lv_arc_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + + /*Draw the background arc*/ + lv_draw_arc_dsc_t arc_dsc; + if(arc_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); + arc_dsc.center = center; + arc_dsc.start_angle = arc->bg_angle_start + arc->rotation; + arc_dsc.end_angle = arc->bg_angle_end + arc->rotation; + arc_dsc.radius = arc_r; + lv_draw_arc(layer, &arc_dsc); + } + + /*Make the indicator arc smaller or larger according to its greatest padding value*/ + int32_t left_indic = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t right_indic = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t top_indic = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t bottom_indic = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + int32_t indic_r = arc_r - LV_MAX4(left_indic, right_indic, top_indic, bottom_indic); + + if(indic_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_INDICATOR, &arc_dsc); + arc_dsc.center = center; + arc_dsc.start_angle = arc->indic_angle_start + arc->rotation; + arc_dsc.end_angle = arc->indic_angle_end + arc->rotation; + + arc_dsc.radius = indic_r; + + lv_draw_arc(layer, &arc_dsc); + } + + lv_area_t knob_area; + get_knob_area(obj, ¢er, arc_r, &knob_area); + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + lv_draw_rect(layer, &knob_rect_dsc, &knob_area); +} + +static void inv_arc_area(lv_obj_t * obj, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Skip this complicated invalidation if the arc is not visible*/ + if(lv_obj_is_visible(obj) == false) return; + + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start_angle == end_angle) return; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + start_angle += arc->rotation; + end_angle += arc->rotation; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + int32_t r; + lv_point_t c; + get_center(obj, &c, &r); + + int32_t w = lv_obj_get_style_arc_width(obj, part); + int32_t rounded = lv_obj_get_style_arc_rounded(obj, part); + + lv_area_t inv_area; + lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); + + lv_obj_invalidate_area(obj, &inv_area); +} + +static void inv_knob_area(lv_obj_t * obj) +{ + lv_point_t c; + int32_t r; + get_center(obj, &c, &r); + + lv_area_t a; + get_knob_area(obj, &c, r, &a); + + int32_t knob_extra_size = knob_get_extra_size(obj); + + if(knob_extra_size > 0) { + lv_area_increase(&a, knob_extra_size, knob_extra_size); + } + + lv_obj_invalidate_area(obj, &a); +} + +static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) +{ + int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, + lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2; + + center->x = obj->coords.x1 + r + left_bg; + center->y = obj->coords.y1 + r + top_bg; + + if(arc_r) *arc_r = r; +} + +static lv_value_precise_t get_angle(const lv_obj_t * obj) +{ + lv_arc_t * arc = (lv_arc_t *)obj; + lv_value_precise_t angle = arc->rotation; + if(arc->type == LV_ARC_MODE_NORMAL) { + angle += arc->indic_angle_end; + } + else if(arc->type == LV_ARC_MODE_REVERSE) { + angle += arc->indic_angle_start; + } + else if(arc->type == LV_ARC_MODE_SYMMETRICAL) { + lv_value_precise_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + lv_value_precise_t indic_end = arc->indic_angle_end; + if(arc->indic_angle_end < arc->indic_angle_start) indic_end = arc->indic_angle_end + 360; + + lv_value_precise_t angle_midpoint = (int32_t)(arc->bg_angle_start + bg_end) / 2; + if(arc->indic_angle_start < angle_midpoint) angle += arc->indic_angle_start; + else if(indic_end > angle_midpoint) angle += arc->indic_angle_end; + else angle += angle_midpoint; + } + + return angle; +} + +static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, int32_t r, lv_area_t * knob_area) +{ + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + r -= indic_width_half; + + int32_t angle = (int32_t)get_angle(obj); + int32_t knob_offset = lv_arc_get_knob_offset(obj); + int32_t knob_x = (r * lv_trigo_sin(knob_offset + angle + 90)) >> LV_TRIGO_SHIFT; + int32_t knob_y = (r * lv_trigo_sin(knob_offset + angle)) >> LV_TRIGO_SHIFT; + + int32_t left_knob = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t right_knob = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t top_knob = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t bottom_knob = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + knob_area->x1 = center->x + knob_x - left_knob - indic_width_half; + knob_area->x2 = center->x + knob_x + right_knob + indic_width_half; + knob_area->y1 = center->y + knob_y - top_knob - indic_width_half; + knob_area->y2 = center->y + knob_y + bottom_knob + indic_width_half; +} + +/** + * Used internally to update arc angles after a value change + * @param arc pointer to an arc object + */ +static void value_update(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + /*If the value is still not set to any value do not update*/ + if(arc->value == VALUE_UNSET) return; + + lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; + int32_t range_midpoint; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + int32_t angle; + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + range_midpoint = (int32_t)(arc->min_value + arc->max_value) / 2; + + if(arc->value < range_midpoint) { + angle = lv_map(arc->value, arc->min_value, range_midpoint, (int32_t)arc->bg_angle_start, (int32_t)bg_midpoint); + lv_arc_set_start_angle(obj, angle); + lv_arc_set_end_angle(obj, bg_midpoint); + } + else { + angle = lv_map(arc->value, range_midpoint, arc->max_value, (int32_t)bg_midpoint, (int32_t)bg_end); + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, angle); + } + break; + case LV_ARC_MODE_REVERSE: + angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)bg_end, (int32_t)arc->bg_angle_start); + lv_arc_set_angles(obj, angle, arc->bg_angle_end); + break; + case LV_ARC_MODE_NORMAL: + angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)arc->bg_angle_start, (int32_t)bg_end); + lv_arc_set_angles(obj, arc->bg_angle_start, angle); + + break; + default: + LV_LOG_WARN("Invalid mode: %d", arc->type); + return; + } + arc->last_angle = angle; /*Cache angle for slew rate limiting*/ +} + +static int32_t knob_get_extra_size(lv_obj_t * obj) +{ + int32_t knob_shadow_size = 0; + knob_shadow_size += lv_obj_get_style_shadow_width(obj, LV_PART_KNOB); + knob_shadow_size += lv_obj_get_style_shadow_spread(obj, LV_PART_KNOB); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_x(obj, LV_PART_KNOB)); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_y(obj, LV_PART_KNOB)); + + int32_t knob_outline_size = 0; + knob_outline_size += lv_obj_get_style_outline_width(obj, LV_PART_KNOB); + knob_outline_size += lv_obj_get_style_outline_pad(obj, LV_PART_KNOB); + + return LV_MAX(knob_shadow_size, knob_outline_size); +} + +/** + * Check if angle is within arc background bounds + * + * In order to avoid unexpected value update of the arc value when the user clicks + * outside of the arc background we need to check if the angle (of the clicked point) + * is within the bounds of the background. + * + * A tolerance (extra room) also should be taken into consideration. + * + * E.g. Arc with start angle of 0° and end angle of 90°, the background is only visible in + * that range, from 90° to 360° the background is invisible. Click in 150° should not update + * the arc value, click within the arc angle range should. + * + * IMPORTANT NOTE: angle is always relative to bg_angle_start, e.g. if bg_angle_start is 30 + * and we click a bit to the left, angle is 10, not the expected 40. + * + * @param obj Pointer to lv_arc + * @param angle Angle to be checked + * @param tolerance_deg Tolerance + * + * @return true if angle is within arc background bounds, false otherwise + */ +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, + const lv_value_precise_t tolerance_deg) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + lv_value_precise_t smaller_angle = 0; + lv_value_precise_t bigger_angle = 0; + + /* Determine which background angle is smaller and bigger */ + if(arc->bg_angle_start < arc->bg_angle_end) { + bigger_angle = arc->bg_angle_end; + smaller_angle = arc->bg_angle_start; + } + else { + bigger_angle = (360 - arc->bg_angle_start) + arc->bg_angle_end; + smaller_angle = 0; + } + + /* Angle is between both background angles */ + if((smaller_angle <= angle) && (angle <= bigger_angle)) { + + if(((bigger_angle - smaller_angle) / 2) >= angle) { + arc->min_close = 1; + } + else { + arc->min_close = 0; + } + + arc->in_out = CLICK_INSIDE_BG_ANGLES; + + return true; + } + /* Distance between background start and end angles is less than tolerance, + * consider the click inside the arc */ + else if(((smaller_angle - tolerance_deg) <= 0) && + (360 - (bigger_angle + (smaller_angle - tolerance_deg))) != 0) { + + arc->min_close = 1; + arc->in_out = CLICK_INSIDE_BG_ANGLES; + return true; + } + else { /* Case handled below */ } + + /* Legends: + * 0° = angle 0 + * 360° = angle 360 + * T: Tolerance + * A: Angle + * S: Arc background start angle + * E: Arc background end angle + * + * Start angle is bigger or equal to tolerance */ + if((smaller_angle >= tolerance_deg) + /* (360° - T) --- A --- 360° */ + && ((angle >= (360 - tolerance_deg)) && (angle <= 360))) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Tolerance is bigger than bg start angle */ + else if((smaller_angle < tolerance_deg) + /* (360° - (T - S)) --- A --- 360° */ + && (((360 - (tolerance_deg - smaller_angle)) <= angle)) && (angle <= 360)) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* 360° is bigger than background end angle + tolerance */ + else if((360 >= (bigger_angle + tolerance_deg)) + /* E --- A --- (E + T) */ + && ((bigger_angle <= (angle + smaller_angle)) && + ((angle + smaller_angle) <= (bigger_angle + tolerance_deg)))) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Background end angle + tolerance is bigger than 360° and bg_start_angle + tolerance is not near 0° + ((bg_end_angle + tolerance) - 360°) + * Here we can assume background is not near 0° because of the first two initial checks */ + else if((360 < (bigger_angle + tolerance_deg)) + && (angle <= 0 + ((bigger_angle + tolerance_deg) - 360)) && (angle > bigger_angle)) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + else { + /* Nothing to do */ + } + + return false; +} + +#endif diff --git a/libraries/lvgl/src/widgets/arc/lv_arc.h b/libraries/lvgl/src/widgets/arc/lv_arc.h new file mode 100644 index 0000000..bea60c6 --- /dev/null +++ b/libraries/lvgl/src/widgets/arc/lv_arc.h @@ -0,0 +1,273 @@ +/** + * @file lv_arc.h + * + */ + +#ifndef LV_ARC_H +#define LV_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_ARC != 0 + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_arc_mode_t { + LV_ARC_MODE_NORMAL, + LV_ARC_MODE_SYMMETRICAL, + LV_ARC_MODE_REVERSE +}; + +#ifdef DOXYGEN +typedef _lv_arc_mode_t lv_arc_mode_t; +#else +typedef uint8_t lv_arc_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + lv_obj_t obj; + int32_t rotation; + lv_value_precise_t indic_angle_start; + lv_value_precise_t indic_angle_end; + lv_value_precise_t bg_angle_start; + lv_value_precise_t bg_angle_end; + int32_t value; /*Current value of the arc*/ + int32_t min_value; /*Minimum value of the arc*/ + int32_t max_value; /*Maximum value of the arc*/ + uint32_t dragging : 1; + uint32_t type : 2; + uint32_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ + uint32_t in_out : 1; /* 1: The click was within the background arc angles. 0: Click outside */ + uint32_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t last_tick; /*Last dragging event timestamp of the arc*/ + lv_value_precise_t last_angle; /*Last dragging angle of the arc*/ + int16_t knob_offset; /*knob offset from the main arc*/ +} lv_arc_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_arc_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an arc object + * @param parent pointer to an object, it will be the parent of the new arc + * @return pointer to the created arc + */ +lv_obj_t * lv_arc_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle. (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start); + +/** + * Set the end angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end); + +/** + * Set the start and end angles + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom etc. + * @param obj pointer to an arc object + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end); + +/** + * Set the start and end angles of the arc background + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); + +/** + * Set the rotation for the whole arc + * @param obj pointer to an arc object + * @param rotation rotation angle + */ +void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation); + +/** + * Set the type of arc. + * @param obj pointer to arc object + * @param type arc's mode + */ +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type); + +/** + * Set a new value on the arc + * @param obj pointer to an arc object + * @param value new value + */ +void lv_arc_set_value(lv_obj_t * obj, int32_t value); + +/** + * Set minimum and the maximum values of an arc + * @param obj pointer to the arc object + * @param min minimum value + * @param max maximum value + */ +void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set a change rate to limit the speed how fast the arc should reach the pressed point. + * @param obj pointer to an arc object + * @param rate the change rate + */ +void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate); + +/** + * Set an offset angle for the knob + * @param obj pointer to an arc object + * @param offset knob offset from main arc in degrees + */ +void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the start angle of an arc. + * @param obj pointer to an arc object + * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc. + * @param obj pointer to an arc object + * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj); + +/** + * Get the start angle of an arc background. + * @param obj pointer to an arc object + * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc background. + * @param obj pointer to an arc object + * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj); + +/** + * Get the value of an arc + * @param obj pointer to an arc object + * @return the value of the arc + */ +int32_t lv_arc_get_value(const lv_obj_t * obj); + +/** + * Get the minimum value of an arc + * @param obj pointer to an arc object + * @return the minimum value of the arc + */ +int32_t lv_arc_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of an arc + * @param obj pointer to an arc object + * @return the maximum value of the arc + */ +int32_t lv_arc_get_max_value(const lv_obj_t * obj); + +/** + * Get whether the arc is type or not. + * @param obj pointer to an arc object + * @return arc's mode + */ +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj); + +/** + * Get the rotation for the whole arc + * @param obj pointer to an arc object + * @return arc's current rotation + */ +int32_t lv_arc_get_rotation(const lv_obj_t * obj); + +/** + * Get the current knob angle offset + * @param obj pointer to an arc object + * @return arc's current knob offset + */ +int32_t lv_arc_get_knob_offset(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Align an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_align pointer to an object to align + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset); + +/** + * Rotate an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_rotate pointer to an object to rotate + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ARC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARC_H*/ diff --git a/libraries/lvgl/src/widgets/bar/lv_bar.c b/libraries/lvgl/src/widgets/bar/lv_bar.c new file mode 100644 index 0000000..91fa3a6 --- /dev/null +++ b/libraries/lvgl/src/widgets/bar/lv_bar.c @@ -0,0 +1,664 @@ +/** + * @file lv_bar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bar.h" +#if LV_USE_BAR != 0 + +#include "../../draw/lv_draw.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_anim.h" +#include "../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_bar_class) + +/** hor. pad and ver. pad cannot make the indicator smaller than this [px]*/ +#define LV_BAR_SIZE_MIN 4 + +#define LV_BAR_IS_ANIMATING(anim_struct) (((anim_struct).anim_state) != LV_BAR_ANIM_STATE_INV) +#define LV_BAR_GET_ANIM_VALUE(orig_value, anim_struct) (LV_BAR_IS_ANIMATING(anim_struct) ? ((anim_struct).anim_end) : (orig_value)) + +/** Bar animation start value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_START 0 + +/** Bar animation end value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_BAR_ANIM_STATE_INV -1 + +/** log2(LV_BAR_ANIM_STATE_END) used to normalize data*/ +#define LV_BAR_ANIM_STATE_NORM 8 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_indic(lv_event_t * e); +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + _lv_bar_anim_t * anim_info, lv_anim_enable_t en); +static void lv_bar_init_anim(lv_obj_t * bar, _lv_bar_anim_t * bar_anim); +static void lv_bar_anim(void * bar, int32_t value); +static void lv_bar_anim_completed(lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_bar_class = { + .constructor_cb = lv_bar_constructor, + .destructor_cb = lv_bar_destructor, + .event_cb = lv_bar_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF / 10, + .instance_size = sizeof(lv_bar_t), + .base_class = &lv_obj_class, + .name = "bar", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_bar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->cur_value == value) return; + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value < bar->start_value ? bar->start_value : value; /*Can't be smaller than the left value*/ + + if(bar->cur_value == value) return; + + lv_bar_set_value_with_anim(obj, value, &bar->cur_value, &bar->cur_value_anim, anim); +} + +void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) { + return; + } + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value > bar->cur_value ? bar->cur_value : value; /*Can't be greater than the right value*/ + + if(bar->start_value == value) return; + + lv_bar_set_value_with_anim(obj, value, &bar->start_value, &bar->start_value_anim, anim); +} + +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->val_reversed = min > max; + + int32_t real_min = bar->val_reversed ? max : min; + int32_t real_max = bar->val_reversed ? min : max; + if(bar->min_value == real_min && bar->max_value == real_max) return; + + bar->max_value = real_max; + bar->min_value = real_min; + + if(lv_bar_get_mode(obj) != LV_BAR_MODE_RANGE) + bar->start_value = real_min; + + if(bar->cur_value > real_max) { + bar->cur_value = real_max; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + if(bar->cur_value < real_min) { + bar->cur_value = real_min; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + + lv_obj_invalidate(obj); +} + +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->mode = mode; + if(bar->mode != LV_BAR_MODE_RANGE) { + bar->start_value = bar->min_value; + } + + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +int32_t lv_bar_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return LV_BAR_GET_ANIM_VALUE(bar->cur_value, bar->cur_value_anim); +} + +int32_t lv_bar_get_start_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) return bar->min_value; + + return LV_BAR_GET_ANIM_VALUE(bar->start_value, bar->start_value_anim); +} + +int32_t lv_bar_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + return bar->val_reversed ? bar->max_value : bar->min_value; +} + +int32_t lv_bar_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->val_reversed ? bar->min_value : bar->max_value; +} + +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->mode; +} + +bool lv_bar_is_symmetrical(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->mode == LV_BAR_MODE_SYMMETRICAL && bar->min_value < 0 && bar->max_value > 0 && + bar->start_value == bar->min_value; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_bar_t * bar = (lv_bar_t *)obj; + bar->min_value = 0; + bar->max_value = 100; + bar->start_value = 0; + bar->cur_value = 0; + bar->indic_area.x1 = 0; + bar->indic_area.x2 = 0; + bar->indic_area.y1 = 0; + bar->indic_area.y2 = 0; + bar->mode = LV_BAR_MODE_NORMAL; + bar->val_reversed = false; + + lv_bar_init_anim(obj, &bar->cur_value_anim); + lv_bar_init_anim(obj, &bar->start_value_anim); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_bar_set_value(obj, 0, LV_ANIM_OFF); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_anim_delete(&bar->cur_value_anim, NULL); + lv_anim_delete(&bar->start_value_anim, NULL); +} + +static void draw_indic(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + lv_area_t bar_coords; + lv_obj_get_coords(obj, &bar_coords); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_increase(&bar_coords, transf_w, transf_h); + int32_t barw = lv_area_get_width(&bar_coords); + int32_t barh = lv_area_get_height(&bar_coords); + int32_t range = bar->max_value - bar->min_value; + + /*Prevent division by 0*/ + if(range == 0) { + range = 1; + } + + bool hor = barw >= barh; + bool sym = lv_bar_is_symmetrical(obj); + + /*Calculate the indicator area*/ + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + /*Respect padding and minimum width/height too*/ + lv_area_copy(&bar->indic_area, &bar_coords); + bar->indic_area.x1 += bg_left; + bar->indic_area.x2 -= bg_right; + bar->indic_area.y1 += bg_top; + bar->indic_area.y2 -= bg_bottom; + + if(hor && lv_area_get_height(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.y1 = obj->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.y2 = bar->indic_area.y1 + LV_BAR_SIZE_MIN; + } + else if(!hor && lv_area_get_width(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; + } + + int32_t indic_max_w = lv_area_get_width(&bar->indic_area); + int32_t indic_max_h = lv_area_get_height(&bar->indic_area); + + /*Calculate the indicator length*/ + int32_t anim_length = hor ? indic_max_w : indic_max_h; + + int32_t anim_cur_value_x, anim_start_value_x; + + int32_t * axis1, * axis2; + int32_t (*indic_length_calc)(const lv_area_t * area); + + if(hor) { + axis1 = &bar->indic_area.x1; + axis2 = &bar->indic_area.x2; + indic_length_calc = lv_area_get_width; + } + else { + axis1 = &bar->indic_area.y1; + axis2 = &bar->indic_area.y2; + indic_length_calc = lv_area_get_height; + } + + if(LV_BAR_IS_ANIMATING(bar->start_value_anim)) { + int32_t anim_start_value_start_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_start - bar->min_value)) / range; + int32_t anim_start_value_end_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_end - bar->min_value)) / range; + + anim_start_value_x = (((anim_start_value_end_x - anim_start_value_start_x) * bar->start_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + + anim_start_value_x += anim_start_value_start_x; + } + else { + anim_start_value_x = (int32_t)((int32_t)anim_length * (bar->start_value - bar->min_value)) / range; + } + + if(LV_BAR_IS_ANIMATING(bar->cur_value_anim)) { + int32_t anim_cur_value_start_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_start - bar->min_value)) / range; + int32_t anim_cur_value_end_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_end - bar->min_value)) / range; + + anim_cur_value_x = anim_cur_value_start_x + (((anim_cur_value_end_x - anim_cur_value_start_x) * + bar->cur_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + } + else { + anim_cur_value_x = (int32_t)((int32_t)anim_length * (bar->cur_value - bar->min_value)) / range; + } + + /** + * The drawing direction of the bar can be reversed only when one of the two conditions(value inversion + * or horizontal direction base dir is LV_BASE_DIR_RTL) is met. + */ + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + bool hor_need_reversed = hor && base_dir == LV_BASE_DIR_RTL; + bool reversed = bar->val_reversed ^ hor_need_reversed; + + if(reversed) { + /*Swap axes*/ + int32_t * tmp; + tmp = axis1; + axis1 = axis2; + axis2 = tmp; + anim_cur_value_x = -anim_cur_value_x; + anim_start_value_x = -anim_start_value_x; + } + + /*Set the indicator length*/ + if(hor) { + *axis2 = *axis1 + anim_cur_value_x; + *axis1 += anim_start_value_x; + } + else { + *axis1 = *axis2 - anim_cur_value_x + 1; + *axis2 -= anim_start_value_x; + } + + if(sym) { + int32_t zero, shift; + shift = (-bar->min_value * anim_length) / range; + + if(hor) { + int32_t * left = reversed ? axis2 : axis1; + int32_t * right = reversed ? axis1 : axis2; + if(reversed) + zero = *axis1 - shift + 1; + else + zero = *axis1 + shift; + + if(*axis2 > zero) { + *right = *axis2; + *left = zero; + } + else { + *left = *axis2; + *right = zero; + } + } + else { + int32_t * top = reversed ? axis2 : axis1; + int32_t * bottom = reversed ? axis1 : axis2; + if(reversed) + zero = *axis2 + shift; + else + zero = *axis2 - shift + 1; + + if(*axis1 > zero) { + *bottom = *axis1; + *top = zero; + } + else { + *top = *axis1; + *bottom = zero; + } + } + } + + /*Do not draw a zero length indicator but at least call the draw task event*/ + if(!sym && indic_length_calc(&bar->indic_area) <= 1) { + lv_obj_send_event(obj, LV_EVENT_DRAW_TASK_ADDED, NULL); + return; + } + + lv_area_t indic_area; + lv_area_copy(&indic_area, &bar->indic_area); + + lv_draw_rect_dsc_t draw_rect_dsc; + lv_draw_rect_dsc_init(&draw_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc); + + int32_t bg_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + int32_t short_side = LV_MIN(barw, barh); + if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; + + int32_t indic_radius = draw_rect_dsc.radius; + short_side = LV_MIN(lv_area_get_width(&bar->indic_area), lv_area_get_height(&bar->indic_area)); + if(indic_radius > short_side >> 1) indic_radius = short_side >> 1; + + /*Cases: + * Simple: + * - indicator area is the same or smaller then the bg + * - indicator has the same or larger radius than the bg + * - what to do? just draw the indicator + * Radius issue: + * - indicator area is the same or smaller then bg + * - indicator has smaller radius than the bg and the indicator overflows on the corners + * - what to do? draw the indicator on a layer and clip to bg radius + * Larger indicator: + * - indicator area is the larger then the bg + * - radius doesn't matter + * - shadow doesn't matter + * - what to do? just draw the indicator + * Shadow: + * - indicator area is the same or smaller then the bg + * - indicator has the same or larger radius than the bg (shadow needs to be drawn on strange clipped shape) + * - what to do? don't draw the shadow if the indicator is too small has strange shape + * Gradient: + * - the indicator has a gradient + * - what to do? draw it on a bg sized layer clip the indicator are from the gradient + * + */ + + bool mask_needed = false; + if(hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_HOR) mask_needed = true; + else if(!hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_VER) mask_needed = true; + + if(draw_rect_dsc.bg_image_src) mask_needed = true; + + bool radius_issue = true; + /*The indicator is fully drawn if it's larger than the bg*/ + if((bg_left < 0 || bg_right < 0 || bg_top < 0 || bg_bottom < 0)) radius_issue = false; + else if(indic_radius >= bg_radius) radius_issue = false; + else if(_lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false; + + if(radius_issue || mask_needed) { + if(!radius_issue) { + /*Draw only the shadow*/ + lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc; + draw_tmp_dsc.border_opa = 0; + draw_tmp_dsc.outline_opa = 0; + draw_tmp_dsc.bg_opa = 0; + draw_tmp_dsc.bg_image_opa = 0; + lv_draw_rect(layer, &draw_tmp_dsc, &indic_area); + } + else { + draw_rect_dsc.border_opa = 0; + draw_rect_dsc.outline_opa = 0; + } + draw_rect_dsc.shadow_opa = 0; + + /*If clipped for any reason cannot the border, outline, and shadow + *as they would be clipped and looked ugly*/ + lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc; + draw_tmp_dsc.border_opa = 0; + draw_tmp_dsc.outline_opa = 0; + draw_tmp_dsc.shadow_opa = 0; + lv_area_t indic_draw_area = indic_area; + if(mask_needed) { + if(hor) { + indic_draw_area.x1 = bar_coords.x1 + bg_left; + indic_draw_area.x2 = bar_coords.x2 - bg_right; + } + else { + indic_draw_area.y1 = bar_coords.y1 + bg_top; + indic_draw_area.y2 = bar_coords.y2 - bg_bottom; + } + draw_tmp_dsc.radius = 0; + } + + lv_layer_t * layer_indic = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &indic_draw_area); + + lv_draw_rect(layer_indic, &draw_tmp_dsc, &indic_draw_area); + + lv_draw_mask_rect_dsc_t mask_dsc; + lv_draw_mask_rect_dsc_init(&mask_dsc); + if(radius_issue) { bar_coords.x2 += 1; //workaround for a drawing crash in LVGL9.1 bar/slider when top-padding is nonzero and right-padding is less than 1 + mask_dsc.area = bar_coords; + mask_dsc.radius = bg_radius; + lv_draw_mask_rect(layer_indic, &mask_dsc); + } + + if(mask_needed) { + mask_dsc.area = indic_area; + mask_dsc.radius = indic_radius; + lv_draw_mask_rect(layer_indic, &mask_dsc); + } + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.src = layer_indic; + lv_draw_layer(layer, &layer_draw_dsc, &indic_draw_area); + + /*Add the border, outline, and shadow only to the indicator area. + *They might have disabled if there is a radius_issue*/ + draw_tmp_dsc = draw_rect_dsc; + draw_tmp_dsc.bg_opa = 0; + draw_tmp_dsc.bg_image_opa = 0; + lv_draw_rect(layer, &draw_tmp_dsc, &indic_area); + } + else { + lv_draw_rect(layer, &draw_rect_dsc, &indic_area); + } +} + +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t indic_size; + indic_size = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + + /*Bg size is handled by lv_obj*/ + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, indic_size); + + /*Calculate the indicator area*/ + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t pad = LV_MIN4(bg_left, bg_right, bg_top, bg_bottom); + if(pad < 0) { + *s = *s - pad; + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { + lv_bar_t * bar = (lv_bar_t *)obj; + lv_obj_invalidate_area(obj, &bar->indic_area); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_indic(e); + } +} + +static void lv_bar_anim(void * var, int32_t value) +{ + _lv_bar_anim_t * bar_anim = var; + bar_anim->anim_state = value; + lv_obj_invalidate(bar_anim->bar); +} + +static void lv_bar_anim_completed(lv_anim_t * a) +{ + _lv_bar_anim_t * var = a->var; + lv_obj_t * obj = (lv_obj_t *)var->bar; + lv_bar_t * bar = (lv_bar_t *)obj; + + var->anim_state = LV_BAR_ANIM_STATE_INV; + if(var == &bar->cur_value_anim) + bar->cur_value = var->anim_end; + else if(var == &bar->start_value_anim) + bar->start_value = var->anim_end; + lv_obj_invalidate(var->bar); +} + +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + _lv_bar_anim_t * anim_info, lv_anim_enable_t en) +{ + if(en == LV_ANIM_OFF) { + lv_anim_delete(anim_info, NULL); + anim_info->anim_state = LV_BAR_ANIM_STATE_INV; + *value_ptr = new_value; + lv_obj_invalidate((lv_obj_t *)obj); + + /*Stop the previous animation if it exists*/ + lv_anim_delete(anim_info, NULL); + /*Reset animation state*/ + lv_bar_init_anim(obj, anim_info); + } + else { + /*No animation in progress -> simply set the values*/ + if(anim_info->anim_state == LV_BAR_ANIM_STATE_INV) { + anim_info->anim_start = *value_ptr; + anim_info->anim_end = new_value; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_info->anim_start = anim_info->anim_end; + anim_info->anim_end = new_value; + } + *value_ptr = new_value; + /*Stop the previous animation if it exists*/ + lv_anim_delete(anim_info, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, anim_info); + lv_anim_set_exec_cb(&a, lv_bar_anim); + lv_anim_set_values(&a, LV_BAR_ANIM_STATE_START, LV_BAR_ANIM_STATE_END); + lv_anim_set_completed_cb(&a, lv_bar_anim_completed); + lv_anim_set_duration(&a, lv_obj_get_style_anim_duration(obj, LV_PART_MAIN)); + lv_anim_start(&a); + } +} + +static void lv_bar_init_anim(lv_obj_t * obj, _lv_bar_anim_t * bar_anim) +{ + bar_anim->bar = obj; + bar_anim->anim_start = 0; + bar_anim->anim_end = 0; + bar_anim->anim_state = LV_BAR_ANIM_STATE_INV; +} + +#endif diff --git a/libraries/lvgl/src/widgets/bar/lv_bar.h b/libraries/lvgl/src/widgets/bar/lv_bar.h new file mode 100644 index 0000000..d2a882a --- /dev/null +++ b/libraries/lvgl/src/widgets/bar/lv_bar.h @@ -0,0 +1,168 @@ +/** + * @file lv_bar.h + * + */ + +#ifndef LV_BAR_H +#define LV_BAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BAR != 0 + +#include "../../core/lv_obj.h" +#include "../../misc/lv_anim.h" +#include "../label/lv_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_bar_mode_t { + LV_BAR_MODE_NORMAL, + LV_BAR_MODE_SYMMETRICAL, + LV_BAR_MODE_RANGE +}; + +#ifdef DOXYGEN +typedef _lv_bar_mode_t lv_bar_mode_t; +#else +typedef uint8_t lv_bar_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + lv_obj_t * bar; + int32_t anim_start; + int32_t anim_end; + int32_t anim_state; +} _lv_bar_anim_t; + +typedef struct { + lv_obj_t obj; + int32_t cur_value; /**< Current value of the bar*/ + int32_t min_value; /**< Minimum value of the bar*/ + int32_t max_value; /**< Maximum value of the bar*/ + int32_t start_value; /**< Start value of the bar*/ + lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ + bool val_reversed; /**< Whether value been reversed */ + _lv_bar_anim_t cur_value_anim; + _lv_bar_anim_t start_value_anim; + lv_bar_mode_t mode : 2; /**< Type of bar*/ +} lv_bar_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_bar_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a bar object + * @param parent pointer to an object, it will be the parent of the new bar + * @return pointer to the created bar + */ +lv_obj_t * lv_bar_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the bar + * @param obj pointer to a bar object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); + +/** + * Set a new start value on the bar + * @param obj pointer to a bar object + * @param start_value new start value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_start_value(lv_obj_t * obj, int32_t start_value, lv_anim_enable_t anim); + +/** + * Set minimum and the maximum values of a bar + * @param obj pointer to the bar object + * @param min minimum value + * @param max maximum value + * @note If min is greater than max, the drawing direction becomes to the oppsite direction. + */ +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set the type of bar. + * @param obj pointer to bar object + * @param mode bar type from ::lv_bar_mode_t + */ +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a bar + * @param obj pointer to a bar object + * @return the value of the bar + */ +int32_t lv_bar_get_value(const lv_obj_t * obj); + +/** + * Get the start value of a bar + * @param obj pointer to a bar object + * @return the start value of the bar + */ +int32_t lv_bar_get_start_value(const lv_obj_t * obj); + +/** + * Get the minimum value of a bar + * @param obj pointer to a bar object + * @return the minimum value of the bar + */ +int32_t lv_bar_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of a bar + * @param obj pointer to a bar object + * @return the maximum value of the bar + */ +int32_t lv_bar_get_max_value(const lv_obj_t * obj); + +/** + * Get the type of bar. + * @param obj pointer to bar object + * @return bar type from ::lv_bar_mode_t + */ +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj); + +/** + * Give the bar is in symmetrical mode or not + * @param obj pointer to bar object + * @return true: in symmetrical mode false : not in +*/ +bool lv_bar_is_symmetrical(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BAR_H*/ diff --git a/libraries/lvgl/src/widgets/button/lv_button.c b/libraries/lvgl/src/widgets/button/lv_button.c new file mode 100644 index 0000000..8f57aa4 --- /dev/null +++ b/libraries/lvgl/src/widgets/button/lv_button.c @@ -0,0 +1,71 @@ +/** + * @file lv_btn.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_button.h" +#if LV_USE_BUTTON != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_button_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_button_class = { + .constructor_cb = lv_button_constructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_button_t), + .base_class = &lv_obj_class, + .name = "btn", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_button_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif diff --git a/libraries/lvgl/src/widgets/button/lv_button.h b/libraries/lvgl/src/widgets/button/lv_button.h new file mode 100644 index 0000000..08ba1cd --- /dev/null +++ b/libraries/lvgl/src/widgets/button/lv_button.h @@ -0,0 +1,56 @@ +/** + * @file lv_btn.h + * + */ + +#ifndef LV_BUTTON_H +#define LV_BUTTON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BUTTON != 0 +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; +} lv_button_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_button_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created button + */ +lv_obj_t * lv_button_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BUTTON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTON_H*/ diff --git a/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c b/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c new file mode 100644 index 0000000..9b67c31 --- /dev/null +++ b/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c @@ -0,0 +1,1042 @@ +/** + * @file lv_btnmatrix.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_buttonmatrix.h" +#if LV_USE_BUTTONMATRIX != 0 + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev.h" +#include "../../core/lv_group.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_text.h" +#include "../../misc/lv_text_ap.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_buttonmatrix_class) + +#define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) +#define LV_BUTTONMATRIX_WIDTH_MASK 0x000F + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits); +static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p); +static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char ** map); +static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx); +static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx); +static bool has_popovers_in_top_row(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_WIDGETS_HAS_DEFAULT_VALUE +static const char * lv_buttonmatrix_def_map[] = {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}; +#endif + +const lv_obj_class_t lv_buttonmatrix_class = { + .constructor_cb = lv_buttonmatrix_constructor, + .destructor_cb = lv_buttonmatrix_destructor, + .event_cb = lv_buttonmatrix_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_buttonmatrix_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "btnmatrix", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(map == NULL) return; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + /*Analyze the map and create the required number of buttons*/ + allocate_button_areas_and_controls(obj, map); + btnm->map_p = map; + + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + /*Set size and positions of the buttons*/ + int32_t sleft = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t stop = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t max_w = lv_obj_get_content_width(obj); + int32_t max_h = lv_obj_get_content_height(obj); + + /*Calculate the position of each row*/ + int32_t max_h_no_gap = max_h - (prow * (btnm->row_cnt - 1)); + + /*Count the units and the buttons in a line + *(A button can be 1,2,3... unit wide)*/ + uint32_t txt_tot_i = 0; /*Act. index in the str map*/ + uint32_t btn_tot_i = 0; /*Act. index of button areas*/ + const char ** map_row = map; + + /*Count the units and the buttons in a line*/ + uint32_t row; + for(row = 0; row < btnm->row_cnt; row++) { + uint32_t unit_cnt = 0; /*Number of units in a row*/ + uint32_t btn_cnt = 0; /*Number of buttons in a row*/ + /*Count the buttons and units in this row*/ + while(map_row[btn_cnt] && strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + unit_cnt += get_button_width(btnm->ctrl_bits[btn_tot_i + btn_cnt]); + btn_cnt++; + } + + /*Only deal with the non empty lines*/ + if(btn_cnt == 0) { + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next row*/ + continue; + } + + int32_t row_y1 = stop + (max_h_no_gap * row) / btnm->row_cnt + row * prow; + int32_t row_y2 = stop + (max_h_no_gap * (row + 1)) / btnm->row_cnt + row * prow - 1; + + /*Set the button size and positions*/ + int32_t max_w_no_gap = max_w - (pcol * (btn_cnt - 1)); + if(max_w_no_gap < 0) max_w_no_gap = 0; + + uint32_t row_unit_cnt = 0; /*The current unit position in the row*/ + uint32_t btn; + for(btn = 0; btn < btn_cnt; btn++, btn_tot_i++, txt_tot_i++) { + uint32_t btn_u = get_button_width(btnm->ctrl_bits[btn_tot_i]); + + int32_t btn_x1 = (max_w_no_gap * row_unit_cnt) / unit_cnt + btn * pcol; + int32_t btn_x2 = (max_w_no_gap * (row_unit_cnt + btn_u)) / unit_cnt + btn * pcol - 1; + + /*If RTL start from the right*/ + if(base_dir == LV_BASE_DIR_RTL) { + int32_t tmp = btn_x1; + btn_x1 = btn_x2; + btn_x2 = tmp; + + btn_x1 = max_w - btn_x1; + btn_x2 = max_w - btn_x2; + } + + btn_x1 += sleft; + btn_x2 += sleft; + + lv_area_set(&btnm->button_areas[btn_tot_i], btn_x1, row_y1, btn_x2, row_y2); + + row_unit_cnt += btn_u; + } + + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next line*/ + } + + /*Popovers in the top row will draw outside the widget and the extended draw size depends on + *the row height which may have changed when setting the new map*/ + lv_obj_refresh_ext_draw_size(obj); + + lv_obj_invalidate(obj); +} + +void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_memcpy(btnm->ctrl_bits, ctrl_map, sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); + + lv_buttonmatrix_set_map(obj, btnm->map_p); +} + +void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt && btn_id != LV_BUTTONMATRIX_BUTTON_NONE) return; + + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = btn_id; + invalidate_button_area(obj, btn_id); +} + +void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt) return; + + if(btnm->one_check && (ctrl & LV_BUTTONMATRIX_CTRL_CHECKED)) { + lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); + } + + btnm->ctrl_bits[btn_id] |= ctrl; + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt) return; + + btnm->ctrl_bits[btn_id] &= (~ctrl); + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_buttonmatrix_set_button_ctrl(obj, i, ctrl); + } +} + +void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_buttonmatrix_clear_button_ctrl(obj, i, ctrl); + } +} + +void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id >= btnm->btn_cnt) return; + btnm->ctrl_bits[btn_id] &= (~LV_BUTTONMATRIX_WIDTH_MASK); + btnm->ctrl_bits[btn_id] |= (LV_BUTTONMATRIX_WIDTH_MASK & width); + + lv_buttonmatrix_set_map(obj, btnm->map_p); +} + +void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->one_check = en; + + /*If more than one button is toggled only the first one should be*/ + make_one_button_checked(obj, 0); +} + +/*===================== + * Getter functions + *====================*/ + +const char ** lv_buttonmatrix_get_map(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + return btnm->map_p; +} + +uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + return btnm->btn_id_sel; +} + +const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return NULL; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id > btnm->btn_cnt) return NULL; + + uint32_t txt_i = 0; + uint32_t btn_i = 0; + + /*Search the text of btnm->btn_pr the buttons text in the map + *Skip "\n"-s*/ + while(btn_i != btn_id) { + btn_i++; + txt_i++; + if(strcmp(btnm->map_p[txt_i], "\n") == 0) txt_i++; + } + + if(btn_i == btnm->btn_cnt) return NULL; + + return btnm->map_p[txt_i]; +} + +bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id >= btnm->btn_cnt) return false; + + return (btnm->ctrl_bits[btn_id] & ctrl) == ctrl; +} + +bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + return btnm->one_check; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->btn_cnt = 0; + btnm->row_cnt = 0; + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + btnm->map_p = NULL; + btnm->one_check = 0; + +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_buttonmatrix_set_map(obj, lv_buttonmatrix_def_map); +#endif + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + LV_UNUSED(class_p); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_free(btnm->button_areas); + lv_free(btnm->ctrl_bits); + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_point_t p; + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + if(has_popovers_in_top_row(obj)) { + /*reserve one row worth of extra space to account for popovers in the top row*/ + int32_t s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0; + lv_event_set_ext_draw_size(e, s); + } + } + if(code == LV_EVENT_STYLE_CHANGED) { + lv_buttonmatrix_set_map(obj, btnm->map_p); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_buttonmatrix_set_map(obj, btnm->map_p); + } + else if(code == LV_EVENT_PRESSED) { + lv_indev_t * indev = lv_event_get_indev(e); + invalidate_button_area(obj, btnm->btn_id_sel); + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + uint32_t btn_pr; + /*Search the pressed area*/ + lv_indev_get_point(indev, &p); + btn_pr = get_button_from_point(obj, &p); + /*Handle the case where there is no button there*/ + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + if(btn_pr != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && + button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { + btnm->btn_id_sel = btn_pr; + invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ + } + } + else { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_PRESSING) { + /*If a slid to a new button, discard the current button and don't press any buttons*/ + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + lv_indev_t * indev = lv_event_get_indev(e); + lv_indev_get_point(indev, &p); + uint32_t btn_pr = get_button_from_point(obj, &p); + if(btn_pr != btnm->btn_id_sel) { + invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the old area*/ + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + } + else if(code == LV_EVENT_RELEASED) { + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + /*Toggle the button if enabled*/ + if(button_is_checkable(btnm->ctrl_bits[btnm->btn_id_sel]) && + !button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(button_get_checked(btnm->ctrl_bits[btnm->btn_id_sel]) && !btnm->one_check) { + btnm->ctrl_bits[btnm->btn_id_sel] &= (~LV_BUTTONMATRIX_CTRL_CHECKED); + } + else { + btnm->ctrl_bits[btnm->btn_id_sel] |= LV_BUTTONMATRIX_CTRL_CHECKED; + } + if(btnm->one_check) make_one_button_checked(obj, btnm->btn_id_sel); + } + + if((button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == true || + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == true) && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + + /*Invalidate to old pressed area*/; + invalidate_button_area(obj, btnm->btn_id_sel); + + } + else if(code == LV_EVENT_LONG_PRESSED_REPEAT) { + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_repeat_disabled(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_PRESS_LOST) { + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + else if(code == LV_EVENT_FOCUSED) { + if(btnm->btn_cnt == 0) return; + + lv_indev_t * indev = lv_event_get_indev(e); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + + /*If not focused by an input device assume the last input device*/ + if(indev == NULL) { + indev = lv_indev_get_next(NULL); + indev_type = lv_indev_get_type(indev); + } + + bool editing = lv_group_get_editing(lv_obj_get_group(obj)); + /*Focus the first button if there is not selected button*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + if(indev_type == LV_INDEV_TYPE_KEYPAD || (indev_type == LV_INDEV_TYPE_ENCODER && editing)) { + uint32_t b = 0; + if(btnm->one_check) { + while(b < btnm->btn_cnt && + (button_is_hidden(btnm->ctrl_bits[b]) || + button_is_inactive(btnm->ctrl_bits[b]) || + button_is_checked(btnm->ctrl_bits[b]) == false)) { + b++; + } + } + else { + while(b < btnm->btn_cnt && + (button_is_hidden(btnm->ctrl_bits[b]) || + button_is_inactive(btnm->ctrl_bits[b]))) { + b++; + } + } + + btnm->btn_id_sel = b; + } + else { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + // TODO + // if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) invalidate_button_area(obj, btnm->btn_id_sel); + // btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + else if(code == LV_EVENT_KEY) { + + invalidate_button_area(obj, btnm->btn_id_sel); + + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT) { + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; + else btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + uint32_t btn_id_start = btnm->btn_id_sel; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else if(c == LV_KEY_LEFT) { + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; + else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + + uint32_t btn_id_start = btnm->btn_id_sel; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else if(c == LV_KEY_DOWN) { + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else { + uint32_t area_below; + int32_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_below = btnm->btn_id_sel; area_below < btnm->btn_cnt; area_below++) { + if(btnm->button_areas[area_below].y1 > btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_below].x1 && + pr_center <= btnm->button_areas[area_below].x2 + col_gap && + button_is_inactive(btnm->ctrl_bits[area_below]) == false && + button_is_hidden(btnm->ctrl_bits[area_below]) == false) { + break; + } + } + + if(area_below < btnm->btn_cnt) btnm->btn_id_sel = area_below; + } + } + else if(c == LV_KEY_UP) { + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else { + int16_t area_above; + int32_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_above = btnm->btn_id_sel; area_above >= 0; area_above--) { + if(btnm->button_areas[area_above].y1 < btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_above].x1 - col_gap && + pr_center <= btnm->button_areas[area_above].x2 && + button_is_inactive(btnm->ctrl_bits[area_above]) == false && + button_is_hidden(btnm->ctrl_bits[area_above]) == false) { + break; + } + } + if(area_above >= 0) btnm->btn_id_sel = area_above; + } + } + + invalidate_button_area(obj, btnm->btn_id_sel); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btnm->btn_cnt == 0) return; + + lv_layer_t * layer = lv_event_get_layer(e); + obj->skip_trans = 1; + + lv_area_t area_obj; + lv_obj_get_coords(obj, &area_obj); + + lv_area_t btn_area; + + uint32_t btn_i = 0; + uint32_t txt_i = 0; + + lv_draw_rect_dsc_t draw_rect_dsc_act; + lv_draw_label_dsc_t draw_label_dsc_act; + + lv_draw_rect_dsc_t draw_rect_dsc_def; + lv_draw_label_dsc_t draw_label_dsc_def; + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_def); + lv_draw_label_dsc_init(&draw_label_dsc_def); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_def); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_def); + obj->skip_trans = 0; + obj->state = state_ori; + + int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + +#if LV_USE_ARABIC_PERSIAN_CHARS + char txt_ap[256]; +#endif + + for(btn_i = 0; btn_i < btnm->btn_cnt; btn_i++, txt_i++) { + /*Search the next valid text in the map*/ + while(strcmp(btnm->map_p[txt_i], "\n") == 0) { + txt_i++; + } + + /*Skip hidden buttons*/ + if(button_is_hidden(btnm->ctrl_bits[btn_i])) continue; + + /*Get the state of the button*/ + lv_state_t btn_state = LV_STATE_DEFAULT; + if(button_get_checked(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_CHECKED; + + if(button_is_inactive(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_DISABLED; + else if(btn_i == btnm->btn_id_sel) { + if(state_ori & LV_STATE_PRESSED) btn_state |= LV_STATE_PRESSED; + if(state_ori & LV_STATE_FOCUSED) btn_state |= LV_STATE_FOCUSED; + if(state_ori & LV_STATE_FOCUS_KEY) btn_state |= LV_STATE_FOCUS_KEY; + if(state_ori & LV_STATE_EDITED) btn_state |= LV_STATE_EDITED; + } + + /*Get the button's area*/ + lv_area_copy(&btn_area, &btnm->button_areas[btn_i]); + btn_area.x1 += area_obj.x1; + btn_area.y1 += area_obj.y1; + btn_area.x2 += area_obj.x1; + btn_area.y2 += area_obj.y1; + + /*Set up the draw descriptors*/ + if(btn_state == LV_STATE_DEFAULT) { + lv_memcpy(&draw_rect_dsc_act, &draw_rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&draw_label_dsc_act, &draw_label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = btn_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_act); + lv_draw_label_dsc_init(&draw_label_dsc_act); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + draw_rect_dsc_act.base.id1 = btn_i; + + /*Remove borders on the edges if `LV_BORDER_SIDE_INTERNAL`*/ + if(draw_rect_dsc_act.border_side & LV_BORDER_SIDE_INTERNAL) { + draw_rect_dsc_act.border_side = LV_BORDER_SIDE_FULL; + if(btn_area.x1 == obj->coords.x1 + pleft) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_LEFT; + if(btn_area.x2 == obj->coords.x2 - pright) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_RIGHT; + if(btn_area.y1 == obj->coords.y1 + ptop) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_TOP; + if(btn_area.y2 == obj->coords.y2 - pbottom) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_BOTTOM; + } + + int32_t btn_height = lv_area_get_height(&btn_area); + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to create the popover*/ + btn_area.y1 -= btn_height; + } + + /*Draw the background*/ + lv_draw_rect(layer, &draw_rect_dsc_act, &btn_area); + + /*Calculate the size of the text*/ + const lv_font_t * font = draw_label_dsc_act.font; + int32_t letter_space = draw_label_dsc_act.letter_space; + int32_t line_space = draw_label_dsc_act.line_space; + const char * txt = btnm->map_p[txt_i]; + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_text_ap_calc_bytes_count(txt); + if(len_ap < sizeof(txt_ap)) { + _lv_text_ap_proc(txt, txt_ap); + txt = txt_ap; + } +#endif + lv_point_t txt_size; + lv_text_get_size(&txt_size, txt, font, letter_space, + line_space, lv_area_get_width(&area_obj), draw_label_dsc_act.flag); + + btn_area.x1 += (lv_area_get_width(&btn_area) - txt_size.x) / 2; + btn_area.y1 += (lv_area_get_height(&btn_area) - txt_size.y) / 2; + btn_area.x2 = btn_area.x1 + txt_size.x; + btn_area.y2 = btn_area.y1 + txt_size.y; + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the button text into the popover*/ + btn_area.y1 -= btn_height / 2; + btn_area.y2 -= btn_height / 2; + } + + /*Draw the text*/ + draw_label_dsc_act.text = txt; + draw_label_dsc_act.text_local = true; + draw_label_dsc_act.base.id1 = btn_i; + lv_draw_label(layer, &draw_label_dsc_act, &btn_area); + } + + obj->skip_trans = 0; +} +/** + * Create the required number of buttons and control bytes according to a map + * @param obj pointer to button matrix object + * @param map_p pointer to a string array + */ +static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char ** map) +{ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->row_cnt = 1; + /*Count the buttons in the map*/ + uint32_t btn_cnt = 0; + uint32_t i = 0; + while(map[i] && map[i][0] != '\0') { + if(strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/ + btn_cnt++; + } + else { + btnm->row_cnt++; + } + i++; + } + + /*Do not allocate memory for the same amount of buttons*/ + if(btn_cnt == btnm->btn_cnt) return; + + if(btnm->button_areas != NULL) { + lv_free(btnm->button_areas); + btnm->button_areas = NULL; + } + if(btnm->ctrl_bits != NULL) { + lv_free(btnm->ctrl_bits); + btnm->ctrl_bits = NULL; + } + + btnm->button_areas = lv_malloc(sizeof(lv_area_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->button_areas); + btnm->ctrl_bits = lv_malloc(sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->ctrl_bits); + if(btnm->button_areas == NULL || btnm->ctrl_bits == NULL) btn_cnt = 0; + + lv_memzero(btnm->ctrl_bits, sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); + + btnm->btn_cnt = btn_cnt; +} + +/** + * Get the width of a button in units (default is 1). + * @param ctrl_bits least significant 3 bits used (1..7 valid values) + * @return the width of the button in units + */ +static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + uint32_t w = ctrl_bits & LV_BUTTONMATRIX_WIDTH_MASK; + return w != 0 ? w : 1; +} + +static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_HIDDEN; +} + +static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; +} + +static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_NO_REPEAT; +} + +static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_DISABLED; +} + +static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CLICK_TRIG; +} + +static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_POPOVER; +} + +static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKABLE; +} + +static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; +} + +/** + * Gives the button id of a button under a given point + * @param obj pointer to a button matrix object + * @param p a point with absolute coordinates + * @return the id of the button or LV_BUTTONMATRIX_BUTTON_NONE. + */ +static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p) +{ + lv_area_t obj_cords; + lv_area_t btn_area; + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + lv_obj_get_coords(obj, &obj_cords); + + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Get the half gap. Button look larger with this value. (+1 for rounding error)*/ + prow = (prow / 2) + 1 + (prow & 1); + pcol = (pcol / 2) + 1 + (pcol & 1); + + prow = LV_MIN(prow, BTN_EXTRA_CLICK_AREA_MAX); + pcol = LV_MIN(pcol, BTN_EXTRA_CLICK_AREA_MAX); + pright = LV_MIN(pright, BTN_EXTRA_CLICK_AREA_MAX); + ptop = LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + pbottom = LV_MIN(pbottom, BTN_EXTRA_CLICK_AREA_MAX); + + for(i = 0; i < btnm->btn_cnt; i++) { + lv_area_copy(&btn_area, &btnm->button_areas[i]); + if(btn_area.x1 <= pleft) btn_area.x1 += obj_cords.x1 - LV_MIN(pleft, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.x1 += obj_cords.x1 - pcol; + + if(btn_area.y1 <= ptop) btn_area.y1 += obj_cords.y1 - LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.y1 += obj_cords.y1 - prow; + + if(btn_area.x2 >= w - pright - 2) btn_area.x2 += obj_cords.x1 + LV_MIN(pright, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.x2 += obj_cords.x1 + pcol; + + if(btn_area.y2 >= h - pbottom - 2) btn_area.y2 += obj_cords.y1 + LV_MIN(pbottom, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.y2 += obj_cords.y1 + prow; + + if(_lv_area_is_point_on(&btn_area, p, 0) != false) { + break; + } + } + + if(i == btnm->btn_cnt) i = LV_BUTTONMATRIX_BUTTON_NONE; + + return i; +} + +static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx) +{ + if(btn_idx == LV_BUTTONMATRIX_BUTTON_NONE) return; + + lv_area_t btn_area; + lv_area_t obj_area; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_idx >= btnm->btn_cnt) return; + + lv_area_copy(&btn_area, &btnm->button_areas[btn_idx]); + lv_obj_get_coords(obj, &obj_area); + + /*The buttons might have outline and shadow so make the invalidation larger with the gaps between the buttons. + *It assumes that the outline or shadow is smaller than the gaps*/ + int32_t row_gap = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Be sure to have a minimal extra space if row/col_gap is small*/ + int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); + row_gap = LV_MAX(row_gap, dpi / 10); + col_gap = LV_MAX(col_gap, dpi / 10); + + /*Convert relative coordinates to absolute*/ + btn_area.x1 += obj_area.x1 - row_gap; + btn_area.y1 += obj_area.y1 - col_gap; + btn_area.x2 += obj_area.x1 + row_gap; + btn_area.y2 += obj_area.y1 + col_gap; + + if((btn_idx == btnm->btn_id_sel) && (btnm->ctrl_bits[btn_idx] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to also invalidate the popover*/ + btn_area.y1 -= lv_area_get_height(&btn_area); + } + + lv_obj_invalidate_area(obj, &btn_area); +} + +/** + * Enforces a single button being toggled on the button matrix. + * It simply clears the toggle flag on other buttons. + * @param obj Button matrix object + * @param btn_idx Button that should remain toggled + */ +static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx) +{ + /*Save whether the button was toggled*/ + bool was_toggled = lv_buttonmatrix_has_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); + + lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); + + if(was_toggled) lv_buttonmatrix_set_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); +} + +/** + * Check if any of the buttons in the first row has the LV_BUTTONMATRIX_CTRL_POPOVER control flag set. + * @param obj Button matrix object + * @return true if at least one button has the flag, false otherwise + */ +static bool has_popovers_in_top_row(lv_obj_t * obj) +{ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btnm->row_cnt <= 0) { + return false; + } + + const char ** map_row = btnm->map_p; + uint32_t btn_cnt = 0; + + while(map_row[btn_cnt] && strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + if(button_is_popover(btnm->ctrl_bits[btn_cnt])) { + return true; + } + btn_cnt++; + } + + return false; +} + +#endif diff --git a/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h b/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h new file mode 100644 index 0000000..64c0d1b --- /dev/null +++ b/libraries/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h @@ -0,0 +1,222 @@ +/** + * @file lv_btnmatrix.h + * + */ + +#ifndef LV_BUTTONMATRIX_H +#define LV_BUTTONMATRIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BUTTONMATRIX != 0 + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ +#define LV_BUTTONMATRIX_BUTTON_NONE 0xFFFF +LV_EXPORT_CONST_INT(LV_BUTTONMATRIX_BUTTON_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** Type to store button control bits (disabled, hidden etc.) + * The first 3 bits are used to store the width*/ +enum _lv_buttonmatrix_ctrl_t { + _LV_BUTTONMATRIX_WIDTH = 0x000F, /**< Reserved to store the size units*/ + LV_BUTTONMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ + LV_BUTTONMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ + LV_BUTTONMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ + LV_BUTTONMATRIX_CTRL_CHECKABLE = 0x0080, /**< The button can be toggled.*/ + LV_BUTTONMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ + LV_BUTTONMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ + LV_BUTTONMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ + _LV_BUTTONMATRIX_CTRL_RESERVED_1 = 0x0800, /**< Reserved for later use*/ + _LV_BUTTONMATRIX_CTRL_RESERVED_2 = 0x1000, /**< Reserved for later use*/ + _LV_BUTTONMATRIX_CTRL_RESERVED_3 = 0x2000, /**< Reserved for later use*/ + LV_BUTTONMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ + LV_BUTTONMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ +}; + +#ifdef DOXYGEN +typedef _lv_buttonmatrix_ctrl_t lv_buttonmatrix_ctrl_t; +#else +typedef uint32_t lv_buttonmatrix_ctrl_t; +#endif /*DOXYGEN*/ + +typedef bool (*lv_buttonmatrix_button_draw_cb_t)(lv_obj_t * btnm, uint32_t btn_id, const lv_area_t * draw_area, + const lv_area_t * clip_area); + +/*Data of button matrix*/ +typedef struct { + lv_obj_t obj; + const char ** map_p; /*Pointer to the current map*/ + lv_area_t * button_areas; /*Array of areas of buttons*/ + lv_buttonmatrix_ctrl_t * ctrl_bits; /*Array of control bytes*/ + uint32_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/ + uint32_t row_cnt; /*Number of rows in 'map_p'(Handled by the library)*/ + uint32_t btn_id_sel; /*Index of the active button (being pressed/released etc) or LV_BUTTONMATRIX_BUTTON_NONE*/ + uint32_t one_check : 1; /*Single button toggled at once*/ +} lv_buttonmatrix_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_buttonmatrix_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button matrix object + * @param parent pointer to an object, it will be the parent of the new button matrix + * @return pointer to the created button matrix + */ +lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new map. Buttons will be created/deleted according to the map. The + * button matrix keeps a reference to the map and so the string array must not + * be deallocated during the life of the matrix. + * @param obj pointer to a button matrix object + * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. + */ +void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * map[]); + +/** + * Set the button control map (hidden, disabled etc.) for a button matrix. + * The control map array will be copied and so may be deallocated after this + * function returns. + * @param obj pointer to a button matrix object + * @param ctrl_map pointer to an array of `lv_button_ctrl_t` control bytes. The + * length of the array and position of the elements must match + * the number and order of the individual buttons (i.e. excludes + * newline entries). + * An element of the map should look like e.g.: + * `ctrl_map[0] = width | LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_TGL_ENABLE` + */ +void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]); + +/** + * Set the selected buttons + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + */ +void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id); + +/** + * Set the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` + */ +void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` + */ +void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Set attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. + */ +void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. + * @param en true: set the attributes; false: clear the attributes + */ +void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Set a single button's relative width. + * This method will cause the matrix be regenerated and is a relatively + * expensive operation. It is recommended that initial width be specified using + * `lv_buttonmatrix_set_ctrl_map` and this method only be used for dynamic changes. + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. + * @param width relative width compared to the buttons in the same row. [1..15] + */ +void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width); + +/** + * Make the button matrix like a selector widget (only one button may be checked at a time). + * `LV_BUTTONMATRIX_CTRL_CHECKABLE` must be enabled on the buttons to be selected using + * `lv_buttonmatrix_set_ctrl()` or `lv_buttonmatrix_set_button_ctrl_all()`. + * @param obj pointer to a button matrix object + * @param en whether "one check" mode is enabled + */ +void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current map of a button matrix + * @param obj pointer to a button matrix object + * @return the current map + */ +const char ** lv_buttonmatrix_get_map(const lv_obj_t * obj); + +/** + * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) + * Useful in the `event_cb` to get the text of the button, check if hidden etc. + * @param obj pointer to button matrix object + * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) + */ +uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj); + +/** + * Get the button's text + * @param obj pointer to button matrix object + * @param btn_id the index a button not counting new line characters. + * @return text of btn_index` button + */ +const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id); + +/** + * Get the whether a control value is enabled or disabled for button of a button matrix + * @param obj pointer to a button matrix object + * @param btn_id the index of a button not counting new line characters. + * @param ctrl control values to check (ORed value can be used) + * @return true: the control attribute is enabled false: disabled + */ +bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Tell whether "one check" mode is enabled or not. + * @param obj Button matrix object + * @return true: "one check" mode is enabled; false: disabled + */ +bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BUTTONMATRIX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTONMATRIX_H*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar.c b/libraries/lvgl/src/widgets/calendar/lv_calendar.c new file mode 100644 index 0000000..49b46fb --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar.c @@ -0,0 +1,411 @@ +/** + * @file lv_calendar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar.h" +#include "../../../lvgl.h" +#if LV_USE_CALENDAR + +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define LV_CALENDAR_CTRL_TODAY LV_BUTTONMATRIX_CTRL_CUSTOM_1 +#define LV_CALENDAR_CTRL_HIGHLIGHT LV_BUTTONMATRIX_CTRL_CUSTOM_2 + +#define MY_CLASS (&lv_calendar_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_task_added_event_cb(lv_event_t * e); + +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day); +static uint8_t get_month_length(int32_t year, int32_t month); +static uint8_t is_leap_year(uint32_t year); +static void highlight_update(lv_obj_t * calendar); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_class = { + .constructor_cb = lv_calendar_constructor, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = (LV_DPI_DEF * 3) / 2, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_calendar_t), + .base_class = &lv_obj_class, + .name = "calendar", +}; + +static const char * day_names_def[7] = LV_CALENDAR_DEFAULT_DAY_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint32_t i; + for(i = 0; i < 7; i++) { + calendar->map[i] = day_names[i]; + } + lv_obj_invalidate(obj); +} + +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->today.year = year; + calendar->today.month = month; + calendar->today.day = day; + + highlight_update(obj); +} + +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num) +{ + LV_ASSERT_NULL(highlighted); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->highlighted_dates = highlighted; + calendar->highlighted_dates_num = date_num; + + highlight_update(obj); +} + +void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->showed_date.year = year; + calendar->showed_date.month = month; + calendar->showed_date.day = 1; + + lv_calendar_date_t d; + d.year = calendar->showed_date.year; + d.month = calendar->showed_date.month; + d.day = calendar->showed_date.day; + + uint32_t i; + + /*Remove the disabled state but revert it for day names*/ + lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_DISABLED); + for(i = 0; i < 7; i++) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i, LV_BUTTONMATRIX_CTRL_DISABLED); + } + + uint8_t act_mo_len = get_month_length(d.year, d.month); + uint8_t day_first = get_day_of_week(d.year, d.month, 1); + uint8_t c; + for(i = day_first, c = 1; i < act_mo_len + day_first; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + } + + uint8_t prev_mo_len = get_month_length(d.year, d.month - 1); + for(i = 0, c = prev_mo_len - day_first + 1; i < day_first; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); + } + + for(i = day_first + act_mo_len, c = 1; i < 6 * 7; i++, c++) { + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); + } + + highlight_update(obj); + + /*Reset the focused button if the days changes*/ + if(lv_buttonmatrix_get_selected_button(calendar->btnm) != LV_BUTTONMATRIX_BUTTON_NONE) { + lv_buttonmatrix_set_selected_button(calendar->btnm, day_first + 7); + } + + lv_obj_invalidate(obj); + + /* The children of the calendar are probably headers. + * Notify them to let the headers updated to the new date*/ + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == calendar->btnm) continue; + lv_obj_send_event(child, LV_EVENT_VALUE_CHANGED, obj); + } +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + return calendar->btnm; +} + +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->today; +} + +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->showed_date; +} + +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates; +} + +size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates_num; +} + +lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint32_t d = lv_buttonmatrix_get_selected_button(calendar->btnm); + if(d == LV_BUTTONMATRIX_BUTTON_NONE) { + date->year = 0; + date->month = 0; + date->day = 0; + return LV_RESULT_INVALID; + } + + const char * txt = lv_buttonmatrix_get_button_text(calendar->btnm, lv_buttonmatrix_get_selected_button(calendar->btnm)); + + if(txt[1] == 0) date->day = txt[0] - '0'; + else date->day = (txt[0] - '0') * 10 + (txt[1] - '0'); + + date->year = calendar->showed_date.year; + date->month = calendar->showed_date.month; + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + /*Initialize the allocated 'ext'*/ + + calendar->today.year = 2024; + calendar->today.month = 1; + calendar->today.day = 1; + + calendar->showed_date.year = 2024; + calendar->showed_date.month = 1; + calendar->showed_date.day = 1; + + calendar->highlighted_dates = NULL; + calendar->highlighted_dates_num = 0; + + lv_memzero(calendar->nums, sizeof(calendar->nums)); + uint8_t i; + uint8_t j = 0; + for(i = 0; i < 8 * 7; i++) { + /*Every 8th string is "\n"*/ + if(i != 0 && (i + 1) % 8 == 0) { + calendar->map[i] = "\n"; + } + else if(i < 7) { + calendar->map[i] = day_names_def[i]; + } + else { + calendar->nums[j][0] = 'x'; + calendar->map[i] = calendar->nums[j]; + j++; + } + } + calendar->map[8 * 7 - 1] = ""; + + calendar->btnm = lv_buttonmatrix_create(obj); + lv_buttonmatrix_set_map(calendar->btnm, calendar->map); + lv_buttonmatrix_set_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_NO_REPEAT); + lv_obj_add_event_cb(calendar->btnm, draw_task_added_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + lv_obj_set_width(calendar->btnm, lv_pct(100)); + lv_obj_add_flag(calendar->btnm, LV_OBJ_FLAG_EVENT_BUBBLE | LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_grow(calendar->btnm, 1); + + lv_calendar_set_showed_date(obj, calendar->showed_date.year, calendar->showed_date.month); + lv_calendar_set_today_date(obj, calendar->today.year, calendar->today.month, calendar->today.day); +} + +static void draw_task_added_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_draw_task_t * draw_task = lv_event_get_param(e); + if(((lv_draw_dsc_base_t *)draw_task->draw_dsc)->part != LV_PART_ITEMS) return; + + lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task); + lv_draw_border_dsc_t * border_draw_dsc = lv_draw_task_get_border_dsc(draw_task); + + if(!fill_draw_dsc && !border_draw_dsc) { + return; + } + + int32_t id = ((lv_draw_dsc_base_t *)draw_task->draw_dsc)->id1; + + /*Day name styles*/ + if(id < 7) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; + } + else if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_BUTTONMATRIX_CTRL_DISABLED)) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; + } + + if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_HIGHLIGHT)) { + if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_40; + if(fill_draw_dsc) fill_draw_dsc->color = lv_theme_get_color_primary(obj); + if(lv_buttonmatrix_get_selected_button(obj) == (uint32_t)id) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_70; + } + } + + if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_TODAY)) { + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_COVER; + if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); + if(border_draw_dsc) border_draw_dsc->width += 1; + } +} + +/** + * Get the number of days in a month + * @param year a year + * @param month a month. The range is basically [1..12] but [-11..0] or [13..24] is also + * supported to handle next/prev. year + * @return [28..31] + */ +static uint8_t get_month_length(int32_t year, int32_t month) +{ + month--; + if(month < 0) { + year--; /*Already in the previous year (won't be less then -12 to skip a whole year)*/ + month = 12 + month; /*`month` is negative, the result will be < 12*/ + } + if(month >= 12) { + year++; + month -= 12; + } + + /*month == 1 is february*/ + return (month == 1) ? (28 + is_leap_year(year)) : 31 - month % 7 % 2; +} + +/** + * Tells whether a year is leap year or not + * @param year a year + * @return 0: not leap year; 1: leap year + */ +static uint8_t is_leap_year(uint32_t year) +{ + return (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1; +} + +/** + * Get the day of the week + * @param year a year + * @param month a month [1..12] + * @param day a day [1..32] + * @return [0..6] which means [Sun..Sat] or [Mon..Sun] depending on LV_CALENDAR_WEEK_STARTS_MONDAY + */ +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day) +{ + uint32_t a = month < 3 ? 1 : 0; + uint32_t b = year - a; + +#if LV_CALENDAR_WEEK_STARTS_MONDAY + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400) - 1) % 7; +#else + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400)) % 7; +#endif + + return day_of_week ; +} + +static void highlight_update(lv_obj_t * obj) +{ + lv_calendar_t * calendar = (lv_calendar_t *)obj; + uint32_t i; + + /*Clear all kind of selection*/ + lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_CALENDAR_CTRL_TODAY | LV_CALENDAR_CTRL_HIGHLIGHT); + + uint8_t day_first = get_day_of_week(calendar->showed_date.year, calendar->showed_date.month, 1); + if(calendar->highlighted_dates) { + for(i = 0; i < calendar->highlighted_dates_num; i++) { + if(calendar->highlighted_dates[i].year == calendar->showed_date.year && + calendar->highlighted_dates[i].month == calendar->showed_date.month) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->highlighted_dates[i].day - 1 + day_first + 7, + LV_CALENDAR_CTRL_HIGHLIGHT); + } + } + } + + if(calendar->showed_date.year == calendar->today.year && calendar->showed_date.month == calendar->today.month) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->today.day - 1 + day_first + 7, LV_CALENDAR_CTRL_TODAY); + } +} + +#endif /*LV_USE_CALENDAR*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar.h b/libraries/lvgl/src/widgets/calendar/lv_calendar.h new file mode 100644 index 0000000..00e06a4 --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar.h @@ -0,0 +1,172 @@ +/** + * @file lv_calendar.h + * + */ + +#ifndef LV_CALENDAR_H +#define LV_CALENDAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../buttonmatrix/lv_buttonmatrix.h" + +#if LV_USE_CALENDAR + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a date on the calendar object (platform-agnostic). + */ +typedef struct { + uint16_t year; + int8_t month; /** 1..12*/ + int8_t day; /** 1..31*/ +} lv_calendar_date_t; + +/*Data of calendar*/ +typedef struct { + lv_obj_t obj; + /*New data for this type*/ + lv_obj_t * btnm; + lv_calendar_date_t today; /**< Date of today*/ + lv_calendar_date_t showed_date; /**< Currently visible month (day is ignored)*/ + lv_calendar_date_t * highlighted_dates; /**< Apply different style on these days (pointer to user-defined array)*/ + size_t highlighted_dates_num; /**< Number of elements in `highlighted_days`*/ + const char * map[8 * 7]; + char nums [7 * 6][4]; +} lv_calendar_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar widget + * @param parent pointer to an object, it will be the parent of the new calendar + * @return pointer the created calendar + */ +lv_obj_t * lv_calendar_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the today's date + * @param obj pointer to a calendar object + * @param year today's year + * @param month today's month [1..12] + * @param day today's day [1..31] + */ +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day); + +/** + * Set the currently showed + * @param obj pointer to a calendar object + * @param year today's year + * @param month today's month [1..12] + */ +void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month); + +/** + * Set the highlighted dates + * @param obj pointer to a calendar object + * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + * @param date_num number of dates in the array + */ +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num); + +/** + * Set the name of the days + * @param obj pointer to a calendar object + * @param day_names pointer to an array with the names. + * E.g. `const char * days[7] = {"Sun", "Mon", ...}` + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_set_day_names(lv_obj_t * obj, const char ** day_names); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the button matrix object of the calendar. + * It shows the dates and day names. + * @param obj pointer to a calendar object + * @return pointer to a the button matrix + */ +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj); + +/** + * Get the today's date + * @param calendar pointer to a calendar object + * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. + */ +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar); + +/** + * Get the currently showed + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. + */ +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar); + +/** + * Get the highlighted dates + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` array containing the dates. + */ +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar); + +/** + * Get the number of the highlighted dates + * @param calendar pointer to a calendar object + * @return number of highlighted days + */ +size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar); + +/** + * Get the currently pressed day + * @param calendar pointer to a calendar object + * @param date store the pressed date here + * @return LV_RESULT_OK: there is a valid pressed date + * LV_RESULT_INVALID: there is no pressed data + */ +lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * calendar, lv_calendar_date_t * date); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#include "lv_calendar_header_arrow.h" +#include "lv_calendar_header_dropdown.h" + +#endif /*LV_USE_CALENDAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_H*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c new file mode 100644 index 0000000..3a8eeaa --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c @@ -0,0 +1,157 @@ +/** + * @file lv_calendar_header_arrow.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_header_arrow.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW + +#include "lv_calendar.h" +#include "../button/lv_button.h" +#include "../label/lv_label.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_header_arrow_class = { + .base_class = &lv_obj_class, + .constructor_cb = my_constructor, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .name = "calendar-header-arrow", +}; + +static const char * month_names_def[12] = LV_CALENDAR_DEFAULT_MONTH_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_arrow_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_move_to_index(obj, 0); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START); + + lv_obj_t * mo_prev = lv_button_create(obj); + lv_obj_set_style_bg_image_src(mo_prev, LV_SYMBOL_LEFT, 0); + lv_obj_set_height(mo_prev, lv_pct(100)); + lv_obj_update_layout(mo_prev); + int32_t btn_size = lv_obj_get_height(mo_prev); + lv_obj_set_width(mo_prev, btn_size); + + lv_obj_add_event_cb(mo_prev, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_remove_flag(mo_prev, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_t * label = lv_label_create(obj); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_flex_grow(label, 1); + + lv_obj_t * mo_next = lv_button_create(obj); + lv_obj_set_style_bg_image_src(mo_next, LV_SYMBOL_RIGHT, 0); + lv_obj_set_size(mo_next, btn_size, btn_size); + + lv_obj_add_event_cb(mo_next, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_remove_flag(mo_next, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + /*Refresh the drop downs*/ + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_current_target(e); + + lv_obj_t * header = lv_obj_get_parent(btn); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + + LV_ASSERT_FORMAT_MSG(newd.year >= 0 && newd.month >= 1 && newd.month <= 12, + "Invalid date: %d-%d", newd.year, newd.month); + + /*The last child is the right button*/ + if(lv_obj_get_child(header, 0) == btn) { + if(newd.month == 1) { + newd.month = 12; + newd.year --; + } + else { + newd.month --; + } + } + else { + if(newd.month == 12) { + newd.month = 1; + newd.year ++; + } + else { + newd.month ++; + } + } + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); + + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", newd.year, month_names_def[newd.month - 1]); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * date = lv_calendar_get_showed_date(calendar); + LV_ASSERT_FORMAT_MSG(date->year >= 0 && date->month >= 1 && date->month <= 12, + "Invalid date: %d-%d", date->year, date->month); + + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", date->year, month_names_def[date->month - 1]); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h new file mode 100644 index 0000000..a04b355 --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h @@ -0,0 +1,49 @@ +/** + * @file lv_calendar_header_arrow.h + * + */ + +#ifndef LV_CALENDAR_HEADER_ARROW_H +#define LV_CALENDAR_HEADER_ARROW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_arrow_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_ARROW_H*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c new file mode 100644 index 0000000..77d508b --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c @@ -0,0 +1,182 @@ +/** + * @file lv_calendar_obj_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_header_dropdown.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN + +#include "lv_calendar.h" +#include "../dropdown/lv_dropdown.h" +#include "../../layouts/flex/lv_flex.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void year_event_cb(lv_event_t * e); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_header_dropdown_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .constructor_cb = my_constructor, + .name = "calendar-header-dropdown", +}; + +static const char * month_list = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; +static const char * year_list = { + "2025\n2024\n2023\n2022\n2021\n" + "2020\n2019\n2018\n2017\n2016\n2015\n2014\n2013\n2012\n2011\n2010\n2009\n2008\n2007\n2006\n2005\n2004\n2003\n2002\n2001\n" + "2000\n1999\n1998\n1997\n1996\n1995\n1994\n1993\n1992\n1991\n1990\n1989\n1988\n1987\n1986\n1985\n1984\n1983\n1982\n1981\n" + "1980\n1979\n1978\n1977\n1976\n1975\n1974\n1973\n1972\n1971\n1970\n1969\n1968\n1967\n1966\n1965\n1964\n1963\n1962\n1961\n" + "1960\n1959\n1958\n1957\n1956\n1955\n1954\n1953\n1952\n1951\n1950\n1949\n1948\n1947\n1946\n1945\n1944\n1943\n1942\n1941\n" + "1940\n1939\n1938\n1937\n1936\n1935\n1934\n1933\n1932\n1931\n1930\n1929\n1928\n1927\n1926\n1925\n1924\n1923\n1922\n1921\n" + "1920\n1919\n1918\n1917\n1916\n1915\n1914\n1913\n1912\n1911\n1910\n1909\n1908\n1907\n1906\n1905\n1904\n1903\n1902\n1901" +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_dropdown_class, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list) +{ + /* Search for the header dropdown */ + lv_obj_t * header = lv_obj_get_child_by_type(parent, 0, &lv_calendar_header_dropdown_class); + if(NULL == header) { + /* Header not found */ + return; + } + + /* Search for the year dropdown + * Index is 0 because in the header dropdown constructor the year dropdpwn (year_dd) + * is the first created child of the header */ + const int32_t year_dropdown_index = 0; + lv_obj_t * year_dropdown = lv_obj_get_child_by_type(header, year_dropdown_index, &lv_dropdown_class); + if(NULL == year_dropdown) { + /* year dropdpwn not found */ + return; + } + + lv_dropdown_clear_options(year_dropdown); + lv_dropdown_set_options(year_dropdown, years_list); + + lv_obj_invalidate(parent); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_t * calendar = lv_obj_get_parent(obj); + lv_obj_move_to_index(obj, 0); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_obj_t * year_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(year_dd, year_list); + lv_obj_add_event_cb(year_dd, year_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(year_dd, 1); + + lv_obj_t * month_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(month_dd, month_list); + lv_obj_add_event_cb(month_dd, month_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(month_dd, 1); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + /*Refresh the drop downs*/ + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint32_t sel = lv_dropdown_get_selected(dropdown); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + newd.month = sel + 1; + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); +} + +static void year_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint32_t sel = lv_dropdown_get_selected(dropdown); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + + /* Get the first year on the options list + * NOTE: Assumes the first 4 digits in the option list are numbers */ + const char * year_p = lv_dropdown_get_options(dropdown); + const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + + (year_p[3] - '0'); + + lv_calendar_date_t newd = *d; + newd.year = year - sel; + + lv_calendar_set_showed_date(calendar, newd.year, newd.month); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); + + lv_obj_t * year_dd = lv_obj_get_child(header, 0); + + /* Get the first year on the options list + * NOTE: Assumes the first 4 digits in the option list are numbers */ + const char * year_p = lv_dropdown_get_options(year_dd); + const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + + (year_p[3] - '0'); + + lv_dropdown_set_selected(year_dd, year - cur_date->year); + + lv_obj_t * month_dd = lv_obj_get_child(header, 1); + lv_dropdown_set_selected(month_dd, cur_date->month - 1); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h new file mode 100644 index 0000000..1ca8776 --- /dev/null +++ b/libraries/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h @@ -0,0 +1,62 @@ +/** + * @file lv_calendar_header_dropdown.h + * + */ + +#ifndef LV_CALENDAR_HEADER_DROPDOWN_H +#define LV_CALENDAR_HEADER_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN + +#if LV_USE_DROPDOWN == 0 +#error "LV_USE_DROPDOWN needs to be enabled" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_dropdown_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent); + +/** + * Sets a custom calendar year list + * @param parent pointer to a calendar object + * @param years_list pointer to an const char array with the years list, see lv_dropdown set_options for more information. + * E.g. `const char * years = "2023\n2022\n2021\n2020\n2019" + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_DROPDOWN_H*/ diff --git a/libraries/lvgl/src/widgets/canvas/lv_canvas.c b/libraries/lvgl/src/widgets/canvas/lv_canvas.c new file mode 100644 index 0000000..4ce2017 --- /dev/null +++ b/libraries/lvgl/src/widgets/canvas/lv_canvas.c @@ -0,0 +1,363 @@ +/** + * @file lv_canvas.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_canvas.h" +#if LV_USE_CANVAS != 0 +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_refr.h" +#include "../../display/lv_display.h" +#include "../../draw/sw/lv_draw_sw.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/cache/lv_cache.h" +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_canvas_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_canvas_class = { + .constructor_cb = lv_canvas_constructor, + .destructor_cb = lv_canvas_destructor, + .instance_size = sizeof(lv_canvas_t), + .base_class = &lv_image_class, + .name = "canvas", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_canvas_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + uint32_t stride = lv_draw_buf_width_to_stride(w, cf); + lv_draw_buf_init(&canvas->static_buf, w, h, cf, stride, buf, stride * h); + canvas->draw_buf = &canvas->static_buf; + + const void * src = lv_image_get_src(obj); + if(src) { + lv_image_cache_drop(src); + } + + lv_image_set_src(obj, canvas->draw_buf); + lv_image_cache_drop(canvas->draw_buf); +} + +void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(draw_buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + canvas->draw_buf = draw_buf; + + const void * src = lv_image_get_src(obj); + if(src) { + lv_image_cache_drop(src); + } + + lv_image_set_src(obj, draw_buf); + lv_image_cache_drop(draw_buf); +} + +void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_draw_buf_t * draw_buf = canvas->draw_buf; + + lv_color_format_t cf = draw_buf->header.cf; + uint32_t stride = draw_buf->header.stride; + uint8_t * data = lv_draw_buf_goto_xy(draw_buf, x, y); + + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + /*Indexed image bpp could be less than 8, calculate again*/ + uint8_t * buf = (uint8_t *)canvas->draw_buf->data; + buf += 8; + buf += y * stride; + buf += x >> 3; + uint32_t bit = 7 - (x & 0x7); + uint32_t c_int = color.blue; + + *buf &= ~(1 << bit); + *buf |= c_int << bit; + } + else if(cf == LV_COLOR_FORMAT_A8) { + *data = opa; + } + else if(cf == LV_COLOR_FORMAT_RGB565) { + lv_color16_t * buf = (lv_color16_t *)data; + buf->red = color.red >> 3; + buf->green = color.green >> 2; + buf->blue = color.blue >> 3; + } + else if(cf == LV_COLOR_FORMAT_RGB888) { + data[2] = color.red; + data[1] = color.green; + data[0] = color.blue; + } + else if(cf == LV_COLOR_FORMAT_XRGB8888) { + data[2] = color.red; + data[1] = color.green; + data[0] = color.blue; + data[3] = 0xFF; + } + else if(cf == LV_COLOR_FORMAT_ARGB8888) { + lv_color32_t * buf = (lv_color32_t *)data; + buf->red = color.red; + buf->green = color.green; + buf->blue = color.blue; + buf->alpha = opa; + } + lv_obj_invalidate(obj); +} + +void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + lv_draw_buf_set_palette(canvas->draw_buf, index, color); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + return canvas->draw_buf; +} + +lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_color32_t ret = { 0 }; + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return ret; + + lv_image_header_t * header = &canvas->draw_buf->header; + const uint8_t * px = lv_draw_buf_goto_xy(canvas->draw_buf, x, y); + + switch(header->cf) { + case LV_COLOR_FORMAT_ARGB8888: + ret = *(lv_color32_t *)px; + break; + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_XRGB8888: + ret.red = px[2]; + ret.green = px[1]; + ret.blue = px[0]; + ret.alpha = 0xFF; + break; + case LV_COLOR_FORMAT_RGB565: { + lv_color16_t * c16 = (lv_color16_t *) px; + ret.red = (c16[x].red * 2106) >> 8; /*To make it rounded*/ + ret.green = (c16[x].green * 1037) >> 8; + ret.blue = (c16[x].blue * 2106) >> 8; + ret.alpha = 0xFF; + break; + } + case LV_COLOR_FORMAT_A8: { + lv_color_t alpha_color = lv_obj_get_style_image_recolor(obj, LV_PART_MAIN); + ret.red = alpha_color.red; + ret.green = alpha_color.green; + ret.blue = alpha_color.blue; + ret.alpha = px[0]; + break; + } + default: + lv_memzero(&ret, sizeof(lv_color32_t)); + break; + } + + return ret; +} + +lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + return (lv_image_dsc_t *)canvas->draw_buf; +} + +const void * lv_canvas_get_buf(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf) + return canvas->draw_buf->unaligned_data; + + return NULL; +} + +/*===================== + * Other functions + *====================*/ + +void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * dest_buf, + const lv_area_t * dest_area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(canvas_area && dest_buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + LV_ASSERT_MSG(canvas->draw_buf->header.cf != dest_buf->header.cf, "Color formats must be the same"); + + lv_draw_buf_copy(canvas->draw_buf, canvas_area, dest_buf, dest_area); +} + +void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_draw_buf_t * draw_buf = canvas->draw_buf; + if(draw_buf == NULL) return; + + lv_image_header_t * header = &draw_buf->header; + uint32_t x; + uint32_t y; + + uint32_t stride = header->stride; + uint8_t * data = draw_buf->data; + if(header->cf == LV_COLOR_FORMAT_RGB565) { + uint16_t c16 = lv_color_to_u16(color); + for(y = 0; y < header->h; y++) { + uint16_t * buf16 = (uint16_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf16[x] = c16; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_XRGB8888 || header->cf == LV_COLOR_FORMAT_ARGB8888) { + uint32_t c32 = lv_color_to_u32(color); + if(header->cf == LV_COLOR_FORMAT_ARGB8888) { + c32 &= 0x00ffffff; + c32 |= (uint32_t)opa << 24; + } + for(y = 0; y < header->h; y++) { + uint32_t * buf32 = (uint32_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf32[x] = c32; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_RGB888) { + for(y = 0; y < header->h; y++) { + uint8_t * buf8 = (uint8_t *)(data + y * stride); + for(x = 0; x < header->w * 3; x += 3) { + buf8[x + 0] = color.blue; + buf8[x + 1] = color.green; + buf8[x + 2] = color.red; + } + } + } + else { + for(y = 0; y < header->h; y++) { + for(x = 0; x < header->w; x++) { + lv_canvas_set_px(obj, x, y, color, opa); + } + } + } + + lv_obj_invalidate(obj); +} + +void lv_canvas_init_layer(lv_obj_t * obj, lv_layer_t * layer) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(layer); + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + lv_image_header_t * header = &canvas->draw_buf->header; + lv_area_t canvas_area = {0, 0, header->w - 1, header->h - 1}; + lv_memzero(layer, sizeof(*layer)); + + layer->draw_buf = canvas->draw_buf; + layer->color_format = header->cf; + layer->buf_area = canvas_area; + layer->_clip_area = canvas_area; +} + +void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer) +{ + while(layer->draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch_layer(lv_obj_get_display(canvas), layer); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_UNUSED(obj); +} + +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + lv_image_cache_drop(&canvas->draw_buf); +} + +#endif diff --git a/libraries/lvgl/src/widgets/canvas/lv_canvas.h b/libraries/lvgl/src/widgets/canvas/lv_canvas.h new file mode 100644 index 0000000..9451327 --- /dev/null +++ b/libraries/lvgl/src/widgets/canvas/lv_canvas.h @@ -0,0 +1,193 @@ +/** + * @file lv_canvas.h + * + */ + +#ifndef LV_CANVAS_H +#define LV_CANVAS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_CANVAS != 0 + +#include "../image/lv_image.h" +#include "../../draw/lv_draw_image.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_canvas_class; + +/*Data of canvas*/ +typedef struct { + lv_image_t img; + lv_draw_buf_t * draw_buf; + lv_draw_buf_t static_buf; +} lv_canvas_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a canvas object + * @param parent pointer to an object, it will be the parent of the new canvas + * @return pointer to the created canvas + */ +lv_obj_t * lv_canvas_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a buffer for the canvas. + * Use `lv_canvas_set_draw_buf` instead if you need to set a buffer with alignment requirement. + * @param buf a buffer where the content of the canvas will be. + * The required size is (lv_image_color_format_get_px_size(cf) * w) / 8 * h) + * It can be allocated with `lv_malloc()` or + * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or + * it can be an address in RAM or external SRAM + * @param canvas pointer to a canvas object + * @param w width of the canvas + * @param h height of the canvas + * @param cf color format. `LV_COLOR_FORMAT...` + */ +void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf); + +/** + * Set a draw buffer for the canvas. A draw buffer either can be allocated by `lv_draw_buf_create()` + * or defined statically by `LV_DRAW_BUF_DEFINE`. When buffer start address and stride has alignment + * requirement, it's recommended to use `lv_draw_buf_create`. + * @param obj pointer to a canvas object + * @param draw_buf pointer to a draw buffer + */ +void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); + +/** + * Set a pixel's color and opacity + * @param obj pointer to a canvas + * @param x X coordinate of the pixel + * @param y Y coordinate of the pixel + * @param color the color + * @param opa the opacity + * @note The following color formats are supported + * LV_COLOR_FORMAT_I1/2/4/8, LV_COLOR_FORMAT_A8, + * LV_COLOR_FORMAT_RGB565, LV_COLOR_FORMAT_RGB888, + * LV_COLOR_FORMAT_XRGB8888, LV_COLOR_FORMAT_ARGB8888 + */ +void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa); + +/** + * Set the palette color of a canvas for index format. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` + * @param obj pointer to canvas object + * @param index the palette color to set: + * - for `LV_COLOR_FORMAT_I1`: 0..1 + * - for `LV_COLOR_FORMAT_I2`: 0..3 + * - for `LV_COLOR_FORMAT_I4`: 0..15 + * - for `LV_COLOR_FORMAT_I8`: 0..255 + * @param color the color to set + */ +void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color); + +/*===================== + * Getter functions + *====================*/ + +lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj); + +/** + * Get a pixel's color and opacity + * @param obj pointer to a canvas + * @param x X coordinate of the pixel + * @param y Y coordinate of the pixel + * @return ARGB8888 color of the pixel + */ +lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Get the image of the canvas as a pointer to an `lv_image_dsc_t` variable. + * @param canvas pointer to a canvas object + * @return pointer to the image descriptor. + */ +lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * canvas); + +/** + * Return the pointer for the buffer. + * It's recommended to use this function instead of the buffer form the + * return value of lv_canvas_get_image() as is can be aligned + * @param canvas pointer to a canvas object + * @return pointer to the buffer + */ +const void * lv_canvas_get_buf(lv_obj_t * canvas); + +/*===================== + * Other functions + *====================*/ + +/** + * Copy a buffer to the canvas + * @param canvas pointer to a canvas object + * @param canvas_area the area of the canvas to copy + * @param dest_buf pointer to a buffer to store the copied data + * @param dest_area the area of the destination buffer to copy to. If omitted NULL, copy to the whole `dest_buf` + */ +void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * dest_buf, + const lv_area_t * dest_area); + +/** + * Fill the canvas with color + * @param canvas pointer to a canvas + * @param color the background color + * @param opa the desired opacity + */ +void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa); + +/** + * Initialize a layer to use LVGL's generic draw functions (lv_draw_rect/label/...) on the canvas. + * Needs to be usd in pair with `lv_canvas_finish_layer`. + * @param canvas pointer to a canvas + * @param layer pointer to a layer variable to initialize + */ +void lv_canvas_init_layer(lv_obj_t * canvas, lv_layer_t * layer); + +/** + * Wait until all the drawings are finished on layer. + * Needs to be usd in pair with `lv_canvas_init_layer`. + * @param canvas pointer to a canvas + * @param layer pointer to a layer to finalize + */ +void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer); + +/********************** + * MACROS + **********************/ + +#define LV_CANVAS_BUF_SIZE(w, h, bpp, stride) (((((w * bpp + 7) >> 3) + stride - 1) & ~(stride - 1)) * h + LV_DRAW_BUF_ALIGN) + +/** + * Just a wrapper to `LV_CANVAS_BUF_SIZE` for bindings. + */ +static inline uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride) +{ + return (uint32_t)LV_CANVAS_BUF_SIZE(w, h, bpp, stride); +} + +#endif /*LV_USE_CANVAS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CANVAS_H*/ diff --git a/libraries/lvgl/src/widgets/chart/lv_chart.c b/libraries/lvgl/src/widgets/chart/lv_chart.c new file mode 100644 index 0000000..782b7c5 --- /dev/null +++ b/libraries/lvgl/src/widgets/chart/lv_chart.c @@ -0,0 +1,1341 @@ +/** + * @file lv_chart.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_chart.h" +#if LV_USE_CHART != 0 + +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_chart_class) + +#define LV_CHART_HDIV_DEF 3 +#define LV_CHART_VDIV_DEF 5 +#define LV_CHART_POINT_CNT_DEF 10 +#define LV_CHART_LABEL_MAX_TEXT_LENGTH 16 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e); + +static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer); +static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer); +static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x); +static void invalidate_point(lv_obj_t * obj, uint32_t i); +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_chart_class = { + .constructor_cb = lv_chart_constructor, + .destructor_cb = lv_chart_destructor, + .event_cb = lv_chart_event, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_chart_t), + .base_class = &lv_obj_class, + .name = "chart", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_chart_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->type == type) return; + + if(chart->type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + _LV_LL_READ_BACK(&chart->series_ll, ser) { + lv_free(ser->x_points); + ser->x_points = NULL; + } + } + + if(type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + _LV_LL_READ_BACK(&chart->series_ll, ser) { + ser->x_points = lv_malloc(sizeof(lv_point_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + if(ser->x_points == NULL) return; + } + } + + chart->type = type; + + lv_chart_refresh(obj); +} + +void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt == cnt) return; + + lv_chart_series_t * ser; + + if(cnt < 1) cnt = 1; + + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(chart->type == LV_CHART_TYPE_SCATTER) { + if(!ser->x_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->x_points); + } + if(!ser->y_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->y_points); + ser->start_point = 0; + } + + chart->point_cnt = cnt; + + lv_chart_refresh(obj); +} + +void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + max = max == min ? max + 1 : max; + + lv_chart_t * chart = (lv_chart_t *)obj; + switch(axis) { + case LV_CHART_AXIS_PRIMARY_Y: + chart->ymin[0] = min; + chart->ymax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_Y: + chart->ymin[1] = min; + chart->ymax[1] = max; + break; + case LV_CHART_AXIS_PRIMARY_X: + chart->xmin[0] = min; + chart->xmax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_X: + chart->xmin[1] = min; + chart->xmax[1] = max; + break; + default: + LV_LOG_WARN("Invalid axis: %d", axis); + return; + } + + lv_chart_refresh(obj); +} + +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->update_mode == update_mode) return; + + chart->update_mode = update_mode; + lv_obj_invalidate(obj); +} + +void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->hdiv_cnt == hdiv && chart->vdiv_cnt == vdiv) return; + + chart->hdiv_cnt = hdiv; + chart->vdiv_cnt = vdiv; + + lv_obj_invalidate(obj); +} + +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->type; +} + +uint32_t lv_chart_get_point_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->point_cnt; +} + +uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_ASSERT_NULL(ser); + LV_UNUSED(obj); + + return ser->start_point; +} + +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(ser); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) { + LV_LOG_WARN("Invalid index: %"LV_PRIu32, id); + p_out->x = 0; + p_out->y = 0; + return; + } + + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + if(chart->type == LV_CHART_TYPE_LINE) { + p_out->x = (w * id) / (chart->point_cnt - 1); + } + else if(chart->type == LV_CHART_TYPE_SCATTER) { + p_out->x = lv_map(ser->x_points[id], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + } + else if(chart->type == LV_CHART_TYPE_BAR) { + uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); + + /*Gap between the columns on adjacent X ticks*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + + p_out->x = (int32_t)((int32_t)(w - block_w) * id) / (chart->point_cnt - 1); + lv_chart_series_t * ser_i = NULL; + uint32_t ser_idx = 0; + _LV_LL_READ_BACK(&chart->series_ll, ser_i) { + if(ser_i == ser) break; + ser_idx++; + } + + p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt; + p_out->x += block_w * ser_idx / ser_cnt; + + int32_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt; + p_out->x += col_w / 2; + } + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + p_out->x -= lv_obj_get_scroll_left(obj); + + uint32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + id = ((int32_t)start_point + id) % chart->point_cnt; + int32_t temp_y = 0; + temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h; + temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + p_out->y = h - temp_y; + p_out->y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + p_out->y -= lv_obj_get_scroll_top(obj); +} + +void lv_chart_refresh(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); +} + +/*====================== + * Series + *=====================*/ + +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis) +{ + LV_LOG_INFO("begin"); + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + + /* Allocate space for a new series and add it to the chart series linked list */ + lv_chart_series_t * ser = _lv_ll_ins_tail(&chart->series_ll); + LV_ASSERT_MALLOC(ser); + if(ser == NULL) return NULL; + + /* Allocate memory for point_cnt points, handle failure below */ + ser->y_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->y_points); + + if(chart->type == LV_CHART_TYPE_SCATTER) { + ser->x_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + if(NULL == ser->x_points) { + lv_free(ser->y_points); + _lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + return NULL; + } + } + else { + ser->x_points = NULL; + } + + if(ser->y_points == NULL) { + _lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + return NULL; + } + + /* Set series properties on successful allocation */ + ser->color = color; + ser->start_point = 0; + ser->y_ext_buf_assigned = false; + ser->hidden = 0; + ser->x_axis_sec = axis & LV_CHART_AXIS_SECONDARY_X ? 1 : 0; + ser->y_axis_sec = axis & LV_CHART_AXIS_SECONDARY_Y ? 1 : 0; + + uint32_t i; + const int32_t def = LV_CHART_POINT_NONE; + int32_t * p_tmp = ser->y_points; + for(i = 0; i < chart->point_cnt; i++) { + *p_tmp = def; + p_tmp++; + } + + return ser; +} + +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(series); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(!series->y_ext_buf_assigned && series->y_points) lv_free(series->y_points); + if(!series->x_ext_buf_assigned && series->x_points) lv_free(series->x_points); + + _lv_ll_remove(&chart->series_ll, series); + lv_free(series); + + return; +} + +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->hidden = hide ? 1 : 0; + lv_chart_refresh(chart); +} + +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->color = color; + lv_chart_refresh(chart); +} + +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) return; + ser->start_point = id; +} + +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * obj, const lv_chart_series_t * ser) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(ser == NULL) return _lv_ll_get_head(&chart->series_ll); + else return _lv_ll_get_next(&chart->series_ll, ser); +} + +/*===================== + * Cursor + *====================*/ + +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_cursor_t * cursor = _lv_ll_ins_head(&chart->cursor_ll); + LV_ASSERT_MALLOC(cursor); + if(cursor == NULL) return NULL; + + lv_point_set(&cursor->pos, LV_CHART_POINT_NONE, LV_CHART_POINT_NONE); + cursor->point_id = LV_CHART_POINT_NONE; + cursor->pos_set = 0; + cursor->color = color; + cursor->dir = dir; + + return cursor; +} + +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->pos = *pos; + cursor->pos_set = 1; + lv_chart_refresh(chart); +} + +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, uint32_t point_id) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->point_id = point_id; + cursor->pos_set = 0; + if(ser == NULL) ser = lv_chart_get_series_next(chart, NULL); + cursor->ser = ser; + lv_chart_refresh(chart); +} + +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + return cursor->pos; +} + +/*===================== + * Set/Get value(s) + *====================*/ + +void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + uint32_t i; + for(i = 0; i < chart->point_cnt; i++) { + ser->y_points[i] = value; + } + ser->start_point = 0; + lv_chart_refresh(obj); +} + +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + ser->y_points[ser->start_point] = value; + invalidate_point(obj, ser->start_point); + ser->start_point = (ser->start_point + 1) % chart->point_cnt; + invalidate_point(obj, ser->start_point); +} + +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + ser->x_points[ser->start_point] = x_value; + ser->y_points[ser->start_point] = y_value; + ser->start_point = (ser->start_point + 1) % chart->point_cnt; + invalidate_point(obj, ser->start_point); +} + +void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(id >= chart->point_cnt) return; + ser->y_points[id] = value; + invalidate_point(obj, id); +} + +void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, + int32_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + if(id >= chart->point_cnt) return; + ser->x_points[id] = x_value; + ser->y_points[id] = y_value; + invalidate_point(obj, id); +} + +void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->y_ext_buf_assigned && ser->y_points) lv_free(ser->y_points); + ser->y_ext_buf_assigned = true; + ser->y_points = array; + lv_obj_invalidate(obj); +} + +void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->x_ext_buf_assigned && ser->x_points) lv_free(ser->x_points); + ser->x_ext_buf_assigned = true; + ser->x_points = array; + lv_obj_invalidate(obj); +} + +int32_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->y_points; +} + +int32_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->x_points; +} + +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->pressed_point_id; +} + +int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + int32_t x_ofs = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + if(chart->type == LV_CHART_TYPE_BAR) { + lv_obj_update_layout(obj); + /*Gap between the columns on ~adjacent X*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t block_w = (w + block_gap) / (chart->point_cnt); + + x_ofs += (block_w - block_gap) / 2; + } + + return x_ofs; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + + _lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); + _lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); + + chart->ymin[0] = 0; + chart->xmin[0] = 0; + chart->ymin[1] = 0; + chart->xmin[1] = 0; + chart->ymax[0] = 100; + chart->xmax[0] = 100; + chart->ymax[1] = 100; + chart->xmax[1] = 100; + + chart->hdiv_cnt = LV_CHART_HDIV_DEF; + chart->vdiv_cnt = LV_CHART_VDIV_DEF; + chart->point_cnt = LV_CHART_POINT_CNT_DEF; + chart->pressed_point_id = LV_CHART_POINT_NONE; + chart->type = LV_CHART_TYPE_LINE; + chart->update_mode = LV_CHART_UPDATE_MODE_SHIFT; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_series_t * ser; + while(chart->series_ll.head) { + ser = _lv_ll_get_head(&chart->series_ll); + if(!ser) continue; + + if(!ser->y_ext_buf_assigned) lv_free(ser->y_points); + if(!ser->x_ext_buf_assigned) lv_free(ser->x_points); + + _lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + } + _lv_ll_clear(&chart->series_ll); + + lv_chart_cursor_t * cur; + while(chart->cursor_ll.head) { + cur = _lv_ll_get_head(&chart->cursor_ll); + _lv_ll_remove(&chart->cursor_ll, cur); + lv_free(cur); + } + _lv_ll_clear(&chart->cursor_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res; + + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(code == LV_EVENT_PRESSED) { + lv_indev_t * indev = lv_indev_active(); + lv_point_t p; + lv_indev_get_point(indev, &p); + + p.x -= obj->coords.x1; + uint32_t id = get_index_from_x(obj, p.x + lv_obj_get_scroll_left(obj)); + if(id != (uint32_t)chart->pressed_point_id) { + invalidate_point(obj, id); + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = id; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + } + } + else if(code == LV_EVENT_RELEASED) { + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = LV_CHART_POINT_NONE; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_layer_t * layer = lv_event_get_layer(e); + draw_div_lines(obj, layer); + + if(_lv_ll_is_empty(&chart->series_ll) == false) { + if(chart->type == LV_CHART_TYPE_LINE) draw_series_line(obj, layer); + else if(chart->type == LV_CHART_TYPE_BAR) draw_series_bar(obj, layer); + else if(chart->type == LV_CHART_TYPE_SCATTER) draw_series_scatter(obj, layer); + } + + draw_cursors(obj, layer); + } +} + +static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + lv_area_t series_clip_area; + bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); + if(mask_ret == false) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = series_clip_area; + + int16_t i; + int16_t i_start; + int16_t i_end; + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + lv_opa_t border_opa = lv_obj_get_style_border_opa(obj, LV_PART_MAIN); + int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, LV_PART_MAIN); + + int32_t scroll_left = lv_obj_get_scroll_left(obj); + int32_t scroll_top = lv_obj_get_scroll_top(obj); + if(chart->hdiv_cnt != 0) { + int32_t y_ofs = obj->coords.y1 + pad_top - scroll_top; + line_dsc.p1.x = obj->coords.x1; + line_dsc.p2.x = obj->coords.x2; + + i_start = 0; + i_end = chart->hdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_TOP) && (lv_obj_get_style_pad_top(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_BOTTOM) && (lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + line_dsc.p1.y = (int32_t)((int32_t)h * i) / (chart->hdiv_cnt - 1); + line_dsc.p1.y += y_ofs; + line_dsc.p2.y = line_dsc.p1.y; + line_dsc.base.id1 = i; + + lv_draw_line(layer, &line_dsc); + } + } + + if(chart->vdiv_cnt != 0) { + int32_t x_ofs = obj->coords.x1 + pad_left - scroll_left; + line_dsc.p1.y = obj->coords.y1; + line_dsc.p2.y = obj->coords.y2; + i_start = 0; + i_end = chart->vdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_LEFT) && (lv_obj_get_style_pad_left(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_RIGHT) && (lv_obj_get_style_pad_right(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + line_dsc.p1.x = (int32_t)((int32_t)w * i) / (chart->vdiv_cnt - 1); + line_dsc.p1.x += x_ofs; + line_dsc.p2.x = line_dsc.p1.x; + line_dsc.base.id1 = i; + + lv_draw_line(layer, &line_dsc); + } + } + + layer->_clip_area = clip_area_ori; +} + +static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt < 2) return; + + uint32_t i; + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); + int32_t y_ofs = obj->coords.y1 + pad_top - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_area_t series_clip_area; + bool mask_ret = _lv_area_intersect(&series_clip_area, &obj->coords, &layer->_clip_area); + if(mask_ret == false) return; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + /*Do not bother with line ending is the point will over it*/ + if(LV_MIN(point_w, point_h) > line_dsc.width / 2) line_dsc.raw_end = 1; + if(line_dsc.width == 1) line_dsc.raw_end = 1; + + /*If there are at least as many points as pixels then draw only vertical lines*/ + bool crowded_mode = (int32_t)chart->point_cnt >= w; + + line_dsc.base.id1 = _lv_ll_get_len(&chart->series_ll) - 1; + point_dsc_default.base.id1 = line_dsc.base.id1; + /*Go through all data lines*/ + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) { + line_dsc.base.id1--; + point_dsc_default.base.id1--; + continue; + } + line_dsc.color = ser->color; + point_dsc_default.bg_color = ser->color; + line_dsc.base.id2 = 0; + point_dsc_default.base.id2 = 0; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + line_dsc.p1.x = x_ofs; + line_dsc.p2.x = x_ofs; + + int32_t p_act = start_point; + int32_t p_prev = start_point; + int32_t y_tmp = (int32_t)((int32_t)ser->y_points[p_prev] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + line_dsc.p2.y = h - y_tmp + y_ofs; + + lv_value_precise_t y_min = line_dsc.p2.y; + lv_value_precise_t y_max = line_dsc.p2.y; + + for(i = 0; i < chart->point_cnt; i++) { + line_dsc.p1.x = line_dsc.p2.x; + line_dsc.p1.y = line_dsc.p2.y; + + if(line_dsc.p1.x > clip_area_ori.x2 + point_w + 1) break; + line_dsc.p2.x = (lv_value_precise_t)((w * i) / (chart->point_cnt - 1)) + x_ofs; + + p_act = (start_point + i) % chart->point_cnt; + + y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + line_dsc.p2.y = h - y_tmp + y_ofs; + + if(line_dsc.p2.x < clip_area_ori.x1 - point_w - 1) { + p_prev = p_act; + continue; + } + + /*Don't draw the first point. A second point is also required to draw the line*/ + if(i != 0) { + if(crowded_mode) { + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + /*Draw only one vertical line between the min and max y-values on the same x-value*/ + y_max = LV_MAX(y_max, line_dsc.p2.y); + y_min = LV_MIN(y_min, line_dsc.p2.y); + if(line_dsc.p1.x != line_dsc.p2.x) { + lv_value_precise_t y_cur = line_dsc.p2.y; + line_dsc.p2.x--; /*It's already on the next x value*/ + line_dsc.p1.x = line_dsc.p2.x; + line_dsc.p1.y = y_min; + line_dsc.p2.y = y_max; + if(line_dsc.p1.y == line_dsc.p2.y) line_dsc.p2.y++; /*If they are the same no line will be drawn*/ + lv_draw_line(layer, &line_dsc); + line_dsc.p2.x++; /*Compensate the previous x--*/ + y_min = y_cur; /*Start the line of the next x from the current last y*/ + y_max = y_cur; + } + } + } + else { + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p1.x - point_w; + point_area.x2 = (int32_t)line_dsc.p1.x + point_w; + point_area.y1 = (int32_t)line_dsc.p1.y - point_h; + point_area.y2 = (int32_t)line_dsc.p1.y + point_h; + + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + line_dsc.base.id2 = i; + lv_draw_line(layer, &line_dsc); + } + + if(point_w && point_h && ser->y_points[p_prev] != LV_CHART_POINT_NONE) { + point_dsc_default.base.id2 = i - 1; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + + } + p_prev = p_act; + } + + /*Draw the last point*/ + if(!crowded_mode && i == chart->point_cnt) { + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p2.x - point_w; + point_area.x2 = (int32_t)line_dsc.p2.x + point_w; + point_area.y1 = (int32_t)line_dsc.p2.y - point_h; + point_area.y2 = (int32_t)line_dsc.p2.y + point_h; + point_dsc_default.base.id2 = i - 1; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + + point_dsc_default.base.id1--; + line_dsc.base.id1--; + } + + layer->_clip_area = clip_area_ori; +} + +static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) +{ + + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_chart_t * chart = (lv_chart_t *)obj; + + uint32_t i; + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t x_ofs = obj->coords.x1 + pad_left + border_width - lv_obj_get_scroll_left(obj); + int32_t y_ofs = obj->coords.y1 + pad_top + border_width - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + /*Do not bother with line ending is the point will over it*/ + if(LV_MIN(point_w, point_h) > line_dsc.width / 2) line_dsc.raw_end = 1; + if(line_dsc.width == 1) line_dsc.raw_end = 1; + + /*Go through all data lines*/ + _LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) continue; + line_dsc.color = ser->color; + point_dsc_default.bg_color = ser->color; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + line_dsc.p1.x = x_ofs; + line_dsc.p2.x = x_ofs; + + int32_t p_act = start_point; + int32_t p_prev = start_point; + if(ser->y_points[p_act] != LV_CHART_POINT_CNT_DEF) { + line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + line_dsc.p2.x += x_ofs; + + line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + line_dsc.p2.y = h - line_dsc.p2.y; + line_dsc.p2.y += y_ofs; + } + else { + line_dsc.p2.x = (lv_value_precise_t)LV_COORD_MIN; + line_dsc.p2.y = (lv_value_precise_t)LV_COORD_MIN; + } + + for(i = 0; i < chart->point_cnt; i++) { + line_dsc.p1.x = line_dsc.p2.x; + line_dsc.p1.y = line_dsc.p2.y; + + p_act = (start_point + i) % chart->point_cnt; + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + line_dsc.p2.y = h - line_dsc.p2.y; + line_dsc.p2.y += y_ofs; + + line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + line_dsc.p2.x += x_ofs; + } + else { + p_prev = p_act; + continue; + } + + /*Don't draw the first point. A second point is also required to draw the line*/ + if(i != 0) { + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p1.x - point_w; + point_area.x2 = (int32_t)line_dsc.p1.x + point_w; + point_area.y1 = (int32_t)line_dsc.p1.y - point_h; + point_area.y2 = (int32_t)line_dsc.p1.y + point_h; + + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + line_dsc.base.id2 = i; + lv_draw_line(layer, &line_dsc); + if(point_w && point_h) { + point_dsc_default.base.id2 = i; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + + p_prev = p_act; + } + + /*Draw the last point*/ + if(i == chart->point_cnt) { + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p2.x - point_w; + point_area.x2 = (int32_t)line_dsc.p2.x + point_w; + point_area.y1 = (int32_t)line_dsc.p2.y - point_h; + point_area.y2 = (int32_t)line_dsc.p2.y + point_h; + + point_dsc_default.base.id2 = i; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + } + line_dsc.base.id1++; + point_dsc_default.base.id1++; + layer->_clip_area = clip_area_ori; + } +} + +static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_area_t clip_area; + if(_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area) == false) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_chart_t * chart = (lv_chart_t *)obj; + + uint32_t i; + lv_area_t col_a; + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t y_tmp; + lv_chart_series_t * ser; + uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); /*Gap between the column on ~adjacent X*/ + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); /*Gap between the columns on the ~same X*/ + int32_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt; + if(col_w < 1) col_w = 1; + + int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; + int32_t y_ofs = pad_top - lv_obj_get_scroll_top(obj) + border_w; + + lv_draw_rect_dsc_t col_dsc; + lv_draw_rect_dsc_init(&col_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &col_dsc); + col_dsc.bg_grad.dir = LV_GRAD_DIR_NONE; + col_dsc.bg_opa = LV_OPA_COVER; + + /*Make the cols longer with `radius` to clip the rounding from the bottom*/ + col_a.y2 = obj->coords.y2 + col_dsc.radius; + + /*Go through all points*/ + for(i = 0; i < chart->point_cnt; i++) { + int32_t x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs; + col_dsc.base.id2 = i; + col_dsc.base.id1 = 0; + + /*Draw the current point of all data line*/ + _LV_LL_READ(&chart->series_ll, ser) { + if(ser->hidden) continue; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + col_a.x1 = x_act; + col_a.x2 = col_a.x1 + col_w - 1; + x_act += col_w + ser_gap; + + if(col_a.x2 < clip_area.x1) { + col_dsc.base.id1++; + continue; + } + if(col_a.x1 > clip_area.x2) break; + + col_dsc.bg_color = ser->color; + + int32_t p_act = (start_point + i) % chart->point_cnt; + y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + col_a.y1 = h - y_tmp + obj->coords.y1 + y_ofs; + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_draw_rect(layer, &col_dsc, &col_a); + } + col_dsc.base.id1++; + } + } + layer->_clip_area = clip_area_ori; +} + +static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(_lv_ll_is_empty(&chart->cursor_ll)) return; + + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &layer->_clip_area, &obj->coords)) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_chart_cursor_t * cursor; + + lv_draw_line_dsc_t line_dsc_ori; + lv_draw_line_dsc_init(&line_dsc_ori); + lv_obj_init_draw_line_dsc(obj, LV_PART_CURSOR, &line_dsc_ori); + + lv_draw_rect_dsc_t point_dsc_ori; + lv_draw_rect_dsc_init(&point_dsc_ori); + lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &point_dsc_ori); + + lv_draw_line_dsc_t line_dsc; + lv_draw_rect_dsc_t point_dsc_tmp; + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + int32_t point_h = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + + /*Go through all cursor lines*/ + _LV_LL_READ_BACK(&chart->cursor_ll, cursor) { + lv_memcpy(&line_dsc, &line_dsc_ori, sizeof(lv_draw_line_dsc_t)); + lv_memcpy(&point_dsc_tmp, &point_dsc_ori, sizeof(lv_draw_rect_dsc_t)); + line_dsc.color = cursor->color; + point_dsc_tmp.bg_color = cursor->color; + + int32_t cx; + int32_t cy; + if(cursor->pos_set) { + cx = cursor->pos.x; + cy = cursor->pos.y; + } + else { + if(cursor->point_id == LV_CHART_POINT_NONE) continue; + lv_point_t p; + lv_chart_get_point_pos_by_id(obj, cursor->ser, cursor->point_id, &p); + cx = p.x; + cy = p.y; + } + + cx += obj->coords.x1; + cy += obj->coords.y1; + + lv_area_t point_area; + bool draw_point = point_w && point_h; + point_area.x1 = cx - point_w; + point_area.x2 = cx + point_w; + point_area.y1 = cy - point_h; + point_area.y2 = cy + point_h; + + if(cursor->dir & LV_DIR_HOR) { + line_dsc.p1.x = cursor->dir & LV_DIR_LEFT ? obj->coords.x1 : cx; + line_dsc.p1.y = cy; + line_dsc.p2.x = cursor->dir & LV_DIR_RIGHT ? obj->coords.x2 : cx; + line_dsc.p2.y = line_dsc.p1.y; + + line_dsc.base.id2 = 0; + point_dsc_tmp.base.id2 = 0; + + lv_draw_line(layer, &line_dsc); + + if(draw_point) { + lv_draw_rect(layer, &point_dsc_tmp, &point_area); + } + } + + if(cursor->dir & LV_DIR_VER) { + line_dsc.p1.x = cx; + line_dsc.p1.y = cursor->dir & LV_DIR_TOP ? obj->coords.y1 : cy; + line_dsc.p2.x = line_dsc.p1.x; + line_dsc.p2.y = cursor->dir & LV_DIR_BOTTOM ? obj->coords.y2 : cy; + + line_dsc.base.id2 = 1; + point_dsc_tmp.base.id2 = 1; + + lv_draw_line(layer, &line_dsc); + + if(draw_point) { + lv_draw_rect(layer, &point_dsc_tmp, &point_area); + } + } + line_dsc_ori.base.id1++; + point_dsc_ori.base.id1++; + } + + layer->_clip_area = clip_area_ori; +} + +/** + * Get the nearest index to an X coordinate + * @param chart pointer to a chart object + * @param coord the coordination of the point relative to the series area. + * @return the found index + */ +static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + int32_t w = lv_obj_get_content_width(obj); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + x -= pad_left; + + if(x < 0) return 0; + if(x > w) return chart->point_cnt - 1; + if(chart->type == LV_CHART_TYPE_LINE) return (x * (chart->point_cnt - 1) + w / 2) / w; + if(chart->type == LV_CHART_TYPE_BAR) return (x * chart->point_cnt) / w; + + return 0; +} + +static void invalidate_point(lv_obj_t * obj, uint32_t i) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + if(i >= chart->point_cnt) return; + + int32_t w = lv_obj_get_content_width(obj); + int32_t scroll_left = lv_obj_get_scroll_left(obj); + + /*In shift mode the whole chart changes so the whole object*/ + if(chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT) { + lv_obj_invalidate(obj); + return; + } + + if(chart->type == LV_CHART_TYPE_LINE) { + int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t x_ofs = obj->coords.x1 + pleft + bwidth - scroll_left; + int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_ITEMS); + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR); + + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.y1 -= line_width + point_w; + coords.y2 += line_width + point_w; + + if(i < chart->point_cnt - 1) { + coords.x1 = ((w * i) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * (i + 1)) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + + if(i > 0) { + coords.x1 = ((w * (i - 1)) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * i) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + } + else if(chart->type == LV_CHART_TYPE_BAR) { + lv_area_t col_a; + /*Gap between the column on ~adjacent X*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t block_w = (w + block_gap) / chart->point_cnt; + + int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t x_act; + x_act = (int32_t)((int32_t)(block_w) * i) ; + x_act += obj->coords.x1 + bwidth + lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + + lv_obj_get_coords(obj, &col_a); + col_a.x1 = x_act - scroll_left; + col_a.x2 = col_a.x1 + block_w; + col_a.x1 -= block_gap; + + lv_obj_invalidate_area(obj, &col_a); + } + else { + lv_obj_invalidate(obj); + } +} + +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a) +{ + if((*a) == NULL) return; + + lv_chart_t * chart = (lv_chart_t *) obj; + uint32_t point_cnt_old = chart->point_cnt; + uint32_t i; + + if(ser->start_point != 0) { + int32_t * new_points = lv_malloc(sizeof(int32_t) * cnt); + LV_ASSERT_MALLOC(new_points); + if(new_points == NULL) return; + + if(cnt >= point_cnt_old) { + for(i = 0; i < point_cnt_old; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + for(i = point_cnt_old; i < cnt; i++) { + new_points[i] = LV_CHART_POINT_NONE; /*Fill up the rest with default value*/ + } + } + else { + for(i = 0; i < cnt; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + } + + /*Switch over pointer from old to new*/ + lv_free((*a)); + (*a) = new_points; + } + else { + (*a) = lv_realloc((*a), sizeof(int32_t) * cnt); + LV_ASSERT_MALLOC((*a)); + if((*a) == NULL) return; + /*Initialize the new points*/ + if(cnt > point_cnt_old) { + for(i = point_cnt_old - 1; i < cnt; i++) { + (*a)[i] = LV_CHART_POINT_NONE; + } + } + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/chart/lv_chart.h b/libraries/lvgl/src/widgets/chart/lv_chart.h new file mode 100644 index 0000000..a010bfd --- /dev/null +++ b/libraries/lvgl/src/widgets/chart/lv_chart.h @@ -0,0 +1,408 @@ +/** + * @file lv_chart.h + * + */ + +#ifndef LV_CHART_H +#define LV_CHART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_CHART != 0 + +/********************* + * DEFINES + *********************/ + +/**Default value of points. Can be used to not draw a point*/ +#define LV_CHART_POINT_NONE (INT32_MAX) +LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** + * Chart types + */ +enum _lv_chart_type_t { + LV_CHART_TYPE_NONE, /**< Don't draw the series*/ + LV_CHART_TYPE_LINE, /**< Connect the points with lines*/ + LV_CHART_TYPE_BAR, /**< Draw columns*/ + LV_CHART_TYPE_SCATTER, /**< Draw points and lines in 2D (x,y coordinates)*/ +}; + +#ifdef DOXYGEN +typedef _lv_chart_type_t lv_chart_type_t; +#else +typedef uint8_t lv_chart_type_t; +#endif /*DOXYGEN*/ + +/** + * Chart update mode for `lv_chart_set_next` + */ +enum _lv_chart_update_mode_t { + LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one the right*/ + LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ +}; + +#ifdef DOXYGEN +typedef _lv_chart_update_mode_t lv_chart_update_mode_t; +#else +typedef uint8_t lv_chart_update_mode_t; +#endif /*DOXYGEN*/ + +/** + * Enumeration of the axis' + */ +enum _lv_chart_axis_t { + LV_CHART_AXIS_PRIMARY_Y = 0x00, + LV_CHART_AXIS_SECONDARY_Y = 0x01, + LV_CHART_AXIS_PRIMARY_X = 0x02, + LV_CHART_AXIS_SECONDARY_X = 0x04, + _LV_CHART_AXIS_LAST +}; + +#ifdef DOXYGEN +typedef _lv_chart_axis_t lv_chart_axis_t; +#else +typedef uint8_t lv_chart_axis_t; +#endif /*DOXYGEN*/ + +/** + * Descriptor a chart series + */ +typedef struct { + int32_t * x_points; + int32_t * y_points; + lv_color_t color; + uint32_t start_point; + uint32_t hidden : 1; + uint32_t x_ext_buf_assigned : 1; + uint32_t y_ext_buf_assigned : 1; + uint32_t x_axis_sec : 1; + uint32_t y_axis_sec : 1; +} lv_chart_series_t; + +typedef struct { + lv_point_t pos; + int32_t point_id; + lv_color_t color; + lv_chart_series_t * ser; + lv_dir_t dir; + uint32_t pos_set: 1; /*1: pos is set; 0: point_id is set*/ +} lv_chart_cursor_t; + +typedef struct { + lv_obj_t obj; + lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ + lv_ll_t cursor_ll; /**< Linked list for the cursors (stores lv_chart_cursor_t)*/ + int32_t ymin[2]; + int32_t ymax[2]; + int32_t xmin[2]; + int32_t xmax[2]; + int32_t pressed_point_id; + uint32_t hdiv_cnt; /**< Number of horizontal division lines*/ + uint32_t vdiv_cnt; /**< Number of vertical division lines*/ + uint32_t point_cnt; /**< Point number in a data line*/ + lv_chart_type_t type : 3; /**< Line or column chart*/ + lv_chart_update_mode_t update_mode : 1; +} lv_chart_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_chart_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a chart object + * @param parent pointer to an object, it will be the parent of the new chart + * @return pointer to the created chart + */ +lv_obj_t * lv_chart_create(lv_obj_t * parent); + +/** + * Set a new type for a chart + * @param obj pointer to a chart object + * @param type new type of the chart (from 'lv_chart_type_t' enum) + */ +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type); +/** + * Set the number of points on a data line on a chart + * @param obj pointer to a chart object + * @param cnt new number of points on the data lines + */ +void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt); + +/** + * Set the minimal and maximal y values on an axis + * @param obj pointer to a chart object + * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` + * @param min minimum value of the y axis + * @param max maximum value of the y axis + */ +void lv_chart_set_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max); + +/** + * Set update mode of the chart object. Affects + * @param obj pointer to a chart object + * @param update_mode the update mode + */ +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode); + +/** + * Set the number of horizontal and vertical division lines + * @param obj pointer to a chart object + * @param hdiv number of horizontal division lines + * @param vdiv number of vertical division lines + */ +void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv); + +/** + * Get the type of a chart + * @param obj pointer to chart object + * @return type of the chart (from 'lv_chart_t' enum) + */ +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj); + +/** + * Get the data point number per data line on chart + * @param obj pointer to chart object + * @return point number on each data line + */ +uint32_t lv_chart_get_point_count(const lv_obj_t * obj); + +/** + * Get the current index of the x-axis start point in the data array + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the index of the current x start point in the data array + */ +uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the position of a point to the chart. + * @param obj pointer to a chart object + * @param ser pointer to series + * @param id the index. + * @param p_out store the result position here + */ +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out); + +/** + * Refresh a chart if its data line has changed + * @param obj pointer to chart object + */ +void lv_chart_refresh(lv_obj_t * obj); + +/*====================== + * Series + *=====================*/ + +/** + * Allocate and add a data series to the chart + * @param obj pointer to a chart object + * @param color color of the data series + * @param axis the y axis to which the series should be attached (::LV_CHART_AXIS_PRIMARY_Y or ::LV_CHART_AXIS_SECONDARY_Y) + * @return pointer to the allocated data series or NULL on failure + */ +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis); + +/** + * Deallocate and remove a data series from a chart + * @param obj pointer to a chart object + * @param series pointer to a data series on 'chart' + */ +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series); + +/** + * Hide/Unhide a single series of a chart. + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @param hide true: hide the series + */ +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide); + +/** + * Change the color of a series + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @param color the new color of the series + */ +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color); + +/** + * Set the index of the x-axis start point in the data array. + * This point will be considers the first (left) point and the other points will be drawn after it. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the data array + */ +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id); + +/** + * Get the next series. + * @param chart pointer to a chart + * @param ser the previous series or NULL to get the first + * @return the next series or NULL if there is no more. + */ +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * chart, const lv_chart_series_t * ser); + +/*===================== + * Cursor + *====================*/ + +/** + * Add a cursor with a given color + * @param obj pointer to chart object + * @param color color of the cursor + * @param dir direction of the cursor. `LV_DIR_RIGHT/LEFT/TOP/DOWN/HOR/VER/ALL`. OR-ed values are possible + * @return pointer to the created cursor + */ +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir); + +/** + * Set the coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param pos the new coordinate of cursor relative to the chart + */ +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos); + +/** + * Stick the cursor to a point + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param ser pointer to a series + * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points. + */ +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, + uint32_t point_id); + +/** + * Get the coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to cursor + * @return coordinate of the cursor as lv_point_t + */ +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor); + +/*===================== + * Set/Get value(s) + *====================*/ + +/** + * Initialize all data points of a series with a value + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value for all points. `LV_CHART_POINT_NONE` can be used to hide the points. + */ +void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); + +/** + * Set the next point's Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value of the next data + */ +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); + +/** + * Set the next point's X and Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value); + +/** + * Set an individual point's y value of a chart's series directly based on its index + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param value value to assign to array point + */ +void lv_chart_set_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value); + +/** + * Set an individual point's x and y value of a chart's series directly based on its index + * Can be used only with `LV_CHART_TYPE_SCATTER`. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, + int32_t y_value); + +/** + * Set an external array for the y data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); + +/** + * Set an external array for the x data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); + +/** + * Get the array of y values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +int32_t * lv_chart_get_y_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the array of x values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +int32_t * lv_chart_get_x_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the index of the currently pressed point. It's the same for every series. + * @param obj pointer to a chart object + * @return the index of the point [0 .. point count] or LV_CHART_POINT_ID_NONE if no point is being pressed + */ +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj); + +/** + * Get the overall offset from the chart's side to the center of the first point. + * In case of a bar chart it will be the center of the first column group + * @param obj pointer to a chart object + * @return the offset of the center + */ +int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHART*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHART_H*/ diff --git a/libraries/lvgl/src/widgets/checkbox/lv_checkbox.c b/libraries/lvgl/src/widgets/checkbox/lv_checkbox.c new file mode 100644 index 0000000..ae42e78 --- /dev/null +++ b/libraries/lvgl/src/widgets/checkbox/lv_checkbox.c @@ -0,0 +1,283 @@ +/** + * @file lv_cb.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_checkbox.h" +#if LV_USE_CHECKBOX != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_group.h" +#include "../../draw/lv_draw.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_checkbox_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_checkbox_draw(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_checkbox_class = { + .constructor_cb = lv_checkbox_constructor, + .destructor_cb = lv_checkbox_destructor, + .event_cb = lv_checkbox_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_checkbox_t), + .base_class = &lv_obj_class, + .name = "checkbox", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_checkbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(NULL != txt) { + size_t len; + +#if LV_USE_ARABIC_PERSIAN_CHARS + len = _lv_text_ap_calc_bytes_count(txt) + 1; +#else + len = lv_strlen(txt) + 1; +#endif + + if(!cb->static_txt) cb->txt = lv_realloc(cb->txt, len); + else cb->txt = lv_malloc(len); + + LV_ASSERT_MALLOC(cb->txt); + if(NULL == cb->txt) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_text_ap_proc(txt, cb->txt); +#else + lv_strcpy(cb->txt, txt); +#endif + + cb->static_txt = 0; + } + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(!cb->static_txt) lv_free(cb->txt); + + cb->txt = (char *)txt; + cb->static_txt = 1; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_checkbox_get_text(const lv_obj_t * obj) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + return cb->txt; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + +#if LV_WIDGETS_HAS_DEFAULT_VALUE + cb->txt = (char *)"Check box"; + cb->static_txt = 1; +#else + cb->txt = (char *)""; + cb->static_txt = 1; +#endif + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + if(!cb->static_txt) { + lv_free(cb->txt); + cb->txt = NULL; + } + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + lv_point_t marker_size; + marker_size.x = font_h + marker_leftp + marker_rightp; + marker_size.y = font_h + marker_topp + marker_bottomp; + + p->x = marker_size.x + txt_size.x + bg_colp; + p->y = LV_MAX(marker_size.y, txt_size.y); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t * s = lv_event_get_param(e); + int32_t m = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + *s = LV_MAX(*s, m); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_checkbox_draw(e); + } +} + +static void lv_checkbox_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + int32_t bg_border = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + bg_border; + int32_t bg_p = is_rtl ? lv_obj_get_style_pad_right(obj, LV_PART_MAIN) : lv_obj_get_style_pad_left(obj, + LV_PART_MAIN) + bg_border; + int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_INDICATOR); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_INDICATOR); + + lv_draw_rect_dsc_t indic_dsc; + lv_draw_rect_dsc_init(&indic_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &indic_dsc); + lv_area_t marker_area; + if(is_rtl) { + marker_area.x2 = obj->coords.x2 - bg_p; + marker_area.x1 = marker_area.x2 - font_h - marker_leftp - marker_rightp + 1; + } + else { + marker_area.x1 = obj->coords.x1 + bg_p; + marker_area.x2 = marker_area.x1 + font_h + marker_leftp + marker_rightp - 1; + } + marker_area.y1 = obj->coords.y1 + bg_topp; + marker_area.y2 = marker_area.y1 + font_h + marker_topp + marker_bottomp - 1; + + lv_area_t marker_area_transf; + lv_area_copy(&marker_area_transf, &marker_area); + lv_area_increase(&marker_area_transf, transf_w, transf_h); + + lv_draw_rect(layer, &indic_dsc, &marker_area_transf); + + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + lv_point_t txt_size; + lv_text_get_size(&txt_size, cb->txt, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_draw_label_dsc_t txt_dsc; + lv_draw_label_dsc_init(&txt_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); + txt_dsc.text = cb->txt; + + int32_t y_ofs = (lv_area_get_height(&marker_area) - font_h) / 2; + lv_area_t txt_area; + if(is_rtl) { + txt_area.x2 = marker_area.x1 - bg_colp; + txt_area.x1 = txt_area.x2 - txt_size.x; + } + else { + txt_area.x1 = marker_area.x2 + bg_colp; + txt_area.x2 = txt_area.x1 + txt_size.x; + } + txt_area.y1 = obj->coords.y1 + bg_topp + y_ofs; + txt_area.y2 = txt_area.y1 + txt_size.y; + + lv_draw_label(layer, &txt_dsc, &txt_area); +} +#endif diff --git a/libraries/lvgl/src/widgets/checkbox/lv_checkbox.h b/libraries/lvgl/src/widgets/checkbox/lv_checkbox.h new file mode 100644 index 0000000..1a0b3df --- /dev/null +++ b/libraries/lvgl/src/widgets/checkbox/lv_checkbox.h @@ -0,0 +1,89 @@ +/** + * @file lv_cb.h + * + */ + +#ifndef LV_CHECKBOX_H +#define LV_CHECKBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_CHECKBOX != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + char * txt; + uint32_t static_txt : 1; +} lv_checkbox_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_checkbox_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a check box object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created check box + */ +lv_obj_t * lv_checkbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a check box. `txt` will be copied and may be deallocated + * after this function returns. + * @param obj pointer to a check box + * @param txt the text of the check box. NULL to refresh with the current text. + */ +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the text of a check box. `txt` must not be deallocated during the life + * of this checkbox. + * @param obj pointer to a check box + * @param txt the text of the check box. + */ +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a check box + * @param obj pointer to check box object + * @return pointer to the text of the check box + */ +const char * lv_checkbox_get_text(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHECKBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHECKBOX_H*/ diff --git a/libraries/lvgl/src/widgets/dropdown/lv_dropdown.c b/libraries/lvgl/src/widgets/dropdown/lv_dropdown.c new file mode 100644 index 0000000..c5d1c01 --- /dev/null +++ b/libraries/lvgl/src/widgets/dropdown/lv_dropdown.c @@ -0,0 +1,1171 @@ +/** + * @file lv_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#include "lv_dropdown.h" +#if LV_USE_DROPDOWN != 0 + +#include "../../misc/lv_assert.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../display/lv_display.h" +#include "../../font/lv_symbol_def.h" +#include "../../misc/lv_anim.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../stdlib/lv_string.h" +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_dropdown_class) +#define MY_CLASS_LIST &lv_dropdownlist_class + +#define LV_DROPDOWN_PR_NONE 0xFFFF + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent); +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj); +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_list(lv_event_t * e); + +static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); +static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); +static lv_result_t btn_release_handler(lv_obj_t * obj); +static lv_result_t list_release_handler(lv_obj_t * list_obj); +static void list_press_handler(lv_obj_t * page); +static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y); +static void position_to_selected(lv_obj_t * obj); +static lv_obj_t * get_label(const lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_dropdown_class = { + .constructor_cb = lv_dropdown_constructor, + .destructor_cb = lv_dropdown_destructor, + .event_cb = lv_dropdown_event, + .width_def = LV_DPI_DEF, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_dropdown_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "dropdown", +}; + +const lv_obj_class_t lv_dropdownlist_class = { + .constructor_cb = lv_dropdownlist_constructor, + .destructor_cb = lv_dropdownlist_destructor, + .event_cb = lv_dropdown_list_event, + .instance_size = sizeof(lv_dropdown_list_t), + .base_class = &lv_obj_class, + .name = "dropdown-list", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_dropdown_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdown_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_dropdown_set_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->text == txt) return; + + dropdown->text = txt; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_options(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + /*Allocate space for the new text*/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t len = lv_strlen(options) + 1; +#else + size_t len = _lv_text_ap_calc_bytes_count(options) + 1; +#endif + + if(dropdown->options != NULL && dropdown->static_txt == 0) { + lv_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->options = lv_malloc(len); + + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + lv_strcpy(dropdown->options, options); +#else + _lv_text_ap_proc(options, dropdown->options); +#endif + + /*Now the text is dynamically allocated*/ + dropdown->static_txt = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + if(dropdown->static_txt == 0 && dropdown->options != NULL) { + lv_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->static_txt = 1; + dropdown->options = (char *)options; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(option); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Convert static options to dynamic*/ + if(dropdown->static_txt != 0) { + char * static_options = dropdown->options; + dropdown->options = lv_strdup(static_options); + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + dropdown->static_txt = 0; + } + + /*Allocate space for the new option*/ + size_t old_len = (dropdown->options == NULL) ? 0 : lv_strlen(dropdown->options); +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t ins_len = lv_strlen(option) + 1; +#else + size_t ins_len = _lv_text_ap_calc_bytes_count(option) + 1; +#endif + + size_t new_len = ins_len + old_len + 2; /*+2 for terminating NULL and possible \n*/ + dropdown->options = lv_realloc(dropdown->options, new_len + 1); + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + + dropdown->options[old_len] = '\0'; + + /*Find the insert character position*/ + uint32_t insert_pos = old_len; + if(pos != LV_DROPDOWN_POS_LAST) { + uint32_t opcnt = 0; + for(insert_pos = 0; dropdown->options[insert_pos] != 0; insert_pos++) { + if(opcnt == pos) + break; + if(dropdown->options[insert_pos] == '\n') + opcnt++; + } + } + + /*Add delimiter to existing options*/ + if((insert_pos > 0) && (pos >= dropdown->option_cnt)) + _lv_text_ins(dropdown->options, _lv_text_encoded_get_char_id(dropdown->options, insert_pos++), "\n"); + + /*Insert the new option, adding \n if necessary*/ + char * ins_buf = lv_malloc(ins_len + 2); /*+ 2 for terminating NULL and possible \n*/ + LV_ASSERT_MALLOC(ins_buf); + if(ins_buf == NULL) return; +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + lv_strcpy(ins_buf, option); +#else + _lv_text_ap_proc(option, ins_buf); +#endif + if(pos < dropdown->option_cnt) strcat(ins_buf, "\n"); + + _lv_text_ins(dropdown->options, _lv_text_encoded_get_char_id(dropdown->options, insert_pos), ins_buf); + lv_free(ins_buf); + + dropdown->option_cnt++; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_clear_options(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->options == NULL) return; + + if(dropdown->static_txt == 0) + lv_free(dropdown->options); + + dropdown->options = NULL; + dropdown->static_txt = 0; + dropdown->option_cnt = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->sel_opt_id == sel_opt) return; + + dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + + if(dropdown->list) { + position_to_selected(obj); + } + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->dir == dir) return; + + dropdown->dir = dir; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->symbol = symbol; + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->selected_highlight = en; + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->list; +} + +const char * lv_dropdown_get_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->text; +} + +const char * lv_dropdown_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->options == NULL ? "" : dropdown->options; +} + +uint32_t lv_dropdown_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->sel_opt_id; +} + +uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->option_cnt; +} + +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + uint32_t i; + uint32_t line = 0; + size_t txt_len; + + if(dropdown->options) { + txt_len = lv_strlen(dropdown->options); + } + else { + buf[0] = '\0'; + return; + } + + for(i = 0; i < txt_len && line != dropdown->sel_opt_id_orig; i++) { + if(dropdown->options[i] == '\n') line++; + } + + uint32_t c; + for(c = 0; i < txt_len && dropdown->options[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("the buffer was too small"); + break; + } + buf[c] = dropdown->options[i]; + } + + buf[c] = '\0'; +} + +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) +{ + const char * opts = lv_dropdown_get_options(obj); + uint32_t char_i = 0; + uint32_t opt_i = 0; + const char * start = opts; + const size_t option_len = lv_strlen(option); /*avoid recomputing this multiple times in the loop*/ + + while(start[0] != '\0') { + for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); + + if(option_len == char_i && memcmp(start, option, LV_MIN(option_len, char_i)) == 0) { + return opt_i; + } + + start = &start[char_i]; + if(start[0] == '\n') start++; + char_i = 0; + opt_i++; + } + + return -1; +} + +const char * lv_dropdown_get_symbol(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->symbol; +} + +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->selected_highlight; +} + +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->dir; +} + +/*===================== + * Other functions + *====================*/ + +void lv_dropdown_open(lv_obj_t * dropdown_obj) +{ + LV_ASSERT_OBJ(dropdown_obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_add_state(dropdown_obj, LV_STATE_CHECKED); + lv_obj_set_parent(dropdown->list, lv_obj_get_screen(dropdown_obj)); + lv_obj_move_to_index(dropdown->list, -1); + lv_obj_remove_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + /*To allow styling the list*/ + lv_obj_send_event(dropdown_obj, LV_EVENT_READY, NULL); + + lv_obj_t * label = get_label(dropdown_obj); + lv_label_set_text_static(label, dropdown->options); + lv_obj_set_width(dropdown->list, LV_SIZE_CONTENT); + + lv_obj_update_layout(label); + /*Set smaller width to the width of the button*/ + if(lv_obj_get_width(dropdown->list) <= lv_obj_get_width(dropdown_obj) && + (dropdown->dir == LV_DIR_TOP || dropdown->dir == LV_DIR_BOTTOM)) { + lv_obj_set_width(dropdown->list, lv_obj_get_width(dropdown_obj)); + } + + int32_t label_h = lv_obj_get_height(label); + int32_t border_width = lv_obj_get_style_border_width(dropdown->list, LV_PART_MAIN); + int32_t top = lv_obj_get_style_pad_top(dropdown->list, LV_PART_MAIN) + border_width; + int32_t bottom = lv_obj_get_style_pad_bottom(dropdown->list, LV_PART_MAIN) + border_width; + + int32_t list_fit_h = label_h + top + bottom; + int32_t list_h = list_fit_h; + + lv_dir_t dir = dropdown->dir; + /*No space on the bottom? See if top is better.*/ + if(dropdown->dir == LV_DIR_BOTTOM) { + if(dropdown_obj->coords.y2 + list_h > LV_VER_RES) { + if(dropdown_obj->coords.y1 > LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_TOP; + list_h = dropdown_obj->coords.y1 - 1; + } + else { + list_h = LV_VER_RES - dropdown_obj->coords.y2 - 1 ; + } + } + } + /*No space on the top? See if bottom is better.*/ + else if(dropdown->dir == LV_DIR_TOP) { + if(dropdown_obj->coords.y1 - list_h < 0) { + if(dropdown_obj->coords.y1 < LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_BOTTOM; + list_h = LV_VER_RES - dropdown_obj->coords.y2; + } + else { + list_h = dropdown_obj->coords.y1; + } + } + } + + if(list_h > list_fit_h) list_h = list_fit_h; + lv_obj_set_height(dropdown->list, list_h); + + position_to_selected(dropdown_obj); + + if(dir == LV_DIR_BOTTOM) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + else if(dir == LV_DIR_TOP) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_TOP_LEFT, 0, 0); + else if(dir == LV_DIR_LEFT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_LEFT_TOP, 0, 0); + else if(dir == LV_DIR_RIGHT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_RIGHT_TOP, 0, 0); + + lv_obj_update_layout(dropdown->list); + + if(dropdown->dir == LV_DIR_LEFT || dropdown->dir == LV_DIR_RIGHT) { + int32_t y1 = lv_obj_get_y(dropdown->list); + int32_t y2 = lv_obj_get_y2(dropdown->list); + if(y2 >= LV_VER_RES) { + lv_obj_set_y(dropdown->list, y1 - (y2 - LV_VER_RES) - 1); + } + } + + lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, dropdown->options); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(label, LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0); + break; + + } +} + +void lv_dropdown_close(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_remove_state(obj, LV_STATE_CHECKED); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_add_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); +} + +bool lv_dropdown_is_open(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return lv_obj_has_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN) ? false : true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdownlist_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Initialize the allocated 'ext'*/ + dropdown->list = NULL; + dropdown->options = NULL; + dropdown->symbol = LV_SYMBOL_DOWN; + dropdown->text = NULL; + dropdown->static_txt = 1; + dropdown->selected_highlight = 1; + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + dropdown->option_cnt = 0; + dropdown->dir = LV_DIR_BOTTOM; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_dropdown_set_options_static(obj, "Option 1\nOption 2\nOption 3"); +#endif + + dropdown->list = lv_dropdown_list_create(lv_obj_get_screen(obj)); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)dropdown->list; + list->dropdown = obj; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(dropdown->list) { + lv_obj_delete(dropdown->list); + dropdown->list = NULL; + } + + if(!dropdown->static_txt) { + lv_free(dropdown->options); + dropdown->options = NULL; + } +} + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + + lv_label_create(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj) +{ + LV_UNUSED(class_p); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + dropdown->list = NULL; +} + +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + /*Open the list if editing*/ + if(editing) { + lv_dropdown_open(obj); + } + /*Close the list if navigating*/ + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + lv_dropdown_close(obj); + } + else if(code == LV_EVENT_RELEASED) { + res = btn_release_handler(obj); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + p->y = lv_font_get_line_height(font); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id + 1 < dropdown->option_cnt) { + dropdown->sel_opt_id++; + position_to_selected(obj); + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id > 0) { + dropdown->sel_opt_id--; + position_to_selected(obj); + } + } + else if(c == LV_KEY_ESC) { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + else if(c == LV_KEY_ENTER) { + /* Handle the ENTER key only if it was send by an other object. + * Do no process it if ENTER is sent by the dropdown because it's handled in LV_EVENT_RELEASED */ + lv_obj_t * indev_obj = lv_indev_get_active_obj(); + if(indev_obj != obj) { + res = btn_release_handler(obj); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_ROTARY) { + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else { + int32_t r = lv_event_get_rotary_diff(e); + int32_t new_id = dropdown->sel_opt_id + r; + new_id = LV_CLAMP(0, new_id, (int32_t)dropdown->option_cnt - 1); + + dropdown->sel_opt_id = new_id; + position_to_selected(obj); + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_POST) { + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RESULT_OK) return; + } + lv_obj_t * list = lv_event_get_current_target(e); + lv_obj_t * dropdown_obj = ((lv_dropdown_list_t *)list)->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + if(code == LV_EVENT_RELEASED) { + if(lv_indev_get_scroll_obj(lv_indev_active()) == NULL) { + list_release_handler(list); + } + } + else if(code == LV_EVENT_PRESSED) { + list_press_handler(list); + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_invalidate(list); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_list(e); + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RESULT_OK) return; + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + + lv_draw_label_dsc_t symbol_dsc; + lv_draw_label_dsc_init(&symbol_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &symbol_dsc); + + /*If no text specified use the selected option*/ + const char * opt_txt; + char buf[128]; + if(dropdown->text) opt_txt = dropdown->text; + else { + lv_dropdown_get_selected_str(obj, buf, 128); + opt_txt = buf; + } + + bool symbol_to_left = false; + if(dropdown->dir == LV_DIR_LEFT) symbol_to_left = true; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) symbol_to_left = true; + + if(dropdown->symbol) { + lv_image_src_t symbol_type = lv_image_src_get_type(dropdown->symbol); + int32_t symbol_w; + int32_t symbol_h; + if(symbol_type == LV_IMAGE_SRC_SYMBOL) { + lv_point_t size; + lv_text_get_size(&size, dropdown->symbol, symbol_dsc.font, symbol_dsc.letter_space, symbol_dsc.line_space, LV_COORD_MAX, + symbol_dsc.flag); + symbol_w = size.x; + symbol_h = size.y; + } + else { + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(dropdown->symbol, &header); + if(res == LV_RESULT_OK) { + symbol_w = header.w; + symbol_h = header.h; + } + else { + symbol_w = -1; + symbol_h = -1; + } + } + + lv_area_t symbol_area; + if(symbol_to_left) { + symbol_area.x1 = obj->coords.x1 + left; + symbol_area.x2 = symbol_area.x1 + symbol_w - 1; + } + else { + symbol_area.x1 = obj->coords.x2 - right - symbol_w; + symbol_area.x2 = symbol_area.x1 + symbol_w - 1; + } + + if(symbol_type == LV_IMAGE_SRC_SYMBOL) { + symbol_area.y1 = obj->coords.y1 + top; + symbol_area.y2 = symbol_area.y1 + symbol_h - 1; + symbol_dsc.text = dropdown->symbol; + lv_draw_label(layer, &symbol_dsc, &symbol_area); + } + else { + symbol_area.y1 = obj->coords.y1 + (lv_obj_get_height(obj) - symbol_h) / 2; + symbol_area.y2 = symbol_area.y1 + symbol_h - 1; + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + lv_obj_init_draw_image_dsc(obj, LV_PART_INDICATOR, &img_dsc); + lv_point_set(&img_dsc.pivot, symbol_w / 2, symbol_h / 2); + img_dsc.rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_INDICATOR); + img_dsc.src = dropdown->symbol; + lv_draw_image(layer, &img_dsc, &symbol_area); + } + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + + lv_point_t size; + lv_text_get_size(&size, opt_txt, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, + label_dsc.flag); + + lv_area_t txt_area; + txt_area.y1 = obj->coords.y1 + top; + txt_area.y2 = txt_area.y1 + size.y; + /*Center align the text if no symbol*/ + if(dropdown->symbol == NULL) { + txt_area.x1 = obj->coords.x1 + (lv_obj_get_width(obj) - size.x) / 2; + txt_area.x2 = txt_area.x1 + size.x; + } + else { + /*Text to the right*/ + if(symbol_to_left) { + txt_area.x1 = obj->coords.x2 - right - size.x; + txt_area.x2 = txt_area.x1 + size.x; + } + else { + txt_area.x1 = obj->coords.x1 + left; + txt_area.x2 = txt_area.x1 + size.x; + } + } + + label_dsc.text = opt_txt; + if(dropdown->text == NULL) { + label_dsc.text_local = true; + } + + lv_draw_label(layer, &label_dsc, &txt_area); +} + +static void draw_list(lv_event_t * e) +{ + lv_obj_t * list_obj = lv_event_get_current_target(e); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_layer_t * layer = lv_event_get_layer(e); + + /* Clip area might be too large too to shadow but + * the selected option can be drawn on only the background*/ + lv_area_t clip_area_core; + bool has_common; + has_common = _lv_area_intersect(&clip_area_core, &layer->_clip_area, &dropdown->list->coords); + if(has_common) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area_core; + if(dropdown->selected_highlight) { + if(dropdown->pr_opt_id == dropdown->sel_opt_id) { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + } + else { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); + draw_box_label(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); + } + } + else { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + } + layer->_clip_area = clip_area_ori; + } +} + +static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_ori = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + /*Draw a rectangle under the selected item*/ + const lv_font_t * font = lv_obj_get_style_text_font(list_obj, LV_PART_SELECTED); + int32_t line_space = lv_obj_get_style_text_line_space(list_obj, LV_PART_SELECTED); + int32_t font_h = lv_font_get_line_height(font); + + /*Draw the selected*/ + lv_obj_t * label = get_label(dropdown_obj); + lv_area_t rect_area; + rect_area.y1 = label->coords.y1; + rect_area.y1 += id * (font_h + line_space); + rect_area.y1 -= line_space / 2; + + rect_area.y2 = rect_area.y1 + font_h + line_space - 1; + rect_area.x1 = dropdown->list->coords.x1; + rect_area.x2 = dropdown->list->coords.x2; + + lv_draw_rect_dsc_t sel_rect; + lv_draw_rect_dsc_init(&sel_rect); + lv_obj_init_draw_rect_dsc(list_obj, LV_PART_SELECTED, &sel_rect); + lv_draw_rect(layer, &sel_rect, &rect_area); + + list_obj->state = state_ori; + list_obj->skip_trans = 0; +} + +static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_orig = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(list_obj, LV_PART_SELECTED, &label_dsc); + + label_dsc.line_space = lv_obj_get_style_text_line_space(list_obj, + LV_PART_SELECTED); /*Line space should come from the list*/ + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + int32_t font_h = lv_font_get_line_height(label_dsc.font); + + lv_area_t area_sel; + area_sel.y1 = label->coords.y1; + area_sel.y1 += id * (font_h + label_dsc.line_space); + area_sel.y1 -= label_dsc.line_space / 2; + + area_sel.y2 = area_sel.y1 + font_h + label_dsc.line_space - 1; + area_sel.x1 = list_obj->coords.x1; + area_sel.x2 = list_obj->coords.x2; + lv_area_t mask_sel; + bool area_ok; + area_ok = _lv_area_intersect(&mask_sel, &layer->_clip_area, &area_sel); + if(area_ok) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = mask_sel; + label_dsc.text = lv_label_get_text(label); + lv_draw_label(layer, &label_dsc, &label->coords); + layer->_clip_area = clip_area_ori; + } + list_obj->state = state_orig; + list_obj->skip_trans = 0; +} + +static lv_result_t btn_release_handler(lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_scroll_obj(indev) == NULL) { + if(lv_dropdown_is_open(obj)) { + lv_dropdown_close(obj); + if(dropdown->sel_opt_id_orig != dropdown->sel_opt_id) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_result_t res; + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RESULT_OK) return res; + lv_obj_invalidate(obj); + } + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_set_editing(lv_obj_get_group(obj), false); + } + } + else { + lv_dropdown_open(obj); + } + } + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_obj_invalidate(obj); + } + return LV_RESULT_OK; +} + +/** + * Called when a drop down list is released to open it or set new option + * @param list pointer to the drop down list's list + * @return LV_RESULT_INVALID if the list is not being deleted in the user callback. Else LV_RESULT_OK + */ +static lv_result_t list_release_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_active(); + /*Leave edit mode once a new item is selected*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_group_t * g = lv_obj_get_group(dropdown_obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->sel_opt_id = get_id_on_point(dropdown_obj, p.y); + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + } + + lv_dropdown_close(dropdown_obj); + + /*Invalidate to refresh the text*/ + if(dropdown->text == NULL) lv_obj_invalidate(dropdown_obj); + + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_result_t res = lv_obj_send_event(dropdown_obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RESULT_OK) return res; + + return LV_RESULT_OK; +} + +static void list_press_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_active(); + if(indev && (lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON)) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->pr_opt_id = get_id_on_point(dropdown_obj, p.y); + lv_obj_invalidate(list_obj); + } +} + +static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return 0; + y -= label->coords.y1; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + + y += line_space / 2; + int32_t h = font_h + line_space; + + uint32_t opt = y / h; + + if(opt >= dropdown->option_cnt) opt = dropdown->option_cnt - 1; + return opt; +} + +/** + * Set the position of list when it is closed to show the selected item + * @param ddlist pointer to a drop down list + */ +static void position_to_selected(lv_obj_t * dropdown_obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + if(lv_obj_get_height(label) <= lv_obj_get_content_height(dropdown_obj)) return; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + int32_t unit_h = font_h + line_space; + int32_t line_y1 = dropdown->sel_opt_id * unit_h; + + /*Scroll to the selected option*/ + lv_obj_scroll_to_y(dropdown->list, line_y1, LV_ANIM_OFF); + lv_obj_invalidate(dropdown->list); +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->list == NULL) return NULL; + + return lv_obj_get_child(dropdown->list, 0); +} + +#endif diff --git a/libraries/lvgl/src/widgets/dropdown/lv_dropdown.h b/libraries/lvgl/src/widgets/dropdown/lv_dropdown.h new file mode 100644 index 0000000..614f5f1 --- /dev/null +++ b/libraries/lvgl/src/widgets/dropdown/lv_dropdown.h @@ -0,0 +1,254 @@ +/** + * @file lv_dropdown.h + * + */ + +#ifndef LV_DROPDOWN_H +#define LV_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_DROPDOWN != 0 + +/*Testing of dependencies*/ + +#if LV_USE_LABEL == 0 +#error "lv_dropdown: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../label/lv_label.h" + +/********************* + * DEFINES + *********************/ +#define LV_DROPDOWN_POS_LAST 0xFFFF +LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + lv_obj_t * list; /**< The dropped down list*/ + const char * text; /**< Text to display on the dropdown's button*/ + const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ + char * options; /**< Options in a '\n' separated list*/ + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the currently selected option*/ + uint32_t sel_opt_id_orig; /**< Store the original index on focus*/ + uint32_t pr_opt_id; /**< Index of the currently pressed option*/ + lv_dir_t dir : 4; /**< Direction in which the list should open*/ + uint8_t static_txt : 1; /**< 1: Only a pointer is saved in `options`*/ + uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ +} lv_dropdown_t; + +typedef struct { + lv_obj_t obj; + lv_obj_t * dropdown; +} lv_dropdown_list_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdown_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdownlist_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a drop-down list object + * @param parent pointer to an object, it will be the parent of the new drop-down list + * @return pointer to the created drop-down list + */ +lv_obj_t * lv_dropdown_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set text of the drop-down list's button. + * If set to `NULL` the selected option's text will be displayed on the button. + * If set to a specific text then that text will be shown regardless of the selected option. + * @param obj pointer to a drop-down list object + * @param txt the text as a string (Only its pointer is saved) + */ +void lv_dropdown_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the options in a drop-down list from a string. + * The options will be copied and saved in the object so the `options` can be destroyed after calling this function + * @param obj pointer to drop-down list object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options(lv_obj_t * obj, const char * options); + +/** + * Set the options in a drop-down list from a static string (global, static or dynamically allocated). + * Only the pointer of the option string will be saved. + * @param obj pointer to drop-down list object + * @param options a static string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options); + +/** + * Add an options to a drop-down list from a string. Only works for non-static options. + * @param obj pointer to drop-down list object + * @param option a string without '\n'. E.g. "Four" + * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string + */ +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos); + +/** + * Clear all options in a drop-down list. Works with both static and dynamic options. + * @param obj pointer to drop-down list object + */ +void lv_dropdown_clear_options(lv_obj_t * obj); + +/** + * Set the selected option + * @param obj pointer to drop-down list object + * @param sel_opt id of the selected option (0 ... number of option - 1); + */ +void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt); + +/** + * Set the direction of the a drop-down list + * @param obj pointer to a drop-down list object + * @param dir LV_DIR_LEFT/RIGHT/TOP/BOTTOM + */ +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set an arrow or other symbol to display when on drop-down list's button. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @param symbol a text like `LV_SYMBOL_DOWN`, an image (pointer or path) or NULL to not draw symbol icon + * @note angle and zoom transformation can be applied if the symbol is an image. + * E.g. when drop down is checked (opened) rotate the symbol by 180 degree + */ +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol); + +/** + * Set whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @param en true: highlight enabled; false: disabled + */ +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the list of a drop-down to allow styling or other modifications + * @param obj pointer to a drop-down list object + * @return pointer to the list of the drop-down + */ +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj); + +/** + * Get text of the drop-down list's button. + * @param obj pointer to a drop-down list object + * @return the text as string, `NULL` if no text + */ +const char * lv_dropdown_get_text(lv_obj_t * obj); + +/** + * Get the options of a drop-down list + * @param obj pointer to drop-down list object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_dropdown_get_options(const lv_obj_t * obj); + +/** + * Get the index of the selected option + * @param obj pointer to drop-down list object + * @return index of the selected option (0 ... number of option - 1); + */ +uint32_t lv_dropdown_get_selected(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to drop-down list object + * @return the total number of options in the list + */ +uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj); + +/** + * Get the current selected option as a string + * @param obj pointer to drop-down object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + +/** + * Get the index of an option. + * @param obj pointer to drop-down object + * @param option an option as string + * @return index of `option` in the list of all options. -1 if not found. + */ +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option); + +/** + * Get the symbol on the drop-down list. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @return the symbol or NULL if not enabled + */ +const char * lv_dropdown_get_symbol(lv_obj_t * obj); + +/** + * Get whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @return true: highlight enabled; false: disabled + */ +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj); + +/** + * Get the direction of the drop-down list + * @param obj pointer to a drop-down list object + * @return LV_DIR_LEF/RIGHT/TOP/BOTTOM + */ +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Open the drop.down list + * @param dropdown_obj pointer to drop-down list object + */ +void lv_dropdown_open(lv_obj_t * dropdown_obj); + +/** + * Close (Collapse) the drop-down list + * @param obj pointer to drop-down list object + */ +void lv_dropdown_close(lv_obj_t * obj); + +/** + * Tells whether the list is opened or not + * @param obj pointer to a drop-down list object + * @return true if the list os opened + */ +bool lv_dropdown_is_open(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DROPDOWN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DROPDOWN_H*/ diff --git a/libraries/lvgl/src/widgets/image/lv_image.c b/libraries/lvgl/src/widgets/image/lv_image.c new file mode 100644 index 0000000..8bd70ca --- /dev/null +++ b/libraries/lvgl/src/widgets/image/lv_image.c @@ -0,0 +1,838 @@ +/** + * @file lv_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_image.h" +#if LV_USE_IMAGE != 0 + +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_image_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_image(lv_event_t * e); +static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y); +static void update_align(lv_obj_t * obj); + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t properties[] = { + { + .id = LV_PROPERTY_IMAGE_SRC, + .setter = lv_image_set_src, + .getter = lv_image_get_src, + }, + { + .id = LV_PROPERTY_IMAGE_OFFSET_X, + .setter = lv_image_set_offset_x, + .getter = lv_image_get_offset_x, + }, + { + .id = LV_PROPERTY_IMAGE_OFFSET_Y, + .setter = lv_image_set_offset_y, + .getter = lv_image_get_offset_y, + }, + { + .id = LV_PROPERTY_IMAGE_ROTATION, + .setter = lv_image_set_rotation, + .getter = lv_image_get_rotation, + }, + { + .id = LV_PROPERTY_IMAGE_PIVOT, + .setter = _lv_image_set_pivot, + .getter = lv_image_get_pivot, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE, + .setter = lv_image_set_scale, + .getter = lv_image_get_scale, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE_X, + .setter = lv_image_set_scale_x, + .getter = lv_image_get_scale_x, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE_Y, + .setter = lv_image_set_scale_y, + .getter = lv_image_get_scale_y, + }, + { + .id = LV_PROPERTY_IMAGE_BLEND_MODE, + .setter = lv_image_set_blend_mode, + .getter = lv_image_get_blend_mode, + }, + { + .id = LV_PROPERTY_IMAGE_ANTIALIAS, + .setter = lv_image_set_antialias, + .getter = lv_image_get_antialias, + }, + { + .id = LV_PROPERTY_IMAGE_ALIGN, + .setter = lv_image_set_inner_align, + .getter = lv_image_get_inner_align, + }, +}; +#endif + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_image_class = { + .constructor_cb = lv_image_constructor, + .destructor_cb = lv_image_destructor, + .event_cb = lv_image_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_image_t), + .base_class = &lv_obj_class, + .name = "image", +#if LV_USE_OBJ_PROPERTY + .prop_index_start = LV_PROPERTY_IMAGE_START, + .prop_index_end = LV_PROPERTY_IMAGE_END, + .properties = properties, + .properties_count = sizeof(properties) / sizeof(properties[0]), +#endif +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_image_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_image_set_src(lv_obj_t * obj, const void * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + lv_image_src_t src_type = lv_image_src_get_type(src); + lv_image_t * img = (lv_image_t *)obj; + +#if LV_USE_LOG && LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + switch(src_type) { + case LV_IMAGE_SRC_FILE: + LV_LOG_TRACE("`LV_IMAGE_SRC_FILE` type found"); + break; + case LV_IMAGE_SRC_VARIABLE: + LV_LOG_TRACE("`LV_IMAGE_SRC_VARIABLE` type found"); + break; + case LV_IMAGE_SRC_SYMBOL: + LV_LOG_TRACE("`LV_IMAGE_SRC_SYMBOL` type found"); + break; + default: + LV_LOG_WARN("unknown type"); + } +#endif + + /*If the new source type is unknown free the memories of the old source*/ + if(src_type == LV_IMAGE_SRC_UNKNOWN) { + LV_LOG_WARN("unknown image type"); + if(img->src_type == LV_IMAGE_SRC_SYMBOL || img->src_type == LV_IMAGE_SRC_FILE) { + lv_free((void *)img->src); + } + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + return; + } + + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(src, &header); + if(res != LV_RESULT_OK) { +#if LV_USE_LOG + char buf[24]; + LV_LOG_WARN("failed to get image info: %s", + src_type == LV_IMAGE_SRC_FILE ? (const char *)src : (lv_snprintf(buf, sizeof(buf), "%p", src), buf)); +#endif /*LV_USE_LOG*/ + return; + } + + /*Save the source*/ + if(src_type == LV_IMAGE_SRC_VARIABLE) { + /*If memory was allocated because of the previous `src_type` then free it*/ + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_free((void *)img->src); + } + img->src = src; + } + else if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_SYMBOL) { + /*If the new and the old src are the same then it was only a refresh.*/ + if(img->src != src) { + const void * old_src = NULL; + /*If memory was allocated because of the previous `src_type` then save its pointer and free after allocation. + *It's important to allocate first to be sure the new data will be on a new address. + *Else `img_cache` wouldn't see the change in source.*/ + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + old_src = img->src; + } + char * new_str = lv_strdup(src); + LV_ASSERT_MALLOC(new_str); + if(new_str == NULL) return; + img->src = new_str; + + if(old_src) lv_free((void *)old_src); + } + } + + if(src_type == LV_IMAGE_SRC_SYMBOL) { + /*`lv_image_dsc_get_info` couldn't set the width and height of a font so set it here*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_point_t size; + lv_text_get_size(&size, src, font, letter_space, line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + header.w = size.x; + header.h = size.y; + } + + img->src_type = src_type; + img->w = header.w; + img->h = header.h; + img->cf = header.cf; + + lv_obj_refresh_self_size(obj); + + update_align(obj); + + /*Provide enough room for the rotated corners*/ + if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { + lv_obj_refresh_ext_draw_size(obj); + } + + lv_obj_invalidate(obj); +} + +void lv_image_set_offset_x(lv_obj_t * obj, int32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + img->offset.x = x; + lv_obj_invalidate(obj); +} + +void lv_image_set_offset_y(lv_obj_t * obj, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + img->offset.y = y; + lv_obj_invalidate(obj); +} + +void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + angle = 0; + } + else { + while(angle >= 3600) angle -= 3600; + while(angle < 0) angle += 3600; + } + + if((uint32_t)angle == img->rotation) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + img->rotation = angle; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + x = 0; + y = 0; + } + + if(img->pivot.x == x && img->pivot.y == y) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + lv_point_set(&img->pivot, x, y); + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + lv_image_get_pivot(obj, &pivot_px); + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_x && zoom == img->scale_y) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, zoom, zoom); +} + +void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_x) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, zoom, img->scale_y); +} + +void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_y) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, img->scale_x, zoom); +} + +void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->blend_mode == blend_mode) return; + + img->blend_mode = blend_mode; + + lv_obj_invalidate(obj); +} + +void lv_image_set_antialias(lv_obj_t * obj, bool antialias) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(antialias == img->antialias) return; + + img->antialias = antialias; + lv_obj_invalidate(obj); +} + +void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(align == img->align) return; + + img->align = align; + update_align(obj); + + lv_obj_invalidate(obj); +} + +void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_image_t * img = (lv_image_t *)obj; + img->bitmap_mask_src = src; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const void * lv_image_get_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->src; +} + +int32_t lv_image_get_offset_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->offset.x; +} + +int32_t lv_image_get_offset_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->offset.y; +} + +int32_t lv_image_get_rotation(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->rotation; +} + +void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + pivot->x = lv_pct_to_px(img->pivot.x, img->w); + pivot->y = lv_pct_to_px(img->pivot.y, img->h); +} + +int32_t lv_image_get_scale(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_x; +} + +int32_t lv_image_get_scale_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_x; +} + +int32_t lv_image_get_scale_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_y; +} + +lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->blend_mode; +} + +bool lv_image_get_antialias(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->antialias ? true : false; +} + +lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->align; +} + +const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->bitmap_mask_src; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_image_t * img = (lv_image_t *)obj; + + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + img->cf = LV_COLOR_FORMAT_UNKNOWN; + img->w = lv_obj_get_width(obj); + img->h = lv_obj_get_height(obj); + img->rotation = 0; + img->scale_x = LV_SCALE_NONE; + img->scale_y = LV_SCALE_NONE; + img->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; + lv_point_set(&img->offset, 0, 0); + lv_point_set(&img->pivot, LV_PCT(50), LV_PCT(50)); /*Default pivot to image center*/ + img->align = LV_IMAGE_ALIGN_CENTER; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_ADV_HITTEST); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_image_t * img = (lv_image_t *)obj; + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_free((void *)img->src); + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + } +} + +static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + + /*Call the ancestor's event handler*/ + lv_result_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_obj_t * obj = lv_event_get_current_target(e); + lv_image_t * img = (lv_image_t *)obj; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + + if(code == LV_EVENT_STYLE_CHANGED) { + /*Refresh the file name to refresh the symbol text size*/ + if(img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_image_set_src(obj, img->src); + } + else { + /*With transformation it might change*/ + lv_obj_refresh_ext_draw_size(obj); + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + + int32_t * s = lv_event_get_param(e); + + /*If the image has angle provide enough room for the rotated corners*/ + if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { + lv_area_t a; + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + *s = LV_MAX(*s, -a.x1); + *s = LV_MAX(*s, -a.y1); + *s = LV_MAX(*s, a.x2 - w); + *s = LV_MAX(*s, a.y2 - h); + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + + /*If the object is exactly image sized (not cropped, not mosaic) and transformed + *perform hit test on its transformed area*/ + if(img->w == lv_obj_get_width(obj) && img->h == lv_obj_get_height(obj) && + (img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE || + img->rotation != 0 || img->pivot.x != img->w / 2 || img->pivot.y != img->h / 2)) { + + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t coords; + _lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + coords.x1 += obj->coords.x1; + coords.y1 += obj->coords.y1; + coords.x2 += obj->coords.x1; + coords.y2 += obj->coords.y1; + + info->res = _lv_area_is_point_on(&coords, info->point, 0); + } + else { + lv_area_t a; + lv_obj_get_click_area(obj, &a); + info->res = _lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = img->w; + p->y = img->h; + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { + draw_image(e); + } +} + +static void draw_image(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_image_t * img = (lv_image_t *)obj; + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(img->src_type == LV_IMAGE_SRC_UNKNOWN || img->src_type == LV_IMAGE_SRC_SYMBOL) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*Non true color format might have "holes"*/ + if(lv_color_format_has_alpha(img->cf)) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*With not LV_OPA_COVER images can't cover an area */ + if(lv_obj_get_style_image_opa(obj, LV_PART_MAIN) != LV_OPA_COVER) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(img->rotation != 0) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(img->scale_x == LV_SCALE_NONE && img->scale_y == LV_SCALE_NONE) { + if(_lv_area_is_in(info->area, &obj->coords, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + else { + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + _lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->scale_x, img->scale_y, + &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + + if(_lv_area_is_in(info->area, &a, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + if(img->bitmap_mask_src) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + + if(img->h == 0 || img->w == 0) return; + if(img->scale_x == 0 || img->scale_y == 0) return; + + lv_layer_t * layer = lv_event_get_layer(e); + + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_draw_image_dsc_t draw_dsc; + lv_draw_image_dsc_init(&draw_dsc); + lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &draw_dsc); + + lv_area_t clip_area_ori = layer->_clip_area; + + lv_image_get_pivot(obj, &draw_dsc.pivot); + draw_dsc.scale_x = img->scale_x; + draw_dsc.scale_y = img->scale_y; + draw_dsc.rotation = img->rotation; + draw_dsc.antialias = img->antialias; + draw_dsc.blend_mode = img->blend_mode; + draw_dsc.bitmap_mask_src = img->bitmap_mask_src; + draw_dsc.src = img->src; + + lv_area_t img_area = {obj->coords.x1, obj->coords.y1, + obj->coords.x1 + img->w - 1, obj->coords.y1 + img->h - 1 + }; + if(img->align < _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + lv_area_align(&obj->coords, &img_area, img->align, img->offset.x, img->offset.y); + } + else if(img->align == LV_IMAGE_ALIGN_TILE) { + _lv_area_intersect(&layer->_clip_area, &layer->_clip_area, &obj->coords); + lv_area_move(&img_area, img->offset.x, img->offset.y); + + lv_area_move(&img_area, + ((layer->_clip_area.x1 - img_area.x1 - (img->w - 1)) / img->w) * img->w, + ((layer->_clip_area.y1 - img_area.y1 - (img->h - 1)) / img->h) * img->h); + draw_dsc.tile = 1; + } + + lv_draw_image(layer, &draw_dsc, &img_area); + layer->_clip_area = clip_area_ori; + + } + else if(img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + label_dsc.text = img->src; + lv_draw_label(layer, &label_dsc, &obj->coords); + } + else if(img->src == NULL) { + /*Do not need to draw image when src is NULL*/ + LV_LOG_WARN("image source is NULL"); + } + else { + /*Trigger the error handler of image draw*/ + LV_LOG_WARN("image source type is unknown"); + } + } +} + +static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y) +{ + lv_image_t * img = (lv_image_t *)obj; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); + + img->scale_x = scale_x; + img->scale_y = scale_y; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + _lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); +} + +static void update_align(lv_obj_t * obj) +{ + lv_image_t * img = (lv_image_t *)obj; + if(img->align == LV_IMAGE_ALIGN_STRETCH) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + int32_t scale_x = lv_obj_get_width(obj) * LV_SCALE_NONE / img->w; + int32_t scale_y = lv_obj_get_height(obj) * LV_SCALE_NONE / img->h; + scale_update(obj, scale_x, scale_y); + } + else if(img->align == LV_IMAGE_ALIGN_TILE) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + scale_update(obj, LV_SCALE_NONE, LV_SCALE_NONE); + + } +} +#endif diff --git a/libraries/lvgl/src/widgets/image/lv_image.h b/libraries/lvgl/src/widgets/image/lv_image.h new file mode 100644 index 0000000..4b58c14 --- /dev/null +++ b/libraries/lvgl/src/widgets/image/lv_image.h @@ -0,0 +1,345 @@ +/** + * @file lv_img.h + * + */ + +#ifndef LV_IMAGE_H +#define LV_IMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_IMAGE != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../../core/lv_obj.h" +#include "../../misc/lv_fs.h" +#include "../../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data of image + */ +typedef struct { + lv_obj_t obj; + const void * src; /**< Image source: Pointer to an array or a file or a symbol*/ + const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */ + lv_point_t offset; + int32_t w; /**< Width of the image (Handled by the library)*/ + int32_t h; /**< Height of the image (Handled by the library)*/ + uint32_t rotation; /**< Rotation angle of the image*/ + uint32_t scale_x; /**< 256 means no zoom, 512 double size, 128 half size*/ + uint32_t scale_y; /**< 256 means no zoom, 512 double size, 128 half size*/ + lv_point_t pivot; /**< Rotation center of the image*/ + uint32_t src_type : 2; /**< See: lv_image_src_t*/ + uint32_t cf : 5; /**< Color format from `lv_color_format_t`*/ + uint32_t antialias : 1; /**< Apply anti-aliasing in transformations (rotate, zoom)*/ + uint32_t align: 4; /**< Image size mode when image size and object size is different. See `lv_image_align_t`*/ + uint32_t blend_mode: 4; /**< Element of `lv_blend_mode_t`*/ +} lv_image_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_image_class; + +/** + * Image size mode, when image size and object size is different + */ +enum _lv_image_align_t { + LV_IMAGE_ALIGN_DEFAULT = 0, + LV_IMAGE_ALIGN_TOP_LEFT, + LV_IMAGE_ALIGN_TOP_MID, + LV_IMAGE_ALIGN_TOP_RIGHT, + LV_IMAGE_ALIGN_BOTTOM_LEFT, + LV_IMAGE_ALIGN_BOTTOM_MID, + LV_IMAGE_ALIGN_BOTTOM_RIGHT, + LV_IMAGE_ALIGN_LEFT_MID, + LV_IMAGE_ALIGN_RIGHT_MID, + LV_IMAGE_ALIGN_CENTER, + _LV_IMAGE_ALIGN_AUTO_TRANSFORM, + LV_IMAGE_ALIGN_STRETCH, + LV_IMAGE_ALIGN_TILE, +}; + +#ifdef DOXYGEN +typedef _lv_image_align_t lv_image_align_t; +#else +typedef uint8_t lv_image_align_t; +#endif /*DOXYGEN*/ + +#if LV_USE_OBJ_PROPERTY +enum { + LV_PROPERTY_ID(IMAGE, SRC, LV_PROPERTY_TYPE_IMGSRC, 0), + LV_PROPERTY_ID(IMAGE, OFFSET_X, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(IMAGE, OFFSET_Y, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(IMAGE, ROTATION, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(IMAGE, PIVOT, LV_PROPERTY_TYPE_POINTER, 4), + LV_PROPERTY_ID(IMAGE, SCALE, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(IMAGE, SCALE_X, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(IMAGE, SCALE_Y, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(IMAGE, BLEND_MODE, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(IMAGE, ANTIALIAS, LV_PROPERTY_TYPE_INT, 9), + LV_PROPERTY_ID(IMAGE, ALIGN, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_IMAGE_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image object + * @param parent pointer to an object, it will be the parent of the new image + * @return pointer to the created image + */ +lv_obj_t * lv_image_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image data to display on the object + * @param obj pointer to an image object + * @param src 1) pointer to an ::lv_image_dsc_t descriptor (converted by LVGL's image converter) (e.g. &my_img) or + * 2) path to an image file (e.g. "S:/dir/img.bin")or + * 3) a SYMBOL (e.g. LV_SYMBOL_OK) + */ +void lv_image_set_src(lv_obj_t * obj, const void * src); + +/** + * Set an offset for the source of an image so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param x the new offset along x axis. + */ +void lv_image_set_offset_x(lv_obj_t * obj, int32_t x); + +/** + * Set an offset for the source of an image. + * so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param y the new offset along y axis. + */ +void lv_image_set_offset_y(lv_obj_t * obj, int32_t y); + +/** + * Set the rotation angle of the image. + * The image will be rotated around the set pivot set by `lv_image_set_pivot()` + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param angle rotation in degree with 0.1 degree resolution (0..3600: clock wise) + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation will be set to 0 automatically. + * + */ +void lv_image_set_rotation(lv_obj_t * obj, int32_t angle); + +/** + * Set the rotation center of the image. + * The image will be rotated around this point. + * x, y can be set with value of LV_PCT, lv_image_get_pivot will return the true pixel coordinate of pivot in this case. + * @param obj pointer to an image object + * @param x rotation center x of the image + * @param y rotation center y of the image + */ +void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Set pivot similar to get_pivot + */ +static inline void _lv_image_set_pivot(lv_obj_t * obj, lv_point_t * pivot) +{ + lv_image_set_pivot(obj, pivot->x, pivot->y); +} + +/** + * Set the zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param img pointer to an image object + * @param zoom the zoom factor. + * @example 256 or LV_ZOOM_IMAGE_NONE for no zoom + * @example <256: scale down + * @example >256 scale up + * @example 128 half size + * @example 512 double size + */ +void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the horizontal zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param img pointer to an image object + * @param zoom the zoom factor. + * @example 256 or LV_ZOOM_IMAGE_NONE for no zoom + * @example <256: scale down + * @example >256 scale up + * @example 128 half size + * @example 512 double size + */ +void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the vertical zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param img pointer to an image object + * @param zoom the zoom factor. + * @example 256 or LV_ZOOM_IMAGE_NONE for no zoom + * @example <256: scale down + * @example >256 scale up + * @example 128 half size + * @example 512 double size + */ +void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the blend mode of an image. + * @param obj pointer to an image object + * @param blend_mode the new blend mode + */ +void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode); + +/** + * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not. + * The quality is better with anti-aliasing looks better but slower. + * @param obj pointer to an image object + * @param antialias true: anti-aliased; false: not anti-aliased + */ +void lv_image_set_antialias(lv_obj_t * obj, bool antialias); + +/** + * Set the image object size mode. + * @param obj pointer to an image object + * @param align the new align mode. + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation, scale and pivot will be overwritten and controlled internally. + */ +void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align); + +/** + * Set an A8 bitmap mask for the image. + * @param obj pointer to an image object + * @param src an lv_image_dsc_t bitmap mask source. + */ +void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the source of the image + * @param obj pointer to an image object + * @return the image source (symbol, file name or ::lv-img_dsc_t for C arrays) + */ +const void * lv_image_get_src(lv_obj_t * obj); + +/** + * Get the offset's x attribute of the image object. + * @param obj pointer to an image + * @return offset X value. + */ +int32_t lv_image_get_offset_x(lv_obj_t * obj); + +/** + * Get the offset's y attribute of the image object. + * @param obj pointer to an image + * @return offset Y value. + */ +int32_t lv_image_get_offset_y(lv_obj_t * obj); + +/** + * Get the rotation of the image. + * @param obj pointer to an image object + * @return rotation in 0.1 degrees (0..3600) + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation will be set to 0 automatically. + */ +int32_t lv_image_get_rotation(lv_obj_t * obj); + +/** + * Get the pivot (rotation center) of the image. + * If pivot is set with LV_PCT, convert it to px before return. + * @param obj pointer to an image object + * @param pivot store the rotation center here + */ +void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot); + +/** + * Get the zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale(lv_obj_t * obj); + +/** + * Get the horizontal zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale_x(lv_obj_t * obj); + +/** + * Get the vertical zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale_y(lv_obj_t * obj); + +/** + * Get the current blend mode of the image + * @param obj pointer to an image object + * @return the current blend mode + */ +lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj); + +/** + * Get whether the transformations (rotate, zoom) are anti-aliased or not + * @param obj pointer to an image object + * @return true: anti-aliased; false: not anti-aliased + */ +bool lv_image_get_antialias(lv_obj_t * obj); + +/** + * Get the size mode of the image + * @param obj pointer to an image object + * @return element of @ref lv_image_align_t + */ +lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj); + +/** + * Get the bitmap mask source. + * @param obj pointer to an image object + * @return an lv_image_dsc_t bitmap mask source. + */ +const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +/** Use this macro to declare an image in a C file*/ +#define LV_IMAGE_DECLARE(var_name) extern const lv_image_dsc_t var_name + +#endif /*LV_USE_IMAGE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_H*/ diff --git a/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.c b/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.c new file mode 100644 index 0000000..dcecf95 --- /dev/null +++ b/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.c @@ -0,0 +1,335 @@ +/** + * @file lv_imagebutton.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_imagebutton.h" + +#if LV_USE_IMAGEBUTTON != 0 + +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_imagebutton_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_main(lv_event_t * e); +static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void refr_image(lv_obj_t * imagebutton); +static lv_imagebutton_state_t suggest_state(lv_obj_t * imagebutton, lv_imagebutton_state_t state); +static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton); +static void update_src_info(lv_imagebutton_src_info_t * info, const void * src); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_imagebutton_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_imagebutton_t), + .constructor_cb = lv_imagebutton_constructor, + .event_cb = lv_imagebutton_event, + .name = "imagebutton", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_imagebutton_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_imagebutton_set_src(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left, const void * src_mid, + const void * src_right) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + update_src_info(&imagebutton->src_left[state], src_left); + update_src_info(&imagebutton->src_mid[state], src_mid); + update_src_info(&imagebutton->src_right[state], src_right); + + refr_image(obj); +} + +void lv_imagebutton_set_state(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t obj_state = LV_STATE_DEFAULT; + if(state == LV_IMAGEBUTTON_STATE_PRESSED || + state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED) obj_state |= LV_STATE_PRESSED; + if(state == LV_IMAGEBUTTON_STATE_DISABLED || + state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED) obj_state |= LV_STATE_DISABLED; + if(state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED || state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED || + state == LV_IMAGEBUTTON_STATE_CHECKED_RELEASED) { + obj_state |= LV_STATE_CHECKED; + } + + lv_obj_remove_state(obj, LV_STATE_CHECKED | LV_STATE_PRESSED | LV_STATE_DISABLED); + lv_obj_add_state(obj, obj_state); + + refr_image(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const void * lv_imagebutton_get_src_left(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_left[state].img_src; +} + +const void * lv_imagebutton_get_src_middle(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_mid[state].img_src; +} + +const void * lv_imagebutton_get_src_right(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_right[state].img_src; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + /*Initialize the allocated 'ext'*/ + + lv_memzero(&imagebutton->src_mid, sizeof(imagebutton->src_mid)); + lv_memzero(&imagebutton->src_left, sizeof(imagebutton->src_left)); + lv_memzero(&imagebutton->src_right, sizeof(imagebutton->src_right)); +} + +static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res = lv_obj_event_base(&lv_imagebutton_class, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + refr_image(obj); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res != LV_COVER_RES_MASKED) info->res = LV_COVER_RES_NOT_COVER; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_self_size_info(e); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + if(imagebutton->src_left[state].img_src == NULL && + imagebutton->src_mid[state].img_src != NULL && + imagebutton->src_right[state].img_src == NULL) { + p->x = LV_MAX(p->x, imagebutton->src_mid[state].header.w); + } + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + /*Just draw_main an image*/ + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + + /*Simply draw the middle src if no tiled*/ + lv_imagebutton_src_info_t * src_info = &imagebutton->src_left[state]; + + int32_t tw = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t th = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, tw, th); + + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &img_dsc); + + lv_area_t coords_part; + int32_t left_w = 0; + int32_t right_w = 0; + + if(src_info->img_src) { + left_w = src_info->header.w; + coords_part.x1 = coords.x1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x1 + src_info->header.w - 1; + coords_part.y2 = coords.y1 + src_info->header.h - 1; + img_dsc.src = src_info->img_src; + lv_draw_image(layer, &img_dsc, &coords_part); + } + + src_info = &imagebutton->src_right[state]; + if(src_info->img_src) { + right_w = src_info->header.w; + coords_part.x1 = coords.x2 - src_info->header.w + 1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x2; + coords_part.y2 = coords.y1 + src_info->header.h - 1; + img_dsc.src = src_info->img_src; + lv_draw_image(layer, &img_dsc, &coords_part); + } + + src_info = &imagebutton->src_mid[state]; + if(src_info->img_src) { + coords_part.x1 = coords.x1 + left_w; + coords_part.x2 = coords.x2 - right_w; + coords_part.y1 = coords.y1; + coords_part.y2 = coords.y2; + + lv_area_t clip_area_center; + if(_lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) { + lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area_center; + img_dsc.src = src_info->img_src; + img_dsc.tile = 1; + lv_draw_image(layer, &img_dsc, &coords_part); + layer->_clip_area = clip_area_ori; + } + + } +} + +static void refr_image(lv_obj_t * obj) +{ + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + + const void * src = imagebutton->src_mid[state].img_src; + if(src == NULL) return; + + lv_obj_refresh_self_size(obj); + lv_obj_set_height(obj, imagebutton->src_mid[state].header.h); /*Keep the user defined width*/ + + lv_obj_invalidate(obj); +} + +/** + * If `src` is not defined for the current state try to get a state which is related to the current but has `src`. + * E.g. if the PRESSED src is not set but the RELEASED does, use the RELEASED. + * @param imagebutton pointer to an image button + * @param state the state to convert + * @return the suggested state + */ +static lv_imagebutton_state_t suggest_state(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + if(imagebutton->src_mid[state].img_src == NULL) { + switch(state) { + case LV_IMAGEBUTTON_STATE_PRESSED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_RELEASED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_PRESSED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_PRESSED].img_src) return LV_IMAGEBUTTON_STATE_PRESSED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_DISABLED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_DISABLED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + default: + break; + } + } + + return state; +} + +static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton) +{ + LV_ASSERT_OBJ(imagebutton, MY_CLASS); + + lv_state_t obj_state = lv_obj_get_state(imagebutton); + + if(obj_state & LV_STATE_DISABLED) { + if(obj_state & LV_STATE_CHECKED) return LV_IMAGEBUTTON_STATE_CHECKED_DISABLED; + else return LV_IMAGEBUTTON_STATE_DISABLED; + } + + if(obj_state & LV_STATE_CHECKED) { + if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_CHECKED_PRESSED; + else return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + } + else { + if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_PRESSED; + else return LV_IMAGEBUTTON_STATE_RELEASED; + } +} + +static void update_src_info(lv_imagebutton_src_info_t * info, const void * src) +{ + if(!src) { + lv_memzero(info, sizeof(lv_imagebutton_src_info_t)); + return; + } + + lv_result_t res = lv_image_decoder_get_info(src, &info->header); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("can't get info"); + return; + } + + info->img_src = src; +} + +#endif diff --git a/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.h b/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.h new file mode 100644 index 0000000..1f91eb6 --- /dev/null +++ b/libraries/lvgl/src/widgets/imagebutton/lv_imagebutton.h @@ -0,0 +1,134 @@ +/** + * @file lv_imagebutton.h + * + */ + +#ifndef LV_IMAGEBUTTON_H +#define LV_IMAGEBUTTON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_IMAGEBUTTON != 0 + +/********************* + * DEFINES + *********************/ +typedef enum { + LV_IMAGEBUTTON_STATE_RELEASED, + LV_IMAGEBUTTON_STATE_PRESSED, + LV_IMAGEBUTTON_STATE_DISABLED, + LV_IMAGEBUTTON_STATE_CHECKED_RELEASED, + LV_IMAGEBUTTON_STATE_CHECKED_PRESSED, + LV_IMAGEBUTTON_STATE_CHECKED_DISABLED, + _LV_IMAGEBUTTON_STATE_NUM, +} lv_imagebutton_state_t; + +typedef struct { + const void * img_src; + lv_image_header_t header; +} lv_imagebutton_src_info_t; + +/********************** + * TYPEDEFS + **********************/ +/*Data of image button*/ +typedef struct { + lv_obj_t obj; + lv_imagebutton_src_info_t src_mid[_LV_IMAGEBUTTON_STATE_NUM]; /*Store center images to each state*/ + lv_imagebutton_src_info_t src_left[_LV_IMAGEBUTTON_STATE_NUM]; /*Store left side images to each state*/ + lv_imagebutton_src_info_t src_right[_LV_IMAGEBUTTON_STATE_NUM]; /*Store right side images to each state*/ +} lv_imagebutton_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_imagebutton_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image button object + * @param parent pointer to an object, it will be the parent of the new image button + * @return pointer to the created image button + */ +lv_obj_t * lv_imagebutton_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set images for a state of the image button + * @param imagebutton pointer to an image button object + * @param state for which state set the new image + * @param src_left pointer to an image source for the left side of the button (a C array or path to + * a file) + * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C + * array or path to a file) + * @param src_right pointer to an image source for the right side of the button (a C array or path + * to a file) + */ +void lv_imagebutton_set_src(lv_obj_t * imagebutton, lv_imagebutton_state_t state, const void * src_left, + const void * src_mid, + const void * src_right); + +/** + * Use this function instead of `lv_obj_add/remove_state` to set a state manually + * @param imagebutton pointer to an image button object + * @param state the new state + */ +void lv_imagebutton_set_state(lv_obj_t * imagebutton, lv_imagebutton_state_t state); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the left image in a given state + * @param imagebutton pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_left(lv_obj_t * imagebutton, lv_imagebutton_state_t state); + +/** + * Get the middle image in a given state + * @param imagebutton pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the middle image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_middle(lv_obj_t * imagebutton, lv_imagebutton_state_t state); + +/** + * Get the right image in a given state + * @param imagebutton pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_right(lv_obj_t * imagebutton, lv_imagebutton_state_t state); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMAGEBUTTON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGEBUTTON_H*/ diff --git a/libraries/lvgl/src/widgets/keyboard/lv_keyboard.c b/libraries/lvgl/src/widgets/keyboard/lv_keyboard.c new file mode 100644 index 0000000..abc431c --- /dev/null +++ b/libraries/lvgl/src/widgets/keyboard/lv_keyboard.c @@ -0,0 +1,440 @@ + +/** + * @file lv_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_keyboard.h" +#if LV_USE_KEYBOARD + +#include "../textarea/lv_textarea.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" + +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_keyboard_class) +#define LV_KB_BTN(width) LV_BUTTONMATRIX_CTRL_POPOVER | width + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +static void lv_keyboard_update_map(lv_obj_t * obj); + +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_keyboard_class = { + .constructor_cb = lv_keyboard_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(50), + .instance_size = sizeof(lv_keyboard_t), + .editable = 1, + .base_class = &lv_buttonmatrix_class, + .name = "keyboard", +}; + +static const char * const default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", + LV_SYMBOL_KEYBOARD, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + "أب", +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_lc_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +static const char * const default_kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + "أب", +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_uc_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 +static const char * const default_kb_map_ar[] = { + "1#", "ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "\n", + "ش", "س", "ي", "ب", "ل", "ا", "ت", "ن", "م", "ك", "ط", LV_SYMBOL_BACKSPACE, "\n", + "ذ", "ء", "ؤ", "ر", "ى", "ة", "و", "ز", "ظ", "د", "ز", "ظ", "د", "\n", + LV_SYMBOL_CLOSE, "abc", LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_NEW_LINE, LV_SYMBOL_OK, "" +}; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_ar_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, 2, 6, 2, 3, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; +#endif + +static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", + "abc", "+", "&", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", + LV_SYMBOL_KEYBOARD, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + "أب", +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_spec_map[] = { + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | 2, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +static const char * const default_kb_map_num[] = {"1", "2", "3", LV_SYMBOL_KEYBOARD, "\n", + "4", "5", "6", LV_SYMBOL_OK, "\n", + "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", + "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_num_map[] = { + 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, + 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, + 1, 1, 1, 2, + 1, 1, 1, 1, 1 +}; + +static const char * * kb_map[10] = { + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_uc, + (const char * *)default_kb_map_spec, + (const char * *)default_kb_map_num, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, + (const char * *)default_kb_map_lc, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + (const char * *)default_kb_map_ar, +#endif + (const char * *)NULL +}; +static const lv_buttonmatrix_ctrl_t * kb_ctrl[10] = { + default_kb_ctrl_lc_map, + default_kb_ctrl_uc_map, + default_kb_ctrl_spec_map, + default_kb_ctrl_num_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + default_kb_ctrl_ar_map, +#endif + NULL +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_keyboard_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_keyboard_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta) +{ + if(ta) { + LV_ASSERT_OBJ(ta, &lv_textarea_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + /*Hide the cursor of the old Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_remove_state(obj, LV_STATE_FOCUSED); + } + + keyboard->ta = ta; + + /*Show the cursor of the new Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_add_flag(obj, LV_STATE_FOCUSED); + } +} + +void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + if(keyboard->mode == mode) return; + + keyboard->mode = mode; + lv_keyboard_update_map(obj); +} + +void lv_keyboard_set_popovers(lv_obj_t * obj, bool en) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers == en) { + return; + } + + keyboard->popovers = en; + lv_keyboard_update_ctrl_map(obj); +} + +void lv_keyboard_set_map(lv_obj_t * obj, lv_keyboard_mode_t mode, const char * map[], + const lv_buttonmatrix_ctrl_t ctrl_map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + kb_map[mode] = map; + kb_ctrl[mode] = ctrl_map; + lv_keyboard_update_map(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->ta; +} + +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->mode; +} + +bool lv_buttonmatrix_get_popovers(const lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->popovers; +} + +/*===================== + * Other functions + *====================*/ + +void lv_keyboard_def_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + uint32_t btn_id = lv_buttonmatrix_get_selected_button(obj); + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; + + const char * txt = lv_buttonmatrix_get_button_text(obj, btn_id); + if(txt == NULL) return; + + if(lv_strcmp(txt, "abc") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]); + lv_keyboard_update_ctrl_map(obj); + return; + } +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + else if(lv_strcmp(txt, "أب") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_ARABIC; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_ARABIC]); + lv_keyboard_update_ctrl_map(obj); + return; + } +#endif + else if(lv_strcmp(txt, "ABC") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_UPPER; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_UPPER]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(lv_strcmp(txt, "1#") == 0) { + keyboard->mode = LV_KEYBOARD_MODE_SPECIAL; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_SPECIAL]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(lv_strcmp(txt, LV_SYMBOL_CLOSE) == 0 || lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); + if(res != LV_RESULT_OK) return; + + if(keyboard->ta) { + res = lv_obj_send_event(keyboard->ta, LV_EVENT_CANCEL, NULL); + if(res != LV_RESULT_OK) return; + } + return; + } + else if(lv_strcmp(txt, LV_SYMBOL_OK) == 0) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + + if(keyboard->ta) { + res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + } + return; + } + + /*Add the characters to the text area if set*/ + if(keyboard->ta == NULL) return; + + if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + lv_textarea_add_char(keyboard->ta, '\n'); + if(lv_textarea_get_one_line(keyboard->ta)) { + lv_result_t res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { + lv_textarea_cursor_left(keyboard->ta); + } + else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + lv_textarea_cursor_right(keyboard->ta); + } + else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + lv_textarea_delete_char(keyboard->ta); + } + else if(lv_strcmp(txt, "+/-") == 0) { + uint32_t cur = lv_textarea_get_cursor_pos(keyboard->ta); + const char * ta_txt = lv_textarea_get_text(keyboard->ta); + if(ta_txt[0] == '-') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_delete_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '+'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else if(ta_txt[0] == '+') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_delete_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else { + lv_textarea_set_cursor_pos(keyboard->ta, 0); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur + 1); + } + } + else { + lv_textarea_add_text(keyboard->ta, txt); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + keyboard->ta = NULL; + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + keyboard->popovers = 0; + + lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_add_event_cb(obj, lv_keyboard_def_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_style_base_dir(obj, LV_BASE_DIR_LTR, 0); + + lv_keyboard_update_map(obj); +} + +/** + * Update the key and control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + lv_buttonmatrix_set_map(obj, kb_map[keyboard->mode]); + lv_keyboard_update_ctrl_map(obj); +} + +/** + * Update the control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers) { + /*Apply the current control map (already includes LV_BUTTONMATRIX_CTRL_POPOVER flags)*/ + lv_buttonmatrix_set_ctrl_map(obj, kb_ctrl[keyboard->mode]); + } + else { + /*Make a copy of the current control map*/ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_buttonmatrix_ctrl_t * ctrl_map = lv_malloc(btnm->btn_cnt * sizeof(lv_buttonmatrix_ctrl_t)); + lv_memcpy(ctrl_map, kb_ctrl[keyboard->mode], sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); + + /*Remove all LV_BUTTONMATRIX_CTRL_POPOVER flags*/ + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + ctrl_map[i] &= (~LV_BUTTONMATRIX_CTRL_POPOVER); + } + + /*Apply new control map and clean up*/ + lv_buttonmatrix_set_ctrl_map(obj, ctrl_map); + lv_free(ctrl_map); + } +} + +#endif /*LV_USE_KEYBOARD*/ diff --git a/libraries/lvgl/src/widgets/keyboard/lv_keyboard.h b/libraries/lvgl/src/widgets/keyboard/lv_keyboard.h new file mode 100644 index 0000000..c2c84ba --- /dev/null +++ b/libraries/lvgl/src/widgets/keyboard/lv_keyboard.h @@ -0,0 +1,196 @@ +/** + * @file lv_keyboard.h + * + */ + +#ifndef LV_KEYBOARD_H +#define LV_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../buttonmatrix/lv_buttonmatrix.h" + +#if LV_USE_KEYBOARD + +/*Testing of dependencies*/ +#if LV_USE_BUTTONMATRIX == 0 +#error "lv_buttonmatrix is required. Enable it in lv_conf.h (LV_USE_BUTTONMATRIX 1) " +#endif + +#if LV_USE_TEXTAREA == 0 +#error "lv_textare is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_KEYBOARD_CTRL_BUTTON_FLAGS (LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_CHECKED) + +/********************** + * TYPEDEFS + **********************/ + +/** Current keyboard mode.*/ +enum _lv_keyboard_mode_t { + LV_KEYBOARD_MODE_TEXT_LOWER, + LV_KEYBOARD_MODE_TEXT_UPPER, + LV_KEYBOARD_MODE_SPECIAL, + LV_KEYBOARD_MODE_NUMBER, + LV_KEYBOARD_MODE_USER_1, + LV_KEYBOARD_MODE_USER_2, + LV_KEYBOARD_MODE_USER_3, + LV_KEYBOARD_MODE_USER_4, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_MODE_TEXT_ARABIC +#endif +}; + +#ifdef DOXYGEN +typedef _lv_keyboard_mode_t lv_keyboard_mode_t; +#else +typedef uint8_t lv_keyboard_mode_t; +#endif /*DOXYGEN*/ + +/*Data of keyboard*/ +typedef struct { + lv_buttonmatrix_t btnm; + lv_obj_t * ta; /*Pointer to the assigned text area*/ + lv_keyboard_mode_t mode; /*Key map type*/ + uint8_t popovers : 1; /*Show button titles in popovers on press*/ +} lv_keyboard_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_keyboard_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Keyboard object + * @param parent pointer to an object, it will be the parent of the new keyboard + * @return pointer to the created keyboard + */ +lv_obj_t * lv_keyboard_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @param ta pointer to a Text Area object to write there + */ +void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta); + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @param mode the mode from 'lv_keyboard_mode_t' + */ +void lv_keyboard_set_mode(lv_obj_t * kb, lv_keyboard_mode_t mode); + +/** + * Show the button title in a popover when pressed. + * @param kb pointer to a Keyboard object + * @param en whether "popovers" mode is enabled + */ +void lv_keyboard_set_popovers(lv_obj_t * kb, bool en); + +/** + * Set a new map for the keyboard + * @param kb pointer to a Keyboard object + * @param mode keyboard map to alter 'lv_keyboard_mode_t' + * @param map pointer to a string array to describe the map. + * See 'lv_buttonmatrix_set_map()' for more info. + * @param ctrl_map See 'lv_buttonmatrix_set_ctrl_map()' for more info. + + */ +void lv_keyboard_set_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const char * map[], + const lv_buttonmatrix_ctrl_t ctrl_map[]); + +/*===================== + * Getter functions + *====================*/ + +/** + * Assign a Text Area to the Keyboard. The pressed characters will be put there. + * @param kb pointer to a Keyboard object + * @return pointer to the assigned Text Area object + */ +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb); + +/** + * Set a new a mode (text or number map) + * @param kb pointer to a Keyboard object + * @return the current mode from 'lv_keyboard_mode_t' + */ +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * kb); + +/** + * Tell whether "popovers" mode is enabled or not. + * @param obj pointer to a Keyboard object + * @return true: "popovers" mode is enabled; false: disabled + */ +bool lv_buttonmatrix_get_popovers(const lv_obj_t * obj); + +/** + * Get the current map of a keyboard + * @param kb pointer to a keyboard object + * @return the current map + */ +static inline const char ** lv_keyboard_get_map_array(const lv_obj_t * kb) +{ + return lv_buttonmatrix_get_map(kb); +} + +/** + * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) + * Useful in the `event_cb` to get the text of the button, check if hidden etc. + * @param obj pointer to button matrix object + * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) + */ +static inline uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) +{ + return lv_buttonmatrix_get_selected_button(obj); +} + +/** + * Get the button's text + * @param obj pointer to button matrix object + * @param btn_id the index a button not counting new line characters. + * @return text of btn_index` button + */ +static inline const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id) +{ + return lv_buttonmatrix_get_button_text(obj, btn_id); +} + +/*===================== + * Other functions + *====================*/ + +/** + * Default keyboard event to add characters to the Text area and change the map. + * If a custom `event_cb` is added to the keyboard this function can be called from it to handle the + * button clicks + * @param e the triggering event + */ +void lv_keyboard_def_event_cb(lv_event_t * e); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_KEYBOARD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_KEYBOARD_H*/ diff --git a/libraries/lvgl/src/widgets/label/lv_label.c b/libraries/lvgl/src/widgets/label/lv_label.c new file mode 100644 index 0000000..09fc5b6 --- /dev/null +++ b/libraries/lvgl/src/widgets/label/lv_label.c @@ -0,0 +1,1277 @@ +/** + * @file lv_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_label.h" +#if LV_USE_LABEL != 0 +#include "../../core/lv_obj.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_group.h" +#include "../../display/lv_display.h" +#include "../../draw/lv_draw.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_bidi.h" +#include "../../misc/lv_text_ap.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_label_class) + +#define LV_LABEL_DEF_SCROLL_SPEED lv_anim_speed_clamped(40, 300, 10000) +#define LV_LABEL_SCROLL_DELAY 300 +#define LV_LABEL_DOT_END_INV 0xFFFFFFFF +#define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_label_refr_text(lv_obj_t * obj); +static void lv_label_revert_dots(lv_obj_t * label); + +static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint32_t len); +static char * lv_label_get_dot_tmp(lv_obj_t * label); +static void lv_label_dot_tmp_free(lv_obj_t * label); +static void set_ofs_x_anim(void * obj, int32_t v); +static void set_ofs_y_anim(void * obj, int32_t v); +static size_t get_text_length(const char * text); +static void copy_text_to_label(lv_label_t * label, const char * text); +static lv_text_flag_t get_label_flags(lv_label_t * label); +static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, + uint32_t length, const lv_font_t * font, int32_t letter_space, lv_area_t * txt_coords); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_label_class = { + .constructor_cb = lv_label_constructor, + .destructor_cb = lv_label_destructor, + .event_cb = lv_label_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_obj_class, + .name = "label", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_label_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_label_set_text(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + lv_obj_invalidate(obj); + + /*If text is NULL then just refresh with the current text*/ + if(text == NULL) text = label->text; + + const size_t text_len = get_text_length(text); + + /*If set its own text then reallocate it (maybe its size changed)*/ + if(label->text == text && label->static_txt == 0) { + label->text = lv_realloc(label->text, text_len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_text_ap_proc(label->text, label->text); +#endif + + } + else { + /*Free the old text*/ + if(label->text != NULL && label->static_txt == 0) { + lv_free(label->text); + label->text = NULL; + } + + label->text = lv_malloc(text_len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + copy_text_to_label(label, text); + + /*Now the text is dynamically allocated*/ + label->static_txt = 0; + } + + lv_label_refr_text(obj); +} + +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_obj_invalidate(obj); + lv_label_t * label = (lv_label_t *)obj; + + /*If text is NULL then refresh*/ + if(fmt == NULL) { + lv_label_refr_text(obj); + return; + } + + if(label->text != NULL && label->static_txt == 0) { + lv_free(label->text); + label->text = NULL; + } + + va_list args; + va_start(args, fmt); + label->text = _lv_text_set_text_vfmt(fmt, args); + va_end(args); + label->static_txt = 0; /*Now the text is dynamically allocated*/ + + lv_label_refr_text(obj); +} + +void lv_label_set_text_static(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + if(label->static_txt == 0 && label->text != NULL) { + lv_free(label->text); + label->text = NULL; + } + + if(text != NULL) { + label->static_txt = 1; + label->text = (char *)text; + } + + lv_label_refr_text(obj); +} + +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + + /*Delete the old animation (if exists)*/ + lv_anim_delete(obj, set_ofs_x_anim); + lv_anim_delete(obj, set_ofs_y_anim); + lv_point_set(&label->offset, 0, 0); + + if(long_mode == LV_LABEL_LONG_SCROLL || long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR || long_mode == LV_LABEL_LONG_CLIP) + label->expand = 1; + else + label->expand = 0; + + /*Restore the character under the dots*/ + if(label->long_mode == LV_LABEL_LONG_DOT && label->dot_end != LV_LABEL_DOT_END_INV) { + lv_label_revert_dots(obj); + } + + label->long_mode = long_mode; + lv_label_refr_text(obj); +} + +void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_start = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_end = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +/*===================== + * Getter functions + *====================*/ + +char * lv_label_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->text; +} + +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->long_mode; +} + +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_label_t * label = (lv_label_t *)obj; + const char * txt = lv_label_get_text(obj); + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, txt); + + if(txt[0] == '\0') { + pos->y = 0; + switch(align) { + case LV_TEXT_ALIGN_LEFT: + pos->x = 0; + break; + case LV_TEXT_ALIGN_RIGHT: + pos->x = lv_obj_get_content_width(obj); + break; + case LV_TEXT_ALIGN_CENTER: + pos->x = lv_obj_get_content_width(obj) / 2; + break; + default: + break; + } + return; + } + + lv_text_flag_t flag = get_label_flags(label); + + const uint32_t byte_id = _lv_text_encoded_get_byte_id(txt, char_id); + /*Search the line of the index letter*/ + const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const int32_t max_w = lv_area_get_width(&txt_coords); + + int32_t y = 0; + uint32_t line_start = 0; + uint32_t new_line_start = 0; + while(txt[new_line_start] != '\0') { + new_line_start += _lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + if(byte_id < new_line_start || txt[new_line_start] == '\0') + break; /*The line of 'index' letter begins at 'line_start'*/ + + y += letter_height + line_space; + line_start = new_line_start; + } + + /*If the last character is line break then go to the next line*/ + if(byte_id > 0) { + if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { + y += letter_height + line_space; + line_start = byte_id; + } + } + + const char * bidi_txt; + uint32_t visual_byte_pos; +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = _lv_bidi_detect_base_dir(txt); + + char * mutable_bidi_txt = NULL; + /*Handle Bidi*/ + if(new_line_start == byte_id) { + visual_byte_pos = base_dir == LV_BASE_DIR_RTL ? 0 : byte_id - line_start; + bidi_txt = &txt[line_start]; + } + else { + uint32_t line_char_id = _lv_text_encoded_get_char_id(&txt[line_start], byte_id - line_start); + + bool is_rtl; + uint32_t visual_char_pos = _lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, + base_dir, line_char_id, &is_rtl); + bidi_txt = mutable_bidi_txt; + if(is_rtl) visual_char_pos++; + + visual_byte_pos = _lv_text_encoded_get_byte_id(bidi_txt, visual_char_pos); + } +#else + bidi_txt = &txt[line_start]; + visual_byte_pos = byte_id - line_start; +#endif + + /*Calculate the x coordinate*/ + int32_t x = lv_text_get_width(bidi_txt, visual_byte_pos, font, letter_space); + if(char_id != line_start) x += letter_space; + + uint32_t length = new_line_start - line_start; + calculate_x_coordinate(&x, align, bidi_txt, length, font, letter_space, &txt_coords); + pos->x = x; + pos->y = y; + +#if LV_USE_BIDI + if(mutable_bidi_txt) lv_free(mutable_bidi_txt); +#endif +} + +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi) +{ + LV_UNUSED(bidi); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos_in); + lv_label_t * label = (lv_label_t *)obj; + + lv_point_t pos; + pos.x = pos_in->x - lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + pos.y = pos_in->y - lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); + uint32_t line_start = 0; + uint32_t new_line_start = 0; + int32_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + int32_t y = 0; + + lv_text_flag_t flag = get_label_flags(label); + + /*Search the line of the index letter*/; + while(txt[line_start] != '\0') { + new_line_start += _lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + + if(pos.y <= y + letter_height) { + /*The line is found (stored in 'line_start')*/ + /*Include the NULL terminator in the last line*/ + uint32_t tmp = new_line_start; + uint32_t letter; + letter = _lv_text_encoded_prev(txt, &tmp); + if(letter != '\n' && txt[new_line_start] == '\0') new_line_start++; + break; + } + y += letter_height + line_space; + + line_start = new_line_start; + } + + char * bidi_txt; + +#if LV_USE_BIDI + uint32_t txt_len; + if(bidi) { + bidi_txt = lv_malloc(new_line_start - line_start + 1); + txt_len = new_line_start - line_start; + if(new_line_start > 0 && txt[new_line_start - 1] == '\0' && txt_len > 0) txt_len--; + _lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); + } + else +#endif + { + bidi_txt = (char *)txt + line_start; + } + + /*Calculate the x coordinate*/ + int32_t x = 0; + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + uint32_t length = new_line_start - line_start; + calculate_x_coordinate(&x, align, bidi_txt, length, font, letter_space, &txt_coords); + + uint32_t i = 0; + uint32_t i_act = i; + + if(new_line_start > 0) { + while(i + line_start < new_line_start) { + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + uint32_t letter; + uint32_t letter_next; + _lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + + int32_t gw = lv_font_get_glyph_width(font, letter, letter_next); + + /*Finish if the x position or the last char of the next line is reached*/ + if(pos.x < x + gw || i + line_start == new_line_start || txt[i_act + line_start] == '\0') { + i = i_act; + break; + } + x += gw; + x += letter_space; + i_act = i; + } + } + + uint32_t logical_pos; +#if LV_USE_BIDI + if(bidi) { + /*Handle Bidi*/ + uint32_t cid = _lv_text_encoded_get_char_id(bidi_txt, i); + if(txt[line_start + i] == '\0') { + logical_pos = i; + } + else { + bool is_rtl; + logical_pos = _lv_bidi_get_logical_pos(&txt[line_start], NULL, + txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); + if(is_rtl) logical_pos++; + } + lv_free(bidi_txt); + } + else +#endif + { + logical_pos = _lv_text_encoded_get_char_id(bidi_txt, i); + } + + return logical_pos + _lv_text_encoded_get_char_id(txt, line_start); +} + +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); + lv_label_t * label = (lv_label_t *)obj; + uint32_t line_start = 0; + uint32_t new_line_start = 0; + const int32_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + + lv_text_flag_t flag = get_label_flags(label); + + /*Search the line of the index letter*/ + int32_t y = 0; + while(txt[line_start] != '\0') { + new_line_start += _lv_text_get_next_line(&txt[line_start], font, letter_space, max_w, NULL, flag); + + if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ + y += letter_height + line_space; + + line_start = new_line_start; + } + + /*Calculate the x coordinate*/ + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + + int32_t x = 0; + if(align == LV_TEXT_ALIGN_CENTER) { + const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, letter_space); + x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, letter_space); + x += lv_area_get_width(&txt_coords) - line_w; + } + + int32_t last_x = 0; + uint32_t i = line_start; + uint32_t i_current = i; + uint32_t letter = '\0'; + uint32_t letter_next = '\0'; + + if(new_line_start > 0) { + while(i <= new_line_start - 1) { + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + _lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + last_x = x; + x += lv_font_get_glyph_width(font, letter, letter_next); + if(pos->x < x) { + i = i_current; + break; + } + x += letter_space; + i_current = i; + } + } + + const int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + letter_space + 1; + return (pos->x >= (last_x - letter_space) && pos->x <= (last_x + max_diff)); +} + +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_start; +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_end; +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +/*===================== + * Other functions + *====================*/ + +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_label_t * label = (lv_label_t *)obj; + + /*Can not append to static text*/ + if(label->static_txt != 0) return; + + lv_obj_invalidate(obj); + + /*Allocate space for the new text*/ + size_t old_len = lv_strlen(label->text); + size_t ins_len = lv_strlen(txt); + size_t new_len = ins_len + old_len; + label->text = lv_realloc(label->text, new_len + 1); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + if(pos == LV_LABEL_POS_LAST) { + pos = _lv_text_get_encoded_length(label->text); + } + + _lv_text_ins(label->text, pos, txt); + lv_label_set_text(obj, NULL); +} + +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + /*Can not append to static text*/ + if(label->static_txt) return; + + lv_obj_invalidate(obj); + + char * label_txt = lv_label_get_text(obj); + /*Delete the characters*/ + _lv_text_cut(label_txt, pos, cnt); + + /*Refresh the label*/ + lv_label_refr_text(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_label_t * label = (lv_label_t *)obj; + + label->text = NULL; + label->static_txt = 0; + label->dot_end = LV_LABEL_DOT_END_INV; + label->long_mode = LV_LABEL_LONG_WRAP; + lv_point_set(&label->offset, 0, 0); + +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; + label->hint.coord_y = 0; + label->hint.y = 0; +#endif + +#if LV_LABEL_TEXT_SELECTION + label->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; +#endif + label->dot.tmp_ptr = NULL; + label->dot_tmp_alloc = 0; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP); + lv_label_set_text(obj, LV_LABEL_DEFAULT_TEXT); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_label_t * label = (lv_label_t *)obj; + + lv_label_dot_tmp_free(obj); + if(!label->static_txt) lv_free(label->text); + label->text = NULL; +} + +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + const lv_result_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if((code == LV_EVENT_STYLE_CHANGED) || (code == LV_EVENT_SIZE_CHANGED)) { + /*Revert dots for proper refresh*/ + lv_label_revert_dots(obj); + lv_label_refr_text(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /* Italic or other non-typical letters can be drawn of out of the object. + * It happens if box_w + ofs_x > adw_w in the glyph. + * To avoid this add some extra draw area. + * font_h / 4 is an empirical value. */ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t font_h = lv_font_get_line_height(font); + lv_event_set_ext_draw_size(e, font_h / 4); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_label_t * label = (lv_label_t *)obj; + if(label->invalid_size_cache) { + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + + int32_t w = lv_obj_get_content_width(obj); + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) w = LV_COORD_MAX; + else w = lv_obj_get_content_width(obj); + + w = LV_MIN(w, lv_obj_get_style_max_width(obj, 0)); + + lv_text_get_size(&label->size_cache, label->text, font, letter_space, line_space, w, flag); + label->invalid_size_cache = false; + } + + lv_point_t * self_size = lv_event_get_param(e); + self_size->x = LV_MAX(self_size->x, label->size_cache.x); + self_size->y = LV_MAX(self_size->y, label->size_cache.y); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_label_t * label = (lv_label_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + + lv_text_flag_t flag = get_label_flags(label); + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + label_draw_dsc.text = label->text; + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y; +#if LV_LABEL_LONG_TXT_HINT + if(label->long_mode != LV_LABEL_LONG_SCROLL_CIRCULAR && lv_area_get_height(&txt_coords) >= LV_LABEL_HINT_HEIGHT_LIMIT) { + label_draw_dsc.hint = &label->hint; + } +#endif + + label_draw_dsc.flag = flag; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_draw_dsc); + lv_bidi_calculate_align(&label_draw_dsc.align, &label_draw_dsc.bidi_dir, label->text); + + label_draw_dsc.sel_start = lv_label_get_text_selection_start(obj); + label_draw_dsc.sel_end = lv_label_get_text_selection_end(obj); + if(label_draw_dsc.sel_start != LV_DRAW_LABEL_NO_TXT_SEL && label_draw_dsc.sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_draw_dsc.sel_color = lv_obj_get_style_text_color_filtered(obj, LV_PART_SELECTED); + label_draw_dsc.sel_bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SELECTED); + } + + /* In SCROLL and SCROLL_CIRCULAR mode the CENTER and RIGHT are pointless, so remove them. + * (In addition, they will create misalignment in this situation)*/ + if((label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) && + (label_draw_dsc.align == LV_TEXT_ALIGN_CENTER || label_draw_dsc.align == LV_TEXT_ALIGN_RIGHT)) { + lv_point_t size; + lv_text_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + LV_COORD_MAX, flag); + if(size.x > lv_area_get_width(&txt_coords)) { + label_draw_dsc.align = LV_TEXT_ALIGN_LEFT; + } + } + + lv_area_t txt_clip; + bool is_common = _lv_area_intersect(&txt_clip, &txt_coords, &layer->_clip_area); + if(!is_common) { + return; + } + + if(label->long_mode == LV_LABEL_LONG_WRAP) { + int32_t s = lv_obj_get_scroll_top(obj); + lv_area_move(&txt_coords, 0, -s); + txt_coords.y2 = obj->coords.y2; + } + if(label->long_mode == LV_LABEL_LONG_SCROLL || label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = txt_clip; + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + layer->_clip_area = clip_area_ori; + } + else { + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + + lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = txt_clip; + + if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + lv_point_t size; + lv_text_get_size(&size, label->text, label_draw_dsc.font, label_draw_dsc.letter_space, label_draw_dsc.line_space, + LV_COORD_MAX, flag); + + /*Draw the text again on label to the original to make a circular effect */ + if(size.x > lv_area_get_width(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x + size.x + + lv_font_get_glyph_width(label_draw_dsc.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + label_draw_dsc.ofs_y = label->offset.y; + + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + + /*Draw the text again below the original to make a circular effect */ + if(size.y > lv_area_get_height(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); + + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + } + + layer->_clip_area = clip_area_ori; +} + +static void overwrite_anim_property(lv_anim_t * dest, const lv_anim_t * src, lv_label_long_mode_t mode) +{ + switch(mode) { + case LV_LABEL_LONG_SCROLL: + /** If the dest animation is already running, overwrite is not allowed */ + if(dest->act_time <= 0) + dest->act_time = src->act_time; + dest->repeat_cnt = src->repeat_cnt; + dest->repeat_delay = src->repeat_delay; + dest->completed_cb = src->completed_cb; + dest->playback_delay = src->playback_delay; + break; + case LV_LABEL_LONG_SCROLL_CIRCULAR: + /** If the dest animation is already running, overwrite is not allowed */ + if(dest->act_time <= 0) + dest->act_time = src->act_time; + dest->repeat_cnt = src->repeat_cnt; + dest->repeat_delay = src->repeat_delay; + dest->completed_cb = src->completed_cb; + break; + default: + break; + } +} + +/** + * Refresh the label with its text stored in its extended data + * @param label pointer to a label object + */ +static void lv_label_refr_text(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->text == NULL) return; +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; /*The hint is invalid if the text changes*/ +#endif + label->invalid_size_cache = true; + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + int32_t max_w = lv_area_get_width(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + /*Calc. the height and longest line*/ + lv_point_t size; + lv_text_flag_t flag = get_label_flags(label); + + lv_text_get_size(&size, label->text, font, letter_space, line_space, max_w, flag); + + lv_obj_refresh_self_size(obj); + + /*In scroll mode start an offset animation*/ + if(label->long_mode == LV_LABEL_LONG_SCROLL) { + const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_playback_delay(&a, LV_LABEL_SCROLL_DELAY); + lv_anim_set_repeat_delay(&a, a.playback_delay); + + bool hor_anim = false; + if(size.x > lv_area_get_width(&txt_coords)) { + int32_t start = 0; + int32_t end = 0; + +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = _lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = lv_area_get_width(&txt_coords) - size.x; + end = 0; + } + else { + start = 0; + end = lv_area_get_width(&txt_coords) - size.x; + } +#else + end = lv_area_get_width(&txt_coords) - size.x; +#endif + + lv_anim_set_values(&a, start, end); + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.duration) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + } + + lv_anim_set_duration(&a, anim_time); + lv_anim_set_playback_duration(&a, a.duration); + + /*If a template animation exists, overwrite some property*/ + if(anim_template) + overwrite_anim_property(&a, anim_template, label->long_mode); + lv_anim_start(&a); + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.duration) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + } + + lv_anim_set_duration(&a, anim_time); + lv_anim_set_playback_duration(&a, a.duration); + + /*If a template animation exists, overwrite some property*/ + if(anim_template) + overwrite_anim_property(&a, anim_template, label->long_mode); + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + /*In roll inf. mode keep the size but start offset animations*/ + else if(label->long_mode == LV_LABEL_LONG_SCROLL_CIRCULAR) { + const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + bool hor_anim = false; + if(size.x > lv_area_get_width(&txt_coords)) { +#if LV_USE_BIDI + int32_t start, end; + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = _lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + end = 0; + } + else { + start = 0; + end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + } + + lv_anim_set_values(&a, start, end); +#else + lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); +#endif + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + lv_anim_set_duration(&a, anim_time); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*If a template animation exists, overwrite some property*/ + if(anim_template) { + overwrite_anim_property(&a, anim_template, label->long_mode); + } + else if(act_time < a.duration) { + a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ + a.early_apply = 0; + } + + lv_anim_start(&a); + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + lv_anim_set_duration(&a, anim_time); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*If a template animation exists, overwrite some property*/ + if(anim_template) { + overwrite_anim_property(&a, anim_template, label->long_mode); + } + else if(act_time < a.duration) { + a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ + a.early_apply = 0; + } + + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + else if(label->long_mode == LV_LABEL_LONG_DOT) { + if(size.y <= lv_area_get_height(&txt_coords)) { /*No dots are required, the text is short enough*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else if(size.y <= lv_font_get_line_height(font)) { /*No dots are required for one-line texts*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else if(_lv_text_get_encoded_length(label->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ + label->dot_end = LV_LABEL_DOT_END_INV; + } + else { + lv_point_t p; + int32_t y_overed; + p.x = lv_area_get_width(&txt_coords) - + (lv_font_get_glyph_width(font, '.', '.') + letter_space) * + LV_LABEL_DOT_NUM; /*Shrink with dots*/ + p.y = lv_area_get_height(&txt_coords); + y_overed = p.y % + (lv_font_get_line_height(font) + line_space); /*Round down to the last line*/ + if(y_overed >= lv_font_get_line_height(font)) { + p.y -= y_overed; + p.y += lv_font_get_line_height(font); + } + else { + p.y -= y_overed; + p.y -= line_space; + } + + uint32_t letter_id = lv_label_get_letter_on(obj, &p, false); + + /*Be sure there is space for the dots*/ + size_t txt_len = lv_strlen(label->text); + uint32_t byte_id = _lv_text_encoded_get_byte_id(label->text, letter_id); + while(byte_id + LV_LABEL_DOT_NUM > txt_len) { + _lv_text_encoded_prev(label->text, &byte_id); + letter_id--; + } + + /*Save letters under the dots and replace them with dots*/ + uint32_t byte_id_ori = byte_id; + uint32_t i; + uint8_t len = 0; + for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { + len += _lv_text_encoded_size(&label->text[byte_id]); + _lv_text_encoded_next(label->text, &byte_id); + if(len > LV_LABEL_DOT_NUM || byte_id > txt_len) { + break; + } + } + + if(lv_label_set_dot_tmp(obj, &label->text[byte_id_ori], len)) { + for(i = 0; i < LV_LABEL_DOT_NUM; i++) { + label->text[byte_id_ori + i] = '.'; + } + label->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; + label->dot_end = letter_id + LV_LABEL_DOT_NUM; + } + } + } + else if(label->long_mode == LV_LABEL_LONG_CLIP) { + /*Do nothing*/ + } + + lv_obj_invalidate(obj); +} + +static void lv_label_revert_dots(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + + if(label->long_mode != LV_LABEL_LONG_DOT) return; + if(label->dot_end == LV_LABEL_DOT_END_INV) return; + + const uint32_t letter_i = label->dot_end - LV_LABEL_DOT_NUM; + const uint32_t byte_i = _lv_text_encoded_get_byte_id(label->text, letter_i); + + /*Restore the characters*/ + uint8_t i = 0; + char * dot_tmp = lv_label_get_dot_tmp(obj); + while(label->text[byte_i + i] != '\0') { + label->text[byte_i + i] = dot_tmp[i]; + i++; + } + label->text[byte_i + i] = dot_tmp[i]; + + lv_label_dot_tmp_free(obj); + + label->dot_end = LV_LABEL_DOT_END_INV; +} + +/** + * Store `len` characters from `data`. Allocates space if necessary. + * + * @param label pointer to label object + * @param len Number of characters to store. + * @return true on success. + */ +static bool lv_label_set_dot_tmp(lv_obj_t * obj, char * data, uint32_t len) +{ + + lv_label_t * label = (lv_label_t *)obj; + lv_label_dot_tmp_free(obj); /*Deallocate any existing space*/ + if(len > sizeof(char *)) { + /*Memory needs to be allocated. Allocates an additional byte + *for a NULL-terminator so it can be copied.*/ + label->dot.tmp_ptr = lv_malloc(len + 1); + if(label->dot.tmp_ptr == NULL) { + LV_LOG_ERROR("Failed to allocate memory for dot_tmp_ptr"); + return false; + } + lv_memcpy(label->dot.tmp_ptr, data, len); + label->dot.tmp_ptr[len] = '\0'; + label->dot_tmp_alloc = true; + } + else { + /*Characters can be directly stored in object*/ + label->dot_tmp_alloc = false; + lv_memcpy(label->dot.tmp, data, len); + } + return true; +} + +/** + * Get the stored dot_tmp characters + * @param label pointer to label object + * @return char pointer to a stored characters. Is *not* necessarily NULL-terminated. + */ +static char * lv_label_get_dot_tmp(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->dot_tmp_alloc) { + return label->dot.tmp_ptr; + } + else { + return label->dot.tmp; + } +} + +/** + * Free the dot_tmp_ptr field if it was previously allocated. + * Always clears the field + * @param label pointer to label object. + */ +static void lv_label_dot_tmp_free(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->dot_tmp_alloc && label->dot.tmp_ptr) { + lv_free(label->dot.tmp_ptr); + } + label->dot_tmp_alloc = false; + label->dot.tmp_ptr = NULL; +} + +static void set_ofs_x_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.x = v; + lv_obj_invalidate(obj); +} + +static void set_ofs_y_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.y = v; + lv_obj_invalidate(obj); +} + +static size_t get_text_length(const char * text) +{ + size_t len = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + len = _lv_text_ap_calc_bytes_count(text); +#else + len = lv_strlen(text) + 1; +#endif + + return len; +} + +static void copy_text_to_label(lv_label_t * label, const char * text) +{ +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_text_ap_proc(text, label->text); +#else + lv_strcpy(label->text, text); +#endif +} + +static lv_text_flag_t get_label_flags(lv_label_t * label) +{ + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + + if(label->expand) flag |= LV_TEXT_FLAG_EXPAND; + + lv_obj_t * obj = (lv_obj_t *) label; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && + lv_obj_get_style_max_width(obj, LV_PART_MAIN) == LV_COORD_MAX && + !obj->w_layout) { + flag |= LV_TEXT_FLAG_FIT; + } + + return flag; +} + +/* Function created because of this pattern be used in multiple functions */ +static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, uint32_t length, + const lv_font_t * font, int32_t letter_space, lv_area_t * txt_coords) +{ + if(align == LV_TEXT_ALIGN_CENTER) { + const int32_t line_w = lv_text_get_width(txt, length, font, letter_space); + *x += lv_area_get_width(txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + const int32_t line_w = lv_text_get_width(txt, length, font, letter_space); + *x += lv_area_get_width(txt_coords) - line_w; + } + else { + /* Nothing to do */ + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/label/lv_label.h b/libraries/lvgl/src/widgets/label/lv_label.h new file mode 100644 index 0000000..7a6ea3d --- /dev/null +++ b/libraries/lvgl/src/widgets/label/lv_label.h @@ -0,0 +1,242 @@ +/** + * @file lv_label.h + * + */ + +#ifndef LV_LABEL_H +#define LV_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_LABEL != 0 + +#include +#include "../../core/lv_obj.h" +#include "../../font/lv_font.h" +#include "../../font/lv_symbol_def.h" +#include "../../misc/lv_text.h" +#include "../../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define LV_LABEL_DOT_NUM 3 +#define LV_LABEL_POS_LAST 0xFFFF +#define LV_LABEL_TEXT_SELECTION_OFF LV_DRAW_LABEL_NO_TXT_SEL +#if LV_WIDGETS_HAS_DEFAULT_VALUE +#define LV_LABEL_DEFAULT_TEXT "Text" +#else +#define LV_LABEL_DEFAULT_TEXT "" +#endif + +LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM); +LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST); +LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF); + +/********************** + * TYPEDEFS + **********************/ + +/** Long mode behaviors. Used in 'lv_label_ext_t'*/ +enum _lv_label_long_mode_t { + LV_LABEL_LONG_WRAP, /**< Keep the object width, wrap lines longer than object width and expand the object height*/ + LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ + LV_LABEL_LONG_SCROLL, /**< Keep the size and roll the text back and forth*/ + LV_LABEL_LONG_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ + LV_LABEL_LONG_CLIP, /**< Keep the size and clip the text out of it*/ +}; + +#ifdef DOXYGEN +typedef _lv_label_long_mode_t lv_label_long_mode_t; +#else +typedef uint8_t lv_label_long_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + lv_obj_t obj; + char * text; + union { + char * tmp_ptr; /*Pointer to the allocated memory containing the character replaced by dots*/ + char tmp[LV_LABEL_DOT_NUM + 1]; /*Directly store the characters if <=4 characters*/ + } dot; + uint32_t dot_end; /*The real text length, used in dot mode*/ + +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t hint; +#endif + +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; + uint32_t sel_end; +#endif + + lv_point_t size_cache; /*Text size cache*/ + lv_point_t offset; /*Text draw position offset*/ + lv_label_long_mode_t long_mode : 3; /*Determine what to do with the long texts*/ + uint8_t static_txt : 1; /*Flag to indicate the text is static*/ + uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_SCROLL)*/ + uint8_t dot_tmp_alloc : 1; /*1: dot is allocated, 0: dot directly holds up to 4 chars*/ + uint8_t invalid_size_cache : 1; /*1: Recalculate size and update cache*/ +} lv_label_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_label_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a label object + * @param parent pointer to an object, it will be the parent of the new label. + * @return pointer to the created button + */ +lv_obj_t * lv_label_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param text '\0' terminated character string. NULL to refresh with the current text. + */ +void lv_label_set_text(lv_obj_t * obj, const char * text); + +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param fmt `printf`-like format + * @example lv_label_set_text_fmt(label1, "%d user", user_num); + */ +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Set a static text. It will not be saved by the label so the 'text' variable + * has to be 'alive' while the label exists. + * @param obj pointer to a label object + * @param text pointer to a text. NULL to refresh with the current text. + */ +void lv_label_set_text_static(lv_obj_t * obj, const char * text); + +/** + * Set the behavior of the label with text longer than the object size + * @param obj pointer to a label object + * @param long_mode the new mode from 'lv_label_long_mode' enum. + * In LV_LONG_WRAP/DOT/SCROLL/SCROLL_CIRC the size of the label should be set AFTER this function + */ +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode); + +/** + * Set where text selection should start + * @param obj pointer to a label object + * @param index character index from where selection should start. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index); + +/** + * Set where text selection should end + * @param obj pointer to a label object + * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a label + * @param obj pointer to a label object + * @return the text of the label + */ +char * lv_label_get_text(const lv_obj_t * obj); + +/** + * Get the long mode of a label + * @param obj pointer to a label object + * @return the current long mode + */ +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj); + +/** + * Get the relative x and y coordinates of a letter + * @param obj pointer to a label object + * @param char_id index of the character [0 ... text length - 1]. + * Expressed in character index, not byte index (different in UTF-8) + * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates if the text if aligned to the left) + */ +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos); + +/** + * Get the index of letter on a relative point of a label. + * @param obj pointer to label object + * @param pos_in pointer to point with coordinates on a the label + * @param bidi whether to use bidi processed + * @return The index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter if aligned to the left) + * Expressed in character index and not byte index (different in UTF-8) + */ +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi); + +/** + * Check if a character is drawn under a point. + * @param obj pointer to a label object + * @param pos Point to check for character under + * @return whether a character is drawn under the point + */ +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos); + +/** + * @brief Get the selection start index. + * @param obj pointer to a label object. + * @return selection start index. `LV_LABEL_TEXT_SELECTION_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj); + +/** + * @brief Get the selection end index. + * @param obj pointer to a label object. + * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Insert a text to a label. The label text can not be static. + * @param obj pointer to a label object + * @param pos character index to insert. Expressed in character index and not byte index. + * 0: before first char. LV_LABEL_POS_LAST: after last char. + * @param txt pointer to the text to insert + */ +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt); + +/** + * Delete characters from a label. The label text can not be static. + * @param obj pointer to a label object + * @param pos character index from where to cut. Expressed in character index and not byte index. + * 0: start in from of the first character + * @param cnt number of characters to cut + */ +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LABEL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LABEL_H*/ diff --git a/libraries/lvgl/src/widgets/led/lv_led.c b/libraries/lvgl/src/widgets/led/lv_led.c new file mode 100644 index 0000000..bf5db77 --- /dev/null +++ b/libraries/lvgl/src/widgets/led/lv_led.c @@ -0,0 +1,183 @@ +/** + * @file lv_led.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_led.h" +#if LV_USE_LED + +#include "../../misc/lv_assert.h" +#include "../../themes/lv_theme.h" +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_led_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_led_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_led_constructor, + .width_def = LV_DPI_DEF / 5, + .height_def = LV_DPI_DEF / 5, + .event_cb = lv_led_event, + .instance_size = sizeof(lv_led_t), + .name = "led", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_led_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_led_set_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + led->color = color; + lv_obj_invalidate(obj); +} + +void lv_led_set_brightness(lv_obj_t * obj, uint8_t bright) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + if(led->bright == bright) return; + + led->bright = LV_CLAMP(LV_LED_BRIGHT_MIN, bright, LV_LED_BRIGHT_MAX); + + /*Invalidate the object there fore it will be redrawn*/ + lv_obj_invalidate(obj); +} + +void lv_led_on(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MAX); +} + +void lv_led_off(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MIN); +} + +void lv_led_toggle(lv_obj_t * obj) +{ + uint8_t bright = lv_led_get_brightness(obj); + if(bright > (LV_LED_BRIGHT_MIN + LV_LED_BRIGHT_MAX) >> 1) + lv_led_off(obj); + else + lv_led_on(obj); +} + +/*===================== + * Getter functions + *====================*/ + +uint8_t lv_led_get_brightness(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + return led->bright; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_led_t * led = (lv_led_t *)obj; + led->color = lv_theme_get_color_primary(obj); + led->bright = LV_LED_BRIGHT_MAX; +} + +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /* Call the ancestor's event handler */ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_MAIN && code != LV_EVENT_DRAW_MAIN_END) { + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + } + + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Make darker colors in a temporary style according to the brightness*/ + lv_led_t * led = (lv_led_t *)obj; + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &rect_dsc); + + /*Use the original colors brightness to modify color->led*/ + rect_dsc.bg_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.bg_color)); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[0].color)); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[1].color)); + rect_dsc.shadow_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.shadow_color)); + rect_dsc.border_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.border_color)); + rect_dsc.outline_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.outline_color)); + + /*Mix. the color with black proportionally with brightness*/ + rect_dsc.bg_color = lv_color_mix(rect_dsc.bg_color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(rect_dsc.bg_grad.stops[0].color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(rect_dsc.bg_grad.stops[1].color, lv_color_black(), led->bright); + rect_dsc.border_color = lv_color_mix(rect_dsc.border_color, lv_color_black(), led->bright); + rect_dsc.shadow_color = lv_color_mix(rect_dsc.shadow_color, lv_color_black(), led->bright); + rect_dsc.outline_color = lv_color_mix(rect_dsc.outline_color, lv_color_black(), led->bright); + + /*Set the current shadow width according to brightness proportionally between LV_LED_BRIGHT_OFF + * and LV_LED_BRIGHT_ON*/ + rect_dsc.shadow_width = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_width) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + rect_dsc.shadow_spread = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_spread) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_rect(layer, &rect_dsc, &obj->coords); + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/led/lv_led.h b/libraries/lvgl/src/widgets/led/lv_led.h new file mode 100644 index 0000000..f1ac52d --- /dev/null +++ b/libraries/lvgl/src/widgets/led/lv_led.h @@ -0,0 +1,106 @@ +/** + * @file lv_led.h + * + */ + +#ifndef LV_LED_H +#define LV_LED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_LED + +/********************* + * DEFINES + *********************/ +/** Brightness when the LED if OFF */ +#ifndef LV_LED_BRIGHT_MIN +# define LV_LED_BRIGHT_MIN 80 +#endif + +/** Brightness when the LED if ON */ +#ifndef LV_LED_BRIGHT_MAX +# define LV_LED_BRIGHT_MAX 255 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/*Data of led*/ +typedef struct { + lv_obj_t obj; + lv_color_t color; + uint8_t bright; /**< Current brightness of the LED (0..255)*/ +} lv_led_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_led_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a led object + * @param parent pointer to an object, it will be the parent of the new led + * @return pointer to the created led + */ +lv_obj_t * lv_led_create(lv_obj_t * parent); + +/** + * Set the color of the LED + * @param led pointer to a LED object + * @param color the color of the LED + */ +void lv_led_set_color(lv_obj_t * led, lv_color_t color); + +/** + * Set the brightness of a LED object + * @param led pointer to a LED object + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) + */ +void lv_led_set_brightness(lv_obj_t * led, uint8_t bright); + +/** + * Light on a LED + * @param led pointer to a LED object + */ +void lv_led_on(lv_obj_t * led); + +/** + * Light off a LED + * @param led pointer to a LED object + */ +void lv_led_off(lv_obj_t * led); + +/** + * Toggle the state of a LED + * @param led pointer to a LED object + */ +void lv_led_toggle(lv_obj_t * led); + +/** + * Get the brightness of a LED object + * @param obj pointer to LED object + * @return bright 0 (max. dark) ... 255 (max. light) + */ +uint8_t lv_led_get_brightness(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LED*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LED_H*/ diff --git a/libraries/lvgl/src/widgets/line/lv_line.c b/libraries/lvgl/src/widgets/line/lv_line.c new file mode 100644 index 0000000..4734e1b --- /dev/null +++ b/libraries/lvgl/src/widgets/line/lv_line.c @@ -0,0 +1,218 @@ +/** + * @file lv_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_line.h" + +#if LV_USE_LINE != 0 +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw.h" +#include +#include +#include + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_line_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_line_class = { + .constructor_cb = lv_line_constructor, + .event_cb = lv_line_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_line_t), + .base_class = &lv_obj_class, + .name = "line", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_line_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + line->point_array = points; + line->point_num = point_num; + + lv_obj_refresh_self_size(obj); + + lv_obj_invalidate(obj); +} + +void lv_line_set_y_invert(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + if(line->y_inv == en) return; + + line->y_inv = en ? 1U : 0U; + + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +bool lv_line_get_y_invert(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + + return line->y_inv == 1U; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_line_t * line = (lv_line_t *)obj; + + line->point_num = 0; + line->point_array = NULL; + line->y_inv = 0; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static inline lv_value_precise_t resolve_point_coord(lv_value_precise_t coord, int32_t max) +{ + if(LV_COORD_IS_PCT((int32_t)coord)) { + return LV_CLAMP(0, max * LV_COORD_GET_PCT((int32_t)coord) / 100, max); + } + else { + return coord; + } +} + +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*The corner of the skew lines is out of the intended area*/ + int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + int32_t * s = lv_event_get_param(e); + if(*s < line_width) *s = line_width; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_line_t * line = (lv_line_t *)obj; + + if(line->point_num == 0 || line->point_array == NULL) return; + + lv_point_t * p = lv_event_get_param(e); + int32_t w = 0; + int32_t h = 0; + + uint32_t i; + for(i = 0; i < line->point_num; i++) { + if(!LV_COORD_IS_PCT((int32_t)line->point_array[i].x)) { + w = (int32_t)LV_MAX(line->point_array[i].x, w); + } + + if(!LV_COORD_IS_PCT((int32_t)line->point_array[i].y)) { + h = (int32_t)LV_MAX(line->point_array[i].y, h); + } + } + + p->x = w; + p->y = h; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_line_t * line = (lv_line_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + if(line->point_num == 0 || line->point_array == NULL) return; + + lv_area_t area; + lv_obj_get_coords(obj, &area); + int32_t x_ofs = area.x1 - lv_obj_get_scroll_x(obj); + int32_t y_ofs = area.y1 - lv_obj_get_scroll_y(obj); + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + /*Read all points and draw the lines*/ + uint32_t i; + for(i = 0; i < line->point_num - 1; i++) { + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + + line_dsc.p1.x = resolve_point_coord(line->point_array[i].x, w) + x_ofs; + line_dsc.p1.y = resolve_point_coord(line->point_array[i].y, h); + + line_dsc.p2.x = resolve_point_coord(line->point_array[i + 1].x, w) + x_ofs; + line_dsc.p2.y = resolve_point_coord(line->point_array[i + 1].y, h); + + if(line->y_inv == 0) { + line_dsc.p1.y = line_dsc.p1.y + y_ofs; + line_dsc.p2.y = line_dsc.p2.y + y_ofs; + } + else { + line_dsc.p1.y = h - line_dsc.p1.y + y_ofs; + line_dsc.p2.y = h - line_dsc.p2.y + y_ofs; + } + + lv_draw_line(layer, &line_dsc); + line_dsc.round_start = 0; /*Draw the rounding only on the end points after the first line*/ + } + } +} +#endif diff --git a/libraries/lvgl/src/widgets/line/lv_line.h b/libraries/lvgl/src/widgets/line/lv_line.h new file mode 100644 index 0000000..6a2423a --- /dev/null +++ b/libraries/lvgl/src/widgets/line/lv_line.h @@ -0,0 +1,90 @@ +/** + * @file lv_line.h + * + */ + +#ifndef LV_LINE_H +#define LV_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_LINE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of line*/ +typedef struct { + lv_obj_t obj; + const lv_point_precise_t * point_array; /**< Pointer to an array with the points of the line*/ + uint32_t point_num; /**< Number of points in 'point_array'*/ + uint32_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ +} lv_line_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_line_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a line object + * @param parent pointer to an object, it will be the parent of the new line + * @return pointer to the created line + */ +lv_obj_t * lv_line_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set an array of points. The line object will connect these points. + * @param obj pointer to a line object + * @param points an array of points. Only the address is saved, so the array needs to be alive while the line exists + * @param point_num number of points in 'point_a' + */ +void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num); + +/** + * Enable (or disable) the y coordinate inversion. + * If enabled then y will be subtracted from the height of the object, + * therefore the y = 0 coordinate will be on the bottom. + * @param obj pointer to a line object + * @param en true: enable the y inversion, false:disable the y inversion + */ +void lv_line_set_y_invert(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the y inversion attribute + * @param obj pointer to a line object + * @return true: y inversion is enabled, false: disabled + */ +bool lv_line_get_y_invert(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LINE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINE_H*/ diff --git a/libraries/lvgl/src/widgets/list/lv_list.c b/libraries/lvgl/src/widgets/list/lv_list.c new file mode 100644 index 0000000..5288c66 --- /dev/null +++ b/libraries/lvgl/src/widgets/list/lv_list.c @@ -0,0 +1,140 @@ +/** + * @file lv_list.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_list.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../display/lv_display.h" +#include "../label/lv_label.h" +#include "../image/lv_image.h" +#include "../button/lv_button.h" + +#if LV_USE_LIST + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_list_class) +#define MY_CLASS_BUTTON (&lv_list_button_class) +#define MY_CLASS_TEXT (&lv_list_text_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +const lv_obj_class_t lv_list_class = { + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2, + .name = "list", +}; + +const lv_obj_class_t lv_list_button_class = { + .base_class = &lv_button_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "list-btn", +}; + +const lv_obj_class_t lv_list_text_class = { + .base_class = &lv_label_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "list-text", +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + return obj; +} + +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_TEXT, list); + lv_obj_class_init_obj(obj); + lv_label_set_text(obj, txt); + return obj; +} + +lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_BUTTON, list); + lv_obj_class_init_obj(obj); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + +#if LV_USE_IMAGE == 1 + if(icon) { + lv_obj_t * img = lv_image_create(obj); + lv_image_set_src(img, icon); + } +#endif + + if(txt) { + lv_obj_t * label = lv_label_create(obj); + lv_label_set_text(label, txt); + lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_flex_grow(label, 1); + } + + return obj; +} + +const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + return lv_label_get_text(child); + } + + } + + return ""; +} + +void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + lv_label_set_text(child, txt); + return; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LIST*/ diff --git a/libraries/lvgl/src/widgets/list/lv_list.h b/libraries/lvgl/src/widgets/list/lv_list.h new file mode 100644 index 0000000..c01c086 --- /dev/null +++ b/libraries/lvgl/src/widgets/list/lv_list.h @@ -0,0 +1,86 @@ +/** + * @file lv_win.h + * + */ + +#ifndef LV_LIST_H +#define LV_LIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_LIST + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_text_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_button_class; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a list object + * @param parent pointer to an object, it will be the parent of the new list + * @return pointer to the created list + */ +lv_obj_t * lv_list_create(lv_obj_t * parent); + +/** + * Add text to a list + * @param list pointer to a list, it will be the parent of the new label + * @param txt text of the new label + * @return pointer to the created label + */ +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt); + +/** + * Add button to a list + * @param list pointer to a list, it will be the parent of the new button + * @param icon icon for the button, when NULL it will have no icon + * @param txt text of the new button, when NULL no text will be added + * @return pointer to the created button + */ +lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt); + +/** + * Get text of a given list button + * @param list pointer to a list + * @param btn pointer to the button + * @return text of btn, if btn doesn't have text "" will be returned + */ +const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn); + +/** + * Set text of a given list button + * @param list pointer to a list + * @param btn pointer to the button + * @param txt pointer to the text + * @return text of btn, if btn doesn't have text "" will be returned + */ +void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIST_H*/ diff --git a/libraries/lvgl/src/widgets/menu/lv_menu.c b/libraries/lvgl/src/widgets/menu/lv_menu.c new file mode 100644 index 0000000..e21bdcd --- /dev/null +++ b/libraries/lvgl/src/widgets/menu/lv_menu.c @@ -0,0 +1,822 @@ +/** + * @file lv_menu.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_menu.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_menu_class) + +#include "../../core/lv_obj.h" +#include "../../layouts/lv_layout.h" +#include "../../stdlib/lv_string.h" +#include "../label/lv_label.h" +#include "../button/lv_button.h" +#include "../image/lv_image.h" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +const lv_obj_class_t lv_menu_class = { + .constructor_cb = lv_menu_constructor, + .destructor_cb = lv_menu_destructor, + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_menu_t), + .name = "menu", +}; +const lv_obj_class_t lv_menu_page_class = { + .constructor_cb = lv_menu_page_constructor, + .destructor_cb = lv_menu_page_destructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_menu_page_t), + .name = "menu-page", +}; + +const lv_obj_class_t lv_menu_cont_class = { + .constructor_cb = lv_menu_cont_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "menu-cont", +}; + +const lv_obj_class_t lv_menu_section_class = { + .constructor_cb = lv_menu_section_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "menu-section", +}; + +const lv_obj_class_t lv_menu_separator_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .name = "menu-separator", +}; + +const lv_obj_class_t lv_menu_sidebar_cont_class = { + .base_class = &lv_obj_class, +}; + +const lv_obj_class_t lv_menu_main_cont_class = { + .base_class = &lv_obj_class, +}; + +const lv_obj_class_t lv_menu_main_header_cont_class = { + .base_class = &lv_obj_class, +}; + +const lv_obj_class_t lv_menu_sidebar_header_cont_class = { + .base_class = &lv_obj_class, +}; + +static void lv_menu_refr(lv_obj_t * obj); +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj); +static void lv_menu_refr_main_header_mode(lv_obj_t * obj); +static void lv_menu_load_page_event_cb(lv_event_t * e); +static void lv_menu_obj_delete_event_cb(lv_event_t * e); +static void lv_menu_back_event_cb(lv_event_t * e); +static void lv_menu_value_changed_event_cb(lv_event_t * e); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +bool lv_menu_item_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj); +void lv_menu_clear_history(lv_obj_t * obj); + +lv_obj_t * lv_menu_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char const * const title) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_page_class, parent); + lv_obj_class_init_obj(obj); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + /* Initialise the object */ + page->title = NULL; + page->static_title = false; + lv_menu_set_page_title(obj, title); + + return obj; +} + +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_cont_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_section_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_section_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_separator_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_menu_refr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + + lv_obj_t * page = NULL; + + if(act_hist != NULL) { + page = act_hist->page; + /* Delete the current item from the history */ + _lv_ll_remove(history_ll, act_hist); + lv_free(act_hist); + menu->cur_depth--; + } + + /* Set it */ + lv_menu_set_page(obj, page); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Hide previous page */ + if(menu->main_page != NULL) { + lv_obj_set_parent(menu->main_page, menu->storage); + } + + if(page != NULL) { + /* Add a new node */ + lv_ll_t * history_ll = &(menu->history_ll); + lv_menu_history_t * new_node = _lv_ll_ins_head(history_ll); + LV_ASSERT_MALLOC(new_node); + new_node->page = page; + menu->cur_depth++; + + /* Place page in main */ + lv_obj_set_parent(page, menu->main); + } + else { + /* Empty page, clear history */ + lv_menu_clear_history(obj); + } + + menu->main_page = page; + + /* If there is a selected tab, update checked state */ + if(menu->selected_tab != NULL) { + if(menu->sidebar_page != NULL) { + lv_obj_add_state(menu->selected_tab, LV_STATE_CHECKED); + } + else { + lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); + } + } + + /* Back btn management */ + if(menu->sidebar_page != NULL) { + /* With sidebar enabled */ + if(menu->sidebar_generated) { + if(menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { + /* Root back btn is always shown if enabled*/ + lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + if(menu->cur_depth >= 2) { + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + else { + /* With sidebar disabled */ + if(menu->cur_depth >= 2 || menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + lv_obj_send_event((lv_obj_t *)menu, LV_EVENT_VALUE_CHANGED, NULL); + + lv_menu_refr_main_header_mode(obj); +} + +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Sidebar management*/ + if(page != NULL) { + /* Sidebar should be enabled */ + if(!menu->sidebar_generated) { + /* Create sidebar */ + lv_obj_t * sidebar_cont = lv_obj_class_create_obj(&lv_menu_sidebar_cont_class, obj); + lv_obj_class_init_obj(sidebar_cont); + lv_obj_move_to_index(sidebar_cont, 1); + lv_obj_set_size(sidebar_cont, LV_PCT(30), LV_PCT(100)); + lv_obj_set_flex_flow(sidebar_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(sidebar_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_remove_flag(sidebar_cont, LV_OBJ_FLAG_CLICKABLE); + menu->sidebar = sidebar_cont; + + lv_obj_t * sidebar_header = lv_obj_class_create_obj(&lv_menu_sidebar_header_cont_class, sidebar_cont); + lv_obj_class_init_obj(sidebar_header); + lv_obj_set_size(sidebar_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(sidebar_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(sidebar_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(sidebar_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(sidebar_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->sidebar_header = sidebar_header; + + lv_obj_t * sidebar_header_back_btn = lv_button_create(menu->sidebar_header); + lv_obj_add_event_cb(sidebar_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(sidebar_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(sidebar_header_back_btn, LV_FLEX_FLOW_ROW); + menu->sidebar_header_back_btn = sidebar_header_back_btn; + + lv_obj_t * sidebar_header_back_icon = lv_image_create(menu->sidebar_header_back_btn); + lv_image_set_src(sidebar_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * sidebar_header_title = lv_label_create(menu->sidebar_header); + lv_obj_add_flag(sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + menu->sidebar_header_title = sidebar_header_title; + + menu->sidebar_generated = true; + } + + lv_obj_set_parent(page, menu->sidebar); + + lv_menu_refr_sidebar_header_mode(obj); + } + else { + /* Sidebar should be disabled */ + if(menu->sidebar_generated) { + lv_obj_set_parent(menu->sidebar_page, menu->storage); + lv_obj_delete(menu->sidebar); + + menu->sidebar_generated = false; + } + } + + menu->sidebar_page = page; + lv_menu_refr(obj); +} + +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_header != mode) { + menu->mode_header = mode; + lv_menu_refr_main_header_mode(obj); + if(menu->sidebar_generated) lv_menu_refr_sidebar_header_mode(obj); + } +} + +void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_root_back_btn != mode) { + menu->mode_root_back_btn = mode; + lv_menu_refr(obj); + } +} + +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + /* Remove old event */ + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(obj); + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); + if(lv_event_dsc_get_cb(event_dsc) == lv_menu_load_page_event_cb) { + lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); + lv_obj_remove_event(obj, i); + break; + } + } + + lv_menu_load_page_event_data_t * event_data = lv_malloc(sizeof(lv_menu_load_page_event_data_t)); + event_data->menu = menu; + event_data->page = page; + + lv_obj_add_event_cb(obj, lv_menu_load_page_event_cb, LV_EVENT_CLICKED, event_data); + lv_obj_add_event_cb(obj, lv_menu_obj_delete_event_cb, LV_EVENT_DELETE, event_data); +} + +void lv_menu_set_page_title(lv_obj_t * page_obj, char const * const title) +{ + LV_LOG_INFO("begin"); + lv_menu_page_t * page = (lv_menu_page_t *)page_obj; + + /* Cleanup any previous set titles */ + if((!page->static_title) && page->title) { + lv_free(page->title); + page->title = NULL; + } + + if(title) { + page->static_title = false; + page->title = lv_strdup(title); + LV_ASSERT_MALLOC(page->title); + if(page->title == NULL) { + return; + } + } + else { + page->title = NULL; + page->static_title = false; + } +} + +void lv_menu_set_page_title_static(lv_obj_t * page_obj, char const * const title) +{ + LV_LOG_INFO("begin"); + lv_menu_page_t * page = (lv_menu_page_t *)page_obj; + + /* Cleanup any previous set titles */ + if((!page->static_title) && page->title) { + lv_free(page->title); + page->title = NULL; + } + + /* Set or clear the static title text */ + if(title) { + page->title = (char *) title; + page->static_title = true; + } + else { + page->title = NULL; + page->static_title = false; + } +} + +/*===================== + * Getter functions + *====================*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_page; +} + +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_page; +} + +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header; +} + +lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header_back_btn; +} + +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header; +} + +lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header_back_btn; +} + +bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + if(obj == ((lv_menu_t *)menu)->sidebar_header_back_btn) { + return true; + } + + if(obj == ((lv_menu_t *)menu)->main_header_back_btn && ((lv_menu_t *)menu)->prev_depth <= 1) { + return true; + } + + return false; +} + +void lv_menu_clear_history(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + _lv_ll_clear(history_ll); + + menu->cur_depth = 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_set_layout(obj, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_menu_t * menu = (lv_menu_t *)obj; + + menu->mode_header = LV_MENU_HEADER_TOP_FIXED; + menu->mode_root_back_btn = LV_MENU_ROOT_BACK_BUTTON_DISABLED; + menu->cur_depth = 0; + menu->prev_depth = 0; + menu->sidebar_generated = false; + + _lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); + + menu->storage = lv_obj_create(obj); + lv_obj_add_flag(menu->storage, LV_OBJ_FLAG_HIDDEN); + + menu->sidebar = NULL; + menu->sidebar_header = NULL; + menu->sidebar_header_back_btn = NULL; + menu->sidebar_header_title = NULL; + menu->sidebar_page = NULL; + + lv_obj_t * main_cont = lv_obj_class_create_obj(&lv_menu_main_cont_class, obj); + lv_obj_class_init_obj(main_cont); + lv_obj_set_height(main_cont, LV_PCT(100)); + lv_obj_set_flex_grow(main_cont, 1); + lv_obj_set_flex_flow(main_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(main_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_remove_flag(main_cont, LV_OBJ_FLAG_CLICKABLE); + menu->main = main_cont; + + lv_obj_t * main_header = lv_obj_class_create_obj(&lv_menu_main_header_cont_class, main_cont); + lv_obj_class_init_obj(main_header); + lv_obj_set_size(main_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(main_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(main_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(main_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(main_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->main_header = main_header; + + /* Create the default simple back btn and title */ + lv_obj_t * main_header_back_btn = lv_button_create(menu->main_header); + lv_obj_add_event_cb(main_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(main_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(main_header_back_btn, LV_FLEX_FLOW_ROW); + menu->main_header_back_btn = main_header_back_btn; + + lv_obj_t * main_header_back_icon = lv_image_create(menu->main_header_back_btn); + lv_image_set_src(main_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * main_header_title = lv_label_create(menu->main_header); + lv_obj_add_flag(main_header_title, LV_OBJ_FLAG_HIDDEN); + menu->main_header_title = main_header_title; + + menu->main_page = NULL; + menu->selected_tab = NULL; + + lv_obj_add_event_cb(obj, lv_menu_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, menu); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + _lv_ll_clear(history_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_t * menu = (lv_menu_t *)lv_obj_get_parent(obj); + + lv_obj_set_parent(obj, ((lv_menu_t *)menu)->storage); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); +} + +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + + if((!page->static_title) && page->title != NULL) { + lv_free(page->title); + } + page->title = NULL; + page->static_title = false; +} + +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->sidebar_header == NULL || menu->sidebar_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->sidebar_header, 1); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + } + + lv_obj_refr_size(menu->sidebar_header); + lv_obj_refr_size(menu->sidebar_page); + + if(lv_obj_get_content_height(menu->sidebar_header) == 0) { + lv_obj_add_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_remove_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_refr_main_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->main_header == NULL || menu->main_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->main_header, 1); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + } + + lv_obj_refr_size(menu->main_header); + lv_obj_refr_size(menu->main_page); + lv_obj_update_layout(menu->main_header); + + if(lv_obj_get_content_height(menu->main_header) == 0) { + lv_obj_add_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_remove_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_load_page_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)(event_data->menu); + lv_obj_t * page = event_data->page; + + if(menu->sidebar_page != NULL) { + /* Check if clicked obj is in the sidebar */ + bool sidebar = false; + lv_obj_t * parent = obj; + + while(parent) { + if(parent == (lv_obj_t *)menu) break; + if(parent == menu->sidebar) { + sidebar = true; + break; + } + parent = lv_obj_get_parent(parent); + } + + if(sidebar) { + /* Clear checked state of previous obj */ + if(menu->selected_tab != obj && menu->selected_tab != NULL) { + lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); + } + + lv_menu_clear_history((lv_obj_t *)menu); + + menu->selected_tab = obj; + } + } + + lv_menu_set_page((lv_obj_t *)menu, page); + + if(lv_group_get_default() != NULL && menu->sidebar_page == NULL) { + /* Sidebar is not supported for now*/ + lv_group_focus_next(lv_group_get_default()); + } +} + +static void lv_menu_obj_delete_event_cb(lv_event_t * e) +{ + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_free(event_data); +} + +static void lv_menu_back_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + /* LV_EVENT_CLICKED */ + if(code == LV_EVENT_CLICKED) { + lv_obj_t * obj = lv_event_get_current_target(e); + lv_menu_t * menu = (lv_menu_t *)lv_event_get_user_data(e); + + if(!(obj == menu->main_header_back_btn || obj == menu->sidebar_header_back_btn)) return; + + menu->prev_depth = menu->cur_depth; /* Save the previous value for user event handler */ + + if(lv_menu_back_button_is_root((lv_obj_t *)menu, obj)) return; + + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = _lv_ll_get_head(history_ll); + + /* The previous menu */ + lv_menu_history_t * prev_hist = _lv_ll_get_next(history_ll, act_hist); + + if(prev_hist != NULL) { + /* Previous menu exists */ + /* Delete the current item from the history */ + _lv_ll_remove(history_ll, act_hist); + lv_free(act_hist); + menu->cur_depth--; + /* Create the previous menu. + * Remove it from the history because `lv_menu_set_page` will add it again */ + _lv_ll_remove(history_ll, prev_hist); + menu->cur_depth--; + lv_menu_set_page(&(menu->obj), prev_hist->page); + + lv_free(prev_hist); + } + } +} + +static void lv_menu_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)obj; + + lv_menu_page_t * main_page = (lv_menu_page_t *)lv_menu_get_cur_main_page(obj); + if(main_page != NULL && menu->main_header_title != NULL) { + if(main_page->title != NULL) { + lv_label_set_text(menu->main_header_title, main_page->title); + lv_obj_remove_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + } + + lv_menu_page_t * sidebar_page = (lv_menu_page_t *)lv_menu_get_cur_sidebar_page(obj); + if(sidebar_page != NULL && menu->sidebar_header_title != NULL) { + if(sidebar_page->title != NULL) { + lv_label_set_text(menu->sidebar_header_title, sidebar_page->title); + lv_obj_remove_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + } +} +#endif /*LV_USE_MENU*/ diff --git a/libraries/lvgl/src/widgets/menu/lv_menu.h b/libraries/lvgl/src/widgets/menu/lv_menu.h new file mode 100644 index 0000000..c187ff1 --- /dev/null +++ b/libraries/lvgl/src/widgets/menu/lv_menu.h @@ -0,0 +1,270 @@ +/** + * @file lv_menu.h + * + */ + +#ifndef LV_MENU_H +#define LV_MENU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_MENU + +#if LV_USE_FLEX == 0 +#error "LV_USE_FLEX needs to be enabled" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_menu_mode_header_t { + LV_MENU_HEADER_TOP_FIXED, /* Header is positioned at the top */ + LV_MENU_HEADER_TOP_UNFIXED, /* Header is positioned at the top and can be scrolled out of view*/ + LV_MENU_HEADER_BOTTOM_FIXED /* Header is positioned at the bottom */ +}; + +#ifdef DOXYGEN +typedef _lv_menu_mode_header_t lv_menu_mode_header_t; +#else +typedef uint8_t lv_menu_mode_header_t; +#endif /*DOXYGEN*/ + +enum _lv_menu_mode_root_back_button_t { + LV_MENU_ROOT_BACK_BUTTON_DISABLED, + LV_MENU_ROOT_BACK_BUTTON_ENABLED +}; + +#ifdef DOXYGEN +typedef _lv_menu_mode_root_back_button_t lv_menu_mode_root_back_button_t; +#else +typedef uint8_t lv_menu_mode_root_back_button_t; +#endif /*DOXYGEN*/ + +typedef struct /// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ + lv_menu_load_page_event_data_t +/// @endcond +{ + lv_obj_t * menu; + lv_obj_t * page; +} lv_menu_load_page_event_data_t ; + +typedef struct { + lv_obj_t * page; +} lv_menu_history_t; + +typedef struct { + lv_obj_t obj; + lv_obj_t * storage; /* a pointer to obj that is the parent of all pages not displayed */ + lv_obj_t * main; + lv_obj_t * main_page; + lv_obj_t * main_header; + lv_obj_t * + main_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ + lv_obj_t * main_header_title; + lv_obj_t * sidebar; + lv_obj_t * sidebar_page; + lv_obj_t * sidebar_header; + lv_obj_t * + sidebar_header_back_btn; /* a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ + lv_obj_t * sidebar_header_title; + lv_obj_t * selected_tab; + lv_ll_t history_ll; + uint8_t cur_depth; + uint8_t prev_depth; + uint8_t sidebar_generated : 1; + lv_menu_mode_header_t mode_header : 2; + lv_menu_mode_root_back_button_t mode_root_back_btn : 1; +} lv_menu_t; + +typedef struct { + lv_obj_t obj; + char * title; + bool static_title; +} lv_menu_page_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_page_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_section_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_separator_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_header_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_header_cont_class; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a menu object + * @param parent pointer to an object, it will be the parent of the new menu + * @return pointer to the created menu + */ +lv_obj_t * lv_menu_create(lv_obj_t * parent); + +/** + * Create a menu page object + * @param parent pointer to menu object + * @param title pointer to text for title in header (NULL to not display title) + * @return pointer to the created menu page + */ +lv_obj_t * lv_menu_page_create(lv_obj_t * parent, char const * const title); + +/** + * Create a menu cont object + * @param parent pointer to an object, it will be the parent of the new menu cont object + * @return pointer to the created menu cont + */ +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent); + +/** + * Create a menu section object + * @param parent pointer to an object, it will be the parent of the new menu section object + * @return pointer to the created menu section + */ +lv_obj_t * lv_menu_section_create(lv_obj_t * parent); + +/** + * Create a menu separator object + * @param parent pointer to an object, it will be the parent of the new menu separator object + * @return pointer to the created menu separator + */ +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent); +/*===================== + * Setter functions + *====================*/ +/** + * Set menu page to display in main + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear main and clear menu history) + */ +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set menu page title + * @param page pointer to the menu page + * @param title pointer to text for title in header (NULL to not display title) + */ +void lv_menu_set_page_title(lv_obj_t * page, char const * const title); + +/** + * Set menu page title with a static text. It will not be saved by the label so the 'text' variable + * has to be 'alive' while the page exists. + * @param page pointer to the menu page + * @param title pointer to text for title in header (NULL to not display title) + */ +void lv_menu_set_page_title_static(lv_obj_t * page, char const * const title); + +/** + * Set menu page to display in sidebar + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear sidebar) + */ +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set the how the header should behave and its position + * @param obj pointer to a menu + * @param mode LV_MENU_HEADER_TOP_FIXED/TOP_UNFIXED/BOTTOM_FIXED + */ +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode); + +/** + * Set whether back button should appear at root + * @param obj pointer to a menu + * @param mode LV_MENU_ROOT_BACK_BUTTON_DISABLED/ENABLED + */ +void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode); + +/** + * Add menu to the menu item + * @param menu pointer to the menu + * @param obj pointer to the obj + * @param page pointer to the page to load when obj is clicked + */ +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page); + +/*===================== + * Getter functions + *====================*/ +/** +* Get a pointer to menu page that is currently displayed in main +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj); + +/** +* Get a pointer to menu page that is currently displayed in sidebar +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj); + +/** +* Get a pointer to main header obj +* @param obj pointer to the menu +* @return pointer to main header obj +*/ +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj); + +/** +* Get a pointer to main header back btn obj +* @param obj pointer to the menu +* @return pointer to main header back btn obj +*/ +lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header obj +*/ +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header back btn obj +*/ +lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj); + +/** + * Check if an obj is a root back btn + * @param menu pointer to the menu + * @param obj pointer to the back button + * @return true if it is a root back btn + */ +bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj); + +/** + * Clear menu history + * @param obj pointer to the menu + */ +void lv_menu_clear_history(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MENU*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MENU_H*/ diff --git a/libraries/lvgl/src/widgets/msgbox/lv_msgbox.c b/libraries/lvgl/src/widgets/msgbox/lv_msgbox.c new file mode 100644 index 0000000..6f9d4a7 --- /dev/null +++ b/libraries/lvgl/src/widgets/msgbox/lv_msgbox.c @@ -0,0 +1,278 @@ +/** + * @file lv_msgbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_msgbox.h" +#if LV_USE_MSGBOX + +#include "../label/lv_label.h" +#include "../button/lv_button.h" +#include "../image/lv_image.h" +#include "../../misc/lv_assert.h" +#include "../../display/lv_display.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define LV_MSGBOX_FLAG_AUTO_PARENT LV_OBJ_FLAG_WIDGET_1 /*Mark that the parent was automatically created*/ +#define MY_CLASS (&lv_msgbox_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void msgbox_close_click_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_msgbox_class = { + .base_class = &lv_obj_class, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_msgbox_t), + .name = "msgbox", +}; + +const lv_obj_class_t lv_msgbox_header_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .instance_size = sizeof(lv_obj_t), + .name = "msgbox-header", +}; + +const lv_obj_class_t lv_msgbox_content_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_obj_t), + .name = "msgbox-content", +}; + +const lv_obj_class_t lv_msgbox_footer_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .instance_size = sizeof(lv_obj_t), + .name = "msgbox-footer", +}; + +const lv_obj_class_t lv_msgbox_footer_button_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .name = "msgbox-footer-button", +}; + +const lv_obj_class_t lv_msgbox_header_button_class = { + .base_class = &lv_obj_class, + .width_def = LV_DPI_DEF / 3, + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .name = "msgbox-header-button", +}; + +const lv_obj_class_t lv_msgbox_backdrop_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .name = "msgbox-backdrop", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_msgbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + bool auto_parent = false; + if(parent == NULL) { + auto_parent = true; + parent = lv_obj_class_create_obj(&lv_msgbox_backdrop_class, lv_layer_top()); + LV_ASSERT_MALLOC(parent); + lv_obj_class_init_obj(parent); + lv_obj_remove_flag(parent, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_set_size(parent, LV_PCT(100), LV_PCT(100)); + } + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_msgbox_class, parent); + LV_ASSERT_MALLOC(obj); + if(obj == NULL) return NULL; + lv_obj_class_init_obj(obj); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + if(auto_parent) lv_obj_add_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT); + + mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + LV_ASSERT_MALLOC(obj); + if(mbox->content == NULL) return NULL; + lv_obj_class_init_obj(mbox->content); + lv_obj_set_flex_flow(mbox->content, LV_FLEX_FLOW_COLUMN); + + lv_obj_center(obj); + return obj; +} + +lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->header == NULL) { + mbox->header = lv_obj_class_create_obj(&lv_msgbox_header_class, obj); + LV_ASSERT_MALLOC(obj); + if(mbox->header == NULL) return NULL; + lv_obj_class_init_obj(mbox->header); + + lv_obj_set_size(mbox->header, lv_pct(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 3); + lv_obj_set_flex_flow(mbox->header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(mbox->header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_move_to_index(mbox->header, 0); + } + + if(mbox->title == NULL) { + mbox->title = lv_label_create(mbox->header); + lv_obj_set_flex_grow(mbox->title, 1); + } + + lv_label_set_text(mbox->title, title); + + return mbox->title; +} + +lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->header == NULL) { + lv_msgbox_add_title(obj, ""); /*Just to push the buttons to the right*/ + } + + lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_header_button_class, mbox->header); + LV_ASSERT_MALLOC(obj); + if(btn == NULL) return NULL; + lv_obj_class_init_obj(btn); + + if(icon) { + lv_obj_t * img = lv_image_create(btn); + lv_image_set_src(img, icon); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + + lv_obj_t * label = lv_label_create(mbox->content); + lv_label_set_text(label, text); + lv_obj_set_width(label, lv_pct(100)); + + return label; +} + +lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->footer == NULL) { + mbox->footer = lv_obj_class_create_obj(&lv_msgbox_footer_class, obj); + LV_ASSERT_MALLOC(obj); + if(mbox->footer == NULL) return NULL; + lv_obj_class_init_obj(mbox->footer); + + lv_obj_set_flex_flow(mbox->footer, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(mbox->footer, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + } + + lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_footer_button_class, mbox->footer); + LV_ASSERT_MALLOC(obj); + if(btn == NULL) return NULL; + lv_obj_class_init_obj(btn); + + if(text) { + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text(label, text); + lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj) +{ + lv_obj_t * btn = lv_msgbox_add_header_button(obj, LV_SYMBOL_CLOSE); + lv_obj_add_event_cb(btn, msgbox_close_click_event_cb, LV_EVENT_CLICKED, NULL); + return btn; +} + +lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->header; +} + +lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->footer; +} + +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->content; +} + +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->title; +} + +void lv_msgbox_close(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete(lv_obj_get_parent(obj)); + else lv_obj_delete(obj); +} + +void lv_msgbox_close_async(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete_async(lv_obj_get_parent(obj)); + else lv_obj_delete_async(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void msgbox_close_click_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_current_target(e); + lv_obj_t * mbox = lv_obj_get_parent(lv_obj_get_parent(btn)); + lv_msgbox_close(mbox); +} + +#endif /*LV_USE_MSGBOX*/ diff --git a/libraries/lvgl/src/widgets/msgbox/lv_msgbox.h b/libraries/lvgl/src/widgets/msgbox/lv_msgbox.h new file mode 100644 index 0000000..b7413ee --- /dev/null +++ b/libraries/lvgl/src/widgets/msgbox/lv_msgbox.h @@ -0,0 +1,153 @@ +/** + * @file lv_mbox.h + * + */ + +#ifndef LV_MSGBOX_H +#define LV_MSGBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_MSGBOX + +/*Testing of dependencies*/ +#if LV_USE_BUTTONMATRIX == 0 +#error "lv_mbox: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BUTTONMATRIX 1) " +#endif + +#if LV_USE_LABEL == 0 +#error "lv_mbox: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + lv_obj_t * header; + lv_obj_t * content; + lv_obj_t * footer; + lv_obj_t * title; +} lv_msgbox_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_content_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_button_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_button_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_backdrop_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty message box + * @param parent the parent of the message box + * @return the created message box + */ +lv_obj_t * lv_msgbox_create(lv_obj_t * parent); + +/** + * Add title to the message box. It also creates a header for the title. + * @param obj pointer to a message box + * @param title the text of the tile + * @return the created title label + */ +lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title); + +/** + * Add a button to the header of to the message box. It also creates a header. + * @param obj pointer to a message box + * @param icon the icon of the button + * @return the created button + */ +lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon); + +/** + * Add a text to the content area of message box. Multiply texts will be created below each other. + * @param obj pointer to a message box + * @param icon the icon of the button + * @return the created button + */ +lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text); + +/** + * Add a button to the footer of to the message box. It also creates a footer. + * @param obj pointer to a message box + * @param text the text of the button + * @return the created button + */ +lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text); + +/** + * Add a close button to the message box. It also create a header. + * @param obj pointer to a message box + * @return the created close button + */ +lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj); + +/** + * Get the header widget + * @param obj pointer to a message box + * @return the header, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj); + +/** + * Get the footer widget + * @param obj pointer to a message box + * @return the footer, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj); + +/** + * Get the content widget + * @param obj pointer to a message box + * @return the content, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj); + +/** + * Get the title label + * @param obj pointer to a message box + * @return the title, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj); + +/** + * Close a message box + * @param obj pointer to a message box + */ +void lv_msgbox_close(lv_obj_t * mbox); + +/** + * Close a message box in the next call of the message box + * @param obj pointer to a message box + */ +void lv_msgbox_close_async(lv_obj_t * mbox); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MSGBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSGBOX_H*/ diff --git a/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.c b/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.c new file mode 100644 index 0000000..eaf5c12 --- /dev/null +++ b/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.c @@ -0,0 +1,141 @@ +/** + * @file lv_templ.c + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + * You can remove the defined() clause from the #if statement below. This exists because + * LV_USE_TEMPL is not in lv_conf.h or lv_conf_template.h by default. + */ + +/********************* + * INCLUDES + *********************/ +//#include "lv_templ.h" /*TODO uncomment this*/ + +#if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_templ_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_templ_class = { + .constructor_cb = lv_templ_constructor, + .destructor_cb = lv_templ_destructor, + .event_cb = lv_templ_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_templ_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, + .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, + .base_class = &lv_templ_class, + .name = "templ", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_templ_create(lv_obj_t * parent) +{ + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +/* + * New object specific "set" functions come here + */ + +/*===================== + * Getter functions + *====================*/ + +/* + * New object specific "get" functions come here + */ + +/*===================== + * Other functions + *====================*/ + +/* + * New object specific "other" functions come here + */ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_templ_t * templ = (lv_templ_t *)obj; + /*Initialize the widget's data*/ + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + lv_templ_t * templ = (lv_templ_t *)obj; + /*Free the widget specific data*/ +} + +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = LV_EVENT_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + /*Add the widget specific event handling here*/ +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.h b/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.h new file mode 100644 index 0000000..ccf1e1c --- /dev/null +++ b/libraries/lvgl/src/widgets/objx_templ/lv_objx_templ.h @@ -0,0 +1,81 @@ +/** + * @file lv_templ.h + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_TEMPL != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Data of template*/ +typedef struct { + lv_ANCESTOR_t ancestor; /*The ancestor widget, e.g. lv_slider_t slider*/ + /*New data for this type*/ +} lv_templ_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_templ_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a templ object + * @param parent pointer to an object, it will be the parent of the new templ + * @return pointer to the created bar + */ +lv_obj_t * lv_templ_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEMPL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/libraries/lvgl/src/widgets/roller/lv_roller.c b/libraries/lvgl/src/widgets/roller/lv_roller.c new file mode 100644 index 0000000..98ed0f3 --- /dev/null +++ b/libraries/lvgl/src/widgets/roller/lv_roller.c @@ -0,0 +1,808 @@ +/** + * @file lv_roller.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_roller.h" +#if LV_USE_ROLLER != 0 + +#include "../../misc/lv_assert.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_scroll.h" +#include "../../indev/lv_indev_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_roller_class) +#define MY_CLASS_LABEL &lv_roller_label_class +#define EXTRA_INF_SIZE 1000 /*[px]: add the options multiple times until getting this height*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static void draw_label(lv_event_t * e); +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area); +static void refr_position(lv_obj_t * obj, lv_anim_enable_t animen); +static lv_result_t release_handler(lv_obj_t * obj); +static void inf_normalize(lv_obj_t * obj_scrl); +static lv_obj_t * get_label(const lv_obj_t * obj); +static int32_t get_selected_label_width(const lv_obj_t * obj); +static void scroll_anim_completed_cb(lv_anim_t * a); +static void set_y_anim(void * obj, int32_t v); +static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_roller_class = { + .constructor_cb = lv_roller_constructor, + .event_cb = lv_roller_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_roller_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "roller", +}; + +const lv_obj_class_t lv_roller_label_class = { + .event_cb = lv_roller_label_event, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_label_class, + .name = "roller-label", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_roller_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_obj_t * label = get_label(obj); + + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + /*Count the '\n'-s to determine the number of options*/ + roller->option_cnt = 0; + uint32_t cnt; + for(cnt = 0; options[cnt] != '\0'; cnt++) { + if(options[cnt] == '\n') roller->option_cnt++; + } + roller->option_cnt++; /*Last option has no `\n`*/ + + if(mode == LV_ROLLER_MODE_NORMAL) { + roller->mode = LV_ROLLER_MODE_NORMAL; + lv_label_set_text(label, options); + } + else { + roller->mode = LV_ROLLER_MODE_INFINITE; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, 0); + int32_t normal_h = roller->option_cnt * (lv_font_get_line_height(font) + lv_obj_get_style_text_letter_space(obj, 0)); + roller->inf_page_cnt = LV_CLAMP(3, EXTRA_INF_SIZE / normal_h, 15); + if(!(roller->inf_page_cnt & 1)) roller->inf_page_cnt++; /*Make it odd*/ + LV_LOG_INFO("Using %" LV_PRIu32 " pages to make the roller look infinite", roller->inf_page_cnt); + + size_t opt_len = lv_strlen(options) + 1; /*+1 to add '\n' after option lists*/ + char * opt_extra = lv_malloc(opt_len * roller->inf_page_cnt); + uint32_t i; + for(i = 0; i < roller->inf_page_cnt; i++) { + lv_strcpy(&opt_extra[opt_len * i], options); + opt_extra[opt_len * (i + 1) - 1] = '\n'; + } + opt_extra[opt_len * roller->inf_page_cnt - 1] = '\0'; + lv_label_set_text(label, opt_extra); + lv_free(opt_extra); + + roller->sel_opt_id = ((roller->inf_page_cnt / 2) + 0) * roller->option_cnt; + + roller->option_cnt = roller->option_cnt * roller->inf_page_cnt; + inf_normalize(obj); + } + + roller->sel_opt_id_ori = roller->sel_opt_id; + + /*If the selected text has larger font the label needs some extra draw padding to draw it.*/ + lv_obj_refresh_ext_draw_size(label); + +} + +void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Set the value even if it's the same as the current value because + *if moving to the next option with an animation which was just deleted in the PRESS Call the ancestor's event handler + *nothing will continue the animation.*/ + + lv_roller_t * roller = (lv_roller_t *)obj; + + /*In infinite mode interpret the new ID relative to the currently visible "page"*/ + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_option_cnt = roller->option_cnt / roller->inf_page_cnt; + uint32_t current_page = roller->sel_opt_id / real_option_cnt; + /*Set by the user to e.g. 0, 1, 2, 3... + *Upscale the value to the current page*/ + if(sel_opt < real_option_cnt) { + uint32_t act_opt = roller->sel_opt_id - current_page * real_option_cnt; + int32_t sel_opt_signed = sel_opt; + /*Huge jump? Probably from last to first or first to last option.*/ + if((uint32_t)LV_ABS((int16_t)(act_opt - sel_opt)) > real_option_cnt / 2) { + if(act_opt > sel_opt) sel_opt_signed += real_option_cnt; + else sel_opt_signed -= real_option_cnt; + } + sel_opt = sel_opt_signed + real_option_cnt * current_page; + } + } + + roller->sel_opt_id = sel_opt < roller->option_cnt ? sel_opt : roller->option_cnt - 1; + roller->sel_opt_id_ori = roller->sel_opt_id; + + refr_position(obj, anim); +} + +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_obj_set_height(obj, (lv_font_get_line_height(font) + line_space) * row_cnt + 2 * border_width); +} + +/*===================== + * Getter functions + *====================*/ + +uint32_t lv_roller_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; + return roller->sel_opt_id % real_id_cnt; + } + else { + return roller->sel_opt_id; + } +} + +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_obj_t * label = get_label(obj); + uint32_t i; + uint32_t line = 0; + const char * opt_txt = lv_label_get_text(label); + size_t txt_len = lv_strlen(opt_txt); + + for(i = 0; i < txt_len && line != roller->sel_opt_id; i++) { + if(opt_txt[i] == '\n') line++; + } + + uint32_t c; + for(c = 0; i < txt_len && opt_txt[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("the buffer was too small"); + break; + } + buf[c] = opt_txt[i]; + } + + buf[c] = '\0'; +} + +/** + * Get the options of a roller + * @param roller pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_label_get_text(get_label(obj)); +} + +uint32_t lv_roller_get_option_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + return roller->option_cnt / roller->inf_page_cnt; + } + else { + return roller->option_cnt; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_roller_t * roller = (lv_roller_t *)obj; + + roller->mode = LV_ROLLER_MODE_NORMAL; + roller->option_cnt = 0; + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + + LV_LOG_INFO("begin"); + lv_obj_t * label = lv_obj_class_create_obj(&lv_roller_label_class, obj); + lv_obj_class_init_obj(label); +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_roller_set_options(obj, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL); +#endif + LV_LOG_TRACE("finished"); +} + +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_roller_t * roller = (lv_roller_t *)obj; + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = get_selected_label_width(obj); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_t * label = get_label(obj); + /*Be sure the label's style is updated before processing the roller*/ + if(label) lv_obj_send_event(label, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_refresh_self_size(obj); + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_PRESSED) { + roller->moved = 0; + lv_anim_delete(get_label(obj), set_y_anim); + } + else if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_active(); + lv_point_t p; + lv_indev_get_vect(indev, &p); + + transform_vect_recursive(obj, &p); + if(p.y) { + lv_obj_t * label = get_label(obj); + lv_obj_set_y(label, lv_obj_get_y(label) + p.y); + roller->moved = 1; + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + release_handler(obj); + } + else if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + const bool editing = lv_group_get_editing(g); + + /*Save the current state when entered to edit mode*/ + if(editing) { + roller->sel_opt_id_ori = roller->sel_opt_id; + } + else { /*In navigate mode revert the original value*/ + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + } + else { + /*Save the current value. Used to revert this + *state if ENTER won't be pressed*/ + roller->sel_opt_id_ori = roller->sel_opt_id; + } + } + else if(code == LV_EVENT_DEFOCUSED) { + /*Revert the original state*/ + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(roller->sel_opt_id + 1 < roller->option_cnt) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, roller->sel_opt_id + 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + if(roller->sel_opt_id > 0) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, roller->sel_opt_id - 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + } + else if(code == LV_EVENT_ROTARY) { + int32_t r = lv_event_get_rotary_diff(e); + int32_t new_id = roller->sel_opt_id + r; + new_id = LV_CLAMP(0, new_id, (int32_t)roller->option_cnt - 1); + if((int32_t)roller->sel_opt_id != new_id) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, new_id, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_obj_t * label = get_label(obj); + lv_obj_refresh_ext_draw_size(label); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) { + draw_main(e); + } +} + +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + lv_event_code_t code = lv_event_get_code(e); + /*LV_EVENT_DRAW_MAIN will be called in the draw function*/ + if(code != LV_EVENT_DRAW_MAIN) { + /* Call the ancestor's event handler */ + res = lv_obj_event_base(MY_CLASS_LABEL, e); + if(res != LV_RESULT_OK) return; + } + + lv_obj_t * label = lv_event_get_current_target(e); + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*If the selected text has a larger font it needs some extra space to draw it*/ + int32_t * s = lv_event_get_param(e); + lv_obj_t * obj = lv_obj_get_parent(label); + int32_t sel_w = get_selected_label_width(obj); + int32_t label_w = lv_obj_get_width(label); + *s = LV_MAX(*s, sel_w - label_w); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(lv_obj_get_parent(label), LV_ANIM_OFF); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_label(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Draw the selected rectangle*/ + lv_layer_t * layer = lv_event_get_layer(e); + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_draw_rect_dsc_t sel_dsc; + lv_draw_rect_dsc_init(&sel_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_SELECTED, &sel_dsc); + lv_draw_rect(layer, &sel_dsc, &sel_area); + } + /*Post draw when the children are drawn*/ + else if(code == LV_EVENT_DRAW_POST) { + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_SELECTED, &label_dsc); + + /*Redraw the text on the selected area*/ + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_area_t mask_sel; + bool area_ok; + area_ok = _lv_area_intersect(&mask_sel, &layer->_clip_area, &sel_area); + if(area_ok) { + lv_obj_t * label = get_label(obj); + + /*Get the size of the "selected text"*/ + lv_point_t res_p; + lv_text_get_size(&res_p, lv_label_get_text(label), label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + lv_obj_get_width(obj), LV_TEXT_FLAG_EXPAND); + + /*Move the selected label proportionally with the background label*/ + int32_t roller_h = lv_obj_get_height(obj); + int32_t label_y_prop = label->coords.y1 - (roller_h / 2 + + obj->coords.y1); /*label offset from the middle line of the roller*/ + label_y_prop = (label_y_prop * 16384) / lv_obj_get_height( + label); /*Proportional position from the middle line (upscaled by << 14)*/ + + /*Apply a correction with different line heights*/ + const lv_font_t * normal_label_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t corr = (label_dsc.font->line_height - normal_label_font->line_height) / 2; + + /*Apply the proportional position to the selected text*/ + res_p.y -= corr; + int32_t label_sel_y = roller_h / 2 + obj->coords.y1; + label_sel_y += (label_y_prop * res_p.y) >> 14; + label_sel_y -= corr; + + int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + /*Draw the selected text*/ + lv_area_t label_sel_area; + label_sel_area.x1 = obj->coords.x1 + pleft + bwidth; + label_sel_area.y1 = label_sel_y; + label_sel_area.x2 = obj->coords.x2 - pright - bwidth; + label_sel_area.y2 = label_sel_area.y1 + res_p.y; + + label_dsc.flag |= LV_TEXT_FLAG_EXPAND; + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = mask_sel; + label_dsc.text = lv_label_get_text(label); + lv_draw_label(layer, &label_dsc, &label_sel_area); + layer->_clip_area = clip_area_ori; + } + } +} + +static void draw_label(lv_event_t * e) +{ + /* Split the drawing of the label into an upper (above the selected area) + * and a lower (below the selected area)*/ + lv_obj_t * label_obj = lv_event_get_current_target(e); + lv_obj_t * roller = lv_obj_get_parent(label_obj); + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); + + lv_layer_t * layer = lv_event_get_layer(e); + + /*If the roller has shadow or outline it has some ext. draw size + *therefore the label can overflow the roller's boundaries. + *To solve this limit the clip area to the "plain" roller.*/ + const lv_area_t clip_area_ori = layer->_clip_area; + lv_area_t roller_clip_area; + if(!_lv_area_intersect(&roller_clip_area, &layer->_clip_area, &roller->coords)) return; + layer->_clip_area = roller_clip_area; + + lv_area_t sel_area; + get_sel_area(roller, &sel_area); + + lv_area_t clip2; + clip2.x1 = label_obj->coords.x1; + clip2.y1 = label_obj->coords.y1; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = sel_area.y1; + if(_lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + const lv_area_t clip_area_ori2 = layer->_clip_area; + layer->_clip_area = clip2; + label_draw_dsc.text = lv_label_get_text(label_obj); + lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); + layer->_clip_area = clip_area_ori2; + } + + clip2.x1 = label_obj->coords.x1; + clip2.y1 = sel_area.y2; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = label_obj->coords.y2; + if(_lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + const lv_area_t clip_area_ori2 = layer->_clip_area; + layer->_clip_area = clip2; + label_draw_dsc.text = lv_label_get_text(label_obj); + lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); + layer->_clip_area = clip_area_ori2; + } + + layer->_clip_area = clip_area_ori; +} + +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area) +{ + + const lv_font_t * font_main = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const lv_font_t * font_sel = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + int32_t font_main_h = lv_font_get_line_height(font_main); + int32_t font_sel_h = lv_font_get_line_height(font_sel); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t d = (font_sel_h + font_main_h) / 2 + line_space; + sel_area->y1 = obj->coords.y1 + lv_obj_get_height(obj) / 2 - d / 2; + sel_area->y2 = sel_area->y1 + d; + lv_area_t roller_coords; + lv_obj_get_coords(obj, &roller_coords); + + sel_area->x1 = roller_coords.x1; + sel_area->x2 = roller_coords.x2; + +} + +/** + * Refresh the position of the roller. It uses the id stored in: roller->ddlist.selected_option_id + * @param roller pointer to a roller object + * @param anim_en LV_ANIM_ON: refresh with animation; LV_ANIM_OFF: without animation + */ +static void refr_position(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return; + + const lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, lv_label_get_text(label)); + + int32_t x = 0; + switch(align) { + case LV_TEXT_ALIGN_CENTER: + x = (lv_obj_get_content_width(obj) - lv_obj_get_width(label)) / 2; + break; + case LV_TEXT_ALIGN_RIGHT: + x = lv_obj_get_content_width(obj) - lv_obj_get_width(label); + break; + case LV_TEXT_ALIGN_LEFT: + x = 0; + break; + default: + /* Invalid alignment */ + break; + } + lv_obj_set_x(label, x); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const int32_t font_h = lv_font_get_line_height(font); + const int32_t h = lv_obj_get_content_height(obj); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + + /*Normally the animation's `end_cb` sets correct position of the roller if infinite. + *But without animations we have to do it manually*/ + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + inf_normalize(obj); + } + + /* Calculate animation configuration */ + lv_roller_t * roller = (lv_roller_t *)obj; + int32_t id = roller->sel_opt_id; + const int32_t sel_y1 = id * (font_h + line_space); + const int32_t mid_y1 = h / 2 - font_h / 2; + const int32_t new_y = mid_y1 - sel_y1; + + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + lv_anim_delete(label, set_y_anim); + lv_obj_set_y(label, new_y); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, label); + lv_anim_set_exec_cb(&a, set_y_anim); + lv_anim_set_values(&a, lv_obj_get_y(label), new_y); + lv_anim_set_duration(&a, anim_time); + lv_anim_set_completed_cb(&a, scroll_anim_completed_cb); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + lv_anim_start(&a); + } +} + +static lv_result_t release_handler(lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return LV_RESULT_OK; + + lv_indev_t * indev = lv_indev_active(); + lv_roller_t * roller = (lv_roller_t *)obj; + + /*Leave edit mode once a new option is selected*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + roller->sel_opt_id_ori = roller->sel_opt_id; + + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_t * g = lv_obj_get_group(obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + } + + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + int16_t new_opt = -1; + if(roller->moved == 0) { + new_opt = 0; + lv_point_t p; + lv_indev_get_point(indev, &p); + p.y -= label->coords.y1; + p.x -= label->coords.x1; + uint32_t letter_i; + letter_i = lv_label_get_letter_on(label, &p, true); + + const char * txt = lv_label_get_text(label); + uint32_t i = 0; + uint32_t i_prev = 0; + + uint32_t letter_cnt = 0; + for(letter_cnt = 0; letter_cnt < letter_i; letter_cnt++) { + uint32_t letter = _lv_text_encoded_next(txt, &i); + /*Count he lines to reach the clicked letter. But ignore the last '\n' because it + * still belongs to the clicked line*/ + if(letter == '\n' && i_prev != letter_i) new_opt++; + i_prev = i; + } + } + else { + /*If dragged then align the list to have an element in the middle*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + + int32_t label_unit = font_h + line_space; + int32_t mid = obj->coords.y1 + (obj->coords.y2 - obj->coords.y1) / 2; + + lv_point_t p = indev->pointer.scroll_throw_vect_ori; + transform_vect_recursive(obj, &p); + + int32_t scroll_throw = indev->scroll_throw; + int32_t sum = 0; + int32_t v = p.y; + while(v) { + sum += v; + v = v * (100 - scroll_throw) / 100; + } + + int32_t label_y1 = label->coords.y1 + sum; + int32_t id = (mid - label_y1) / label_unit; + + if(id < 0) id = 0; + if(id >= (int32_t)roller->option_cnt) id = roller->option_cnt - 1; + + new_opt = id; + } + + if(new_opt >= 0) { + lv_roller_set_selected(obj, new_opt, LV_ANIM_ON); + } + } + + uint32_t id = roller->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); + return res; +} + +/** + * Set the middle page for the roller if infinite is enabled + * @param roller pointer to a roller object + */ +static void inf_normalize(lv_obj_t * obj) +{ + lv_roller_t * roller = (lv_roller_t *)obj; + + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; + roller->sel_opt_id = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ + + roller->sel_opt_id_ori = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id_ori += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ + + /*Move to the new id*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t h = lv_obj_get_content_height(obj); + + lv_obj_t * label = get_label(obj); + + int32_t sel_y1 = roller->sel_opt_id * (font_h + line_space); + int32_t mid_y1 = h / 2 - font_h / 2; + int32_t new_y = mid_y1 - sel_y1; + lv_obj_set_y(label, new_y); + } +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + return lv_obj_get_child(obj, 0); +} + +static int32_t get_selected_label_width(const lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return 0; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_SELECTED); + const char * txt = lv_label_get_text(label); + lv_point_t size; + lv_text_get_size(&size, txt, font, letter_space, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + return size.x; +} + +static void scroll_anim_completed_cb(lv_anim_t * a) +{ + lv_obj_t * obj = lv_obj_get_parent(a->var); /*The label is animated*/ + inf_normalize(obj); +} + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect) +{ + int16_t angle = 0; + int32_t scale_x = 256; + int32_t scale_y = 256; + lv_obj_t * parent = roller; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, 0); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0); + scale_x = (scale_y * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + lv_point_t pivot = { 0, 0 }; + + scale_x = 256 * 256 / scale_x; + scale_y = 256 * 256 / scale_y; + lv_point_transform(vect, -angle, scale_x, scale_y, &pivot, false); +} + +#endif diff --git a/libraries/lvgl/src/widgets/roller/lv_roller.h b/libraries/lvgl/src/widgets/roller/lv_roller.h new file mode 100644 index 0000000..9609948 --- /dev/null +++ b/libraries/lvgl/src/widgets/roller/lv_roller.h @@ -0,0 +1,140 @@ +/** + * @file lv_roller.h + * + */ + +#ifndef LV_ROLLER_H +#define LV_ROLLER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_ROLLER != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_roller: lv_label is required. Enable it in lv_conf.h (LV_USE_ROLLER 1)" +#endif + +#include "../label/lv_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Roller mode.*/ +enum _lv_roller_mode_t { + LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options).*/ + LV_ROLLER_MODE_INFINITE, /**< Infinite mode (roller can be scrolled forever).*/ +}; + +#ifdef DOXYGEN +typedef _lv_roller_mode_t lv_roller_mode_t; +#else +typedef uint8_t lv_roller_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + lv_obj_t obj; + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the current option*/ + uint32_t sel_opt_id_ori; /**< Store the original index on focus*/ + uint32_t inf_page_cnt; /**< Number of extra pages added to make the roller look infinite */ + lv_roller_mode_t mode : 1; + uint32_t moved : 1; +} lv_roller_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_roller_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a roller object + * @param parent pointer to an object, it will be the parent of the new roller. + * @return pointer to the created roller + */ +lv_obj_t * lv_roller_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the options on a roller + * @param obj pointer to roller object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` + */ +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode); + +/** + * Set the selected option + * @param obj pointer to a roller object + * @param sel_opt index of the selected option (0 ... number of option - 1); + * @param anim LV_ANIM_ON: set with animation; LV_ANOM_OFF set immediately + */ +void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim); + +/** + * Set the height to show the given number of rows (options) + * @param obj pointer to a roller object + * @param row_cnt number of desired visible rows + */ +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the index of the selected option + * @param obj pointer to a roller object + * @return index of the selected option (0 ... number of option - 1); + */ +uint32_t lv_roller_get_selected(const lv_obj_t * obj); + +/** + * Get the current selected option as a string. + * @param obj pointer to ddlist object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + +/** + * Get the options of a roller + * @param obj pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to a roller object + * @return the total number of options + */ +uint32_t lv_roller_get_option_count(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ROLLER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ROLLER_H*/ diff --git a/libraries/lvgl/src/widgets/scale/lv_scale.c b/libraries/lvgl/src/widgets/scale/lv_scale.c new file mode 100644 index 0000000..1e8df7a --- /dev/null +++ b/libraries/lvgl/src/widgets/scale/lv_scale.c @@ -0,0 +1,1444 @@ +/** + * @file lv_scale.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_scale.h" +#if LV_USE_SCALE != 0 + +#include "../../core/lv_group.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw_arc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_scale_class) + +#define LV_SCALE_LABEL_TXT_LEN (20U) +#define LV_SCALE_DEFAULT_ANGLE_RANGE ((uint32_t) 270U) +#define LV_SCALE_DEFAULT_ROTATION ((int32_t) 135U) +#define LV_SCALE_TICK_IDX_DEFAULT_ID ((uint32_t) 255U) +#define LV_SCALE_DEFAULT_LABEL_GAP ((uint32_t) 15U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event); + +static void scale_draw_main(lv_obj_t * obj, lv_event_t * event); +static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event); + +static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); +static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, + lv_point_t * tick_point_a, lv_point_t * tick_point_b); +static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, + lv_area_t * label_coords); +static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + lv_style_t * indicator_section_style); +static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, lv_style_t * section_style, + uint32_t part); +static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, lv_style_t * section_style); +/* Helpers */ +static void scale_find_section_tick_idx(lv_obj_t * obj); +static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, + const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width); +static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, + lv_draw_label_dsc_t * label_dsc, lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, + const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a); +static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const uint16_t major_tick_idx); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_scale_class = { + .constructor_cb = lv_scale_constructor, + .destructor_cb = lv_scale_destructor, + .event_cb = lv_scale_event, + .instance_size = sizeof(lv_scale_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_obj_class, + .name = "scale", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_scale_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->mode = mode; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->total_tick_count = total_tick_count; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->major_tick_every = major_tick_every; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_label_show(lv_obj_t * obj, bool show_label) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->label_enabled = show_label; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->range_min = min; + scale->range_max = max; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->angle_range = angle_range; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->rotation = rotation; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, + int32_t value) +{ + int32_t angle; + int32_t scale_width, scale_height; + int32_t actual_needle_length; + int32_t needle_length_x, needle_length_y; + static lv_point_precise_t needle_line_points[2]; + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && + (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { + return; + } + + lv_obj_align(needle_line, LV_ALIGN_TOP_LEFT, 0, 0); + + scale_width = lv_obj_get_style_width(obj, LV_PART_MAIN); + scale_height = lv_obj_get_style_height(obj, LV_PART_MAIN); + + if(scale_width != scale_height) { + return; + } + + if(needle_length >= scale_width / 2) { + actual_needle_length = scale_width / 2; + } + else if(needle_length >= 0) { + actual_needle_length = needle_length; + } + else if(needle_length + scale_width / 2 < 0) { + actual_needle_length = 0; + } + else { + actual_needle_length = scale_width / 2 + needle_length; + } + + if(value < scale->range_min) { + angle = 0; + } + else if(value > scale->range_max) { + angle = scale->angle_range; + } + else { + angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); + } + + needle_length_x = (actual_needle_length * lv_trigo_cos(scale->rotation + angle)) >> LV_TRIGO_SHIFT; + needle_length_y = (actual_needle_length * lv_trigo_sin(scale->rotation + angle)) >> LV_TRIGO_SHIFT; + + needle_line_points[0].x = scale_width / 2; + needle_line_points[0].y = scale_height / 2; + needle_line_points[1].x = scale_width / 2 + needle_length_x; + needle_line_points[1].y = scale_height / 2 + needle_length_y; + + lv_line_set_points(needle_line, needle_line_points, 2); +} + +void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value) +{ + int32_t angle; + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && + (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { + return; + } + + if(value < scale->range_min) { + angle = 0; + } + else if(value > scale->range_max) { + angle = scale->angle_range; + } + else { + angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); + } + + lv_image_set_rotation(needle_img, (scale->rotation + angle) * 10); +} + +void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->txt_src = txt_src; + scale->custom_label_cnt = 0; + if(scale->txt_src) { + int32_t idx; + for(idx = 0; txt_src[idx]; ++idx) { + scale->custom_label_cnt++; + } + } + + lv_obj_invalidate(obj); +} + +void lv_scale_set_post_draw(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->post_draw = en; + + lv_obj_invalidate(obj); +} + +lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_scale_t * scale = (lv_scale_t *)obj; + lv_scale_section_t * section = _lv_ll_ins_head(&scale->section_ll); + LV_ASSERT_MALLOC(section); + if(section == NULL) return NULL; + + /* Section default values */ + section->main_style = NULL; + section->indicator_style = NULL; + section->items_style = NULL; + section->minor_range = 0U; + section->major_range = 0U; + section->first_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; + section->last_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; + section->first_tick_idx_is_major = 0U; + section->last_tick_idx_is_major = 0U; + section->first_tick_in_section_width = 0U; + section->last_tick_in_section_width = 0U; + + return section; +} + +void lv_scale_section_set_range(lv_scale_section_t * section, int32_t minor_range, int32_t major_range) +{ + if(NULL == section) return; + + section->minor_range = minor_range; + section->major_range = major_range; +} + +void lv_scale_section_set_style(lv_scale_section_t * section, uint32_t part, lv_style_t * section_part_style) +{ + if(NULL == section) return; + + switch(part) { + case LV_PART_MAIN: + section->main_style = section_part_style; + break; + case LV_PART_INDICATOR: + section->indicator_style = section_part_style; + break; + case LV_PART_ITEMS: + section->items_style = section_part_style; + break; + default: + /* Invalid part */ + break; + } +} + +/*===================== + * Getter functions + *====================*/ + +lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->mode; +} + +int32_t lv_scale_get_total_tick_count(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->total_tick_count; +} + +int32_t lv_scale_get_major_tick_every(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->major_tick_every; +} + +bool lv_scale_get_label_show(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->label_enabled; +} + +uint32_t lv_scale_get_angle_range(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->angle_range; +} + +int32_t lv_scale_get_range_min_value(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->range_min; +} + +int32_t lv_scale_get_range_max_value(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->range_max; +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_scale_t * scale = (lv_scale_t *)obj; + + _lv_ll_init(&scale->section_ll, sizeof(lv_scale_section_t)); + + scale->total_tick_count = LV_SCALE_TOTAL_TICK_COUNT_DEFAULT; + scale->major_tick_every = LV_SCALE_MAJOR_TICK_EVERY_DEFAULT; + scale->mode = LV_SCALE_MODE_HORIZONTAL_BOTTOM; + scale->label_enabled = LV_SCALE_LABEL_ENABLED_DEFAULT; + scale->angle_range = LV_SCALE_DEFAULT_ANGLE_RANGE; + scale->rotation = LV_SCALE_DEFAULT_ROTATION; + scale->range_min = 0U; + scale->range_max = 100U; + scale->last_tick_width = 0U; + scale->first_tick_width = 0U; + scale->post_draw = false; + scale->custom_label_cnt = 0U; + scale->txt_src = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_scale_t * scale = (lv_scale_t *)obj; + lv_scale_section_t * section; + while(scale->section_ll.head) { + section = _lv_ll_get_head(&scale->section_ll); + _lv_ll_remove(&scale->section_ll, section); + lv_free(section); + } + _lv_ll_clear(&scale->section_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res = lv_obj_event_base(MY_CLASS, event); + if(res != LV_RESULT_OK) return; + + lv_event_code_t event_code = lv_event_get_code(event); + lv_obj_t * obj = lv_event_get_current_target(event); + lv_scale_t * scale = (lv_scale_t *) obj; + LV_UNUSED(scale); + + if(event_code == LV_EVENT_DRAW_MAIN) { + if(scale->post_draw == false) { + scale_find_section_tick_idx(obj); + scale_draw_indicator(obj, event); + scale_draw_main(obj, event); + } + } + if(event_code == LV_EVENT_DRAW_POST) { + if(scale->post_draw == true) { + scale_find_section_tick_idx(obj); + scale_draw_indicator(obj, event); + scale_draw_main(obj, event); + } + } + else if(event_code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /* NOTE: Extend scale draw size so the first tick label can be shown */ + lv_event_set_ext_draw_size(event, 100); + } + else { + /* Nothing to do. Invalid event */ + } +} + +static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + lv_layer_t * layer = lv_event_get_layer(event); + + if(scale->total_tick_count <= 1) return; + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + /* Formatting the labels with the configured style for LV_PART_INDICATOR */ + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); + + /* Major tick style */ + lv_draw_line_dsc_t major_tick_dsc; + lv_draw_line_dsc_init(&major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + + /* Configure line draw descriptor for the minor tick drawing */ + lv_draw_line_dsc_t minor_tick_dsc; + lv_draw_line_dsc_init(&minor_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + + /* Main line style */ + lv_draw_line_dsc_t main_line_dsc; + lv_draw_line_dsc_init(&main_line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); + + const int32_t major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + + uint32_t total_tick_count = scale->total_tick_count; + uint32_t tick_idx = 0; + uint32_t major_tick_idx = 0; + for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { + /* A major tick is the one which has a label in it */ + bool is_major_tick = false; + if(tick_idx % scale->major_tick_every == 0) is_major_tick = true; + if(is_major_tick) major_tick_idx++; + + const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, scale->range_min, scale->range_max); + + /* Overwrite label and tick properties if tick value is within section range */ + lv_scale_section_t * section; + _LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->minor_range <= tick_value && section->major_range >= tick_value) { + if(is_major_tick) { + scale_set_indicator_label_properties(obj, &label_dsc, section->indicator_style); + scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + break; + } + else { + /* Tick is not in section, get the proper styles */ + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + } + } + + /* The tick is represented by a line. We need two points to draw it */ + lv_point_t tick_point_a; + lv_point_t tick_point_b; + scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); + + /* Setup a label if they're enabled and we're drawing a major tick */ + if(scale->label_enabled && is_major_tick) { + /* Label text setup */ + char text_buffer[LV_SCALE_LABEL_TXT_LEN] = {0}; + lv_area_t label_coords; + + /* Check if the custom text array has element for this major tick index */ + if(scale->txt_src) { + scale_build_custom_label_text(obj, &label_dsc, major_tick_idx); + } + else { /* Add label with mapped values */ + lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value); + label_dsc.text = text_buffer; + label_dsc.text_local = 1; + } + + scale_get_label_coords(obj, &label_dsc, &tick_point_b, &label_coords); + lv_draw_label(layer, &label_dsc, &label_coords); + } + + /* Store initial and last tick widths to be used in the main line drawing */ + scale_store_main_line_tick_width_compensation(obj, tick_idx, is_major_tick, major_tick_dsc.width, minor_tick_dsc.width); + + /* Store the first and last section tick vertical/horizontal position */ + scale_store_section_line_tick_width_compensation(obj, is_major_tick, &label_dsc, &major_tick_dsc, &minor_tick_dsc, + tick_value, tick_idx, &tick_point_a); + + if(is_major_tick) { + major_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + major_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + lv_draw_line(layer, &major_tick_dsc); + } + else { + minor_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + minor_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + lv_draw_line(layer, &minor_tick_dsc); + } + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + /* Find the center of the scale */ + lv_point_t center_point; + int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2U, lv_area_get_height(&scale_area) / 2U); + center_point.x = scale_area.x1 + radius_edge; + center_point.y = scale_area.y1 + radius_edge; + + /* Major tick */ + major_tick_dsc.raw_end = 0; + + uint32_t label_gap = LV_SCALE_DEFAULT_LABEL_GAP; /* TODO: Add to style properties */ + uint32_t tick_idx = 0; + uint32_t major_tick_idx = 0; + for(tick_idx = 0; tick_idx < scale->total_tick_count; tick_idx++) { + /* A major tick is the one which has a label in it */ + bool is_major_tick = false; + if(tick_idx % scale->major_tick_every == 0) is_major_tick = true; + if(is_major_tick) major_tick_idx++; + + const int32_t tick_value = lv_map(tick_idx, 0U, scale->total_tick_count - 1, scale->range_min, scale->range_max); + + /* Overwrite label and tick properties if tick value is within section range */ + lv_scale_section_t * section; + _LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->minor_range <= tick_value && section->major_range >= tick_value) { + if(is_major_tick) { + scale_set_indicator_label_properties(obj, &label_dsc, section->indicator_style); + scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + break; + } + else { + /* Tick is not in section, get the proper styles */ + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + } + } + + /* The tick is represented by a line. We need two points to draw it */ + lv_point_t tick_point_a; + lv_point_t tick_point_b; + scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); + + /* Setup a label if they're enabled and we're drawing a major tick */ + if(scale->label_enabled && is_major_tick) { + /* Label text setup */ + char text_buffer[LV_SCALE_LABEL_TXT_LEN] = {0}; + lv_area_t label_coords; + + /* Check if the custom text array has element for this major tick index */ + if(scale->txt_src) { + scale_build_custom_label_text(obj, &label_dsc, major_tick_idx); + } + else { /* Add label with mapped values */ + lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value); + label_dsc.text = text_buffer; + label_dsc.text_local = 1; + } + + /* Also take into consideration the letter space of the style */ + int32_t angle_upscale = ((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1); + angle_upscale += scale->rotation * 10U; + + uint32_t radius_text = 0; + if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { + radius_text = (radius_edge - major_len) - (label_gap + label_dsc.letter_space); + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode) { + radius_text = (radius_edge + major_len) + (label_gap + label_dsc.letter_space); + } + else { /* Nothing to do */ } + + lv_point_t point; + point.x = center_point.x + radius_text; + point.y = center_point.y; + lv_point_transform(&point, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + scale_get_label_coords(obj, &label_dsc, &point, &label_coords); + + lv_draw_label(layer, &label_dsc, &label_coords); + } + + /* Store initial and last tick widths to be used in the main line drawing */ + scale_store_main_line_tick_width_compensation(obj, tick_idx, is_major_tick, major_tick_dsc.width, minor_tick_dsc.width); + + if(is_major_tick) { + major_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + major_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + lv_draw_line(layer, &major_tick_dsc); + } + else { + minor_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + minor_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + lv_draw_line(layer, &minor_tick_dsc); + } + } + } + else { /* Nothing to do */ } +} + +static void scale_draw_main(lv_obj_t * obj, lv_event_t * event) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + lv_layer_t * layer = lv_event_get_layer(event); + + if(scale->total_tick_count <= 1) return; + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + + /* Configure both line and label draw descriptors for the tick and label drawings */ + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + /* Get style properties so they can be used in the main line drawing */ + const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + + int32_t x_ofs = 0U; + int32_t y_ofs = 0U; + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + x_ofs = obj->coords.x2 + (line_dsc.width / 2U) - pad_right; + y_ofs = obj->coords.y1 + pad_top; + } + else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + x_ofs = obj->coords.x1 + (line_dsc.width / 2U) + pad_left; + y_ofs = obj->coords.y1 + pad_top; + } + if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + x_ofs = obj->coords.x1 + pad_right; + y_ofs = obj->coords.y1 + (line_dsc.width / 2U) + pad_top; + } + else if(LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) { + x_ofs = obj->coords.x1 + pad_left; + y_ofs = obj->coords.y2 + (line_dsc.width / 2U) - pad_bottom; + } + else { /* Nothing to do */ } + + lv_point_t main_line_point_a; + lv_point_t main_line_point_b; + + /* Setup the tick points */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + main_line_point_a.x = x_ofs - 1U; + main_line_point_a.y = y_ofs; + main_line_point_b.x = x_ofs - 1U; + main_line_point_b.y = obj->coords.y2 - pad_bottom; + + /* Adjust main line with initial and last tick width */ + main_line_point_a.y -= scale->last_tick_width / 2U; + main_line_point_b.y += scale->first_tick_width / 2U; + } + else { + main_line_point_a.x = x_ofs; + main_line_point_a.y = y_ofs; + /* X of second point starts at the edge of the object minus the left pad */ + main_line_point_b.x = obj->coords.x2 - (pad_left); + main_line_point_b.y = y_ofs; + + /* Adjust main line with initial and last tick width */ + main_line_point_a.x -= scale->last_tick_width / 2U; + main_line_point_b.x += scale->first_tick_width / 2U; + } + + line_dsc.p1 = lv_point_to_precise(&main_line_point_a); + line_dsc.p2 = lv_point_to_precise(&main_line_point_b); + lv_draw_line(layer, &line_dsc); + + lv_scale_section_t * section; + _LV_LL_READ_BACK(&scale->section_ll, section) { + lv_draw_line_dsc_t main_line_section_dsc; + lv_draw_line_dsc_init(&main_line_section_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_section_dsc); + + /* Calculate the points of the section line */ + lv_point_t main_point_a; + lv_point_t main_point_b; + + /* Calculate the position of the section based on the ticks (first and last) index */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + /* Calculate position of the first tick in the section */ + main_point_a.x = main_line_point_a.x; + int32_t tmp = (int32_t)(section->first_tick_in_section_width / 2U); + main_point_a.y = section->first_tick_in_section.y + tmp; + + /* Calculate position of the last tick in the section */ + main_point_b.x = main_line_point_a.x; + tmp = (int32_t)(section->last_tick_in_section_width / 2U); + main_point_b.y = section->last_tick_in_section.y - tmp; + } + else { + /* Calculate position of the first tick in the section */ + int32_t tmp = (int32_t)(section->first_tick_in_section_width / 2U); + main_point_a.x = section->first_tick_in_section.x - tmp; + main_point_a.y = main_line_point_a.y; + + /* Calculate position of the last tick in the section */ + tmp = (int32_t)(section->last_tick_in_section_width / 2U); + main_point_b.x = section->last_tick_in_section.x + tmp; + main_point_b.y = main_line_point_a.y; + } + + scale_set_line_properties(obj, &main_line_section_dsc, section->main_style, LV_PART_MAIN); + + main_line_section_dsc.p1.x = main_point_a.x; + main_line_section_dsc.p1.y = main_point_a.y; + main_line_section_dsc.p2.x = main_point_b.x; + main_line_section_dsc.p2.y = main_point_b.y; + lv_draw_line(layer, &main_line_section_dsc); + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + /* Configure arc draw descriptors for the main part */ + lv_draw_arc_dsc_t arc_dsc; + lv_draw_arc_dsc_init(&arc_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); + + lv_point_t arc_center; + int32_t arc_radius; + scale_get_center(obj, &arc_center, &arc_radius); + + /* TODO: Add compensation for the width of the first and last tick over the arc */ + const int32_t start_angle = lv_map(scale->range_min, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + const int32_t end_angle = lv_map(scale->range_max, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + + arc_dsc.center = arc_center; + arc_dsc.radius = arc_radius; + arc_dsc.start_angle = start_angle; + arc_dsc.end_angle = end_angle; + + lv_draw_arc(layer, &arc_dsc); + + lv_scale_section_t * section; + _LV_LL_READ_BACK(&scale->section_ll, section) { + lv_draw_arc_dsc_t main_arc_section_dsc; + lv_draw_arc_dsc_init(&main_arc_section_dsc); + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &main_arc_section_dsc); + + lv_point_t section_arc_center; + int32_t section_arc_radius; + scale_get_center(obj, §ion_arc_center, §ion_arc_radius); + + /* TODO: Add compensation for the width of the first and last tick over the arc */ + const int32_t section_start_angle = lv_map(section->minor_range, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + const int32_t section_end_angle = lv_map(section->major_range, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + + scale_set_arc_properties(obj, &main_arc_section_dsc, section->main_style); + + main_arc_section_dsc.center = section_arc_center; + main_arc_section_dsc.radius = section_arc_radius; + main_arc_section_dsc.start_angle = section_start_angle; + main_arc_section_dsc.end_angle = section_end_angle; + + lv_draw_arc(layer, &main_arc_section_dsc); + } + } + else { /* Nothing to do */ } +} + +/** + * Get center point and radius of scale arc + * @param obj pointer to a scale object + * @param center pointer to center + * @param arc_r pointer to arc radius + */ +static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) +{ + int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2U; + + center->x = obj->coords.x1 + r + left_bg; + center->y = obj->coords.y1 + r + top_bg; + + if(arc_r) *arc_r = r; +} + +/** + * Get points for ticks + * + * In order to draw ticks we need two points, this interface returns both points for all scale modes. + * + * @param obj pointer to a scale object + * @param tick_idx index of the current tick + * @param is_major_tick true if tick_idx is a major tick + * @param tick_point_a pointer to point 'a' of the tick + * @param tick_point_b pointer to point 'b' of the tick + */ +static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, + lv_point_t * tick_point_a, lv_point_t * tick_point_b) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + /* Main line style */ + lv_draw_line_dsc_t main_line_dsc; + lv_draw_line_dsc_init(&main_line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); + + int32_t minor_len = 0; + int32_t major_len = 0; + + if(is_major_tick) { + major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); + } + else { + minor_len = lv_obj_get_style_length(obj, LV_PART_ITEMS); + } + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + + /* Get style properties so they can be used in the tick and label drawing */ + const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + const int32_t tick_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t tick_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t tick_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t tick_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t x_ofs = 0U; + int32_t y_ofs = 0U; + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + x_ofs = obj->coords.x2 + (main_line_dsc.width / 2U) - pad_right; + y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); + } + else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + x_ofs = obj->coords.x1 + (main_line_dsc.width / 2U) + pad_left; + y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); + } + else if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + x_ofs = obj->coords.x1 + (pad_right + tick_pad_right); + y_ofs = obj->coords.y1 + (main_line_dsc.width / 2U) + pad_top; + } + /* LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode */ + else { + x_ofs = obj->coords.x1 + (pad_left + tick_pad_left); + y_ofs = obj->coords.y2 + (main_line_dsc.width / 2U) - pad_bottom; + } + + /* Adjust length when tick will be drawn on horizontal top or vertical right scales */ + if((LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + if(is_major_tick) { + major_len *= -1; + } + else { + minor_len *= -1; + } + } + else { /* Nothing to do */ } + + const int32_t tick_length = is_major_tick ? major_len : minor_len; + /* NOTE + * Minus 1 because tick count starts at 0 + * TODO + * What if total_tick_count is 1? This will lead to an division by 0 further down */ + const uint32_t tmp_tick_count = scale->total_tick_count - 1U; + + /* Calculate the position of the tick points based on the mode and tick index */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + /* Vertical position starts at y2 of the scale main line, we start at y2 because the ticks are drawn from bottom to top */ + int32_t vertical_position = obj->coords.y2 - (pad_bottom + tick_pad_bottom); + + /* Position the last tick */ + if(tmp_tick_count == tick_idx) { + vertical_position = y_ofs; + } + /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ + else if(0 != tick_idx) { + const int32_t scale_total_height = lv_obj_get_height(obj) - (pad_top + pad_bottom + tick_pad_top + tick_pad_bottom); + const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_height) / (int32_t)(tmp_tick_count); + vertical_position -= offset; + } + else { /* Nothing to do */ } + + tick_point_a->x = x_ofs - 1U; /* Move extra pixel out of scale boundary */ + tick_point_a->y = vertical_position; + tick_point_b->x = tick_point_a->x - tick_length; + tick_point_b->y = vertical_position; + } + else { + /* Horizontal position starts at x1 of the scale main line */ + int32_t horizontal_position = x_ofs; + + /* Position the last tick */ + if(tmp_tick_count == tick_idx) { + horizontal_position = obj->coords.x2 - (pad_left + tick_pad_left); + } + /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ + else if(0U != tick_idx) { + const int32_t scale_total_width = lv_obj_get_width(obj) - (pad_right + pad_left + tick_pad_right + tick_pad_left); + const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_width) / (int32_t)(tmp_tick_count); + horizontal_position += offset; + } + else { /* Nothing to do */ } + + tick_point_a->x = horizontal_position; + tick_point_a->y = y_ofs; + tick_point_b->x = horizontal_position; + tick_point_b->y = tick_point_a->y + tick_length; + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + /* Find the center of the scale */ + lv_point_t center_point; + const int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2U, lv_area_get_height(&scale_area) / 2U); + center_point.x = scale_area.x1 + radius_edge; + center_point.y = scale_area.y1 + radius_edge; + + int32_t angle_upscale = ((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1); + angle_upscale += scale->rotation * 10U; + + /* Draw a little bit longer lines to be sure the mask will clip them correctly + * and to get a better precision. Adding the main line width to the calculation so we don't have gaps + * between the arc and the ticks */ + int32_t point_closer_to_arc = 0; + int32_t adjusted_radio_with_tick_len = 0; + if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { + point_closer_to_arc = radius_edge - main_line_dsc.width; + adjusted_radio_with_tick_len = point_closer_to_arc - (is_major_tick ? major_len : minor_len); + } + /* LV_SCALE_MODE_ROUND_OUTER == scale->mode */ + else { + point_closer_to_arc = radius_edge - main_line_dsc.width; + adjusted_radio_with_tick_len = point_closer_to_arc + (is_major_tick ? major_len : minor_len); + } + + tick_point_a->x = center_point.x + point_closer_to_arc; + tick_point_a->y = center_point.y; + lv_point_transform(tick_point_a, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + + tick_point_b->x = center_point.x + adjusted_radio_with_tick_len; + tick_point_b->y = center_point.y; + lv_point_transform(tick_point_b, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + } + else { /* Nothing to do */ } +} + +/** + * Get coordinates for label + * + * @param obj pointer to a scale object + * @param label_dsc pointer to label descriptor + * @param tick_point pointer to reference tick + * @param label_coords pointer to label coordinates output + */ +static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, + lv_area_t * label_coords) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + /* Reserve appropriate size for the tick label */ + lv_point_t label_size; + lv_text_get_size(&label_size, label_dsc->text, + label_dsc->font, label_dsc->letter_space, label_dsc->line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + /* Set the label draw area at some distance of the major tick */ + if((LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) || (LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + label_coords->x1 = tick_point->x - (label_size.x / 2U); + label_coords->x2 = tick_point->x + (label_size.x / 2U); + + if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + label_coords->y1 = tick_point->y + lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + label_coords->y2 = label_coords->y1 + label_size.y; + } + else { + label_coords->y2 = tick_point->y - lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + label_coords->y1 = label_coords->y2 - label_size.y; + } + } + else if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + label_coords->y1 = tick_point->y - (label_size.y / 2U); + label_coords->y2 = tick_point->y + (label_size.y / 2U); + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + label_coords->x1 = tick_point->x - label_size.x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + label_coords->x2 = tick_point->x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + } + else { + label_coords->x1 = tick_point->x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + label_coords->x2 = tick_point->x + label_size.x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + label_coords->x1 = tick_point->x - (label_size.x / 2U); + label_coords->y1 = tick_point->y - (label_size.y / 2U); + label_coords->x2 = label_coords->x1 + label_size.x; + label_coords->y2 = label_coords->y1 + label_size.y; + } + else { /* Nothing to do */ } +} + +/** + * Set line properties + * + * Checks if the line has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param line_dsc pointer to line descriptor + * @param items_section_style pointer to indicator section style + * @param part line part, example: LV_PART_INDICATOR, LV_PART_ITEMS, LV_PART_MAIN + */ +static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, lv_style_t * section_style, + uint32_t part) +{ + if(section_style) { + lv_style_value_t value; + lv_result_t res; + + /* Line width */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_WIDTH, &value); + if(res == LV_RESULT_OK) { + line_dsc->width = (int32_t)value.num; + } + else { + line_dsc->width = lv_obj_get_style_line_width(obj, part); + } + + /* Line color */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_COLOR, &value); + if(res == LV_RESULT_OK) { + line_dsc->color = value.color; + } + else { + line_dsc->color = lv_obj_get_style_line_color(obj, part); + } + + /* Line opa */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_OPA, &value); + if(res == LV_RESULT_OK) { + line_dsc->opa = (lv_opa_t)value.num; + } + else { + line_dsc->opa = lv_obj_get_style_line_opa(obj, part); + } + } + else { + line_dsc->color = lv_obj_get_style_line_color(obj, part); + line_dsc->opa = lv_obj_get_style_line_opa(obj, part); + line_dsc->width = lv_obj_get_style_line_width(obj, part); + } +} + +/** + * Set arc properties + * + * Checks if the arc has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param line_dsc pointer to arc descriptor + * @param items_section_style pointer to indicator section style + */ +static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, lv_style_t * section_style) +{ + if(section_style) { + lv_style_value_t value; + lv_result_t res; + + /* Line width */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_WIDTH, &value); + if(res == LV_RESULT_OK) { + arc_dsc->width = (int32_t)value.num; + } + else { + arc_dsc->width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + } + + /* Line color */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_COLOR, &value); + if(res == LV_RESULT_OK) { + arc_dsc->color = value.color; + } + else { + arc_dsc->color = lv_obj_get_style_line_color(obj, LV_PART_MAIN); + } + + /* Line opa */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_OPA, &value); + if(res == LV_RESULT_OK) { + arc_dsc->opa = (lv_opa_t)value.num; + } + else { + arc_dsc->opa = lv_obj_get_style_line_opa(obj, LV_PART_MAIN); + } + } + else { + arc_dsc->color = lv_obj_get_style_line_color(obj, LV_PART_MAIN); + arc_dsc->opa = lv_obj_get_style_line_opa(obj, LV_PART_MAIN); + arc_dsc->width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + } +} + +/** + * Set indicator label properties + * + * Checks if the indicator has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param label_dsc pointer to label descriptor + * @param items_section_style pointer to indicator section style + */ +static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + lv_style_t * indicator_section_style) +{ + if(indicator_section_style) { + lv_style_value_t value; + lv_result_t res; + + /* Text color */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_COLOR, &value); + if(res == LV_RESULT_OK) { + label_dsc->color = value.color; + } + else { + label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); + } + + /* Text opa */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_OPA, &value); + if(res == LV_RESULT_OK) { + label_dsc->opa = (lv_opa_t)value.num; + } + else { + label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); + } + + /* Text letter space */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res == LV_RESULT_OK) { + label_dsc->letter_space = (int32_t)value.num; + } + else { + label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); + } + + /* Text font */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_FONT, &value); + if(res == LV_RESULT_OK) { + label_dsc->font = (const lv_font_t *)value.ptr; + } + else { + label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); + } + } + else { + /* If label is not within a range then get the indicator style */ + label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); + label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); + label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); + label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); + } +} + +static void scale_find_section_tick_idx(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + const int32_t min_out = scale->range_min; + const int32_t max_out = scale->range_max; + const uint32_t total_tick_count = scale->total_tick_count; + + /* Section handling */ + uint32_t tick_idx = 0; + for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { + bool is_major_tick = false; + if(tick_idx % scale->major_tick_every == 0) is_major_tick = true; + + const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, min_out, max_out); + + lv_scale_section_t * section; + _LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->minor_range <= tick_value && section->major_range >= tick_value) { + if(LV_SCALE_TICK_IDX_DEFAULT_ID == section->first_tick_idx_in_section) { + section->first_tick_idx_in_section = tick_idx; + section->first_tick_idx_is_major = is_major_tick; + } + if(section->first_tick_idx_in_section != tick_idx) { + section->last_tick_idx_in_section = tick_idx; + section->last_tick_idx_is_major = is_major_tick; + } + } + else { /* Nothing to do */ } + } + } +} + +/** + * Stores the width of the initial and last tick of the main line + * + * This width is used to compensate the main line drawing taking into consideration the widths of both ticks + * + * @param obj pointer to a scale object + * @param tick_idx index of the current tick + * @param is_major_tick true if tick_idx is a major tick + * @param major_tick_width width of the major tick + * @param minor_tick_width width of the minor tick + */ +static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, + const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + const bool is_first_tick = 0U == tick_idx; + const bool is_last_tick = scale->total_tick_count == tick_idx; + const int32_t tick_width = is_major_tick ? major_tick_width : minor_tick_width; + + /* Exit early if tick_idx is not the first nor last tick on the main line */ + if(((!is_last_tick) && (!is_first_tick)) + /* Exit early if scale mode is round. It doesn't support main line compensation */ + || ((LV_SCALE_MODE_ROUND_INNER == scale->mode) || (LV_SCALE_MODE_ROUND_OUTER == scale->mode))) { + return; + } + + if(is_last_tick) { + /* Mode is vertical */ + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + scale->last_tick_width = tick_width; + } + /* Mode is horizontal */ + else { + scale->first_tick_width = tick_width; + } + } + /* is_first_tick */ + else { + /* Mode is vertical */ + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + scale->first_tick_width = tick_width; + } + /* Mode is horizontal */ + else { + scale->last_tick_width = tick_width; + } + } +} + +/** + * Sets the text of the tick label descriptor when using custom labels + * + * Sets the text pointer when valid custom label is available, otherwise set it to NULL. + * + * @param obj pointer to a scale object + * @param label_dsc pointer to the label descriptor + * @param major_tick_idx index of the current major tick + */ +static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const uint16_t major_tick_idx) +{ + lv_scale_t * scale = (lv_scale_t *) obj; + + /* Check if the scale has valid custom labels available, + * this avoids reading past txt_src array when the scale requires more tick labels than available */ + if(major_tick_idx <= scale->custom_label_cnt) { + if(scale->txt_src[major_tick_idx - 1U]) { + label_dsc->text = scale->txt_src[major_tick_idx - 1U]; + label_dsc->text_local = 0; + } + else { + label_dsc->text = NULL; + } + } + else { + label_dsc->text = NULL; + } +} + +/** + * Stores tick width compensation information for main line sections + * + * @param obj pointer to a scale object + * @param is_major_tick Indicates if tick is major or not + * @param label_dsc pointer to the label descriptor + * @param major_tick_dsc pointer to the major_tick_dsc + * @param minor_tick_dsc pointer to the minor_tick_dsc + * @param tick_value Current tick value, used to know if tick_idx belongs to a section or not + * @param tick_idx Current tick index + * @param tick_point_a Pointer to tick point a + */ +static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, + lv_draw_label_dsc_t * label_dsc, lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, + const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a) +{ + lv_scale_t * scale = (lv_scale_t *) obj; + lv_scale_section_t * section; + + _LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->minor_range <= tick_value && section->major_range >= tick_value) { + if(is_major_tick) { + scale_set_indicator_label_properties(obj, label_dsc, section->indicator_style); + scale_set_line_properties(obj, major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + } + + int32_t tmp_width = 0; + + if(tick_idx == section->first_tick_idx_in_section) { + if(section->first_tick_idx_is_major) { + tmp_width = major_tick_dsc->width; + } + else { + tmp_width = minor_tick_dsc->width; + } + + section->first_tick_in_section.y = tick_point_a->y; + /* Add 1px as adjustment if tmp_width is odd */ + if(tmp_width & 0x01U) { + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + tmp_width += 1U; + } + else { + tmp_width -= 1U; + } + } + section->first_tick_in_section_width = tmp_width; + } + else if(tick_idx == section->last_tick_idx_in_section) { + if(section->last_tick_idx_is_major) { + tmp_width = major_tick_dsc->width; + } + else { + tmp_width = minor_tick_dsc->width; + } + + section->last_tick_in_section.y = tick_point_a->y; + /* Add 1px as adjustment if tmp_width is odd */ + if(tmp_width & 0x01U) { + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + tmp_width -= 1U; + } + else { + tmp_width += 1U; + } + } + section->last_tick_in_section_width = tmp_width; + } + else { /* Nothing to do */ } + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/scale/lv_scale.h b/libraries/lvgl/src/widgets/scale/lv_scale.h new file mode 100644 index 0000000..8ac377e --- /dev/null +++ b/libraries/lvgl/src/widgets/scale/lv_scale.h @@ -0,0 +1,286 @@ +/** + * @file lv_scale.h + * + */ + +#ifndef LV_SCALE_H +#define LV_SCALE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SCALE != 0 + +#include "../../core/lv_obj.h" +#include "../line/lv_line.h" +#include "../image/lv_image.h" + +/********************* + * DEFINES + *********************/ + +/**Default value of total minor ticks. */ +#define LV_SCALE_TOTAL_TICK_COUNT_DEFAULT (11U) +LV_EXPORT_CONST_INT(LV_SCALE_TOTAL_TICK_COUNT_DEFAULT); + +/**Default value of major tick every nth ticks. */ +#define LV_SCALE_MAJOR_TICK_EVERY_DEFAULT (5U) +LV_EXPORT_CONST_INT(LV_SCALE_MAJOR_TICK_EVERY_DEFAULT); + +/**Default value of scale label enabled. */ +#define LV_SCALE_LABEL_ENABLED_DEFAULT (1U) +LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ENABLED_DEFAULT); + +/********************** + * TYPEDEFS + **********************/ + +/** + * Scale mode + */ +enum { + LV_SCALE_MODE_HORIZONTAL_TOP = 0x00U, + LV_SCALE_MODE_HORIZONTAL_BOTTOM = 0x01U, + LV_SCALE_MODE_VERTICAL_LEFT = 0x02U, + LV_SCALE_MODE_VERTICAL_RIGHT = 0x04U, + LV_SCALE_MODE_ROUND_INNER = 0x08U, + LV_SCALE_MODE_ROUND_OUTER = 0x10U, + _LV_SCALE_MODE_LAST +}; +typedef uint32_t lv_scale_mode_t; + +typedef struct { + lv_style_t * main_style; + lv_style_t * indicator_style; + lv_style_t * items_style; + int32_t minor_range; + int32_t major_range; + uint32_t first_tick_idx_in_section; + uint32_t last_tick_idx_in_section; + uint32_t first_tick_idx_is_major; + uint32_t last_tick_idx_is_major; + int32_t first_tick_in_section_width; + int32_t last_tick_in_section_width; + lv_point_t first_tick_in_section; + lv_point_t last_tick_in_section; +} lv_scale_section_t; + +typedef struct { + lv_obj_t obj; + lv_ll_t section_ll; /**< Linked list for the sections (stores lv_scale_section_t)*/ + const char ** txt_src; + lv_scale_mode_t mode; + int32_t range_min; + int32_t range_max; + uint32_t total_tick_count : 15; + uint32_t major_tick_every : 15; + uint32_t label_enabled : 1; + uint32_t post_draw : 1; + /* Round scale */ + uint32_t angle_range; + int32_t rotation; + /* Private properties */ + int32_t custom_label_cnt; + int32_t last_tick_width; + int32_t first_tick_width; +} lv_scale_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_scale_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an scale object + * @param parent pointer to an object, it will be the parent of the new scale + * @return pointer to the created scale + */ +lv_obj_t * lv_scale_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set scale mode. See @ref lv_scale_mode_t + * @param obj pointer the scale object + * @param mode the new scale mode + */ +void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode); + +/** + * Set scale total tick count (including minor and major ticks) + * @param obj pointer the scale object + * @param total_tick_count New total tick count + */ +void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count); + +/** + * Sets how often the major tick will be drawn + * @param obj pointer the scale object + * @param major_tick_every the new count for major tick drawing + */ +void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every); + +/** + * Sets label visibility + * @param obj pointer the scale object + * @param show_label true/false to enable tick label + */ +void lv_scale_set_label_show(lv_obj_t * obj, bool show_label); + +/** + * Set the minimal and maximal values on a scale + * @param obj pointer to a scale object + * @param min minimum value of the scale + * @param max maximum value of the scale + */ +void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set properties specific to round scale + * @param obj pointer to a scale object + * @param angle_range the angular range of the scale + */ +void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range); + +/** + * Set properties specific to round scale + * @param obj pointer to a scale object + * @param rotation the angular offset from the 3 o'clock position (clock-wise) + */ +void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation); + +/** + * Point the needle to the corresponding value through the line + * @param obj pointer to a scale object + * @param needle_line needle_line of the scale + * @param needle_length length of the needle + * needle_length>0 needle_length=needle_length; + * needle_length<0 needle_length=radius-|needle_length|; + * @param value needle to point to the corresponding value + */ +void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, + int32_t value); + +/** + * Point the needle to the corresponding value through the image, + image must point to the right. E.g. -O------> + * @param obj pointer to a scale object + * @param needle_img needle_img of the scale + * @param value needle to point to the corresponding value + */ +void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value); + +/** + * Set custom text source for major ticks labels + * @param obj pointer to a scale object + * @param txt_src pointer to an array of strings which will be display at major ticks + */ +void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]); + +/** + * Draw the scale after all the children are drawn + * @param obj pointer to a scale object + * @param en true: enable post draw + */ +void lv_scale_set_post_draw(lv_obj_t * obj, bool en); + +/** + * Add a section to the given scale + * @param obj pointer to a scale object + * @return pointer to the new section + */ +lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj); + +/** + * Set the range for the given scale section + * @param section pointer to a scale section object + * @param minor_range section new minor range + * @param major_range section new major range + */ +void lv_scale_section_set_range(lv_scale_section_t * section, int32_t minor_range, int32_t major_range); + +/** + * Set the style of the part for the given scale section + * @param section pointer to a scale section object + * @param part the part for the section, e.g. LV_PART_INDICATOR + * @param section_part_style Pointer to the section part style + */ +void lv_scale_section_set_style(lv_scale_section_t * section, uint32_t part, lv_style_t * section_part_style); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get scale mode. See @ref lv_scale_mode_t + * @param obj pointer the scale object + * @return Scale mode + */ +lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj); + +/** + * Get scale total tick count (including minor and major ticks) + * @param obj pointer the scale object + * @return Scale total tick count + */ +int32_t lv_scale_get_total_tick_count(lv_obj_t * obj); + +/** + * Gets how often the major tick will be drawn + * @param obj pointer the scale object + * @return Scale major tick every count + */ +int32_t lv_scale_get_major_tick_every(lv_obj_t * obj); + +/** + * Gets label visibility + * @param obj pointer the scale object + * @return true if tick label is enabled, false otherwise + */ +bool lv_scale_get_label_show(lv_obj_t * obj); + +/** + * Get angle range of a round scale + * @param obj pointer to a scale object + * @return Scale angle_range + */ +uint32_t lv_scale_get_angle_range(lv_obj_t * obj); + +/** + * Get the min range for the given scale section + * @param obj pointer to a scale section object + * @return section minor range + */ +int32_t lv_scale_get_range_min_value(lv_obj_t * obj); + +/** + * Get the max range for the given scale section + * @param obj pointer to a scale section object + * @return section max range + */ +int32_t lv_scale_get_range_max_value(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SCALE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SCALE_H*/ diff --git a/libraries/lvgl/src/widgets/slider/lv_slider.c b/libraries/lvgl/src/widgets/slider/lv_slider.c new file mode 100644 index 0000000..2cce03a --- /dev/null +++ b/libraries/lvgl/src/widgets/slider/lv_slider.c @@ -0,0 +1,499 @@ +/** + * @file lv_slider.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_slider.h" +#if LV_USE_SLIDER != 0 + +#include "../../misc/lv_assert.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_private.h" +#include "../../display/lv_display.h" +#include "../../draw/lv_draw.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_math.h" +#include "../image/lv_image.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_slider_class) + +#define LV_SLIDER_KNOB_COORD(is_reversed, area) (is_reversed ? area.x1 : area.x2) +#define LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, area) (is_reversed ? area.y2 : area.y1) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor); +static void draw_knob(lv_event_t * e); +static bool is_slider_horizontal(lv_obj_t * obj); +static void drag_start(lv_obj_t * obj); +static void update_knob_pos(lv_obj_t * obj, bool check_drag); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_slider_class = { + .constructor_cb = lv_slider_constructor, + .event_cb = lv_slider_event, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_slider_t), + .base_class = &lv_bar_class, + .name = "slider", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_slider_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +bool lv_slider_is_dragged(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_slider_t * slider = (lv_slider_t *)obj; + + return slider->dragging; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_slider_t * slider = (lv_slider_t *)obj; + + /*Initialize the allocated 'slider'*/ + slider->value_to_set = NULL; + slider->dragging = 0U; + slider->left_knob_focus = 0U; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_set_ext_click_area(obj, LV_DPX(8)); +} + +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_slider_mode_t type = lv_slider_get_mode(obj); + + /*Advanced hit testing: react only on dragging the knob(s)*/ + if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + int32_t ext_click_area = obj->spec_attr ? obj->spec_attr->ext_click_pad : 0; + + /*Ordinary slider: was the knob area hit?*/ + lv_area_t a; + lv_area_copy(&a, &slider->right_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = _lv_area_is_point_on(&a, info->point, 0); + + /*There's still a chance that there is a hit if there is another knob*/ + if((info->res == false) && (type == LV_SLIDER_MODE_RANGE)) { + lv_area_copy(&a, &slider->left_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = _lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_PRESSED) { + /*Save the pressed coordinates*/ + lv_indev_get_point(lv_indev_active(), &slider->pressed_point); + lv_obj_transform_point(obj, &slider->pressed_point, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + } + else if(code == LV_EVENT_PRESSING) { + update_knob_pos(obj, true); + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + update_knob_pos(obj, false); + slider->dragging = false; + slider->value_to_set = NULL; + + lv_obj_invalidate(obj); + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) { + if(lv_slider_get_mode(obj) == LV_SLIDER_MODE_RANGE) { + if(slider->left_knob_focus == 0) slider->left_knob_focus = 1; + else { + slider->left_knob_focus = 0; + lv_group_set_editing(g, false); + } + } + else { + lv_group_set_editing(g, false); + } + } + } + else if(indev_type == LV_INDEV_TYPE_POINTER) { + if(is_slider_horizontal(obj)) lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + else lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + } + } + else if(code == LV_EVENT_FOCUSED) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + slider->left_knob_focus = 0; + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + if(is_slider_horizontal(obj)) { + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + } + else { + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + } + lv_obj_refresh_ext_draw_size(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + int32_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + int32_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + int32_t knob_size = LV_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1; + knob_size += LV_MAX(LV_MAX(knob_left, knob_right), LV_MAX(knob_bottom, knob_top)); + knob_size += 2; /*For rounding error*/ + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + /*Indic. size is handled by bar*/ + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + 1, LV_ANIM_ON); + else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) - 1, LV_ANIM_ON); + else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) - 1, LV_ANIM_ON); + } + else { + return; + } + + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_ROTARY) { + int32_t r = lv_event_get_rotary_diff(e); + + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + r, LV_ANIM_ON); + else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); + + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_knob(e); + } +} + +static void draw_knob(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + + lv_area_t knob_area; + int32_t knob_size; + bool is_symmetrical = lv_slider_is_symmetrical(obj); + + if(is_horizontal) { + knob_size = lv_obj_get_height(obj); + if(is_symmetrical && + slider->bar.cur_value < 0) knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); + else knob_area.x1 = LV_SLIDER_KNOB_COORD(is_reversed, slider->bar.indic_area); + } + else { + knob_size = lv_obj_get_width(obj); + if(is_symmetrical && + slider->bar.cur_value < 0) knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); + else knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, slider->bar.indic_area); + } + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + /* Update knob area with knob style */ + position_knob(obj, &knob_area, knob_size, is_horizontal); + /* Update right knob area with calculated knob area */ + lv_area_copy(&slider->right_knob_area, &knob_area); + + if(lv_slider_get_mode(obj) != LV_SLIDER_MODE_RANGE) { + lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); + } + else { + /*Save the draw part_draw_dsc. because it can be modified in the event*/ + lv_draw_rect_dsc_t knob_rect_dsc_tmp; + lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t)); + /* Draw the right knob */ + lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); + + /*Calculate the second knob area*/ + if(is_horizontal) { + /*use !is_reversed to get the other knob*/ + knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); + } + else { + knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); + } + position_knob(obj, &knob_area, knob_size, is_horizontal); + lv_area_copy(&slider->left_knob_area, &knob_area); + + lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t)); + + lv_draw_rect(layer, &knob_rect_dsc, &slider->left_knob_area); + } +} + +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor) +{ + if(hor) { + knob_area->x1 -= (knob_size >> 1); + knob_area->x2 = knob_area->x1 + knob_size - 1; + knob_area->y1 = obj->coords.y1; + knob_area->y2 = obj->coords.y2; + } + else { + knob_area->y1 -= (knob_size >> 1); + knob_area->y2 = knob_area->y1 + knob_size - 1; + knob_area->x1 = obj->coords.x1; + knob_area->x2 = obj->coords.x2; + } + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area->x1 -= knob_left + transf_w; + knob_area->x2 += knob_right + transf_w; + knob_area->y1 -= knob_top + transf_h; + knob_area->y2 += knob_bottom + transf_h; +} + +static bool is_slider_horizontal(lv_obj_t * obj) +{ + return lv_obj_get_width(obj) >= lv_obj_get_height(obj); +} + +static void drag_start(lv_obj_t * obj) +{ + lv_slider_t * slider = (lv_slider_t *)obj; + lv_slider_mode_t mode = lv_slider_get_mode(obj); + lv_point_t p; + slider->dragging = true; + if(mode == LV_SLIDER_MODE_NORMAL || mode == LV_SLIDER_MODE_SYMMETRICAL) { + slider->value_to_set = &slider->bar.cur_value; + } + else if(mode == LV_SLIDER_MODE_RANGE) { + lv_indev_get_point(lv_indev_active(), &p); + lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + int32_t dist_left, dist_right; + if(is_horizontal) { + if((!is_reversed && p.x > slider->right_knob_area.x2) || (is_reversed && p.x < slider->right_knob_area.x1)) { + slider->value_to_set = &slider->bar.cur_value; + } + else if((!is_reversed && p.x < slider->left_knob_area.x1) || (is_reversed && p.x > slider->left_knob_area.x2)) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.x1 + (slider->left_knob_area.x2 - slider->left_knob_area.x1) / 2) - p.x); + dist_right = LV_ABS((slider->right_knob_area.x1 + (slider->right_knob_area.x2 - slider->right_knob_area.x1) / 2) - p.x); + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + else { + if((!is_reversed && p.y < slider->right_knob_area.y1) || (is_reversed && p.y > slider->right_knob_area.y2)) { + slider->value_to_set = &slider->bar.cur_value; + } + else if((!is_reversed && p.y > slider->left_knob_area.y2) || (is_reversed && p.y < slider->left_knob_area.y1)) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.y1 + (slider->left_knob_area.y2 - slider->left_knob_area.y1) / 2) - p.y); + dist_right = LV_ABS((slider->right_knob_area.y1 + (slider->right_knob_area.y2 - slider->right_knob_area.y1) / 2) - p.y); + + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + } +} + +static void update_knob_pos(lv_obj_t * obj, bool check_drag) +{ + lv_slider_t * slider = (lv_slider_t *)obj; + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_type(indev) != LV_INDEV_TYPE_POINTER) + return; + if(lv_indev_get_scroll_obj(indev) != NULL) + return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + + bool is_hor = is_slider_horizontal(obj); + + if(check_drag && !slider->dragging) { + int32_t ofs = is_hor ? (p.x - slider->pressed_point.x) : (p.y - slider->pressed_point.y); + + /*Stop processing when offset is below scroll_limit*/ + if(LV_ABS(ofs) < indev->scroll_limit) { + return; + } + } + + if(!slider->value_to_set) { + /*Ready to start drag*/ + drag_start(obj); + } + + int32_t new_value = 0; + const int32_t range = slider->bar.max_value - slider->bar.min_value; + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + + if(is_hor) { + const int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + const int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + const int32_t w = lv_obj_get_width(obj); + const int32_t indic_w = w - bg_left - bg_right; + + if(is_reversed) { + /*Make the point relative to the indicator*/ + new_value = (obj->coords.x2 - bg_right) - p.x; + } + else { + /*Make the point relative to the indicator*/ + new_value = p.x - (obj->coords.x1 + bg_left); + } + if(indic_w) { + new_value = (new_value * range + indic_w / 2) / indic_w; + new_value += slider->bar.min_value; + } + } + else { + const int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + const int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + const int32_t h = lv_obj_get_height(obj); + const int32_t indic_h = h - bg_bottom - bg_top; + + if(is_reversed) { + /*Make the point relative to the indicator*/ + new_value = p.y - (obj->coords.y1 + bg_top); + } + else { + /*Make the point relative to the indicator*/ + new_value = p.y - (obj->coords.y2 + bg_bottom); + new_value = -new_value; + } + new_value = (new_value * range + indic_h / 2) / indic_h; + new_value += slider->bar.min_value; + } + + int32_t real_max_value = slider->bar.max_value; + int32_t real_min_value = slider->bar.min_value; + /*Figure out the min. and max. for this mode*/ + if(slider->value_to_set == &slider->bar.start_value) { + real_max_value = slider->bar.cur_value; + } + else { + real_min_value = slider->bar.start_value; + } + + new_value = LV_CLAMP(real_min_value, new_value, real_max_value); + if(*slider->value_to_set != new_value) { + *slider->value_to_set = new_value; + if(is_hor) + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + else + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + + lv_obj_invalidate(obj); + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) + return; + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/slider/lv_slider.h b/libraries/lvgl/src/widgets/slider/lv_slider.h new file mode 100644 index 0000000..6c83c14 --- /dev/null +++ b/libraries/lvgl/src/widgets/slider/lv_slider.h @@ -0,0 +1,198 @@ +/** + * @file lv_slider.h + * + */ + +#ifndef LV_SLIDER_H +#define LV_SLIDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../bar/lv_bar.h" + +#if LV_USE_SLIDER != 0 + +/*Testing of dependencies*/ +#if LV_USE_BAR == 0 +#error "lv_slider: lv_bar is required. Enable it in lv_conf.h (LV_USE_BAR 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_slider_mode_t { + LV_SLIDER_MODE_NORMAL = LV_BAR_MODE_NORMAL, + LV_SLIDER_MODE_SYMMETRICAL = LV_BAR_MODE_SYMMETRICAL, + LV_SLIDER_MODE_RANGE = LV_BAR_MODE_RANGE +}; + +#ifdef DOXYGEN +typedef _lv_slider_mode_t lv_slider_mode_t; +#else +typedef uint8_t lv_slider_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + lv_bar_t bar; /*Add the ancestor's type first*/ + lv_area_t left_knob_area; + lv_area_t right_knob_area; + lv_point_t pressed_point; + int32_t * value_to_set; /*Which bar value to set*/ + uint8_t dragging : 1; /*1: the slider is being dragged*/ + uint8_t left_knob_focus : 1; /*1: with encoder now the right knob can be adjusted*/ +} lv_slider_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_slider_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a slider object + * @param parent pointer to an object, it will be the parent of the new slider. + * @return pointer to the created slider + */ +lv_obj_t * lv_slider_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the slider + * @param obj pointer to a slider object + * @param value the new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +static inline void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_value(obj, value, anim); +} + +/** + * Set a new value for the left knob of a slider + * @param obj pointer to a slider object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +static inline void lv_slider_set_left_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_start_value(obj, value, anim); +} + +/** + * Set minimum and the maximum values of a bar + * @param obj pointer to the slider object + * @param min minimum value + * @param max maximum value + */ +static inline void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + lv_bar_set_range(obj, min, max); +} + +/** + * Set the mode of slider. + * @param obj pointer to a slider object + * @param mode the mode of the slider. See ::lv_slider_mode_t + */ +static inline void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) +{ + lv_bar_set_mode(obj, (lv_bar_mode_t)mode); +} + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of the main knob of a slider + * @param obj pointer to a slider object + * @return the value of the main knob of the slider + */ +static inline int32_t lv_slider_get_value(const lv_obj_t * obj) +{ + return lv_bar_get_value(obj); +} + +/** + * Get the value of the left knob of a slider + * @param obj pointer to a slider object + * @return the value of the left knob of the slider + */ +static inline int32_t lv_slider_get_left_value(const lv_obj_t * obj) +{ + return lv_bar_get_start_value(obj); +} + +/** + * Get the minimum value of a slider + * @param obj pointer to a slider object + * @return the minimum value of the slider + */ +static inline int32_t lv_slider_get_min_value(const lv_obj_t * obj) +{ + return lv_bar_get_min_value(obj); +} + +/** + * Get the maximum value of a slider + * @param obj pointer to a slider object + * @return the maximum value of the slider + */ +static inline int32_t lv_slider_get_max_value(const lv_obj_t * obj) +{ + return lv_bar_get_max_value(obj); +} + +/** + * Give the slider is being dragged or not + * @param obj pointer to a slider object + * @return true: drag in progress false: not dragged + */ +bool lv_slider_is_dragged(const lv_obj_t * obj); + +/** + * Get the mode of the slider. + * @param slider pointer to a slider object + * @return see ::lv_slider_mode_t + */ +static inline lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) +{ + lv_bar_mode_t mode = lv_bar_get_mode(slider); + if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; + else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; + else return LV_SLIDER_MODE_NORMAL; +} + +/** + * Give the slider is in symmetrical mode or not + * @param obj pointer to slider object + * @return true: in symmetrical mode false : not in +*/ +static inline bool lv_slider_is_symmetrical(lv_obj_t * obj) +{ + return lv_bar_is_symmetrical(obj); +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SLIDER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SLIDER_H*/ diff --git a/libraries/lvgl/src/widgets/span/lv_span.c b/libraries/lvgl/src/widgets/span/lv_span.c new file mode 100644 index 0000000..95dd030 --- /dev/null +++ b/libraries/lvgl/src/widgets/span/lv_span.c @@ -0,0 +1,1072 @@ +/** + * @file lv_span.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_span.h" + +#if LV_USE_SPAN != 0 + +#include "../../misc/lv_assert.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_spangroup_class) +#define snippet_stack LV_GLOBAL_DEFAULT()->span_snippet_stack + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_span_t * span; + const char * txt; + const lv_font_t * font; + uint32_t bytes; + int32_t txt_w; + int32_t line_h; + int32_t letter_space; +} lv_snippet_t; + +struct _snippet_stack { + lv_snippet_t stack[LV_SPAN_SNIPPET_STACK_SIZE]; + uint32_t index; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static void refresh_self_size(lv_obj_t * obj); + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span); +static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span); +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span); +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span); +static lv_opa_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span); +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); + +static inline void span_text_check(const char ** text); +static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer); +static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, int32_t letter_space, + int32_t max_width, lv_text_flag_t flag, int32_t * use_width, + uint32_t * end_ofs); + +static void lv_snippet_clear(void); +static uint32_t lv_get_snippet_count(void); +static void lv_snippet_push(lv_snippet_t * item); +static lv_snippet_t * lv_get_snippet(uint32_t index); +static int32_t convert_indent_pct(lv_obj_t * spans, int32_t width); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_spangroup_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_spangroup_constructor, + .destructor_cb = lv_spangroup_destructor, + .event_cb = lv_spangroup_event, + .instance_size = sizeof(lv_spangroup_t), + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .name = "span", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_span_stack_init(void) +{ + struct _snippet_stack * stack = snippet_stack = lv_malloc(sizeof(struct _snippet_stack)); + LV_ASSERT_MALLOC(stack); + if(!stack) { + LV_LOG_ERROR("malloc failed for snippet_stack"); + } +} + +void lv_span_stack_deinit(void) +{ + lv_free(snippet_stack); +} + +lv_obj_t * lv_spangroup_create(lv_obj_t * par) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spangroup_class, par); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_span_t * lv_spangroup_new_span(lv_obj_t * obj) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * span = _lv_ll_ins_tail(&spans->child_ll); + LV_ASSERT_MALLOC(span); + + lv_style_init(&span->style); + span->txt = (char *)""; + span->static_flag = 1; + span->spangroup = obj; + + refresh_self_size(obj); + + return span; +} + +void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span) +{ + if(obj == NULL || span == NULL) { + return; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span; + _LV_LL_READ(&spans->child_ll, cur_span) { + if(cur_span == span) { + _lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_free(cur_span->txt); + cur_span->txt = NULL; + } + lv_style_reset(&cur_span->style); + lv_free(cur_span); + cur_span = NULL; + break; + } + } + + refresh_self_size(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_span_set_text(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + size_t text_alloc_len = lv_strlen(text) + 1; + + if(span->txt == NULL || span->static_flag == 1) { + span->txt = lv_malloc(text_alloc_len); + LV_ASSERT_MALLOC(span->txt); + } + else { + span->txt = lv_realloc(span->txt, text_alloc_len); + LV_ASSERT_MALLOC(span->txt); + } + + if(span->txt == NULL) return; + + span->static_flag = 0; + lv_memcpy(span->txt, text, text_alloc_len); + + refresh_self_size(span->spangroup); +} + +void lv_span_set_text_static(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + if(span->txt && span->static_flag == 0) { + lv_free(span->txt); + span->txt = NULL; + } + span->static_flag = 1; + span->txt = (char *)text; + + refresh_self_size(span->spangroup); +} + +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + lv_obj_set_style_text_align(obj, align, LV_PART_MAIN); +} + +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->overflow == overflow) return; + if(overflow >= _LV_SPAN_OVERFLOW_LAST) return; + spans->overflow = overflow; + lv_obj_invalidate(obj); +} + +void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->indent == indent) return; + + spans->indent = indent; + + refresh_self_size(obj); +} + +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(mode >= _LV_SPAN_MODE_LAST) return; + + spans->mode = mode; + lv_spangroup_refr_mode(obj); +} + +void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->lines = lines; + lv_spangroup_refr_mode(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_ll_t * linked_list = &spans->child_ll; + + bool traverse_forwards = (id >= 0); + int32_t cur_idx = 0; + lv_ll_node_t * cur_node = linked_list->head; + + /*If using a negative index, start from the tail and use cur -1 to indicate the end*/ + if(!traverse_forwards) { + cur_idx = -1; + cur_node = linked_list->tail; + } + + while(cur_node != NULL) { + if(cur_idx == id) { + return (lv_span_t *) cur_node; + } + if(traverse_forwards) { + cur_node = (lv_ll_node_t *) _lv_ll_get_next(linked_list, cur_node); + cur_idx++; + } + else { + cur_node = (lv_ll_node_t *) _lv_ll_get_prev(linked_list, cur_node); + cur_idx--; + } + } + + return NULL; +} + +uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj == NULL) { + return 0; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return _lv_ll_get_len(&(spans->child_ll)); +} + +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj) +{ + return lv_obj_get_style_text_align(obj, LV_PART_MAIN); +} + +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->overflow; +} + +int32_t lv_spangroup_get_indent(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->indent; +} + +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->mode; +} + +int32_t lv_spangroup_get_max_lines(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->lines; +} + +void lv_spangroup_refr_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(spans->mode == LV_SPAN_MODE_EXPAND) { + lv_obj_set_width(obj, LV_SIZE_CONTENT); + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(spans->mode == LV_SPAN_MODE_BREAK) { + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(spans->mode == LV_SPAN_MODE_FIXED) { + /* use this mode, The user needs to set the size. */ + /* This is just to prevent an infinite loop. */ + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + if(lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + int32_t width = lv_obj_get_style_width(obj, LV_PART_MAIN); + if(LV_COORD_IS_PCT(width)) { + width = 100; + } + int32_t height = lv_spangroup_get_expand_height(obj, width); + lv_obj_set_content_height(obj, height); + } + } + + refresh_self_size(obj); +} + +int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + int32_t max_line_h = 0; + lv_span_t * cur_span; + _LV_LL_READ(&spans->child_ll, cur_span) { + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + int32_t line_h = lv_font_get_line_height(font); + if(line_h > max_line_h) { + max_line_h = line_h; + } + } + + return max_line_h; +} + +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(_lv_ll_get_head(&spans->child_ll) == NULL) { + return 0; + } + + uint32_t width = LV_COORD_IS_PCT(spans->indent) ? 0 : spans->indent; + lv_span_t * cur_span; + int32_t letter_space = 0; + _LV_LL_READ(&spans->child_ll, cur_span) { + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + uint32_t j = 0; + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + while(cur_txt[j] != '\0') { + if(max_width > 0 && width >= max_width) { + return max_width; + } + uint32_t letter = _lv_text_encoded_next(cur_txt, &j); + uint32_t letter_next = _lv_text_encoded_next(&cur_txt[j], NULL); + uint32_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); + width = width + letter_w + letter_space; + } + } + + return width - letter_space; +} + +int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(_lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { + return 0; + } + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t max_width = width; + int32_t indent = convert_indent_pct(obj, max_width); + int32_t max_w = max_width - indent; /* first line need minus indent */ + + /* coords of draw span-txt */ + lv_point_t txt_pos; + lv_point_set(&txt_pos, 0, indent); /* first line need add indent */ + + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + memset(&snippet, 0, sizeof(snippet)); + + int32_t line_cnt = 0; + int32_t lines = spans->lines < 0 ? INT32_MAX : spans->lines; + /* the loop control how many lines need to draw */ + while(cur_span) { + int snippet_cnt = 0; + int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + int32_t use_width = 0; + bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + + /* break word deal width */ + if(isfill && next_ofs > 0 && snippet_cnt > 0) { + if(max_w < use_width) { + break; + } + + uint32_t tmp_ofs = next_ofs; + uint32_t letter = _lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_text_is_break_char(letter))) { + tmp_ofs = 0; + letter = _lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_text_is_break_char(letter))) { + break; + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + } + snippet_cnt ++; + max_w = max_w - use_width - snippet.letter_space; + if(isfill || max_w <= 0) { + break; + } + } + + /* next line init */ + txt_pos.x = 0; + txt_pos.y += max_line_h; + max_w = max_width; + line_cnt += 1; + if(line_cnt >= lines) { + break; + } + } + txt_pos.y -= line_space; + + return txt_pos.y; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + _lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); + spans->indent = 0; + spans->lines = -1; + spans->mode = LV_SPAN_MODE_EXPAND; + spans->overflow = LV_SPAN_OVERFLOW_CLIP; + spans->cache_w = 0; + spans->cache_h = 0; + spans->refresh = 1; +} + +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + while(cur_span) { + _lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_free(cur_span->txt); + cur_span->txt = NULL; + } + lv_style_reset(&cur_span->style); + lv_free(cur_span); + cur_span = _lv_ll_get_head(&spans->child_ll); + } +} + +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /* Call the ancestor's event handler */ + if(lv_obj_event_base(MY_CLASS, e) != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + refresh_self_size(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refresh_self_size(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + int32_t width = 0; + int32_t height = 0; + lv_point_t * self_size = lv_event_get_param(e); + + if(spans->mode == LV_SPAN_MODE_EXPAND) { + if(spans->refresh) { + spans->cache_w = (int32_t)lv_spangroup_get_expand_width(obj, 0); + spans->cache_h = lv_spangroup_get_max_line_height(obj); + spans->refresh = 0; + } + width = spans->cache_w; + height = spans->cache_h; + } + else if(spans->mode == LV_SPAN_MODE_BREAK) { + width = lv_obj_get_content_width(obj); + if(self_size->y >= 0) { + if(width != spans->cache_w || spans->refresh) { + height = lv_spangroup_get_expand_height(obj, width); + spans->cache_w = width; + spans->cache_h = height; + spans->refresh = 0; + } + else { + height = spans->cache_h; + } + } + } + else if(spans->mode == LV_SPAN_MODE_FIXED) { + width = self_size->x >= 0 ? lv_obj_get_content_width(obj) : 0; + height = self_size->y >= 0 ? lv_obj_get_content_height(obj) : 0; + } + self_size->x = LV_MAX(self_size->x, width); + self_size->y = LV_MAX(self_size->y, height); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_span(obj, layer); +} + +/** + * @return true for txt fill the max_width. + */ +static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, + int32_t letter_space, int32_t max_width, lv_text_flag_t flag, + int32_t * use_width, uint32_t * end_ofs) +{ + if(txt == NULL || txt[0] == '\0') { + *end_ofs = 0; + *use_width = 0; + return false; + } + + int32_t real_max_width = max_width; +#if !LV_USE_FONT_PLACEHOLDER + /* fix incomplete text display when disable the placeholder. */ + /* workaround by: https://github.com/lvgl/lvgl/issues/3685 */ + real_max_width++; +#endif + + uint32_t ofs = _lv_text_get_next_line(txt, font, letter_space, real_max_width, use_width, flag); + *end_ofs = ofs; + + if(txt[ofs] == '\0' && *use_width < max_width) { + return false; + } + else { + return true; + } +} + +static void lv_snippet_push(lv_snippet_t * item) +{ + struct _snippet_stack * stack_p = snippet_stack; + if(stack_p->index < LV_SPAN_SNIPPET_STACK_SIZE) { + memcpy(&stack_p->stack[stack_p->index], item, sizeof(lv_snippet_t)); + stack_p->index++; + } + else { + LV_LOG_ERROR("span draw stack overflow, please set LV_SPAN_SNIPPET_STACK_SIZE too larger"); + } +} + +static uint32_t lv_get_snippet_count(void) +{ + return snippet_stack->index; +} + +static lv_snippet_t * lv_get_snippet(uint32_t index) +{ + return &snippet_stack->stack[index]; +} + +static void lv_snippet_clear(void) +{ + snippet_stack->index = 0; +} + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span) +{ + const lv_font_t * font; + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); + if(res != LV_RESULT_OK) { + font = lv_obj_get_style_text_font(par, LV_PART_MAIN); + } + else { + font = (const lv_font_t *)value.ptr; + } + return font; +} + +static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span) +{ + int32_t letter_space; + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res != LV_RESULT_OK) { + letter_space = lv_obj_get_style_text_letter_space(par, LV_PART_MAIN); + } + else { + letter_space = (int32_t)value.num; + } + return letter_space; +} + +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span) +{ + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); + if(res != LV_RESULT_OK) { + value.color = lv_obj_get_style_text_color(par, LV_PART_MAIN); + } + return value.color; +} + +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span) +{ + lv_opa_t opa; + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); + if(res != LV_RESULT_OK) { + opa = (lv_opa_t)lv_obj_get_style_text_opa(par, LV_PART_MAIN); + } + else { + opa = (lv_opa_t)value.num; + } + return opa; +} + +static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span) +{ + lv_blend_mode_t mode; + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value); + if(res != LV_RESULT_OK) { + mode = (lv_blend_mode_t)lv_obj_get_style_blend_mode(par, LV_PART_MAIN); + } + else { + mode = (lv_blend_mode_t)value.num; + } + return mode; +} + +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span) +{ + int32_t decor; + lv_style_value_t value; + lv_result_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); + if(res != LV_RESULT_OK) { + decor = (lv_text_decor_t)lv_obj_get_style_text_decor(par, LV_PART_MAIN);; + } + else { + decor = (int32_t)value.num; + } + return decor; +} + +static inline void span_text_check(const char ** text) +{ + if(*text == NULL) { + *text = ""; + LV_LOG_ERROR("occur an error that span text == NULL"); + } +} + +static int32_t convert_indent_pct(lv_obj_t * obj, int32_t width) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + int32_t indent = spans->indent; + if(LV_COORD_IS_PCT(spans->indent)) { + if(spans->mode == LV_SPAN_MODE_EXPAND) { + indent = 0; + } + else { + indent = (width * LV_COORD_GET_PCT(spans->indent)) / 100; + } + } + + return indent; +} + +/** + * draw span group + * @param spans obj handle + * @param coords coordinates of the label + * @param mask the label will be drawn only in this area + */ +static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) +{ + + lv_area_t coords; + lv_obj_get_content_coords(obj, &coords); + + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + /* return if not span */ + if(_lv_ll_get_head(&spans->child_ll) == NULL) { + return; + } + + /* return if no draw area */ + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &coords, &layer->_clip_area)) return; + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN);; + int32_t max_width = lv_area_get_width(&coords); + int32_t indent = convert_indent_pct(obj, max_width); + int32_t max_w = max_width - indent; /* first line need minus indent */ + lv_opa_t obj_opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); + + /* coords of draw span-txt */ + lv_point_t txt_pos; + txt_pos.y = coords.y1; + txt_pos.x = coords.x1 + indent; /* first line need add indent */ + + lv_span_t * cur_span = _lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + lv_memzero(&snippet, sizeof(snippet)); + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + + bool is_first_line = true; + /* the loop control how many lines need to draw */ + while(cur_span) { + bool is_end_line = false; + bool ellipsis_valid = false; + int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + int32_t max_baseline = 0; /*baseline of the highest span*/ + lv_snippet_clear(); + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span = _lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + int32_t use_width = 0; + bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + + if(isfill) { + if(next_ofs > 0 && lv_get_snippet_count() > 0) { + /* To prevent infinite loops, the _lv_text_get_next_line() may return incomplete words, */ + /* This phenomenon should be avoided when lv_get_snippet_count() > 0 */ + if(max_w < use_width) { + break; + } + uint32_t tmp_ofs = next_ofs; + uint32_t letter = _lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_text_is_break_char(letter))) { + tmp_ofs = 0; + letter = _lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], &tmp_ofs); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || _lv_text_is_break_char(letter))) { + break; + } + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + max_baseline = snippet.font->base_line; + } + + lv_snippet_push(&snippet); + max_w = max_w - use_width - snippet.letter_space; + if(isfill || max_w <= 0) { + break; + } + } + + /* start current line deal with */ + + uint32_t item_cnt = lv_get_snippet_count(); + if(item_cnt == 0) { /* break if stack is empty */ + break; + } + + /* Whether the current line is the end line and does overflow processing */ + { + lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1); + int32_t next_line_h = last_snippet->line_h; + if(last_snippet->txt[last_snippet->bytes] == '\0') { + next_line_h = 0; + lv_span_t * next_span = _lv_ll_get_next(&spans->child_ll, last_snippet->span); + if(next_span) { /* have the next line */ + next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; + } + } + if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */ + if(last_snippet->txt[last_snippet->bytes] != '\0') { + last_snippet->bytes = lv_strlen(last_snippet->txt); + last_snippet->txt_w = lv_text_get_width(last_snippet->txt, last_snippet->bytes, last_snippet->font, + last_snippet->letter_space); + } + ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS; + is_end_line = true; + } + } + + /*Go the first visible line*/ + if(txt_pos.y + max_line_h < clip_area.y1) { + goto Next_line_init; + } + + /* align deal with */ + lv_text_align_t align = lv_obj_get_style_text_align(obj, LV_PART_MAIN); + if(align == LV_TEXT_ALIGN_CENTER || align == LV_TEXT_ALIGN_RIGHT) { + int32_t align_ofs = 0; + int32_t txts_w = is_first_line ? indent : 0; + uint32_t i; + for(i = 0; i < item_cnt; i++) { + lv_snippet_t * pinfo = lv_get_snippet(i); + txts_w = txts_w + pinfo->txt_w + pinfo->letter_space; + } + txts_w -= lv_get_snippet(item_cnt - 1)->letter_space; + align_ofs = max_width > txts_w ? max_width - txts_w : 0; + if(align == LV_TEXT_ALIGN_CENTER) { + align_ofs = align_ofs >> 1; + } + txt_pos.x += align_ofs; + } + + /* draw line letters */ + uint32_t i; + for(i = 0; i < item_cnt; i++) { + lv_snippet_t * pinfo = lv_get_snippet(i); + + /* bidi deal with:todo */ + const char * bidi_txt = pinfo->txt; + + lv_point_t pos; + pos.x = txt_pos.x; + pos.y = txt_pos.y + max_line_h - pinfo->line_h - (max_baseline - pinfo->font->base_line); + label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span); + label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span); + label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span); + label_draw_dsc.blend_mode = lv_span_get_style_text_blend_mode(obj, pinfo->span); + if(obj_opa < LV_OPA_MAX) { + label_draw_dsc.opa = LV_OPA_MIX2(label_draw_dsc.opa, obj_opa); + } + uint32_t txt_bytes = pinfo->bytes; + + /* overflow */ + uint32_t dot_letter_w = 0; + uint32_t dot_width = 0; + if(ellipsis_valid) { + dot_letter_w = lv_font_get_glyph_width(pinfo->font, '.', '.'); + dot_width = dot_letter_w * 3; + } + int32_t ellipsis_width = coords.x1 + max_width - dot_width; + + uint32_t j = 0; + while(j < txt_bytes) { + /* skip invalid fields */ + if(pos.x > clip_area.x2) { + break; + } + uint32_t letter = _lv_text_encoded_next(bidi_txt, &j); + uint32_t letter_next = _lv_text_encoded_next(&bidi_txt[j], NULL); + int32_t letter_w = lv_font_get_glyph_width(pinfo->font, letter, letter_next); + + /* skip invalid fields */ + if(pos.x + letter_w + pinfo->letter_space < clip_area.x1) { + if(letter_w > 0) { + pos.x = pos.x + letter_w + pinfo->letter_space; + } + continue; + } + + if(ellipsis_valid && pos.x + letter_w + pinfo->letter_space > ellipsis_width) { + for(int ell = 0; ell < 3; ell++) { + lv_draw_character(layer, &label_draw_dsc, &pos, '.'); + pos.x = pos.x + dot_letter_w + pinfo->letter_space; + } + if(pos.x <= ellipsis_width) { + pos.x = ellipsis_width + 1; + } + break; + } + else { + lv_draw_character(layer, &label_draw_dsc, &pos, letter); + if(letter_w > 0) { + pos.x = pos.x + letter_w + pinfo->letter_space; + } + } + } + + /* draw decor */ + lv_text_decor_t decor = lv_span_get_style_text_decor(obj, pinfo->span); + if(decor != LV_TEXT_DECOR_NONE) { + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.color = label_draw_dsc.color; + line_dsc.width = label_draw_dsc.font->underline_thickness ? pinfo->font->underline_thickness : 1; + line_dsc.opa = label_draw_dsc.opa; + line_dsc.blend_mode = label_draw_dsc.blend_mode; + + if(decor & LV_TEXT_DECOR_STRIKETHROUGH) { + int32_t y = pos.y + ((pinfo->line_h - line_space) >> 1) + (line_dsc.width >> 1); + lv_point_precise_set(&line_dsc.p1, txt_pos.x, y); + lv_point_precise_set(&line_dsc.p2, pos.x, y); + lv_draw_line(layer, &line_dsc); + } + + if(decor & LV_TEXT_DECOR_UNDERLINE) { + int32_t y = pos.y + pinfo->line_h - line_space - pinfo->font->base_line - pinfo->font->underline_position; + lv_point_precise_set(&line_dsc.p1, txt_pos.x, y); + lv_point_precise_set(&line_dsc.p2, pos.x, y); + lv_draw_line(layer, &line_dsc); + } + } + txt_pos.x = pos.x; + } + +Next_line_init: + /* next line init */ + is_first_line = false; + txt_pos.x = coords.x1; + txt_pos.y += max_line_h; + if(is_end_line || txt_pos.y > clip_area.y2 + 1) { + layer->_clip_area = clip_area_ori; + return; + } + max_w = max_width; + } + layer->_clip_area = clip_area_ori; +} + +static void refresh_self_size(lv_obj_t * obj) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->refresh = 1; + lv_obj_invalidate(obj); + lv_obj_refresh_self_size(obj); +} + +#endif diff --git a/libraries/lvgl/src/widgets/span/lv_span.h b/libraries/lvgl/src/widgets/span/lv_span.h new file mode 100644 index 0000000..0b03869 --- /dev/null +++ b/libraries/lvgl/src/widgets/span/lv_span.h @@ -0,0 +1,262 @@ +/** + * @file lv_span.h + * + */ + +#ifndef LV_SPAN_H +#define LV_SPAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_SPAN != 0 + +/********************* + * DEFINES + *********************/ +#ifndef LV_SPAN_SNIPPET_STACK_SIZE +#define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +/********************** + * TYPEDEFS + **********************/ +enum _lv_span_overflow_t { + LV_SPAN_OVERFLOW_CLIP, + LV_SPAN_OVERFLOW_ELLIPSIS, + _LV_SPAN_OVERFLOW_LAST, /**< Fence member*/ +}; + +#ifdef DOXYGEN +typedef _lv_span_overflow_t lv_span_overflow_t; +#else +typedef uint32_t lv_span_overflow_t; +#endif /*DOXYGEN*/ + +enum _lv_span_mode_t { + LV_SPAN_MODE_FIXED, /**< fixed the obj size*/ + LV_SPAN_MODE_EXPAND, /**< Expand the object size to the text size*/ + LV_SPAN_MODE_BREAK, /**< Keep width, break the too long lines and expand height*/ + _LV_SPAN_MODE_LAST /**< Fence member*/ +}; + +#ifdef DOXYGEN +typedef _lv_span_mode_t lv_span_mode_t; +#else +typedef uint32_t lv_span_mode_t; +#endif /*DOXYGEN*/ + +typedef struct { + char * txt; /* a pointer to display text */ + lv_obj_t * spangroup; /* a pointer to spangroup */ + lv_style_t style; /* display text style */ + uint32_t static_flag : 1;/* the text is static flag */ +} lv_span_t; + +/** Data of label*/ +typedef struct { + lv_obj_t obj; + int32_t lines; + int32_t indent; /* first line indent */ + int32_t cache_w; /* the cache automatically calculates the width */ + int32_t cache_h; /* similar cache_w */ + lv_ll_t child_ll; + uint32_t mode : 2; /* details see lv_span_mode_t */ + uint32_t overflow : 1; /* details see lv_span_overflow_t */ + uint32_t refresh : 1; /* the spangroup need refresh cache_w and cache_h */ +} lv_spangroup_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spangroup_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_span_stack_init(void); +void lv_span_stack_deinit(void); + +/** + * Create a spangroup object + * @param parent pointer to an object, it will be the parent of the new spangroup + * @return pointer to the created spangroup + */ +lv_obj_t * lv_spangroup_create(lv_obj_t * parent); + +/** + * Create a span string descriptor and add to spangroup. + * @param obj pointer to a spangroup object. + * @return pointer to the created span. + */ +lv_span_t * lv_spangroup_new_span(lv_obj_t * obj); + +/** + * Remove the span from the spangroup and free memory. + * @param obj pointer to a spangroup object. + * @param span pointer to a span. + */ +void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a span. Memory will be allocated to store the text by the span. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text(lv_span_t * span, const char * text); + +/** + * Set a static text. It will not be saved by the span so the 'text' variable + * has to be 'alive' while the span exist. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text_static(lv_span_t * span, const char * text); + +/** + * Set the align of the spangroup. + * @param obj pointer to a spangroup object. + * @param align see lv_text_align_t for details. + */ +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align); + +/** + * Set the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @param overflow see lv_span_overflow_t for details. + */ +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow); + +/** + * Set the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @param indent the first line indentation + */ +void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent); + +/** + * Set the mode of the spangroup. + * @param obj pointer to a spangroup object. + * @param mode see lv_span_mode_t for details. + */ +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode); + +/** + * Set maximum lines of the spangroup. + * @param obj pointer to a spangroup object. + * @param lines max lines that can be displayed in LV_SPAN_MODE_BREAK mode. < 0 means no limit. + */ +void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get a spangroup child by its index. + * + * @param obj The spangroup object + * @param id the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return The child span at index `id`, or NULL if the ID does not exist + */ +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id); + +/** + * Get number of spans + * @param obj the spangroup object to get the child count of. + * @return the span count of the spangroup. + */ +uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj); + +/** + * Get the align of the spangroup. + * @param obj pointer to a spangroup object. + * @return the align value. + */ +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj); + +/** + * Get the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @return the overflow value. + */ +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj); + +/** + * Get the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @return the indent value. + */ +int32_t lv_spangroup_get_indent(lv_obj_t * obj); + +/** + * Get the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj); + +/** + * Get maximum lines of the spangroup. + * @param obj pointer to a spangroup object. + * @return the max lines value. + */ +int32_t lv_spangroup_get_max_lines(lv_obj_t * obj); + +/** + * Get max line height of all span in the spangroup. + * @param obj pointer to a spangroup object. + */ +int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj); + +/** + * Get the text content width when all span of spangroup on a line. + * @param obj pointer to a spangroup object. + * @param max_width if text content width >= max_width, return max_width + * to reduce computation, if max_width == 0, returns the text content width. + * @return text content width or max_width. + */ +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width); + +/** + * Get the text content height with width fixed. + * @param obj pointer to a spangroup object. + * @param width the width of the span group. + + */ +int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width); + +/*===================== + * Other functions + *====================*/ + +/** + * Update the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +void lv_spangroup_refr_mode(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPAN*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_SPAN_H*/ diff --git a/libraries/lvgl/src/widgets/spinbox/lv_spinbox.c b/libraries/lvgl/src/widgets/spinbox/lv_spinbox.c new file mode 100644 index 0000000..667c310 --- /dev/null +++ b/libraries/lvgl/src/widgets/spinbox/lv_spinbox.c @@ -0,0 +1,471 @@ +/** + * @file lv_spinbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_spinbox.h" +#if LV_USE_SPINBOX + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_spinbox_class) +#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 8U) +#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 4U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_spinbox_updatevalue(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_spinbox_class = { + .constructor_cb = lv_spinbox_constructor, + .event_cb = lv_spinbox_event, + .width_def = LV_DPI_DEF, + .instance_size = sizeof(lv_spinbox_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_textarea_class, + .name = "spinbox", +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spinbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_spinbox_set_value(lv_obj_t * obj, int32_t v) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(v > spinbox->range_max) v = spinbox->range_max; + if(v < spinbox->range_min) v = spinbox->range_min; + + spinbox->value = v; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->rollover = rollover; +} + +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; + + if(sep_pos >= digit_count) sep_pos = 0; + + if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) { + const int64_t max_val = lv_pow(10, digit_count); + if(spinbox->range_max > max_val - 1) spinbox->range_max = max_val - 1; + if(spinbox->range_min < -max_val + 1) spinbox->range_min = -max_val + 1; + } + + spinbox->digit_count = digit_count; + spinbox->dec_point_pos = sep_pos; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->step = step; + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->range_max = range_max; + spinbox->range_min = range_min; + + if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max; + if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); + const int32_t new_step = lv_pow(10, pos); + + if(pos <= 0) spinbox->step = 1; + else if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + spinbox->digit_step_dir = direction; + + lv_spinbox_updatevalue(obj); +} +/*===================== + * Getter functions + *====================*/ + +int32_t lv_spinbox_get_value(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->value; +} + +int32_t lv_spinbox_get_step(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->step; +} + +/*===================== + * Other functions + *====================*/ + +void lv_spinbox_step_next(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t new_step = spinbox->step / 10; + spinbox->step = (new_step > 0) ? new_step : 1; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_step_prev(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); + const int32_t new_step = spinbox->step * 10; + if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +bool lv_spinbox_get_rollover(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->rollover; +} + +void lv_spinbox_increment(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + int32_t v = spinbox->value; + /* Special mode when zero crossing. E.g -3+10 should be 3, not 7. + * Pretend we are on -7 now.*/ + if((spinbox->value < 0) && (spinbox->value + spinbox->step) > 0) { + v = -(spinbox->step + spinbox->value); + } + + if(v + spinbox->step <= spinbox->range_max) { + v += spinbox->step; + } + else { + /*Rollover?*/ + if((spinbox->rollover) && (spinbox->value == spinbox->range_max)) + v = spinbox->range_min; + else + v = spinbox->range_max; + } + + if(v != spinbox->value) { + spinbox->value = v; + lv_spinbox_updatevalue(obj); + } +} + +void lv_spinbox_decrement(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + int32_t v = spinbox->value; + /* Special mode when zero crossing. E.g 3-10 should be -3, not -7. + * Pretend we are on 7 now.*/ + if((spinbox->value > 0) && (spinbox->value - spinbox->step) < 0) { + v = spinbox->step - spinbox->value; + } + + if(v - spinbox->step >= spinbox->range_min) { + v -= spinbox->step; + } + else { + /*Rollover?*/ + if((spinbox->rollover) && (spinbox->value == spinbox->range_min)) + v = spinbox->range_max; + else + v = spinbox->range_min; + } + + if(v != spinbox->value) { + spinbox->value = v; + lv_spinbox_updatevalue(obj); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_LOG_TRACE("begin"); + + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + /*Initialize the allocated 'ext'*/ + spinbox->value = 0; + spinbox->dec_point_pos = 0; + spinbox->digit_count = 5; + spinbox->step = 1; + spinbox->range_max = 99999; + spinbox->range_min = -99999; + spinbox->rollover = false; + spinbox->digit_step_dir = LV_DIR_RIGHT; + + lv_textarea_set_one_line(obj, true); + lv_textarea_set_cursor_click_pos(obj, true); + + lv_spinbox_updatevalue(obj); + + LV_LOG_TRACE("Spinbox constructor finished"); +} + +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res = LV_RESULT_OK; + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + if(code == LV_EVENT_RELEASED) { + /*If released with an ENCODER then move to the next digit*/ + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(obj))) { + if(spinbox->digit_count > 1) { + if(spinbox->digit_step_dir == LV_DIR_RIGHT) { + if(spinbox->step > 1) { + lv_spinbox_step_next(obj); + } + else { + /*Restart from the MSB*/ + spinbox->step = lv_pow(10, spinbox->digit_count - 2); + lv_spinbox_step_prev(obj); + } + } + else { + if(spinbox->step < lv_pow(10, spinbox->digit_count - 1)) { + lv_spinbox_step_prev(obj); + } + else { + /*Restart from the LSB*/ + spinbox->step = 10; + lv_spinbox_step_next(obj); + } + } + } + } + /*The cursor has been positioned to a digit. + * Set `step` accordingly*/ + else { + const char * txt = lv_textarea_get_text(obj); + const size_t txt_len = lv_strlen(txt); + + /* Check cursor position */ + /* Cursor is in '.' digit */ + if(txt[spinbox->ta.cursor.pos] == '.') { + lv_textarea_cursor_left(obj); + } + /* Cursor is already in the right-most digit */ + else if(spinbox->ta.cursor.pos == (uint32_t)txt_len) { + lv_textarea_set_cursor_pos(obj, txt_len - 1); + } + /* Cursor is already in the left-most digit AND range_min is negative */ + else if(spinbox->ta.cursor.pos == 0 && spinbox->range_min < 0) { + lv_textarea_set_cursor_pos(obj, 1); + } + + /* Handle spinbox with decimal point (spinbox->dec_point_pos != 0) */ + uint32_t cp = spinbox->ta.cursor.pos; + if(spinbox->ta.cursor.pos > spinbox->dec_point_pos && spinbox->dec_point_pos != 0) cp--; + + const size_t len = spinbox->digit_count - 1; + uint32_t pos = len - cp; + + if(spinbox->range_min < 0) pos++; + + spinbox->step = 1; + uint32_t i; + for(i = 0; i < pos; i++) spinbox->step *= 10; + } + } + else if(code == LV_EVENT_KEY) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_increment(obj); + else + lv_spinbox_step_next(obj); + } + else if(c == LV_KEY_LEFT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_decrement(obj); + else + lv_spinbox_step_prev(obj); + } + else if(c == LV_KEY_UP) { + lv_spinbox_increment(obj); + } + else if(c == LV_KEY_DOWN) { + lv_spinbox_decrement(obj); + } + else { + lv_textarea_add_char(obj, c); + } + } +} + +static void lv_spinbox_updatevalue(lv_obj_t * obj) +{ + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + /* LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (18): Max possible digit_count value (15) + sign + decimal point + NULL terminator */ + char textarea_txt[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES] = {0U}; + char * buf_p = textarea_txt; + + uint32_t cur_shift_left = 0; + if(spinbox->range_min < 0) { /*hide sign if there are only positive values*/ + /*Add the sign*/ + (*buf_p) = spinbox->value >= 0 ? '+' : '-'; + buf_p++; + } + else { + /*Cursor need shift to left*/ + cur_shift_left++; + } + + /*Convert the numbers to string (the sign is already handled so always convert positive number)*/ + char digits[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES]; + lv_snprintf(digits, LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES, "%" LV_PRId32, LV_ABS(spinbox->value)); + + /*Add leading zeros*/ + int32_t i; + const size_t digits_len = lv_strlen(digits); + + const int leading_zeros_cnt = spinbox->digit_count - digits_len; + if(leading_zeros_cnt) { + for(i = (int32_t) digits_len; i >= 0; i--) { + digits[i + leading_zeros_cnt] = digits[i]; + } + /* NOTE: Substitute with memset? */ + for(i = 0; i < leading_zeros_cnt; i++) { + digits[i] = '0'; + } + } + + /*Add the decimal part*/ + const uint32_t intDigits = (spinbox->dec_point_pos == 0) ? spinbox->digit_count : spinbox->dec_point_pos; + for(i = 0; i < (int32_t)intDigits && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + + /*Insert the decimal point*/ + if(spinbox->dec_point_pos) { + (*buf_p) = '.'; + buf_p++; + + for(/*Leave i*/; i < spinbox->digit_count && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + } + + /*Refresh the text*/ + lv_textarea_set_text(obj, (char *)textarea_txt); + + /*Set the cursor position*/ + int32_t step = spinbox->step; + uint32_t cur_pos = (uint32_t)spinbox->digit_count; + while(step >= 10) { + step /= 10; + cur_pos--; + } + + if(cur_pos > intDigits) cur_pos++; /*Skip the decimal point*/ + + cur_pos -= cur_shift_left; + + lv_textarea_set_cursor_pos(obj, cur_pos); +} + +#endif /*LV_USE_SPINBOX*/ diff --git a/libraries/lvgl/src/widgets/spinbox/lv_spinbox.h b/libraries/lvgl/src/widgets/spinbox/lv_spinbox.h new file mode 100644 index 0000000..267026f --- /dev/null +++ b/libraries/lvgl/src/widgets/spinbox/lv_spinbox.h @@ -0,0 +1,178 @@ +/** + * @file lv_spinbox.h + * + */ + +#ifndef LV_SPINBOX_H +#define LV_SPINBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../textarea/lv_textarea.h" + +#if LV_USE_SPINBOX + +/*Testing of dependencies*/ +#if LV_USE_TEXTAREA == 0 +#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_SPINBOX_MAX_DIGIT_COUNT 10 + +/********************** + * TYPEDEFS + **********************/ + +/*Data of spinbox*/ +typedef struct { + lv_textarea_t ta; /*Ext. of ancestor*/ + /*New data for this type*/ + int32_t value; + int32_t range_max; + int32_t range_min; + int32_t step; + uint32_t digit_count : 4; + uint32_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ + uint32_t rollover : 1; /* Set to true for rollover functionality*/ + uint32_t digit_step_dir : 2; /* the direction the digit will step on encoder button press when editing*/ +} lv_spinbox_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinbox_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a spinbox object + * @param parent pointer to an object, it will be the parent of the new spinbox + * @return pointer to the created spinbox + */ +lv_obj_t * lv_spinbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set spinbox value + * @param obj pointer to spinbox + * @param v value to be set + */ +void lv_spinbox_set_value(lv_obj_t * obj, int32_t v); + +/** + * Set spinbox rollover function + * @param obj pointer to spinbox + * @param rollover true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover); + +/** + * Set spinbox digit format (digit count and decimal format) + * @param obj pointer to spinbox + * @param digit_count number of digit excluding the decimal separator and the sign + * @param sep_pos number of digit before the decimal point. If 0, decimal point is not + * shown + */ +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos); + +/** + * Set spinbox step + * @param obj pointer to spinbox + * @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change. + */ +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step); + +/** + * Set spinbox value range + * @param obj pointer to spinbox + * @param range_min maximum value, inclusive + * @param range_max minimum value, inclusive + */ +void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max); + +/** + * Set cursor position to a specific digit for edition + * @param obj pointer to spinbox + * @param pos selected position in spinbox + */ +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos); + +/** + * Set direction of digit step when clicking an encoder button while in editing mode + * @param obj pointer to spinbox + * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT) + */ +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get spinbox rollover function status + * @param obj pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * obj); + +/** + * Get the spinbox numeral value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer value of the spinbox + */ +int32_t lv_spinbox_get_value(lv_obj_t * obj); + +/** + * Get the spinbox step value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer step value of the spinbox + */ +int32_t lv_spinbox_get_step(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Select next lower digit for edition by dividing the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_next(lv_obj_t * obj); + +/** + * Select next higher digit for edition by multiplying the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_prev(lv_obj_t * obj); + +/** + * Increment spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_increment(lv_obj_t * obj); + +/** + * Decrement spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_decrement(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPINBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif +#endif /*LV_SPINBOX_H*/ diff --git a/libraries/lvgl/src/widgets/spinner/lv_spinner.c b/libraries/lvgl/src/widgets/spinner/lv_spinner.c new file mode 100644 index 0000000..9b1daa8 --- /dev/null +++ b/libraries/lvgl/src/widgets/spinner/lv_spinner.c @@ -0,0 +1,104 @@ +/** + * @file lv_spinner.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" +#if LV_USE_SPINNER + +/********************* + * DEFINES + *********************/ +#define DEF_ARC_ANGLE 200 +#define DEF_TIME 1000 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void arc_anim_start_angle(void * obj, int32_t v); +static void arc_anim_end_angle(void * obj, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_spinner_class = { + .base_class = &lv_arc_class, + .constructor_cb = lv_spinner_constructor, + .name = "spinner", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spinner_create(lv_obj_t * parent) +{ + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spinner_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle) +{ + /*Delete the current animation*/ + lv_anim_delete(obj, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, arc_anim_end_angle); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_duration(&a, t); + lv_anim_set_values(&a, angle, 360 + angle); + lv_anim_start(&a); + + lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); + lv_anim_set_bezier3_param(&a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0.58), + LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(1)); + lv_anim_set_values(&a, 0, 360); + lv_anim_set_exec_cb(&a, arc_anim_start_angle); + lv_anim_start(&a); + + lv_arc_set_bg_angles(obj, 0, 360); + lv_arc_set_rotation(obj, 270); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + lv_spinner_set_anim_params(obj, DEF_TIME, DEF_ARC_ANGLE); +} + +static void arc_anim_start_angle(void * obj, int32_t v) +{ + lv_arc_set_start_angle(obj, (uint32_t) v); +} + +static void arc_anim_end_angle(void * obj, int32_t v) +{ + lv_arc_set_end_angle(obj, (uint32_t) v); +} + +#endif /*LV_USE_SPINNER*/ diff --git a/libraries/lvgl/src/widgets/spinner/lv_spinner.h b/libraries/lvgl/src/widgets/spinner/lv_spinner.h new file mode 100644 index 0000000..9244563 --- /dev/null +++ b/libraries/lvgl/src/widgets/spinner/lv_spinner.h @@ -0,0 +1,63 @@ +/** + * @file lv_spinner.h + * + */ + +#ifndef LV_SPINNER_H +#define LV_SPINNER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SPINNER + +/*Testing of dependencies*/ +#if LV_USE_ARC == 0 +#error "lv_spinner: lv_arc is required. Enable it in lv_conf.h (LV_USE_ARC 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinner_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a spinner widget + * @param parent pointer to an object, it will be the parent of the new spinner. + * @return the created spinner + */ +lv_obj_t * lv_spinner_create(lv_obj_t * parent); + +/** + * Set the animation time and arc length of the spinner + * @param obj pointer to a spinner + * @param t the animation time in milliseconds + * @param angle the angle of the arc in degrees + */ +void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPINNER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINNER_H*/ diff --git a/libraries/lvgl/src/widgets/switch/lv_switch.c b/libraries/lvgl/src/widgets/switch/lv_switch.c new file mode 100644 index 0000000..f1973e9 --- /dev/null +++ b/libraries/lvgl/src/widgets/switch/lv_switch.c @@ -0,0 +1,264 @@ +/** + * @file lv_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_switch.h" + +#if LV_USE_SWITCH != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_anim.h" +#include "../../indev/lv_indev.h" +#include "../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_switch_class) + +#define LV_SWITCH_IS_ANIMATING(sw) (((sw)->anim_state) != LV_SWITCH_ANIM_STATE_INV) + +/** Switch animation start value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_START 0 + +/** Switch animation end value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_SWITCH_ANIM_STATE_INV -1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_switch_anim_exec_cb(void * sw, int32_t value); +static void lv_switch_trigger_anim(lv_obj_t * obj); +static void lv_switch_anim_completed(lv_anim_t * a); +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_switch_class = { + .constructor_cb = lv_switch_constructor, + .destructor_cb = lv_switch_destructor, + .event_cb = lv_switch_event, + .width_def = (4 * LV_DPI_DEF) / 10, + .height_def = (4 * LV_DPI_DEF) / 17, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_switch_t), + .base_class = &lv_obj_class, + .name = "switch", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_switch_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_switch_t * sw = (lv_switch_t *)obj; + + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_anim_delete(sw, NULL); +} + +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + int32_t knob_size = LV_MAX4(knob_left, knob_right, knob_bottom, knob_top); + knob_size += _LV_SWITCH_KNOB_EXT_AREA_CORRECTION; + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + *s = LV_MAX(*s, lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR)); + } + else if(code == LV_EVENT_VALUE_CHANGED) { + lv_switch_trigger_anim(obj); + lv_obj_invalidate(obj); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + /*Draw the indicator*/ + lv_area_t indic_area; + /*Exclude background's padding*/ + lv_obj_get_content_coords(obj, &indic_area); + + lv_draw_rect_dsc_t draw_indic_dsc; + lv_draw_rect_dsc_init(&draw_indic_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc); + lv_draw_rect(layer, &draw_indic_dsc, &indic_area); + + /*Draw the knob*/ + int32_t anim_value_x = 0; + int32_t knob_size = lv_obj_get_height(obj); + int32_t anim_length = lv_area_get_width(&obj->coords) - knob_size; + + if(LV_SWITCH_IS_ANIMATING(sw)) { + /* Use the animation's coordinate */ + anim_value_x = (anim_length * sw->anim_state) / LV_SWITCH_ANIM_STATE_END; + } + else { + /* Use LV_STATE_CHECKED to decide the coordinate */ + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + anim_value_x = chk ? anim_length : 0; + } + + if(LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN)) { + anim_value_x = anim_length - anim_value_x; + } + + lv_area_t knob_area; + lv_area_copy(&knob_area, &obj->coords); + knob_area.x1 += anim_value_x; + knob_area.x2 = knob_area.x1 + (knob_size > 0 ? knob_size - 1 : 0); + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area.x1 -= knob_left; + knob_area.x2 += knob_right; + knob_area.y1 -= knob_top; + knob_area.y2 += knob_bottom; + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + + lv_draw_rect(layer, &knob_rect_dsc, &knob_area); +} + +static void lv_switch_anim_exec_cb(void * var, int32_t value) +{ + lv_switch_t * sw = var; + sw->anim_state = value; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Resets the switch's animation state to "no animation in progress". + */ +static void lv_switch_anim_completed(lv_anim_t * a) +{ + lv_switch_t * sw = a->var; + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Starts an animation for the switch knob. if the anim_time style property is greater than 0 + * @param obj the switch to animate + */ +static void lv_switch_trigger_anim(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_switch_t * sw = (lv_switch_t *)obj; + + uint32_t anim_dur_full = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + + if(anim_dur_full > 0) { + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + int32_t anim_start; + int32_t anim_end; + /*No animation in progress -> simply set the values*/ + if(sw->anim_state == LV_SWITCH_ANIM_STATE_INV) { + anim_start = chk ? LV_SWITCH_ANIM_STATE_START : LV_SWITCH_ANIM_STATE_END; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_start = sw->anim_state; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Calculate actual animation duration*/ + uint32_t anim_dur = (anim_dur_full * LV_ABS(anim_start - anim_end)) / LV_SWITCH_ANIM_STATE_END; + + /*Stop the previous animation if it exists*/ + lv_anim_delete(sw, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, sw); + lv_anim_set_exec_cb(&a, lv_switch_anim_exec_cb); + lv_anim_set_values(&a, anim_start, anim_end); + lv_anim_set_completed_cb(&a, lv_switch_anim_completed); + lv_anim_set_duration(&a, anim_dur); + lv_anim_start(&a); + } +} + +#endif diff --git a/libraries/lvgl/src/widgets/switch/lv_switch.h b/libraries/lvgl/src/widgets/switch/lv_switch.h new file mode 100644 index 0000000..da14450 --- /dev/null +++ b/libraries/lvgl/src/widgets/switch/lv_switch.h @@ -0,0 +1,61 @@ +/** + * @file lv_switch.h + * + */ + +#ifndef LV_SWITCH_H +#define LV_SWITCH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SWITCH != 0 + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/** Switch knob extra area correction factor */ +#define _LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + int32_t anim_state; +} lv_switch_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_switch_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a switch object + * @param parent pointer to an object, it will be the parent of the new switch + * @return pointer to the created switch + */ +lv_obj_t * lv_switch_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SWITCH*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SWITCH_H*/ diff --git a/libraries/lvgl/src/widgets/table/lv_table.c b/libraries/lvgl/src/widgets/table/lv_table.c new file mode 100644 index 0000000..c69494c --- /dev/null +++ b/libraries/lvgl/src/widgets/table/lv_table.c @@ -0,0 +1,1094 @@ +/** + * @file lv_table.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_table.h" +#if LV_USE_TABLE != 0 + +#include "../../indev/lv_indev.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text.h" +#include "../../misc/lv_text_ap.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../draw/lv_draw.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_table_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, + int32_t letter_space, int32_t line_space, + int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom); +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); +static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); +static size_t get_cell_txt_len(const char * txt); +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt); +static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area); +static void scroll_to_selected_cell(lv_obj_t * obj); + +static inline bool is_cell_empty(void * cell) +{ + return cell == NULL; +} + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_table_class = { + .constructor_cb = lv_table_constructor, + .destructor_cb = lv_table_destructor, + .event_cb = lv_table_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .base_class = &lv_obj_class, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_table_t), + .name = "table", +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_table_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + void * user_data = NULL; + + /*Save the user data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; + + size_t to_allocate = get_cell_txt_len(txt); + + table->cell_data[cell] = lv_realloc(table->cell_data[cell], to_allocate); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + copy_cell_txt(table->cell_data[cell], txt); + + table->cell_data[cell]->ctrl = ctrl; + table->cell_data[cell]->user_data = user_data; + refr_cell_size(obj, row, col); +} + +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_table_t * table = (lv_table_t *)obj; + if(col >= table->col_cnt) { + lv_table_set_column_count(obj, col + 1); + } + + /*Auto expand*/ + if(row >= table->row_cnt) { + lv_table_set_row_count(obj, row + 1); + } + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + void * user_data = NULL; + + /*Save the user_data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; + + va_list ap, ap2; + va_start(ap, fmt); + va_copy(ap2, ap); + + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_malloc(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + va_end(ap2); + return; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap2); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = _lv_text_ap_calc_bytes_count(raw_txt); + table->cell_data[cell] = lv_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + _lv_text_ap_proc(raw_txt, table->cell_data[cell]->txt); + + lv_free(raw_txt); +#else + table->cell_data[cell] = lv_realloc(table->cell_data[cell], + sizeof(lv_table_cell_t) + len + 1); /*+1: trailing '\0; */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + + table->cell_data[cell]->txt[len] = 0; /*Ensure NULL termination*/ + + lv_vsnprintf(table->cell_data[cell]->txt, len + 1, fmt, ap2); +#endif + + va_end(ap2); + + table->cell_data[cell]->ctrl = ctrl; + table->cell_data[cell]->user_data = user_data; + refr_cell_size(obj, row, col); +} + +void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->row_cnt == row_cnt) return; + + uint32_t old_row_cnt = table->row_cnt; + table->row_cnt = row_cnt; + + table->row_h = lv_realloc(table->row_h, table->row_cnt * sizeof(table->row_h[0])); + LV_ASSERT_MALLOC(table->row_h); + if(table->row_h == NULL) return; + + /*Free the unused cells*/ + if(old_row_cnt > row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + uint32_t i; + for(i = new_cell_cnt; i < old_cell_cnt; i++) { + if(table->cell_data[i] && table->cell_data[i]->user_data) { + lv_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } + lv_free(table->cell_data[i]); + } + } + + table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + LV_ASSERT_MALLOC(table->cell_data); + if(table->cell_data == NULL) return; + + /*Initialize the new fields*/ + if(old_row_cnt < row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + lv_memzero(&table->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(table->cell_data[0])); + } + + refr_size_form_row(obj, 0); +} + +void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->col_cnt == col_cnt) return; + + uint32_t old_col_cnt = table->col_cnt; + table->col_cnt = col_cnt; + + lv_table_cell_t ** new_cell_data = lv_malloc(table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + LV_ASSERT_MALLOC(new_cell_data); + if(new_cell_data == NULL) return; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + + lv_memzero(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0])); + + /*The new column(s) messes up the mapping of `cell_data`*/ + uint32_t old_col_start; + uint32_t new_col_start; + uint32_t min_col_cnt = LV_MIN(old_col_cnt, col_cnt); + uint32_t row; + for(row = 0; row < table->row_cnt; row++) { + old_col_start = row * old_col_cnt; + new_col_start = row * col_cnt; + + lv_memcpy(&new_cell_data[new_col_start], &table->cell_data[old_col_start], + sizeof(new_cell_data[0]) * min_col_cnt); + + /*Free the old cells (only if the table becomes smaller)*/ + int32_t i; + for(i = 0; i < (int32_t)old_col_cnt - (int32_t)col_cnt; i++) { + uint32_t idx = old_col_start + min_col_cnt + i; + if(table->cell_data[idx]->user_data) { + lv_free(table->cell_data[idx]->user_data); + table->cell_data[idx]->user_data = NULL; + } + lv_free(table->cell_data[idx]); + table->cell_data[idx] = NULL; + } + } + + lv_free(table->cell_data); + table->cell_data = new_cell_data; + + /*Initialize the new column widths if any*/ + table->col_w = lv_realloc(table->col_w, col_cnt * sizeof(table->col_w[0])); + LV_ASSERT_MALLOC(table->col_w); + if(table->col_w == NULL) return; + + uint32_t col; + for(col = old_col_cnt; col < col_cnt; col++) { + table->col_w[col] = LV_DPI_DEF; + } + + refr_size_form_row(obj, 0) ; +} + +void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col_id >= table->col_cnt) lv_table_set_column_count(obj, col_id + 1); + + table->col_w[col_id] = w; + refr_size_form_row(obj, 0); +} + +void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->ctrl |= ctrl; +} + +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->ctrl &= (~ctrl); +} + +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + if(table->cell_data[cell]->user_data) { + lv_free(table->cell_data[cell]->user_data); + } + + table->cell_data[cell]->user_data = user_data; +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return ""; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return ""; + + return table->cell_data[cell]->txt; +} + +uint32_t lv_table_get_row_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->row_cnt; +} + +uint32_t lv_table_get_column_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->col_cnt; +} + +int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(col >= table->col_cnt) { + LV_LOG_WARN("too big 'col_id'. Must be < LV_TABLE_COL_MAX."); + return 0; + } + + return table->col_w[col]; +} + +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return false; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return false; + else return (table->cell_data[cell]->ctrl & ctrl) == ctrl; +} + +void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + *row = table->row_act; + *col = table->col_act; +} + +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return NULL; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return NULL; + + return table->cell_data[cell]->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_table_t * table = (lv_table_t *)obj; + + table->col_cnt = 1; + table->row_cnt = 1; + table->col_w = lv_malloc(table->col_cnt * sizeof(table->col_w[0])); + table->row_h = lv_malloc(table->row_cnt * sizeof(table->row_h[0])); + table->col_w[0] = LV_DPI_DEF; + table->row_h[0] = LV_DPI_DEF; + table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + table->cell_data[0] = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_table_t * table = (lv_table_t *)obj; + /*Free the cell texts*/ + uint32_t i; + for(i = 0; i < table->col_cnt * table->row_cnt; i++) { + if(table->cell_data[i]) { + if(table->cell_data[i]->user_data) { + lv_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } + lv_free(table->cell_data[i]); + table->cell_data[i] = NULL; + } + } + + if(table->cell_data) lv_free(table->cell_data); + if(table->row_h) lv_free(table->row_h); + if(table->col_w) lv_free(table->col_w); +} + +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_table_t * table = (lv_table_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + refr_size_form_row(obj, 0); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + uint32_t i; + int32_t w = 0; + for(i = 0; i < table->col_cnt; i++) w += table->col_w[i]; + + int32_t h = 0; + for(i = 0; i < table->row_cnt; i++) h += table->row_h[i]; + + p->x = w - 1; + p->y = h - 1; + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING) { + uint32_t col; + uint32_t row; + lv_result_t pr_res = get_pressed_cell(obj, &row, &col); + + if(pr_res == LV_RESULT_OK && (table->col_act != col || table->row_act != row)) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + } + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_invalidate(obj); + lv_indev_t * indev = lv_indev_active(); + lv_obj_t * scroll_obj = lv_indev_get_scroll_obj(indev); + if(table->col_act != LV_TABLE_CELL_NONE && table->row_act != LV_TABLE_CELL_NONE && scroll_obj == NULL) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + table->col_act = LV_TABLE_CELL_NONE; + table->row_act = LV_TABLE_CELL_NONE; + } + } + else if(code == LV_EVENT_FOCUSED) { + lv_obj_invalidate(obj); + } + else if(code == LV_EVENT_KEY) { + int32_t c = *((int32_t *)lv_event_get_param(e)); + int32_t col = table->col_act; + int32_t row = table->row_act; + if(col == LV_TABLE_CELL_NONE || row == LV_TABLE_CELL_NONE) { + table->col_act = 0; + table->row_act = 0; + scroll_to_selected_cell(obj); + lv_obj_invalidate(obj); + return; + } + + if(col >= (int32_t)table->col_cnt) col = 0; + if(row >= (int32_t)table->row_cnt) row = 0; + + if(c == LV_KEY_LEFT) col--; + else if(c == LV_KEY_RIGHT) col++; + else if(c == LV_KEY_UP) row--; + else if(c == LV_KEY_DOWN) row++; + else return; + + if(col >= (int32_t)table->col_cnt) { + if(row < (int32_t)table->row_cnt - 1) { + col = 0; + row++; + } + else { + col = table->col_cnt - 1; + } + } + else if(col < 0) { + if(row != 0) { + col = table->col_cnt - 1; + row--; + } + else { + col = 0; + } + } + + if(row >= (int32_t)table->row_cnt) { + row = table->row_cnt - 1; + } + else if(row < 0) { + row = 0; + } + + if((int32_t)table->col_act != col || (int32_t)table->row_act != row) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + + scroll_to_selected_cell(obj); + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_table_t * table = (lv_table_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + lv_area_t clip_area; + if(!_lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area)) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_point_t txt_size; + lv_area_t cell_area; + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_t rect_dsc_def; + lv_draw_rect_dsc_t rect_dsc_act; /*Passed to the event to modify it*/ + lv_draw_rect_dsc_init(&rect_dsc_def); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_def); + + lv_draw_label_dsc_t label_dsc_def; + lv_draw_label_dsc_t label_dsc_act; /*Passed to the event to modify it*/ + lv_draw_label_dsc_init(&label_dsc_def); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_def); + obj->state = state_ori; + obj->skip_trans = 0; + + uint32_t col; + uint32_t row; + uint32_t cell = 0; + + cell_area.y2 = obj->coords.y1 + bg_top - 1 - lv_obj_get_scroll_y(obj) + border_width; + cell_area.x1 = 0; + cell_area.x2 = 0; + int32_t scroll_x = lv_obj_get_scroll_x(obj) ; + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + /*Handle custom drawer*/ + for(row = 0; row < table->row_cnt; row++) { + int32_t h_row = table->row_h[row]; + + cell_area.y1 = cell_area.y2 + 1; + cell_area.y2 = cell_area.y1 + h_row - 1; + + if(cell_area.y1 > clip_area.y2) break; + + if(rtl) cell_area.x1 = obj->coords.x2 - bg_right - 1 - scroll_x - border_width; + else cell_area.x2 = obj->coords.x1 + bg_left - 1 - scroll_x + border_width; + + for(col = 0; col < table->col_cnt; col++) { + lv_table_cell_ctrl_t ctrl = 0; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + if(rtl) { + cell_area.x2 = cell_area.x1 - 1; + cell_area.x1 = cell_area.x2 - table->col_w[col] + 1; + } + else { + cell_area.x1 = cell_area.x2 + 1; + cell_area.x2 = cell_area.x1 + table->col_w[col] - 1; + } + + uint32_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; + if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + int32_t offset = table->col_w[col + col_merge + 1]; + + if(rtl) cell_area.x1 -= offset; + else cell_area.x2 += offset; + } + else { + break; + } + } + + if(cell_area.y2 < clip_area.y1) { + cell += col_merge + 1; + col += col_merge; + continue; + } + + /*Expand the cell area with a half border to avoid drawing 2 borders next to each other*/ + lv_area_t cell_area_border; + lv_area_copy(&cell_area_border, &cell_area); + if((rect_dsc_def.border_side & LV_BORDER_SIDE_LEFT) && cell_area_border.x1 > obj->coords.x1 + bg_left) { + cell_area_border.x1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_TOP) && cell_area_border.y1 > obj->coords.y1 + bg_top) { + cell_area_border.y1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_RIGHT) && cell_area_border.x2 < obj->coords.x2 - bg_right - 1) { + cell_area_border.x2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_BOTTOM) && + cell_area_border.y2 < obj->coords.y2 - bg_bottom - 1) { + cell_area_border.y2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + + lv_state_t cell_state = LV_STATE_DEFAULT; + if(row == table->row_act && col == table->col_act) { + if(!(obj->state & LV_STATE_SCROLLED) && (obj->state & LV_STATE_PRESSED)) cell_state |= LV_STATE_PRESSED; + if(obj->state & LV_STATE_FOCUSED) cell_state |= LV_STATE_FOCUSED; + if(obj->state & LV_STATE_FOCUS_KEY) cell_state |= LV_STATE_FOCUS_KEY; + if(obj->state & LV_STATE_EDITED) cell_state |= LV_STATE_EDITED; + } + + /*Set up the draw descriptors*/ + if(cell_state == LV_STATE_DEFAULT) { + lv_memcpy(&rect_dsc_act, &rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&label_dsc_act, &label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = cell_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&rect_dsc_act); + lv_draw_label_dsc_init(&label_dsc_act); + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + rect_dsc_act.base.id1 = row; + rect_dsc_act.base.id2 = col; + label_dsc_act.base.id1 = row; + label_dsc_act.base.id2 = col; + + lv_draw_rect(layer, &rect_dsc_act, &cell_area_border); + + if(table->cell_data[cell]) { + const int32_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + lv_text_flag_t txt_flags = LV_TEXT_FLAG_NONE; + lv_area_t txt_area; + + txt_area.x1 = cell_area.x1 + cell_left; + txt_area.x2 = cell_area.x2 - cell_right; + txt_area.y1 = cell_area.y1 + cell_top; + txt_area.y2 = cell_area.y2 - cell_bottom; + + /*Align the content to the middle if not cropped*/ + bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP; + if(crop) txt_flags = LV_TEXT_FLAG_EXPAND; + + lv_text_get_size(&txt_size, table->cell_data[cell]->txt, label_dsc_def.font, + label_dsc_act.letter_space, label_dsc_act.line_space, + lv_area_get_width(&txt_area), txt_flags); + + /*Align the content to the middle if not cropped*/ + if(!crop) { + txt_area.y1 = cell_area.y1 + h_row / 2 - txt_size.y / 2; + txt_area.y2 = cell_area.y1 + h_row / 2 + txt_size.y / 2; + } + + lv_area_t label_clip_area; + bool label_mask_ok; + label_mask_ok = _lv_area_intersect(&label_clip_area, &clip_area, &cell_area); + if(label_mask_ok) { + layer->_clip_area = label_clip_area; + label_dsc_act.text = table->cell_data[cell]->txt; + lv_draw_label(layer, &label_dsc_act, &txt_area); + layer->_clip_area = clip_area; + } + } + + cell += col_merge + 1; + col += col_merge; + } + } + + layer->_clip_area = clip_area_ori; +} + +/* Refreshes size of the table starting from @start_row row */ +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row) +{ + const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + uint32_t i; + for(i = start_row; i < table->row_cnt; i++) { + int32_t calculated_height = get_row_height(obj, i, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + table->row_h[i] = LV_CLAMP(minh, calculated_height, maxh); + } + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col) +{ + const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + int32_t calculated_height = get_row_height(obj, row, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + + int32_t prev_row_size = table->row_h[row]; + table->row_h[row] = LV_CLAMP(minh, calculated_height, maxh); + + /*If the row height haven't changed invalidate only this cell*/ + if(prev_row_size == table->row_h[row]) { + lv_area_t cell_area; + get_cell_area(obj, row, col, &cell_area); + lv_area_move(&cell_area, obj->coords.x1, obj->coords.y1); + lv_obj_invalidate_area(obj, &cell_area); + } + else { + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); + } +} + +static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, + int32_t letter_space, int32_t line_space, + int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom) +{ + lv_table_t * table = (lv_table_t *)obj; + + int32_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom; + /* Calculate the cell_data index where to start */ + uint32_t row_start = row_id * table->col_cnt; + + /* Traverse the cells in the row_id row */ + uint32_t cell; + uint32_t col; + for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { + lv_table_cell_t * cell_data = table->cell_data[cell]; + + if(is_cell_empty(cell_data)) { + continue; + } + + int32_t txt_w = table->col_w[col]; + + /* Traverse the current row from the first until the penultimate column. + * Increment the text width if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control, + * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ + uint32_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; + if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + txt_w += table->col_w[col + col_merge + 1]; + } + else { + break; + } + } + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data->ctrl; + + /*When cropping the text we can assume the row height is equal to the line height*/ + if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { + h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom, + h_max); + } + /*Else we have to calculate the height of the cell text*/ + else { + lv_point_t txt_size; + txt_w -= cell_left + cell_right; + + lv_text_get_size(&txt_size, table->cell_data[cell]->txt, font, + letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE); + + h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); + /*Skip until one element after the last merged column*/ + cell += col_merge; + col += col_merge; + } + } + + return h_max; +} + +static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_indev_type_t type = lv_indev_get_type(lv_indev_active()); + if(type != LV_INDEV_TYPE_POINTER && type != LV_INDEV_TYPE_BUTTON) { + if(col) *col = LV_TABLE_CELL_NONE; + if(row) *row = LV_TABLE_CELL_NONE; + return LV_RESULT_INVALID; + } + + lv_point_t p; + lv_indev_get_point(lv_indev_active(), &p); + + int32_t tmp; + if(col) { + int32_t x = p.x + lv_obj_get_scroll_x(obj); + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x = obj->coords.x2 - lv_obj_get_style_pad_right(obj, LV_PART_MAIN) - x; + } + else { + x -= obj->coords.x1; + x -= lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + } + + *col = 0; + tmp = 0; + for(*col = 0; *col < table->col_cnt; (*col)++) { + tmp += table->col_w[*col]; + if(x < tmp) break; + } + } + + if(row) { + int32_t y = p.y + lv_obj_get_scroll_y(obj);; + y -= obj->coords.y1; + y -= lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + *row = 0; + tmp = 0; + + for(*row = 0; *row < table->row_cnt; (*row)++) { + tmp += table->row_h[*row]; + if(y < tmp) break; + } + } + + return LV_RESULT_OK; +} + +/* Returns number of bytes to allocate based on chars configuration */ +static size_t get_cell_txt_len(const char * txt) +{ + size_t retval = 0; + +#if LV_USE_ARABIC_PERSIAN_CHARS + retval = sizeof(lv_table_cell_t) + _lv_text_ap_calc_bytes_count(txt) + 1; +#else + retval = sizeof(lv_table_cell_t) + strlen(txt) + 1; +#endif + + return retval; +} + +/* Copy txt into dst skipping the format byte */ +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) +{ +#if LV_USE_ARABIC_PERSIAN_CHARS + _lv_text_ap_proc(txt, dst->txt); +#else + strcpy(dst->txt, txt); +#endif +} + +static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area) +{ + lv_table_t * table = (lv_table_t *)obj; + + uint32_t c; + area->x1 = 0; + for(c = 0; c < col; c++) { + area->x1 += table->col_w[c]; + } + + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + if(rtl) { + area->x1 += lv_obj_get_scroll_x(obj); + int32_t w = lv_obj_get_width(obj); + area->x2 = w - area->x1 - lv_obj_get_style_pad_right(obj, 0); + area->x1 = area->x2 - table->col_w[col]; + } + else { + area->x1 -= lv_obj_get_scroll_x(obj); + area->x1 += lv_obj_get_style_pad_left(obj, 0); + area->x2 = area->x1 + table->col_w[col] - 1; + } + + uint32_t r; + area->y1 = 0; + for(r = 0; r < row; r++) { + area->y1 += table->row_h[r]; + } + + area->y1 += lv_obj_get_style_pad_top(obj, 0); + area->y1 -= lv_obj_get_scroll_y(obj); + area->y2 = area->y1 + table->row_h[row] - 1; + +} + +static void scroll_to_selected_cell(lv_obj_t * obj) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_area_t a; + get_cell_area(obj, table->row_act, table->col_act, &a); + if(a.x1 < 0) { + lv_obj_scroll_by_bounded(obj, -a.x1, 0, LV_ANIM_ON); + } + else if(a.x2 > lv_obj_get_width(obj)) { + lv_obj_scroll_by_bounded(obj, lv_obj_get_width(obj) - a.x2, 0, LV_ANIM_ON); + } + + if(a.y1 < 0) { + lv_obj_scroll_by_bounded(obj, 0, -a.y1, LV_ANIM_ON); + } + else if(a.y2 > lv_obj_get_height(obj)) { + lv_obj_scroll_by_bounded(obj, 0, lv_obj_get_height(obj) - a.y2, LV_ANIM_ON); + } + +} +#endif diff --git a/libraries/lvgl/src/widgets/table/lv_table.h b/libraries/lvgl/src/widgets/table/lv_table.h new file mode 100644 index 0000000..456d794 --- /dev/null +++ b/libraries/lvgl/src/widgets/table/lv_table.h @@ -0,0 +1,231 @@ +/** + * @file lv_table.h + * + */ + +#ifndef LV_TABLE_H +#define LV_TABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../label/lv_label.h" + +#if LV_USE_TABLE != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_table: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +/********************* + * DEFINES + *********************/ +#define LV_TABLE_CELL_NONE 0XFFFF +LV_EXPORT_CONST_INT(LV_TABLE_CELL_NONE); + +/********************** + * TYPEDEFS + **********************/ + +enum _lv_table_cell_ctrl_t { + LV_TABLE_CELL_CTRL_MERGE_RIGHT = 1 << 0, + LV_TABLE_CELL_CTRL_TEXT_CROP = 1 << 1, + LV_TABLE_CELL_CTRL_CUSTOM_1 = 1 << 4, + LV_TABLE_CELL_CTRL_CUSTOM_2 = 1 << 5, + LV_TABLE_CELL_CTRL_CUSTOM_3 = 1 << 6, + LV_TABLE_CELL_CTRL_CUSTOM_4 = 1 << 7, +}; + +#ifdef DOXYGEN +typedef _lv_table_cell_ctrl_t lv_table_cell_ctrl_t; +#else +typedef uint32_t lv_table_cell_ctrl_t; +#endif /*DOXYGEN*/ + +/*Data of cell*/ +typedef struct { + lv_table_cell_ctrl_t ctrl; + void * user_data; /**< Custom user data*/ + char txt[1]; /**< Variable length array*/ +} lv_table_cell_t; + +/*Data of table*/ +typedef struct { + lv_obj_t obj; + uint32_t col_cnt; + uint32_t row_cnt; + lv_table_cell_t ** cell_data; + int32_t * row_h; + int32_t * col_w; + uint32_t col_act; + uint32_t row_act; +} lv_table_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_table_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a table object + * @param parent pointer to an object, it will be the parent of the new table + * @return pointer to the created table + */ +lv_obj_t * lv_table_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param txt text to display in the cell. It will be copied and saved so this variable is not required after this function call. + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt); + +/** + * Set the value of a cell. Memory will be allocated to store the text by the table. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param fmt `printf`-like format + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, + ...) LV_FORMAT_ATTRIBUTE(4, 5); + +/** + * Set the number of rows + * @param obj table pointer to a Table object + * @param row_cnt number of rows + */ +void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt); + +/** + * Set the number of columns + * @param obj table pointer to a Table object + * @param col_cnt number of columns. + */ +void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt); + +/** + * Set the width of a column + * @param obj table pointer to a Table object + * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] + * @param w width of the column + */ +void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w); + +/** + * Add control bits to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Clear control bits of the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Add custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param user_data pointer to the new user_data. + * Should be allocated by `lv_malloc`, + * and it will be freed automatically when the table is deleted or + * when the cell is dropped due to lower row or column count. + */ +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @return text in the cell + */ +const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col); + +/** + * Get the number of rows. + * @param obj table pointer to a Table object + * @return number of rows. + */ +uint32_t lv_table_get_row_count(lv_obj_t * obj); + +/** + * Get the number of columns. + * @param obj table pointer to a Table object + * @return number of columns. + */ +uint32_t lv_table_get_column_count(lv_obj_t * obj); + +/** + * Get the width of a column + * @param obj table pointer to a Table object + * @param col id of the column [0 .. LV_TABLE_COL_MAX -1] + * @return width of the column + */ +int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col); + +/** + * Get whether a cell has the control bits + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + * @return true: all control bits are set; false: not all control bits are set + */ +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Get the selected cell (pressed and or focused) + * @param obj pointer to a table object + * @param row pointer to variable to store the selected row (LV_TABLE_CELL_NONE: if no cell selected) + * @param col pointer to variable to store the selected column (LV_TABLE_CELL_NONE: if no cell selected) + */ +void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); + +/** + * Get custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + */ +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABLE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABLE_H*/ diff --git a/libraries/lvgl/src/widgets/tabview/lv_tabview.c b/libraries/lvgl/src/widgets/tabview/lv_tabview.c new file mode 100644 index 0000000..e6bd368 --- /dev/null +++ b/libraries/lvgl/src/widgets/tabview/lv_tabview.c @@ -0,0 +1,345 @@ +/** + * @file lv_tabview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +#if LV_USE_TABVIEW + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_tabview_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void button_clicked_event_cb(lv_event_t * e); +static void cont_scroll_end_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_tabview_class = { + .constructor_cb = lv_tabview_constructor, + .event_cb = lv_tabview_event, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tabview_t), + .name = "tabview", +}; + +typedef struct { + lv_dir_t tab_pos; + int32_t tab_size; +} lv_tabview_create_info_t; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tabview_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tabview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_t * cont = lv_tabview_get_content(obj); + + lv_obj_t * page = lv_obj_create(cont); + lv_obj_set_size(page, lv_pct(100), lv_pct(100)); + uint32_t tab_idx = lv_obj_get_child_count(cont); + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + + lv_obj_t * button = lv_button_create(tab_bar); + lv_obj_set_flex_grow(button, 1); + lv_obj_set_size(button, lv_pct(100), lv_pct(100)); + lv_obj_add_event_cb(button, button_clicked_event_cb, LV_EVENT_CLICKED, NULL); + lv_group_t * g = lv_group_get_default(); + if(g) lv_group_add_obj(g, button); + + lv_obj_t * label = lv_label_create(button); + lv_label_set_text(label, name); + lv_obj_center(label); + + if(tab_idx == 1) { + lv_tabview_set_active(obj, 0, LV_ANIM_OFF); + } + + return page; +} + +void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t idx, const char * new_name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, idx, &lv_button_class); + lv_obj_t * label = lv_obj_get_child_by_type(button, 0, &lv_label_class); + lv_label_set_text(label, new_name); +} + +void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + lv_obj_t * cont = lv_tabview_get_content(obj); + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + + uint32_t tab_cnt = lv_tabview_get_tab_count(obj); + if(idx >= tab_cnt) { + idx = tab_cnt - 1; + } + + /*To be sure lv_obj_get_content_width will return valid value*/ + lv_obj_update_layout(obj); + + if(cont == NULL) return; + + if((tabview->tab_pos & LV_DIR_VER) != 0) { + int32_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + lv_obj_scroll_to_x(cont, idx * (gap + w), anim_en); + } + else { + int32_t id_rtl = -(int32_t)idx; + lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en); + } + } + else { + int32_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t h = lv_obj_get_content_height(cont); + lv_obj_scroll_to_y(cont, idx * (gap + h), anim_en); + } + + uint32_t i = 0; + lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, i, &lv_button_class); + while(button) { + lv_obj_set_state(button, LV_STATE_CHECKED, i == idx); + i++; + button = lv_obj_get_child_by_type(tab_bar, (int32_t)i, &lv_button_class); + } + + tabview->tab_cur = idx; +} + +void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + switch(dir) { + case LV_DIR_TOP: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + break; + case LV_DIR_BOTTOM: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN_REVERSE); + break; + case LV_DIR_LEFT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + break; + case LV_DIR_RIGHT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_REVERSE); + break; + } + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + lv_obj_t * cont = lv_tabview_get_content(obj); + + switch(dir) { + case LV_DIR_TOP: + case LV_DIR_BOTTOM: + lv_obj_set_width(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); + lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_NONE); + break; + case LV_DIR_LEFT: + case LV_DIR_RIGHT: + lv_obj_set_height(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); + lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_NONE); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); + break; + } + + bool was_ver = tabview->tab_pos & LV_DIR_VER; + bool now_ver = dir & LV_DIR_VER; + + if(was_ver != now_ver) { + int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); + if(now_ver) { + lv_obj_set_size(tab_bar, lv_pct(100), dpi / 2); + } + else { + lv_obj_set_size(tab_bar, dpi, lv_pct(100)); + } + } + tabview->tab_pos = dir; +} + +void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + if(tabview->tab_pos & LV_DIR_VER) { + lv_obj_set_height(tab_bar, size); + } + else { + lv_obj_set_width(tab_bar, size); + } + +} + +uint32_t lv_tabview_get_tab_active(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + return tabview->tab_cur; +} + +uint32_t lv_tabview_get_tab_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + return lv_obj_get_child_count_by_type(tab_bar, &lv_button_class); +} + +lv_obj_t * lv_tabview_get_content(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 1); +} + +lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + tabview->tab_pos = LV_DIR_NONE; /*Invalid value to apply the default TOP direction correctly*/ + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + + lv_obj_t * cont; + + lv_obj_create(obj); + cont = lv_obj_create(obj); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); + + lv_obj_add_event_cb(cont, cont_scroll_end_event_cb, LV_EVENT_ALL, NULL); + lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); + lv_tabview_set_tab_bar_position(obj, LV_DIR_TOP); + + lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_remove_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS); +} + +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + lv_result_t res = lv_obj_event_base(&lv_tabview_class, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * target = lv_event_get_current_target(e); + + if(code == LV_EVENT_SIZE_CHANGED) { + lv_tabview_set_active(target, lv_tabview_get_tab_active(target), LV_ANIM_OFF); + } +} + +static void button_clicked_event_cb(lv_event_t * e) +{ + lv_obj_t * button = lv_event_get_current_target(e); + + lv_obj_t * tv = lv_obj_get_parent(lv_obj_get_parent(button)); + int32_t idx = lv_obj_get_index_by_type(button, &lv_button_class); + lv_tabview_set_active(tv, idx, LV_ANIM_OFF); +} + +static void cont_scroll_end_event_cb(lv_event_t * e) +{ + lv_obj_t * cont = lv_event_get_current_target(e); + lv_event_code_t code = lv_event_get_code(e); + + lv_obj_t * tv = lv_obj_get_parent(cont); + lv_tabview_t * tv_obj = (lv_tabview_t *)tv; + if(code == LV_EVENT_LAYOUT_CHANGED) { + lv_tabview_set_active(tv, lv_tabview_get_tab_active(tv), LV_ANIM_OFF); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_active(); + if(indev && indev->state == LV_INDEV_STATE_PRESSED) { + return; + } + + lv_point_t p; + lv_obj_get_scroll_end(cont, &p); + + int32_t t; + if((tv_obj->tab_pos & LV_DIR_VER) != 0) { + int32_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w; + else t = (p.x + w / 2) / w; + } + else { + int32_t h = lv_obj_get_content_height(cont); + t = (p.y + h / 2) / h; + } + + if(t < 0) t = 0; + bool new_tab = false; + if(t != (int32_t)lv_tabview_get_tab_active(tv)) new_tab = true; + + /*If not scrolled by an indev set the tab immediately*/ + if(lv_indev_active()) { + lv_tabview_set_active(tv, t, LV_ANIM_ON); + } + else { + lv_tabview_set_active(tv, t, LV_ANIM_OFF); + } + + if(new_tab) lv_obj_send_event(tv, LV_EVENT_VALUE_CHANGED, NULL); + } +} +#endif /*LV_USE_TABVIEW*/ diff --git a/libraries/lvgl/src/widgets/tabview/lv_tabview.h b/libraries/lvgl/src/widgets/tabview/lv_tabview.h new file mode 100644 index 0000000..a4e0c76 --- /dev/null +++ b/libraries/lvgl/src/widgets/tabview/lv_tabview.h @@ -0,0 +1,124 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef LV_TABVIEW_H +#define LV_TABVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_TABVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t obj; + uint32_t tab_cur; + lv_dir_t tab_pos; +} lv_tabview_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tabview_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a tabview widget + * @param parent pointer to a parent widget + * @return the created tabview + */ +lv_obj_t * lv_tabview_create(lv_obj_t * parent); + +/** + * Add a tab to the tabview + * @param obj pointer to a tabview widget + * @param name the name of the tab, it will be displayed on the tab bar + * @return the widget where the content of the tab can be created + */ +lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name); + +/** + * Change the name of the tab + * @param obj pointer to a tabview widget + * @param idx the index of the tab to rename + * @param new_name the new name as a string + */ +void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t idx, const char * new_name); + +/** + * Show a tab + * @param obj pointer to a tabview widget + * @param idx the index of the tab to show + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en); + +/** + * Set the position of the tab bar + * @param obj pointer to a tabview widget + * @param dir LV_DIR_TOP/BOTTOM/LEFT/RIGHT + */ +void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set the width or height of the tab bar + * @param size size of the tab bar in pixels or percentage. + * will be used as width or height based on the position of the tab bar) + */ +void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size); + +/** + * Get the number of tabs + * @param obj pointer to a tabview widget + * @return the number of tabs + */ +uint32_t lv_tabview_get_tab_count(lv_obj_t * obj); + +/** + * Get the current tab's index + * @param obj pointer to a tabview widget + * @return the zero based indoex of the current tab + */ +uint32_t lv_tabview_get_tab_active(lv_obj_t * obj); + +/** + * Get the widget where the container of each tab is created + * @param obj pointer to a tabview widget + * @return the main container widget + */ +lv_obj_t * lv_tabview_get_content(lv_obj_t * obj); + +/** + * Get the tab bar where the buttons are created + * @param obj pointer to a tabview widget + * @return the tabbar + */ +lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABVIEW_H*/ diff --git a/libraries/lvgl/src/widgets/textarea/lv_textarea.c b/libraries/lvgl/src/widgets/textarea/lv_textarea.c new file mode 100644 index 0000000..37bf816 --- /dev/null +++ b/libraries/lvgl/src/widgets/textarea/lv_textarea.c @@ -0,0 +1,1393 @@ +/** + * @file lv_ta.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_textarea.h" +#if LV_USE_TEXTAREA != 0 + +#include +#include "../../core/lv_group.h" +#include "../../core/lv_refr.h" +#include "../../indev/lv_indev.h" +#include "../../draw/lv_draw.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_anim.h" +#include "../../misc/lv_text.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_textarea_class) + +/*Test configuration*/ +#ifndef LV_TEXTAREA_DEF_CURSOR_BLINK_TIME + #define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ +#endif + +#ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_TEXTAREA_PWD_BULLET_UNICODE 0x2022 +#define IGNORE_KERNING '\0' + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void label_event_cb(lv_event_t * e); +static void cursor_blink_anim_cb(void * obj, int32_t show); +static void pwd_char_hider_anim(void * obj, int32_t x); +static void pwd_char_hider_anim_completed(lv_anim_t * a); +static void pwd_char_hider(lv_obj_t * obj); +static bool char_is_accepted(lv_obj_t * obj, uint32_t c); +static void start_cursor_blink(lv_obj_t * obj); +static void refr_cursor_area(lv_obj_t * obj); +static void update_cursor_position_on_click(lv_event_t * e); +static lv_result_t insert_handler(lv_obj_t * obj, const char * txt); +static void draw_placeholder(lv_event_t * e); +static void draw_cursor(lv_event_t * e); +static void auto_hide_characters(lv_obj_t * obj); +static inline bool is_valid_but_non_printable_char(const uint32_t letter); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_textarea_class = { + .constructor_cb = lv_textarea_constructor, + .destructor_cb = lv_textarea_destructor, + .event_cb = lv_textarea_event, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_textarea_t), + .base_class = &lv_obj_class, + .name = "textarea", +}; + +static const char * ta_insert_replace; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_textarea_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->one_line && (c == '\n' || c == '\r')) { + LV_LOG_INFO("Text area: line break ignored in one-line mode"); + return; + } + + uint32_t u32_buf[2]; + u32_buf[0] = c; + u32_buf[1] = 0; + + const char * letter_buf = (char *)&u32_buf; + + uint32_t c2 = c; +#if LV_BIG_ENDIAN_SYSTEM + if(c != 0) while(*letter_buf == 0) ++letter_buf; + + /*The byte order may or may not need to be swapped here to get correct c_uni below, + since lv_textarea_add_text is ordering bytes correctly before calling lv_textarea_add_char. + Assume swapping is needed if MSB is zero. May not be foolproof. */ + if((c != 0) && ((c & 0xff000000) == 0)) { + c2 = ((c >> 24) & 0xff) | /*move byte 3 to byte 0*/ + ((c << 8) & 0xff0000) | /*move byte 1 to byte 2*/ + ((c >> 8) & 0xff00) | /*move byte 2 to byte 1*/ + ((c << 24) & 0xff000000); /*byte 0 to byte 3*/ + } +#endif + + lv_result_t res = insert_handler(obj, letter_buf); + if(res != LV_RESULT_OK) return; + + uint32_t c_uni = _lv_text_encoded_next((const char *)&c2, NULL); + + if(char_is_accepted(obj, c_uni) == false) { + LV_LOG_INFO("Character is not accepted by the text area (too long text or not in the accepted list)"); + return; + } + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + lv_label_ins_text(ta->label, ta->cursor.pos, letter_buf); /*Insert the character*/ + lv_textarea_clear_selection(obj); /*Clear selection*/ + + if(ta->pwd_mode) { + /*+2: the new char + \0*/ + size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(letter_buf) + 1; + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + _lv_text_ins(ta->pwd_tmp, ta->cursor.pos, (const char *)letter_buf); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new character*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + 1); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_add_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = _lv_text_encoded_next(txt, &i); + lv_textarea_add_char(obj, _lv_text_unicode_to_encoded(c)); + } + return; + } + + lv_result_t res = insert_handler(obj, txt); + if(res != LV_RESULT_OK) return; + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + /*Insert the text*/ + lv_label_ins_text(ta->label, ta->cursor.pos, txt); + lv_textarea_clear_selection(obj); + + if(ta->pwd_mode) { + size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(txt) + 1; + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + _lv_text_ins(ta->pwd_tmp, ta->cursor.pos, txt); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new text*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + _lv_text_get_encoded_length(txt)); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_delete_char(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t cur_pos = ta->cursor.pos; + + if(cur_pos == 0) return; + + char del_buf[2] = {LV_KEY_DEL, '\0'}; + + lv_result_t res = insert_handler(obj, del_buf); + if(res != LV_RESULT_OK) return; + + char * label_txt = lv_label_get_text(ta->label); + + /*Delete a character*/ + _lv_text_cut(label_txt, ta->cursor.pos - 1, 1); + + /*Refresh the label*/ + lv_label_set_text(ta->label, label_txt); + lv_textarea_clear_selection(obj); + + /*If the textarea became empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + _lv_text_cut(ta->pwd_tmp, ta->cursor.pos - 1, 1); + + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, lv_strlen(ta->pwd_tmp) + 1); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + } + + /*Move the cursor to the place of the deleted character*/ + lv_textarea_set_cursor_pos(obj, ta->cursor.pos - 1); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + +} + +void lv_textarea_delete_char_forward(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + lv_textarea_set_cursor_pos(obj, cp + 1); + if(cp != lv_textarea_get_cursor_pos(obj)) lv_textarea_delete_char(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_textarea_set_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Clear the existing selection*/ + lv_textarea_clear_selection(obj); + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + lv_label_set_text(ta->label, ""); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + if(ta->pwd_mode) { + ta->pwd_tmp[0] = '\0'; /*Clear the password too*/ + } + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = _lv_text_encoded_next(txt, &i); + lv_textarea_add_char(obj, _lv_text_unicode_to_encoded(c)); + } + } + else { + lv_label_set_text(ta->label, txt); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + } + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + ta->pwd_tmp = lv_strdup(txt); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + size_t txt_len = lv_strlen(txt); + if((txt_len == 0) && (ta->placeholder_txt)) { + lv_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } + else { + /*Allocate memory for the placeholder_txt text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->placeholder_txt = lv_realloc(ta->placeholder_txt, txt_len + 1); + LV_ASSERT_MALLOC(ta->placeholder_txt); + if(ta->placeholder_txt == NULL) { + LV_LOG_ERROR("couldn't allocate memory for placeholder"); + return; + } + + lv_strcpy(ta->placeholder_txt, txt); + ta->placeholder_txt[txt_len] = '\0'; + } + + lv_obj_invalidate(obj); +} + +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if((uint32_t)ta->cursor.pos == (uint32_t)pos) return; + + uint32_t len = _lv_text_get_encoded_length(lv_label_get_text(ta->label)); + + if(pos < 0) pos = len + pos; + + if(pos > (int32_t)len || pos == LV_TEXTAREA_CURSOR_LAST) pos = len; + + ta->cursor.pos = pos; + + /*Position the label to make the cursor visible*/ + lv_obj_update_layout(obj); + + lv_point_t cur_pos; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_label_get_letter_pos(ta->label, pos, &cur_pos); + + /*The text area needs to have it's final size to see if the cursor is out of the area or not*/ + + /*Check the top*/ + int32_t font_h = lv_font_get_line_height(font); + if(cur_pos.y < lv_obj_get_scroll_top(obj)) { + lv_obj_scroll_to_y(obj, cur_pos.y, LV_ANIM_ON); + } + /*Check the bottom*/ + int32_t h = lv_obj_get_content_height(obj); + if(cur_pos.y + font_h - lv_obj_get_scroll_top(obj) > h) { + lv_obj_scroll_to_y(obj, cur_pos.y - h + font_h, LV_ANIM_ON); + } + + /*Check the left*/ + if(cur_pos.x < lv_obj_get_scroll_left(obj)) { + lv_obj_scroll_to_x(obj, cur_pos.x, LV_ANIM_ON); + } + /*Check the right*/ + int32_t w = lv_obj_get_content_width(obj); + if(cur_pos.x + font_h - lv_obj_get_scroll_left(obj) > w) { + lv_obj_scroll_to_x(obj, cur_pos.x - w + font_h, LV_ANIM_ON); + } + + ta->cursor.valid_x = cur_pos.x; + + start_cursor_blink(obj); + + refr_cursor_area(obj); +} + +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->cursor.click_pos = en ? 1U : 0U; +} + +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == en) return; + + ta->pwd_mode = en ? 1U : 0U; + /*Pwd mode is now enabled*/ + if(en) { + char * txt = lv_label_get_text(ta->label); + ta->pwd_tmp = lv_strdup(txt); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + pwd_char_hider(obj); + + lv_textarea_clear_selection(obj); + } + /*Pwd mode is now disabled*/ + else { + lv_textarea_clear_selection(obj); + lv_label_set_text(ta->label, ta->pwd_tmp); + lv_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + + refr_cursor_area(obj); +} + +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(bullet); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(!bullet && (ta->pwd_bullet)) { + lv_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + else { + size_t txt_len = lv_strlen(bullet); + + /*Allocate memory for the pwd_bullet text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->pwd_bullet = lv_realloc(ta->pwd_bullet, txt_len + 1); + LV_ASSERT_MALLOC(ta->pwd_bullet); + if(ta->pwd_bullet == NULL) { + LV_LOG_ERROR("couldn't allocate memory for bullet"); + return; + } + + lv_memcpy(ta->pwd_bullet, bullet, txt_len); + ta->pwd_bullet[txt_len] = '\0'; + } + + lv_obj_invalidate(obj); +} + +void lv_textarea_set_one_line(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->one_line == en) return; + + ta->one_line = en ? 1U : 0U; + int32_t width = en ? LV_SIZE_CONTENT : lv_pct(100); + int32_t min_width_value = en ? lv_pct(100) : 0; + + lv_obj_set_width(ta->label, width); + lv_obj_set_style_min_width(ta->label, min_width_value, 0); + + if(en) { + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else { + lv_obj_remove_local_style_prop(obj, LV_STYLE_HEIGHT, LV_PART_MAIN); + } + + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); +} + +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->accepted_chars = list; +} + +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->max_length = num; +} + +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + LV_UNUSED(obj); + ta_insert_replace = txt; +} + +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->text_sel_en = en; + + if(!en) lv_textarea_clear_selection(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(en); /*Unused*/ +#endif +} + +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->pwd_show_time = time; +} + +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + LV_LOG_WARN("Deprecated: use the normal text_align style property instead"); + lv_obj_set_style_text_align(obj, align, 0); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_MID, 0, 0); + break; + } +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_textarea_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const char * txt; + if(ta->pwd_mode == 0) { + txt = lv_label_get_text(ta->label); + } + else { + txt = ta->pwd_tmp; + } + + return txt; +} + +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->placeholder_txt) return ta->placeholder_txt; + else return ""; +} + +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->label; +} + +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.pos; +} + +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.click_pos; +} + +bool lv_textarea_get_password_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->pwd_mode == 1U; +} + +const char * lv_textarea_get_password_bullet(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_bullet) return ta->pwd_bullet; + + lv_font_glyph_dsc_t g; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + + /*If the textarea's font has the bullet character use it else fallback to "*"*/ + if(lv_font_get_glyph_dsc(font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, 0)) + return LV_SYMBOL_BULLET; + return "*"; +} + +bool lv_textarea_get_one_line(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->one_line == 1U; +} + +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->accepted_chars; +} + +uint32_t lv_textarea_get_max_length(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->max_length; +} + +bool lv_textarea_text_is_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if((lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL)) { + return true; + } + else { + return false; + } +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +bool lv_textarea_get_text_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->text_sel_en; +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->pwd_show_time; +} + +uint32_t lv_textarea_get_current_char(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const char * txt = lv_textarea_get_text(obj); + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t pos = ta->cursor.pos; + if(_lv_text_get_encoded_length(txt) >= pos && pos > 0) + return _lv_text_encoded_prev(txt, &pos); + else + return 0; +} + +/*===================== + * Other functions + *====================*/ + +void lv_textarea_clear_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL) { + lv_label_set_text_selection_start(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + lv_label_set_text_selection_end(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + } +#else + LV_UNUSED(obj); /*Unused*/ +#endif +} + +void lv_textarea_cursor_right(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + cp++; + lv_textarea_set_cursor_pos(obj, cp); +} + +void lv_textarea_cursor_left(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + if(cp > 0) { + cp--; + lv_textarea_set_cursor_pos(obj, cp); + } +} + +void lv_textarea_cursor_down(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Increment the y with one line and keep the valid x*/ + + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + pos.y += font_h + line_space + 1; + pos.x = ta->cursor.valid_x; + + /*Do not go below the last line*/ + if(pos.y < lv_obj_get_height(ta->label)) { + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); + + int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; + } +} + +void lv_textarea_cursor_up(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Decrement the y with one line and keep the valid x*/ + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + pos.y -= font_h + line_space - 1; + pos.x = ta->cursor.valid_x; + + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); + int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->pwd_mode = 0; + ta->pwd_tmp = NULL; + ta->pwd_bullet = NULL; + ta->pwd_show_time = LV_TEXTAREA_DEF_PWD_SHOW_TIME; + ta->accepted_chars = NULL; + ta->max_length = 0; + ta->cursor.show = 1; + /*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); wouldn't do anything as there is no difference)*/ + ta->cursor.pos = 1; + ta->cursor.click_pos = 1; + ta->cursor.valid_x = 0; + ta->one_line = 0; +#if LV_LABEL_TEXT_SELECTION + ta->text_sel_en = 0; +#endif + ta->label = NULL; + ta->placeholder_txt = NULL; + + ta->label = lv_label_create(obj); + lv_obj_set_width(ta->label, lv_pct(100)); + lv_label_set_text(ta->label, ""); + lv_obj_add_event_cb(ta->label, label_event_cb, LV_EVENT_ALL, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); + + lv_textarea_set_cursor_pos(obj, 0); + + start_cursor_blink(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_tmp != NULL) { + lv_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + if(ta->pwd_bullet != NULL) { + lv_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + if(ta->placeholder_txt != NULL) { + lv_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } +} + +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_FOCUSED) { + start_cursor_blink(obj); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) + lv_textarea_cursor_right(obj); + else if(c == LV_KEY_LEFT) + lv_textarea_cursor_left(obj); + else if(c == LV_KEY_UP) + lv_textarea_cursor_up(obj); + else if(c == LV_KEY_DOWN) + lv_textarea_cursor_down(obj); + else if(c == LV_KEY_BACKSPACE) + lv_textarea_delete_char(obj); + else if(c == LV_KEY_DEL) + lv_textarea_delete_char_forward(obj); + else if(c == LV_KEY_HOME) + lv_textarea_set_cursor_pos(obj, 0); + else if(c == LV_KEY_END) + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + else if(c == LV_KEY_ENTER && lv_textarea_get_one_line(obj)) + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + else { + lv_textarea_add_char(obj, c); + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_RELEASED) { + update_cursor_position_on_click(e); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_placeholder(e); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_cursor(e); + } +} + +static void label_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * label = lv_event_get_current_target(e); + lv_obj_t * ta = lv_obj_get_parent(label); + + if(code == LV_EVENT_STYLE_CHANGED || code == LV_EVENT_SIZE_CHANGED) { + lv_label_set_text(label, NULL); + refr_cursor_area(ta); + start_cursor_blink(ta); + } +} + +/** + * Called to blink the cursor + * @param ta pointer to a text area + * @param hide 1: hide the cursor, 0: show it + */ +static void cursor_blink_anim_cb(void * obj, int32_t show) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(show != ta->cursor.show) { + ta->cursor.show = show ? 1U : 0U; + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + } +} + +/** + * Dummy function to animate char hiding in pwd mode. + * Does nothing, but a function is required in car hiding anim. + * (pwd_char_hider callback do the real job) + * @param ta unused + * @param x unused + */ +static void pwd_char_hider_anim(void * obj, int32_t x) +{ + LV_UNUSED(obj); + LV_UNUSED(x); +} + +/** + * Call when an animation is ready to convert all characters to '*' + * @param a pointer to the animation + */ +static void pwd_char_hider_anim_completed(lv_anim_t * a) +{ + lv_obj_t * obj = a->var; + pwd_char_hider(obj); +} + +/** + * Hide all characters (convert them to '*') + * @param ta pointer to text area object + */ +static void pwd_char_hider(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == 0) { + return; + } + + /* When ta->label is empty we get 0 back */ + char * txt = lv_label_get_text(ta->label); + uint32_t enc_len = _lv_text_get_encoded_length(txt); + if(enc_len == 0) return; + + const char * bullet = lv_textarea_get_password_bullet(obj); + const size_t bullet_len = lv_strlen(bullet); + char * txt_tmp = lv_malloc(enc_len * bullet_len + 1); + + uint32_t i; + for(i = 0; i < enc_len; i++) { + lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len); + } + txt_tmp[i * bullet_len] = '\0'; + + lv_label_set_text(ta->label, txt_tmp); + lv_free(txt_tmp); + + refr_cursor_area(obj); +} + +/** + * Test a unicode character if it is accepted or not. Checks max length and accepted char list. + * @param ta pointer to a test area object + * @param c a unicode character + * @return true: accepted; false: rejected + */ +static bool char_is_accepted(lv_obj_t * obj, uint32_t c) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Too many characters?*/ + if(ta->max_length > 0 && _lv_text_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) { + return false; + } + + if(ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') return true; + /*Accepted character?*/ + uint32_t i = 0; + + while(ta->accepted_chars[i] != '\0') { + uint32_t a = _lv_text_encoded_next(ta->accepted_chars, &i); + if(a == c) return true; /*Accepted*/ + } + + return false; /*The character wasn't in the list*/ +} + +static void start_cursor_blink(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t blink_time = lv_obj_get_style_anim_duration(obj, LV_PART_CURSOR); + if(blink_time == 0) { + lv_anim_delete(obj, cursor_blink_anim_cb); + ta->cursor.show = 1; + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, cursor_blink_anim_cb); + lv_anim_set_duration(&a, blink_time); + lv_anim_set_playback_duration(&a, blink_time); + lv_anim_set_values(&a, 1, 0); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_start(&a); + } +} + +static void refr_cursor_area(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + + uint32_t cur_pos = lv_textarea_get_cursor_pos(obj); + const char * txt = lv_label_get_text(ta->label); + + uint32_t byte_pos = _lv_text_encoded_get_byte_id(txt, cur_pos); + uint32_t letter = _lv_text_encoded_next(&txt[byte_pos], NULL); + + /* Letter height and width */ + const int32_t letter_h = lv_font_get_line_height(font); + /*Set letter_w (set not 0 on non printable but valid chars)*/ + uint32_t letter_space = letter; + if(is_valid_but_non_printable_char(letter)) { + letter_space = ' '; + } + int32_t letter_w = lv_font_get_glyph_width(font, letter_space, IGNORE_KERNING); + + lv_point_t letter_pos; + lv_label_get_letter_pos(ta->label, cur_pos, &letter_pos); + + lv_text_align_t align = lv_obj_calculate_style_text_align(ta->label, LV_PART_MAIN, lv_label_get_text(ta->label)); + + /*If the cursor is out of the text (most right) draw it to the next line*/ + if(((letter_pos.x + ta->label->coords.x1) + letter_w > ta->label->coords.x2) && + (ta->one_line == 0 && align != LV_TEXT_ALIGN_RIGHT)) { + + letter_pos.x = 0; + letter_pos.y += letter_h + line_space; + + if(letter != '\0') { + byte_pos += _lv_text_encoded_size(&txt[byte_pos]); + letter = _lv_text_encoded_next(&txt[byte_pos], NULL); + } + + uint32_t tmp = letter; + if(is_valid_but_non_printable_char(letter)) { + tmp = ' '; + } + letter_w = lv_font_get_glyph_width(font, tmp, IGNORE_KERNING); + } + + /*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/ + ta->cursor.txt_byte_pos = byte_pos; + + /*Calculate the cursor according to its type*/ + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR) + border_width; + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR) + border_width; + + lv_area_t cur_area; + cur_area.x1 = letter_pos.x - left; + cur_area.y1 = letter_pos.y - top; + cur_area.x2 = letter_pos.x + right + letter_w - 1; + cur_area.y2 = letter_pos.y + bottom + letter_h - 1; + + /*Save the new area*/ + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + + lv_area_copy(&ta->cursor.area, &cur_area); + + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); +} + +static void update_cursor_position_on_click(lv_event_t * e) +{ + lv_indev_t * click_source = lv_indev_active(); + if(click_source == NULL) return; + + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->cursor.click_pos == 0) return; + + if(lv_indev_get_type(click_source) == LV_INDEV_TYPE_KEYPAD || + lv_indev_get_type(click_source) == LV_INDEV_TYPE_ENCODER) { + return; + } + + lv_area_t label_coords; + lv_obj_get_coords(ta->label, &label_coords); + + lv_point_t point_act, vect_act; + lv_indev_get_point(click_source, &point_act); + lv_indev_get_vect(click_source, &vect_act); + + if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ + lv_point_t rel_pos; + rel_pos.x = point_act.x - label_coords.x1; + rel_pos.y = point_act.y - label_coords.y1; + + const lv_event_code_t code = lv_event_get_code(e); + + int32_t label_width = lv_obj_get_width(ta->label); + uint32_t char_id_at_click = 0; + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label_data = (lv_label_t *)ta->label; + bool click_outside_label = false; + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + click_outside_label = true; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + click_outside_label = true; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); + click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos); + } + + if(ta->text_sel_en) { + if(!ta->text_sel_in_prog && !click_outside_label && code == LV_EVENT_PRESSED) { + /*Input device just went down. Store the selection start position*/ + ta->sel_start = char_id_at_click; + ta->sel_end = LV_LABEL_TEXT_SELECTION_OFF; + ta->text_sel_in_prog = 1; + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + else if(ta->text_sel_in_prog && code == LV_EVENT_PRESSING) { + /*Input device may be moving. Store the end position*/ + ta->sel_end = char_id_at_click; + } + else if(ta->text_sel_in_prog && (code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED)) { + /*Input device is released. Check if anything was selected.*/ + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + } + + if(ta->text_sel_in_prog || code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); + + if(ta->text_sel_in_prog) { + /*If the selected area has changed then update the real values and*/ + + /*Invalidate the text area.*/ + if(ta->sel_start > ta->sel_end) { + if(label_data->sel_start != ta->sel_end || label_data->sel_end != ta->sel_start) { + label_data->sel_start = ta->sel_end; + label_data->sel_end = ta->sel_start; + lv_obj_invalidate(obj); + } + } + else if(ta->sel_start < ta->sel_end) { + if(label_data->sel_start != ta->sel_start || label_data->sel_end != ta->sel_end) { + label_data->sel_start = ta->sel_start; + label_data->sel_end = ta->sel_end; + lv_obj_invalidate(obj); + } + } + else { + if(label_data->sel_start != LV_DRAW_LABEL_NO_TXT_SEL || label_data->sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_data->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label_data->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + lv_obj_invalidate(obj); + } + } + /*Finish selection if necessary*/ + if(code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED) { + ta->text_sel_in_prog = 0; + } + } +#else + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); + } + + if(code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); +#endif +} + +/* Returns LV_RESULT_OK when no operation were performed + * Returns LV_RESULT_INVALID when a user defined text was inserted */ +static lv_result_t insert_handler(lv_obj_t * obj, const char * txt) +{ + ta_insert_replace = NULL; + lv_obj_send_event(obj, LV_EVENT_INSERT, (char *)txt); + + /* Drop txt if insert replace is set to '\0' */ + if(ta_insert_replace && ta_insert_replace[0] == '\0') + return LV_RESULT_INVALID; + + if(ta_insert_replace) { + /*Add the replaced text directly it's different from the original*/ + if(lv_strcmp(ta_insert_replace, txt)) { + lv_textarea_add_text(obj, ta_insert_replace); + return LV_RESULT_INVALID; + } + } + + return LV_RESULT_OK; +} + +static void draw_placeholder(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + const char * txt = lv_label_get_text(ta->label); + + /*Draw the place holder*/ + if(txt[0] == '\0' && ta->placeholder_txt && ta->placeholder_txt[0] != 0) { + lv_draw_label_dsc_t ph_dsc; + lv_draw_label_dsc_init(&ph_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TEXTAREA_PLACEHOLDER, &ph_dsc); + + if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; + + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_area_t ph_coords; + lv_area_copy(&ph_coords, &obj->coords); + lv_area_move(&ph_coords, left + border_width, top + border_width); + ph_dsc.text = ta->placeholder_txt; + lv_draw_label(layer, &ph_dsc, &ph_coords); + } +} + +static void draw_cursor(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + const char * txt = lv_label_get_text(ta->label); + + if(ta->cursor.show == 0) return; + + lv_draw_rect_dsc_t cur_dsc; + lv_draw_rect_dsc_init(&cur_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &cur_dsc); + + /*Draw he cursor according to the type*/ + lv_area_t cur_area; + lv_area_copy(&cur_area, &ta->cursor.area); + + cur_area.x1 += ta->label->coords.x1; + cur_area.y1 += ta->label->coords.y1; + cur_area.x2 += ta->label->coords.x1; + cur_area.y2 += ta->label->coords.y1; + + lv_draw_rect(layer, &cur_dsc, &cur_area); + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + char letter_buf[8] = {0}; + lv_memcpy(letter_buf, &txt[ta->cursor.txt_byte_pos], _lv_text_encoded_size(&txt[ta->cursor.txt_byte_pos])); + + cur_area.x1 += left; + cur_area.y1 += top; + + /*Draw the letter over the cursor only if + *the cursor has background or the letter has different color than the original. + *Else the original letter is drawn twice which makes it look bolder*/ + lv_color_t label_color = lv_obj_get_style_text_color(ta->label, 0); + lv_draw_label_dsc_t cur_label_dsc; + lv_draw_label_dsc_init(&cur_label_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_CURSOR, &cur_label_dsc); + if(cur_dsc.bg_opa > LV_OPA_MIN || !lv_color_eq(cur_label_dsc.color, label_color)) { + cur_label_dsc.text = letter_buf; + cur_label_dsc.text_local = true; + lv_draw_label(layer, &cur_label_dsc, &cur_area); + } +} + +static void auto_hide_characters(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *) obj; + + if(ta->pwd_show_time == 0) { + pwd_char_hider(obj); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, pwd_char_hider_anim); + lv_anim_set_duration(&a, ta->pwd_show_time); + lv_anim_set_values(&a, 0, 1); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_completed_cb(&a, pwd_char_hider_anim_completed); + lv_anim_start(&a); + } +} + +static inline bool is_valid_but_non_printable_char(const uint32_t letter) +{ + if(letter == '\0' || letter == '\n' || letter == '\r') { + return true; + } + + return false; +} + +#endif diff --git a/libraries/lvgl/src/widgets/textarea/lv_textarea.h b/libraries/lvgl/src/widgets/textarea/lv_textarea.h new file mode 100644 index 0000000..0db80eb --- /dev/null +++ b/libraries/lvgl/src/widgets/textarea/lv_textarea.h @@ -0,0 +1,362 @@ +/** + * @file lv_textarea.h + * + */ + +#ifndef LV_TEXTAREA_H +#define LV_TEXTAREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../label/lv_label.h" + +#if LV_USE_TEXTAREA != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_textarea: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +/********************* + * DEFINES + *********************/ +#define LV_TEXTAREA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ + +LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); + +/********************** + * TYPEDEFS + **********************/ + +/*Data of text area*/ +typedef struct { + lv_obj_t obj; + lv_obj_t * label; /*Label of the text area*/ + char * placeholder_txt; /*Place holder label. only visible if text is an empty string*/ + char * pwd_tmp; /*Used to store the original text in password mode*/ + char * pwd_bullet; /*Replacement characters displayed in password mode*/ + const char * accepted_chars; /*Only these characters will be accepted. NULL: accept all*/ + uint32_t max_length; /*The max. number of characters. 0: no limit*/ + uint32_t pwd_show_time; /*Time to show characters in password mode before change them to '*'*/ + struct { + int32_t valid_x; /*Used when stepping up/down to a shorter line. + *(Used by the library)*/ + uint32_t pos; /*The current cursor position + *(0: before 1st letter; 1: before 2nd letter ...)*/ + lv_area_t area; /*Cursor area relative to the Text Area*/ + uint32_t txt_byte_pos; /*Byte index of the letter after (on) the cursor*/ + uint8_t show : 1; /*Cursor is visible now or not (Handled by the library)*/ + uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ + } cursor; +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; /*Temporary values for text selection*/ + uint32_t sel_end; + uint8_t text_sel_in_prog : 1; /*User is in process of selecting*/ + uint8_t text_sel_en : 1; /*Text can be selected on this text area*/ +#endif + uint8_t pwd_mode : 1; /*Replace characters with '*'*/ + uint8_t one_line : 1; /*One line mode (ignore line breaks)*/ +} lv_textarea_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_textarea_class; + +enum { + LV_PART_TEXTAREA_PLACEHOLDER = LV_PART_CUSTOM_FIRST, +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a text area object + * @param parent pointer to an object, it will be the parent of the new text area + * @return pointer to the created text area + */ +lv_obj_t * lv_textarea_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/** + * Insert a character to the current cursor position. + * To add a wide char, e.g. 'Á' use `_lv_text_encoded_conv_wc('Á')` + * @param obj pointer to a text area object + * @param c a character (e.g. 'a') + */ +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c); + +/** + * Insert a text to the current cursor position + * @param obj pointer to a text area object + * @param txt a '\0' terminated string to insert + */ +void lv_textarea_add_text(lv_obj_t * obj, const char * txt); + +/** + * Delete a the left character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_delete_char(lv_obj_t * obj); + +/** + * Delete the right character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_delete_char_forward(lv_obj_t * obj); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the placeholder text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt); + +/** + * Set the cursor position + * @param obj pointer to a text area object + * @param pos the new cursor position in character index + * < 0 : index from the end of the text + * LV_TEXTAREA_CURSOR_LAST: go after the last character + */ +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos); + +/** + * Enable/Disable the positioning of the cursor by clicking the text on the text area. + * @param obj pointer to a text area object + * @param en true: enable click positions; false: disable + */ +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en); + +/** + * Enable/Disable password mode + * @param obj pointer to a text area object + * @param en true: enable, false: disable + */ +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en); + +/** + * Set the replacement characters to show in password mode + * @param obj pointer to a text area object + * @param bullet pointer to the replacement text + */ +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet); + +/** + * Configure the text area to one line or back to normal + * @param obj pointer to a text area object + * @param en true: one line, false: normal + */ +void lv_textarea_set_one_line(lv_obj_t * obj, bool en); + +/** + * Set a list of characters. Only these characters will be accepted by the text area + * @param obj pointer to a text area object + * @param list list of characters. Only the pointer is saved. E.g. "+-.,0123456789" + */ +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list); + +/** + * Set max length of a Text Area. + * @param obj pointer to a text area object + * @param num the maximal number of characters can be added (`lv_textarea_set_text` ignores it) + */ +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num); + +/** + * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by an other text. + * It can be used to add automatic formatting to the text area. + * @param obj pointer to a text area object + * @param txt pointer to a new string to insert. If `""` no text will be added. + * The variable must be live after the `event_cb` exists. (Should be `global` or `static`) + */ +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt); + +/** + * Enable/disable selection mode. + * @param obj pointer to a text area object + * @param en true or false to enable/disable selection mode + */ +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @param time show time in milliseconds. 0: hide immediately. + */ +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time); + +/** + * @deprecated Use the normal text_align style property instead + * Set the label's alignment. + * It sets where the label is aligned (in one line mode it can be smaller than the text area) + * and how the lines of the area align in case of multiline text area + * @param obj pointer to a text area object + * @param align the align mode from ::lv_text_align_t + */ +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a text area. In password mode it gives the real text (not '*'s). + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_text(const lv_obj_t * obj); + +/** + * Get the placeholder text of a text area + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj); + +/** + * Get the label of a text area + * @param obj pointer to a text area object + * @return pointer to the label object + */ +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj); + +/** + * Get the current cursor position in character index + * @param obj pointer to a text area object + * @return the cursor position + */ +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj); + +/** + * Get whether the cursor click positioning is enabled or not. + * @param obj pointer to a text area object + * @return true: enable click positions; false: disable + */ +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj); + +/** + * Get the password mode attribute + * @param obj pointer to a text area object + * @return true: password mode is enabled, false: disabled + */ +bool lv_textarea_get_password_mode(const lv_obj_t * obj); + +/** + * Get the replacement characters to show in password mode + * @param obj pointer to a text area object + * @return pointer to the replacement text + */ +const char * lv_textarea_get_password_bullet(lv_obj_t * obj); + +/** + * Get the one line configuration attribute + * @param obj pointer to a text area object + * @return true: one line configuration is enabled, false: disabled + */ +bool lv_textarea_get_one_line(const lv_obj_t * obj); + +/** + * Get a list of accepted characters. + * @param obj pointer to a text area object + * @return list of accented characters. + */ +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj); + +/** + * Get max length of a Text Area. + * @param obj pointer to a text area object + * @return the maximal number of characters to be add + */ +uint32_t lv_textarea_get_max_length(lv_obj_t * obj); + +/** + * Find whether text is selected or not. + * @param obj pointer to a text area object + * @return whether text is selected or not + */ +bool lv_textarea_text_is_selected(const lv_obj_t * obj); + +/** + * Find whether selection mode is enabled. + * @param obj pointer to a text area object + * @return true: selection mode is enabled, false: disabled + */ +bool lv_textarea_get_text_selection(lv_obj_t * obj); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @return show time in milliseconds. 0: hide immediately. + */ +uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj); + +/** + * Get a the character from the current cursor position + * @param obj pointer to a text area object + * @return a the character or 0 + */ +uint32_t lv_textarea_get_current_char(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Clear the selection on the text area. + * @param obj pointer to a text area object + */ +void lv_textarea_clear_selection(lv_obj_t * obj); + +/** + * Move the cursor one character right + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_right(lv_obj_t * obj); + +/** + * Move the cursor one character left + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_left(lv_obj_t * obj); + +/** + * Move the cursor one line down + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_down(lv_obj_t * obj); + +/** + * Move the cursor one line up + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_up(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEXTAREA_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXTAREA_H*/ diff --git a/libraries/lvgl/src/widgets/tileview/lv_tileview.c b/libraries/lvgl/src/widgets/tileview/lv_tileview.c new file mode 100644 index 0000000..400ca15 --- /dev/null +++ b/libraries/lvgl/src/widgets/tileview/lv_tileview.c @@ -0,0 +1,190 @@ +/** + * @file lv_tileview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tileview.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_private.h" +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void tileview_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_tileview_class = { + .constructor_cb = lv_tileview_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_t), + .name = "tileview", +}; + +const lv_obj_class_t lv_tileview_tile_class = { + .constructor_cb = lv_tileview_tile_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_tile_t), + .name = "tile", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tileview_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv); + lv_obj_class_init_obj(obj); + lv_obj_set_pos(obj, lv_pct(col_id * 100), lv_pct(row_id * 100)); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)obj; + tile->dir = dir; + + if(col_id == 0 && row_id == 0) { + lv_obj_set_scroll_dir(tv, dir); + } + return obj; +} + +void lv_tileview_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en) +{ + int32_t tx = lv_obj_get_x(tile_obj); + int32_t ty = lv_obj_get_y(tile_obj); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + lv_tileview_t * tv = (lv_tileview_t *) obj; + tv->tile_act = (lv_obj_t *)tile; + + lv_obj_set_scroll_dir(obj, tile->dir); + lv_obj_scroll_to(obj, tx, ty, anim_en); +} + +void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(tv); + + int32_t w = lv_obj_get_content_width(tv); + int32_t h = lv_obj_get_content_height(tv); + + int32_t tx = col_id * w; + int32_t ty = row_id * h; + + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(tv); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(tv, i); + int32_t x = lv_obj_get_x(tile_obj); + int32_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_tileview_set_tile(tv, tile_obj, anim_en); + return; + } + } + + LV_LOG_WARN("No tile found with at (%d,%d) index", (int)col_id, (int)row_id); +} + +lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj) +{ + lv_tileview_t * tv = (lv_tileview_t *) obj; + return tv->tile_act; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_add_event_cb(obj, tileview_event_cb, LV_EVENT_ALL, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scroll_snap_y(obj, LV_SCROLL_SNAP_CENTER); + +} + +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + + LV_UNUSED(class_p); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_update_layout(obj); /*Be sure the size is correct*/ +} + +static void tileview_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_tileview_t * tv = (lv_tileview_t *) obj; + + if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_active(); + if(indev && indev->state == LV_INDEV_STATE_PRESSED) { + return; + } + + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + lv_point_t scroll_end; + lv_obj_get_scroll_end(obj, &scroll_end); + int32_t left = scroll_end.x; + int32_t top = scroll_end.y; + + int32_t tx = ((left + (w / 2)) / w) * w; + int32_t ty = ((top + (h / 2)) / h) * h; + + lv_dir_t dir = LV_DIR_ALL; + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(obj); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(obj, i); + int32_t x = lv_obj_get_x(tile_obj); + int32_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + tv->tile_act = (lv_obj_t *)tile; + dir = tile->dir; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + break; + } + } + lv_obj_set_scroll_dir(obj, dir); + } +} +#endif /*LV_USE_TILEVIEW*/ diff --git a/libraries/lvgl/src/widgets/tileview/lv_tileview.h b/libraries/lvgl/src/widgets/tileview/lv_tileview.h new file mode 100644 index 0000000..6413a1b --- /dev/null +++ b/libraries/lvgl/src/widgets/tileview/lv_tileview.h @@ -0,0 +1,72 @@ +/** + * @file lv_tileview.h + * + */ + +#ifndef LV_TILEVIEW_H +#define LV_TILEVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_obj_t obj; + lv_obj_t * tile_act; +} lv_tileview_t; + +typedef struct { + lv_obj_t obj; + lv_dir_t dir; +} lv_tileview_tile_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_tile_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Tileview object + * @param parent pointer to an object, it will be the parent of the new tileview + * @return pointer to the created tileview + */ +lv_obj_t * lv_tileview_create(lv_obj_t * parent); + +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir); + +void lv_tileview_set_tile(lv_obj_t * tv, lv_obj_t * tile_obj, lv_anim_enable_t anim_en); +void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en); + +lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TILEVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TILEVIEW_H*/ diff --git a/libraries/lvgl/src/widgets/win/lv_win.c b/libraries/lvgl/src/widgets/win/lv_win.c new file mode 100644 index 0000000..437b3af --- /dev/null +++ b/libraries/lvgl/src/widgets/win/lv_win.c @@ -0,0 +1,108 @@ +/** + * @file lv_win.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" +#if LV_USE_WIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_win_class = { + .constructor_cb = lv_win_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_win_t), + .name = "win", +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_win_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_win_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * title = lv_label_create(header); + lv_label_set_long_mode(title, LV_LABEL_LONG_DOT); + lv_label_set_text(title, txt); + lv_obj_set_flex_grow(title, 1); + return title; +} + +lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * btn = lv_button_create(header); + lv_obj_set_size(btn, btn_w, LV_PCT(100)); + + if(icon) { + lv_obj_t * img = lv_image_create(btn); + lv_image_set_src(img, icon); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_win_get_header(lv_obj_t * win) +{ + return lv_obj_get_child(win, 0); +} + +lv_obj_t * lv_win_get_content(lv_obj_t * win) +{ + return lv_obj_get_child(win, 1); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_obj_set_size(obj, lv_obj_get_width(parent), lv_obj_get_height(parent)); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + lv_obj_t * header = lv_obj_create(obj); + lv_obj_set_size(header, LV_PCT(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 2); + lv_obj_set_flex_flow(header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_obj_t * cont = lv_obj_create(obj); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_width(cont, LV_PCT(100)); +} + +#endif diff --git a/libraries/lvgl/src/widgets/win/lv_win.h b/libraries/lvgl/src/widgets/win/lv_win.h new file mode 100644 index 0000000..0f6d5a4 --- /dev/null +++ b/libraries/lvgl/src/widgets/win/lv_win.h @@ -0,0 +1,50 @@ +/** + * @file lv_win.h + * + */ + +#ifndef LV_WIN_H +#define LV_WIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_WIN +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_obj_t obj; +} lv_win_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_win_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_win_create(lv_obj_t * parent); + +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt); +lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w); + +lv_obj_t * lv_win_get_header(lv_obj_t * win); +lv_obj_t * lv_win_get_content(lv_obj_t * win); +/********************** + * MACROS + **********************/ +#endif /*LV_USE_WIN*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIN_H*/ diff --git a/libraries/readme.txt b/libraries/readme.txt new file mode 100644 index 0000000..96ce674 --- /dev/null +++ b/libraries/readme.txt @@ -0,0 +1 @@ +For information on installing libraries, see: http://www.arduino.cc/en/Guide/Libraries diff --git a/libraries/ui/library.properties b/libraries/ui/library.properties new file mode 100644 index 0000000..640997f --- /dev/null +++ b/libraries/ui/library.properties @@ -0,0 +1,14 @@ +name=ui +version=1.0 +author=SquareLine_Studio +category=Display +url=https://squareline.io +architectures=* +includes=ui.h +sentence=SquareLine_Studio +paragraph=Squareline Studio creates smart, user-friendly LVGL UI solutions. +name=ui +maintainer=Squareline Studio +maintainer_email=contact@squareline.io + + diff --git a/libraries/ui/src/CMakeLists.txt b/libraries/ui/src/CMakeLists.txt new file mode 100644 index 0000000..b308aa4 --- /dev/null +++ b/libraries/ui/src/CMakeLists.txt @@ -0,0 +1,8 @@ +SET(SOURCES screens/ui_Screen1.c + ui.c + components/ui_comp_hook.c + ui_helpers.c + ui_events.c + images/ui_img_72878972.c) + +add_library(ui ${SOURCES}) diff --git a/libraries/ui/src/components/ui_comp_hook.c b/libraries/ui/src/components/ui_comp_hook.c new file mode 100644 index 0000000..e2598b2 --- /dev/null +++ b/libraries/ui/src/components/ui_comp_hook.c @@ -0,0 +1,5 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + diff --git a/libraries/ui/src/filelist.txt b/libraries/ui/src/filelist.txt new file mode 100644 index 0000000..d47d02f --- /dev/null +++ b/libraries/ui/src/filelist.txt @@ -0,0 +1,6 @@ +screens/ui_Screen1.c +ui.c +components/ui_comp_hook.c +ui_helpers.c +ui_events.c +images/ui_img_72878972.c diff --git a/libraries/ui/src/images/ui_img_72878972.c b/libraries/ui/src/images/ui_img_72878972.c new file mode 100644 index 0000000..c81cadf --- /dev/null +++ b/libraries/ui/src/images/ui_img_72878972.c @@ -0,0 +1,442 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#include "../ui.h" + +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN +#endif + +// IMAGE DATA: assets/hfg-logo.png +const LV_ATTRIBUTE_MEM_ALIGN uint8_t ui_img_72878972_data[] = { + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x9A,0xD6,0x9A,0xD6,0x9A,0xD6,0xDB,0xDE,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x51,0x8C,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xEB,0x5A,0xD3,0x9C,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0x69,0x4A,0xE3,0x18,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x51,0x8C,0x79,0xCE,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0xCF,0x7B,0xCF,0x7B,0x69,0x4A,0x69,0x4A,0xCF,0x7B,0xCF,0x7B, + 0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0xD3,0x9C,0xCF,0x7B,0xCF,0x7B,0xEB,0x5A,0xE7,0x39,0xE7,0x39,0x6D,0x6B,0xCF,0x7B,0x55,0xAD,0x38,0xC6,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0xEB,0x5A,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xEB,0x5A,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x92,0x94,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x69,0x4A,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39, + 0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xEB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xD7,0xBD,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x69,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xD3,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x65,0x29, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0x51,0x8C,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x51,0x8C,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xD7,0xBD,0xD7,0xBD, + 0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xD3,0x9C,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0x51,0x8C,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x8C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0x6D,0x6B,0xCF,0x7B,0x51,0x8C,0xCF,0x7B,0xEB,0x5A,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x38,0xC6, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xCF,0x7B,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x69,0x4A,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0x3C,0xE7,0xCF,0x7B,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xE7,0x39,0xE7,0x39,0xCF,0x7B,0xCF,0x7B,0xD7,0xBD,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0xEB,0x5A,0xE7,0x39,0x65,0x29,0xE7,0x39,0x51,0x8C,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xB2,0x94,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0xE7,0x39,0xE7,0x39,0xE7,0x39,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0xE7,0x39,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x59,0xCE,0xCB,0x5A,0xCB,0x5A,0x18,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xE7,0x39,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xE7,0x39,0xD3,0x9C,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0x73,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00, + 0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCB,0x5A,0x00,0x00,0x00,0x00,0xE3,0x18,0xCF,0x7B,0x51,0x8C,0x69,0x4A,0x00,0x00,0x00,0x00,0xE3,0x18,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE3,0x18,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0xB6,0xB5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00, + 0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x65,0x29,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE3,0x18,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18, + 0x00,0x00,0xE3,0x18,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x55,0xAD,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xCB,0x5A,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x65,0x29,0x00,0x00,0x00,0x00,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x65,0x29,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x00,0x00,0x00,0x00,0xD7,0xBD,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE3,0x18,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xE7,0x39,0xEB,0x5A,0xCF,0x7B,0x51,0x8C,0xD7,0xBD,0xD7,0xBD,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x65,0x29,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xE7,0x39,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x4D,0x6B,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x65,0x29,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00, + 0xCF,0x7B,0x65,0x29,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xE7,0x39,0x6D,0x6B,0x51,0x8C,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0xCE,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xCF,0x7B,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x55,0xAD,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xD7,0xBD,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xE7,0x39,0xD7,0xBD,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xD3,0x9C,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0xCE,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0x38,0xC6,0x00,0x00,0xE3,0x18,0xBE,0xF7,0x3C,0xE7,0x00,0x00,0x00,0x00,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0x38,0xC6,0x00,0x00,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0x69,0x4A,0x00,0x00,0xE3,0x18,0x3C,0xE7,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x51,0x8C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39, + 0x00,0x00,0xE7,0x39,0xBE,0xF7,0x61,0x08,0x00,0x00,0x38,0xC6,0xD3,0x9C,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCB,0x5A,0x00,0x00,0xE3,0x18,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBA,0xD6,0x61,0x08,0x00,0x00,0xCF,0x7B,0xE7,0x39,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00,0x00,0x00,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xBE,0xF7,0x69,0x4A,0x00,0x00,0x51,0x8C,0xCB,0x5A,0x00,0x00,0x51,0x8C, + 0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x61,0x08,0xE3,0x18,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x51,0x8C,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0x00,0x00,0x00,0x00,0x4D,0x6B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x69,0x4A,0xE3,0x18,0x00,0x00,0x38,0xC6,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBA,0xD6,0x3C,0xE7,0x55,0xAD,0x61,0x08,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBA,0xD6,0x00,0x00,0x61,0x08,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xCB,0x5A,0x00,0x00,0x00,0x00,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0xD7,0xBD,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7, + 0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x00,0x00,0x00,0x00,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x69,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0x61,0x08,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00, + 0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x69,0x4A,0x00,0x00,0xD7,0xBD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5D,0xEF,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0x69,0x4A,0xCF,0x7B,0xCF,0x7B,0xCF,0x7B,0xD7,0xBD,0x55,0xAD,0xCF,0x7B,0xCF,0x7B,0xCB,0x5A,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00, + 0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xE7,0x39,0xBE,0xF7,0xBE,0xF7,0xCB,0x5A,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x34,0xA5,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x00,0x00,0x00,0x00,0xCF,0x7B,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBA,0xD6,0x61,0x08,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0x38,0xC6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x7D,0xEF,0xBA,0xD6,0xBA,0xD6,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x5D,0xEF,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xD7,0xBD,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD7,0xBD,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x08,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x38,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x08,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x51,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x9A,0xD6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x38,0xC6,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x2C,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x4D,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xEF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xB2,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xD3,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x75,0xAD,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xE3,0x18,0x6D,0x6B,0x55,0xAD,0xBA,0xD6,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x55,0xAD,0x6D,0x6B,0x61,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x08,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xCF,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE3,0x18,0xE7,0x39, + 0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0x65,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x39,0x3C,0xE7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7,0xCB,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCB,0x5A,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0xE3,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0xD7,0xBD,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x55,0xAD,0x69,0x4A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x4A,0xD3,0x9C,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0x3C,0xE7, + 0x55,0xAD,0xCB,0x5A,0xE7,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x29,0x69,0x4A,0xD3,0x9C,0x3C,0xE7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + 0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7,0xBE,0xF7, + //alpha channel data: + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; +const lv_image_dsc_t ui_img_72878972 = { + .header.w = 183, + .header.h = 73, + .data_size = sizeof(ui_img_72878972_data), + .header.cf = LV_COLOR_FORMAT_NATIVE_WITH_ALPHA, + .header.magic = LV_IMAGE_HEADER_MAGIC, + .data = ui_img_72878972_data +}; + diff --git a/libraries/ui/src/images/ui_img_red_dot_png.c b/libraries/ui/src/images/ui_img_red_dot_png.c new file mode 100644 index 0000000..48fa8b3 --- /dev/null +++ b/libraries/ui/src/images/ui_img_red_dot_png.c @@ -0,0 +1,32 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#include "../ui.h" + +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN +#endif + +// IMAGE DATA: assets/red_dot.png +const LV_ATTRIBUTE_MEM_ALIGN uint8_t ui_img_red_dot_png_data[] = { + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + 0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8, + +}; +const lv_image_dsc_t ui_img_red_dot_png = { + .header.w = 16, + .header.h = 32, + .data_size = sizeof(ui_img_red_dot_png_data), + .header.cf = LV_COLOR_FORMAT_NATIVE, + .header.magic = LV_IMAGE_HEADER_MAGIC, + .data = ui_img_red_dot_png_data +}; + diff --git a/libraries/ui/src/readme.txt b/libraries/ui/src/readme.txt new file mode 100644 index 0000000..039a09b --- /dev/null +++ b/libraries/ui/src/readme.txt @@ -0,0 +1 @@ +The UI files will be exported here diff --git a/libraries/ui/src/screens/ui_Screen1.c b/libraries/ui/src/screens/ui_Screen1.c new file mode 100644 index 0000000..1c32847 --- /dev/null +++ b/libraries/ui/src/screens/ui_Screen1.c @@ -0,0 +1,21 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#include "../ui.h" + +void ui_Screen1_screen_init(void) +{ + ui_Screen1 = lv_obj_create(NULL); + lv_obj_remove_flag(ui_Screen1, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_Image1 = lv_image_create(ui_Screen1); + lv_image_set_src(ui_Image1, &ui_img_72878972); + lv_obj_set_width(ui_Image1, LV_SIZE_CONTENT); /// 183 + lv_obj_set_height(ui_Image1, LV_SIZE_CONTENT); /// 73 + lv_obj_set_align(ui_Image1, LV_ALIGN_CENTER); + lv_obj_add_flag(ui_Image1, LV_OBJ_FLAG_CLICKABLE); /// Flags + lv_obj_remove_flag(ui_Image1, LV_OBJ_FLAG_SCROLLABLE); /// Flags + +} diff --git a/libraries/ui/src/ui.c b/libraries/ui/src/ui.c new file mode 100644 index 0000000..53c923e --- /dev/null +++ b/libraries/ui/src/ui.c @@ -0,0 +1,38 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#include "ui.h" +#include "ui_helpers.h" + +///////////////////// VARIABLES //////////////////// + + +// SCREEN: ui_Screen1 +void ui_Screen1_screen_init(void); +lv_obj_t * ui_Screen1; +lv_obj_t * ui_Image1; +lv_obj_t * ui____initial_actions0; + +///////////////////// TEST LVGL SETTINGS //////////////////// +#if LV_COLOR_DEPTH != 16 + #error "LV_COLOR_DEPTH should be 16bit to match SquareLine Studio's settings" +#endif + +///////////////////// ANIMATIONS //////////////////// + +///////////////////// FUNCTIONS //////////////////// + +///////////////////// SCREENS //////////////////// + +void ui_init(void) +{ + lv_disp_t * dispp = lv_display_get_default(); + lv_theme_t * theme = lv_theme_default_init(dispp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), + false, LV_FONT_DEFAULT); + lv_disp_set_theme(dispp, theme); + ui_Screen1_screen_init(); + ui____initial_actions0 = lv_obj_create(NULL); + lv_disp_load_scr(ui_Screen1); +} diff --git a/libraries/ui/src/ui.h b/libraries/ui/src/ui.h new file mode 100644 index 0000000..fcc819a --- /dev/null +++ b/libraries/ui/src/ui.h @@ -0,0 +1,46 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#ifndef _TFT_ST7789_TEST_UI_H +#define _TFT_ST7789_TEST_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __has_include +#if __has_include("lvgl.h") +#include "lvgl.h" +#elif __has_include("lvgl/lvgl.h") +#include "lvgl/lvgl.h" +#else +#include "lvgl.h" +#endif +#else +#include "lvgl.h" +#endif + +#include "ui_helpers.h" +#include "ui_events.h" + +// SCREEN: ui_Screen1 +void ui_Screen1_screen_init(void); +extern lv_obj_t * ui_Screen1; +extern lv_obj_t * ui_Image1; +extern lv_obj_t * ui____initial_actions0; + + +LV_IMG_DECLARE(ui_img_72878972); // assets/hfg-logo.png + + + + +void ui_init(void); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/ui/src/ui_events.h b/libraries/ui/src/ui_events.h new file mode 100644 index 0000000..022f716 --- /dev/null +++ b/libraries/ui/src/ui_events.h @@ -0,0 +1,17 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#ifndef _UI_EVENTS_H +#define _UI_EVENTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/ui/src/ui_helpers.c b/libraries/ui/src/ui_helpers.c new file mode 100644 index 0000000..a0dff51 --- /dev/null +++ b/libraries/ui/src/ui_helpers.c @@ -0,0 +1,348 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#include "ui_helpers.h" + +void _ui_bar_set_property(lv_obj_t * target, int id, int val) +{ + if(id == _UI_BAR_PROPERTY_VALUE_WITH_ANIM) lv_bar_set_value(target, val, LV_ANIM_ON); + if(id == _UI_BAR_PROPERTY_VALUE) lv_bar_set_value(target, val, LV_ANIM_OFF); +} + +void _ui_basic_set_property(lv_obj_t * target, int id, int val) +{ + if(id == _UI_BASIC_PROPERTY_POSITION_X) lv_obj_set_x(target, val); + if(id == _UI_BASIC_PROPERTY_POSITION_Y) lv_obj_set_y(target, val); + if(id == _UI_BASIC_PROPERTY_WIDTH) lv_obj_set_width(target, val); + if(id == _UI_BASIC_PROPERTY_HEIGHT) lv_obj_set_height(target, val); +} + + +void _ui_dropdown_set_property(lv_obj_t * target, int id, int val) +{ + if(id == _UI_DROPDOWN_PROPERTY_SELECTED) lv_dropdown_set_selected(target, val); +} + +void _ui_image_set_property(lv_obj_t * target, int id, uint8_t * val) +{ + if(id == _UI_IMAGE_PROPERTY_IMAGE) lv_image_set_src(target, val); +} + +void _ui_label_set_property(lv_obj_t * target, int id, const char * val) +{ + if(id == _UI_LABEL_PROPERTY_TEXT) lv_label_set_text(target, val); +} + + +void _ui_roller_set_property(lv_obj_t * target, int id, int val) +{ + if(id == _UI_ROLLER_PROPERTY_SELECTED_WITH_ANIM) lv_roller_set_selected(target, val, LV_ANIM_ON); + if(id == _UI_ROLLER_PROPERTY_SELECTED) lv_roller_set_selected(target, val, LV_ANIM_OFF); +} + +void _ui_slider_set_property(lv_obj_t * target, int id, int val) +{ + if(id == _UI_SLIDER_PROPERTY_VALUE_WITH_ANIM) lv_slider_set_value(target, val, LV_ANIM_ON); + if(id == _UI_SLIDER_PROPERTY_VALUE) lv_slider_set_value(target, val, LV_ANIM_OFF); +} + + +void _ui_screen_change(lv_obj_t ** target, lv_screen_load_anim_t fademode, int spd, int delay, + void (*target_init)(void)) +{ + if(*target == NULL) + target_init(); + lv_screen_load_anim(*target, fademode, spd, delay, false); +} + +void _ui_screen_delete(lv_obj_t ** target) +{ + if(*target == NULL) { + lv_obj_delete(*target); + target = NULL; + } +} + +void _ui_arc_increment(lv_obj_t * target, int val) +{ + int old = lv_arc_get_value(target); + lv_arc_set_value(target, old + val); + lv_obj_send_event(target, LV_EVENT_VALUE_CHANGED, 0); +} + +void _ui_bar_increment(lv_obj_t * target, int val, int anm) +{ + int old = lv_bar_get_value(target); + lv_bar_set_value(target, old + val, anm); +} + +void _ui_slider_increment(lv_obj_t * target, int val, int anm) +{ + int old = lv_slider_get_value(target); + lv_slider_set_value(target, old + val, anm); + lv_obj_send_event(target, LV_EVENT_VALUE_CHANGED, 0); +} + +void _ui_keyboard_set_target(lv_obj_t * keyboard, lv_obj_t * textarea) +{ + lv_keyboard_set_textarea(keyboard, textarea); +} + +void _ui_flag_modify(lv_obj_t * target, int32_t flag, int value) +{ + if(value == _UI_MODIFY_FLAG_TOGGLE) { + if(lv_obj_has_flag(target, flag)) lv_obj_remove_flag(target, flag); + else lv_obj_add_flag(target, flag); + } + else if(value == _UI_MODIFY_FLAG_ADD) lv_obj_add_flag(target, flag); + else lv_obj_remove_flag(target, flag); +} +void _ui_state_modify(lv_obj_t * target, int32_t state, int value) +{ + if(value == _UI_MODIFY_STATE_TOGGLE) { + if(lv_obj_has_state(target, state)) lv_obj_remove_state(target, state); + else lv_obj_add_state(target, state); + } + else if(value == _UI_MODIFY_STATE_ADD) lv_obj_add_state(target, state); + else lv_obj_remove_state(target, state); +} + + +void _ui_textarea_move_cursor(lv_obj_t * target, int val) + +{ + + if(val == UI_MOVE_CURSOR_UP) lv_textarea_cursor_up(target); + if(val == UI_MOVE_CURSOR_RIGHT) lv_textarea_cursor_right(target); + if(val == UI_MOVE_CURSOR_DOWN) lv_textarea_cursor_down(target); + if(val == UI_MOVE_CURSOR_LEFT) lv_textarea_cursor_left(target); + lv_obj_add_state(target, LV_STATE_FOCUSED); +} + +void scr_unloaded_delete_cb(lv_event_t * e) + +{ + + lv_obj_t ** var = lv_event_get_user_data(e); + lv_obj_delete(*var); + (*var) = NULL; + +} + +void _ui_opacity_set(lv_obj_t * target, int val) +{ + lv_obj_set_style_opa(target, val, 0); +} + +void _ui_anim_callback_free_user_data(lv_anim_t * a) +{ + lv_free(a->user_data); + a->user_data = NULL; +} + +void _ui_anim_callback_set_x(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_obj_set_x(usr->target, v); + +} + + +void _ui_anim_callback_set_y(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_obj_set_y(usr->target, v); + +} + + +void _ui_anim_callback_set_width(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_obj_set_width(usr->target, v); + +} + + +void _ui_anim_callback_set_height(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_obj_set_height(usr->target, v); + +} + + +void _ui_anim_callback_set_opacity(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_obj_set_style_opa(usr->target, v, 0); + +} + + +void _ui_anim_callback_set_image_zoom(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_image_set_scale(usr->target, v); + +} + + +void _ui_anim_callback_set_image_angle(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + lv_image_set_rotation(usr->target, v); + +} + + +void _ui_anim_callback_set_image_frame(lv_anim_t * a, int32_t v) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + usr->val = v; + + if(v < 0) v = 0; + if(v >= usr->imgset_size) v = usr->imgset_size - 1; + lv_image_set_src(usr->target, usr->imgset[v]); +} + +int32_t _ui_anim_callback_get_x(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_obj_get_x_aligned(usr->target); + +} + + +int32_t _ui_anim_callback_get_y(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_obj_get_y_aligned(usr->target); + +} + + +int32_t _ui_anim_callback_get_width(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_obj_get_width(usr->target); + +} + + +int32_t _ui_anim_callback_get_height(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_obj_get_height(usr->target); + +} + + +int32_t _ui_anim_callback_get_opacity(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_obj_get_style_opa(usr->target, 0); + +} + +int32_t _ui_anim_callback_get_image_zoom(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_image_get_scale(usr->target); + +} + +int32_t _ui_anim_callback_get_image_angle(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return lv_image_get_rotation(usr->target); + +} + +int32_t _ui_anim_callback_get_image_frame(lv_anim_t * a) + +{ + + ui_anim_user_data_t * usr = (ui_anim_user_data_t *)a->user_data; + return usr->val; + +} + +void _ui_arc_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix) +{ + char buf[_UI_TEMPORARY_STRING_BUFFER_SIZE]; + + lv_snprintf(buf, sizeof(buf), "%s%d%s", prefix, (int)lv_arc_get_value(src), postfix); + + lv_label_set_text(trg, buf); +} + +void _ui_slider_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix) +{ + char buf[_UI_TEMPORARY_STRING_BUFFER_SIZE]; + + lv_snprintf(buf, sizeof(buf), "%s%d%s", prefix, (int)lv_slider_get_value(src), postfix); + + lv_label_set_text(trg, buf); +} +void _ui_checked_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * txt_on, const char * txt_off) +{ + if(lv_obj_has_state(src, LV_STATE_CHECKED)) lv_label_set_text(trg, txt_on); + else lv_label_set_text(trg, txt_off); +} + + +void _ui_spinbox_step(lv_obj_t * target, int val) + +{ + + if(val > 0) lv_spinbox_increment(target); + + else lv_spinbox_decrement(target); + + + lv_obj_send_event(target, LV_EVENT_VALUE_CHANGED, 0); +} + +void _ui_switch_theme(int val) + +{ + +#ifdef UI_THEME_ACTIVE + ui_theme_set(val); +#endif +} + + diff --git a/libraries/ui/src/ui_helpers.h b/libraries/ui/src/ui_helpers.h new file mode 100644 index 0000000..5cd9cf0 --- /dev/null +++ b/libraries/ui/src/ui_helpers.h @@ -0,0 +1,149 @@ +// This file was generated by SquareLine Studio +// SquareLine Studio version: SquareLine Studio 1.4.1 +// LVGL version: 9.1.0 +// Project name: tft-st7789-test + +#ifndef _TFT_ST7789_TEST_UI_HELPERS_H +#define _TFT_ST7789_TEST_UI_HELPERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ui.h" + +#define _UI_TEMPORARY_STRING_BUFFER_SIZE 32 +#define _UI_BAR_PROPERTY_VALUE 0 +#define _UI_BAR_PROPERTY_VALUE_WITH_ANIM 1 +void _ui_bar_set_property(lv_obj_t * target, int id, int val); + +#define _UI_BASIC_PROPERTY_POSITION_X 0 +#define _UI_BASIC_PROPERTY_POSITION_Y 1 +#define _UI_BASIC_PROPERTY_WIDTH 2 +#define _UI_BASIC_PROPERTY_HEIGHT 3 +void _ui_basic_set_property(lv_obj_t * target, int id, int val); + +#define _UI_DROPDOWN_PROPERTY_SELECTED 0 +void _ui_dropdown_set_property(lv_obj_t * target, int id, int val); + +#define _UI_IMAGE_PROPERTY_IMAGE 0 +void _ui_image_set_property(lv_obj_t * target, int id, uint8_t * val); + +#define _UI_LABEL_PROPERTY_TEXT 0 +void _ui_label_set_property(lv_obj_t * target, int id, const char * val); + +#define _UI_ROLLER_PROPERTY_SELECTED 0 +#define _UI_ROLLER_PROPERTY_SELECTED_WITH_ANIM 1 +void _ui_roller_set_property(lv_obj_t * target, int id, int val); + +#define _UI_SLIDER_PROPERTY_VALUE 0 +#define _UI_SLIDER_PROPERTY_VALUE_WITH_ANIM 1 +void _ui_slider_set_property(lv_obj_t * target, int id, int val); + +void _ui_screen_change(lv_obj_t ** target, lv_screen_load_anim_t fademode, int spd, int delay, + void (*target_init)(void)); + +void _ui_screen_delete(lv_obj_t ** target); + +void _ui_arc_increment(lv_obj_t * target, int val); + +void _ui_bar_increment(lv_obj_t * target, int val, int anm); + +void _ui_slider_increment(lv_obj_t * target, int val, int anm); + +void _ui_keyboard_set_target(lv_obj_t * keyboard, lv_obj_t * textarea); + +#define _UI_MODIFY_FLAG_ADD 0 +#define _UI_MODIFY_FLAG_REMOVE 1 +#define _UI_MODIFY_FLAG_TOGGLE 2 +void _ui_flag_modify(lv_obj_t * target, int32_t flag, int value); + +#define _UI_MODIFY_STATE_ADD 0 +#define _UI_MODIFY_STATE_REMOVE 1 +#define _UI_MODIFY_STATE_TOGGLE 2 +void _ui_state_modify(lv_obj_t * target, int32_t state, int value); + +#define UI_MOVE_CURSOR_UP 0 +#define UI_MOVE_CURSOR_RIGHT 1 +#define UI_MOVE_CURSOR_DOWN 2 +#define UI_MOVE_CURSOR_LEFT 3 +void _ui_textarea_move_cursor(lv_obj_t * target, int val) +; + + +void scr_unloaded_delete_cb(lv_event_t * e); + +void _ui_opacity_set(lv_obj_t * target, int val); + +/** Describes an animation*/ +typedef struct _ui_anim_user_data_t { + lv_obj_t * target; + lv_image_dsc_t ** imgset; + int32_t imgset_size; + int32_t val; +} ui_anim_user_data_t; +void _ui_anim_callback_free_user_data(lv_anim_t * a); + +void _ui_anim_callback_set_x(lv_anim_t * a, int32_t v); + +void _ui_anim_callback_set_y(lv_anim_t * a, int32_t v); + +void _ui_anim_callback_set_width(lv_anim_t * a, int32_t v); + +void _ui_anim_callback_set_height(lv_anim_t * a, int32_t v); + + +void _ui_anim_callback_set_opacity(lv_anim_t * a, int32_t v); + + +void _ui_anim_callback_set_image_zoom(lv_anim_t * a, int32_t v); + + +void _ui_anim_callback_set_image_angle(lv_anim_t * a, int32_t v); + + +void _ui_anim_callback_set_image_frame(lv_anim_t * a, int32_t v); + + +int32_t _ui_anim_callback_get_x(lv_anim_t * a); + +int32_t _ui_anim_callback_get_y(lv_anim_t * a); + +int32_t _ui_anim_callback_get_width(lv_anim_t * a); + + +int32_t _ui_anim_callback_get_height(lv_anim_t * a); + + +int32_t _ui_anim_callback_get_opacity(lv_anim_t * a); + + +int32_t _ui_anim_callback_get_image_zoom(lv_anim_t * a); + + +int32_t _ui_anim_callback_get_image_angle(lv_anim_t * a); + + +int32_t _ui_anim_callback_get_image_frame(lv_anim_t * a); + + +void _ui_arc_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix); + +void _ui_slider_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * prefix, const char * postfix); + +void _ui_checked_set_text_value(lv_obj_t * trg, lv_obj_t * src, const char * txt_on, const char * txt_off); + +void _ui_spinbox_step(lv_obj_t * target, int val) +; + + +void _ui_switch_theme(int val) +; + + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/libraries/ui/ui.h b/libraries/ui/ui.h new file mode 100644 index 0000000..ffc6fbc --- /dev/null +++ b/libraries/ui/ui.h @@ -0,0 +1,39 @@ +/** + * @file ui.h + * + */ + +#ifndef UI_OUTER_H +#define UI_OUTER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "src/ui.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*UI_OUTER_H*/ + diff --git a/ui/ui.ino b/ui/ui.ino new file mode 100644 index 0000000..8639832 --- /dev/null +++ b/ui/ui.ino @@ -0,0 +1,117 @@ +//Arduino-TFT_eSPI board-template main routine. There's a TFT_eSPI create+flush driver already in LVGL-9.1 but we create our own here for more control (like e.g. 16-bit color swap). + +#include +#include +#include + +/*Don't forget to set Sketchbook location in File/Preferences to the path of your UI project (the parent foder of this INO file)*/ + +/*Change to your screen resolution*/ +static const uint16_t screenWidth = 320; +static const uint16_t screenHeight = 240; + +enum { SCREENBUFFER_SIZE_PIXELS = screenWidth * screenHeight / 10 }; +static lv_color_t buf [SCREENBUFFER_SIZE_PIXELS]; + +TFT_eSPI tft = TFT_eSPI( screenWidth, screenHeight ); /* TFT instance */ + +#if LV_USE_LOG != 0 +/* Serial debugging */ +void my_print(const char * buf) +{ + Serial.printf(buf); + Serial.flush(); +} +#endif + +/* Display flushing */ +void my_disp_flush (lv_display_t *disp, const lv_area_t *area, uint8_t *pixelmap) +{ + uint32_t w = ( area->x2 - area->x1 + 1 ); + uint32_t h = ( area->y2 - area->y1 + 1 ); + + if (LV_COLOR_16_SWAP) { + size_t len = lv_area_get_size( area ); + lv_draw_sw_rgb565_swap( pixelmap, len ); + } + + tft.startWrite(); + tft.setAddrWindow( area->x1, area->y1, w, h ); + tft.pushColors( (uint16_t*) pixelmap, w * h, true ); + tft.endWrite(); + + lv_disp_flush_ready( disp ); +} + +/*Read the touchpad*/ +void my_touchpad_read (lv_indev_t * indev_driver, lv_indev_data_t * data) +{ + uint16_t touchX = 0, touchY = 0; + + bool touched = false;//tft.getTouch( &touchX, &touchY, 600 ); + + if (!touched) + { + data->state = LV_INDEV_STATE_REL; + } + else + { + data->state = LV_INDEV_STATE_PR; + + /*Set the coordinates*/ + data->point.x = touchX; + data->point.y = touchY; + + Serial.print( "Data x " ); + Serial.println( touchX ); + + Serial.print( "Data y " ); + Serial.println( touchY ); + } +} + +/*Set tick routine needed for LVGL internal timings*/ +static uint32_t my_tick_get_cb (void) { return millis(); } + + +void setup () +{ + Serial.begin( 115200 ); /* prepare for possible serial debug */ + + String LVGL_Arduino = "Hello Arduino! "; + LVGL_Arduino += String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch(); + + Serial.println( LVGL_Arduino ); + Serial.println( "I am LVGL_Arduino" ); + + lv_init(); + +#if LV_USE_LOG != 0 + lv_log_register_print_cb( my_print ); /* register print function for debugging */ +#endif + + tft.begin(); /* TFT init */ + tft.setRotation( 3 ); /* Landscape orientation, flipped */ + + static lv_disp_t* disp; + disp = lv_display_create( screenWidth, screenHeight ); + lv_display_set_buffers( disp, buf, NULL, SCREENBUFFER_SIZE_PIXELS * sizeof(lv_color_t), LV_DISPLAY_RENDER_MODE_PARTIAL ); + lv_display_set_flush_cb( disp, my_disp_flush ); + + static lv_indev_t* indev; + indev = lv_indev_create(); + lv_indev_set_type( indev, LV_INDEV_TYPE_POINTER ); + lv_indev_set_read_cb( indev, my_touchpad_read ); + + lv_tick_set_cb( my_tick_get_cb ); + + ui_init(); + + Serial.println( "Setup done" ); +} + +void loop () +{ + lv_timer_handler(); /* let the GUI do its work */ + delay(5); +}